PageSourceSearch

https://mec-portfolio-frontend.onrender.com/assets/index-DV7HbHFm.js

js mec-portfolio-frontend.onrender.com collected 2026-10-03 11:41:30 UTC 3,086,231 bytes, 25,114 lines download raw bytes

1var __defProp = Object.defineProperty;
2var __typeError = (msg) => {
3  throw TypeError(msg);
4};
5var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
7var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
8var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
9var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
11var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
12var __privateWrapper = (obj, member, setter, getter) => ({
13  set _(value) {
14    __privateSet(obj, member, value, setter);
15  },
16  get _() {
17    return __privateGet(obj, member, getter);
18  }
19});
20var _provider, _providerCalled, _a, _focused, _cleanup, _setup, _b, _online, _cleanup2, _setup2, _c, _gcTimeout, _d, _initialState, _revertState, _cache, _client, _retryer, _defaultOptions, _abortSignalConsumed, _Query_instances, dispatch_fn, _e, _client2, _currentQuery, _currentQueryInitialState, _currentResult, _currentResultState, _currentResultOptions, _currentThenable, _selectError, _selectFn, _selectResult, _lastQueryWithDefinedData, _staleTimeoutId, _refetchIntervalId, _currentRefetchInterval, _trackedProps, _QueryObserver_instances, executeFetch_fn, updateStaleTimeout_fn, computeRefetchInterval_fn, updateRefetchInterval_fn, updateTimers_fn, clearStaleTimeout_fn, clearRefetchInterval_fn, updateQuery_fn, notify_fn, _f, _client3, _observers, _mutationCache, _retryer2, _Mutation_instances, dispatch_fn2, _g, _mutations, _scopes, _mutationId, _h, _queries, _i, _queryCache, _mutationCache2, _defaultOptions2, _queryDefaults, _mutationDefaults, _mountCount, _unsubscribeFocus, _unsubscribeOnline, _j;
21(function polyfill() {
22  const relList = document.createElement("link").relList;
23  if (relList && relList.supports && relList.supports("modulepreload")) {
24    return;
25  }
26  for (const link of document.querySelectorAll('link[rel="modulepreload"]')) {
27    processPreload(link);
28  }
29  new MutationObserver((mutations) => {
30    for (const mutation of mutations) {
31      if (mutation.type !== "childList") {
32        continue;
33      }
34      for (const node of mutation.addedNodes) {
35        if (node.tagName === "LINK" && node.rel === "modulepreload")
36          processPreload(node);
37      }
38    }
39  }).observe(document, { childList: true, subtree: true });
40  function getFetchOpts(link) {
41    const fetchOpts = {};
42    if (link.integrity) fetchOpts.integrity = link.integrity;
43    if (link.referrerPolicy) fetchOpts.referrerPolicy = link.referrerPolicy;
44    if (link.crossOrigin === "use-credentials")
45      fetchOpts.credentials = "include";
46    else if (link.crossOrigin === "anonymous") fetchOpts.credentials = "omit";
47    else fetchOpts.credentials = "same-origin";
48    return fetchOpts;
49  }
50  function processPreload(link) {
51    if (link.ep)
52      return;
53    link.ep = true;
54    const fetchOpts = getFetchOpts(link);
55    fetch(link.href, fetchOpts);
56  }
57})();
58function getDefaultExportFromCjs(x2) {
59  return x2 && x2.__esModule && Object.prototype.hasOwnProperty.call(x2, "default") ? x2["default"] : x2;
60}
61var jsxRuntime = { exports: {} };
62var reactJsxRuntime_production_min = {};
63var react = { exports: {} };
64var react_production_min = {};
65/**
66 * @license React
67 * react.production.min.js
68 *
69 * Copyright (c) Facebook, Inc. and its affiliates.
70 *
71 * This source code is licensed under the MIT license found in the
72 * LICENSE file in the root directory of this source tree.
73 */
74var l$1 = Symbol.for("react.element"), n$1 = Symbol.for("react.portal"), p$2 = Symbol.for("react.fragment"), q$1 = Symbol.for("react.strict_mode"), r$1 = Symbol.for("react.profiler"), t = Symbol.for("react.provider"), u = 
vendor: 4,623 bytes, lines 74-195
74Symbol.for("react.context"), v$1 = Symbol.for("react.forward_ref"), w = Symbol.for("react.suspense"), x = Symbol.for("react.memo"), y = Symbol.for("react.lazy"), z$1 = Symbol.iterator;
75function A$1(a) {
76  if (null === a || "object" !== typeof a) return null;
77  a = z$1 && a[z$1] || a["@@iterator"];
78  return "function" === typeof a ? a : null;
79}
80var B$1 = { isMounted: function() {
81  return false;
82}, enqueueForceUpdate: function() {
83}, enqueueReplaceState: function() {
84}, enqueueSetState: function() {
85} }, C$1 = Object.assign, D$1 = {};
86function E$1(a, b, e) {
87  this.props = a;
88  this.context = b;
89  this.refs = D$1;
90  this.updater = e || B$1;
91}
92E$1.prototype.isReactComponent = {};
93E$1.prototype.setState = function(a, b) {
94  if ("object" !== typeof a && "function" !== typeof a && null != a) throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");
95  this.updater.enqueueSetState(this, a, b, "setState");
96};
97E$1.prototype.forceUpdate = function(a) {
98  this.updater.enqueueForceUpdate(this, a, "forceUpdate");
99};
100function F() {
101}
102F.prototype = E$1.prototype;
103function G$1(a, b, e) {
104  this.props = a;
105  this.context = b;
106  this.refs = D$1;
107  this.updater = e || B$1;
108}
109var H$1 = G$1.prototype = new F();
110H$1.constructor = G$1;
111C$1(H$1, E$1.prototype);
112H$1.isPureReactComponent = true;
113var I$1 = Array.isArray, J = Object.prototype.hasOwnProperty, K$1 = { current: null }, L$1 = { key: true, ref: true, __self: true, __source: true };
114function M$1(a, b, e) {
115  var d, c = {}, k2 = null, h = null;
116  if (null != b) for (d in void 0 !== b.ref && (h = b.ref), void 0 !== b.key && (k2 = "" + b.key), b) J.call(b, d) && !L$1.hasOwnProperty(d) && (c[d] = b[d]);
117  var g = arguments.length - 2;
118  if (1 === g) c.children = e;
119  else if (1 < g) {
120    for (var f2 = Array(g), m2 = 0; m2 < g; m2++) f2[m2] = arguments[m2 + 2];
121    c.children = f2;
122  }
123  if (a && a.defaultProps) for (d in g = a.defaultProps, g) void 0 === c[d] && (c[d] = g[d]);
124  return { $$typeof: l$1, type: a, key: k2, ref: h, props: c, _owner: K$1.current };
125}
126function N$1(a, b) {
127  return { $$typeof: l$1, type: a.type, key: b, ref: a.ref, props: a.props, _owner: a._owner };
128}
129function O$1(a) {
130  return "object" === typeof a && null !== a && a.$$typeof === l$1;
131}
132function escape(a) {
133  var b = { "=": "=0", ":": "=2" };
134  return "$" + a.replace(/[=:]/g, function(a2) {
135    return b[a2];
136  });
137}
138var P$1 = /\/+/g;
139function Q$1(a, b) {
140  return "object" === typeof a && null !== a && null != a.key ? escape("" + a.key) : b.toString(36);
141}
142function R$1(a, b, e, d, c) {
143  var k2 = typeof a;
144  if ("undefined" === k2 || "boolean" === k2) a = null;
145  var h = false;
146  if (null === a) h = true;
147  else switch (k2) {
148    case "string":
149    case "number":
150      h = true;
151      break;
152    case "object":
153      switch (a.$$typeof) {
154        case l$1:
155        case n$1:
156          h = true;
157      }
158  }
159  if (h) return h = a, c = c(h), a = "" === d ? "." + Q$1(h, 0) : d, I$1(c) ? (e = "", null != a && (e = a.replace(P$1, "$&/") + "/"), R$1(c, b, e, "", function(a2) {
160    return a2;
161  })) : null != c && (O$1(c) && (c = N$1(c, e + (!c.key || h && h.key === c.key ? "" : ("" + c.key).replace(P$1, "$&/") + "/") + a)), b.push(c)), 1;
162  h = 0;
163  d = "" === d ? "." : d + ":";
164  if (I$1(a)) for (var g = 0; g < a.length; g++) {
165    k2 = a[g];
166    var f2 = d + Q$1(k2, g);
167    h += R$1(k2, b, e, f2, c);
168  }
169  else if (f2 = A$1(a), "function" === typeof f2) for (a = f2.call(a), g = 0; !(k2 = a.next()).done; ) k2 = k2.value, f2 = d + Q$1(k2, g++), h += R$1(k2, b, e, f2, c);
170  else if ("object" === k2) throw b = String(a), Error("Objects are not valid as a React child (found: " + ("[object Object]" === b ? "object with keys {" + Object.keys(a).join(", ") + "}" : b) + "). If you meant to render a collection of children, use an array instead.");
171  return h;
172}
173function S$1(a, b, e) {
174  if (null == a) return a;
175  var d = [], c = 0;
176  R$1(a, d, "", "", function(a2) {
177    return b.call(e, a2, c++);
178  });
179  return d;
180}
181function T$1(a) {
182  if (-1 === a._status) {
183    var b = a._result;
184    b = b();
185    b.then(function(b2) {
186      if (0 === a._status || -1 === a._status) a._status = 1, a._result = b2;
187    }, function(b2) {
188      if (0 === a._status || -1 === a._status) a._status = 2, a._result = b2;
189    });
190    -1 === a._status && (a._status = 0, a._result = b);
191  }
192  if (1 === a._status) return a._result.default;
193  throw a._result;
194}
195var U$1 = { current: null }, V$1 = { transition: null }, W$1 = { ReactCurrentDispatcher: U$1, ReactCurrentBatchConfig: V$1, ReactCurrentOwner: K$
vendor: 4,778 bytes, lines 195-336
1951 };
196function X$2() {
197  throw Error("act(...) is not supported in production builds of React.");
198}
199react_production_min.Children = { map: S$1, forEach: function(a, b, e) {
200  S$1(a, function() {
201    b.apply(this, arguments);
202  }, e);
203}, count: function(a) {
204  var b = 0;
205  S$1(a, function() {
206    b++;
207  });
208  return b;
209}, toArray: function(a) {
210  return S$1(a, function(a2) {
211    return a2;
212  }) || [];
213}, only: function(a) {
214  if (!O$1(a)) throw Error("React.Children.only expected to receive a single React element child.");
215  return a;
216} };
217react_production_min.Component = E$1;
218react_production_min.Fragment = p$2;
219react_production_min.Profiler = r$1;
220react_production_min.PureComponent = G$1;
221react_production_min.StrictMode = q$1;
222react_production_min.Suspense = w;
223react_production_min.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = W$1;
224react_production_min.act = X$2;
225react_production_min.cloneElement = function(a, b, e) {
226  if (null === a || void 0 === a) throw Error("React.cloneElement(...): The argument must be a React element, but you passed " + a + ".");
227  var d = C$1({}, a.props), c = a.key, k2 = a.ref, h = a._owner;
228  if (null != b) {
229    void 0 !== b.ref && (k2 = b.ref, h = K$1.current);
230    void 0 !== b.key && (c = "" + b.key);
231    if (a.type && a.type.defaultProps) var g = a.type.defaultProps;
232    for (f2 in b) J.call(b, f2) && !L$1.hasOwnProperty(f2) && (d[f2] = void 0 === b[f2] && void 0 !== g ? g[f2] : b[f2]);
233  }
234  var f2 = arguments.length - 2;
235  if (1 === f2) d.children = e;
236  else if (1 < f2) {
237    g = Array(f2);
238    for (var m2 = 0; m2 < f2; m2++) g[m2] = arguments[m2 + 2];
239    d.children = g;
240  }
241  return { $$typeof: l$1, type: a.type, key: c, ref: k2, props: d, _owner: h };
242};
243react_production_min.createContext = function(a) {
244  a = { $$typeof: u, _currentValue: a, _currentValue2: a, _threadCount: 0, Provider: null, Consumer: null, _defaultValue: null, _globalName: null };
245  a.Provider = { $$typeof: t, _context: a };
246  return a.Consumer = a;
247};
248react_production_min.createElement = M$1;
249react_production_min.createFactory = function(a) {
250  var b = M$1.bind(null, a);
251  b.type = a;
252  return b;
253};
254react_production_min.createRef = function() {
255  return { current: null };
256};
257react_production_min.forwardRef = function(a) {
258  return { $$typeof: v$1, render: a };
259};
260react_production_min.isValidElement = O$1;
261react_production_min.lazy = function(a) {
262  return { $$typeof: y, _payload: { _status: -1, _result: a }, _init: T$1 };
263};
264react_production_min.memo = function(a, b) {
265  return { $$typeof: x, type: a, compare: void 0 === b ? null : b };
266};
267react_production_min.startTransition = function(a) {
268  var b = V$1.transition;
269  V$1.transition = {};
270  try {
271    a();
272  } finally {
273    V$1.transition = b;
274  }
275};
276react_production_min.unstable_act = X$2;
277react_production_min.useCallback = function(a, b) {
278  return U$1.current.useCallback(a, b);
279};
280react_production_min.useContext = function(a) {
281  return U$1.current.useContext(a);
282};
283react_production_min.useDebugValue = function() {
284};
285react_production_min.useDeferredValue = function(a) {
286  return U$1.current.useDeferredValue(a);
287};
288react_production_min.useEffect = function(a, b) {
289  return U$1.current.useEffect(a, b);
290};
291react_production_min.useId = function() {
292  return U$1.current.useId();
293};
294react_production_min.useImperativeHandle = function(a, b, e) {
295  return U$1.current.useImperativeHandle(a, b, e);
296};
297react_production_min.useInsertionEffect = function(a, b) {
298  return U$1.current.useInsertionEffect(a, b);
299};
300react_production_min.useLayoutEffect = function(a, b) {
301  return U$1.current.useLayoutEffect(a, b);
302};
303react_production_min.useMemo = function(a, b) {
304  return U$1.current.useMemo(a, b);
305};
306react_production_min.useReducer = function(a, b, e) {
307  return U$1.current.useReducer(a, b, e);
308};
309react_production_min.useRef = function(a) {
310  return U$1.current.useRef(a);
311};
312react_production_min.useState = function(a) {
313  return U$1.current.useState(a);
314};
315react_production_min.useSyncExternalStore = function(a, b, e) {
316  return U$1.current.useSyncExternalStore(a, b, e);
317};
318react_production_min.useTransition = function() {
319  return U$1.current.useTransition();
320};
321react_production_min.version = "18.3.1";
322{
323  react.exports = react_production_min;
324}
325var reactExports = react.exports;
326const React$2 = /* @__PURE__ */ getDefaultExportFromCjs(reactExports);
327/**
328 * @license React
329 * react-jsx-runtime.production.min.js
330 *
331 * Copyright (c) Facebook, Inc. and its affiliates.
332 *
333 * This source code is licensed under the MIT license found in the
334 * LICENSE file in the root directory of this source tree.
335 */
336var f = reactExports, k = Symbol.for("react.element"), l = Symbol.for("react.fragment"), m$1 = Object.prototype.hasOwnProperty, n = f.__SECRET_INT
vendor: 203,289 bytes, lines 336-6997
336ERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, p$1 = { key: true, ref: true, __self: true, __source: true };
337function q(c, a, g) {
338  var b, d = {}, e = null, h = null;
339  void 0 !== g && (e = "" + g);
340  void 0 !== a.key && (e = "" + a.key);
341  void 0 !== a.ref && (h = a.ref);
342  for (b in a) m$1.call(a, b) && !p$1.hasOwnProperty(b) && (d[b] = a[b]);
343  if (c && c.defaultProps) for (b in a = c.defaultProps, a) void 0 === d[b] && (d[b] = a[b]);
344  return { $$typeof: k, type: c, key: e, ref: h, props: d, _owner: n.current };
345}
346reactJsxRuntime_production_min.Fragment = l;
347reactJsxRuntime_production_min.jsx = q;
348reactJsxRuntime_production_min.jsxs = q;
349{
350  jsxRuntime.exports = reactJsxRuntime_production_min;
351}
352var jsxRuntimeExports = jsxRuntime.exports;
353var client = {};
354var reactDom = { exports: {} };
355var reactDom_production_min = {};
356var scheduler = { exports: {} };
357var scheduler_production_min = {};
358/**
359 * @license React
360 * scheduler.production.min.js
361 *
362 * Copyright (c) Facebook, Inc. and its affiliates.
363 *
364 * This source code is licensed under the MIT license found in the
365 * LICENSE file in the root directory of this source tree.
366 */
367(function(exports) {
368  function f2(a, b) {
369    var c = a.length;
370    a.push(b);
371    a: for (; 0 < c; ) {
372      var d = c - 1 >>> 1, e = a[d];
373      if (0 < g(e, b)) a[d] = b, a[c] = e, c = d;
374      else break a;
375    }
376  }
377  function h(a) {
378    return 0 === a.length ? null : a[0];
379  }
380  function k2(a) {
381    if (0 === a.length) return null;
382    var b = a[0], c = a.pop();
383    if (c !== b) {
384      a[0] = c;
385      a: for (var d = 0, e = a.length, w2 = e >>> 1; d < w2; ) {
386        var m2 = 2 * (d + 1) - 1, C2 = a[m2], n2 = m2 + 1, x2 = a[n2];
387        if (0 > g(C2, c)) n2 < e && 0 > g(x2, C2) ? (a[d] = x2, a[n2] = c, d = n2) : (a[d] = C2, a[m2] = c, d = m2);
388        else if (n2 < e && 0 > g(x2, c)) a[d] = x2, a[n2] = c, d = n2;
389        else break a;
390      }
391    }
392    return b;
393  }
394  function g(a, b) {
395    var c = a.sortIndex - b.sortIndex;
396    return 0 !== c ? c : a.id - b.id;
397  }
398  if ("object" === typeof performance && "function" === typeof performance.now) {
399    var l2 = performance;
400    exports.unstable_now = function() {
401      return l2.now();
402    };
403  } else {
404    var p2 = Date, q2 = p2.now();
405    exports.unstable_now = function() {
406      return p2.now() - q2;
407    };
408  }
409  var r2 = [], t2 = [], u2 = 1, v2 = null, y2 = 3, z2 = false, A2 = false, B2 = false, D2 = "function" === typeof setTimeout ? setTimeout : null, E2 = "function" === typeof clearTimeout ? clearTimeout : null, F2 = "undefined" !== typeof setImmediate ? setImmediate : null;
410  "undefined" !== typeof navigator && void 0 !== navigator.scheduling && void 0 !== navigator.scheduling.isInputPending && navigator.scheduling.isInputPending.bind(navigator.scheduling);
411  function G2(a) {
412    for (var b = h(t2); null !== b; ) {
413      if (null === b.callback) k2(t2);
414      else if (b.startTime <= a) k2(t2), b.sortIndex = b.expirationTime, f2(r2, b);
415      else break;
416      b = h(t2);
417    }
418  }
419  function H2(a) {
420    B2 = false;
421    G2(a);
422    if (!A2) if (null !== h(r2)) A2 = true, I2(J2);
423    else {
424      var b = h(t2);
425      null !== b && K2(H2, b.startTime - a);
426    }
427  }
428  function J2(a, b) {
429    A2 = false;
430    B2 && (B2 = false, E2(L2), L2 = -1);
431    z2 = true;
432    var c = y2;
433    try {
434      G2(b);
435      for (v2 = h(r2); null !== v2 && (!(v2.expirationTime > b) || a && !M2()); ) {
436        var d = v2.callback;
437        if ("function" === typeof d) {
438          v2.callback = null;
439          y2 = v2.priorityLevel;
440          var e = d(v2.expirationTime <= b);
441          b = exports.unstable_now();
442          "function" === typeof e ? v2.callback = e : v2 === h(r2) && k2(r2);
443          G2(b);
444        } else k2(r2);
445        v2 = h(r2);
446      }
447      if (null !== v2) var w2 = true;
448      else {
449        var m2 = h(t2);
450        null !== m2 && K2(H2, m2.startTime - b);
451        w2 = false;
452      }
453      return w2;
454    } finally {
455      v2 = null, y2 = c, z2 = false;
456    }
457  }
458  var N2 = false, O2 = null, L2 = -1, P2 = 5, Q2 = -1;
459  function M2() {
460    return exports.unstable_now() - Q2 < P2 ? false : true;
461  }
462  function R2() {
463    if (null !== O2) {
464      var a = exports.unstable_now();
465      Q2 = a;
466      var b = true;
467      try {
468        b = O2(true, a);
469      } finally {
470        b ? S2() : (N2 = false, O2 = null);
471      }
472    } else N2 = false;
473  }
474  var S2;
475  if ("function" === typeof F2) S2 = function() {
476    F2(R2);
477  };
478  else if ("undefined" !== typeof MessageChannel) {
479    var T2 = new MessageChannel(), U2 = T2.port2;
480    T2.port1.onmessage = R2;
481    S2 = function() {
482      U2.postMessage(null);
483    };
484  } else S2 = function() {
485    D2(R2, 0);
486  };
487  function I2(a) {
488    O2 = a;
489    N2 || (N2 = true, S2());
490  }
491  function K2(a, b) {
492    L2 = D2(function() {
493      a(exports.unstable_now());
494    }, b);
495  }
496  exports.unstable_IdlePriority = 5;
497  exports.unstable_ImmediatePriority = 1;
498  exports.unstable_LowPriority = 4;
499  exports.unstable_NormalPriority = 3;
500  exports.unstable_Profiling = null;
501  exports.unstable_UserBlockingPriority = 2;
502  exports.unstable_cancelCallback = function(a) {
503    a.callback = null;
504  };
505  exports.unstable_continueExecution = function() {
506    A2 || z2 || (A2 = true, I2(J2));
507  };
508  exports.unstable_forceFrameRate = function(a) {
509    0 > a || 125 < a ? console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported") : P2 = 0 < a ? Math.floor(1e3 / a) : 5;
510  };
511  exports.unstable_getCurrentPriorityLevel = function() {
512    return y2;
513  };
514  exports.unstable_getFirstCallbackNode = function() {
515    return h(r2);
516  };
517  exports.unstable_next = function(a) {
518    switch (y2) {
519      case 1:
520      case 2:
521      case 3:
522        var b = 3;
523        break;
524      default:
525        b = y2;
526    }
527    var c = y2;
528    y2 = b;
529    try {
530      return a();
531    } finally {
532      y2 = c;
533    }
534  };
535  exports.unstable_pauseExecution = function() {
536  };
537  exports.unstable_requestPaint = function() {
538  };
539  exports.unstable_runWithPriority = function(a, b) {
540    switch (a) {
541      case 1:
542      case 2:
543      case 3:
544      case 4:
545      case 5:
546        break;
547      default:
548        a = 3;
549    }
550    var c = y2;
551    y2 = a;
552    try {
553      return b();
554    } finally {
555      y2 = c;
556    }
557  };
558  exports.unstable_scheduleCallback = function(a, b, c) {
559    var d = exports.unstable_now();
560    "object" === typeof c && null !== c ? (c = c.delay, c = "number" === typeof c && 0 < c ? d + c : d) : c = d;
561    switch (a) {
562      case 1:
563        var e = -1;
564        break;
565      case 2:
566        e = 250;
567        break;
568      case 5:
569        e = 1073741823;
570        break;
571      case 4:
572        e = 1e4;
573        break;
574      default:
575        e = 5e3;
576    }
577    e = c + e;
578    a = { id: u2++, callback: b, priorityLevel: a, startTime: c, expirationTime: e, sortIndex: -1 };
579    c > d ? (a.sortIndex = c, f2(t2, a), null === h(r2) && a === h(t2) && (B2 ? (E2(L2), L2 = -1) : B2 = true, K2(H2, c - d))) : (a.sortIndex = e, f2(r2, a), A2 || z2 || (A2 = true, I2(J2)));
580    return a;
581  };
582  exports.unstable_shouldYield = M2;
583  exports.unstable_wrapCallback = function(a) {
584    var b = y2;
585    return function() {
586      var c = y2;
587      y2 = b;
588      try {
589        return a.apply(this, arguments);
590      } finally {
591        y2 = c;
592      }
593    };
594  };
595})(scheduler_production_min);
596{
597  scheduler.exports = scheduler_production_min;
598}
599var schedulerExports = scheduler.exports;
600/**
601 * @license React
602 * react-dom.production.min.js
603 *
604 * Copyright (c) Facebook, Inc. and its affiliates.
605 *
606 * This source code is licensed under the MIT license found in the
607 * LICENSE file in the root directory of this source tree.
608 */
609var aa = reactExports, ca = schedulerExports;
610function p(a) {
611  for (var b = "https://reactjs.org/docs/error-decoder.html?invariant=" + a, c = 1; c < arguments.length; c++) b += "&args[]=" + encodeURIComponent(arguments[c]);
612  return "Minified React error #" + a + "; visit " + b + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";
613}
614var da = /* @__PURE__ */ new Set(), ea = {};
615function fa(a, b) {
616  ha(a, b);
617  ha(a + "Capture", b);
618}
619function ha(a, b) {
620  ea[a] = b;
621  for (a = 0; a < b.length; a++) da.add(b[a]);
622}
623var ia = !("undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement), ja = Object.prototype.hasOwnProperty, ka = /^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/, la = {}, ma = {};
624function oa(a) {
625  if (ja.call(ma, a)) return true;
626  if (ja.call(la, a)) return false;
627  if (ka.test(a)) return ma[a] = true;
628  la[a] = true;
629  return false;
630}
631function pa(a, b, c, d) {
632  if (null !== c && 0 === c.type) return false;
633  switch (typeof b) {
634    case "function":
635    case "symbol":
636      return true;
637    case "boolean":
638      if (d) return false;
639      if (null !== c) return !c.acceptsBooleans;
640      a = a.toLowerCase().slice(0, 5);
641      return "data-" !== a && "aria-" !== a;
642    default:
643      return false;
644  }
645}
646function qa(a, b, c, d) {
647  if (null === b || "undefined" === typeof b || pa(a, b, c, d)) return true;
648  if (d) return false;
649  if (null !== c) switch (c.type) {
650    case 3:
651      return !b;
652    case 4:
653      return false === b;
654    case 5:
655      return isNaN(b);
656    case 6:
657      return isNaN(b) || 1 > b;
658  }
659  return false;
660}
661function v(a, b, c, d, e, f2, g) {
662  this.acceptsBooleans = 2 === b || 3 === b || 4 === b;
663  this.attributeName = d;
664  this.attributeNamespace = e;
665  this.mustUseProperty = c;
666  this.propertyName = a;
667  this.type = b;
668  this.sanitizeURL = f2;
669  this.removeEmptyString = g;
670}
671var z = {};
672"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a) {
673  z[a] = new v(a, 0, false, a, null, false, false);
674});
675[["acceptCharset", "accept-charset"], ["className", "class"], ["htmlFor", "for"], ["httpEquiv", "http-equiv"]].forEach(function(a) {
676  var b = a[0];
677  z[b] = new v(b, 1, false, a[1], null, false, false);
678});
679["contentEditable", "draggable", "spellCheck", "value"].forEach(function(a) {
680  z[a] = new v(a, 2, false, a.toLowerCase(), null, false, false);
681});
682["autoReverse", "externalResourcesRequired", "focusable", "preserveAlpha"].forEach(function(a) {
683  z[a] = new v(a, 2, false, a, null, false, false);
684});
685"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a) {
686  z[a] = new v(a, 3, false, a.toLowerCase(), null, false, false);
687});
688["checked", "multiple", "muted", "selected"].forEach(function(a) {
689  z[a] = new v(a, 3, true, a, null, false, false);
690});
691["capture", "download"].forEach(function(a) {
692  z[a] = new v(a, 4, false, a, null, false, false);
693});
694["cols", "rows", "size", "span"].forEach(function(a) {
695  z[a] = new v(a, 6, false, a, null, false, false);
696});
697["rowSpan", "start"].forEach(function(a) {
698  z[a] = new v(a, 5, false, a.toLowerCase(), null, false, false);
699});
700var ra = /[\-:]([a-z])/g;
701function sa(a) {
702  return a[1].toUpperCase();
703}
704"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a) {
705  var b = a.replace(
706    ra,
707    sa
708  );
709  z[b] = new v(b, 1, false, a, null, false, false);
710});
711"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a) {
712  var b = a.replace(ra, sa);
713  z[b] = new v(b, 1, false, a, "http://www.w3.org/1999/xlink", false, false);
714});
715["xml:base", "xml:lang", "xml:space"].forEach(function(a) {
716  var b = a.replace(ra, sa);
717  z[b] = new v(b, 1, false, a, "http://www.w3.org/XML/1998/namespace", false, false);
718});
719["tabIndex", "crossOrigin"].forEach(function(a) {
720  z[a] = new v(a, 1, false, a.toLowerCase(), null, false, false);
721});
722z.xlinkHref = new v("xlinkHref", 1, false, "xlink:href", "http://www.w3.org/1999/xlink", true, false);
723["src", "href", "action", "formAction"].forEach(function(a) {
724  z[a] = new v(a, 1, false, a.toLowerCase(), null, true, true);
725});
726function ta(a, b, c, d) {
727  var e = z.hasOwnProperty(b) ? z[b] : null;
728  if (null !== e ? 0 !== e.type : d || !(2 < b.length) || "o" !== b[0] && "O" !== b[0] || "n" !== b[1] && "N" !== b[1]) qa(b, c, e, d) && (c = null), d || null === e ? oa(b) && (null === c ? a.removeAttribute(b) : a.setAttribute(b, "" + c)) : e.mustUseProperty ? a[e.propertyName] = null === c ? 3 === e.type ? false : "" : c : (b = e.attributeName, d = e.attributeNamespace, null === c ? a.removeAttribute(b) : (e = e.type, c = 3 === e || 4 === e && true === c ? "" : "" + c, d ? a.setAttributeNS(d, b, c) : a.setAttribute(b, c)));
729}
730var ua = aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, va = Symbol.for("react.element"), wa = Symbol.for("react.portal"), ya = Symbol.for("react.fragment"), za = Symbol.for("react.strict_mode"), Aa = Symbol.for("react.profiler"), Ba = Symbol.for("react.provider"), Ca = Symbol.for("react.context"), Da = Symbol.for("react.forward_ref"), Ea = Symbol.for("react.suspense"), Fa = Symbol.for("react.suspense_list"), Ga = Symbol.for("react.memo"), Ha = Symbol.for("react.lazy");
731var Ia = Symbol.for("react.offscreen");
732var Ja = Symbol.iterator;
733function Ka(a) {
734  if (null === a || "object" !== typeof a) return null;
735  a = Ja && a[Ja] || a["@@iterator"];
736  return "function" === typeof a ? a : null;
737}
738var A = Object.assign, La;
739function Ma(a) {
740  if (void 0 === La) try {
741    throw Error();
742  } catch (c) {
743    var b = c.stack.trim().match(/\n( *(at )?)/);
744    La = b && b[1] || "";
745  }
746  return "\n" + La + a;
747}
748var Na = false;
749function Oa(a, b) {
750  if (!a || Na) return "";
751  Na = true;
752  var c = Error.prepareStackTrace;
753  Error.prepareStackTrace = void 0;
754  try {
755    if (b) if (b = function() {
756      throw Error();
757    }, Object.defineProperty(b.prototype, "props", { set: function() {
758      throw Error();
759    } }), "object" === typeof Reflect && Reflect.construct) {
760      try {
761        Reflect.construct(b, []);
762      } catch (l2) {
763        var d = l2;
764      }
765      Reflect.construct(a, [], b);
766    } else {
767      try {
768        b.call();
769      } catch (l2) {
770        d = l2;
771      }
772      a.call(b.prototype);
773    }
774    else {
775      try {
776        throw Error();
777      } catch (l2) {
778        d = l2;
779      }
780      a();
781    }
782  } catch (l2) {
783    if (l2 && d && "string" === typeof l2.stack) {
784      for (var e = l2.stack.split("\n"), f2 = d.stack.split("\n"), g = e.length - 1, h = f2.length - 1; 1 <= g && 0 <= h && e[g] !== f2[h]; ) h--;
785      for (; 1 <= g && 0 <= h; g--, h--) if (e[g] !== f2[h]) {
786        if (1 !== g || 1 !== h) {
787          do
788            if (g--, h--, 0 > h || e[g] !== f2[h]) {
789              var k2 = "\n" + e[g].replace(" at new ", " at ");
790              a.displayName && k2.includes("<anonymous>") && (k2 = k2.replace("<anonymous>", a.displayName));
791              return k2;
792            }
793          while (1 <= g && 0 <= h);
794        }
795        break;
796      }
797    }
798  } finally {
799    Na = false, Error.prepareStackTrace = c;
800  }
801  return (a = a ? a.displayName || a.name : "") ? Ma(a) : "";
802}
803function Pa(a) {
804  switch (a.tag) {
805    case 5:
806      return Ma(a.type);
807    case 16:
808      return Ma("Lazy");
809    case 13:
810      return Ma("Suspense");
811    case 19:
812      return Ma("SuspenseList");
813    case 0:
814    case 2:
815    case 15:
816      return a = Oa(a.type, false), a;
817    case 11:
818      return a = Oa(a.type.render, false), a;
819    case 1:
820      return a = Oa(a.type, true), a;
821    default:
822      return "";
823  }
824}
825function Qa(a) {
826  if (null == a) return null;
827  if ("function" === typeof a) return a.displayName || a.name || null;
828  if ("string" === typeof a) return a;
829  switch (a) {
830    case ya:
831      return "Fragment";
832    case wa:
833      return "Portal";
834    case Aa:
835      return "Profiler";
836    case za:
837      return "StrictMode";
838    case Ea:
839      return "Suspense";
840    case Fa:
841      return "SuspenseList";
842  }
843  if ("object" === typeof a) switch (a.$$typeof) {
844    case Ca:
845      return (a.displayName || "Context") + ".Consumer";
846    case Ba:
847      return (a._context.displayName || "Context") + ".Provider";
848    case Da:
849      var b = a.render;
850      a = a.displayName;
851      a || (a = b.displayName || b.name || "", a = "" !== a ? "ForwardRef(" + a + ")" : "ForwardRef");
852      return a;
853    case Ga:
854      return b = a.displayName || null, null !== b ? b : Qa(a.type) || "Memo";
855    case Ha:
856      b = a._payload;
857      a = a._init;
858      try {
859        return Qa(a(b));
860      } catch (c) {
861      }
862  }
863  return null;
864}
865function Ra(a) {
866  var b = a.type;
867  switch (a.tag) {
868    case 24:
869      return "Cache";
870    case 9:
871      return (b.displayName || "Context") + ".Consumer";
872    case 10:
873      return (b._context.displayName || "Context") + ".Provider";
874    case 18:
875      return "DehydratedFragment";
876    case 11:
877      return a = b.render, a = a.displayName || a.name || "", b.displayName || ("" !== a ? "ForwardRef(" + a + ")" : "ForwardRef");
878    case 7:
879      return "Fragment";
880    case 5:
881      return b;
882    case 4:
883      return "Portal";
884    case 3:
885      return "Root";
886    case 6:
887      return "Text";
888    case 16:
889      return Qa(b);
890    case 8:
891      return b === za ? "StrictMode" : "Mode";
892    case 22:
893      return "Offscreen";
894    case 12:
895      return "Profiler";
896    case 21:
897      return "Scope";
898    case 13:
899      return "Suspense";
900    case 19:
901      return "SuspenseList";
902    case 25:
903      return "TracingMarker";
904    case 1:
905    case 0:
906    case 17:
907    case 2:
908    case 14:
909    case 15:
910      if ("function" === typeof b) return b.displayName || b.name || null;
911      if ("string" === typeof b) return b;
912  }
913  return null;
914}
915function Sa(a) {
916  switch (typeof a) {
917    case "boolean":
918    case "number":
919    case "string":
920    case "undefined":
921      return a;
922    case "object":
923      return a;
924    default:
925      return "";
926  }
927}
928function Ta(a) {
929  var b = a.type;
930  return (a = a.nodeName) && "input" === a.toLowerCase() && ("checkbox" === b || "radio" === b);
931}
932function Ua(a) {
933  var b = Ta(a) ? "checked" : "value", c = Object.getOwnPropertyDescriptor(a.constructor.prototype, b), d = "" + a[b];
934  if (!a.hasOwnProperty(b) && "undefined" !== typeof c && "function" === typeof c.get && "function" === typeof c.set) {
935    var e = c.get, f2 = c.set;
936    Object.defineProperty(a, b, { configurable: true, get: function() {
937      return e.call(this);
938    }, set: function(a2) {
939      d = "" + a2;
940      f2.call(this, a2);
941    } });
942    Object.defineProperty(a, b, { enumerable: c.enumerable });
943    return { getValue: function() {
944      return d;
945    }, setValue: function(a2) {
946      d = "" + a2;
947    }, stopTracking: function() {
948      a._valueTracker = null;
949      delete a[b];
950    } };
951  }
952}
953function Va(a) {
954  a._valueTracker || (a._valueTracker = Ua(a));
955}
956function Wa(a) {
957  if (!a) return false;
958  var b = a._valueTracker;
959  if (!b) return true;
960  var c = b.getValue();
961  var d = "";
962  a && (d = Ta(a) ? a.checked ? "true" : "false" : a.value);
963  a = d;
964  return a !== c ? (b.setValue(a), true) : false;
965}
966function Xa(a) {
967  a = a || ("undefined" !== typeof document ? document : void 0);
968  if ("undefined" === typeof a) return null;
969  try {
970    return a.activeElement || a.body;
971  } catch (b) {
972    return a.body;
973  }
974}
975function Ya(a, b) {
976  var c = b.checked;
977  return A({}, b, { defaultChecked: void 0, defaultValue: void 0, value: void 0, checked: null != c ? c : a._wrapperState.initialChecked });
978}
979function Za(a, b) {
980  var c = null == b.defaultValue ? "" : b.defaultValue, d = null != b.checked ? b.checked : b.defaultChecked;
981  c = Sa(null != b.value ? b.value : c);
982  a._wrapperState = { initialChecked: d, initialValue: c, controlled: "checkbox" === b.type || "radio" === b.type ? null != b.checked : null != b.value };
983}
984function ab(a, b) {
985  b = b.checked;
986  null != b && ta(a, "checked", b, false);
987}
988function bb(a, b) {
989  ab(a, b);
990  var c = Sa(b.value), d = b.type;
991  if (null != c) if ("number" === d) {
992    if (0 === c && "" === a.value || a.value != c) a.value = "" + c;
993  } else a.value !== "" + c && (a.value = "" + c);
994  else if ("submit" === d || "reset" === d) {
995    a.removeAttribute("value");
996    return;
997  }
998  b.hasOwnProperty("value") ? cb(a, b.type, c) : b.hasOwnProperty("defaultValue") && cb(a, b.type, Sa(b.defaultValue));
999  null == b.checked && null != b.defaultChecked && (a.defaultChecked = !!b.defaultChecked);
1000}
1001function db(a, b, c) {
1002  if (b.hasOwnProperty("value") || b.hasOwnProperty("defaultValue")) {
1003    var d = b.type;
1004    if (!("submit" !== d && "reset" !== d || void 0 !== b.value && null !== b.value)) return;
1005    b = "" + a._wrapperState.initialValue;
1006    c || b === a.value || (a.value = b);
1007    a.defaultValue = b;
1008  }
1009  c = a.name;
1010  "" !== c && (a.name = "");
1011  a.defaultChecked = !!a._wrapperState.initialChecked;
1012  "" !== c && (a.name = c);
1013}
1014function cb(a, b, c) {
1015  if ("number" !== b || Xa(a.ownerDocument) !== a) null == c ? a.defaultValue = "" + a._wrapperState.initialValue : a.defaultValue !== "" + c && (a.defaultValue = "" + c);
1016}
1017var eb = Array.isArray;
1018function fb(a, b, c, d) {
1019  a = a.options;
1020  if (b) {
1021    b = {};
1022    for (var e = 0; e < c.length; e++) b["$" + c[e]] = true;
1023    for (c = 0; c < a.length; c++) e = b.hasOwnProperty("$" + a[c].value), a[c].selected !== e && (a[c].selected = e), e && d && (a[c].defaultSelected = true);
1024  } else {
1025    c = "" + Sa(c);
1026    b = null;
1027    for (e = 0; e < a.length; e++) {
1028      if (a[e].value === c) {
1029        a[e].selected = true;
1030        d && (a[e].defaultSelected = true);
1031        return;
1032      }
1033      null !== b || a[e].disabled || (b = a[e]);
1034    }
1035    null !== b && (b.selected = true);
1036  }
1037}
1038function gb(a, b) {
1039  if (null != b.dangerouslySetInnerHTML) throw Error(p(91));
1040  return A({}, b, { value: void 0, defaultValue: void 0, children: "" + a._wrapperState.initialValue });
1041}
1042function hb(a, b) {
1043  var c = b.value;
1044  if (null == c) {
1045    c = b.children;
1046    b = b.defaultValue;
1047    if (null != c) {
1048      if (null != b) throw Error(p(92));
1049      if (eb(c)) {
1050        if (1 < c.length) throw Error(p(93));
1051        c = c[0];
1052      }
1053      b = c;
1054    }
1055    null == b && (b = "");
1056    c = b;
1057  }
1058  a._wrapperState = { initialValue: Sa(c) };
1059}
1060function ib(a, b) {
1061  var c = Sa(b.value), d = Sa(b.defaultValue);
1062  null != c && (c = "" + c, c !== a.value && (a.value = c), null == b.defaultValue && a.defaultValue !== c && (a.defaultValue = c));
1063  null != d && (a.defaultValue = "" + d);
1064}
1065function jb(a) {
1066  var b = a.textContent;
1067  b === a._wrapperState.initialValue && "" !== b && null !== b && (a.value = b);
1068}
1069function kb(a) {
1070  switch (a) {
1071    case "svg":
1072      return "http://www.w3.org/2000/svg";
1073    case "math":
1074      return "http://www.w3.org/1998/Math/MathML";
1075    default:
1076      return "http://www.w3.org/1999/xhtml";
1077  }
1078}
1079function lb(a, b) {
1080  return null == a || "http://www.w3.org/1999/xhtml" === a ? kb(b) : "http://www.w3.org/2000/svg" === a && "foreignObject" === b ? "http://www.w3.org/1999/xhtml" : a;
1081}
1082var mb, nb = function(a) {
1083  return "undefined" !== typeof MSApp && MSApp.execUnsafeLocalFunction ? function(b, c, d, e) {
1084    MSApp.execUnsafeLocalFunction(function() {
1085      return a(b, c, d, e);
1086    });
1087  } : a;
1088}(function(a, b) {
1089  if ("http://www.w3.org/2000/svg" !== a.namespaceURI || "innerHTML" in a) a.innerHTML = b;
1090  else {
1091    mb = mb || document.createElement("div");
1092    mb.innerHTML = "<svg>" + b.valueOf().toString() + "</svg>";
1093    for (b = mb.firstChild; a.firstChild; ) a.removeChild(a.firstChild);
1094    for (; b.firstChild; ) a.appendChild(b.firstChild);
1095  }
1096});
1097function ob(a, b) {
1098  if (b) {
1099    var c = a.firstChild;
1100    if (c && c === a.lastChild && 3 === c.nodeType) {
1101      c.nodeValue = b;
1102      return;
1103    }
1104  }
1105  a.textContent = b;
1106}
1107var pb = {
1108  animationIterationCount: true,
1109  aspectRatio: true,
1110  borderImageOutset: true,
1111  borderImageSlice: true,
1112  borderImageWidth: true,
1113  boxFlex: true,
1114  boxFlexGroup: true,
1115  boxOrdinalGroup: true,
1116  columnCount: true,
1117  columns: true,
1118  flex: true,
1119  flexGrow: true,
1120  flexPositive: true,
1121  flexShrink: true,
1122  flexNegative: true,
1123  flexOrder: true,
1124  gridArea: true,
1125  gridRow: true,
1126  gridRowEnd: true,
1127  gridRowSpan: true,
1128  gridRowStart: true,
1129  gridColumn: true,
1130  gridColumnEnd: true,
1131  gridColumnSpan: true,
1132  gridColumnStart: true,
1133  fontWeight: true,
1134  lineClamp: true,
1135  lineHeight: true,
1136  opacity: true,
1137  order: true,
1138  orphans: true,
1139  tabSize: true,
1140  widows: true,
1141  zIndex: true,
1142  zoom: true,
1143  fillOpacity: true,
1144  floodOpacity: true,
1145  stopOpacity: true,
1146  strokeDasharray: true,
1147  strokeDashoffset: true,
1148  strokeMiterlimit: true,
1149  strokeOpacity: true,
1150  strokeWidth: true
1151}, qb = ["Webkit", "ms", "Moz", "O"];
1152Object.keys(pb).forEach(function(a) {
1153  qb.forEach(function(b) {
1154    b = b + a.charAt(0).toUpperCase() + a.substring(1);
1155    pb[b] = pb[a];
1156  });
1157});
1158function rb(a, b, c) {
1159  return null == b || "boolean" === typeof b || "" === b ? "" : c || "number" !== typeof b || 0 === b || pb.hasOwnProperty(a) && pb[a] ? ("" + b).trim() : b + "px";
1160}
1161function sb(a, b) {
1162  a = a.style;
1163  for (var c in b) if (b.hasOwnProperty(c)) {
1164    var d = 0 === c.indexOf("--"), e = rb(c, b[c], d);
1165    "float" === c && (c = "cssFloat");
1166    d ? a.setProperty(c, e) : a[c] = e;
1167  }
1168}
1169var tb = A({ menuitem: true }, { area: true, base: true, br: true, col: true, embed: true, hr: true, img: true, input: true, keygen: true, link: true, meta: true, param: true, source: true, track: true, wbr: true });
1170function ub(a, b) {
1171  if (b) {
1172    if (tb[a] && (null != b.children || null != b.dangerouslySetInnerHTML)) throw Error(p(137, a));
1173    if (null != b.dangerouslySetInnerHTML) {
1174      if (null != b.children) throw Error(p(60));
1175      if ("object" !== typeof b.dangerouslySetInnerHTML || !("__html" in b.dangerouslySetInnerHTML)) throw Error(p(61));
1176    }
1177    if (null != b.style && "object" !== typeof b.style) throw Error(p(62));
1178  }
1179}
1180function vb(a, b) {
1181  if (-1 === a.indexOf("-")) return "string" === typeof b.is;
1182  switch (a) {
1183    case "annotation-xml":
1184    case "color-profile":
1185    case "font-face":
1186    case "font-face-src":
1187    case "font-face-uri":
1188    case "font-face-format":
1189    case "font-face-name":
1190    case "missing-glyph":
1191      return false;
1192    default:
1193      return true;
1194  }
1195}
1196var wb = null;
1197function xb(a) {
1198  a = a.target || a.srcElement || window;
1199  a.correspondingUseElement && (a = a.correspondingUseElement);
1200  return 3 === a.nodeType ? a.parentNode : a;
1201}
1202var yb = null, zb = null, Ab = null;
1203function Bb(a) {
1204  if (a = Cb(a)) {
1205    if ("function" !== typeof yb) throw Error(p(280));
1206    var b = a.stateNode;
1207    b && (b = Db(b), yb(a.stateNode, a.type, b));
1208  }
1209}
1210function Eb(a) {
1211  zb ? Ab ? Ab.push(a) : Ab = [a] : zb = a;
1212}
1213function Fb() {
1214  if (zb) {
1215    var a = zb, b = Ab;
1216    Ab = zb = null;
1217    Bb(a);
1218    if (b) for (a = 0; a < b.length; a++) Bb(b[a]);
1219  }
1220}
1221function Gb(a, b) {
1222  return a(b);
1223}
1224function Hb() {
1225}
1226var Ib = false;
1227function Jb(a, b, c) {
1228  if (Ib) return a(b, c);
1229  Ib = true;
1230  try {
1231    return Gb(a, b, c);
1232  } finally {
1233    if (Ib = false, null !== zb || null !== Ab) Hb(), Fb();
1234  }
1235}
1236function Kb(a, b) {
1237  var c = a.stateNode;
1238  if (null === c) return null;
1239  var d = Db(c);
1240  if (null === d) return null;
1241  c = d[b];
1242  a: switch (b) {
1243    case "onClick":
1244    case "onClickCapture":
1245    case "onDoubleClick":
1246    case "onDoubleClickCapture":
1247    case "onMouseDown":
1248    case "onMouseDownCapture":
1249    case "onMouseMove":
1250    case "onMouseMoveCapture":
1251    case "onMouseUp":
1252    case "onMouseUpCapture":
1253    case "onMouseEnter":
1254      (d = !d.disabled) || (a = a.type, d = !("button" === a || "input" === a || "select" === a || "textarea" === a));
1255      a = !d;
1256      break a;
1257    default:
1258      a = false;
1259  }
1260  if (a) return null;
1261  if (c && "function" !== typeof c) throw Error(p(231, b, typeof c));
1262  return c;
1263}
1264var Lb = false;
1265if (ia) try {
1266  var Mb = {};
1267  Object.defineProperty(Mb, "passive", { get: function() {
1268    Lb = true;
1269  } });
1270  window.addEventListener("test", Mb, Mb);
1271  window.removeEventListener("test", Mb, Mb);
1272} catch (a) {
1273  Lb = false;
1274}
1275function Nb(a, b, c, d, e, f2, g, h, k2) {
1276  var l2 = Array.prototype.slice.call(arguments, 3);
1277  try {
1278    b.apply(c, l2);
1279  } catch (m2) {
1280    this.onError(m2);
1281  }
1282}
1283var Ob = false, Pb = null, Qb = false, Rb = null, Sb = { onError: function(a) {
1284  Ob = true;
1285  Pb = a;
1286} };
1287function Tb(a, b, c, d, e, f2, g, h, k2) {
1288  Ob = false;
1289  Pb = null;
1290  Nb.apply(Sb, arguments);
1291}
1292function Ub(a, b, c, d, e, f2, g, h, k2) {
1293  Tb.apply(this, arguments);
1294  if (Ob) {
1295    if (Ob) {
1296      var l2 = Pb;
1297      Ob = false;
1298      Pb = null;
1299    } else throw Error(p(198));
1300    Qb || (Qb = true, Rb = l2);
1301  }
1302}
1303function Vb(a) {
1304  var b = a, c = a;
1305  if (a.alternate) for (; b.return; ) b = b.return;
1306  else {
1307    a = b;
1308    do
1309      b = a, 0 !== (b.flags & 4098) && (c = b.return), a = b.return;
1310    while (a);
1311  }
1312  return 3 === b.tag ? c : null;
1313}
1314function Wb(a) {
1315  if (13 === a.tag) {
1316    var b = a.memoizedState;
1317    null === b && (a = a.alternate, null !== a && (b = a.memoizedState));
1318    if (null !== b) return b.dehydrated;
1319  }
1320  return null;
1321}
1322function Xb(a) {
1323  if (Vb(a) !== a) throw Error(p(188));
1324}
1325function Yb(a) {
1326  var b = a.alternate;
1327  if (!b) {
1328    b = Vb(a);
1329    if (null === b) throw Error(p(188));
1330    return b !== a ? null : a;
1331  }
1332  for (var c = a, d = b; ; ) {
1333    var e = c.return;
1334    if (null === e) break;
1335    var f2 = e.alternate;
1336    if (null === f2) {
1337      d = e.return;
1338      if (null !== d) {
1339        c = d;
1340        continue;
1341      }
1342      break;
1343    }
1344    if (e.child === f2.child) {
1345      for (f2 = e.child; f2; ) {
1346        if (f2 === c) return Xb(e), a;
1347        if (f2 === d) return Xb(e), b;
1348        f2 = f2.sibling;
1349      }
1350      throw Error(p(188));
1351    }
1352    if (c.return !== d.return) c = e, d = f2;
1353    else {
1354      for (var g = false, h = e.child; h; ) {
1355        if (h === c) {
1356          g = true;
1357          c = e;
1358          d = f2;
1359          break;
1360        }
1361        if (h === d) {
1362          g = true;
1363          d = e;
1364          c = f2;
1365          break;
1366        }
1367        h = h.sibling;
1368      }
1369      if (!g) {
1370        for (h = f2.child; h; ) {
1371          if (h === c) {
1372            g = true;
1373            c = f2;
1374            d = e;
1375            break;
1376          }
1377          if (h === d) {
1378            g = true;
1379            d = f2;
1380            c = e;
1381            break;
1382          }
1383          h = h.sibling;
1384        }
1385        if (!g) throw Error(p(189));
1386      }
1387    }
1388    if (c.alternate !== d) throw Error(p(190));
1389  }
1390  if (3 !== c.tag) throw Error(p(188));
1391  return c.stateNode.current === c ? a : b;
1392}
1393function Zb(a) {
1394  a = Yb(a);
1395  return null !== a ? $b(a) : null;
1396}
1397function $b(a) {
1398  if (5 === a.tag || 6 === a.tag) return a;
1399  for (a = a.child; null !== a; ) {
1400    var b = $b(a);
1401    if (null !== b) return b;
1402    a = a.sibling;
1403  }
1404  return null;
1405}
1406var ac = ca.unstable_scheduleCallback, bc = ca.unstable_cancelCallback, cc = ca.unstable_shouldYield, dc = ca.unstable_requestPaint, B = ca.unstable_now, ec = ca.unstable_getCurrentPriorityLevel, fc = ca.unstable_ImmediatePriority, gc = ca.unstable_UserBlockingPriority, hc = ca.unstable_NormalPriority, ic = ca.unstable_LowPriority, jc = ca.unstable_IdlePriority, kc = null, lc = null;
1407function mc(a) {
1408  if (lc && "function" === typeof lc.onCommitFiberRoot) try {
1409    lc.onCommitFiberRoot(kc, a, void 0, 128 === (a.current.flags & 128));
1410  } catch (b) {
1411  }
1412}
1413var oc = Math.clz32 ? Math.clz32 : nc, pc = Math.log, qc = Math.LN2;
1414function nc(a) {
1415  a >>>= 0;
1416  return 0 === a ? 32 : 31 - (pc(a) / qc | 0) | 0;
1417}
1418var rc = 64, sc = 4194304;
1419function tc(a) {
1420  switch (a & -a) {
1421    case 1:
1422      return 1;
1423    case 2:
1424      return 2;
1425    case 4:
1426      return 4;
1427    case 8:
1428      return 8;
1429    case 16:
1430      return 16;
1431    case 32:
1432      return 32;
1433    case 64:
1434    case 128:
1435    case 256:
1436    case 512:
1437    case 1024:
1438    case 2048:
1439    case 4096:
1440    case 8192:
1441    case 16384:
1442    case 32768:
1443    case 65536:
1444    case 131072:
1445    case 262144:
1446    case 524288:
1447    case 1048576:
1448    case 2097152:
1449      return a & 4194240;
1450    case 4194304:
1451    case 8388608:
1452    case 16777216:
1453    case 33554432:
1454    case 67108864:
1455      return a & 130023424;
1456    case 134217728:
1457      return 134217728;
1458    case 268435456:
1459      return 268435456;
1460    case 536870912:
1461      return 536870912;
1462    case 1073741824:
1463      return 1073741824;
1464    default:
1465      return a;
1466  }
1467}
1468function uc(a, b) {
1469  var c = a.pendingLanes;
1470  if (0 === c) return 0;
1471  var d = 0, e = a.suspendedLanes, f2 = a.pingedLanes, g = c & 268435455;
1472  if (0 !== g) {
1473    var h = g & ~e;
1474    0 !== h ? d = tc(h) : (f2 &= g, 0 !== f2 && (d = tc(f2)));
1475  } else g = c & ~e, 0 !== g ? d = tc(g) : 0 !== f2 && (d = tc(f2));
1476  if (0 === d) return 0;
1477  if (0 !== b && b !== d && 0 === (b & e) && (e = d & -d, f2 = b & -b, e >= f2 || 16 === e && 0 !== (f2 & 4194240))) return b;
1478  0 !== (d & 4) && (d |= c & 16);
1479  b = a.entangledLanes;
1480  if (0 !== b) for (a = a.entanglements, b &= d; 0 < b; ) c = 31 - oc(b), e = 1 << c, d |= a[c], b &= ~e;
1481  return d;
1482}
1483function vc(a, b) {
1484  switch (a) {
1485    case 1:
1486    case 2:
1487    case 4:
1488      return b + 250;
1489    case 8:
1490    case 16:
1491    case 32:
1492    case 64:
1493    case 128:
1494    case 256:
1495    case 512:
1496    case 1024:
1497    case 2048:
1498    case 4096:
1499    case 8192:
1500    case 16384:
1501    case 32768:
1502    case 65536:
1503    case 131072:
1504    case 262144:
1505    case 524288:
1506    case 1048576:
1507    case 2097152:
1508      return b + 5e3;
1509    case 4194304:
1510    case 8388608:
1511    case 16777216:
1512    case 33554432:
1513    case 67108864:
1514      return -1;
1515    case 134217728:
1516    case 268435456:
1517    case 536870912:
1518    case 1073741824:
1519      return -1;
1520    default:
1521      return -1;
1522  }
1523}
1524function wc(a, b) {
1525  for (var c = a.suspendedLanes, d = a.pingedLanes, e = a.expirationTimes, f2 = a.pendingLanes; 0 < f2; ) {
1526    var g = 31 - oc(f2), h = 1 << g, k2 = e[g];
1527    if (-1 === k2) {
1528      if (0 === (h & c) || 0 !== (h & d)) e[g] = vc(h, b);
1529    } else k2 <= b && (a.expiredLanes |= h);
1530    f2 &= ~h;
1531  }
1532}
1533function xc(a) {
1534  a = a.pendingLanes & -1073741825;
1535  return 0 !== a ? a : a & 1073741824 ? 1073741824 : 0;
1536}
1537function yc() {
1538  var a = rc;
1539  rc <<= 1;
1540  0 === (rc & 4194240) && (rc = 64);
1541  return a;
1542}
1543function zc(a) {
1544  for (var b = [], c = 0; 31 > c; c++) b.push(a);
1545  return b;
1546}
1547function Ac(a, b, c) {
1548  a.pendingLanes |= b;
1549  536870912 !== b && (a.suspendedLanes = 0, a.pingedLanes = 0);
1550  a = a.eventTimes;
1551  b = 31 - oc(b);
1552  a[b] = c;
1553}
1554function Bc(a, b) {
1555  var c = a.pendingLanes & ~b;
1556  a.pendingLanes = b;
1557  a.suspendedLanes = 0;
1558  a.pingedLanes = 0;
1559  a.expiredLanes &= b;
1560  a.mutableReadLanes &= b;
1561  a.entangledLanes &= b;
1562  b = a.entanglements;
1563  var d = a.eventTimes;
1564  for (a = a.expirationTimes; 0 < c; ) {
1565    var e = 31 - oc(c), f2 = 1 << e;
1566    b[e] = 0;
1567    d[e] = -1;
1568    a[e] = -1;
1569    c &= ~f2;
1570  }
1571}
1572function Cc(a, b) {
1573  var c = a.entangledLanes |= b;
1574  for (a = a.entanglements; c; ) {
1575    var d = 31 - oc(c), e = 1 << d;
1576    e & b | a[d] & b && (a[d] |= b);
1577    c &= ~e;
1578  }
1579}
1580var C = 0;
1581function Dc(a) {
1582  a &= -a;
1583  return 1 < a ? 4 < a ? 0 !== (a & 268435455) ? 16 : 536870912 : 4 : 1;
1584}
1585var Ec, Fc, Gc, Hc, Ic, Jc = false, Kc = [], Lc = null, Mc = null, Nc = null, Oc = /* @__PURE__ */ new Map(), Pc = /* @__PURE__ */ new Map(), Qc = [], Rc = "mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");
1586function Sc(a, b) {
1587  switch (a) {
1588    case "focusin":
1589    case "focusout":
1590      Lc = null;
1591      break;
1592    case "dragenter":
1593    case "dragleave":
1594      Mc = null;
1595      break;
1596    case "mouseover":
1597    case "mouseout":
1598      Nc = null;
1599      break;
1600    case "pointerover":
1601    case "pointerout":
1602      Oc.delete(b.pointerId);
1603      break;
1604    case "gotpointercapture":
1605    case "lostpointercapture":
1606      Pc.delete(b.pointerId);
1607  }
1608}
1609function Tc(a, b, c, d, e, f2) {
1610  if (null === a || a.nativeEvent !== f2) return a = { blockedOn: b, domEventName: c, eventSystemFlags: d, nativeEvent: f2, targetContainers: [e] }, null !== b && (b = Cb(b), null !== b && Fc(b)), a;
1611  a.eventSystemFlags |= d;
1612  b = a.targetContainers;
1613  null !== e && -1 === b.indexOf(e) && b.push(e);
1614  return a;
1615}
1616function Uc(a, b, c, d, e) {
1617  switch (b) {
1618    case "focusin":
1619      return Lc = Tc(Lc, a, b, c, d, e), true;
1620    case "dragenter":
1621      return Mc = Tc(Mc, a, b, c, d, e), true;
1622    case "mouseover":
1623      return Nc = Tc(Nc, a, b, c, d, e), true;
1624    case "pointerover":
1625      var f2 = e.pointerId;
1626      Oc.set(f2, Tc(Oc.get(f2) || null, a, b, c, d, e));
1627      return true;
1628    case "gotpointercapture":
1629      return f2 = e.pointerId, Pc.set(f2, Tc(Pc.get(f2) || null, a, b, c, d, e)), true;
1630  }
1631  return false;
1632}
1633function Vc(a) {
1634  var b = Wc(a.target);
1635  if (null !== b) {
1636    var c = Vb(b);
1637    if (null !== c) {
1638      if (b = c.tag, 13 === b) {
1639        if (b = Wb(c), null !== b) {
1640          a.blockedOn = b;
1641          Ic(a.priority, function() {
1642            Gc(c);
1643          });
1644          return;
1645        }
1646      } else if (3 === b && c.stateNode.current.memoizedState.isDehydrated) {
1647        a.blockedOn = 3 === c.tag ? c.stateNode.containerInfo : null;
1648        return;
1649      }
1650    }
1651  }
1652  a.blockedOn = null;
1653}
1654function Xc(a) {
1655  if (null !== a.blockedOn) return false;
1656  for (var b = a.targetContainers; 0 < b.length; ) {
1657    var c = Yc(a.domEventName, a.eventSystemFlags, b[0], a.nativeEvent);
1658    if (null === c) {
1659      c = a.nativeEvent;
1660      var d = new c.constructor(c.type, c);
1661      wb = d;
1662      c.target.dispatchEvent(d);
1663      wb = null;
1664    } else return b = Cb(c), null !== b && Fc(b), a.blockedOn = c, false;
1665    b.shift();
1666  }
1667  return true;
1668}
1669function Zc(a, b, c) {
1670  Xc(a) && c.delete(b);
1671}
1672function $c() {
1673  Jc = false;
1674  null !== Lc && Xc(Lc) && (Lc = null);
1675  null !== Mc && Xc(Mc) && (Mc = null);
1676  null !== Nc && Xc(Nc) && (Nc = null);
1677  Oc.forEach(Zc);
1678  Pc.forEach(Zc);
1679}
1680function ad(a, b) {
1681  a.blockedOn === b && (a.blockedOn = null, Jc || (Jc = true, ca.unstable_scheduleCallback(ca.unstable_NormalPriority, $c)));
1682}
1683function bd(a) {
1684  function b(b2) {
1685    return ad(b2, a);
1686  }
1687  if (0 < Kc.length) {
1688    ad(Kc[0], a);
1689    for (var c = 1; c < Kc.length; c++) {
1690      var d = Kc[c];
1691      d.blockedOn === a && (d.blockedOn = null);
1692    }
1693  }
1694  null !== Lc && ad(Lc, a);
1695  null !== Mc && ad(Mc, a);
1696  null !== Nc && ad(Nc, a);
1697  Oc.forEach(b);
1698  Pc.forEach(b);
1699  for (c = 0; c < Qc.length; c++) d = Qc[c], d.blockedOn === a && (d.blockedOn = null);
1700  for (; 0 < Qc.length && (c = Qc[0], null === c.blockedOn); ) Vc(c), null === c.blockedOn && Qc.shift();
1701}
1702var cd = ua.ReactCurrentBatchConfig, dd = true;
1703function ed(a, b, c, d) {
1704  var e = C, f2 = cd.transition;
1705  cd.transition = null;
1706  try {
1707    C = 1, fd(a, b, c, d);
1708  } finally {
1709    C = e, cd.transition = f2;
1710  }
1711}
1712function gd(a, b, c, d) {
1713  var e = C, f2 = cd.transition;
1714  cd.transition = null;
1715  try {
1716    C = 4, fd(a, b, c, d);
1717  } finally {
1718    C = e, cd.transition = f2;
1719  }
1720}
1721function fd(a, b, c, d) {
1722  if (dd) {
1723    var e = Yc(a, b, c, d);
1724    if (null === e) hd(a, b, d, id, c), Sc(a, d);
1725    else if (Uc(e, a, b, c, d)) d.stopPropagation();
1726    else if (Sc(a, d), b & 4 && -1 < Rc.indexOf(a)) {
1727      for (; null !== e; ) {
1728        var f2 = Cb(e);
1729        null !== f2 && Ec(f2);
1730        f2 = Yc(a, b, c, d);
1731        null === f2 && hd(a, b, d, id, c);
1732        if (f2 === e) break;
1733        e = f2;
1734      }
1735      null !== e && d.stopPropagation();
1736    } else hd(a, b, d, null, c);
1737  }
1738}
1739var id = null;
1740function Yc(a, b, c, d) {
1741  id = null;
1742  a = xb(d);
1743  a = Wc(a);
1744  if (null !== a) if (b = Vb(a), null === b) a = null;
1745  else if (c = b.tag, 13 === c) {
1746    a = Wb(b);
1747    if (null !== a) return a;
1748    a = null;
1749  } else if (3 === c) {
1750    if (b.stateNode.current.memoizedState.isDehydrated) return 3 === b.tag ? b.stateNode.containerInfo : null;
1751    a = null;
1752  } else b !== a && (a = null);
1753  id = a;
1754  return null;
1755}
1756function jd(a) {
1757  switch (a) {
1758    case "cancel":
1759    case "click":
1760    case "close":
1761    case "contextmenu":
1762    case "copy":
1763    case "cut":
1764    case "auxclick":
1765    case "dblclick":
1766    case "dragend":
1767    case "dragstart":
1768    case "drop":
1769    case "focusin":
1770    case "focusout":
1771    case "input":
1772    case "invalid":
1773    case "keydown":
1774    case "keypress":
1775    case "keyup":
1776    case "mousedown":
1777    case "mouseup":
1778    case "paste":
1779    case "pause":
1780    case "play":
1781    case "pointercancel":
1782    case "pointerdown":
1783    case "pointerup":
1784    case "ratechange":
1785    case "reset":
1786    case "resize":
1787    case "seeked":
1788    case "submit":
1789    case "touchcancel":
1790    case "touchend":
1791    case "touchstart":
1792    case "volumechange":
1793    case "change":
1794    case "selectionchange":
1795    case "textInput":
1796    case "compositionstart":
1797    case "compositionend":
1798    case "compositionupdate":
1799    case "beforeblur":
1800    case "afterblur":
1801    case "beforeinput":
1802    case "blur":
1803    case "fullscreenchange":
1804    case "focus":
1805    case "hashchange":
1806    case "popstate":
1807    case "select":
1808    case "selectstart":
1809      return 1;
1810    case "drag":
1811    case "dragenter":
1812    case "dragexit":
1813    case "dragleave":
1814    case "dragover":
1815    case "mousemove":
1816    case "mouseout":
1817    case "mouseover":
1818    case "pointermove":
1819    case "pointerout":
1820    case "pointerover":
1821    case "scroll":
1822    case "toggle":
1823    case "touchmove":
1824    case "wheel":
1825    case "mouseenter":
1826    case "mouseleave":
1827    case "pointerenter":
1828    case "pointerleave":
1829      return 4;
1830    case "message":
1831      switch (ec()) {
1832        case fc:
1833          return 1;
1834        case gc:
1835          return 4;
1836        case hc:
1837        case ic:
1838          return 16;
1839        case jc:
1840          return 536870912;
1841        default:
1842          return 16;
1843      }
1844    default:
1845      return 16;
1846  }
1847}
1848var kd = null, ld = null, md = null;
1849function nd() {
1850  if (md) return md;
1851  var a, b = ld, c = b.length, d, e = "value" in kd ? kd.value : kd.textContent, f2 = e.length;
1852  for (a = 0; a < c && b[a] === e[a]; a++) ;
1853  var g = c - a;
1854  for (d = 1; d <= g && b[c - d] === e[f2 - d]; d++) ;
1855  return md = e.slice(a, 1 < d ? 1 - d : void 0);
1856}
1857function od(a) {
1858  var b = a.keyCode;
1859  "charCode" in a ? (a = a.charCode, 0 === a && 13 === b && (a = 13)) : a = b;
1860  10 === a && (a = 13);
1861  return 32 <= a || 13 === a ? a : 0;
1862}
1863function pd() {
1864  return true;
1865}
1866function qd() {
1867  return false;
1868}
1869function rd(a) {
1870  function b(b2, d, e, f2, g) {
1871    this._reactName = b2;
1872    this._targetInst = e;
1873    this.type = d;
1874    this.nativeEvent = f2;
1875    this.target = g;
1876    this.currentTarget = null;
1877    for (var c in a) a.hasOwnProperty(c) && (b2 = a[c], this[c] = b2 ? b2(f2) : f2[c]);
1878    this.isDefaultPrevented = (null != f2.defaultPrevented ? f2.defaultPrevented : false === f2.returnValue) ? pd : qd;
1879    this.isPropagationStopped = qd;
1880    return this;
1881  }
1882  A(b.prototype, { preventDefault: function() {
1883    this.defaultPrevented = true;
1884    var a2 = this.nativeEvent;
1885    a2 && (a2.preventDefault ? a2.preventDefault() : "unknown" !== typeof a2.returnValue && (a2.returnValue = false), this.isDefaultPrevented = pd);
1886  }, stopPropagation: function() {
1887    var a2 = this.nativeEvent;
1888    a2 && (a2.stopPropagation ? a2.stopPropagation() : "unknown" !== typeof a2.cancelBubble && (a2.cancelBubble = true), this.isPropagationStopped = pd);
1889  }, persist: function() {
1890  }, isPersistent: pd });
1891  return b;
1892}
1893var sd = { eventPhase: 0, bubbles: 0, cancelable: 0, timeStamp: function(a) {
1894  return a.timeStamp || Date.now();
1895}, defaultPrevented: 0, isTrusted: 0 }, td = rd(sd), ud = A({}, sd, { view: 0, detail: 0 }), vd = rd(ud), wd, xd, yd, Ad = A({}, ud, { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0, ctrlKey: 0, shiftKey: 0, altKey: 0, metaKey: 0, getModifierState: zd, button: 0, buttons: 0, relatedTarget: function(a) {
1896  return void 0 === a.relatedTarget ? a.fromElement === a.srcElement ? a.toElement : a.fromElement : a.relatedTarget;
1897}, movementX: function(a) {
1898  if ("movementX" in a) return a.movementX;
1899  a !== yd && (yd && "mousemove" === a.type ? (wd = a.screenX - yd.screenX, xd = a.screenY - yd.screenY) : xd = wd = 0, yd = a);
1900  return wd;
1901}, movementY: function(a) {
1902  return "movementY" in a ? a.movementY : xd;
1903} }), Bd = rd(Ad), Cd = A({}, Ad, { dataTransfer: 0 }), Dd = rd(Cd), Ed = A({}, ud, { relatedTarget: 0 }), Fd = rd(Ed), Gd = A({}, sd, { animationName: 0, elapsedTime: 0, pseudoElement: 0 }), Hd = rd(Gd), Id = A({}, sd, { clipboardData: function(a) {
1904  return "clipboardData" in a ? a.clipboardData : window.clipboardData;
1905} }), Jd = rd(Id), Kd = A({}, sd, { data: 0 }), Ld = rd(Kd), Md = {
1906  Esc: "Escape",
1907  Spacebar: " ",
1908  Left: "ArrowLeft",
1909  Up: "ArrowUp",
1910  Right: "ArrowRight",
1911  Down: "ArrowDown",
1912  Del: "Delete",
1913  Win: "OS",
1914  Menu: "ContextMenu",
1915  Apps: "ContextMenu",
1916  Scroll: "ScrollLock",
1917  MozPrintableKey: "Unidentified"
1918}, Nd = {
1919  8: "Backspace",
1920  9: "Tab",
1921  12: "Clear",
1922  13: "Enter",
1923  16: "Shift",
1924  17: "Control",
1925  18: "Alt",
1926  19: "Pause",
1927  20: "CapsLock",
1928  27: "Escape",
1929  32: " ",
1930  33: "PageUp",
1931  34: "PageDown",
1932  35: "End",
1933  36: "Home",
1934  37: "ArrowLeft",
1935  38: "ArrowUp",
1936  39: "ArrowRight",
1937  40: "ArrowDown",
1938  45: "Insert",
1939  46: "Delete",
1940  112: "F1",
1941  113: "F2",
1942  114: "F3",
1943  115: "F4",
1944  116: "F5",
1945  117: "F6",
1946  118: "F7",
1947  119: "F8",
1948  120: "F9",
1949  121: "F10",
1950  122: "F11",
1951  123: "F12",
1952  144: "NumLock",
1953  145: "ScrollLock",
1954  224: "Meta"
1955}, Od = { Alt: "altKey", Control: "ctrlKey", Meta: "metaKey", Shift: "shiftKey" };
1956function Pd(a) {
1957  var b = this.nativeEvent;
1958  return b.getModifierState ? b.getModifierState(a) : (a = Od[a]) ? !!b[a] : false;
1959}
1960function zd() {
1961  return Pd;
1962}
1963var Qd = A({}, ud, { key: function(a) {
1964  if (a.key) {
1965    var b = Md[a.key] || a.key;
1966    if ("Unidentified" !== b) return b;
1967  }
1968  return "keypress" === a.type ? (a = od(a), 13 === a ? "Enter" : String.fromCharCode(a)) : "keydown" === a.type || "keyup" === a.type ? Nd[a.keyCode] || "Unidentified" : "";
1969}, code: 0, location: 0, ctrlKey: 0, shiftKey: 0, altKey: 0, metaKey: 0, repeat: 0, locale: 0, getModifierState: zd, charCode: function(a) {
1970  return "keypress" === a.type ? od(a) : 0;
1971}, keyCode: function(a) {
1972  return "keydown" === a.type || "keyup" === a.type ? a.keyCode : 0;
1973}, which: function(a) {
1974  return "keypress" === a.type ? od(a) : "keydown" === a.type || "keyup" === a.type ? a.keyCode : 0;
1975} }), Rd = rd(Qd), Sd = A({}, Ad, { pointerId: 0, width: 0, height: 0, pressure: 0, tangentialPressure: 0, tiltX: 0, tiltY: 0, twist: 0, pointerType: 0, isPrimary: 0 }), Td = rd(Sd), Ud = A({}, ud, { touches: 0, targetTouches: 0, changedTouches: 0, altKey: 0, metaKey: 0, ctrlKey: 0, shiftKey: 0, getModifierState: zd }), Vd = rd(Ud), Wd = A({}, sd, { propertyName: 0, elapsedTime: 0, pseudoElement: 0 }), Xd = rd(Wd), Yd = A({}, Ad, {
1976  deltaX: function(a) {
1977    return "deltaX" in a ? a.deltaX : "wheelDeltaX" in a ? -a.wheelDeltaX : 0;
1978  },
1979  deltaY: function(a) {
1980    return "deltaY" in a ? a.deltaY : "wheelDeltaY" in a ? -a.wheelDeltaY : "wheelDelta" in a ? -a.wheelDelta : 0;
1981  },
1982  deltaZ: 0,
1983  deltaMode: 0
1984}), Zd = rd(Yd), $d = [9, 13, 27, 32], ae = ia && "CompositionEvent" in window, be = null;
1985ia && "documentMode" in document && (be = document.documentMode);
1986var ce = ia && "TextEvent" in window && !be, de = ia && (!ae || be && 8 < be && 11 >= be), ee = String.fromCharCode(32), fe = false;
1987function ge(a, b) {
1988  switch (a) {
1989    case "keyup":
1990      return -1 !== $d.indexOf(b.keyCode);
1991    case "keydown":
1992      return 229 !== b.keyCode;
1993    case "keypress":
1994    case "mousedown":
1995    case "focusout":
1996      return true;
1997    default:
1998      return false;
1999  }
2000}
2001function he(a) {
2002  a = a.detail;
2003  return "object" === typeof a && "data" in a ? a.data : null;
2004}
2005var ie = false;
2006function je(a, b) {
2007  switch (a) {
2008    case "compositionend":
2009      return he(b);
2010    case "keypress":
2011      if (32 !== b.which) return null;
2012      fe = true;
2013      return ee;
2014    case "textInput":
2015      return a = b.data, a === ee && fe ? null : a;
2016    default:
2017      return null;
2018  }
2019}
2020function ke(a, b) {
2021  if (ie) return "compositionend" === a || !ae && ge(a, b) ? (a = nd(), md = ld = kd = null, ie = false, a) : null;
2022  switch (a) {
2023    case "paste":
2024      return null;
2025    case "keypress":
2026      if (!(b.ctrlKey || b.altKey || b.metaKey) || b.ctrlKey && b.altKey) {
2027        if (b.char && 1 < b.char.length) return b.char;
2028        if (b.which) return String.fromCharCode(b.which);
2029      }
2030      return null;
2031    case "compositionend":
2032      return de && "ko" !== b.locale ? null : b.data;
2033    default:
2034      return null;
2035  }
2036}
2037var le = { color: true, date: true, datetime: true, "datetime-local": true, email: true, month: true, number: true, password: true, range: true, search: true, tel: true, text: true, time: true, url: true, week: true };
2038function me(a) {
2039  var b = a && a.nodeName && a.nodeName.toLowerCase();
2040  return "input" === b ? !!le[a.type] : "textarea" === b ? true : false;
2041}
2042function ne(a, b, c, d) {
2043  Eb(d);
2044  b = oe(b, "onChange");
2045  0 < b.length && (c = new td("onChange", "change", null, c, d), a.push({ event: c, listeners: b }));
2046}
2047var pe = null, qe = null;
2048function re(a) {
2049  se(a, 0);
2050}
2051function te(a) {
2052  var b = ue(a);
2053  if (Wa(b)) return a;
2054}
2055function ve(a, b) {
2056  if ("change" === a) return b;
2057}
2058var we = false;
2059if (ia) {
2060  var xe;
2061  if (ia) {
2062    var ye = "oninput" in document;
2063    if (!ye) {
2064      var ze = document.createElement("div");
2065      ze.setAttribute("oninput", "return;");
2066      ye = "function" === typeof ze.oninput;
2067    }
2068    xe = ye;
2069  } else xe = false;
2070  we = xe && (!document.documentMode || 9 < document.documentMode);
2071}
2072function Ae() {
2073  pe && (pe.detachEvent("onpropertychange", Be), qe = pe = null);
2074}
2075function Be(a) {
2076  if ("value" === a.propertyName && te(qe)) {
2077    var b = [];
2078    ne(b, qe, a, xb(a));
2079    Jb(re, b);
2080  }
2081}
2082function Ce(a, b, c) {
2083  "focusin" === a ? (Ae(), pe = b, qe = c, pe.attachEvent("onpropertychange", Be)) : "focusout" === a && Ae();
2084}
2085function De(a) {
2086  if ("selectionchange" === a || "keyup" === a || "keydown" === a) return te(qe);
2087}
2088function Ee(a, b) {
2089  if ("click" === a) return te(b);
2090}
2091function Fe(a, b) {
2092  if ("input" === a || "change" === a) return te(b);
2093}
2094function Ge(a, b) {
2095  return a === b && (0 !== a || 1 / a === 1 / b) || a !== a && b !== b;
2096}
2097var He = "function" === typeof Object.is ? Object.is : Ge;
2098function Ie(a, b) {
2099  if (He(a, b)) return true;
2100  if ("object" !== typeof a || null === a || "object" !== typeof b || null === b) return false;
2101  var c = Object.keys(a), d = Object.keys(b);
2102  if (c.length !== d.length) return false;
2103  for (d = 0; d < c.length; d++) {
2104    var e = c[d];
2105    if (!ja.call(b, e) || !He(a[e], b[e])) return false;
2106  }
2107  return true;
2108}
2109function Je(a) {
2110  for (; a && a.firstChild; ) a = a.firstChild;
2111  return a;
2112}
2113function Ke(a, b) {
2114  var c = Je(a);
2115  a = 0;
2116  for (var d; c; ) {
2117    if (3 === c.nodeType) {
2118      d = a + c.textContent.length;
2119      if (a <= b && d >= b) return { node: c, offset: b - a };
2120      a = d;
2121    }
2122    a: {
2123      for (; c; ) {
2124        if (c.nextSibling) {
2125          c = c.nextSibling;
2126          break a;
2127        }
2128        c = c.parentNode;
2129      }
2130      c = void 0;
2131    }
2132    c = Je(c);
2133  }
2134}
2135function Le(a, b) {
2136  return a && b ? a === b ? true : a && 3 === a.nodeType ? false : b && 3 === b.nodeType ? Le(a, b.parentNode) : "contains" in a ? a.contains(b) : a.compareDocumentPosition ? !!(a.compareDocumentPosition(b) & 16) : false : false;
2137}
2138function Me() {
2139  for (var a = window, b = Xa(); b instanceof a.HTMLIFrameElement; ) {
2140    try {
2141      var c = "string" === typeof b.contentWindow.location.href;
2142    } catch (d) {
2143      c = false;
2144    }
2145    if (c) a = b.contentWindow;
2146    else break;
2147    b = Xa(a.document);
2148  }
2149  return b;
2150}
2151function Ne(a) {
2152  var b = a && a.nodeName && a.nodeName.toLowerCase();
2153  return b && ("input" === b && ("text" === a.type || "search" === a.type || "tel" === a.type || "url" === a.type || "password" === a.type) || "textarea" === b || "true" === a.contentEditable);
2154}
2155function Oe(a) {
2156  var b = Me(), c = a.focusedElem, d = a.selectionRange;
2157  if (b !== c && c && c.ownerDocument && Le(c.ownerDocument.documentElement, c)) {
2158    if (null !== d && Ne(c)) {
2159      if (b = d.start, a = d.end, void 0 === a && (a = b), "selectionStart" in c) c.selectionStart = b, c.selectionEnd = Math.min(a, c.value.length);
2160      else if (a = (b = c.ownerDocument || document) && b.defaultView || window, a.getSelection) {
2161        a = a.getSelection();
2162        var e = c.textContent.length, f2 = Math.min(d.start, e);
2163        d = void 0 === d.end ? f2 : Math.min(d.end, e);
2164        !a.extend && f2 > d && (e = d, d = f2, f2 = e);
2165        e = Ke(c, f2);
2166        var g = Ke(
2167          c,
2168          d
2169        );
2170        e && g && (1 !== a.rangeCount || a.anchorNode !== e.node || a.anchorOffset !== e.offset || a.focusNode !== g.node || a.focusOffset !== g.offset) && (b = b.createRange(), b.setStart(e.node, e.offset), a.removeAllRanges(), f2 > d ? (a.addRange(b), a.extend(g.node, g.offset)) : (b.setEnd(g.node, g.offset), a.addRange(b)));
2171      }
2172    }
2173    b = [];
2174    for (a = c; a = a.parentNode; ) 1 === a.nodeType && b.push({ element: a, left: a.scrollLeft, top: a.scrollTop });
2175    "function" === typeof c.focus && c.focus();
2176    for (c = 0; c < b.length; c++) a = b[c], a.element.scrollLeft = a.left, a.element.scrollTop = a.top;
2177  }
2178}
2179var Pe = ia && "documentMode" in document && 11 >= document.documentMode, Qe = null, Re = null, Se = null, Te = false;
2180function Ue(a, b, c) {
2181  var d = c.window === c ? c.document : 9 === c.nodeType ? c : c.ownerDocument;
2182  Te || null == Qe || Qe !== Xa(d) || (d = Qe, "selectionStart" in d && Ne(d) ? d = { start: d.selectionStart, end: d.selectionEnd } : (d = (d.ownerDocument && d.ownerDocument.defaultView || window).getSelection(), d = { anchorNode: d.anchorNode, anchorOffset: d.anchorOffset, focusNode: d.focusNode, focusOffset: d.focusOffset }), Se && Ie(Se, d) || (Se = d, d = oe(Re, "onSelect"), 0 < d.length && (b = new td("onSelect", "select", null, b, c), a.push({ event: b, listeners: d }), b.target = Qe)));
2183}
2184function Ve(a, b) {
2185  var c = {};
2186  c[a.toLowerCase()] = b.toLowerCase();
2187  c["Webkit" + a] = "webkit" + b;
2188  c["Moz" + a] = "moz" + b;
2189  return c;
2190}
2191var We = { animationend: Ve("Animation", "AnimationEnd"), animationiteration: Ve("Animation", "AnimationIteration"), animationstart: Ve("Animation", "AnimationStart"), transitionend: Ve("Transition", "TransitionEnd") }, Xe = {}, Ye = {};
2192ia && (Ye = document.createElement("div").style, "AnimationEvent" in window || (delete We.animationend.animation, delete We.animationiteration.animation, delete We.animationstart.animation), "TransitionEvent" in window || delete We.transitionend.transition);
2193function Ze(a) {
2194  if (Xe[a]) return Xe[a];
2195  if (!We[a]) return a;
2196  var b = We[a], c;
2197  for (c in b) if (b.hasOwnProperty(c) && c in Ye) return Xe[a] = b[c];
2198  return a;
2199}
2200var $e = Ze("animationend"), af = Ze("animationiteration"), bf = Ze("animationstart"), cf = Ze("transitionend"), df = /* @__PURE__ */ new Map(), ef = "abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");
2201function ff(a, b) {
2202  df.set(a, b);
2203  fa(b, [a]);
2204}
2205for (var gf = 0; gf < ef.length; gf++) {
2206  var hf = ef[gf], jf = hf.toLowerCase(), kf = hf[0].toUpperCase() + hf.slice(1);
2207  ff(jf, "on" + kf);
2208}
2209ff($e, "onAnimationEnd");
2210ff(af, "onAnimationIteration");
2211ff(bf, "onAnimationStart");
2212ff("dblclick", "onDoubleClick");
2213ff("focusin", "onFocus");
2214ff("focusout", "onBlur");
2215ff(cf, "onTransitionEnd");
2216ha("onMouseEnter", ["mouseout", "mouseover"]);
2217ha("onMouseLeave", ["mouseout", "mouseover"]);
2218ha("onPointerEnter", ["pointerout", "pointerover"]);
2219ha("onPointerLeave", ["pointerout", "pointerover"]);
2220fa("onChange", "change click focusin focusout input keydown keyup selectionchange".split(" "));
2221fa("onSelect", "focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));
2222fa("onBeforeInput", ["compositionend", "keypress", "textInput", "paste"]);
2223fa("onCompositionEnd", "compositionend focusout keydown keypress keyup mousedown".split(" "));
2224fa("onCompositionStart", "compositionstart focusout keydown keypress keyup mousedown".split(" "));
2225fa("onCompositionUpdate", "compositionupdate focusout keydown keypress keyup mousedown".split(" "));
2226var lf = "abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "), mf = new Set("cancel close invalid load scroll toggle".split(" ").concat(lf));
2227function nf(a, b, c) {
2228  var d = a.type || "unknown-event";
2229  a.currentTarget = c;
2230  Ub(d, b, void 0, a);
2231  a.currentTarget = null;
2232}
2233function se(a, b) {
2234  b = 0 !== (b & 4);
2235  for (var c = 0; c < a.length; c++) {
2236    var d = a[c], e = d.event;
2237    d = d.listeners;
2238    a: {
2239      var f2 = void 0;
2240      if (b) for (var g = d.length - 1; 0 <= g; g--) {
2241        var h = d[g], k2 = h.instance, l2 = h.currentTarget;
2242        h = h.listener;
2243        if (k2 !== f2 && e.isPropagationStopped()) break a;
2244        nf(e, h, l2);
2245        f2 = k2;
2246      }
2247      else for (g = 0; g < d.length; g++) {
2248        h = d[g];
2249        k2 = h.instance;
2250        l2 = h.currentTarget;
2251        h = h.listener;
2252        if (k2 !== f2 && e.isPropagationStopped()) break a;
2253        nf(e, h, l2);
2254        f2 = k2;
2255      }
2256    }
2257  }
2258  if (Qb) throw a = Rb, Qb = false, Rb = null, a;
2259}
2260function D(a, b) {
2261  var c = b[of];
2262  void 0 === c && (c = b[of] = /* @__PURE__ */ new Set());
2263  var d = a + "__bubble";
2264  c.has(d) || (pf(b, a, 2, false), c.add(d));
2265}
2266function qf(a, b, c) {
2267  var d = 0;
2268  b && (d |= 4);
2269  pf(c, a, d, b);
2270}
2271var rf = "_reactListening" + Math.random().toString(36).slice(2);
2272function sf(a) {
2273  if (!a[rf]) {
2274    a[rf] = true;
2275    da.forEach(function(b2) {
2276      "selectionchange" !== b2 && (mf.has(b2) || qf(b2, false, a), qf(b2, true, a));
2277    });
2278    var b = 9 === a.nodeType ? a : a.ownerDocument;
2279    null === b || b[rf] || (b[rf] = true, qf("selectionchange", false, b));
2280  }
2281}
2282function pf(a, b, c, d) {
2283  switch (jd(b)) {
2284    case 1:
2285      var e = ed;
2286      break;
2287    case 4:
2288      e = gd;
2289      break;
2290    default:
2291      e = fd;
2292  }
2293  c = e.bind(null, b, c, a);
2294  e = void 0;
2295  !Lb || "touchstart" !== b && "touchmove" !== b && "wheel" !== b || (e = true);
2296  d ? void 0 !== e ? a.addEventListener(b, c, { capture: true, passive: e }) : a.addEventListener(b, c, true) : void 0 !== e ? a.addEventListener(b, c, { passive: e }) : a.addEventListener(b, c, false);
2297}
2298function hd(a, b, c, d, e) {
2299  var f2 = d;
2300  if (0 === (b & 1) && 0 === (b & 2) && null !== d) a: for (; ; ) {
2301    if (null === d) return;
2302    var g = d.tag;
2303    if (3 === g || 4 === g) {
2304      var h = d.stateNode.containerInfo;
2305      if (h === e || 8 === h.nodeType && h.parentNode === e) break;
2306      if (4 === g) for (g = d.return; null !== g; ) {
2307        var k2 = g.tag;
2308        if (3 === k2 || 4 === k2) {
2309          if (k2 = g.stateNode.containerInfo, k2 === e || 8 === k2.nodeType && k2.parentNode === e) return;
2310        }
2311        g = g.return;
2312      }
2313      for (; null !== h; ) {
2314        g = Wc(h);
2315        if (null === g) return;
2316        k2 = g.tag;
2317        if (5 === k2 || 6 === k2) {
2318          d = f2 = g;
2319          continue a;
2320        }
2321        h = h.parentNode;
2322      }
2323    }
2324    d = d.return;
2325  }
2326  Jb(function() {
2327    var d2 = f2, e2 = xb(c), g2 = [];
2328    a: {
2329      var h2 = df.get(a);
2330      if (void 0 !== h2) {
2331        var k3 = td, n2 = a;
2332        switch (a) {
2333          case "keypress":
2334            if (0 === od(c)) break a;
2335          case "keydown":
2336          case "keyup":
2337            k3 = Rd;
2338            break;
2339          case "focusin":
2340            n2 = "focus";
2341            k3 = Fd;
2342            break;
2343          case "focusout":
2344            n2 = "blur";
2345            k3 = Fd;
2346            break;
2347          case "beforeblur":
2348          case "afterblur":
2349            k3 = Fd;
2350            break;
2351          case "click":
2352            if (2 === c.button) break a;
2353          case "auxclick":
2354          case "dblclick":
2355          case "mousedown":
2356          case "mousemove":
2357          case "mouseup":
2358          case "mouseout":
2359          case "mouseover":
2360          case "contextmenu":
2361            k3 = Bd;
2362            break;
2363          case "drag":
2364          case "dragend":
2365          case "dragenter":
2366          case "dragexit":
2367          case "dragleave":
2368          case "dragover":
2369          case "dragstart":
2370          case "drop":
2371            k3 = Dd;
2372            break;
2373          case "touchcancel":
2374          case "touchend":
2375          case "touchmove":
2376          case "touchstart":
2377            k3 = Vd;
2378            break;
2379          case $e:
2380          case af:
2381          case bf:
2382            k3 = Hd;
2383            break;
2384          case cf:
2385            k3 = Xd;
2386            break;
2387          case "scroll":
2388            k3 = vd;
2389            break;
2390          case "wheel":
2391            k3 = Zd;
2392            break;
2393          case "copy":
2394          case "cut":
2395          case "paste":
2396            k3 = Jd;
2397            break;
2398          case "gotpointercapture":
2399          case "lostpointercapture":
2400          case "pointercancel":
2401          case "pointerdown":
2402          case "pointermove":
2403          case "pointerout":
2404          case "pointerover":
2405          case "pointerup":
2406            k3 = Td;
2407        }
2408        var t2 = 0 !== (b & 4), J2 = !t2 && "scroll" === a, x2 = t2 ? null !== h2 ? h2 + "Capture" : null : h2;
2409        t2 = [];
2410        for (var w2 = d2, u2; null !== w2; ) {
2411          u2 = w2;
2412          var F2 = u2.stateNode;
2413          5 === u2.tag && null !== F2 && (u2 = F2, null !== x2 && (F2 = Kb(w2, x2), null != F2 && t2.push(tf(w2, F2, u2))));
2414          if (J2) break;
2415          w2 = w2.return;
2416        }
2417        0 < t2.length && (h2 = new k3(h2, n2, null, c, e2), g2.push({ event: h2, listeners: t2 }));
2418      }
2419    }
2420    if (0 === (b & 7)) {
2421      a: {
2422        h2 = "mouseover" === a || "pointerover" === a;
2423        k3 = "mouseout" === a || "pointerout" === a;
2424        if (h2 && c !== wb && (n2 = c.relatedTarget || c.fromElement) && (Wc(n2) || n2[uf])) break a;
2425        if (k3 || h2) {
2426          h2 = e2.window === e2 ? e2 : (h2 = e2.ownerDocument) ? h2.defaultView || h2.parentWindow : window;
2427          if (k3) {
2428            if (n2 = c.relatedTarget || c.toElement, k3 = d2, n2 = n2 ? Wc(n2) : null, null !== n2 && (J2 = Vb(n2), n2 !== J2 || 5 !== n2.tag && 6 !== n2.tag)) n2 = null;
2429          } else k3 = null, n2 = d2;
2430          if (k3 !== n2) {
2431            t2 = Bd;
2432            F2 = "onMouseLeave";
2433            x2 = "onMouseEnter";
2434            w2 = "mouse";
2435            if ("pointerout" === a || "pointerover" === a) t2 = Td, F2 = "onPointerLeave", x2 = "onPointerEnter", w2 = "pointer";
2436            J2 = null == k3 ? h2 : ue(k3);
2437            u2 = null == n2 ? h2 : ue(n2);
2438            h2 = new t2(F2, w2 + "leave", k3, c, e2);
2439            h2.target = J2;
2440            h2.relatedTarget = u2;
2441            F2 = null;
2442            Wc(e2) === d2 && (t2 = new t2(x2, w2 + "enter", n2, c, e2), t2.target = u2, t2.relatedTarget = J2, F2 = t2);
2443            J2 = F2;
2444            if (k3 && n2) b: {
2445              t2 = k3;
2446              x2 = n2;
2447              w2 = 0;
2448              for (u2 = t2; u2; u2 = vf(u2)) w2++;
2449              u2 = 0;
2450              for (F2 = x2; F2; F2 = vf(F2)) u2++;
2451              for (; 0 < w2 - u2; ) t2 = vf(t2), w2--;
2452              for (; 0 < u2 - w2; ) x2 = vf(x2), u2--;
2453              for (; w2--; ) {
2454                if (t2 === x2 || null !== x2 && t2 === x2.alternate) break b;
2455                t2 = vf(t2);
2456                x2 = vf(x2);
2457              }
2458              t2 = null;
2459            }
2460            else t2 = null;
2461            null !== k3 && wf(g2, h2, k3, t2, false);
2462            null !== n2 && null !== J2 && wf(g2, J2, n2, t2, true);
2463          }
2464        }
2465      }
2466      a: {
2467        h2 = d2 ? ue(d2) : window;
2468        k3 = h2.nodeName && h2.nodeName.toLowerCase();
2469        if ("select" === k3 || "input" === k3 && "file" === h2.type) var na = ve;
2470        else if (me(h2)) if (we) na = Fe;
2471        else {
2472          na = De;
2473          var xa = Ce;
2474        }
2475        else (k3 = h2.nodeName) && "input" === k3.toLowerCase() && ("checkbox" === h2.type || "radio" === h2.type) && (na = Ee);
2476        if (na && (na = na(a, d2))) {
2477          ne(g2, na, c, e2);
2478          break a;
2479        }
2480        xa && xa(a, h2, d2);
2481        "focusout" === a && (xa = h2._wrapperState) && xa.controlled && "number" === h2.type && cb(h2, "number", h2.value);
2482      }
2483      xa = d2 ? ue(d2) : window;
2484      switch (a) {
2485        case "focusin":
2486          if (me(xa) || "true" === xa.contentEditable) Qe = xa, Re = d2, Se = null;
2487          break;
2488        case "focusout":
2489          Se = Re = Qe = null;
2490          break;
2491        case "mousedown":
2492          Te = true;
2493          break;
2494        case "contextmenu":
2495        case "mouseup":
2496        case "dragend":
2497          Te = false;
2498          Ue(g2, c, e2);
2499          break;
2500        case "selectionchange":
2501          if (Pe) break;
2502        case "keydown":
2503        case "keyup":
2504          Ue(g2, c, e2);
2505      }
2506      var $a;
2507      if (ae) b: {
2508        switch (a) {
2509          case "compositionstart":
2510            var ba = "onCompositionStart";
2511            break b;
2512          case "compositionend":
2513            ba = "onCompositionEnd";
2514            break b;
2515          case "compositionupdate":
2516            ba = "onCompositionUpdate";
2517            break b;
2518        }
2519        ba = void 0;
2520      }
2521      else ie ? ge(a, c) && (ba = "onCompositionEnd") : "keydown" === a && 229 === c.keyCode && (ba = "onCompositionStart");
2522      ba && (de && "ko" !== c.locale && (ie || "onCompositionStart" !== ba ? "onCompositionEnd" === ba && ie && ($a = nd()) : (kd = e2, ld = "value" in kd ? kd.value : kd.textContent, ie = true)), xa = oe(d2, ba), 0 < xa.length && (ba = new Ld(ba, a, null, c, e2), g2.push({ event: ba, listeners: xa }), $a ? ba.data = $a : ($a = he(c), null !== $a && (ba.data = $a))));
2523      if ($a = ce ? je(a, c) : ke(a, c)) d2 = oe(d2, "onBeforeInput"), 0 < d2.length && (e2 = new Ld("onBeforeInput", "beforeinput", null, c, e2), g2.push({ event: e2, listeners: d2 }), e2.data = $a);
2524    }
2525    se(g2, b);
2526  });
2527}
2528function tf(a, b, c) {
2529  return { instance: a, listener: b, currentTarget: c };
2530}
2531function oe(a, b) {
2532  for (var c = b + "Capture", d = []; null !== a; ) {
2533    var e = a, f2 = e.stateNode;
2534    5 === e.tag && null !== f2 && (e = f2, f2 = Kb(a, c), null != f2 && d.unshift(tf(a, f2, e)), f2 = Kb(a, b), null != f2 && d.push(tf(a, f2, e)));
2535    a = a.return;
2536  }
2537  return d;
2538}
2539function vf(a) {
2540  if (null === a) return null;
2541  do
2542    a = a.return;
2543  while (a && 5 !== a.tag);
2544  return a ? a : null;
2545}
2546function wf(a, b, c, d, e) {
2547  for (var f2 = b._reactName, g = []; null !== c && c !== d; ) {
2548    var h = c, k2 = h.alternate, l2 = h.stateNode;
2549    if (null !== k2 && k2 === d) break;
2550    5 === h.tag && null !== l2 && (h = l2, e ? (k2 = Kb(c, f2), null != k2 && g.unshift(tf(c, k2, h))) : e || (k2 = Kb(c, f2), null != k2 && g.push(tf(c, k2, h))));
2551    c = c.return;
2552  }
2553  0 !== g.length && a.push({ event: b, listeners: g });
2554}
2555var xf = /\r\n?/g, yf = /\u0000|\uFFFD/g;
2556function zf(a) {
2557  return ("string" === typeof a ? a : "" + a).replace(xf, "\n").replace(yf, "");
2558}
2559function Af(a, b, c) {
2560  b = zf(b);
2561  if (zf(a) !== b && c) throw Error(p(425));
2562}
2563function Bf() {
2564}
2565var Cf = null, Df = null;
2566function Ef(a, b) {
2567  return "textarea" === a || "noscript" === a || "string" === typeof b.children || "number" === typeof b.children || "object" === typeof b.dangerouslySetInnerHTML && null !== b.dangerouslySetInnerHTML && null != b.dangerouslySetInnerHTML.__html;
2568}
2569var Ff = "function" === typeof setTimeout ? setTimeout : void 0, Gf = "function" === typeof clearTimeout ? clearTimeout : void 0, Hf = "function" === typeof Promise ? Promise : void 0, Jf = "function" === typeof queueMicrotask ? queueMicrotask : "undefined" !== typeof Hf ? function(a) {
2570  return Hf.resolve(null).then(a).catch(If);
2571} : Ff;
2572function If(a) {
2573  setTimeout(function() {
2574    throw a;
2575  });
2576}
2577function Kf(a, b) {
2578  var c = b, d = 0;
2579  do {
2580    var e = c.nextSibling;
2581    a.removeChild(c);
2582    if (e && 8 === e.nodeType) if (c = e.data, "/$" === c) {
2583      if (0 === d) {
2584        a.removeChild(e);
2585        bd(b);
2586        return;
2587      }
2588      d--;
2589    } else "$" !== c && "$?" !== c && "$!" !== c || d++;
2590    c = e;
2591  } while (c);
2592  bd(b);
2593}
2594function Lf(a) {
2595  for (; null != a; a = a.nextSibling) {
2596    var b = a.nodeType;
2597    if (1 === b || 3 === b) break;
2598    if (8 === b) {
2599      b = a.data;
2600      if ("$" === b || "$!" === b || "$?" === b) break;
2601      if ("/$" === b) return null;
2602    }
2603  }
2604  return a;
2605}
2606function Mf(a) {
2607  a = a.previousSibling;
2608  for (var b = 0; a; ) {
2609    if (8 === a.nodeType) {
2610      var c = a.data;
2611      if ("$" === c || "$!" === c || "$?" === c) {
2612        if (0 === b) return a;
2613        b--;
2614      } else "/$" === c && b++;
2615    }
2616    a = a.previousSibling;
2617  }
2618  return null;
2619}
2620var Nf = Math.random().toString(36).slice(2), Of = "__reactFiber$" + Nf, Pf = "__reactProps$" + Nf, uf = "__reactContainer$" + Nf, of = "__reactEvents$" + Nf, Qf = "__reactListeners$" + Nf, Rf = "__reactHandles$" + Nf;
2621function Wc(a) {
2622  var b = a[Of];
2623  if (b) return b;
2624  for (var c = a.parentNode; c; ) {
2625    if (b = c[uf] || c[Of]) {
2626      c = b.alternate;
2627      if (null !== b.child || null !== c && null !== c.child) for (a = Mf(a); null !== a; ) {
2628        if (c = a[Of]) return c;
2629        a = Mf(a);
2630      }
2631      return b;
2632    }
2633    a = c;
2634    c = a.parentNode;
2635  }
2636  return null;
2637}
2638function Cb(a) {
2639  a = a[Of] || a[uf];
2640  return !a || 5 !== a.tag && 6 !== a.tag && 13 !== a.tag && 3 !== a.tag ? null : a;
2641}
2642function ue(a) {
2643  if (5 === a.tag || 6 === a.tag) return a.stateNode;
2644  throw Error(p(33));
2645}
2646function Db(a) {
2647  return a[Pf] || null;
2648}
2649var Sf = [], Tf = -1;
2650function Uf(a) {
2651  return { current: a };
2652}
2653function E(a) {
2654  0 > Tf || (a.current = Sf[Tf], Sf[Tf] = null, Tf--);
2655}
2656function G(a, b) {
2657  Tf++;
2658  Sf[Tf] = a.current;
2659  a.current = b;
2660}
2661var Vf = {}, H = Uf(Vf), Wf = Uf(false), Xf = Vf;
2662function Yf(a, b) {
2663  var c = a.type.contextTypes;
2664  if (!c) return Vf;
2665  var d = a.stateNode;
2666  if (d && d.__reactInternalMemoizedUnmaskedChildContext === b) return d.__reactInternalMemoizedMaskedChildContext;
2667  var e = {}, f2;
2668  for (f2 in c) e[f2] = b[f2];
2669  d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = b, a.__reactInternalMemoizedMaskedChildContext = e);
2670  return e;
2671}
2672function Zf(a) {
2673  a = a.childContextTypes;
2674  return null !== a && void 0 !== a;
2675}
2676function $f() {
2677  E(Wf);
2678  E(H);
2679}
2680function ag(a, b, c) {
2681  if (H.current !== Vf) throw Error(p(168));
2682  G(H, b);
2683  G(Wf, c);
2684}
2685function bg(a, b, c) {
2686  var d = a.stateNode;
2687  b = b.childContextTypes;
2688  if ("function" !== typeof d.getChildContext) return c;
2689  d = d.getChildContext();
2690  for (var e in d) if (!(e in b)) throw Error(p(108, Ra(a) || "Unknown", e));
2691  return A({}, c, d);
2692}
2693function cg(a) {
2694  a = (a = a.stateNode) && a.__reactInternalMemoizedMergedChildContext || Vf;
2695  Xf = H.current;
2696  G(H, a);
2697  G(Wf, Wf.current);
2698  return true;
2699}
2700function dg(a, b, c) {
2701  var d = a.stateNode;
2702  if (!d) throw Error(p(169));
2703  c ? (a = bg(a, b, Xf), d.__reactInternalMemoizedMergedChildContext = a, E(Wf), E(H), G(H, a)) : E(Wf);
2704  G(Wf, c);
2705}
2706var eg = null, fg = false, gg = false;
2707function hg(a) {
2708  null === eg ? eg = [a] : eg.push(a);
2709}
2710function ig(a) {
2711  fg = true;
2712  hg(a);
2713}
2714function jg() {
2715  if (!gg && null !== eg) {
2716    gg = true;
2717    var a = 0, b = C;
2718    try {
2719      var c = eg;
2720      for (C = 1; a < c.length; a++) {
2721        var d = c[a];
2722        do
2723          d = d(true);
2724        while (null !== d);
2725      }
2726      eg = null;
2727      fg = false;
2728    } catch (e) {
2729      throw null !== eg && (eg = eg.slice(a + 1)), ac(fc, jg), e;
2730    } finally {
2731      C = b, gg = false;
2732    }
2733  }
2734  return null;
2735}
2736var kg = [], lg = 0, mg = null, ng = 0, og = [], pg = 0, qg = null, rg = 1, sg = "";
2737function tg(a, b) {
2738  kg[lg++] = ng;
2739  kg[lg++] = mg;
2740  mg = a;
2741  ng = b;
2742}
2743function ug(a, b, c) {
2744  og[pg++] = rg;
2745  og[pg++] = sg;
2746  og[pg++] = qg;
2747  qg = a;
2748  var d = rg;
2749  a = sg;
2750  var e = 32 - oc(d) - 1;
2751  d &= ~(1 << e);
2752  c += 1;
2753  var f2 = 32 - oc(b) + e;
2754  if (30 < f2) {
2755    var g = e - e % 5;
2756    f2 = (d & (1 << g) - 1).toString(32);
2757    d >>= g;
2758    e -= g;
2759    rg = 1 << 32 - oc(b) + e | c << e | d;
2760    sg = f2 + a;
2761  } else rg = 1 << f2 | c << e | d, sg = a;
2762}
2763function vg(a) {
2764  null !== a.return && (tg(a, 1), ug(a, 1, 0));
2765}
2766function wg(a) {
2767  for (; a === mg; ) mg = kg[--lg], kg[lg] = null, ng = kg[--lg], kg[lg] = null;
2768  for (; a === qg; ) qg = og[--pg], og[pg] = null, sg = og[--pg], og[pg] = null, rg = og[--pg], og[pg] = null;
2769}
2770var xg = null, yg = null, I = false, zg = null;
2771function Ag(a, b) {
2772  var c = Bg(5, null, null, 0);
2773  c.elementType = "DELETED";
2774  c.stateNode = b;
2775  c.return = a;
2776  b = a.deletions;
2777  null === b ? (a.deletions = [c], a.flags |= 16) : b.push(c);
2778}
2779function Cg(a, b) {
2780  switch (a.tag) {
2781    case 5:
2782      var c = a.type;
2783      b = 1 !== b.nodeType || c.toLowerCase() !== b.nodeName.toLowerCase() ? null : b;
2784      return null !== b ? (a.stateNode = b, xg = a, yg = Lf(b.firstChild), true) : false;
2785    case 6:
2786      return b = "" === a.pendingProps || 3 !== b.nodeType ? null : b, null !== b ? (a.stateNode = b, xg = a, yg = null, true) : false;
2787    case 13:
2788      return b = 8 !== b.nodeType ? null : b, null !== b ? (c = null !== qg ? { id: rg, overflow: sg } : null, a.memoizedState = { dehydrated: b, treeContext: c, retryLane: 1073741824 }, c = Bg(18, null, null, 0), c.stateNode = b, c.return = a, a.child = c, xg = a, yg = null, true) : false;
2789    default:
2790      return false;
2791  }
2792}
2793function Dg(a) {
2794  return 0 !== (a.mode & 1) && 0 === (a.flags & 128);
2795}
2796function Eg(a) {
2797  if (I) {
2798    var b = yg;
2799    if (b) {
2800      var c = b;
2801      if (!Cg(a, b)) {
2802        if (Dg(a)) throw Error(p(418));
2803        b = Lf(c.nextSibling);
2804        var d = xg;
2805        b && Cg(a, b) ? Ag(d, c) : (a.flags = a.flags & -4097 | 2, I = false, xg = a);
2806      }
2807    } else {
2808      if (Dg(a)) throw Error(p(418));
2809      a.flags = a.flags & -4097 | 2;
2810      I = false;
2811      xg = a;
2812    }
2813  }
2814}
2815function Fg(a) {
2816  for (a = a.return; null !== a && 5 !== a.tag && 3 !== a.tag && 13 !== a.tag; ) a = a.return;
2817  xg = a;
2818}
2819function Gg(a) {
2820  if (a !== xg) return false;
2821  if (!I) return Fg(a), I = true, false;
2822  var b;
2823  (b = 3 !== a.tag) && !(b = 5 !== a.tag) && (b = a.type, b = "head" !== b && "body" !== b && !Ef(a.type, a.memoizedProps));
2824  if (b && (b = yg)) {
2825    if (Dg(a)) throw Hg(), Error(p(418));
2826    for (; b; ) Ag(a, b), b = Lf(b.nextSibling);
2827  }
2828  Fg(a);
2829  if (13 === a.tag) {
2830    a = a.memoizedState;
2831    a = null !== a ? a.dehydrated : null;
2832    if (!a) throw Error(p(317));
2833    a: {
2834      a = a.nextSibling;
2835      for (b = 0; a; ) {
2836        if (8 === a.nodeType) {
2837          var c = a.data;
2838          if ("/$" === c) {
2839            if (0 === b) {
2840              yg = Lf(a.nextSibling);
2841              break a;
2842            }
2843            b--;
2844          } else "$" !== c && "$!" !== c && "$?" !== c || b++;
2845        }
2846        a = a.nextSibling;
2847      }
2848      yg = null;
2849    }
2850  } else yg = xg ? Lf(a.stateNode.nextSibling) : null;
2851  return true;
2852}
2853function Hg() {
2854  for (var a = yg; a; ) a = Lf(a.nextSibling);
2855}
2856function Ig() {
2857  yg = xg = null;
2858  I = false;
2859}
2860function Jg(a) {
2861  null === zg ? zg = [a] : zg.push(a);
2862}
2863var Kg = ua.ReactCurrentBatchConfig;
2864function Lg(a, b, c) {
2865  a = c.ref;
2866  if (null !== a && "function" !== typeof a && "object" !== typeof a) {
2867    if (c._owner) {
2868      c = c._owner;
2869      if (c) {
2870        if (1 !== c.tag) throw Error(p(309));
2871        var d = c.stateNode;
2872      }
2873      if (!d) throw Error(p(147, a));
2874      var e = d, f2 = "" + a;
2875      if (null !== b && null !== b.ref && "function" === typeof b.ref && b.ref._stringRef === f2) return b.ref;
2876      b = function(a2) {
2877        var b2 = e.refs;
2878        null === a2 ? delete b2[f2] : b2[f2] = a2;
2879      };
2880      b._stringRef = f2;
2881      return b;
2882    }
2883    if ("string" !== typeof a) throw Error(p(284));
2884    if (!c._owner) throw Error(p(290, a));
2885  }
2886  return a;
2887}
2888function Mg(a, b) {
2889  a = Object.prototype.toString.call(b);
2890  throw Error(p(31, "[object Object]" === a ? "object with keys {" + Object.keys(b).join(", ") + "}" : a));
2891}
2892function Ng(a) {
2893  var b = a._init;
2894  return b(a._payload);
2895}
2896function Og(a) {
2897  function b(b2, c2) {
2898    if (a) {
2899      var d2 = b2.deletions;
2900      null === d2 ? (b2.deletions = [c2], b2.flags |= 16) : d2.push(c2);
2901    }
2902  }
2903  function c(c2, d2) {
2904    if (!a) return null;
2905    for (; null !== d2; ) b(c2, d2), d2 = d2.sibling;
2906    return null;
2907  }
2908  function d(a2, b2) {
2909    for (a2 = /* @__PURE__ */ new Map(); null !== b2; ) null !== b2.key ? a2.set(b2.key, b2) : a2.set(b2.index, b2), b2 = b2.sibling;
2910    return a2;
2911  }
2912  function e(a2, b2) {
2913    a2 = Pg(a2, b2);
2914    a2.index = 0;
2915    a2.sibling = null;
2916    return a2;
2917  }
2918  function f2(b2, c2, d2) {
2919    b2.index = d2;
2920    if (!a) return b2.flags |= 1048576, c2;
2921    d2 = b2.alternate;
2922    if (null !== d2) return d2 = d2.index, d2 < c2 ? (b2.flags |= 2, c2) : d2;
2923    b2.flags |= 2;
2924    return c2;
2925  }
2926  function g(b2) {
2927    a && null === b2.alternate && (b2.flags |= 2);
2928    return b2;
2929  }
2930  function h(a2, b2, c2, d2) {
2931    if (null === b2 || 6 !== b2.tag) return b2 = Qg(c2, a2.mode, d2), b2.return = a2, b2;
2932    b2 = e(b2, c2);
2933    b2.return = a2;
2934    return b2;
2935  }
2936  function k2(a2, b2, c2, d2) {
2937    var f3 = c2.type;
2938    if (f3 === ya) return m2(a2, b2, c2.props.children, d2, c2.key);
2939    if (null !== b2 && (b2.elementType === f3 || "object" === typeof f3 && null !== f3 && f3.$$typeof === Ha && Ng(f3) === b2.type)) return d2 = e(b2, c2.props), d2.ref = Lg(a2, b2, c2), d2.return = a2, d2;
2940    d2 = Rg(c2.type, c2.key, c2.props, null, a2.mode, d2);
2941    d2.ref = Lg(a2, b2, c2);
2942    d2.return = a2;
2943    return d2;
2944  }
2945  function l2(a2, b2, c2, d2) {
2946    if (null === b2 || 4 !== b2.tag || b2.stateNode.containerInfo !== c2.containerInfo || b2.stateNode.implementation !== c2.implementation) return b2 = Sg(c2, a2.mode, d2), b2.return = a2, b2;
2947    b2 = e(b2, c2.children || []);
2948    b2.return = a2;
2949    return b2;
2950  }
2951  function m2(a2, b2, c2, d2, f3) {
2952    if (null === b2 || 7 !== b2.tag) return b2 = Tg(c2, a2.mode, d2, f3), b2.return = a2, b2;
2953    b2 = e(b2, c2);
2954    b2.return = a2;
2955    return b2;
2956  }
2957  function q2(a2, b2, c2) {
2958    if ("string" === typeof b2 && "" !== b2 || "number" === typeof b2) return b2 = Qg("" + b2, a2.mode, c2), b2.return = a2, b2;
2959    if ("object" === typeof b2 && null !== b2) {
2960      switch (b2.$$typeof) {
2961        case va:
2962          return c2 = Rg(b2.type, b2.key, b2.props, null, a2.mode, c2), c2.ref = Lg(a2, null, b2), c2.return = a2, c2;
2963        case wa:
2964          return b2 = Sg(b2, a2.mode, c2), b2.return = a2, b2;
2965        case Ha:
2966          var d2 = b2._init;
2967          return q2(a2, d2(b2._payload), c2);
2968      }
2969      if (eb(b2) || Ka(b2)) return b2 = Tg(b2, a2.mode, c2, null), b2.return = a2, b2;
2970      Mg(a2, b2);
2971    }
2972    return null;
2973  }
2974  function r2(a2, b2, c2, d2) {
2975    var e2 = null !== b2 ? b2.key : null;
2976    if ("string" === typeof c2 && "" !== c2 || "number" === typeof c2) return null !== e2 ? null : h(a2, b2, "" + c2, d2);
2977    if ("object" === typeof c2 && null !== c2) {
2978      switch (c2.$$typeof) {
2979        case va:
2980          return c2.key === e2 ? k2(a2, b2, c2, d2) : null;
2981        case wa:
2982          return c2.key === e2 ? l2(a2, b2, c2, d2) : null;
2983        case Ha:
2984          return e2 = c2._init, r2(
2985            a2,
2986            b2,
2987            e2(c2._payload),
2988            d2
2989          );
2990      }
2991      if (eb(c2) || Ka(c2)) return null !== e2 ? null : m2(a2, b2, c2, d2, null);
2992      Mg(a2, c2);
2993    }
2994    return null;
2995  }
2996  function y2(a2, b2, c2, d2, e2) {
2997    if ("string" === typeof d2 && "" !== d2 || "number" === typeof d2) return a2 = a2.get(c2) || null, h(b2, a2, "" + d2, e2);
2998    if ("object" === typeof d2 && null !== d2) {
2999      switch (d2.$$typeof) {
3000        case va:
3001          return a2 = a2.get(null === d2.key ? c2 : d2.key) || null, k2(b2, a2, d2, e2);
3002        case wa:
3003          return a2 = a2.get(null === d2.key ? c2 : d2.key) || null, l2(b2, a2, d2, e2);
3004        case Ha:
3005          var f3 = d2._init;
3006          return y2(a2, b2, c2, f3(d2._payload), e2);
3007      }
3008      if (eb(d2) || Ka(d2)) return a2 = a2.get(c2) || null, m2(b2, a2, d2, e2, null);
3009      Mg(b2, d2);
3010    }
3011    return null;
3012  }
3013  function n2(e2, g2, h2, k3) {
3014    for (var l3 = null, m3 = null, u2 = g2, w2 = g2 = 0, x2 = null; null !== u2 && w2 < h2.length; w2++) {
3015      u2.index > w2 ? (x2 = u2, u2 = null) : x2 = u2.sibling;
3016      var n3 = r2(e2, u2, h2[w2], k3);
3017      if (null === n3) {
3018        null === u2 && (u2 = x2);
3019        break;
3020      }
3021      a && u2 && null === n3.alternate && b(e2, u2);
3022      g2 = f2(n3, g2, w2);
3023      null === m3 ? l3 = n3 : m3.sibling = n3;
3024      m3 = n3;
3025      u2 = x2;
3026    }
3027    if (w2 === h2.length) return c(e2, u2), I && tg(e2, w2), l3;
3028    if (null === u2) {
3029      for (; w2 < h2.length; w2++) u2 = q2(e2, h2[w2], k3), null !== u2 && (g2 = f2(u2, g2, w2), null === m3 ? l3 = u2 : m3.sibling = u2, m3 = u2);
3030      I && tg(e2, w2);
3031      return l3;
3032    }
3033    for (u2 = d(e2, u2); w2 < h2.length; w2++) x2 = y2(u2, e2, w2, h2[w2], k3), null !== x2 && (a && null !== x2.alternate && u2.delete(null === x2.key ? w2 : x2.key), g2 = f2(x2, g2, w2), null === m3 ? l3 = x2 : m3.sibling = x2, m3 = x2);
3034    a && u2.forEach(function(a2) {
3035      return b(e2, a2);
3036    });
3037    I && tg(e2, w2);
3038    return l3;
3039  }
3040  function t2(e2, g2, h2, k3) {
3041    var l3 = Ka(h2);
3042    if ("function" !== typeof l3) throw Error(p(150));
3043    h2 = l3.call(h2);
3044    if (null == h2) throw Error(p(151));
3045    for (var u2 = l3 = null, m3 = g2, w2 = g2 = 0, x2 = null, n3 = h2.next(); null !== m3 && !n3.done; w2++, n3 = h2.next()) {
3046      m3.index > w2 ? (x2 = m3, m3 = null) : x2 = m3.sibling;
3047      var t3 = r2(e2, m3, n3.value, k3);
3048      if (null === t3) {
3049        null === m3 && (m3 = x2);
3050        break;
3051      }
3052      a && m3 && null === t3.alternate && b(e2, m3);
3053      g2 = f2(t3, g2, w2);
3054      null === u2 ? l3 = t3 : u2.sibling = t3;
3055      u2 = t3;
3056      m3 = x2;
3057    }
3058    if (n3.done) return c(
3059      e2,
3060      m3
3061    ), I && tg(e2, w2), l3;
3062    if (null === m3) {
3063      for (; !n3.done; w2++, n3 = h2.next()) n3 = q2(e2, n3.value, k3), null !== n3 && (g2 = f2(n3, g2, w2), null === u2 ? l3 = n3 : u2.sibling = n3, u2 = n3);
3064      I && tg(e2, w2);
3065      return l3;
3066    }
3067    for (m3 = d(e2, m3); !n3.done; w2++, n3 = h2.next()) n3 = y2(m3, e2, w2, n3.value, k3), null !== n3 && (a && null !== n3.alternate && m3.delete(null === n3.key ? w2 : n3.key), g2 = f2(n3, g2, w2), null === u2 ? l3 = n3 : u2.sibling = n3, u2 = n3);
3068    a && m3.forEach(function(a2) {
3069      return b(e2, a2);
3070    });
3071    I && tg(e2, w2);
3072    return l3;
3073  }
3074  function J2(a2, d2, f3, h2) {
3075    "object" === typeof f3 && null !== f3 && f3.type === ya && null === f3.key && (f3 = f3.props.children);
3076    if ("object" === typeof f3 && null !== f3) {
3077      switch (f3.$$typeof) {
3078        case va:
3079          a: {
3080            for (var k3 = f3.key, l3 = d2; null !== l3; ) {
3081              if (l3.key === k3) {
3082                k3 = f3.type;
3083                if (k3 === ya) {
3084                  if (7 === l3.tag) {
3085                    c(a2, l3.sibling);
3086                    d2 = e(l3, f3.props.children);
3087                    d2.return = a2;
3088                    a2 = d2;
3089                    break a;
3090                  }
3091                } else if (l3.elementType === k3 || "object" === typeof k3 && null !== k3 && k3.$$typeof === Ha && Ng(k3) === l3.type) {
3092                  c(a2, l3.sibling);
3093                  d2 = e(l3, f3.props);
3094                  d2.ref = Lg(a2, l3, f3);
3095                  d2.return = a2;
3096                  a2 = d2;
3097                  break a;
3098                }
3099                c(a2, l3);
3100                break;
3101              } else b(a2, l3);
3102              l3 = l3.sibling;
3103            }
3104            f3.type === ya ? (d2 = Tg(f3.props.children, a2.mode, h2, f3.key), d2.return = a2, a2 = d2) : (h2 = Rg(f3.type, f3.key, f3.props, null, a2.mode, h2), h2.ref = Lg(a2, d2, f3), h2.return = a2, a2 = h2);
3105          }
3106          return g(a2);
3107        case wa:
3108          a: {
3109            for (l3 = f3.key; null !== d2; ) {
3110              if (d2.key === l3) if (4 === d2.tag && d2.stateNode.containerInfo === f3.containerInfo && d2.stateNode.implementation === f3.implementation) {
3111                c(a2, d2.sibling);
3112                d2 = e(d2, f3.children || []);
3113                d2.return = a2;
3114                a2 = d2;
3115                break a;
3116              } else {
3117                c(a2, d2);
3118                break;
3119              }
3120              else b(a2, d2);
3121              d2 = d2.sibling;
3122            }
3123            d2 = Sg(f3, a2.mode, h2);
3124            d2.return = a2;
3125            a2 = d2;
3126          }
3127          return g(a2);
3128        case Ha:
3129          return l3 = f3._init, J2(a2, d2, l3(f3._payload), h2);
3130      }
3131      if (eb(f3)) return n2(a2, d2, f3, h2);
3132      if (Ka(f3)) return t2(a2, d2, f3, h2);
3133      Mg(a2, f3);
3134    }
3135    return "string" === typeof f3 && "" !== f3 || "number" === typeof f3 ? (f3 = "" + f3, null !== d2 && 6 === d2.tag ? (c(a2, d2.sibling), d2 = e(d2, f3), d2.return = a2, a2 = d2) : (c(a2, d2), d2 = Qg(f3, a2.mode, h2), d2.return = a2, a2 = d2), g(a2)) : c(a2, d2);
3136  }
3137  return J2;
3138}
3139var Ug = Og(true), Vg = Og(false), Wg = Uf(null), Xg = null, Yg = null, Zg = null;
3140function $g() {
3141  Zg = Yg = Xg = null;
3142}
3143function ah(a) {
3144  var b = Wg.current;
3145  E(Wg);
3146  a._currentValue = b;
3147}
3148function bh(a, b, c) {
3149  for (; null !== a; ) {
3150    var d = a.alternate;
3151    (a.childLanes & b) !== b ? (a.childLanes |= b, null !== d && (d.childLanes |= b)) : null !== d && (d.childLanes & b) !== b && (d.childLanes |= b);
3152    if (a === c) break;
3153    a = a.return;
3154  }
3155}
3156function ch(a, b) {
3157  Xg = a;
3158  Zg = Yg = null;
3159  a = a.dependencies;
3160  null !== a && null !== a.firstContext && (0 !== (a.lanes & b) && (dh = true), a.firstContext = null);
3161}
3162function eh(a) {
3163  var b = a._currentValue;
3164  if (Zg !== a) if (a = { context: a, memoizedValue: b, next: null }, null === Yg) {
3165    if (null === Xg) throw Error(p(308));
3166    Yg = a;
3167    Xg.dependencies = { lanes: 0, firstContext: a };
3168  } else Yg = Yg.next = a;
3169  return b;
3170}
3171var fh = null;
3172function gh(a) {
3173  null === fh ? fh = [a] : fh.push(a);
3174}
3175function hh(a, b, c, d) {
3176  var e = b.interleaved;
3177  null === e ? (c.next = c, gh(b)) : (c.next = e.next, e.next = c);
3178  b.interleaved = c;
3179  return ih(a, d);
3180}
3181function ih(a, b) {
3182  a.lanes |= b;
3183  var c = a.alternate;
3184  null !== c && (c.lanes |= b);
3185  c = a;
3186  for (a = a.return; null !== a; ) a.childLanes |= b, c = a.alternate, null !== c && (c.childLanes |= b), c = a, a = a.return;
3187  return 3 === c.tag ? c.stateNode : null;
3188}
3189var jh = false;
3190function kh(a) {
3191  a.updateQueue = { baseState: a.memoizedState, firstBaseUpdate: null, lastBaseUpdate: null, shared: { pending: null, interleaved: null, lanes: 0 }, effects: null };
3192}
3193function lh(a, b) {
3194  a = a.updateQueue;
3195  b.updateQueue === a && (b.updateQueue = { baseState: a.baseState, firstBaseUpdate: a.firstBaseUpdate, lastBaseUpdate: a.lastBaseUpdate, shared: a.shared, effects: a.effects });
3196}
3197function mh(a, b) {
3198  return { eventTime: a, lane: b, tag: 0, payload: null, callback: null, next: null };
3199}
3200function nh(a, b, c) {
3201  var d = a.updateQueue;
3202  if (null === d) return null;
3203  d = d.shared;
3204  if (0 !== (K & 2)) {
3205    var e = d.pending;
3206    null === e ? b.next = b : (b.next = e.next, e.next = b);
3207    d.pending = b;
3208    return ih(a, c);
3209  }
3210  e = d.interleaved;
3211  null === e ? (b.next = b, gh(d)) : (b.next = e.next, e.next = b);
3212  d.interleaved = b;
3213  return ih(a, c);
3214}
3215function oh(a, b, c) {
3216  b = b.updateQueue;
3217  if (null !== b && (b = b.shared, 0 !== (c & 4194240))) {
3218    var d = b.lanes;
3219    d &= a.pendingLanes;
3220    c |= d;
3221    b.lanes = c;
3222    Cc(a, c);
3223  }
3224}
3225function ph(a, b) {
3226  var c = a.updateQueue, d = a.alternate;
3227  if (null !== d && (d = d.updateQueue, c === d)) {
3228    var e = null, f2 = null;
3229    c = c.firstBaseUpdate;
3230    if (null !== c) {
3231      do {
3232        var g = { eventTime: c.eventTime, lane: c.lane, tag: c.tag, payload: c.payload, callback: c.callback, next: null };
3233        null === f2 ? e = f2 = g : f2 = f2.next = g;
3234        c = c.next;
3235      } while (null !== c);
3236      null === f2 ? e = f2 = b : f2 = f2.next = b;
3237    } else e = f2 = b;
3238    c = { baseState: d.baseState, firstBaseUpdate: e, lastBaseUpdate: f2, shared: d.shared, effects: d.effects };
3239    a.updateQueue = c;
3240    return;
3241  }
3242  a = c.lastBaseUpdate;
3243  null === a ? c.firstBaseUpdate = b : a.next = b;
3244  c.lastBaseUpdate = b;
3245}
3246function qh(a, b, c, d) {
3247  var e = a.updateQueue;
3248  jh = false;
3249  var f2 = e.firstBaseUpdate, g = e.lastBaseUpdate, h = e.shared.pending;
3250  if (null !== h) {
3251    e.shared.pending = null;
3252    var k2 = h, l2 = k2.next;
3253    k2.next = null;
3254    null === g ? f2 = l2 : g.next = l2;
3255    g = k2;
3256    var m2 = a.alternate;
3257    null !== m2 && (m2 = m2.updateQueue, h = m2.lastBaseUpdate, h !== g && (null === h ? m2.firstBaseUpdate = l2 : h.next = l2, m2.lastBaseUpdate = k2));
3258  }
3259  if (null !== f2) {
3260    var q2 = e.baseState;
3261    g = 0;
3262    m2 = l2 = k2 = null;
3263    h = f2;
3264    do {
3265      var r2 = h.lane, y2 = h.eventTime;
3266      if ((d & r2) === r2) {
3267        null !== m2 && (m2 = m2.next = {
3268          eventTime: y2,
3269          lane: 0,
3270          tag: h.tag,
3271          payload: h.payload,
3272          callback: h.callback,
3273          next: null
3274        });
3275        a: {
3276          var n2 = a, t2 = h;
3277          r2 = b;
3278          y2 = c;
3279          switch (t2.tag) {
3280            case 1:
3281              n2 = t2.payload;
3282              if ("function" === typeof n2) {
3283                q2 = n2.call(y2, q2, r2);
3284                break a;
3285              }
3286              q2 = n2;
3287              break a;
3288            case 3:
3289              n2.flags = n2.flags & -65537 | 128;
3290            case 0:
3291              n2 = t2.payload;
3292              r2 = "function" === typeof n2 ? n2.call(y2, q2, r2) : n2;
3293              if (null === r2 || void 0 === r2) break a;
3294              q2 = A({}, q2, r2);
3295              break a;
3296            case 2:
3297              jh = true;
3298          }
3299        }
3300        null !== h.callback && 0 !== h.lane && (a.flags |= 64, r2 = e.effects, null === r2 ? e.effects = [h] : r2.push(h));
3301      } else y2 = { eventTime: y2, lane: r2, tag: h.tag, payload: h.payload, callback: h.callback, next: null }, null === m2 ? (l2 = m2 = y2, k2 = q2) : m2 = m2.next = y2, g |= r2;
3302      h = h.next;
3303      if (null === h) if (h = e.shared.pending, null === h) break;
3304      else r2 = h, h = r2.next, r2.next = null, e.lastBaseUpdate = r2, e.shared.pending = null;
3305    } while (1);
3306    null === m2 && (k2 = q2);
3307    e.baseState = k2;
3308    e.firstBaseUpdate = l2;
3309    e.lastBaseUpdate = m2;
3310    b = e.shared.interleaved;
3311    if (null !== b) {
3312      e = b;
3313      do
3314        g |= e.lane, e = e.next;
3315      while (e !== b);
3316    } else null === f2 && (e.shared.lanes = 0);
3317    rh |= g;
3318    a.lanes = g;
3319    a.memoizedState = q2;
3320  }
3321}
3322function sh(a, b, c) {
3323  a = b.effects;
3324  b.effects = null;
3325  if (null !== a) for (b = 0; b < a.length; b++) {
3326    var d = a[b], e = d.callback;
3327    if (null !== e) {
3328      d.callback = null;
3329      d = c;
3330      if ("function" !== typeof e) throw Error(p(191, e));
3331      e.call(d);
3332    }
3333  }
3334}
3335var th = {}, uh = Uf(th), vh = Uf(th), wh = Uf(th);
3336function xh(a) {
3337  if (a === th) throw Error(p(174));
3338  return a;
3339}
3340function yh(a, b) {
3341  G(wh, b);
3342  G(vh, a);
3343  G(uh, th);
3344  a = b.nodeType;
3345  switch (a) {
3346    case 9:
3347    case 11:
3348      b = (b = b.documentElement) ? b.namespaceURI : lb(null, "");
3349      break;
3350    default:
3351      a = 8 === a ? b.parentNode : b, b = a.namespaceURI || null, a = a.tagName, b = lb(b, a);
3352  }
3353  E(uh);
3354  G(uh, b);
3355}
3356function zh() {
3357  E(uh);
3358  E(vh);
3359  E(wh);
3360}
3361function Ah(a) {
3362  xh(wh.current);
3363  var b = xh(uh.current);
3364  var c = lb(b, a.type);
3365  b !== c && (G(vh, a), G(uh, c));
3366}
3367function Bh(a) {
3368  vh.current === a && (E(uh), E(vh));
3369}
3370var L = Uf(0);
3371function Ch(a) {
3372  for (var b = a; null !== b; ) {
3373    if (13 === b.tag) {
3374      var c = b.memoizedState;
3375      if (null !== c && (c = c.dehydrated, null === c || "$?" === c.data || "$!" === c.data)) return b;
3376    } else if (19 === b.tag && void 0 !== b.memoizedProps.revealOrder) {
3377      if (0 !== (b.flags & 128)) return b;
3378    } else if (null !== b.child) {
3379      b.child.return = b;
3380      b = b.child;
3381      continue;
3382    }
3383    if (b === a) break;
3384    for (; null === b.sibling; ) {
3385      if (null === b.return || b.return === a) return null;
3386      b = b.return;
3387    }
3388    b.sibling.return = b.return;
3389    b = b.sibling;
3390  }
3391  return null;
3392}
3393var Dh = [];
3394function Eh() {
3395  for (var a = 0; a < Dh.length; a++) Dh[a]._workInProgressVersionPrimary = null;
3396  Dh.length = 0;
3397}
3398var Fh = ua.ReactCurrentDispatcher, Gh = ua.ReactCurrentBatchConfig, Hh = 0, M = null, N = null, O = null, Ih = false, Jh = false, Kh = 0, Lh = 0;
3399function P() {
3400  throw Error(p(321));
3401}
3402function Mh(a, b) {
3403  if (null === b) return false;
3404  for (var c = 0; c < b.length && c < a.length; c++) if (!He(a[c], b[c])) return false;
3405  return true;
3406}
3407function Nh(a, b, c, d, e, f2) {
3408  Hh = f2;
3409  M = b;
3410  b.memoizedState = null;
3411  b.updateQueue = null;
3412  b.lanes = 0;
3413  Fh.current = null === a || null === a.memoizedState ? Oh : Ph;
3414  a = c(d, e);
3415  if (Jh) {
3416    f2 = 0;
3417    do {
3418      Jh = false;
3419      Kh = 0;
3420      if (25 <= f2) throw Error(p(301));
3421      f2 += 1;
3422      O = N = null;
3423      b.updateQueue = null;
3424      Fh.current = Qh;
3425      a = c(d, e);
3426    } while (Jh);
3427  }
3428  Fh.current = Rh;
3429  b = null !== N && null !== N.next;
3430  Hh = 0;
3431  O = N = M = null;
3432  Ih = false;
3433  if (b) throw Error(p(300));
3434  return a;
3435}
3436function Sh() {
3437  var a = 0 !== Kh;
3438  Kh = 0;
3439  return a;
3440}
3441function Th() {
3442  var a = { memoizedState: null, baseState: null, baseQueue: null, queue: null, next: null };
3443  null === O ? M.memoizedState = O = a : O = O.next = a;
3444  return O;
3445}
3446function Uh() {
3447  if (null === N) {
3448    var a = M.alternate;
3449    a = null !== a ? a.memoizedState : null;
3450  } else a = N.next;
3451  var b = null === O ? M.memoizedState : O.next;
3452  if (null !== b) O = b, N = a;
3453  else {
3454    if (null === a) throw Error(p(310));
3455    N = a;
3456    a = { memoizedState: N.memoizedState, baseState: N.baseState, baseQueue: N.baseQueue, queue: N.queue, next: null };
3457    null === O ? M.memoizedState = O = a : O = O.next = a;
3458  }
3459  return O;
3460}
3461function Vh(a, b) {
3462  return "function" === typeof b ? b(a) : b;
3463}
3464function Wh(a) {
3465  var b = Uh(), c = b.queue;
3466  if (null === c) throw Error(p(311));
3467  c.lastRenderedReducer = a;
3468  var d = N, e = d.baseQueue, f2 = c.pending;
3469  if (null !== f2) {
3470    if (null !== e) {
3471      var g = e.next;
3472      e.next = f2.next;
3473      f2.next = g;
3474    }
3475    d.baseQueue = e = f2;
3476    c.pending = null;
3477  }
3478  if (null !== e) {
3479    f2 = e.next;
3480    d = d.baseState;
3481    var h = g = null, k2 = null, l2 = f2;
3482    do {
3483      var m2 = l2.lane;
3484      if ((Hh & m2) === m2) null !== k2 && (k2 = k2.next = { lane: 0, action: l2.action, hasEagerState: l2.hasEagerState, eagerState: l2.eagerState, next: null }), d = l2.hasEagerState ? l2.eagerState : a(d, l2.action);
3485      else {
3486        var q2 = {
3487          lane: m2,
3488          action: l2.action,
3489          hasEagerState: l2.hasEagerState,
3490          eagerState: l2.eagerState,
3491          next: null
3492        };
3493        null === k2 ? (h = k2 = q2, g = d) : k2 = k2.next = q2;
3494        M.lanes |= m2;
3495        rh |= m2;
3496      }
3497      l2 = l2.next;
3498    } while (null !== l2 && l2 !== f2);
3499    null === k2 ? g = d : k2.next = h;
3500    He(d, b.memoizedState) || (dh = true);
3501    b.memoizedState = d;
3502    b.baseState = g;
3503    b.baseQueue = k2;
3504    c.lastRenderedState = d;
3505  }
3506  a = c.interleaved;
3507  if (null !== a) {
3508    e = a;
3509    do
3510      f2 = e.lane, M.lanes |= f2, rh |= f2, e = e.next;
3511    while (e !== a);
3512  } else null === e && (c.lanes = 0);
3513  return [b.memoizedState, c.dispatch];
3514}
3515function Xh(a) {
3516  var b = Uh(), c = b.queue;
3517  if (null === c) throw Error(p(311));
3518  c.lastRenderedReducer = a;
3519  var d = c.dispatch, e = c.pending, f2 = b.memoizedState;
3520  if (null !== e) {
3521    c.pending = null;
3522    var g = e = e.next;
3523    do
3524      f2 = a(f2, g.action), g = g.next;
3525    while (g !== e);
3526    He(f2, b.memoizedState) || (dh = true);
3527    b.memoizedState = f2;
3528    null === b.baseQueue && (b.baseState = f2);
3529    c.lastRenderedState = f2;
3530  }
3531  return [f2, d];
3532}
3533function Yh() {
3534}
3535function Zh(a, b) {
3536  var c = M, d = Uh(), e = b(), f2 = !He(d.memoizedState, e);
3537  f2 && (d.memoizedState = e, dh = true);
3538  d = d.queue;
3539  $h(ai.bind(null, c, d, a), [a]);
3540  if (d.getSnapshot !== b || f2 || null !== O && O.memoizedState.tag & 1) {
3541    c.flags |= 2048;
3542    bi(9, ci.bind(null, c, d, e, b), void 0, null);
3543    if (null === Q) throw Error(p(349));
3544    0 !== (Hh & 30) || di(c, b, e);
3545  }
3546  return e;
3547}
3548function di(a, b, c) {
3549  a.flags |= 16384;
3550  a = { getSnapshot: b, value: c };
3551  b = M.updateQueue;
3552  null === b ? (b = { lastEffect: null, stores: null }, M.updateQueue = b, b.stores = [a]) : (c = b.stores, null === c ? b.stores = [a] : c.push(a));
3553}
3554function ci(a, b, c, d) {
3555  b.value = c;
3556  b.getSnapshot = d;
3557  ei(b) && fi(a);
3558}
3559function ai(a, b, c) {
3560  return c(function() {
3561    ei(b) && fi(a);
3562  });
3563}
3564function ei(a) {
3565  var b = a.getSnapshot;
3566  a = a.value;
3567  try {
3568    var c = b();
3569    return !He(a, c);
3570  } catch (d) {
3571    return true;
3572  }
3573}
3574function fi(a) {
3575  var b = ih(a, 1);
3576  null !== b && gi(b, a, 1, -1);
3577}
3578function hi(a) {
3579  var b = Th();
3580  "function" === typeof a && (a = a());
3581  b.memoizedState = b.baseState = a;
3582  a = { pending: null, interleaved: null, lanes: 0, dispatch: null, lastRenderedReducer: Vh, lastRenderedState: a };
3583  b.queue = a;
3584  a = a.dispatch = ii.bind(null, M, a);
3585  return [b.memoizedState, a];
3586}
3587function bi(a, b, c, d) {
3588  a = { tag: a, create: b, destroy: c, deps: d, next: null };
3589  b = M.updateQueue;
3590  null === b ? (b = { lastEffect: null, stores: null }, M.updateQueue = b, b.lastEffect = a.next = a) : (c = b.lastEffect, null === c ? b.lastEffect = a.next = a : (d = c.next, c.next = a, a.next = d, b.lastEffect = a));
3591  return a;
3592}
3593function ji() {
3594  return Uh().memoizedState;
3595}
3596function ki(a, b, c, d) {
3597  var e = Th();
3598  M.flags |= a;
3599  e.memoizedState = bi(1 | b, c, void 0, void 0 === d ? null : d);
3600}
3601function li(a, b, c, d) {
3602  var e = Uh();
3603  d = void 0 === d ? null : d;
3604  var f2 = void 0;
3605  if (null !== N) {
3606    var g = N.memoizedState;
3607    f2 = g.destroy;
3608    if (null !== d && Mh(d, g.deps)) {
3609      e.memoizedState = bi(b, c, f2, d);
3610      return;
3611    }
3612  }
3613  M.flags |= a;
3614  e.memoizedState = bi(1 | b, c, f2, d);
3615}
3616function mi(a, b) {
3617  return ki(8390656, 8, a, b);
3618}
3619function $h(a, b) {
3620  return li(2048, 8, a, b);
3621}
3622function ni(a, b) {
3623  return li(4, 2, a, b);
3624}
3625function oi(a, b) {
3626  return li(4, 4, a, b);
3627}
3628function pi(a, b) {
3629  if ("function" === typeof b) return a = a(), b(a), function() {
3630    b(null);
3631  };
3632  if (null !== b && void 0 !== b) return a = a(), b.current = a, function() {
3633    b.current = null;
3634  };
3635}
3636function qi(a, b, c) {
3637  c = null !== c && void 0 !== c ? c.concat([a]) : null;
3638  return li(4, 4, pi.bind(null, b, a), c);
3639}
3640function ri() {
3641}
3642function si(a, b) {
3643  var c = Uh();
3644  b = void 0 === b ? null : b;
3645  var d = c.memoizedState;
3646  if (null !== d && null !== b && Mh(b, d[1])) return d[0];
3647  c.memoizedState = [a, b];
3648  return a;
3649}
3650function ti(a, b) {
3651  var c = Uh();
3652  b = void 0 === b ? null : b;
3653  var d = c.memoizedState;
3654  if (null !== d && null !== b && Mh(b, d[1])) return d[0];
3655  a = a();
3656  c.memoizedState = [a, b];
3657  return a;
3658}
3659function ui(a, b, c) {
3660  if (0 === (Hh & 21)) return a.baseState && (a.baseState = false, dh = true), a.memoizedState = c;
3661  He(c, b) || (c = yc(), M.lanes |= c, rh |= c, a.baseState = true);
3662  return b;
3663}
3664function vi(a, b) {
3665  var c = C;
3666  C = 0 !== c && 4 > c ? c : 4;
3667  a(true);
3668  var d = Gh.transition;
3669  Gh.transition = {};
3670  try {
3671    a(false), b();
3672  } finally {
3673    C = c, Gh.transition = d;
3674  }
3675}
3676function wi() {
3677  return Uh().memoizedState;
3678}
3679function xi(a, b, c) {
3680  var d = yi(a);
3681  c = { lane: d, action: c, hasEagerState: false, eagerState: null, next: null };
3682  if (zi(a)) Ai(b, c);
3683  else if (c = hh(a, b, c, d), null !== c) {
3684    var e = R();
3685    gi(c, a, d, e);
3686    Bi(c, b, d);
3687  }
3688}
3689function ii(a, b, c) {
3690  var d = yi(a), e = { lane: d, action: c, hasEagerState: false, eagerState: null, next: null };
3691  if (zi(a)) Ai(b, e);
3692  else {
3693    var f2 = a.alternate;
3694    if (0 === a.lanes && (null === f2 || 0 === f2.lanes) && (f2 = b.lastRenderedReducer, null !== f2)) try {
3695      var g = b.lastRenderedState, h = f2(g, c);
3696      e.hasEagerState = true;
3697      e.eagerState = h;
3698      if (He(h, g)) {
3699        var k2 = b.interleaved;
3700        null === k2 ? (e.next = e, gh(b)) : (e.next = k2.next, k2.next = e);
3701        b.interleaved = e;
3702        return;
3703      }
3704    } catch (l2) {
3705    } finally {
3706    }
3707    c = hh(a, b, e, d);
3708    null !== c && (e = R(), gi(c, a, d, e), Bi(c, b, d));
3709  }
3710}
3711function zi(a) {
3712  var b = a.alternate;
3713  return a === M || null !== b && b === M;
3714}
3715function Ai(a, b) {
3716  Jh = Ih = true;
3717  var c = a.pending;
3718  null === c ? b.next = b : (b.next = c.next, c.next = b);
3719  a.pending = b;
3720}
3721function Bi(a, b, c) {
3722  if (0 !== (c & 4194240)) {
3723    var d = b.lanes;
3724    d &= a.pendingLanes;
3725    c |= d;
3726    b.lanes = c;
3727    Cc(a, c);
3728  }
3729}
3730var Rh = { readContext: eh, useCallback: P, useContext: P, useEffect: P, useImperativeHandle: P, useInsertionEffect: P, useLayoutEffect: P, useMemo: P, useReducer: P, useRef: P, useState: P, useDebugValue: P, useDeferredValue: P, useTransition: P, useMutableSource: P, useSyncExternalStore: P, useId: P, unstable_isNewReconciler: false }, Oh = { readContext: eh, useCallback: function(a, b) {
3731  Th().memoizedState = [a, void 0 === b ? null : b];
3732  return a;
3733}, useContext: eh, useEffect: mi, useImperativeHandle: function(a, b, c) {
3734  c = null !== c && void 0 !== c ? c.concat([a]) : null;
3735  return ki(
3736    4194308,
3737    4,
3738    pi.bind(null, b, a),
3739    c
3740  );
3741}, useLayoutEffect: function(a, b) {
3742  return ki(4194308, 4, a, b);
3743}, useInsertionEffect: function(a, b) {
3744  return ki(4, 2, a, b);
3745}, useMemo: function(a, b) {
3746  var c = Th();
3747  b = void 0 === b ? null : b;
3748  a = a();
3749  c.memoizedState = [a, b];
3750  return a;
3751}, useReducer: function(a, b, c) {
3752  var d = Th();
3753  b = void 0 !== c ? c(b) : b;
3754  d.memoizedState = d.baseState = b;
3755  a = { pending: null, interleaved: null, lanes: 0, dispatch: null, lastRenderedReducer: a, lastRenderedState: b };
3756  d.queue = a;
3757  a = a.dispatch = xi.bind(null, M, a);
3758  return [d.memoizedState, a];
3759}, useRef: function(a) {
3760  var b = Th();
3761  a = { current: a };
3762  return b.memoizedState = a;
3763}, useState: hi, useDebugValue: ri, useDeferredValue: function(a) {
3764  return Th().memoizedState = a;
3765}, useTransition: function() {
3766  var a = hi(false), b = a[0];
3767  a = vi.bind(null, a[1]);
3768  Th().memoizedState = a;
3769  return [b, a];
3770}, useMutableSource: function() {
3771}, useSyncExternalStore: function(a, b, c) {
3772  var d = M, e = Th();
3773  if (I) {
3774    if (void 0 === c) throw Error(p(407));
3775    c = c();
3776  } else {
3777    c = b();
3778    if (null === Q) throw Error(p(349));
3779    0 !== (Hh & 30) || di(d, b, c);
3780  }
3781  e.memoizedState = c;
3782  var f2 = { value: c, getSnapshot: b };
3783  e.queue = f2;
3784  mi(ai.bind(
3785    null,
3786    d,
3787    f2,
3788    a
3789  ), [a]);
3790  d.flags |= 2048;
3791  bi(9, ci.bind(null, d, f2, c, b), void 0, null);
3792  return c;
3793}, useId: function() {
3794  var a = Th(), b = Q.identifierPrefix;
3795  if (I) {
3796    var c = sg;
3797    var d = rg;
3798    c = (d & ~(1 << 32 - oc(d) - 1)).toString(32) + c;
3799    b = ":" + b + "R" + c;
3800    c = Kh++;
3801    0 < c && (b += "H" + c.toString(32));
3802    b += ":";
3803  } else c = Lh++, b = ":" + b + "r" + c.toString(32) + ":";
3804  return a.memoizedState = b;
3805}, unstable_isNewReconciler: false }, Ph = {
3806  readContext: eh,
3807  useCallback: si,
3808  useContext: eh,
3809  useEffect: $h,
3810  useImperativeHandle: qi,
3811  useInsertionEffect: ni,
3812  useLayoutEffect: oi,
3813  useMemo: ti,
3814  useReducer: Wh,
3815  useRef: ji,
3816  useState: function() {
3817    return Wh(Vh);
3818  },
3819  useDebugValue: ri,
3820  useDeferredValue: function(a) {
3821    var b = Uh();
3822    return ui(b, N.memoizedState, a);
3823  },
3824  useTransition: function() {
3825    var a = Wh(Vh)[0], b = Uh().memoizedState;
3826    return [a, b];
3827  },
3828  useMutableSource: Yh,
3829  useSyncExternalStore: Zh,
3830  useId: wi,
3831  unstable_isNewReconciler: false
3832}, Qh = { readContext: eh, useCallback: si, useContext: eh, useEffect: $h, useImperativeHandle: qi, useInsertionEffect: ni, useLayoutEffect: oi, useMemo: ti, useReducer: Xh, useRef: ji, useState: function() {
3833  return Xh(Vh);
3834}, useDebugValue: ri, useDeferredValue: function(a) {
3835  var b = Uh();
3836  return null === N ? b.memoizedState = a : ui(b, N.memoizedState, a);
3837}, useTransition: function() {
3838  var a = Xh(Vh)[0], b = Uh().memoizedState;
3839  return [a, b];
3840}, useMutableSource: Yh, useSyncExternalStore: Zh, useId: wi, unstable_isNewReconciler: false };
3841function Ci(a, b) {
3842  if (a && a.defaultProps) {
3843    b = A({}, b);
3844    a = a.defaultProps;
3845    for (var c in a) void 0 === b[c] && (b[c] = a[c]);
3846    return b;
3847  }
3848  return b;
3849}
3850function Di(a, b, c, d) {
3851  b = a.memoizedState;
3852  c = c(d, b);
3853  c = null === c || void 0 === c ? b : A({}, b, c);
3854  a.memoizedState = c;
3855  0 === a.lanes && (a.updateQueue.baseState = c);
3856}
3857var Ei = { isMounted: function(a) {
3858  return (a = a._reactInternals) ? Vb(a) === a : false;
3859}, enqueueSetState: function(a, b, c) {
3860  a = a._reactInternals;
3861  var d = R(), e = yi(a), f2 = mh(d, e);
3862  f2.payload = b;
3863  void 0 !== c && null !== c && (f2.callback = c);
3864  b = nh(a, f2, e);
3865  null !== b && (gi(b, a, e, d), oh(b, a, e));
3866}, enqueueReplaceState: function(a, b, c) {
3867  a = a._reactInternals;
3868  var d = R(), e = yi(a), f2 = mh(d, e);
3869  f2.tag = 1;
3870  f2.payload = b;
3871  void 0 !== c && null !== c && (f2.callback = c);
3872  b = nh(a, f2, e);
3873  null !== b && (gi(b, a, e, d), oh(b, a, e));
3874}, enqueueForceUpdate: function(a, b) {
3875  a = a._reactInternals;
3876  var c = R(), d = yi(a), e = mh(c, d);
3877  e.tag = 2;
3878  void 0 !== b && null !== b && (e.callback = b);
3879  b = nh(a, e, d);
3880  null !== b && (gi(b, a, d, c), oh(b, a, d));
3881} };
3882function Fi(a, b, c, d, e, f2, g) {
3883  a = a.stateNode;
3884  return "function" === typeof a.shouldComponentUpdate ? a.shouldComponentUpdate(d, f2, g) : b.prototype && b.prototype.isPureReactComponent ? !Ie(c, d) || !Ie(e, f2) : true;
3885}
3886function Gi(a, b, c) {
3887  var d = false, e = Vf;
3888  var f2 = b.contextType;
3889  "object" === typeof f2 && null !== f2 ? f2 = eh(f2) : (e = Zf(b) ? Xf : H.current, d = b.contextTypes, f2 = (d = null !== d && void 0 !== d) ? Yf(a, e) : Vf);
3890  b = new b(c, f2);
3891  a.memoizedState = null !== b.state && void 0 !== b.state ? b.state : null;
3892  b.updater = Ei;
3893  a.stateNode = b;
3894  b._reactInternals = a;
3895  d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = e, a.__reactInternalMemoizedMaskedChildContext = f2);
3896  return b;
3897}
3898function Hi(a, b, c, d) {
3899  a = b.state;
3900  "function" === typeof b.componentWillReceiveProps && b.componentWillReceiveProps(c, d);
3901  "function" === typeof b.UNSAFE_componentWillReceiveProps && b.UNSAFE_componentWillReceiveProps(c, d);
3902  b.state !== a && Ei.enqueueReplaceState(b, b.state, null);
3903}
3904function Ii(a, b, c, d) {
3905  var e = a.stateNode;
3906  e.props = c;
3907  e.state = a.memoizedState;
3908  e.refs = {};
3909  kh(a);
3910  var f2 = b.contextType;
3911  "object" === typeof f2 && null !== f2 ? e.context = eh(f2) : (f2 = Zf(b) ? Xf : H.current, e.context = Yf(a, f2));
3912  e.state = a.memoizedState;
3913  f2 = b.getDerivedStateFromProps;
3914  "function" === typeof f2 && (Di(a, b, f2, c), e.state = a.memoizedState);
3915  "function" === typeof b.getDerivedStateFromProps || "function" === typeof e.getSnapshotBeforeUpdate || "function" !== typeof e.UNSAFE_componentWillMount && "function" !== typeof e.componentWillMount || (b = e.state, "function" === typeof e.componentWillMount && e.componentWillMount(), "function" === typeof e.UNSAFE_componentWillMount && e.UNSAFE_componentWillMount(), b !== e.state && Ei.enqueueReplaceState(e, e.state, null), qh(a, c, e, d), e.state = a.memoizedState);
3916  "function" === typeof e.componentDidMount && (a.flags |= 4194308);
3917}
3918function Ji(a, b) {
3919  try {
3920    var c = "", d = b;
3921    do
3922      c += Pa(d), d = d.return;
3923    while (d);
3924    var e = c;
3925  } catch (f2) {
3926    e = "\nError generating stack: " + f2.message + "\n" + f2.stack;
3927  }
3928  return { value: a, source: b, stack: e, digest: null };
3929}
3930function Ki(a, b, c) {
3931  return { value: a, source: null, stack: null != c ? c : null, digest: null != b ? b : null };
3932}
3933function Li(a, b) {
3934  try {
3935    console.error(b.value);
3936  } catch (c) {
3937    setTimeout(function() {
3938      throw c;
3939    });
3940  }
3941}
3942var Mi = "function" === typeof WeakMap ? WeakMap : Map;
3943function Ni(a, b, c) {
3944  c = mh(-1, c);
3945  c.tag = 3;
3946  c.payload = { element: null };
3947  var d = b.value;
3948  c.callback = function() {
3949    Oi || (Oi = true, Pi = d);
3950    Li(a, b);
3951  };
3952  return c;
3953}
3954function Qi(a, b, c) {
3955  c = mh(-1, c);
3956  c.tag = 3;
3957  var d = a.type.getDerivedStateFromError;
3958  if ("function" === typeof d) {
3959    var e = b.value;
3960    c.payload = function() {
3961      return d(e);
3962    };
3963    c.callback = function() {
3964      Li(a, b);
3965    };
3966  }
3967  var f2 = a.stateNode;
3968  null !== f2 && "function" === typeof f2.componentDidCatch && (c.callback = function() {
3969    Li(a, b);
3970    "function" !== typeof d && (null === Ri ? Ri = /* @__PURE__ */ new Set([this]) : Ri.add(this));
3971    var c2 = b.stack;
3972    this.componentDidCatch(b.value, { componentStack: null !== c2 ? c2 : "" });
3973  });
3974  return c;
3975}
3976function Si(a, b, c) {
3977  var d = a.pingCache;
3978  if (null === d) {
3979    d = a.pingCache = new Mi();
3980    var e = /* @__PURE__ */ new Set();
3981    d.set(b, e);
3982  } else e = d.get(b), void 0 === e && (e = /* @__PURE__ */ new Set(), d.set(b, e));
3983  e.has(c) || (e.add(c), a = Ti.bind(null, a, b, c), b.then(a, a));
3984}
3985function Ui(a) {
3986  do {
3987    var b;
3988    if (b = 13 === a.tag) b = a.memoizedState, b = null !== b ? null !== b.dehydrated ? true : false : true;
3989    if (b) return a;
3990    a = a.return;
3991  } while (null !== a);
3992  return null;
3993}
3994function Vi(a, b, c, d, e) {
3995  if (0 === (a.mode & 1)) return a === b ? a.flags |= 65536 : (a.flags |= 128, c.flags |= 131072, c.flags &= -52805, 1 === c.tag && (null === c.alternate ? c.tag = 17 : (b = mh(-1, 1), b.tag = 2, nh(c, b, 1))), c.lanes |= 1), a;
3996  a.flags |= 65536;
3997  a.lanes = e;
3998  return a;
3999}
4000var Wi = ua.ReactCurrentOwner, dh = false;
4001function Xi(a, b, c, d) {
4002  b.child = null === a ? Vg(b, null, c, d) : Ug(b, a.child, c, d);
4003}
4004function Yi(a, b, c, d, e) {
4005  c = c.render;
4006  var f2 = b.ref;
4007  ch(b, e);
4008  d = Nh(a, b, c, d, f2, e);
4009  c = Sh();
4010  if (null !== a && !dh) return b.updateQueue = a.updateQueue, b.flags &= -2053, a.lanes &= ~e, Zi(a, b, e);
4011  I && c && vg(b);
4012  b.flags |= 1;
4013  Xi(a, b, d, e);
4014  return b.child;
4015}
4016function $i(a, b, c, d, e) {
4017  if (null === a) {
4018    var f2 = c.type;
4019    if ("function" === typeof f2 && !aj(f2) && void 0 === f2.defaultProps && null === c.compare && void 0 === c.defaultProps) return b.tag = 15, b.type = f2, bj(a, b, f2, d, e);
4020    a = Rg(c.type, null, d, b, b.mode, e);
4021    a.ref = b.ref;
4022    a.return = b;
4023    return b.child = a;
4024  }
4025  f2 = a.child;
4026  if (0 === (a.lanes & e)) {
4027    var g = f2.memoizedProps;
4028    c = c.compare;
4029    c = null !== c ? c : Ie;
4030    if (c(g, d) && a.ref === b.ref) return Zi(a, b, e);
4031  }
4032  b.flags |= 1;
4033  a = Pg(f2, d);
4034  a.ref = b.ref;
4035  a.return = b;
4036  return b.child = a;
4037}
4038function bj(a, b, c, d, e) {
4039  if (null !== a) {
4040    var f2 = a.memoizedProps;
4041    if (Ie(f2, d) && a.ref === b.ref) if (dh = false, b.pendingProps = d = f2, 0 !== (a.lanes & e)) 0 !== (a.flags & 131072) && (dh = true);
4042    else return b.lanes = a.lanes, Zi(a, b, e);
4043  }
4044  return cj(a, b, c, d, e);
4045}
4046function dj(a, b, c) {
4047  var d = b.pendingProps, e = d.children, f2 = null !== a ? a.memoizedState : null;
4048  if ("hidden" === d.mode) if (0 === (b.mode & 1)) b.memoizedState = { baseLanes: 0, cachePool: null, transitions: null }, G(ej, fj), fj |= c;
4049  else {
4050    if (0 === (c & 1073741824)) return a = null !== f2 ? f2.baseLanes | c : c, b.lanes = b.childLanes = 1073741824, b.memoizedState = { baseLanes: a, cachePool: null, transitions: null }, b.updateQueue = null, G(ej, fj), fj |= a, null;
4051    b.memoizedState = { baseLanes: 0, cachePool: null, transitions: null };
4052    d = null !== f2 ? f2.baseLanes : c;
4053    G(ej, fj);
4054    fj |= d;
4055  }
4056  else null !== f2 ? (d = f2.baseLanes | c, b.memoizedState = null) : d = c, G(ej, fj), fj |= d;
4057  Xi(a, b, e, c);
4058  return b.child;
4059}
4060function gj(a, b) {
4061  var c = b.ref;
4062  if (null === a && null !== c || null !== a && a.ref !== c) b.flags |= 512, b.flags |= 2097152;
4063}
4064function cj(a, b, c, d, e) {
4065  var f2 = Zf(c) ? Xf : H.current;
4066  f2 = Yf(b, f2);
4067  ch(b, e);
4068  c = Nh(a, b, c, d, f2, e);
4069  d = Sh();
4070  if (null !== a && !dh) return b.updateQueue = a.updateQueue, b.flags &= -2053, a.lanes &= ~e, Zi(a, b, e);
4071  I && d && vg(b);
4072  b.flags |= 1;
4073  Xi(a, b, c, e);
4074  return b.child;
4075}
4076function hj(a, b, c, d, e) {
4077  if (Zf(c)) {
4078    var f2 = true;
4079    cg(b);
4080  } else f2 = false;
4081  ch(b, e);
4082  if (null === b.stateNode) ij(a, b), Gi(b, c, d), Ii(b, c, d, e), d = true;
4083  else if (null === a) {
4084    var g = b.stateNode, h = b.memoizedProps;
4085    g.props = h;
4086    var k2 = g.context, l2 = c.contextType;
4087    "object" === typeof l2 && null !== l2 ? l2 = eh(l2) : (l2 = Zf(c) ? Xf : H.current, l2 = Yf(b, l2));
4088    var m2 = c.getDerivedStateFromProps, q2 = "function" === typeof m2 || "function" === typeof g.getSnapshotBeforeUpdate;
4089    q2 || "function" !== typeof g.UNSAFE_componentWillReceiveProps && "function" !== typeof g.componentWillReceiveProps || (h !== d || k2 !== l2) && Hi(b, g, d, l2);
4090    jh = false;
4091    var r2 = b.memoizedState;
4092    g.state = r2;
4093    qh(b, d, g, e);
4094    k2 = b.memoizedState;
4095    h !== d || r2 !== k2 || Wf.current || jh ? ("function" === typeof m2 && (Di(b, c, m2, d), k2 = b.memoizedState), (h = jh || Fi(b, c, h, d, r2, k2, l2)) ? (q2 || "function" !== typeof g.UNSAFE_componentWillMount && "function" !== typeof g.componentWillMount || ("function" === typeof g.componentWillMount && g.componentWillMount(), "function" === typeof g.UNSAFE_componentWillMount && g.UNSAFE_componentWillMount()), "function" === typeof g.componentDidMount && (b.flags |= 4194308)) : ("function" === typeof g.componentDidMount && (b.flags |= 4194308), b.memoizedProps = d, b.memoizedState = k2), g.props = d, g.state = k2, g.context = l2, d = h) : ("function" === typeof g.componentDidMount && (b.flags |= 4194308), d = false);
4096  } else {
4097    g = b.stateNode;
4098    lh(a, b);
4099    h = b.memoizedProps;
4100    l2 = b.type === b.elementType ? h : Ci(b.type, h);
4101    g.props = l2;
4102    q2 = b.pendingProps;
4103    r2 = g.context;
4104    k2 = c.contextType;
4105    "object" === typeof k2 && null !== k2 ? k2 = eh(k2) : (k2 = Zf(c) ? Xf : H.current, k2 = Yf(b, k2));
4106    var y2 = c.getDerivedStateFromProps;
4107    (m2 = "function" === typeof y2 || "function" === typeof g.getSnapshotBeforeUpdate) || "function" !== typeof g.UNSAFE_componentWillReceiveProps && "function" !== typeof g.componentWillReceiveProps || (h !== q2 || r2 !== k2) && Hi(b, g, d, k2);
4108    jh = false;
4109    r2 = b.memoizedState;
4110    g.state = r2;
4111    qh(b, d, g, e);
4112    var n2 = b.memoizedState;
4113    h !== q2 || r2 !== n2 || Wf.current || jh ? ("function" === typeof y2 && (Di(b, c, y2, d), n2 = b.memoizedState), (l2 = jh || Fi(b, c, l2, d, r2, n2, k2) || false) ? (m2 || "function" !== typeof g.UNSAFE_componentWillUpdate && "function" !== typeof g.componentWillUpdate || ("function" === typeof g.componentWillUpdate && g.componentWillUpdate(d, n2, k2), "function" === typeof g.UNSAFE_componentWillUpdate && g.UNSAFE_componentWillUpdate(d, n2, k2)), "function" === typeof g.componentDidUpdate && (b.flags |= 4), "function" === typeof g.getSnapshotBeforeUpdate && (b.flags |= 1024)) : ("function" !== typeof g.componentDidUpdate || h === a.memoizedProps && r2 === a.memoizedState || (b.flags |= 4), "function" !== typeof g.getSnapshotBeforeUpdate || h === a.memoizedProps && r2 === a.memoizedState || (b.flags |= 1024), b.memoizedProps = d, b.memoizedState = n2), g.props = d, g.state = n2, g.context = k2, d = l2) : ("function" !== typeof g.componentDidUpdate || h === a.memoizedProps && r2 === a.memoizedState || (b.flags |= 4), "function" !== typeof g.getSnapshotBeforeUpdate || h === a.memoizedProps && r2 === a.memoizedState || (b.flags |= 1024), d = false);
4114  }
4115  return jj(a, b, c, d, f2, e);
4116}
4117function jj(a, b, c, d, e, f2) {
4118  gj(a, b);
4119  var g = 0 !== (b.flags & 128);
4120  if (!d && !g) return e && dg(b, c, false), Zi(a, b, f2);
4121  d = b.stateNode;
4122  Wi.current = b;
4123  var h = g && "function" !== typeof c.getDerivedStateFromError ? null : d.render();
4124  b.flags |= 1;
4125  null !== a && g ? (b.child = Ug(b, a.child, null, f2), b.child = Ug(b, null, h, f2)) : Xi(a, b, h, f2);
4126  b.memoizedState = d.state;
4127  e && dg(b, c, true);
4128  return b.child;
4129}
4130function kj(a) {
4131  var b = a.stateNode;
4132  b.pendingContext ? ag(a, b.pendingContext, b.pendingContext !== b.context) : b.context && ag(a, b.context, false);
4133  yh(a, b.containerInfo);
4134}
4135function lj(a, b, c, d, e) {
4136  Ig();
4137  Jg(e);
4138  b.flags |= 256;
4139  Xi(a, b, c, d);
4140  return b.child;
4141}
4142var mj = { dehydrated: null, treeContext: null, retryLane: 0 };
4143function nj(a) {
4144  return { baseLanes: a, cachePool: null, transitions: null };
4145}
4146function oj(a, b, c) {
4147  var d = b.pendingProps, e = L.current, f2 = false, g = 0 !== (b.flags & 128), h;
4148  (h = g) || (h = null !== a && null === a.memoizedState ? false : 0 !== (e & 2));
4149  if (h) f2 = true, b.flags &= -129;
4150  else if (null === a || null !== a.memoizedState) e |= 1;
4151  G(L, e & 1);
4152  if (null === a) {
4153    Eg(b);
4154    a = b.memoizedState;
4155    if (null !== a && (a = a.dehydrated, null !== a)) return 0 === (b.mode & 1) ? b.lanes = 1 : "$!" === a.data ? b.lanes = 8 : b.lanes = 1073741824, null;
4156    g = d.children;
4157    a = d.fallback;
4158    return f2 ? (d = b.mode, f2 = b.child, g = { mode: "hidden", children: g }, 0 === (d & 1) && null !== f2 ? (f2.childLanes = 0, f2.pendingProps = g) : f2 = pj(g, d, 0, null), a = Tg(a, d, c, null), f2.return = b, a.return = b, f2.sibling = a, b.child = f2, b.child.memoizedState = nj(c), b.memoizedState = mj, a) : qj(b, g);
4159  }
4160  e = a.memoizedState;
4161  if (null !== e && (h = e.dehydrated, null !== h)) return rj(a, b, g, d, h, e, c);
4162  if (f2) {
4163    f2 = d.fallback;
4164    g = b.mode;
4165    e = a.child;
4166    h = e.sibling;
4167    var k2 = { mode: "hidden", children: d.children };
4168    0 === (g & 1) && b.child !== e ? (d = b.child, d.childLanes = 0, d.pendingProps = k2, b.deletions = null) : (d = Pg(e, k2), d.subtreeFlags = e.subtreeFlags & 14680064);
4169    null !== h ? f2 = Pg(h, f2) : (f2 = Tg(f2, g, c, null), f2.flags |= 2);
4170    f2.return = b;
4171    d.return = b;
4172    d.sibling = f2;
4173    b.child = d;
4174    d = f2;
4175    f2 = b.child;
4176    g = a.child.memoizedState;
4177    g = null === g ? nj(c) : { baseLanes: g.baseLanes | c, cachePool: null, transitions: g.transitions };
4178    f2.memoizedState = g;
4179    f2.childLanes = a.childLanes & ~c;
4180    b.memoizedState = mj;
4181    return d;
4182  }
4183  f2 = a.child;
4184  a = f2.sibling;
4185  d = Pg(f2, { mode: "visible", children: d.children });
4186  0 === (b.mode & 1) && (d.lanes = c);
4187  d.return = b;
4188  d.sibling = null;
4189  null !== a && (c = b.deletions, null === c ? (b.deletions = [a], b.flags |= 16) : c.push(a));
4190  b.child = d;
4191  b.memoizedState = null;
4192  return d;
4193}
4194function qj(a, b) {
4195  b = pj({ mode: "visible", children: b }, a.mode, 0, null);
4196  b.return = a;
4197  return a.child = b;
4198}
4199function sj(a, b, c, d) {
4200  null !== d && Jg(d);
4201  Ug(b, a.child, null, c);
4202  a = qj(b, b.pendingProps.children);
4203  a.flags |= 2;
4204  b.memoizedState = null;
4205  return a;
4206}
4207function rj(a, b, c, d, e, f2, g) {
4208  if (c) {
4209    if (b.flags & 256) return b.flags &= -257, d = Ki(Error(p(422))), sj(a, b, g, d);
4210    if (null !== b.memoizedState) return b.child = a.child, b.flags |= 128, null;
4211    f2 = d.fallback;
4212    e = b.mode;
4213    d = pj({ mode: "visible", children: d.children }, e, 0, null);
4214    f2 = Tg(f2, e, g, null);
4215    f2.flags |= 2;
4216    d.return = b;
4217    f2.return = b;
4218    d.sibling = f2;
4219    b.child = d;
4220    0 !== (b.mode & 1) && Ug(b, a.child, null, g);
4221    b.child.memoizedState = nj(g);
4222    b.memoizedState = mj;
4223    return f2;
4224  }
4225  if (0 === (b.mode & 1)) return sj(a, b, g, null);
4226  if ("$!" === e.data) {
4227    d = e.nextSibling && e.nextSibling.dataset;
4228    if (d) var h = d.dgst;
4229    d = h;
4230    f2 = Error(p(419));
4231    d = Ki(f2, d, void 0);
4232    return sj(a, b, g, d);
4233  }
4234  h = 0 !== (g & a.childLanes);
4235  if (dh || h) {
4236    d = Q;
4237    if (null !== d) {
4238      switch (g & -g) {
4239        case 4:
4240          e = 2;
4241          break;
4242        case 16:
4243          e = 8;
4244          break;
4245        case 64:
4246        case 128:
4247        case 256:
4248        case 512:
4249        case 1024:
4250        case 2048:
4251        case 4096:
4252        case 8192:
4253        case 16384:
4254        case 32768:
4255        case 65536:
4256        case 131072:
4257        case 262144:
4258        case 524288:
4259        case 1048576:
4260        case 2097152:
4261        case 4194304:
4262        case 8388608:
4263        case 16777216:
4264        case 33554432:
4265        case 67108864:
4266          e = 32;
4267          break;
4268        case 536870912:
4269          e = 268435456;
4270          break;
4271        default:
4272          e = 0;
4273      }
4274      e = 0 !== (e & (d.suspendedLanes | g)) ? 0 : e;
4275      0 !== e && e !== f2.retryLane && (f2.retryLane = e, ih(a, e), gi(d, a, e, -1));
4276    }
4277    tj();
4278    d = Ki(Error(p(421)));
4279    return sj(a, b, g, d);
4280  }
4281  if ("$?" === e.data) return b.flags |= 128, b.child = a.child, b = uj.bind(null, a), e._reactRetry = b, null;
4282  a = f2.treeContext;
4283  yg = Lf(e.nextSibling);
4284  xg = b;
4285  I = true;
4286  zg = null;
4287  null !== a && (og[pg++] = rg, og[pg++] = sg, og[pg++] = qg, rg = a.id, sg = a.overflow, qg = b);
4288  b = qj(b, d.children);
4289  b.flags |= 4096;
4290  return b;
4291}
4292function vj(a, b, c) {
4293  a.lanes |= b;
4294  var d = a.alternate;
4295  null !== d && (d.lanes |= b);
4296  bh(a.return, b, c);
4297}
4298function wj(a, b, c, d, e) {
4299  var f2 = a.memoizedState;
4300  null === f2 ? a.memoizedState = { isBackwards: b, rendering: null, renderingStartTime: 0, last: d, tail: c, tailMode: e } : (f2.isBackwards = b, f2.rendering = null, f2.renderingStartTime = 0, f2.last = d, f2.tail = c, f2.tailMode = e);
4301}
4302function xj(a, b, c) {
4303  var d = b.pendingProps, e = d.revealOrder, f2 = d.tail;
4304  Xi(a, b, d.children, c);
4305  d = L.current;
4306  if (0 !== (d & 2)) d = d & 1 | 2, b.flags |= 128;
4307  else {
4308    if (null !== a && 0 !== (a.flags & 128)) a: for (a = b.child; null !== a; ) {
4309      if (13 === a.tag) null !== a.memoizedState && vj(a, c, b);
4310      else if (19 === a.tag) vj(a, c, b);
4311      else if (null !== a.child) {
4312        a.child.return = a;
4313        a = a.child;
4314        continue;
4315      }
4316      if (a === b) break a;
4317      for (; null === a.sibling; ) {
4318        if (null === a.return || a.return === b) break a;
4319        a = a.return;
4320      }
4321      a.sibling.return = a.return;
4322      a = a.sibling;
4323    }
4324    d &= 1;
4325  }
4326  G(L, d);
4327  if (0 === (b.mode & 1)) b.memoizedState = null;
4328  else switch (e) {
4329    case "forwards":
4330      c = b.child;
4331      for (e = null; null !== c; ) a = c.alternate, null !== a && null === Ch(a) && (e = c), c = c.sibling;
4332      c = e;
4333      null === c ? (e = b.child, b.child = null) : (e = c.sibling, c.sibling = null);
4334      wj(b, false, e, c, f2);
4335      break;
4336    case "backwards":
4337      c = null;
4338      e = b.child;
4339      for (b.child = null; null !== e; ) {
4340        a = e.alternate;
4341        if (null !== a && null === Ch(a)) {
4342          b.child = e;
4343          break;
4344        }
4345        a = e.sibling;
4346        e.sibling = c;
4347        c = e;
4348        e = a;
4349      }
4350      wj(b, true, c, null, f2);
4351      break;
4352    case "together":
4353      wj(b, false, null, null, void 0);
4354      break;
4355    default:
4356      b.memoizedState = null;
4357  }
4358  return b.child;
4359}
4360function ij(a, b) {
4361  0 === (b.mode & 1) && null !== a && (a.alternate = null, b.alternate = null, b.flags |= 2);
4362}
4363function Zi(a, b, c) {
4364  null !== a && (b.dependencies = a.dependencies);
4365  rh |= b.lanes;
4366  if (0 === (c & b.childLanes)) return null;
4367  if (null !== a && b.child !== a.child) throw Error(p(153));
4368  if (null !== b.child) {
4369    a = b.child;
4370    c = Pg(a, a.pendingProps);
4371    b.child = c;
4372    for (c.return = b; null !== a.sibling; ) a = a.sibling, c = c.sibling = Pg(a, a.pendingProps), c.return = b;
4373    c.sibling = null;
4374  }
4375  return b.child;
4376}
4377function yj(a, b, c) {
4378  switch (b.tag) {
4379    case 3:
4380      kj(b);
4381      Ig();
4382      break;
4383    case 5:
4384      Ah(b);
4385      break;
4386    case 1:
4387      Zf(b.type) && cg(b);
4388      break;
4389    case 4:
4390      yh(b, b.stateNode.containerInfo);
4391      break;
4392    case 10:
4393      var d = b.type._context, e = b.memoizedProps.value;
4394      G(Wg, d._currentValue);
4395      d._currentValue = e;
4396      break;
4397    case 13:
4398      d = b.memoizedState;
4399      if (null !== d) {
4400        if (null !== d.dehydrated) return G(L, L.current & 1), b.flags |= 128, null;
4401        if (0 !== (c & b.child.childLanes)) return oj(a, b, c);
4402        G(L, L.current & 1);
4403        a = Zi(a, b, c);
4404        return null !== a ? a.sibling : null;
4405      }
4406      G(L, L.current & 1);
4407      break;
4408    case 19:
4409      d = 0 !== (c & b.childLanes);
4410      if (0 !== (a.flags & 128)) {
4411        if (d) return xj(a, b, c);
4412        b.flags |= 128;
4413      }
4414      e = b.memoizedState;
4415      null !== e && (e.rendering = null, e.tail = null, e.lastEffect = null);
4416      G(L, L.current);
4417      if (d) break;
4418      else return null;
4419    case 22:
4420    case 23:
4421      return b.lanes = 0, dj(a, b, c);
4422  }
4423  return Zi(a, b, c);
4424}
4425var zj, Aj, Bj, Cj;
4426zj = function(a, b) {
4427  for (var c = b.child; null !== c; ) {
4428    if (5 === c.tag || 6 === c.tag) a.appendChild(c.stateNode);
4429    else if (4 !== c.tag && null !== c.child) {
4430      c.child.return = c;
4431      c = c.child;
4432      continue;
4433    }
4434    if (c === b) break;
4435    for (; null === c.sibling; ) {
4436      if (null === c.return || c.return === b) return;
4437      c = c.return;
4438    }
4439    c.sibling.return = c.return;
4440    c = c.sibling;
4441  }
4442};
4443Aj = function() {
4444};
4445Bj = function(a, b, c, d) {
4446  var e = a.memoizedProps;
4447  if (e !== d) {
4448    a = b.stateNode;
4449    xh(uh.current);
4450    var f2 = null;
4451    switch (c) {
4452      case "input":
4453        e = Ya(a, e);
4454        d = Ya(a, d);
4455        f2 = [];
4456        break;
4457      case "select":
4458        e = A({}, e, { value: void 0 });
4459        d = A({}, d, { value: void 0 });
4460        f2 = [];
4461        break;
4462      case "textarea":
4463        e = gb(a, e);
4464        d = gb(a, d);
4465        f2 = [];
4466        break;
4467      default:
4468        "function" !== typeof e.onClick && "function" === typeof d.onClick && (a.onclick = Bf);
4469    }
4470    ub(c, d);
4471    var g;
4472    c = null;
4473    for (l2 in e) if (!d.hasOwnProperty(l2) && e.hasOwnProperty(l2) && null != e[l2]) if ("style" === l2) {
4474      var h = e[l2];
4475      for (g in h) h.hasOwnProperty(g) && (c || (c = {}), c[g] = "");
4476    } else "dangerouslySetInnerHTML" !== l2 && "children" !== l2 && "suppressContentEditableWarning" !== l2 && "suppressHydrationWarning" !== l2 && "autoFocus" !== l2 && (ea.hasOwnProperty(l2) ? f2 || (f2 = []) : (f2 = f2 || []).push(l2, null));
4477    for (l2 in d) {
4478      var k2 = d[l2];
4479      h = null != e ? e[l2] : void 0;
4480      if (d.hasOwnProperty(l2) && k2 !== h && (null != k2 || null != h)) if ("style" === l2) if (h) {
4481        for (g in h) !h.hasOwnProperty(g) || k2 && k2.hasOwnProperty(g) || (c || (c = {}), c[g] = "");
4482        for (g in k2) k2.hasOwnProperty(g) && h[g] !== k2[g] && (c || (c = {}), c[g] = k2[g]);
4483      } else c || (f2 || (f2 = []), f2.push(
4484        l2,
4485        c
4486      )), c = k2;
4487      else "dangerouslySetInnerHTML" === l2 ? (k2 = k2 ? k2.__html : void 0, h = h ? h.__html : void 0, null != k2 && h !== k2 && (f2 = f2 || []).push(l2, k2)) : "children" === l2 ? "string" !== typeof k2 && "number" !== typeof k2 || (f2 = f2 || []).push(l2, "" + k2) : "suppressContentEditableWarning" !== l2 && "suppressHydrationWarning" !== l2 && (ea.hasOwnProperty(l2) ? (null != k2 && "onScroll" === l2 && D("scroll", a), f2 || h === k2 || (f2 = [])) : (f2 = f2 || []).push(l2, k2));
4488    }
4489    c && (f2 = f2 || []).push("style", c);
4490    var l2 = f2;
4491    if (b.updateQueue = l2) b.flags |= 4;
4492  }
4493};
4494Cj = function(a, b, c, d) {
4495  c !== d && (b.flags |= 4);
4496};
4497function Dj(a, b) {
4498  if (!I) switch (a.tailMode) {
4499    case "hidden":
4500      b = a.tail;
4501      for (var c = null; null !== b; ) null !== b.alternate && (c = b), b = b.sibling;
4502      null === c ? a.tail = null : c.sibling = null;
4503      break;
4504    case "collapsed":
4505      c = a.tail;
4506      for (var d = null; null !== c; ) null !== c.alternate && (d = c), c = c.sibling;
4507      null === d ? b || null === a.tail ? a.tail = null : a.tail.sibling = null : d.sibling = null;
4508  }
4509}
4510function S(a) {
4511  var b = null !== a.alternate && a.alternate.child === a.child, c = 0, d = 0;
4512  if (b) for (var e = a.child; null !== e; ) c |= e.lanes | e.childLanes, d |= e.subtreeFlags & 14680064, d |= e.flags & 14680064, e.return = a, e = e.sibling;
4513  else for (e = a.child; null !== e; ) c |= e.lanes | e.childLanes, d |= e.subtreeFlags, d |= e.flags, e.return = a, e = e.sibling;
4514  a.subtreeFlags |= d;
4515  a.childLanes = c;
4516  return b;
4517}
4518function Ej(a, b, c) {
4519  var d = b.pendingProps;
4520  wg(b);
4521  switch (b.tag) {
4522    case 2:
4523    case 16:
4524    case 15:
4525    case 0:
4526    case 11:
4527    case 7:
4528    case 8:
4529    case 12:
4530    case 9:
4531    case 14:
4532      return S(b), null;
4533    case 1:
4534      return Zf(b.type) && $f(), S(b), null;
4535    case 3:
4536      d = b.stateNode;
4537      zh();
4538      E(Wf);
4539      E(H);
4540      Eh();
4541      d.pendingContext && (d.context = d.pendingContext, d.pendingContext = null);
4542      if (null === a || null === a.child) Gg(b) ? b.flags |= 4 : null === a || a.memoizedState.isDehydrated && 0 === (b.flags & 256) || (b.flags |= 1024, null !== zg && (Fj(zg), zg = null));
4543      Aj(a, b);
4544      S(b);
4545      return null;
4546    case 5:
4547      Bh(b);
4548      var e = xh(wh.current);
4549      c = b.type;
4550      if (null !== a && null != b.stateNode) Bj(a, b, c, d, e), a.ref !== b.ref && (b.flags |= 512, b.flags |= 2097152);
4551      else {
4552        if (!d) {
4553          if (null === b.stateNode) throw Error(p(166));
4554          S(b);
4555          return null;
4556        }
4557        a = xh(uh.current);
4558        if (Gg(b)) {
4559          d = b.stateNode;
4560          c = b.type;
4561          var f2 = b.memoizedProps;
4562          d[Of] = b;
4563          d[Pf] = f2;
4564          a = 0 !== (b.mode & 1);
4565          switch (c) {
4566            case "dialog":
4567              D("cancel", d);
4568              D("close", d);
4569              break;
4570            case "iframe":
4571            case "object":
4572            case "embed":
4573              D("load", d);
4574              break;
4575            case "video":
4576            case "audio":
4577              for (e = 0; e < lf.length; e++) D(lf[e], d);
4578              break;
4579            case "source":
4580              D("error", d);
4581              break;
4582            case "img":
4583            case "image":
4584            case "link":
4585              D(
4586                "error",
4587                d
4588              );
4589              D("load", d);
4590              break;
4591            case "details":
4592              D("toggle", d);
4593              break;
4594            case "input":
4595              Za(d, f2);
4596              D("invalid", d);
4597              break;
4598            case "select":
4599              d._wrapperState = { wasMultiple: !!f2.multiple };
4600              D("invalid", d);
4601              break;
4602            case "textarea":
4603              hb(d, f2), D("invalid", d);
4604          }
4605          ub(c, f2);
4606          e = null;
4607          for (var g in f2) if (f2.hasOwnProperty(g)) {
4608            var h = f2[g];
4609            "children" === g ? "string" === typeof h ? d.textContent !== h && (true !== f2.suppressHydrationWarning && Af(d.textContent, h, a), e = ["children", h]) : "number" === typeof h && d.textContent !== "" + h && (true !== f2.suppressHydrationWarning && Af(
4610              d.textContent,
4611              h,
4612              a
4613            ), e = ["children", "" + h]) : ea.hasOwnProperty(g) && null != h && "onScroll" === g && D("scroll", d);
4614          }
4615          switch (c) {
4616            case "input":
4617              Va(d);
4618              db(d, f2, true);
4619              break;
4620            case "textarea":
4621              Va(d);
4622              jb(d);
4623              break;
4624            case "select":
4625            case "option":
4626              break;
4627            default:
4628              "function" === typeof f2.onClick && (d.onclick = Bf);
4629          }
4630          d = e;
4631          b.updateQueue = d;
4632          null !== d && (b.flags |= 4);
4633        } else {
4634          g = 9 === e.nodeType ? e : e.ownerDocument;
4635          "http://www.w3.org/1999/xhtml" === a && (a = kb(c));
4636          "http://www.w3.org/1999/xhtml" === a ? "script" === c ? (a = g.createElement("div"), a.innerHTML = "<script><\/script>", a = a.removeChild(a.firstChild)) : "string" === typeof d.is ? a = g.createElement(c, { is: d.is }) : (a = g.createElement(c), "select" === c && (g = a, d.multiple ? g.multiple = true : d.size && (g.size = d.size))) : a = g.createElementNS(a, c);
4637          a[Of] = b;
4638          a[Pf] = d;
4639          zj(a, b, false, false);
4640          b.stateNode = a;
4641          a: {
4642            g = vb(c, d);
4643            switch (c) {
4644              case "dialog":
4645                D("cancel", a);
4646                D("close", a);
4647                e = d;
4648                break;
4649              case "iframe":
4650              case "object":
4651              case "embed":
4652                D("load", a);
4653                e = d;
4654                break;
4655              case "video":
4656              case "audio":
4657                for (e = 0; e < lf.length; e++) D(lf[e], a);
4658                e = d;
4659                break;
4660              case "source":
4661                D("error", a);
4662                e = d;
4663                break;
4664              case "img":
4665              case "image":
4666              case "link":
4667                D(
4668                  "error",
4669                  a
4670                );
4671                D("load", a);
4672                e = d;
4673                break;
4674              case "details":
4675                D("toggle", a);
4676                e = d;
4677                break;
4678              case "input":
4679                Za(a, d);
4680                e = Ya(a, d);
4681                D("invalid", a);
4682                break;
4683              case "option":
4684                e = d;
4685                break;
4686              case "select":
4687                a._wrapperState = { wasMultiple: !!d.multiple };
4688                e = A({}, d, { value: void 0 });
4689                D("invalid", a);
4690                break;
4691              case "textarea":
4692                hb(a, d);
4693                e = gb(a, d);
4694                D("invalid", a);
4695                break;
4696              default:
4697                e = d;
4698            }
4699            ub(c, e);
4700            h = e;
4701            for (f2 in h) if (h.hasOwnProperty(f2)) {
4702              var k2 = h[f2];
4703              "style" === f2 ? sb(a, k2) : "dangerouslySetInnerHTML" === f2 ? (k2 = k2 ? k2.__html : void 0, null != k2 && nb(a, k2)) : "children" === f2 ? "string" === typeof k2 ? ("textarea" !== c || "" !== k2) && ob(a, k2) : "number" === typeof k2 && ob(a, "" + k2) : "suppressContentEditableWarning" !== f2 && "suppressHydrationWarning" !== f2 && "autoFocus" !== f2 && (ea.hasOwnProperty(f2) ? null != k2 && "onScroll" === f2 && D("scroll", a) : null != k2 && ta(a, f2, k2, g));
4704            }
4705            switch (c) {
4706              case "input":
4707                Va(a);
4708                db(a, d, false);
4709                break;
4710              case "textarea":
4711                Va(a);
4712                jb(a);
4713                break;
4714              case "option":
4715                null != d.value && a.setAttribute("value", "" + Sa(d.value));
4716                break;
4717              case "select":
4718                a.multiple = !!d.multiple;
4719                f2 = d.value;
4720                null != f2 ? fb(a, !!d.multiple, f2, false) : null != d.defaultValue && fb(
4721                  a,
4722                  !!d.multiple,
4723                  d.defaultValue,
4724                  true
4725                );
4726                break;
4727              default:
4728                "function" === typeof e.onClick && (a.onclick = Bf);
4729            }
4730            switch (c) {
4731              case "button":
4732              case "input":
4733              case "select":
4734              case "textarea":
4735                d = !!d.autoFocus;
4736                break a;
4737              case "img":
4738                d = true;
4739                break a;
4740              default:
4741                d = false;
4742            }
4743          }
4744          d && (b.flags |= 4);
4745        }
4746        null !== b.ref && (b.flags |= 512, b.flags |= 2097152);
4747      }
4748      S(b);
4749      return null;
4750    case 6:
4751      if (a && null != b.stateNode) Cj(a, b, a.memoizedProps, d);
4752      else {
4753        if ("string" !== typeof d && null === b.stateNode) throw Error(p(166));
4754        c = xh(wh.current);
4755        xh(uh.current);
4756        if (Gg(b)) {
4757          d = b.stateNode;
4758          c = b.memoizedProps;
4759          d[Of] = b;
4760          if (f2 = d.nodeValue !== c) {
4761            if (a = xg, null !== a) switch (a.tag) {
4762              case 3:
4763                Af(d.nodeValue, c, 0 !== (a.mode & 1));
4764                break;
4765              case 5:
4766                true !== a.memoizedProps.suppressHydrationWarning && Af(d.nodeValue, c, 0 !== (a.mode & 1));
4767            }
4768          }
4769          f2 && (b.flags |= 4);
4770        } else d = (9 === c.nodeType ? c : c.ownerDocument).createTextNode(d), d[Of] = b, b.stateNode = d;
4771      }
4772      S(b);
4773      return null;
4774    case 13:
4775      E(L);
4776      d = b.memoizedState;
4777      if (null === a || null !== a.memoizedState && null !== a.memoizedState.dehydrated) {
4778        if (I && null !== yg && 0 !== (b.mode & 1) && 0 === (b.flags & 128)) Hg(), Ig(), b.flags |= 98560, f2 = false;
4779        else if (f2 = Gg(b), null !== d && null !== d.dehydrated) {
4780          if (null === a) {
4781            if (!f2) throw Error(p(318));
4782            f2 = b.memoizedState;
4783            f2 = null !== f2 ? f2.dehydrated : null;
4784            if (!f2) throw Error(p(317));
4785            f2[Of] = b;
4786          } else Ig(), 0 === (b.flags & 128) && (b.memoizedState = null), b.flags |= 4;
4787          S(b);
4788          f2 = false;
4789        } else null !== zg && (Fj(zg), zg = null), f2 = true;
4790        if (!f2) return b.flags & 65536 ? b : null;
4791      }
4792      if (0 !== (b.flags & 128)) return b.lanes = c, b;
4793      d = null !== d;
4794      d !== (null !== a && null !== a.memoizedState) && d && (b.child.flags |= 8192, 0 !== (b.mode & 1) && (null === a || 0 !== (L.current & 1) ? 0 === T && (T = 3) : tj()));
4795      null !== b.updateQueue && (b.flags |= 4);
4796      S(b);
4797      return null;
4798    case 4:
4799      return zh(), Aj(a, b), null === a && sf(b.stateNode.containerInfo), S(b), null;
4800    case 10:
4801      return ah(b.type._context), S(b), null;
4802    case 17:
4803      return Zf(b.type) && $f(), S(b), null;
4804    case 19:
4805      E(L);
4806      f2 = b.memoizedState;
4807      if (null === f2) return S(b), null;
4808      d = 0 !== (b.flags & 128);
4809      g = f2.rendering;
4810      if (null === g) if (d) Dj(f2, false);
4811      else {
4812        if (0 !== T || null !== a && 0 !== (a.flags & 128)) for (a = b.child; null !== a; ) {
4813          g = Ch(a);
4814          if (null !== g) {
4815            b.flags |= 128;
4816            Dj(f2, false);
4817            d = g.updateQueue;
4818            null !== d && (b.updateQueue = d, b.flags |= 4);
4819            b.subtreeFlags = 0;
4820            d = c;
4821            for (c = b.child; null !== c; ) f2 = c, a = d, f2.flags &= 14680066, g = f2.alternate, null === g ? (f2.childLanes = 0, f2.lanes = a, f2.child = null, f2.subtreeFlags = 0, f2.memoizedProps = null, f2.memoizedState = null, f2.updateQueue = null, f2.dependencies = null, f2.stateNode = null) : (f2.childLanes = g.childLanes, f2.lanes = g.lanes, f2.child = g.child, f2.subtreeFlags = 0, f2.deletions = null, f2.memoizedProps = g.memoizedProps, f2.memoizedState = g.memoizedState, f2.updateQueue = g.updateQueue, f2.type = g.type, a = g.dependencies, f2.dependencies = null === a ? null : { lanes: a.lanes, firstContext: a.firstContext }), c = c.sibling;
4822            G(L, L.current & 1 | 2);
4823            return b.child;
4824          }
4825          a = a.sibling;
4826        }
4827        null !== f2.tail && B() > Gj && (b.flags |= 128, d = true, Dj(f2, false), b.lanes = 4194304);
4828      }
4829      else {
4830        if (!d) if (a = Ch(g), null !== a) {
4831          if (b.flags |= 128, d = true, c = a.updateQueue, null !== c && (b.updateQueue = c, b.flags |= 4), Dj(f2, true), null === f2.tail && "hidden" === f2.tailMode && !g.alternate && !I) return S(b), null;
4832        } else 2 * B() - f2.renderingStartTime > Gj && 1073741824 !== c && (b.flags |= 128, d = true, Dj(f2, false), b.lanes = 4194304);
4833        f2.isBackwards ? (g.sibling = b.child, b.child = g) : (c = f2.last, null !== c ? c.sibling = g : b.child = g, f2.last = g);
4834      }
4835      if (null !== f2.tail) return b = f2.tail, f2.rendering = b, f2.tail = b.sibling, f2.renderingStartTime = B(), b.sibling = null, c = L.current, G(L, d ? c & 1 | 2 : c & 1), b;
4836      S(b);
4837      return null;
4838    case 22:
4839    case 23:
4840      return Hj(), d = null !== b.memoizedState, null !== a && null !== a.memoizedState !== d && (b.flags |= 8192), d && 0 !== (b.mode & 1) ? 0 !== (fj & 1073741824) && (S(b), b.subtreeFlags & 6 && (b.flags |= 8192)) : S(b), null;
4841    case 24:
4842      return null;
4843    case 25:
4844      return null;
4845  }
4846  throw Error(p(156, b.tag));
4847}
4848function Ij(a, b) {
4849  wg(b);
4850  switch (b.tag) {
4851    case 1:
4852      return Zf(b.type) && $f(), a = b.flags, a & 65536 ? (b.flags = a & -65537 | 128, b) : null;
4853    case 3:
4854      return zh(), E(Wf), E(H), Eh(), a = b.flags, 0 !== (a & 65536) && 0 === (a & 128) ? (b.flags = a & -65537 | 128, b) : null;
4855    case 5:
4856      return Bh(b), null;
4857    case 13:
4858      E(L);
4859      a = b.memoizedState;
4860      if (null !== a && null !== a.dehydrated) {
4861        if (null === b.alternate) throw Error(p(340));
4862        Ig();
4863      }
4864      a = b.flags;
4865      return a & 65536 ? (b.flags = a & -65537 | 128, b) : null;
4866    case 19:
4867      return E(L), null;
4868    case 4:
4869      return zh(), null;
4870    case 10:
4871      return ah(b.type._context), null;
4872    case 22:
4873    case 23:
4874      return Hj(), null;
4875    case 24:
4876      return null;
4877    default:
4878      return null;
4879  }
4880}
4881var Jj = false, U = false, Kj = "function" === typeof WeakSet ? WeakSet : Set, V = null;
4882function Lj(a, b) {
4883  var c = a.ref;
4884  if (null !== c) if ("function" === typeof c) try {
4885    c(null);
4886  } catch (d) {
4887    W(a, b, d);
4888  }
4889  else c.current = null;
4890}
4891function Mj(a, b, c) {
4892  try {
4893    c();
4894  } catch (d) {
4895    W(a, b, d);
4896  }
4897}
4898var Nj = false;
4899function Oj(a, b) {
4900  Cf = dd;
4901  a = Me();
4902  if (Ne(a)) {
4903    if ("selectionStart" in a) var c = { start: a.selectionStart, end: a.selectionEnd };
4904    else a: {
4905      c = (c = a.ownerDocument) && c.defaultView || window;
4906      var d = c.getSelection && c.getSelection();
4907      if (d && 0 !== d.rangeCount) {
4908        c = d.anchorNode;
4909        var e = d.anchorOffset, f2 = d.focusNode;
4910        d = d.focusOffset;
4911        try {
4912          c.nodeType, f2.nodeType;
4913        } catch (F2) {
4914          c = null;
4915          break a;
4916        }
4917        var g = 0, h = -1, k2 = -1, l2 = 0, m2 = 0, q2 = a, r2 = null;
4918        b: for (; ; ) {
4919          for (var y2; ; ) {
4920            q2 !== c || 0 !== e && 3 !== q2.nodeType || (h = g + e);
4921            q2 !== f2 || 0 !== d && 3 !== q2.nodeType || (k2 = g + d);
4922            3 === q2.nodeType && (g += q2.nodeValue.length);
4923            if (null === (y2 = q2.firstChild)) break;
4924            r2 = q2;
4925            q2 = y2;
4926          }
4927          for (; ; ) {
4928            if (q2 === a) break b;
4929            r2 === c && ++l2 === e && (h = g);
4930            r2 === f2 && ++m2 === d && (k2 = g);
4931            if (null !== (y2 = q2.nextSibling)) break;
4932            q2 = r2;
4933            r2 = q2.parentNode;
4934          }
4935          q2 = y2;
4936        }
4937        c = -1 === h || -1 === k2 ? null : { start: h, end: k2 };
4938      } else c = null;
4939    }
4940    c = c || { start: 0, end: 0 };
4941  } else c = null;
4942  Df = { focusedElem: a, selectionRange: c };
4943  dd = false;
4944  for (V = b; null !== V; ) if (b = V, a = b.child, 0 !== (b.subtreeFlags & 1028) && null !== a) a.return = b, V = a;
4945  else for (; null !== V; ) {
4946    b = V;
4947    try {
4948      var n2 = b.alternate;
4949      if (0 !== (b.flags & 1024)) switch (b.tag) {
4950        case 0:
4951        case 11:
4952        case 15:
4953          break;
4954        case 1:
4955          if (null !== n2) {
4956            var t2 = n2.memoizedProps, J2 = n2.memoizedState, x2 = b.stateNode, w2 = x2.getSnapshotBeforeUpdate(b.elementType === b.type ? t2 : Ci(b.type, t2), J2);
4957            x2.__reactInternalSnapshotBeforeUpdate = w2;
4958          }
4959          break;
4960        case 3:
4961          var u2 = b.stateNode.containerInfo;
4962          1 === u2.nodeType ? u2.textContent = "" : 9 === u2.nodeType && u2.documentElement && u2.removeChild(u2.documentElement);
4963          break;
4964        case 5:
4965        case 6:
4966        case 4:
4967        case 17:
4968          break;
4969        default:
4970          throw Error(p(163));
4971      }
4972    } catch (F2) {
4973      W(b, b.return, F2);
4974    }
4975    a = b.sibling;
4976    if (null !== a) {
4977      a.return = b.return;
4978      V = a;
4979      break;
4980    }
4981    V = b.return;
4982  }
4983  n2 = Nj;
4984  Nj = false;
4985  return n2;
4986}
4987function Pj(a, b, c) {
4988  var d = b.updateQueue;
4989  d = null !== d ? d.lastEffect : null;
4990  if (null !== d) {
4991    var e = d = d.next;
4992    do {
4993      if ((e.tag & a) === a) {
4994        var f2 = e.destroy;
4995        e.destroy = void 0;
4996        void 0 !== f2 && Mj(b, c, f2);
4997      }
4998      e = e.next;
4999    } while (e !== d);
5000  }
5001}
5002function Qj(a, b) {
5003  b = b.updateQueue;
5004  b = null !== b ? b.lastEffect : null;
5005  if (null !== b) {
5006    var c = b = b.next;
5007    do {
5008      if ((c.tag & a) === a) {
5009        var d = c.create;
5010        c.destroy = d();
5011      }
5012      c = c.next;
5013    } while (c !== b);
5014  }
5015}
5016function Rj(a) {
5017  var b = a.ref;
5018  if (null !== b) {
5019    var c = a.stateNode;
5020    switch (a.tag) {
5021      case 5:
5022        a = c;
5023        break;
5024      default:
5025        a = c;
5026    }
5027    "function" === typeof b ? b(a) : b.current = a;
5028  }
5029}
5030function Sj(a) {
5031  var b = a.alternate;
5032  null !== b && (a.alternate = null, Sj(b));
5033  a.child = null;
5034  a.deletions = null;
5035  a.sibling = null;
5036  5 === a.tag && (b = a.stateNode, null !== b && (delete b[Of], delete b[Pf], delete b[of], delete b[Qf], delete b[Rf]));
5037  a.stateNode = null;
5038  a.return = null;
5039  a.dependencies = null;
5040  a.memoizedProps = null;
5041  a.memoizedState = null;
5042  a.pendingProps = null;
5043  a.stateNode = null;
5044  a.updateQueue = null;
5045}
5046function Tj(a) {
5047  return 5 === a.tag || 3 === a.tag || 4 === a.tag;
5048}
5049function Uj(a) {
5050  a: for (; ; ) {
5051    for (; null === a.sibling; ) {
5052      if (null === a.return || Tj(a.return)) return null;
5053      a = a.return;
5054    }
5055    a.sibling.return = a.return;
5056    for (a = a.sibling; 5 !== a.tag && 6 !== a.tag && 18 !== a.tag; ) {
5057      if (a.flags & 2) continue a;
5058      if (null === a.child || 4 === a.tag) continue a;
5059      else a.child.return = a, a = a.child;
5060    }
5061    if (!(a.flags & 2)) return a.stateNode;
5062  }
5063}
5064function Vj(a, b, c) {
5065  var d = a.tag;
5066  if (5 === d || 6 === d) a = a.stateNode, b ? 8 === c.nodeType ? c.parentNode.insertBefore(a, b) : c.insertBefore(a, b) : (8 === c.nodeType ? (b = c.parentNode, b.insertBefore(a, c)) : (b = c, b.appendChild(a)), c = c._reactRootContainer, null !== c && void 0 !== c || null !== b.onclick || (b.onclick = Bf));
5067  else if (4 !== d && (a = a.child, null !== a)) for (Vj(a, b, c), a = a.sibling; null !== a; ) Vj(a, b, c), a = a.sibling;
5068}
5069function Wj(a, b, c) {
5070  var d = a.tag;
5071  if (5 === d || 6 === d) a = a.stateNode, b ? c.insertBefore(a, b) : c.appendChild(a);
5072  else if (4 !== d && (a = a.child, null !== a)) for (Wj(a, b, c), a = a.sibling; null !== a; ) Wj(a, b, c), a = a.sibling;
5073}
5074var X$1 = null, Xj = false;
5075function Yj(a, b, c) {
5076  for (c = c.child; null !== c; ) Zj(a, b, c), c = c.sibling;
5077}
5078function Zj(a, b, c) {
5079  if (lc && "function" === typeof lc.onCommitFiberUnmount) try {
5080    lc.onCommitFiberUnmount(kc, c);
5081  } catch (h) {
5082  }
5083  switch (c.tag) {
5084    case 5:
5085      U || Lj(c, b);
5086    case 6:
5087      var d = X$1, e = Xj;
5088      X$1 = null;
5089      Yj(a, b, c);
5090      X$1 = d;
5091      Xj = e;
5092      null !== X$1 && (Xj ? (a = X$1, c = c.stateNode, 8 === a.nodeType ? a.parentNode.removeChild(c) : a.removeChild(c)) : X$1.removeChild(c.stateNode));
5093      break;
5094    case 18:
5095      null !== X$1 && (Xj ? (a = X$1, c = c.stateNode, 8 === a.nodeType ? Kf(a.parentNode, c) : 1 === a.nodeType && Kf(a, c), bd(a)) : Kf(X$1, c.stateNode));
5096      break;
5097    case 4:
5098      d = X$1;
5099      e = Xj;
5100      X$1 = c.stateNode.containerInfo;
5101      Xj = true;
5102      Yj(a, b, c);
5103      X$1 = d;
5104      Xj = e;
5105      break;
5106    case 0:
5107    case 11:
5108    case 14:
5109    case 15:
5110      if (!U && (d = c.updateQueue, null !== d && (d = d.lastEffect, null !== d))) {
5111        e = d = d.next;
5112        do {
5113          var f2 = e, g = f2.destroy;
5114          f2 = f2.tag;
5115          void 0 !== g && (0 !== (f2 & 2) ? Mj(c, b, g) : 0 !== (f2 & 4) && Mj(c, b, g));
5116          e = e.next;
5117        } while (e !== d);
5118      }
5119      Yj(a, b, c);
5120      break;
5121    case 1:
5122      if (!U && (Lj(c, b), d = c.stateNode, "function" === typeof d.componentWillUnmount)) try {
5123        d.props = c.memoizedProps, d.state = c.memoizedState, d.componentWillUnmount();
5124      } catch (h) {
5125        W(c, b, h);
5126      }
5127      Yj(a, b, c);
5128      break;
5129    case 21:
5130      Yj(a, b, c);
5131      break;
5132    case 22:
5133      c.mode & 1 ? (U = (d = U) || null !== c.memoizedState, Yj(a, b, c), U = d) : Yj(a, b, c);
5134      break;
5135    default:
5136      Yj(a, b, c);
5137  }
5138}
5139function ak(a) {
5140  var b = a.updateQueue;
5141  if (null !== b) {
5142    a.updateQueue = null;
5143    var c = a.stateNode;
5144    null === c && (c = a.stateNode = new Kj());
5145    b.forEach(function(b2) {
5146      var d = bk.bind(null, a, b2);
5147      c.has(b2) || (c.add(b2), b2.then(d, d));
5148    });
5149  }
5150}
5151function ck(a, b) {
5152  var c = b.deletions;
5153  if (null !== c) for (var d = 0; d < c.length; d++) {
5154    var e = c[d];
5155    try {
5156      var f2 = a, g = b, h = g;
5157      a: for (; null !== h; ) {
5158        switch (h.tag) {
5159          case 5:
5160            X$1 = h.stateNode;
5161            Xj = false;
5162            break a;
5163          case 3:
5164            X$1 = h.stateNode.containerInfo;
5165            Xj = true;
5166            break a;
5167          case 4:
5168            X$1 = h.stateNode.containerInfo;
5169            Xj = true;
5170            break a;
5171        }
5172        h = h.return;
5173      }
5174      if (null === X$1) throw Error(p(160));
5175      Zj(f2, g, e);
5176      X$1 = null;
5177      Xj = false;
5178      var k2 = e.alternate;
5179      null !== k2 && (k2.return = null);
5180      e.return = null;
5181    } catch (l2) {
5182      W(e, b, l2);
5183    }
5184  }
5185  if (b.subtreeFlags & 12854) for (b = b.child; null !== b; ) dk(b, a), b = b.sibling;
5186}
5187function dk(a, b) {
5188  var c = a.alternate, d = a.flags;
5189  switch (a.tag) {
5190    case 0:
5191    case 11:
5192    case 14:
5193    case 15:
5194      ck(b, a);
5195      ek(a);
5196      if (d & 4) {
5197        try {
5198          Pj(3, a, a.return), Qj(3, a);
5199        } catch (t2) {
5200          W(a, a.return, t2);
5201        }
5202        try {
5203          Pj(5, a, a.return);
5204        } catch (t2) {
5205          W(a, a.return, t2);
5206        }
5207      }
5208      break;
5209    case 1:
5210      ck(b, a);
5211      ek(a);
5212      d & 512 && null !== c && Lj(c, c.return);
5213      break;
5214    case 5:
5215      ck(b, a);
5216      ek(a);
5217      d & 512 && null !== c && Lj(c, c.return);
5218      if (a.flags & 32) {
5219        var e = a.stateNode;
5220        try {
5221          ob(e, "");
5222        } catch (t2) {
5223          W(a, a.return, t2);
5224        }
5225      }
5226      if (d & 4 && (e = a.stateNode, null != e)) {
5227        var f2 = a.memoizedProps, g = null !== c ? c.memoizedProps : f2, h = a.type, k2 = a.updateQueue;
5228        a.updateQueue = null;
5229        if (null !== k2) try {
5230          "input" === h && "radio" === f2.type && null != f2.name && ab(e, f2);
5231          vb(h, g);
5232          var l2 = vb(h, f2);
5233          for (g = 0; g < k2.length; g += 2) {
5234            var m2 = k2[g], q2 = k2[g + 1];
5235            "style" === m2 ? sb(e, q2) : "dangerouslySetInnerHTML" === m2 ? nb(e, q2) : "children" === m2 ? ob(e, q2) : ta(e, m2, q2, l2);
5236          }
5237          switch (h) {
5238            case "input":
5239              bb(e, f2);
5240              break;
5241            case "textarea":
5242              ib(e, f2);
5243              break;
5244            case "select":
5245              var r2 = e._wrapperState.wasMultiple;
5246              e._wrapperState.wasMultiple = !!f2.multiple;
5247              var y2 = f2.value;
5248              null != y2 ? fb(e, !!f2.multiple, y2, false) : r2 !== !!f2.multiple && (null != f2.defaultValue ? fb(
5249                e,
5250                !!f2.multiple,
5251                f2.defaultValue,
5252                true
5253              ) : fb(e, !!f2.multiple, f2.multiple ? [] : "", false));
5254          }
5255          e[Pf] = f2;
5256        } catch (t2) {
5257          W(a, a.return, t2);
5258        }
5259      }
5260      break;
5261    case 6:
5262      ck(b, a);
5263      ek(a);
5264      if (d & 4) {
5265        if (null === a.stateNode) throw Error(p(162));
5266        e = a.stateNode;
5267        f2 = a.memoizedProps;
5268        try {
5269          e.nodeValue = f2;
5270        } catch (t2) {
5271          W(a, a.return, t2);
5272        }
5273      }
5274      break;
5275    case 3:
5276      ck(b, a);
5277      ek(a);
5278      if (d & 4 && null !== c && c.memoizedState.isDehydrated) try {
5279        bd(b.containerInfo);
5280      } catch (t2) {
5281        W(a, a.return, t2);
5282      }
5283      break;
5284    case 4:
5285      ck(b, a);
5286      ek(a);
5287      break;
5288    case 13:
5289      ck(b, a);
5290      ek(a);
5291      e = a.child;
5292      e.flags & 8192 && (f2 = null !== e.memoizedState, e.stateNode.isHidden = f2, !f2 || null !== e.alternate && null !== e.alternate.memoizedState || (fk = B()));
5293      d & 4 && ak(a);
5294      break;
5295    case 22:
5296      m2 = null !== c && null !== c.memoizedState;
5297      a.mode & 1 ? (U = (l2 = U) || m2, ck(b, a), U = l2) : ck(b, a);
5298      ek(a);
5299      if (d & 8192) {
5300        l2 = null !== a.memoizedState;
5301        if ((a.stateNode.isHidden = l2) && !m2 && 0 !== (a.mode & 1)) for (V = a, m2 = a.child; null !== m2; ) {
5302          for (q2 = V = m2; null !== V; ) {
5303            r2 = V;
5304            y2 = r2.child;
5305            switch (r2.tag) {
5306              case 0:
5307              case 11:
5308              case 14:
5309              case 15:
5310                Pj(4, r2, r2.return);
5311                break;
5312              case 1:
5313                Lj(r2, r2.return);
5314                var n2 = r2.stateNode;
5315                if ("function" === typeof n2.componentWillUnmount) {
5316                  d = r2;
5317                  c = r2.return;
5318                  try {
5319                    b = d, n2.props = b.memoizedProps, n2.state = b.memoizedState, n2.componentWillUnmount();
5320                  } catch (t2) {
5321                    W(d, c, t2);
5322                  }
5323                }
5324                break;
5325              case 5:
5326                Lj(r2, r2.return);
5327                break;
5328              case 22:
5329                if (null !== r2.memoizedState) {
5330                  gk(q2);
5331                  continue;
5332                }
5333            }
5334            null !== y2 ? (y2.return = r2, V = y2) : gk(q2);
5335          }
5336          m2 = m2.sibling;
5337        }
5338        a: for (m2 = null, q2 = a; ; ) {
5339          if (5 === q2.tag) {
5340            if (null === m2) {
5341              m2 = q2;
5342              try {
5343                e = q2.stateNode, l2 ? (f2 = e.style, "function" === typeof f2.setProperty ? f2.setProperty("display", "none", "important") : f2.display = "none") : (h = q2.stateNode, k2 = q2.memoizedProps.style, g = void 0 !== k2 && null !== k2 && k2.hasOwnProperty("display") ? k2.display : null, h.style.display = rb("display", g));
5344              } catch (t2) {
5345                W(a, a.return, t2);
5346              }
5347            }
5348          } else if (6 === q2.tag) {
5349            if (null === m2) try {
5350              q2.stateNode.nodeValue = l2 ? "" : q2.memoizedProps;
5351            } catch (t2) {
5352              W(a, a.return, t2);
5353            }
5354          } else if ((22 !== q2.tag && 23 !== q2.tag || null === q2.memoizedState || q2 === a) && null !== q2.child) {
5355            q2.child.return = q2;
5356            q2 = q2.child;
5357            continue;
5358          }
5359          if (q2 === a) break a;
5360          for (; null === q2.sibling; ) {
5361            if (null === q2.return || q2.return === a) break a;
5362            m2 === q2 && (m2 = null);
5363            q2 = q2.return;
5364          }
5365          m2 === q2 && (m2 = null);
5366          q2.sibling.return = q2.return;
5367          q2 = q2.sibling;
5368        }
5369      }
5370      break;
5371    case 19:
5372      ck(b, a);
5373      ek(a);
5374      d & 4 && ak(a);
5375      break;
5376    case 21:
5377      break;
5378    default:
5379      ck(
5380        b,
5381        a
5382      ), ek(a);
5383  }
5384}
5385function ek(a) {
5386  var b = a.flags;
5387  if (b & 2) {
5388    try {
5389      a: {
5390        for (var c = a.return; null !== c; ) {
5391          if (Tj(c)) {
5392            var d = c;
5393            break a;
5394          }
5395          c = c.return;
5396        }
5397        throw Error(p(160));
5398      }
5399      switch (d.tag) {
5400        case 5:
5401          var e = d.stateNode;
5402          d.flags & 32 && (ob(e, ""), d.flags &= -33);
5403          var f2 = Uj(a);
5404          Wj(a, f2, e);
5405          break;
5406        case 3:
5407        case 4:
5408          var g = d.stateNode.containerInfo, h = Uj(a);
5409          Vj(a, h, g);
5410          break;
5411        default:
5412          throw Error(p(161));
5413      }
5414    } catch (k2) {
5415      W(a, a.return, k2);
5416    }
5417    a.flags &= -3;
5418  }
5419  b & 4096 && (a.flags &= -4097);
5420}
5421function hk(a, b, c) {
5422  V = a;
5423  ik(a);
5424}
5425function ik(a, b, c) {
5426  for (var d = 0 !== (a.mode & 1); null !== V; ) {
5427    var e = V, f2 = e.child;
5428    if (22 === e.tag && d) {
5429      var g = null !== e.memoizedState || Jj;
5430      if (!g) {
5431        var h = e.alternate, k2 = null !== h && null !== h.memoizedState || U;
5432        h = Jj;
5433        var l2 = U;
5434        Jj = g;
5435        if ((U = k2) && !l2) for (V = e; null !== V; ) g = V, k2 = g.child, 22 === g.tag && null !== g.memoizedState ? jk(e) : null !== k2 ? (k2.return = g, V = k2) : jk(e);
5436        for (; null !== f2; ) V = f2, ik(f2), f2 = f2.sibling;
5437        V = e;
5438        Jj = h;
5439        U = l2;
5440      }
5441      kk(a);
5442    } else 0 !== (e.subtreeFlags & 8772) && null !== f2 ? (f2.return = e, V = f2) : kk(a);
5443  }
5444}
5445function kk(a) {
5446  for (; null !== V; ) {
5447    var b = V;
5448    if (0 !== (b.flags & 8772)) {
5449      var c = b.alternate;
5450      try {
5451        if (0 !== (b.flags & 8772)) switch (b.tag) {
5452          case 0:
5453          case 11:
5454          case 15:
5455            U || Qj(5, b);
5456            break;
5457          case 1:
5458            var d = b.stateNode;
5459            if (b.flags & 4 && !U) if (null === c) d.componentDidMount();
5460            else {
5461              var e = b.elementType === b.type ? c.memoizedProps : Ci(b.type, c.memoizedProps);
5462              d.componentDidUpdate(e, c.memoizedState, d.__reactInternalSnapshotBeforeUpdate);
5463            }
5464            var f2 = b.updateQueue;
5465            null !== f2 && sh(b, f2, d);
5466            break;
5467          case 3:
5468            var g = b.updateQueue;
5469            if (null !== g) {
5470              c = null;
5471              if (null !== b.child) switch (b.child.tag) {
5472                case 5:
5473                  c = b.child.stateNode;
5474                  break;
5475                case 1:
5476                  c = b.child.stateNode;
5477              }
5478              sh(b, g, c);
5479            }
5480            break;
5481          case 5:
5482            var h = b.stateNode;
5483            if (null === c && b.flags & 4) {
5484              c = h;
5485              var k2 = b.memoizedProps;
5486              switch (b.type) {
5487                case "button":
5488                case "input":
5489                case "select":
5490                case "textarea":
5491                  k2.autoFocus && c.focus();
5492                  break;
5493                case "img":
5494                  k2.src && (c.src = k2.src);
5495              }
5496            }
5497            break;
5498          case 6:
5499            break;
5500          case 4:
5501            break;
5502          case 12:
5503            break;
5504          case 13:
5505            if (null === b.memoizedState) {
5506              var l2 = b.alternate;
5507              if (null !== l2) {
5508                var m2 = l2.memoizedState;
5509                if (null !== m2) {
5510                  var q2 = m2.dehydrated;
5511                  null !== q2 && bd(q2);
5512                }
5513              }
5514            }
5515            break;
5516          case 19:
5517          case 17:
5518          case 21:
5519          case 22:
5520          case 23:
5521          case 25:
5522            break;
5523          default:
5524            throw Error(p(163));
5525        }
5526        U || b.flags & 512 && Rj(b);
5527      } catch (r2) {
5528        W(b, b.return, r2);
5529      }
5530    }
5531    if (b === a) {
5532      V = null;
5533      break;
5534    }
5535    c = b.sibling;
5536    if (null !== c) {
5537      c.return = b.return;
5538      V = c;
5539      break;
5540    }
5541    V = b.return;
5542  }
5543}
5544function gk(a) {
5545  for (; null !== V; ) {
5546    var b = V;
5547    if (b === a) {
5548      V = null;
5549      break;
5550    }
5551    var c = b.sibling;
5552    if (null !== c) {
5553      c.return = b.return;
5554      V = c;
5555      break;
5556    }
5557    V = b.return;
5558  }
5559}
5560function jk(a) {
5561  for (; null !== V; ) {
5562    var b = V;
5563    try {
5564      switch (b.tag) {
5565        case 0:
5566        case 11:
5567        case 15:
5568          var c = b.return;
5569          try {
5570            Qj(4, b);
5571          } catch (k2) {
5572            W(b, c, k2);
5573          }
5574          break;
5575        case 1:
5576          var d = b.stateNode;
5577          if ("function" === typeof d.componentDidMount) {
5578            var e = b.return;
5579            try {
5580              d.componentDidMount();
5581            } catch (k2) {
5582              W(b, e, k2);
5583            }
5584          }
5585          var f2 = b.return;
5586          try {
5587            Rj(b);
5588          } catch (k2) {
5589            W(b, f2, k2);
5590          }
5591          break;
5592        case 5:
5593          var g = b.return;
5594          try {
5595            Rj(b);
5596          } catch (k2) {
5597            W(b, g, k2);
5598          }
5599      }
5600    } catch (k2) {
5601      W(b, b.return, k2);
5602    }
5603    if (b === a) {
5604      V = null;
5605      break;
5606    }
5607    var h = b.sibling;
5608    if (null !== h) {
5609      h.return = b.return;
5610      V = h;
5611      break;
5612    }
5613    V = b.return;
5614  }
5615}
5616var lk = Math.ceil, mk = ua.ReactCurrentDispatcher, nk = ua.ReactCurrentOwner, ok = ua.ReactCurrentBatchConfig, K = 0, Q = null, Y = null, Z = 0, fj = 0, ej = Uf(0), T = 0, pk = null, rh = 0, qk = 0, rk = 0, sk = null, tk = null, fk = 0, Gj = Infinity, uk = null, Oi = false, Pi = null, Ri = null, vk = false, wk = null, xk = 0, yk = 0, zk = null, Ak = -1, Bk = 0;
5617function R() {
5618  return 0 !== (K & 6) ? B() : -1 !== Ak ? Ak : Ak = B();
5619}
5620function yi(a) {
5621  if (0 === (a.mode & 1)) return 1;
5622  if (0 !== (K & 2) && 0 !== Z) return Z & -Z;
5623  if (null !== Kg.transition) return 0 === Bk && (Bk = yc()), Bk;
5624  a = C;
5625  if (0 !== a) return a;
5626  a = window.event;
5627  a = void 0 === a ? 16 : jd(a.type);
5628  return a;
5629}
5630function gi(a, b, c, d) {
5631  if (50 < yk) throw yk = 0, zk = null, Error(p(185));
5632  Ac(a, c, d);
5633  if (0 === (K & 2) || a !== Q) a === Q && (0 === (K & 2) && (qk |= c), 4 === T && Ck(a, Z)), Dk(a, d), 1 === c && 0 === K && 0 === (b.mode & 1) && (Gj = B() + 500, fg && jg());
5634}
5635function Dk(a, b) {
5636  var c = a.callbackNode;
5637  wc(a, b);
5638  var d = uc(a, a === Q ? Z : 0);
5639  if (0 === d) null !== c && bc(c), a.callbackNode = null, a.callbackPriority = 0;
5640  else if (b = d & -d, a.callbackPriority !== b) {
5641    null != c && bc(c);
5642    if (1 === b) 0 === a.tag ? ig(Ek.bind(null, a)) : hg(Ek.bind(null, a)), Jf(function() {
5643      0 === (K & 6) && jg();
5644    }), c = null;
5645    else {
5646      switch (Dc(d)) {
5647        case 1:
5648          c = fc;
5649          break;
5650        case 4:
5651          c = gc;
5652          break;
5653        case 16:
5654          c = hc;
5655          break;
5656        case 536870912:
5657          c = jc;
5658          break;
5659        default:
5660          c = hc;
5661      }
5662      c = Fk(c, Gk.bind(null, a));
5663    }
5664    a.callbackPriority = b;
5665    a.callbackNode = c;
5666  }
5667}
5668function Gk(a, b) {
5669  Ak = -1;
5670  Bk = 0;
5671  if (0 !== (K & 6)) throw Error(p(327));
5672  var c = a.callbackNode;
5673  if (Hk() && a.callbackNode !== c) return null;
5674  var d = uc(a, a === Q ? Z : 0);
5675  if (0 === d) return null;
5676  if (0 !== (d & 30) || 0 !== (d & a.expiredLanes) || b) b = Ik(a, d);
5677  else {
5678    b = d;
5679    var e = K;
5680    K |= 2;
5681    var f2 = Jk();
5682    if (Q !== a || Z !== b) uk = null, Gj = B() + 500, Kk(a, b);
5683    do
5684      try {
5685        Lk();
5686        break;
5687      } catch (h) {
5688        Mk(a, h);
5689      }
5690    while (1);
5691    $g();
5692    mk.current = f2;
5693    K = e;
5694    null !== Y ? b = 0 : (Q = null, Z = 0, b = T);
5695  }
5696  if (0 !== b) {
5697    2 === b && (e = xc(a), 0 !== e && (d = e, b = Nk(a, e)));
5698    if (1 === b) throw c = pk, Kk(a, 0), Ck(a, d), Dk(a, B()), c;
5699    if (6 === b) Ck(a, d);
5700    else {
5701      e = a.current.alternate;
5702      if (0 === (d & 30) && !Ok(e) && (b = Ik(a, d), 2 === b && (f2 = xc(a), 0 !== f2 && (d = f2, b = Nk(a, f2))), 1 === b)) throw c = pk, Kk(a, 0), Ck(a, d), Dk(a, B()), c;
5703      a.finishedWork = e;
5704      a.finishedLanes = d;
5705      switch (b) {
5706        case 0:
5707        case 1:
5708          throw Error(p(345));
5709        case 2:
5710          Pk(a, tk, uk);
5711          break;
5712        case 3:
5713          Ck(a, d);
5714          if ((d & 130023424) === d && (b = fk + 500 - B(), 10 < b)) {
5715            if (0 !== uc(a, 0)) break;
5716            e = a.suspendedLanes;
5717            if ((e & d) !== d) {
5718              R();
5719              a.pingedLanes |= a.suspendedLanes & e;
5720              break;
5721            }
5722            a.timeoutHandle = Ff(Pk.bind(null, a, tk, uk), b);
5723            break;
5724          }
5725          Pk(a, tk, uk);
5726          break;
5727        case 4:
5728          Ck(a, d);
5729          if ((d & 4194240) === d) break;
5730          b = a.eventTimes;
5731          for (e = -1; 0 < d; ) {
5732            var g = 31 - oc(d);
5733            f2 = 1 << g;
5734            g = b[g];
5735            g > e && (e = g);
5736            d &= ~f2;
5737          }
5738          d = e;
5739          d = B() - d;
5740          d = (120 > d ? 120 : 480 > d ? 480 : 1080 > d ? 1080 : 1920 > d ? 1920 : 3e3 > d ? 3e3 : 4320 > d ? 4320 : 1960 * lk(d / 1960)) - d;
5741          if (10 < d) {
5742            a.timeoutHandle = Ff(Pk.bind(null, a, tk, uk), d);
5743            break;
5744          }
5745          Pk(a, tk, uk);
5746          break;
5747        case 5:
5748          Pk(a, tk, uk);
5749          break;
5750        default:
5751          throw Error(p(329));
5752      }
5753    }
5754  }
5755  Dk(a, B());
5756  return a.callbackNode === c ? Gk.bind(null, a) : null;
5757}
5758function Nk(a, b) {
5759  var c = sk;
5760  a.current.memoizedState.isDehydrated && (Kk(a, b).flags |= 256);
5761  a = Ik(a, b);
5762  2 !== a && (b = tk, tk = c, null !== b && Fj(b));
5763  return a;
5764}
5765function Fj(a) {
5766  null === tk ? tk = a : tk.push.apply(tk, a);
5767}
5768function Ok(a) {
5769  for (var b = a; ; ) {
5770    if (b.flags & 16384) {
5771      var c = b.updateQueue;
5772      if (null !== c && (c = c.stores, null !== c)) for (var d = 0; d < c.length; d++) {
5773        var e = c[d], f2 = e.getSnapshot;
5774        e = e.value;
5775        try {
5776          if (!He(f2(), e)) return false;
5777        } catch (g) {
5778          return false;
5779        }
5780      }
5781    }
5782    c = b.child;
5783    if (b.subtreeFlags & 16384 && null !== c) c.return = b, b = c;
5784    else {
5785      if (b === a) break;
5786      for (; null === b.sibling; ) {
5787        if (null === b.return || b.return === a) return true;
5788        b = b.return;
5789      }
5790      b.sibling.return = b.return;
5791      b = b.sibling;
5792    }
5793  }
5794  return true;
5795}
5796function Ck(a, b) {
5797  b &= ~rk;
5798  b &= ~qk;
5799  a.suspendedLanes |= b;
5800  a.pingedLanes &= ~b;
5801  for (a = a.expirationTimes; 0 < b; ) {
5802    var c = 31 - oc(b), d = 1 << c;
5803    a[c] = -1;
5804    b &= ~d;
5805  }
5806}
5807function Ek(a) {
5808  if (0 !== (K & 6)) throw Error(p(327));
5809  Hk();
5810  var b = uc(a, 0);
5811  if (0 === (b & 1)) return Dk(a, B()), null;
5812  var c = Ik(a, b);
5813  if (0 !== a.tag && 2 === c) {
5814    var d = xc(a);
5815    0 !== d && (b = d, c = Nk(a, d));
5816  }
5817  if (1 === c) throw c = pk, Kk(a, 0), Ck(a, b), Dk(a, B()), c;
5818  if (6 === c) throw Error(p(345));
5819  a.finishedWork = a.current.alternate;
5820  a.finishedLanes = b;
5821  Pk(a, tk, uk);
5822  Dk(a, B());
5823  return null;
5824}
5825function Qk(a, b) {
5826  var c = K;
5827  K |= 1;
5828  try {
5829    return a(b);
5830  } finally {
5831    K = c, 0 === K && (Gj = B() + 500, fg && jg());
5832  }
5833}
5834function Rk(a) {
5835  null !== wk && 0 === wk.tag && 0 === (K & 6) && Hk();
5836  var b = K;
5837  K |= 1;
5838  var c = ok.transition, d = C;
5839  try {
5840    if (ok.transition = null, C = 1, a) return a();
5841  } finally {
5842    C = d, ok.transition = c, K = b, 0 === (K & 6) && jg();
5843  }
5844}
5845function Hj() {
5846  fj = ej.current;
5847  E(ej);
5848}
5849function Kk(a, b) {
5850  a.finishedWork = null;
5851  a.finishedLanes = 0;
5852  var c = a.timeoutHandle;
5853  -1 !== c && (a.timeoutHandle = -1, Gf(c));
5854  if (null !== Y) for (c = Y.return; null !== c; ) {
5855    var d = c;
5856    wg(d);
5857    switch (d.tag) {
5858      case 1:
5859        d = d.type.childContextTypes;
5860        null !== d && void 0 !== d && $f();
5861        break;
5862      case 3:
5863        zh();
5864        E(Wf);
5865        E(H);
5866        Eh();
5867        break;
5868      case 5:
5869        Bh(d);
5870        break;
5871      case 4:
5872        zh();
5873        break;
5874      case 13:
5875        E(L);
5876        break;
5877      case 19:
5878        E(L);
5879        break;
5880      case 10:
5881        ah(d.type._context);
5882        break;
5883      case 22:
5884      case 23:
5885        Hj();
5886    }
5887    c = c.return;
5888  }
5889  Q = a;
5890  Y = a = Pg(a.current, null);
5891  Z = fj = b;
5892  T = 0;
5893  pk = null;
5894  rk = qk = rh = 0;
5895  tk = sk = null;
5896  if (null !== fh) {
5897    for (b = 0; b < fh.length; b++) if (c = fh[b], d = c.interleaved, null !== d) {
5898      c.interleaved = null;
5899      var e = d.next, f2 = c.pending;
5900      if (null !== f2) {
5901        var g = f2.next;
5902        f2.next = e;
5903        d.next = g;
5904      }
5905      c.pending = d;
5906    }
5907    fh = null;
5908  }
5909  return a;
5910}
5911function Mk(a, b) {
5912  do {
5913    var c = Y;
5914    try {
5915      $g();
5916      Fh.current = Rh;
5917      if (Ih) {
5918        for (var d = M.memoizedState; null !== d; ) {
5919          var e = d.queue;
5920          null !== e && (e.pending = null);
5921          d = d.next;
5922        }
5923        Ih = false;
5924      }
5925      Hh = 0;
5926      O = N = M = null;
5927      Jh = false;
5928      Kh = 0;
5929      nk.current = null;
5930      if (null === c || null === c.return) {
5931        T = 1;
5932        pk = b;
5933        Y = null;
5934        break;
5935      }
5936      a: {
5937        var f2 = a, g = c.return, h = c, k2 = b;
5938        b = Z;
5939        h.flags |= 32768;
5940        if (null !== k2 && "object" === typeof k2 && "function" === typeof k2.then) {
5941          var l2 = k2, m2 = h, q2 = m2.tag;
5942          if (0 === (m2.mode & 1) && (0 === q2 || 11 === q2 || 15 === q2)) {
5943            var r2 = m2.alternate;
5944            r2 ? (m2.updateQueue = r2.updateQueue, m2.memoizedState = r2.memoizedState, m2.lanes = r2.lanes) : (m2.updateQueue = null, m2.memoizedState = null);
5945          }
5946          var y2 = Ui(g);
5947          if (null !== y2) {
5948            y2.flags &= -257;
5949            Vi(y2, g, h, f2, b);
5950            y2.mode & 1 && Si(f2, l2, b);
5951            b = y2;
5952            k2 = l2;
5953            var n2 = b.updateQueue;
5954            if (null === n2) {
5955              var t2 = /* @__PURE__ */ new Set();
5956              t2.add(k2);
5957              b.updateQueue = t2;
5958            } else n2.add(k2);
5959            break a;
5960          } else {
5961            if (0 === (b & 1)) {
5962              Si(f2, l2, b);
5963              tj();
5964              break a;
5965            }
5966            k2 = Error(p(426));
5967          }
5968        } else if (I && h.mode & 1) {
5969          var J2 = Ui(g);
5970          if (null !== J2) {
5971            0 === (J2.flags & 65536) && (J2.flags |= 256);
5972            Vi(J2, g, h, f2, b);
5973            Jg(Ji(k2, h));
5974            break a;
5975          }
5976        }
5977        f2 = k2 = Ji(k2, h);
5978        4 !== T && (T = 2);
5979        null === sk ? sk = [f2] : sk.push(f2);
5980        f2 = g;
5981        do {
5982          switch (f2.tag) {
5983            case 3:
5984              f2.flags |= 65536;
5985              b &= -b;
5986              f2.lanes |= b;
5987              var x2 = Ni(f2, k2, b);
5988              ph(f2, x2);
5989              break a;
5990            case 1:
5991              h = k2;
5992              var w2 = f2.type, u2 = f2.stateNode;
5993              if (0 === (f2.flags & 128) && ("function" === typeof w2.getDerivedStateFromError || null !== u2 && "function" === typeof u2.componentDidCatch && (null === Ri || !Ri.has(u2)))) {
5994                f2.flags |= 65536;
5995                b &= -b;
5996                f2.lanes |= b;
5997                var F2 = Qi(f2, h, b);
5998                ph(f2, F2);
5999                break a;
6000              }
6001          }
6002          f2 = f2.return;
6003        } while (null !== f2);
6004      }
6005      Sk(c);
6006    } catch (na) {
6007      b = na;
6008      Y === c && null !== c && (Y = c = c.return);
6009      continue;
6010    }
6011    break;
6012  } while (1);
6013}
6014function Jk() {
6015  var a = mk.current;
6016  mk.current = Rh;
6017  return null === a ? Rh : a;
6018}
6019function tj() {
6020  if (0 === T || 3 === T || 2 === T) T = 4;
6021  null === Q || 0 === (rh & 268435455) && 0 === (qk & 268435455) || Ck(Q, Z);
6022}
6023function Ik(a, b) {
6024  var c = K;
6025  K |= 2;
6026  var d = Jk();
6027  if (Q !== a || Z !== b) uk = null, Kk(a, b);
6028  do
6029    try {
6030      Tk();
6031      break;
6032    } catch (e) {
6033      Mk(a, e);
6034    }
6035  while (1);
6036  $g();
6037  K = c;
6038  mk.current = d;
6039  if (null !== Y) throw Error(p(261));
6040  Q = null;
6041  Z = 0;
6042  return T;
6043}
6044function Tk() {
6045  for (; null !== Y; ) Uk(Y);
6046}
6047function Lk() {
6048  for (; null !== Y && !cc(); ) Uk(Y);
6049}
6050function Uk(a) {
6051  var b = Vk(a.alternate, a, fj);
6052  a.memoizedProps = a.pendingProps;
6053  null === b ? Sk(a) : Y = b;
6054  nk.current = null;
6055}
6056function Sk(a) {
6057  var b = a;
6058  do {
6059    var c = b.alternate;
6060    a = b.return;
6061    if (0 === (b.flags & 32768)) {
6062      if (c = Ej(c, b, fj), null !== c) {
6063        Y = c;
6064        return;
6065      }
6066    } else {
6067      c = Ij(c, b);
6068      if (null !== c) {
6069        c.flags &= 32767;
6070        Y = c;
6071        return;
6072      }
6073      if (null !== a) a.flags |= 32768, a.subtreeFlags = 0, a.deletions = null;
6074      else {
6075        T = 6;
6076        Y = null;
6077        return;
6078      }
6079    }
6080    b = b.sibling;
6081    if (null !== b) {
6082      Y = b;
6083      return;
6084    }
6085    Y = b = a;
6086  } while (null !== b);
6087  0 === T && (T = 5);
6088}
6089function Pk(a, b, c) {
6090  var d = C, e = ok.transition;
6091  try {
6092    ok.transition = null, C = 1, Wk(a, b, c, d);
6093  } finally {
6094    ok.transition = e, C = d;
6095  }
6096  return null;
6097}
6098function Wk(a, b, c, d) {
6099  do
6100    Hk();
6101  while (null !== wk);
6102  if (0 !== (K & 6)) throw Error(p(327));
6103  c = a.finishedWork;
6104  var e = a.finishedLanes;
6105  if (null === c) return null;
6106  a.finishedWork = null;
6107  a.finishedLanes = 0;
6108  if (c === a.current) throw Error(p(177));
6109  a.callbackNode = null;
6110  a.callbackPriority = 0;
6111  var f2 = c.lanes | c.childLanes;
6112  Bc(a, f2);
6113  a === Q && (Y = Q = null, Z = 0);
6114  0 === (c.subtreeFlags & 2064) && 0 === (c.flags & 2064) || vk || (vk = true, Fk(hc, function() {
6115    Hk();
6116    return null;
6117  }));
6118  f2 = 0 !== (c.flags & 15990);
6119  if (0 !== (c.subtreeFlags & 15990) || f2) {
6120    f2 = ok.transition;
6121    ok.transition = null;
6122    var g = C;
6123    C = 1;
6124    var h = K;
6125    K |= 4;
6126    nk.current = null;
6127    Oj(a, c);
6128    dk(c, a);
6129    Oe(Df);
6130    dd = !!Cf;
6131    Df = Cf = null;
6132    a.current = c;
6133    hk(c);
6134    dc();
6135    K = h;
6136    C = g;
6137    ok.transition = f2;
6138  } else a.current = c;
6139  vk && (vk = false, wk = a, xk = e);
6140  f2 = a.pendingLanes;
6141  0 === f2 && (Ri = null);
6142  mc(c.stateNode);
6143  Dk(a, B());
6144  if (null !== b) for (d = a.onRecoverableError, c = 0; c < b.length; c++) e = b[c], d(e.value, { componentStack: e.stack, digest: e.digest });
6145  if (Oi) throw Oi = false, a = Pi, Pi = null, a;
6146  0 !== (xk & 1) && 0 !== a.tag && Hk();
6147  f2 = a.pendingLanes;
6148  0 !== (f2 & 1) ? a === zk ? yk++ : (yk = 0, zk = a) : yk = 0;
6149  jg();
6150  return null;
6151}
6152function Hk() {
6153  if (null !== wk) {
6154    var a = Dc(xk), b = ok.transition, c = C;
6155    try {
6156      ok.transition = null;
6157      C = 16 > a ? 16 : a;
6158      if (null === wk) var d = false;
6159      else {
6160        a = wk;
6161        wk = null;
6162        xk = 0;
6163        if (0 !== (K & 6)) throw Error(p(331));
6164        var e = K;
6165        K |= 4;
6166        for (V = a.current; null !== V; ) {
6167          var f2 = V, g = f2.child;
6168          if (0 !== (V.flags & 16)) {
6169            var h = f2.deletions;
6170            if (null !== h) {
6171              for (var k2 = 0; k2 < h.length; k2++) {
6172                var l2 = h[k2];
6173                for (V = l2; null !== V; ) {
6174                  var m2 = V;
6175                  switch (m2.tag) {
6176                    case 0:
6177                    case 11:
6178                    case 15:
6179                      Pj(8, m2, f2);
6180                  }
6181                  var q2 = m2.child;
6182                  if (null !== q2) q2.return = m2, V = q2;
6183                  else for (; null !== V; ) {
6184                    m2 = V;
6185                    var r2 = m2.sibling, y2 = m2.return;
6186                    Sj(m2);
6187                    if (m2 === l2) {
6188                      V = null;
6189                      break;
6190                    }
6191                    if (null !== r2) {
6192                      r2.return = y2;
6193                      V = r2;
6194                      break;
6195                    }
6196                    V = y2;
6197                  }
6198                }
6199              }
6200              var n2 = f2.alternate;
6201              if (null !== n2) {
6202                var t2 = n2.child;
6203                if (null !== t2) {
6204                  n2.child = null;
6205                  do {
6206                    var J2 = t2.sibling;
6207                    t2.sibling = null;
6208                    t2 = J2;
6209                  } while (null !== t2);
6210                }
6211              }
6212              V = f2;
6213            }
6214          }
6215          if (0 !== (f2.subtreeFlags & 2064) && null !== g) g.return = f2, V = g;
6216          else b: for (; null !== V; ) {
6217            f2 = V;
6218            if (0 !== (f2.flags & 2048)) switch (f2.tag) {
6219              case 0:
6220              case 11:
6221              case 15:
6222                Pj(9, f2, f2.return);
6223            }
6224            var x2 = f2.sibling;
6225            if (null !== x2) {
6226              x2.return = f2.return;
6227              V = x2;
6228              break b;
6229            }
6230            V = f2.return;
6231          }
6232        }
6233        var w2 = a.current;
6234        for (V = w2; null !== V; ) {
6235          g = V;
6236          var u2 = g.child;
6237          if (0 !== (g.subtreeFlags & 2064) && null !== u2) u2.return = g, V = u2;
6238          else b: for (g = w2; null !== V; ) {
6239            h = V;
6240            if (0 !== (h.flags & 2048)) try {
6241              switch (h.tag) {
6242                case 0:
6243                case 11:
6244                case 15:
6245                  Qj(9, h);
6246              }
6247            } catch (na) {
6248              W(h, h.return, na);
6249            }
6250            if (h === g) {
6251              V = null;
6252              break b;
6253            }
6254            var F2 = h.sibling;
6255            if (null !== F2) {
6256              F2.return = h.return;
6257              V = F2;
6258              break b;
6259            }
6260            V = h.return;
6261          }
6262        }
6263        K = e;
6264        jg();
6265        if (lc && "function" === typeof lc.onPostCommitFiberRoot) try {
6266          lc.onPostCommitFiberRoot(kc, a);
6267        } catch (na) {
6268        }
6269        d = true;
6270      }
6271      return d;
6272    } finally {
6273      C = c, ok.transition = b;
6274    }
6275  }
6276  return false;
6277}
6278function Xk(a, b, c) {
6279  b = Ji(c, b);
6280  b = Ni(a, b, 1);
6281  a = nh(a, b, 1);
6282  b = R();
6283  null !== a && (Ac(a, 1, b), Dk(a, b));
6284}
6285function W(a, b, c) {
6286  if (3 === a.tag) Xk(a, a, c);
6287  else for (; null !== b; ) {
6288    if (3 === b.tag) {
6289      Xk(b, a, c);
6290      break;
6291    } else if (1 === b.tag) {
6292      var d = b.stateNode;
6293      if ("function" === typeof b.type.getDerivedStateFromError || "function" === typeof d.componentDidCatch && (null === Ri || !Ri.has(d))) {
6294        a = Ji(c, a);
6295        a = Qi(b, a, 1);
6296        b = nh(b, a, 1);
6297        a = R();
6298        null !== b && (Ac(b, 1, a), Dk(b, a));
6299        break;
6300      }
6301    }
6302    b = b.return;
6303  }
6304}
6305function Ti(a, b, c) {
6306  var d = a.pingCache;
6307  null !== d && d.delete(b);
6308  b = R();
6309  a.pingedLanes |= a.suspendedLanes & c;
6310  Q === a && (Z & c) === c && (4 === T || 3 === T && (Z & 130023424) === Z && 500 > B() - fk ? Kk(a, 0) : rk |= c);
6311  Dk(a, b);
6312}
6313function Yk(a, b) {
6314  0 === b && (0 === (a.mode & 1) ? b = 1 : (b = sc, sc <<= 1, 0 === (sc & 130023424) && (sc = 4194304)));
6315  var c = R();
6316  a = ih(a, b);
6317  null !== a && (Ac(a, b, c), Dk(a, c));
6318}
6319function uj(a) {
6320  var b = a.memoizedState, c = 0;
6321  null !== b && (c = b.retryLane);
6322  Yk(a, c);
6323}
6324function bk(a, b) {
6325  var c = 0;
6326  switch (a.tag) {
6327    case 13:
6328      var d = a.stateNode;
6329      var e = a.memoizedState;
6330      null !== e && (c = e.retryLane);
6331      break;
6332    case 19:
6333      d = a.stateNode;
6334      break;
6335    default:
6336      throw Error(p(314));
6337  }
6338  null !== d && d.delete(b);
6339  Yk(a, c);
6340}
6341var Vk;
6342Vk = function(a, b, c) {
6343  if (null !== a) if (a.memoizedProps !== b.pendingProps || Wf.current) dh = true;
6344  else {
6345    if (0 === (a.lanes & c) && 0 === (b.flags & 128)) return dh = false, yj(a, b, c);
6346    dh = 0 !== (a.flags & 131072) ? true : false;
6347  }
6348  else dh = false, I && 0 !== (b.flags & 1048576) && ug(b, ng, b.index);
6349  b.lanes = 0;
6350  switch (b.tag) {
6351    case 2:
6352      var d = b.type;
6353      ij(a, b);
6354      a = b.pendingProps;
6355      var e = Yf(b, H.current);
6356      ch(b, c);
6357      e = Nh(null, b, d, a, e, c);
6358      var f2 = Sh();
6359      b.flags |= 1;
6360      "object" === typeof e && null !== e && "function" === typeof e.render && void 0 === e.$$typeof ? (b.tag = 1, b.memoizedState = null, b.updateQueue = null, Zf(d) ? (f2 = true, cg(b)) : f2 = false, b.memoizedState = null !== e.state && void 0 !== e.state ? e.state : null, kh(b), e.updater = Ei, b.stateNode = e, e._reactInternals = b, Ii(b, d, a, c), b = jj(null, b, d, true, f2, c)) : (b.tag = 0, I && f2 && vg(b), Xi(null, b, e, c), b = b.child);
6361      return b;
6362    case 16:
6363      d = b.elementType;
6364      a: {
6365        ij(a, b);
6366        a = b.pendingProps;
6367        e = d._init;
6368        d = e(d._payload);
6369        b.type = d;
6370        e = b.tag = Zk(d);
6371        a = Ci(d, a);
6372        switch (e) {
6373          case 0:
6374            b = cj(null, b, d, a, c);
6375            break a;
6376          case 1:
6377            b = hj(null, b, d, a, c);
6378            break a;
6379          case 11:
6380            b = Yi(null, b, d, a, c);
6381            break a;
6382          case 14:
6383            b = $i(null, b, d, Ci(d.type, a), c);
6384            break a;
6385        }
6386        throw Error(p(
6387          306,
6388          d,
6389          ""
6390        ));
6391      }
6392      return b;
6393    case 0:
6394      return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : Ci(d, e), cj(a, b, d, e, c);
6395    case 1:
6396      return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : Ci(d, e), hj(a, b, d, e, c);
6397    case 3:
6398      a: {
6399        kj(b);
6400        if (null === a) throw Error(p(387));
6401        d = b.pendingProps;
6402        f2 = b.memoizedState;
6403        e = f2.element;
6404        lh(a, b);
6405        qh(b, d, null, c);
6406        var g = b.memoizedState;
6407        d = g.element;
6408        if (f2.isDehydrated) if (f2 = { element: d, isDehydrated: false, cache: g.cache, pendingSuspenseBoundaries: g.pendingSuspenseBoundaries, transitions: g.transitions }, b.updateQueue.baseState = f2, b.memoizedState = f2, b.flags & 256) {
6409          e = Ji(Error(p(423)), b);
6410          b = lj(a, b, d, c, e);
6411          break a;
6412        } else if (d !== e) {
6413          e = Ji(Error(p(424)), b);
6414          b = lj(a, b, d, c, e);
6415          break a;
6416        } else for (yg = Lf(b.stateNode.containerInfo.firstChild), xg = b, I = true, zg = null, c = Vg(b, null, d, c), b.child = c; c; ) c.flags = c.flags & -3 | 4096, c = c.sibling;
6417        else {
6418          Ig();
6419          if (d === e) {
6420            b = Zi(a, b, c);
6421            break a;
6422          }
6423          Xi(a, b, d, c);
6424        }
6425        b = b.child;
6426      }
6427      return b;
6428    case 5:
6429      return Ah(b), null === a && Eg(b), d = b.type, e = b.pendingProps, f2 = null !== a ? a.memoizedProps : null, g = e.children, Ef(d, e) ? g = null : null !== f2 && Ef(d, f2) && (b.flags |= 32), gj(a, b), Xi(a, b, g, c), b.child;
6430    case 6:
6431      return null === a && Eg(b), null;
6432    case 13:
6433      return oj(a, b, c);
6434    case 4:
6435      return yh(b, b.stateNode.containerInfo), d = b.pendingProps, null === a ? b.child = Ug(b, null, d, c) : Xi(a, b, d, c), b.child;
6436    case 11:
6437      return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : Ci(d, e), Yi(a, b, d, e, c);
6438    case 7:
6439      return Xi(a, b, b.pendingProps, c), b.child;
6440    case 8:
6441      return Xi(a, b, b.pendingProps.children, c), b.child;
6442    case 12:
6443      return Xi(a, b, b.pendingProps.children, c), b.child;
6444    case 10:
6445      a: {
6446        d = b.type._context;
6447        e = b.pendingProps;
6448        f2 = b.memoizedProps;
6449        g = e.value;
6450        G(Wg, d._currentValue);
6451        d._currentValue = g;
6452        if (null !== f2) if (He(f2.value, g)) {
6453          if (f2.children === e.children && !Wf.current) {
6454            b = Zi(a, b, c);
6455            break a;
6456          }
6457        } else for (f2 = b.child, null !== f2 && (f2.return = b); null !== f2; ) {
6458          var h = f2.dependencies;
6459          if (null !== h) {
6460            g = f2.child;
6461            for (var k2 = h.firstContext; null !== k2; ) {
6462              if (k2.context === d) {
6463                if (1 === f2.tag) {
6464                  k2 = mh(-1, c & -c);
6465                  k2.tag = 2;
6466                  var l2 = f2.updateQueue;
6467                  if (null !== l2) {
6468                    l2 = l2.shared;
6469                    var m2 = l2.pending;
6470                    null === m2 ? k2.next = k2 : (k2.next = m2.next, m2.next = k2);
6471                    l2.pending = k2;
6472                  }
6473                }
6474                f2.lanes |= c;
6475                k2 = f2.alternate;
6476                null !== k2 && (k2.lanes |= c);
6477                bh(
6478                  f2.return,
6479                  c,
6480                  b
6481                );
6482                h.lanes |= c;
6483                break;
6484              }
6485              k2 = k2.next;
6486            }
6487          } else if (10 === f2.tag) g = f2.type === b.type ? null : f2.child;
6488          else if (18 === f2.tag) {
6489            g = f2.return;
6490            if (null === g) throw Error(p(341));
6491            g.lanes |= c;
6492            h = g.alternate;
6493            null !== h && (h.lanes |= c);
6494            bh(g, c, b);
6495            g = f2.sibling;
6496          } else g = f2.child;
6497          if (null !== g) g.return = f2;
6498          else for (g = f2; null !== g; ) {
6499            if (g === b) {
6500              g = null;
6501              break;
6502            }
6503            f2 = g.sibling;
6504            if (null !== f2) {
6505              f2.return = g.return;
6506              g = f2;
6507              break;
6508            }
6509            g = g.return;
6510          }
6511          f2 = g;
6512        }
6513        Xi(a, b, e.children, c);
6514        b = b.child;
6515      }
6516      return b;
6517    case 9:
6518      return e = b.type, d = b.pendingProps.children, ch(b, c), e = eh(e), d = d(e), b.flags |= 1, Xi(a, b, d, c), b.child;
6519    case 14:
6520      return d = b.type, e = Ci(d, b.pendingProps), e = Ci(d.type, e), $i(a, b, d, e, c);
6521    case 15:
6522      return bj(a, b, b.type, b.pendingProps, c);
6523    case 17:
6524      return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : Ci(d, e), ij(a, b), b.tag = 1, Zf(d) ? (a = true, cg(b)) : a = false, ch(b, c), Gi(b, d, e), Ii(b, d, e, c), jj(null, b, d, true, a, c);
6525    case 19:
6526      return xj(a, b, c);
6527    case 22:
6528      return dj(a, b, c);
6529  }
6530  throw Error(p(156, b.tag));
6531};
6532function Fk(a, b) {
6533  return ac(a, b);
6534}
6535function $k(a, b, c, d) {
6536  this.tag = a;
6537  this.key = c;
6538  this.sibling = this.child = this.return = this.stateNode = this.type = this.elementType = null;
6539  this.index = 0;
6540  this.ref = null;
6541  this.pendingProps = b;
6542  this.dependencies = this.memoizedState = this.updateQueue = this.memoizedProps = null;
6543  this.mode = d;
6544  this.subtreeFlags = this.flags = 0;
6545  this.deletions = null;
6546  this.childLanes = this.lanes = 0;
6547  this.alternate = null;
6548}
6549function Bg(a, b, c, d) {
6550  return new $k(a, b, c, d);
6551}
6552function aj(a) {
6553  a = a.prototype;
6554  return !(!a || !a.isReactComponent);
6555}
6556function Zk(a) {
6557  if ("function" === typeof a) return aj(a) ? 1 : 0;
6558  if (void 0 !== a && null !== a) {
6559    a = a.$$typeof;
6560    if (a === Da) return 11;
6561    if (a === Ga) return 14;
6562  }
6563  return 2;
6564}
6565function Pg(a, b) {
6566  var c = a.alternate;
6567  null === c ? (c = Bg(a.tag, b, a.key, a.mode), c.elementType = a.elementType, c.type = a.type, c.stateNode = a.stateNode, c.alternate = a, a.alternate = c) : (c.pendingProps = b, c.type = a.type, c.flags = 0, c.subtreeFlags = 0, c.deletions = null);
6568  c.flags = a.flags & 14680064;
6569  c.childLanes = a.childLanes;
6570  c.lanes = a.lanes;
6571  c.child = a.child;
6572  c.memoizedProps = a.memoizedProps;
6573  c.memoizedState = a.memoizedState;
6574  c.updateQueue = a.updateQueue;
6575  b = a.dependencies;
6576  c.dependencies = null === b ? null : { lanes: b.lanes, firstContext: b.firstContext };
6577  c.sibling = a.sibling;
6578  c.index = a.index;
6579  c.ref = a.ref;
6580  return c;
6581}
6582function Rg(a, b, c, d, e, f2) {
6583  var g = 2;
6584  d = a;
6585  if ("function" === typeof a) aj(a) && (g = 1);
6586  else if ("string" === typeof a) g = 5;
6587  else a: switch (a) {
6588    case ya:
6589      return Tg(c.children, e, f2, b);
6590    case za:
6591      g = 8;
6592      e |= 8;
6593      break;
6594    case Aa:
6595      return a = Bg(12, c, b, e | 2), a.elementType = Aa, a.lanes = f2, a;
6596    case Ea:
6597      return a = Bg(13, c, b, e), a.elementType = Ea, a.lanes = f2, a;
6598    case Fa:
6599      return a = Bg(19, c, b, e), a.elementType = Fa, a.lanes = f2, a;
6600    case Ia:
6601      return pj(c, e, f2, b);
6602    default:
6603      if ("object" === typeof a && null !== a) switch (a.$$typeof) {
6604        case Ba:
6605          g = 10;
6606          break a;
6607        case Ca:
6608          g = 9;
6609          break a;
6610        case Da:
6611          g = 11;
6612          break a;
6613        case Ga:
6614          g = 14;
6615          break a;
6616        case Ha:
6617          g = 16;
6618          d = null;
6619          break a;
6620      }
6621      throw Error(p(130, null == a ? a : typeof a, ""));
6622  }
6623  b = Bg(g, c, b, e);
6624  b.elementType = a;
6625  b.type = d;
6626  b.lanes = f2;
6627  return b;
6628}
6629function Tg(a, b, c, d) {
6630  a = Bg(7, a, d, b);
6631  a.lanes = c;
6632  return a;
6633}
6634function pj(a, b, c, d) {
6635  a = Bg(22, a, d, b);
6636  a.elementType = Ia;
6637  a.lanes = c;
6638  a.stateNode = { isHidden: false };
6639  return a;
6640}
6641function Qg(a, b, c) {
6642  a = Bg(6, a, null, b);
6643  a.lanes = c;
6644  return a;
6645}
6646function Sg(a, b, c) {
6647  b = Bg(4, null !== a.children ? a.children : [], a.key, b);
6648  b.lanes = c;
6649  b.stateNode = { containerInfo: a.containerInfo, pendingChildren: null, implementation: a.implementation };
6650  return b;
6651}
6652function al(a, b, c, d, e) {
6653  this.tag = b;
6654  this.containerInfo = a;
6655  this.finishedWork = this.pingCache = this.current = this.pendingChildren = null;
6656  this.timeoutHandle = -1;
6657  this.callbackNode = this.pendingContext = this.context = null;
6658  this.callbackPriority = 0;
6659  this.eventTimes = zc(0);
6660  this.expirationTimes = zc(-1);
6661  this.entangledLanes = this.finishedLanes = this.mutableReadLanes = this.expiredLanes = this.pingedLanes = this.suspendedLanes = this.pendingLanes = 0;
6662  this.entanglements = zc(0);
6663  this.identifierPrefix = d;
6664  this.onRecoverableError = e;
6665  this.mutableSourceEagerHydrationData = null;
6666}
6667function bl(a, b, c, d, e, f2, g, h, k2) {
6668  a = new al(a, b, c, h, k2);
6669  1 === b ? (b = 1, true === f2 && (b |= 8)) : b = 0;
6670  f2 = Bg(3, null, null, b);
6671  a.current = f2;
6672  f2.stateNode = a;
6673  f2.memoizedState = { element: d, isDehydrated: c, cache: null, transitions: null, pendingSuspenseBoundaries: null };
6674  kh(f2);
6675  return a;
6676}
6677function cl(a, b, c) {
6678  var d = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;
6679  return { $$typeof: wa, key: null == d ? null : "" + d, children: a, containerInfo: b, implementation: c };
6680}
6681function dl(a) {
6682  if (!a) return Vf;
6683  a = a._reactInternals;
6684  a: {
6685    if (Vb(a) !== a || 1 !== a.tag) throw Error(p(170));
6686    var b = a;
6687    do {
6688      switch (b.tag) {
6689        case 3:
6690          b = b.stateNode.context;
6691          break a;
6692        case 1:
6693          if (Zf(b.type)) {
6694            b = b.stateNode.__reactInternalMemoizedMergedChildContext;
6695            break a;
6696          }
6697      }
6698      b = b.return;
6699    } while (null !== b);
6700    throw Error(p(171));
6701  }
6702  if (1 === a.tag) {
6703    var c = a.type;
6704    if (Zf(c)) return bg(a, c, b);
6705  }
6706  return b;
6707}
6708function el(a, b, c, d, e, f2, g, h, k2) {
6709  a = bl(c, d, true, a, e, f2, g, h, k2);
6710  a.context = dl(null);
6711  c = a.current;
6712  d = R();
6713  e = yi(c);
6714  f2 = mh(d, e);
6715  f2.callback = void 0 !== b && null !== b ? b : null;
6716  nh(c, f2, e);
6717  a.current.lanes = e;
6718  Ac(a, e, d);
6719  Dk(a, d);
6720  return a;
6721}
6722function fl(a, b, c, d) {
6723  var e = b.current, f2 = R(), g = yi(e);
6724  c = dl(c);
6725  null === b.context ? b.context = c : b.pendingContext = c;
6726  b = mh(f2, g);
6727  b.payload = { element: a };
6728  d = void 0 === d ? null : d;
6729  null !== d && (b.callback = d);
6730  a = nh(e, b, g);
6731  null !== a && (gi(a, e, g, f2), oh(a, e, g));
6732  return g;
6733}
6734function gl(a) {
6735  a = a.current;
6736  if (!a.child) return null;
6737  switch (a.child.tag) {
6738    case 5:
6739      return a.child.stateNode;
6740    default:
6741      return a.child.stateNode;
6742  }
6743}
6744function hl(a, b) {
6745  a = a.memoizedState;
6746  if (null !== a && null !== a.dehydrated) {
6747    var c = a.retryLane;
6748    a.retryLane = 0 !== c && c < b ? c : b;
6749  }
6750}
6751function il(a, b) {
6752  hl(a, b);
6753  (a = a.alternate) && hl(a, b);
6754}
6755function jl() {
6756  return null;
6757}
6758var kl = "function" === typeof reportError ? reportError : function(a) {
6759  console.error(a);
6760};
6761function ll(a) {
6762  this._internalRoot = a;
6763}
6764ml.prototype.render = ll.prototype.render = function(a) {
6765  var b = this._internalRoot;
6766  if (null === b) throw Error(p(409));
6767  fl(a, b, null, null);
6768};
6769ml.prototype.unmount = ll.prototype.unmount = function() {
6770  var a = this._internalRoot;
6771  if (null !== a) {
6772    this._internalRoot = null;
6773    var b = a.containerInfo;
6774    Rk(function() {
6775      fl(null, a, null, null);
6776    });
6777    b[uf] = null;
6778  }
6779};
6780function ml(a) {
6781  this._internalRoot = a;
6782}
6783ml.prototype.unstable_scheduleHydration = function(a) {
6784  if (a) {
6785    var b = Hc();
6786    a = { blockedOn: null, target: a, priority: b };
6787    for (var c = 0; c < Qc.length && 0 !== b && b < Qc[c].priority; c++) ;
6788    Qc.splice(c, 0, a);
6789    0 === c && Vc(a);
6790  }
6791};
6792function nl(a) {
6793  return !(!a || 1 !== a.nodeType && 9 !== a.nodeType && 11 !== a.nodeType);
6794}
6795function ol(a) {
6796  return !(!a || 1 !== a.nodeType && 9 !== a.nodeType && 11 !== a.nodeType && (8 !== a.nodeType || " react-mount-point-unstable " !== a.nodeValue));
6797}
6798function pl() {
6799}
6800function ql(a, b, c, d, e) {
6801  if (e) {
6802    if ("function" === typeof d) {
6803      var f2 = d;
6804      d = function() {
6805        var a2 = gl(g);
6806        f2.call(a2);
6807      };
6808    }
6809    var g = el(b, d, a, 0, null, false, false, "", pl);
6810    a._reactRootContainer = g;
6811    a[uf] = g.current;
6812    sf(8 === a.nodeType ? a.parentNode : a);
6813    Rk();
6814    return g;
6815  }
6816  for (; e = a.lastChild; ) a.removeChild(e);
6817  if ("function" === typeof d) {
6818    var h = d;
6819    d = function() {
6820      var a2 = gl(k2);
6821      h.call(a2);
6822    };
6823  }
6824  var k2 = bl(a, 0, false, null, null, false, false, "", pl);
6825  a._reactRootContainer = k2;
6826  a[uf] = k2.current;
6827  sf(8 === a.nodeType ? a.parentNode : a);
6828  Rk(function() {
6829    fl(b, k2, c, d);
6830  });
6831  return k2;
6832}
6833function rl(a, b, c, d, e) {
6834  var f2 = c._reactRootContainer;
6835  if (f2) {
6836    var g = f2;
6837    if ("function" === typeof e) {
6838      var h = e;
6839      e = function() {
6840        var a2 = gl(g);
6841        h.call(a2);
6842      };
6843    }
6844    fl(b, g, a, e);
6845  } else g = ql(c, b, a, e, d);
6846  return gl(g);
6847}
6848Ec = function(a) {
6849  switch (a.tag) {
6850    case 3:
6851      var b = a.stateNode;
6852      if (b.current.memoizedState.isDehydrated) {
6853        var c = tc(b.pendingLanes);
6854        0 !== c && (Cc(b, c | 1), Dk(b, B()), 0 === (K & 6) && (Gj = B() + 500, jg()));
6855      }
6856      break;
6857    case 13:
6858      Rk(function() {
6859        var b2 = ih(a, 1);
6860        if (null !== b2) {
6861          var c2 = R();
6862          gi(b2, a, 1, c2);
6863        }
6864      }), il(a, 1);
6865  }
6866};
6867Fc = function(a) {
6868  if (13 === a.tag) {
6869    var b = ih(a, 134217728);
6870    if (null !== b) {
6871      var c = R();
6872      gi(b, a, 134217728, c);
6873    }
6874    il(a, 134217728);
6875  }
6876};
6877Gc = function(a) {
6878  if (13 === a.tag) {
6879    var b = yi(a), c = ih(a, b);
6880    if (null !== c) {
6881      var d = R();
6882      gi(c, a, b, d);
6883    }
6884    il(a, b);
6885  }
6886};
6887Hc = function() {
6888  return C;
6889};
6890Ic = function(a, b) {
6891  var c = C;
6892  try {
6893    return C = a, b();
6894  } finally {
6895    C = c;
6896  }
6897};
6898yb = function(a, b, c) {
6899  switch (b) {
6900    case "input":
6901      bb(a, c);
6902      b = c.name;
6903      if ("radio" === c.type && null != b) {
6904        for (c = a; c.parentNode; ) c = c.parentNode;
6905        c = c.querySelectorAll("input[name=" + JSON.stringify("" + b) + '][type="radio"]');
6906        for (b = 0; b < c.length; b++) {
6907          var d = c[b];
6908          if (d !== a && d.form === a.form) {
6909            var e = Db(d);
6910            if (!e) throw Error(p(90));
6911            Wa(d);
6912            bb(d, e);
6913          }
6914        }
6915      }
6916      break;
6917    case "textarea":
6918      ib(a, c);
6919      break;
6920    case "select":
6921      b = c.value, null != b && fb(a, !!c.multiple, b, false);
6922  }
6923};
6924Gb = Qk;
6925Hb = Rk;
6926var sl = { usingClientEntryPoint: false, Events: [Cb, ue, Db, Eb, Fb, Qk] }, tl = { findFiberByHostInstance: Wc, bundleType: 0, version: "18.3.1", rendererPackageName: "react-dom" };
6927var ul = { bundleType: tl.bundleType, version: tl.version, rendererPackageName: tl.rendererPackageName, rendererConfig: tl.rendererConfig, overrideHookState: null, overrideHookStateDeletePath: null, overrideHookStateRenamePath: null, overrideProps: null, overridePropsDeletePath: null, overridePropsRenamePath: null, setErrorHandler: null, setSuspenseHandler: null, scheduleUpdate: null, currentDispatcherRef: ua.ReactCurrentDispatcher, findHostInstanceByFiber: function(a) {
6928  a = Zb(a);
6929  return null === a ? null : a.stateNode;
6930}, findFiberByHostInstance: tl.findFiberByHostInstance || jl, findHostInstancesForRefresh: null, scheduleRefresh: null, scheduleRoot: null, setRefreshHandler: null, getCurrentFiber: null, reconcilerVersion: "18.3.1-next-f1338f8080-20240426" };
6931if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
6932  var vl = __REACT_DEVTOOLS_GLOBAL_HOOK__;
6933  if (!vl.isDisabled && vl.supportsFiber) try {
6934    kc = vl.inject(ul), lc = vl;
6935  } catch (a) {
6936  }
6937}
6938reactDom_production_min.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = sl;
6939reactDom_production_min.createPortal = function(a, b) {
6940  var c = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;
6941  if (!nl(b)) throw Error(p(200));
6942  return cl(a, b, null, c);
6943};
6944reactDom_production_min.createRoot = function(a, b) {
6945  if (!nl(a)) throw Error(p(299));
6946  var c = false, d = "", e = kl;
6947  null !== b && void 0 !== b && (true === b.unstable_strictMode && (c = true), void 0 !== b.identifierPrefix && (d = b.identifierPrefix), void 0 !== b.onRecoverableError && (e = b.onRecoverableError));
6948  b = bl(a, 1, false, null, null, c, false, d, e);
6949  a[uf] = b.current;
6950  sf(8 === a.nodeType ? a.parentNode : a);
6951  return new ll(b);
6952};
6953reactDom_production_min.findDOMNode = function(a) {
6954  if (null == a) return null;
6955  if (1 === a.nodeType) return a;
6956  var b = a._reactInternals;
6957  if (void 0 === b) {
6958    if ("function" === typeof a.render) throw Error(p(188));
6959    a = Object.keys(a).join(",");
6960    throw Error(p(268, a));
6961  }
6962  a = Zb(b);
6963  a = null === a ? null : a.stateNode;
6964  return a;
6965};
6966reactDom_production_min.flushSync = function(a) {
6967  return Rk(a);
6968};
6969reactDom_production_min.hydrate = function(a, b, c) {
6970  if (!ol(b)) throw Error(p(200));
6971  return rl(null, a, b, true, c);
6972};
6973reactDom_production_min.hydrateRoot = function(a, b, c) {
6974  if (!nl(a)) throw Error(p(405));
6975  var d = null != c && c.hydratedSources || null, e = false, f2 = "", g = kl;
6976  null !== c && void 0 !== c && (true === c.unstable_strictMode && (e = true), void 0 !== c.identifierPrefix && (f2 = c.identifierPrefix), void 0 !== c.onRecoverableError && (g = c.onRecoverableError));
6977  b = el(b, null, a, 1, null != c ? c : null, e, false, f2, g);
6978  a[uf] = b.current;
6979  sf(a);
6980  if (d) for (a = 0; a < d.length; a++) c = d[a], e = c._getVersion, e = e(c._source), null == b.mutableSourceEagerHydrationData ? b.mutableSourceEagerHydrationData = [c, e] : b.mutableSourceEagerHydrationData.push(
6981    c,
6982    e
6983  );
6984  return new ml(b);
6985};
6986reactDom_production_min.render = function(a, b, c) {
6987  if (!ol(b)) throw Error(p(200));
6988  return rl(null, a, b, false, c);
6989};
6990reactDom_production_min.unmountComponentAtNode = function(a) {
6991  if (!ol(a)) throw Error(p(40));
6992  return a._reactRootContainer ? (Rk(function() {
6993    rl(null, null, a, false, function() {
6994      a._reactRootContainer = null;
6995      a[uf] = null;
6996    });
6997  }), true) : false;
6998};
6999reactDom_production_min.unstable_batchedUpdates = Qk;
7000reactDom_production_min.unstable_renderSubtreeIntoContainer = function(a, b, c, d) {
7001  if (!ol(c)) throw Error(p(200));
7002  if (null == a || void 0 === a._reactInternals) throw Error(p(38));
7003  return rl(a, b, c, false, d);
7004};
7005reactDom_production_min.version = "18.3.1-next-f1338f8080-20240426";
7006function checkDCE() {
7007  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined" || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== "function") {
7008    return;
7009  }
7010  try {
7011    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);
7012  } catch (err) {
7013    console.error(err);
7014  }
7015}
7016{
7017  checkDCE();
7018  reactDom.exports = reactDom_production_min;
7019}
7020var reactDomExports = reactDom.exports;
7021var m = reactDomExports;
7022{
7023  client.createRoot = m.createRoot;
7024  client.hydrateRoot = m.hydrateRoot;
7025}
7026var Subscribable = class {
7027  constructor() {
7028    this.listeners = /* @__PURE__ */ new Set();
7029    this.subscribe = this.subscribe.bind(this);
7030  }
7031  subscribe(listener) {
7032    this.listeners.add(listener);
7033    this.onSubscribe();
7034    return () => {
7035      this.listeners.delete(listener);
7036      this.onUnsubscribe();
7037    };
7038  }
7039  hasListeners() {
7040    return this.listeners.size > 0;
7041  }
7042  onSubscribe() {
7043  }
7044  onUnsubscribe() {
7045  }
7046};
7047var defaultTimeoutProvider = {
7048  // We need the wrapper function syntax below instead of direct references to
7049  // global setTimeout etc.
7050  //
7051  // BAD: `setTimeout: setTimeout`
7052  // GOOD: `setTimeout: (cb, delay) => setTimeout(cb, delay)`
7053  //
7054  // If we use direct references here, then anything that wants to spy on or
7055  // replace the global setTimeout (like tests) won't work since we'll already
7056  // have a hard reference to the original implementation at the time when this
7057  // file was imported.
7058  setTimeout: (callback, delay) => setTimeout(callback, delay),
7059  clearTimeout: (timeoutId) => clearTimeout(timeoutId),
7060  setInterval: (callback, delay) => setInterval(callback, delay),
7061  clearInterval: (intervalId) => clearInterval(intervalId)
7062};
7063var TimeoutManager = (_a = class {
7064  constructor() {
7065    // We cannot have TimeoutManager<T> as we must instantiate it with a concrete
7066    // type at app boot; and if we leave that type, then any new timer provider
7067    // would need to support ReturnType<typeof setTimeout>, which is infeasible.
7068    //
7069    // We settle for type safety for the TimeoutProvider type, and accept that
7070    // this class is unsafe internally to allow for extension.
7071    __privateAdd(this, _provider, defaultTimeoutProvider);
7072    __privateAdd(this, _providerCalled, false);
7073  }
7074  setTimeoutProvider(provider) {
7075    __privateSet(this, _provider, provider);
7076  }
7077  setTimeout(callback, delay) {
7078    return __privateGet(this, _provider).setTimeout(callback, delay);
7079  }
7080  clearTimeout(timeoutId) {
7081    __privateGet(this, _provider).clearTimeout(timeoutId);
7082  }
7083  setInterval(callback, delay) {
7084    return __privateGet(this, _provider).setInterval(callback, delay);
7085  }
7086  clearInterval(intervalId) {
7087    __privateGet(this, _provider).clearInterval(intervalId);
7088  }
7089}, _provider = new WeakMap(), _providerCalled = new WeakMap(), _a);
7090var timeoutManager = new TimeoutManager();
7091function systemSetTimeoutZero(callback) {
7092  setTimeout(callback, 0);
7093}
7094var isServer = typeof window === "undefined" || "Deno" in globalThis;
7095function noop$1() {
7096}
7097function functionalUpdate(updater, input) {
7098  return typeof updater === "function" ? updater(input) : updater;
7099}
7100function isValidTimeout(value) {
7101  return typeof value === "number" && value >= 0 && value !== Infinity;
7102}
7103function timeUntilStale(updatedAt, staleTime) {
7104  return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);
7105}
7106function resolveStaleTime(staleTime, query) {
7107  return typeof staleTime === "function" ? staleTime(query) : staleTime;
7108}
7109function resolveEnabled(enabled, query) {
7110  return typeof enabled === "function" ? enabled(query) : enabled;
7111}
7112function matchQuery(filters, query) {
7113  const {
7114    type = "all",
7115    exact,
7116    fetchStatus,
7117    predicate,
7118    queryKey,
7119    stale
7120  } = filters;
7121  if (queryKey) {
7122    if (exact) {
7123      if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {
7124        return false;
vendor: 6,327 bytes, lines 7125-7352
7125      }
7126    } else if (!partialMatchKey(query.queryKey, queryKey)) {
7127      return false;
7128    }
7129  }
7130  if (type !== "all") {
7131    const isActive = query.isActive();
7132    if (type === "active" && !isActive) {
7133      return false;
7134    }
7135    if (type === "inactive" && isActive) {
7136      return false;
7137    }
7138  }
7139  if (typeof stale === "boolean" && query.isStale() !== stale) {
7140    return false;
7141  }
7142  if (fetchStatus && fetchStatus !== query.state.fetchStatus) {
7143    return false;
7144  }
7145  if (predicate && !predicate(query)) {
7146    return false;
7147  }
7148  return true;
7149}
7150function matchMutation(filters, mutation) {
7151  const { exact, status, predicate, mutationKey } = filters;
7152  if (mutationKey) {
7153    if (!mutation.options.mutationKey) {
7154      return false;
7155    }
7156    if (exact) {
7157      if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {
7158        return false;
7159      }
7160    } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {
7161      return false;
7162    }
7163  }
7164  if (status && mutation.state.status !== status) {
7165    return false;
7166  }
7167  if (predicate && !predicate(mutation)) {
7168    return false;
7169  }
7170  return true;
7171}
7172function hashQueryKeyByOptions(queryKey, options) {
7173  const hashFn = options?.queryKeyHashFn || hashKey;
7174  return hashFn(queryKey);
7175}
7176function hashKey(queryKey) {
7177  return JSON.stringify(
7178    queryKey,
7179    (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => {
7180      result[key] = val[key];
7181      return result;
7182    }, {}) : val
7183  );
7184}
7185function partialMatchKey(a, b) {
7186  if (a === b) {
7187    return true;
7188  }
7189  if (typeof a !== typeof b) {
7190    return false;
7191  }
7192  if (a && b && typeof a === "object" && typeof b === "object") {
7193    return Object.keys(b).every((key) => partialMatchKey(a[key], b[key]));
7194  }
7195  return false;
7196}
7197var hasOwn = Object.prototype.hasOwnProperty;
7198function replaceEqualDeep(a, b) {
7199  if (a === b) {
7200    return a;
7201  }
7202  const array = isPlainArray(a) && isPlainArray(b);
7203  if (!array && !(isPlainObject(a) && isPlainObject(b))) return b;
7204  const aItems = array ? a : Object.keys(a);
7205  const aSize = aItems.length;
7206  const bItems = array ? b : Object.keys(b);
7207  const bSize = bItems.length;
7208  const copy = array ? new Array(bSize) : {};
7209  let equalItems = 0;
7210  for (let i = 0; i < bSize; i++) {
7211    const key = array ? i : bItems[i];
7212    const aItem = a[key];
7213    const bItem = b[key];
7214    if (aItem === bItem) {
7215      copy[key] = aItem;
7216      if (array ? i < aSize : hasOwn.call(a, key)) equalItems++;
7217      continue;
7218    }
7219    if (aItem === null || bItem === null || typeof aItem !== "object" || typeof bItem !== "object") {
7220      copy[key] = bItem;
7221      continue;
7222    }
7223    const v2 = replaceEqualDeep(aItem, bItem);
7224    copy[key] = v2;
7225    if (v2 === aItem) equalItems++;
7226  }
7227  return aSize === bSize && equalItems === aSize ? a : copy;
7228}
7229function shallowEqualObjects(a, b) {
7230  if (!b || Object.keys(a).length !== Object.keys(b).length) {
7231    return false;
7232  }
7233  for (const key in a) {
7234    if (a[key] !== b[key]) {
7235      return false;
7236    }
7237  }
7238  return true;
7239}
7240function isPlainArray(value) {
7241  return Array.isArray(value) && value.length === Object.keys(value).length;
7242}
7243function isPlainObject(o) {
7244  if (!hasObjectPrototype(o)) {
7245    return false;
7246  }
7247  const ctor = o.constructor;
7248  if (ctor === void 0) {
7249    return true;
7250  }
7251  const prot = ctor.prototype;
7252  if (!hasObjectPrototype(prot)) {
7253    return false;
7254  }
7255  if (!prot.hasOwnProperty("isPrototypeOf")) {
7256    return false;
7257  }
7258  if (Object.getPrototypeOf(o) !== Object.prototype) {
7259    return false;
7260  }
7261  return true;
7262}
7263function hasObjectPrototype(o) {
7264  return Object.prototype.toString.call(o) === "[object Object]";
7265}
7266function sleep(timeout) {
7267  return new Promise((resolve) => {
7268    timeoutManager.setTimeout(resolve, timeout);
7269  });
7270}
7271function replaceData(prevData, data, options) {
7272  if (typeof options.structuralSharing === "function") {
7273    return options.structuralSharing(prevData, data);
7274  } else if (options.structuralSharing !== false) {
7275    return replaceEqualDeep(prevData, data);
7276  }
7277  return data;
7278}
7279function addToEnd(items, item, max = 0) {
7280  const newItems = [...items, item];
7281  return max && newItems.length > max ? newItems.slice(1) : newItems;
7282}
7283function addToStart(items, item, max = 0) {
7284  const newItems = [item, ...items];
7285  return max && newItems.length > max ? newItems.slice(0, -1) : newItems;
7286}
7287var skipToken = Symbol();
7288function ensureQueryFn(options, fetchOptions) {
7289  if (!options.queryFn && fetchOptions?.initialPromise) {
7290    return () => fetchOptions.initialPromise;
7291  }
7292  if (!options.queryFn || options.queryFn === skipToken) {
7293    return () => Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`));
7294  }
7295  return options.queryFn;
7296}
7297function shouldThrowError(throwOnError, params) {
7298  if (typeof throwOnError === "function") {
7299    return throwOnError(...params);
7300  }
7301  return !!throwOnError;
7302}
7303var FocusManager = (_b = class extends Subscribable {
7304  constructor() {
7305    super();
7306    __privateAdd(this, _focused);
7307    __privateAdd(this, _cleanup);
7308    __privateAdd(this, _setup);
7309    __privateSet(this, _setup, (onFocus) => {
7310      if (!isServer && window.addEventListener) {
7311        const listener = () => onFocus();
7312        window.addEventListener("visibilitychange", listener, false);
7313        return () => {
7314          window.removeEventListener("visibilitychange", listener);
7315        };
7316      }
7317      return;
7318    });
7319  }
7320  onSubscribe() {
7321    if (!__privateGet(this, _cleanup)) {
7322      this.setEventListener(__privateGet(this, _setup));
7323    }
7324  }
7325  onUnsubscribe() {
7326    var _a2;
7327    if (!this.hasListeners()) {
7328      (_a2 = __privateGet(this, _cleanup)) == null ? void 0 : _a2.call(this);
7329      __privateSet(this, _cleanup, void 0);
7330    }
7331  }
7332  setEventListener(setup) {
7333    var _a2;
7334    __privateSet(this, _setup, setup);
7335    (_a2 = __privateGet(this, _cleanup)) == null ? void 0 : _a2.call(this);
7336    __privateSet(this, _cleanup, setup((focused) => {
7337      if (typeof focused === "boolean") {
7338        this.setFocused(focused);
7339      } else {
7340        this.onFocus();
7341      }
7342    }));
7343  }
7344  setFocused(focused) {
7345    const changed = __privateGet(this, _focused) !== focused;
7346    if (changed) {
7347      __privateSet(this, _focused, focused);
7348      this.onFocus();
7349    }
7350  }
7351  onFocus() {
7352    const isFocused = this.isFocused();
7353    this.listeners.forEach((listener) => {
7354      listener(isFocused);
7355    });
7356  }
7357  isFocused() {
7358    if (typeof __privateGet(this, _focused) === "boolean") {
7359      return __privateGet(this, _focused);
7360    }
7361    return globalThis.document?.visibilityState !== "hidden";
7362  }
7363}, _focused = new WeakMap(), _cleanup = new WeakMap(), _setup = new WeakMap(), _b);
7364var focusManager = new FocusManager();
7365function pendingThenable() {
7366  let resolve;
7367  let reject;
7368  const thenable = new Promise((_resolve, _reject) => {
7369    resolve = _resolve;
7370    reject = _reject;
7371  });
7372  thenable.status = "pending";
7373  thenable.catch(() => {
7374  });
7375  function finalize(data) {
7376    Object.assign(thenable, data);
7377    delete thenable.resolve;
7378    delete thenable.reject;
7379  }
7380  thenable.resolve = (value) => {
7381    finalize({
7382      status: "fulfilled",
7383      value
7384    });
7385    resolve(value);
7386  };
7387  thenable.reject = (reason) => {
7388    finalize({
7389      status: "rejected",
7390      reason
7391    });
7392    reject(reason);
7393  };
7394  return thenable;
7395}
7396function tryResolveSync(promise) {
7397  let data;
7398  promise.then((result) => {
7399    data = result;
7400    return result;
7401  }, noop$1)?.catch(noop$1);
7402  if (data !== void 0) {
7403    return { data };
7404  }
7405  return void 0;
7406}
7407function defaultTransformerFn(data) {
7408  return data;
7409}
7410function dehydrateMutation(mutation) {
7411  return {
7412    mutationKey: mutation.options.mutationKey,
7413    state: mutation.state,
7414    ...mutation.options.scope && { scope: mutation.options.scope },
7415    ...mutation.meta && { meta: mutation.meta }
7416  };
7417}
7418function dehydrateQuery(query, serializeData, shouldRedactErrors) {
7419  return {
7420    dehydratedAt: Date.now(),
7421    state: {
7422      ...query.state,
7423      ...query.state.data !== void 0 && {
7424        data: serializeData(query.state.data)
7425      }
7426    },
7427    queryKey: query.queryKey,
7428    queryHash: query.queryHash,
7429    ...query.state.status === "pending" && {
7430      promise: query.promise?.then(serializeData).catch((error) => {
7431        if (!shouldRedactErrors(error)) {
7432          return Promise.reject(error);
7433        }
7434        return Promise.reject(new Error("redacted"));
7435      })
7436    },
7437    ...query.meta && { meta: query.meta }
7438  };
7439}
7440function defaultShouldDehydrateMutation(mutation) {
7441  return mutation.state.isPaused;
7442}
7443function defaultShouldDehydrateQuery(query) {
7444  return query.state.status === "success";
7445}
7446function defaultShouldRedactErrors(_) {
7447  return true;
7448}
7449function dehydrate(client2, options = {}) {
7450  const filterMutation = options.shouldDehydrateMutation ?? client2.getDefaultOptions().dehydrate?.shouldDehydrateMutation ?? defaultShouldDehydrateMutation;
7451  const mutations = client2.getMutationCache().getAll().flatMap(
7452    (mutation) => filterMutation(mutation) ? [dehydrateMutation(mutation)] : []
7453  );
7454  const filterQuery = options.shouldDehydrateQuery ?? client2.getDefaultOptions().dehydrate?.shouldDehydrateQuery ?? defaultShouldDehydrateQuery;
7455  const shouldRedactErrors = options.shouldRedactErrors ?? client2.getDefaultOptions().dehydrate?.shouldRedactErrors ?? defaultShouldRedactErrors;
7456  const serializeData = options.serializeData ?? client2.getDefaultOptions().dehydrate?.serializeData ?? defaultTransformerFn;
7457  const queries = client2.getQueryCache().getAll().flatMap(
7458    (query) => filterQuery(query) ? [dehydrateQuery(query, serializeData, shouldRedactErrors)] : []
7459  );
7460  return { mutations, queries };
7461}
7462function hydrate(client2, dehydratedState, options) {
7463  if (typeof dehydratedState !== "object" || dehydratedState === null) {
7464    return;
7465  }
7466  const mutationCache = client2.getMutationCache();
7467  const queryCache = client2.getQueryCache();
7468  const deserializeData = options?.defaultOptions?.deserializeData ?? client2.getDefaultOptions().hydrate?.deserializeData ?? defaultTransformerFn;
7469  const mutations = dehydratedState.mutations || [];
7470  const queries = dehydratedState.queries || [];
7471  mutations.forEach(({ state, ...mutationOptions }) => {
7472    mutationCache.build(
7473      client2,
7474      {
7475        ...client2.getDefaultOptions().hydrate?.mutations,
7476        ...options?.defaultOptions?.mutations,
7477        ...mutationOptions
7478      },
7479      state
7480    );
7481  });
7482  queries.forEach(
7483    ({ queryKey, state, queryHash, meta, promise, dehydratedAt }) => {
7484      const syncData = promise ? tryResolveSync(promise) : void 0;
7485      const rawData = state.data === void 0 ? syncData?.data : state.data;
7486      const data = rawData === void 0 ? rawData : deserializeData(rawData);
7487      let query = queryCache.get(queryHash);
7488      const existingQueryIsPending = query?.state.status === "pending";
7489      const existingQueryIsFetching = query?.state.fetchStatus === "fetching";
7490      if (query) {
7491        const hasNewerSyncData = syncData && // We only need this undefined check to handle older dehydration
7492        // payloads that might not have dehydratedAt
7493        dehydratedAt !== void 0 && dehydratedAt > query.state.dataUpdatedAt;
7494        if (state.dataUpdatedAt > query.state.dataUpdatedAt || hasNewerSyncData) {
7495          const { fetchStatus: _ignored, ...serializedState } = state;
7496          query.setState({
7497            ...serializedState,
7498            data
7499          });
7500        }
7501      } else {
7502        query = queryCache.build(
7503          client2,
7504          {
7505            ...client2.getDefaultOptions().hydrate?.queries,
7506            ...options?.defaultOptions?.queries,
7507            queryKey,
7508            queryHash,
7509            meta
7510          },
7511          // Reset fetch status to idle to avoid
7512          // query being stuck in fetching state upon hydration
7513          {
7514            ...state,
7515            data,
7516            fetchStatus: "idle",
7517            status: data !== void 0 ? "success" : state.status
7518          }
7519        );
7520      }
7521      if (promise && !existingQueryIsPending && !existingQueryIsFetching && // Only hydrate if dehydration is newer than any existing data,
7522      // this is always true for new queries
7523      (dehydratedAt === void 0 || dehydratedAt > query.state.dataUpdatedAt)) {
7524        void query.fetch(void 0, {
7525          // RSC transformed promises are not thenable
7526          initialPromise: Promise.resolve(promise).then(deserializeData)
7527        });
7528      }
7529    }
7530  );
7531}
7532var defaultScheduler = systemSetTimeoutZero;
7533function createNotifyManager() {
7534  let queue = [];
7535  let transactions = 0;
7536  let notifyFn = (callback) => {
7537    callback();
7538  };
7539  let batchNotifyFn = (callback) => {
7540    callback();
7541  };
7542  let scheduleFn = defaultScheduler;
7543  const schedule = (callback) => {
7544    if (transactions) {
7545      queue.push(callback);
7546    } else {
7547      scheduleFn(() => {
7548        notifyFn(callback);
7549      });
7550    }
7551  };
7552  const flush = () => {
7553    const originalQueue = queue;
7554    queue = [];
7555    if (originalQueue.length) {
7556      scheduleFn(() => {
7557        batchNotifyFn(() => {
7558          originalQueue.forEach((callback) => {
7559            notifyFn(callback);
7560          });
7561        });
7562      });
7563    }
7564  };
7565  return {
7566    batch: (callback) => {
7567      let result;
7568      transactions++;
7569      try {
7570        result = callback();
7571      } finally {
7572        transactions--;
7573        if (!transactions) {
7574          flush();
7575        }
7576      }
7577      return result;
7578    },
7579    /**
7580     * All calls to the wrapped function will be batched.
7581     */
7582    batchCalls: (callback) => {
7583      return (...args) => {
7584        schedule(() => {
7585          callback(...args);
7586        });
7587      };
7588    },
7589    schedule,
7590    /**
7591     * Use this method to set a custom notify function.
7592     * This can be used to for example wrap notifications with `React.act` while running tests.
7593     */
7594    setNotifyFunction: (fn) => {
7595      notifyFn = fn;
7596    },
7597    /**
7598     * Use this method to set a custom function to batch notifications together into a single tick.
7599     * By default React Query will use the batch function provided by ReactDOM or React Native.
7600     */
7601    setBatchNotifyFunction: (fn) => {
7602      batchNotifyFn = fn;
7603    },
7604    setScheduler: (fn) => {
7605      scheduleFn = fn;
7606    }
7607  };
7608}
7609var notifyManager = createNotifyManager();
7610var OnlineManager = (_c = class extends Subscribable {
7611  constructor() {
7612    super();
7613    __privateAdd(this, _online, true);
7614    __privateAdd(this, _cleanup2);
7615    __privateAdd(this, _setup2);
7616    __privateSet(this, _setup2, (onOnline) => {
7617      if (!isServer && window.addEventListener) {
7618        const onlineListener = () => onOnline(true);
7619        const offlineListener = () => onOnline(false);
7620        window.addEventListener("online", onlineListener, false);
7621        window.addEventListener("offline", offlineListener, false);
7622        return () => {
7623          window.removeEventListener("online", onlineListener);
7624          window.removeEventListener("offline", offlineListener);
7625        };
7626      }
7627      return;
7628    });
7629  }
7630  onSubscribe() {
7631    if (!__privateGet(this, _cleanup2)) {
7632      this.setEventListener(__privateGet(this, _setup2));
7633    }
7634  }
7635  onUnsubscribe() {
7636    var _a2;
7637    if (!this.hasListeners()) {
7638      (_a2 = __privateGet(this, _cleanup2)) == null ? void 0 : _a2.call(this);
7639      __privateSet(this, _cleanup2, void 0);
7640    }
7641  }
7642  setEventListener(setup) {
7643    var _a2;
7644    __privateSet(this, _setup2, setup);
7645    (_a2 = __privateGet(this, _cleanup2)) == null ? void 0 : _a2.call(this);
7646    __privateSet(this, _cleanup2, setup(this.setOnline.bind(this)));
7647  }
7648  setOnline(online) {
7649    const changed = __privateGet(this, _online) !== online;
7650    if (changed) {
7651      __privateSet(this, _online, online);
7652      this.listeners.forEach((listener) => {
7653        listener(online);
7654      });
7655    }
7656  }
7657  isOnline() {
7658    return __privateGet(this, _online);
7659  }
7660}, _online = new WeakMap(), _cleanup2 = new WeakMap(), _setup2 = new WeakMap(), _c);
7661var onlineManager = new OnlineManager();
7662function defaultRetryDelay(failureCount) {
7663  return Math.min(1e3 * 2 ** failureCount, 3e4);
7664}
7665function canFetch(networkMode) {
7666  return (networkMode ?? "online") === "online" ? onlineManager.isOnline() : true;
7667}
7668var CancelledError = class extends Error {
7669  constructor(options) {
7670    super("CancelledError");
7671    this.revert = options?.revert;
7672    this.silent = options?.silent;
7673  }
7674};
7675function createRetryer(config) {
7676  let isRetryCancelled = false;
7677  let failureCount = 0;
7678  let continueFn;
7679  const thenable = pendingThenable();
7680  const isResolved = () => thenable.status !== "pending";
7681  const cancel = (cancelOptions) => {
7682    if (!isResolved()) {
7683      const error = new CancelledError(cancelOptions);
7684      reject(error);
7685      config.onCancel?.(error);
7686    }
7687  };
7688  const cancelRetry = () => {
7689    isRetryCancelled = true;
7690  };
7691  const continueRetry = () => {
7692    isRetryCancelled = false;
7693  };
7694  const canContinue = () => focusManager.isFocused() && (config.networkMode === "always" || onlineManager.isOnline()) && config.canRun();
7695  const canStart = () => canFetch(config.networkMode) && config.canRun();
7696  const resolve = (value) => {
7697    if (!isResolved()) {
7698      continueFn?.();
7699      thenable.resolve(value);
7700    }
7701  };
7702  const reject = (value) => {
7703    if (!isResolved()) {
7704      continueFn?.();
7705      thenable.reject(value);
7706    }
7707  };
7708  const pause = () => {
7709    return new Promise((continueResolve) => {
7710      continueFn = (value) => {
7711        if (isResolved() || canContinue()) {
7712          continueResolve(value);
7713        }
7714      };
7715      config.onPause?.();
7716    }).then(() => {
7717      continueFn = void 0;
7718      if (!isResolved()) {
7719        config.onContinue?.();
7720      }
7721    });
7722  };
7723  const run = () => {
7724    if (isResolved()) {
7725      return;
7726    }
7727    let promiseOrValue;
7728    const initialPromise = failureCount === 0 ? config.initialPromise : void 0;
7729    try {
7730      promiseOrValue = initialPromise ?? config.fn();
7731    } catch (error) {
7732      promiseOrValue = Promise.reject(error);
7733    }
7734    Promise.resolve(promiseOrValue).then(resolve).catch((error) => {
7735      if (isResolved()) {
7736        return;
7737      }
7738      const retry = config.retry ?? (isServer ? 0 : 3);
7739      const retryDelay = config.retryDelay ?? defaultRetryDelay;
7740      const delay = typeof retryDelay === "function" ? retryDelay(failureCount, error) : retryDelay;
7741      const shouldRetry = retry === true || typeof retry === "number" && failureCount < retry || typeof retry === "function" && retry(failureCount, error);
7742      if (isRetryCancelled || !shouldRetry) {
7743        reject(error);
7744        return;
7745      }
7746      failureCount++;
7747      config.onFail?.(failureCount, error);
7748      sleep(delay).then(() => {
7749        return canContinue() ? void 0 : pause();
7750      }).then(() => {
7751        if (isRetryCancelled) {
7752          reject(error);
7753        } else {
7754          run();
7755        }
7756      });
7757    });
7758  };
7759  return {
7760    promise: thenable,
7761    status: () => thenable.status,
7762    cancel,
7763    continue: () => {
7764      continueFn?.();
7765      return thenable;
7766    },
7767    cancelRetry,
7768    continueRetry,
7769    canStart,
7770    start: () => {
7771      if (canStart()) {
7772        run();
7773      } else {
7774        pause().then(run);
7775      }
7776      return thenable;
7777    }
7778  };
7779}
7780var Removable = (_d = class {
7781  constructor() {
7782    __privateAdd(this, _gcTimeout);
7783  }
7784  destroy() {
7785    this.clearGcTimeout();
7786  }
7787  scheduleGc() {
7788    this.clearGcTimeout();
7789    if (isValidTimeout(this.gcTime)) {
7790      __privateSet(this, _gcTimeout, timeoutManager.setTimeout(() => {
7791        this.optionalRemove();
7792      }, this.gcTime));
7793    }
7794  }
7795  updateGcTime(newGcTime) {
7796    this.gcTime = Math.max(
7797      this.gcTime || 0,
7798      newGcTime ?? (isServer ? Infinity : 5 * 60 * 1e3)
7799    );
7800  }
7801  clearGcTimeout() {
7802    if (__privateGet(this, _gcTimeout)) {
7803      timeoutManager.clearTimeout(__privateGet(this, _gcTimeout));
7804      __privateSet(this, _gcTimeout, void 0);
7805    }
7806  }
7807}, _gcTimeout = new WeakMap(), _d);
7808var Query = (_e = class extends Removable {
7809  constructor(config) {
7810    super();
7811    __privateAdd(this, _Query_instances);
7812    __privateAdd(this, _initialState);
7813    __privateAdd(this, _revertState);
7814    __privateAdd(this, _cache);
7815    __privateAdd(this, _client);
7816    __privateAdd(this, _retryer);
7817    __privateAdd(this, _defaultOptions);
7818    __privateAdd(this, _abortSignalConsumed);
7819    __privateSet(this, _abortSignalConsumed, false);
7820    __privateSet(this, _defaultOptions, config.defaultOptions);
7821    this.setOptions(config.options);
7822    this.observers = [];
7823    __privateSet(this, _client, config.client);
7824    __privateSet(this, _cache, __privateGet(this, _client).getQueryCache());
7825    this.queryKey = config.queryKey;
7826    this.queryHash = config.queryHash;
7827    __privateSet(this, _initialState, getDefaultState$1(this.options));
7828    this.state = config.state ?? __privateGet(this, _initialState);
7829    this.scheduleGc();
7830  }
7831  get meta() {
7832    return this.options.meta;
7833  }
7834  get promise() {
7835    return __privateGet(this, _retryer)?.promise;
7836  }
7837  setOptions(options) {
7838    this.options = { ...__privateGet(this, _defaultOptions), ...options };
7839    this.updateGcTime(this.options.gcTime);
7840    if (this.state && this.state.data === void 0) {
7841      const defaultState = getDefaultState$1(this.options);
7842      if (defaultState.data !== void 0) {
7843        this.setData(defaultState.data, {
7844          updatedAt: defaultState.dataUpdatedAt,
7845          manual: true
7846        });
7847        __privateSet(this, _initialState, defaultState);
7848      }
7849    }
7850  }
7851  optionalRemove() {
7852    if (!this.observers.length && this.state.fetchStatus === "idle") {
7853      __privateGet(this, _cache).remove(this);
7854    }
7855  }
7856  setData(newData, options) {
7857    const data = replaceData(this.state.data, newData, this.options);
vendor: 5,650 bytes, lines 7858-8030
7858    __privateMethod(this, _Query_instances, dispatch_fn).call(this, {
7859      data,
7860      type: "success",
7861      dataUpdatedAt: options?.updatedAt,
7862      manual: options?.manual
7863    });
7864    return data;
7865  }
7866  setState(state, setStateOptions) {
7867    __privateMethod(this, _Query_instances, dispatch_fn).call(this, { type: "setState", state, setStateOptions });
7868  }
7869  cancel(options) {
7870    const promise = __privateGet(this, _retryer)?.promise;
7871    __privateGet(this, _retryer)?.cancel(options);
7872    return promise ? promise.then(noop$1).catch(noop$1) : Promise.resolve();
7873  }
7874  destroy() {
7875    super.destroy();
7876    this.cancel({ silent: true });
7877  }
7878  reset() {
7879    this.destroy();
7880    this.setState(__privateGet(this, _initialState));
7881  }
7882  isActive() {
7883    return this.observers.some(
7884      (observer) => resolveEnabled(observer.options.enabled, this) !== false
7885    );
7886  }
7887  isDisabled() {
7888    if (this.getObserversCount() > 0) {
7889      return !this.isActive();
7890    }
7891    return this.options.queryFn === skipToken || this.state.dataUpdateCount + this.state.errorUpdateCount === 0;
7892  }
7893  isStatic() {
7894    if (this.getObserversCount() > 0) {
7895      return this.observers.some(
7896        (observer) => resolveStaleTime(observer.options.staleTime, this) === "static"
7897      );
7898    }
7899    return false;
7900  }
7901  isStale() {
7902    if (this.getObserversCount() > 0) {
7903      return this.observers.some(
7904        (observer) => observer.getCurrentResult().isStale
7905      );
7906    }
7907    return this.state.data === void 0 || this.state.isInvalidated;
7908  }
7909  isStaleByTime(staleTime = 0) {
7910    if (this.state.data === void 0) {
7911      return true;
7912    }
7913    if (staleTime === "static") {
7914      return false;
7915    }
7916    if (this.state.isInvalidated) {
7917      return true;
7918    }
7919    return !timeUntilStale(this.state.dataUpdatedAt, staleTime);
7920  }
7921  onFocus() {
7922    const observer = this.observers.find((x2) => x2.shouldFetchOnWindowFocus());
7923    observer?.refetch({ cancelRefetch: false });
7924    __privateGet(this, _retryer)?.continue();
7925  }
7926  onOnline() {
7927    const observer = this.observers.find((x2) => x2.shouldFetchOnReconnect());
7928    observer?.refetch({ cancelRefetch: false });
7929    __privateGet(this, _retryer)?.continue();
7930  }
7931  addObserver(observer) {
7932    if (!this.observers.includes(observer)) {
7933      this.observers.push(observer);
7934      this.clearGcTimeout();
7935      __privateGet(this, _cache).notify({ type: "observerAdded", query: this, observer });
7936    }
7937  }
7938  removeObserver(observer) {
7939    if (this.observers.includes(observer)) {
7940      this.observers = this.observers.filter((x2) => x2 !== observer);
7941      if (!this.observers.length) {
7942        if (__privateGet(this, _retryer)) {
7943          if (__privateGet(this, _abortSignalConsumed)) {
7944            __privateGet(this, _retryer).cancel({ revert: true });
7945          } else {
7946            __privateGet(this, _retryer).cancelRetry();
7947          }
7948        }
7949        this.scheduleGc();
7950      }
7951      __privateGet(this, _cache).notify({ type: "observerRemoved", query: this, observer });
7952    }
7953  }
7954  getObserversCount() {
7955    return this.observers.length;
7956  }
7957  invalidate() {
7958    if (!this.state.isInvalidated) {
7959      __privateMethod(this, _Query_instances, dispatch_fn).call(this, { type: "invalidate" });
7960    }
7961  }
7962  async fetch(options, fetchOptions) {
7963    if (this.state.fetchStatus !== "idle" && // If the promise in the retyer is already rejected, we have to definitely
7964    // re-start the fetch; there is a chance that the query is still in a
7965    // pending state when that happens
7966    __privateGet(this, _retryer)?.status() !== "rejected") {
7967      if (this.state.data !== void 0 && fetchOptions?.cancelRefetch) {
7968        this.cancel({ silent: true });
7969      } else if (__privateGet(this, _retryer)) {
7970        __privateGet(this, _retryer).continueRetry();
7971        return __privateGet(this, _retryer).promise;
7972      }
7973    }
7974    if (options) {
7975      this.setOptions(options);
7976    }
7977    if (!this.options.queryFn) {
7978      const observer = this.observers.find((x2) => x2.options.queryFn);
7979      if (observer) {
7980        this.setOptions(observer.options);
7981      }
7982    }
7983    const abortController = new AbortController();
7984    const addSignalProperty = (object) => {
7985      Object.defineProperty(object, "signal", {
7986        enumerable: true,
7987        get: () => {
7988          __privateSet(this, _abortSignalConsumed, true);
7989          return abortController.signal;
7990        }
7991      });
7992    };
7993    const fetchFn = () => {
7994      const queryFn = ensureQueryFn(this.options, fetchOptions);
7995      const createQueryFnContext = () => {
7996        const queryFnContext2 = {
7997          client: __privateGet(this, _client),
7998          queryKey: this.queryKey,
7999          meta: this.meta
8000        };
8001        addSignalProperty(queryFnContext2);
8002        return queryFnContext2;
8003      };
8004      const queryFnContext = createQueryFnContext();
8005      __privateSet(this, _abortSignalConsumed, false);
8006      if (this.options.persister) {
8007        return this.options.persister(
8008          queryFn,
8009          queryFnContext,
8010          this
8011        );
8012      }
8013      return queryFn(queryFnContext);
8014    };
8015    const createFetchContext = () => {
8016      const context2 = {
8017        fetchOptions,
8018        options: this.options,
8019        queryKey: this.queryKey,
8020        client: __privateGet(this, _client),
8021        state: this.state,
8022        fetchFn
8023      };
8024      addSignalProperty(context2);
8025      return context2;
8026    };
8027    const context = createFetchContext();
8028    this.options.behavior?.onFetch(context, this);
8029    __privateSet(this, _revertState, this.state);
8030    if (this.state.fetchStatus === "idle" || this.state.fetchMeta !== context.fetchOptions?.meta) {
8031      __privateMethod(this, _Query_instances, dispatch_fn).call(this, { type: "fetch", meta: context.fetchOptions?.meta });
8032    }
8033    __privateSet(this, _retryer, createRetryer({
8034      initialPromise: fetchOptions?.initialPromise,
8035      fn: context.fetchFn,
8036      onCancel: (error) => {
8037        if (error instanceof CancelledError && error.revert) {
8038          this.setState({
8039            ...__privateGet(this, _revertState),
8040            fetchStatus: "idle"
8041          });
8042        }
8043        abortController.abort();
8044      },
8045      onFail: (failureCount, error) => {
8046        __privateMethod(this, _Query_instances, dispatch_fn).call(this, { type: "failed", failureCount, error });
8047      },
8048      onPause: () => {
8049        __privateMethod(this, _Query_instances, dispatch_fn).call(this, { type: "pause" });
8050      },
8051      onContinue: () => {
8052        __privateMethod(this, _Query_instances, dispatch_fn).call(this, { type: "continue" });
8053      },
8054      retry: context.options.retry,
8055      retryDelay: context.options.retryDelay,
8056      networkMode: context.options.networkMode,
8057      canRun: () => true
8058    }));
8059    try {
8060      const data = await __privateGet(this, _retryer).start();
8061      if (data === void 0) {
8062        if (false) ;
8063        throw new Error(`${this.queryHash} data is undefined`);
8064      }
8065      this.setData(data);
8066      __privateGet(this, _cache).config.onSuccess?.(data, this);
8067      __privateGet(this, _cache).config.onSettled?.(
8068        data,
8069        this.state.error,
8070        this
8071      );
8072      return data;
8073    } catch (error) {
8074      if (error instanceof CancelledError) {
8075        if (error.silent) {
8076          return __privateGet(this, _retryer).promise;
8077        } else if (error.revert) {
8078          if (this.state.data === void 0) {
8079            throw error;
8080          }
8081          return this.state.data;
8082        }
8083      }
8084      __privateMethod(this, _Query_instances, dispatch_fn).call(this, {
8085        type: "error",
8086        error
8087      });
8088      __privateGet(this, _cache).config.onError?.(
8089        error,
8090        this
8091      );
8092      __privateGet(this, _cache).config.onSettled?.(
8093        this.state.data,
8094        error,
8095        this
8096      );
8097      throw error;
8098    } finally {
8099      this.scheduleGc();
8100    }
8101  }
8102}, _initialState = new WeakMap(), _revertState = new WeakMap(), _cache = new WeakMap(), _client = new WeakMap(), _retryer = new WeakMap(), _defaultOptions = new WeakMap(), _abortSignalConsumed = new WeakMap(), _Query_instances = new WeakSet(), dispatch_fn = function(action) {
8103  const reducer = (state) => {
8104    switch (action.type) {
8105      case "failed":
8106        return {
8107          ...state,
8108          fetchFailureCount: action.failureCount,
8109          fetchFailureReason: action.error
8110        };
8111      case "pause":
8112        return {
8113          ...state,
8114          fetchStatus: "paused"
8115        };
8116      case "continue":
8117        return {
8118          ...state,
8119          fetchStatus: "fetching"
8120        };
8121      case "fetch":
8122        return {
8123          ...state,
8124          ...fetchState(state.data, this.options),
8125          fetchMeta: action.meta ?? null
8126        };
8127      case "success":
8128        const newState = {
8129          ...state,
8130          data: action.data,
8131          dataUpdateCount: state.dataUpdateCount + 1,
8132          dataUpdatedAt: action.dataUpdatedAt ?? Date.now(),
8133          error: null,
8134          isInvalidated: false,
8135          status: "success",
8136          ...!action.manual && {
8137            fetchStatus: "idle",
8138            fetchFailureCount: 0,
8139            fetchFailureReason: null
8140          }
8141        };
8142        __privateSet(this, _revertState, action.manual ? newState : void 0);
8143        return newState;
8144      case "error":
8145        const error = action.error;
8146        return {
8147          ...state,
8148          error,
8149          errorUpdateCount: state.errorUpdateCount + 1,
8150          errorUpdatedAt: Date.now(),
8151          fetchFailureCount: state.fetchFailureCount + 1,
8152          fetchFailureReason: error,
8153          fetchStatus: "idle",
8154          status: "error"
8155        };
8156      case "invalidate":
8157        return {
8158          ...state,
8159          isInvalidated: true
8160        };
8161      case "setState":
8162        return {
8163          ...state,
8164          ...action.state
8165        };
8166    }
8167  };
8168  this.state = reducer(this.state);
8169  notifyManager.batch(() => {
vendor: 4,788 bytes, lines 8170-8298
8170    this.observers.forEach((observer) => {
8171      observer.onQueryUpdate();
8172    });
8173    __privateGet(this, _cache).notify({ query: this, type: "updated", action });
8174  });
8175}, _e);
8176function fetchState(data, options) {
8177  return {
8178    fetchFailureCount: 0,
8179    fetchFailureReason: null,
8180    fetchStatus: canFetch(options.networkMode) ? "fetching" : "paused",
8181    ...data === void 0 && {
8182      error: null,
8183      status: "pending"
8184    }
8185  };
8186}
8187function getDefaultState$1(options) {
8188  const data = typeof options.initialData === "function" ? options.initialData() : options.initialData;
8189  const hasData = data !== void 0;
8190  const initialDataUpdatedAt = hasData ? typeof options.initialDataUpdatedAt === "function" ? options.initialDataUpdatedAt() : options.initialDataUpdatedAt : 0;
8191  return {
8192    data,
8193    dataUpdateCount: 0,
8194    dataUpdatedAt: hasData ? initialDataUpdatedAt ?? Date.now() : 0,
8195    error: null,
8196    errorUpdateCount: 0,
8197    errorUpdatedAt: 0,
8198    fetchFailureCount: 0,
8199    fetchFailureReason: null,
8200    fetchMeta: null,
8201    isInvalidated: false,
8202    status: hasData ? "success" : "pending",
8203    fetchStatus: "idle"
8204  };
8205}
8206var QueryObserver = (_f = class extends Subscribable {
8207  constructor(client2, options) {
8208    super();
8209    __privateAdd(this, _QueryObserver_instances);
8210    __privateAdd(this, _client2);
8211    __privateAdd(this, _currentQuery);
8212    __privateAdd(this, _currentQueryInitialState);
8213    __privateAdd(this, _currentResult);
8214    __privateAdd(this, _currentResultState);
8215    __privateAdd(this, _currentResultOptions);
8216    __privateAdd(this, _currentThenable);
8217    __privateAdd(this, _selectError);
8218    __privateAdd(this, _selectFn);
8219    __privateAdd(this, _selectResult);
8220    // This property keeps track of the last query with defined data.
8221    // It will be used to pass the previous data and query to the placeholder function between renders.
8222    __privateAdd(this, _lastQueryWithDefinedData);
8223    __privateAdd(this, _staleTimeoutId);
8224    __privateAdd(this, _refetchIntervalId);
8225    __privateAdd(this, _currentRefetchInterval);
8226    __privateAdd(this, _trackedProps, /* @__PURE__ */ new Set());
8227    this.options = options;
8228    __privateSet(this, _client2, client2);
8229    __privateSet(this, _selectError, null);
8230    __privateSet(this, _currentThenable, pendingThenable());
8231    this.bindMethods();
8232    this.setOptions(options);
8233  }
8234  bindMethods() {
8235    this.refetch = this.refetch.bind(this);
8236  }
8237  onSubscribe() {
8238    if (this.listeners.size === 1) {
8239      __privateGet(this, _currentQuery).addObserver(this);
8240      if (shouldFetchOnMount(__privateGet(this, _currentQuery), this.options)) {
8241        __privateMethod(this, _QueryObserver_instances, executeFetch_fn).call(this);
8242      } else {
8243        this.updateResult();
8244      }
8245      __privateMethod(this, _QueryObserver_instances, updateTimers_fn).call(this);
8246    }
8247  }
8248  onUnsubscribe() {
8249    if (!this.hasListeners()) {
8250      this.destroy();
8251    }
8252  }
8253  shouldFetchOnReconnect() {
8254    return shouldFetchOn(
8255      __privateGet(this, _currentQuery),
8256      this.options,
8257      this.options.refetchOnReconnect
8258    );
8259  }
8260  shouldFetchOnWindowFocus() {
8261    return shouldFetchOn(
8262      __privateGet(this, _currentQuery),
8263      this.options,
8264      this.options.refetchOnWindowFocus
8265    );
8266  }
8267  destroy() {
8268    this.listeners = /* @__PURE__ */ new Set();
8269    __privateMethod(this, _QueryObserver_instances, clearStaleTimeout_fn).call(this);
8270    __privateMethod(this, _QueryObserver_instances, clearRefetchInterval_fn).call(this);
8271    __privateGet(this, _currentQuery).removeObserver(this);
8272  }
8273  setOptions(options) {
8274    const prevOptions = this.options;
8275    const prevQuery = __privateGet(this, _currentQuery);
8276    this.options = __privateGet(this, _client2).defaultQueryOptions(options);
8277    if (this.options.enabled !== void 0 && typeof this.options.enabled !== "boolean" && typeof this.options.enabled !== "function" && typeof resolveEnabled(this.options.enabled, __privateGet(this, _currentQuery)) !== "boolean") {
8278      throw new Error(
8279        "Expected enabled to be a boolean or a callback that returns a boolean"
8280      );
8281    }
8282    __privateMethod(this, _QueryObserver_instances, updateQuery_fn).call(this);
8283    __privateGet(this, _currentQuery).setOptions(this.options);
8284    if (prevOptions._defaulted && !shallowEqualObjects(this.options, prevOptions)) {
8285      __privateGet(this, _client2).getQueryCache().notify({
8286        type: "observerOptionsUpdated",
8287        query: __privateGet(this, _currentQuery),
8288        observer: this
8289      });
8290    }
8291    const mounted = this.hasListeners();
8292    if (mounted && shouldFetchOptionally(
8293      __privateGet(this, _currentQuery),
8294      prevQuery,
8295      this.options,
8296      prevOptions
8297    )) {
8298      __privateMethod(this, _QueryObserver_instances, executeFetch_fn).c
8298all(this);
8299    }
8300    this.updateResult();
8301    if (mounted && (__privateGet(this, _currentQuery) !== prevQuery || resolveEnabled(this.options.enabled, __privateGet(this, _currentQuery)) !== resolveEnabled(prevOptions.enabled, __privateGet(this, _currentQuery)) || resolveStaleTime(this.options.staleTime, __privateGet(this, _currentQuery)) !== resolveStaleTime(prevOptions.staleTime, __privateGet(this, _currentQuery)))) {
8302      __privateMethod(this, _QueryObserver_instances, updateStaleTimeout_fn).call(this);
8303    }
8304    const nextRefetchInterval = __privateMethod(this, _QueryObserver_instances, computeRefetchInterval_fn).call(this);
8305    if (mounted && (__privateGet(this, _currentQuery) !== prevQuery || resolveEnabled(this.options.enabled, __privateGet(this, _currentQuery)) !== resolveEnabled(prevOptions.enabled, __privateGet(this, _currentQuery)) || nextRefetchInterval !== __privateGet(this, _currentRefetchInterval))) {
8306      __privateMethod(this, _QueryObserver_instances, updateRefetchInterval_fn).call(this, nextRefetchInterval);
8307    }
8308  }
8309  getOptimisticResult(options) {
8310    const query = __privateGet(this, _client2).getQueryCache().build(__privateGet(this, _client2), options);
8311    const result = this.createResult(query, options);
8312    if (shouldAssignObserverCurrentProperties(this, result)) {
8313      __privateSet(this, _currentResult, result);
8314      __privateSet(this, _currentResultOptions, this.options);
8315      __privateSet(this, _currentResultState, __privateGet(this, _currentQuery).state);
8316    }
8317    return result;
8318  }
8319  getCurrentResult() {
8320    return __privateGet(this, _currentResult);
8321  }
8322  trackResult(result, onPropTracked) {
8323    return new Proxy(result, {
8324      get: (target, key) => {
8325        this.trackProp(key);
8326        onPropTracked?.(key);
8327        if (key === "promise" && !this.options.experimental_prefetchInRender && __privateGet(this, _currentThenable).status === "pending") {
8328          __privateGet(this, _currentThenable).reject(
8329            new Error(
8330              "experimental_prefetchInRender feature flag is not enabled"
8331            )
8332          );
8333        }
8334        return Reflect.get(target, key);
8335      }
8336    });
8337  }
8338  trackProp(key) {
8339    __privateGet(this, _trackedProps).add(key);
8340  }
8341  getCurrentQuery() {
8342    return __privateGet(this, _currentQuery);
8343  }
8344  refetch({ ...options } = {}) {
8345    return this.fetch({
8346      ...options
8347    });
8348  }
8349  fetchOptimistic(options) {
8350    const defaultedOptions = __privateGet(this, _client2).defaultQueryOptions(options);
8351    const query = __privateGet(this, _client2).getQueryCache().build(__privateGet(this, _client2), defaultedOptions);
8352    return query.fetch().then(() => this.createResult(query, defaultedOptions));
8353  }
8354  fetch(fetchOptions) {
8355    return __privateMethod(this, _QueryObserver_instances, executeFetch_fn).call(this, {
8356      ...fetchOptions,
8357      cancelRefetch: fetchOptions.cancelRefetch ?? true
8358    }).then(() => {
8359      this.updateResult();
8360      return __privateGet(this, _currentResult);
8361    });
8362  }
8363  createResult(query, options) {
8364    const prevQuery = __privateGet(this, _currentQuery);
8365    const prevOptions = this.options;
8366    const prevResult = __privateGet(this, _currentResult);
8367    const prevResultState = __privateGet(this, _currentResultState);
8368    const prevResultOptions = __privateGet(this, _currentResultOptions);
8369    const queryChange = query !== prevQuery;
8370    const queryInitialState = queryChange ? query.state : __privateGet(this, _currentQueryInitialState);
8371    const { state } = query;
8372    let newState = { ...state };
8373    let isPlaceholderData = false;
8374    let data;
8375    if (options._optimisticResults) {
8376      const mounted = this.hasListeners();
8377      const fetchOnMount = !mounted && shouldFetchOnMount(query, options);
8378      const fetchOptionally = mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions);
8379      if (fetchOnMount || fetchOptionally) {
8380        newState = {
8381          ...newState,
8382          ...fetchState(state.data, query.options)
8383        };
8384      }
8385      if (options._optimisticResults === "isRestoring") {
8386        newState.fetchStatus = "idle";
8387      }
8388    }
8389    let { error, errorUpdatedAt, status } = newState;
8390    data = newState.data;
8391    let skipSelect = false;
vendor: 10,709 bytes, lines 8392-8630
8392    if (options.placeholderData !== void 0 && data === void 0 && status === "pending") {
8393      let placeholderData;
8394      if (prevResult?.isPlaceholderData && options.placeholderData === prevResultOptions?.placeholderData) {
8395        placeholderData = prevResult.data;
8396        skipSelect = true;
8397      } else {
8398        placeholderData = typeof options.placeholderData === "function" ? options.placeholderData(
8399          __privateGet(this, _lastQueryWithDefinedData)?.state.data,
8400          __privateGet(this, _lastQueryWithDefinedData)
8401        ) : options.placeholderData;
8402      }
8403      if (placeholderData !== void 0) {
8404        status = "success";
8405        data = replaceData(
8406          prevResult?.data,
8407          placeholderData,
8408          options
8409        );
8410        isPlaceholderData = true;
8411      }
8412    }
8413    if (options.select && data !== void 0 && !skipSelect) {
8414      if (prevResult && data === prevResultState?.data && options.select === __privateGet(this, _selectFn)) {
8415        data = __privateGet(this, _selectResult);
8416      } else {
8417        try {
8418          __privateSet(this, _selectFn, options.select);
8419          data = options.select(data);
8420          data = replaceData(prevResult?.data, data, options);
8421          __privateSet(this, _selectResult, data);
8422          __privateSet(this, _selectError, null);
8423        } catch (selectError) {
8424          __privateSet(this, _selectError, selectError);
8425        }
8426      }
8427    }
8428    if (__privateGet(this, _selectError)) {
8429      error = __privateGet(this, _selectError);
8430      data = __privateGet(this, _selectResult);
8431      errorUpdatedAt = Date.now();
8432      status = "error";
8433    }
8434    const isFetching = newState.fetchStatus === "fetching";
8435    const isPending = status === "pending";
8436    const isError = status === "error";
8437    const isLoading = isPending && isFetching;
8438    const hasData = data !== void 0;
8439    const result = {
8440      status,
8441      fetchStatus: newState.fetchStatus,
8442      isPending,
8443      isSuccess: status === "success",
8444      isError,
8445      isInitialLoading: isLoading,
8446      isLoading,
8447      data,
8448      dataUpdatedAt: newState.dataUpdatedAt,
8449      error,
8450      errorUpdatedAt,
8451      failureCount: newState.fetchFailureCount,
8452      failureReason: newState.fetchFailureReason,
8453      errorUpdateCount: newState.errorUpdateCount,
8454      isFetched: newState.dataUpdateCount > 0 || newState.errorUpdateCount > 0,
8455      isFetchedAfterMount: newState.dataUpdateCount > queryInitialState.dataUpdateCount || newState.errorUpdateCount > queryInitialState.errorUpdateCount,
8456      isFetching,
8457      isRefetching: isFetching && !isPending,
8458      isLoadingError: isError && !hasData,
8459      isPaused: newState.fetchStatus === "paused",
8460      isPlaceholderData,
8461      isRefetchError: isError && hasData,
8462      isStale: isStale(query, options),
8463      refetch: this.refetch,
8464      promise: __privateGet(this, _currentThenable),
8465      isEnabled: resolveEnabled(options.enabled, query) !== false
8466    };
8467    const nextResult = result;
8468    if (this.options.experimental_prefetchInRender) {
8469      const finalizeThenableIfPossible = (thenable) => {
8470        if (nextResult.status === "error") {
8471          thenable.reject(nextResult.error);
8472        } else if (nextResult.data !== void 0) {
8473          thenable.resolve(nextResult.data);
8474        }
8475      };
8476      const recreateThenable = () => {
8477        const pending = __privateSet(this, _currentThenable, nextResult.promise = pendingThenable());
8478        finalizeThenableIfPossible(pending);
8479      };
8480      const prevThenable = __privateGet(this, _currentThenable);
8481      switch (prevThenable.status) {
8482        case "pending":
8483          if (query.queryHash === prevQuery.queryHash) {
8484            finalizeThenableIfPossible(prevThenable);
8485          }
8486          break;
8487        case "fulfilled":
8488          if (nextResult.status === "error" || nextResult.data !== prevThenable.value) {
8489            recreateThenable();
8490          }
8491          break;
8492        case "rejected":
8493          if (nextResult.status !== "error" || nextResult.error !== prevThenable.reason) {
8494            recreateThenable();
8495          }
8496          break;
8497      }
8498    }
8499    return nextResult;
8500  }
8501  updateResult() {
8502    const prevResult = __privateGet(this, _currentResult);
8503    const nextResult = this.createResult(__privateGet(this, _currentQuery), this.options);
8504    __privateSet(this, _currentResultState, __privateGet(this, _currentQuery).state);
8505    __privateSet(this, _currentResultOptions, this.options);
8506    if (__privateGet(this, _currentResultState).data !== void 0) {
8507      __privateSet(this, _lastQueryWithDefinedData, __privateGet(this, _currentQuery));
8508    }
8509    if (shallowEqualObjects(nextResult, prevResult)) {
8510      return;
8511    }
8512    __privateSet(this, _currentResult, nextResult);
8513    const shouldNotifyListeners = () => {
8514      if (!prevResult) {
8515        return true;
8516      }
8517      const { notifyOnChangeProps } = this.options;
8518      const notifyOnChangePropsValue = typeof notifyOnChangeProps === "function" ? notifyOnChangeProps() : notifyOnChangeProps;
8519      if (notifyOnChangePropsValue === "all" || !notifyOnChangePropsValue && !__privateGet(this, _trackedProps).size) {
8520        return true;
8521      }
8522      const includedProps = new Set(
8523        notifyOnChangePropsValue ?? __privateGet(this, _trackedProps)
8524      );
8525      if (this.options.throwOnError) {
8526        includedProps.add("error");
8527      }
8528      return Object.keys(__privateGet(this, _currentResult)).some((key) => {
8529        const typedKey = key;
8530        const changed = __privateGet(this, _currentResult)[typedKey] !== prevResult[typedKey];
8531        return changed && includedProps.has(typedKey);
8532      });
8533    };
8534    __privateMethod(this, _QueryObserver_instances, notify_fn).call(this, { listeners: shouldNotifyListeners() });
8535  }
8536  onQueryUpdate() {
8537    this.updateResult();
8538    if (this.hasListeners()) {
8539      __privateMethod(this, _QueryObserver_instances, updateTimers_fn).call(this);
8540    }
8541  }
8542}, _client2 = new WeakMap(), _currentQuery = new WeakMap(), _currentQueryInitialState = new WeakMap(), _currentResult = new WeakMap(), _currentResultState = new WeakMap(), _currentResultOptions = new WeakMap(), _currentThenable = new WeakMap(), _selectError = new WeakMap(), _selectFn = new WeakMap(), _selectResult = new WeakMap(), _lastQueryWithDefinedData = new WeakMap(), _staleTimeoutId = new WeakMap(), _refetchIntervalId = new WeakMap(), _currentRefetchInterval = new WeakMap(), _trackedProps = new WeakMap(), _QueryObserver_instances = new WeakSet(), executeFetch_fn = function(fetchOptions) {
8543  __privateMethod(this, _QueryObserver_instances, updateQuery_fn).call(this);
8544  let promise = __privateGet(this, _currentQuery).fetch(
8545    this.options,
8546    fetchOptions
8547  );
8548  if (!fetchOptions?.throwOnError) {
8549    promise = promise.catch(noop$1);
8550  }
8551  return promise;
8552}, updateStaleTimeout_fn = function() {
8553  __privateMethod(this, _QueryObserver_instances, clearStaleTimeout_fn).call(this);
8554  const staleTime = resolveStaleTime(
8555    this.options.staleTime,
8556    __privateGet(this, _currentQuery)
8557  );
8558  if (isServer || __privateGet(this, _currentResult).isStale || !isValidTimeout(staleTime)) {
8559    return;
8560  }
8561  const time = timeUntilStale(__privateGet(this, _currentResult).dataUpdatedAt, staleTime);
8562  const timeout = time + 1;
8563  __privateSet(this, _staleTimeoutId, timeoutManager.setTimeout(() => {
8564    if (!__privateGet(this, _currentResult).isStale) {
8565      this.updateResult();
8566    }
8567  }, timeout));
8568}, computeRefetchInterval_fn = function() {
8569  return (typeof this.options.refetchInterval === "function" ? this.options.refetchInterval(__privateGet(this, _currentQuery)) : this.options.refetchInterval) ?? false;
8570}, updateRefetchInterval_fn = function(nextInterval) {
8571  __privateMethod(this, _QueryObserver_instances, clearRefetchInterval_fn).call(this);
8572  __privateSet(this, _currentRefetchInterval, nextInterval);
8573  if (isServer || resolveEnabled(this.options.enabled, __privateGet(this, _currentQuery)) === false || !isValidTimeout(__privateGet(this, _currentRefetchInterval)) || __privateGet(this, _currentRefetchInterval) === 0) {
8574    return;
8575  }
8576  __privateSet(this, _refetchIntervalId, timeoutManager.setInterval(() => {
8577    if (this.options.refetchIntervalInBackground || focusManager.isFocused()) {
8578      __privateMethod(this, _QueryObserver_instances, executeFetch_fn).call(this);
8579    }
8580  }, __privateGet(this, _currentRefetchInterval)));
8581}, updateTimers_fn = function() {
8582  __privateMethod(this, _QueryObserver_instances, updateStaleTimeout_fn).call(this);
8583  __privateMethod(this, _QueryObserver_instances, updateRefetchInterval_fn).call(this, __privateMethod(this, _QueryObserver_instances, computeRefetchInterval_fn).call(this));
8584}, clearStaleTimeout_fn = function() {
8585  if (__privateGet(this, _staleTimeoutId)) {
8586    timeoutManager.clearTimeout(__privateGet(this, _staleTimeoutId));
8587    __privateSet(this, _staleTimeoutId, void 0);
8588  }
8589}, clearRefetchInterval_fn = function() {
8590  if (__privateGet(this, _refetchIntervalId)) {
8591    timeoutManager.clearInterval(__privateGet(this, _refetchIntervalId));
8592    __privateSet(this, _refetchIntervalId, void 0);
8593  }
8594}, updateQuery_fn = function() {
8595  const query = __privateGet(this, _client2).getQueryCache().build(__privateGet(this, _client2), this.options);
8596  if (query === __privateGet(this, _currentQuery)) {
8597    return;
8598  }
8599  const prevQuery = __privateGet(this, _currentQuery);
8600  __privateSet(this, _currentQuery, query);
8601  __privateSet(this, _currentQueryInitialState, query.state);
8602  if (this.hasListeners()) {
8603    prevQuery?.removeObserver(this);
8604    query.addObserver(this);
8605  }
8606}, notify_fn = function(notifyOptions) {
8607  notifyManager.batch(() => {
8608    if (notifyOptions.listeners) {
8609      this.listeners.forEach((listener) => {
8610        listener(__privateGet(this, _currentResult));
8611      });
8612    }
8613    __privateGet(this, _client2).getQueryCache().notify({
8614      query: __privateGet(this, _currentQuery),
8615      type: "observerResultsUpdated"
8616    });
8617  });
8618}, _f);
8619function shouldLoadOnMount(query, options) {
8620  return resolveEnabled(options.enabled, query) !== false && query.state.data === void 0 && !(query.state.status === "error" && options.retryOnMount === false);
8621}
8622function shouldFetchOnMount(query, options) {
8623  return shouldLoadOnMount(query, options) || query.state.data !== void 0 && shouldFetchOn(query, options, options.refetchOnMount);
8624}
8625function shouldFetchOn(query, options, field) {
8626  if (resolveEnabled(options.enabled, query) !== false && resolveStaleTime(options.staleTime, query) !== "static") {
8627    const value = typeof field === "function" ? field(query) : field;
8628    return value === "always" || value !== false && isStale(query, options);
8629  }
8630  return false;
8631}
8632function shouldFetchOptionally(query, prevQuery, options, prevOptions) {
8633  return (query !== prevQuery || resolveEnabled(prevOptions.enabled, query) === false) && (!options.suspense || query.state.status !== "error") && isStale(query, options);
8634}
8635function isStale(query, options) {
8636  return resolveEnabled(options.enabled, query) !== false && query.isStaleByTime(resolveStaleTime(options.staleTime, query));
8637}
8638function shouldAssignObserverCurrentProperties(observer, optimisticResult) {
8639  if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) {
8640    return true;
8641  }
8642  return false;
8643}
8644function infiniteQueryBehavior(pages) {
8645  return {
8646    onFetch: (context, query) => {
8647      const options = context.options;
8648      const direction = context.fetchOptions?.meta?.fetchMore?.direction;
8649      const oldPages = context.state.data?.pages || [];
8650      const oldPageParams = context.state.data?.pageParams || [];
8651      let result = { pages: [], pageParams: [] };
8652      let currentPage = 0;
8653      const fetchFn = async () => {
8654        let cancelled = false;
8655        const addSignalProperty = (object) => {
8656          Object.defineProperty(object, "signal", {
8657            enumerable: true,
8658            get: () => {
8659              if (context.signal.aborted) {
8660                cancelled = true;
8661              } else {
8662                context.signal.addEventListener("abort", () => {
8663                  cancelled = true;
8664                });
8665              }
8666              return context.signal;
8667            }
8668          });
8669        };
8670        const queryFn = ensureQueryFn(context.options, context.fetchOptions);
8671        const fetchPage = async (data, param, previous) => {
8672          if (cancelled) {
8673            return Promise.reject();
8674          }
8675          if (param == null && data.pages.length) {
8676            return Promise.resolve(data);
8677          }
8678          const createQueryFnContext = () => {
8679            const queryFnContext2 = {
8680              client: context.client,
8681              queryKey: context.queryKey,
8682              pageParam: param,
8683              direction: previous ? "backward" : "forward",
8684              meta: context.options.meta
8685            };
8686            addSignalProperty(queryFnContext2);
8687            return queryFnContext2;
8688          };
8689          const queryFnContext = createQueryFnContext();
8690          const page = await queryFn(queryFnContext);
8691          const { maxPages } = context.options;
8692          const addTo = previous ? addToStart : addToEnd;
8693          return {
8694            pages: addTo(data.pages, page, maxPages),
8695            pageParams: addTo(data.pageParams, param, maxPages)
8696          };
8697        };
8698        if (direction && oldPages.length) {
8699          const previous = direction === "backward";
8700          const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;
8701          const oldData = {
8702            pages: oldPages,
8703            pageParams: oldPageParams
8704          };
8705          const param = pageParamFn(options, oldData);
8706          result = await fetchPage(oldData, param, previous);
8707        } else {
8708          const remainingPages = pages ?? oldPages.length;
8709          do {
8710            const param = currentPage === 0 ? oldPageParams[0] ?? options.initialPageParam : getNextPageParam(options, result);
8711            if (currentPage > 0 && param == null) {
8712              break;
8713            }
8714            result = await fetchPage(result, param);
8715            currentPage++;
8716          } while (currentPage < remainingPages);
8717        }
8718        return result;
8719      };
8720      if (context.options.persister) {
8721        context.fetchFn = () => {
8722          return context.options.persister?.(
8723            fetchFn,
8724            {
8725              client: context.client,
8726              queryKey: context.queryKey,
8727              meta: context.options.meta,
8728              signal: context.signal
8729            },
8730            query
8731          );
8732        };
8733      } else {
8734        context.fetchFn = fetchFn;
8735      }
8736    }
8737  };
8738}
8739function getNextPageParam(options, { pages, pageParams }) {
8740  const lastIndex = pages.length - 1;
8741  return pages.length > 0 ? options.getNextPageParam(
8742    pages[lastIndex],
8743    pages,
8744    pageParams[lastIndex],
8745    pageParams
8746  ) : void 0;
8747}
8748function getPreviousPageParam(options, { pages, pageParams }) {
8749  return pages.length > 0 ? options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams) : void 0;
8750}
8751var Mutation = (_g = class extends Removable {
8752  constructor(config) {
8753    super();
8754    __privateAdd(this, _Mutation_instances);
8755    __privateAdd(this, _client3);
8756    __privateAdd(this, _observers);
8757    __privateAdd(this, _mutationCache);
8758    __privateAdd(this, _retryer2);
8759    __privateSet(this, _client3, config.client);
8760    this.mutationId = config.mutationId;
8761    __privateSet(this, _mutationCache, config.mutationCache);
8762    __privateSet(this, _observers, []);
8763    this.state = config.state || getDefaultState();
8764    this.setOptions(config.options);
8765    this.scheduleGc();
8766  }
8767  setOptions(options) {
8768    this.options = options;
8769    this.updateGcTime(this.options.gcTime);
8770  }
8771  get meta() {
8772    return this.options.meta;
8773  }
8774  addObserver(observer) {
8775    if (!__privateGet(this, _observers).includes(observer)) {
8776      __privateGet(this, _observers).push(observer);
8777      this.clearGcTimeout();
8778      __privateGet(this, _mutationCache).notify({
8779        type: "observerAdded",
8780        mutation: this,
8781        observer
8782      });
8783    }
8784  }
8785  removeObserver(observer) {
8786    __privateSet(this, _observers, __privateGet(this, _observers).filter((x2) => x2 !== observer));
8787    this.scheduleGc();
8788    __privateGet(this, _mutationCache).notify({
8789      type: "observerRemoved",
8790      mutation: this,
8791      observer
8792    });
8793  }
8794  optionalRemove() {
8795    if (!__privateGet(this, _observers).length) {
8796      if (this.state.status === "pending") {
8797        this.scheduleGc();
8798      } else {
8799        __privateGet(this, _mutationCache).remove(this);
8800      }
8801    }
8802  }
8803  continue() {
8804    return __privateGet(this, _retryer2)?.continue() ?? // continuing a mutation assumes that variables are set, mutation must have been dehydrated before
8805    this.execute(this.state.variables);
8806  }
8807  async execute(variables) {
8808    const onContinue = () => {
8809      __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { type: "continue" });
8810    };
8811    const mutationFnContext = {
8812      client: __privateGet(this, _client3),
8813      meta: this.options.meta,
8814      mutationKey: this.options.mutationKey
8815    };
8816    __privateSet(this, _retryer2, createRetryer({
8817      fn: () => {
8818        if (!this.options.mutationFn) {
8819          return Promise.reject(new Error("No mutationFn found"));
8820        }
8821        return this.options.mutationFn(variables, mutationFnContext);
8822      },
8823      onFail: (failureCount, error) => {
8824        __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { type: "failed", failureCount, error });
8825      },
8826      onPause: () => {
8827        __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { type: "pause" });
8828      },
8829      onContinue,
8830      retry: this.options.retry ?? 0,
8831      retryDelay: this.options.retryDelay,
8832      networkMode: this.options.networkMode,
8833      canRun: () => __privateGet(this, _mutationCache).canRun(this)
8834    }));
8835    const restored = this.state.status === "pending";
8836    const isPaused = !__privateGet(this, _retryer2).canStart();
8837    try {
8838      if (restored) {
8839        onContinue();
8840      } else {
8841        __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { type: "pending", variables, isPaused });
8842        await __privateGet(this, _mutationCache).config.onMutate?.(
8843          variables,
8844          this,
8845          mutationFnContext
8846        );
8847        const context = await this.options.onMutate?.(
8848          variables,
8849          mutationFnContext
8850        );
8851        if (context !== this.state.context) {
8852          __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, {
8853            type: "pending",
8854            context,
8855            variables,
8856            isPaused
8857          });
8858        }
8859      }
8860      const data = await __privateGet(this, _retryer2).start();
8861      await __privateGet(this, _mutationCache).config.onSuccess?.(
8862        data,
8863        variables,
8864        this.state.context,
8865        this,
8866        mutationFnContext
8867      );
8868      await this.options.onSuccess?.(
8869        data,
8870        variables,
8871        this.state.context,
8872        mutationFnContext
8873      );
8874      await __privateGet(this, _mutationCache).config.onSettled?.(
8875        data,
8876        null,
8877        this.state.variables,
8878        this.state.context,
8879        this,
8880        mutationFnContext
8881      );
8882      await this.options.onSettled?.(
8883        data,
8884        null,
8885        variables,
8886        this.state.context,
8887        mutationFnContext
8888      );
8889      __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { type: "success", data });
8890      return data;
8891    } catch (error) {
8892      try {
8893        await __privateGet(this, _mutationCache).config.onError?.(
8894          error,
8895          variables,
8896          this.state.context,
8897          this,
8898          mutationFnContext
8899        );
8900        await this.options.onError?.(
8901          error,
8902          variables,
8903          this.state.context,
8904          mutationFnContext
8905        );
8906        await __privateGet(this, _mutationCache).config.onSettled?.(
8907          void 0,
8908          error,
8909          this.state.variables,
8910          this.state.context,
8911          this,
8912          mutationFnContext
8913        );
8914        await this.options.onSettled?.(
8915          void 0,
8916          error,
8917          variables,
8918          this.state.context,
8919          mutationFnContext
8920        );
8921        throw error;
8922      } finally {
8923        __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { type: "error", error });
8924      }
8925    } finally {
8926      __privateGet(this, _mutationCache).runNext(this);
8927    }
8928  }
8929}, _client3 = new WeakMap(), _observers = new WeakMap(), _mutationCache = new WeakMap(), _retryer2 = new WeakMap(), _Mutation_instances = new WeakSet(), dispatch_fn2 = function(action) {
8930  const reducer = (state) => {
8931    switch (action.type) {
8932      case "failed":
8933        return {
8934          ...state,
8935          failureCount: action.failureCount,
8936          failureReason: action.error
8937        };
8938      case "pause":
8939        return {
8940          ...state,
8941          isPaused: true
8942        };
8943      case "continue":
8944        return {
8945          ...state,
8946          isPaused: false
8947        };
8948      case "pending":
8949        return {
8950          ...state,
8951          context: action.context,
8952          data: void 0,
8953          failureCount: 0,
8954          failureReason: null,
8955          error: null,
8956          isPaused: action.isPaused,
8957          status: "pending",
8958          variables: action.variables,
8959          submittedAt: Date.now()
8960        };
8961      case "success":
8962        return {
8963          ...state,
8964          data: action.data,
8965          failureCount: 0,
8966          failureReason: null,
8967          error: null,
8968          status: "success",
8969          isPaused: false
8970        };
8971      case "error":
8972        return {
8973          ...state,
8974          data: void 0,
8975          error: action.error,
8976          failureCount: state.failureCount + 1,
8977          failureReason: action.error,
8978          isPaused: false,
8979          status: "error"
8980        };
8981    }
8982  };
8983  this.state = reducer(this.state);
8984  notifyManager.batch(() => {
8985    __privateGet(this, _observers).forEach((observer) => {
8986      observer.onMutationUpdate(action);
8987    });
8988    __privateGet(this, _mutationCache).notify({
8989      mutation: this,
8990      type: "updated",
8991      action
8992    });
8993  });
8994}, _g);
8995function getDefaultState() {
8996  return {
8997    context: void 0,
8998    data: void 0,
8999    error: null,
9000    failureCount: 0,
9001    failureReason: null,
9002    isPaused: false,
9003    status: "idle",
9004    variables: void 0,
9005    submittedAt: 0
9006  };
9007}
9008var MutationCache = (_h = class extends Subscribable {
9009  constructor(config = {}) {
9010    super();
9011    __privateAdd(this, _mutations);
9012    __privateAdd(this, _scopes);
9013    __privateAdd(this, _mutationId);
9014    this.config = config;
9015    __privateSet(this, _mutations, /* @__PURE__ */ new Set());
9016    __privateSet(this, _scopes, /* @__PURE__ */ new Map());
9017    __privateSet(this, _mutationId, 0);
9018  }
9019  build(client2, options, state) {
9020    const mutation = new Mutation({
9021      client: client2,
9022      mutationCache: this,
9023      mutationId: ++__privateWrapper(this, _mutationId)._,
9024      options: client2.defaultMutationOptions(options),
9025      state
9026    });
9027    this.add(mutation);
9028    return mutation;
9029  }
9030  add(mutation) {
9031    __privateGet(this, _mutations).add(mutation);
9032    const scope = scopeFor(mutation);
9033    if (typeof scope === "string") {
9034      const scopedMutations = __privateGet(this, _scopes).get(scope);
9035      if (scopedMutations) {
9036        scopedMutations.push(mutation);
9037      } else {
9038        __privateGet(this, _scopes).set(scope, [mutation]);
9039      }
9040    }
9041    this.notify({ type: "added", mutation });
9042  }
9043  remove(mutation) {
9044    if (__privateGet(this, _mutations).delete(mutation)) {
9045      const scope = scopeFor(mutation);
9046      if (typeof scope === "string") {
9047        const scopedMutations = __privateGet(this, _scopes).get(scope);
9048        if (scopedMutations) {
9049          if (scopedMutations.length > 1) {
9050            const index = scopedMutations.indexOf(mutation);
9051            if (index !== -1) {
9052              scopedMutations.splice(index, 1);
9053            }
9054          } else if (scopedMutations[0] === mutation) {
9055            __privateGet(this, _scopes).delete(scope);
9056          }
9057        }
9058      }
9059    }
9060    this.notify({ type: "removed", mutation });
9061  }
9062  canRun(mutation) {
9063    const scope = scopeFor(mutation);
9064    if (typeof scope === "string") {
9065      const mutationsWithSameScope = __privateGet(this, _scopes).get(scope);
9066      const firstPendingMutation = mutationsWithSameScope?.find(
9067        (m2) => m2.state.status === "pending"
9068      );
9069      return !firstPendingMutation || firstPendingMutation === mutation;
9070    } else {
9071      return true;
9072    }
9073  }
9074  runNext(mutation) {
9075    const scope = scopeFor(mutation);
9076    if (typeof scope === "string") {
9077      const foundMutation = __privateGet(this, _scopes).get(scope)?.find((m2) =>
vendor: 4,272 bytes, lines 9077-9223
9077 m2 !== mutation && m2.state.isPaused);
9078      return foundMutation?.continue() ?? Promise.resolve();
9079    } else {
9080      return Promise.resolve();
9081    }
9082  }
9083  clear() {
9084    notifyManager.batch(() => {
9085      __privateGet(this, _mutations).forEach((mutation) => {
9086        this.notify({ type: "removed", mutation });
9087      });
9088      __privateGet(this, _mutations).clear();
9089      __privateGet(this, _scopes).clear();
9090    });
9091  }
9092  getAll() {
9093    return Array.from(__privateGet(this, _mutations));
9094  }
9095  find(filters) {
9096    const defaultedFilters = { exact: true, ...filters };
9097    return this.getAll().find(
9098      (mutation) => matchMutation(defaultedFilters, mutation)
9099    );
9100  }
9101  findAll(filters = {}) {
9102    return this.getAll().filter((mutation) => matchMutation(filters, mutation));
9103  }
9104  notify(event) {
9105    notifyManager.batch(() => {
9106      this.listeners.forEach((listener) => {
9107        listener(event);
9108      });
9109    });
9110  }
9111  resumePausedMutations() {
9112    const pausedMutations = this.getAll().filter((x2) => x2.state.isPaused);
9113    return notifyManager.batch(
9114      () => Promise.all(
9115        pausedMutations.map((mutation) => mutation.continue().catch(noop$1))
9116      )
9117    );
9118  }
9119}, _mutations = new WeakMap(), _scopes = new WeakMap(), _mutationId = new WeakMap(), _h);
9120function scopeFor(mutation) {
9121  return mutation.options.scope?.id;
9122}
9123var QueryCache = (_i = class extends Subscribable {
9124  constructor(config = {}) {
9125    super();
9126    __privateAdd(this, _queries);
9127    this.config = config;
9128    __privateSet(this, _queries, /* @__PURE__ */ new Map());
9129  }
9130  build(client2, options, state) {
9131    const queryKey = options.queryKey;
9132    const queryHash = options.queryHash ?? hashQueryKeyByOptions(queryKey, options);
9133    let query = this.get(queryHash);
9134    if (!query) {
9135      query = new Query({
9136        client: client2,
9137        queryKey,
9138        queryHash,
9139        options: client2.defaultQueryOptions(options),
9140        state,
9141        defaultOptions: client2.getQueryDefaults(queryKey)
9142      });
9143      this.add(query);
9144    }
9145    return query;
9146  }
9147  add(query) {
9148    if (!__privateGet(this, _queries).has(query.queryHash)) {
9149      __privateGet(this, _queries).set(query.queryHash, query);
9150      this.notify({
9151        type: "added",
9152        query
9153      });
9154    }
9155  }
9156  remove(query) {
9157    const queryInMap = __privateGet(this, _queries).get(query.queryHash);
9158    if (queryInMap) {
9159      query.destroy();
9160      if (queryInMap === query) {
9161        __privateGet(this, _queries).delete(query.queryHash);
9162      }
9163      this.notify({ type: "removed", query });
9164    }
9165  }
9166  clear() {
9167    notifyManager.batch(() => {
9168      this.getAll().forEach((query) => {
9169        this.remove(query);
9170      });
9171    });
9172  }
9173  get(queryHash) {
9174    return __privateGet(this, _queries).get(queryHash);
9175  }
9176  getAll() {
9177    return [...__privateGet(this, _queries).values()];
9178  }
9179  find(filters) {
9180    const defaultedFilters = { exact: true, ...filters };
9181    return this.getAll().find(
9182      (query) => matchQuery(defaultedFilters, query)
9183    );
9184  }
9185  findAll(filters = {}) {
9186    const queries = this.getAll();
9187    return Object.keys(filters).length > 0 ? queries.filter((query) => matchQuery(filters, query)) : queries;
9188  }
9189  notify(event) {
9190    notifyManager.batch(() => {
9191      this.listeners.forEach((listener) => {
9192        listener(event);
9193      });
9194    });
9195  }
9196  onFocus() {
9197    notifyManager.batch(() => {
9198      this.getAll().forEach((query) => {
9199        query.onFocus();
9200      });
9201    });
9202  }
9203  onOnline() {
9204    notifyManager.batch(() => {
9205      this.getAll().forEach((query) => {
9206        query.onOnline();
9207      });
9208    });
9209  }
9210}, _queries = new WeakMap(), _i);
9211var QueryClient = (_j = class {
9212  constructor(config = {}) {
9213    __privateAdd(this, _queryCache);
9214    __privateAdd(this, _mutationCache2);
9215    __privateAdd(this, _defaultOptions2);
9216    __privateAdd(this, _queryDefaults);
9217    __privateAdd(this, _mutationDefaults);
9218    __privateAdd(this, _mountCount);
9219    __privateAdd(this, _unsubscribeFocus);
9220    __privateAdd(this, _unsubscribeOnline);
9221    __privateSet(this, _queryCache, config.queryCache || new QueryCache());
9222    __privateSet(this, _mutationCache2, config.mutationCache || new MutationCache());
9223    __privateSet(this, _defaultOptions2, config.defaultOptions || {});
9224    __privateSet(this, _queryDefaults, /* @__PURE__ */ new Map());
9225    __privateSet(this, _mutationDefaults, /* @__PURE__ */ new Map());
9226    __privateSet(this, _mountCount, 0);
9227  }
9228  mount() {
9229    __privateWrapper(this, _mountCount)._++;
9230    if (__privateGet(this, _mountCount) !== 1) return;
9231    __privateSet(this, _unsubscribeFocus, focusManager.subscribe(async (focused) => {
9232      if (focused) {
9233        await this.resumePausedMutations();
9234        __privateGet(this, _queryCache).onFocus();
9235      }
9236    }));
9237    __privateSet(this, _unsubscribeOnline, onlineManager.subscribe(async (online) => {
9238      if (online) {
9239        await this.resumePausedMutations();
9240        __privateGet(this, _queryCache).onOnline();
9241      }
9242    }));
9243  }
9244  unmount() {
9245    var _a2, _b2;
9246    __privateWrapper(this, _mountCount)._--;
9247    if (__privateGet(this, _mountCount) !== 0) return;
9248    (_a2 = __privateGet(this, _unsubscribeFocus)) == null ? void 0 : _a2.call(this);
9249    __privateSet(this, _unsubscribeFocus, void 0);
9250    (_b2 = __privateGet(this, _unsubscribeOnline)) == null ? void 0 : _b2.call(this);
9251    __privateSet(this, _unsubscribeOnline, void 0);
9252  }
9253  isFetching(filters) {
9254    return __privateGet(this, _queryCache).findAll({ ...filters, fetchStatus: "fetching" }).length;
9255  }
9256  isMutating(filters) {
9257    return __privateGet(this, _mutationCache2).findAll({ ...filters, status: "pending" }).length;
9258  }
9259  /**
9260   * Imperative (non-reactive) way to retrieve data for a QueryKey.
9261   * Should only be used in callbacks or functions where reading the latest data is necessary, e.g. for optimistic updates.
9262   *
9263   * Hint: Do not use this function inside a component, because it won't receive updates.
9264   * Use `useQuery` to create a `QueryObserver` that subscribes to changes.
9265   */
9266  getQueryData(queryKey) {
9267    const options = this.defaultQueryOptions({ queryKey });
9268    return __privateGet(this, _queryCache).get(options.queryHash)?.state.data;
9269  }
9270  ensureQueryData(options) {
9271    const defaultedOptions = this.defaultQueryOptions(options);
9272    const query = __privateGet(this, _queryCache).build(this, defaultedOptions);
9273    const cachedData = query.state.data;
9274    if (cachedData === void 0) {
9275      return this.fetchQuery(options);
9276    }
9277    if (options.revalidateIfStale && query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))) {
9278      void this.prefetchQuery(defaultedOptions);
9279    }
9280    return Promise.resolve(cachedData);
9281  }
9282  getQueriesData(filters) {
9283    return __privateGet(this, _queryCache).findAll(filters).map(({ queryKey, state }) => {
9284      const data = state.data;
9285      return [queryKey, data];
9286    });
9287  }
9288  setQueryData(queryKey, updater, options) {
9289    const defaultedOptions = this.defaultQueryOptions({ queryKey });
9290    const query = __privateGet(this, _queryCache).get(
9291      defaultedOptions.queryHash
9292    );
9293    const prevData = query?.state.data;
9294    const data = functionalUpdate(updater, prevData);
9295    if (data === void 0) {
9296      return void 0;
9297    }
9298    return __privateGet(this, _queryCache).build(this, defaultedOptions).setData(data, { ...options, manual: true });
9299  }
9300  setQueriesData(filters, updater, options) {
9301    return notifyManager.batch(
9302      () => __privateGet(this, _queryCache).findAll(filters).map(({ queryKey }) => [
9303        queryKey,
9304        this.setQueryData(queryKey, updater, options)
9305      ])
9306    );
9307  }
9308  getQueryState(queryKey) {
9309    const options = this.defaultQueryOptions({ queryKey });
9310    return __privateGet(this, _queryCache).get(
9311      options.queryHash
9312    )?.state;
9313  }
9314  removeQueries(filters) {
9315    const queryCache = __privateGet(this, _queryCache);
9316    notifyManager.batch(() => {
9317      queryCache.findAll(filters).forEach((query) => {
9318        queryCache.remove(query);
9319      });
9320    });
9321  }
9322  resetQueries(filters, options) {
9323    const queryCache = __privateGet(this, _queryCache);
9324    return notifyManager.batch(() => {
9325      queryCache.findAll(filters).forEach((query) => {
9326        query.reset();
9327      });
9328      return this.refetchQueries(
9329        {
9330          type: "active",
9331          ...filters
9332        },
9333        options
9334      );
9335    });
9336  }
9337  cancelQueries(filters, cancelOptions = {}) {
9338    const defaultedCancelOptions = { revert: true, ...cancelOptions };
9339    const promises = notifyManager.batch(
9340      () => __privateGet(this, _queryCache).findAll(filters).map((query) => query.cancel(defaultedCancelOptions))
9341    );
9342    return Promise.all(promises).then(noop$1).catch(noop$1);
9343  }
9344  invalidateQueries(filters, options = {}) {
9345    return notifyManager.batch(() => {
9346      __privateGet(this, _queryCache).findAll(filters).forEach((query) => {
9347        query.invalidate();
9348      });
9349      if (filters?.refetchType === "none") {
9350        return Promise.resolve();
9351      }
9352      return this.refetchQueries(
9353        {
9354          ...filters,
9355          type: filters?.refetchType ?? filters?.type ?? "active"
9356        },
9357        options
9358      );
9359    });
9360  }
9361  refetchQueries(filters, options = {}) {
9362    const fetchOptions = {
9363      ...options,
9364      cancelRefetch: options.cancelRefetch ?? true
9365    };
9366    const promises = notifyManager.batch(
9367      () => __privateGet(this, _queryCache).findAll(filters).filter((query) => !query.isDisabled() && !query.isStatic()).map((query) => {
9368        let promise = query.fetch(void 0, fetchOptions);
9369        if (!fetchOptions.throwOnError) {
9370          promise = promise.catch(noop$1);
9371        }
9372        return query.state.fetchStatus === "paused" ? Promise.resolve() : promise;
9373      })
9374    );
9375    return Promise.all(promises).then(noop$1);
9376  }
9377  fetchQuery(options) {
9378    const defaultedOptions = this.defaultQueryOptions(options);
9379    if (defaultedOptions.retry === void 0) {
9380      defaultedOptions.retry = false;
9381    }
9382    const query = __privateGet(this, _queryCache).build(this, defaultedOptions);
9383    return query.isStaleByTime(
9384      resolveStaleTime(defaultedOptions.staleTime, query)
9385    ) ? query.fetch(defaultedOptions) : Promise.resolve(query.state.data);
9386  }
9387  prefetchQuery(options) {
9388    return this.fetchQuery(options).then(noop$1).catch(noop$1);
9389  }
9390  fetchInfiniteQuery(options) {
9391    options.behavior = infiniteQueryBehavior(options.pages);
9392    return this.fetchQuery(options);
9393  }
9394  prefetchInfiniteQuery(options) {
9395    return this.fetchInfiniteQuery(options).then(noop$1).catch(noop$1);
9396  }
9397  ensureInfiniteQueryData(options) {
9398    options.behavior = infiniteQueryBehavior(options.pages);
9399    return this.ensureQueryData(options);
9400  }
9401  resumePausedMutations() {
9402    if (onlineManager.isOnline()) {
9403      return __privateGet(this, _mutationCache2).resumePausedMutations();
9404    }
9405    return Promise.resolve();
9406  }
9407  getQueryCache() {
9408    return __privateGet(this, _queryCache);
9409  }
9410  getMutationCache() {
9411    return __privateGet(this, _mutationCache2);
9412  }
9413  getDefaultOptions() {
9414    return __privateGet(this, _defaultOptions2);
9415  }
9416  setDefaultOptions(options) {
9417    __privateSet(this, _defaultOptions2, options);
9418  }
9419  setQueryDefaults(queryKey, options) {
9420    __privateGet(this, _queryDefaults).set(hashKey(queryKey), {
9421      queryKey,
9422      defaultOptions: options
9423    });
9424  }
9425  getQueryDefaults(queryKey) {
9426    const defaults = [...__privateGet(this, _queryDefaults).values()];
9427    const result = {};
9428    defaults.forEach((queryDefault) => {
9429      if (partialMatchKey(queryKey, queryDefault.queryKey)) {
9430        Object.assign(result, queryDefault.defaultOptions);
9431      }
9432    });
9433    return result;
9434  }
9435  setMutationDefaults(mutationKey, options) {
9436    __privateGet(this, _mutationDefaults).set(hashKey(mutationKey), {
9437      mutationKey,
9438      defaultOptions: options
9439    });
9440  }
9441  getMutationDefaults(mutationKey) {
9442    const defaults = [...__privateGet(this, _mutationDefaults).values()];
9443    const result = {};
9444    defaults.forEach((queryDefault) => {
9445      if (partialMatchKey(mutationKey, queryDefault.mutationKey)) {
9446        Object.assign(result, queryDefault.defaultOptions);
9447      }
9448    });
9449    return result;
9450  }
9451  defaultQueryOptions(options) {
9452    if (options._defaulted) {
9453      return options;
9454    }
9455    const defaultedOptions = {
9456      ...__privateGet(this, _defaultOptions2).queries,
9457      ...this.getQueryDefaults(options.queryKey),
9458      ...options,
9459      _defaulted: true
9460    };
9461    if (!defaultedOptions.queryHash) {
9462      defaultedOptions.queryHash = hashQueryKeyByOptions(
9463        defaultedOptions.queryKey,
9464        defaultedOptions
9465      );
9466    }
9467    if (defaultedOptions.refetchOnReconnect === void 0) {
9468      defaultedOptions.refetchOnReconnect = defaultedOptions.networkMode !== "always";
9469    }
9470    if (defaultedOptions.throwOnError === void 0) {
9471      defaultedOptions.throwOnError = !!defaultedOptions.suspense;
9472    }
9473    if (!defaultedOptions.networkMode && defaultedOptions.persister) {
9474      defaultedOptions.networkMode = "offlineFirst";
9475    }
9476    if (defaultedOptions.queryFn === skipToken) {
9477      defaultedOptions.enabled = false;
9478    }
9479    return defaultedOptions;
9480  }
9481  defaultMutationOptions(options) {
9482    if (options?._defaulted) {
9483      return options;
9484    }
9485    return {
9486      ...__privateGet(this, _defaultOptions2).mutations,
9487      ...options?.mutationKey && this.getMutationDefaults(options.mutationKey),
9488      ...options,
9489      _defaulted: true
9490    };
9491  }
9492  clear() {
9493    __privateGet(this, _queryCache).clear();
9494    __privateGet(this, _mutationCache2).clear();
9495  }
9496}, _queryCache = new WeakMap(), _mutationCache2 = new WeakMap(), _defaultOptions2 = new WeakMap(), _queryDefaults = new WeakMap(), _mutationDefaults = new WeakMap(), _mountCount = new WeakMap(), _unsubscribeFocus = new WeakMap(), _unsubscribeOnline = new WeakMap(), _j);
9497var QueryClientContext = reactExports.createContext(
9498  void 0
9499);
9500var useQueryClient = (queryClient2) => {
9501  const client2 = reactExports.useContext(QueryClientContext);
9502  if (!client2) {
9503    throw new Error("No QueryClient set, use QueryClientProvider to set one");
9504  }
9505  return client2;
9506};
9507var QueryClientProvider = ({
9508  client: client2,
9509  children
9510}) => {
9511  reactExports.useEffect(() => {
9512    client2.mount();
9513    return () => {
9514      client2.unmount();
9515    };
9516  }, [client2]);
9517  return /* @__PURE__ */ jsxRuntimeExports.jsx(QueryClientContext.Provider, { value: client2, children });
9518};
9519var IsRestoringContext = reactExports.createContext(false);
9520var useIsRestoring = () => reactExports.useContext(IsRestoringContext);
9521IsRestoringContext.Provider;
9522function createValue() {
9523  let isReset = false;
9524  return {
9525    clearReset: () => {
9526      isReset = false;
9527    },
9528    reset: () => {
9529      isReset = true;
9530    },
9531    isReset: () => {
9532      return isReset;
9533    }
9534  };
9535}
9536var QueryErrorResetBoundaryContext = reactExports.createContext(createValue());
9537var useQueryErrorResetBoundary = () => reactExports.useContext(QueryErrorResetBoundaryContext);
9538var ensurePreventErrorBoundaryRetry = (options, errorResetBoundary) => {
9539  if (options.suspense || options.throwOnError || options.experimental_prefetchInRender) {
9540    if (!errorResetBoundary.isReset()) {
9541      options.retryOnMount = false;
9542    }
9543  }
9544};
9545var useClearResetErrorBoundary = (errorResetBoundary) => {
9546  reactExports.useEffect(() => {
9547    errorResetBoundary.clearReset();
9548  }, [errorResetBoundary]);
9549};
9550var getHasError = ({
9551  result,
9552  errorResetBoundary,
9553  throwOnError,
9554  query,
9555  suspense
9556}) => {
9557  return result.isError && !errorResetBoundary.isReset() && !result.isFetching && query && (suspense && result.data === void 0 || shouldThrowError(throwOnError, [result.error, query]));
9558};
9559var ensureSuspenseTimers = (defaultedOptions) => {
9560  if (defaultedOptions.suspense) {
9561    const MIN_SUSPENSE_TIME_MS = 1e3;
9562    const clamp = (value) => value === "static" ? value : Math.max(value ?? MIN_SUSPENSE_TIME_MS, MIN_SUSPENSE_TIME_MS);
9563    const originalStaleTime = defaultedOptions.staleTime;
9564    defaultedOptions.staleTime = typeof originalStaleTime === "function" ? (...args) => clamp(originalStaleTime(...args)) : clamp(originalStaleTime);
9565    if (typeof defaultedOptions.gcTime === "number") {
9566      defaultedOptions.gcTime = Math.max(
9567        defaultedOptions.gcTime,
9568        MIN_SUSPENSE_TIME_MS
9569      );
9570    }
9571  }
9572};
9573var willFetch = (result, isRestoring) => result.isLoading && result.isFetching && !isRestoring;
9574var shouldSuspend = (defaultedOptions, result) => defaultedOptions?.suspense && result.isPending;
9575var fetchOptimistic = (defaultedOptions, observer, errorResetBoundary) => observer.fetchOptimistic(defaultedOptions).catch(() => {
9576  errorResetBoundary.clearReset();
9577});
9578function useBaseQuery(options, Observer, queryClient2) {
9579  const isRestoring = useIsRestoring();
9580  const errorResetBoundary = useQueryErrorResetBoundary();
9581  const client2 = useQueryClient();
9582  const defaultedOptions = client2.defaultQueryOptions(options);
9583  client2.getDefaultOptions().queries?._experimental_beforeQuery?.(
9584    defaultedOptions
9585  );
9586  defaultedOptions._optimisticResults = isRestoring ? "isRestoring" : "optimistic";
9587  ensureSuspenseTimers(defaultedOptions);
9588  ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary);
9589  useClearResetErrorBoundary(errorResetBoundary);
9590  const isNewCacheEntry = !client2.getQueryCache().get(defaultedOptions.queryHash);
9591  const [observer] = reactExports.useState(
9592    () => new Observer(
9593      client2,
9594      defaultedOptions
9595    )
9596  );
9597  const result = observer.getOptimisticResult(defaultedOptions);
9598  const shouldSubscribe = !isRestoring && options.subscribed !== false;
9599  reactExports.useSyncExternalStore(
9600    reactExports.useCallback(
9601      (onStoreChange) => {
9602        const unsubscribe = shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop$1;
9603        observer.updateResult();
9604        return unsubscribe;
9605      },
9606      [observer, shouldSubscribe]
9607    ),
9608    () => observer.getCurrentResult(),
9609    () => observer.getCurrentResult()
9610  );
9611  reactExports.useEffect(() => {
9612    observer.setOptions(defaultedOptions);
9613  }, [defaultedOptions, observer]);
9614  if (shouldSuspend(defaultedOptions, result)) {
9615    throw fetchOptimistic(defaultedOptions, observer, errorResetBoundary);
9616  }
9617  if (getHasError({
9618    result,
9619    errorResetBoundary,
9620    throwOnError: defaultedOptions.throwOnError,
9621    query: client2.getQueryCache().get(defaultedOptions.queryHash),
9622    suspense: defaultedOptions.suspense
9623  })) {
9624    throw result.error;
9625  }
9626  client2.getDefaultOptions().queries?._experimental_afterQuery?.(
9627    defaultedOptions,
9628    result
9629  );
9630  if (defaultedOptions.experimental_prefetchInRender && !isServer && willFetch(result, isRestoring)) {
9631    const promise = isNewCacheEntry ? (
9632      // Fetch immediately on render in order to ensure `.promise` is resolved even if the component is unmounted
9633      fetchOptimistic(defaultedOptions, observer, errorResetBoundary)
9634    ) : (
9635      // subscribe to the "cache promise" so that we can finalize the currentThenable once data comes in
9636      client2.getQueryCache().get(defaultedOptions.queryHash)?.promise
9637    );
9638    promise?.catch(noop$1).finally(() => {
9639      observer.updateResult();
9640    });
9641  }
9642  return !defaultedOptions.notifyOnChangeProps ? observer.trackResult(result) : result;
9643}
9644function useQuery(options, queryClient2) {
9645  return useBaseQuery(options, QueryObserver);
9646}
9647/**
9648 * react-router v7.9.3
9649 *
9650 * Copyright (c) Remix Software Inc.
9651 *
9652 * This source code is licensed under the MIT license found in the
9653 * LICENSE.md file in the root directory of this source tree.
9654 *
9655 * @license MIT
9656 */
9657var __typeError2 = (msg) => {
9658  throw TypeError(msg);
9659};
9660var __accessCheck2 = (obj, member, msg) => member.has(obj) || __typeError2("Cannot " + msg);
9661var __privateGet2 = (obj, member, getter) => (__accessCheck2(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
9662var __privateAdd2 = (obj, member, value) => member.has(obj) ? __typeError2("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
9663var PopStateEventType = "popstate";
9664function createBrowserHistory(options = {}) {
9665  function createBrowserLocation(window2, globalHistory) {
9666    let { pathname, search, hash } = window2.location;
9667    return createLocation(
9668      "",
9669      { pathname, search, hash },
9670      // state defaults to `null` because `window.history.state` does
9671      globalHistory.state && globalHistory.state.usr || null,
9672      globalHistory.state && globalHistory.state.key || "default"
9673    );
9674  }
9675  function createBrowserHref(window2, to) {
9676    return typeof to === "string" ? to : createPath(to);
9677  }
9678  return getUrlBasedHistory(
9679    createBrowserLocation,
9680    createBrowserHref,
9681    null,
9682    options
9683  );
9684}
9685function invariant(value, message) {
9686  if (value === false || value === null || typeof value === "undefined") {
9687    throw new Error(message);
9688  }
9689}
9690function warning(cond, message) {
9691  if (!cond) {
9692    if (typeof console !== "undefined") console.warn(message);
9693    try {
9694      throw new Error(message);
9695    } catch (e) {
9696    }
9697  }
9698}
9699function createKey() {
9700  return Math.random().toString(36).substring(2, 10);
9701}
9702function getHistoryState(location, index) {
9703  return {
9704    usr: location.state,
9705    key: location.key,
9706    idx: index
9707  };
9708}
9709function createLocation(current, to, state = null, key) {
9710  let location = {
9711    pathname: typeof current === "string" ? current : current.pathname,
9712    search: "",
9713    hash: "",
9714    ...typeof to === "string" ? parsePath(to) : to,
9715    state,
9716    // TODO: This could be cleaned up.  push/replace should probably just take
9717    // full Locations now and avoid the need to run through this flow at all
9718    // But that's a pretty big refactor to the current test suite so going to
9719    // keep as is for the time being and just let any incoming keys take precedence
9720    key: to && to.key || key || createKey()
9721  };
9722  return location;
9723}
9724function createPath({
9725  pathname = "/",
9726  search = "",
9727  hash = ""
9728}) {
9729  if (search && search !== "?")
9730    pathname += search.charAt(0) === "?" ? search : "?" + search;
9731  if (hash && hash !== "#")
9732    pathname += hash.charAt(0) === "#" ? hash : "#" + hash;
9733  return pathname;
9734}
9735function parsePath(path) {
9736  let parsedPath = {};
9737  if (path) {
9738    let hashIndex = path.indexOf("#");
9739    if (hashIndex >= 0) {
9740      parsedPath.hash = path.substring(hashIndex);
9741      path = path.substring(0, hashIndex);
9742    }
9743    let searchIndex = path.indexOf("?");
9744    if (searchIndex >= 0) {
9745      parsedPath.search = path.substring(searchIndex);
9746      path = path.substring(0, searchIndex);
9747    }
9748    if (path) {
9749      parsedPath.pathname = path;
9750    }
9751  }
9752  return parsedPath;
9753}
9754function getUrlBasedHistory(getLocation, createHref2, validateLocation, options = {}) {
9755  let { window: window2 = document.defaultView, v5Compat = false } = options;
9756  let globalHistory = window2.history;
9757  let action = "POP";
9758  let listener = null;
9759  let index = getIndex();
9760  if (index == null) {
9761    index = 0;
9762    globalHistory.replaceState({ ...globalHistory.state, idx: index }, "");
9763  }
9764  function getIndex() {
9765    let state = globalHistory.state || { idx: null };
9766    return state.idx;
9767  }
9768  function handlePop() {
9769    action = "POP";
9770    let nextIndex = getIndex();
9771    let delta = nextIndex == null ? null : nextIndex - index;
9772    index = nextIndex;
9773    if (listener) {
9774      listener({ action, location: history.location, delta });
9775    }
9776  }
9777  function push(to, state) {
9778    action = "PUSH";
9779    let location = createLocation(history.location, to, state);
9780    index = getIndex() + 1;
9781    let historyState = getHistoryState(location, index);
9782    let url = history.createHref(location);
9783    try {
9784      globalHistory.pushState(historyState, "", url);
9785    } catch (error) {
9786      if (error instanceof DOMException && error.name === "DataCloneError") {
9787        throw error;
9788      }
9789      window2.location.assign(url);
9790    }
9791    if (v5Compat && listener) {
9792      listener({ action, location: history.location, delta: 1 });
9793    }
9794  }
9795  function replace2(to, state) {
9796    action = "REPLACE";
9797    let location = createLocation(history.location, to, state);
9798    index = getIndex();
9799    let historyState = getHistoryState(location, index);
9800    let url = history.createHref(location);
9801    globalHistory.replaceState(historyState, "", url);
9802    if (v5Compat && listener) {
9803      listener({ action, location: history.location, delta: 0 });
9804    }
9805  }
9806  function createURL(to) {
9807    return createBrowserURLImpl(to);
9808  }
9809  let history = {
9810    get action() {
9811      return action;
9812    },
9813    get location() {
9814      return getLocation(window2, globalHistory);
9815    },
9816    listen(fn) {
9817      if (listener) {
9818        throw new Error("A history only accepts one active listener");
9819      }
9820      window2.addEventListener(PopStateEventType, handlePop);
9821      listener = fn;
9822      return () => {
9823        window2.removeEventListener(PopStateEventType, handlePop);
9824        listener = null;
9825      };
9826    },
9827    createHref(to) {
9828      return createHref2(window2, to);
9829    },
9830    createURL,
9831    encodeLocation(to) {
9832      let url = createURL(to);
9833      return {
9834        pathname: url.pathname,
9835        search: url.search,
9836        hash: url.hash
9837      };
9838    },
9839    push,
9840    replace: replace2,
9841    go(n2) {
9842      return globalHistory.go(n2);
9843    }
9844  };
9845  return history;
9846}
9847function createBrowserURLImpl(to, isAbsolute = false) {
9848  let base = "http://localhost";
9849  if (typeof window !== "undefined") {
9850    base = window.location.origin !== "null" ? window.location.origin : window.location.href;
9851  }
9852  invariant(base, "No window.location.(origin|href) available to create URL");
9853  let href = typeof to === "string" ? to : createPath(to);
9854  href = href.replace(/ $/, "%20");
9855  if (!isAbsolute && href.startsWith("//")) {
9856    href = base + href;
9857  }
9858  return new URL(href, base);
9859}
9860var _map;
9861var RouterContextProvider = class {
9862  /**
9863   * Create a new `RouterContextProvider` instance
9864   * @param init An optional initial context map to populate the provider with
9865   */
9866  constructor(init) {
9867    __privateAdd2(this, _map, /* @__PURE__ */ new Map());
9868    if (init) {
9869      for (let [context, value] of init) {
9870        this.set(context, value);
9871      }
9872    }
9873  }
9874  /**
9875   * Access a value from the context. If no value has been set for the context,
9876   * it will return the context's `defaultValue` if provided, or throw an error
9877   * if no `defaultValue` was set.
9878   * @param context The context to get the value for
9879   * @returns The value for the context, or the context's `defaultValue` if no
9880   * value was set
9881   */
9882  get(context) {
9883    if (__privateGet2(this, _map).has(context)) {
9884      return __privateGet2(this, _map).get(context);
9885    }
9886    if (context.defaultValue !== void 0) {
9887      return context.defaultValue;
9888    }
9889    throw new Error("No value found for context");
9890  }
9891  /**
9892   * Set a value for the context. If the context already has a value set, this
9893   * will overwrite it.
9894   *
9895   * @param context The context to set the value for
9896   * @param value The value to set for the context
9897   * @returns {void}
9898   */
9899  set(context, value) {
9900    __privateGet2(this, _map).set(context, value);
9901  }
9902};
9903_map = /* @__PURE__ */ new WeakMap();
9904var unsupportedLazyRouteObjectKeys = /* @__PURE__ */ new Set([
9905  "lazy",
9906  "caseSensitive",
9907  "path",
9908  "id",
9909  "index",
9910  "children"
9911]);
9912function isUnsupportedLazyRouteObjectKey(key) {
9913  return unsupportedLazyRouteObjectKeys.has(
9914    key
9915  );
9916}
9917var unsupportedLazyRouteFunctionKeys = /* @__PURE__ */ new Set([
9918  "lazy",
9919  "caseSensitive",
9920  "path",
9921  "id",
9922  "index",
9923  "middleware",
9924  "children"
9925]);
9926function isUnsupportedLazyRouteFunctionKey(key) {
9927  return unsupportedLazyRouteFunctionKeys.has(
9928    key
9929  );
9930}
9931function isIndexRoute(route) {
9932  return route.index === true;
9933}
9934function convertRoutesToDataRoutes(routes, mapRouteProperties2, parentPath = [], manifest = {}, allowInPlaceMutations = false) {
9935  return routes.map((route, index) => {
9936    let treePath = [...parentPath, String(index)];
9937    let id2 = typeof route.id === "string" ? route.id : treePath.join("-");
9938    invariant(
9939      route.index !== true || !route.children,
9940      `Cannot specify children on an index route`
9941    );
9942    invariant(
9943      allowInPlaceMutations || !manifest[id2],
9944      `Found a route id collision on id "${id2}".  Route id's must be globally unique within Data Router usages`
9945    );
9946    if (isIndexRoute(route)) {
9947      let indexRoute = {
9948        ...route,
9949        ...mapRouteProperties2(route),
9950        id: id2
9951      };
9952      manifest[id2] = indexRoute;
9953      return indexRoute;
9954    } else {
9955      let pathOrLayoutRoute = {
9956        ...route,
9957        ...mapRouteProperties2(route),
9958        id: id2,
9959        children: void 0
9960      };
9961      manifest[id2] = pathOrLayoutRoute;
9962      if (route.children) {
9963        pathOrLayoutRoute.children = convertRoutesToDataRoutes(
9964          route.children,
9965          mapRouteProperties2,
9966          treePath,
9967          manifest,
9968          allowInPlaceMutations
9969        );
9970      }
9971      return pathOrLayoutRoute;
9972    }
9973  });
9974}
9975function matchRoutes(routes, locationArg, basename = "/") {
9976  return matchRoutesImpl(routes, locationArg, basename, false);
9977}
9978function matchRoutesImpl(routes, locationArg, basename, allowPartial) {
9979  let location = typeof locationArg === "string" ? parsePath(locationArg) : locationArg;
9980  let pathname = stripBasename(location.pathname || "/", basename);
9981  if (pathname == null) {
9982    return null;
9983  }
9984  let branches = flattenRoutes(routes);
9985  rankRouteBranches(branches);
9986  let matches = null;
9987  for (let i = 0; matches == null && i < branches.length; ++i) {
9988    let decoded = decodePath(pathname);
9989    matches = matchRouteBranch(
9990      branches[i],
9991      decoded,
9992      allowPartial
9993    );
9994  }
9995  return matches;
9996}
9997function convertRouteMatchToUiMatch(match, loaderData) {
9998  let { route, pathname, params } = match;
9999  return {
10000    id: route.id,
10001    pathname,
10002    params,
10003    data: loaderData[route.id],
10004    loaderData: loaderData[route.id],
10005    handle: route.handle
10006  };
10007}
10008function flattenRoutes(routes, branches = [], parentsMeta = [], parentPath = "", _hasParentOptionalSegments = false) {
10009  let flattenRoute = (route, index, hasParentOptionalSegments = _hasParentOptionalSegments, relativePath) => {
10010    let meta = {
10011      relativePath: relativePath === void 0 ? route.path || "" : relativePath,
10012      caseSensitive: route.caseSensitive === true,
10013      childrenIndex: index,
10014      route
10015    };
10016    if (meta.relativePath.startsWith("/")) {
10017      if (!meta.relativePath.startsWith(parentPath) && hasParentOptionalSegments) {
10018        return;
10019      }
10020      invariant(
10021        meta.relativePath.startsWith(parentPath),
10022        `Absolute route path "${meta.relativePath}" nested under path "${parentPath}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`
10023      );
10024      meta.relativePath = meta.relativePath.slice(parentPath.length);
10025    }
10026    let path = joinPaths([parentPath, meta.relativePath]);
10027    let routesMeta = parentsMeta.concat(meta);
10028    if (route.children && route.children.length > 0) {
10029      invariant(
10030        // Our types know better, but runtime JS may not!
10031        // @ts-expect-error
10032        route.index !== true,
10033        `Index routes must not have child routes. Please remove all child routes from route path "${path}".`
10034      );
10035      flattenRoutes(
10036        route.children,
10037        branches,
10038        routesMeta,
10039        path,
10040        hasParentOptionalSegments
10041      );
10042    }
10043    if (route.path == null && !route.index) {
10044      return;
10045    }
10046    branches.push({
10047      path,
10048      score: computeScore(path, route.index),
10049      routesMeta
10050    });
10051  };
10052  routes.forEach((route, index) => {
10053    if (route.path === "" || !route.path?.includes("?")) {
10054      flattenRoute(route, index);
10055    } else {
10056      for (let exploded of explodeOptionalSegments(route.path)) {
10057        flattenRoute(route, index, true, exploded);
10058      }
10059    }
10060  });
10061  return branches;
10062}
10063function explodeOptionalSegments(path) {
10064  let segments = path.split("/");
10065  if (segments.length === 0) return [];
10066  let [first, ...rest] = segments;
10067  let isOptional = first.endsWith("?");
10068  let required = first.replace(/\?$/, "");
10069  if (rest.length === 0) {
10070    return isOptional ? [required, ""] : [required];
10071  }
vendor: 10,167 bytes, lines 10072-10364
10072  let restExploded = explodeOptionalSegments(rest.join("/"));
10073  let result = [];
10074  result.push(
10075    ...restExploded.map(
10076      (subpath) => subpath === "" ? required : [required, subpath].join("/")
10077    )
10078  );
10079  if (isOptional) {
10080    result.push(...restExploded);
10081  }
10082  return result.map(
10083    (exploded) => path.startsWith("/") && exploded === "" ? "/" : exploded
10084  );
10085}
10086function rankRouteBranches(branches) {
10087  branches.sort(
10088    (a, b) => a.score !== b.score ? b.score - a.score : compareIndexes(
10089      a.routesMeta.map((meta) => meta.childrenIndex),
10090      b.routesMeta.map((meta) => meta.childrenIndex)
10091    )
10092  );
10093}
10094var paramRe = /^:[\w-]+$/;
10095var dynamicSegmentValue = 3;
10096var indexRouteValue = 2;
10097var emptySegmentValue = 1;
10098var staticSegmentValue = 10;
10099var splatPenalty = -2;
10100var isSplat = (s) => s === "*";
10101function computeScore(path, index) {
10102  let segments = path.split("/");
10103  let initialScore = segments.length;
10104  if (segments.some(isSplat)) {
10105    initialScore += splatPenalty;
10106  }
10107  if (index) {
10108    initialScore += indexRouteValue;
10109  }
10110  return segments.filter((s) => !isSplat(s)).reduce(
10111    (score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === "" ? emptySegmentValue : staticSegmentValue),
10112    initialScore
10113  );
10114}
10115function compareIndexes(a, b) {
10116  let siblings = a.length === b.length && a.slice(0, -1).every((n2, i) => n2 === b[i]);
10117  return siblings ? (
10118    // If two routes are siblings, we should try to match the earlier sibling
10119    // first. This allows people to have fine-grained control over the matching
10120    // behavior by simply putting routes with identical paths in the order they
10121    // want them tried.
10122    a[a.length - 1] - b[b.length - 1]
10123  ) : (
10124    // Otherwise, it doesn't really make sense to rank non-siblings by index,
10125    // so they sort equally.
10126    0
10127  );
10128}
10129function matchRouteBranch(branch, pathname, allowPartial = false) {
10130  let { routesMeta } = branch;
10131  let matchedParams = {};
10132  let matchedPathname = "/";
10133  let matches = [];
10134  for (let i = 0; i < routesMeta.length; ++i) {
10135    let meta = routesMeta[i];
10136    let end = i === routesMeta.length - 1;
10137    let remainingPathname = matchedPathname === "/" ? pathname : pathname.slice(matchedPathname.length) || "/";
10138    let match = matchPath(
10139      { path: meta.relativePath, caseSensitive: meta.caseSensitive, end },
10140      remainingPathname
10141    );
10142    let route = meta.route;
10143    if (!match && end && allowPartial && !routesMeta[routesMeta.length - 1].route.index) {
10144      match = matchPath(
10145        {
10146          path: meta.relativePath,
10147          caseSensitive: meta.caseSensitive,
10148          end: false
10149        },
10150        remainingPathname
10151      );
10152    }
10153    if (!match) {
10154      return null;
10155    }
10156    Object.assign(matchedParams, match.params);
10157    matches.push({
10158      // TODO: Can this as be avoided?
10159      params: matchedParams,
10160      pathname: joinPaths([matchedPathname, match.pathname]),
10161      pathnameBase: normalizePathname(
10162        joinPaths([matchedPathname, match.pathnameBase])
10163      ),
10164      route
10165    });
10166    if (match.pathnameBase !== "/") {
10167      matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);
10168    }
10169  }
10170  return matches;
10171}
10172function matchPath(pattern, pathname) {
10173  if (typeof pattern === "string") {
10174    pattern = { path: pattern, caseSensitive: false, end: true };
10175  }
10176  let [matcher, compiledParams] = compilePath(
10177    pattern.path,
10178    pattern.caseSensitive,
10179    pattern.end
10180  );
10181  let match = pathname.match(matcher);
10182  if (!match) return null;
10183  let matchedPathname = match[0];
10184  let pathnameBase = matchedPathname.replace(/(.)\/+$/, "$1");
10185  let captureGroups = match.slice(1);
10186  let params = compiledParams.reduce(
10187    (memo2, { paramName, isOptional }, index) => {
10188      if (paramName === "*") {
10189        let splatValue = captureGroups[index] || "";
10190        pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\/+$/, "$1");
10191      }
10192      const value = captureGroups[index];
10193      if (isOptional && !value) {
10194        memo2[paramName] = void 0;
10195      } else {
10196        memo2[paramName] = (value || "").replace(/%2F/g, "/");
10197      }
10198      return memo2;
10199    },
10200    {}
10201  );
10202  return {
10203    params,
10204    pathname: matchedPathname,
10205    pathnameBase,
10206    pattern
10207  };
10208}
10209function compilePath(path, caseSensitive = false, end = true) {
10210  warning(
10211    path === "*" || !path.endsWith("*") || path.endsWith("/*"),
10212    `Route path "${path}" will be treated as if it were "${path.replace(/\*$/, "/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${path.replace(/\*$/, "/*")}".`
10213  );
10214  let params = [];
10215  let regexpSource = "^" + path.replace(/\/*\*?$/, "").replace(/^\/*/, "/").replace(/[\\.*+^${}|()[\]]/g, "\\$&").replace(
10216    /\/:([\w-]+)(\?)?/g,
10217    (_, paramName, isOptional) => {
10218      params.push({ paramName, isOptional: isOptional != null });
10219      return isOptional ? "/?([^\\/]+)?" : "/([^\\/]+)";
10220    }
10221  ).replace(/\/([\w-]+)\?(\/|$)/g, "(/$1)?$2");
10222  if (path.endsWith("*")) {
10223    params.push({ paramName: "*" });
10224    regexpSource += path === "*" || path === "/*" ? "(.*)$" : "(?:\\/(.+)|\\/*)$";
10225  } else if (end) {
10226    regexpSource += "\\/*$";
10227  } else if (path !== "" && path !== "/") {
10228    regexpSource += "(?:(?=\\/|$))";
10229  } else ;
10230  let matcher = new RegExp(regexpSource, caseSensitive ? void 0 : "i");
10231  return [matcher, params];
10232}
10233function decodePath(value) {
10234  try {
10235    return value.split("/").map((v2) => decodeURIComponent(v2).replace(/\//g, "%2F")).join("/");
10236  } catch (error) {
10237    warning(
10238      false,
10239      `The URL path "${value}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${error}).`
10240    );
10241    return value;
10242  }
10243}
10244function stripBasename(pathname, basename) {
10245  if (basename === "/") return pathname;
10246  if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {
10247    return null;
10248  }
10249  let startIndex = basename.endsWith("/") ? basename.length - 1 : basename.length;
10250  let nextChar = pathname.charAt(startIndex);
10251  if (nextChar && nextChar !== "/") {
10252    return null;
10253  }
10254  return pathname.slice(startIndex) || "/";
10255}
10256function prependBasename({
10257  basename,
10258  pathname
10259}) {
10260  return pathname === "/" ? basename : joinPaths([basename, pathname]);
10261}
10262function resolvePath(to, fromPathname = "/") {
10263  let {
10264    pathname: toPathname,
10265    search = "",
10266    hash = ""
10267  } = typeof to === "string" ? parsePath(to) : to;
10268  let pathname = toPathname ? toPathname.startsWith("/") ? toPathname : resolvePathname(toPathname, fromPathname) : fromPathname;
10269  return {
10270    pathname,
10271    search: normalizeSearch(search),
10272    hash: normalizeHash(hash)
10273  };
10274}
10275function resolvePathname(relativePath, fromPathname) {
10276  let segments = fromPathname.replace(/\/+$/, "").split("/");
10277  let relativeSegments = relativePath.split("/");
10278  relativeSegments.forEach((segment) => {
10279    if (segment === "..") {
10280      if (segments.length > 1) segments.pop();
10281    } else if (segment !== ".") {
10282      segments.push(segment);
10283    }
10284  });
10285  return segments.length > 1 ? segments.join("/") : "/";
10286}
10287function getInvalidPathError(char, field, dest, path) {
10288  return `Cannot include a '${char}' character in a manually specified \`to.${field}\` field [${JSON.stringify(
10289    path
10290  )}].  Please separate it out to the \`to.${dest}\` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.`;
10291}
10292function getPathContributingMatches(matches) {
10293  return matches.filter(
10294    (match, index) => index === 0 || match.route.path && match.route.path.length > 0
10295  );
10296}
10297function getResolveToMatches(matches) {
10298  let pathMatches = getPathContributingMatches(matches);
10299  return pathMatches.map(
10300    (match, idx) => idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase
10301  );
10302}
10303function resolveTo(toArg, routePathnames, locationPathname, isPathRelative = false) {
10304  let to;
10305  if (typeof toArg === "string") {
10306    to = parsePath(toArg);
10307  } else {
10308    to = { ...toArg };
10309    invariant(
10310      !to.pathname || !to.pathname.includes("?"),
10311      getInvalidPathError("?", "pathname", "search", to)
10312    );
10313    invariant(
10314      !to.pathname || !to.pathname.includes("#"),
10315      getInvalidPathError("#", "pathname", "hash", to)
10316    );
10317    invariant(
10318      !to.search || !to.search.includes("#"),
10319      getInvalidPathError("#", "search", "hash", to)
10320    );
10321  }
10322  let isEmptyPath = toArg === "" || to.pathname === "";
10323  let toPathname = isEmptyPath ? "/" : to.pathname;
10324  let from;
10325  if (toPathname == null) {
10326    from = locationPathname;
10327  } else {
10328    let routePathnameIndex = routePathnames.length - 1;
10329    if (!isPathRelative && toPathname.startsWith("..")) {
10330      let toSegments = toPathname.split("/");
10331      while (toSegments[0] === "..") {
10332        toSegments.shift();
10333        routePathnameIndex -= 1;
10334      }
10335      to.pathname = toSegments.join("/");
10336    }
10337    from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : "/";
10338  }
10339  let path = resolvePath(to, from);
10340  let hasExplicitTrailingSlash = toPathname && toPathname !== "/" && toPathname.endsWith("/");
10341  let hasCurrentTrailingSlash = (isEmptyPath || toPathname === ".") && locationPathname.endsWith("/");
10342  if (!path.pathname.endsWith("/") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) {
10343    path.pathname += "/";
10344  }
10345  return path;
10346}
10347var joinPaths = (paths) => paths.join("/").replace(/\/\/+/g, "/");
10348var normalizePathname = (pathname) => pathname.replace(/\/+$/, "").replace(/^\/*/, "/");
10349var normalizeSearch = (search) => !search || search === "?" ? "" : search.startsWith("?") ? search : "?" + search;
10350var normalizeHash = (hash) => !hash || hash === "#" ? "" : hash.startsWith("#") ? hash : "#" + hash;
10351var ErrorResponseImpl = class {
10352  constructor(status, statusText, data2, internal = false) {
10353    this.status = status;
10354    this.statusText = statusText || "";
10355    this.internal = internal;
10356    if (data2 instanceof Error) {
10357      this.data = data2.toString();
10358      this.error = data2;
10359    } else {
10360      this.data = data2;
10361    }
10362  }
10363};
10364function isRouteErrorResponse(error) {
10365  return error != null && typeof error.status === "number" && typeof error.statusText === "string" && typeof error.internal === "boolean" && "data" in error;
10366}
10367var validMutationMethodsArr = [
10368  "POST",
10369  "PUT",
10370  "PATCH",
10371  "DELETE"
10372];
10373var validMutationMethods = new Set(
10374  validMutationMethodsArr
10375);
10376var validRequestMethodsArr = [
10377  "GET",
10378  ...validMutationMethodsArr
10379];
10380var validRequestMethods = new Set(validRequestMethodsArr);
10381var redirectStatusCodes = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);
10382var redirectPreserveMethodStatusCodes = /* @__PURE__ */ new Set([307, 308]);
10383var IDLE_NAVIGATION = {
10384  state: "idle",
10385  location: void 0,
10386  formMethod: void 0,
10387  formAction: void 0,
10388  formEncType: void 0,
10389  formData: void 0,
10390  json: void 0,
10391  text: void 0
10392};
10393var IDLE_FETCHER = {
10394  state: "idle",
10395  data: void 0,
10396  formMethod: void 0,
10397  formAction: void 0,
10398  formEncType: void 0,
10399  formData: void 0,
10400  json: void 0,
10401  text: void 0
10402};
10403var IDLE_BLOCKER = {
10404  state: "unblocked",
10405  proceed: void 0,
10406  reset: void 0,
10407  location: void 0
10408};
10409var ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
10410var isAbsoluteUrl = (url) => ABSOLUTE_URL_REGEX.test(url);
10411var defaultMapRouteProperties = (route) => ({
10412  hasErrorBoundary: Boolean(route.hasErrorBoundary)
10413});
10414var TRANSITIONS_STORAGE_KEY = "remix-router-transitions";
10415var ResetLoaderDataSymbol = Symbol("ResetLoaderData");
10416function createRouter(init) {
10417  const routerWindow = init.window ? init.window : typeof window !== "undefined" ? window : void 0;
10418  const isBrowser2 = typeof routerWindow !== "undefined" && typeof routerWindow.document !== "undefined" && typeof routerWindow.document.createElement !== "undefined";
10419  invariant(
10420    init.routes.length > 0,
10421    "You must provide a non-empty routes array to createRouter"
10422  );
10423  let hydrationRouteProperties2 = init.hydrationRouteProperties || [];
10424  let mapRouteProperties2 = init.mapRouteProperties || defaultMapRouteProperties;
10425  let manifest = {};
10426  let dataRoutes = convertRoutesToDataRoutes(
10427    init.routes,
10428    mapRouteProperties2,
10429    void 0,
10430    manifest
10431  );
10432  let inFlightDataRoutes;
10433  let basename = init.basename || "/";
10434  if (!basename.startsWith("/")) {
10435    basename = `/${basename}`;
10436  }
10437  let dataStrategyImpl = init.dataStrategy || defaultDataStrategyWithMiddleware;
10438  let future = {
10439    ...init.future
10440  };
10441  let unlistenHistory = null;
10442  let subscribers = /* @__PURE__ */ new Set();
10443  let savedScrollPositions2 = null;
10444  let getScrollRestorationKey2 = null;
10445  let getScrollPosition = null;
10446  let initialScrollRestored = init.hydrationData != null;
10447  let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);
10448  let initialMatchesIsFOW = false;
10449  let initialErrors = null;
10450  let initialized;
10451  if (initialMatches == null && !init.patchRoutesOnNavigation) {
10452    let error = getInternalRouterError(404, {
10453      pathname: init.history.location.pathname
10454    });
10455    let { matches, route } = getShortCircuitMatches(dataRoutes);
10456    initialized = true;
10457    initialMatches = matches;
10458    initialErrors = { [route.id]: error };
10459  } else {
10460    if (initialMatches && !init.hydrationData) {
10461      let fogOfWar = checkFogOfWar(
10462        initialMatches,
10463        dataRoutes,
10464        init.history.location.pathname
10465      );
10466      if (fogOfWar.active) {
10467        initialMatches = null;
10468      }
10469    }
10470    if (!initialMatches) {
10471      initialized = false;
10472      initialMatches = [];
10473      let fogOfWar = checkFogOfWar(
10474        null,
10475        dataRoutes,
10476        init.history.location.pathname
10477      );
10478      if (fogOfWar.active && fogOfWar.matches) {
10479        initialMatchesIsFOW = true;
10480        initialMatches = fogOfWar.matches;
10481      }
10482    } else if (initialMatches.some((m2) => m2.route.lazy)) {
10483      initialized = false;
10484    } else if (!initialMatches.some((m2) => routeHasLoaderOrMiddleware(m2.route))) {
10485      initialized = true;
10486    } else {
10487      let loaderData = init.hydrationData ? init.hydrationData.loaderData : null;
10488      let errors = init.hydrationData ? init.hydrationData.errors : null;
10489      if (errors) {
10490        let idx = initialMatches.findIndex(
10491          (m2) => errors[m2.route.id] !== void 0
10492        );
10493        initialized = initialMatches.slice(0, idx + 1).every(
10494          (m2) => !shouldLoadRouteOnHydration(m2.route, loaderData, errors)
10495        );
10496      } else {
10497        initialized = initialMatches.every(
10498          (m2) => !shouldLoadRouteOnHydration(m2.route, loaderData, errors)
10499        );
10500      }
10501    }
10502  }
10503  let router2;
10504  let state = {
10505    historyAction: init.history.action,
10506    location: init.history.location,
10507    matches: initialMatches,
10508    initialized,
10509    navigation: IDLE_NAVIGATION,
10510    // Don't restore on initial updateState() if we were SSR'd
10511    restoreScrollPosition: init.hydrationData != null ? false : null,
10512    preventScrollReset: false,
10513    revalidation: "idle",
10514    loaderData: init.hydrationData && init.hydrationData.loaderData || {},
10515    actionData: init.hydrationData && init.hydrationData.actionData || null,
10516    errors: init.hydrationData && init.hydrationData.errors || initialErrors,
10517    fetchers: /* @__PURE__ */ new Map(),
10518    blockers: /* @__PURE__ */ new Map()
10519  };
10520  let pendingAction = "POP";
10521  let pendingPreventScrollReset = false;
10522  let pendingNavigationController;
10523  let pendingViewTransitionEnabled = false;
10524  let appliedViewTransitions = /* @__PURE__ */ new Map();
10525  let removePageHideEventListener = null;
10526  let isUninterruptedRevalidation = false;
10527  let isRevalidationRequired = false;
10528  let cancelledFetcherLoads = /* @__PURE__ */ new Set();
10529  let fetchControllers = /* @__PURE__ */ new Map();
10530  let incrementingLoadId = 0;
10531  let pendingNavigationLoadId = -1;
10532  let fetchReloadIds = /* @__PURE__ */ new Map();
10533  let fetchRedirectIds = /* @__PURE__ */ new Set();
10534  let fetchLoadMatches = /* @__PURE__ */ new Map();
10535  let activeFetchers = /* @__PURE__ */ new Map();
10536  let fetchersQueuedForDeletion = /* @__PURE__ */ new Set();
10537  let blockerFunctions = /* @__PURE__ */ new Map();
10538  let unblockBlockerHistoryUpdate = void 0;
10539  let pendingRevalidationDfd = null;
10540  function initialize() {
10541    unlistenHistory = init.history.listen(
10542      ({ action: historyAction, location, delta }) => {
10543        if (unblockBlockerHistoryUpdate) {
10544          unblockBlockerHistoryUpdate();
10545          unblockBlockerHistoryUpdate = void 0;
10546          return;
10547        }
10548        warning(
10549          blockerFunctions.size === 0 || delta != null,
10550          "You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs.  This can also happen if you are using createHashRouter and the user manually changes the URL."
10551        );
10552        let blockerKey = shouldBlockNavigation({
10553          currentLocation: state.location,
10554          nextLocation: location,
10555          historyAction
10556        });
10557        if (blockerKey && delta != null) {
10558          let nextHistoryUpdatePromise = new Promise((resolve) => {
10559            unblockBlockerHistoryUpdate = resolve;
10560          });
10561          init.history.go(delta * -1);
10562          updateBlocker(blockerKey, {
10563            state: "blocked",
10564            location,
10565            proceed() {
10566              updateBlocker(blockerKey, {
10567                state: "proceeding",
10568                proceed: void 0,
10569                reset: void 0,
10570                location
10571              });
10572              nextHistoryUpdatePromise.then(() => init.history.go(delta));
10573            },
10574            reset() {
10575              let blockers = new Map(state.blockers);
10576              blockers.set(blockerKey, IDLE_BLOCKER);
10577              updateState({ blockers });
10578            }
10579          });
10580          return;
10581        }
10582        return startNavigation(historyAction, location);
10583      }
10584    );
10585    if (isBrowser2) {
10586      restoreAppliedTransitions(routerWindow, appliedViewTransitions);
10587      let _saveAppliedTransitions = () => persistAppliedTransitions(routerWindow, appliedViewTransitions);
10588      routerWindow.addEventListener("pagehide", _saveAppliedTransitions);
10589      removePageHideEventListener = () => routerWindow.removeEventListener("pagehide", _saveAppliedTransitions);
10590    }
10591    if (!state.initialized) {
10592      startNavigation("POP", state.location, {
10593        initialHydration: true
10594      });
10595    }
10596    return router2;
10597  }
10598  function dispose() {
10599    if (unlistenHistory) {
10600      unlistenHistory();
10601    }
10602    if (removePageHideEventListener) {
10603      removePageHideEventListener();
10604    }
10605    subscribers.clear();
10606    pendingNavigationController && pendingNavigationController.abort();
10607    state.fetchers.forEach((_, key) => deleteFetcher(key));
10608    state.blockers.forEach((_, key) => deleteBlocker(key));
10609  }
10610  function subscribe(fn) {
10611    subscribers.add(fn);
10612    return () => subscribers.delete(fn);
10613  }
10614  function updateState(newState, opts = {}) {
10615    if (newState.matches) {
10616      newState.matches = newState.matches.map((m2) => {
10617        let route = manifest[m2.route.id];
10618        let matchRoute = m2.route;
10619        if (matchRoute.element !== route.element || matchRoute.errorElement !== route.errorElement || matchRoute.hydrateFallbackElement !== route.hydrateFallbackElement) {
10620          return {
10621            ...m2,
10622            route
10623          };
10624        }
10625        return m2;
10626      });
10627    }
10628    state = {
10629      ...state,
10630      ...newState
10631    };
10632    let unmountedFetchers = [];
10633    let mountedFetchers = [];
10634    state.fetchers.forEach((fetcher, key) => {
10635      if (fetcher.state === "idle") {
10636        if (fetchersQueuedForDeletion.has(key)) {
10637          unmountedFetchers.push(key);
10638        } else {
10639          mountedFetchers.push(key);
10640        }
10641      }
10642    });
10643    fetchersQueuedForDeletion.forEach((key) => {
10644      if (!state.fetchers.has(key) && !fetchControllers.has(key)) {
10645        unmountedFetchers.push(key);
10646      }
10647    });
10648    [...subscribers].forEach(
10649      (subscriber) => subscriber(state, {
10650        deletedFetchers: unmountedFetchers,
10651        viewTransitionOpts: opts.viewTransitionOpts,
10652        flushSync: opts.flushSync === true
10653      })
10654    );
10655    unmountedFetchers.forEach((key) => deleteFetcher(key));
10656    mountedFetchers.forEach((key) => state.fetchers.delete(key));
10657  }
10658  function completeNavigation(location, newState, { flushSync } = {}) {
10659    let isActionReload = state.actionData != null && state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && state.navigation.state === "loading" && location.state?._isRedirect !== true;
10660    let actionData;
10661    if (newState.actionData) {
10662      if (Object.keys(newState.actionData).length > 0) {
10663        actionData = newState.actionData;
10664      } else {
10665        actionData = null;
10666      }
10667    } else if (isActionReload) {
10668      actionData = state.actionData;
10669    } else {
10670      actionData = null;
10671    }
10672    let loaderData = newState.loaderData ? mergeLoaderData(
10673      state.loaderData,
10674      newState.loaderData,
10675      newState.matches || [],
10676      newState.errors
10677    ) : state.loaderData;
10678    let blockers = state.blockers;
10679    if (blockers.size > 0) {
10680      blockers = new Map(blockers);
10681      blockers.forEach((_, k2) => blockers.set(k2, IDLE_BLOCKER));
10682    }
10683    let restoreScrollPosition = isUninterruptedRevalidation ? false : getSavedScrollPosition(location, newState.matches || state.matches);
10684    let preventScrollReset = pendingPreventScrollReset === true || state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && location.state?._isRedirect !== true;
10685    if (inFlightDataRoutes) {
10686      dataRoutes = inFlightDataRoutes;
10687      inFlightDataRoutes = void 0;
10688    }
10689    if (isUninterruptedRevalidation) ;
10690    else if (pendingAction === "POP") ;
10691    else if (pendingAction === "PUSH") {
10692      init.history.push(location, location.state);
10693    } else if (pendingAction === "REPLACE") {
10694      init.history.replace(location, location.state);
10695    }
10696    let viewTransitionOpts;
10697    if (pendingAction === "POP") {
10698      let priorPaths = appliedViewTransitions.get(state.location.pathname);
10699      if (priorPaths && priorPaths.has(location.pathname)) {
10700        viewTransitionOpts = {
10701          currentLocation: state.location,
10702          nextLocation: location
10703        };
10704      } else if (appliedViewTransitions.has(location.pathname)) {
10705        viewTransitionOpts = {
10706          currentLocation: location,
10707          nextLocation: state.location
10708        };
10709      }
10710    } else if (pendingViewTransitionEnabled) {
10711      let toPaths = appliedViewTransitions.get(state.location.pathname);
10712      if (toPaths) {
10713        toPaths.add(location.pathname);
10714      } else {
10715        toPaths = /* @__PURE__ */ new Set([location.pathname]);
10716        appliedViewTransitions.set(state.location.pathname, toPaths);
10717      }
10718      viewTransitionOpts = {
10719        currentLocation: state.location,
10720        nextLocation: location
10721      };
10722    }
10723    updateState(
10724      {
10725        ...newState,
10726        // matches, errors, fetchers go through as-is
10727        actionData,
10728        loaderData,
10729        historyAction: pendingAction,
10730        location,
10731        initialized: true,
10732        navigation: IDLE_NAVIGATION,
10733        revalidation: "idle",
10734        restoreScrollPosition,
10735        preventScrollReset,
10736        blockers
10737      },
10738      {
10739        viewTransitionOpts,
10740        flushSync: flushSync === true
10741      }
10742    );
10743    pendingAction = "POP";
10744    pendingPreventScrollReset = false;
10745    pendingViewTransitionEnabled = false;
10746    isUninterruptedRevalidation = false;
10747    isRevalidationRequired = false;
10748    pendingRevalidationDfd?.resolve();
10749    pendingRevalidationDfd = null;
10750  }
10751  async function navigate(to, opts) {
10752    if (typeof to === "number") {
10753      init.history.go(to);
10754      return;
10755    }
10756    let normalizedPath = normalizeTo(
10757      state.location,
10758      state.matches,
10759      basename,
10760      to,
10761      opts?.fromRouteId,
10762      opts?.relative
10763    );
10764    let { path, submission, error } = normalizeNavigateOptions(
10765      false,
10766      normalizedPath,
10767      opts
10768    );
10769    let currentLocation = state.location;
10770    let nextLocation = createLocation(state.location, path, opts && opts.state);
10771    nextLocation = {
10772      ...nextLocation,
10773      ...init.history.encodeLocation(nextLocation)
10774    };
10775    let userReplace = opts && opts.replace != null ? opts.replace : void 0;
10776    let historyAction = "PUSH";
10777    if (userReplace === true) {
10778      historyAction = "REPLACE";
10779    } else if (userReplace === false) ;
10780    else if (submission != null && isMutationMethod(submission.formMethod) && submission.formAction === state.location.pathname + state.location.search) {
10781      historyAction = "REPLACE";
10782    }
10783    let preventScrollReset = opts && "preventScrollReset" in opts ? opts.preventScrollReset === true : void 0;
10784    let flushSync = (opts && opts.flushSync) === true;
10785    let blockerKey = shouldBlockNavigation({
10786      currentLocation,
10787      nextLocation,
10788      historyAction
10789    });
10790    if (blockerKey) {
10791      updateBlocker(blockerKey, {
10792        state: "blocked",
10793        location: nextLocation,
10794        proceed() {
10795          updateBlocker(blockerKey, {
10796            state: "proceeding",
10797            proceed: void 0,
10798            reset: void 0,
10799            location: nextLocation
10800          });
10801          navigate(to, opts);
10802        },
10803        reset() {
10804          let blockers = new Map(state.blockers);
10805          blockers.set(blockerKey, IDLE_BLOCKER);
10806          updateState({ blockers });
10807        }
10808      });
10809      return;
10810    }
10811    await startNavigation(historyAction, nextLocation, {
10812      submission,
10813      // Send through the formData serialization error if we have one so we can
10814      // render at the right error boundary after we match routes
10815      pendingError: error,
10816      preventScrollReset,
10817      replace: opts && opts.replace,
10818      enableViewTransition: opts && opts.viewTransition,
10819      flushSync
10820    });
10821  }
10822  function revalidate() {
10823    if (!pendingRevalidationDfd) {
10824      pendingRevalidationDfd = createDeferred();
10825    }
10826    interruptActiveLoads();
10827    updateState({ revalidation: "loading" });
10828    let promise = pendingRevalidationDfd.promise;
10829    if (state.navigation.state === "submitting") {
10830      return promise;
10831    }
10832    if (state.navigation.state === "idle") {
10833      startNavigation(state.historyAction, state.location, {
10834        startUninterruptedRevalidation: true
10835      });
10836      return promise;
10837    }
10838    startNavigation(
10839      pendingAction || state.historyAction,
10840      state.navigation.location,
10841      {
10842        overrideNavigation: state.navigation,
10843        // Proxy through any rending view transition
10844        enableViewTransition: pendingViewTransitionEnabled === true
10845      }
10846    );
10847    return promise;
10848  }
10849  async function startNavigation(historyAction, location, opts) {
10850    pendingNavigationController && pendingNavigationController.abort();
10851    pendingNavigationController = null;
10852    pendingAction = historyAction;
10853    isUninterruptedRevalidation = (opts && opts.startUninterruptedRevalidation) === true;
10854    saveScrollPosition(state.location, state.matches);
10855    pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;
10856    pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true;
10857    let routesToUse = inFlightDataRoutes || dataRoutes;
10858    let loadingNavigation = opts && opts.overrideNavigation;
10859    let matches = opts?.initialHydration && state.matches && state.matches.length > 0 && !initialMatchesIsFOW ? (
10860      // `matchRoutes()` has already been called if we're in here via `router.initialize()`
10861      state.matches
10862    ) : matchRoutes(routesToUse, location, basename);
10863    let flushSync = (opts && opts.flushSync) === true;
10864    if (matches && state.initialized && !isRevalidationRequired && isHashChangeOnly(state.location, location) && !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))) {
10865      completeNavigation(location, { matches }, { flushSync });
10866      return;
10867    }
10868    let fogOfWar = checkFogOfWar(matches, routesToUse, location.pathname);
10869    if (fogOfWar.active && fogOfWar.matches) {
10870      matches = fogOfWar.matches;
10871    }
10872    if (!matches) {
10873      let { error, notFoundMatches, route } = handleNavigational404(
10874        location.pathname
10875      );
10876      completeNavigation(
10877        location,
10878        {
10879          matches: notFoundMatches,
10880          loaderData: {},
10881          errors: {
10882            [route.id]: error
10883          }
10884        },
10885        { flushSync }
10886      );
10887      return;
10888    }
10889    pendingNavigationController = new AbortController();
10890    let request = createClientSideRequest(
10891      init.history,
10892      location,
10893      pendingNavigationController.signal,
10894      opts && opts.submission
10895    );
10896    let scopedContext = init.getContext ? await init.getContext() : new RouterContextProvider();
10897    let pendingActionResult;
10898    if (opts && opts.pendingError) {
10899      pendingActionResult = [
10900        findNearestBoundary(matches).route.id,
10901        { type: "error", error: opts.pendingError }
10902      ];
10903    } else if (opts && opts.submission && isMutationMethod(opts.submission.formMethod)) {
10904      let actionResult = await handleAction(
10905        request,
10906        location,
10907        opts.submission,
10908        matches,
10909        scopedContext,
10910        fogOfWar.active,
10911        opts && opts.initialHydration === true,
10912        { replace: opts.replace, flushSync }
10913      );
10914      if (actionResult.shortCircuited) {
10915        return;
10916      }
10917      if (actionResult.pendingActionResult) {
10918        let [routeId, result] = actionResult.pendingActionResult;
10919        if (isErrorResult(result) && isRouteErrorResponse(result.error) && result.error.status === 404) {
10920          pendingNavigationController = null;
10921          completeNavigation(location, {
10922            matches: actionResult.matches,
10923            loaderData: {},
10924            errors: {
10925              [routeId]: result.error
10926            }
10927          });
10928          return;
10929        }
10930      }
10931      matches = actionResult.matches || matches;
10932      pendingActionResult = actionResult.pendingActionResult;
10933      loadingNavigation = getLoadingNavigation(location, opts.submission);
10934      flushSync = false;
10935      fogOfWar.active = false;
10936      request = createClientSideRequest(
10937        init.history,
10938        request.url,
10939        request.signal
10940      );
10941    }
10942    let {
10943      shortCircuited,
10944      matches: updatedMatches,
10945      loaderData,
10946      errors
10947    } = await handleLoaders(
10948      request,
10949      location,
10950      matches,
10951      scopedContext,
10952      fogOfWar.active,
10953      loadingNavigation,
10954      opts && opts.submission,
10955      opts && opts.fetcherSubmission,
10956      opts && opts.replace,
10957      opts && opts.initialHydration === true,
10958      flushSync,
10959      pendingActionResult
10960    );
10961    if (shortCircuited) {
10962      return;
10963    }
10964    pendingNavigationController = null;
10965    completeNavigation(location, {
10966      matches: updatedMatches || matches,
10967      ...getActionDataForCommit(pendingActionResult),
10968      loaderData,
10969      errors
10970    });
10971  }
10972  async function handleAction(request, location, submission, matches, scopedContext, isFogOfWar, initialHydration, opts = {}) {
10973    interruptActiveLoads();
10974    let navigation = getSubmittingNavigation(location, submission);
10975    updateState({ navigation }, { flushSync: opts.flushSync === true });
10976    if (isFogOfWar) {
10977      let discoverResult = await discoverRoutes(
10978        matches,
10979        location.pathname,
10980        request.signal
10981      );
10982      if (discoverResult.type === "aborted") {
10983        return { shortCircuited: true };
10984      } else if (discoverResult.type === "error") {
10985        if (discoverResult.partialMatches.length === 0) {
10986          let { matches: matches2, route } = getShortCircuitMatches(dataRoutes);
10987          return {
10988            matches: matches2,
10989            pendingActionResult: [
10990              route.id,
10991              {
10992                type: "error",
10993                error: discoverResult.error
10994              }
10995            ]
10996          };
10997        }
10998        let boundaryId = findNearestBoundary(discoverResult.partialMatches).route.id;
10999        return {
11000          matches: discoverResult.partialMatches,
11001          pendingActionResult: [
11002            boundaryId,
11003            {
11004              type: "error",
11005              error: discoverResult.error
11006            }
11007          ]
11008        };
11009      } else if (!discoverResult.matches) {
11010        let { notFoundMatches, error, route } = handleNavigational404(
11011          location.pathname
11012        );
11013        return {
11014          matches: notFoundMatches,
11015          pendingActionResult: [
11016            route.id,
11017            {
11018              type: "error",
11019              error
11020            }
11021          ]
11022        };
11023      } else {
11024        matches = discoverResult.matches;
11025      }
11026    }
11027    let result;
11028    let actionMatch = getTargetMatch(matches, location);
11029    if (!actionMatch.route.action && !actionMatch.route.lazy) {
11030      result = {
11031        type: "error",
11032        error: getInternalRouterError(405, {
11033          method: request.method,
11034          pathname: location.pathname,
11035          routeId: actionMatch.route.id
11036        })
11037      };
11038    } else {
11039      let dsMatches = getTargetedDataStrategyMatches(
11040        mapRouteProperties2,
11041        manifest,
11042        request,
11043        matches,
11044        actionMatch,
11045        initialHydration ? [] : hydrationRouteProperties2,
11046        scopedContext
11047      );
11048      let results = await callDataStrategy(
11049        request,
11050        dsMatches,
11051        scopedContext,
11052        null
11053      );
11054      result = results[actionMatch.route.id];
11055      if (!result) {
11056        for (let match of matches) {
11057          if (results[match.route.id]) {
11058            result = results[match.route.id];
11059            break;
11060          }
11061        }
11062      }
11063      if (request.signal.aborted) {
11064        return { shortCircuited: true };
11065      }
11066    }
11067    if (isRedirectResult(result)) {
11068      let replace2;
11069      if (opts && opts.replace != null) {
11070        replace2 = opts.replace;
11071      } else {
11072        let location2 = normalizeRedirectLocation(
11073          result.response.headers.get("Location"),
11074          new URL(request.url),
11075          basename
11076        );
11077        replace2 = location2 === state.location.pathname + state.location.search;
11078      }
11079      await startRedirectNavigation(request, result, true, {
11080        submission,
11081        replace: replace2
11082      });
11083      return { shortCircuited: true };
11084    }
11085    if (isErrorResult(result)) {
11086      let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);
11087      if ((opts && opts.replace) !== true) {
11088        pendingAction = "PUSH";
11089      }
11090      return {
11091        matches,
11092        pendingActionResult: [
11093          boundaryMatch.route.id,
11094          result,
11095          actionMatch.route.id
11096        ]
11097      };
11098    }
11099    return {
11100      matches,
11101      pendingActionResult: [actionMatch.route.id, result]
11102    };
11103  }
11104  async function handleLoaders(request, location, matches, scopedContext, isFogOfWar, overrideNavigation, submission, fetcherSubmission, replace2, initialHydration, flushSync, pendingActionResult) {
11105    let loadingNavigation = overrideNavigation || getLoadingNavigation(location, submission);
11106    let activeSubmission = submission || fetcherSubmission || getSubmissionFromNavigation(loadingNavigation);
11107    let shouldUpdateNavigationState = !isUninterruptedRevalidation && !initialHydration;
11108    if (isFogOfWar) {
11109      if (shouldUpdateNavigationState) {
11110        let actionData = getUpdatedActionData(pendingActionResult);
11111        updateState(
11112          {
11113            navigation: loadingNavigation,
11114            ...actionData !== void 0 ? { actionData } : {}
11115          },
11116          {
11117            flushSync
11118          }
11119        );
11120      }
11121      let discoverResult = await discoverRoutes(
11122        matches,
11123        location.pathname,
11124        request.signal
11125      );
11126      if (discoverResult.type === "aborted") {
11127        return { shortCircuited: true };
11128      } else if (discoverResult.type === "error") {
11129        if (discoverResult.partialMatches.length === 0) {
11130          let { matches: matches2, route } = getShortCircuitMatches(dataRoutes);
11131          return {
11132            matches: matches2,
11133            loaderData: {},
11134            errors: {
11135              [route.id]: discoverResult.error
11136            }
11137          };
11138        }
11139        let boundaryId = findNearestBoundary(discoverResult.partialMatches).route.id;
11140        return {
11141          matches: discoverResult.partialMatches,
11142          loaderData: {},
11143          errors: {
11144            [boundaryId]: discoverResult.error
11145          }
11146        };
11147      } else if (!discoverResult.matches) {
11148        let { error, notFoundMatches, route } = handleNavigational404(
11149          location.pathname
11150        );
11151        return {
11152          matches: notFoundMatches,
11153          loaderData: {},
11154          errors: {
11155            [route.id]: error
11156          }
11157        };
11158      } else {
11159        matches = discoverResult.matches;
11160      }
11161    }
11162    let routesToUse = inFlightDataRoutes || dataRoutes;
11163    let { dsMatches, revalidatingFetchers } = getMatchesToLoad(
11164      request,
11165      scopedContext,
11166      mapRouteProperties2,
11167      manifest,
11168      init.history,
11169      state,
11170      matches,
11171      activeSubmission,
11172      location,
11173      initialHydration ? [] : hydrationRouteProperties2,
11174      initialHydration === true,
11175      isRevalidationRequired,
11176      cancelledFetcherLoads,
11177      fetchersQueuedForDeletion,
11178      fetchLoadMatches,
11179      fetchRedirectIds,
11180      routesToUse,
11181      basename,
11182      init.patchRoutesOnNavigation != null,
11183      pendingActionResult
11184    );
11185    pendingNavigationLoadId = ++incrementingLoadId;
11186    if (!init.dataStrategy && !dsMatches.some((m2) => m2.shouldLoad) && !dsMatches.some(
11187      (m2) => m2.route.middleware && m2.route.middleware.length > 0
11188    ) && revalidatingFetchers.length === 0) {
11189      let updatedFetchers2 = markFetchRedirectsDone();
11190      completeNavigation(
11191        location,
11192        {
11193          matches,
11194          loaderData: {},
11195          // Commit pending error if we're short circuiting
11196          errors: pendingActionResult && isErrorResult(pendingActionResult[1]) ? { [pendingActionResult[0]]: pendingActionResult[1].error } : null,
11197          ...getActionDataForCommit(pendingActionResult),
11198          ...updatedFetchers2 ? { fetchers: new Map(state.fetchers) } : {}
11199        },
11200        { flushSync }
11201      );
11202      return { shortCircuited: true };
11203    }
11204    if (shouldUpdateNavigationState) {
11205      let updates = {};
11206      if (!isFogOfWar) {
11207        updates.navigation = loadingNavigation;
11208        let actionData = getUpdatedActionData(pendingActionResult);
11209        if (actionData !== void 0) {
11210          updates.actionData = actionData;
11211        }
11212      }
11213      if (revalidatingFetchers.length > 0) {
11214        updates.fetchers = getUpdatedRevalidatingFetchers(revalidatingFetchers);
11215      }
11216      updateState(updates, { flushSync });
11217    }
11218    revalidatingFetchers.forEach((rf2) => {
11219      abortFetcher(rf2.key);
11220      if (rf2.controller) {
11221        fetchControllers.set(rf2.key, rf2.controller);
11222      }
11223    });
11224    let abortPendingFetchRevalidations = () => revalidatingFetchers.forEach((f2) => abortFetcher(f2.key));
11225    if (pendingNavigationController) {
11226      pendingNavigationController.signal.addEventListener(
11227        "abort",
11228        abortPendingFetchRevalidations
11229      );
11230    }
11231    let { loaderResults, fetcherResults } = await callLoadersAndMaybeResolveData(
11232      dsMatches,
11233      revalidatingFetchers,
11234      request,
11235      scopedContext
11236    );
11237    if (request.signal.aborted) {
11238      return { shortCircuited: true };
11239    }
11240    if (pendingNavigationController) {
11241      pendingNavigationController.signal.removeEventListener(
11242        "abort",
11243        abortPendingFetchRevalidations
11244      );
11245    }
11246    revalidatingFetchers.forEach((rf2) => fetchControllers.delete(rf2.key));
11247    let redirect2 = findRedirect(loaderResults);
11248    if (redirect2) {
11249      await startRedirectNavigation(request, redirect2.result, true, {
11250        replace: replace2
11251      });
11252      return { shortCircuited: true };
11253    }
11254    redirect2 = findRedirect(fetcherResults);
11255    if (redirect2) {
11256      fetchRedirectIds.add(redirect2.key);
11257      await startRedirectNavigation(request, redirect2.result, true, {
11258        replace: replace2
11259      });
11260      return { shortCircuited: true };
11261    }
11262    let { loaderData, errors } = processLoaderData(
11263      state,
11264      matches,
11265      loaderResults,
11266      pendingActionResult,
11267      revalidatingFetchers,
11268      fetcherResults
11269    );
11270    if (initialHydration && state.errors) {
11271      errors = { ...state.errors, ...errors };
11272    }
11273    let updatedFetchers = markFetchRedirectsDone();
11274    let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);
11275    let shouldUpdateFetchers = updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;
11276    return {
11277      matches,
11278      loaderData,
11279      errors,
11280      ...shouldUpdateFetchers ? { fetchers: new Map(state.fetchers) } : {}
11281    };
11282  }
11283  function getUpdatedActionData(pendingActionResult) {
11284    if (pendingActionResult && !isErrorResult(pendingActionResult[1])) {
11285      return {
11286        [pendingActionResult[0]]: pendingActionResult[1].data
11287      };
11288    } else if (state.actionData) {
11289      if (Object.keys(state.actionData).length === 0) {
11290        return null;
11291      } else {
11292        return state.actionData;
11293      }
11294    }
11295  }
11296  function getUpdatedRevalidatingFetchers(revalidatingFetchers) {
11297    revalidatingFetchers.forEach((rf2) => {
11298      let fetcher = state.fetchers.get(rf2.key);
11299      let revalidatingFetcher = getLoadingFetcher(
11300        void 0,
11301        fetcher ? fetcher.data : void 0
11302      );
11303      state.fetchers.set(rf2.key, revalidatingFetcher);
11304    });
11305    return new Map(state.fetchers);
11306  }
11307  async function fetch2(key, routeId, href, opts) {
11308    abortFetcher(key);
11309    let flushSync = (opts && opts.flushSync) === true;
11310    let routesToUse = inFlightDataRoutes || dataRoutes;
11311    let normalizedPath = normalizeTo(
11312      state.location,
11313      state.matches,
11314      basename,
11315      href,
11316      routeId,
11317      opts?.relative
11318    );
11319    let matches = matchRoutes(routesToUse, normalizedPath, basename);
11320    let fogOfWar = checkFogOfWar(matches, routesToUse, normalizedPath);
11321    if (fogOfWar.active && fogOfWar.matches) {
11322      matches = fogOfWar.matches;
11323    }
11324    if (!matches) {
11325      setFetcherError(
11326        key,
11327        routeId,
11328        getInternalRouterError(404, { pathname: normalizedPath }),
11329        { flushSync }
11330      );
11331      return;
11332    }
11333    let { path, submission, error } = normalizeNavigateOptions(
11334      true,
11335      normalizedPath,
11336      opts
11337    );
11338    if (error) {
11339      setFetcherError(key, routeId, error, { flushSync });
11340      return;
11341    }
11342    let scopedContext = init.getContext ? await init.getContext() : new RouterContextProvider();
11343    let preventScrollReset = (opts && opts.preventScrollReset) === true;
11344    if (submission && isMutationMethod(submission.formMethod)) {
11345      await handleFetcherAction(
11346        key,
11347        routeId,
11348        path,
11349        matches,
11350        scopedContext,
11351        fogOfWar.active,
11352        flushSync,
11353        preventScrollReset,
11354        submission
11355      );
11356      return;
11357    }
11358    fetchLoadMatches.set(key, { routeId, path });
11359    await handleFetcherLoader(
11360      key,
11361      routeId,
11362      path,
11363      matches,
11364      scopedContext,
11365      fogOfWar.active,
11366      flushSync,
11367      preventScrollReset,
11368      submission
11369    );
11370  }
11371  async function handleFetcherAction(key, routeId, path, requestMatches, scopedContext, isFogOfWar, flushSync, preventScrollReset, submission) {
11372    interruptActiveLoads();
11373    fetchLoadMatches.delete(key);
11374    let existingFetcher = state.fetchers.get(key);
11375    updateFetcherState(key, getSubmittingFetcher(submission, existingFetcher), {
11376      flushSync
11377    });
11378    let abortController = new AbortController();
11379    let fetchRequest = createClientSideRequest(
11380      init.history,
11381      path,
11382      abortController.signal,
11383      submission
11384    );
11385    if (isFogOfWar) {
11386      let discoverResult = await discoverRoutes(
11387        requestMatches,
11388        new URL(fetchRequest.url).pathname,
11389        fetchRequest.signal,
11390        key
11391      );
11392      if (discoverResult.type === "aborted") {
11393        return;
11394      } else if (discoverResult.type === "error") {
11395        setFetcherError(key, routeId, discoverResult.error, { flushSync });
11396        return;
11397      } else if (!discoverResult.matches) {
11398        setFetcherError(
11399          key,
11400          routeId,
11401          getInternalRouterError(404, { pathname: path }),
11402          { flushSync }
11403        );
11404        return;
11405      } else {
11406        requestMatches = discoverResult.matches;
11407      }
11408    }
11409    let match = getTargetMatch(requestMatches, path);
11410    if (!match.route.action && !match.route.lazy) {
11411      let error = getInternalRouterError(405, {
11412        method: submission.formMethod,
11413        pathname: path,
11414        routeId
11415      });
11416      setFetcherError(key, routeId, error, { flushSync });
11417      return;
11418    }
11419    fetchControllers.set(key, abortController);
11420    let originatingLoadId = incrementingLoadId;
11421    let fetchMatches = getTargetedDataStrategyMatches(
11422      mapRouteProperties2,
11423      manifest,
11424      fetchRequest,
11425      requestMatches,
11426      match,
11427      hydrationRouteProperties2,
11428      scopedContext
11429    );
11430    let actionResults = await callDataStrategy(
11431      fetchRequest,
11432      fetchMatches,
11433      scopedContext,
11434      key
11435    );
11436    let actionResult = actionResults[match.route.id];
11437    if (fetchRequest.signal.aborted) {
11438      if (fetchControllers.get(key) === abortController) {
11439        fetchControllers.delete(key);
11440      }
11441      return;
11442    }
11443    if (fetchersQueuedForDeletion.has(key)) {
11444      if (isRedirectResult(actionResult) || isErrorResult(actionResult)) {
11445        updateFetcherState(key, getDoneFetcher(void 0));
11446        return;
11447      }
11448    } else {
11449      if (isRedirectResult(actionResult)) {
11450        fetchControllers.delete(key);
11451        if (pendingNavigationLoadId > originatingLoadId) {
11452          updateFetcherState(key, getDoneFetcher(void 0));
11453          return;
11454        } else {
11455          fetchRedirectIds.add(key);
11456          updateFetcherState(key, getLoadingFetcher(submission));
11457          return startRedirectNavigation(fetchRequest, actionResult, false, {
11458            fetcherSubmission: submission,
11459            preventScrollReset
11460          });
11461        }
11462      }
11463      if (isErrorResult(actionResult)) {
11464        setFetcherError(key, routeId, actionResult.error);
11465        return;
11466      }
11467    }
11468    let nextLocation = state.navigation.location || state.location;
11469    let revalidationRequest = createClientSideRequest(
11470      init.history,
11471      nextLocation,
11472      abortController.signal
11473    );
11474    let routesToUse = inFlightDataRoutes || dataRoutes;
11475    let matches = state.navigation.state !== "idle" ? matchRoutes(routesToUse, state.navigation.location, basename) : state.matches;
11476    invariant(matches, "Didn't find any matches after fetcher action");
11477    let loadId = ++incrementingLoadId;
11478    fetchReloadIds.set(key, loadId);
11479    let loadFetcher = getLoadingFetcher(submission, actionResult.data);
11480    state.fetchers.set(key, loadFetcher);
11481    let { dsMatches, revalidatingFetchers } = getMatchesToLoad(
11482      revalidationRequest,
11483      scopedContext,
11484      mapRouteProperties2,
11485      manifest,
11486      init.history,
11487      state,
11488      matches,
11489      submission,
11490      nextLocation,
11491      hydrationRouteProperties2,
11492      false,
11493      isRevalidationRequired,
11494      cancelledFetcherLoads,
11495      fetchersQueuedForDeletion,
11496      fetchLoadMatches,
11497      fetchRedirectIds,
11498      routesToUse,
11499      basename,
11500      init.patchRoutesOnNavigation != null,
11501      [match.route.id, actionResult]
11502    );
11503    revalidatingFetchers.filter((rf2) => rf2.key !== key).forEach((rf2) => {
11504      let staleKey = rf2.key;
11505      let existingFetcher2 = state.fetchers.get(staleKey);
11506      let revalidatingFetcher = getLoadingFetcher(
11507        void 0,
11508        existingFetcher2 ? existingFetcher2.data : void 0
11509      );
11510      state.fetchers.set(staleKey, revalidatingFetcher);
11511      abortFetcher(staleKey);
11512      if (rf2.controller) {
11513        fetchControllers.set(staleKey, rf2.controller);
11514      }
11515    });
11516    updateState({ fetchers: new Map(state.fetchers) });
11517    let abortPendingFetchRevalidations = () =>
11517 revalidatingFetchers.forEach((rf2) => abortFetcher(rf2.key));
11518    abortController.signal.addEventListener(
11519      "abort",
11520      abortPendingFetchRevalidations
11521    );
11522    let { loaderResults, fetcherResults } = await callLoadersAndMaybeResolveData(
11523      dsMatches,
11524      revalidatingFetchers,
11525      revalidationRequest,
11526      scopedContext
11527    );
11528    if (abortController.signal.aborted) {
11529      return;
11530    }
11531    abortController.signal.removeEventListener(
11532      "abort",
11533      abortPendingFetchRevalidations
11534    );
11535    fetchReloadIds.delete(key);
11536    fetchControllers.delete(key);
11537    revalidatingFetchers.forEach((r2) => fetchControllers.delete(r2.key));
11538    if (state.fetchers.has(key)) {
11539      let doneFetcher = getDoneFetcher(actionResult.data);
11540      state.fetchers.set(key, doneFetcher);
11541    }
11542    let redirect2 = findRedirect(loaderResults);
11543    if (redirect2) {
11544      return startRedirectNavigation(
11545        revalidationRequest,
11546        redirect2.result,
11547        false,
11548        { preventScrollReset }
11549      );
11550    }
11551    redirect2 = findRedirect(fetcherResults);
11552    if (redirect2) {
11553      fetchRedirectIds.add(redirect2.key);
11554      return startRedirectNavigation(
11555        revalidationRequest,
11556        redirect2.result,
11557        false,
11558        { preventScrollReset }
11559      );
11560    }
11561    let { loaderData, errors } = processLoaderData(
11562      state,
11563      matches,
11564      loaderResults,
11565      void 0,
11566      revalidatingFetchers,
11567      fetcherResults
11568    );
11569    abortStaleFetchLoads(loadId);
11570    if (state.navigation.state === "loading" && loadId > pendingNavigationLoadId) {
11571      invariant(pendingAction, "Expected pending action");
11572      pendingNavigationController && pendingNavigationController.abort();
11573      completeNavigation(state.navigation.location, {
11574        matches,
11575        loaderData,
11576        errors,
11577        fetchers: new Map(state.fetchers)
11578      });
11579    } else {
11580      updateState({
11581        errors,
11582        loaderData: mergeLoaderData(
11583          state.loaderData,
11584          loaderData,
11585          matches,
11586          errors
11587        ),
11588        fetchers: new Map(state.fetchers)
11589      });
11590      isRevalidationRequired = false;
11591    }
11592  }
11593  async function handleFetcherLoader(key, routeId, path, matches, scopedContext, isFogOfWar, flushSync, preventScrollReset, submission) {
11594    let existingFetcher = state.fetchers.get(key);
11595    updateFetcherState(
11596      key,
11597      getLoadingFetcher(
11598        submission,
11599        existingFetcher ? existingFetcher.data : void 0
11600      ),
11601      { flushSync }
11602    );
11603    let abortController = new AbortController();
11604    let fetchRequest = createClientSideRequest(
11605      init.history,
11606      path,
11607      abortController.signal
11608    );
11609    if (isFogOfWar) {
11610      let discoverResult = await discoverRoutes(
11611        matches,
11612        new URL(fetchRequest.url).pathname,
11613        fetchRequest.signal,
11614        key
11615      );
11616      if (discoverResult.type === "aborted") {
11617        return;
11618      } else if (discoverResult.type === "error") {
11619        setFetcherError(key, routeId, discoverResult.error, { flushSync });
11620        return;
11621      } else if (!discoverResult.matches) {
11622        setFetcherError(
11623          key,
11624          routeId,
11625          getInternalRouterError(404, { pathname: path }),
11626          { flushSync }
11627        );
11628        return;
11629      } else {
11630        matches = discoverResult.matches;
11631      }
11632    }
11633    let match = getTargetMatch(matches, path);
11634    fetchControllers.set(key, abortController);
11635    let originatingLoadId = incrementingLoadId;
11636    let dsMatches = getTargetedDataStrategyMatches(
11637      mapRouteProperties2,
11638      manifest,
11639      fetchRequest,
11640      matches,
11641      match,
11642      hydrationRouteProperties2,
11643      scopedContext
11644    );
11645    let results = await callDataStrategy(
11646      fetchRequest,
11647      dsMatches,
11648      scopedContext,
11649      key
11650    );
11651    let result = results[match.route.id];
11652    if (fetchControllers.get(key) === abortController) {
11653      fetchControllers.delete(key);
11654    }
11655    if (fetchRequest.signal.aborted) {
11656      return;
11657    }
11658    if (fetchersQueuedForDeletion.has(key)) {
11659      updateFetcherState(key, getDoneFetcher(void 0));
11660      return;
11661    }
11662    if (isRedirectResult(result)) {
11663      if (pendingNavigationLoadId > originatingLoadId) {
11664        updateFetcherState(key, getDoneFetcher(void 0));
11665        return;
11666      } else {
11667        fetchRedirectIds.add(key);
11668        await startRedirectNavigation(fetchRequest, result, false, {
11669          preventScrollReset
11670        });
11671        return;
11672      }
11673    }
11674    if (isErrorResult(result)) {
11675      setFetcherError(key, routeId, result.error);
11676      return;
11677    }
11678    updateFetcherState(key, getDoneFetcher(result.data));
11679  }
11680  async function startRedirectNavigation(request, redirect2, isNavigation, {
11681    submission,
11682    fetcherSubmission,
11683    preventScrollReset,
11684    replace: replace2
11685  } = {}) {
11686    if (redirect2.response.headers.has("X-Remix-Revalidate")) {
11687      isRevalidationRequired = true;
11688    }
11689    let location = redirect2.response.headers.get("Location");
11690    invariant(location, "Expected a Location header on the redirect Response");
11691    location = normalizeRedirectLocation(
11692      location,
11693      new URL(request.url),
11694      basename
11695    );
11696    let redirectLocation = createLocation(state.location, location, {
11697      _isRedirect: true
11698    });
11699    if (isBrowser2) {
11700      let isDocumentReload = false;
11701      if (redirect2.response.headers.has("X-Remix-Reload-Document")) {
11702        isDocumentReload = true;
11703      } else if (isAbsoluteUrl(location)) {
11704        const url = createBrowserURLImpl(location, true);
11705        isDocumentReload = // Hard reload if it's an absolute URL to a new origin
11706        url.origin !== routerWindow.location.origin || // Hard reload if it's an absolute URL that does not match our basename
11707        stripBasename(url.pathname, basename) == null;
11708      }
11709      if (isDocumentReload) {
11710        if (replace2) {
11711          routerWindow.location.replace(location);
11712        } else {
11713          routerWindow.location.assign(location);
11714        }
11715        return;
11716      }
11717    }
11718    pendingNavigationController = null;
11719    let redirectNavigationType = replace2 === true || redirect2.response.headers.has("X-Remix-Replace") ? "REPLACE" : "PUSH";
11720    let { formMethod, formAction, formEncType } = state.navigation;
11721    if (!submission && !fetcherSubmission && formMethod && formAction && formEncType) {
11722      submission = getSubmissionFromNavigation(state.navigation);
11723    }
11724    let activeSubmission = submission || fetcherSubmission;
11725    if (redirectPreserveMethodStatusCodes.has(redirect2.response.status) && activeSubmission && isMutationMethod(activeSubmission.formMethod)) {
11726      await startNavigation(redirectNavigationType, redirectLocation, {
11727        submission: {
11728          ...activeSubmission,
11729          formAction: location
11730        },
11731        // Preserve these flags across redirects
11732        preventScrollReset: preventScrollReset || pendingPreventScrollReset,
11733        enableViewTransition: isNavigation ? pendingViewTransitionEnabled : void 0
11734      });
11735    } else {
11736      let overrideNavigation = getLoadingNavigation(
11737        redirectLocation,
11738        submission
11739      );
11740      await startNavigation(redirectNavigationType, redirectLocation, {
11741        overrideNavigation,
11742        // Send fetcher submissions through for shouldRevalidate
11743        fetcherSubmission,
11744        // Preserve these flags across redirects
11745        preventScrollReset: preventScrollReset || pendingPreventScrollReset,
11746        enableViewTransition: isNavigation ? pendingViewTransitionEnabled : void 0
11747      });
11748    }
11749  }
11750  async function callDataStrategy(request, matches, scopedContext, fetcherKey) {
11751    let results;
11752    let dataResults = {};
11753    try {
11754      results = await callDataStrategyImpl(
11755        dataStrategyImpl,
11756        request,
11757        matches,
11758        fetcherKey,
11759        scopedContext,
11760        false
11761      );
11762    } catch (e) {
11763      matches.filter((m2) => m2.shouldLoad).forEach((m2) => {
11764        dataResults[m2.route.id] = {
11765          type: "error",
11766          error: e
11767        };
11768      });
11769      return dataResults;
11770    }
11771    if (request.signal.aborted) {
11772      return dataResults;
11773    }
11774    for (let [routeId, result] of Object.entries(results)) {
11775      if (isRedirectDataStrategyResult(result)) {
11776        let response = result.result;
11777        dataResults[routeId] = {
11778          type: "redirect",
11779          response: normalizeRelativeRoutingRedirectResponse(
11780            response,
11781            request,
11782            routeId,
11783            matches,
11784            basename
11785          )
11786        };
11787      } else {
11788        dataResults[routeId] = await convertDataStrategyResultToDataResult(result);
11789      }
11790    }
11791    return dataResults;
11792  }
11793  async function callLoadersAndMaybeResolveData(matches, fetchersToLoad, request, scopedContext) {
11794    let loaderResultsPromise = callDataStrategy(
11795      request,
11796      matches,
11797      scopedContext,
11798      null
11799    );
11800    let fetcherResultsPromise = Promise.all(
11801      fetchersToLoad.map(async (f2) => {
11802        if (f2.matches && f2.match && f2.request && f2.controller) {
11803          let results = await callDataStrategy(
11804            f2.request,
11805            f2.matches,
11806            scopedContext,
11807            f2.key
11808          );
11809          let result = results[f2.match.route.id];
11810          return { [f2.key]: result };
11811        } else {
11812          return Promise.resolve({
11813            [f2.key]: {
11814              type: "error",
11815              error: getInternalRouterError(404, {
11816                pathname: f2.path
11817              })
11818            }
11819          });
11820        }
11821      })
11822    );
11823    let loaderResults = await loaderResultsPromise;
11824    let fetcherResults = (await fetcherResultsPromise).reduce(
11825      (acc, r2) => Object.assign(acc, r2),
11826      {}
11827    );
11828    return {
11829      loaderResults,
11830      fetcherResults
11831    };
11832  }
11833  function interruptActiveLoads() {
11834    isRevalidationRequired = true;
vendor: 7,498 bytes, lines 11835-12063
11835    fetchLoadMatches.forEach((_, key) => {
11836      if (fetchControllers.has(key)) {
11837        cancelledFetcherLoads.add(key);
11838      }
11839      abortFetcher(key);
11840    });
11841  }
11842  function updateFetcherState(key, fetcher, opts = {}) {
11843    state.fetchers.set(key, fetcher);
11844    updateState(
11845      { fetchers: new Map(state.fetchers) },
11846      { flushSync: (opts && opts.flushSync) === true }
11847    );
11848  }
11849  function setFetcherError(key, routeId, error, opts = {}) {
11850    let boundaryMatch = findNearestBoundary(state.matches, routeId);
11851    deleteFetcher(key);
11852    updateState(
11853      {
11854        errors: {
11855          [boundaryMatch.route.id]: error
11856        },
11857        fetchers: new Map(state.fetchers)
11858      },
11859      { flushSync: (opts && opts.flushSync) === true }
11860    );
11861  }
11862  function getFetcher(key) {
11863    activeFetchers.set(key, (activeFetchers.get(key) || 0) + 1);
11864    if (fetchersQueuedForDeletion.has(key)) {
11865      fetchersQueuedForDeletion.delete(key);
11866    }
11867    return state.fetchers.get(key) || IDLE_FETCHER;
11868  }
11869  function resetFetcher(key, opts) {
11870    abortFetcher(key, opts?.reason);
11871    updateFetcherState(key, getDoneFetcher(null));
11872  }
11873  function deleteFetcher(key) {
11874    let fetcher = state.fetchers.get(key);
11875    if (fetchControllers.has(key) && !(fetcher && fetcher.state === "loading" && fetchReloadIds.has(key))) {
11876      abortFetcher(key);
11877    }
11878    fetchLoadMatches.delete(key);
11879    fetchReloadIds.delete(key);
11880    fetchRedirectIds.delete(key);
11881    fetchersQueuedForDeletion.delete(key);
11882    cancelledFetcherLoads.delete(key);
11883    state.fetchers.delete(key);
11884  }
11885  function queueFetcherForDeletion(key) {
11886    let count = (activeFetchers.get(key) || 0) - 1;
11887    if (count <= 0) {
11888      activeFetchers.delete(key);
11889      fetchersQueuedForDeletion.add(key);
11890    } else {
11891      activeFetchers.set(key, count);
11892    }
11893    updateState({ fetchers: new Map(state.fetchers) });
11894  }
11895  function abortFetcher(key, reason) {
11896    let controller = fetchControllers.get(key);
11897    if (controller) {
11898      controller.abort(reason);
11899      fetchControllers.delete(key);
11900    }
11901  }
11902  function markFetchersDone(keys) {
11903    for (let key of keys) {
11904      let fetcher = getFetcher(key);
11905      let doneFetcher = getDoneFetcher(fetcher.data);
11906      state.fetchers.set(key, doneFetcher);
11907    }
11908  }
11909  function markFetchRedirectsDone() {
11910    let doneKeys = [];
11911    let updatedFetchers = false;
11912    for (let key of fetchRedirectIds) {
11913      let fetcher = state.fetchers.get(key);
11914      invariant(fetcher, `Expected fetcher: ${key}`);
11915      if (fetcher.state === "loading") {
11916        fetchRedirectIds.delete(key);
11917        doneKeys.push(key);
11918        updatedFetchers = true;
11919      }
11920    }
11921    markFetchersDone(doneKeys);
11922    return updatedFetchers;
11923  }
11924  function abortStaleFetchLoads(landedId) {
11925    let yeetedKeys = [];
11926    for (let [key, id2] of fetchReloadIds) {
11927      if (id2 < landedId) {
11928        let fetcher = state.fetchers.get(key);
11929        invariant(fetcher, `Expected fetcher: ${key}`);
11930        if (fetcher.state === "loading") {
11931          abortFetcher(key);
11932          fetchReloadIds.delete(key);
11933          yeetedKeys.push(key);
11934        }
11935      }
11936    }
11937    markFetchersDone(yeetedKeys);
11938    return yeetedKeys.length > 0;
11939  }
11940  function getBlocker(key, fn) {
11941    let blocker = state.blockers.get(key) || IDLE_BLOCKER;
11942    if (blockerFunctions.get(key) !== fn) {
11943      blockerFunctions.set(key, fn);
11944    }
11945    return blocker;
11946  }
11947  function deleteBlocker(key) {
11948    state.blockers.delete(key);
11949    blockerFunctions.delete(key);
11950  }
11951  function updateBlocker(key, newBlocker) {
11952    let blocker = state.blockers.get(key) || IDLE_BLOCKER;
11953    invariant(
11954      blocker.state === "unblocked" && newBlocker.state === "blocked" || blocker.state === "blocked" && newBlocker.state === "blocked" || blocker.state === "blocked" && newBlocker.state === "proceeding" || blocker.state === "blocked" && newBlocker.state === "unblocked" || blocker.state === "proceeding" && newBlocker.state === "unblocked",
11955      `Invalid blocker state transition: ${blocker.state} -> ${newBlocker.state}`
11956    );
11957    let blockers = new Map(state.blockers);
11958    blockers.set(key, newBlocker);
11959    updateState({ blockers });
11960  }
11961  function shouldBlockNavigation({
11962    currentLocation,
11963    nextLocation,
11964    historyAction
11965  }) {
11966    if (blockerFunctions.size === 0) {
11967      return;
11968    }
11969    if (blockerFunctions.size > 1) {
11970      warning(false, "A router only supports one blocker at a time");
11971    }
11972    let entries = Array.from(blockerFunctions.entries());
11973    let [blockerKey, blockerFunction] = entries[entries.length - 1];
11974    let blocker = state.blockers.get(blockerKey);
11975    if (blocker && blocker.state === "proceeding") {
11976      return;
11977    }
11978    if (blockerFunction({ currentLocation, nextLocation, historyAction })) {
11979      return blockerKey;
11980    }
11981  }
11982  function handleNavigational404(pathname) {
11983    let error = getInternalRouterError(404, { pathname });
11984    let routesToUse = inFlightDataRoutes || dataRoutes;
11985    let { matches, route } = getShortCircuitMatches(routesToUse);
11986    return { notFoundMatches: matches, route, error };
11987  }
11988  function enableScrollRestoration(positions, getPosition, getKey) {
11989    savedScrollPositions2 = positions;
11990    getScrollPosition = getPosition;
11991    getScrollRestorationKey2 = getKey || null;
11992    if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {
11993      initialScrollRestored = true;
11994      let y2 = getSavedScrollPosition(state.location, state.matches);
11995      if (y2 != null) {
11996        updateState({ restoreScrollPosition: y2 });
11997      }
11998    }
11999    return () => {
12000      savedScrollPositions2 = null;
12001      getScrollPosition = null;
12002      getScrollRestorationKey2 = null;
12003    };
12004  }
12005  function getScrollKey(location, matches) {
12006    if (getScrollRestorationKey2) {
12007      let key = getScrollRestorationKey2(
12008        location,
12009        matches.map((m2) => convertRouteMatchToUiMatch(m2, state.loaderData))
12010      );
12011      return key || location.key;
12012    }
12013    return location.key;
12014  }
12015  function saveScrollPosition(location, matches) {
12016    if (savedScrollPositions2 && getScrollPosition) {
12017      let key = getScrollKey(location, matches);
12018      savedScrollPositions2[key] = getScrollPosition();
12019    }
12020  }
12021  function getSavedScrollPosition(location, matches) {
12022    if (savedScrollPositions2) {
12023      let key = getScrollKey(location, matches);
12024      let y2 = savedScrollPositions2[key];
12025      if (typeof y2 === "number") {
12026        return y2;
12027      }
12028    }
12029    return null;
12030  }
12031  function checkFogOfWar(matches, routesToUse, pathname) {
12032    if (init.patchRoutesOnNavigation) {
12033      if (!matches) {
12034        let fogMatches = matchRoutesImpl(
12035          routesToUse,
12036          pathname,
12037          basename,
12038          true
12039        );
12040        return { active: true, matches: fogMatches || [] };
12041      } else {
12042        if (Object.keys(matches[0].params).length > 0) {
12043          let partialMatches = matchRoutesImpl(
12044            routesToUse,
12045            pathname,
12046            basename,
12047            true
12048          );
12049          return { active: true, matches: partialMatches };
12050        }
12051      }
12052    }
12053    return { active: false, matches: null };
12054  }
12055  async function discoverRoutes(matches, pathname, signal, fetcherKey) {
12056    if (!init.patchRoutesOnNavigation) {
12057      return { type: "success", matches };
12058    }
12059    let partialMatches = matches;
12060    while (true) {
12061      let isNonHMR = inFlightDataRoutes == null;
12062      let routesToUse = inFlightDataRoutes || dataRoutes;
12063      let localManifest = manifest;
12064      try {
12065        await init.patchRoutesOnNavigation({
12066          signal,
12067          path: pathname,
12068          matches: partialMatches,
12069          fetcherKey,
12070          patch: (routeId, children) => {
12071            if (signal.aborted) return;
12072            patchRoutesImpl(
12073              routeId,
12074              children,
12075              routesToUse,
12076              localManifest,
12077              mapRouteProperties2,
12078              false
12079            );
12080          }
12081        });
12082      } catch (e) {
12083        return { type: "error", error: e, partialMatches };
12084      } finally {
12085        if (isNonHMR && !signal.aborted) {
12086          dataRoutes = [...dataRoutes];
12087        }
12088      }
12089      if (signal.aborted) {
12090        return { type: "aborted" };
12091      }
12092      let newMatches = matchRoutes(routesToUse, pathname, basename);
12093      if (newMatches) {
12094        return { type: "success", matches: newMatches };
12095      }
12096      let newPartialMatches = matchRoutesImpl(
12097        routesToUse,
12098        pathname,
12099        basename,
12100        true
12101      );
12102      if (!newPartialMatches || partialMatches.length === newPartialMatches.length && partialMatches.every(
12103        (m2, i) => m2.route.id === newPartialMatches[i].route.id
12104      )) {
12105        return { type: "success", matches: null };
12106      }
12107      partialMatches = newPartialMatches;
12108    }
12109  }
12110  function _internalSetRoutes(newRoutes) {
12111    manifest = {};
12112    inFlightDataRoutes = convertRoutesToDataRoutes(
12113      newRoutes,
12114      mapRouteProperties2,
12115      void 0,
12116      manifest
12117    );
12118  }
12119  function patchRoutes(routeId, children, unstable_allowElementMutations = false) {
12120    let isNonHMR = inFlightDataRoutes == null;
12121    let routesToUse = inFlightDataRoutes || dataRoutes;
12122    patchRoutesImpl(
12123      routeId,
12124      children,
12125      routesToUse,
12126      manifest,
12127      mapRouteProperties2,
12128      unstable_allowElementMutations
12129    );
12130    if (isNonHMR) {
12131      dataRoutes = [...dataRoutes];
12132      updateState({});
12133    }
12134  }
12135  router2 = {
12136    get basename() {
12137      return basename;
12138    },
12139    get future() {
12140      return future;
12141    },
12142    get state() {
12143      return state;
12144    },
12145    get routes() {
12146      return dataRoutes;
12147    },
12148    get window() {
12149      return routerWindow;
12150    },
12151    initialize,
12152    subscribe,
12153    enableScrollRestoration,
12154    navigate,
12155    fetch: fetch2,
12156    revalidate,
12157    // Passthrough to history-aware createHref used by useHref so we get proper
12158    // hash-aware URLs in DOM paths
12159    createHref: (to) => init.history.createHref(to),
12160    encodeLocation: (to) => init.history.encodeLocation(to),
12161    getFetcher,
12162    resetFetcher,
12163    deleteFetcher: queueFetcherForDeletion,
12164    dispose,
12165    getBlocker,
12166    deleteBlocker,
12167    patchRoutes,
12168    _internalFetchControllers: fetchControllers,
12169    // TODO: Remove setRoutes, it's temporary to avoid dealing with
12170    // updating the tree while validating the update algorithm.
12171    _internalSetRoutes,
12172    _internalSetStateDoNotUseOrYouWillBreakYourApp(newState) {
12173      updateState(newState);
12174    }
12175  };
12176  return router2;
12177}
12178function isSubmissionNavigation(opts) {
12179  return opts != null && ("formData" in opts && opts.formData != null || "body" in opts && opts.body !== void 0);
12180}
12181function normalizeTo(location, matches, basename, to, fromRouteId, relative) {
12182  let contextualMatches;
12183  let activeRouteMatch;
12184  if (fromRouteId) {
12185    contextualMatches = [];
12186    for (let match of matches) {
12187      contextualMatches.push(match);
12188      if (match.route.id === fromRouteId) {
12189        activeRouteMatch = match;
12190        break;
12191      }
12192    }
12193  } else {
12194    contextualMatches = matches;
12195    activeRouteMatch = matches[matches.length - 1];
12196  }
12197  let path = resolveTo(
12198    to ? to : ".",
12199    getResolveToMatches(contextualMatches),
12200    stripBasename(location.pathname, basename) || location.pathname,
12201    relative === "path"
12202  );
12203  if (to == null) {
12204    path.search = location.search;
12205    path.hash = location.hash;
12206  }
12207  if ((to == null || to === "" || to === ".") && activeRouteMatch) {
12208    let nakedIndex = hasNakedIndexQuery(path.search);
12209    if (activeRouteMatch.route.index && !nakedIndex) {
12210      path.search = path.search ? path.search.replace(/^\?/, "?index&") 
12210: "?index";
12211    } else if (!activeRouteMatch.route.index && nakedIndex) {
12212      let params = new URLSearchParams(path.search);
12213      let indexValues = params.getAll("index");
12214      params.delete("index");
12215      indexValues.filter((v2) => v2).forEach((v2) => params.append("index", v2));
12216      let qs = params.toString();
12217      path.search = qs ? `?${qs}` : "";
12218    }
12219  }
12220  if (basename !== "/") {
12221    path.pathname = prependBasename({ basename, pathname: path.pathname });
12222  }
12223  return createPath(path);
12224}
12225function normalizeNavigateOptions(isFetcher, path, opts) {
12226  if (!opts || !isSubmissionNavigation(opts)) {
12227    return { path };
12228  }
12229  if (opts.formMethod && !isValidMethod(opts.formMethod)) {
12230    return {
12231      path,
12232      error: getInternalRouterError(405, { method: opts.formMethod })
12233    };
12234  }
12235  let getInvalidBodyError = () => ({
12236    path,
12237    error: getInternalRouterError(400, { type: "invalid-body" })
12238  });
12239  let rawFormMethod = opts.formMethod || "get";
12240  let formMethod = rawFormMethod.toUpperCase();
12241  let formAction = stripHashFromPath(path);
12242  if (opts.body !== void 0) {
12243    if (opts.formEncType === "text/plain") {
12244      if (!isMutationMethod(formMethod)) {
12245        return getInvalidBodyError();
12246      }
12247      let text = typeof opts.body === "string" ? opts.body : opts.body instanceof FormData || opts.body instanceof URLSearchParams ? (
12248        // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data
12249        Array.from(opts.body.entries()).reduce(
12250          (acc, [name, value]) => `${acc}${name}=${value}
12251`,
12252          ""
12253        )
12254      ) : String(opts.body);
12255      return {
12256        path,
12257        submission: {
12258          formMethod,
12259          formAction,
12260          formEncType: opts.formEncType,
12261          formData: void 0,
12262          json: void 0,
12263          text
12264        }
12265      };
12266    } else if (opts.formEncType === "application/json") {
12267      if (!isMutationMethod(formMethod)) {
12268        return getInvalidBodyError();
12269      }
12270      try {
12271        let json = typeof opts.body === "string" ? JSON.parse(opts.body) : opts.body;
12272        return {
12273          path,
12274          submission: {
12275            formMethod,
12276            formAction,
12277            formEncType: opts.formEncType,
12278            formData: void 0,
12279            json,
12280            text: void 0
12281          }
12282        };
12283      } catch (e) {
12284        return getInvalidBodyError();
12285      }
12286    }
12287  }
12288  invariant(
12289    typeof FormData === "function",
12290    "FormData is not available in this environment"
12291  );
12292  let searchParams;
12293  let formData;
12294  if (opts.formData) {
12295    searchParams = convertFormDataToSearchParams(opts.formData);
12296    formData = opts.formData;
12297  } else if (opts.body instanceof FormData) {
12298    searchParams = convertFormDataToSearchParams(opts.body);
12299    formData = opts.body;
12300  } else if (opts.body instanceof URLSearchParams) {
12301    searchParams = opts.body;
12302    formData = convertSearchParamsToFormData(searchParams);
12303  } else if (opts.body == null) {
12304    searchParams = new URLSearchParams();
12305    formData = new FormData();
12306  } else {
12307    try {
12308      searchParams = new URLSearchParams(opts.body);
12309      formData = convertSearchParamsToFormData(searchParams);
12310    } catch (e) {
12311      return getInvalidBodyError();
12312    }
12313  }
12314  let submission = {
12315    formMethod,
12316    formAction,
12317    formEncType: opts && opts.formEncType || "application/x-www-form-urlencoded",
12318    formData,
12319    json: void 0,
12320    text: void 0
12321  };
12322  if (isMutationMethod(submission.formMethod)) {
12323    return { path, submission };
12324  }
12325  let parsedPath = parsePath(path);
12326  if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {
12327    searchParams.append("index", "");
12328  }
12329  parsedPath.search = `?${searchParams}`;
12330  return { path: createPath(parsedPath), submission };
12331}
12332function getMatchesToLoad(request, scopedContext, mapRouteProperties2, manifest, history, state, matches, submission, location, lazyRoutePropertiesToSkip, initialHydration, isRevalidationRequired, cancelledFetcherLoads, fetchersQueuedForDeletion, fetchLoadMatches, fetchRedirectIds, routesToUse, basename, hasPatchRoutesOnNavigation, pendingActionResult) {
12333  let actionResult = pendingActionResult ? isErrorResult(pendingActionResult[1]) ? pe
12333ndingActionResult[1].error : pendingActionResult[1].data : void 0;
12334  let currentUrl = history.createURL(state.location);
12335  let nextUrl = history.createURL(location);
12336  let maxIdx;
12337  if (initialHydration && state.errors) {
12338    let boundaryId = Object.keys(state.errors)[0];
12339    maxIdx = matches.findIndex((m2) => m2.route.id === boundaryId);
12340  } else if (pendingActionResult && isErrorResult(pendingActionResult[1])) {
12341    let boundaryId = pendingActionResult[0];
12342    maxIdx = matches.findIndex((m2) => m2.route.id === boundaryId) - 1;
12343  }
12344  let actionStatus = pendingActionResult ? pendingActionResult[1].statusCode : void 0;
12345  let shouldSkipRevalidation = actionStatus && actionStatus >= 400;
12346  let baseShouldRevalidateArgs = {
12347    currentUrl,
12348    currentParams: state.matches[0]?.params || {},
12349    nextUrl,
12350    nextParams: matches[0].params,
12351    ...submission,
12352    actionResult,
12353    actionStatus
12354  };
12355  let dsMatches = matches.map((match, index) => {
12356    let { route } = match;
12357    let forceShouldLoad = null;
12358    if (maxIdx != null && index > maxIdx) {
12359      forceShouldLoad = false;
12360    } else if (route.lazy) {
12361      forceShouldLoad = true;
12362    } else if (!routeHasLoaderOrMiddleware(route)) {
12363      forceShouldLoad = false;
12364    } else if (initialHydration) {
12365      forceShouldLoad = shouldLoadRouteOnHydration(
12366        route,
12367        state.loaderData,
12368        state.errors
12369      );
12370    } else if (isNewLoader(state.loaderData, state.matches[index], match)) {
12371      forceShouldLoad = true;
12372    }
12373    if (forceShouldLoad !== null) {
12374      return getDataStrategyMatch(
12375        mapRouteProperties2,
12376        manifest,
12377        request,
12378        match,
12379        lazyRoutePropertiesToSkip,
12380        scopedContext,
12381        forceShouldLoad
12382      );
12383    }
12384    let defaultShouldRevalidate = shouldSkipRevalidation ? false : (
12385      // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate
12386      isRevalidationRequired || currentUrl.pathname + currentUrl.search === nextUrl.pathname + nextUrl.search || // Search params affect all loaders
12387      currentUrl.search !== nextUrl.search || isNewRouteInstance(state.matches[index], match)
12388    );
12389    let shouldRevalidateArgs = {
12390      ...baseShouldRevalidateArgs,
12391      defaultShouldRevalidate
12392    };
12393    let shouldLoad = shouldRevalidateLoader(match, shouldRevalidateArgs);
12394    return getDataStrategyMatch(
12395      mapRouteProperties2,
12396      manifest,
12397      request,
12398      match,
12399      lazyRoutePropertiesToSkip,
12400      scopedContext,
12401      shouldLoad,
12402      shouldRevalidateArgs
12403    );
12404  });
12405  let revalidatingFetchers = [];
12406  fetchLoadMatches.forEach((f2, key) => {
12407    if (initialHydration || !matches.some((m2) => m2.route.id === f2.routeId) || fetchersQueuedForDeletion.has(key)) {
12408      return;
12409    }
12410    let fetcher = state.fetchers.get(key);
12411    let isMidInitialLoad = fetcher && fetcher.state !== "idle" && fetcher.data === void 0;
12412    let fetcherMatches = matchRoutes(routesToUse, f2.path, basename);
12413    if (!fetcherMatches) {
12414      if (hasPatchRoutesOnNavigation && isMidInitialLoad) {
12415        return;
12416      }
12417      revalidatingFetchers.push({
12418        key,
12419        routeId: f2.routeId,
12420        path: f2.path,
12421        matches: null,
12422        match: null,
12423        request: null,
12424        controller: null
12425      });
12426      return;
12427    }
12428    if (fetchRedirectIds.has(key)) {
12429      return;
12430    }
12431    let fetcherMatch = getTargetMatch(fetcherMatches, f2.path);
12432    let fetchController = new AbortController();
12433    let fetchRequest = createClientSideRequest(
12434      history,
12435      f2.path,
12436      fetchController.signal
12437    );
12438    let fetcherDsMatches = null;
12439    if (cancelledFetcherLoads.has(key)) {
12440      cancelledFetcherLoads.delete(key);
12441      fetcherDsMatches = getTargetedDataStrategyMatches(
12442        mapRouteProperties2,
12443        manifest,
12444        fetchRequest,
12445        fetcherMatches,
12446        fetcherMatch,
12447        lazyRoutePropertiesToSkip,
12448        scopedContext
12449      );
12450    } else if (isMidInitialLoad) {
12451      if (isRevalidationRequired) {
12452        fetcherDsMatches = getTargetedDataStrategyMatches(
12453          mapRouteProperties2,
12454          manifest,
12455          fetchRequest,
12456          fetcherMatches,
12457          fetcherMatch,
12458          lazyRoutePropertiesToSkip,
12459          scopedContext
12460        );
12461      }
12462    } else {
12463      let shouldRevalidateArgs = {
12464        ...baseShouldRevalidateArgs,
12465        defaultShouldRevalidate: shouldSkipRevalidation ? false : isRevalidationRequired
12466      };
12467      if (shouldRevalidateLoader(fetcherMatch, shouldRevalidateArgs)) {
12468        fetcherDsMatches = getTargetedDataStrategyMatches(
12469          mapRouteProperties2,
12470          manifest,
12471          fetchRequest,
12472          fetcherMatches,
12473          fetcherMatch,
12474          lazyRoutePropertiesToSkip,
12475          scopedContext,
12476          shouldRevalidateArgs
12477        );
12478      }
12479    }
12480    if (fetcherDsMatches) {
12481      revalidatingFetchers.push({
12482        key,
12483        routeId: f2.routeId,
12484        path: f2.path,
12485        matches: fetcherDsMatches,
12486        match: fetcherMatch,
12487        request: fetchRequest,
12488        controller: fetchController
12489      });
12490    }
12491  });
12492  return { dsMatches, revalidatingFetchers };
12493}
12494function routeHasLoaderOrMiddleware(route) {
12495  return route.loader != null || route.middleware != null && route.middleware.length > 0;
12496}
12497function shouldLoadRouteOnHydration(route, loaderData, errors) {
12498  if (route.lazy) {
12499    return true;
12500  }
12501  if (!routeHasLoaderOrMiddleware(route)) {
12502    return false;
12503  }
12504  let hasData = loaderData != null && route.id in loaderData;
12505  let hasError = errors != null && errors[route.id] !== void 0;
12506  if (!hasData && hasError) {
12507    return false;
12508  }
12509  if (typeof route.loader === "function" && route.loader.hydrate === true) {
12510    return true;
12511  }
12512  return !hasData && !hasError;
12513}
12514function isNewLoader(currentLoaderData, currentMatch, match) {
12515  let isNew = (
12516    // [a] -> [a, b]
12517    !currentMatch || // [a, b] -> [a, c]
12518    match.route.id !== currentMatch.route.id
12519  );
12520  let isMissingData = !currentLoaderData.hasOwnProperty(match.route.id);
12521  return isNew || isMissingData;
12522}
12523function isNewRouteInstance(currentMatch, match) {
12524  let currentPath = currentMatch.route.path;
12525  return (
12526    // param change for this match, /users/123 -> /users/456
12527    currentMatch.pathname !== match.pathname || // splat param changed, which is not present in match.path
12528    // e.g. /files/images/avatar.jpg -> files/finances.xls
12529    currentPath != null && currentPath.endsWith("*") && currentMatch.params["*"] !== match.params["*"]
12530  );
12531}
12532function shouldRevalidateLoader(loaderMatch, arg) {
12533  if (loaderMatch.route.shouldRevalidate) {
12534    let routeChoice = loaderMatch.route.shouldRevalidate(arg);
12535    if (typeof routeChoice === "boolean") {
12536      return routeChoice;
12537    }
12538  }
12539  return arg.defaultShouldRevalidate;
12540}
12541function patchRoutesImpl(routeId, children, routesToUse, manifest, mapRouteProperties2, allowElementMutations) {
12542  let childrenToPatch;
12543  if (routeId) {
12544    let route = manifest[routeId];
12545    invariant(
12546      route,
12547      `No route found to patch children into: routeId = ${routeId}`
12548    );
12549    if (!route.children) {
12550      route.children = [];
12551    }
12552    childrenToPatch = route.children;
12553  } else {
12554    childrenToPatch = routesToUse;
12555  }
12556  let uniqueChildren = [];
12557  let existingChildren = [];
12558  children.forEach((newRoute) => {
12559    let existingRoute = childrenToPatch.find(
12560      (existingRoute2) => isSameRoute(newRoute, existingRoute2)
12561    );
12562    if (existingRoute) {
12563      existingChildren.push({ existingRoute, newRoute });
12564    } else {
12565      uniqueChildren.push(newRoute);
12566    }
12567  });
12568  if (uniqueChildren.length > 0) {
12569    let newRoutes = convertRoutesToDataRoutes(
12570      uniqueChildren,
12571      mapRouteProperties2,
12572      [routeId || "_", "patch", String(childrenToPatch?.length || "0")],
12573      manifest
12574    );
12575    childrenToPatch.push(...newRoutes);
12576  }
12577  if (allowElementMutations && existingChildren.length > 0) {
12578    for (let i = 0; i < existingChildren.length; i++) {
12579      let { existingRoute, newRoute } = existingChildren[i];
12580      let existingRouteTyped = existingRoute;
12581      let [newRouteTyped] = convertRoutesToDataRoutes(
12582        [newRoute],
12583        mapRouteProperties2,
12584        [],
12585        // Doesn't matter for mutated routes since they already have an id
12586        {},
12587        // Don't touch the manifest here since we're updating in place
12588        true
12589      );
12590      Object.assign(existingRouteTyped, {
12591        element: newRouteTyped.element ? newRouteTyped.element : existingRouteTyped.element,
12592        errorElement: newRouteTyped.errorElement ? newRouteTyped.errorElement : existingRouteTyped.errorElement,
12593        hydrateFallbackElement: newRouteTyped.hydrateFallbackElement ? newRouteTyped.hydrateFallbackElement : existingRouteTyped.hydrateFallbackElement
12594      });
12595    }
12596  }
12597}
12598function isSameRoute(newRoute, existingRoute) {
12599  if ("id" in newRoute && "id" in existingRoute && newRoute.id === existingRoute.id) {
12600    return true;
12601  }
12602  if (!(newRoute.index === existingRoute.index && newRoute.path === existingRoute.path && newRoute.caseSensitive === existingRoute.caseSensitive)) {
12603    return false;
12604  }
12605  if ((!newRoute.children || newRoute.children.length === 0) && (!existingRoute.children || existingRoute.children.length === 0)) {
12606    return true;
12607  }
12608  return newRoute.children.every(
12609    (aChild, i) => existingRoute.children?.some((bChild) => isSameRoute(aChild, bChild))
12610  );
12611}
12612var lazyRoutePropertyCache = /* @__PURE__ */ new WeakMap();
12613var loadLazyRouteProperty = ({
12614  key,
12615  route,
12616  manifest,
12617  mapRouteProperties: mapRouteProperties2
12618}) => {
12619  let routeToUpdate = manifest[route.id];
12620  invariant(routeToUpdate, "No route found in manifest");
12621  if (!routeToUpdate.lazy || typeof routeToUpdate.lazy !== "object") {
12622    return;
12623  }
12624  let lazyFn = routeToUpdate.lazy[key];
12625  if (!lazyFn) {
12626    return;
12627  }
12628  let cache = lazyRoutePropertyCache.get(routeToUpdate);
12629  if (!cache) {
12630    cache = {};
12631    lazyRoutePropertyCache.set(routeToUpdate, cache);
12632  }
12633  let cachedPromise = cache[key];
12634  if (cachedPromise) {
12635    return cachedPromise;
12636  }
12637  let propertyPromise = (async () => {
12638    let isUnsupported = isUnsupportedLazyRouteObjectKey(key);
12639    let staticRouteValue = routeToUpdate[key];
12640    let isStaticallyDefined = staticRouteValue !== void 0 && key !== "hasErrorBoundary";
12641    if (isUnsupported) {
12642      warning(
12643        !isUnsupported,
12644        "Route property " + key + " is not a supported lazy route property. This property will be ignored."
12645      );
12646      cache[key] = Promise.resolve();
12647    } else if (isStaticallyDefined) {
12648      warning(
12649        false,
12650        `Route "${routeToUpdate.id}" has a static property "${key}" defined. The lazy property will be ignored.`
12651      );
12652    } else {
12653      let value = await lazyFn();
12654      if (value != null) {
12655        Object.assign(routeToUpdate, { [key]: value });
12656        Object.assign(routeToUpdate, mapRouteProperties2(routeToUpdate));
12657      }
12658    }
12659    if (typeof routeToUpdate.lazy === "object") {
12660      routeToUpdate.lazy[key] = void 0;
12661      if (Object.values(routeToUpdate.lazy).every((value) => value === void 0)) {
12662        routeToUpdate.lazy = void 0;
12663      }
12664    }
12665  })();
12666  cache[key] = propertyPromise;
12667  return propertyPromise;
12668};
12669var lazyRouteFunctionCache = /* @__PURE__ */ new WeakMap();
12670function loadLazyRoute(route, type, manifest, mapRouteProperties2, lazyRoutePropertiesToSkip) {
12671  let routeToUpdate = manifest[route.id];
12672  invariant(routeToUpdate, "No route found in manifest");
12673  if (!route.lazy) {
12674    return {
12675      lazyRoutePromise: void 0,
12676      lazyHandlerPromise: void 0
12677    };
12678  }
12679  if (typeof route.lazy === "function") {
12680    let cachedPromise = lazyRouteFunctionCache.get(routeToUpdate);
12681    if (cachedPromise) {
12682      return {
12683        lazyRoutePromise: cachedPromise,
12684        lazyHandlerPromise: cachedPromise
12685      };
12686    }
12687    let lazyRoutePromise2 = (async () => {
12688      invariant(
12689        typeof route.lazy === "function",
12690        "No lazy route function found"
12691      );
12692      let lazyRoute = await route.lazy();
12693      let routeUpdates = {};
12694      for (let lazyRouteProperty in lazyRoute) {
12695        let lazyValue = lazyRoute[lazyRouteProperty];
12696        if (lazyValue === void 0) {
12697          continue;
12698        }
12699        let isUnsupported = isUnsupportedLazyRouteFunctionKey(lazyRouteProperty);
12700        let staticRouteValue = routeToUpdate[lazyRouteProperty];
12701        let isStaticallyDefined = staticRouteValue !== void 0 && // This property isn't static since it should always be updated based
12702        // on the route updates
12703        lazyRouteProperty !== "hasErrorBoundary";
12704        if (isUnsupported) {
12705          warning(
12706            !isUnsupported,
12707            "Route property " + lazyRouteProperty + " is not a supported property to be returned from a lazy route function. This property will be ignored."
12708          );
12709        } else if (isStaticallyDefined) {
12710          warning(
12711            !isStaticallyDefined,
12712            `Route "${routeToUpdate.id}" has a static property "${lazyRouteProperty}" defined but its lazy function is also returning a value for this property. The lazy route property "${lazyRouteProperty}" will be ignored.`
12713          );
12714        } else {
12715          routeUpdates[lazyRouteProperty] = lazyValue;
12716        }
12717      }
12718      Object.assign(routeToUpdate, routeUpdates);
12719      Object.assign(routeToUpdate, {
12720        // To keep things framework agnostic, we use the provided `mapRouteProperties`
12721        // function to set the framework-aware properties (`element`/`hasErrorBoundary`)
12722        // since the logic will differ between frameworks.
12723        ...mapRouteProperties2(routeToUpdate),
12724        lazy: void 0
12725      });
12726    })();
12727    lazyRouteFunctionCache.set(routeToUpdate, lazyRoutePromise2);
12728    lazyRoutePromise2.catch(() => {
12729    });
12730    return {
12731      lazyRoutePromise: lazyRoutePromise2,
12732      lazyHandlerPromise: lazyRoutePromise2
12733    };
12734  }
12735  let lazyKeys = Object.keys(route.lazy);
12736  let lazyPropertyPromises = [];
12737  let lazyHandlerPromise = void 0;
12738  for (let key of lazyKeys) {
12739    if (lazyRoutePropertiesToSkip && lazyRoutePropertiesToSkip.includes(key)) {
12740      continue;
12741    }
12742    let promise = loadLazyRouteProperty({
12743      key,
12744      route,
12745      manifest,
12746      mapRouteProperties: mapRouteProperties2
12747    });
12748    if (promise) {
12749      lazyPropertyPromises.push(promise);
12750      if (key === type) {
12751        lazyHandlerPromise = promise;
12752      }
12753    }
12754  }
12755  let lazyRoutePromise = lazyPropertyPromises.length > 0 ? Promise.all(lazyPropertyPromises).then(() => {
12756  }) : void 0;
12757  lazyRoutePromise?.catch(() => {
12758  });
12759  lazyHandlerPromise?.catch(() => {
12760  });
12761  return {
12762    lazyRoutePromise,
12763    lazyHandlerPromise
12764  };
12765}
12766async function defaultDataStrategy(args) {
12767  let matchesToLoad = args.matches.filter((m2) => m2.shouldLoad);
12768  let keyedResults = {};
12769  let results = await Promise.all(matchesToLoad.map((m2) => m2.resolve()));
12770  results.forEach((result, i) => {
12771    keyedResults[matchesToLoad[i].route.id] = result;
12772  });
12773  return keyedResults;
12774}
12775async function defaultDataStrategyWithMiddleware(args) {
12776  if (!args.matches.some((m2) => m2.route.middleware)) {
12777    return defaultDataStrategy(args);
12778  }
12779  return runClientMiddlewarePipeline(args, () => defaultDataStrategy(args));
12780}
12781function runClientMiddlewarePipeline(args, handler) {
12782  return runMiddlewarePipeline(
12783    args,
12784    handler,
12785    (r2) => r2,
12786    // No post-processing needed on the client
12787    isDataStrategyResults,
12788    errorHandler
12789  );
12790  function errorHandler(error, routeId, nextResult) {
12791    if (nextResult) {
12792      return Promise.resolve(
12793        Object.assign(nextResult.value, {
12794          [routeId]: { type: "error", result: error }
12795        })
12796      );
12797    } else {
12798      let { matches } = args;
12799      let maxBoundaryIdx = Math.min(
12800        // Throwing route
12801        Math.max(
12802          matches.findIndex((m2) => m2.route.id === routeId),
12803          0
12804        ),
12805        // or the shallowest route that needs to load data
12806        Math.max(
12807          matches.findIndex((m2) => m2.unstable_shouldCallHandler()),
12808          0
12809        )
12810      );
12811      let boundaryRouteId = findNearestBoundary(
12812        matches,
12813        matches[maxBoundaryIdx].route.id
12814      ).route.id;
12815      return Promise.resolve({
12816        [boundaryRouteId]: { type: "error", result: error }
12817      });
12818    }
12819  }
12820}
12821async function runMiddlewarePipeline(args, handler, processResult, isResult, errorHandler) {
12822  let { matches, request, params, context } = args;
12823  let tuples = matches.flatMap(
12824    (m2) => m2.route.middleware ? m2.route.middleware.map((fn) => [m2.route.id, fn]) : []
12825  );
12826  let result = await callRouteMiddleware(
12827    { request, params, context },
12828    tuples,
12829    handler,
12830    processResult,
12831    isResult,
12832    errorHandler
12833  );
12834  return result;
12835}
12836async function callRouteMiddleware(args, middlewares, handler, processResult, isResult, errorHandler, idx = 0) {
12837  let { request } = args;
12838  if (request.signal.aborted) {
12839    throw request.signal.reason ?? new Error(`Request aborted: ${request.method} ${request.url}`);
12840  }
12841  let tuple = middlewares[idx];
12842  if (!tuple) {
12843    let result = await handler();
12844    return result;
12845  }
12846  let [routeId, middleware] = tuple;
12847  let nextResult;
12848  let next = async () => {
12849    if (nextResult) {
12850      throw new Error("You may only call `next()` once per middleware");
12851    }
12852    try {
12853      let result = await callRouteMiddleware(
12854        args,
12855        middlewares,
12856        handler,
12857        processResult,
12858        isResult,
12859        errorHandler,
12860        idx + 1
12861      );
12862      nextResult = { value: result };
12863      return nextResult.value;
12864    } catch (error) {
12865      nextResult = { value: await errorHandler(error, routeId, nextResult) };
12866      return nextResult.value;
12867    }
12868  };
12869  try {
12870    let value = await middleware(args, next);
12871    let result = value != null ? processResult(value) : void 0;
12872    if (isResult(result)) {
12873      return result;
12874    } else if (nextResult) {
12875      return result ?? nextResult.value;
12876    } else {
12877      nextResult = { value: await next() };
12878      return nextResult.value;
12879    }
12880  } catch (error) {
12881    let response = await errorHandler(error, routeId, nextResult);
12882    return response;
12883  }
12884}
12885function getDataStrategyMatchLazyPromises(mapRouteProperties2, manifest, request, match, lazyRoutePropertiesToSkip) {
12886  let lazyMiddlewarePromise = loadLazyRouteProperty({
12887    key: "middleware",
12888    route: match.route,
12889    manifest,
12890    mapRouteProperties: mapRouteProperties2
12891  });
12892  let lazyRoutePromises = loadLazyRoute(
12893    match.route,
12894    isMutationMethod(request.method) ? "action" : "loader",
12895    manifest,
12896    mapRouteProperties2,
12897    lazyRoutePropertiesToSkip
12898  );
12899  return {
12900    middleware: lazyMiddlewarePromise,
12901    route: lazyRoutePromises.lazyRoutePromise,
12902    handler: lazyRoutePromises.lazyHandlerPromise
12903  };
12904}
12905function getDataStrategyMatch(mapRouteProperties2, manifest, request, match, lazyRoutePropertiesToSkip, scopedContext, shouldLoad, unstable_shouldRevalidateArgs = null) {
12906  let isUsingNewApi = false;
12907  let _lazyPromises = getDataStrategyMatchLazyPromises(
12908    mapRouteProperties2,
12909    manifest,
12910    request,
12911    match,
12912    lazyRoutePropertiesToSkip
12913  );
12914  return {
12915    ...match,
12916    _lazyPromises,
12917    shouldLoad,
12918    unstable_shouldRevalidateArgs,
12919    unstable_shouldCallHandler(defaultShouldRevalidate) {
12920      isUsingNewApi = true;
12921      if (!unstable_shouldRevalidateArgs) {
12922        return shouldLoad;
12923      }
12924      if (typeof defaultShouldRevalidate === "boolean") {
12925        return shouldRevalidateLoader(match, {
12926          ...unstable_shouldRevalidateArgs,
12927          defaultShouldRevalidate
12928        });
12929      }
12930      return shouldRevalidateLoader(match, unstable_shouldRevalidateArgs);
12931    },
12932    resolve(handlerOverride) {
12933      let { lazy, loader, middleware } = match.route;
12934      let callHandler = isUsingNewApi || shouldLoad || handlerOverride && !isMutationMethod(request.method) && (lazy || loader);
12935      let isMiddlewareOnlyRoute = middleware && middleware.length > 0 && !loader && !lazy;
12936      if (callHandler && !isMiddlewareOnlyRoute) {
12937        return callLoaderOrAction({
12938          request,
12939          match,
12940          lazyHandlerPromise: _lazyPromises?.handler,
12941          lazyRoutePromise: _lazyPromises?.route,
12942          handlerOverride,
12943          scopedContext
12944        });
12945      }
12946      return Promise.resolve({ type: "data", result: void 0 });
12947    }
12948  };
12949}
12950function getTargetedDataStrategyMatches(mapRouteProperties2, manifest, request, matches, targetMatch, lazyRoutePropertiesToSkip, scopedContext, shouldRevalidateArgs = null) {
12951  return matches.map((match) => {
12952    if (match.route.id !== targetMatch.route.id) {
12953      return {
12954        ...match,
12955        shouldLoad: false,
12956        unstable_shouldRevalidateArgs: shouldRevalidateArgs,
12957        unstable_shouldCallHandler: () => false,
12958        _lazyPromises: getDataStrategyMatchLazyPromises(
12959          mapRouteProperties2,
12960          manifest,
12961          request,
12962          match,
12963          lazyRoutePropertiesToSkip
12964        ),
12965        resolve: () => Promise.resolve({ type: "data", result: void 0 })
12966      };
12967    }
12968    return getDataStrategyMatch(
12969      mapRouteProperties2,
12970      manifest,
12971      request,
12972      match,
12973      lazyRoutePropertiesToSkip,
12974      scopedContext,
12975      true,
12976      shouldRevalidateArgs
12977    );
12978  });
12979}
12980async function callDataStrategyImpl(dataStrategyImpl, request, matches, fetcherKey, scopedContext, isStaticHandler) {
12981  if (matches.some((m2) => m2._lazyPromises?.middleware)) {
12982    await Promise.all(matches.map((m2) => m2._lazyPromises?.middleware));
12983  }
12984  let dataStrategyArgs = {
12985    request,
12986    params: matches[0].params,
12987    context: scopedContext,
12988    matches
12989  };
12990  let runClientMiddleware = (cb2) => {
12991    let typedDataStrategyArgs = dataStrategyArgs;
12992    return runClientMiddlewarePipeline(typedDataStrategyArgs, () => {
12993      return cb2({
12994        ...typedDataStrategyArgs,
12995        fetcherKey,
12996        runClientMiddleware: () => {
12997          throw new Error(
12998            "Cannot call `runClientMiddleware()` from within an `runClientMiddleware` handler"
12999          );
13000        }
13001      });
13002    });
13003  };
13004  let results = await dataStrategyImpl({
13005    ...dataStrategyArgs,
13006    fetcherKey,
13007    runClientMiddleware
13008  });
13009  try {
13010    await Promise.all(
13011      matches.flatMap((m2) => [
13012        m2._lazyPromises?.handler,
13013        m2._lazyPromises?.route
13014      ])
13015    );
13016  } catch (e) {
13017  }
13018  return results;
13019}
13020async function callLoaderOrAction({
13021  request,
13022  match,
13023  lazyHandlerPromise,
13024  lazyRoutePromise,
13025  handlerOverride,
13026  scopedContext
13027}) {
13028  let result;
13029  let onReject;
13030  let isAction = isMutationMethod(request.method);
13031  let type = isAction ? "action" : "loader";
13032  let runHandler = (handler) => {
13033    let reject;
13034    let abortPromise = new Promise((_, r2) => reject = r2);
13035    onReject = () => reject();
13036    request.signal.addEventListener("abort", onReject);
13037    let actualHandler = (ctx) => {
13038      if (typeof handler !== "function") {
13039        return Promise.reject(
13040          new Error(
13041            `You cannot call the handler for a route which defines a boolean "${type}" [routeId: ${match.route.id}]`
13042          )
13043        );
13044      }
13045      return handler(
13046        {
13047          request,
13048          params: match.params,
13049          context: scopedContext
13050        },
13051        ...ctx !== void 0 ? [ctx] : []
13052      );
13053    };
13054    let handlerPromise = (async () => {
13055      try {
13056        let val = await (handlerOverride ? handlerOverride((ctx) => actualHandler(ctx)) : actualHandler());
13057        return { type: "data", result: val };
13058      } catch (e) {
13059        return { type: "error", result: e };
13060      }
13061    })();
13062    return Promise.race([handlerPromise, abortPromise]);
13063  };
13064  try {
13065    let handler = isAction ? match.route.action : match.route.loader;
13066    if (lazyHandlerPromise || lazyRoutePromise) {
13067      if (handler) {
13068        let handlerError;
13069        let [value] = await Promise.all([
13070          // If the handler throws, don't let it immediately bubble out,
13071          // since we need to let the lazy() execution finish so we know if this
13072          // route has a boundary that can handle the error
13073          runHandler(handler).catch((e) => {
13074            handlerError = e;
13075          }),
13076          // Ensure all lazy route promises are resolved before continuing
13077          lazyHandlerPromise,
13078          lazyRoutePromise
13079        ]);
13080        if (handlerError !== void 0) {
13081          throw handlerError;
13082        }
13083        result = value;
13084      } else {
13085        await lazyHandlerPromise;
13086        let handler2 = isAction ? match.route.action : match.route.loader;
13087        if (handler2) {
13088          [result] = await Promise.all([runHandler(handler2), lazyRoutePromise]);
13089        } else if (type === "action") {
13090          let url = new URL(request.url);
13091          let pathname = url.pathname + url.search;
13092          throw getInternalRouterError(405, {
13093            method: request.method,
13094            pathname,
13095            routeId: match.route.id
13096          });
13097        } else {
13098          return { type: "data", result: void 0 };
13099        }
13100      }
13101    } else if (!handler) {
13102      let url = new URL(request.url);
13103      let pathname = url.pathname + url.search;
13104      throw getInternalRouterError(404, {
13105        pathname
13106      });
13107    } else {
13108      result = await runHandler(handler);
13109    }
13110  } catch (e) {
13111    return { type: "error", result: e };
13112  } finally {
13113    if (onReject) {
13114      request.signal.removeEventListener("abort", onReject);
13115    }
13116  }
13117  return result;
13118}
13119async function parseResponseBody(response) {
13120  let contentType = response.headers.get("Content-Type");
13121  if (contentType && /\bapplication\/json\b/.test(contentType)) {
13122    return response.body == null ? null : response.json();
13123  }
13124  return response.text();
13125}
13126async function convertDataStrategyResultToDataResult(dataStrategyResult) {
13127  let { result, type } = dataStrategyResult;
13128  if (isResponse(result)) {
13129    let data2;
13130    try {
13131      data2 = await parseResponseBody(result);
13132    } catch (e) {
13133      return { type: "error", error: e };
13134    }
13135    if (type === "error") {
13136      return {
13137        type: "error",
13138        error: new ErrorResponseImpl(result.status, result.statusText, data2),
13139        statusCode: result.status,
13140        headers: result.headers
13141      };
13142    }
13143    return {
13144      type: "data",
13145      data: data2,
13146      statusCode: result.status,
13147      headers: result.headers
13148    };
13149  }
13150  if (type === "error") {
13151    if (isDataWithResponseInit(result)) {
13152      if (result.data instanceof Error) {
13153        return {
13154          type: "error",
13155          error: result.data,
13156          statusCode: result.init?.status,
13157          headers: result.init?.headers ? new Headers(result.init.headers) : void 0
13158        };
13159      }
13160      return {
13161        type: "error",
13162        error: new ErrorResponseImpl(
13163          result.init?.status || 500,
13164          void 0,
13165          result.data
13166        ),
13167        statusCode: isRouteErrorResponse(result) ? result.status : void 0,
13168        headers: result.init?.headers ? new Headers(result.init.headers) : void 0
13169      };
13170    }
13171    return {
13172      type: "error",
13173      error: result,
13174      statusCode: isRouteErrorResponse(result) ? result.status : void 0
13175    };
13176  }
13177  if (isDataWithResponseInit(result)) {
13178    return {
13179      type: "data",
13180      data: result.data,
13181      statusCode: result.init?.status,
13182      headers: result.init?.headers ? new Headers(result.init.headers) : void 0
13183    };
13184  }
13185  return { type: "data", data: result };
13186}
13187function normalizeRelativeRoutingRedirectResponse(response, request, routeId, matches, basename) {
13188  let location = response.headers.get("Location");
13189  invariant(
13190    location,
13191    "Redirects returned/thrown from loaders/actions must have a Location header"
13192  );
13193  if (!isAbsoluteUrl(location)) {
13194    let trimmedMatches = matches.slice(
13195      0,
13196      matches.findIndex((m2) => m2.route.id === routeId) + 1
13197    );
13198    location = normalizeTo(
13199      new URL(request.url),
13200      trimmedMatches,
13201      basename,
13202      location
13203    );
13204    response.headers.set("Location", location);
13205  }
13206  return response;
13207}
13208function normalizeRedirectLocation(location, currentUrl, basename) {
13209  if (isAbsoluteUrl(location)) {
13210    let normalizedLocation = location;
13211    let url = normalizedLocation.startsWith("//") ? new URL(currentUrl.protocol + normalizedLocation) : new URL(normalizedLocation);
13212    let isSameBasename = stripBasename(url.pathname, basename) != null;
13213    if (url.origin === currentUrl.origin && isSameBasename) {
13214      return url.pathname + url.search + url.hash;
13215    }
13216  }
13217  return location;
13218}
13219function createClientSideRequest(history, location, signal, submission) {
13220  let url = history.createURL(stripHashFromPath(location)).toString();
13221  let init = { signal };
13222  if (submission && isMutationMethod(submission.formMethod)) {
13223    let { formMethod, formEncType } = submission;
13224    init.method = formMethod.toUpperCase();
13225    if (formEncType === "application/json") {
13226      init.headers = new Headers({ "Content-Type": formEncType });
13227      init.body = JSON.stringify(submission.json);
13228    } else if (formEncType === "text/plain") {
13229      init.body = submission.text;
13230    } else if (formEncType === "application/x-www-form-urlencoded" && submission.formData) {
13231      init.body = convertFormDataToSearchParams(submission.formData);
13232    } else {
13233      init.body = submission.formData;
13234    }
13235  }
13236  return new Request(url, init);
13237}
13238function convertFormDataToSearchParams(formData) {
13239  let searchParams = new URLSearchParams();
13240  for (let [key, value] of formData.entries()) {
13241    searchParams.append(key, typeof value === "string" ? value : value.name);
13242  }
13243  return searchParams;
13244}
13245function convertSearchParamsToFormData(searchParams) {
13246  let formData = new FormData();
13247  for (let [key, value] of searchParams.entries()) {
13248    formData.append(key, value);
13249  }
13250  return formData;
13251}
13252function processRouteLoaderData(matches, results, pendingActionResult, isStaticHandler = false, skipLoaderErrorBubbling = false) {
13253  let loaderData = {};
13254  let errors = null;
13255  let statusCode;
13256  let foundError = false;
13257  let loaderHeaders = {};
13258  let pendingError = pendingActionResult && isErrorResult(pendingActionResult[1]) ? pendingActionResult[1].error : void 0;
13259  matches.forEach((match) => {
13260    if (!(match.route.id in results)) {
13261      return;
13262    }
13263    let id2 = match.route.id;
13264    let result = results[id2];
13265    invariant(
13266      !isRedirectResult(result),
13267      "Cannot handle redirect results in processLoaderData"
13268    );
13269    if (isErrorResult(result)) {
13270      let error = result.error;
13271      if (pendingError !== void 0) {
13272        error = pendingError;
13273        pendingError = void 0;
13274      }
13275      errors = errors || {};
13276      if (skipLoaderErrorBubbling) {
13277        errors[id2] = error;
13278      } else {
13279        let boundaryMatch = findNearestBoundary(matches, id2);
13280        if (errors[boundaryMatch.route.id] == null) {
13281          errors[boundaryMatch.route.id] = error;
13282        }
13283      }
13284      if (!isStaticHandler) {
13285        loaderData[id2] = ResetLoaderDataSymbol;
13286      }
13287      if (!foundError) {
13288        foundError = true;
13289        statusCode = isRouteErrorResponse(result.error) ? result.error.status : 500;
13290      }
13291      if (result.headers) {
13292        loaderHeaders[id2] = result.headers;
13293      }
13294    } else {
13295      loaderData[id2] = result.data;
13296      if (result.statusCode && result.statusCode !== 200 && !foundError) {
13297        statusCode = result.statusCode;
13298      }
13299      if (result.headers) {
13300        loaderHeaders[id2] = result.headers;
13301      }
13302    }
13303  });
13304  if (pendingError !== void 0 && pendingActionResult) {
13305    errors = { [pendingActionResult[0]]: pendingError };
13306    if (pendingActionResult[2]) {
13307      loaderData[pendingActionResult[2]] = void 0;
13308    }
13309  }
13310  return {
13311    loaderData,
13312    errors,
13313    statusCode: statusCode || 200,
13314    loaderHeaders
13315  };
13316}
13317function processLoaderData(state, matches, results, pendingActionResult, revalidatingFetchers, fetcherResults) {
13318  let { loaderData, errors } = processRouteLoaderData(
13319    matches,
13320    results,
13321    pendingActionResult
13322  );
13323  revalidatingFetchers.filter((f2) => !f2.matches || f2.matches.some((m2) => m2.shouldLoad)).forEach((rf2) => {
13324    let { key, match, controller } = rf2;
13325    if (controller && controller.signal.aborted) {
13326      return;
13327    }
13328    let result = fetcherResults[key];
13329    invariant(result, "Did not find corresponding fetcher result");
13330    if (isErrorResult(result)) {
13331      let boundaryMatch = findNearestBoundary(state.matches, match?.route.id);
13332      if (!(errors && errors[boundaryMatch.route.id])) {
13333        errors = {
13334          ...errors,
13335          [boundaryMatch.route.id]: result.error
13336        };
13337      }
13338      state.fetchers.delete(key);
13339    } else if (isRedirectResult(result)) {
13340      invariant(false, "Unhandled fetcher revalidation redirect");
13341    } else {
13342      let doneFetcher = getDoneFetcher(result.data);
13343      state.fetchers.set(key, doneFetcher);
13344    }
13345  });
13346  return { loaderData, errors };
13347}
13348function mergeLoaderData(loaderData, newLoaderData, matches, errors) {
13349  let mergedLoaderData = Object.entries(newLoaderData).filter(([, v2]) => v2 !== ResetLoaderDataSymbol).reduce((merged, [k2, v2]) => {
13350    merged[k2] = v2;
13351    return merged;
13352  }, {});
13353  for (let match of matches) {
13354    let id2 = match.route.id;
13355    if (!newLoaderData.hasOwnProperty(id2) && loaderData.hasOwnProperty(id2) && match.route.loader) {
13356      mergedLoaderData[id2] = loaderData[id2];
13357    }
13358    if (errors && errors.hasOwnProperty(id2)) {
13359      break;
13360    }
13361  }
13362  return mergedLoaderData;
13363}
13364function getActionDataForCommit(pendingActionResult) {
13365  if (!pendingActionResult) {
13366    return {};
13367  }
13368  return isErrorResult(pendingActionResult[1]) ? {
13369    // Clear out prior actionData on errors
13370    actionData: {}
13371  } : {
13372    actionData: {
13373      [pendingActionResult[0]]: pendingActionResult[1].data
13374    }
13375  };
13376}
13377function findNearestBoundary(matches, routeId) {
13378  let eligibleMatches = routeId ? matches.slice(0, matches.findIndex((m2) => m2.route.id === routeId) + 1) : [...matches];
13379  return eligibleMatches.reverse().find((m2) => m2.route.hasErrorBoundary === true) || matches[0];
13380}
13381function getShortCircuitMatches(routes) {
13382  let route = routes.length === 1 ? routes[0] : routes.find((r2) => r2.index || !r2.path || r2.path === "/") || {
13383    id: `__shim-error-route__`
13384  };
13385  return {
13386    matches: [
13387      {
13388        params: {},
13389        pathname: "",
13390        pathnameBase: "",
13391        route
13392      }
13393    ],
13394    route
13395  };
13396}
13397function getInternalRouterError(status, {
13398  pathname,
13399  routeId,
13400  method,
13401  type,
13402  message
13403} = {}) {
13404  let statusText = "Unknown Server Error";
13405  let errorMessage = "Unknown @remix-run/router error";
13406  if (status === 400) {
13407    statusText = "Bad Request";
13408    if (method && pathname && routeId) {
13409      errorMessage = `You made a ${method} request to "${pathname}" but did not provide a \`loader\` for route "${routeId}", so there is no way to handle the request.`;
13410    } else if (type === "invalid-body") {
13411      errorMessage = "Unable to encode submission body";
13412    }
13413  } else if (status === 403) {
13414    statusText = "Forbidden";
13415    errorMessage = `Route "${routeId}" does not match URL "${pathname}"`;
13416  } else if (status === 404) {
13417    statusText = "Not Found";
13418    errorMessage = `No route matches URL "${pathname}"`;
13419  } else if (status === 405) {
13420    statusText = "Method Not Allowed";
13421    if (method && pathname && routeId) {
13422      errorMessage = `You made a ${method.toUpperCase()} request to "${pathname}" but did not provide an \`action\` for route "${routeId}", so there is no way to handle the request.`;
13423    } else if (method) {
13424      errorMessage = `Invalid request method "${method.toUpperCase()}"`;
13425    }
13426  }
13427  return new ErrorResponseImpl(
13428    status || 500,
13429    statusText,
13430    new Error(errorMessage),
13431    true
13432  );
13433}
13434function findRedirect(results) {
13435  let entries = Object.entries(results);
13436  for (let i = entries.length - 1; i >= 0; i--) {
13437    let [key, result] = entries[i];
13438    if (isRedirectResult(result)) {
13439      return { key, result };
13440    }
13441  }
13442}
13443function stripHashFromPath(path) {
13444  let parsedPath = typeof path === "string" ? parsePath(path) : path;
13445  return createPath({ ...parsedPath, hash: "" });
13446}
13447function isHashChangeOnly(a, b) {
13448  if (a.pathname !== b.pathname || a.search !== b.search) {
13449    return false;
13450  }
13451  if (a.hash === "") {
13452    return b.hash !== "";
13453  } else if (a.hash === b.hash) {
13454    return true;
13455  } else if (b.hash !== "") {
13456    return true;
13457  }
13458  return false;
13459}
13460function isDataStrategyResults(result) {
13461  return result != null && typeof result === "object" && Object.entries(result).every(
13462    ([key, value]) => typeof key === "string" && isDataStrategyResult(value)
13463  );
13464}
13465function isDataStrategyResult(result) {
13466  return result != null && typeof result === "object" && "type" in result && "result" in result && (result.type === "data" || result.type === "error");
13467}
13468function isRedirectDataStrategyResult(result) {
13469  return isResponse(result.result) && redirectStatusCodes.has(result.result.status);
13470}
13471function isErrorResult(result) {
13472  return result.type === "error";
13473}
13474function isRedirectResult(result) {
13475  return (result && result.type) === "redirect";
13476}
13477function isDataWithResponseInit(value) {
13478  return typeof value === "object" && value != null && "type" in value && "data" in value && "init" in value && value.type === "DataWithResponseInit";
13479}
13480function isResponse(value) {
13481  return value != null && typeof value.status === "number" && typeof value.statusText === "string" && typeof value.headers === "object" && typeof value.body !== "undefined";
13482}
13483function isValidMethod(method) {
13484  return validRequestMethods.has(method.toUpperCase());
13485}
13486function isMutationMethod(method) {
13487  return validMutationMethods.has(method.toUpperCase());
13488}
13489function hasNakedIndexQuery(search) {
13490  return new URLSearchParams(search).getAll("index").some((v2) => v2 === "");
13491}
13492function getTargetMatch(matches, location) {
13493  let search = typeof location === "string" ? parsePath(location).search : location.search;
13494  if (matches[matches.length - 1].route.index && hasNakedIndexQuery(search || "")) {
13495    return matches[matches.length - 1];
13496  }
13497  let pathMatches = getPathContributingMatches(matches);
13498  return pathMatches[pathMatches.length - 1];
13499}
13500function getSubmissionFromNavigation(navigation) {
13501  let { formMethod, formAction, formEncType, text, formData, json } = navigation;
13502  if (!formMethod || !formAction || !formEncType) {
13503    return;
13504  }
13505  if (text != null) {
13506    return {
13507      formMethod,
13508      formAction,
13509      formEncType,
13510      formData: void 0,
13511      json: void 0,
13512      text
13513    };
13514  } else if (formData != null) {
13515    return {
13516      formMethod,
13517      formAction,
13518      formEncType,
13519      formData,
13520      json: void 0,
13521      text: void 0
13522    };
13523  } else if (json !== void 0) {
13524    return {
13525      formMethod,
13526      formAction,
13527      formEncType,
13528      formData: void 0,
13529      json,
13530      text: void 0
13531    };
13532  }
13533}
13534function getLoadingNavigation(location, submission) {
13535  if (submission) {
13536    let navigation = {
13537      state: "loading",
13538      location,
13539      formMethod: submission.formMethod,
13540      formAction: submission.formAction,
13541      formEncType: submission.formEncType,
13542      formData: submission.formData,
13543      json: submission.json,
13544      text: submission.text
13545    };
13546    return navigation;
13547  } else {
13548    let navigation = {
13549      state: "loading",
13550      location,
13551      formMethod: void 0,
13552      formAction: void 0,
13553      formEncType: void 0,
13554      formData: void 0,
13555      json: void 0,
13556      text: void 0
13557    };
13558    return navigation;
13559  }
13560}
13561function getSubmittingNavigation(location, submission) {
13562  let navigation = {
13563    state: "submitting",
13564    location,
13565    formMethod: submission.formMethod,
13566    formAction: submission.formAction,
13567    formEncType: submission.formEncType,
13568    formData: submission.formData,
13569    json: submission.json,
13570    text: submission.text
13571  };
13572  return navigation;
13573}
13574function getLoadingFetcher(submission, data2) {
13575  if (submission) {
13576    let fetcher = {
13577      state: "loading",
13578      formMethod: submission.formMethod,
13579      formAction: submission.formAction,
13580      formEncType: submission.formEncType,
13581      formData: submission.formData,
13582      json: submission.json,
13583      text: submission.text,
13584      data: data2
13585    };
13586    return fetcher;
13587  } else {
13588    let fetcher = {
13589      state: "loading",
13590      formMethod: void 0,
13591      formAction: void 0,
13592      formEncType: void 0,
13593      formData: void 0,
13594      json: void 0,
13595      text: void 0,
13596      data: data2
13597    };
13598    return fetcher;
13599  }
13600}
13601function getSubmittingFetcher(submission, existingFetcher) {
13602  let fetcher = {
13603    state: "submitting",
13604    formMethod: submission.formMethod,
13605    formAction: submission.formAction,
13606    formEncType: submission.formEncType,
13607    formData: submission.formData,
13608    json: submission.json,
13609    text: submission.text,
13610    data: existingFetcher ? existingFetcher.data : void 0
13611  };
13612  return fetcher;
13613}
13614function getDoneFetcher(data2) {
13615  let fetcher = {
13616    state: "idle",
13617    formMethod: void 0,
13618    formAction: void 0,
13619    formEncType: void 0,
13620    formData: void 0,
13621    json: void 0,
13622    text: void 0,
13623    data: data2
13624  };
13625  return fetcher;
13626}
13627function restoreAppliedTransitions(_window, transitions) {
13628  try {
13629    let sessionPositions = _window.sessionStorage.getItem(
13630      TRANSITIONS_STORAGE_KEY
13631    );
13632    if (sessionPositions) {
13633      let json = JSON.parse(sessionPositions);
13634      for (let [k2, v2] of Object.entries(json || {})) {
13635        if (v2 && Array.isArray(v2)) {
13636          transitions.set(k2, new Set(v2 || []));
13637        }
13638      }
13639    }
13640  } catch (e) {
13641  }
13642}
13643function persistAppliedTransitions(_window, transitions) {
13644  if (transitions.size > 0) {
13645    let json = {};
13646    for (let [k2, v2] of transitions) {
13647      json[k2] = [...v2];
13648    }
13649    try {
13650      _window.sessionStorage.setItem(
13651        TRANSITIONS_STORAGE_KEY,
13652        JSON.stringify(json)
13653      );
13654    } catch (error) {
13655      warning(
13656        false,
13657        `Failed to save applied view transitions in sessionStorage (${error}).`
13658      );
13659    }
13660  }
13661}
13662function createDeferred() {
13663  let resolve;
13664  let reject;
13665  let promise = new Promise((res, rej) => {
13666    resolve = async (val) => {
13667      res(val);
13668      try {
13669        await promise;
13670      } catch (e) {
13671      }
13672    };
13673    reject = async (error) => {
13674      rej(error);
13675      try {
13676        await promise;
13677      } catch (e) {
13678      }
13679    };
13680  });
13681  return {
13682    promise,
13683    //@ts-ignore
13684    resolve,
13685    //@ts-ignore
13686    reject
13687  };
13688}
13689var DataRouterContext = reactExports.createContext(null);
13690DataRouterContext.displayName = "DataRouter";
13691var DataRouterStateContext = reactExports.createContext(null);
13692DataRouterStateContext.displayName = "DataRouterState";
13693reactExports.createContext(false);
13694var ViewTransitionContext = reactExports.createContext({
13695  isTransitioning: false
13696});
13697ViewTransitionContext.displayName = "ViewTransition";
13698var FetchersContext = reactExports.createContext(
13699  /* @__PURE__ */ new Map()
13700);
13701FetchersContext.displayName = "Fetchers";
13702var AwaitContext = reactExports.createContext(null);
13703AwaitContext.displayName = "Await";
13704var NavigationContext = reactExports.createContext(
13705  null
13706);
13707NavigationContext.displayName = "Navigation";
13708var LocationContext = reactExports.createContext(
13709  null
13710);
13711LocationContext.displayName = "Location";
13712var RouteContext = reactExports.createContext({
13713  outlet: null,
13714  matches: [],
13715  isDataRoute: false
13716});
13717RouteContext.displayName = "Route";
13718var RouteErrorContext = reactExports.createContext(null);
13719RouteErrorContext.displayName = "RouteError";
13720function useHref(to, { relative } = {}) {
13721  invariant(
13722    useInRouterContext(),
13723    // TODO: This error is probably because they somehow have 2 versions of the
13724    // router loaded. We can help them understand how to avoid that.
13725    `useHref() may be used only in the context of a <Router> component.`
13726  );
13727  let { basename, navigator: navigator2 } = reactExports.useContext(NavigationContext);
13728  let { hash, pathname, search } = useResolvedPath(to, { relative });
13729  let joinedPathname = pathname;
13730  if (basename !== "/") {
13731    joinedPathname = pathname === "/" ? basename : joinPaths([basename, pathname]);
13732  }
13733  return navigator2.createHref({ pathname: joinedPathname, search, hash });
13734}
13735function useInRouterContext() {
13736  return reactExports.useContext(LocationContext) != null;
13737}
13738function useLocation$1() {
13739  invariant(
13740    useInRouterContext(),
13741    // TODO: This error is probably because they somehow have 2 versions of the
13742    // router loaded. We can help them understand how to avoid that.
13743    `useLocation() may be used only in the context of a <Router> component.`
13744  );
13745  return reactExports.useContext(LocationContext).location;
13746}
13747var navigateEffectWarning = `You should call navigate() in a React.useEffect(), not when your component is first rendered.`;
13748function useIsomorphicLayoutEffect(cb2) {
13749  let isStatic = reactExports.useContext(NavigationContext).static;
13750  if (!isStatic) {
13751    reactExports.useLayoutEffect(cb2);
13752  }
13753}
13754function useNavigate() {
13755  let { isDataRoute } = reactExports.useContext(RouteContext);
13756  return isDataRoute ? useNavigateStable() : useNavigateUnstable();
13757}
13758function useNavigateUnstable() {
13759  invariant(
13760    useInRouterContext(),
13761    // TODO: This error is probably because they somehow have 2 versions of the
13762    // router loaded. We can help them understand how to avoid that.
13763    `useNavigate() may be used only in the context of a <Router> component.`
13764  );
13765  let dataRouterContext = reactExports.useContext(DataRouterContext);
13766  let { basename, navigator: navigator2 } = reactExports.useContext(NavigationContext);
13767  let { matches } = reactExports.useContext(RouteContext);
13768  let { pathname: locationPathname } = useLocation$1();
13769  let routePathnamesJson = JSON.stringify(getResolveToMatches(matches));
13770  let activeRef = reactExports.useRef(false);
13771  useIsomorphicLayoutEffect(() => {
13772    activeRef.current = true;
13773  });
13774  let navigate = reactExports.useCallback(
13775    (to, options = {}) => {
13776      warning(activeRef.current, navigateEffectWarning);
13777      if (!activeRef.current) return;
13778      if (typeof to === "number") {
13779        navigator2.go(to);
13780        return;
13781      }
13782      let path = resolveTo(
13783        to,
13784        JSON.parse(routePathnamesJson),
13785        locationPathname,
13786        options.relative === "path"
13787      );
13788      if (dataRouterContext == null && basename !== "/") {
13789        path.pathname = path.pathname === "/" ? basename : joinPaths([basename, path.pathname]);
13790      }
13791      (!!options.replace ? navigator2.replace : navigator2.push)(
13792        path,
13793        options.state,
13794        options
13795      );
13796    },
13797    [
13798      basename,
13799      navigator2,
13800      routePathnamesJson,
13801      locationPathname,
13802      dataRouterContext
13803    ]
13804  );
13805  return navigate;
13806}
13807reactExports.createContext(null);
13808function useResolvedPath(to, { relative } = {}) {
13809  let { matches } = reactExports.useContext(RouteContext);
13810  let { pathname: locationPathname } = useLocation$1();
13811  let routePathnamesJson = JSON.stringify(getResolveToMatches(matches));
13812  return reactExports.useMemo(
13813    () => resolveTo(
13814      to,
13815      JSON.parse(routePathnamesJson),
13816      locationPathname,
13817      relative === "path"
13818    ),
13819    [to, routePathnamesJson, locationPathname, relative]
13820  );
13821}
13822function useRoutesImpl(routes, locationArg, dataRouterState, unstable_onError, future) {
13823  invariant(
13824    useInRouterContext(),
13825    // TODO: This error is probably because they somehow have 2 versions of the
13826    // router loaded. We can help them understand how to avoid that.
13827    `useRoutes() may be used only in the context of a <Router> component.`
13828  );
13829  let { navigator: navigator2 } = reactExports.useContext(NavigationContext);
13830  let { matches: parentMatches } = reactExports.useContext(RouteContext);
13831  let routeMatch = parentMatches[parentMatches.length - 1];
13832  let parentParams = routeMatch ? routeMatch.params : {};
13833  let parentPathname = routeMatch ? routeMatch.pathname : "/";
13834  let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : "/";
13835  let parentRoute = routeMatch && routeMatch.route;
13836  {
13837    let parentPath = parentRoute && parentRoute.path || "";
13838    warningOnce(
13839      parentPathname,
13840      !parentRoute || parentPath.endsWith("*") || parentPath.endsWith("*?"),
13841      `You rendered descendant <Routes> (or called \`useRoutes()\`) at "${parentPathname}" (under <Route path="${parentPath}">) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.
13842
13843Please change the parent <Route path="${parentPath}"> to <Route path="${parentPath === "/" ? "*" : `${parentPath}/*`}">.`
13844    );
13845  }
13846  let locationFromContext = useLocation$1();
13847  let location;
13848  {
13849    location = locationFromContext;
13850  }
13851  let pathname = location.pathname || "/";
13852  let remainingPathname = pathname;
13853  if (parentPathnameBase !== "/") {
13854    let parentSegments = parentPathnameBase.replace(/^\//, "").split("/");
13855    let segments = pathname.replace(/^\//, "").split("/");
13856    remainingPathname = "/" + segments.slice(parentSegments.length).join("/");
13857  }
13858  let matches = matchRoutes(routes, { pathname: remainingPathname });
13859  {
13860    warning(
13861      parentRoute || matches != null,
13862      `No routes matched location "${location.pathname}${location.search}${location.hash}" `
13863    );
13864    warning(
13865      matches == null || matches[matches.length - 1].route.element !== void 0 || matches[matches.length - 1].route.Component !== void 0 || matches[matches.length - 1].route.lazy !== void 0,
13866      `Matched leaf route at location "${location.pathname}${location.search}${location.hash}" does not have an element or Component. This means it will render an <Outlet /> with a null value by default resulting in an "empty" page.`
13867    );
13868  }
13869  let renderedMatches = _renderMatches(
13870    matches && matches.map(
13871      (match) => Object.assign({}, match, {
13872        params: Object.assign({}, parentParams, match.params),
13873        pathname: joinPaths([
13874          parentPathnameBase,
13875          // Re-encode pathnames that were decoded inside matchRoutes.
13876          // Pre-encode `?` and `#` ahead of `encodeLocation` because it uses
13877          // `new URL()` internally and we need to prevent it from treating
13878          // them as separators
13879          navigator2.encodeLocation ? navigator2.encodeLocation(
13880            match.pathname.replace(/\?/g, "%3F").replace(/#/g, "%23")
13881          ).pathname : match.pathname
13882        ]),
13883        pathnameBase: match.pathnameBase === "/" ? parentPathnameBase : joinPaths([
13884          parentPathnameBase,
13885          // Re-encode pathnames that were decoded inside matchRoutes
13886          // Pre-encode `?` and `#` ahead of `encodeLocation` because it uses
13887          // `new URL()` internally and we need to prevent it from treating
13888          // them as separators
13889          navigator2.encodeLocation ? navigator2.encodeLocation(
13890            match.pathnameBase.replace(/\?/g, "%3F").replace(/#/g, "%23")
13891          ).pathname : match.pathnameBase
13892        ])
13893      })
13894    ),
13895    parentMatches,
13896    dataRouterState,
13897    unstable_onError,
13898    future
13899  );
13900  return renderedMatches;
13901}
13902function DefaultErrorComponent() {
13903  let error = useRouteError();
13904  let message = isRouteErrorResponse(error) ? `${error.status} ${error.statusText}` : error instanceof Error ? error.message : JSON.stringify(error);
13905  let stack = error instanceof Error ? error.stack : null;
13906  let lightgrey = "rgba(200,200,200, 0.5)";
13907  let preStyles = { padding: "0.5rem", backgroundColor: lightgrey };
13908  let codeStyles = { padding: "2px 4px", backgroundColor: lightgrey };
13909  let devInfo = null;
13910  {
13911    console.error(
13912      "Error handled by React Router default ErrorBoundary:",
13913      error
13914    );
13915    devInfo = /* @__PURE__ */ reactExports.createElement(reactExports.Fragment, null, /* @__PURE__ */ reactExports.createElement("p", null, "💿 Hey developer 👋"), /* @__PURE__ */ reactExports.createElement("p", null, "You can provide a way better UX than this when your app throws errors by providing your own ", /* @__P
13915URE__ */ reactExports.createElement("code", { style: codeStyles }, "ErrorBoundary"), " or", " ", /* @__PURE__ */ reactExports.createElement("code", { style: codeStyles }, "errorElement"), " prop on your route."));
13916  }
13917  return /* @__PURE__ */ reactExports.createElement(reactExports.Fragment, null, /* @__PURE__ */ reactExports.createElement("h2", null, "Unexpected Application Error!"), /* @__PURE__ */ reactExports.createElement("h3", { style: { fontStyle: "italic" } }, message), stack ? /* @__PURE__ */ reactExports.createElement("pre", { style: preStyles }, stack) : null, devInfo);
13918}
13919var defaultErrorElement = /* @__PURE__ */ reactExports.createElement(DefaultErrorComponent, null);
13920var RenderErrorBoundary = class extends reactExports.Component {
13921  constructor(props) {
13922    super(props);
13923    this.state = {
13924      location: props.location,
13925      revalidation: props.revalidation,
13926      error: props.error
13927    };
13928  }
13929  static getDerivedStateFromError(error) {
13930    return { error };
13931  }
13932  static getDerivedStateFromProps(props, state) {
13933    if (state.location !== props.location || state.revalidation !== "idle" && props.revalidation === "idle") {
13934      return {
13935        error: props.error,
13936        location: props.location,
13937        revalidation: props.revalidation
13938      };
13939    }
13940    return {
13941      error: props.error !== void 0 ? props.error : state.error,
13942      location: state.location,
13943      revalidation: props.revalidation || state.revalidation
13944    };
13945  }
13946  componentDidCatch(error, errorInfo) {
13947    if (this.props.unstable_onError) {
13948      this.props.unstable_onError(error, errorInfo);
13949    } else {
13950      console.error(
13951        "React Router caught the following error during render",
13952        error
13953      );
13954    }
13955  }
13956  render() {
13957    return this.state.error !== void 0 ? /* @__PURE__ */ reactExports.createElement(RouteContext.Provider, { value: this.props.routeContext }, /* @__PURE__ */ reactExports.createElement(
13958      RouteErrorContext.Provider,
13959      {
13960        value: this.state.error,
13961        children: this.props.component
13962      }
13963    )) : this.props.children;
13964  }
13965};
13966function RenderedRoute({ routeContext, match, children }) {
13967  let dataRouterContext = reactExports.useContext(DataRouterContext);
13968  if (dataRouterContext && dataRouterContext.static && dataRouterContext.staticContext && (match.route.errorElement || match.route.ErrorBoundary)) {
13969    dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;
13970  }
13971  return /* @__PURE__ */ reactExports.createElement(RouteContext.Provider, { value: routeContext }, children);
13972}
13973function _renderMatches(matches, parentMatches = [], dataRouterState = null, unstable_onError = null, future = null) {
13974  if (matches == null) {
13975    if (!dataRouterState) {
13976      return null;
13977    }
13978    if (dataRouterState.errors) {
13979      matches = dataRouterState.matches;
13980    } else if (parentMatches.length === 0 && !dataRouterState.initialized && dataRouterState.matches.length > 0) {
13981      matches = dataRouterState.matches;
13982    } else {
13983      return null;
13984    }
13985  }
13986  let renderedMatches = matches;
13987  let errors = dataRouterState?.errors;
13988  if (errors != null) {
13989    let errorIndex = renderedMatches.findIndex(
13990      (m2) => m2.route.id && errors?.[m2.route.id] !== void 0
13991    );
13992    invariant(
13993      errorIndex >= 0,
13994      `Could not find a matching route for errors on route IDs: ${Object.keys(
13995        errors
13996      ).join(",")}`
13997    );
13998    renderedMatches = renderedMatches.slice(
13999      0,
14000      Math.min(renderedMatches.length, errorIndex + 1)
14001    );
14002  }
14003  let renderFallback = false;
14004  let fallbackIndex = -1;
14005  if (dataRouterState) {
14006    for (let i = 0; i < renderedMatches.length; i++) {
14007      let match = renderedMatches[i];
14008      if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {
14009        fallbackIndex = i;
14010      }
14011      if (match.route.id) {
14012        let { loaderData, errors: errors2 } = dataRouterState;
14013        let needsToRunLoader = match.route.loader && !loaderData.hasOwnProperty(match.route.id) && (!errors2 || errors2[match.route.id] === void 0);
14014        if (match.route.lazy || needsToRunLoader) {
14015          renderFallback = true;
14016          if (fallbackIndex >= 0) {
14017            renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);
14018          } else {
14019            renderedMatches = [renderedMatches[0]];
14020          }
14021          break;
14022        }
14023      }
14024    }
14025  }
14026  return renderedMatches.reduceRight(
14027    (outlet, match, index) => {
14028      let error;
14029      let shouldRenderHydrateFallback = false;
14030      let errorElement = null;
14031      let hydrateFallbackElement = null;
14032      if (dataRouterState) {
14033        error = errors && match.route.id ? errors[match.route.id] : void 0;
14034        errorElement = match.route.errorElement || defaultErrorElement;
14035        if (renderFallback) {
14036          if (fallbackIndex < 0 && index === 0) {
14037            warningOnce(
14038              "route-fallback",
14039              false,
14040              "No `HydrateFallback` element provided to render during initial hydration"
14041            );
14042            shouldRenderHydrateFallback = true;
14043            hydrateFallbackElement = null;
14044          } else if (fallbackIndex === index) {
14045            shouldRenderHydrateFallback = true;
14046            hydrateFallbackElement = match.route.hydrateFallbackElement || null;
14047          }
14048        }
14049      }
14050      let matches2 = parentMatches.concat(renderedMatches.slice(0, index + 1));
14051      let getChildren = () => {
14052        let children;
14053        if (error) {
14054          children = errorElement;
14055        } else if (shouldRenderHydrateFallback) {
14056          children = hydrateFallbackElement;
14057        } else if (match.route.Component) {
14058          children = /* @__PURE__ */ reactExports.createElement(match.route.Component, null);
14059        } else if (match.route.element) {
14060          children = match.route.element;
14061        } else {
14062          children = outlet;
14063        }
14064        return /* @__PURE__ */ reactExports.createElement(
14065          RenderedRoute,
14066          {
14067            match,
14068            routeContext: {
14069              outlet,
14070              matches: matches2,
14071              isDataRoute: dataRouterState != null
14072            },
14073            children
14074          }
14075        );
14076      };
14077      return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /* @__PURE__ */ reactExports.createElement(
14078        RenderErrorBoundary,
14079        {
14080          location: dataRouterState.location,
14081          revalidation: dataRouterState.revalidation,
14082          component: errorElement,
14083          error,
14084          children: getChildren(),
14085          routeContext: { outlet: null, matches: matches2, isDataRoute: true },
14086          unstable_onError
14087        }
14088      ) : getChildren();
14089    },
14090    null
14091  );
14092}
14093function getDataRouterConsoleError(hookName) {
14094  return `${hookName} must be used within a data router.  See https://reactrouter.com/en/main/routers/picking-a-router.`;
14095}
14096function useDataRouterContext(hookName) {
14097  let ctx = reactExports.useContext(DataRouterContext);
14098  invariant(ctx, getDataRouterConsoleError(hookName));
14099  return ctx;
14100}
14101function useDataRouterState(hookName) {
14102  let state = reactExports.useContext(DataRouterStateContext);
14103  invariant(state, getDataRouterConsoleError(hookName));
14104  return state;
14105}
14106function useRouteContext(hookName) {
14107  let route = reactExports.useContext(RouteContext);
14108  invariant(route, getDataRouterConsoleError(hookName));
14109  return route;
14110}
14111function useCurrentRouteId(hookName) {
14112  let route = useRouteContext(hookName);
14113  let thisRoute = route.matches[route.matches.length - 1];
14114  invariant(
14115    thisRoute.route.id,
14116    `${hookName} can only be used on routes that contain a unique "id"`
14117  );
14118  return thisRoute.route.id;
14119}
14120function useRouteId() {
14121  return useCurrentRouteId(
14122    "useRouteId"
14123    /* UseRouteId */
14124  );
14125}
14126function useRouteError() {
14127  let error = reactExports.useContext(RouteErrorContext);
14128  let state = useDataRouterState(
14129    "useRouteError"
14130    /* UseRouteError */
14131  );
14132  let routeId = useCurrentRouteId(
14133    "useRouteError"
14134    /* UseRouteError */
14135  );
14136  if (error !== void 0) {
14137    return error;
14138  }
14139  return state.errors?.[routeId];
14140}
14141function useNavigateStable() {
14142  let { router: router2 } = useDataRouterContext(
14143    "useNavigate"
14144    /* UseNavigateStable */
14145  );
14146  let id2 = useCurrentRouteId(
14147    "useNavigate"
14148    /* UseNavigateStable */
14149  );
14150  let activeRef = reactExports.useRef(false);
14151  useIsomorphicLayoutEffect(() => {
14152    activeRef.current = true;
14153  });
14154  let navigate = reactExports.useCallback(
14155    async (to, options = {}) => {
14156      warning(activeRef.current, navigateEffectWarning);
14157      if (!activeRef.current) return;
14158      if (typeof to === "number") {
14159        router2.navigate(to);
14160      } else {
14161        await router2.navigate(to, { fromRouteId: id2, ...options });
14162      }
14163    },
14164    [router2, id2]
14165  );
14166  return navigate;
14167}
14168var alreadyWarned = {};
14169function warningOnce(key, cond, message) {
14170  if (!cond && !alreadyWarned[key]) {
14171    alreadyWarned[key] = true;
14172    warning(false, message);
14173  }
14174}
14175var alreadyWarned2 = {};
14176function warnOnce(condition, message) {
14177  if (!condition && !alreadyWarned2[message]) {
14178    alreadyWarned2[message] = true;
14179    console.warn(message);
14180  }
14181}
14182function mapRouteProperties(route) {
14183  let updates = {
14184    // Note: this check also occurs in createRoutesFromChildren so update
14185    // there if you change this -- please and thank you!
14186    hasErrorBoundary: route.hasErrorBoundary || route.ErrorBoundary != null || route.errorElement != null
14187  };
14188  if (route.Component) {
14189    {
14190      if (route.element) {
14191        warning(
14192          false,
14193          "You should not include both `Component` and `element` on your route - `Component` will be used."
14194        );
14195      }
14196    }
14197    Object.assign(updates, {
14198      element: reactExports.createElement(route.Component),
14199      Component: void 0
14200    });
14201  }
14202  if (route.HydrateFallback) {
14203    {
14204      if (route.hydrateFallbackElement) {
14205        warning(
14206          false,
14207          "You should not include both `HydrateFallback` and `hydrateFallbackElement` on your route - `HydrateFallback` will be used."
14208        );
14209      }
14210    }
14211    Object.assign(updates, {
14212      hydrateFallbackElement: reactExports.createElement(route.HydrateFallback),
14213      HydrateFallback: void 0
14214    });
14215  }
14216  if (route.ErrorBoundary) {
14217    {
14218      if (route.errorElement) {
14219        warning(
14220          false,
14221          "You should not include both `ErrorBoundary` and `errorElement` on your route - `ErrorBoundary` will be used."
14222        );
14223      }
14224    }
14225    Object.assign(updates, {
14226      errorElement: reactExports.createElement(route.ErrorBoundary),
14227      ErrorBoundary: void 0
14228    });
14229  }
14230  return updates;
14231}
14232var hydrationRouteProperties = [
14233  "HydrateFallback",
14234  "hydrateFallbackElement"
14235];
14236var Deferred = class {
14237  constructor() {
14238    this.status = "pending";
14239    this.promise = new Promise((resolve, reject) => {
14240      this.resolve = (value) => {
14241        if (this.status === "pending") {
14242          this.status = "resolved";
14243          resolve(value);
14244        }
14245      };
14246      this.reject = (reason) => {
14247        if (this.status === "pending") {
14248          this.status = "rejected";
14249          reject(reason);
14250        }
14251      };
14252    });
14253  }
14254};
14255function RouterProvider({
14256  router: router2,
14257  flushSync: reactDomFlushSyncImpl,
14258  unstable_onError
14259}) {
14260  let [state, setStateImpl] = reactExports.useState(router2.state);
14261  let [pendingState, setPendingState] = reactExports.useState();
14262  let [vtContext, setVtContext] = reactExports.useState({
14263    isTransitioning: false
14264  });
14265  let [renderDfd, setRenderDfd] = reactExports.useState();
14266  let [transition, setTransition] = reactExports.useState();
14267  let [interruption, setInterruption] = reactExports.useState();
14268  let fetcherData = reactExports.useRef(/* @__PURE__ */ new Map());
14269  let logErrorsAndSetState = reactExports.useCallback(
14270    (newState) => {
14271      setStateImpl((prevState) => {
14272        if (newState.errors && unstable_onError) {
14273          Object.entries(newState.errors).forEach(([routeId, error]) => {
14274            if (prevState.errors?.[routeId] !== error) {
14275              unstable_onError(error);
14276            }
14277          });
14278        }
14279        return newState;
14280      });
14281    },
14282    [unstable_onError]
14283  );
14284  let setState = reactExports.useCallback(
14285    (newState, { deletedFetchers, flushSync, viewTransitionOpts }) => {
14286      newState.fetchers.forEach((fetcher, key) => {
14287        if (fetcher.data !== void 0) {
14288          fetcherData.current.set(key, fetcher.data);
14289        }
14290      });
14291      deletedFetchers.forEach((key) => fetcherData.current.delete(key));
14292      warnOnce(
14293        flushSync === false || reactDomFlushSyncImpl != null,
14294        'You provided the `flushSync` option to a router update, but you are not using the `<RouterProvider>` from `react-router/dom` so `ReactDOM.flushSync()` is unavailable.  Please update your app to `import { RouterProvider } from "react-router/dom"` and ensure you have `react-dom` installed as a dependency to use the `flushSync` option.'
14295      );
14296      let isViewTransitionAvailable = router2.window != null && router2.window.document != null && typeof router2.window.document.startViewTransition === "function";
14297      warnOnce(
14298        viewTransitionOpts == null || isViewTransitionAvailable,
14299        "You provided the `viewTransition` option to a router update, but you do not appear to be running in a DOM environment as `window.startViewTransition` is not available."
14300      );
14301      if (!viewTransitionOpts || !isViewTransitionAvailable) {
14302        if (reactDomFlushSyncImpl && flushSync) {
14303          reactDomFlushSyncImpl(() => logErrorsAndSetState(newState));
14304        } else {
14305          reactExports.startTransition(() => logErrorsAndSetState(newState));
14306        }
14307        return;
14308      }
14309      if (reactDomFlushSyncImpl && flushSync) {
14310        reactDomFlushSyncImpl(() => {
14311          if (transition) {
14312            renderDfd && renderDfd.resolve();
14313            transition.skipTransition();
14314          }
14315          setVtContext({
14316            isTransitioning: true,
14317            flushSync: true,
14318            currentLocation: viewTransitionOpts.currentLocation,
14319            nextLocation: viewTransitionOpts.nextLocation
14320          });
14321        });
14322        let t2 = router2.window.document.startViewTransition(() => {
14323          reactDomFlushSyncImpl(() => logErrorsAndSetState(newState));
14324        });
14325        t2.finished.finally(() => {
14326          reactDomFlushSyncImpl(() => {
14327            setRenderDfd(void 0);
14328            setTransition(void 0);
14329            setPendingState(void 0);
14330            setVtContext({ isTransitioning: false });
14331          });
14332        });
14333        reactDomFlushSyncImpl(() => setTransition(t2));
14334        return;
14335      }
14336      if (transition) {
14337        renderDfd && renderDfd.resolve();
14338        transition.skipTransition();
14339        setInterruption({
14340          state: newState,
14341          currentLocation: viewTransitionOpts.currentLocation,
14342          nextLocation: viewTransitionOpts.nextLocation
14343        });
14344      } else {
14345        setPendingState(newState);
14346        setVtContext({
14347          isTransitioning: true,
14348          flushSync: false,
14349          currentLocation: viewTransitionOpts.currentLocation,
14350          nextLocation: viewTransitionOpts.nextLocation
14351        });
14352      }
14353    },
14354    [
14355      router2.window,
14356      reactDomFlushSyncImpl,
14357      transition,
14358      renderDfd,
14359      logErrorsAndSetState
14360    ]
14361  );
14362  reactExports.useLayoutEffect(() => router2.subscribe(setState), [router2, setState]);
14363  reactExports.useEffect(() => {
14364    if (vtContext.isTransitioning && !vtContext.flushSync) {
14365      setRenderDfd(new Deferred());
14366    }
14367  }, [vtContext]);
14368  reactExports.useEffect(() => {
14369    if (renderDfd && pendingState && router2.window) {
14370      let newState = pendingState;
14371      let renderPromise = renderDfd.promise;
14372      let transition2 = router2.window.document.startViewTransition(async () => {
14373        reactExports.startTransition(() => logErrorsAndSetState(newState));
14374        await renderPromise;
14375      });
14376      transition2.finished.finally(() => {
14377        setRenderDfd(void 0);
14378        setTransition(void 0);
14379        setPendingState(void 0);
14380        setVtContext({ isTransitioning: false });
14381      });
14382      setTransition(transition2);
14383    }
14384  }, [pendingState, renderDfd, router2.window, logErrorsAndSetState]);
14385  reactExports.useEffect(() => {
14386    if (renderDfd && pendingState && state.location.key === pendingState.location.key) {
14387      renderDfd.resolve();
14388    }
14389  }, [renderDfd, transition, state.location, pendingState]);
14390  reactExports.useEffect(() => {
14391    if (!vtContext.isTransitioning && interruption) {
14392      setPendingState(interruption.state);
14393      setVtContext({
14394        isTransitioning: true,
14395        flushSync: false,
14396        currentLocation: interruption.currentLocation,
14397        nextLocation: interruption.nextLocation
14398      });
14399      setInterruption(void 0);
14400    }
14401  }, [vtContext.isTransitioning, interruption]);
14402  let navigator2 = reactExports.useMemo(() => {
14403    return {
14404      createHref: router2.createHref,
14405      encodeLocation: router2.encodeLocation,
14406      go: (n2) => router2.navigate(n2),
14407      push: (to, state2, opts) => router2.navigate(to, {
14408        state: state2,
14409        preventScrollReset: opts?.preventScrollReset
14410      }),
14411      replace: (to, state2, opts) => router2.navigate(to, {
14412        replace: true,
14413        state: state2,
14414        preventScrollReset: opts?.preventScrollReset
14415      })
14416    };
14417  }, [router2]);
14418  let basename = router2.basename || "/";
14419  let dataRouterContext = reactExports.useMemo(
14420    () => ({
14421      router: router2,
14422      navigator: navigator2,
14423      static: false,
14424      basename,
14425      unstable_onError
14426    }),
14427    [router2, navigator2, basename, unstable_onError]
14428  );
14429  return /* @__PURE__ */ reactExports.createElement(reactExports.Fragment, null, /* @__PURE__ */ reactExports.createElement(DataRouterContext.Provider, { value: dataRouterContext }, /* @__PURE__ */ reactExports.createElement(DataRouterStateContext.Provider, { value: state }, /* @__PURE__ */ reactExports.createElement(FetchersContext.Provider, { value: fetcherData.current }, /* @__PURE__ */ reactExports.createElement(ViewTransitionContext.Provider, { value: vtContext }, /* @__PURE__ */ reactExports.createElement(
14430    Router,
14431    {
14432      basename,
14433      location: state.location,
14434      navigationType: state.historyAction,
14435      navigator: navigator2
14436    },
14437    /* @__PURE__ */ reactExports.createElement(
14438      MemoizedDataRoutes,
14439      {
14440        routes: router2.routes,
14441        future: router2.future,
14442        state,
14443        unstable_onError
14444      }
14445    )
14446  ))))), null);
14447}
14448var MemoizedDataRoutes = reactExports.memo(DataRoutes);
14449function DataRoutes({
14450  routes,
14451  future,
14452  state,
14453  unstable_onError
14454}) {
14455  return useRoutesImpl(routes, void 0, state, unstable_onError, future);
14456}
14457function Router({
14458  basename: basenameProp = "/",
14459  children = null,
14460  location: locationProp,
14461  navigationType = "POP",
14462  navigator: navigator2,
14463  static: staticProp = false
14464}) {
14465  invariant(
14466    !useInRouterContext(),
14467    `You cannot render a <Router> inside another <Router>. You should never have more than one in your app.`
14468  );
14469  let basename = basenameProp.replace(/^\/*/, "/");
14470  let navigationContext = reactExports.useMemo(
14471    () => ({
14472      basename,
14473      navigator: navigator2,
14474      static: staticProp,
14475      future: {}
14476    }),
14477    [basename, navigator2, staticProp]
14478  );
14479  if (typeof locationProp === "string") {
14480    locationProp = parsePath(locationProp);
14481  }
14482  let {
14483    pathname = "/",
14484    search = "",
14485    hash = "",
14486    state = null,
14487    key = "default"
14488  } = locationProp;
14489  let locationContext = reactExports.useMemo(() => {
14490    let trailingPathname = stripBasename(pathname, basename);
14491    if (trailingPathname == null) {
14492      return null;
14493    }
14494    return {
14495      location: {
14496        pathname: trailingPathname,
14497        search,
14498        hash,
14499        state,
14500        key
14501      },
14502      navigationType
14503    };
14504  }, [basename, pathname, search, hash, state, key, navigationType]);
14505  warning(
14506    locationContext != null,
14507    `<Router basename="${basename}"> is not able to match the URL "${pathname}${search}${hash}" because it does not start with the basename, so the <Router> won't render anything.`
14508  );
14509  if (locationContext == null) {
14510    return null;
14511  }
14512  return /* @__PURE__ */ reactExports.createElement(NavigationContext.Provider, { value: navigationContext }, /* @__PURE__ */ reactExports.createElement(LocationContext.Provider, { children, value: locationContext }));
14513}
14514var defaultMethod = "get";
14515var defaultEncType = "application/x-www-form-urlencoded";
14516function isHtmlElement(object) {
14517  return object != null && typeof object.tagName === "string";
14518}
14519function isButtonElement(object) {
14520  return isHtmlElement(object) && object.tagName.toLowerCase() === "button";
14521}
14522function isFormElement(object) {
14523  return isHtmlElement(object) && object.tagName.toLowerCase() === "form";
14524}
14525function isInputElement(object) {
14526  return isHtmlElement(object) && object.tagName.toLowerCase() === "input";
14527}
14528function isModifiedEvent(event) {
14529  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);
14530}
14531function shouldProcessLinkClick(event, target) {
14532  return event.button === 0 && // Ignore everything but left clicks
14533  (!target || target === "_self") && // Let browser handle "target=_blank" etc.
14534  !isModifiedEvent(event);
14535}
14536var _formDataSupportsSubmitter = null;
14537function isFormDataSubmitterSupported() {
14538  if (_formDataSupportsSubmitter === null) {
14539    try {
14540      new FormData(
14541        document.createElement("form"),
14542        // @ts-expect-error if FormData supports the submitter parameter, this will throw
14543        0
14544      );
14545      _formDataSupportsSubmitter = false;
vendor: 14,361 bytes, lines 14546-14980
14546    } catch (e) {
14547      _formDataSupportsSubmitter = true;
14548    }
14549  }
14550  return _formDataSupportsSubmitter;
14551}
14552var supportedFormEncTypes = /* @__PURE__ */ new Set([
14553  "application/x-www-form-urlencoded",
14554  "multipart/form-data",
14555  "text/plain"
14556]);
14557function getFormEncType(encType) {
14558  if (encType != null && !supportedFormEncTypes.has(encType)) {
14559    warning(
14560      false,
14561      `"${encType}" is not a valid \`encType\` for \`<Form>\`/\`<fetcher.Form>\` and will default to "${defaultEncType}"`
14562    );
14563    return null;
14564  }
14565  return encType;
14566}
14567function getFormSubmissionInfo(target, basename) {
14568  let method;
14569  let action;
14570  let encType;
14571  let formData;
14572  let body;
14573  if (isFormElement(target)) {
14574    let attr = target.getAttribute("action");
14575    action = attr ? stripBasename(attr, basename) : null;
14576    method = target.getAttribute("method") || defaultMethod;
14577    encType = getFormEncType(target.getAttribute("enctype")) || defaultEncType;
14578    formData = new FormData(target);
14579  } else if (isButtonElement(target) || isInputElement(target) && (target.type === "submit" || target.type === "image")) {
14580    let form = target.form;
14581    if (form == null) {
14582      throw new Error(
14583        `Cannot submit a <button> or <input type="submit"> without a <form>`
14584      );
14585    }
14586    let attr = target.getAttribute("formaction") || form.getAttribute("action");
14587    action = attr ? stripBasename(attr, basename) : null;
14588    method = target.getAttribute("formmethod") || form.getAttribute("method") || defaultMethod;
14589    encType = getFormEncType(target.getAttribute("formenctype")) || getFormEncType(form.getAttribute("enctype")) || defaultEncType;
14590    formData = new FormData(form, target);
14591    if (!isFormDataSubmitterSupported()) {
14592      let { name, type, value } = target;
14593      if (type === "image") {
14594        let prefix = name ? `${name}.` : "";
14595        formData.append(`${prefix}x`, "0");
14596        formData.append(`${prefix}y`, "0");
14597      } else if (name) {
14598        formData.append(name, value);
14599      }
14600    }
14601  } else if (isHtmlElement(target)) {
14602    throw new Error(
14603      `Cannot submit element that is not <form>, <button>, or <input type="submit|image">`
14604    );
14605  } else {
14606    method = defaultMethod;
14607    action = null;
14608    encType = defaultEncType;
14609    body = target;
14610  }
14611  if (formData && encType === "text/plain") {
14612    body = formData;
14613    formData = void 0;
14614  }
14615  return { action, method: method.toLowerCase(), encType, formData, body };
14616}
14617Object.getOwnPropertyNames(Object.prototype).sort().join("\0");
14618function invariant2(value, message) {
14619  if (value === false || value === null || typeof value === "undefined") {
14620    throw new Error(message);
14621  }
14622}
14623function singleFetchUrl(reqUrl, basename, extension) {
14624  let url = typeof reqUrl === "string" ? new URL(
14625    reqUrl,
14626    // This can be called during the SSR flow via PrefetchPageLinksImpl so
14627    // don't assume window is available
14628    typeof window === "undefined" ? "server://singlefetch/" : window.location.origin
14629  ) : reqUrl;
14630  if (url.pathname === "/") {
14631    url.pathname = `_root.${extension}`;
14632  } else if (basename && stripBasename(url.pathname, basename) === "/") {
14633    url.pathname = `${basename.replace(/\/$/, "")}/_root.${extension}`;
14634  } else {
14635    url.pathname = `${url.pathname.replace(/\/$/, "")}.${extension}`;
14636  }
14637  return url;
14638}
14639async function loadRouteModule(route, routeModulesCache) {
14640  if (route.id in routeModulesCache) {
14641    return routeModulesCache[route.id];
14642  }
14643  try {
14644    let routeModule = await import(
14645      /* @vite-ignore */
14646      /* webpackIgnore: true */
14647      route.module
14648    );
14649    routeModulesCache[route.id] = routeModule;
14650    return routeModule;
14651  } catch (error) {
14652    console.error(
14653      `Error loading route module \`${route.module}\`, reloading page...`
14654    );
14655    console.error(error);
14656    if (window.__reactRouterContext && window.__reactRouterContext.isSpaMode && // @ts-expect-error
14657    void 0) ;
14658    window.location.reload();
14659    return new Promise(() => {
14660    });
14661  }
14662}
14663function isHtmlLinkDescriptor(object) {
14664  if (object == null) {
14665    return false;
14666  }
14667  if (object.href == null) {
14668    return object.rel === "preload" && typeof object.imageSrcSet === "string" && typeof object.imageSizes === "string";
14669  }
14670  return typeof object.rel === "string" && typeof object.href === "string";
14671}
14672async function getKeyedPrefetchLinks(matches, manifest, routeModules) {
14673  let links = await Promise.all(
14674    matches.map(async (match) => {
14675      let route = manifest.routes[match.route.id];
14676      if (route) {
14677        let mod = await loadRouteModule(route, routeModules);
14678        return mod.links ? mod.links() : [];
14679      }
14680      return [];
14681    })
14682  );
14683  return dedupeLinkDescriptors(
14684    links.flat(1).filter(isHtmlLinkDescriptor).filter((link) => link.rel === "stylesheet" || link.rel === "preload").map(
14685      (link) => link.rel === "stylesheet" ? { ...link, rel: "prefetch", as: "style" } : { ...link, rel: "prefetch" }
14686    )
14687  );
14688}
14689function getNewMatchesForLinks(page, nextMatches, currentMatches, manifest, location, mode) {
14690  let isNew = (match, index) => {
14691    if (!currentMatches[index]) return true;
14692    return match.route.id !== currentMatches[index].route.id;
14693  };
14694  let matchPathChanged = (match, index) => {
14695    return (
14696      // param change, /users/123 -> /users/456
14697      currentMatches[index].pathname !== match.pathname || // splat param changed, which is not present in match.path
14698      // e.g. /files/images/avatar.jpg -> files/finances.xls
14699      currentMatches[index].route.path?.endsWith("*") && currentMatches[index].params["*"] !== match.params["*"]
14700    );
14701  };
14702  if (mode === "assets") {
14703    return nextMatches.filter(
14704      (match, index) => isNew(match, index) || matchPathChanged(match, index)
14705    );
14706  }
14707  if (mode === "data") {
14708    return nextMatches.filter((match, index) => {
14709      let manifestRoute = manifest.routes[match.route.id];
14710      if (!manifestRoute || !manifestRoute.hasLoader) {
14711        return false;
14712      }
14713      if (isNew(match, index) || matchPathChanged(match, index)) {
14714        return true;
14715      }
14716      if (match.route.shouldRevalidate) {
14717        let routeChoice = match.route.shouldRevalidate({
14718          currentUrl: new URL(
14719            location.pathname + location.search + location.hash,
14720            window.origin
14721          ),
14722          currentParams: currentMatches[0]?.params || {},
14723          nextUrl: new URL(page, window.origin),
14724          nextParams: match.params,
14725          defaultShouldRevalidate: true
14726        });
14727        if (typeof routeChoice === "boolean") {
14728          return routeChoice;
14729        }
14730      }
14731      return true;
14732    });
14733  }
14734  return [];
14735}
14736function getModuleLinkHrefs(matches, manifest, { includeHydrateFallback } = {}) {
14737  return dedupeHrefs(
14738    matches.map((match) => {
14739      let route = manifest.routes[match.route.id];
14740      if (!route) return [];
14741      let hrefs = [route.module];
14742      if (route.clientActionModule) {
14743        hrefs = hrefs.concat(route.clientActionModule);
14744      }
14745      if (route.clientLoaderModule) {
14746        hrefs = hrefs.concat(route.clientLoaderModule);
14747      }
14748      if (includeHydrateFallback && route.hydrateFallbackModule) {
14749        hrefs = hrefs.concat(route.hydrateFallbackModule);
14750      }
14751      if (route.imports) {
14752        hrefs = hrefs.concat(route.imports);
14753      }
14754      return hrefs;
14755    }).flat(1)
14756  );
14757}
14758function dedupeHrefs(hrefs) {
14759  return [...new Set(hrefs)];
14760}
14761function sortKeys(obj) {
14762  let sorted = {};
14763  let keys = Object.keys(obj).sort();
14764  for (let key of keys) {
14765    sorted[key] = obj[key];
14766  }
14767  return sorted;
14768}
14769function dedupeLinkDescriptors(descriptors, preloads) {
14770  let set = /* @__PURE__ */ new Set();
14771  new Set(preloads);
14772  return descriptors.reduce((deduped, descriptor) => {
14773    let key = JSON.stringify(sortKeys(descriptor));
14774    if (!set.has(key)) {
14775      set.add(key);
14776      deduped.push({ key, link: descriptor });
14777    }
14778    return deduped;
14779  }, []);
14780}
14781function useDataRouterContext2() {
14782  let context = reactExports.useContext(DataRouterContext);
14783  invariant2(
14784    context,
14785    "You must render this element inside a <DataRouterContext.Provider> element"
14786  );
14787  return context;
14788}
14789function useDataRouterStateContext() {
14790  let context = reactExports.useContext(DataRouterStateContext);
14791  invariant2(
14792    context,
14793    "You must render this element inside a <DataRouterStateContext.Provider> element"
14794  );
14795  return context;
14796}
14797var FrameworkContext = reactExports.createContext(void 0);
14798FrameworkContext.displayName = "FrameworkContext";
14799function useFrameworkContext() {
14800  let context = reactExports.useContext(FrameworkContext);
14801  invariant2(
14802    context,
14803    "You must render this element inside a <HydratedRouter> element"
14804  );
14805  return context;
14806}
14807function usePrefetchBehavior(prefetch, theirElementProps) {
14808  let frameworkContext = reactExports.useContext(FrameworkContext);
14809  let [maybePrefetch, setMaybePrefetch] = reactExports.useState(false);
14810  let [shouldPrefetch, setShouldPrefetch] = reactExports.useState(false);
14811  let { onFocus, onBlur, onMouseEnter, onMouseLeave, onTouchStart } = theirElementProps;
14812  let ref = reactExports.useRef(null);
14813  reactExports.useEffect(() => {
14814    if (prefetch === "render") {
14815      setShouldPrefetch(true);
14816    }
14817    if (prefetch === "viewport") {
14818      let callback = (entries) => {
14819        entries.forEach((entry) => {
14820          setShouldPrefetch(entry.isIntersecting);
14821        });
14822      };
14823      let observer = new IntersectionObserver(callback, { threshold: 0.5 });
14824      if (ref.current) observer.observe(ref.current);
14825      return () => {
14826        observer.disconnect();
14827      };
14828    }
14829  }, [prefetch]);
14830  reactExports.useEffect(() => {
14831    if (maybePrefetch) {
14832      let id2 = setTimeout(() => {
14833        setShouldPrefetch(true);
14834      }, 100);
14835      return () => {
14836        clearTimeout(id2);
14837      };
14838    }
14839  }, [maybePrefetch]);
14840  let setIntent = () => {
14841    setMaybePrefetch(true);
14842  };
14843  let cancelIntent = () => {
14844    setMaybePrefetch(false);
14845    setShouldPrefetch(false);
14846  };
14847  if (!frameworkContext) {
14848    return [false, ref, {}];
14849  }
14850  if (prefetch !== "intent") {
14851    return [shouldPrefetch, ref, {}];
14852  }
14853  return [
14854    shouldPrefetch,
14855    ref,
14856    {
14857      onFocus: composeEventHandlers(onFocus, setIntent),
14858      onBlur: composeEventHandlers(onBlur, cancelIntent),
14859      onMouseEnter: composeEventHandlers(onMouseEnter, setIntent),
14860      onMouseLeave: composeEventHandlers(onMouseLeave, cancelIntent),
14861      onTouchStart: composeEventHandlers(onTouchStart, setIntent)
14862    }
14863  ];
14864}
14865function composeEventHandlers(theirHandler, ourHandler) {
14866  return (event) => {
14867    theirHandler && theirHandler(event);
14868    if (!event.defaultPrevented) {
14869      ourHandler(event);
14870    }
14871  };
14872}
14873function PrefetchPageLinks({ page, ...linkProps }) {
14874  let { router: router2 } = useDataRouterContext2();
14875  let matches = reactExports.useMemo(
14876    () => matchRoutes(router2.routes, page, router2.basename),
14877    [router2.routes, page, router2.basename]
14878  );
14879  if (!matches) {
14880    return null;
14881  }
14882  return /* @__PURE__ */ reactExports.createElement(PrefetchPageLinksImpl, { page, matches, ...linkProps });
14883}
14884function useKeyedPrefetchLinks(matches) {
14885  let { manifest, routeModules } = useFrameworkContext();
14886  let [keyedPrefetchLinks, setKeyedPrefetchLinks] = reactExports.useState([]);
14887  reactExports.useEffect(() => {
14888    let interrupted = false;
14889    void getKeyedPrefetchLinks(matches, manifest, routeModules).then(
14890      (links) => {
14891        if (!interrupted) {
14892          setKeyedPrefetchLinks(links);
14893        }
14894      }
14895    );
14896    return () => {
14897      interrupted = true;
14898    };
14899  }, [matches, manifest, routeModules]);
14900  return keyedPrefetchLinks;
14901}
14902function PrefetchPageLinksImpl({
14903  page,
14904  matches: nextMatches,
14905  ...linkProps
14906}) {
14907  let location = useLocation$1();
14908  let { manifest, routeModules } = useFrameworkContext();
14909  let { basename } = useDataRouterContext2();
14910  let { loaderData, matches } = useDataRouterStateContext();
14911  let newMatchesForData = reactExports.useMemo(
14912    () => getNewMatchesForLinks(
14913      page,
14914      nextMatches,
14915      matches,
14916      manifest,
14917      location,
14918      "data"
14919    ),
14920    [page, nextMatches, matches, manifest, location]
14921  );
14922  let newMatchesForAssets = reactExports.useMemo(
14923    () => getNewMatchesForLinks(
14924      page,
14925      nextMatches,
14926      matches,
14927      manifest,
14928      location,
14929      "assets"
14930    ),
14931    [page, nextMatches, matches, manifest, location]
14932  );
14933  let dataHrefs = reactExports.useMemo(() => {
14934    if (page === location.pathname + location.search + location.hash) {
14935      return [];
14936    }
14937    let routesParams = /* @__PURE__ */ new Set();
14938    let foundOptOutRoute = false;
14939    nextMatches.forEach((m2) => {
14940      let manifestRoute = manifest.routes[m2.route.id];
14941      if (!manifestRoute || !manifestRoute.hasLoader) {
14942        return;
14943      }
14944      if (!newMatchesForData.some((m22) => m22.route.id === m2.route.id) && m2.route.id in loaderData && routeModules[m2.route.id]?.shouldRevalidate) {
14945        foundOptOutRoute = true;
14946      } else if (manifestRoute.hasClientLoader) {
14947        foundOptOutRoute = true;
14948      } else {
14949        routesParams.add(m2.route.id);
14950      }
14951    });
14952    if (routesParams.size === 0) {
14953      return [];
14954    }
14955    let url = singleFetchUrl(page, basename, "data");
14956    if (foundOptOutRoute && routesParams.size > 0) {
14957      url.searchParams.set(
14958        "_routes",
14959        nextMatches.filter((m2) => routesParams.has(m2.route.id)).map((m2) => m2.route.id).join(",")
14960      );
14961    }
14962    return [url.pathname + url.search];
14963  }, [
14964    basename,
14965    loaderData,
14966    location,
14967    manifest,
14968    newMatchesForData,
14969    nextMatches,
14970    page,
14971    routeModules
14972  ]);
14973  let moduleHrefs = reactExports.useMemo(
14974    () => getModuleLinkHrefs(newMatchesForAssets, manifest),
14975    [newMatchesForAssets, manifest]
14976  );
14977  let keyedPrefetchLinks = useKeyedPrefetchLinks(newMatchesForAssets);
14978  return /* @__PURE__ */ reactExports.createElement(reactExports.Fragment, null, dataHrefs.map((href) => /* @__PURE__ */ reactExports.createElement("link", { key: href, rel: "prefetch", as: "fetch", href, ...linkProps })), moduleHrefs.map((href) => /* @__PURE__ */ reactExports.createElement("link", { key: href, rel: "modulepreload", href, ...linkProps })), keyedPrefetchLinks.map(({ key, link }) => (
14979    // these don't spread `linkProps` because they are full link descriptors
14980    // already with their own props
14981    /* @__PURE__ */ reactExports.createElement("link", { key, nonce: linkProps.nonce, ...link })
14982  )));
14983}
14984function mergeRefs(...refs) {
14985  return (value) => {
14986    refs.forEach((ref) => {
14987      if (typeof ref === "function") {
14988        ref(value);
14989      } else if (ref != null) {
14990        ref.current = value;
14991      }
14992    });
14993  };
14994}
14995var isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined";
14996try {
14997  if (isBrowser) {
14998    window.__reactRouterVersion = // @ts-expect-error
14999    "7.9.3";
15000  }
15001} catch (e) {
15002}
15003function createBrowserRouter(routes, opts) {
15004  return createRouter({
15005    basename: opts?.basename,
15006    getContext: opts?.getContext,
15007    future: opts?.future,
15008    history: createBrowserHistory({ window: opts?.window }),
15009    hydrationData: parseHydrationData(),
15010    routes,
15011    mapRouteProperties,
15012    hydrationRouteProperties,
15013    dataStrategy: opts?.dataStrategy,
15014    patchRoutesOnNavigation: opts?.patchRoutesOnNavigation,
15015    window: opts?.window
15016  }).initialize();
15017}
15018function parseHydrationData() {
15019  let state = window?.__staticRouterHydrationData;
15020  if (state && state.errors) {
15021    state = {
15022      ...state,
15023      errors: deserializeErrors(state.errors)
15024    };
15025  }
15026  return state;
15027}
15028function deserializeErrors(errors) {
15029  if (!errors) return null;
15030  let entries = Object.entries(errors);
15031  let serialized = {};
15032  for (let [key, val] of entries) {
15033    if (val && val.__type === "RouteErrorResponse") {
15034      serialized[key] = new ErrorResponseImpl(
15035        val.status,
15036        val.statusText,
15037        val.data,
15038        val.internal === true
15039      );
15040    } else if (val && val.__type === "Error") {
15041      if (val.__subType) {
15042        let ErrorConstructor = window[val.__subType];
15043        if (typeof ErrorConstructor === "function") {
15044          try {
15045            let error = new ErrorConstructor(val.message);
15046            error.stack = "";
15047            serialized[key] = error;
15048          } catch (e) {
15049          }
15050        }
15051      }
15052      if (serialized[key] == null) {
15053        let error = new Error(val.message);
15054        error.stack = "";
15055        serialized[key] = error;
15056      }
15057    } else {
15058      serialized[key] = val;
15059    }
15060  }
15061  return serialized;
15062}
15063var ABSOLUTE_URL_REGEX2 = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
15064var Link = reactExports.forwardRef(
15065  function LinkWithRef({
15066    onClick,
15067    discover = "render",
15068    prefetch = "none",
15069    relative,
15070    reloadDocument,
15071    replace: replace2,
15072    state,
15073    target,
15074    to,
15075    preventScrollReset,
15076    viewTransition,
15077    ...rest
15078  }, forwardedRef) {
15079    let { basename } = reactExports.useContext(NavigationContext);
15080    let isAbsolute = typeof to === "string" && ABSOLUTE_URL_REGEX2.test(to);
15081    let absoluteHref;
15082    let isExternal = false;
15083    if (typeof to === "string" && isAbsolute) {
15084      absoluteHref = to;
15085      if (isBrowser) {
15086        try {
15087          let currentUrl = new URL(window.location.href);
15088          let targetUrl = to.startsWith("//") ? new URL(currentUrl.protocol + to) : new URL(to);
15089          let path = stripBasename(targetUrl.pathname, basename);
15090          if (targetUrl.origin === currentUrl.origin && path != null) {
15091            to = path + targetUrl.search + targetUrl.hash;
15092          } else {
15093            isExternal = true;
15094          }
15095        } catch (e) {
15096          warning(
15097            false,
15098            `<Link to="${to}"> contains an invalid URL which will probably break when clicked - please update to a valid URL path.`
15099          );
15100        }
15101      }
15102    }
15103    let href = useHref(to, { relative });
15104    let [shouldPrefetch, prefetchRef, prefetchHandlers] = usePrefetchBehavior(
15105      prefetch,
15106      rest
15107    );
15108    let internalOnClick = useLinkClickHandler(to, {
15109      replace: replace2,
15110      state,
15111      target,
15112      preventScrollReset,
15113      relative,
15114      viewTransition
15115    });
15116    function handleClick(event) {
15117      if (onClick) onClick(event);
15118      if (!event.defaultPrevented) {
15119        internalOnClick(event);
15120      }
15121    }
15122    let link = (
15123      // eslint-disable-next-line jsx-a11y/anchor-has-content
vendor: 8,564 bytes, lines 15124-15369
15124      /* @__PURE__ */ reactExports.createElement(
15125        "a",
15126        {
15127          ...rest,
15128          ...prefetchHandlers,
15129          href: absoluteHref || href,
15130          onClick: isExternal || reloadDocument ? onClick : handleClick,
15131          ref: mergeRefs(forwardedRef, prefetchRef),
15132          target,
15133          "data-discover": !isAbsolute && discover === "render" ? "true" : void 0
15134        }
15135      )
15136    );
15137    return shouldPrefetch && !isAbsolute ? /* @__PURE__ */ reactExports.createElement(reactExports.Fragment, null, link, /* @__PURE__ */ reactExports.createElement(PrefetchPageLinks, { page: href })) : link;
15138  }
15139);
15140Link.displayName = "Link";
15141var NavLink = reactExports.forwardRef(
15142  function NavLinkWithRef({
15143    "aria-current": ariaCurrentProp = "page",
15144    caseSensitive = false,
15145    className: classNameProp = "",
15146    end = false,
15147    style: styleProp,
15148    to,
15149    viewTransition,
15150    children,
15151    ...rest
15152  }, ref) {
15153    let path = useResolvedPath(to, { relative: rest.relative });
15154    let location = useLocation$1();
15155    let routerState = reactExports.useContext(DataRouterStateContext);
15156    let { navigator: navigator2, basename } = reactExports.useContext(NavigationContext);
15157    let isTransitioning = routerState != null && // Conditional usage is OK here because the usage of a data router is static
15158    // eslint-disable-next-line react-hooks/rules-of-hooks
15159    useViewTransitionState(path) && viewTransition === true;
15160    let toPathname = navigator2.encodeLocation ? navigator2.encodeLocation(path).pathname : path.pathname;
15161    let locationPathname = location.pathname;
15162    let nextLocationPathname = routerState && routerState.navigation && routerState.navigation.location ? routerState.navigation.location.pathname : null;
15163    if (!caseSensitive) {
15164      locationPathname = locationPathname.toLowerCase();
15165      nextLocationPathname = nextLocationPathname ? nextLocationPathname.toLowerCase() : null;
15166      toPathname = toPathname.toLowerCase();
15167    }
15168    if (nextLocationPathname && basename) {
15169      nextLocationPathname = stripBasename(nextLocationPathname, basename) || nextLocationPathname;
15170    }
15171    const endSlashPosition = toPathname !== "/" && toPathname.endsWith("/") ? toPathname.length - 1 : toPathname.length;
15172    let isActive = locationPathname === toPathname || !end && locationPathname.startsWith(toPathname) && locationPathname.charAt(endSlashPosition) === "/";
15173    let isPending = nextLocationPathname != null && (nextLocationPathname === toPathname || !end && nextLocationPathname.startsWith(toPathname) && nextLocationPathname.charAt(toPathname.length) === "/");
15174    let renderProps = {
15175      isActive,
15176      isPending,
15177      isTransitioning
15178    };
15179    let ariaCurrent = isActive ? ariaCurrentProp : void 0;
15180    let className;
15181    if (typeof classNameProp === "function") {
15182      className = classNameProp(renderProps);
15183    } else {
15184      className = [
15185        classNameProp,
15186        isActive ? "active" : null,
15187        isPending ? "pending" : null,
15188        isTransitioning ? "transitioning" : null
15189      ].filter(Boolean).join(" ");
15190    }
15191    let style = typeof styleProp === "function" ? styleProp(renderProps) : styleProp;
15192    return /* @__PURE__ */ reactExports.createElement(
15193      Link,
15194      {
15195        ...rest,
15196        "aria-current": ariaCurrent,
15197        className,
15198        ref,
15199        style,
15200        to,
15201        viewTransition
15202      },
15203      typeof children === "function" ? children(renderProps) : children
15204    );
15205  }
15206);
15207NavLink.displayName = "NavLink";
15208var Form = reactExports.forwardRef(
15209  ({
15210    discover = "render",
15211    fetcherKey,
15212    navigate,
15213    reloadDocument,
15214    replace: replace2,
15215    state,
15216    method = defaultMethod,
15217    action,
15218    onSubmit,
15219    relative,
15220    preventScrollReset,
15221    viewTransition,
15222    ...props
15223  }, forwardedRef) => {
15224    let submit = useSubmit();
15225    let formAction = useFormAction(action, { relative });
15226    let formMethod = method.toLowerCase() === "get" ? "get" : "post";
15227    let isAbsolute = typeof action === "string" && ABSOLUTE_URL_REGEX2.test(action);
15228    let submitHandler = (event) => {
15229      onSubmit && onSubmit(event);
15230      if (event.defaultPrevented) return;
15231      event.preventDefault();
15232      let submitter = event.nativeEvent.submitter;
15233      let submitMethod = submitter?.getAttribute("formmethod") || method;
15234      submit(submitter || event.currentTarget, {
15235        fetcherKey,
15236        method: submitMethod,
15237        navigate,
15238        replace: replace2,
15239        state,
15240        relative,
15241        preventScrollReset,
15242        viewTransition
15243      });
15244    };
15245    return /* @__PURE__ */ reactExports.createElement(
15246      "form",
15247      {
15248        ref: forwardedRef,
15249        method: formMethod,
15250        action: formAction,
15251        onSubmit: reloadDocument ? onSubmit : submitHandler,
15252        ...props,
15253        "data-discover": !isAbsolute && discover === "render" ? "true" : void 0
15254      }
15255    );
15256  }
15257);
15258Form.displayName = "Form";
15259function getDataRouterConsoleError2(hookName) {
15260  return `${hookName} must be used within a data router.  See https://reactrouter.com/en/main/routers/picking-a-router.`;
15261}
15262function useDataRouterContext3(hookName) {
15263  let ctx = reactExports.useContext(DataRouterContext);
15264  invariant(ctx, getDataRouterConsoleError2(hookName));
15265  return ctx;
15266}
15267function useLinkClickHandler(to, {
15268  target,
15269  replace: replaceProp,
15270  state,
15271  preventScrollReset,
15272  relative,
15273  viewTransition
15274} = {}) {
15275  let navigate = useNavigate();
15276  let location = useLocation$1();
15277  let path = useResolvedPath(to, { relative });
15278  return reactExports.useCallback(
15279    (event) => {
15280      if (shouldProcessLinkClick(event, target)) {
15281        event.preventDefault();
15282        let replace2 = replaceProp !== void 0 ? replaceProp : createPath(location) === createPath(path);
15283        navigate(to, {
15284          replace: replace2,
15285          state,
15286          preventScrollReset,
15287          relative,
15288          viewTransition
15289        });
15290      }
15291    },
15292    [
15293      location,
15294      navigate,
15295      path,
15296      replaceProp,
15297      state,
15298      target,
15299      to,
15300      preventScrollReset,
15301      relative,
15302      viewTransition
15303    ]
15304  );
15305}
15306var fetcherId = 0;
15307var getUniqueFetcherId = () => `__${String(++fetcherId)}__`;
15308function useSubmit() {
15309  let { router: router2 } = useDataRouterContext3(
15310    "useSubmit"
15311    /* UseSubmit */
15312  );
15313  let { basename } = reactExports.useContext(NavigationContext);
15314  let currentRouteId = useRouteId();
15315  return reactExports.useCallback(
15316    async (target, options = {}) => {
15317      let { action, method, encType, formData, body } = getFormSubmissionInfo(
15318        target,
15319        basename
15320      );
15321      if (options.navigate === false) {
15322        let key = options.fetcherKey || getUniqueFetcherId();
15323        await router2.fetch(key, currentRouteId, options.action || action, {
15324          preventScrollReset: options.preventScrollReset,
15325          formData,
15326          body,
15327          formMethod: options.method || method,
15328          formEncType: options.encType || encType,
15329          flushSync: options.flushSync
15330        });
15331      } else {
15332        await router2.navigate(options.action || action, {
15333          preventScrollReset: options.preventScrollReset,
15334          formData,
15335          body,
15336          formMethod: options.method || method,
15337          formEncType: options.encType || encType,
15338          replace: options.replace,
15339          state: options.state,
15340          fromRouteId: currentRouteId,
15341          flushSync: options.flushSync,
15342          viewTransition: options.viewTransition
15343        });
15344      }
15345    },
15346    [router2, basename, currentRouteId]
15347  );
15348}
15349function useFormAction(action, { relative } = {}) {
15350  let { basename } = reactExports.useContext(NavigationContext);
15351  let routeContext = reactExports.useContext(RouteContext);
15352  invariant(routeContext, "useFormAction must be used inside a RouteContext");
15353  let [match] = routeContext.matches.slice(-1);
15354  let path = { ...useResolvedPath(action ? action : ".", { relative }) };
15355  let location = useLocation$1();
15356  if (action == null) {
15357    path.search = location.search;
15358    let params = new URLSearchParams(path.search);
15359    let indexValues = params.getAll("index");
15360    let hasNakedIndexParam = indexValues.some((v2) => v2 === "");
15361    if (hasNakedIndexParam) {
15362      params.delete("index");
15363      indexValues.filter((v2) => v2).forEach((v2) => params.append("index", v2));
15364      let qs = params.toString();
15365      path.search = qs ? `?${qs}` : "";
15366    }
15367  }
15368  if ((!action || action === ".") && match.route.index) {
15369    path.search = path.search ? path.search.replace(/^\?/, "?index&") 
15369: "?index";
15370  }
15371  if (basename !== "/") {
15372    path.pathname = path.pathname === "/" ? basename : joinPaths([basename, path.pathname]);
15373  }
15374  return createPath(path);
15375}
15376function useViewTransitionState(to, { relative } = {}) {
15377  let vtContext = reactExports.useContext(ViewTransitionContext);
15378  invariant(
15379    vtContext != null,
15380    "`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`.  Did you accidentally import `RouterProvider` from `react-router`?"
15381  );
15382  let { basename } = useDataRouterContext3(
15383    "useViewTransitionState"
15384    /* useViewTransitionState */
15385  );
15386  let path = useResolvedPath(to, { relative });
15387  if (!vtContext.isTransitioning) {
15388    return false;
15389  }
15390  let currentPath = stripBasename(vtContext.currentLocation.pathname, basename) || vtContext.currentLocation.pathname;
15391  let nextPath = stripBasename(vtContext.nextLocation.pathname, basename) || vtContext.nextLocation.pathname;
15392  return matchPath(path.pathname, nextPath) != null || matchPath(path.pathname, currentPath) != null;
15393}
15394function RouterProvider2(props) {
15395  return /* @__PURE__ */ reactExports.createElement(RouterProvider, { flushSync: reactDomExports.flushSync, ...props });
15396}
15397const __vite_import_meta_env__$2 = {};
15398const createStoreImpl = (createState) => {
15399  let state;
15400  const listeners = /* @__PURE__ */ new Set();
15401  const setState = (partial, replace) => {
15402    const nextState = typeof partial === "function" ? partial(state) : partial;
15403    if (!Object.is(nextState, state)) {
15404      const previousState = state;
15405      state = (replace != null ? replace : typeof nextState !== "object" || nextState === null) ? nextState : Object.assign({}, state, nextState);
15406      listeners.forEach((listener) => listener(state, previousState));
15407    }
15408  };
15409  const getState = () => state;
15410  const getInitialState = () => initialState2;
15411  const subscribe = (listener) => {
15412    listeners.add(listener);
15413    return () => listeners.delete(listener);
15414  };
15415  const destroy = () => {
15416    if ((__vite_import_meta_env__$2 ? "production" : void 0) !== "production") {
15417      console.warn(
15418        "[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."
15419      );
15420    }
15421    listeners.clear();
15422  };
15423  const api = { setState, getState, getInitialState, subscribe, destroy };
15424  const initialState2 = state = createState(setState, getState, api);
15425  return api;
15426};
15427const createStore$1 = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;
15428var withSelector = { exports: {} };
15429var withSelector_production = {};
15430var shim$2 = { exports: {} };
15431var useSyncExternalStoreShim_production = {};
15432/**
15433 * @license React
15434 * use-sync-external-store-shim.production.js
15435 *
15436 * Copyright (c) Meta Platforms, Inc. and affiliates.
15437 *
15438 * This source code is licensed under the MIT license found in the
15439 * LICENSE file in the root directory of this source tree.
15440 */
15441var React$1 = reactExports;
15442function is$1(x2, y2) {
15443  return x2 === y2 && (0 !== x2 || 1 / x2 === 1 / y2) || x2 !== x2 && y2 !== y2;
15444}
15445var objectIs$1 = "function" === typeof Object.is ? Object.is : is$1, useState = React$1.useState, useEffect$1 = React$1.useEffect, useLayoutEffect = React$1.useLayoutEffect, useDebugValue$2 = React$1.useDebugValue;
15446function useSyncExternalStore$2(subscribe, getSnapshot) {
15447  var value = getSnapshot(), _useState = useState({ inst: { value, getSnapshot } }), inst = _useState[0].inst, forceUpdate = _useState[1];
15448  useLayoutEffect(
15449    function() {
15450      inst.value = value;
15451      inst.getSnapshot = getSnapshot;
15452      checkIfSnapshotChanged(inst) && forceUpdate({ inst });
15453    },
15454    [subscribe, value, getSnapshot]
15455  );
15456  useEffect$1(
15457    function() {
15458      checkIfSnapshotChanged(inst) && forceUpdate({ inst });
15459      return subscribe(function() {
15460        checkIfSnapshotChanged(inst) && forceUpdate({ inst });
15461      });
15462    },
15463    [subscribe]
15464  );
15465  useDebugValue$2(value);
15466  return value;
15467}
15468function checkIfSnapshotChanged(inst) {
15469  var latestGetSnapshot = inst.getSnapshot;
15470  inst = inst.value;
15471  try {
15472    var nextValue = latestGetSnapshot();
15473    return !objectIs$1(inst, nextValue);
15474  } catch (error) {
15475    return true;
15476  }
15477}
15478function useSyncExternalStore$1(subscribe, getSnapshot) {
15479  return getSnapshot();
15480}
15481var shim$1 = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2;
15482useSyncExternalStoreShim_production.useSyncExternalStore = void 0 !== React$1.use
15482SyncExternalStore ? React$1.useSyncExternalStore : shim$1;
15483{
15484  shim$2.exports = useSyncExternalStoreShim_production;
15485}
15486var shimExports = shim$2.exports;
15487/**
15488 * @license React
15489 * use-sync-external-store-shim/with-selector.production.js
15490 *
15491 * Copyright (c) Meta Platforms, Inc. and affiliates.
15492 *
15493 * This source code is licensed under the MIT license found in the
15494 * LICENSE file in the root directory of this source tree.
15495 */
15496var React = reactExports, shim = shimExports;
15497function is(x2, y2) {
15498  return x2 === y2 && (0 !== x2 || 1 / x2 === 1 / y2) || x2 !== x2 && y2 !== y2;
15499}
15500var objectIs = "function" === typeof Object.is ? Object.is : is, useSyncExternalStore = shim.useSyncExternalStore, useRef = React.useRef, useEffect = React.useEffect, useMemo = React.useMemo, useDebugValue$1 = React.useDebugValue;
15501withSelector_production.useSyncExternalStoreWithSelector = function(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {
15502  var instRef = useRef(null);
15503  if (null === instRef.current) {
15504    var inst = { hasValue: false, value: null };
15505    instRef.current = inst;
15506  } else inst = instRef.current;
15507  instRef = useMemo(
15508    function() {
15509      function memoizedSelector(nextSnapshot) {
15510        if (!hasMemo) {
15511          hasMemo = true;
15512          memoizedSnapshot = nextSnapshot;
15513          nextSnapshot = selector(nextSnapshot);
15514          if (void 0 !== isEqual && inst.hasValue) {
15515            var currentSelection = inst.value;
15516            if (isEqual(currentSelection, nextSnapshot))
15517              return memoizedSelection = currentSelection;
15518          }
15519          return memoizedSelection = nextSnapshot;
15520        }
15521        currentSelection = memoizedSelection;
15522        if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;
15523        var nextSelection = selector(nextSnapshot);
15524        if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))
15525          return memoizedSnapshot = nextSnapshot, currentSelection;
15526        memoizedSnapshot = nextSnapshot;
15527        return memoizedSelection = nextSelection;
15528      }
15529      var hasMemo = false, memoizedSnapshot, memoizedSelection, maybeGetServerSnapshot = void 0 === getServerSnapshot ? null : getServerSnapshot;
15530      return [
15531        function() {
15532          return memoizedSelector(getSnapshot());
15533        },
15534        null === maybeGetServerSnapshot ? void 0 : function() {
15535          return memoizedSelector(maybeGetServerSnapshot());
15536        }
15537      ];
15538    },
15539    [getSnapshot, getServerSnapshot, selector, isEqual]
15540  );
15541  var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);
15542  useEffect(
15543    function() {
15544      inst.hasValue = true;
15545      inst.value = value;
15546    },
15547    [value]
15548  );
15549  useDebugValue$1(value);
15550  return value;
15551};
15552{
15553  withSelector.exports = withSelector_production;
15554}
15555var withSelectorExports = withSelector.exports;
15556const useSyncExternalStoreExports = /* @__PURE__ */ getDefaultExportFromCjs(withSelectorExports);
15557const __vite_import_meta_env__$1 = {};
15558const { useDebugValue } = React$2;
15559const { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;
15560let didWarnAboutEqualityFn = false;
15561const identity = (arg) => arg;
15562function useStore(api, selector = identity, equalityFn) {
15563  if ((__vite_import_meta_env__$1 ? "production" : void 0) !== "production" && equalityFn && !didWarnAboutEqualityFn) {
15564    console.warn(
15565      "[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937"
15566    );
15567    didWarnAboutEqualityFn = true;
15568  }
15569  const slice = useSyncExternalStoreWithSelector(
15570    api.subscribe,
15571    api.getState,
15572    api.getServerState || api.getInitialState,
15573    selector,
15574    equalityFn
15575  );
15576  useDebugValue(slice);
15577  return slice;
15578}
15579const createImpl = (createState) => {
15580  if ((__vite_import_meta_env__$1 ? "production" : void 0) !== "production" && typeof createState !== "function") {
15581    console.warn(
15582      "[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { use
15582Store } from 'zustand'`."
15583    );
15584  }
15585  const api = typeof createState === "function" ? createStore$1(createState) : createState;
15586  const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);
15587  Object.assign(useBoundStore, api);
15588  return useBoundStore;
15589};
15590const create = (createState) => createImpl;
15591const __vite_import_meta_env__ = { "BASE_URL": "/", "DEV": false, "MODE": "production", "PROD": true, "SSR": false, "VITE_API_URL": "https://mec-portfolio-backend.onrender.com", "VITE_WS_URL": "https://mec-portfolio-backend.onrender.com" };
15592const trackedConnections = /* @__PURE__ */ new Map();
15593const getTrackedConnectionState = (name) => {
15594  const api = trackedConnections.get(name);
15595  if (!api) return {};
15596  return Object.fromEntries(
15597    Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])
15598  );
15599};
15600const extractConnectionInformation = (store2, extensionConnector, options) => {
15601  if (store2 === void 0) {
15602    return {
15603      type: "untracked",
15604      connection: extensionConnector.connect(options)
15605    };
15606  }
15607  const existingConnection = trackedConnections.get(options.name);
15608  if (existingConnection) {
15609    return { type: "tracked", store: store2, ...existingConnection };
15610  }
15611  const newConnection = {
15612    connection: extensionConnector.connect(options),
15613    stores: {}
15614  };
15615  trackedConnections.set(options.name, newConnection);
15616  return { type: "tracked", store: store2, ...newConnection };
15617};
15618const devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {
15619  const { enabled, anonymousActionType, store: store2, ...options } = devtoolsOptions;
15620  let extensionConnector;
15621  try {
15622    extensionConnector = (enabled != null ? enabled : (__vite_import_meta_env__ ? "production" : void 0) !== "production") && window.__REDUX_DEVTOOLS_EXTENSION__;
15623  } catch (_e2) {
15624  }
15625  if (!extensionConnector) {
15626    if ((__vite_import_meta_env__ ? "production" : void 0) !== "production" && enabled) {
15627      console.warn(
15628        "[zustand devtools middleware] Please install/enable Redux devtools extension"
15629      );
15630    }
15631    return fn(set, get, api);
15632  }
15633  const { connection, ...connectionInformation } = extractConnectionInformation(store2, extensionConnector, options);
15634  let isRecording = true;
15635  api.setState = (state, replace, nameOrAction) => {
15636    const r2 = set(state, replace);
15637    if (!isRecording) return r2;
15638    const action = nameOrAction === void 0 ? { type: anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction;
15639    if (store2 === void 0) {
15640      connection == null ? void 0 : connection.send(action, get());
15641      return r2;
15642    }
15643    connection == null ? void 0 : connection.send(
15644      {
15645        ...action,
15646        type: `${store2}/${action.type}`
15647      },
15648      {
15649        ...getTrackedConnectionState(options.name),
15650        [store2]: api.getState()
15651      }
15652    );
15653    return r2;
15654  };
15655  const setStateFromDevtools = (...a) => {
15656    const originalIsRecording = isRecording;
15657    isRecording = false;
15658    set(...a);
15659    isRecording = originalIsRecording;
15660  };
15661  const initialState2 = fn(api.setState, get, api);
15662  if (connectionInformation.type === "untracked") {
15663    connection == null ? void 0 : connection.init(initialState2);
15664  } else {
15665    connectionInformation.stores[connectionInformation.store] = api;
15666    connection == null ? void 0 : connection.init(
15667      Object.fromEntries(
15668        Object.entries(connectionInformation.stores).map(([key, store22]) => [
15669          key,
15670          key === connectionInformation.store ? initialState2 : store22.getState()
15671        ])
15672      )
15673    );
15674  }
15675  if (api.dispatchFromDevtools && typeof api.dispatch === "function") {
15676    let didWarnAboutReservedActionType = false;
vendor: 7,229 bytes, lines 15677-15893
15677    const originalDispatch = api.dispatch;
15678    api.dispatch = (...a) => {
15679      if ((__vite_import_meta_env__ ? "production" : void 0) !== "production" && a[0].type === "__setState" && !didWarnAboutReservedActionType) {
15680        console.warn(
15681          '[zustand devtools middleware] "__setState" action type is reserved to set state from the devtools. Avoid using it.'
15682        );
15683        didWarnAboutReservedActionType = true;
15684      }
15685      originalDispatch(...a);
15686    };
15687  }
15688  connection.subscribe((message) => {
15689    var _a2;
15690    switch (message.type) {
15691      case "ACTION":
15692        if (typeof message.payload !== "string") {
15693          console.error(
15694            "[zustand devtools middleware] Unsupported action format"
15695          );
15696          return;
15697        }
15698        return parseJsonThen(
15699          message.payload,
15700          (action) => {
15701            if (action.type === "__setState") {
15702              if (store2 === void 0) {
15703                setStateFromDevtools(action.state);
15704                return;
15705              }
15706              if (Object.keys(action.state).length !== 1) {
15707                console.error(
15708                  `
15709                    [zustand devtools middleware] Unsupported __setState action format. 
15710                    When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),
15711                    and value of this only key should be a state object. Example: { "type": "__setState", "state": { "abc123Store": { "foo": "bar" } } }
15712                    `
15713                );
15714              }
15715              const stateFromDevtools = action.state[store2];
15716              if (stateFromDevtools === void 0 || stateFromDevtools === null) {
15717                return;
15718              }
15719              if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {
15720                setStateFromDevtools(stateFromDevtools);
15721              }
15722              return;
15723            }
15724            if (!api.dispatchFromDevtools) return;
15725            if (typeof api.dispatch !== "function") return;
15726            api.dispatch(action);
15727          }
15728        );
15729      case "DISPATCH":
15730        switch (message.payload.type) {
15731          case "RESET":
15732            setStateFromDevtools(initialState2);
15733            if (store2 === void 0) {
15734              return connection == null ? void 0 : connection.init(api.getState());
15735            }
15736            return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));
15737          case "COMMIT":
15738            if (store2 === void 0) {
15739              connection == null ? void 0 : connection.init(api.getState());
15740              return;
15741            }
15742            return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));
15743          case "ROLLBACK":
15744            return parseJsonThen(message.state, (state) => {
15745              if (store2 === void 0) {
15746                setStateFromDevtools(state);
15747                connection == null ? void 0 : connection.init(api.getState());
15748                return;
15749              }
15750              setStateFromDevtools(state[store2]);
15751              connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));
15752            });
15753          case "JUMP_TO_STATE":
15754          case "JUMP_TO_ACTION":
15755            return parseJsonThen(message.state, (state) => {
15756              if (store2 === void 0) {
15757                setStateFromDevtools(state);
15758                return;
15759              }
15760              if (JSON.stringify(api.getState()) !== JSON.stringify(state[store2])) {
15761                setStateFromDevtools(state[store2]);
15762              }
15763            });
15764          case "IMPORT_STATE": {
15765            const { nextLiftedState } = message.payload;
15766            const lastComputedState = (_a2 = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a2.state;
15767            if (!lastComputedState) return;
15768            if (store2 === void 0) {
15769              setStateFromDevtools(lastComputedState);
15770            } else {
15771              setStateFromDevtools(lastComputedState[store2]);
15772            }
15773            connection == null ? void 0 : connection.send(
15774              null,
15775              // FIXME no-any
15776              nextLiftedState
15777            );
15778            return;
15779          }
15780          case "PAUSE_RECORDING":
15781            return isRecording = !isRecording;
15782        }
15783        return;
15784    }
15785  });
15786  return initialState2;
15787};
15788const devtools = devtoolsImpl;
15789const parseJsonThen = (stringified, f2) => {
15790  let parsed;
15791  try {
15792    parsed = JSON.parse(stringified);
15793  } catch (e) {
15794    console.error(
15795      "[zustand devtools middleware] Could not parse the received json",
15796      e
15797    );
15798  }
15799  if (parsed !== void 0) f2(parsed);
15800};
15801const subscribeWithSelectorImpl = (fn) => (set, get, api) => {
15802  const origSubscribe = api.subscribe;
15803  api.subscribe = (selector, optListener, options) => {
15804    let listener = selector;
15805    if (optListener) {
15806      const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;
15807      let currentSlice = selector(api.getState());
15808      listener = (state) => {
15809        const nextSlice = selector(state);
15810        if (!equalityFn(currentSlice, nextSlice)) {
15811          const previousSlice = currentSlice;
15812          optListener(currentSlice = nextSlice, previousSlice);
15813        }
15814      };
15815      if (options == null ? void 0 : options.fireImmediately) {
15816        optListener(currentSlice, currentSlice);
15817      }
15818    }
15819    return origSubscribe(listener);
15820  };
15821  const initialState2 = fn(set, get, api);
15822  return initialState2;
15823};
15824const subscribeWithSelector = subscribeWithSelectorImpl;
15825function createJSONStorage(getStorage, options) {
15826  let storage;
15827  try {
15828    storage = getStorage();
15829  } catch (_e2) {
15830    return;
15831  }
15832  const persistStorage = {
15833    getItem: (name) => {
15834      var _a2;
15835      const parse = (str2) => {
15836        if (str2 === null) {
15837          return null;
15838        }
15839        return JSON.parse(str2, void 0);
15840      };
15841      const str = (_a2 = storage.getItem(name)) != null ? _a2 : null;
15842      if (str instanceof Promise) {
15843        return str.then(parse);
15844      }
15845      return parse(str);
15846    },
15847    setItem: (name, newValue) => storage.setItem(
15848      name,
15849      JSON.stringify(newValue, void 0)
15850    ),
15851    removeItem: (name) => storage.removeItem(name)
15852  };
15853  return persistStorage;
15854}
15855const toThenable = (fn) => (input) => {
15856  try {
15857    const result = fn(input);
15858    if (result instanceof Promise) {
15859      return result;
15860    }
15861    return {
15862      then(onFulfilled) {
15863        return toThenable(onFulfilled)(result);
15864      },
15865      catch(_onRejected) {
15866        return this;
15867      }
15868    };
15869  } catch (e) {
15870    return {
15871      then(_onFulfilled) {
15872        return this;
15873      },
15874      catch(onRejected) {
15875        return toThenable(onRejected)(e);
15876      }
15877    };
15878  }
15879};
15880const oldImpl = (config, baseOptions) => (set, get, api) => {
15881  let options = {
15882    getStorage: () => localStorage,
15883    serialize: JSON.stringify,
15884    deserialize: JSON.parse,
15885    partialize: (state) => state,
15886    version: 0,
15887    merge: (persistedState, currentState) => ({
15888      ...currentState,
15889      ...persistedState
15890    }),
15891    ...baseOptions
15892  };
15893  let hasHydrated = false;
vendor: 4,984 bytes, lines 15894-16067
15894  const hydrationListeners = /* @__PURE__ */ new Set();
15895  const finishHydrationListeners = /* @__PURE__ */ new Set();
15896  let storage;
15897  try {
15898    storage = options.getStorage();
15899  } catch (_e2) {
15900  }
15901  if (!storage) {
15902    return config(
15903      (...args) => {
15904        console.warn(
15905          `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`
15906        );
15907        set(...args);
15908      },
15909      get,
15910      api
15911    );
15912  }
15913  const thenableSerialize = toThenable(options.serialize);
15914  const setItem = () => {
15915    const state = options.partialize({ ...get() });
15916    let errorInSync;
15917    const thenable = thenableSerialize({ state, version: options.version }).then(
15918      (serializedValue) => storage.setItem(options.name, serializedValue)
15919    ).catch((e) => {
15920      errorInSync = e;
15921    });
15922    if (errorInSync) {
15923      throw errorInSync;
15924    }
15925    return thenable;
15926  };
15927  const savedSetState = api.setState;
15928  api.setState = (state, replace) => {
15929    savedSetState(state, replace);
15930    void setItem();
15931  };
15932  const configResult = config(
15933    (...args) => {
15934      set(...args);
15935      void setItem();
15936    },
15937    get,
15938    api
15939  );
15940  let stateFromStorage;
15941  const hydrate2 = () => {
15942    var _a2;
15943    if (!storage) return;
15944    hasHydrated = false;
15945    hydrationListeners.forEach((cb2) => cb2(get()));
15946    const postRehydrationCallback = ((_a2 = options.onRehydrateStorage) == null ? void 0 : _a2.call(options, get())) || void 0;
15947    return toThenable(storage.getItem.bind(storage))(options.name).then((storageValue) => {
15948      if (storageValue) {
15949        return options.deserialize(storageValue);
15950      }
15951    }).then((deserializedStorageValue) => {
15952      if (deserializedStorageValue) {
15953        if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
15954          if (options.migrate) {
15955            return options.migrate(
15956              deserializedStorageValue.state,
15957              deserializedStorageValue.version
15958            );
15959          }
15960          console.error(
15961            `State loaded from storage couldn't be migrated since no migrate function was provided`
15962          );
15963        } else {
15964          return deserializedStorageValue.state;
15965        }
15966      }
15967    }).then((migratedState) => {
15968      var _a22;
15969      stateFromStorage = options.merge(
15970        migratedState,
15971        (_a22 = get()) != null ? _a22 : configResult
15972      );
15973      set(stateFromStorage, true);
15974      return setItem();
15975    }).then(() => {
15976      postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);
15977      hasHydrated = true;
15978      finishHydrationListeners.forEach((cb2) => cb2(stateFromStorage));
15979    }).catch((e) => {
15980      postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);
15981    });
15982  };
15983  api.persist = {
15984    setOptions: (newOptions) => {
15985      options = {
15986        ...options,
15987        ...newOptions
15988      };
15989      if (newOptions.getStorage) {
15990        storage = newOptions.getStorage();
15991      }
15992    },
15993    clearStorage: () => {
15994      storage == null ? void 0 : storage.removeItem(options.name);
15995    },
15996    getOptions: () => options,
15997    rehydrate: () => hydrate2(),
15998    hasHydrated: () => hasHydrated,
15999    onHydrate: (cb2) => {
16000      hydrationListeners.add(cb2);
16001      return () => {
16002        hydrationListeners.delete(cb2);
16003      };
16004    },
16005    onFinishHydration: (cb2) => {
16006      finishHydrationListeners.add(cb2);
16007      return () => {
16008        finishHydrationListeners.delete(cb2);
16009      };
16010    }
16011  };
16012  hydrate2();
16013  return stateFromStorage || configResult;
16014};
16015const newImpl = (config, baseOptions) => (set, get, api) => {
16016  let options = {
16017    storage: createJSONStorage(() => localStorage),
16018    partialize: (state) => state,
16019    version: 0,
16020    merge: (persistedState, currentState) => ({
16021      ...currentState,
16022      ...persistedState
16023    }),
16024    ...baseOptions
16025  };
16026  let hasHydrated = false;
16027  const hydrationListeners = /* @__PURE__ */ new Set();
16028  const finishHydrationListeners = /* @__PURE__ */ new Set();
16029  let storage = options.storage;
16030  if (!storage) {
16031    return config(
16032      (...args) => {
16033        console.warn(
16034          `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`
16035        );
16036        set(...args);
16037      },
16038      get,
16039      api
16040    );
16041  }
16042  const setItem = () => {
16043    const state = options.partialize({ ...get() });
16044    return storage.setItem(options.name, {
16045      state,
16046      version: options.version
16047    });
16048  };
16049  const savedSetState = api.setState;
16050  api.setState = (state, replace) => {
16051    savedSetState(state, replace);
16052    void setItem();
16053  };
16054  const configResult = config(
16055    (...args) => {
16056      set(...args);
16057      void setItem();
16058    },
16059    get,
16060    api
16061  );
16062  api.getInitialState = () => configResult;
16063  let stateFromStorage;
16064  const hydrate2 = () => {
16065    var _a2, _b2;
16066    if (!storage) return;
16067    hasHydrated = false;
16068    hydrationListeners.forEach((cb2) => {
16069      var _a22;
16070      return cb2((_a22 = get()) != null ? _a22 : configResult);
16071    });
16072    const postRehydrationCallback = ((_b2 = options.onRehydrateStorage) == null ? void 0 : _b2.call(options, (_a2 = get()) != null ? _a2 : configResult)) || void 0;
16073    return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {
16074      if (deserializedStorageValue) {
16075        if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
16076          if (options.migrate) {
16077            return [
16078              true,
16079              options.migrate(
16080                deserializedStorageValue.state,
16081                deserializedStorageValue.version
16082              )
16083            ];
16084          }
16085          console.error(
16086            `State loaded from storage couldn't be migrated since no migrate function was provided`
16087          );
16088        } else {
16089          return [false, deserializedStorageValue.state];
16090        }
16091      }
16092      return [false, void 0];
16093    }).then((migrationResult) => {
16094      var _a22;
16095      const [migrated, migratedState] = migrationResult;
16096      stateFromStorage = options.merge(
16097        migratedState,
16098        (_a22 = get()) != null ? _a22 : configResult
16099      );
16100      set(stateFromStorage, true);
16101      if (migrated) {
16102        return setItem();
16103      }
16104    }).then(() => {
16105      postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);
16106      stateFromStorage = get();
16107      hasHydrated = true;
16108      finishHydrationListeners.forEach((cb2) => cb2(stateFromStorage));
16109    }).catch((e) => {
16110      postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);
16111    });
16112  };
16113  api.persist = {
16114    setOptions: (newOptions) => {
16115      options = {
16116        ...options,
16117        ...newOptions
16118      };
16119      if (newOptions.storage) {
16120        storage = newOptions.storage;
16121      }
16122    },
16123    clearStorage: () => {
16124      storage == null ? void 0 : storage.removeItem(options.name);
16125    },
16126    getOptions: () => options,
16127    rehydrate: () => hydrate2(),
16128    hasHydrated: () => hasHydrated,
16129    onHydrate: (cb2) => {
16130      hydrationListeners.add(cb2);
16131      return () => {
16132        hydrationListeners.delete(cb2);
16133      };
16134    },
16135    onFinishHydration: (cb2) => {
16136      finishHydrationListeners.add(cb2);
16137      return () => {
16138        finishHydrationListeners.delete(cb2);
16139      };
16140    }
16141  };
16142  if (!options.skipHydration) {
16143    hydrate2();
16144  }
16145  return stateFromStorage || configResult;
16146};
16147const persistImpl = (config, baseOptions) => {
16148  if ("getStorage" in baseOptions || "serialize" in baseOptions || "deserialize" in baseOptions) {
16149    if ((__vite_import_meta_env__ ? "production" : void 0) !== "production") {
16150      console.warn(
16151        "[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead."
16152      );
16153    }
16154    return oldImpl(config, baseOptions);
16155  }
16156  return newImpl(config, baseOptions);
16157};
16158const persist = persistImpl;
16159const initialState = {
16160  // UI State
16161  selectedLocationId: null,
16162  selectedContact: null,
16163  isLocationModalOpen: false,
16164  isContactModalOpen: false,
16165  // Filters
16166  searchQuery: "",
16167  selectedDepartments: [],
16168  selectedLanguages: [],
16169  selectedStates: [],
16170  selectedServices: [],
16171  // View preferences
16172  mapView: "list",
16173  contactLayout: "grid",
16174  activeTab: "locations",
16175  // Loading states
16176  isLoading: false,
16177  error: null
16178};
16179const isLocalStorageAvailable$1 = () => {
16180  try {
16181    const test = "__localStorage_test__";
16182    window.localStorage.setItem(test, test);
16183    window.localStorage.removeItem(test);
16184    return true;
16185  } catch {
16186    return false;
16187  }
16188};
16189const createStore = () => {
16190  const storeConfig = subscribeWithSelector((set, get) => ({
16191    // Initial state
16192    ...initialState,
16193    // Location actions
16194    setSelectedLocation: (locationId) => {
16195      set({ selectedLocationId: locationId });
16196    },
16197    openLocationModal: (locationId) => {
16198      set({
16199        selectedLocationId: locationId,
16200        isLocationModalOpen: true
16201      });
16202    },
16203    closeLocationModal: () => {
16204      set({
16205        isLocationModalOpen: false
16206      });
16207    },
16208    // Contact actions
16209    setSelectedContact: (contact) => {
16210      set({ selectedContact: contact });
16211    },
16212    openContactModal: (contact) => {
16213      set({
16214        selectedContact: contact,
16215        isContactModalOpen: true
16216      });
16217    },
16218    closeContactModal: () => {
16219      set({
16220        isContactModalOpen: false,
16221        selectedContact: null
16222      });
16223    },
16224    // Filter actions
16225    setSearchQuery: (query) => {
16226      set({ searchQuery: query });
16227    },
16228    setSelectedDepartments: (departments) => {
16229      set({ selectedDepartments: departments });
16230    },
16231    setSelectedLanguages: (languages) => {
16232      set({ selectedLanguages: languages });
16233    },
16234    setSelectedStates: (states) => {
16235      set({ selectedStates: states });
16236    },
16237    setSelectedServices: (services) => {
16238      set({ selectedServices: services });
16239    },
16240    // View actions
16241    setMapView: (view) => {
16242      set({ mapView: view });
16243    },
16244    setContactLayout: (layout) => {
16245      set({ contactLayout: layout });
16246    },
16247    setActiveTab: (tab) => {
16248      set({ activeTab: tab });
16249    },
16250    // Loading actions
16251    setLoading: (loading) => {
16252      set({ isLoading: loading });
16253    },
16254    setError: (error) => {
16255      set({ error });
16256    }
16257  }));
16258  try {
16259    if (isLocalStorageAvailable$1()) {
16260      return devtools(
16261        persist(storeConfig, {
16262          name: "mec-portfolio-store",
16263          // Only serialize specific parts of the state
16264          partialize: (state) => ({
16265            mapView: state.mapView,
16266            contactLayout: state.contactLayout,
16267            selectedDepartments: state.selectedDepartments,
16268            selectedLanguages: state.selectedLanguages,
16269            selectedStates: state.selectedStates,
16270            selectedServices: state.selectedServices
16271          })
16272        }),
16273        { name: "mec-portfolio-store" }
16274      );
16275    } else {
16276      console.log("⚠️ localStorage not available - running without persistence (iframe mode)");
16277      return devtools(storeConfig, { name: "mec-portfolio-store-no-persist" });
16278    }
16279  } catch (error) {
16280    console.error("⚠️ Store creation failed, using basic store:", error);
16281    return storeConfig;
16282  }
16283};
16284let store;
16285try {
16286  store = createStore();
16287} catch (error) {
16288  console.error("⚠️ Store creation failed, using basic store:", error);
16289  store = subscribeWithSelector((set, get) => ({
16290    ...initialState,
16291    setSelectedLocation: (locationId) => set({ selectedLocationId: locationId }),
16292    setSelectedContact: (contactId) => set({ selectedContactId: contactId }),
16293    setMapView: (view) => set({ mapView: view }),
16294    setContactLayout: (layout) => set({ contactLayout: layout }),
16295    setSearchQuery: (query) => set({ searchQuery: query }),
16296    setSelectedDepartments: (departments) => set({ selectedDepartments: departments }),
16297    setSelectedLanguages: (languages) => set({ selectedLanguages: languages }),
16298    setSelectedStates: (states) => set({ selectedStates: states }),
16299    setSelectedServices: (services) => set({ selectedServices: services }),
16300    setError: (error2) => set({ error: error2 })
16301  }));
16302}
16303const useAppStore = create()(store);
16304const useLocationModal = () => useAppStore((state) => ({
16305  isOpen: state.isLocationModalOpen,
16306  locationId: state.selectedLocationId,
16307  open: state.openLocationModal,
16308  close: state.closeLocationModal
16309}));
16310const useContactModal = () => useAppStore((state) => ({
16311  isOpen: state.isContactModalOpen,
16312  contact: state.selectedContact,
16313  open: state.openContactModal,
16314  close: state.closeContactModal
16315}));
16316const useFilters = () => useAppStore((state) => ({
16317  searchQuery: state.searchQuery,
16318  selectedDepartments: state.selectedDepartments,
16319  selectedLanguages: state.selectedLanguages,
16320  selectedStates: state.selectedStates,
16321  selectedServices: state.selectedServices,
16322  setSearchQuery: state.setSearchQuery,
16323  setSelectedDepartments: state.setSelectedDepartments,
16324  setSelectedLanguages: state.setSelectedLanguages,
16325  setSelectedStates: state.setSelectedStates,
16326  setSelectedServices: state.setSelectedServices
16327}));
16328const useViewPreferences = () => useAppStore((state) => ({
16329  mapView: state.mapView,
16330  contactLayout: state.contactLayout,
16331  activeTab: state.activeTab,
16332  setMapView: state.setMapView,
16333  setContactLayout: state.setContactLayout,
16334  setActiveTab: state.setActiveTab
16335}));
16336if (typeof window !== "undefined") {
16337  let previousLocationId = null;
16338  useAppStore.subscribe((state) => {
16339    const currentLocationId = state.selectedLocationId;
16340    if (currentLocationId !== previousLocationId) {
16341      previousLocationId = currentLocationId;
16342      const url = new URL(window.location.href);
16343      if (currentLocationId) {
16344        url.searchParams.set("location", currentLocationId);
16345      } else {
16346        url.searchParams.delete("location");
16347      }
16348      window.history.replaceState({}, "", url.toString());
16349    }
16350  });
16351  let previousError = null;
16352  useAppStore.subscribe((state) => {
16353    const currentError = state.error;
16354    if (currentError !== previousError) {
16355      previousError = currentError;
16356      if (currentError && true) {
16357        console.error("MEC Portfolio Error:", currentError);
16358      }
16359    }
16360  });
16361}
16362useAppStore.subscribe;
16363const API_BASE_URL = "https://mec-portfolio-backend.onrender.com";
16364const API_VERSION = "v1";
16365const API_URL = `${API_BASE_URL}/api/${API_VERSION}`;
16366const REQUEST_TIMEOUT = 1e4;
16367class ApiClient {
16368  constructor(baseURL, timeout = REQUEST_TIMEOUT) {
16369    __publicField(this, "baseURL");
16370    __publicField(this, "timeout");
16371    this.baseURL = baseURL;
16372    this.timeout = timeout;
16373  }
16374  async request(endpoint, options = {}) {
16375    const url = `${this.baseURL}
16375${endpoint}`;
16376    const controller = new AbortController();
16377    const timeoutId = setTimeout(() => controller.abort(), this.timeout);
16378    try {
16379      const response = await fetch(url, {
16380        ...options,
16381        signal: controller.signal,
16382        headers: {
16383          "Content-Type": "application/json",
16384          ...options.headers
16385        }
16386      });
16387      clearTimeout(timeoutId);
16388      if (!response.ok) {
16389        const errorData = await response.json().catch(() => ({}));
16390        throw new ApiError(
16391          errorData.message || `HTTP ${response.status}: ${response.statusText}`,
16392          response.status,
16393          errorData
16394        );
16395      }
16396      return await response.json();
16397    } catch (error) {
16398      clearTimeout(timeoutId);
16399      if (error instanceof ApiError) {
16400        throw error;
16401      }
16402      if (error instanceof Error) {
16403        if (error.name === "AbortError") {
16404          throw new ApiError("Request timeout", 408);
16405        }
16406        throw new ApiError(error.message, 0);
16407      }
16408      throw new ApiError("Unknown error occurred", 0);
16409    }
16410  }
16411  async get(endpoint) {
16412    return this.request(endpoint, { method: "GET" });
16413  }
16414  async post(endpoint, data) {
16415    return this.request(endpoint, {
16416      method: "POST",
16417      body: data ? JSON.stringify(data) : void 0
16418    });
16419  }
16420  async put(endpoint, data) {
16421    return this.request(endpoint, {
16422      method: "PUT",
16423      body: data ? JSON.stringify(data) : void 0
16424    });
16425  }
16426  async delete(endpoint) {
16427    return this.request(endpoint, { method: "DELETE" });
16428  }
16429}
16430class ApiError extends Error {
16431  constructor(message, status = 0, data) {
16432    super(message);
16433    __publicField(this, "status");
16434    __publicField(this, "data");
16435    this.name = "ApiError";
16436    this.status = status;
16437    this.data = data;
16438  }
16439}
16440const apiClient = new ApiClient(API_URL);
16441const locationsApi = {
16442  // Get all locations
16443  getAll: () => apiClient.get("/locations?limit=100"),
16444  // Get location by ID
16445  getById: (id2) => apiClient.get(`/locations/${id2}`),
16446  // Search locations
16447  search: (query) => apiClient.get(`/locations/search?q=${encodeURIComponent(query)}`),
16448  // Get services for filtering
16449  getServices: () => apiClient.get("/locations/services"),
16450  // Get states/regions for filtering
16451  getStates: () => apiClient.get("/locations/states"),
16452  // Get opening years for filtering
16453  getOpeningYears: () => apiClient.get("/locations/opening-years")
16454};
16455const contactsApi = {
16456  // Get all contacts
16457  getAll: (params) => {
16458    const searchParams = new URLSearchParams();
16459    if (params?.page) searchParams.set("page", params.page.toString());
16460    if (params?.limit) searchParams.set("limit", params.limit.toString());
16461    if (params?.locationId) searchParams.set("locationId", params.locationId);
16462    if (params?.department) searchParams.set("department", params.department);
16463    if (params?.search) searchParams.set("search", params.search);
16464    const queryString = searchParams.toString();
16465    return apiClient.get(`/contacts${queryString ? `?${queryString}` : ""}`);
16466  },
16467  // Get contact by ID
16468  getById: (id2) => apiClient.get(`/contacts/${id2}`),
16469  // Get all locations for a contact
16470  getContactLocations: (contactId) => apiClient.get(`/contacts/${contactId}/locations`),
16471  // Get contacts by location
16472  getByLocation: (locationId) => apiClient.get(`/contacts/location/${locationId}`),
16473  // Search contacts
16474  search: (query, locationId) => {
16475    const params = new URLSearchParams({ q: query });
16476    if (locationId) params.set("locationId", locationId);
16477    return apiClient.get(`/contacts/search?${params.toString()}`);
16478  },
16479  // Get departments
16480  getDepartments: () => apiClient.get("/contacts/departments"),
16481  // Get languages
16482  getLanguages: () => apiClient.get("/contacts/languages"),
16483  // Get positions
16484  getPositions: () => apiClient.get("/contacts/positions"),
16485  // Get availability types
16486  getAvailabilityTypes: () => apiClient.get("/contacts/availability-types")
16487};
16488const isApiError = (error) => {
16489  return error instanceof ApiError;
16490};
16491const getErrorMessage = (error) => {
16492  if (isApiError(error)) {
16493    return error.message;
16494  }
16495  if (error instanceof Error) {
16496    return error.message;
16497  }
16498  return "An unknown error occurred";
16499};
16500const locationKeys = {
16501  all: ["locations"],
16502  lists: () => [...locationKeys.all, "list"],
16503  list: (filters) => [...locationKeys.lists(), filters],
16504  details: () => [...locationKeys.all, "detail"],
16505  detail: (id2) => [...locationKeys.details(), id2],
16506  search: (query) => [...locationKeys.all, "search", query]
16507};
16508const useLocations = (options) => {
16509  const { setError } = useAppStore();
16510  return useQuery({
16511    queryKey: locationKeys.lists(),
16512    queryFn: async () => {
16513      try {
16514        const response = await locationsApi.getAll();
16515        return response.data;
16516      } catch (error) {
16517        const errorMessage = getErrorMessage(error);
16518        setError(errorMessage);
16519        throw error;
16520      }
16521    },
16522    staleTime: 10 * 60 * 1e3,
16523    // 10 minutes
16524    gcTime: 30 * 60 * 1e3,
16525    // 30 minutes
16526    retry: (failureCount, error) => {
16527      if (isApiError(error) && error.status >= 400 && error.status < 500) {
16528        return false;
16529      }
16530      return failureCount < 3;
16531    },
16532    ...options
16533  });
16534};
16535const useLocation = (id2, options) => {
16536  const { setError } = useAppStore();
16537  return useQuery({
16538    queryKey: locationKeys.detail(id2 || ""),
16539    queryFn: async () => {
16540      if (!id2) throw new Error("Location ID is required");
16541      try {
16542        const response = await locationsApi.getById(id2);
16543        return response.data;
16544      } catch (error) {
16545        const errorMessage = getErrorMessage(error);
16546        setError(errorMessage);
16547        throw error;
16548      }
16549    },
16550    enabled: !!id2,
16551    staleTime: 15 * 60 * 1e3,
16552    // 15 minutes
16553    gcTime: 30 * 60 * 1e3,
16554    // 30 minutes
16555    ...options
16556  });
16557};
16558const contactKeys = {
16559  all: ["contacts"],
16560  lists: () => [...contactKeys.all, "list"],
16561  list: (filters) => [...contactKeys.lists(), filters],
16562  details: () => [...contactKeys.all, "detail"],
16563  detail: (id2) => [...contactKeys.details(), id2],
16564  byLocation: (locationId) => [...contactKeys.all, "location", locationId],
16565  contactLocations: (contactId) => [...contactKeys.all, "contact-locations", contactId],
16566  search: (query, locationId) => [...contactKeys.all, "search", query, locationId]
16567};
16568const useContacts = (params, options) => {
16569  const { setError } = useAppStore();
16570  return useQuery({
16571    queryKey: contactKeys.list(params || {}),
16572    queryFn: async () => {
16573      try {
16574        const response = await contactsApi.getAll(params);
16575        if (response.data && Array.isArray(response.data)) {
16576          response.data = response.data.map((contact) => ({
16577            ...contact,
16578            fullName: contact.fullname || `${contact.firstname || contact.firstName || ""} ${contact.lastname || contact.lastName || ""}`.trim() || contact.fullName,
16579            firstName: contact.firstname || contact.firstName,
16580            lastName: contact.lastname || contact.lastName,
16581            locationId: contact.locationid || contact.locationId,
16582            createdAt: contact.createdat || contact.createdAt,
16583            updatedAt: contact.updatedat || contact.updatedAt,
16584            isActive: contact.is_active !== false,
16585            socialLinks: contact.socialLinks || []
16586          }));
16587        }
16588        return response;
16589      } catch (error) {
16590        const errorMessage = getErrorMessage(error);
16591        setError(errorMessage);
16592        throw error;
16593      }
16594    },
16595    staleTime: 5 * 60 * 1e3,
16596    // 5 minutes
16597    gcTime: 15 * 60 * 1e3,
16598    // 15 minutes
16599    retry: (failureCount, error) => {
16600      if (isApiError(error) && error.status >= 400 && error.status < 500) {
16601        return false;
16602      }
16603      return failureCount < 3;
16604    },
16605    ...options
16606  });
16607};
16608const useContactLocations = (contactId, options) => {
16609  const { setError } = useAppStore();
16610  return useQuery({
16611    queryKey: contactKeys.contactLocations(contactId || ""),
16612    queryFn: async () => {
16613      if (!contactId) return [];
16614      try {
16615        const response = await contactsApi.getContactLocations(contactId);
16616        return response.data || [];
16617      } catch (error) {
16618        const errorMessage = getErrorMessage(error);
16619        setError(errorMessage);
16620        console.error("Error fetching contact locations:", error);
16621        return [];
16622      }
16623    },
16624    enabled: !!contactId,
16625    staleTime: 10 * 60 * 1e3,
16626    // 10 minutes
16627    gcTime: 30 * 60 * 1e3,
16628    // 30 minutes
16629    ...options
16630  });
16631};
16632const useContactsByLocation = (locationId, options) => {
16633  const { setError } = useAppStore();
16634  const normalizedLocationId = locationId ? locationId.startsWith("wp-") ? locationId : `wp-${locationId}` : null;
16635  return useQuery({
16636    queryKey: contactKeys.byLocation(normalizedLocationId || ""),
16637    queryFn: async () => {
16638      if (!normalizedLocationId) return [];
16639      try {
16640        const response = await contactsApi.getByLocation(normalizedLocationId);
16641        if (Array.isArray(response.data)) {
16642          const normalizedContacts = response.data.map((contact) => ({
16643            ...contact,
16644            fullName: contact.fullname || `${contact.firstname || contact.firstName || ""} ${contact.lastname || contact.lastName || ""}`.trim() || contact.fullName,
16645            firstName: contact.firstname || contact.firstName,
16646            lastName: contact.lastname || contact.lastName,
16647            locationId: contact.locationid || contact.locationId,
16648            createdAt: contact.createdat || contact.createdAt,
16649            updatedAt: contact.updatedat || contact.updatedAt,
16650            isActive: contact.is_active !== false,
16651            // Default to true
16652            socialLinks: contact.socialLinks || [],
16653            // Already transformed by backend
16654            // Location information from backend joins
16655            locationName: contact.locationname || contact.locationName,
16656            locationCity: contact.locationcity || contact.locationCity,
16657            locationAddress: contact.locationaddress || contact.locationAddress
16658          }));
16659          return normalizedContacts;
16660        } else if (response.data && typeof response.data === "object" && "locationContacts" in response.data) {
16661          const apiData = response.data;
16662          const allContacts = [
16663            ...apiData.locationContacts || [],
16664            ...apiData.managementContacts || []
16665          ];
16666          return allContacts.map((contact) => ({
16667            ...contact,
16668            fullName: contact.fullname || contact.fullName || `${contact.firstname || contact.firstName || ""} ${contact.lastname || contact.lastName || ""}`.trim(),
16669            firstName: contact.firstname || contact.firstName,
16670            lastName: contact.lastname || contact.lastName,
16671            locationId: contact.locationid || contact.locationId,
16672            createdAt: contact.createdat || contact.createdAt,
16673            updatedAt: contact.updatedat || contact.updatedAt,
16674            isActive: contact.is_active !== false,
16675            // Default to true
16676            socialLinks: contact.socialLinks || [],
16677            // Already transformed by backend
16678            // Location information from backend joins
16679            locationName: contact.locationname || contact.locationName,
16680            locationCity: contact.locationcity || contact.locationCity,
16681            locationAddress: contact.locationaddress || contact.locationAddress
16682          }));
16683        } else if (response.data && response.data.data && Array.isArray(response.data.data)) {
16684          return response.data.data.map((contact) => ({
16685            ...contact,
16686            fullName: contact.fullname || contact.fullName || `${contact.firstname || contact.firstName || ""} ${contact.lastname || contact.lastName || ""}`.trim(),
16687            firstName: contact.firstname || contact.firstName,
16688            lastName: contact.lastname || contact.lastName,
16689            locationId: contact.locationid || contact.locationId,
16690            createdAt: contact.createdat || contact.createdAt,
16691            updatedAt: contact.updatedat || contact.updatedAt,
16692            isActive: contact.is_active !== false,
16693            socialLinks: contact.socialLinks || [],
16694            // Location information from backend joins
16695            locationName: contact.locationname || contact.locationName,
16696            locationCity: contact.locationcity || contact.locationCity,
16697            locationAddress: contact.locationaddress || contact.locationAddress
16698          }));
16699        } else if (response.data && response.data.pagination && response.data.pagination.total === 0) {
16700          return [];
16701        } else {
16702          return response.data || [];
16703        }
16704      } catch (error) {
16705        const errorMessage = getErrorMessage(error);
16706        setError(errorMessage);
16707        throw error;
16708      }
16709    },
16710    enabled: !!locationId,
16711    staleTime: 5 * 60 * 1e3,
16712    // 5 minutes
16713    gcTime: 15 * 60 * 1e3,
16714    // 15 minutes
16715    ...options
16716  });
16717};
16718const useFilteredContacts = (locationId) => {
16719  const { searchQuery, selectedDepartments, selectedLanguages } = useAppStore();
16720  const normalizedLocationId = locationId ? locationId.startsWith("wp-") ? locationId : `wp-${locationId}` : void 0;
16721  const contactsByLocationQuery = useContactsByLocation(normalizedLocationId || null);
16722  const params = {
16723    locationId: normalizedLocationId,
16724    search: searchQuery || void 0,
16725    department: selectedDepartments.length > 0 ? selectedDepartments[0] : void 0,
16726    // Simplified for now
16727    limit: 1e3
16728    // High limit to get all contacts (no pagination)
16729  };
16730  const contactsQuery = useContacts(params);
16731  const activeQuery = normalizedLocationId ? contactsByLocationQuery : contactsQuery;
16732  const rawContacts = normalizedLocationId ? activeQuery.data || [] : contactsQuery.data?.data || [];
16733  const normalizedContacts = rawContacts.map((contact) => ({
16734    ...contact,
16735    // Normalize fullName field like in useContactsByLocation
16736    fullName: contact.fullname || `${contact.firstname || contact.firstName || ""} ${contact.lastname || contact.lastName || ""}`.trim() || contact.fullName,
16737    firstName: contact.firstname || contact.firstName,
16738    lastName: contact.lastname || contact.lastName,
16739    locationId: contact.locationid || contact.locationId,
16740    createdAt: contact.createdat || contact.createdAt,
16741    updatedAt: contact.updatedat || contact.updatedAt,
16742    isActive: contact.is_active !== false,
16743    socialLinks: contact.socialLinks || []
16744  }));
16745  const deduplicatedContacts = (() => {
16746    const seenWpIds = /* @__PURE__ */ new Set();
16747    return normalizedContacts.filter((contact) => {
16748      let wpId = contact.wp_id;
16749      if (!wpId && contact.id.startsWith("wp-")) {
16750        const idParts = contact.id.split("-");
16751        if (idParts.length >= 2) {
16752          wpId = parseInt(idParts[1]);
16753        }
16754      }
16755      console.log("🔍 DEBUG: Deduplication - contact:", contact.id, "wp_id:", wpId, "fullName:", contact.fullName);
16756      if (!wpId) {
16757        console.log("🔍 DEBUG: Keeping contact without wp_id:", contact.id);
16758        return true;
16759      }
16760      if (seenWpIds.has(wpId)) {
16761        console.log("🔍 DEBUG: Skipping duplicate wp_id:", wpId, "for contact:", contact.id);
16762        return false;
16763      }
16764      seenWpIds.add(wpId);
16765      console.log("🔍 DEBUG: Keeping first occurrence of wp_id:", wpId, "for contact:", contact.id);
16766      return true;
16767    });
16768  })();
16769  const filteredContacts = deduplicatedContacts.filter((contact) => {
16770    if (selectedLanguages.length === 0) return true;
16771    return contact.languages?.some((lang) => selectedLanguages.includes(lang));
16772  });
16773  const locationSpecificContacts = normalizedLocationId ? filteredContacts.filter((contact) => {
16774    const contactLocationId = contact.locationid || contact.locationId;
16775    return contactLocationId === normalizedLocationId;
16776  }) : [];
16777  console.log("🔍 DEBUG: useFilteredContacts - Raw API data:", rawContacts);
16778  console.log("🔍 DEBUG: useFilteredContacts - First raw contact:", rawContacts?.[0]);
16779  console.log("🔍 DEBUG: useFilteredContacts - Normalized contacts:", normalizedContacts?.length || 0);
16780  console.log("🔍 DEBUG: useFilteredContacts - First normalized contact:", normalizedContacts?.[0]);
16781  console.log("🔍 DEBUG: useFilteredContacts - Deduplicated contacts:", deduplicatedContacts?.length || 0);
16782  console.log("🔍 DEBUG: useFilteredContacts - Final filtered contacts:", filteredContacts?.length || 0);
16783  console.log("🔍 DEBUG: useFilteredContacts - Location-specific contacts:", locationSpecificContacts?.length || 0);
16784  console.log("🔍 DEBUG: useFilteredContacts - original locationId:", locationId);
16785  console.log("🔍 DEBUG: useFilteredContacts - normalized locationId:", normalizedLocationId);
16786  console.log("🔍 DEBUG: useFilteredContacts - searchQuery:", searchQuery);
16787  console.log("🔍 DEBUG: useFilteredContacts - selectedLanguages:", selectedLanguages);
16788  return {
16789    contacts: filteredContacts,
16790    locationSpecificContacts,
16791    // NEW: Only location-specific contacts
16792    locationSpecificCount: locationSpecificContacts.length,
16793    // NEW: Count of location-specific contacts only
16794    pagination: normalizedLocationId ? void 0 : contactsQuery.data?.pagination,
16795    isLoading: activeQuery.isLoading,
16796    error: activeQuery.error,
16797    refetch: activeQuery.refetch
16798  };
16799};
16800function r(e) {
16801  var t2, f2, n2 = "";
16802  if ("string" == typeof e || "number" == typeof e) n2 += e;
16803  else if ("object" == typeof e) if (Array.isArray(e)) {
16804    var o = e.length;
16805    for (t2 = 0; t2 < o; t2++) e[t2] && (f2 = r(e[t2])) && (n2 && (n2 += " "), n2 += f2);
16806  } else for (f2 in e) e[f2] && (n2 && (n2 += " "), n2 += f2);
16807  return n2;
16808}
16809function clsx() {
16810  for (var e, t2, f2 = 0, n2 = "", o = arguments.length; f2 < o; f2++) (e = arguments[f2]) && (t2 = r(e)) && (n2 && (n2 += " "), n2 += t2);
16811  return n2;
16812}
16813const sizeClasses = {
16814  sm: "w-4 h-4 border-2",
16815  md: "w-6 h-6 border-2",
16816  lg: "w-8 h-8 border-3",
16817  xl: "w-12 h-12 border-4"
16818};
16819const colorClasses = {
16820  primary: "border-mec-primary/20 border-t-mec-primary",
16821  secondary: "border-text-muted/20 border-t-text-muted",
16822  white: "border-white/20 border-t-white"
16823};
16824const LoadingSpinner = ({
16825  size = "md",
16826  color = "primary",
16827  className,
16828  label = "Lädt..."
16829}) => {
16830  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
16831    "div",
16832    {
16833      className: clsx("inline-flex items-center gap-2", className),
16834      role: "status",
16835      "aria-label": label,
16836      children: [
16837        /* @__PURE__ */ jsxRuntimeExports.jsx(
16838          "div",
16839          {
16840            className: clsx(
16841              "animate-spin rounded-full",
16842              sizeClasses[size],
16843              colorClasses[color]
16844            ),
16845            "aria-hidden": "true"
16846          }
16847        ),
16848        label && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sr-only", children: label })
16849      ]
16850    }
16851  );
16852};
16853const Skeleton = ({
16854  className,
16855  variant = "text",
16856  width,
16857  height,
16858  lines = 1
16859}) => {
16860  const baseClasses = "loading-skeleton";
16861  const variantClasses = {
16862    text: "h-4 rounded",
16863    rectangular: "rounded-mec",
16864    circular: "rounded-full"
16865  };
16866  const style = {};
16867  if (width) style.width = typeof width === "number" ? `${width}px` : width;
16868  if (height) style.height = typeof height === "number" ? `${height}px` : height;
16869  if (variant === "text" && lines > 1) {
16870    return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx("space-y-2", className), children: Array.from({ length: lines }).map((_, index) => /* @__PURE__ */ jsxRuntimeExports.jsx(
16871      "div",
16872      {
16873        className: clsx(baseClasses, variantClasses[variant]),
16874        style: {
16875          ...style,
16876          width: index === lines - 1 ? "75%" : "100%"
16877        }
16878      },
16879      index
16880    )) });
16881  }
16882  return /* @__PURE__ */ jsxRuntimeExports.jsx(
16883    "div",
16884    {
16885      className: clsx(baseClasses, variantClasses[variant], className),
16886      style
16887    }
16888  );
16889};
16890const LoadingCard = ({
16891  className,
16892  showImage = true,
16893  showTitle = true,
16894  showDescription = true,
16895  lines = 2
16896}) => {
16897  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("card p-4 space-y-3", className), children: [
16898    showImage && /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { variant: "rectangular", height: 120 }),
16899    showTitle && /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { variant: "text", width: "75%" }),
16900    showDescription && /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { variant: "text", lines })
16901  ] });
16902};
16903const LoadingList = ({
16904  items = 3,
16905  className
16906}) => {
16907  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx("space-y-3", className), children: Array.from({ length: items }).map((_, index) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-3 p-3 border border-background-tertiary rounded-mec", children: [
16908    /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { variant: "circular", width: 40, height: 40 }),
16909    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 space-y-2", children: [
16910      /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { variant: "text", width: "60%" }),
16911      /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { variant: "text", width: "40%" })
16912    ] })
16913  ] }, index)) });
16914};
16915/**
16916 * @license lucide-react v0.294.0 - ISC
16917 *
16918 * This source code is licensed under the ISC license.
16919 * See the LICENSE file in the root directory of this source tree.
16920 */
16921var defaultAttributes = {
16922  xmlns: "http://www.w3.org/2000/svg",
16923  width: 24,
16924  height: 24,
16925  viewBox: "0 0 24 24",
16926  fill: "none",
16927  stroke: "currentColor",
16928  strokeWidth: 2,
16929  strokeLinecap: "round",
16930  strokeLinejoin: "round"
16931};
16932/**
16933 * @license lucide-react v0.294.0 - ISC
16934 *
16935 * This source code is licensed under the ISC license.
16936 * See the LICENSE file in the root directory of this source tree.
16937 */
16938const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase().trim();
16939const createLucideIcon = (iconName, iconNode) => {
16940  const Component = reactExports.forwardRef(
16941    ({ color = "currentColor", size = 24, strokeWidth = 2, absoluteStrokeWidth, className = "", children, ...rest }, ref) => reactExports.createElement(
16942      "svg",
16943      {
16944        ref,
16945        ...defaultAttributes,
16946        width: size,
16947        height: size,
16948        stroke: color,
16949        strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,
16950        className: ["lucide", `lucide-${toKebabCase(iconName)}`, className].join(" "),
16951        ...rest
16952      },
16953      [
16954        ...iconNode.map(([tag, attrs]) => reactExports.createElement(tag, attrs)),
16955        ...Array.isArray(children) ? children : [children]
16956      ]
16957    )
16958  );
16959  Component.displayName = `${iconName}`;
16960  return Component;
16961};
16962/**
16963 * @license lucide-react v0.294.0 - ISC
16964 *
16965 * This source code is licensed under the ISC license.
16966 * See the LICENSE file in the root directory of this source tree.
16967 */
16968const AlertCircle = createLucideIcon("AlertCircle", [
16969  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
16970  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
16971  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
16972]);
16973/**
16974 * @license lucide-react v0.294.0 - ISC
16975 *
16976 * This source code is licensed under the ISC license.
16977 * See the LICENSE file in the root directory of this source tree.
16978 */
16979const AlertTriangle = createLucideIcon("AlertTriangle", [
16980  [
16981    "path",
16982    {
16983      d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z",
16984      key: "c3ski4"
16985    }
16986  ],
16987  ["path", { d: "M12 9v4", key: "juzpu7" }],
16988  ["path", { d: "M12 17h.01", key: "p32p05" }]
16989]);
16990/**
16991 * @license lucide-react v0.294.0 - ISC
16992 *
16993 * This source code is licensed under the ISC license.
16994 * See the LICENSE file in the root directory of this source tree.
16995 */
16996const ArrowRight = createLucideIcon("ArrowRight", [
16997  ["path", { d: "M5 12h14", key: "1ays0h" }],
16998  ["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
16999]);
17000/**
17001 * @license lucide-react v0.294.0 - ISC
17002 *
17003 * This source code is licensed under the ISC license.
17004 * See the LICENSE file in the root directory of this source tree.
17005 */
17006const Building2 = createLucideIcon("Building2", [
17007  ["path", { d: "M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z", key: "1b4qmf" }],
17008  ["path", { d: "M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2", key: "i71pzd" }],
17009  ["path", { d: "M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2", key: "10jefs" }],
17010  ["path", { d: "M10 6h4", key: "1itunk" }],
17011  ["path", { d: "M10 10h4", key: "tcdvrf" }],
17012  ["path", { d: "M10 14h4", key: "kelpxr" }],
17013  ["path", { d: "M10 18h4", key: "1ulq68" }]
17014]);
17015/**
17016 * @license lucide-react v0.294.0 - ISC
17017 *
17018 * This source code is licensed under the ISC license.
17019 * See the LICENSE file in the root directory of this source tree.
17020 */
17021const CheckCircle = createLucideIcon("CheckCircle", [
17022  ["path", { d: "M22 11.08V12a10 10 0 1 1-5.93-9.14", key: "g774vq" }],
17023  ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
17024]);
17025/**
17026 * @license lucide-react v0.294.0 - ISC
17027 *
17028 * This source code is licensed under the ISC license.
17029 * See the LICENSE file in the root directory of this source tree.
17030 */
17031const ChevronDown = createLucideIcon("ChevronDown", [
17032  ["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]
17033]);
17034/**
17035 * @license lucide-react v0.294.0 - ISC
17036 *
17037 * This source code is licensed under the ISC license.
17038 * See the LICENSE file in the root directory of this source tree.
17039 */
17040const ChevronLeft = createLucideIcon("ChevronLeft", [
17041  ["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]
17042]);
17043/**
17044 * @license lucide-react v0.294.0 - ISC
17045 *
17046 * This source code is licensed under the ISC license.
17047 * See the LICENSE file in the root directory of this source tree.
17048 */
17049const ChevronRight = createLucideIcon("ChevronRight", [
17050  ["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]
17051]);
17052/**
17053 * @license lucide-react v0.294.0 - ISC
17054 *
17055 * This source code is licensed under the ISC license.
17056 * See the LICENSE file in the root directory of this source tree.
17057 */
17058const ChevronUp = createLucideIcon("ChevronUp", [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]]);
17059/**
17060 * @license lucide-react v0.294.0 - ISC
17061 *
17062 * This source code is licensed under the ISC license.
17063 * See the LICENSE file in the root directory of this source tree.
17064 */
17065const Clock = createLucideIcon("Clock", [
17066  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
17067  ["polyline", { points: "12 6 12 12 16 14", key: "68esgv" }]
17068]);
17069/**
17070 * @license lucide-react v0.294.0 - ISC
17071 *
17072 * This source code is licensed under the ISC license.
17073 * See the LICENSE file in the root directory of this source tree.
17074 */
17075const Crosshair = createLucideIcon("Crosshair", [
17076  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
17077  ["line", { x1: "22", x2: "18", y1: "12", y2: "12", key: "l9bcsi" }],
17078  ["line", { x1: "6", x2: "2", y1: "12", y2: "12", key: "13hhkx" }],
17079  ["line", { x1: "12", x2: "12", y1: "6", y2: "2", key: "10w3f3" }],
17080  ["line", { x1: "12", x2: "12", y1: "22", y2: "18", key: "15g9kq" }]
17081]);
17082/**
17083 * @license lucide-react v0.294.0 - ISC
17084 *
17085 * This source code is licensed under the ISC license.
17086 * See the LICENSE file in the root directory of this source tree.
17087 */
17088const Database = createLucideIcon("Database", [
17089  ["ellipse", { cx: "12", cy: "5", rx: "9", ry: "3", key: "msslwz" }],
17090  ["path", { d: "M3 5V19A9 3 0 0 0 21 19V5", key: "1wlel7" }],
17091  ["path", { d: "M3 12A9 3 0 0 0 21 12", key: "mv7ke4" }]
17092]);
17093/**
17094 * @license lucide-react v0.294.0 - ISC
17095 *
17096 * This source code is licensed under the ISC license.
17097 * See the LICENSE file in the root directory of this source tree.
17098 */
17099const ExternalLink = createLucideIcon("ExternalLink", [
17100  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }],
17101  ["polyline", { points: "15 3 21 3 21 9", key: "mznyad" }],
17102  ["line", { x1: "10", x2: "21", y1: "14", y2: "3", key: "18c3s4" }]
17103]);
17104/**
17105 * @license lucide-react v0.294.0 - ISC
17106 *
17107 * This source code is licensed under the ISC license.
17108 * See the LICENSE file in the root directory of this source tree.
17109 */
17110const Globe = createLucideIcon("Globe", [
17111  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
17112  ["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
17113  ["path", { d: "M2 12h20", key: "9i4pu4" }]
17114]);
17115/**
17116 * @license lucide-react v0.294.0 - ISC
17117 *
17118 * This source code is licensed under the ISC license.
17119 * See the LICENSE file in the root directory of this source tree.
17120 */
17121const Grid3x3 = createLucideIcon("Grid3x3", [
17122  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
17123  ["path", { d: "M3 9h18", key: "1pudct" }],
17124  ["path", { d: "M3 15h18", key: "5xshup" }],
17125  ["path", { d: "M9 3v18", key: "fh3hqa" }],
17126  ["path", { d: "M15 3v18", key: "14nvp0" }]
17127]);
17128/**
17129 * @license lucide-react v0.294.0 - ISC
17130 *
17131 * This source code is licensed under the ISC license.
17132 * See the LICENSE file in the root directory of this source tree.
17133 */
17134const Home = createLucideIcon("Home", [
17135  ["path", { d: "m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z", key: "y5dka4" }],
17136  ["polyline", { points: "9 22 9 12 15 12 15 22", key: "e2us08" }]
17137]);
17138/**
17139 * @license lucide-react v0.294.0 - ISC
17140 *
17141 * This source code is licensed under the ISC license.
17142 * See the LICENSE file in the root directory of this source tree.
17143 */
17144const Layers = createLucideIcon("Layers", [
17145  [
17146    "path",
17147    {
17148      d: "m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z",
17149      key: "8b97xw"
17150    }
17151  ],
17152  ["path", { d: "m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65", key: "dd6zsq" }],
17153  ["path", { d: "m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65", key: "ep9fru" }]
17154]);
17155/**
17156 * @license lucide-react v0.294.0 - ISC
17157 *
17158 * This source code is licensed under the ISC license.
17159 * See the LICENSE file in the root directory of this source tree.
17160 */
17161const List = createLucideIcon("List", [
17162  ["line", { x1: "8", x2: "21", y1: "6", y2: "6", key: "7ey8pc" }],
17163  ["line", { x1: "8", x2: "21", y1: "12", y2: "12", key: "rjfblc" }],
17164  ["line", { x1: "8", x2: "21", y1: "18", y2: "18", key: "c3b1m8" }],
17165  ["line", { x1: "3", x2: "3.01", y1: "6", y2: "6", key: "1g7gq3" }],
17166  ["line", { x1: "3", x2: "3.01", y1: "12", y2: "12", key: "1pjlvk" }],
17167  ["line", { x1: "3", x2: "3.01", y1: "18", y2: "18", key: "28t2mc" }]
17168]);
17169/**
17170 * @license lucide-react v0.294.0 - ISC
17171 *
17172 * This source code is licensed under the ISC license.
17173 * See the LICENSE file in the root directory of this source tree.
17174 */
17175const Loader2 = createLucideIcon("Loader2", [
17176  ["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]
17177]);
17178/**
17179 * @license lucide-react v0.294.0 - ISC
17180 *
17181 * This source code is licensed under the ISC license.
17182 * See the LICENSE file in the root directory of this source tree.
17183 */
17184const Mail = createLucideIcon("Mail", [
17185  ["rect", { width: "20", height: "16", x: "2", y: "4", rx: "2", key: "18n3k1" }],
17186  ["path", { d: "m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7", key: "1ocrg3" }]
17187]);
17188/**
17189 * @license lucide-react v0.294.0 - ISC
17190 *
17191 * This source code is licensed under the ISC license.
17192 * See the LICENSE file in the root directory of this source tree.
17193 */
17194const MapPin = createLucideIcon("MapPin", [
17195  ["path", { d: "M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z", key: "2oe9fu" }],
17196  ["circle", { cx: "12", cy: "10", r: "3", key: "ilqhr7" }]
17197]);
17198/**
17199 * @license lucide-react v0.294.0 - ISC
17200 *
17201 * This source code is licensed under the ISC license.
17202 * See the LICENSE file in the root directory of this source tree.
17203 */
17204const Map$1 = createLucideIcon("Map", [
17205  ["polygon", { points: "3 6 9 3 15 6 21 3 21 18 15 21 9 18 3 21", key: "ok2ie8" }],
17206  ["line", { x1: "9", x2: "9", y1: "3", y2: "18", key: "w34qz5" }],
17207  ["line", { x1: "15", x2: "15", y1: "6", y2: "21", key: "volv9a" }]
17208]);
17209/**
17210 * @license lucide-react v0.294.0 - ISC
17211 *
17212 * This source code is licensed under the ISC license.
17213 * See the LICENSE file in the root directory of this source tree.
17214 */
17215const Phone = createLucideIcon("Phone", [
17216  [
17217    "path",
17218    {
17219      d: "M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z",
17220      key: "foiqr5"
17221    }
17222  ]
17223]);
17224/**
17225 * @license lucide-react v0.294.0 - ISC
17226 *
17227 * This source code is licensed under the ISC license.
17228 * See the LICENSE file in the root directory of this source tree.
17229 */
17230const RefreshCw = createLucideIcon("RefreshCw", [
17231  ["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }],
17232  ["path", { d: "M21 3v5h-5", key: "1q7to0" }],
17233  ["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
17234  ["path", { d: "M8 16H3v5", key: "1cv678" }]
17235]);
17236/**
17237 * @license lucide-react v0.294.0 - ISC
17238 *
17239 * This source code is licensed under the ISC license.
17240 * See the LICENSE file in the root directory of this source tree.
17241 */
17242const RotateCcw = createLucideIcon("RotateCcw", [
17243  ["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
17244  ["path", { d: "M3 3v5h5", key: "1xhq8a" }]
17245]);
17246/**
17247 * @license lucide-react v0.294.0 - ISC
17248 *
17249 * This source code is licensed under the ISC license.
17250 * See the LICENSE file in the root directory of this source tree.
17251 */
17252const Search = createLucideIcon("Search", [
17253  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }],
17254  ["path", { d: "m21 21-4.3-4.3", key: "1qie3q" }]
17255]);
17256/**
17257 * @license lucide-react v0.294.0 - ISC
17258 *
17259 * This source code is licensed under the ISC license.
17260 * See the LICENSE file in the root directory of this source tree.
17261 */
17262const Settings = createLucideIcon("Settings", [
17263  [
17264    "path",
17265    {
17266      d: "M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",
17267      key: "1qme2f"
17268    }
17269  ],
17270  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
17271]);
17272/**
17273 * @license lucide-react v0.294.0 - ISC
17274 *
17275 * This source code is licensed under the ISC license.
17276 * See the LICENSE file in the root directory of this source tree.
17277 */
17278const ShoppingBag = createLucideIcon("ShoppingBag", [
17279  ["path", { d: "M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4Z", key: "hou9p0" }],
17280  ["path", { d: "M3 6h18", key: "d0wm0j" }],
17281  ["path", { d: "M16 10a4 4 0 0 1-8 0", key: "1ltviw" }]
17282]);
17283/**
17284 * @license lucide-react v0.294.0 - ISC
17285 *
17286 * This source code is licensed under the ISC license.
17287 * See the LICENSE file in the root directory of this source tree.
17288 */
17289const User = createLucideIcon("User", [
17290  ["path", { d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2", key: "975kel" }],
17291  ["circle", { cx: "12", cy: "7", r: "4", key: "17ys0d" }]
17292]);
17293/**
17294 * @license lucide-react v0.294.0 - ISC
17295 *
17296 * This source code is licensed under the ISC license.
17297 * See the LICENSE file in the root directory of this source tree.
17298 */
17299const Users = createLucideIcon("Users", [
17300  ["path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2", key: "1yyitq" }],
17301  ["circle", { cx: "9", cy: "7", r: "4", key: "nufk8" }],
17302  ["path", { d: "M22 21v-2a4 4 0 0 0-3-3.87", key: "kshegd" }],
17303  ["path", { d: "M16 3.13a4 4 0 0 1 0 7.75", key: "1da9ce" }]
17304]);
17305/**
17306 * @license lucide-react v0.294.0 - ISC
17307 *
17308 * This source code is licensed under the ISC license.
17309 * See the LICENSE file in the root directory of this source tree.
17310 */
17311const WifiOff = createLucideIcon("WifiOff", [
17312  ["line", { x1: "2", x2: "22", y1: "2", y2: "22", key: "a6p6uj" }],
17313  ["path", { d: "M8.5 16.5a5 5 0 0 1 7 0", key: "sej527" }],
17314  ["path", { d: "M2 8.82a15 15 0 0 1 4.17-2.65", key: "11utq1" }],
17315  ["path", { d: "M10.66 5c4.01-.36 8.14.9 11.34 3.76", key: "hxefdu" }],
17316  ["path", { d: "M16.85 11.25a10 10 0 0 1 2.22 1.68", key: "q734kn" }],
17317  ["path", { d: "M5 13a10 10 0 0 1 5.24-2.76", key: "piq4yl" }],
17318  ["line", { x1: "12", x2: "12.01", y1: "20", y2: "20", key: "of4bc4" }]
17319]);
17320/**
17321 * @license lucide-react v0.294.0 - ISC
17322 *
17323 * This source code is licensed under the ISC license.
17324 * See the LICENSE file in the root directory of this source tree.
17325 */
17326const Wifi = createLucideIcon("Wifi", [
17327  ["path", { d: "M5 13a10 10 0 0 1 14 0", key: "6v8j51" }],
17328  ["path", { d: "M8.5 16.5a5 5 0 0 1 7 0", key: "sej527" }],
17329  ["path", { d: "M2 8.82a15 15 0 0 1 20 0", key: "dnpr2z" }],
17330  ["line", { x1: "12", x2: "12.01", y1: "20", y2: "20", key: "of4bc4" }]
17331]);
17332/**
17333 * @license lucide-react v0.294.0 - ISC
17334 *
17335 * This source code is licensed under the ISC license.
17336 * See the LICENSE file in the root directory of this source tree.
17337 */
17338const X = createLucideIcon("X", [
17339  ["path", { d: "M18 6 6 18", key: "1bl5f8" }],
17340  ["path", { d: "m6 6 12 12", key: "d8bk6v" }]
17341]);
17342/**
17343 * @license lucide-react v0.294.0 - ISC
17344 *
17345 * This source code is licensed under the ISC license.
17346 * See the LICENSE file in the root directory of this source tree.
17347 */
17348const ZoomIn = createLucideIcon("ZoomIn", [
17349  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }],
17350  ["line", { x1: "21", x2: "16.65", y1: "21", y2: "16.65", key: "13gj7c" }],
17351  ["line", { x1: "11", x2: "11", y1: "8", y2: "14", key: "1vmskp" }],
17352  ["line", { x1: "8", x2: "14", y1: "11", y2: "11", key: "durymu" }]
17353]);
17354/**
17355 * @license lucide-react v0.294.0 - ISC
17356 *
17357 * This source code is licensed under the ISC license.
17358 * See the LICENSE file in the root directory of this source tree.
17359 */
17360const ZoomOut = createLucideIcon("ZoomOut", [
17361  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }],
17362  ["line", { x1: "21", x2: "16.65", y1: "21", y2: "16.65", key: "13gj7c" }],
17363  ["line", { x1: "8", x2: "14", y1: "11", y2: "11", key: "durymu" }]
17364]);
17365let ErrorBoundary$1 = class ErrorBoundary extends reactExports.Component {
17366  constructor(props) {
17367    super(props);
17368    __publicField(this, "handleRetry", () => {
17369      this.setState({ hasError: false, error: void 0, errorInfo: void 0 });
17370    });
17371    this.state = { hasError: false };
17372  }
17373  static getDerivedStateFromError(error) {
17374    return {
17375      hasError: true,
17376      error
17377    };
17378  }
17379  componentDidCatch(error, errorInfo) {
17380    this.setState({
17381      error,
17382      errorInfo
17383    });
17384    console.error("ErrorBoundary caught an error:", error, errorInfo);
17385    this.props.onError?.(error, errorInfo);
17386  }
17387  render() {
17388    if (this.state.hasError) {
17389      if (this.props.fallback) {
17390        return this.props.fallback;
17391      }
17392      return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `p-6 text-center bg-background-secondary rounded-mec border border-background-tertiary ${this.props.className || ""}`, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center space-y-4", children: [
17393        /* @__PURE__ */ jsxRuntimeExports.jsx(AlertTriangle, { className: "w-12 h-12 text-red-500" }),
17394        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
17395          /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Oops! Etwas ist schiefgelaufen" }),
17396          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: "Diese Komponente konnte nicht geladen werden." })
17397        ] }),
17398        this.props.showDetails && this.state.error && /* @__PURE__ */ jsxRuntimeExports.jsxs("details", { className: "w-full max-w-md", children: [
17399          /* @__PURE__ */ jsxRuntimeExports.jsx("summary", { className: "cursor-pointer text-sm text-text-muted hover:text-text-secondary", children: "Technische Details anzeigen" }),
17400          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-2 p-3 bg-red-50 rounded border text-left", children: [
17401            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-mono text-red-800 break-all", children: this.state.error.message }),
17402            this.state.errorInfo?.componentStack && /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "mt-2 text-xs text-red-700 overflow-auto max-h-32", children: this.state.errorInfo.componentStack })
17403          ] })
17404        ] }),
17405        /* @__PURE__ */ jsxRuntimeExports.jsxs(
17406          "button",
17407          {
17408            onClick: this.handleRetry,
17409            className: "btn-primary inline-flex items-center gap-2",
17410            children: [
17411              /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "w-4 h-4" }),
17412              "Erneut versuchen"
17413            ]
17414          }
17415        )
17416      ] }) });
17417    }
17418    return this.props.children;
17419  }
17420};
17421class MapTooltipHandler {
17422  constructor(container, locations, contacts = []) {
17423    __publicField(this, "container");
17424    __publicField(this, "locations");
17425    __publicField(this, "contacts", []);
17426    __publicField(this, "tooltipElement", null);
17427    __publicField(this, "currentLocationId", null);
17428    __publicField(this, "showTimeout", null);
17429    __publicField(this, "hideTimeout", null);
17430    __publicField(this, "isTouch", false);
17431    this.container = container;
17432    this.locations = locations;
17433    this.contacts = contacts;
17434    this.createTooltipElement();
17435    this.bindEvents();
17436  }
17437  createTooltipElement() {
17438    this.tooltipElement = document.createElement("div");
17439    this.tooltipElement.className = `
17440      fixed z-50 px-3 py-2 text-sm text-white bg-gray-900 rounded-lg shadow-lg
17441      pointer-events-none opacity-0 transition-opacity duration-200
17442      max-w-[280px]
17443    `.trim();
17444    document.body.appendChild(this.tooltipElement);
17445  }
17446  bindEvents() {
17447    this.container.addEventListener("touchstart", () => {
17448      this.isTouch = true;
17449    }, { once: true, passive: true });
17450    this.container.addEventListener("mouseover", this.handleMouseOver.bind(this));
17451    this.container.addEventListener("mouseout", this.handleMouseOut.bind(this));
17452    this.container.addEventListener("mousemove", this.handleMouseMove.bind(this));
17453    window.addEventListener("resize", this.hideTooltip.bind(this));
17454  }
17455  handleMouseOver(event) {
17456    if (this.isTouch) return;
17457    const target = event.target;
17458    const locationElement = target.closest("[data-location-id]");
17459    if (locationElement) {
17460      const locationId = locationElement.getAttribute("data-location-id");
17461      if (locationId && locationId !== this.currentLocationId) {
17462        this.currentLocationId = locationId;
17463        this.showTooltip(locationId, event);
17464      }
17465    }
17466  }
17467  handleMouseOut(event) {
17468    if (this.isTouch) return;
17469    const target = event.target;
17470    const locationElement = target.closest("[data-location-id]");
17471    if (!locationElement) {
17472      this.scheduleHideTooltip();
17473    }
17474  }
17475  handleMouseMove(event) {
17476    if (this.isTouch || !this.tooltipElement || !this.currentLocationId) return;
17477    this.updateTooltipPosition(event.clientX, event.clientY);
17478  }
17479  showTooltip(locationId, event) {
17480    if (!this.tooltipElement) return;
17481    if (this.hideTimeout) {
17482      clearTimeout(this.hideTimeout);
17483      this.hideTimeout = null;
17484    }
17485    const location = this.locations.find((loc) => loc.id === locationId);
17486    if (!location) return;
17487    const primaryContact = this.contacts.find(
17488      (contact) => contact.locationId === locationId && contact.isActive
17489    );
17490    const tooltipData = {
17491      locationName: location.name,
17492      contactName: primaryContact?.fullName,
17493      contactRole: primaryContact?.position
17494    };
17495    this.updateTooltipContent(tooltipData);
17496    this.showTimeout = setTimeout(() => {
17497      if (this.tooltipElement) {
17498        this.tooltipElement.style.opacity = "1";
17499        this.updateTooltipPosition(event.clientX, event.clientY);
17500      }
17501    }, 300);
17502  }
17503  scheduleHideTooltip() {
17504    if (this.showTimeout) {
17505      clearTimeout(this.showTimeout);
17506      this.showTimeout = null;
17507    }
17508    this.hideTimeout = setTimeout(() => {
17509      this.hideTooltip();
17510    }, 100);
17511  }
17512  hideTooltip() {
17513    if (this.tooltipElement) {
17514      this.tooltipElement.style.opacity = "0";
17515    }
17516    this.currentLocationId = null;
17517    if (this.showTimeout) {
17518      clearTimeout(this.showTimeout);
17519      this.showTimeout = null;
17520    }
17521    if (this.hideTimeout) {
17522      clearTimeout(this.hideTimeout);
17523      this.hideTimeout = null;
17524    }
17525  }
17526  updateTooltipContent(data) {
17527    if (!this.tooltipElement) return;
17528    let content = `<div class="text-center">`;
17529    content += `<div class="font-semibold text-white mb-1">${data.locationName}</div>`;
17530    if (data.contactName) {
17531      content += `<div class="text-gray-300 text-xs">`;
17532      content += `<div>${data.contactName}</div>`;
17533      if (data.contactRole) {
17534        content += `<div class="text-gray-400">${data.contactRole}</div>`;
17535      }
17536      content += `</div>`;
17537    } else {
17538      content += `<div class="text-gray-400 text-xs">Kein Ansprechpartner zugewiesen</div>`;
17539    }
17540    content += `</div>`;
17541    this.tooltipElement.innerHTML = content;
17542  }
17543  updateTooltipPosition(mouseX, mouseY) {
17544    if (!this.tooltipElement) return;
17545    const tooltip = this.tooltipElement;
17546    const rect = tooltip.getBoundingClientRect();
17547    const viewport = {
17548      width: window.innerWidth,
17549      height: window.innerHeight
17550    };
17551    const spacing = 12;
17552    let x2 = mouseX + spacing;
17553    let y2 = mouseY - rect.height - spacing;
17554    if (x2 + rect.width > viewport.width) {
17555      x2 = mouseX - rect.width - spacing;
17556    }
17557    if (y2 < 0) {
17558      y2 = mouseY + spacing;
17559    }
17560    x2 = Math.max(spacing, Math.min(x2, viewport.width - rect.width - spacing));
17561    y2 = Math.max(spacing, Math.min(y2, viewport.height - rect.height - spacing));
17562    tooltip.style.left = `${x2}px`;
17563    tooltip.style.top = `${y2}px`;
17564  }
17565  updateLocations(locations) {
17566    this.locations = locations;
17567    if (this.currentLocationId && !locations.find((loc) => loc.id === this.currentLocationId)) {
17568      this.hideTooltip();
17569    }
17570  }
17571  destroy() {
17572    if (this.showTimeout) {
17573      clearTimeout(this.showTimeout);
17574    }
17575    if (this.hideTimeout) {
17576      clearTimeout(this.hideTimeout);
17577    }
17578    if (this.tooltipElement) {
17579      document.body.removeChild(this.tooltipElement);
17580      this.tooltipElement = null;
17581    }
17582    this.container.removeEventListener("mouseover", this.handleMouseOver.bind(this));
17583    this.container.removeEventListener("mouseout", this.handleMouseOut.bind(this));
17584    this.container.removeEventListener("mousemove", this.handleMouseMove.bind(this));
17585    window.removeEventListener("resize", this.hideTooltip.bind(this));
17586  }
17587}
17588class MapHandler {
17589  constructor(options) {
17590    __publicField(this, "container");
17591    __publicField(this, "locations");
17592    __publicField(this, "contacts");
17593    __publicField(this, "selectedLocationId");
17594    __publicField(this, "onLocationSelect");
17595    __publicField(this, "enableZoom");
17596    __publicField(this, "enablePan");
17597    __publicField(this, "panZoomInstance", null);
17598    __publicField(this, "svgElement", null);
17599    __publicField(this, "locationElements", /* @__PURE__ */ new Map());
17600    __publicField(this, "tooltipHandler", null);
17601    __publicField(this, "isInitialized", false);
17602    __publicField(this, "touchStartTime", 0);
17603    __publicField(this, "touchStartPosition", { x: 0, y: 0 });
17604    __publicField(this, "touchMoved", false);
17605    __publicField(this, "TOUCH_DELAY_MS", 50);
17606    // Minimum touch duration to prevent accidental taps
17607    __publicField(this, "TOUCH_MOVE_THRESHOLD", 15);
17608    this.container = options.container;
17609    this.locations = options.locations;
17610    this.contacts = options.contacts || [];
17611    this.selectedLocationId = options.selectedLocationId || null;
17612    this.onLocationSelect = options.onLocationSelect;
17613    this.enableZoom = options.enableZoom ?? true;
17614    this.enablePan = options.enablePan ?? true;
17615  }
17616  async initialize() {
17617    try {
17618      this.svgElement = this.container.querySelector("svg");
17619      if (!this.svgElement) {
17620        throw new Error("No SVG element found in container");
17621      }
17622      this.setupSVGViewport();
17623      await this.loadSvgPanZoom();
17624      this.setupPanZoom();
17625      this.setupLocationElements();
17626      this.bindEvents();
17627      this.setupTooltips();
17628      if (this.selectedLocationId) {
17629        this.highlightLocation(this.selectedLocationId);
17630      }
17631      this.isInitialized = true;
17632    } catch (error) {
17633      console.error("Failed to initialize map handler:", error);
17634      throw error;
17635    }
17636  }
17637  setupSVGViewport() {
17638    if (!this.svgElement) return;
17639    this.svgElement.style.width = "100%";
17640    this.svgElement.style.height = "100%";
17641    this.svgElement.style.display = "block";
17642    this.svgElement.setAttribute("preserveAspectRatio", "xMidYMid meet");
17643    if (!this.svgElement.getAttribute("viewBox")) {
17644      try {
17645        const bbox = this.svgElement.getBBox();
17646        this.svgElement.setAttribute("viewBox", `${bbox.x} ${bbox.y} ${bbox.width} ${bbox.height}`);
17647      } catch (error) {
17648        console.warn("Could not get SVG bounding box, using default viewBox");
17649      }
17650    }
17651  }
17652  async loadSvgPanZoom() {
17653    if (window.svgPanZoom) {
17654      return;
17655    }
17656    return new Promise((resolve, reject) => {
17657      const script = document.createElement("script");
17658      script.src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/svg-pan-zoom.min.js";
17659      script.onload = () => resolve();
17660      script.onerror = () => reject(new Error("Failed to load svg-pan-zoom library"));
17661      document.head.appendChild(script);
17662    });
17663  }
17664  setupPanZoom() {
17665    if (!this.svgElement || !window.svgPanZoom) return;
17666    this.panZoomInstance = window.svgPanZoom(this.svgElement, {
17667      zoomEnabled: this.enableZoom,
17668      panEnabled: this.enablePan,
17669      controlIconsEnabled: false,
17670      // We'll use custom controls
17671      fit: true,
17672      center: true,
17673      minZoom: 0.8,
17674      maxZoom: 8,
17675      zoomScaleSensitivity: 0.15,
17676      // Smoother zoom steps
17677      dblClickZoomEnabled: this.enableZoom,
17678      mouseWheelZoomEnabled: this.enableZoom,
17679      preventMouseEventsDefault: true,
17680      // Smooth animations
17681      animationTime: 300,
17682      easing: "easeInOutCubic",
17683      beforeZoom: () => {
17684        this.svgElement?.classList.add("zooming");
17685      },
17686      onZoom: () => {
17687        setTimeout(() => {
17688          this.svgElement?.classList.remove("zooming");
17689        }, 350);
17690      }
17691    });
17692  }
17693  setupLocationElements() {
17694    if (!this.svgElement) return;
17695    this.locationElements.clear();
17696    const locationElements = this.svgElement.querySelectorAll('[data-location-id], [id^="location-"], [id^="hover-location-"]');
17697    console.log("🗺️ Found", locationElements.length, "location elements in SVG");
17698    locationElements.forEach((element) => {
17699      let locationId = element.getAttribute("data-location-id");
17700      if (!locationId && element.id) {
17701        const match = element.id.match(/^(?:hover-)?location-(\d+)$/);
17702        if (match) {
17703          locationId = match[1];
17704          element.setAttribute("data-location-id", locationId);
17705        }
17706      }
17707      if (locationId && element instanceof SVGElement) {
17708        const internalLocationId = `wp-${locationId}`;
17709        this.locationElements.set(internalLocationId, element);
17710        element.classList.add("map-location");
17711      }
17712    });
17713    console.log(`Found ${this.locationElements.size} location elements on map`);
17714  }
17715  setupTooltips() {
17716    if (!this.container) return;
17717    this.tooltipHandler = new MapTooltipHandler(this.container, this.locations, this.contacts);
17718  }
17719  // Max pixels moved to still count as tap
17720  bindEvents() {
17721    if (!this.container) return;
17722    this.container.addEventListener("touchstart", this.handleTouchStart.bind(this), { passive: true });
17723    this.container.addEventListener("touchmove", this.handleTouchMove.bind(this), { passive: true });
17724    this.container.addEventListener("touchend", this.handleTouchEnd.bind(this), { passive: false });
17725    this.container.addEventListener("click", this.handleClick.bind(this), { passive: false });
17726  }
17727  handleTouchStart(event) {
17728    this.container.dataset.touchActive = "true";
17729    this.touchStartTime = Date.now();
17730    this.touchMoved = false;
17731    if (event.touches.length > 0) {
17732      const touch = event.touches[0];
17733      this.touchStartPosition = { x: touch.clientX, y: touch.clientY };
17734    }
17735  }
17736  handleTouchMove(event) {
17737    if (event.touches.length > 0) {
17738      const touch = event.touches[0];
17739      const deltaX = Math.abs(touch.clientX - this.touchStartPosition.x);
17740      const deltaY = Math.abs(touch.clientY - this.touchStartPosition.y);
17741      if (deltaX > this.TOUCH_MOVE_THRESHOLD || deltaY > this.TOUCH_MOVE_THRESHOLD) {
17742        this.touchMoved = true;
17743      }
17744    }
17745  }
17746  handleTouchEnd(event) {
17747    event.preventDefault();
17748    const touchDuration = Date.now() - this.touchStartTime;
17749    console.log("👆 Touch end - duration:", touchDuration, "moved:", this.touchMoved);
17750    if (touchDuration >= this.TOUCH_DELAY_MS && !this.touchMoved) {
17751      const target = event.target;
17752      const locationElement = target.closest("[data-location-id]");
17753      console.log("🎯 Touch location element found:", locationElement);
17754      if (locationElement) {
17755        const locationId = locationElement.getAttribute("data-location-id");
17756        console.log("📍 Touch location ID:", locationId);
17757        if (locationId) {
17758          this.handleLocationTouch(locationId, locationElement);
17759        }
17760      } else {
17761        console.log("❌ No location element found for touch");
17762      }
17763    } else {
17764      console.log("⏭️ Touch ignored - too short or moved too much");
17765    }
17766    setTimeout(() => {
17767      delete this.container.dataset.touchActive;
17768    }, 300);
17769  }
17770  handleClick(event) {
17771    console.log("🖱️ Click event:", event.target);
17772    if (this.container.dataset.touchActive) {
17773      console.log("⏭️ Skipping click - touch active");
17774      return;
17775    }
17776    const target = event.target;
17777    const locationElement = target.closest("[data-location-id]");
17778    console.log("🎯 Location element found:", locationElement);
17779    if (locationElement) {
17780      const locationId = locationElement.getAttribute("data-location-id");
17781      console.log("📍 Location ID:", locationId);
17782      if (locationId) {
17783        this.handleLocationClick(locationId, locationElement);
17784      }
17785    } else {
17786      console.log("❌ No location element found for click");
17787    }
17788  }
17789  handleLocationTouch(locationId, element) {
17790    element.classList.add("map-location-active");
17791    setTimeout(() => {
17792      element.classList.remove("map-location-active");
17793    }, 150);
17794    this.setSelectedLocation(locationId);
17795    this.onLocationSelect(locationId);
17796  }
17797  handleLocationClick(locationId, element) {
17798    element.classList.add("map-location-active");
17799    setTimeout(() => {
17800      element.classList.remove("map-location-active");
17801    }, 200);
17802    this.setSelectedLocation(locationId);
17803    this.onLocationSelect(locationId);
17804    if (this.enableZoom && this.panZoomInstance) {
17805      this.zoomToLocation(locationId);
17806    }
17807  }
17808  highlightLocation(locationId) {
17809    this.locationElements.forEach((element2, id2) => {
17810      element2.classList.remove("map-location-selected");
17811    });
17812    const element = this.locationElements.get(locationId);
17813    if (element) {
17814      element.classList.add("map-location-selected");
17815    }
17816  }
17817  zoomToLocation(locationId) {
17818    const element = this.locationElements.get(locationId);
17819    if (!element || !this.panZoomInstance || !this.svgElement) return;
17820    try {
17821      const bbox = element.getBBox();
17822      const svgRect = this.svgElement.getBoundingClientRect();
17823      const centerX = bbox.x + bbox.width / 2;
17824      const centerY = bbox.y + bbox.height / 2;
17825      const padding = 50;
17826      const scaleX = (svgRect.width - padding * 2) / bbox.width;
17827      const scaleY = (svgRect.height - padding * 2) / bbox.height;
17828      const scale = Math.min(scaleX, scaleY, 3);
17829      this.panZoomInstance.zoom(scale);
17830      this.panZoomInstance.pan({
17831        x: svgRect.width / 2 - centerX * scale,
17832        y: svgRect.height / 2 - centerY * scale
17833      });
17834    } catch (error) {
17835      console.warn("Failed to zoom to location:", error);
17836    }
17837  }
17838  // Public methods
17839  updateLocations(locations) {
17840    this.locations = locations;
17841    if (this.isInitialized) {
17842      this.setupLocationElements();
17843    }
17844    if (this.tooltipHandler) {
17845      this.tooltipHandler.updateLocations(locations);
17846    }
17847  }
17848  setSelectedLocation(locationId) {
17849    this.selectedLocationId = locationId;
17850    if (this.isInitialized && locationId) {
17851      this.highlightLocation(locationId);
17852    }
17853  }
17854  // Pan/Zoom controls
17855  zoomIn() {
17856    this.panZoomInstance?.zoomIn();
17857  }
17858  zoomOut() {
17859    this.panZoomInstance?.zoomOut();
17860  }
17861  resetView() {
17862    this.panZoomInstance?.reset();
17863  }
17864  fitToView() {
17865    this.panZoomInstance?.fit();
17866  }
17867  centerView() {
17868    this.panZoomInstance?.center();
17869  }
17870  getZoomLevel() {
17871    return this.panZoomInstance?.getZoom() || 1;
17872  }
17873  destroy() {
17874    if (this.panZoomInstance) {
17875      this.panZoomInstance.destroy();
17876      this.panZoomInstance = null;
17877    }
17878    if (this.tooltipHandler) {
17879      this.tooltipHandler.destroy();
17880      this.tooltipHandler = null;
17881    }
17882    this.locationElements.clear();
17883    this.isInitialized = false;
17884  }
17885}
17886const MapControls = ({
17887  mapHandler,
17888  className,
17889  variant = "default"
17890}) => {
17891  const [zoomLevel, setZoomLevel] = reactExports.useState(1);
17892  reactExports.useEffect(() => {
17893    const updateZoomLevel = () => {
17894      const currentZoom = mapHandler.getZoomLevel();
17895      setZoomLevel(Math.round(currentZoom * 100) / 100);
17896    };
17897    updateZoomLevel();
17898    const interval = setInterval(updateZoomLevel, 500);
17899    return () => clearInterval(interval);
17900  }, [mapHandler]);
17901  const controlButtonClass = clsx(
17902    "flex items-center justify-center w-10 h-10 bg-white border border-background-tertiary rounded-mec shadow-sm",
17903    "hover:bg-background-secondary hover:border-mec-primary/20 hover:shadow-md",
17904    "active:scale-95 transition-all duration-150",
17905    "text-text-secondary hover:text-mec-primary",
17906    "touch-manipulation tap-highlight-none"
17907  );
17908  const compactButtonClass = clsx(
17909    "flex items-center justify-center w-8 h-8 bg-white/90 backdrop-blur-sm rounded border border-white/20",
17910    "hover:bg-white hover:border-mec-primary/20",
17911    "active:scale-95 transition-all duration-150",
17912    "text-text-secondary hover:text-mec-primary",
17913    "touch-manipulation tap-highlight-none"
17914  );
17915  const buttonClass = variant === "compact" ? compactButtonClass : controlButtonClass;
17916  const iconSize = variant === "compact" ? "w-3 h-3" : "w-4 h-4";
17917  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("flex flex-col space-y-2", className), children: [
17918    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col space-y-1", children: [
17919      /* @__PURE__ */ jsxRuntimeExports.jsx(
17920        "button",
17921        {
17922          onClick: () => mapHandler.zoomIn(),
17923          className: buttonClass,
17924          title: "Vergrößern",
17925          "aria-label": "Karte vergrößern",
17926          children: /* @__PURE__ */ jsxRuntimeExports.jsx(ZoomIn, { className: iconSize })
17927        }
17928      ),
17929      /* @__PURE__ */ jsxRuntimeExports.jsx(
17930        "button",
17931        {
17932          onClick: () => mapHandler.zoomOut(),
17933          className: buttonClass,
17934          title: "Verkleinern",
17935          "aria-label": "Karte verkleinern",
17936          children: /* @__PURE__ */ jsxRuntimeExports.jsx(ZoomOut, { className: iconSize })
17937        }
17938      )
17939    ] }),
17940    variant === "default" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white/90 backdrop-blur-sm border border-background-tertiary rounded-mec px-2 py-1 shadow-sm", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xs text-text-secondary font-mono", children: [
17941      Math.round(zoomLevel * 100),
17942      "%"
17943    ] }) }),
17944    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col space-y-1", children: [
17945      /* @__PURE__ */ jsxRuntimeExports.jsx(
17946        "button",
17947        {
17948          onClick: () => mapHandler.centerView(),
17949          className: buttonClass,
17950          title: "Zentrieren",
17951          "aria-label": "Karte zentrieren",
17952          children: /* @__PURE__ */ jsxRuntimeExports.jsx(Crosshair, { className: iconSize })
17953        }
17954      ),
17955      /* @__PURE__ */ jsxRuntimeExports.jsx(
17956        "button",
17957        {
17958          onClick: () => mapHandler.resetView(),
17959          className: buttonClass,
17960          title: "Zurücksetzen",
17961          "aria-label": "Ansicht zurücksetzen",
17962          children: /* @__PURE__ */ jsxRuntimeExports.jsx(RotateCcw, { className: iconSize })
17963        }
17964      )
17965    ] })
17966  ] });
17967};
17968const mapSvg = "/assets/map-BpCifMi3.svg";
17969const MapContainer = ({
17970  locations,
17971  contacts = [],
17972  selectedLocationId,
17973  className,
17974  height = 500,
17975  enableZoom = true,
17976  // Enable zoom for better pin targeting
17977  enablePan = true,
17978  // Enable pan for navigation
17979  svgUrl = mapSvg,
17980  // Use imported SVG
17981  showControls = true,
17982  // Show zoom controls
17983  showLoadingButton = false
17984}) => {
17985  const containerRef = reactExports.useRef(null);
17986  const svgContainerRef = reactExports.useRef(null);
17987  const mapHandlerRef = reactExports.useRef(null);
17988  const { setSelectedLocation, openLocationModal } = useAppStore();
17989  const [isLoading, setIsLoading] = reactExports.useState(false);
17990  const [isMapLoaded, setIsMapLoaded] = reactExports.useState(false);
17991  const [error, setError] = reactExports.useState(null);
17992  const handleLocationSelect = (locationId) => {
17993    setSelectedLocation(locationId);
17994    openLocationModal(locationId);
17995  };
17996  const loadMap = async () => {
17997    if (!svgContainerRef.current || isMapLoaded) return;
17998    setIsLoading(true);
17999    setError(null);
18000    try {
18001      const response = await fetch(svgUrl);
18002      if (!response.ok) {
18003        throw new Error(`Failed to load map: ${response.statusText}`);
18004      }
18005      const svgContent = await response.text();
18006      if (svgContainerRef.current) {
18007        svgContainerRef.current.innerHTML = svgContent;
18008        if (mapHandlerRef.current) {
18009          mapHandlerRef.current.destroy();
18010        }
18011        mapHandlerRef.current = new MapHandler({
18012          container: svgContainerRef.current,
18013          locations,
18014          contacts,
18015          selectedLocationId,
18016          onLocationSelect: handleLocationSelect,
18017          enableZoom,
18018          enablePan
18019        });
18020        await mapHandlerRef.current.initialize();
18021        setIsMapLoaded(true);
18022      }
18023    } catch (err) {
18024      const errorMessage = err instanceof Error ? err.message : "Failed to load map";
18025      setError(errorMessage);
18026      console.error("Map loading error:", err);
18027    } finally {
18028      setIsLoading(false);
18029    }
18030  };
18031  reactExports.useEffect(() => {
18032    if (mapHandlerRef.current && isMapLoaded) {
18033      mapHandlerRef.current.updateLocations(locations);
18034    }
18035  }, [locations, isMapLoaded]);
18036  reactExports.useEffect(() => {
18037    if (mapHandlerRef.current && isMapLoaded) {
18038      mapHandlerRef.current.setSelectedLocation(selectedLocationId || null);
18039    }
18040  }, [selectedLocationId, isMapLoaded]);
18041  reactExports.useEffect(() => {
18042    return () => {
18043      if (mapHandlerRef.current) {
18044        mapHandlerRef.current.destroy();
18045      }
18046    };
18047  }, []);
18048  reactExports.useEffect(() => {
18049    if (!isMapLoaded && !isLoading && !error) {
18050      loadMap();
18051    }
18052  }, [isMapLoaded, isLoading, error]);
18053  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
18054    "div",
18055    {
18056      ref: containerRef,
18057      className: clsx("relative bg-background-secondary", className),
18058      style: {
18059        height,
18060        touchAction: "manipulation",
18061        // Allow zoom and pan gestures
18062        userSelect: "none"
18063        // Prevent text selection on touch
18064      },
18065      children: [
18066        !isMapLoaded && !error && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 flex flex-col items-center justify-center", children: isLoading ? /* @__P
18066URE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
18067          /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingSpinner, { size: "lg" }),
18068          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-4 text-text-secondary", children: "Karte wird geladen..." })
18069        ] }) : showLoadingButton ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
18070          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4", children: [
18071            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-mec-primary/10 rounded-full flex items-center justify-center mx-auto mb-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-8 h-8 text-mec-primary", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 00-1.447-.894L15 4m0 13V4m-6 3l6-3" }) }) }),
18072            /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Interaktive Karte" }),
18073            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mb-4", children: 'Klicken Sie auf "Karte laden" um die interaktive Standortkarte anzuzeigen' })
18074          ] }),
18075          /* @__PURE__ */ jsxRuntimeExports.jsx(
18076            "button",
18077            {
18078              onClick: loadMap,
18079              className: "btn-primary",
18080              disabled: isLoading,
18081              children: "Karte laden"
18082            }
18083          )
18084        ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
18085          /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingSpinner, { size: "lg" }),
18086          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-4 text-text-secondary", children: "Karte wird automatisch geladen..." })
18087        ] }) }),
18088        error && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center p-6", children: [
18089          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto mb-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-8 h-8 text-red-500", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z" }) }) }),
18090          /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Karte konnte nicht geladen werden" }),
18091          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mb-4 text-sm", children: error }),
18092          /* @__PURE__ */ jsxRuntimeExports.jsx(
18093            "button",
18094            {
18095              onClick: loadMap,
18096              className: "btn-secondary",
18097              children: "Erneut versuchen"
18098            }
18099          )
18100        ] }) }),
18101        /* @__PURE__ */ jsxRuntimeExports.jsx(
18102          "div",
18103          {
18104            ref: svgContainerRef,
18105            className: clsx(
18106              "w-full h-full overflow-hidden",
18107              !isMapLoaded && "opacity-0"
18108            ),
18109            style: {
18110              transition: "opacity 0.3s ease-in-out",
18111              touchAction: "manipulation",
18112              // Allow zoom and pan gestures
18113              cursor: "pointer"
18114              // Show pointer cursor for clickable locations
18115            }
18116          }
18117        ),
18118        showControls && isMapLoaded && mapHandlerRef.current && /* @__PURE__ */ jsxRuntimeExports.jsx(
18119          MapControls,
18120          {
18121            mapHandler: mapHandlerRef.current,
18122            className: "absolute top-4 right-4"
18123          }
18124        )
18125      ]
18126    }
18127  );
18128};
18129const UnifiedContactCard = ({
18130  contact,
18131  variant = "default",
18132  onClick,
18133  showLocation = false,
18134  className
18135}) => {
18136  console.log("🔍 DEBUG: Full contact object:", contact);
18137  console.log("🔍 DEBUG: Contact fields:", {
18138    id: contact.id,
18139    fullName: contact.fullName,
18140    position: contact.position,
18141    department: contact.department,
18142    email: contact.email,
18143    phone: contact.phone,
18144    mobile: contact.mobile,
18145    image: contact.image,
18146    locationName: contact.locationName,
18147    locationCity: contact.locationCity,
18148    specialties: contact.specialties,
18149    socialLinks: contact.socialLinks
18150  });
18151  const handleClick = () => {
18152    onClick?.(contact);
18153  };
18154  const handleEmailClick = (e) => {
18155    e.stopPropagation();
18156    window.location.href = `mailto:${contact.email}`;
18157  };
18158  const handlePhoneClick = (e) => {
18159    e.stopPropagation();
18160    if (contact.phone) {
18161      window.location.href = `tel:${contact.phone}`;
18162    }
18163  };
18164  if (variant === "compact") {
18165    return /* @__PURE__ */ jsxRuntimeExports.jsxs(
18166      "div",
18167      {
18168        className: clsx(
18169          "flex items-center space-x-3 p-3 bg-white border border-background-tertiary rounded-mec",
18170          "hover:border-mec-primary/20 hover:shadow-card transition-all duration-200",
18171          "touch-target-lg",
18172          onClick && "cursor-pointer",
18173          className
18174        ),
18175        onClick: handleClick,
18176        children: [
18177          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-shrink-0", children: contact.image ? /* @__PURE__ */ jsxRuntimeExports.jsx(
18178            "img",
18179            {
18180              src: contact.image,
18181              alt: contact.fullName,
18182              className: "w-10 h-10 rounded-full object-cover object-center"
18183            }
18184          ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-10 h-10 bg-mec-primary/10 rounded-full flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(User, { className: "w-5 h-5 text-mec-primary" }) }) }),
18185          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
18186            /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-medium text-text-primary truncate", children: contact.fullName }),
18187            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-secondary truncate", children: contact.position }),
18188            contact.specialties && contact.specialties.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-text-muted truncate", children: [
18189              contact.specialties.slice(0, 2).join(", "),
18190              contact.specialties.length > 2 && ` +${contact.specialties.length - 2}`
18191            ] }),
18192            showLocation && contact.locationName && /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-text-muted truncate flex items-center mt-1", children: [
18193              /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-3 h-3 mr-1" }),
18194              contact.locationName
18195            ] })
18196          ] }),
18197          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2 flex-shrink-0", children: [
18198            contact.email && /* @__PURE__ */ jsxRuntimeExports.jsx(
18199              "button",
18200              {
18201                onClick: handleEmailClick,
18202                className: "p-1.5 text-text-muted hover:text-mec-primary hover:bg-mec-primary/10 rounded transition-colors",
18203                title: "E-Mail senden",
18204                children: /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-4 h-4" })
18205              }
18206            ),
18207            contact.phone && /* @__PURE__ */ jsxRuntimeExports.jsx(
18208              "button",
18209              {
18210                onClick: handlePhoneClick,
18211                className: "p-1.5 text-text-muted hover:text-mec-primary hover:bg-mec-primary/10 rounded transition-colors",
18212                title: "Anrufen",
18213                children: /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-4 h-4" })
18214              }
18215            )
18216          ] })
18217        ]
18218      }
18219    );
18220  }
18221  if (variant === "detailed") {
18222    return /* @__PURE__ */ jsxRuntimeExports.jsxs(
18223      "div",
18224      {
18225        className: clsx(
18226          "bg-white rounded-mec-lg border border-background-tertiary p-6 cursor-pointer",
18227          "hover:border-mec-primary/20 hover:shadow-card transition-all duration-200",
18228          "touch-target-lg",
18229          className
18230        ),
18231        onClick: handleClick,
18232        children: [
18233          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start space-x-4 mb-4", children: [
18234            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-shrink-0", children: contact.image ? /* @__PURE__ */ jsxRuntimeExports.jsx(
18235              "img",
18236              {
18237                src: contact.image,
18238                alt: contact.fullName,
18239                className: "w-16 h-16 rounded-full object-cover object-center"
18240              }
18241            ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-mec-primary/10 rounded-full flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(User, { className: "w-8 h-8 text-mec-primary" }) }) }),
18242            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
18243              /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-1", children: contact.fullName }),
18244              /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mb-1", children: contact.position }),
18245              contact.department && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-muted", children: contact.department }),
18246              showLocation && contact.locationName && /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-text-muted flex items-center mt-2", children: [
18247                /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-4 h-4 mr-1" }),
18248                contact.locationName,
18249                ", ",
18250                contact.locationCity
18251              ] })
18252            ] })
18253          ] }),
18254          contact.specialties && contact.specialties.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2", children: [
18255            contact.specialties.slice(0, 4).map((specialty, index) => /* @__PURE__ */ jsxRuntimeExports.jsx(
18256              "span",
18257              {
18258                className: "px-2 py-1 bg-mec-primary/10 text-mec-primary text-xs rounded-full",
18259                children: specialty
18260              },
18261              index
18262            )),
18263            contact.specialties.length > 4 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "px-2 py-1 bg-background-tertiary text-text-muted text-xs rounded-full", children: [
18264              "+",
18265              contact.specialties.length - 4,
18266              " weitere"
18267            ] })
18268          ] }) }),
18269          contact.languages && contact.languages.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4", children: [
18270            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-text-secondary mb-2", children: "Sprachen:" }),
18271            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-1", children: [
18272              contact.languages.slice(0, 3).map((language, index) => /* @__PURE__ */ jsxRuntimeExports.jsx(
18273                "span",
18274                {
18275                  className: "px-2 py-1 bg-background-secondary text-text-primary text-xs rounded",
18276                  children: language
18277                },
18278                index
18279              )),
18280              contact.languages.length > 3 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "px-2 py-1 bg-background-tertiary text-text-muted text-xs rounded", children: [
18281                "+",
18282                contact.languages.length - 3
18283              ] })
18284            ] })
18285          ] }),
18286          contact.bio && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-secondary line-clamp-3", children: contact.bio }) }),
18287          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-3 pt-4 border-t border-background-tertiary", children: [
18288            contact.email && /* @__PURE__ */ jsxRuntimeExports.jsxs(
18289              "button",
18290              {
18291                onClick: handleEmailClick,
18292                className: "btn-primary text-sm flex-1 inline-flex items-center justify-center",
18293                children: [
18294                  /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-4 h-4 mr-2" }),
18295                  "E-Mail"
18296                ]
18297              }
18298            ),
18299            contact.phone && /* @__PURE__ */ jsxRuntimeExports.jsxs(
18300              "button",
18301              {
18302                onClick: handlePhoneClick,
18303                className: "btn-secondary text-sm flex-1 inline-flex items-center justify-center",
18304                children: [
18305                  /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-4 h-4 mr-2" }),
18306                  "Anrufen"
18307                ]
18308              }
18309            )
18310          ] })
18311        ]
18312      }
18313    );
18314  }
18315  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
18316    "div",
18317    {
18318      className: clsx(
18319        "bg-white rounded-lg overflow-hidden cursor-pointer shadow-sm",
18320        "hover:shadow-md transition-all duration-200",
18321        "h-full flex flex-col",
18322        // Full height + flex column for equal height cards
18323        className
18324      ),
18325      onClick: handleClick,
18326      style: { fontFamily: "Helvetica Neue, Arial, sans-serif" },
18327      children: [
18328        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-full h-[5px]", style: { backgroundColor: "#d20028" } }),
18329        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative w-full h-[24rem] sm:h-[26rem] md:h-[28rem] flex-shrink-0", children: contact.image ? /* @__PURE__ */ jsxRuntimeExports.jsx(
18330          "img",
18331          {
18332            src: contact.image,
18333            alt: contact.fullName,
18334            className: "w-full h-full object-cover object-center"
18335          }
18336        ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-full h-full bg-gray-200 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(User, { className: "w-16 h-16 text-gray-400" }) }) }),
18337        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 flex-1 flex flex-col", style: { backgroundColor: "#E0E6EB" }, children: [
18338          /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm mb-2", style: { color: "#28323c" }, children: [
18339            contact.position,
18340            contact.department && ` • ${contact.department}`
18341          ] }),
18342          /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-xl font-semibold mb-4", style: { color: "#28323c" }, children: contact.fullName }),
18343          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
18344            contact.phone && /* @__PURE__ */ jsxRuntimeExports.jsxs(
18345              "button",
18346              {
18347                onClick: handlePhoneClick,
18348                className: "flex items-center space-x-3 w-full text-left p-3 rounded-lg hover:bg-white/50 transition-colors",
18349                style: { backgroundColor: "rgba(255, 255, 255, 0.3)" },
18350                children: [
18351                  /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-5 h-5 flex-shrink-0", style: { color: "#d20028" } }),
18352                  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm font-medium", style: { color: "#28323c" }, children: contact.phone })
18353                ]
18354              }
18355            ),
18356            contact.email && /* @__PURE__ */ jsxRuntimeExports.jsxs(
18357              "button",
18358              {
18359                onClick: handleEmailClick,
18360                className: "flex items-center space-x-3 w-full text-left p-3 rounded-lg hover:bg-white/50 transition-colors",
18361                style: { backgroundColor: "rgba(255, 255, 255, 0.3)" },
18362                children: [
18363                  /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-5 h-5 flex-shrink-0", style: { color: "#d20028" } }),
18364                  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm font-medium break-all", style: { color: "#28323c" }, children: contact.email })
18365                ]
18366              }
18367            )
18368          ] }),
18369          showLocation && contact.locationName && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-4 pt-4 border-t", style: { borderColor: "#a3b2c2" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2 text-sm", style: { color: "#28323c" }, children: [
18370            /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-4 h-4" }),
18371            /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
18372              contact.locationName,
18373              ", ",
18374              contact.locationCity
18375            ] })
18376          ] }) }),
18377          contact.specialties && contact.specialties.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 pt-4 border-t", style: { borderColor: "#a3b2c2" }, children: [
18378            /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-medium mb-2", style: { color: "#28323c" }, children: "Fachbereiche" }),
18379            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2", children: [
18380              contact.specialties.slice(0, 3).map((specialty, index) => /* @__PURE__ */ jsxRuntimeExports.jsx(
18381                "span",
18382                {
18383                  className: "px-2 py-1 text-xs rounded-lg",
18384                  style: { backgroundColor: "#d20028", color: "white" },
18385                  children: specialty
18386                },
18387                index
18388              )),
18389              contact.specialties.length > 3 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
18390                "span",
18391                {
18392                  className: "px-2 py-1 text-xs rounded-lg",
18393                  style: { backgroundColor: "#a3b2c2", color: "white" },
18394                  children: [
18395                    "+",
18396                    contact.specialties.length - 3
18397                  ]
18398                }
18399              )
18400            ] })
18401          ] })
18402        ] }),
18403        contact.socialLinks && contact.socialLinks.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-6 py-4", style: { backgroundColor: "#EFF3F5" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center space-x-4", children: contact.socialLinks.map((link, index) => {
18404          const isXing = link.platform?.toLowerCase() === "xing" || link.url?.includes("xing.com");
18405          const isLinkedIn = link.platform?.toLowerCase() === "linkedin" || link.url?.includes("linkedin.com");
18406          return /* @__PURE__ */ jsxRuntimeExports.jsxs(
18407            "a",
18408            {
18409              href: link.url,
18410              target: "_blank",
18411              rel: "noopener noreferrer",
18412              onClick: (e) => e.stopPropagation(),
18413              className: "hover:opacity-70 transition-opacity",
18414              style: { color: "#a3b2c2" },
18415              children: [
18416                isXing && /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 384 512", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M162.7 210c-1.8 3.3-25.2 44.4-70.1 123.5-4.9 8.3-10.8 12.5-17.7 12.5H9.8c-7.7 0-12.1-7.5-8.5-14.4l69-121.3c.2 0 .2-.1 0-.3l-43.9-75.6c-4.3-7.8.3-14.1 8.5-14.1H100c7.3 0 13.3 4.1 18 12.2l44.7 77.5zM382.6 46.1l-144 253v.3L330.2 466c3.9 7.1.2 14.1-8.5 14.1h-65.2c-7.6 0-13.6-4-18-12.2l-92.4-168.5c3.3-5.8 51.5-90.8 144.8-255.2 4.6-8.1 10.4-12.2 17.5-12.2h65.7c8 0 12.3 6.7 8.5 14.1z" }) }),
18417                isLinkedIn && /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 448 512", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z" }) })
18418              ]
18419            },
18420            index
18421          );
18422        }) }) })
18423      ]
18424    }
18425  );
18426};
18427const ContactCard = ({
18428  contact,
18429  onClick,
18430  variant = "default",
18431  showLocation = false,
18432  className
18433}) => {
18434  return /* @__PURE__ */ jsxRuntimeExports.jsx(
18435    UnifiedContactCard,
18436    {
18437      contact,
18438      onClick,
18439      variant,
18440      showLocation,
18441      className
18442    }
18443  );
18444};
18445const ContactGrid = ({
18446  contacts: providedContacts,
18447  loading: providedLoading,
18448  onContactClick,
18449  layout: providedLayout,
18450  columns = 3,
18451  className,
18452  locationId
18453}) => {
18454  const { contactLayout } = useViewPreferences();
18455  const { open: openContactModal } = useContactModal();
18456  const {
18457    contacts: fetchedContacts,
18458    locationSpecificContacts: fetchedLocationSpecificContacts,
18459    isLoading: fetchedLoading,
18460    error
18461  } = useFilteredContacts(locationId);
18462  const contacts = providedContacts || (locationId ? fetchedLocationSpecificContacts : fetchedContacts);
18463  const isLoading = providedLoading || fetchedLoading;
18464  const layout = providedLayout || contactLayout;
18465  console.log("🔍 DEBUG: ContactGrid - contacts array:", contacts);
18466  console.log("🔍 DEBUG: ContactGrid - contacts count:", contacts?.length || 0);
18467  console.log("🔍 DEBUG: ContactGrid - locationId:", locationId);
18468  console.log("🔍 DEBUG: ContactGrid - layout:", layout);
18469  console.log("🔍 DEBUG: ContactGrid - isLoading:", isLoading);
18470  const handleContactClick = (contact) => {
18471    if (onContactClick) {
18472      onContactClick(contact);
18473    } else {
18474      openContactModal(contact);
18475    }
18476  };
18477  if (isLoading) {
18478    return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className, children: layout === "grid" ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx(
18479      "grid gap-4",
18480      columns === 1 && "grid-cols-1",
18481      columns === 2 && "grid-cols-1 sm:grid-cols-2",
18482      columns === 3 && "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
18483      columns === 4 && "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"
18484    ), children: Array.from({ length: 6 }).map((_, index) => /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingCard, {}, index)) }) : /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingList, { items: 6 }) });
18485  }
18486  if (error) {
18487    return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("text-center py-8", className), children: [
18488      /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "w-8 h-8 text-red-500" }) }),
18489      /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Fehler beim Laden der Kontakte" }),
18490      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: "Die Ansprechpartner konnten nicht geladen werden." })
18491    ] });
18492  }
18493  if (!contacts || contacts.length === 0) {
18494    return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("text-center py-8", className), children: [
18495      /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-background-secondary rounded-full flex items-center justify-center mx-auto mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "w-8 h-8 text-text-muted" }) }),
18496      /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Keine Ansprechpartner gefunden" }),
18497      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: locationId ? "Für diesen Standort sind keine Ansprechpartner verfügbar." : "Versuchen Sie andere Suchkriterien oder Filter." })
18498    ] });
18499  }
18500  if (layout === "grid") {
18501    return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className, children: [
18502      /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx(
18503        "grid gap-4 items-stretch",
18504        columns === 1 && "grid-cols-1",
18505        columns === 2 && "grid-cols-1 sm:grid-cols-2",
18506        columns === 3 && "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
18507        // 3 Kacheln auf Desktop
18508        columns === 4 && "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"
18509      ), children: contacts.map((contact) => /* @__PURE__ */ jsxRuntimeExports.jsx(
18510        ContactCard,
18511        {
18512          contact,
18513          onClick: handleContactClick,
18514          variant: "default",
18515          showLocation: !locationId
18516        },
18517        contact.id
18518      )) }),
18519      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 text-center text-sm text-text-muted", children: [
18520        contacts.length,
18521        " Ansprechpartner",
18522        contacts.length !== 1 ? "" : "",
18523        locationId && " an diesem Standort"
18524      ] })
18525    ] });
18526  }
18527  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className, children: [
18528    /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-3", children: contacts.map((contact) => /* @__PURE__ */ jsxRuntimeExports.jsx(
18529      ContactCard,
18530      {
18531        contact,
18532        onClick: handleContactClick,
18533        variant: "compact",
18534        showLocation: !locationId
18535      },
18536      contact.id
18537    )) }),
18538    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 text-center text-sm text-text-muted", children: [
18539      contacts.length,
18540      " Ansprechpartner",
18541      contacts.length !== 1 ? "" : "",
18542      locationId && " an diesem Standort"
18543    ] })
18544  ] });
18545};
18546const LocationMiniGridCard = ({
18547  location,
18548  onClick,
18549  className
18550}) => {
18551  const handleClick = () => {
18552    onClick?.(location.id);
18553  };
18554  const getImageUrl = () => {
18555    return location.image || location.logo || "/assets/placeholder-location.jpg";
18556  };
18557  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
18558    "div",
18559    {
18560      onClick: handleClick,
18561      className: clsx(
18562        "bg-white rounded-lg overflow-hidden cursor-pointer",
18563        "hover:shadow-md transition-all duration-200",
18564        "border border-background-tertiary hover:border-mec-primary/30",
18565        "h-full flex flex-col touch-target-lg",
18566        className
18567      ),
18568      children: [
18569        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative w-full h-32 flex-shrink-0 bg-background-secondary", children: [
18570          /* @__PURE__ */ jsxRuntimeExports.jsx(
18571            "img",
18572            {
18573              src: getImageUrl(),
18574              alt: location.name,
18575              className: "w-full h-full object-cover",
18576              loading: "lazy"
18577            }
18578          ),
18579          location.logo && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute top-3 right-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white/95 backdrop-blur-sm rounded-lg p-2 shadow-sm border border-white/20", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
18580            "img",
18581            {
18582              src: location.logo,
18583              alt: `${location.name} Logo`,
18584              className: "h-8 w-auto object-contain max-w-[60px]"
18585            }
18586          ) }) })
18587        ] }),
18588        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-3 flex-1 flex flex-col", children: [
18589          /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-semibold text-text-primary mb-1 line-clamp-1", children: location.name }),
18590          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-xs text-text-secondary mb-2", children: [
18591            /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-3 h-3 mr-1 flex-shrink-0" }),
18592            /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "truncate", children: [
18593              location.postalCode && `${location.postalCode} `,
18594              location.city
18595            ] })
18596          ] }),
18597          location.address && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start text-xs text-text-muted mt-auto", children: [
18598            /* @__PURE__ */ jsxRuntimeExports.jsx(Building2, { className: "w-3 h-3 mr-1 flex-shrink-0 mt-0.5" }),
18599            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "line-clamp-2 leading-tight", children: location.address })
18600          ] })
18601        ] })
18602      ]
18603    }
18604  );
18605};
18606const UnifiedTabs = ({
18607  tabs,
18608  activeTab,
18609  onTabChange,
18610  variant = "default",
18611  size = "md",
18612  className,
18613  fullWidth = false
18614}) => {
18615  const handleTabClick = (tabId, disabled) => {
18616    if (!disabled) {
18617      onTabChange(tabId);
18618    }
18619  };
18620  const getVariantStyles = () => {
18621    switch (variant) {
18622      case "pills":
18623        return {
18624          container: "bg-background-secondary rounded-mec p-1",
18625          tab: "rounded-mec-sm transition-all duration-200",
18626          active: "bg-white shadow-sm text-text-primary",
18627          inactive: "text-text-secondary hover:text-text-primary hover:bg-white/50"
18628        };
18629      case "underline":
18630        return {
18631          container: "border-b border-background-tertiary",
18632          tab: "border-b-2 border-transparent transition-all duration-200 -mb-px",
18633          active: "border-mec-primary text-mec-primary",
18634          inactive: "text-text-secondary hover:text-text-primary hover:border-text-muted"
18635        };
18636      default:
18637        return {
18638          container: "bg-background-secondary rounded-mec-lg p-1",
18639          tab: "rounded-mec transition-all duration-200",
18640          active: "bg-white shadow-card text-text-primary",
18641          inactive: "text-text-secondary hover:text-text-primary hover:bg-white/50"
18642        };
18643    }
18644  };
18645  const getSizeStyles = () => {
18646    switch (size) {
18647      case "sm":
18648        return "px-3 py-1.5 text-sm";
18649      case "lg":
18650        return "px-6 py-3 text-lg";
18651      default:
18652        return "px-4 py-2 text-base";
18653    }
18654  };
18655  const styles = getVariantStyles();
18656  const sizeStyles = getSizeStyles();
18657  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx(styles.container, className), children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx(
18658    // Mobile: Stack vertically if tabs don't fit, Desktop: Horizontal
18659    "flex flex-wrap sm:flex-nowrap",
18660    fullWidth ? "w-full" : "inline-flex",
18661    variant === "underline" ? "gap-2 sm:gap-8" : "gap-1"
18662  ), children: tabs.map((tab) => {
18663    const isActive = activeTab === tab.id;
18664    const isDisabled = tab.disabled;
18665    return /* @__PURE__ */ jsxRuntimeExports.jsxs(
18666      "button",
18667      {
18668        onClick: () => handleTabClick(tab.id, isDisabled),
18669        disabled: isDisabled,
18670        className: clsx(
18671          "font-medium transition-all duration-200 flex items-center gap-1 sm:gap-2",
18672          styles.tab,
18673          sizeStyles,
18674          // Mobile: Full width on small screens, Desktop: Flex-1 if fullWidth
18675          fullWidth && "w-full sm:flex-1 justify-center",
18676          // Mobile: Enhanced touch target
18677          "touch-target-lg min-w-0",
18678          isActive ? styles.active : styles.inactive,
18679          isDisabled && "opacity-50 cursor-not-allowed"
18680        ),
18681        children: [
18682          tab.icon && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-shrink-0", children: tab.icon }),
18683          /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: clsx(
18684            "truncate text-xs sm:text-sm",
18685            fullWidth ? "text-center" : "text-left"
18686          ), children: tab.label }),
18687          tab.count !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: clsx(
18688            "hidden",
18689            // Hidden via CSS - can be re-enabled by removing this class
18690            "inline-flex items-center justify-center min-w-[1.25rem] h-5 px-1.5 rounded-full text-xs font-medium flex-shrink-0",
18691            isActive ? "bg-mec-primary text-white" : "bg-background-tertiary text-text-muted"
18692          ), children: tab.count })
18693        ]
18694      },
18695      tab.id
18696    );
18697  }) }) });
18698};
18699const useServices = () => {
18700  return useQuery({
18701    queryKey: ["services"],
18702    queryFn: () => locationsApi.getServices(),
18703    select: (data) => data.data || [],
18704    staleTime: 5 * 60 * 1e3,
18705    gcTime: 10 * 60 * 1e3
18706  });
18707};
18708const useStates = () => {
18709  return useQuery({
18710    queryKey: ["states"],
18711    queryFn: () => locationsApi.getStates(),
18712    select: (data) => data.data || [],
18713    staleTime: 5 * 60 * 1e3,
18714    gcTime: 10 * 60 * 1e3
18715  });
18716};
18717const useOpeningYears = () => {
18718  return useQuery({
18719    queryKey: ["opening-years"],
18720    queryFn: () => locationsApi.getOpeningYears(),
18721    select: (data) => data.data || { years: [], decades: [] },
18722    staleTime: 5 * 60 * 1e3,
18723    gcTime: 10 * 60 * 1e3
18724  });
18725};
18726const useLocationFilterData = () => {
18727  const services = useServices();
18728  const states = useStates();
18729  const openingYears = useOpeningYears();
18730  return {
18731    services: {
18732      data: services.data,
18733      isLoading: services.isLoading,
18734      error: services.error
18735    },
18736    states: {
18737      data: states.data,
18738      isLoading: states.isLoading,
18739      error: states.error
18740    },
18741    openingYears: {
18742      data: openingYears.data,
18743      isLoading: openingYears.isLoading,
18744      error: openingYears.error
18745    },
18746    isLoading: services.isLoading || states.isLoading || openingYears.isLoading,
18747    error: services.error || states.error || openingYears.error
18748  };
18749};
18750const ViewToggle = ({
18751  className,
18752  size = "md"
18753}) => {
18754  const { mapView, contactLayout, setMapView, setContactLayout } = useViewPreferences();
18755  const sizeClasses2 = {
18756    sm: "text-xs px-2 py-1",
18757    md: "text-sm px-3 py-2",
18758    lg: "text-base px-4 py-3"
18759  };
18760  const iconSizes = {
18761    sm: "w-3 h-3",
18762    md: "w-4 h-4",
18763    lg: "w-5 h-5"
18764  };
18765  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("flex items-center space-x-2", className), children: [
18766    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex bg-background-secondary rounded-mec p-1", children: [
18767      /* @__PURE__ */ jsxRuntimeExports.jsxs(
18768        "button",
18769        {
18770          onClick: () => setMapView("interactive"),
18771          className: clsx(
18772            "inline-flex items-center space-x-2 rounded transition-all duration-200",
18773            sizeClasses2[size],
18774            mapView === "interactive" ? "bg-white text-mec-primary shadow-sm" : "text-text-secondary hover:text-text-primary hover:bg-white/50"
18775          ),
18776          title: "Interaktive Karte",
18777          children: [
18778            /* @__PURE__ */ jsxRuntimeExports.jsx(Map$1, { className: iconSizes[size] }),
18779            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden sm:inline", children: "Karte" })
18780          ]
18781        }
18782      ),
18783      /* @__PURE__ */ jsxRuntimeExports.jsxs(
18784        "button",
18785        {
18786          onClick: () => setMapView("list"),
18787          className: clsx(
18788            "inline-flex items-center space-x-2 rounded transition-all duration-200",
18789            sizeClasses2[size],
18790            mapView === "list" ? "bg-white text-mec-primary shadow-sm" : "text-text-secondary hover:text-text-primary hover:bg-white/50"
18791          ),
18792          title: "Listenansicht",
18793          children: [
18794            /* @__PURE__ */ jsxRuntimeExports.jsx(List, { className: iconSizes[size] }),
18795            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden sm:inline", children: "Liste" })
18796          ]
18797        }
18798      )
18799    ] }),
18800    /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-px h-6 bg-background-tertiary" }),
18801    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex bg-background-secondary rounded-mec p-1", children: [
18802      /* @__PURE__ */ jsxRuntimeExports.jsxs(
18803        "button",
18804        {
18805          onClick: () => setContactLayout("grid"),
18806          disabled: mapView !== "list",
18807          className: clsx(
18808            "inline-flex items-center space-x-2 rounded transition-all duration-200",
18809            sizeClasses2[size],
18810            mapView !== "list" ? "text-text-muted cursor-not-allowed opacity-50" : contactLayout === "grid" ? "bg-white text-mec-primary shadow-sm" : "text-text-secondary hover:text-text-primary hover:bg-white/50"
18811          ),
18812          title: mapView !== "list" ? "Nur in Listenansicht verfügbar" : "Raster-Layout",
18813          children: [
18814            /* @__PURE__ */ jsxRuntimeExports.jsx(Grid3x3, { className: iconSizes[size] }),
18815            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden md:inline", children: "Raster" })
18816          ]
18817        }
18818      ),
18819      /* @__PURE__ */ jsxRuntimeExports.jsxs(
18820        "button",
18821        {
18822          onClick: () => setContactLayout("list"),
18823          disabled: mapView !== "list",
18824          className: clsx(
18825            "inline-flex items-center space-x-2 rounded transition-all duration-200",
18826            sizeClasses2[size],
18827            mapView !== "list" ? "text-text-muted cursor-not-allowed opacity-50" : contactLayout === "list" ? "bg-white text-mec-primary shadow-sm" : "text-text-secondary hover:text-text-primary hover:bg-white/50"
18828          ),
18829          title: mapView !== "list" ? "Nur in Listenansicht verfügbar" : "Listen-Layout",
18830          children: [
18831            /* @__PURE__ */ jsxRuntimeExports.jsx(List, { className: iconSizes[size] }),
18832            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden md:inline", children: "Liste" })
18833          ]
18834        }
18835      )
18836    ] })
18837  ] });
18838};
18839const CustomDropdown = ({
18840  label,
18841  icon,
18842  options,
18843  selectedValues,
18844  onSelectionChange,
18845  placeholder = "Alle",
18846  loading = false
18847}) => {
18848  const [isOpen, setIsOpen] = reactExports.useState(false);
18849  const dropdownRef = reactExports.useRef(null);
18850  reactExports.useEffect(() => {
18851    const handleClickOutside = (event) => {
18852      if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
18853        setIsOpen(false);
18854      }
18855    };
18856    document.addEventListener("mousedown", handleClickOutside);
18857    return () => document.removeEventListener("mousedown", handleClickOutside);
18858  }, []);
18859  const toggleOption = (option) => {
18860    if (selectedValues.includes(option)) {
18861      onSelectionChange(selectedValues.filter((v2) => v2 !== option));
18862    } else {
18863      onSelectionChange([...selectedValues, option]);
18864    }
18865  };
18866  const clearAll = () => {
18867    onSelectionChange([]);
18868  };
18869  const displayText = selectedValues.length === 0 ? placeholder : selectedValues.length === 1 ? selectedValues[0] : `${selectedValues.length} ausgewählt`;
18870  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative", ref: dropdownRef, children: [
18871    /* @__PURE__ */ jsxRuntimeExports.jsxs(
18872      "button",
18873      {
18874        onClick: () => setIsOpen(!isOpen),
18875        className: clsx(
18876          "flex items-center gap-2 px-4 py-2.5 bg-white border rounded-lg transition-all duration-200",
18877          "hover:border-mec-primary hover:shadow-sm focus:outline-none focus:ring-2 focus:ring-mec-primary/20",
18878          "w-full sm:w-auto min-w-[140px]",
18879          isOpen ? "border-mec-primary shadow-sm" : "border-gray-300",
18880          selectedValues.length > 0 && "border-mec-primary bg-mec-primary/5"
18881        ),
18882        disabled: loading,
18883        children: [
18884          icon,
18885          /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm font-medium text-gray-700 min-w-0 truncate", children: loading ? "Lädt..." : displayText }),
18886          selectedValues.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "bg-mec-primary text-white text-xs px-2 py-0.5 rounded-full", children: selectedValues.length }),
18887          /* @__PURE__ */ jsxRuntimeExports.jsx(
18888            ChevronDown,
18889            {
18890              className: clsx(
18891                "w-4 h-4 text-gray-500 transition-transform duration-200 flex-shrink-0",
18892                isOpen && "rotate-180"
18893              )
18894            }
18895          )
18896        ]
18897      }
18898    ),
18899    isOpen && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "absolute top-full left-0 right-0 mt-1 bg-white border border-gray-200 rounded-lg shadow-lg z-50 min-w-[200px]", children: [
18900      selectedValues.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-3 py-2 border-b border-gray-100", children: [
18901        /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xs font-medium text-gray-600", children: [
18902          selectedValues.length,
18903          " ausgewählt"
18904        ] }),
18905        /* @__PURE__ */ jsxRuntimeExports.jsx(
18906          "button",
18907          {
18908            onClick: clearAll,
18909            className: "text-xs text-mec-primary hover:text-mec-primary/80 font-medium",
18910            children: "Alle entfernen"
18911          }
18912        )
18913      ] }),
18914      /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "max-h-60 overflow-y-auto", children: options.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-3 py-2 text-sm text-gray-500", children: "Keine Optionen verfügbar" }) : options.map((option) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
18915        "label",
18916        {
18917          className: "flex items-center gap-3 px-3 py-2 hover:bg-gray-50 cursor-pointer transition-colors",
18918          children: [
18919            /* @__PURE__ */ jsxRuntimeExports.jsx(
18920              "input",
18921              {
18922                type: "checkbox",
18923                checked: selectedValues.includes(option),
18924                onChange: () => toggleOption(option),
18925                className: "w-4 h-4 text-mec-primary border-gray-300 rounded focus:ring-mec-primary/20"
18926              }
18927            ),
18928            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-gray-700 flex-1 min-w-0 truncate", children: option })
18929          ]
18930        },
18931        option
18932      )) })
18933    ] })
18934  ] });
18935};
18936const FilterBar = ({
18937  className,
18938  searchQuery,
18939  onSearchChange
18940}) => {
18941  const { activeTab } = useViewPreferences();
18942  const {
18943    selectedStates,
18944    setSelectedStates
18945  } = useFilters();
18946  const { states, isLoading: locationFiltersLoading } = useLocationFilterData();
18947  const statesArray = states.data?.map((item) => item.state) || [];
18948  const showFilters = activeTab === "locations";
18949  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx("bg-white rounded-lg border border-gray-200 p-3 sm:p-4", className), children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3 sm:gap-4 lg:flex-row lg:items-center", children: [
18950    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative flex-1 min-w-0", children: [
18951      /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400" }),
18952      /* @__PURE__ */ jsxRuntimeExports.jsx(
18953        "input",
18954        {
18955          type: "text",
18956          placeholder: activeTab === "locations" ? "Standorte durchsuchen..." : "Ansprechpartner durchsuchen...",
18957          value: searchQuery,
18958          onChange: (e) => onSearchChange(e.target.value),
18959          className: "w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg focus:ring-2 focus:ring-mec-primary/20 focus:border-mec-primary transition-colors"
18960        }
18961      )
18962    ] }),
18963    showFilters && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col sm:flex-row flex-wrap gap-3 w-full sm:w-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
18964      CustomDropdown,
18965      {
18966        label: "Region",
18967        icon: /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-4 h-4 text-gray-500" }),
18968        options: statesArray,
18969        selectedValues: selectedStates,
18970        onSelectionChange: setSelectedStates,
18971        placeholder: "Alle Regionen",
18972        loading: locationFiltersLoading
18973      }
18974    ) }),
18975    /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ViewToggle, { size: "sm" }) }),
18976    showFilters && selectedStates.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
18977      /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-sm text-gray-600", children: [
18978        selectedStates.length,
18979        " Filter aktiv"
18980      ] }),
18981      /* @__PURE__ */ jsxRuntimeExports.jsx(
18982        "button",
18983        {
18984          onClick: () => {
18985            setSelectedStates([]);
18986          },
18987          className: "text-sm text-mec-primary hover:text-mec-primary/80 font-medium",
18988          children: "Zurücksetzen"
18989        }
18990      )
18991    ] })
18992  ] }) });
18993};
18994class SafeFilterBarErrorBoundary extends React$2.Component {
18995  constructor(props) {
18996    super(props);
18997    this.state = { hasError: false };
18998  }
18999  static getDerivedStateFromError(error) {
19000    return { hasError: true, error };
19001  }
19002  componentDidCatch(error, errorInfo) {
19003    console.error("SafeFilterBar: Caught error in FilterBar:", error, errorInfo);
19004  }
19005  render() {
19006    if (this.state.hasError) {
19007      return this.props.fallback || /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white rounded-lg border border-gray-200 p-3 sm:p-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3 sm:gap-4 lg:flex-row lg:items-center", children: [
19008        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative", children: [
19009          /* @__PURE__ */ jsxRuntimeExports.jsx(
19010            "input",
19011            {
19012              type: "text",
19013              placeholder: "Standorte durchsuchen...",
19014              value: this.props.searchQuery || "",
19015              onChange: (e) => this.props.onSearchChange?.(e.target.value),
19016              className: "w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-mec-primary/20 focus:border-mec-primary transition-all duration-200"
19017            }
19018          ),
19019          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "h-5 w-5 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }) })
19020        ] }) }),
19021        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-gray-500", children: "Filter im Embed-Modus vereinfacht" })
19022      ] }) });
19023    }
19024    return /* @__PURE__ */ jsxRuntimeExports.jsx(FilterBar, { ...this.props });
19025  }
19026}
19027const SafeFilterBar = (props) => {
19028  return /* @__PURE__ */ jsxRuntimeExports.jsx(SafeFilterBarErrorBoundary, { ...props });
19029};
19030const UnifiedListView = ({ className }) => {
19031  const { contactLayout, activeTab, setActiveTab } = useViewPreferences();
19032  const { open: openLocationModal } = useLocationModal();
19033  const { open: openContactModal } = useContactModal();
19034  const {
19035    searchQuery,
19036    setSearchQuery,
19037    selectedStates,
19038    selectedServices
19039  } = useFilters();
19040  const { data: locations, isLoading: locationsLoading, error: locationsError } = useLocations();
19041  const { contacts, isLoading: contactsLoading, error: contactsError } = useFilteredContacts();
19042  const isLoading = locationsLoading || contactsLoading;
19043  const hasError = locationsError || contactsError;
19044  const handleLocationClick = (locationId) => {
19045    openLocationModal(locationId);
19046  };
19047  const handleContactClick = (contact) => {
19048    openContactModal(contact);
19049  };
19050  if (isLoading) {
19051    return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx("space-y-6", className), children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white rounded-mec-lg shadow-card p-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingSpinner, { size: "lg" }) }) }) });
19052  }
19053  if (hasError) {
19054    return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx("space-y-6", className), children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white rounded-mec-lg shadow-card p-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-center py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: "Fehler beim Laden der Daten. Bitte versuchen Sie es später erneut." }) }) }) });
19055  }
19056  const activeLocations = locations || [];
19057  const activeContacts = contacts || [];
19058  console.log("🔍 DEBUG: UnifiedListView - activeContacts:", activeContacts.length);
19059  console.log("🔍 DEBUG: UnifiedListView - searchQuery:", searchQuery);
19060  const getStateFromPostalCode = (postalCode) => {
19061    if (!postalCode) return "Sonstige";
19062    const firstChar = postalCode.charAt(0);
19063    switch (firstChar) {
19064      case "0":
19065      case "1":
19066        return "Berlin/Brandenburg/Sachsen";
19067      case "2":
19068        return "Hamburg/Schleswig-Holstein/Niedersachsen";
19069      case "3":
19070        return "Niedersachsen/Sachsen-Anhalt/Thüringen";
19071      case "4":
19072        return "Nordrhein-Westfalen";
19073      case "5":
19074        return "Nordrhein-Westfalen/Rheinland-Pfalz";
19075      case "6":
19076        return "Hessen/Rheinland-Pfalz/Saarland";
19077      case "7":
19078        return "Baden-Württemberg";
19079      case "8":
19080        return "Bayern";
19081      case "9":
19082        return "Bayern/Thüringen/Sachsen";
19083      default:
19084        return "Sonstige";
19085    }
19086  };
19087  const filteredLocations = activeLocations.filter((location) => {
19088    const matchesSearch = !searchQuery || (location.name || "").toLowerCase().includes(searchQuery.toLowerCase()) || (location.city || "").toLowerCase().includes(searchQuery.toLowerCase()) || (location.address || "").toLowerCase().includes(searchQuery.toLowerCase());
19089    const matchesState = selectedStates.length === 0 || selectedStates.includes(getStateFromPostalCode(location.postalCode || ""));
19090    const matchesServices = selectedServices.length === 0 || location.services && Array.isArray(location.services) && selectedServices.some((service) => location.services.includes(service));
19091    return matchesSearch && matchesState && matchesServices;
19092  });
19093  const filteredContacts = activeContacts.filter(
19094    (contact) => (contact.fullName || "").toLowerCase().includes(searchQuery.toLowerCase()) || (contact.position || "").toLowerCase().includes(searchQuery.toLowerCase()) || (contact.email || "").toLowerCase().includes(searchQuery.toLowerCase()) || contact.specialties && contact.specialties.some(
19095      (specialty) => (specialty || "").toLowerCase().includes(searchQuery.toLowerCase())
19096    )
19097  );
19098  console.log("🔍 DEBUG: UnifiedListView - filteredContacts:", filteredContacts.length);
19099  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("space-y-6 scroll-container", className), children: [
19100    /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white rounded-mec-lg shadow-card", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
19101      UnifiedTabs,
19102      {
19103        tabs: [
19104          {
19105            id: "locations",
19106            label: "Standorte",
19107            count: filteredLocations.length,
19108            icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Building2, { className: "w-4 h-4 sm:w-5 sm:h-5" })
19109          },
19110          {
19111            id: "contacts",
19112            label: "Kontakte",
19113            count: filteredContacts.length,
19114            icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "w-4 h-4 sm:w-5 sm:h-5" })
19115          }
19116        ],
19117        activeTab,
19118        onTabChange: (tabId) => setActiveTab(tabId),
19119        variant: "underline",
19120        fullWidth: true
19121      }
19122    ) }),
19123    /* @__PURE__ */ jsxRuntimeExports.jsx(
19124      SafeFilterBar,
19125      {
19126        searchQuery,
19127        onSearchChange: setSearchQuery,
19128        className: "shadow-card"
19129      }
19130    ),
19131    /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white rounded-mec-lg shadow-card", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-6 scroll-container", children: activeTab === "locations" ? (
19132      // Locations Tab
19133      filteredLocations.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-center py-8 text-text-muted", children: searchQuery ? "Keine Handelsimmobilien gefunden" : "Keine Handelsimmobilien verfügbar" }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx(
19134        contactLayout === "grid" ? "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 items-stretch" : "space-y-2"
19135      ), children: filteredLocations.map((location) => /* @__PURE__ */ jsxRuntimeExports.jsx(
19136        LocationMiniGridCard,
19137        {
19138          location,
19139          onClick: handleLocationClick,
19140          className: "h-full"
19141        },
19142        location.id
19143      )) })
19144    ) : (
19145      // Contacts Tab
19146      filteredContacts.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-center py-8 text-text-muted", children: searchQuery ? "Keine Ansprechpartner gefunden" : "Keine Ansprechpartner verfügbar" }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx(
19147        contactLayout === "grid" ? "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 items-stretch" : "space-y-2"
19148      ), children: filteredContacts.map((contact) => /* @__PURE__ */ jsxRuntimeExports.jsx(
19149        UnifiedContactCard,
19150        {
19151          contact,
19152          onClick: handleContactClick,
19153          variant: contactLayout === "grid" ? "default" : "compact",
19154          showLocation: false
19155        },
19156        contact.id
19157      )) })
19158    ) }) })
19159  ] });
19160};
19161const Modal = ({
19162  isOpen,
19163  onClose,
19164  title,
19165  children,
19166  size = "md",
19167  className,
19168  closeOnOverlayClick = true,
19169  closeOnEscape = true,
19170  showCloseButton = true
19171}) => {
19172  const modalRef = reactExports.useRef(null);
19173  const previousActiveElement = reactExports.useRef(null);
19174  reactExports.useEffect(() => {
19175    if (!closeOnEscape) return;
19176    const handleEscape = (e) => {
19177      if (e.key === "Escape" && isOpen) {
19178        onClose();
19179      }
19180    };
19181    document.addEventListener("keydown", handleEscape);
19182    return () => document.removeEventListener("keydown", handleEscape);
19183  }, [isOpen, onClose, closeOnEscape]);
19184  reactExports.useEffect(() => {
19185    if (isOpen) {
19186      previousActiveElement.current = document.activeElement;
19187      modalRef.current?.focus();
19188      document.body.style.overflow = "hidden";
19189    } else {
19190      if (previousActiveElement.current) {
19191        previousActiveElement.current.focus();
19192      }
19193      document.body.style.overflow = "";
19194    }
19195    return () => {
19196      document.body.style.overflow = "";
19197    };
19198  }, [isOpen]);
19199  const handleOverlayClick = (e) => {
19200    if (closeOnOverlayClick && e.target === e.currentTarget) {
19201      onClose();
19202    }
19203  };
19204  if (!isOpen) return null;
19205  const sizeClasses2 = {
19206    sm: "max-w-md",
19207    md: "max-w-lg",
19208    lg: "max-w-2xl",
19209    xl: "max-w-4xl",
19210    full: "max-w-full"
19211  };
19212  const modalContent = /* @__PURE__ */ jsxRuntimeExports.jsxs(
19213    "div",
19214    {
19215      className: clsx(
19216        "fixed inset-0 z-50 flex items-center justify-center",
19217        // Mobile: Fullscreen, Desktop: Centered with padding
19218        "p-0 sm:p-4 md:p-6"
19219      ),
19220      onClick: handleOverlayClick,
19221      children: [
19222        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/50 backdrop-blur-sm animate-in fade-in duration-200" }),
19223        /* @__PURE__ */ jsxRuntimeExports.jsxs(
19224          "div",
19225          {
19226            ref: modalRef,
19227            className: clsx(
19228              "relative bg-white shadow-modal flex flex-col",
19229              "animate-in zoom-in-95 slide-in-from-bottom-2 duration-200",
19230              // Full size: Always fullscreen, Others: Mobile fullscreen, Desktop rounded with max-height
19231              size === "full" ? "h-full w-full" : "h-full w-full sm:h-auto sm:max-h-[calc(100vh-3rem)] sm:rounded-mec-lg md:max-h-[calc(100vh-4rem)]",
19232              sizeClasses2[size],
19233              className
19234            ),
19235            tabIndex: -1,
19236            role: "dialog",
19237            "aria-modal": "true",
19238            "aria-labelledby": title ? "modal-title" : void 0,
19239            children: [
19240              (title || showCloseButton) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-shrink-0 flex items-center justify-between p-4 sm:p-6 border-b border-background-tertiary bg-white z-10", children: [
19241                title && /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { id: "modal-title", className: "text-lg sm:text-xl font-semibold text-text-primary", children: title }),
19242                showCloseButton && /* @__PURE__ */ jsxRuntimeExports.jsx(
19243                  "button",
19244                  {
19245                    onClick: onClose,
19246                    className: "p-2 -mr-2 text-text-muted hover:text-text-primary hover:bg-background-secondary rounded-mec transition-colors",
19247                    "aria-label": "Modal schließen",
19248                    children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "w-5 h-5" })
19249                  }
19250                )
19251              ] }),
19252              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 overflow-y-auto overflow-x-hidden", children })
19253            ]
19254          }
19255        )
19256      ]
19257    }
19258  );
19259  return reactDomExports.createPortal(modalContent, document.body);
19260};
19261function parseMietflaeche(value) {
19262  if (value == null || value === "") return null;
19263  let num;
19264  if (typeof value === "string") {
19265    const trimmed = value.trim().replace(/\s/g, "");
19266    if (!trimmed) return null;
19267    if (/^\d{1,3}(\.\d{3})+(,\d+)?$/.test(trimmed)) {
19268      num = Number.parseFloat(trimmed.replace(/\./g, "").replace(",", "."));
19269    } else if (trimmed.includes(",") && !trimmed.includes(".")) {
19270      num = Number.parseFloat(trimmed.replace(",", "."));
19271    } else {
19272      num = Number.parseFloat(trimmed);
19273    }
19274  } else {
19275    num = Number(value);
19276  }
19277  if (!Number.isFinite(num) || num <= 0) return null;
19278  if (num < 1e3) return Math.round(num * 1e3);
19279  return Math.round(num);
19280}
19281function formatMietflaeche(value) {
19282  const sqm = parseMietflaeche(value);
19283  if (sqm == null) return "";
19284  return sqm.toLocaleString("de-DE", { maximumFractionDigits: 0 });
19285}
19286const LocationModalHero = ({
19287  location,
19288  centerData
19289}) => {
19290  const handleCenterLinkClick = () => {
19291    const centerLink = location.centerlink || location.centerLink;
19292    if (centerLink) {
19293      window.open(centerLink, "_blank", "noopener,noreferrer");
19294    }
19295  };
19296  const getImageUrl = () => {
19297    return location.heroimage || location.heroImage || location.image || location.logo || "/assets/placeholder-location.jpg";
19298  };
19299  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative h-full flex flex-col overflow-y-auto", children: [
19300    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative w-full h-[25vh] md:h-[45vh] min-h-[200px] md:min-h-[300px] flex-shrink-0", children: [
19301      /* @__PURE__ */ jsxRuntimeExports.jsx(
19302        "img",
19303        {
19304          src: getImageUrl(),
19305          alt: location.name,
19306          className: "w-full h-full object-cover"
19307        }
19308      ),
19309      location.logo && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute top-4 right-4 md:top-6 md:right-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white/90 backdrop-blur-sm rounded-lg p-2 md:p-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
19310        "img",
19311        {
19312          src: location.logo,
19313          alt: `${location.name} Logo`,
19314          className: "h-8 md:h-12 w-auto object-contain"
19315        }
19316      ) }) })
19317    ] }),
19318    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 p-4 md:p-6 lg:p-8 flex flex-col bg-mec-secondary overflow-y-auto", children: [
19319      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4 md:mb-6 lg:mb-8", children: [
19320        /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl md:text-3xl lg:text-4xl font-bold mb-1 md:mb-2 leading-tight text-white", children: location.name }),
19321        /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg md:text-xl lg:text-2xl text-white/90", children: location.city })
19322      ] }),
19323      (centerData.vermietbareFlaeche || centerData.anzahlShops || centerData.verkaufsebenen) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4 md:mb-6 lg:mb-8", children: [
19324        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "block md:hidden space-y-3", children: [
19325          centerData.vermietbareFlaeche && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/10 backdrop-blur-sm rounded-lg p-4 text-center flex flex-col justify-center", children: [
19326            /* @__PURE__ */ jsxRuntimeExports.jsx(Building2, { className: "w-6 h-6 text-white mx-auto mb-2" }),
19327            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-lg font-bold text-white mb-1", children: [
19328              formatMietflaeche(centerData.vermietbareFlaeche),
19329              "m²"
19330            ] }),
19331            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-white/80 leading-tight", children: "Vermietbare Fläche" })
19332          ] }),
19333          (centerData.anzahlShops || centerData.verkaufsebenen) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
19334            centerData.anzahlShops && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/10 backdrop-blur-sm rounded-lg p-4 text-center flex flex-col justify-center", children: [
19335              /* @__PURE__ */ jsxRuntimeExports.jsx(ShoppingBag, { className: "w-6 h-6 text-white mx-auto mb-2" }),
19336              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-lg font-bold text-white mb-1", children: centerData.anzahlShops }),
19337              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-white/80", children: "Mietflächen" })
19338            ] }),
19339            centerData.verkaufsebenen && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/10 backdrop-blur-sm rounded-lg p-4 text-center flex flex-col justify-center", children: [
19340              /* @__PURE__ */ jsxRuntimeExports.jsx(Layers, { className: "w-6 h-6 text-white mx-auto mb-2" }),
19341              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-lg font-bold text-white mb-1", children: centerData.verkaufsebenen }),
19342              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-white/80", children: "Verkaufsebenen" })
19343            ] })
19344          ] })
19345        ] }),
19346        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hidden md:grid md:grid-cols-3 md:gap-4 lg:gap-6 overflow-hidden", children: [
19347          centerData.vermietbareFlaeche && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/10 backdrop-blur-sm rounded-lg p-5 lg:p-6 text-center flex flex-col justify-center min-w-0", children: [
19348            /* @__PURE__ */ jsxRuntimeExports.jsx(Building2, { className: "w-8 h-8 lg:w-10 lg:h-10 text-white mx-auto mb-3 flex-shrink-0" }),
19349            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-2xl lg:text-3xl font-bold text-white mb-1 break-words", children: [
19350              formatMietflaeche(centerData.vermietbareFlaeche),
19351              "m²"
19352            ] }),
19353            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm lg:text-base text-white/80 leading-tight", children: "Vermietbare Fläche" })
19354          ] }),
19355          centerData.anzahlShops && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/10 backdrop-blur-sm rounded-lg p-5 lg:p-6 text-center flex flex-col justify-center min-w-0", children: [
19356            /* @__PURE__ */ jsxRuntimeExports.jsx(ShoppingBag, { className: "w-8 h-8 lg:w-10 lg:h-10 text-white mx-auto mb-3 flex-shrink-0" }),
19357            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-2xl lg:text-3xl font-bold text-white mb-1 break-words", children: centerData.anzahlShops }),
19358            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm lg:text-base text-white/80", children: "Mietflächen" })
19359          ] }),
19360          centerData.verkaufsebenen && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/10 backdrop-blur-sm rounded-lg p-5 lg:p-6 text-center flex flex-col justify-center min-w-0", children: [
19361            /* @__PURE__ */ jsxRuntimeExports.jsx(Layers, { className: "w-8 h-8 lg:w-10 lg:h-10 text-white mx-auto mb-3 flex-shrink-0" }),
19362            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-2xl lg:text-3xl font-bold text-white mb-1 break-words", children: centerData.verkaufsebenen }),
19363            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm lg:text-base text-white/80", children: "Verkaufsebenen" })
19364          ] })
19365        ] })
19366      ] }),
19367      (location.centerlink || location.centerLink) && /* @__PURE__ */ jsxRuntimeExports.jsxs(
19368        "button",
19369        {
19370          onClick: handleCenterLinkClick,
19371          className: "inline-flex items-center justify-center w-full md:w-auto px-6 py-3.5 md:py-3 bg-mec-primary hover:bg-mec-primary-dark active:bg-mec-primary-dark text-white font-semibold rounded-lg transition-colors duration-200 min-h-[48px] text-base md:text-base",
19372          children: [
19373            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Zum Center" }),
19374            /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "w-5 h-5 md:w-4 md:h-4 ml-2" })
19375          ]
19376        }
19377      )
19378    ] })
19379  ] });
19380};
19381const LocationModalInfo = ({
19382  location
19383}) => {
19384  const [showFullDescription, setShowFullDescription] = reactExports.useState(false);
19385  const handleEmailClick = () => {
19386    if (location.email) {
19387      window.location.href = `mailto:${location.email}`;
19388    }
19389  };
19390  const handlePhoneClick = () => {
19391    if (location.phone) {
19392      window.location.href = `tel:${location.phone}`;
19393    }
19394  };
19395  const handleWebsiteClick = () => {
19396    if (location.website) {
19397      window.open(location.website, "_blank", "noopener,noreferrer");
19398    }
19399  };
19400  const description = location.description || "";
19401  const shouldTruncate = description.length > 200;
19402  const displayDescription = shouldTruncate && !showFullDescription ? description.substring(0, 200) + "..." : description;
19403  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-full flex flex-col", children: [
19404    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-shrink-0 p-6 border-b border-background-tertiary", children: [
19405      /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-text-primary", children: location.name }),
19406      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-text-secondary mt-1", children: location.city })
19407    ] }),
19408    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 overflow-y-auto p-6 space-y-8", children: [
19409      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
19410        /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-lg font-semibold text-text-primary mb-4 flex items-center", children: [
19411          /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-5 h-5 mr-2 text-mec-primary" }),
19412          "Adresse"
19413        ] }),
19414        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-background-secondary rounded-lg p-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
19415          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-text-primary", children: location.name }),
19416          location.address && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: location.address }),
19417          /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-text-secondary", children: [
19418            (location.postalcode || location.postalCode) && `${location.postalcode || location.postalCode} `,
19419            location.city,
19420            location.country && location.country !== "Deutschland" && `, ${location.country}`
19421          ] })
19422        ] }) })
19423      ] }),
19424      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
19425        /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-4", children: "Kontakt" }),
19426        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
19427          location.email && /* @__PURE__ */ jsxRuntimeExports.jsxs(
19428            "button",
19429            {
19430              onClick: handleEmailClick,
19431              className: "flex items-center space-x-3 w-full text-left p-3 rounded-lg hover:bg-background-secondary active:bg-background-tertiary transition-colors min-h-[60px]",
19432              children: [
19433                /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-12 h-12 bg-mec-primary/10 rounded-full flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-6 h-6 text-mec-primary" }) }),
19434                /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
19435                  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-muted mb-0.5", children: "E-Mail" }),
19436                  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-mec-primary font-medium truncate", children: location.email })
19437                ] })
19438              ]
19439            }
19440          ),
19441          location.phone && /* @__PURE__ */ jsxRuntimeExports.jsxs(
19442            "button",
19443            {
19444              onClick: handlePhoneClick,
19445              className: "flex items-center space-x-3 w-full text-left p-3 rounded-lg hover:bg-background-secondary active:bg-background-tertiary transition-colors min-h-[60px]",
19446              children: [
19447                /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-12 h-12 bg-mec-primary/10 rounded-full flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-6 h-6 text-mec-primary" }) }),
19448                /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
19449                  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-muted mb-0.5", children: "Telefon" }),
19450                  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-mec-primary font-medium", children: location.phone })
19451                ] })
19452              ]
19453            }
19454          ),
19455          location.website && /* @__PURE__ */ jsxRuntimeExports.jsxs(
19456            "button",
19457            {
19458              onClick: handleWebsiteClick,
19459              className: "flex items-center space-x-3 w-full text-left p-3 rounded-lg hover:bg-background-secondary active:bg-background-tertiary transition-colors min-h-[60px]",
19460              children: [
19461                /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-12 h-12 bg-mec-primary/10 rounded-full flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Globe, { className: "w-6 h-6 text-mec-primary" }) }),
19462                /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
19463                  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-muted mb-0.5", children: "Website" }),
19464                  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-mec-primary font-medium truncate", children: location.website.replace(/^https?:\/\//, "") })
19465                ] })
19466              ]
19467            }
19468          )
19469        ] })
19470      ] }),
19471      description && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
19472        /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-4", children: "Beschreibung" }),
19473        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background-secondary rounded-lg p-4", children: [
19474          /* @__PURE__ */ jsxRuntimeExports.jsx(
19475            "div",
19476            {
19477              className: "text-text-secondary leading-relaxed",
19478              dangerouslySetInnerHTML: { __html: displayDescription }
19479            }
19480          ),
19481          shouldTruncate && /* @__PURE__ */ jsxRuntimeExports.jsx(
19482            "button",
19483            {
19484              onClick: () => setShowFullDescription(!showFullDescription),
19485              className: "mt-3 inline-flex items-center text-mec-primary hover:text-mec-primary-dark font-medium text-sm transition-colors",
19486              children: showFullDescription ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
19487                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Weniger anzeigen" }),
19488                /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronUp, { className: "w-4 h-4 ml-1" })
19489              ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
19490                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Mehr anzeigen" }),
19491                /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "w-4 h-4 ml-1" })
19492              ] })
19493            }
19494          )
19495        ] })
19496      ] }),
19497      (location.openingdate || location.openingDate || location.parkingspaces || location.parkingSpaces) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
19498        /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-4", children: "Weitere Informationen" }),
19499        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background-secondary rounded-lg p-4 space-y-3", children: [
19500          (location.openingdate || location.openingDate) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
19501            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-muted", children: "Eröffnung" }),
19502            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-text-primary", children: new Date(location.openingdate || location.openingDate).getFullYear() })
19503          ] }),
19504          (location.parkingspaces || location.parkingSpaces) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
19505            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-muted", children: "Parkplätze" }),
19506            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-text-primary", children: location.parkingspaces || location.parkingSpaces })
19507          ] })
19508        ] })
19509      ] })
19510    ] })
19511  ] });
19512};
19513const LocationModalContacts = ({
19514  location,
19515  contacts,
19516  isLoading
19517}) => {
19518  const { open: openContactModal } = useContactModal();
19519  const locationContacts = contacts.filter((contact) => {
19520    const hasLocationId = contact.locationId === location.id;
19521    return hasLocationId;
19522  });
19523  if (isLoading) {
19524    return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-full flex flex-col", children: [
19525      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-shrink-0 p-6 border-b border-background-tertiary", children: [
19526        /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-text-primary", children: "Ansprechpartner" }),
19527        /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-text-secondary mt-1", children: location.name })
19528      ] }),
19529      /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
19530        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "animate-spin rounded-full h-12 w-12 border-b-2 border-mec-primary mx-auto mb-4" }),
19531        /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-muted", children: "Lade Ansprechpartner..." })
19532      ] }) })
19533    ] });
19534  }
19535  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-full flex flex-col", children: [
19536    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-shrink-0 p-6 border-b border-background-tertiary", children: [
19537      /* @__PURE__ */ jsxRuntimeExports.jsxs("h2", { className: "text-2xl font-bold text-text-primary", children: [
19538        "Kontakte (",
19539        locationContacts.length,
19540        ")"
19541      ] }),
19542      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-text-secondary mt-1", children: location.name })
19543    ] }),
19544    /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 overflow-y-auto", children: locationContacts.length > 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-4 md:p-6", children: [
19545      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4 md:mb-6", children: [
19546        /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-lg font-semibold text-text-primary mb-2 flex items-center", children: [
19547          /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-5 h-5 mr-2 text-mec-primary" }),
19548          "Ihr Ansprechpartner"
19549        ] }),
19550        /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-text-muted", children: [
19551          locationContacts.length,
19552          " Ansprechpartner an diesem Standort"
19553        ] })
19554      ] }),
19555      /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3 md:gap-4 items-stretch", children: locationContacts.map((contact) => /* @__PURE__ */ jsxRuntimeExports.jsx(
19556        ContactCard,
19557        {
19558          contact,
19559          onClick: openContactModal,
19560          variant: "default",
19561          className: "w-full",
19562          showLocation: false
19563        },
19564        contact.id
19565      )) })
19566    ] }) : (
19567      /* Empty State */
19568      /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 flex items-center justify-center p-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center max-w-md", children: [
19569        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-background-secondary rounded-full flex items-center justify-center mx-auto mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "w-8 h-8 text-text-muted" }) }),
19570        /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Keine Ansprechpartner verfügbar" }),
19571        /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-muted text-sm leading-relaxed", children: "Für diesen Standort sind aktuell keine direkten Ansprechpartner hinterlegt. Nutzen Sie die allgemeinen Kontaktdaten des Standorts." })
19572      ] }) })
19573    ) })
19574  ] });
19575};
19576const OfflineFallback = ({
19577  message = "Diese Daten sind offline nicht verfügbar",
19578  onRetry
19579}) => {
19580  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center p-8 text-center", children: [
19581    /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-yellow-100 rounded-full flex items-center justify-center mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(WifiOff, { className: "w-8 h-8 text-yellow-600" }) }),
19582    /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Offline-Modus" }),
19583    /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mb-4 max-w-md", children: message }),
19584    onRetry && /* @__PURE__ */ jsxRuntimeExports.jsxs(
19585      "button",
19586      {
19587        onClick: onRetry,
19588        className: "flex items-center space-x-2 px-4 py-2 bg-mec-primary text-white rounded-lg hover:bg-mec-primary-dark transition-colors",
19589        children: [
19590          /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "w-4 h-4" }),
19591          /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Erneut versuchen" })
19592        ]
19593      }
19594    ),
19595    /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-text-muted mt-4", children: "Öffnen Sie diese Seite online, um die Daten zu laden" })
19596  ] });
19597};
19598const LocationContactModal = () => {
19599  const { isOpen, locationId, close } = useLocationModal();
19600  const [activeView, setActiveView] = reactExports.useState("hero");
19601  reactExports.useEffect(() => {
19602    if (locationId) {
19603      setActiveView("hero");
19604    }
19605  }, [locationId]);
19606  const onClose = close;
19607  const { data: location, isLoading: locationLoading, error: locationError } = useLocation(locationId);
19608  const { contacts, locationSpecificCount, isLoading: contactsLoading } = useFilteredContacts(locationId || void 0);
19609  if (!isOpen || !locationId) return null;
19610  const isLoading = locationLoading || contactsLoading;
19611  const hasError = locationError || !location;
19612  if (isLoading) {
19613    return /* @__PURE__ */ jsxRuntimeExports.jsx(
19614      Modal,
19615      {
19616        isOpen,
19617        onClose,
19618        title: "Lade Standort...",
19619        size: "full",
19620        children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-96", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "animate-spin rounded-full h-12 w-12 border-b-2 border-mec-primary" }) })
19621      }
19622    );
19623  }
19624  if (hasError) {
19625    const isOfflineError = !navigator.onLine || locationError?.status === 503;
19626    return /* @__PURE__ */ jsxRuntimeExports.jsx(
19627      Modal,
19628      {
19629        isOpen,
19630        onClose,
19631        title: isOfflineError ? "Offline-Modus" : "Fehler",
19632        size: "full",
19633        children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-96", children: isOfflineError ? /* @__PURE__ */ jsxRuntimeExports.jsx(
19634          OfflineFallback,
19635          {
19636            message: "Dieser Standort wurde noch nicht offline gespeichert. Öffnen Sie ihn online, um die Daten zu cachen.",
19637            onRetry: () => window.location.reload()
19638          }
19639        ) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
19640          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-muted mb-4", children: "Standort konnte nicht geladen werden." }),
19641          /* @__PURE__ */ jsxRuntimeExports.jsx(
19642            "button",
19643            {
19644              onClick: onClose,
19645              className: "btn-primary",
19646              children: "Schließen"
19647            }
19648          )
19649        ] }) })
19650      }
19651    );
19652  }
19653  const getCenterData = () => {
19654    console.log("🔍 DEBUG: Full location object:", location);
19655    const rentableArea = location.rentableArea || location.rentablearea;
19656    const shopCount = location.shopCount || location.shopcount;
19657    const salesLevels = location.salesLevels || location.saleslevels;
19658    if (rentableArea || shopCount || salesLevels) {
19659      console.log("✅ Using database fields:", {
19660        rentableArea,
19661        shopCount,
19662        salesLevels
19663      });
19664      return {
19665        vermietbareFlaeche: rentableArea,
19666        anzahlShops: shopCount,
19667        verkaufsebenen: salesLevels
19668      };
19669    }
19670    const wpData = location.wpData;
19671    if (wpData && wpData.acf) {
19672      console.log("🔍 DEBUG: wpData:", wpData);
19673      console.log("🔍 DEBUG: ACF fields:", wpData.acf);
19674      const acf = wpData.acf;
19675      const centerData2 = {
19676        vermietbareFlaeche: acf["center-grunddaten-vermietbare-flaeche"],
19677        anzahlShops: acf["center-grunddaten-anzahl-shops"],
19678        verkaufsebenen: acf["center-grunddaten-verkaufsebenen"]
19679      };
19680      console.log("🔍 DEBUG: Extracted center data:", centerData2);
19681      return centerData2;
19682    }
19683    console.log("❌ No wpData and no database fields found");
19684    return {};
19685  };
19686  const centerData = getCenterData();
19687  const locationContacts = contacts || [];
19688  const navigationItems = [
19689    {
19690      id: "hero",
19691      label: "Übersicht",
19692      icon: Home,
19693      description: "Hero-Ansicht mit Stats"
19694    },
19695    {
19696      id: "info",
19697      label: "Info",
19698      icon: Building2,
19699      description: "Adresse und Details"
19700    },
19701    {
19702      id: "contacts",
19703      label: "Kontakte",
19704      icon: Users,
19705      count: locationSpecificCount,
19706      // Use location-specific count instead of total
19707      description: "Lokale Kontakte"
19708    }
19709  ];
19710  const currentNavItem = navigationItems.find((item) => item.id === activeView);
19711  return /* @__PURE__ */ jsxRuntimeExports.jsx(
19712    Modal,
19713    {
19714      isOpen,
19715      onClose,
19716      title: "",
19717      size: "full",
19718      className: "p-0",
19719      showCloseButton: false,
19720      children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-full flex flex-col", children: [
19721        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-shrink-0 bg-white border-b border-background-tertiary relative z-20", children: [
19722          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between p-4 min-h-[60px]", children: [
19723            activeView !== "hero" && /* @__PURE__ */ jsxRuntimeExports.jsxs(
19724              "button",
19725              {
19726                onClick: () => setActiveView("hero"),
19727                className: "flex items-center text-mec-primary hover:text-mec-primary-dark transition-colors p-2 -ml-2 min-w-[44px] min-h-[44px]",
19728                children: [
19729                  /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronLeft, { className: "w-6 h-6 mr-1" }),
19730                  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-base", children: "Zurück" })
19731                ]
19732              }
19733            ),
19734            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 text-center px-2", children: [
19735              /* @__P
19735URE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg md:text-xl font-semibold text-text-primary", children: currentNavItem?.label }),
19736              currentNavItem?.count !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-sm text-text-muted", children: [
19737                "(",
19738                currentNavItem.count,
19739                ")"
19740              ] })
19741            ] }),
19742            /* @__PURE__ */ jsxRuntimeExports.jsx(
19743              "button",
19744              {
19745                onClick: onClose,
19746                className: "p-2 hover:bg-background-secondary rounded-full transition-colors min-w-[44px] min-h-[44px] flex items-center justify-center",
19747                "aria-label": "Schließen",
19748                children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "w-6 h-6" })
19749              }
19750            )
19751          ] }),
19752          activeView === "hero" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-3 pb-3 md:px-4 md:pb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-3 gap-2 md:gap-3", children: navigationItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
19753            "button",
19754            {
19755              onClick: () => setActiveView(item.id),
19756              className: `
19757                      p-3 md:p-3 rounded-lg text-center transition-all duration-200
19758                      min-h-[68px] md:min-h-[auto]
19759                      active:scale-95 touch-manipulation
19760                      ${item.id === activeView ? "bg-mec-primary text-white shadow-md" : "bg-background-secondary hover:bg-background-tertiary text-text-secondary hover:text-text-primary"}
19761                    `,
19762              children: [
19763                /* @__PURE__ */ jsxRuntimeExports.jsx(item.icon, { className: "w-5 h-5 md:w-5 md:h-5 mx-auto mb-1" }),
19764                /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs md:text-sm font-medium leading-tight px-1", children: [
19765                  item.label,
19766                  item.count !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "block text-xs mt-0.5", children: [
19767                    "(",
19768                    item.count,
19769                    ")"
19770                  ] })
19771                ] })
19772              ]
19773            },
19774            item.id
19775          )) }) })
19776        ] }),
19777        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-h-0 overflow-hidden", children: [
19778          activeView === "hero" && /* @__PURE__ */ jsxRuntimeExports.jsx(
19779            LocationModalHero,
19780            {
19781              location,
19782              centerData
19783            }
19784          ),
19785          activeView === "info" && /* @__PURE__ */ jsxRuntimeExports.jsx(
19786            LocationModalInfo,
19787            {
19788              location
19789            }
19790          ),
19791          activeView === "contacts" && /* @__PURE__ */ jsxRuntimeExports.jsx(
19792            LocationModalContacts,
19793            {
19794              location,
19795              contacts: locationContacts,
19796              isLoading: contactsLoading
19797            }
19798          )
19799        ] })
19800      ] })
19801    }
19802  );
19803};
19804const LocationMiniCard = ({ location, onClick }) => {
19805  const handleClick = () => {
19806    console.log("🏢 LocationMiniCard - clicked:", location.name, location.id);
19807    onClick();
19808  };
19809  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
19810    "button",
19811    {
19812      onClick: handleClick,
19813      className: "w-full flex items-center gap-4 p-4 rounded-lg transition-all hover:bg-white/70 active:bg-white/90 min-h-[60px]",
19814      style: { backgroundColor: "rgba(255, 255, 255, 0.5)" },
19815      children: [
19816        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-shrink-0 w-16 h-16 md:w-20 md:h-20 rounded-lg overflow-hidden bg-white shadow-sm border border-gray-100", children: location.logo || location.heroImage ? /* @__PURE__ */ jsxRuntimeExports.jsx(
19817          "img",
19818          {
19819            src: location.logo || location.heroImage,
19820            alt: location.name,
19821            className: "w-full h-full object-contain p-2"
19822          }
19823        ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-full h-full flex items-center justify-center", style: { backgroundColor: "#E0E6EB" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-8 h-8 md:w-10 md:h-10", style: { color: "#d20028" } }) }) }),
19824        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0 text-left", children: [
19825          /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-semibold text-base md:text-lg truncate mb-1", style: { color: "#28323c" }, children: location.name }),
19826          /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm md:text-base truncate", style: { color: "#6b7280" }, children: [
19827            location.city,
19828            location.address && ` • ${location.address}`
19829          ] })
19830        ] }),
19831        /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "flex-shrink-0 w-5 h-5 md:w-6 md:h-6", style: { color: "#d20028" } })
19832      ]
19833    }
19834  );
19835};
19836const ContactModal = () => {
19837  const { isOpen, contact, close } = useContactModal();
19838  const { open: openLocationModal } = useLocationModal();
19839  const { data: contactLocations, isLoading: locationsLoading, error: locationsError } = useContactLocations(contact?.id || null);
19840  console.log("🔍 ContactModal - contact:", contact);
19841  console.log("🔍 ContactModal - contactLocations:", contactLocations);
19842  console.log("🔍 ContactModal - locationsLoading:", locationsLoading);
19843  console.log("🔍 ContactModal - locationsError:", locationsError);
19844  if (!contact) return null;
19845  const handleEmailClick = (e) => {
19846    e?.stopPropagation();
19847    window.location.href = `mailto:${contact.email}`;
19848  };
19849  const handlePhoneClick = (e) => {
19850    e?.stopPropagation();
19851    if (contact.phone) {
19852      window.location.href = `tel:${contact.phone}`;
19853    }
19854  };
19855  const handleLocationClick = (locationId) => {
19856    console.log("🎯 ContactModal - handleLocationClick called with:", locationId);
19857    console.log("🔄 ContactModal - closing contact modal...");
19858    close();
19859    console.log("🚀 ContactModal - opening location modal...");
19860    openLocationModal(locationId);
19861  };
19862  const hasMultipleLocations = contactLocations && contactLocations.length > 1;
19863  const hasSingleLocation = contactLocations && contactLocations.length === 1;
19864  return /* @__PURE__ */ jsxRuntimeExports.jsx(
19865    Modal,
19866    {
19867      isOpen,
19868      onClose: close,
19869      title: "",
19870      size: "lg",
19871      className: "p-0",
19872      showCloseButton: true,
19873      children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white", style: { fontFamily: "Helvetica Neue, Arial, sans-serif" }, children: [
19874        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-full h-[5px]", style: { backgroundColor: "#d20028" } }),
19875        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative w-full h-[24rem] sm:h-[26rem] md:h-[28rem]", children: contact.image ? /* @__PURE__ */ jsxRuntimeExports.jsx(
19876          "img",
19877          {
19878            src: contact.image,
19879            alt: contact.fullName,
19880            className: "w-full h-full object-cover"
19881          }
19882        ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-full h-full bg-gray-200 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(User, { className: "w-12 h-12 md:w-16 md:h-16 text-gray-400" }) }) }),
19883        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-4 md:p-6 lg:p-8", style: { backgroundColor: "#E0E6EB" }, children: [
19884          /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm md:text-base mb-2", style: { color: "#28323c" }, children: [
19885            contact.position,
19886            contact.department && ` • ${contact.department}`
19887          ] }),
19888          /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl md:text-3xl lg:text-4xl font-semibold mb-4 md:mb-6", style: { color: "#28323c" }, children: contact.fullName }),
19889          locationsLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-6 p-4 md:p-5 rounded-lg", style: { backgroundColor: "rgba(255, 255, 255, 0.5)" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-3", children: [
19890            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "animate-spin rounded-full h-5 w-5 border-b-2", style: { borderColor: "#d20028" } }),
19891            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm", style: { color: "#6b7280" }, children: "Lade Standorte..." })
19892          ] }) }) : locationsError ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-6 p-4 md:p-5 rounded-lg", style: { backgroundColor: "rgba(255, 0, 0, 0.1)" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm", style: { color: "#d20028" }, children: "Fehler beim Laden der Standorte" }) }) : hasMultipleLocations ? (
19893            /* Multiple Locations - Show as Mini Cards */
19894            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-6", children: [
19895              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2 mb-3", children: [
19896                /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-5 h-5 md:w-6 md:h-6", style: { color: "#d20028" } }),
19897                /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "font-semibold text-base md:text-lg", style: { color: "#28323c" }, children: [
19898                  "Zugewiesene Standorte (",
19899                  contactLocations.length,
19900                  ")"
19901                ] })
19902              ] }),
19903              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-2", children: contactLocations.map((location) => /* @__PURE__ */ jsxRuntimeExports.jsx(
19904                LocationMiniCard,
19905                {
19906                  location,
19907                  onClick: () => handleLocationClick(location.id)
19908                },
19909                location.id
19910              )) })
19911            ] })
19912          ) : hasSingleLocation ? (
19913            /* Single Location - Show as before */
19914            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-6 p-4 md:p-5 rounded-lg", style: { backgroundColor: "rgba(255, 255, 255, 0.5)" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start space-x-3", children: [
19915              /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-5 h-5 md:w-6 md:h-6 flex-shrink-0 mt-1", style: { color: "#d20028" } }),
19916              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
19917                /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-sm mb-1.5 md:mb-2", style: { color: "#6b7280" }, children: "Zugewiesener Standort" }),
19918                /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-semibold mb-1 text-base md:text-lg", style: { color: "#28323c" }, children: contactLocations[0].name }),
19919                /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm md:text-base mb-1", style: { color: "#28323c" }, children: contactLocations[0].city }),
19920                contactLocations[0].address && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-sm", style: { color: "#6b7280" }, children: contactLocations[0].address }),
19921                /* @__PURE__ */ jsxRuntimeExports.jsxs(
19922                  "button",
19923                  {
19924                    onClick: () => handleLocationClick(contactLocations[0].id),
19925                    className: "mt-3 inline-flex items-center text-sm md:text-base font-medium hover:underline active:opacity-70 min-h-[44px] md:min-h-0 py-2 md:py-0",
19926                    style: { color: "#d20028" },
19927                    children: [
19928                      /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Standort anzeigen" }),
19929                      /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-4 h-4 ml-1" })
19930                    ]
19931                  }
19932                )
19933              ] })
19934            ] }) })
19935          ) : null,
19936          contact.specialties && contact.specialties.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-5 md:mb-6", children: [
19937            /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm md:text-base font-medium mb-3", style: { color: "#28323c" }, children: "Fachbereiche" }),
19938            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-2", children: contact.specialties.map((specialty, index) => /* @__PURE__ */ jsxRuntimeExports.jsx(
19939              "span",
19940              {
19941                className: "px-3 py-2 text-sm md:text-base font-medium rounded-lg",
19942                style: { backgroundColor: "#d20028", color: "white" },
19943                children: specialty
19944              },
19945              index
19946            )) })
19947          ] }),
19948          contact.languages && contact.languages.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-5 md:mb-6", children: [
19949            /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm md:text-base font-medium mb-3", style: { color: "#28323c" }, children: "Sprachen" }),
19950            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-2", children: contact.languages.map((language, index) => /* @__PURE__ */ jsxRuntimeExports.jsx(
19951              "span",
19952              {
19953                className: "px-3 py-2 text-sm md:text-base rounded-lg",
19954                style: { backgroundColor: "#a3b2c2", color: "white" },
19955                children: language
19956              },
19957              index
19958            )) })
19959          ] }),
19960          contact.bio && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-5 md:mb-6", children: [
19961            /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm md:text-base font-medium mb-3", style: { color: "#28323c" }, children: "Über mich" }),
19962            /* @__PURE__ */ jsxRuntimeExports.jsx(
19963              "div",
19964              {
19965                className: "text-sm md:text-base leading-relaxed prose prose-sm max-w-none",
19966                style: { color: "#28323c" },
19967                dangerouslySetInnerHTML: { __html: contact.bio }
19968              }
19969            )
19970          ] }),
19971          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 md:space-y-3", children: [
19972            contact.phone && /* @__PURE__ */ jsxRuntimeExports.jsxs(
19973              "button",
19974              {
19975                onClick: handlePhoneClick,
19976                className: "flex items-center space-x-3 w-full text-left p-4 md:p-4 rounded-lg hover:bg-white/70 active:bg-white/80 transition-colors min-h-[64px] md:min-h-[60px]",
19977                style: { backgroundColor: "rgba(255, 255, 255, 0.4)" },
19978                children: [
19979                  /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-6 h-6 md:w-5 md:h-5 flex-shrink-0", style: { color: "#d20028" } }),
19980                  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
19981                    /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-xs mb-1", style: { color: "#6b7280" }, children: "Telefon" }),
19982                    /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-base md:text-base", style: { color: "#28323c" }, children: contact.phone })
19983                  ] })
19984                ]
19985              }
19986            ),
19987            contact.mobile && /* @__PURE__ */ jsxRuntimeExports.jsxs(
19988              "button",
19989              {
19990                onClick: (e) => {
19991                  e.stopPropagation();
19992                  window.location.href = `tel:${contact.mobile}`;
19993                },
19994                className: "flex items-center space-x-3 w-full text-left p-4 md:p-4 rounded-lg hover:bg-white/70 active:bg-white/80 transition-colors min-h-[64px] md:min-h-[60px]",
19995                style: { backgroundColor: "rgba(255, 255, 255, 0.4)" },
19996                children: [
19997                  /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-6 h-6 md:w-5 md:h-5 flex-shrink-0", style: { color: "#d20028" } }),
19998                  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
19999                    /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-xs mb-1", style: { color: "#6b7280" }, children: "Mobil" }),
20000                    /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-base md:text-base", style: { color: "#28323c" }, children: contact.mobile })
20001                  ] })
20002                ]
20003              }
20004            ),
20005            contact.email && /* @__PURE__ */ jsxRuntimeExports.jsxs(
20006              "button",
20007              {
20008                onClick: handleEmailClick,
20009                className: "flex items-center space-x-3 w-full text-left p-4 md:p-4 rounded-lg hover:bg-white/70 active:bg-white/80 transition-colors min-h-[64px] md:min-h-[60px]",
20010                style: { backgroundColor: "rgba(255, 255, 255, 0.4)" },
20011                children: [
20012                  /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-6 h-6 md:w-5 md:h-5 flex-shrink-0", style: { color: "#d20028" } }),
20013                  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
20014                    /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-xs mb-1", style: { color: "#6b7280" }, children: "E-Mail" }),
20015                    /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-base md:text-base truncate block", style: { color: "#28323c" }, children: contact.email })
20016                  ] })
20017                ]
20018              }
20019            )
20020          ] })
20021        ] }),
20022        contact.socialLinks && contact.socialLinks.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-4 py-5 md:px-8 md:py-6", style: { backgroundColor: "#EFF3F5" }, children: [
20023          /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm md:text-base font-medium mb-4", style: { color: "#28323c" }, children: "Social Media" }),
20024          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center flex-wrap gap-4 md:gap-6", children: contact.socialLinks.map((link, index) => {
20025            const isXing = link.platform?.toLowerCase() === "xing" || link.url?.includes("xing.com");
20026            const isLinkedIn = link.platform?.toLowerCase() === "linkedin" || link.url?.includes("linkedin.com");
20027            return /* @__PURE__ */ jsxRuntimeExports.jsxs(
20028              "a",
20029              {
20030                href: link.url,
20031                target: "_blank",
20032                rel: "noopener noreferrer",
20033                onClick: (e) => e.stopPropagation(),
20034                className: "flex items-center space-x-2 hover:opacity-70 active:opacity-50 transition-opacity min-h-[44px] py-2",
20035                style: { color: "#a3b2c2" },
20036                children: [
20037                  isXing && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
20038                    /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-7 h-7 md:w-6 md:h-6", fill: "currentColor", viewBox: "0 0 384 512", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M162.7 210c-1.8 3.3-25.2 44.4-70.1 123.5-4.9 8.3-10.8 12.5-17.7 12.5H9.8c-7.7 0-12.1-7.5-8.5-14.4l69-121.3c.2 0 .2-.1 0-.3l-43.9-75.6c-4.3-7.8.3-14.1 8.5-14.1H100c7.3 0 13.3 4.1 18 12.2l44.7 77.5zM382.6 46.1l-144 253v.3L330.2 466c3.9 7.1.2 14.1-8.5 14.1h-65.2c-7.6 0-13.6-4-18-12.2l-92.4-168.5c3.3-5.8 51.5-90.8 144.8-255.2 4.6-8.1 10.4-12.2 17.5-12.2h65.7c8 0 12.3 6.7 8.5 14.1z" }) }),
20039                    /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm md:text-sm font-medium", children: "Xing" })
20040                  ] }),
20041                  isLinkedIn && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
20042                    /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-7 h-7 md:w-6 md:h-6", fill: "currentColor", viewBox: "0 0 448 512", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z" }) }),
20043                    /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm md:text-sm font-medium", children: "LinkedIn" })
20044                  ] })
20045                ]
20046              },
20047              index
20048            );
20049          }) })
20050        ] }),
20051        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-4 py-5 md:px-8 md:py-6 bg-white border-t", style: { borderColor: "#E0E6EB" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 md:gap-4", children: [
20052          contact.email && /* @__PURE__ */ jsxRuntimeExports.jsxs(
20053            "button",
20054            {
20055              onClick: handleEmailClick,
20056              className: "flex items-center justify-center space-x-3 px-6 py-4 md:py-4 rounded-lg font-semibold text-white transition-all hover:opacity-90 active:opacity-80 shadow-md min-h-[56px] text-base md:text-base",
20057              style: { backgroundColor: "#d20028" },
20058              children: [
20059                /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-5 h-5 md:w-5 md:h-5" }),
20060                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "E-Mail senden" })
20061              ]
20062            }
20063          ),
20064          contact.phone && /* @__PURE__ */ jsxRuntimeExports.jsxs(
20065            "button",
20066            {
20067              onClick: handlePhoneClick,
20068              className: "flex items-center justify-center space-x-3 px-6 py-4 md:py-4 rounded-lg font-semibold transition-all hover:bg-gray-100 active:bg-gray-200 shadow-md min-h-[56px] text-base md:text-base",
20069              style: { backgroundColor: "#E0E6EB", color: "#28323c" },
20070              children: [
20071                /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-5 h-5 md:w-5 md:h-5" }),
20072                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Anrufen" })
20073              ]
20074            }
20075          )
20076        ] }) })
20077      ] })
20078    }
20079  );
20080};
20081const MECLogo = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='180'%20height='65.033'%20viewBox='0%200%20180%2065.033'%3e%3cg%20id='MEC_Logo'%20data-name='MEC%20Logo'%20transform='translate(0%200)'%3e%3cg%20id='MEC_Logo-2'%20data-name='MEC%20Logo'%20transform='translate(0%200)'%3e%3cpath%20id='Fill_1'%20data-name='Fill%201'%20d='M0,4.994,8.542,9.956V0Z'%20transform='translate(24.895)'%20fill='%23b30022'%3e%3c/path%3e%3cpath%20id='Fill_2'%20data-name='Fill%202'%20d='M0,0V9.956l8.023,4.661V41.8l9.888,5.744V10.406Z'%20transform='translate(33.438)'%20fill='%23d20028'%3e%3c/path%3e%3cpath%20id='Fill_3'%20data-name='Fill%203'%20d='M0,5.592l9.573,5.559V0Z'%20transform='translate(10.665%207.719)'%20fill='%23b30022'%3e%3c/path%3e%3cpath%20id='Fill_4'%20data-name='Fill%204'%20d='M16.57,9.622,0,0V11.152L8.65,16.174V42.161l7.918,4.6Z'%20transform='translate(20.236%207.718)'%20fill='%23d20028'%3e%3c/path%3e%3cpath%20id='Fill_5'%20data-name='Fill%205'%20d='M0,37.135,23.954,51.04V13.911L0,0Z'%20transform='translate(0%2012.872)'%20fill='%23d20028'%3e%3c/path%3e%3cpath%20id='Fill_6'%20data-name='Fill%206'%20d='M11.44,0l8.641,25.563h.106L28.363,0H39.8V37.174H32.193V10.83h-.1L23.033,37.174H16.77L7.712,11.09h-.1V37.174H0V0Z'%20transform='translate(65.857%2010.359)'%20fill='%2328323c'%3e%3c/path%3e%3cpath%20id='Fill_7'%20data-name='Fill%207'%20d='M27.639,0V6.871H8.127v7.966H26.034V21.19H8.127V30.3H28.052v6.874H0V0Z'%20transform='translate(112.802%2010.359)'%20fill='%2328323c'%3e%3c/path%3e%3cpath%20id='Fill_8'%20data-name='Fill%208'%20d='M25.309,10.8A8.261,8.261,0,0,0,23.5,8.746a8.443,8.443,0,0,0-5.331-1.873,9.44,9.44,0,0,0-4.658,1.066A8.846,8.846,0,0,0,10.4,10.8a12.578,12.578,0,0,0-1.733,4.087,20.533,20.533,0,0,0-.542,4.738,19.079,19.079,0,0,0,.542,4.556A12.306,12.306,0,0,0,10.4,28.165,8.907,8.907,0,0,0,13.507,31a9.415,9.415,0,0,0,4.658,1.068,7.492,7.492,0,0,0,5.82-2.291,10.606,10.606,0,0,0,2.563-6.039h7.87a19.151,19.151,0,0,1-1.6,6.3A15.129,15.129,0,0,1,29.4,34.829a14.478,14.478,0,0,1-4.968,3.021,18.1,18.1,0,0,1-6.263,1.041,18.875,18.875,0,0,1-7.635-1.482,16.374,16.374,0,0,1-5.717-4.088A18.1,18.1,0,0,1,1.24,27.2,22.6,22.6,0,0,1,0,19.627,23.391,23.391,0,0,1,1.24,11.9,18.589,18.589,0,0,1,4.812,5.674,16.343,16.343,0,0,1,10.529,1.51,18.592,18.592,0,0,1,18.165,0a18.55,18.55,0,0,1,5.772.884A15.608,15.608,0,0,1,28.8,3.462a13.913,13.913,0,0,1,3.547,4.191,15.1,15.1,0,0,1,1.759,5.726H26.239a6.76,6.76,0,0,0-.93-2.577'%20transform='translate(144.739%209.475)'%20fill='%2328323c'%3e%3c/path%3e%3c/g%3e%3c/g%3e%3c/svg%3e";
20082const Header = ({ className }) => {
20083  const handleLogoClick = () => {
20084    window.scrollTo({ top: 0, behavior: "smooth" });
20085  };
20086  const isEmbedMode = new URLSearchParams(window.location.search).get("embed") === "true";
20087  return /* @__PURE__ */ jsxRuntimeExports.jsx("header", { className: `bg-white border-b border-background-tertiary ${className || ""}`, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: isEmbedMode ? "px-3 sm:px-4 py-3 sm:py-4" : "container mx-auto px-3 sm:px-4 py-3 sm:py-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-between gap-2", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
20088    "button",
20089    {
20090      onClick: handleLogoClick,
20091      className: "flex items-center space-x-2 sm:space-x-4 min-w-0 flex-1 hover:opacity-80 transition-opacity cursor-pointer",
20092      children: [
20093        /* @__PURE__ */ jsxRuntimeExports.jsx(
20094          "img",
20095          {
20096            src: MECLogo,
20097            alt: "MEC Logo",
20098            className: "h-10 sm:h-12 w-auto object-contain flex-shrink-0",
20099            style: { fontFamily: "Helvetica Neue, Arial, sans-serif" }
20100          }
20101        ),
20102        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 text-left", children: [
20103          /* @__PURE__ */ jsxRuntimeExports.jsxs("h1", { className: "text-base sm:text-xl font-semibold truncate", style: { color: "#28323c", fontFamily: "Helvetica Neue, Arial, sans-serif" }, children: [
20104            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden sm:inline", children: "Portfolio Leasing Management" }),
20105            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sm:hidden", children: "Portfolio Leasing" })
20106          ] }),
20107          /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs sm:text-sm truncate", style: { color: "#28323c", fontFamily: "Helvetica Neue, Arial, sans-serif" }, children: [
20108            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden sm:inline", children: "Finden Sie Ihren Ansprechpartner" }),
20109            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sm:hidden", children: "Ansprechpartner" })
20110          ] })
20111        ] })
20112      ]
20113    }
20114  ) }) }) });
20115};
20116const Footer = () => {
20117  const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
20118  return /* @__PURE__ */ jsxRuntimeExports.jsx("footer", { className: "bg-slate-800 text-white mt-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-4 py-4 md:py-6", children: [
20119    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-4 md:gap-6", children: [
20120      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
20121        /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg md:text-xl font-bold mb-2 md:mb-3", children: "MEC METRO-ECE Centermanagement" }),
20122        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-slate-300 text-sm space-y-1", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start space-x-2", children: [
20123          /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-4 h-4 mt-0.5 flex-shrink-0" }),
20124          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
20125            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Fritz-Vomfelde-Straße 18" }),
20126            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "40547 Düsseldorf" })
20127          ] })
20128        ] }) })
20129      ] }),
20130      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
20131        /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-base md:text-lg font-semibold mb-2 md:mb-3", children: "Quick Links" }),
20132        /* @__PURE__ */ jsxRuntimeExports.jsxs("ul", { className: "space-y-1 text-sm", children: [
20133          /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
20134            "a",
20135            {
20136              href: "https://mec-cm.com",
20137              target: "_blank",
20138              rel: "noopener noreferrer",
20139              className: "text-slate-300 hover:text-white transition-colors inline-flex items-center",
20140              children: [
20141                "MEC Website",
20142                /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "w-3 h-3 ml-1" })
20143              ]
20144            }
20145          ) }),
20146          /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
20147            "a",
20148            {
20149              href: "https://mec-cm.com/handelsimmobilien-overview/",
20150              target: "_blank",
20151              rel: "noopener noreferrer",
20152              className: "text-slate-300 hover:text-white transition-colors inline-flex items-center",
20153              children: [
20154                "Handelsimmobilien",
20155                /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "w-3 h-3 ml-1" })
20156              ]
20157            }
20158          ) }),
20159          /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
20160            "a",
20161            {
20162              href: "https://mec-cm.com/unternehmen/management-team/",
20163              target: "_blank",
20164              rel: "noopener noreferrer",
20165              className: "text-slate-300 hover:text-white transition-colors inline-flex items-center",
20166              children: [
20167                "Management-Team",
20168                /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "w-3 h-3 ml-1" })
20169              ]
20170            }
20171          ) })
20172        ] })
20173      ] }),
20174      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
20175        /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-base md:text-lg font-semibold mb-2 md:mb-3", children: "Kontakt" }),
20176        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 text-sm", children: [
20177          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2 text-slate-300", children: [
20178            /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-4 h-4 flex-shrink-0" }),
20179            /* @__PURE__ */ jsxRuntimeExports.jsx(
20180              "a",
20181              {
20182                href: "tel:+4921130153-0",
20183                className: "hover:text-white transition-colors",
20184                children: "+49 (0)211 30153-0"
20185              }
20186            )
20187          ] }),
20188          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2 text-slate-300", children: [
20189            /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-4 h-4 flex-shrink-0" }),
20190            /* @__PURE__ */ jsxRuntimeExports.jsx(
20191              "a",
20192              {
20193                href: "mailto:[email protected]",
20194                className: "hover:text-white transition-colors",
20195                children: "[email protected]"
20196              }
20197            )
20198          ] })
20199        ] })
20200      ] })
20201    ] }),
20202    /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-slate-700 mt-4 md:mt-6 pt-3 md:pt-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col md:flex-row justify-between items-center text-xs md:text-sm", children: [
20203      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-slate-400", children: [
20204        "© ",
20205        currentYear,
20206        " MEC METRO-ECE Centermanagement. Alle Rechte vorbehalten."
20207      ] }),
20208      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex space-x-4 md:space-x-6 mt-2 md:mt-0", children: [
20209        /* @__PURE__ */ jsxRuntimeExports.jsx(
20210          "a",
20211          {
20212            href: "https://mec-cm.com/datenschutzerklaerung",
20213            target: "_blank",
20214            rel: "noopener noreferrer",
20215            className: "text-slate-400 hover:text-white transition-colors",
20216            children: "Datenschutzerklärung"
20217          }
20218        ),
20219        /* @__PURE__ */ jsxRuntimeExports.jsx(
20220          "a",
20221          {
20222            href: "https://mec-cm.com/impressum",
20223            target: "_blank",
20224            rel: "noopener noreferrer",
20225            className: "text-slate-400 hover:text-white transition-colors",
20226            children: "Impressum"
20227          }
20228        )
20229      ] })
20230    ] }) })
20231  ] }) });
20232};
20233const Container = ({
20234  children,
20235  size = "lg",
20236  padding = "md",
20237  className
20238}) => {
20239  const sizeClasses2 = {
20240    sm: "max-w-sm",
20241    md: "max-w-2xl",
20242    lg: "max-w-4xl",
20243    xl: "max-w-6xl",
20244    full: "max-w-full"
20245  };
20246  const paddingClasses = {
20247    none: "",
20248    sm: "px-2",
20249    md: "px-4",
20250    lg: "px-6"
20251  };
20252  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx(
20253    "mx-auto",
20254    sizeClasses2[size],
20255    paddingClasses[padding],
20256    className
20257  ), children });
20258};
20259const Section = ({
20260  children,
20261  spacing = "md",
20262  className
20263}) => {
20264  const spacingClasses = {
20265    none: "",
20266    sm: "space-y-2",
20267    md: "space-y-4",
20268    lg: "space-y-6",
20269    xl: "space-y-8"
20270  };
20271  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx(spacingClasses[spacing], className), children });
20272};
20273const CardContainer = ({
20274  children,
20275  variant = "default",
20276  padding = "md",
20277  className,
20278  onClick
20279}) => {
20280  const variantClasses = {
20281    default: "bg-white rounded-mec-lg shadow-card border border-background-tertiary",
20282    elevated: "bg-white rounded-mec-lg shadow-card-hover",
20283    outlined: "bg-white rounded-mec-lg border-2 border-background-tertiary"
20284  };
20285  const paddingClasses = {
20286    none: "",
20287    sm: "p-3",
20288    md: "p-4",
20289    lg: "p-6"
20290  };
20291  return /* @__PURE__ */ jsxRuntimeExports.jsx(
20292    "div",
20293    {
20294      className: clsx(
20295        variantClasses[variant],
20296        paddingClasses[padding],
20297        onClick && "cursor-pointer hover:shadow-card-hover transition-shadow duration-200",
20298        "overflow-hidden",
20299        className
20300      ),
20301      onClick,
20302      children
20303    }
20304  );
20305};
20306const PageLayout = ({
20307  children,
20308  title,
20309  subtitle,
20310  actions,
20311  className
20312}) => {
20313  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("space-y-6", className), children: [
20314    (title || subtitle || actions) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between", children: [
20315      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
20316        title && /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl font-semibold text-text-primary", children: title }),
20317        subtitle && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mt-1", children: subtitle })
20318      ] }),
20319      actions && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 w-full sm:flex-shrink-0 sm:w-auto", children: actions })
20320    ] }),
20321    children
20322  ] });
20323};
20324const OfflineIndicator = () => {
20325  const [isOnline, setIsOnline] = reactExports.useState(navigator.onLine);
20326  const [showBanner, setShowBanner] = reactExports.useState(!navigator.onLine);
20327  const [justCameOnline, setJustCameOnline] = reactExports.useState(false);
20328  reactExports.useEffect(() => {
20329    const handleOnline = () => {
20330      setIsOnline(true);
20331      setJustCameOnline(true);
20332      setShowBanner(true);
20333      setTimeout(() => {
20334        setShowBanner(false);
20335        setJustCameOnline(false);
20336      }, 3e3);
20337    };
20338    const handleOffline = () => {
20339      setIsOnline(false);
20340      setShowBanner(true);
20341      setJustCameOnline(false);
20342    };
20343    window.addEventListener("online", handleOnline);
20344    window.addEventListener("offline", handleOffline);
20345    return () => {
20346      window.removeEventListener("online", handleOnline);
20347      window.removeEventListener("offline", handleOffline);
20348    };
20349  }, []);
20350  if (isOnline && !justCameOnline) {
20351    return null;
20352  }
20353  if (!showBanner) {
20354    return null;
20355  }
20356  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
20357    "div",
20358    {
20359      className: clsx(
20360        "fixed top-0 left-0 right-0 z-50 transition-all duration-300",
20361        "shadow-lg"
20362      ),
20363      children: [
20364        !isOnline && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-yellow-500 text-white px-4 py-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto flex items-center justify-center space-x-3", children: [
20365          /* @__PURE__ */ jsxRuntimeExports.jsx(WifiOff, { className: "w-5 h-5 flex-shrink-0" }),
20366          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 text-center", children: [
20367            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-sm md:text-base", children: "Offline-Modus" }),
20368            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-sm opacity-90", children: "Sie verwenden gespeicherte Daten. Einige Funktionen sind möglicherweise eingeschränkt." })
20369          ] })
20370        ] }) }),
20371        isOnline && justCameOnline && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-green-500 text-white px-4 py-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto flex items-center justify-center space-x-3", children: [
20372          /* @__PURE__ */ jsxRuntimeExports.jsx(Wifi, { className: "w-5 h-5 flex-shrink-0" }),
20373          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 text-center", children: [
20374            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-sm md:text-base", children: "Verbindung wiederhergestellt" }),
20375            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-sm opacity-90", children: "Daten werden aktualisiert..." })
20376          ] })
20377        ] }) })
20378      ]
20379    }
20380  );
20381};
20382function App() {
20383  const {
20384    mapView,
20385    selectedLocationId,
20386    openLocationModal,
20387    isContactModalOpen
20388  } = useAppStore();
20389  const { data: locations, isLoading, error } = useLocations();
20390  const { data: contacts } = useContacts();
20391  const urlParams = new URLSearchParams(window.location.search);
20392  const embedParam = urlParams.get("embed");
20393  const hideHeaderParam = urlParams.get("hideHeader");
20394  const hideFooterParam = urlParams.get("hideFooter");
20395  const isEmbedMode = embedParam === "true";
20396  const showHeader = hideHeaderParam === "true" ? false : embedParam !== "true";
20397  const showFooter = hideFooterParam === "true" ? false : embedParam !== "true";
20398  reactExports.useEffect(() => {
20399    const locationParam = urlParams.get("location");
20400    if (locationParam && !selectedLocationId) {
20401      const locationId = locationParam.startsWith("wp-") ? locationParam : `wp-${locationParam}`;
20402      openLocationModal(locationId);
20403    }
20404  }, [selectedLocationId, openLocationModal]);
20405  if (isLoading) {
20406    return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen flex items-center justify-center bg-background-secondary", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
20407      /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingSpinner, { size: "lg" }),
20408      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-4 text-text-secondary", children: "Lade Portfolio-Daten..." })
20409    ] }) });
20410  }
20411  if (error) {
20412    return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen flex items-center justify-center bg-background-secondary", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center p-8", children: [
20413      /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-6xl mb-4", children: "⚠️" }),
20414      /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl font-semibold text-text-primary mb-2", children: "Fehler beim Laden" }),
20415      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mb-4", children: "Die Portfolio-Daten konnten nicht geladen werden." }),
20416      /* @__PURE__ */ jsxRuntimeExports.jsx(
20417        "button",
20418        {
20419          onClick: () => window.location.reload(),
20420          className: "btn-primary",
20421          children: "Erneut versuchen"
20422        }
20423      )
20424    ] }) });
20425  }
20426  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: `min-h-screen bg-background-primary scroll-smooth ${isEmbedMode ? "embed-mode" : ""}`, children: [
20427    /* @__PURE__ */ jsxRuntimeExports.jsx(OfflineIndicator, {}),
20428    showHeader && /* @__PURE__ */ jsxRuntimeExports.jsx(Header, {}),
20429    /* @__PURE__ */ jsxRuntimeExports.jsx("main", { className: isEmbedMode ? "py-2" : "py-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Container, { size: isEmbedMode ? "full" : "xl", padding: isEmbedMode ? "none" : "md", children: /* @__PURE__ */ jsxRuntimeExports.jsx(PageLayout, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Section, { spacing: "lg", children: mapView === "interactive" ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
20430      /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContainer, { children: [
20431        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-4 border-b border-background-tertiary flex items-center justify-between", children: [
20432          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
20433            /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-semibold text-text-primary", children: "Finden Sie Ihren Ansprechpartner" }),
20434            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-secondary mt-1", children: "Klicken Sie auf einen Standort auf der Karte" })
20435          ] }),
20436          /* @__PURE__ */ jsxRuntimeExports.jsx(ViewToggle, { size: "sm" })
20437        ] }),
20438        /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary$1, { fallback: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-8 text-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: "Karte konnte nicht geladen werden" }) }), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
20439          MapContainer,
20440          {
20441            locations: locations || [],
20442            contacts: contacts?.data || [],
20443            height: 500,
20444            className: "w-full"
20445          }
20446        ) })
20447      ] }),
20448      selectedLocationId && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white rounded-mec-lg shadow-card p-6", children: [
20449        /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-4", children: "Ansprechpartner am ausgewählten Standort" }),
20450        /* @__PURE__ */ jsxRuntimeExports.jsx(ContactGrid, { locationId: selectedLocationId })
20451      ] })
20452    ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(UnifiedListView, {}) }) }) }) }) }),
20453    /* @__PURE__ */ jsxRuntimeExports.jsx(LocationContactModal, {}),
20454    isContactModalOpen && /* @__PURE__ */ jsxRuntimeExports.jsx(ContactModal, {}),
20455    showFooter && /* @__PURE__ */ jsxRuntimeExports.jsx(Footer, {})
20456  ] });
20457}
20458const CLASS_PART_SEPARATOR = "-";
20459const createClassGroupUtils = (config) => {
20460  const classMap = createClassMap(config);
20461  const {
20462    conflictingClassGroups,
20463    conflictingClassGroupModifiers
20464  } = config;
20465  const getClassGroupId = (className) => {
20466    const classParts = className.split(CLASS_PART_SEPARATOR);
20467    if (classParts[0] === "" && classParts.length !== 1) {
20468      classParts.shift();
20469    }
20470    return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);
20471  };
20472  const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {
20473    const conflicts = conflictingClassGroups[classGroupId] || [];
20474    if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {
20475      return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];
20476    }
20477    return conflicts;
20478  };
20479  return {
20480    getClassGroupId,
20481    getConflictingClassGroupIds
20482  };
20483};
20484const getGroupRecursive = (classParts, classPartObject) => {
20485  if (classParts.length === 0) {
20486    return classPartObject.classGroupId;
20487  }
20488  const currentClassPart = classParts[0];
20489  const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);
20490  const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : void 0;
20491  if (classGroupFromNextClassPart) {
20492    return classGroupFromNextClassPart;
20493  }
20494  if (classPartObject.validators.length === 0) {
20495    return void 0;
20496  }
20497  const classRest = classParts.join(CLASS_PART_SEPARATOR);
20498  return classPartObject.validators.find(({
20499    validator
20500  }) => validator(classRest))?.classGroupId;
20501};
20502const arbitraryPropertyRegex = /^\[(.+)\]$/;
20503const getGroupIdForArbitraryProperty = (className) => {
20504  if (arbitraryPropertyRegex.test(className)) {
20505    const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];
20506    const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(":"));
20507    if (property) {
20508      return "arbitrary.." + property;
20509    }
20510  }
20511};
20512const createClassMap = (config) => {
20513  const {
20514    theme,
20515    classGroups
20516  } = config;
20517  const classMap = {
20518    nextPart: /* @__PURE__ */ new Map(),
20519    validators: []
20520  };
20521  for (const classGroupId in classGroups) {
20522    processClassesRecursively(classGroups[classGroupId], classMap, classGroupId, theme);
20523  }
20524  return classMap;
20525};
20526const processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {
20527  classGroup.forEach((classDefinition) => {
20528    if (typeof classDefinition === "string") {
20529      const classPartObjectToEdit = classDefinition === "" ? classPartObject : getPart(classPartObject, classDefinition);
20530      classPartObjectToEdit.classGroupId = classGroupId;
20531      return;
20532    }
20533    if (typeof classDefinition === "function") {
20534      if (isThemeGetter(classDefinition)) {
20535        processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);
20536        return;
20537      }
20538      classPartObject.validators.push({
20539        validator: classDefinition,
20540        classGroupId
20541      });
20542      return;
20543    }
20544    Object.entries(classDefinition).forEach(([key, classGroup2]) => {
20545      processClassesRecursively(classGroup2, getPart(classPartObject, key), classGroupId, theme);
20546    });
20547  });
20548};
20549const getPart = (classPartObject, path) => {
20550  let currentClassPartObject = classPartObject;
20551  path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {
20552    if (!currentClassPartObject.nextPart.has(pathPart)) {
20553      currentClassPartObject.nextPart.set(pathPart, {
20554        nextPart: /* @__PURE__ */ new Map(),
20555        validators: []
20556      });
20557    }
20558    currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);
20559  });
20560  return currentClassPartObject;
20561};
20562const isThemeGetter = (func) => func.isThemeGetter;
20563const createLruCache = (maxCacheSize) => {
20564  if (maxCacheSize < 1) {
20565    return {
20566      get: () => void 0,
20567      set: () => {
20568      }
20569    };
20570  }
20571  let cacheSize = 0;
20572  let cache = /* @__PURE__ */ new Map();
20573  let previousCache = /* @__PURE__ */ new Map();
20574  const update = (key, value) => {
20575    cache.set(key, value);
20576    cacheSize++;
20577    if (cacheSize > maxCacheSize) {
20578      cacheSize = 0;
20579      previousCache = cache;
20580      cache = /* @__PURE__ */ new Map();
20581    }
20582  };
20583  return {
20584    get(key) {
20585      let value = cache.get(key);
20586      if (value !== void 0) {
20587        return value;
20588      }
20589      if ((value = previousCache.get(key)) !== void 0) {
20590        update(key, value);
20591        return value;
20592      }
20593    },
20594    set(key, value) {
20595      if (cache.has(key)) {
20596        cache.set(key, value);
20597      } else {
20598        update(key, value);
20599      }
20600    }
20601  };
20602};
20603const IMPORTANT_MODIFIER = "!";
20604const MODIFIER_SEPARATOR = ":";
20605const MODIFIER_SEPARATOR_LENGTH = MODIFIER_SEPARATOR.length;
20606const createParseClassName = (config) => {
20607  const {
20608    prefix,
20609    experimentalParseClassName
20610  } = config;
20611  let parseClassName = (className) => {
20612    const modifiers = [];
20613    let bracketDepth = 0;
20614    let parenDepth = 0;
20615    let modifierStart = 0;
20616    let postfixModifierPosition;
20617    for (let index = 0; index < className.length; index++) {
20618      let currentCharacter = className[index];
20619      if (bracketDepth === 0 && parenDepth === 0) {
20620        if (currentCharacter === MODIFIER_SEPARATOR) {
20621          modifiers.push(className.slice(modifierStart, index));
20622          modifierStart = index + MODIFIER_SEPARATOR_LENGTH;
20623          continue;
20624        }
20625        if (currentCharacter === "/") {
20626          postfixModifierPosition = index;
20627          continue;
20628        }
20629      }
20630      if (currentCharacter === "[") {
20631        bracketDepth++;
20632      } else if (currentCharacter === "]") {
20633        bracketDepth--;
20634      } else if (currentCharacter === "(") {
20635        parenDepth++;
20636      } else if (currentCharacter === ")") {
20637        parenDepth--;
20638      }
20639    }
20640    const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);
20641    const baseClassName = stripImportantModifier(baseClassNameWithImportantModifier);
20642    const hasImportantModifier = baseClassName !== baseClassNameWithImportantModifier;
20643    const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : void 0;
20644    return {
20645      modifiers,
20646      hasImportantModifier,
20647      baseClassName,
20648      maybePostfixModifierPosition
20649    };
20650  };
20651  if (prefix) {
20652    const fullPrefix = prefix + MODIFIER_SEPARATOR;
20653    const parseClassNameOriginal = parseClassName;
20654    parseClassName = (className) => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.substring(fullPrefix.length)) : {
20655      isExternal: true,
20656      modifiers: [],
20657      hasImportantModifier: false,
20658      baseClassName: className,
20659      maybePostfixModifierPosition: void 0
20660    };
20661  }
20662  if (experimentalParseClassName) {
20663    const parseClassNameOriginal = parseClassName;
20664    parseClassName = (className) => experimentalParseClassName({
20665      className,
20666      parseClassName: parseClassNameOriginal
20667    });
20668  }
20669  return parseClassName;
20670};
20671const stripImportantModifier = (baseClassName) => {
20672  if (baseClassName.endsWith(IMPORTANT_MODIFIER)) {
20673    return baseClassName.substring(0, baseClassName.length - 1);
20674  }
20675  if (baseClassName.startsWith(IMPORTANT_MODIFIER)) {
20676    return baseClassName.substring(1);
20677  }
20678  return baseClassName;
20679};
20680const createSortModifiers = (config) => {
20681  const orderSensitiveModifiers = Object.fromEntries(config.orderSensitiveModifiers.map((modifier) => [modifier, true]));
20682  const sortModifiers = (modifiers) => {
20683    if (modifiers.length <= 1) {
20684      return modifiers;
20685    }
20686    const sortedModifiers = [];
20687    let unsortedModifiers = [];
vendor: 1,998 bytes, lines 20688-20744
20688    modifiers.forEach((modifier) => {
20689      const isPositionSensitive = modifier[0] === "[" || orderSensitiveModifiers[modifier];
20690      if (isPositionSensitive) {
20691        sortedModifiers.push(...unsortedModifiers.sort(), modifier);
20692        unsortedModifiers = [];
20693      } else {
20694        unsortedModifiers.push(modifier);
20695      }
20696    });
20697    sortedModifiers.push(...unsortedModifiers.sort());
20698    return sortedModifiers;
20699  };
20700  return sortModifiers;
20701};
20702const createConfigUtils = (config) => ({
20703  cache: createLruCache(config.cacheSize),
20704  parseClassName: createParseClassName(config),
20705  sortModifiers: createSortModifiers(config),
20706  ...createClassGroupUtils(config)
20707});
20708const SPLIT_CLASSES_REGEX = /\s+/;
20709const mergeClassList = (classList, configUtils) => {
20710  const {
20711    parseClassName,
20712    getClassGroupId,
20713    getConflictingClassGroupIds,
20714    sortModifiers
20715  } = configUtils;
20716  const classGroupsInConflict = [];
20717  const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);
20718  let result = "";
20719  for (let index = classNames.length - 1; index >= 0; index -= 1) {
20720    const originalClassName = classNames[index];
20721    const {
20722      isExternal,
20723      modifiers,
20724      hasImportantModifier,
20725      baseClassName,
20726      maybePostfixModifierPosition
20727    } = parseClassName(originalClassName);
20728    if (isExternal) {
20729      result = originalClassName + (result.length > 0 ? " " + result : result);
20730      continue;
20731    }
20732    let hasPostfixModifier = !!maybePostfixModifierPosition;
20733    let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);
20734    if (!classGroupId) {
20735      if (!hasPostfixModifier) {
20736        result = originalClassName + (result.length > 0 ? " " + result : result);
20737        continue;
20738      }
20739      classGroupId = getClassGroupId(baseClassName);
20740      if (!classGroupId) {
20741        result = originalClassName + (result.length > 0 ? " " + result : result);
20742        continue;
20743      }
20744      hasPostfixModifier = false;
20745    }
20746    const variantModifier = sortModifiers(modifiers).join(":");
20747    const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;
20748    const classId = modifierId + classGroupId;
20749    if (classGroupsInConflict.includes(classId)) {
20750      continue;
20751    }
20752    classGroupsInConflict.push(classId);
20753    const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);
20754    for (let i = 0; i < conflictGroups.length; ++i) {
20755      const group = conflictGroups[i];
20756      classGroupsInConflict.push(modifierId + group);
20757    }
20758    result = originalClassName + (result.length > 0 ? " " + result : result);
20759  }
20760  return result;
20761};
20762function twJoin() {
20763  let index = 0;
20764  let argument;
20765  let resolvedValue;
20766  let string = "";
20767  while (index < arguments.length) {
20768    if (argument = arguments[index++]) {
20769      if (resolvedValue = toValue(argument)) {
20770        string && (string += " ");
20771        string += resolvedValue;
20772      }
20773    }
20774  }
20775  return string;
20776}
20777const toValue = (mix) => {
20778  if (typeof mix === "string") {
20779    return mix;
20780  }
20781  let resolvedValue;
20782  let string = "";
20783  for (let k2 = 0; k2 < mix.length; k2++) {
20784    if (mix[k2]) {
20785      if (resolvedValue = toValue(mix[k2])) {
20786        string && (string += " ");
20787        string += resolvedValue;
20788      }
20789    }
20790  }
20791  return string;
20792};
20793function createTailwindMerge(createConfigFirst, ...createConfigRest) {
20794  let configUtils;
20795  let cacheGet;
20796  let cacheSet;
20797  let functionToCall = initTailwindMerge;
20798  function initTailwindMerge(classList) {
20799    const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());
20800    configUtils = createConfigUtils(config);
20801    cacheGet = configUtils.cache.get;
20802    cacheSet = configUtils.cache.set;
20803    functionToCall = tailwindMerge;
20804    return tailwindMerge(classList);
20805  }
20806  function tailwindMerge(classList) {
20807    const cachedResult = cacheGet(classList);
20808    if (cachedResult) {
20809      return cachedResult;
20810    }
20811    const result = mergeClassList(classList, configUtils);
20812    cacheSet(classList, result);
20813    return result;
20814  }
20815  return function callTailwindMerge() {
20816    return functionToCall(twJoin.apply(null, arguments));
20817  };
20818}
20819const fromTheme = (key) => {
20820  const themeGetter = (theme) => theme[key] || [];
20821  themeGetter.isThemeGetter = true;
20822  return themeGetter;
20823};
20824const arbitraryValueRegex = /^\[(?:(\w[\w-]*):)?(.+)\]$/i;
20825const arbitraryVariableRegex = /^\((?:(\w[\w-]*):)?(.+)\)$/i;
20826const fractionRegex = /^\d+\/\d+$/;
20827const tshirtUnitRegex = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/;
20828const lengthUnitRegex = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/;
20829const colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/;
20830const shadowRegex = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/;
20831const imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;
20832const isFraction = (value) => fractionRegex.test(value);
20833const isNumber = (value) => !!value && !Number.isNaN(Number(value));
20834const isInteger = (value) => !!value && Number.isInteger(Number(value));
20835const isPercent = (value) => value.endsWith("%") && isNumber(value.slice(0, -1));
20836const isTshirtSize = (value) => tshirtUnitRegex.test(value);
20837const isAny = () => true;
20838const isLengthOnly = (value) => (
20839  // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.
20840  // For example, `hsl(0 0% 0%)` would be classified as a length without this check.
20841  // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.
20842  lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)
20843);
20844const isNever = () => false;
20845const isShadow = (value) => shadowRegex.test(value);
20846const isImage = (value) => imageRegex.test(value);
20847const isAnyNonArbitrary = (value) => !isArbitraryValue(value) && !isArbitraryVariable(value);
20848const isArbitrarySize = (value) => getIsArbitraryValue(value, isLabelSize, isNever);
20849const isArbitraryValue = (value) => arbitraryValueRegex.test(value);
20850const isArbitraryLength = (value) => getIsArbitraryValue(value, isLabelLength, isLengthOnly);
20851const isArbitraryNumber = (value) => getIsArbitraryValue(value, isLabelNumber, isNumber);
20852const isArbitraryPosition = (value) => getIsArbitraryValue(value, isLabelPosition, isNever);
20853const isArbitraryImage = (value) => getIsArbitraryValue(value, isLabelImage, isImage);
20854const isArbitraryShadow = (value) => getIsArbitraryValue(value, isLabelShadow, isShadow);
20855const isArbitraryVariable = (value) => arbitraryVariableRegex.test(value);
20856const isArbitraryVariableLength = (value) => getIsArbitraryVariable(value, isLabelLength);
20857const isArbitraryVariableFamilyName = (value) => getIsArbitraryVariable(value, isLabelFamilyName);
20858const isArbitraryVariablePosition = (value) => getIsArbitraryVariable(value, isLabelPosition);
20859const isArbitraryVariableSize = (value) => getIsArbitraryVariable(value, isLabelSize);
20860const isArbitraryVariableImage = (value) => getIsArbitraryVariable(value, isLabelImage);
20861const isArbitraryVariableShadow = (value) => getIsArbitraryVariable(value, isLabelShadow, true);
20862const getIsArbitraryValue = (value, testLabel, testValue) => {
20863  const result = arbitraryValueRegex.exec(value);
20864  if (result) {
20865    if (result[1]) {
20866      return testLabel(result[1]);
20867    }
20868    return testValue(result[2]);
20869  }
20870  return false;
vendor: 18,276 bytes, lines 20871-21449
20871};
20872const getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {
20873  const result = arbitraryVariableRegex.exec(value);
20874  if (result) {
20875    if (result[1]) {
20876      return testLabel(result[1]);
20877    }
20878    return shouldMatchNoLabel;
20879  }
20880  return false;
20881};
20882const isLabelPosition = (label) => label === "position" || label === "percentage";
20883const isLabelImage = (label) => label === "image" || label === "url";
20884const isLabelSize = (label) => label === "length" || label === "size" || label === "bg-size";
20885const isLabelLength = (label) => label === "length";
20886const isLabelNumber = (label) => label === "number";
20887const isLabelFamilyName = (label) => label === "family-name";
20888const isLabelShadow = (label) => label === "shadow";
20889const getDefaultConfig = () => {
20890  const themeColor = fromTheme("color");
20891  const themeFont = fromTheme("font");
20892  const themeText = fromTheme("text");
20893  const themeFontWeight = fromTheme("font-weight");
20894  const themeTracking = fromTheme("tracking");
20895  const themeLeading = fromTheme("leading");
20896  const themeBreakpoint = fromTheme("breakpoint");
20897  const themeContainer = fromTheme("container");
20898  const themeSpacing = fromTheme("spacing");
20899  const themeRadius = fromTheme("radius");
20900  const themeShadow = fromTheme("shadow");
20901  const themeInsetShadow = fromTheme("inset-shadow");
20902  const themeTextShadow = fromTheme("text-shadow");
20903  const themeDropShadow = fromTheme("drop-shadow");
20904  const themeBlur = fromTheme("blur");
20905  const themePerspective = fromTheme("perspective");
20906  const themeAspect = fromTheme("aspect");
20907  const themeEase = fromTheme("ease");
20908  const themeAnimate = fromTheme("animate");
20909  const scaleBreak = () => ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"];
20910  const scalePosition = () => [
20911    "center",
20912    "top",
20913    "bottom",
20914    "left",
20915    "right",
20916    "top-left",
20917    // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
20918    "left-top",
20919    "top-right",
20920    // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
20921    "right-top",
20922    "bottom-right",
20923    // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
20924    "right-bottom",
20925    "bottom-left",
20926    // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
20927    "left-bottom"
20928  ];
20929  const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue];
20930  const scaleOverflow = () => ["auto", "hidden", "clip", "visible", "scroll"];
20931  const scaleOverscroll = () => ["auto", "contain", "none"];
20932  const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing];
20933  const scaleInset = () => [isFraction, "full", "auto", ...scaleUnambiguousSpacing()];
20934  const scaleGridTemplateColsRows = () => [isInteger, "none", "subgrid", isArbitraryVariable, isArbitraryValue];
20935  const scaleGridColRowStartAndEnd = () => ["auto", {
20936    span: ["full", isInteger, isArbitraryVariable, isArbitraryValue]
20937  }, isInteger, isArbitraryVariable, isArbitraryValue];
20938  const scaleGridColRowStartOrEnd = () => [isInteger, "auto", isArbitraryVariable, isArbitraryValue];
20939  const scaleGridAutoColsRows = () => ["auto", "min", "max", "fr", isArbitraryVariable, isArbitraryValue];
20940  const scaleAlignPrimaryAxis = () => ["start", "end", "center", "between", "around", "evenly", "stretch", "baseline", "center-safe", "end-safe"];
20941  const scaleAlignSecondaryAxis = () => ["start", "end", "center", "stretch", "center-safe", "end-safe"];
20942  const scaleMargin = () => ["auto", ...scaleUnambiguousSpacing()];
20943  const scaleSizing = () => [isFraction, "auto", "full", "dvw", "dvh", "lvw", "lvh", "svw", "svh", "min", "max", "fit", ...scaleUnambiguousSpacing()];
20944  const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];
20945  const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {
20946    position: [isArbitraryVariable, isArbitraryValue]
20947  }];
20948  const scaleBgRepeat = () => ["no-repeat", {
20949    repeat: ["", "x", "y", "space", "round"]
20950  }];
20951  const scaleBgSize = () => ["auto", "cover", "contain", isArbitraryVariableSize, isArbitrarySize, {
20952    size: [isArbitraryVariable, isArbitraryValue]
20953  }];
20954  const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength];
20955  const scaleRadius = () => [
20956    // Deprecated since Tailwind CSS v4.0.0
20957    "",
20958    "none",
20959    "full",
20960    themeRadius,
20961    isArbitraryVariable,
20962    isArbitraryValue
20963  ];
20964  const scaleBorderWidth = () => ["", isNumber, isArbitraryVariableLength, isArbitraryLength];
20965  const scaleLineStyle = () => ["solid", "dashed", "dotted", "double"];
20966  const scaleBlendMode = () => ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"];
20967  const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition];
20968  const scaleBlur = () => [
20969    // Deprecated since Tailwind CSS v4.0.0
20970    "",
20971    "none",
20972    themeBlur,
20973    isArbitraryVariable,
20974    isArbitraryValue
20975  ];
20976  const scaleRotate = () => ["none", isNumber, isArbitraryVariable, isArbitraryValue];
20977  const scaleScale = () => ["none", isNumber, isArbitraryVariable, isArbitraryValue];
20978  const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue];
20979  const scaleTranslate = () => [isFraction, "full", ...scaleUnambiguousSpacing()];
20980  return {
20981    cacheSize: 500,
20982    theme: {
20983      animate: ["spin", "ping", "pulse", "bounce"],
20984      aspect: ["video"],
20985      blur: [isTshirtSize],
20986      breakpoint: [isTshirtSize],
20987      color: [isAny],
20988      container: [isTshirtSize],
20989      "drop-shadow": [isTshirtSize],
20990      ease: ["in", "out", "in-out"],
20991      font: [isAnyNonArbitrary],
20992      "font-weight": ["thin", "extralight", "light", "normal", "medium", "semibold", "bold", "extrabold", "black"],
20993      "inset-shadow": [isTshirtSize],
20994      leading: ["none", "tight", "snug", "normal", "relaxed", "loose"],
20995      perspective: ["dramatic", "near", "normal", "midrange", "distant", "none"],
20996      radius: [isTshirtSize],
20997      shadow: [isTshirtSize],
20998      spacing: ["px", isNumber],
20999      text: [isTshirtSize],
21000      "text-shadow": [isTshirtSize],
21001      tracking: ["tighter", "tight", "normal", "wide", "wider", "widest"]
21002    },
21003    classGroups: {
21004      // --------------
21005      // --- Layout ---
21006      // --------------
21007      /**
21008       * Aspect Ratio
21009       * @see https://tailwindcss.com/docs/aspect-ratio
21010       */
21011      aspect: [{
21012        aspect: ["auto", "square", isFraction, isArbitraryValue, isArbitraryVariable, themeAspect]
21013      }],
21014      /**
21015       * Container
21016       * @see https://tailwindcss.com/docs/container
21017       * @deprecated since Tailwind CSS v4.0.0
21018       */
21019      container: ["container"],
21020      /**
21021       * Columns
21022       * @see https://tailwindcss.com/docs/columns
21023       */
21024      columns: [{
21025        columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer]
21026      }],
21027      /**
21028       * Break After
21029       * @see https://tailwindcss.com/docs/break-after
21030       */
21031      "break-after": [{
21032        "break-after": scaleBreak()
21033      }],
21034      /**
21035       * Break Before
21036       * @see https://tailwindcss.com/docs/break-before
21037       */
21038      "break-before": [{
21039        "break-before": scaleBreak()
21040      }],
21041      /**
21042       * Break Inside
21043       * @see https://tailwindcss.com/docs/break-inside
21044       */
21045      "break-inside": [{
21046        "break-inside": ["auto", "avoid", "avoid-page", "avoid-column"]
21047      }],
21048      /**
21049       * Box Decoration Break
21050       * @see https://tailwindcss.com/docs/box-decoration-break
21051       */
21052      "box-decoration": [{
21053        "box-decoration": ["slice", "clone"]
21054      }],
21055      /**
21056       * Box Sizing
21057       * @see https://tailwindcss.com/docs/box-sizing
21058       */
21059      box: [{
21060        box: ["border", "content"]
21061      }],
21062      /**
21063       * Display
21064       * @see https://tailwindcss.com/docs/display
21065       */
21066      display: ["block", "inline-block", "inline", "flex", "inline-flex", "table", "inline-table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row-group", "table-row", "flow-root", "grid", "inline-grid", "contents", "list-item", "hidden"],
21067      /**
21068       * Screen Reader Only
21069       * @see https://tailwindcss.com/docs/display#screen-reader-only
21070       */
21071      sr: ["sr-only", "not-sr-only"],
21072      /**
21073       * Floats
21074       * @see https://tailwindcss.com/docs/float
21075       */
21076      float: [{
21077        float: ["right", "left", "none", "start", "end"]
21078      }],
21079      /**
21080       * Clear
21081       * @see https://tailwindcss.com/docs/clear
21082       */
21083      clear: [{
21084        clear: ["left", "right", "both", "none", "start", "end"]
21085      }],
21086      /**
21087       * Isolation
21088       * @see https://tailwindcss.com/docs/isolation
21089       */
21090      isolation: ["isolate", "isolation-auto"],
21091      /**
21092       * Object Fit
21093       * @see https://tailwindcss.com/docs/object-fit
21094       */
21095      "object-fit": [{
21096        object: ["contain", "cover", "fill", "none", "scale-down"]
21097      }],
21098      /**
21099       * Object Position
21100       * @see https://tailwindcss.com/docs/object-position
21101       */
21102      "object-position": [{
21103        object: scalePositionWithArbitrary()
21104      }],
21105      /**
21106       * Overflow
21107       * @see https://tailwindcss.com/docs/overflow
21108       */
21109      overflow: [{
21110        overflow: scaleOverflow()
21111      }],
21112      /**
21113       * Overflow X
21114       * @see https://tailwindcss.com/docs/overflow
21115       */
21116      "overflow-x": [{
21117        "overflow-x": scaleOverflow()
21118      }],
21119      /**
21120       * Overflow Y
21121       * @see https://tailwindcss.com/docs/overflow
21122       */
21123      "overflow-y": [{
21124        "overflow-y": scaleOverflow()
21125      }],
21126      /**
21127       * Overscroll Behavior
21128       * @see https://tailwindcss.com/docs/overscroll-behavior
21129       */
21130      overscroll: [{
21131        overscroll: scaleOverscroll()
21132      }],
21133      /**
21134       * Overscroll Behavior X
21135       * @see https://tailwindcss.com/docs/overscroll-behavior
21136       */
21137      "overscroll-x": [{
21138        "overscroll-x": scaleOverscroll()
21139      }],
21140      /**
21141       * Overscroll Behavior Y
21142       * @see https://tailwindcss.com/docs/overscroll-behavior
21143       */
21144      "overscroll-y": [{
21145        "overscroll-y": scaleOverscroll()
21146      }],
21147      /**
21148       * Position
21149       * @see https://tailwindcss.com/docs/position
21150       */
21151      position: ["static", "fixed", "absolute", "relative", "sticky"],
21152      /**
21153       * Top / Right / Bottom / Left
21154       * @see https://tailwindcss.com/docs/top-right-bottom-left
21155       */
21156      inset: [{
21157        inset: scaleInset()
21158      }],
21159      /**
21160       * Right / Left
21161       * @see https://tailwindcss.com/docs/top-right-bottom-left
21162       */
21163      "inset-x": [{
21164        "inset-x": scaleInset()
21165      }],
21166      /**
21167       * Top / Bottom
21168       * @see https://tailwindcss.com/docs/top-right-bottom-left
21169       */
21170      "inset-y": [{
21171        "inset-y": scaleInset()
21172      }],
21173      /**
21174       * Start
21175       * @see https://tailwindcss.com/docs/top-right-bottom-left
21176       */
21177      start: [{
21178        start: scaleInset()
21179      }],
21180      /**
21181       * End
21182       * @see https://tailwindcss.com/docs/top-right-bottom-left
21183       */
21184      end: [{
21185        end: scaleInset()
21186      }],
21187      /**
21188       * Top
21189       * @see https://tailwindcss.com/docs/top-right-bottom-left
21190       */
21191      top: [{
21192        top: scaleInset()
21193      }],
21194      /**
21195       * Right
21196       * @see https://tailwindcss.com/docs/top-right-bottom-left
21197       */
21198      right: [{
21199        right: scaleInset()
21200      }],
21201      /**
21202       * Bottom
21203       * @see https://tailwindcss.com/docs/top-right-bottom-left
21204       */
21205      bottom: [{
21206        bottom: scaleInset()
21207      }],
21208      /**
21209       * Left
21210       * @see https://tailwindcss.com/docs/top-right-bottom-left
21211       */
21212      left: [{
21213        left: scaleInset()
21214      }],
21215      /**
21216       * Visibility
21217       * @see https://tailwindcss.com/docs/visibility
21218       */
21219      visibility: ["visible", "invisible", "collapse"],
21220      /**
21221       * Z-Index
21222       * @see https://tailwindcss.com/docs/z-index
21223       */
21224      z: [{
21225        z: [isInteger, "auto", isArbitraryVariable, isArbitraryValue]
21226      }],
21227      // ------------------------
21228      // --- Flexbox and Grid ---
21229      // ------------------------
21230      /**
21231       * Flex Basis
21232       * @see https://tailwindcss.com/docs/flex-basis
21233       */
21234      basis: [{
21235        basis: [isFraction, "full", "auto", themeContainer, ...scaleUnambiguousSpacing()]
21236      }],
21237      /**
21238       * Flex Direction
21239       * @see https://tailwindcss.com/docs/flex-direction
21240       */
21241      "flex-direction": [{
21242        flex: ["row", "row-reverse", "col", "col-reverse"]
21243      }],
21244      /**
21245       * Flex Wrap
21246       * @see https://tailwindcss.com/docs/flex-wrap
21247       */
21248      "flex-wrap": [{
21249        flex: ["nowrap", "wrap", "wrap-reverse"]
21250      }],
21251      /**
21252       * Flex
21253       * @see https://tailwindcss.com/docs/flex
21254       */
21255      flex: [{
21256        flex: [isNumber, isFraction, "auto", "initial", "none", isArbitraryValue]
21257      }],
21258      /**
21259       * Flex Grow
21260       * @see https://tailwindcss.com/docs/flex-grow
21261       */
21262      grow: [{
21263        grow: ["", isNumber, isArbitraryVariable, isArbitraryValue]
21264      }],
21265      /**
21266       * Flex Shrink
21267       * @see https://tailwindcss.com/docs/flex-shrink
21268       */
21269      shrink: [{
21270        shrink: ["", isNumber, isArbitraryVariable, isArbitraryValue]
21271      }],
21272      /**
21273       * Order
21274       * @see https://tailwindcss.com/docs/order
21275       */
21276      order: [{
21277        order: [isInteger, "first", "last", "none", isArbitraryVariable, isArbitraryValue]
21278      }],
21279      /**
21280       * Grid Template Columns
21281       * @see https://tailwindcss.com/docs/grid-template-columns
21282       */
21283      "grid-cols": [{
21284        "grid-cols": scaleGridTemplateColsRows()
21285      }],
21286      /**
21287       * Grid Column Start / End
21288       * @see https://tailwindcss.com/docs/grid-column
21289       */
21290      "col-start-end": [{
21291        col: scaleGridColRowStartAndEnd()
21292      }],
21293      /**
21294       * Grid Column Start
21295       * @see https://tailwindcss.com/docs/grid-column
21296       */
21297      "col-start": [{
21298        "col-start": scaleGridColRowStartOrEnd()
21299      }],
21300      /**
21301       * Grid Column End
21302       * @see https://tailwindcss.com/docs/grid-column
21303       */
21304      "col-end": [{
21305        "col-end": scaleGridColRowStartOrEnd()
21306      }],
21307      /**
21308       * Grid Template Rows
21309       * @see https://tailwindcss.com/docs/grid-template-rows
21310       */
21311      "grid-rows": [{
21312        "grid-rows": scaleGridTemplateColsRows()
21313      }],
21314      /**
21315       * Grid Row Start / End
21316       * @see https://tailwindcss.com/docs/grid-row
21317       */
21318      "row-start-end": [{
21319        row: scaleGridColRowStartAndEnd()
21320      }],
21321      /**
21322       * Grid Row Start
21323       * @see https://tailwindcss.com/docs/grid-row
21324       */
21325      "row-start": [{
21326        "row-start": scaleGridColRowStartOrEnd()
21327      }],
21328      /**
21329       * Grid Row End
21330       * @see https://tailwindcss.com/docs/grid-row
21331       */
21332      "row-end": [{
21333        "row-end": scaleGridColRowStartOrEnd()
21334      }],
21335      /**
21336       * Grid Auto Flow
21337       * @see https://tailwindcss.com/docs/grid-auto-flow
21338       */
21339      "grid-flow": [{
21340        "grid-flow": ["row", "col", "dense", "row-dense", "col-dense"]
21341      }],
21342      /**
21343       * Grid Auto Columns
21344       * @see https://tailwindcss.com/docs/grid-auto-columns
21345       */
21346      "auto-cols": [{
21347        "auto-cols": scaleGridAutoColsRows()
21348      }],
21349      /**
21350       * Grid Auto Rows
21351       * @see https://tailwindcss.com/docs/grid-auto-rows
21352       */
21353      "auto-rows": [{
21354        "auto-rows": scaleGridAutoColsRows()
21355      }],
21356      /**
21357       * Gap
21358       * @see https://tailwindcss.com/docs/gap
21359       */
21360      gap: [{
21361        gap: scaleUnambiguousSpacing()
21362      }],
21363      /**
21364       * Gap X
21365       * @see https://tailwindcss.com/docs/gap
21366       */
21367      "gap-x": [{
21368        "gap-x": scaleUnambiguousSpacing()
21369      }],
21370      /**
21371       * Gap Y
21372       * @see https://tailwindcss.com/docs/gap
21373       */
21374      "gap-y": [{
21375        "gap-y": scaleUnambiguousSpacing()
21376      }],
21377      /**
21378       * Justify Content
21379       * @see https://tailwindcss.com/docs/justify-content
21380       */
21381      "justify-content": [{
21382        justify: [...scaleAlignPrimaryAxis(), "normal"]
21383      }],
21384      /**
21385       * Justify Items
21386       * @see https://tailwindcss.com/docs/justify-items
21387       */
21388      "justify-items": [{
21389        "justify-items": [...scaleAlignSecondaryAxis(), "normal"]
21390      }],
21391      /**
21392       * Justify Self
21393       * @see https://tailwindcss.com/docs/justify-self
21394       */
21395      "justify-self": [{
21396        "justify-self": ["auto", ...scaleAlignSecondaryAxis()]
21397      }],
21398      /**
21399       * Align Content
21400       * @see https://tailwindcss.com/docs/align-content
21401       */
21402      "align-content": [{
21403        content: ["normal", ...scaleAlignPrimaryAxis()]
21404      }],
21405      /**
21406       * Align Items
21407       * @see https://tailwindcss.com/docs/align-items
21408       */
21409      "align-items": [{
21410        items: [...scaleAlignSecondaryAxis(), {
21411          baseline: ["", "last"]
21412        }]
21413      }],
21414      /**
21415       * Align Self
21416       * @see https://tailwindcss.com/docs/align-self
21417       */
21418      "align-self": [{
21419        self: ["auto", ...scaleAlignSecondaryAxis(), {
21420          baseline: ["", "last"]
21421        }]
21422      }],
21423      /**
21424       * Place Content
21425       * @see https://tailwindcss.com/docs/place-content
21426       */
21427      "place-content": [{
21428        "place-content": scaleAlignPrimaryAxis()
21429      }],
21430      /**
21431       * Place Items
21432       * @see https://tailwindcss.com/docs/place-items
21433       */
21434      "place-items": [{
21435        "place-items": [...scaleAlignSecondaryAxis(), "baseline"]
21436      }],
21437      /**
21438       * Place Self
21439       * @see https://tailwindcss.com/docs/place-self
21440       */
21441      "place-self": [{
21442        "place-self": ["auto", ...scaleAlignSecondaryAxis()]
21443      }],
21444      // Spacing
21445      /**
21446       * Padding
21447       * @see https://tailwindcss.com/docs/padding
21448       */
21449      p: [{
21450        p: scaleUnambiguousSpacing()
21451      }],
21452      /**
21453       * Padding X
21454       * @see https://tailwindcss.com/docs/padding
21455       */
21456      px: [{
21457        px: scaleUnambiguousSpacing()
21458      }],
21459      /**
21460       * Padding Y
21461       * @see https://tailwindcss.com/docs/padding
21462       */
21463      py: [{
21464        py: scaleUnambiguousSpacing()
21465      }],
21466      /**
21467       * Padding Start
21468       * @see https://tailwindcss.com/docs/padding
21469       */
21470      ps: [{
21471        ps: scaleUnambiguousSpacing()
21472      }],
21473      /**
21474       * Padding End
21475       * @see https://tailwindcss.com/docs/padding
21476       */
21477      pe: [{
21478        pe: scaleUnambiguousSpacing()
21479      }],
21480      /**
21481       * Padding Top
21482       * @see https://tailwindcss.com/docs/padding
21483       */
21484      pt: [{
21485        pt: scaleUnambiguousSpacing()
21486      }],
21487      /**
21488       * Padding Right
21489       * @see https://tailwindcss.com/docs/padding
21490       */
21491      pr: [{
21492        pr: scaleUnambiguousSpacing()
21493      }],
21494      /**
21495       * Padding Bottom
21496       * @see https://tailwindcss.com/docs/padding
21497       */
21498      pb: [{
21499        pb: scaleUnambiguousSpacing()
21500      }],
21501      /**
21502       * Padding Left
21503       * @see https://tailwindcss.com/docs/padding
21504       */
21505      pl: [{
21506        pl: scaleUnambiguousSpacing()
21507      }],
21508      /**
21509       * Margin
21510       * @see https://tailwindcss.com/docs/margin
21511       */
21512      m: [{
21513        m: scaleMargin()
21514      }],
21515      /**
21516       * Margin X
21517       * @see https://tailwindcss.com/docs/margin
21518       */
21519      mx: [{
21520        mx: scaleMargin()
21521      }],
21522      /**
21523       * Margin Y
21524       * @see https://tailwindcss.com/docs/margin
21525       */
21526      my: [{
21527        my: scaleMargin()
21528      }],
21529      /**
21530       * Margin Start
21531       * @see https://tailwindcss.com/docs/margin
21532       */
21533      ms: [{
21534        ms: scaleMargin()
21535      }],
21536      /**
21537       * Margin End
21538       * @see https://tailwindcss.com/docs/margin
21539       */
21540      me: [{
21541        me: scaleMargin()
21542      }],
21543      /**
21544       * Margin Top
21545       * @see https://tailwindcss.com/docs/margin
21546       */
21547      mt: [{
21548        mt: scaleMargin()
21549      }],
21550      /**
21551       * Margin Right
21552       * @see https://tailwindcss.com/docs/margin
21553       */
21554      mr: [{
21555        mr: scaleMargin()
21556      }],
21557      /**
21558       * Margin Bottom
21559       * @see https://tailwindcss.com/docs/margin
21560       */
21561      mb: [{
21562        mb: scaleMargin()
21563      }],
21564      /**
21565       * Margin Left
21566       * @see https://tailwindcss.com/docs/margin
21567       */
21568      ml: [{
21569        ml: scaleMargin()
21570      }],
21571      /**
21572       * Space Between X
21573       * @see https://tailwindcss.com/docs/margin#adding-space-between-children
21574       */
21575      "space-x": [{
21576        "space-x": scaleUnambiguousSpacing()
21577      }],
21578      /**
21579       * Space Between X Reverse
21580       * @see https://tailwindcss.com/docs/margin#adding-space-between-children
21581       */
21582      "space-x-reverse": ["space-x-reverse"],
21583      /**
21584       * Space Between Y
21585       * @see https://tailwindcss.com/docs/margin#adding-space-between-children
21586       */
21587      "space-y": [{
21588        "space-y": scaleUnambiguousSpacing()
21589      }],
21590      /**
21591       * Space Between Y Reverse
21592       * @see https://tailwindcss.com/docs/margin#adding-space-between-children
21593       */
21594      "space-y-reverse": ["space-y-reverse"],
21595      // --------------
21596      // --- Sizing ---
21597      // --------------
21598      /**
21599       * Size
21600       * @see https://tailwindcss.com/docs/width#setting-both-width-and-height
21601       */
21602      size: [{
21603        size: scaleSizing()
21604      }],
21605      /**
21606       * Width
21607       * @see https://tailwindcss.com/docs/width
21608       */
21609      w: [{
21610        w: [themeContainer, "screen", ...scaleSizing()]
21611      }],
21612      /**
21613       * Min-Width
21614       * @see https://tailwindcss.com/docs/min-width
21615       */
21616      "min-w": [{
21617        "min-w": [
21618          themeContainer,
21619          "screen",
21620          /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
21621          "none",
21622          ...scaleSizing()
21623        ]
21624      }],
21625      /**
21626       * Max-Width
21627       * @see https://tailwindcss.com/docs/max-width
21628       */
21629      "max-w": [{
21630        "max-w": [
vendor: 11,206 bytes, lines 21631-22006
21631          themeContainer,
21632          "screen",
21633          "none",
21634          /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
21635          "prose",
21636          /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
21637          {
21638            screen: [themeBreakpoint]
21639          },
21640          ...scaleSizing()
21641        ]
21642      }],
21643      /**
21644       * Height
21645       * @see https://tailwindcss.com/docs/height
21646       */
21647      h: [{
21648        h: ["screen", "lh", ...scaleSizing()]
21649      }],
21650      /**
21651       * Min-Height
21652       * @see https://tailwindcss.com/docs/min-height
21653       */
21654      "min-h": [{
21655        "min-h": ["screen", "lh", "none", ...scaleSizing()]
21656      }],
21657      /**
21658       * Max-Height
21659       * @see https://tailwindcss.com/docs/max-height
21660       */
21661      "max-h": [{
21662        "max-h": ["screen", "lh", ...scaleSizing()]
21663      }],
21664      // ------------------
21665      // --- Typography ---
21666      // ------------------
21667      /**
21668       * Font Size
21669       * @see https://tailwindcss.com/docs/font-size
21670       */
21671      "font-size": [{
21672        text: ["base", themeText, isArbitraryVariableLength, isArbitraryLength]
21673      }],
21674      /**
21675       * Font Smoothing
21676       * @see https://tailwindcss.com/docs/font-smoothing
21677       */
21678      "font-smoothing": ["antialiased", "subpixel-antialiased"],
21679      /**
21680       * Font Style
21681       * @see https://tailwindcss.com/docs/font-style
21682       */
21683      "font-style": ["italic", "not-italic"],
21684      /**
21685       * Font Weight
21686       * @see https://tailwindcss.com/docs/font-weight
21687       */
21688      "font-weight": [{
21689        font: [themeFontWeight, isArbitraryVariable, isArbitraryNumber]
21690      }],
21691      /**
21692       * Font Stretch
21693       * @see https://tailwindcss.com/docs/font-stretch
21694       */
21695      "font-stretch": [{
21696        "font-stretch": ["ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "normal", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded", isPercent, isArbitraryValue]
21697      }],
21698      /**
21699       * Font Family
21700       * @see https://tailwindcss.com/docs/font-family
21701       */
21702      "font-family": [{
21703        font: [isArbitraryVariableFamilyName, isArbitraryValue, themeFont]
21704      }],
21705      /**
21706       * Font Variant Numeric
21707       * @see https://tailwindcss.com/docs/font-variant-numeric
21708       */
21709      "fvn-normal": ["normal-nums"],
21710      /**
21711       * Font Variant Numeric
21712       * @see https://tailwindcss.com/docs/font-variant-numeric
21713       */
21714      "fvn-ordinal": ["ordinal"],
21715      /**
21716       * Font Variant Numeric
21717       * @see https://tailwindcss.com/docs/font-variant-numeric
21718       */
21719      "fvn-slashed-zero": ["slashed-zero"],
21720      /**
21721       * Font Variant Numeric
21722       * @see https://tailwindcss.com/docs/font-variant-numeric
21723       */
21724      "fvn-figure": ["lining-nums", "oldstyle-nums"],
21725      /**
21726       * Font Variant Numeric
21727       * @see https://tailwindcss.com/docs/font-variant-numeric
21728       */
21729      "fvn-spacing": ["proportional-nums", "tabular-nums"],
21730      /**
21731       * Font Variant Numeric
21732       * @see https://tailwindcss.com/docs/font-variant-numeric
21733       */
21734      "fvn-fraction": ["diagonal-fractions", "stacked-fractions"],
21735      /**
21736       * Letter Spacing
21737       * @see https://tailwindcss.com/docs/letter-spacing
21738       */
21739      tracking: [{
21740        tracking: [themeTracking, isArbitraryVariable, isArbitraryValue]
21741      }],
21742      /**
21743       * Line Clamp
21744       * @see https://tailwindcss.com/docs/line-clamp
21745       */
21746      "line-clamp": [{
21747        "line-clamp": [isNumber, "none", isArbitraryVariable, isArbitraryNumber]
21748      }],
21749      /**
21750       * Line Height
21751       * @see https://tailwindcss.com/docs/line-height
21752       */
21753      leading: [{
21754        leading: [
21755          /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
21756          themeLeading,
21757          ...scaleUnambiguousSpacing()
21758        ]
21759      }],
21760      /**
21761       * List Style Image
21762       * @see https://tailwindcss.com/docs/list-style-image
21763       */
21764      "list-image": [{
21765        "list-image": ["none", isArbitraryVariable, isArbitraryValue]
21766      }],
21767      /**
21768       * List Style Position
21769       * @see https://tailwindcss.com/docs/list-style-position
21770       */
21771      "list-style-position": [{
21772        list: ["inside", "outside"]
21773      }],
21774      /**
21775       * List Style Type
21776       * @see https://tailwindcss.com/docs/list-style-type
21777       */
21778      "list-style-type": [{
21779        list: ["disc", "decimal", "none", isArbitraryVariable, isArbitraryValue]
21780      }],
21781      /**
21782       * Text Alignment
21783       * @see https://tailwindcss.com/docs/text-align
21784       */
21785      "text-alignment": [{
21786        text: ["left", "center", "right", "justify", "start", "end"]
21787      }],
21788      /**
21789       * Placeholder Color
21790       * @deprecated since Tailwind CSS v3.0.0
21791       * @see https://v3.tailwindcss.com/docs/placeholder-color
21792       */
21793      "placeholder-color": [{
21794        placeholder: scaleColor()
21795      }],
21796      /**
21797       * Text Color
21798       * @see https://tailwindcss.com/docs/text-color
21799       */
21800      "text-color": [{
21801        text: scaleColor()
21802      }],
21803      /**
21804       * Text Decoration
21805       * @see https://tailwindcss.com/docs/text-decoration
21806       */
21807      "text-decoration": ["underline", "overline", "line-through", "no-underline"],
21808      /**
21809       * Text Decoration Style
21810       * @see https://tailwindcss.com/docs/text-decoration-style
21811       */
21812      "text-decoration-style": [{
21813        decoration: [...scaleLineStyle(), "wavy"]
21814      }],
21815      /**
21816       * Text Decoration Thickness
21817       * @see https://tailwindcss.com/docs/text-decoration-thickness
21818       */
21819      "text-decoration-thickness": [{
21820        decoration: [isNumber, "from-font", "auto", isArbitraryVariable, isArbitraryLength]
21821      }],
21822      /**
21823       * Text Decoration Color
21824       * @see https://tailwindcss.com/docs/text-decoration-color
21825       */
21826      "text-decoration-color": [{
21827        decoration: scaleColor()
21828      }],
21829      /**
21830       * Text Underline Offset
21831       * @see https://tailwindcss.com/docs/text-underline-offset
21832       */
21833      "underline-offset": [{
21834        "underline-offset": [isNumber, "auto", isArbitraryVariable, isArbitraryValue]
21835      }],
21836      /**
21837       * Text Transform
21838       * @see https://tailwindcss.com/docs/text-transform
21839       */
21840      "text-transform": ["uppercase", "lowercase", "capitalize", "normal-case"],
21841      /**
21842       * Text Overflow
21843       * @see https://tailwindcss.com/docs/text-overflow
21844       */
21845      "text-overflow": ["truncate", "text-ellipsis", "text-clip"],
21846      /**
21847       * Text Wrap
21848       * @see https://tailwindcss.com/docs/text-wrap
21849       */
21850      "text-wrap": [{
21851        text: ["wrap", "nowrap", "balance", "pretty"]
21852      }],
21853      /**
21854       * Text Indent
21855       * @see https://tailwindcss.com/docs/text-indent
21856       */
21857      indent: [{
21858        indent: scaleUnambiguousSpacing()
21859      }],
21860      /**
21861       * Vertical Alignment
21862       * @see https://tailwindcss.com/docs/vertical-align
21863       */
21864      "vertical-align": [{
21865        align: ["baseline", "top", "middle", "bottom", "text-top", "text-bottom", "sub", "super", isArbitraryVariable, isArbitraryValue]
21866      }],
21867      /**
21868       * Whitespace
21869       * @see https://tailwindcss.com/docs/whitespace
21870       */
21871      whitespace: [{
21872        whitespace: ["normal", "nowrap", "pre", "pre-line", "pre-wrap", "break-spaces"]
21873      }],
21874      /**
21875       * Word Break
21876       * @see https://tailwindcss.com/docs/word-break
21877       */
21878      break: [{
21879        break: ["normal", "words", "all", "keep"]
21880      }],
21881      /**
21882       * Overflow Wrap
21883       * @see https://tailwindcss.com/docs/overflow-wrap
21884       */
21885      wrap: [{
21886        wrap: ["break-word", "anywhere", "normal"]
21887      }],
21888      /**
21889       * Hyphens
21890       * @see https://tailwindcss.com/docs/hyphens
21891       */
21892      hyphens: [{
21893        hyphens: ["none", "manual", "auto"]
21894      }],
21895      /**
21896       * Content
21897       * @see https://tailwindcss.com/docs/content
21898       */
21899      content: [{
21900        content: ["none", isArbitraryVariable, isArbitraryValue]
21901      }],
21902      // -------------------
21903      // --- Backgrounds ---
21904      // -------------------
21905      /**
21906       * Background Attachment
21907       * @see https://tailwindcss.com/docs/background-attachment
21908       */
21909      "bg-attachment": [{
21910        bg: ["fixed", "local", "scroll"]
21911      }],
21912      /**
21913       * Background Clip
21914       * @see https://tailwindcss.com/docs/background-clip
21915       */
21916      "bg-clip": [{
21917        "bg-clip": ["border", "padding", "content", "text"]
21918      }],
21919      /**
21920       * Background Origin
21921       * @see https://tailwindcss.com/docs/background-origin
21922       */
21923      "bg-origin": [{
21924        "bg-origin": ["border", "padding", "content"]
21925      }],
21926      /**
21927       * Background Position
21928       * @see https://tailwindcss.com/docs/background-position
21929       */
21930      "bg-position": [{
21931        bg: scaleBgPosition()
21932      }],
21933      /**
21934       * Background Repeat
21935       * @see https://tailwindcss.com/docs/background-repeat
21936       */
21937      "bg-repeat": [{
21938        bg: scaleBgRepeat()
21939      }],
21940      /**
21941       * Background Size
21942       * @see https://tailwindcss.com/docs/background-size
21943       */
21944      "bg-size": [{
21945        bg: scaleBgSize()
21946      }],
21947      /**
21948       * Background Image
21949       * @see https://tailwindcss.com/docs/background-image
21950       */
21951      "bg-image": [{
21952        bg: ["none", {
21953          linear: [{
21954            to: ["t", "tr", "r", "br", "b", "bl", "l", "tl"]
21955          }, isInteger, isArbitraryVariable, isArbitraryValue],
21956          radial: ["", isArbitraryVariable, isArbitraryValue],
21957          conic: [isInteger, isArbitraryVariable, isArbitraryValue]
21958        }, isArbitraryVariableImage, isArbitraryImage]
21959      }],
21960      /**
21961       * Background Color
21962       * @see https://tailwindcss.com/docs/background-color
21963       */
21964      "bg-color": [{
21965        bg: scaleColor()
21966      }],
21967      /**
21968       * Gradient Color Stops From Position
21969       * @see https://tailwindcss.com/docs/gradient-color-stops
21970       */
21971      "gradient-from-pos": [{
21972        from: scaleGradientStopPosition()
21973      }],
21974      /**
21975       * Gradient Color Stops Via Position
21976       * @see https://tailwindcss.com/docs/gradient-color-stops
21977       */
21978      "gradient-via-pos": [{
21979        via: scaleGradientStopPosition()
21980      }],
21981      /**
21982       * Gradient Color Stops To Position
21983       * @see https://tailwindcss.com/docs/gradient-color-stops
21984       */
21985      "gradient-to-pos": [{
21986        to: scaleGradientStopPosition()
21987      }],
21988      /**
21989       * Gradient Color Stops From
21990       * @see https://tailwindcss.com/docs/gradient-color-stops
21991       */
21992      "gradient-from": [{
21993        from: scaleColor()
21994      }],
21995      /**
21996       * Gradient Color Stops Via
21997       * @see https://tailwindcss.com/docs/gradient-color-stops
21998       */
21999      "gradient-via": [{
22000        via: scaleColor()
22001      }],
22002      /**
22003       * Gradient Color Stops To
22004       * @see https://tailwindcss.com/docs/gradient-color-stops
22005       */
22006      "gradient-to": [{
22007        to: scaleColor()
22008      }],
22009      // ---------------
22010      // --- Borders ---
22011      // ---------------
22012      /**
22013       * Border Radius
22014       * @see https://tailwindcss.com/docs/border-radius
22015       */
22016      rounded: [{
22017        rounded: scaleRadius()
22018      }],
22019      /**
22020       * Border Radius Start
22021       * @see https://tailwindcss.com/docs/border-radius
22022       */
22023      "rounded-s": [{
22024        "rounded-s": scaleRadius()
22025      }],
22026      /**
22027       * Border Radius End
22028       * @see https://tailwindcss.com/docs/border-radius
22029       */
22030      "rounded-e": [{
22031        "rounded-e": scaleRadius()
22032      }],
22033      /**
22034       * Border Radius Top
22035       * @see https://tailwindcss.com/docs/border-radius
22036       */
22037      "rounded-t": [{
22038        "rounded-t": scaleRadius()
22039      }],
22040      /**
22041       * Border Radius Right
22042       * @see https://tailwindcss.com/docs/border-radius
22043       */
22044      "rounded-r": [{
22045        "rounded-r": scaleRadius()
22046      }],
22047      /**
22048       * Border Radius Bottom
22049       * @see https://tailwindcss.com/docs/border-radius
22050       */
22051      "rounded-b": [{
22052        "rounded-b": scaleRadius()
22053      }],
22054      /**
22055       * Border Radius Left
22056       * @see https://tailwindcss.com/docs/border-radius
22057       */
22058      "rounded-l": [{
22059        "rounded-l": scaleRadius()
22060      }],
22061      /**
22062       * Border Radius Start Start
22063       * @see https://tailwindcss.com/docs/border-radius
22064       */
22065      "rounded-ss": [{
22066        "rounded-ss": scaleRadius()
22067      }],
22068      /**
22069       * Border Radius Start End
22070       * @see https://tailwindcss.com/docs/border-radius
22071       */
22072      "rounded-se": [{
22073        "rounded-se": scaleRadius()
22074      }],
22075      /**
22076       * Border Radius End End
22077       * @see https://tailwindcss.com/docs/border-radius
22078       */
22079      "rounded-ee": [{
22080        "rounded-ee": scaleRadius()
22081      }],
22082      /**
22083       * Border Radius End Start
22084       * @see https://tailwindcss.com/docs/border-radius
22085       */
22086      "rounded-es": [{
22087        "rounded-es": scaleRadius()
22088      }],
22089      /**
22090       * Border Radius Top Left
22091       * @see https://tailwindcss.com/docs/border-radius
22092       */
22093      "rounded-tl": [{
22094        "rounded-tl": scaleRadius()
22095      }],
22096      /**
22097       * Border Radius Top Right
22098       * @see https://tailwindcss.com/docs/border-radius
22099       */
22100      "rounded-tr": [{
22101        "rounded-tr": scaleRadius()
22102      }],
22103      /**
22104       * Border Radius Bottom Right
22105       * @see https://tailwindcss.com/docs/border-radius
22106       */
22107      "rounded-br": [{
22108        "rounded-br": scaleRadius()
22109      }],
22110      /**
22111       * Border Radius Bottom Left
22112       * @see https://tailwindcss.com/docs/border-radius
22113       */
22114      "rounded-bl": [{
22115        "rounded-bl": scaleRadius()
22116      }],
22117      /**
22118       * Border Width
22119       * @see https://tailwindcss.com/docs/border-width
22120       */
22121      "border-w": [{
22122        border: scaleBorderWidth()
22123      }],
22124      /**
22125       * Border Width X
22126       * @see https://tailwindcss.com/docs/border-width
22127       */
22128      "border-w-x": [{
22129        "border-x": scaleBorderWidth()
22130      }],
22131      /**
22132       * Border Width Y
22133       * @see https://tailwindcss.com/docs/border-width
22134       */
22135      "border-w-y": [{
22136        "border-y": scaleBorderWidth()
22137      }],
22138      /**
22139       * Border Width Start
22140       * @see https://tailwindcss.com/docs/border-width
22141       */
22142      "border-w-s": [{
22143        "border-s": scaleBorderWidth()
22144      }],
22145      /**
22146       * Border Width End
22147       * @see https://tailwindcss.com/docs/border-width
22148       */
22149      "border-w-e": [{
22150        "border-e": scaleBorderWidth()
22151      }],
22152      /**
22153       * Border Width Top
22154       * @see https://tailwindcss.com/docs/border-width
22155       */
22156      "border-w-t": [{
22157        "border-t": scaleBorderWidth()
22158      }],
22159      /**
22160       * Border Width Right
22161       * @see https://tailwindcss.com/docs/border-width
22162       */
22163      "border-w-r": [{
22164        "border-r": scaleBorderWidth()
22165      }],
22166      /**
22167       * Border Width Bottom
22168       * @see https://tailwindcss.com/docs/border-width
22169       */
22170      "border-w-b": [{
22171        "border-b": scaleBorderWidth()
22172      }],
22173      /**
22174       * Border Width Left
22175       * @see https://tailwindcss.com/docs/border-width
22176       */
vendor: 24,896 bytes, lines 22177-23088
22177      "border-w-l": [{
22178        "border-l": scaleBorderWidth()
22179      }],
22180      /**
22181       * Divide Width X
22182       * @see https://tailwindcss.com/docs/border-width#between-children
22183       */
22184      "divide-x": [{
22185        "divide-x": scaleBorderWidth()
22186      }],
22187      /**
22188       * Divide Width X Reverse
22189       * @see https://tailwindcss.com/docs/border-width#between-children
22190       */
22191      "divide-x-reverse": ["divide-x-reverse"],
22192      /**
22193       * Divide Width Y
22194       * @see https://tailwindcss.com/docs/border-width#between-children
22195       */
22196      "divide-y": [{
22197        "divide-y": scaleBorderWidth()
22198      }],
22199      /**
22200       * Divide Width Y Reverse
22201       * @see https://tailwindcss.com/docs/border-width#between-children
22202       */
22203      "divide-y-reverse": ["divide-y-reverse"],
22204      /**
22205       * Border Style
22206       * @see https://tailwindcss.com/docs/border-style
22207       */
22208      "border-style": [{
22209        border: [...scaleLineStyle(), "hidden", "none"]
22210      }],
22211      /**
22212       * Divide Style
22213       * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style
22214       */
22215      "divide-style": [{
22216        divide: [...scaleLineStyle(), "hidden", "none"]
22217      }],
22218      /**
22219       * Border Color
22220       * @see https://tailwindcss.com/docs/border-color
22221       */
22222      "border-color": [{
22223        border: scaleColor()
22224      }],
22225      /**
22226       * Border Color X
22227       * @see https://tailwindcss.com/docs/border-color
22228       */
22229      "border-color-x": [{
22230        "border-x": scaleColor()
22231      }],
22232      /**
22233       * Border Color Y
22234       * @see https://tailwindcss.com/docs/border-color
22235       */
22236      "border-color-y": [{
22237        "border-y": scaleColor()
22238      }],
22239      /**
22240       * Border Color S
22241       * @see https://tailwindcss.com/docs/border-color
22242       */
22243      "border-color-s": [{
22244        "border-s": scaleColor()
22245      }],
22246      /**
22247       * Border Color E
22248       * @see https://tailwindcss.com/docs/border-color
22249       */
22250      "border-color-e": [{
22251        "border-e": scaleColor()
22252      }],
22253      /**
22254       * Border Color Top
22255       * @see https://tailwindcss.com/docs/border-color
22256       */
22257      "border-color-t": [{
22258        "border-t": scaleColor()
22259      }],
22260      /**
22261       * Border Color Right
22262       * @see https://tailwindcss.com/docs/border-color
22263       */
22264      "border-color-r": [{
22265        "border-r": scaleColor()
22266      }],
22267      /**
22268       * Border Color Bottom
22269       * @see https://tailwindcss.com/docs/border-color
22270       */
22271      "border-color-b": [{
22272        "border-b": scaleColor()
22273      }],
22274      /**
22275       * Border Color Left
22276       * @see https://tailwindcss.com/docs/border-color
22277       */
22278      "border-color-l": [{
22279        "border-l": scaleColor()
22280      }],
22281      /**
22282       * Divide Color
22283       * @see https://tailwindcss.com/docs/divide-color
22284       */
22285      "divide-color": [{
22286        divide: scaleColor()
22287      }],
22288      /**
22289       * Outline Style
22290       * @see https://tailwindcss.com/docs/outline-style
22291       */
22292      "outline-style": [{
22293        outline: [...scaleLineStyle(), "none", "hidden"]
22294      }],
22295      /**
22296       * Outline Offset
22297       * @see https://tailwindcss.com/docs/outline-offset
22298       */
22299      "outline-offset": [{
22300        "outline-offset": [isNumber, isArbitraryVariable, isArbitraryValue]
22301      }],
22302      /**
22303       * Outline Width
22304       * @see https://tailwindcss.com/docs/outline-width
22305       */
22306      "outline-w": [{
22307        outline: ["", isNumber, isArbitraryVariableLength, isArbitraryLength]
22308      }],
22309      /**
22310       * Outline Color
22311       * @see https://tailwindcss.com/docs/outline-color
22312       */
22313      "outline-color": [{
22314        outline: scaleColor()
22315      }],
22316      // ---------------
22317      // --- Effects ---
22318      // ---------------
22319      /**
22320       * Box Shadow
22321       * @see https://tailwindcss.com/docs/box-shadow
22322       */
22323      shadow: [{
22324        shadow: [
22325          // Deprecated since Tailwind CSS v4.0.0
22326          "",
22327          "none",
22328          themeShadow,
22329          isArbitraryVariableShadow,
22330          isArbitraryShadow
22331        ]
22332      }],
22333      /**
22334       * Box Shadow Color
22335       * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color
22336       */
22337      "shadow-color": [{
22338        shadow: scaleColor()
22339      }],
22340      /**
22341       * Inset Box Shadow
22342       * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow
22343       */
22344      "inset-shadow": [{
22345        "inset-shadow": ["none", themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow]
22346      }],
22347      /**
22348       * Inset Box Shadow Color
22349       * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color
22350       */
22351      "inset-shadow-color": [{
22352        "inset-shadow": scaleColor()
22353      }],
22354      /**
22355       * Ring Width
22356       * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring
22357       */
22358      "ring-w": [{
22359        ring: scaleBorderWidth()
22360      }],
22361      /**
22362       * Ring Width Inset
22363       * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings
22364       * @deprecated since Tailwind CSS v4.0.0
22365       * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
22366       */
22367      "ring-w-inset": ["ring-inset"],
22368      /**
22369       * Ring Color
22370       * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color
22371       */
22372      "ring-color": [{
22373        ring: scaleColor()
22374      }],
22375      /**
22376       * Ring Offset Width
22377       * @see https://v3.tailwindcss.com/docs/ring-offset-width
22378       * @deprecated since Tailwind CSS v4.0.0
22379       * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
22380       */
22381      "ring-offset-w": [{
22382        "ring-offset": [isNumber, isArbitraryLength]
22383      }],
22384      /**
22385       * Ring Offset Color
22386       * @see https://v3.tailwindcss.com/docs/ring-offset-color
22387       * @deprecated since Tailwind CSS v4.0.0
22388       * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
22389       */
22390      "ring-offset-color": [{
22391        "ring-offset": scaleColor()
22392      }],
22393      /**
22394       * Inset Ring Width
22395       * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring
22396       */
22397      "inset-ring-w": [{
22398        "inset-ring": scaleBorderWidth()
22399      }],
22400      /**
22401       * Inset Ring Color
22402       * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color
22403       */
22404      "inset-ring-color": [{
22405        "inset-ring": scaleColor()
22406      }],
22407      /**
22408       * Text Shadow
22409       * @see https://tailwindcss.com/docs/text-shadow
22410       */
22411      "text-shadow": [{
22412        "text-shadow": ["none", themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow]
22413      }],
22414      /**
22415       * Text Shadow Color
22416       * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color
22417       */
22418      "text-shadow-color": [{
22419        "text-shadow": scaleColor()
22420      }],
22421      /**
22422       * Opacity
22423       * @see https://tailwindcss.com/docs/opacity
22424       */
22425      opacity: [{
22426        opacity: [isNumber, isArbitraryVariable, isArbitraryValue]
22427      }],
22428      /**
22429       * Mix Blend Mode
22430       * @see https://tailwindcss.com/docs/mix-blend-mode
22431       */
22432      "mix-blend": [{
22433        "mix-blend": [...scaleBlendMode(), "plus-darker", "plus-lighter"]
22434      }],
22435      /**
22436       * Background Blend Mode
22437       * @see https://tailwindcss.com/docs/background-blend-mode
22438       */
22439      "bg-blend": [{
22440        "bg-blend": scaleBlendMode()
22441      }],
22442      /**
22443       * Mask Clip
22444       * @see https://tailwindcss.com/docs/mask-clip
22445       */
22446      "mask-clip": [{
22447        "mask-clip": ["border", "padding", "content", "fill", "stroke", "view"]
22448      }, "mask-no-clip"],
22449      /**
22450       * Mask Composite
22451       * @see https://tailwindcss.com/docs/mask-composite
22452       */
22453      "mask-composite": [{
22454        mask: ["add", "subtract", "intersect", "exclude"]
22455      }],
22456      /**
22457       * Mask Image
22458       * @see https://tailwindcss.com/docs/mask-image
22459       */
22460      "mask-image-linear-pos": [{
22461        "mask-linear": [isNumber]
22462      }],
22463      "mask-image-linear-from-pos": [{
22464        "mask-linear-from": scaleMaskImagePosition()
22465      }],
22466      "mask-image-linear-to-pos": [{
22467        "mask-linear-to": scaleMaskImagePosition()
22468      }],
22469      "mask-image-linear-from-color": [{
22470        "mask-linear-from": scaleColor()
22471      }],
22472      "mask-image-linear-to-color": [{
22473        "mask-linear-to": scaleColor()
22474      }],
22475      "mask-image-t-from-pos": [{
22476        "mask-t-from": scaleMaskImagePosition()
22477      }],
22478      "mask-image-t-to-pos": [{
22479        "mask-t-to": scaleMaskImagePosition()
22480      }],
22481      "mask-image-t-from-color": [{
22482        "mask-t-from": scaleColor()
22483      }],
22484      "mask-image-t-to-color": [{
22485        "mask-t-to": scaleColor()
22486      }],
22487      "mask-image-r-from-pos": [{
22488        "mask-r-from": scaleMaskImagePosition()
22489      }],
22490      "mask-image-r-to-pos": [{
22491        "mask-r-to": scaleMaskImagePosition()
22492      }],
22493      "mask-image-r-from-color": [{
22494        "mask-r-from": scaleColor()
22495      }],
22496      "mask-image-r-to-color": [{
22497        "mask-r-to": scaleColor()
22498      }],
22499      "mask-image-b-from-pos": [{
22500        "mask-b-from": scaleMaskImagePosition()
22501      }],
22502      "mask-image-b-to-pos": [{
22503        "mask-b-to": scaleMaskImagePosition()
22504      }],
22505      "mask-image-b-from-color": [{
22506        "mask-b-from": scaleColor()
22507      }],
22508      "mask-image-b-to-color": [{
22509        "mask-b-to": scaleColor()
22510      }],
22511      "mask-image-l-from-pos": [{
22512        "mask-l-from": scaleMaskImagePosition()
22513      }],
22514      "mask-image-l-to-pos": [{
22515        "mask-l-to": scaleMaskImagePosition()
22516      }],
22517      "mask-image-l-from-color": [{
22518        "mask-l-from": scaleColor()
22519      }],
22520      "mask-image-l-to-color": [{
22521        "mask-l-to": scaleColor()
22522      }],
22523      "mask-image-x-from-pos": [{
22524        "mask-x-from": scaleMaskImagePosition()
22525      }],
22526      "mask-image-x-to-pos": [{
22527        "mask-x-to": scaleMaskImagePosition()
22528      }],
22529      "mask-image-x-from-color": [{
22530        "mask-x-from": scaleColor()
22531      }],
22532      "mask-image-x-to-color": [{
22533        "mask-x-to": scaleColor()
22534      }],
22535      "mask-image-y-from-pos": [{
22536        "mask-y-from": scaleMaskImagePosition()
22537      }],
22538      "mask-image-y-to-pos": [{
22539        "mask-y-to": scaleMaskImagePosition()
22540      }],
22541      "mask-image-y-from-color": [{
22542        "mask-y-from": scaleColor()
22543      }],
22544      "mask-image-y-to-color": [{
22545        "mask-y-to": scaleColor()
22546      }],
22547      "mask-image-radial": [{
22548        "mask-radial": [isArbitraryVariable, isArbitraryValue]
22549      }],
22550      "mask-image-radial-from-pos": [{
22551        "mask-radial-from": scaleMaskImagePosition()
22552      }],
22553      "mask-image-radial-to-pos": [{
22554        "mask-radial-to": scaleMaskImagePosition()
22555      }],
22556      "mask-image-radial-from-color": [{
22557        "mask-radial-from": scaleColor()
22558      }],
22559      "mask-image-radial-to-color": [{
22560        "mask-radial-to": scaleColor()
22561      }],
22562      "mask-image-radial-shape": [{
22563        "mask-radial": ["circle", "ellipse"]
22564      }],
22565      "mask-image-radial-size": [{
22566        "mask-radial": [{
22567          closest: ["side", "corner"],
22568          farthest: ["side", "corner"]
22569        }]
22570      }],
22571      "mask-image-radial-pos": [{
22572        "mask-radial-at": scalePosition()
22573      }],
22574      "mask-image-conic-pos": [{
22575        "mask-conic": [isNumber]
22576      }],
22577      "mask-image-conic-from-pos": [{
22578        "mask-conic-from": scaleMaskImagePosition()
22579      }],
22580      "mask-image-conic-to-pos": [{
22581        "mask-conic-to": scaleMaskImagePosition()
22582      }],
22583      "mask-image-conic-from-color": [{
22584        "mask-conic-from": scaleColor()
22585      }],
22586      "mask-image-conic-to-color": [{
22587        "mask-conic-to": scaleColor()
22588      }],
22589      /**
22590       * Mask Mode
22591       * @see https://tailwindcss.com/docs/mask-mode
22592       */
22593      "mask-mode": [{
22594        mask: ["alpha", "luminance", "match"]
22595      }],
22596      /**
22597       * Mask Origin
22598       * @see https://tailwindcss.com/docs/mask-origin
22599       */
22600      "mask-origin": [{
22601        "mask-origin": ["border", "padding", "content", "fill", "stroke", "view"]
22602      }],
22603      /**
22604       * Mask Position
22605       * @see https://tailwindcss.com/docs/mask-position
22606       */
22607      "mask-position": [{
22608        mask: scaleBgPosition()
22609      }],
22610      /**
22611       * Mask Repeat
22612       * @see https://tailwindcss.com/docs/mask-repeat
22613       */
22614      "mask-repeat": [{
22615        mask: scaleBgRepeat()
22616      }],
22617      /**
22618       * Mask Size
22619       * @see https://tailwindcss.com/docs/mask-size
22620       */
22621      "mask-size": [{
22622        mask: scaleBgSize()
22623      }],
22624      /**
22625       * Mask Type
22626       * @see https://tailwindcss.com/docs/mask-type
22627       */
22628      "mask-type": [{
22629        "mask-type": ["alpha", "luminance"]
22630      }],
22631      /**
22632       * Mask Image
22633       * @see https://tailwindcss.com/docs/mask-image
22634       */
22635      "mask-image": [{
22636        mask: ["none", isArbitraryVariable, isArbitraryValue]
22637      }],
22638      // ---------------
22639      // --- Filters ---
22640      // ---------------
22641      /**
22642       * Filter
22643       * @see https://tailwindcss.com/docs/filter
22644       */
22645      filter: [{
22646        filter: [
22647          // Deprecated since Tailwind CSS v3.0.0
22648          "",
22649          "none",
22650          isArbitraryVariable,
22651          isArbitraryValue
22652        ]
22653      }],
22654      /**
22655       * Blur
22656       * @see https://tailwindcss.com/docs/blur
22657       */
22658      blur: [{
22659        blur: scaleBlur()
22660      }],
22661      /**
22662       * Brightness
22663       * @see https://tailwindcss.com/docs/brightness
22664       */
22665      brightness: [{
22666        brightness: [isNumber, isArbitraryVariable, isArbitraryValue]
22667      }],
22668      /**
22669       * Contrast
22670       * @see https://tailwindcss.com/docs/contrast
22671       */
22672      contrast: [{
22673        contrast: [isNumber, isArbitraryVariable, isArbitraryValue]
22674      }],
22675      /**
22676       * Drop Shadow
22677       * @see https://tailwindcss.com/docs/drop-shadow
22678       */
22679      "drop-shadow": [{
22680        "drop-shadow": [
22681          // Deprecated since Tailwind CSS v4.0.0
22682          "",
22683          "none",
22684          themeDropShadow,
22685          isArbitraryVariableShadow,
22686          isArbitraryShadow
22687        ]
22688      }],
22689      /**
22690       * Drop Shadow Color
22691       * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color
22692       */
22693      "drop-shadow-color": [{
22694        "drop-shadow": scaleColor()
22695      }],
22696      /**
22697       * Grayscale
22698       * @see https://tailwindcss.com/docs/grayscale
22699       */
22700      grayscale: [{
22701        grayscale: ["", isNumber, isArbitraryVariable, isArbitraryValue]
22702      }],
22703      /**
22704       * Hue Rotate
22705       * @see https://tailwindcss.com/docs/hue-rotate
22706       */
22707      "hue-rotate": [{
22708        "hue-rotate": [isNumber, isArbitraryVariable, isArbitraryValue]
22709      }],
22710      /**
22711       * Invert
22712       * @see https://tailwindcss.com/docs/invert
22713       */
22714      invert: [{
22715        invert: ["", isNumber, isArbitraryVariable, isArbitraryValue]
22716      }],
22717      /**
22718       * Saturate
22719       * @see https://tailwindcss.com/docs/saturate
22720       */
22721      saturate: [{
22722        saturate: [isNumber, isArbitraryVariable, isArbitraryValue]
22723      }],
22724      /**
22725       * Sepia
22726       * @see https://tailwindcss.com/docs/sepia
22727       */
22728      sepia: [{
22729        sepia: ["", isNumber, isArbitraryVariable, isArbitraryValue]
22730      }],
22731      /**
22732       * Backdrop Filter
22733       * @see https://tailwindcss.com/docs/backdrop-filter
22734       */
22735      "backdrop-filter": [{
22736        "backdrop-filter": [
22737          // Deprecated since Tailwind CSS v3.0.0
22738          "",
22739          "none",
22740          isArbitraryVariable,
22741          isArbitraryValue
22742        ]
22743      }],
22744      /**
22745       * Backdrop Blur
22746       * @see https://tailwindcss.com/docs/backdrop-blur
22747       */
22748      "backdrop-blur": [{
22749        "backdrop-blur": scaleBlur()
22750      }],
22751      /**
22752       * Backdrop Brightness
22753       * @see https://tailwindcss.com/docs/backdrop-brightness
22754       */
22755      "backdrop-brightness": [{
22756        "backdrop-brightness": [isNumber, isArbitraryVariable, isArbitraryValue]
22757      }],
22758      /**
22759       * Backdrop Contrast
22760       * @see https://tailwindcss.com/docs/backdrop-contrast
22761       */
22762      "backdrop-contrast": [{
22763        "backdrop-contrast": [isNumber, isArbitraryVariable, isArbitraryValue]
22764      }],
22765      /**
22766       * Backdrop Grayscale
22767       * @see https://tailwindcss.com/docs/backdrop-grayscale
22768       */
22769      "backdrop-grayscale": [{
22770        "backdrop-grayscale": ["", isNumber, isArbitraryVariable, isArbitraryValue]
22771      }],
22772      /**
22773       * Backdrop Hue Rotate
22774       * @see https://tailwindcss.com/docs/backdrop-hue-rotate
22775       */
22776      "backdrop-hue-rotate": [{
22777        "backdrop-hue-rotate": [isNumber, isArbitraryVariable, isArbitraryValue]
22778      }],
22779      /**
22780       * Backdrop Invert
22781       * @see https://tailwindcss.com/docs/backdrop-invert
22782       */
22783      "backdrop-invert": [{
22784        "backdrop-invert": ["", isNumber, isArbitraryVariable, isArbitraryValue]
22785      }],
22786      /**
22787       * Backdrop Opacity
22788       * @see https://tailwindcss.com/docs/backdrop-opacity
22789       */
22790      "backdrop-opacity": [{
22791        "backdrop-opacity": [isNumber, isArbitraryVariable, isArbitraryValue]
22792      }],
22793      /**
22794       * Backdrop Saturate
22795       * @see https://tailwindcss.com/docs/backdrop-saturate
22796       */
22797      "backdrop-saturate": [{
22798        "backdrop-saturate": [isNumber, isArbitraryVariable, isArbitraryValue]
22799      }],
22800      /**
22801       * Backdrop Sepia
22802       * @see https://tailwindcss.com/docs/backdrop-sepia
22803       */
22804      "backdrop-sepia": [{
22805        "backdrop-sepia": ["", isNumber, isArbitraryVariable, isArbitraryValue]
22806      }],
22807      // --------------
22808      // --- Tables ---
22809      // --------------
22810      /**
22811       * Border Collapse
22812       * @see https://tailwindcss.com/docs/border-collapse
22813       */
22814      "border-collapse": [{
22815        border: ["collapse", "separate"]
22816      }],
22817      /**
22818       * Border Spacing
22819       * @see https://tailwindcss.com/docs/border-spacing
22820       */
22821      "border-spacing": [{
22822        "border-spacing": scaleUnambiguousSpacing()
22823      }],
22824      /**
22825       * Border Spacing X
22826       * @see https://tailwindcss.com/docs/border-spacing
22827       */
22828      "border-spacing-x": [{
22829        "border-spacing-x": scaleUnambiguousSpacing()
22830      }],
22831      /**
22832       * Border Spacing Y
22833       * @see https://tailwindcss.com/docs/border-spacing
22834       */
22835      "border-spacing-y": [{
22836        "border-spacing-y": scaleUnambiguousSpacing()
22837      }],
22838      /**
22839       * Table Layout
22840       * @see https://tailwindcss.com/docs/table-layout
22841       */
22842      "table-layout": [{
22843        table: ["auto", "fixed"]
22844      }],
22845      /**
22846       * Caption Side
22847       * @see https://tailwindcss.com/docs/caption-side
22848       */
22849      caption: [{
22850        caption: ["top", "bottom"]
22851      }],
22852      // ---------------------------------
22853      // --- Transitions and Animation ---
22854      // ---------------------------------
22855      /**
22856       * Transition Property
22857       * @see https://tailwindcss.com/docs/transition-property
22858       */
22859      transition: [{
22860        transition: ["", "all", "colors", "opacity", "shadow", "transform", "none", isArbitraryVariable, isArbitraryValue]
22861      }],
22862      /**
22863       * Transition Behavior
22864       * @see https://tailwindcss.com/docs/transition-behavior
22865       */
22866      "transition-behavior": [{
22867        transition: ["normal", "discrete"]
22868      }],
22869      /**
22870       * Transition Duration
22871       * @see https://tailwindcss.com/docs/transition-duration
22872       */
22873      duration: [{
22874        duration: [isNumber, "initial", isArbitraryVariable, isArbitraryValue]
22875      }],
22876      /**
22877       * Transition Timing Function
22878       * @see https://tailwindcss.com/docs/transition-timing-function
22879       */
22880      ease: [{
22881        ease: ["linear", "initial", themeEase, isArbitraryVariable, isArbitraryValue]
22882      }],
22883      /**
22884       * Transition Delay
22885       * @see https://tailwindcss.com/docs/transition-delay
22886       */
22887      delay: [{
22888        delay: [isNumber, isArbitraryVariable, isArbitraryValue]
22889      }],
22890      /**
22891       * Animation
22892       * @see https://tailwindcss.com/docs/animation
22893       */
22894      animate: [{
22895        animate: ["none", themeAnimate, isArbitraryVariable, isArbitraryValue]
22896      }],
22897      // ------------------
22898      // --- Transforms ---
22899      // ------------------
22900      /**
22901       * Backface Visibility
22902       * @see https://tailwindcss.com/docs/backface-visibility
22903       */
22904      backface: [{
22905        backface: ["hidden", "visible"]
22906      }],
22907      /**
22908       * Perspective
22909       * @see https://tailwindcss.com/docs/perspective
22910       */
22911      perspective: [{
22912        perspective: [themePerspective, isArbitraryVariable, isArbitraryValue]
22913      }],
22914      /**
22915       * Perspective Origin
22916       * @see https://tailwindcss.com/docs/perspective-origin
22917       */
22918      "perspective-origin": [{
22919        "perspective-origin": scalePositionWithArbitrary()
22920      }],
22921      /**
22922       * Rotate
22923       * @see https://tailwindcss.com/docs/rotate
22924       */
22925      rotate: [{
22926        rotate: scaleRotate()
22927      }],
22928      /**
22929       * Rotate X
22930       * @see https://tailwindcss.com/docs/rotate
22931       */
22932      "rotate-x": [{
22933        "rotate-x": scaleRotate()
22934      }],
22935      /**
22936       * Rotate Y
22937       * @see https://tailwindcss.com/docs/rotate
22938       */
22939      "rotate-y": [{
22940        "rotate-y": scaleRotate()
22941      }],
22942      /**
22943       * Rotate Z
22944       * @see https://tailwindcss.com/docs/rotate
22945       */
22946      "rotate-z": [{
22947        "rotate-z": scaleRotate()
22948      }],
22949      /**
22950       * Scale
22951       * @see https://tailwindcss.com/docs/scale
22952       */
22953      scale: [{
22954        scale: scaleScale()
22955      }],
22956      /**
22957       * Scale X
22958       * @see https://tailwindcss.com/docs/scale
22959       */
22960      "scale-x": [{
22961        "scale-x": scaleScale()
22962      }],
22963      /**
22964       * Scale Y
22965       * @see https://tailwindcss.com/docs/scale
22966       */
22967      "scale-y": [{
22968        "scale-y": scaleScale()
22969      }],
22970      /**
22971       * Scale Z
22972       * @see https://tailwindcss.com/docs/scale
22973       */
22974      "scale-z": [{
22975        "scale-z": scaleScale()
22976      }],
22977      /**
22978       * Scale 3D
22979       * @see https://tailwindcss.com/docs/scale
22980       */
22981      "scale-3d": ["scale-3d"],
22982      /**
22983       * Skew
22984       * @see https://tailwindcss.com/docs/skew
22985       */
22986      skew: [{
22987        skew: scaleSkew()
22988      }],
22989      /**
22990       * Skew X
22991       * @see https://tailwindcss.com/docs/skew
22992       */
22993      "skew-x": [{
22994        "skew-x": scaleSkew()
22995      }],
22996      /**
22997       * Skew Y
22998       * @see https://tailwindcss.com/docs/skew
22999       */
23000      "skew-y": [{
23001        "skew-y": scaleSkew()
23002      }],
23003      /**
23004       * Transform
23005       * @see https://tailwindcss.com/docs/transform
23006       */
23007      transform: [{
23008        transform: [isArbitraryVariable, isArbitraryValue, "", "none", "gpu", "cpu"]
23009      }],
23010      /**
23011       * Transform Origin
23012       * @see https://tailwindcss.com/docs/transform-origin
23013       */
23014      "transform-origin": [{
23015        origin: scalePositionWithArbitrary()
23016      }],
23017      /**
23018       * Transform Style
23019       * @see https://tailwindcss.com/docs/transform-style
23020       */
23021      "transform-style": [{
23022        transform: ["3d", "flat"]
23023      }],
23024      /**
23025       * Translate
23026       * @see https://tailwindcss.com/docs/translate
23027       */
23028      translate: [{
23029        translate: scaleTranslate()
23030      }],
23031      /**
23032       * Translate X
23033       * @see https://tailwindcss.com/docs/translate
23034       */
23035      "translate-x": [{
23036        "translate-x": scaleTranslate()
23037      }],
23038      /**
23039       * Translate Y
23040       * @see https://tailwindcss.com/docs/translate
23041       */
23042      "translate-y": [{
23043        "translate-y": scaleTranslate()
23044      }],
23045      /**
23046       * Translate Z
23047       * @see https://tailwindcss.com/docs/translate
23048       */
23049      "translate-z": [{
23050        "translate-z": scaleTranslate()
23051      }],
23052      /**
23053       * Translate None
23054       * @see https://tailwindcss.com/docs/translate
23055       */
23056      "translate-none": ["translate-none"],
23057      // ---------------------
23058      // --- Interactivity ---
23059      // ---------------------
23060      /**
23061       * Accent Color
23062       * @see https://tailwindcss.com/docs/accent-color
23063       */
23064      accent: [{
23065        accent: scaleColor()
23066      }],
23067      /**
23068       * Appearance
23069       * @see https://tailwindcss.com/docs/appearance
23070       */
23071      appearance: [{
23072        appearance: ["none", "auto"]
23073      }],
23074      /**
23075       * Caret Color
23076       * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities
23077       */
23078      "caret-color": [{
23079        caret: scaleColor()
23080      }],
23081      /**
23082       * Color Scheme
23083       * @see https://tailwindcss.com/docs/color-scheme
23084       */
23085      "color-scheme": [{
23086        scheme: ["normal", "dark", "light", "light-dark", "only-dark", "only-light"]
23087      }],
23088      /**
23089       * Cursor
23090       * @see https://tailwindcss.com/docs/cursor
23091       */
23092      cursor: [{
23093        cursor: ["auto", "default", "pointer", "wait", "text", "move", "help", "not-allowed", "none", "context-menu", "progress", "cell", "crosshair", "vertical-text", "alias", "copy", "no-drop", "grab", "grabbing", "all-scroll", "col-resize", "row-resize", "n-resize", "e-resize", "s-resize", "w-resize", "ne-resize", "nw-resize", "se-resize", "sw-resize", "ew-resize", "ns-resize", "nesw-resize", "nwse-resize", "zoom-in", "zoom-out", isArbitraryVariable, isArbitraryValue]
23094      }],
23095      /**
23096       * Field Sizing
23097       * @see https://tailwindcss.com/docs/field-sizing
23098       */
23099      "field-sizing": [{
23100        "field-sizing": ["fixed", "content"]
23101      }],
23102      /**
23103       * Pointer Events
23104       * @see https://tailwindcss.com/docs/pointer-events
23105       */
23106      "pointer-events": [{
23107        "pointer-events": ["auto", "none"]
23108      }],
23109      /**
23110       * Resize
23111       * @see https://tailwindcss.com/docs/resize
23112       */
23113      resize: [{
23114        resize: ["none", "", "y", "x"]
23115      }],
23116      /**
23117       * Scroll Behavior
23118       * @see https://tailwindcss.com/docs/scroll-behavior
23119       */
23120      "scroll-behavior": [{
23121        scroll: ["auto", "smooth"]
23122      }],
23123      /**
23124       * Scroll Margin
23125       * @see https://tailwindcss.com/docs/scroll-margin
23126       */
23127      "scroll-m": [{
23128        "scroll-m": scaleUnambiguousSpacing()
23129      }],
23130      /**
23131       * Scroll Margin X
23132       * @see https://tailwindcss.com/docs/scroll-margin
23133       */
23134      "scroll-mx": [{
23135        "scroll-mx": scaleUnambiguousSpacing()
23136      }],
23137      /**
23138       * Scroll Margin Y
23139       * @see https://tailwindcss.com/docs/scroll-margin
23140       */
23141      "scroll-my": [{
23142        "scroll-my": scaleUnambiguousSpacing()
23143      }],
23144      /**
23145       * Scroll Margin Start
23146       * @see https://tailwindcss.com/docs/scroll-margin
23147       */
23148      "scroll-ms": [{
23149        "scroll-ms": scaleUnambiguousSpacing()
23150      }],
23151      /**
23152       * Scroll Margin End
23153       * @see https://tailwindcss.com/docs/scroll-margin
23154       */
23155      "scroll-me": [{
23156        "scroll-me": scaleUnambiguousSpacing()
23157      }],
23158      /**
23159       * Scroll Margin Top
23160       * @see https://tailwindcss.com/docs/scroll-margin
23161       */
23162      "scroll-mt": [{
23163        "scroll-mt": scaleUnambiguousSpacing()
23164      }],
23165      /**
23166       * Scroll Margin Right
23167       * @see https://tailwindcss.com/docs/scroll-margin
23168       */
23169      "scroll-mr": [{
23170        "scroll-mr": scaleUnambiguousSpacing()
23171      }],
23172      /**
23173       * Scroll Margin Bottom
23174       * @see https://tailwindcss.com/docs/scroll-margin
23175       */
23176      "scroll-mb": [{
23177        "scroll-mb": scaleUnambiguousSpacing()
23178      }],
23179      /**
23180       * Scroll Margin Left
23181       * @see https://tailwindcss.com/docs/scroll-margin
23182       */
23183      "scroll-ml": [{
23184        "scroll-ml": scaleUnambiguousSpacing()
23185      }],
23186      /**
23187       * Scroll Padding
23188       * @see https://tailwindcss.com/docs/scroll-padding
23189       */
23190      "scroll-p": [{
23191        "scroll-p": scaleUnambiguousSpacing()
23192      }],
23193      /**
23194       * Scroll Padding X
23195       * @see https://tailwindcss.com/docs/scroll-padding
23196       */
23197      "scroll-px": [{
23198        "scroll-px": scaleUnambiguousSpacing()
23199      }],
23200      /**
23201       * Scroll Padding Y
23202       * @see https://tailwindcss.com/docs/scroll-padding
23203       */
23204      "scroll-py": [{
23205        "scroll-py": scaleUnambiguousSpacing()
23206      }],
23207      /**
23208       * Scroll Padding Start
23209       * @see https://tailwindcss.com/docs/scroll-padding
23210       */
23211      "scroll-ps": [{
23212        "scroll-ps": scaleUnambiguousSpacing()
23213      }],
23214      /**
23215       * Scroll Padding End
23216       * @see https://tailwindcss.com/docs/scroll-padding
23217       */
23218      "scroll-pe": [{
23219        "scroll-pe": scaleUnambiguousSpacing()
23220      }],
23221      /**
23222       * Scroll Padding Top
23223       * @see https://tailwindcss.com/docs/scroll-padding
23224       */
23225      "scroll-pt": [{
23226        "scroll-pt": scaleUnambiguousSpacing()
23227      }],
23228      /**
23229       * Scroll Padding Right
23230       * @see https://tailwindcss.com/docs/scroll-padding
23231       */
23232      "scroll-pr": [{
vendor: 9,277 bytes, lines 23233-23518
23233        "scroll-pr": scaleUnambiguousSpacing()
23234      }],
23235      /**
23236       * Scroll Padding Bottom
23237       * @see https://tailwindcss.com/docs/scroll-padding
23238       */
23239      "scroll-pb": [{
23240        "scroll-pb": scaleUnambiguousSpacing()
23241      }],
23242      /**
23243       * Scroll Padding Left
23244       * @see https://tailwindcss.com/docs/scroll-padding
23245       */
23246      "scroll-pl": [{
23247        "scroll-pl": scaleUnambiguousSpacing()
23248      }],
23249      /**
23250       * Scroll Snap Align
23251       * @see https://tailwindcss.com/docs/scroll-snap-align
23252       */
23253      "snap-align": [{
23254        snap: ["start", "end", "center", "align-none"]
23255      }],
23256      /**
23257       * Scroll Snap Stop
23258       * @see https://tailwindcss.com/docs/scroll-snap-stop
23259       */
23260      "snap-stop": [{
23261        snap: ["normal", "always"]
23262      }],
23263      /**
23264       * Scroll Snap Type
23265       * @see https://tailwindcss.com/docs/scroll-snap-type
23266       */
23267      "snap-type": [{
23268        snap: ["none", "x", "y", "both"]
23269      }],
23270      /**
23271       * Scroll Snap Type Strictness
23272       * @see https://tailwindcss.com/docs/scroll-snap-type
23273       */
23274      "snap-strictness": [{
23275        snap: ["mandatory", "proximity"]
23276      }],
23277      /**
23278       * Touch Action
23279       * @see https://tailwindcss.com/docs/touch-action
23280       */
23281      touch: [{
23282        touch: ["auto", "none", "manipulation"]
23283      }],
23284      /**
23285       * Touch Action X
23286       * @see https://tailwindcss.com/docs/touch-action
23287       */
23288      "touch-x": [{
23289        "touch-pan": ["x", "left", "right"]
23290      }],
23291      /**
23292       * Touch Action Y
23293       * @see https://tailwindcss.com/docs/touch-action
23294       */
23295      "touch-y": [{
23296        "touch-pan": ["y", "up", "down"]
23297      }],
23298      /**
23299       * Touch Action Pinch Zoom
23300       * @see https://tailwindcss.com/docs/touch-action
23301       */
23302      "touch-pz": ["touch-pinch-zoom"],
23303      /**
23304       * User Select
23305       * @see https://tailwindcss.com/docs/user-select
23306       */
23307      select: [{
23308        select: ["none", "text", "all", "auto"]
23309      }],
23310      /**
23311       * Will Change
23312       * @see https://tailwindcss.com/docs/will-change
23313       */
23314      "will-change": [{
23315        "will-change": ["auto", "scroll", "contents", "transform", isArbitraryVariable, isArbitraryValue]
23316      }],
23317      // -----------
23318      // --- SVG ---
23319      // -----------
23320      /**
23321       * Fill
23322       * @see https://tailwindcss.com/docs/fill
23323       */
23324      fill: [{
23325        fill: ["none", ...scaleColor()]
23326      }],
23327      /**
23328       * Stroke Width
23329       * @see https://tailwindcss.com/docs/stroke-width
23330       */
23331      "stroke-w": [{
23332        stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber]
23333      }],
23334      /**
23335       * Stroke
23336       * @see https://tailwindcss.com/docs/stroke
23337       */
23338      stroke: [{
23339        stroke: ["none", ...scaleColor()]
23340      }],
23341      // ---------------------
23342      // --- Accessibility ---
23343      // ---------------------
23344      /**
23345       * Forced Color Adjust
23346       * @see https://tailwindcss.com/docs/forced-color-adjust
23347       */
23348      "forced-color-adjust": [{
23349        "forced-color-adjust": ["auto", "none"]
23350      }]
23351    },
23352    conflictingClassGroups: {
23353      overflow: ["overflow-x", "overflow-y"],
23354      overscroll: ["overscroll-x", "overscroll-y"],
23355      inset: ["inset-x", "inset-y", "start", "end", "top", "right", "bottom", "left"],
23356      "inset-x": ["right", "left"],
23357      "inset-y": ["top", "bottom"],
23358      flex: ["basis", "grow", "shrink"],
23359      gap: ["gap-x", "gap-y"],
23360      p: ["px", "py", "ps", "pe", "pt", "pr", "pb", "pl"],
23361      px: ["pr", "pl"],
23362      py: ["pt", "pb"],
23363      m: ["mx", "my", "ms", "me", "mt", "mr", "mb", "ml"],
23364      mx: ["mr", "ml"],
23365      my: ["mt", "mb"],
23366      size: ["w", "h"],
23367      "font-size": ["leading"],
23368      "fvn-normal": ["fvn-ordinal", "fvn-slashed-zero", "fvn-figure", "fvn-spacing", "fvn-fraction"],
23369      "fvn-ordinal": ["fvn-normal"],
23370      "fvn-slashed-zero": ["fvn-normal"],
23371      "fvn-figure": ["fvn-normal"],
23372      "fvn-spacing": ["fvn-normal"],
23373      "fvn-fraction": ["fvn-normal"],
23374      "line-clamp": ["display", "overflow"],
23375      rounded: ["rounded-s", "rounded-e", "rounded-t", "rounded-r", "rounded-b", "rounded-l", "rounded-ss", "rounded-se", "rounded-ee", "rounded-es", "rounded-tl", "rounded-tr", "rounded-br", "rounded-bl"],
23376      "rounded-s": ["rounded-ss", "rounded-es"],
23377      "rounded-e": ["rounded-se", "rounded-ee"],
23378      "rounded-t": ["rounded-tl", "rounded-tr"],
23379      "rounded-r": ["rounded-tr", "rounded-br"],
23380      "rounded-b": ["rounded-br", "rounded-bl"],
23381      "rounded-l": ["rounded-tl", "rounded-bl"],
23382      "border-spacing": ["border-spacing-x", "border-spacing-y"],
23383      "border-w": ["border-w-x", "border-w-y", "border-w-s", "border-w-e", "border-w-t", "border-w-r", "border-w-b", "border-w-l"],
23384      "border-w-x": ["border-w-r", "border-w-l"],
23385      "border-w-y": ["border-w-t", "border-w-b"],
23386      "border-color": ["border-color-x", "border-color-y", "border-color-s", "border-color-e", "border-color-t", "border-color-r", "border-color-b", "border-color-l"],
23387      "border-color-x": ["border-color-r", "border-color-l"],
23388      "border-color-y": ["border-color-t", "border-color-b"],
23389      translate: ["translate-x", "translate-y", "translate-none"],
23390      "translate-none": ["translate", "translate-x", "translate-y", "translate-z"],
23391      "scroll-m": ["scroll-mx", "scroll-my", "scroll-ms", "scroll-me", "scroll-mt", "scroll-mr", "scroll-mb", "scroll-ml"],
23392      "scroll-mx": ["scroll-mr", "scroll-ml"],
23393      "scroll-my": ["scroll-mt", "scroll-mb"],
23394      "scroll-p": ["scroll-px", "scroll-py", "scroll-ps", "scroll-pe", "scroll-pt", "scroll-pr", "scroll-pb", "scroll-pl"],
23395      "scroll-px": ["scroll-pr", "scroll-pl"],
23396      "scroll-py": ["scroll-pt", "scroll-pb"],
23397      touch: ["touch-x", "touch-y", "touch-pz"],
23398      "touch-x": ["touch"],
23399      "touch-y": ["touch"],
23400      "touch-pz": ["touch"]
23401    },
23402    conflictingClassGroupModifiers: {
23403      "font-size": ["leading"]
23404    },
23405    orderSensitiveModifiers: ["*", "**", "after", "backdrop", "before", "details-content", "file", "first-letter", "first-line", "marker", "placeholder", "selection"]
23406  };
23407};
23408const twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig);
23409function cn(...inputs) {
23410  return twMerge(clsx(inputs));
23411}
23412const Card = React$2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
23413  "div",
23414  {
23415    ref,
23416    className: cn(
23417      "rounded-lg border bg-card text-card-foreground shadow-sm",
23418      className
23419    ),
23420    ...props
23421  }
23422));
23423Card.displayName = "Card";
23424const CardHeader = React$2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
23425  "div",
23426  {
23427    ref,
23428    className: cn("flex flex-col space-y-1.5 p-6", className),
23429    ...props
23430  }
23431));
23432CardHeader.displayName = "CardHeader";
23433const CardTitle = React$2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
23434  "h3",
23435  {
23436    ref,
23437    className: cn(
23438      "text-2xl font-semibold leading-none tracking-tight",
23439      className
23440    ),
23441    ...props
23442  }
23443));
23444CardTitle.displayName = "CardTitle";
23445const CardDescription = React$2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
23446  "p",
23447  {
23448    ref,
23449    className: cn("text-sm text-muted-foreground", className),
23450    ...props
23451  }
23452));
23453CardDescription.displayName = "CardDescription";
23454const CardContent = React$2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("p-6 pt-0", className), ...props }));
23455CardContent.displayName = "CardContent";
23456const CardFooter = React$2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
23457  "div",
23458  {
23459    ref,
23460    className: cn("flex items-center p-6 pt-0", className),
23461    ...props
23462  }
23463));
23464CardFooter.displayName = "CardFooter";
23465const Button = ({
23466  variant = "primary",
23467  size = "md",
23468  showArrow = false,
23469  fullWidth = false,
23470  loading = false,
23471  className,
23472  disabled,
23473  children,
23474  ...props
23475}) => {
23476  const baseClasses = [
23477    // Base styles
23478    "inline-flex items-center justify-center",
23479    "font-helvetica-now font-bold",
23480    "transition-all duration-200",
23481    "focus:outline-none focus:ring-2 focus:ring-offset-2",
23482    "disabled:opacity-50 disabled:cursor-not-allowed",
23483    "uppercase tracking-wide",
23484    // No rounded corners for MEC
23485    "border-0"
23486  ];
23487  const variantClasses = {
23488    // Dark background (like "Alle Nachrichten")
23489    primary: [
23490      "bg-mec-secondary text-white",
23491      "hover:bg-mec-secondary/90",
23492      "focus:ring-mec-secondary"
23493    ],
23494    // Light background (like "Jetzt bewerben")
23495    secondary: [
23496      "bg-gray-400 text-white",
23497      "hover:bg-gray-500",
23498      "focus:ring-gray-400"
23499    ],
23500    // Red background (like "Weitere Informationen")
23501    accent: [
23502      "bg-mec-primary text-white",
23503      "hover:bg-mec-primary/90",
23504      "focus:ring-mec-primary"
23505    ],
23506    // Transparent/Ghost buttons
23507    ghost: [
23508      "bg-transparent border-2",
23509      "text-mec-secondary border-mec-secondary",
23510      "hover:bg-mec-secondary hover:text-white",
23511      "focus:ring-mec-secondary"
23512    ]
23513  };
23514  const sizeClasses2 = {
23515    sm: "px-4 py-2 text-sm",
23516    md: "px-6 py-3 text-base",
23517    lg: "px-8 py-4 text-lg"
23518  };
23519  const widthClasses = fullWidth ? "w-full" : "";
23520  return /* @__PURE__ */ jsxRuntimeExports.jsx(
23521    "button",
23522    {
23523      className: clsx(
23524        baseClasses,
23525        variantClasses[variant],
23526        sizeClasses2[size],
23527        widthClasses,
23528        className
23529      ),
23530      disabled: disabled || loading,
23531      ...props,
23532      children: loading ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2", children: [
23533        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-4 h-4 border-2 border-current border-t-transparent animate-spin rounded-full" }),
23534        /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Laden..." })
23535      ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2", children: [
23536        /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children }),
23537        showArrow && /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowRight, { className: "w-5 h-5 ml-2" })
23538      ] })
23539    }
23540  );
23541};
23542const MECButtonPrimary = (props) => /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "primary", showArrow: true, ...props });
23543const MECButtonSecondary = (props) => /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "secondary", showArrow: true, ...props });
23544const MECButtonAccent = (props) => /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "accent", showArrow: true, ...props });
23545const MECButtonGhost = (props) => /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "ghost", showArrow: true, ...props });
23546const Badge = ({
23547  className,
23548  variant = "default",
23549  ...props
23550}) => {
23551  const baseClasses = [
23552    "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors"
23553  ];
23554  const variantClasses = {
23555    default: "border-transparent bg-mec-primary text-white",
23556    secondary: "border-transparent bg-gray-100 text-gray-800",
23557    destructive: "border-transparent bg-red-500 text-white",
23558    outline: "text-gray-700 border-gray-300"
23559  };
23560  return /* @__PURE__ */ jsxRuntimeExports.jsx(
23561    "div",
23562    {
23563      className: clsx(
23564        baseClasses,
23565        variantClasses[variant],
23566        className
23567      ),
23568      ...props
23569    }
23570  );
23571};
23572const SyncManager = () => {
23573  const [syncStatus, setSyncStatus] = reactExports.useState(null);
23574  const [isLoading, setIsLoading] = reactExports.useState(false);
23575  const [isSyncing, setIsSyncing] = reactExports.useState(false);
23576  const [lastSyncResult, setLastSyncResult] = reactExports.useState(null);
23577  const [error, setError] = reactExports.useState(null);
23578  reactExports.useEffect(() => {
23579    loadSyncStatus();
23580  }, []);
23581  const loadSyncStatus = async () => {
23582    setIsLoading(true);
23583    setError(null);
23584    try {
23585      const response = await fetch("/api/v1/contacts/sync/status");
23586      const data = await response.json();
23587      if (data.success) {
23588        setSyncStatus(data);
23589      } else {
23590        setError(data.error || "Failed to load sync status");
23591      }
23592    } catch (err) {
23593      setError("Network error loading sync status");
23594      console.error("Error loading sync status:", err);
23595    } finally {
23596      setIsLoading(false);
23597    }
23598  };
23599  const performIncrementalSync = async () => {
23600    setIsSyncing(true);
23601    setError(null);
23602    setLastSyncResult(null);
23603    try {
23604      const response = await fetch("/api/v1/contacts/sync/incremental", {
23605        method: "POST",
23606        headers: {
23607          "Content-Type": "application/json"
23608        }
23609      });
23610      const data = await response.json();
23611      if (data.success) {
23612        setLastSyncResult(data);
23613        await loadSyncStatus();
23614      } else {
23615        setError(data.error || "Sync failed");
23616      }
23617    } catch (err) {
23618      setError("Network error during sync");
23619      console.error("Error during sync:", err);
23620    } finally {
23621      setIsSyncing(false);
23622    }
23623  };
23624  const performFullSync = async () => {
23625    setIsSyncing(true);
23626    setError(null);
23627    setLastSyncResult(null);
23628    try {
23629      const response = await fetch("/api/v1/contacts/debug/ultimate-wordpress-sync", {
23630        method: "POST",
23631        headers: {
23632          "Content-Type": "application/json"
23633        }
23634      });
23635      const data = await response.json();
23636      if (data.success) {
23637        const convertedResult = {
23638          success: true,
23639          syncType: "full",
23640          startTime: data.timestamp,
23641          endTime: data.timestamp,
23642          locations: {
23643            checked: data.summary?.locationsChecked || 0,
23644            new: data.results?.locations?.synced || 0,
23645            updated: 0,
23646            deleted: 0,
23647            errors: data.results?.locations?.errors || []
23648          },
23649          contacts: {
23650            checked: data.summary?.contactsProcessed || 0,
23651            new: data.results?.contacts?.synced || 0,
23652            updated: 0,
23653            deleted: 0,
23654            errors: data.results?.contacts?.errors || []
23655          },
23656          media: {
23657            downloaded: data.results?.media?.downloaded || 0,
23658            errors: data.results?.media?.errors || []
23659          }
23660        };
23661        setLastSyncResult(convertedResult);
23662        await loadSyncStatus();
23663      } else {
23664        setError(data.error || data.message || "Full sync failed");
23665      }
23666    } catch (err) {
23667      setError("Network error during full sync");
23668      console.error("Error during full sync:", err);
23669    } finally {
23670      setIsSyncing(false);
23671    }
23672  };
23673  const formatDate = (dateString) => {
23674    if (!dateString) return "Never";
23675    return new Date(dateString).toLocaleString("de-DE");
23676  };
23677  const formatDuration = (ms) => {
23678    if (ms < 1e3) return `${ms}ms`;
23679    if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
23680    return `${(ms / 6e4).toFixed(1)}min`;
23681  };
23682  if (isLoading) {
23683    return /* @__PURE__ */ jsxRuntimeExports.jsx(Card, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "flex items-center justify-center p-8", children: [
23684      /* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-8 w-8 animate-spin" }),
23685      /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-2", children: "Loading sync status..." })
23686    ] }) });
23687  }
23688  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [
23689    /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
23690      /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [
23691        /* @__PURE__ */ jsxRuntimeExports.jsx(Database, { className: "h-5 w-5" }),
23692        "WordPress Sync Manager"
23693      ] }) }),
23694      /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "space-y-4", children: [
23695        error && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-red-50 border border-red-200 rounded-md p-4", children: [
23696          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-red-800", children: [
23697            /* @__PURE__ */ jsxRuntimeExports.jsx(AlertCircle, { className: "h-4 w-4" }),
23698            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium", children: "Error" })
23699          ] }),
23700          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-red-700 mt-1", children: error })
23701        ] }),
23702        syncStatus && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
23703          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
23704            /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "font-medium flex items-center gap-2", children: [
23705              /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "h-4 w-4" }),
23706              "Sync Status"
23707            ] }),
23708            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 text-sm", children: [
23709              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23710                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Last Sync:" }),
23711                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono", children: formatDate(syncStatus.lastSyncTime) })
23712              ] }),
23713              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23714                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Status:" }),
23715                syncStatus.needsInitialSync ? /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", className: "text-orange-600 border-orange-200", children: "Needs Initial Sync" }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "outline", className: "text-green-600 border-green-200", children: [
23716                  /* @__PURE__ */ jsxRuntimeExports.jsx(CheckCircle, { className: "h-3 w-3 mr-1" }),
23717                  "Up to Date"
23718                ] })
23719              ] })
23720            ] })
23721          ] }),
23722          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
23723            /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-medium", children: "Data Statistics" }),
23724            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 text-sm", children: [
23725              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23726                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Contacts:" }),
23727                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono", children: syncStatus.statistics.contacts?.totalRecords || 0 })
23728              ] }),
23729              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23730                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Locations:" }),
23731                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono", children: syncStatus.statistics.locations?.totalRecords || 0 })
23732              ] })
23733            ] })
23734          ] })
23735        ] }),
23736        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-3 pt-4 border-t", children: [
23737          /* @__PURE__ */ jsxRuntimeExports.jsxs(
23738            Button,
23739            {
23740              onClick: performIncrementalSync,
23741              disabled: isSyncing,
23742              variant: "primary",
23743              className: "flex items-center gap-2",
23744              children: [
23745                isSyncing ? /* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "h-4 w-4" }),
23746                syncStatus?.needsInitialSync ? "Initial Sync" : "Incremental Sync"
23747              ]
23748            }
23749          ),
23750          /* @__PURE__ */ jsxRuntimeExports.jsxs(
23751            Button,
23752            {
23753              onClick: performFullSync,
23754              disabled: isSyncing,
23755              variant: "secondary",
23756              className: "flex items-center gap-2",
23757              children: [
23758                isSyncing ? /* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Database, { className: "h-4 w-4" }),
23759                "Full Sync"
23760              ]
23761            }
23762          ),
23763          /* @__PURE__ */ jsxRuntimeExports.jsx(
23764            Button,
23765            {
23766              onClick: loadSyncStatus,
23767              disabled: isLoading || isSyncing,
23768              variant: "ghost",
23769              size: "sm",
23770              children: "Refresh"
23771            }
23772          )
23773        ] })
23774      ] })
23775    ] }),
23776    lastSyncResult && /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
23777      /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [
23778        /* @__PURE__ */ jsxRuntimeExports.jsx(CheckCircle, { className: "h-5 w-5 text-green-600" }),
23779        "Last Sync Result"
23780      ] }) }),
23781      /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { children: [
23782        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-4", children: [
23783          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
23784            /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Locations" }),
23785            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 text-sm", children: [
23786              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23787                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Checked:" }),
23788                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono", children: lastSyncResult.locations.checked })
23789              ] }),
23790              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23791                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "New:" }),
23792                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-green-600", children: lastSyncResult.locations.new })
23793              ] }),
23794              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23795                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Updated:" }),
23796                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-blue-600", children: lastSyncResult.locations.updated })
23797              ] }),
23798              lastSyncResult.locations.errors.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23799                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Errors:" }),
23800                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-red-600", children: lastSyncResult.locations.errors.length })
23801              ] })
23802            ] })
23803          ] }),
23804          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
23805            /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Contacts" }),
23806            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 text-sm", children: [
23807              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23808                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Checked:" }),
23809                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono", children: lastSyncResult.contacts.checked })
23810              ] }),
23811              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23812                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "New:" }),
23813                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-green-600", children: lastSyncResult.contacts.new })
23814              ] }),
23815              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23816                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Updated:" }),
23817                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-blue-600", children: lastSyncResult.contacts.updated })
23818              ] }),
23819              lastSyncResult.contacts.errors.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23820                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Errors:" }),
23821                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-red-600", children: lastSyncResult.contacts.errors.length })
23822              ] })
23823            ] })
23824          ] }),
23825          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
23826            /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Media" }),
23827            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 text-sm", children: [
23828              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23829                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Downloaded:" }),
23830                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-green-600", children: lastSyncResult.media.downloaded })
23831              ] }),
23832              lastSyncResult.media.errors.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23833                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Errors:" }),
23834                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-red-600", children: lastSyncResult.media.errors.length })
23835              ] }),
23836              lastSyncResult.duration && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23837                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Duration:" }),
23838                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono", children: formatDuration(lastSyncResult.duration) })
23839              ] })
23840            ] })
23841          ] })
23842        ] }),
23843        (lastSyncResult.locations.errors.length > 0 || lastSyncResult.contacts.errors.length > 0 || lastSyncResult.media.errors.length > 0) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 pt-4 border-t", children: [
23844          /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium text-red-600 mb-2", children: "Errors" }),
23845          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-1 text-sm", children: [...lastSyncResult.locations.errors, ...lastSyncResult.contacts.errors, ...lastSyncResult.media.errors].map((error2, index) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-red-600 font-mono text-xs bg-red-50 p-2 rounded", children: error2 }, index)) })
23846        ] })
23847      ] })
23848    ] })
23849  ] });
23850};
23851const AdminPage = () => {
23852  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-gray-50", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-4 py-8", children: [
23853    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-8", children: [
23854      /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-3xl font-bold text-gray-900 mb-2", children: "Admin Dashboard" }),
23855      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600", children: "Manage your MEC Portfolio application" })
23856    ] }),
23857    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8", children: [
23858      /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
23859        /* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-2", children: [
23860          /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-sm font-medium", children: "Total Contacts" }),
23861          /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "h-4 w-4 text-muted-foreground" })
23862        ] }),
23863        /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { children: [
23864          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-2xl font-bold", children: "Loading..." }),
23865          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Active contact entries" })
23866        ] })
23867      ] }),
23868      /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
23869        /* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-2", children: [
23870          /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-sm font-medium", children: "Total Locations" }),
23871          /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "h-4 w-4 text-muted-foreground" })
23872        ] }),
23873        /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { children: [
23874          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-2xl font-bold", children: "Loading..." }),
23875          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Active locations" })
23876        ] })
23877      ] }),
23878      /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
23879        /* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-2", children: [
23880          /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-sm font-medium", children: "Sync Status" }),
23881          /* @__PURE__ */ jsxRuntimeExports.jsx(Database, { className: "h-4 w-4 text-muted-foreground" })
23882        ] }),
23883        /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { children: [
23884          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-2xl font-bold", children: "Active" }),
23885          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "WordPress integration" })
23886        ] })
23887      ] })
23888    ] }),
23889    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 xl:grid-cols-2 gap-6", children: [
23890      /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SyncManager, {}) }),
23891      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [
23892        /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
23893          /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [
23894            /* @__PURE__ */ jsxRuntimeExports.jsx(Settings, { className: "h-5 w-5" }),
23895            "System Settings"
23896          ] }) }),
23897          /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
23898            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
23899              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
23900                /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Auto Sync" }),
23901                /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Automatically sync data every 15 minutes" })
23902              ] }),
23903              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-red-100 text-red-800 px-2 py-1 rounded text-sm", children: "Disabled" })
23904            ] }),
23905            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
23906              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
23907                /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Rate Limiting" }),
23908                /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Prevent WordPress API rate limits" })
23909              ] }),
23910              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-green-100 text-green-800 px-2 py-1 rounded text-sm", children: "Active" })
23911            ] }),
23912            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
23913              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
23914                /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Media Downloads" }),
23915                /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Download and cache contact images" })
23916              ] }),
23917              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-green-100 text-green-800 px-2 py-1 rounded text-sm", children: "Active" })
23918            ] }),
23919            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
23920              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
23921                /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Incremental Sync" }),
23922                /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Only sync changed data" })
23923              ] }),
23924              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-green-100 text-green-800 px-2 py-1 rounded text-sm", children: "Active" })
23925            ] })
23926          ] }) })
23927        ] }),
23928        /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
23929          /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { children: "Quick Actions" }) }),
23930          /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
23931            /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "w-full text-left p-3 rounded-lg border hover:bg-gray-50 transition-colors", children: [
23932              /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "View Sync Logs" }),
23933              /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Check detailed sync history and errors" })
23934            ] }),
23935            /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "w-full text-left p-3 rounded-lg border hover:bg-gray-50 transition-colors", children: [
23936              /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Clear Cache" }),
23937              /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Clear all cached media files" })
23938            ] }),
23939            /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "w-full text-left p-3 rounded-lg border hover:bg-gray-50 transition-colors", children: [
23940              /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Export Data" }),
23941              /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Export contacts and locations as CSV" })
23942            ] }),
23943            /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "w-full text-left p-3 rounded-lg border hover:bg-gray-50 transition-colors", children: [
23944              /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "System Health" }),
23945              /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Check API status and performance" })
23946            ] })
23947          ] }) })
23948        ] })
23949      ] })
23950    ] })
23951  ] }) });
23952};
23953const TestOverview = () => {
23954  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-gray-50 py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8", children: [
23955    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-8", children: [
23956      /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl font-bold text-gray-900 mb-4", children: "MEC Portfolio Management" }),
23957      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xl text-gray-600", children: "Test-Übersicht für die neuen Card-Designs" })
23958    ] }),
23959    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8", children: [
23960      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white rounded-lg shadow-lg overflow-hidden", children: [
23961        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-48 bg-gradient-to-br from-blue-500 to-blue-600 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center text-white", children: [
23962          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-6xl mb-4", children: "🏢" }),
23963          /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold", children: "Location Cards" })
23964        ] }) }),
23965        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6", children: [
23966          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600 mb-4", children: 'Neue Location Cards im Design der Vorlage mit Hero-Images, Center-Statistiken und "Zum Center" Button.' }),
23967          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 mb-6", children: [
23968            /* @__P
23968URE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
23969              /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }),
23970              "Hero-Image (obere Hälfte)"
23971            ] }),
23972            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
23973              /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }),
23974              "Dunkler Content-Bereich"
23975            ] }),
23976            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
23977              /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }),
23978              "Center-Statistiken mit Icons"
23979            ] }),
23980            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
23981              /* @__P
23981URE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }),
23982              "Responsive Grid Layout"
23983            ] })
23984          ] }),
23985          /* @__PURE__ */ jsxRuntimeExports.jsxs(
23986            Link,
23987            {
23988              to: "/test/location-cards",
23989              className: "inline-flex items-center px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors",
23990              children: [
23991                "Location Cards testen",
23992                /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4 ml-2", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M17 8l4 4m0 0l-4 4m4-4H3" }) })
23993              ]
23994            }
23995          )
23996        ] })
23997      ] }),
23998      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white rounded-lg shadow-lg overflow-hidden", children: [
23999        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-48 bg-gradient-to-br from-pink-500 to-pink-600 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center text-white", children: [
24000          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-6xl mb-4", children: "👤" }),
24001          /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold", children: "Contact Cards" })
24002        ] }) }),
24003        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6", children: [
24004          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600 mb-4", children: "Neue Contact Cards im Design der Vorlage mit Portrait-Images, Kontaktdaten und Social Media Links." }),
24005          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 mb-6", children: [
24006            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
24007              /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }),
24008              "Portrait-Image (obere Hälfte)"
24009            ] }),
24010            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
24011              /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }),
24012              "Heller Content-Bereich"
24013            ] }),
24014            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
24015              /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }),
24016              "Kontaktdaten mit Icons"
24017            ] }),
24018            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
24019              /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }),
24020              "XING & LinkedIn Links"
24021            ] })
24022          ] }),
24023          /* @__PURE__ */ jsxRuntimeExports.jsxs(
24024            Link,
24025            {
24026              to: "/test/contact-cards",
24027              className: "inline-flex items-center px-4 py-2 bg-pink-600 text-white rounded-lg hover:bg-pink-700 transition-colors",
24028              children: [
24029                "Contact Cards testen",
24030                /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4 ml-2", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M17 8l4 4m0 0l-4 4m4-4H3" }) })
24031              ]
24032            }
24033          )
24034        ] })
24035      ] }),
24036      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white rounded-lg shadow-lg overflow-hidden", children: [
24037        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-48 bg-gradient-to-br from-red-500 to-red-600 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center text-white", children: [
24038          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-6xl mb-4", children: "🔘" }),
24039          /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold", children: "Button Styles" })
24040        ] }) }),
24041        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6", children: [
24042          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600 mb-4", children: "MEC Button-Styles mit Helvetica Now Display Schriftart und den originalen MEC-Farben." }),
24043          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 mb-6", children: [
24044            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
24045              /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }),
24046              "Helvetica Now Display Font"
24047            ] }),
24048            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
24049              /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }),
24050              "MEC Farben (#d20028, #28323C)"
24051            ] }),
24052            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
24053              /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }),
24054              "Keine Rundungen (eckiges Design)"
24055            ] }),
24056            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
24057              /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }),
24058              "Pfeil-Icons wie im Original"
24059            ] })
24060          ] }),
24061          /* @__PURE__ */ jsxRuntimeExports.jsxs(
24062            Link,
24063            {
24064              to: "/test/buttons",
24065              className: "inline-flex items-center px-4 py-2 bg-red-600 text-white rounded-lg hover:bg-red-700 transition-colors",
24066              children: [
24067                "Button Styles testen",
24068                /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4 ml-2", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M17 8l4 4m0 0l-4 4m4-4H3" }) })
24069              ]
24070            }
24071          )
24072        ] })
24073      ] }),
24074      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white rounded-lg shadow-lg overflow-hidden lg:col-span-3", children: [
24075        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-32 bg-gradient-to-br from-gray-700 to-gray-800 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center text-white", children: [
24076          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-4xl mb-2", children: "🗺️" }),
24077          /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold", children: "Original Portfolio App" })
24078        ] }) }),
24079        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6", children: [
24080          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600 mb-4", children: "Die ursprüngliche Portfolio Management App mit interaktiver Karte und Ansprechpartner-Suche." }),
24081          /* @__PURE__ */ jsxRuntimeExports.jsxs(
24082            Link,
24083            {
24084              to: "/app",
24085              className: "inline-flex items-center px-4 py-2 bg-gray-700 text-white rounded-lg hover:bg-gray-800 transition-colors",
24086              children: [
24087                "Original App öffnen",
24088                /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4 ml-2", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M17 8l4 4m0 0l-4 4m4-4H3" }) })
24089              ]
24090            }
24091          )
24092        ] })
24093      ] })
24094    ] }),
24095    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-12 text-center text-gray-500", children: [
24096      /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm", children: [
24097        "MEC Portfolio Management v",
24098        "1.0.0"
24099      ] }),
24100      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs mt-1", children: "Powered by React + TypeScript + Tailwind CSS" })
24101    ] })
24102  ] }) });
24103};
24104const UnifiedLocationCard = ({
24105  location,
24106  variant = "default",
24107  onSelect,
24108  className
24109}) => {
24110  const handleSelect = () => {
24111    onSelect?.(location);
24112  };
24113  const handleCenterClick = (e) => {
24114    e.stopPropagation();
24115    if (location.centerLink) {
24116      window.open(location.centerLink, "_blank", "noopener,noreferrer");
24117    }
24118  };
24119  const getImageUrl = () => {
24120    return location.heroImage || location.image || location.logo || "/assets/placeholder-location.jpg";
24121  };
24122  if (variant === "compact") {
24123    return /* @__PURE__ */ jsxRuntimeExports.jsx(
24124      "div",
24125      {
24126        className: clsx(
24127          "bg-white rounded-mec border border-background-tertiary p-4 cursor-pointer",
24128          "hover:border-mec-primary/20 hover:shadow-card transition-all duration-200",
24129          className
24130        ),
24131        onClick: handleSelect,
24132        children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-3", children: [
24133          location.logo && /* @__PURE__ */ jsxRuntimeExports.jsx(
24134            "img",
24135            {
24136              src: location.logo,
24137              alt: `${location.name} Logo`,
24138              className: "w-12 h-12 object-contain rounded flex-shrink-0"
24139            }
24140          ),
24141          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
24142            /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold text-text-primary truncate", children: location.name }),
24143            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-secondary truncate", children: location.city }),
24144            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-3 mt-1 text-xs text-text-muted", children: [
24145              location.rentableArea && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
24146                formatMietflaeche(location.rentableArea),
24147                "m²"
24148              ] }),
24149              location.shopCount && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
24150                location.shopCount,
24151                " Shops"
24152              ] }),
24153              location.parkingSpaces && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
24154                location.parkingSpaces,
24155                " Parkplätze"
24156              ] })
24157            ] })
24158          ] }),
24159          location.centerLink && /* @__PURE__ */ jsxRuntimeExports.jsx(
24160            "button",
24161            {
24162              onClick: handleCenterClick,
24163              className: "text-xs bg-mec-primary text-white px-2 py-1 rounded hover:bg-mec-primary/80 transition-colors flex-shrink-0",
24164              children: "Zum Center"
24165            }
24166          )
24167        ] })
24168      }
24169    );
24170  }
24171  if (variant === "detailed") {
24172    return /* @__PURE__ */ jsxRuntimeExports.jsxs(
24173      "div",
24174      {
24175        className: clsx(
24176          "bg-white rounded-mec-lg shadow-card border border-background-tertiary overflow-hidden cursor-pointer",
24177          "hover:shadow-card-hover transition-all duration-300",
24178          className
24179        ),
24180        onClick: handleSelect,
24181        children: [
24182          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative h-48", children: [
24183            /* @__PURE__ */ jsxRuntimeExports.jsx(
24184              "img",
24185              {
24186                src: getImageUrl(),
24187                alt: location.name,
24188                className: "w-full h-full object-cover"
24189              }
24190            ),
24191            location.logo && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute top-4 left-4 bg-white p-2 rounded-mec shadow-card", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
24192              "img",
24193              {
24194                src: location.logo,
24195                alt: `${location.name} Logo`,
24196                className: "w-12 h-12 object-contain"
24197              }
24198            ) })
24199          ] }),
24200          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6", children: [
24201            /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-between items-start mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1", children: [
24202              /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-xl font-bold text-text-primary mb-2", children: location.name }),
24203              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-text-secondary space-y-1", children: [
24204                /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "flex items-center", children: [
24205                  /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-4 h-4 mr-2" }),
24206                  location.address
24207                ] }),
24208                /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "ml-6", children: [
24209                  location.postalCode,
24210                  " ",
24211                  location.city
24212                ] })
24213              ] })
24214            ] }) }),
24215            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-4 mb-4", children: [
24216              location.rentableArea && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background-secondary rounded-mec p-3", children: [
24217                /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-text-secondary", children: "Vermietbare Fläche" }),
24218                /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "font-semibold text-text-primary", children: [
24219                  formatMietflaeche(location.rentableArea),
24220                  "m²"
24221                ] })
24222              ] }),
24223              location.shopCount && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background-secondary rounded-mec p-3", children: [
24224                /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-text-secondary", children: "Anzahl Shops" }),
24225                /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-semibold text-text-primary", children: location.shopCount })
24226              ] }),
24227              location.parkingSpaces && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background-secondary rounded-mec p-3", children: [
24228                /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-text-secondary", children: "Parkplätze" }),
24229                /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-semibold text-text-primary", children: location.parkingSpaces })
24230              ] }),
24231              location.salesLevels && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background-secondary rounded-mec p-3", children: [
24232                /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-text-secondary", children: "Verkaufsebenen" }),
24233                /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-semibold text-text-primary", children: location.salesLevels })
24234              ] })
24235            ] }),
24236            location.description && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary text-sm mb-4 line-clamp-3", children: location.description.replace(/<[^>]*>/g, "") }),
24237            (location.anchorTenants || location.catchmentAreaPopulation) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 mb-4 text-sm", children: [
24238              location.anchorTenants && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
24239                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-text-secondary", children: "Ankermieter: " }),
24240                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-text-primary", children: location.anchorTenants })
24241              ] }),
24242              location.catchmentAreaPopulation && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
24243                /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-text-secondary", children: "Einzugsgebiet: " }),
24244                /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-text-primary", children: [
24245                  location.catchmentAreaPopulation.toLocaleString(),
24246                  " Einwohner"
24247                ] })
24248              ] })
24249            ] }),
24250            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between pt-4 border-t border-background-tertiary", children: [
24251              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-4 text-sm text-text-muted", children: [
24252                location.openingDate && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
24253                  "Eröffnet ",
24254                  new Date(location.openingDate).getFullYear()
24255                ] }),
24256                location.type && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: location.type })
24257              ] }),
24258              location.centerLink && /* @__PURE__ */ jsxRuntimeExports.jsxs(
24259                "button",
24260                {
24261                  onClick: handleCenterClick,
24262                  className: "btn-secondary text-sm inline-flex items-center",
24263                  children: [
24264                    /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "w-4 h-4 mr-1" }),
24265                    "Zum Center"
24266                  ]
24267                }
24268              )
24269            ] })
24270          ] })
24271        ]
24272      }
24273    );
24274  }
24275  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
24276    "div",
24277    {
24278      className: clsx(
24279        "bg-white rounded-mec-lg shadow-card overflow-hidden cursor-pointer",
24280        "hover:shadow-card-hover transition-all duration-300",
24281        className
24282      ),
24283      onClick: handleSelect,
24284      children: [
24285        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative h-80", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
24286          "img",
24287          {
24288            src: getImageUrl(),
24289            alt: location.name,
24290            className: "w-full h-full object-cover"
24291          }
24292        ) }),
24293        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-slate-700 text-white p-6 min-h-[200px] flex flex-col", children: [
24294          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-6", children: [
24295            /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-2xl font-bold mb-2 leading-tight", children: location.name }),
24296            /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xl text-slate-300", children: location.city })
24297          ] }),
24298          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-4 mb-6 flex-1", children: [
24299            location.rentableArea && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
24300              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-slate-400", children: "Vermietbare Fläche" }),
24301              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-lg font-semibold", children: [
24302                formatMietflaeche(location.rentableArea),
24303                "m²"
24304              ] })
24305            ] }),
24306            location.shopCount && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
24307              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-slate-400", children: "Anzahl Shops" }),
24308              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-lg font-semibold", children: location.shopCount })
24309            ] }),
24310            location.parkingSpaces && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
24311              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-slate-400", children: "Parkplätze" }),
24312              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-lg font-semibold", children: location.parkingSpaces })
24313            ] }),
24314            location.salesLevels && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
24315              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-slate-400", children: "Verkaufsebenen" }),
24316              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-lg font-semibold", children: location.salesLevels })
24317            ] }),
24318            location.anchorTenants && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "col-span-2", children: [
24319              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-slate-400", children: "Ankermieter" }),
24320              /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-medium truncate", children: location.anchorTenants })
24321            ] })
24322          ] }),
24323          location.centerLink && /* @__PURE__ */ jsxRuntimeExports.jsxs(
24324            "button",
24325            {
24326              onClick: handleCenterClick,
24327              className: "bg-white text-slate-700 px-4 py-2 rounded-mec font-medium hover:bg-slate-100 transition-colors inline-flex items-center justify-center",
24328              children: [
24329                /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "w-4 h-4 mr-2" }),
24330                "Zum Center"
24331              ]
24332            }
24333          )
24334        ] })
24335      ]
24336    }
24337  );
24338};
24339const LocationCard = ({
24340  location,
24341  variant = "default",
24342  onSelect,
24343  className = ""
24344}) => {
24345  return /* @__PURE__ */ jsxRuntimeExports.jsx(
24346    UnifiedLocationCard,
24347    {
24348      location,
24349      onSelect,
24350      variant,
24351      className
24352    }
24353  );
24354};
24355const LocationGrid = ({
24356  locations,
24357  onLocationSelect,
24358  className = ""
24359}) => {
24360  const [searchTerm, setSearchTerm] = reactExports.useState("");
24361  const [selectedCity, setSelectedCity] = reactExports.useState("");
24362  const [selectedType, setSelectedType] = reactExports.useState("");
24363  const cities = reactExports.useMemo(() => {
24364    const citySet = new Set(locations.map((loc) => loc.city).filter(Boolean));
24365    return Array.from(citySet).sort();
24366  }, [locations]);
24367  const types = reactExports.useMemo(() => {
24368    const typeSet = new Set(locations.map((loc) => loc.type).filter(Boolean));
24369    return Array.from(typeSet).sort();
24370  }, [locations]);
24371  const filteredLocations = reactExports.useMemo(() => {
24372    return locations.filter((location) => {
24373      const matchesSearch = !searchTerm || location.name.toLowerCase().includes(searchTerm.toLowerCase()) || location.city?.toLowerCase().includes(searchTerm.toLowerCase()) || location.address?.toLowerCase().includes(searchTerm.toLowerCase());
24374      const matchesCity = !selectedCity || location.city === selectedCity;
24375      const matchesType = !selectedType || location.type === selectedType;
24376      return matchesSearch && matchesCity && matchesType;
24377    });
24378  }, [locations, searchTerm, selectedCity, selectedType]);
24379  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: `space-y-6 ${className}`, children: [
24380    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between", children: [
24381      /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 max-w-md", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative", children: [
24382        /* @__PURE__ */ jsxRuntimeExports.jsx(
24383          "input",
24384          {
24385            type: "text",
24386            placeholder: "Standorte durchsuchen...",
24387            value: searchTerm,
24388            onChange: (e) => setSearchTerm(e.target.value),
24389            className: "w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-mec-blue focus:border-transparent"
24390          }
24391        ),
24392        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "h-5 w-5 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }) })
24393      ] }) }),
24394      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [
24395        /* @__PURE__ */ jsxRuntimeExports.jsxs(
24396          "select",
24397          {
24398            value: selectedCity,
24399            onChange: (e) => setSelectedCity(e.target.value),
24400            className: "px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-mec-blue focus:border-transparent",
24401            children: [
24402              /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "", children: "Alle Städte" }),
24403              cities.map((city) => /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: city, children: city }, city))
24404            ]
24405          }
24406        ),
24407        /* @__PURE__ */ jsxRuntimeExports.jsxs(
24408          "select",
24409          {
24410            value: selectedType,
24411            onChange: (e) => setSelectedType(e.target.value),
24412            className: "px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-mec-blue focus:border-transparent",
24413            children: [
24414              /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "", children: "Alle Typen" }),
24415              types.map((type) => /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: type, children: type }, type))
24416            ]
24417          }
24418        )
24419      ] })
24420    ] }),
24421    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-sm text-gray-600", children: [
24422      filteredLocations.length,
24423      " von ",
24424      locations.length,
24425      " Standorten"
24426    ] }),
24427    /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-8", children: filteredLocations.map((location) => /* @__PURE__ */ jsxRuntimeExports.jsx(
24428      LocationCard,
24429      {
24430        location,
24431        onSelect: onLocationSelect,
24432        className: "h-full"
24433      },
24434      location.id
24435    )) }),
24436    filteredLocations.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center py-12", children: [
24437      /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-gray-400 mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "mx-auto h-12 w-12", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" }) }) }),
24438      /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-medium text-gray-900 mb-2", children: "Keine Standorte gefunden" }),
24439      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-500", children: "Versuchen Sie andere Suchbegriffe oder Filter." })
24440    ] })
24441  ] });
24442};
24443const testLocations = [
24444  {
24445    id: "1",
24446    name: "Sieben Seen Center",
24447    city: "Schwerin",
24448    address: "Platz der Freiheit 1",
24449    postalCode: "19053",
24450    country: "Deutschland",
24451    coordinates: { lat: 53.6355, lng: 11.401 },
24452    heroImage: "https://images.unsplash.com/photo-1441986300917-64674bd600d8?w=800&h=400&fit=crop",
24453    centerLink: "https://sieben-seen-center.de",
24454    type: "Shopping Center",
24455    wpData: {
24456      id: 1,
24457      slug: "sieben-seen-center",
24458      acf: {
24459        "center-grunddaten-vermietbare-flaeche": 26496,
24460        "center-grunddaten-anzahl-shops-fachmaerkte": 54,
24461        "center-grunddaten-verkaufsebenen": 1
24462      }
24463    },
24464    createdAt: "2024-01-01T00:00:00Z",
24465    updatedAt: "2024-01-01T00:00:00Z"
24466  },
24467  {
24468    id: "2",
24469    name: "Allee-Center",
24470    city: "Magdeburg",
24471    address: "Johannes-Göderitz-Straße 103",
24472    postalCode: "39108",
24473    country: "Deutschland",
24474    coordinates: { lat: 52.1205, lng: 11.6276 },
24475    heroImage: "https://images.unsplash.com/photo-1555529669-e69e7aa0ba9a?w=800&h=400&fit=crop",
24476    centerLink: "https://allee-center-magdeburg.de",
24477    type: "Shopping Center",
24478    wpData: {
24479      id: 2,
24480      slug: "allee-center-magdeburg",
24481      acf: {
24482        "center-grunddaten-vermietbare-flaeche": 45e3,
24483        "center-grunddaten-anzahl-shops-fachmaerkte": 120,
24484        "center-grunddaten-verkaufsebenen": 2
24485      }
24486    },
24487    createdAt: "2024-01-01T00:00:00Z",
24488    updatedAt: "2024-01-01T00:00:00Z"
24489  },
24490  {
24491    id: "3",
24492    name: "Elbe Park",
24493    city: "Dresden",
24494    address: "Budapester Straße 25a",
24495    postalCode: "01069",
24496    country: "Deutschland",
24497    coordinates: { lat: 51.0504, lng: 13.7373 },
24498    heroImage: "https://images.unsplash.com/photo-1519567241046-7f570eee3ce6?w=800&h=400&fit=crop",
24499    centerLink: "https://elbepark-dresden.de",
24500    type: "Shopping Center",
24501    wpData: {
24502      id: 3,
24503      slug: "elbe-park-dresden",
24504      acf: {
24505        "center-grunddaten-vermietbare-flaeche": 65e3,
24506        "center-grunddaten-anzahl-shops-fachmaerkte": 180,
24507        "center-grunddaten-verkaufsebenen": 3
24508      }
24509    },
24510    createdAt: "2024-01-01T00:00:00Z",
24511    updatedAt: "2024-01-01T00:00:00Z"
24512  },
24513  {
24514    id: "4",
24515    name: "Fachmarktzentrum Nord",
24516    city: "Hamburg",
24517    address: "Langenhorner Chaussee 200",
24518    postalCode: "22415",
24519    country: "Deutschland",
24520    coordinates: { lat: 53.6355, lng: 10.001 },
24521    heroImage: "https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?w=800&h=400&fit=crop",
24522    centerLink: "https://fachmarktzentrum-nord.de",
24523    type: "Fachmarktzentrum",
24524    wpData: {
24525      id: 4,
24526      slug: "fachmarktzentrum-nord",
24527      acf: {
24528        "center-grunddaten-vermietbare-flaeche": 18500,
24529        "center-grunddaten-anzahl-shops-fachmaerkte": 12,
24530        "center-grunddaten-verkaufsebenen": 1
24531      }
24532    },
24533    createdAt: "2024-01-01T00:00:00Z",
24534    updatedAt: "2024-01-01T00:00:00Z"
24535  }
24536];
24537const LocationCardsTest = () => {
24538  const handleLocationSelect = (location) => {
24539    console.log("Selected location:", location);
24540    alert(`Location selected: ${location.name} in ${location.city}`);
24541  };
24542  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-gray-50 py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
24543    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-8", children: [
24544      /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-3xl font-bold text-gray-900 mb-2", children: "Location Cards Test" }),
24545      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600", children: "Test der neuen Location Cards im Design der Vorlage" })
24546    ] }),
24547    /* @__PURE__ */ jsxRuntimeExports.jsx(
24548      LocationGrid,
24549      {
24550        locations: testLocations,
24551        onLocationSelect: handleLocationSelect
24552      }
24553    )
24554  ] }) });
24555};
24556const testContacts = [
24557  {
24558    id: "1",
24559    locationId: "1",
24560    firstName: "Tycho",
24561    lastName: "Johannsen",
24562    fullName: "Tycho Johannsen",
24563    position: "Head of Center Management Region North",
24564    department: "",
24565    email: "[email protected]",
24566    phone: "+49 (0) 4321 5577 60",
24567    image: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400&h=500&fit=crop&crop=face",
24568    bio: "Erfahrener Center Manager mit über 15 Jahren Expertise im Einzelhandelsimmobilienmanagement.",
24569    specialties: ["Center Management", "Vermietung", "Kundenbetreuung"],
24570    languages: ["Deutsch", "Englisch", "Dänisch"],
24571    socialLinks: [
24572      {
24573        platform: "xing",
24574        url: "https://www.xing.com/profile/Tycho_Johannsen",
24575        label: "XING Profil"
24576      },
24577      {
24578        platform: "linkedin",
24579        url: "https://www.linkedin.com/in/tycho-johannsen",
24580        label: "LinkedIn Profil"
24581      }
24582    ],
24583    isActive: true,
24584    createdAt: "2024-01-01T00:00:00Z",
24585    updatedAt: "2024-01-01T00:00:00Z"
24586  },
24587  {
24588    id: "2",
24589    locationId: "2",
24590    firstName: "Sarah",
24591    lastName: "Müller",
24592    fullName: "Sarah Müller",
24593    position: "Center Managerin",
24594    department: "Allee-Center Magdeburg",
24595    email: "[email protected]",
24596    phone: "+49 (0) 391 123 456",
24597    image: "https://images.unsplash.com/photo-1494790108755-2616b612b786?w=400&h=500&fit=crop&crop=face",
24598    bio: "Spezialistin für Kundenbetreuung und Vermietungsmanagement mit Fokus auf nachhaltige Centerlösungen.",
24599    specialties: ["Vermietung", "Marketing", "Nachhaltigkeit"],
24600    languages: ["Deutsch", "Englisch"],
24601    socialLinks: [
24602      {
24603        platform: "linkedin",
24604        url: "https://www.linkedin.com/in/sarah-mueller",
24605        label: "LinkedIn Profil"
24606      }
24607    ],
24608    isActive: true,
24609    createdAt: "2024-01-01T00:00:00Z",
24610    updatedAt: "2024-01-01T00:00:00Z"
24611  },
24612  {
24613    id: "3",
24614    locationId: "3",
24615    firstName: "Michael",
24616    lastName: "Schmidt",
24617    fullName: "Michael Schmidt",
24618    position: "Leiter Technisches Management",
24619    department: "Elbe Park Dresden",
24620    email: "[email protected]",
24621    phone: "+49 (0) 351 789 012",
24622    image: "https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=400&h=500&fit=crop&crop=face",
24623    bio: "Experte für technische Infrastruktur und Facility Management in Shopping Centern.",
24624    specialties: ["Technisches Management", "Facility Management", "Energieeffizienz"],
24625    languages: ["Deutsch", "Englisch", "Tschechisch"],
24626    socialLinks: [
24627      {
24628        platform: "xing",
24629        url: "https://www.xing.com/profile/Michael_Schmidt",
24630        label: "XING Profil"
24631      }
24632    ],
24633    isActive: true,
24634    createdAt: "2024-01-01T00:00:00Z",
24635    updatedAt: "2024-01-01T00:00:00Z"
24636  },
24637  {
24638    id: "4",
24639    locationId: "4",
24640    firstName: "Anna",
24641    lastName: "Weber",
24642    fullName: "Anna Weber",
24643    position: "Marketing & Events Managerin",
24644    department: "Fachmarktzentrum Nord",
24645    email: "[email protected]",
24646    phone: "+49 (0) 40 567 890",
24647    image: "https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=400&h=500&fit=crop&crop=face",
24648    bio: "Kreative Marketingexpertin mit Leidenschaft für innovative Kundenerlebnisse und Events.",
24649    specialties: ["Marketing", "Event Management", "Social Media"],
24650    languages: ["Deutsch", "Englisch", "Französisch"],
24651    socialLinks: [
24652      {
24653        platform: "linkedin",
24654        url: "https://www.linkedin.com/in/anna-weber",
24655        label: "LinkedIn Profil"
24656      },
24657      {
24658        platform: "xing",
24659        url: "https://www.xing.com/profile/Anna_Weber",
24660        label: "XING Profil"
24661      }
24662    ],
24663    isActive: true,
24664    createdAt: "2024-01-01T00:00:00Z",
24665    updatedAt: "2024-01-01T00:00:00Z"
24666  }
24667];
24668const ContactCardsTest = () => {
24669  const handleContactSelect = (contact) => {
24670    console.log("Selected contact:", contact);
24671    alert(`Contact selected: ${contact.fullName} - ${contact.position}`);
24672  };
24673  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-gray-50 py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
24674    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-8", children: [
24675      /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-3xl font-bold text-gray-900 mb-2", children: "Contact Cards Test" }),
24676      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600", children: "Test der neuen Contact Cards im Design der Vorlage" })
24677    ] }),
24678    /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-8", children: testContacts.map((contact) => /* @__PURE__ */ jsxRuntimeExports.jsx(
24679      ContactCard,
24680      {
24681        contact,
24682        onClick: handleContactSelect,
24683        className: "h-full"
24684      },
24685      contact.id
24686    )) })
24687  ] }) });
24688};
24689const ButtonTest = () => {
24690  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-background-primary p-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-4xl mx-auto space-y-12", children: [
24691    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
24692      /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl font-bold text-text-primary mb-4 font-helvetica-now", children: "MEC Button Styles Test" }),
24693      /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: "Basierend auf den MEC-Designs mit Helvetica Now Display Schriftart" })
24694    ] }),
24695    /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-8", children: [
24696      /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-text-primary font-helvetica-now", children: "MEC Button Varianten" }),
24697      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6", children: [
24698        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
24699          /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Primary (Dark)" }),
24700          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
24701            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { size: "sm", children: "Alle Nachrichten" }),
24702            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { size: "md", children: "Alle Nachrichten" }),
24703            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { size: "lg", children: "Alle Nachrichten" })
24704          ] })
24705        ] }),
24706        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
24707          /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Secondary (Light)" }),
24708          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
24709            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonSecondary, { size: "sm", children: "Jetzt bewerben" }),
24710            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonSecondary, { size: "md", children: "Jetzt bewerben" }),
24711            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonSecondary, { size: "lg", children: "Jetzt bewerben" })
24712          ] })
24713        ] }),
24714        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
24715          /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Accent (Red)" }),
24716          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
24717            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { size: "sm", children: "Weitere Informationen" }),
24718            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { size: "md", children: "Weitere Informationen" }),
24719            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { size: "lg", children: "Weitere Informationen" })
24720          ] })
24721        ] }),
24722        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
24723          /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Ghost (Transparent)" }),
24724          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
24725            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { size: "sm", children: "Mehr erfahren" }),
24726            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { size: "md", children: "Mehr erfahren" }),
24727            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { size: "lg", children: "Mehr erfahren" })
24728          ] })
24729        ] })
24730      ] })
24731    ] }),
24732    /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-8", children: [
24733      /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-text-primary font-helvetica-now", children: "Button States" }),
24734      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: [
24735        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
24736          /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Normal" }),
24737          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
24738            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { children: "Alle Nachrichten" }),
24739            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { children: "Weitere Informationen" }),
24740            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { children: "Mehr erfahren" })
24741          ] })
24742        ] }),
24743        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
24744          /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Loading" }),
24745          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
24746            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { loading: true, children: "Alle Nachrichten" }),
24747            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { loading: true, children: "Weitere Informationen" }),
24748            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { loading: true, children: "Mehr erfahren" })
24749          ] })
24750        ] }),
24751        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
24752          /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Disabled" }),
24753          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
24754            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { disabled: true, children: "Alle Nachrichten" }),
24755            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { disabled: true, children: "Weitere Informationen" }),
24756            /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { disabled: true, children: "Mehr erfahren" })
24757          ] })
24758        ] })
24759      ] })
24760    ] }),
24761    /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-8", children: [
24762      /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-text-primary font-helvetica-now", children: "Full Width Buttons" }),
24763      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4 max-w-md", children: [
24764        /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { fullWidth: true, children: "Alle Nachrichten" }),
24765        /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonSecondary, { fullWidth: true, children: "Jetzt bewerben" }),
24766        /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { fullWidth: true, children: "Weitere Informationen" }),
24767        /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { fullWidth: true, children: "Mehr erfahren" })
24768      ] })
24769    ] }),
24770    /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-8", children: [
24771      /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-text-primary font-helvetica-now", children: "Helvetica Now Display Typography" }),
24772      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
24773        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-helvetica-now font-normal text-lg text-text-primary", children: "Regular: Dies ist ein Test der Helvetica Now Display Regular Schriftart." }),
24774        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-helvetica-now font-bold text-lg text-text-primary", children: "Bold: Dies ist ein Test der Helvetica Now Display Bold Schriftart." }),
24775        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-helvetica-now font-bold text-3xl text-mec-primary", children: "Große Überschrift in MEC Rot" }),
24776        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-helvetica-now font-bold text-2xl text-mec-secondary", children: "Mittlere Überschrift in MEC Grau" })
24777      ] })
24778    ] })
24779  ] }) });
24780};
24781const router = createBrowserRouter([
24782  {
24783    path: "/",
24784    element: /* @__PURE__ */ jsxRuntimeExports.jsx(App, {})
24785  },
24786  {
24787    path: "/admin",
24788    element: /* @__PURE__ */ jsxRuntimeExports.jsx(AdminPage, {})
24789  },
24790  {
24791    path: "/test",
24792    element: /* @__PURE__ */ jsxRuntimeExports.jsx(TestOverview, {})
24793  },
24794  {
24795    path: "/test/location-cards",
24796    element: /* @__PURE__ */ jsxRuntimeExports.jsx(LocationCardsTest, {})
24797  },
24798  {
24799    path: "/test/contact-cards",
24800    element: /* @__PURE__ */ jsxRuntimeExports.jsx(ContactCardsTest, {})
24801  },
24802  {
24803    path: "/test/buttons",
24804    element: /* @__PURE__ */ jsxRuntimeExports.jsx(ButtonTest, {})
24805  }
24806]);
24807const AppRouter = () => {
24808  return /* @__PURE__ */ jsxRuntimeExports.jsx(RouterProvider2, { router });
24809};
24810var cacheEventTypes = ["added", "removed", "updated"];
24811function isCacheEventType(eventType) {
24812  return cacheEventTypes.includes(eventType);
24813}
24814async function persistQueryClientRestore({
24815  queryClient: queryClient2,
24816  persister,
24817  maxAge = 1e3 * 60 * 60 * 24,
24818  buster = "",
24819  hydrateOptions
24820}) {
24821  try {
24822    const persistedClient = await persister.restoreClient();
24823    if (persistedClient) {
24824      if (persistedClient.timestamp) {
24825        const expired = Date.now() - persistedClient.timestamp > maxAge;
24826        const busted = persistedClient.buster !== buster;
24827        if (expired || busted) {
24828          return persister.removeClient();
24829        } else {
24830          hydrate(queryClient2, persistedClient.clientState, hydrateOptions);
24831        }
24832      } else {
24833        return persister.removeClient();
24834      }
24835    }
24836  } catch (err) {
24837    await persister.removeClient();
24838    throw err;
24839  }
24840}
24841async function persistQueryClientSave({
24842  queryClient: queryClient2,
24843  persister,
24844  buster = "",
24845  dehydrateOptions
24846}) {
24847  const persistClient = {
24848    buster,
24849    timestamp: Date.now(),
24850    clientState: dehydrate(queryClient2, dehydrateOptions)
24851  };
24852  await persister.persistClient(persistClient);
24853}
24854function persistQueryClientSubscribe(props) {
24855  const unsubscribeQueryCache = props.queryClient.getQueryCache().subscribe((event) => {
24856    if (isCacheEventType(event.type)) {
24857      persistQueryClientSave(props);
24858    }
24859  });
24860  const unsubscribeMutationCache = props.queryClient.getMutationCache().subscribe((event) => {
24861    if (isCacheEventType(event.type)) {
24862      persistQueryClientSave(props);
24863    }
24864  });
24865  return () => {
24866    unsubscribeQueryCache();
24867    unsubscribeMutationCache();
24868  };
24869}
24870function persistQueryClient(props) {
24871  let hasUnsubscribed = false;
24872  let persistQueryClientUnsubscribe;
24873  const unsubscribe = () => {
24874    hasUnsubscribed = true;
24875    persistQueryClientUnsubscribe?.();
24876  };
24877  const restorePromise = persistQueryClientRestore(props).then(() => {
24878    if (!hasUnsubscribed) {
24879      persistQueryClientUnsubscribe = persistQueryClientSubscribe(props);
24880    }
24881  });
24882  return [unsubscribe, restorePromise];
24883}
24884function noop() {
24885}
24886function createSyncStoragePersister({
24887  storage,
24888  key = `REACT_QUERY_OFFLINE_CACHE`,
24889  throttleTime = 1e3,
24890  serialize = JSON.stringify,
24891  deserialize = JSON.parse,
24892  retry
24893}) {
24894  if (storage) {
24895    const trySave = (persistedClient) => {
24896      try {
24897        storage.setItem(key, serialize(persistedClient));
24898        return;
24899      } catch (error) {
24900        return error;
24901      }
24902    };
24903    return {
24904      persistClient: throttle((persistedClient) => {
24905        let client2 = persistedClient;
24906        let error = trySave(client2);
24907        let errorCount = 0;
24908        while (error && client2) {
24909          errorCount++;
24910          client2 = retry?.({
24911            persistedClient: client2,
24912            error,
24913            errorCount
24914          });
24915          if (client2) {
24916            error = trySave(client2);
24917          }
24918        }
24919      }, throttleTime),
24920      restoreClient: () => {
24921        const cacheString = storage.getItem(key);
24922        if (!cacheString) {
24923          return;
24924        }
24925        return deserialize(cacheString);
24926      },
24927      removeClient: () => {
24928        storage.removeItem(key);
24929      }
24930    };
24931  }
24932  return {
24933    persistClient: noop,
24934    restoreClient: noop,
24935    removeClient: noop
24936  };
24937}
24938function throttle(func, wait = 100) {
24939  let timer = null;
24940  let params;
24941  return function(...args) {
24942    params = args;
24943    if (timer === null) {
24944      timer = timeoutManager.setTimeout(() => {
24945        func(...params);
24946        timer = null;
24947      }, wait);
24948    }
24949  };
24950}
24951const isLocalStorageAvailable = () => {
24952  try {
24953    const test = "__localStorage_test__";
24954    window.localStorage.setItem(test, test);
24955    window.localStorage.removeItem(test);
24956    return true;
24957  } catch {
24958    return false;
24959  }
24960};
24961const localStoragePersister = isLocalStorageAvailable() ? createSyncStoragePersister({
24962  storage: window.localStorage,
24963  key: "MEC_PORTFOLIO_CACHE",
24964  // Serialize/deserialize to handle complex data structures
24965  serialize: JSON.stringify,
24966  deserialize: JSON.parse
24967}) : null;
24968const queryClient = new QueryClient({
24969  defaultOptions: {
24970    queries: {
24971      // Stale time: 5 minutes (data is considered fresh for 5 minutes)
24972      staleTime: 5 * 60 * 1e3,
24973      // Cache time: 24 hours (data stays in cache for 24 hours)
24974      gcTime: 24 * 60 * 60 * 1e3,
24975      // Retry failed requests
24976      retry: (failureCount, error) => {
24977        if (error?.status >= 400 && error?.status < 500) {
24978          return false;
24979        }
24980        if (error?.status === 503 && !navigator.onLine) {
24981          return false;
24982        }
24983        return failureCount < 3;
24984      },
24985      // Don't refetch on window focus (to save bandwidth)
24986      refetchOnWindowFocus: false,
24987      // Refetch on reconnect (when internet comes back)
24988      refetchOnReconnect: true,
24989      // Network mode: offlineFirst
24990      // This allows queries to succeed with cached data even when offline
24991      networkMode: "offlineFirst"
24992    },
24993    mutations: {
24994      // Retry mutations once
24995      retry: 1,
24996      // Network mode for mutations
24997      networkMode: "offlineFirst"
24998    }
24999  }
25000});
25001if (localStoragePersister) {
25002  persistQueryClient({
25003    queryClient,
25004    persister: localStoragePersister,
25005    // Maximum age of cached data: 24 hours
25006    maxAge: 24 * 60 * 60 * 1e3,
25007    // Dehydrate options - what to persist
25008    dehydrateOptions: {
25009      // Don't persist queries that have errors
25010      shouldDehydrateQuery: (query) => {
25011        return query.state.status === "success";
25012      }
25013    }
25014  });
25015} else {
25016  console.log("⚠️ localStorage not available - persistence disabled (iframe mode)");
25017}
25018const setupOnlineDetection = (onOnline, onOffline) => {
25019  const handleOnline = () => {
25020    console.log("🟢 App is online - refetching data");
25021    queryClient.refetchQueries();
25022    onOnline?.();
25023  };
25024  const handleOffline = () => {
25025    console.log("🔴 App is offline - using cached data");
25026    onOffline?.();
25027  };
25028  window.addEventListener("online", handleOnline);
25029  window.addEventListener("offline", handleOffline);
25030  return () => {
25031    window.removeEventListener("online", handleOnline);
25032    window.removeEventListener("offline", handleOffline);
25033  };
25034};
25035const registerServiceWorker = async () => {
25036  if (!("serviceWorker" in navigator)) {
25037    console.log("[SW] Service Workers not supported");
25038    return;
25039  }
25040  try {
25041    const registration = await navigator.serviceWorker.register("/sw.js", {
25042      scope: "/"
25043    });
25044    console.log("[SW] Service Worker registered successfully:", registration.scope);
25045    setInterval(() => {
25046      registration.update();
25047    }, 60 * 60 * 1e3);
25048    registration.addEventListener("updatefound", () => {
25049      const newWorker = registration.installing;
25050      if (!newWorker) return;
25051      newWorker.addEventListener("statechange", () => {
25052        if (newWorker.state === "installed" && navigator.serviceWorker.controller) {
25053          console.log("[SW] New version available");
25054          if (confirm("Eine neue Version ist verfügbar. Jetzt aktualisieren?")) {
25055            newWorker.postMessage({ type: "SKIP_WAITING" });
25056            window.location.reload();
25057          }
25058        }
25059      });
25060    });
25061    navigator.serviceWorker.addEventListener("controllerchange", () => {
25062      console.log("[SW] Controller changed, reloading page");
25063      window.location.reload();
25064    });
25065  } catch (error) {
25066    console.error("[SW] Service Worker registration failed:", error);
25067  }
25068};
25069setupOnlineDetection(
25070  () => {
25071    console.log("✅ Verbindung wiederhergestellt");
25072  },
25073  () => {
25074    console.log("⚠️ Offline-Modus - Verwende gespeicherte Daten");
25075  }
25076);
25077registerServiceWorker();
25078class ErrorBoundary2 extends React$2.Component {
25079  constructor(props) {
25080    super(props);
25081    this.state = { hasError: false };
25082  }
25083  static getDerivedStateFromError(error) {
25084    return { hasError: true, error };
25085  }
25086  componentDidCatch(error, errorInfo) {
25087    console.error("MEC Portfolio Error:", error, errorInfo);
25088  }
25089  render() {
25090    if (this.state.hasError) {
25091      return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen flex items-center justify-center bg-background-secondary", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center p-8", children: [
25092        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-6xl mb-4", children: "😵" }),
25093        /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl font-semibold text-text-primary mb-2", children: "Oops! Etwas ist schiefgelaufen" }),
25094        /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mb-4", children: "Die Anwendung konnte nicht geladen werden." }),
25095        /* @__PURE__ */ jsxRuntimeExports.jsx(
25096          "button",
25097          {
25098            onClick: () => window.location.reload(),
25099            className: "bg-mec-primary text-white px-4 py-2 rounded-mec hover:bg-mec-primary-dark transition-colors",
25100            children: "Seite neu laden"
25101          }
25102        )
25103      ] }) });
25104    }
25105    return this.props.children;
25106  }
25107}
25108client.createRoot(document.getElementById("root")).render(
25109  /* @__PURE__ */ jsxRuntimeExports.jsx(React$2.StrictMode, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary2, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(QueryClientProvider, { client: queryClient, children: [
25110    /* @__PURE__ */ jsxRuntimeExports.jsx(AppRouter, {}),
25111    false
25112  ] }) }) })
25113);
25114//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtRFY3SGJIRm0uanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QucHJvZHVjdGlvbi5taW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2pzeC1ydW50aW1lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2NsaWVudC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vc3Vic2NyaWJhYmxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9xdWVyeS1jb3JlL2J1aWxkL21vZGVybi90aW1lb3V0TWFuYWdlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vdXRpbHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3F1ZXJ5LWNvcmUvYnVpbGQvbW9kZXJuL2ZvY3VzTWFuYWdlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vdGhlbmFibGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3F1ZXJ5LWNvcmUvYnVpbGQvbW9kZXJuL2h5ZHJhdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vbm90aWZ5TWFuYWdlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vb25saW5lTWFuYWdlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vcmV0cnllci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vcmVtb3ZhYmxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9xdWVyeS1jb3JlL2J1aWxkL21vZGVybi9xdWVyeS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vcXVlcnlPYnNlcnZlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vaW5maW5pdGVRdWVyeUJlaGF2aW9yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9xdWVyeS1jb3JlL2J1aWxkL21vZGVybi9tdXRhdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vbXV0YXRpb25DYWNoZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vcXVlcnlDYWNoZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vcXVlcnlDbGllbnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5L2J1aWxkL21vZGVybi9RdWVyeUNsaWVudFByb3ZpZGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9yZWFjdC1xdWVyeS9idWlsZC9tb2Rlcm4vSXNSZXN0b3JpbmdQcm92aWRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcmVhY3QtcXVlcnkvYnVpbGQvbW9kZXJuL1F1ZXJ5RXJyb3JSZXNldEJvdW5kYXJ5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9yZWFjdC1xdWVyeS9idWlsZC9tb2Rlcm4vZXJyb3JCb3VuZGFyeVV0aWxzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9yZWFjdC1xdWVyeS9idWlsZC9tb2Rlcm4vc3VzcGVuc2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5L2J1aWxkL21vZGVybi91c2VCYXNlUXVlcnkuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5L2J1aWxkL21vZGVybi91c2VRdWVyeS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXIvZGlzdC9kZXZlbG9wbWVudC9jaHVuay1OSVNIWVJJSy5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL2Rpc3QvZGV2ZWxvcG1lbnQvZG9tLWV4cG9ydC5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvenVzdGFuZC9lc20vdmFuaWxsYS5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0ucHJvZHVjdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL3dpdGgtc2VsZWN0b3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvenVzdGFuZC9lc20vaW5kZXgubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL21pZGRsZXdhcmUubWpzIiwiLi4vLi4vc3JjL3N0b3Jlcy91c2VBcHBTdG9yZS50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9hcGkudHMiLCIuLi8uLi9zcmMvaG9va3MvdXNlTG9jYXRpb25zLnRzIiwiLi4vLi4vc3JjL2hvb2tzL3VzZUNvbnRhY3RzLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nsc3gvZGlzdC9jbHN4Lm1qcyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL1VJL0xvYWRpbmdTcGlubmVyLnRzeCIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vZGVmYXVsdEF0dHJpYnV0ZXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2NyZWF0ZUx1Y2lkZUljb24uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2FsZXJ0LWNpcmNsZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvYWxlcnQtdHJpYW5nbGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2Fycm93LXJpZ2h0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9idWlsZGluZy0yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9jaGVjay1jaXJjbGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2NoZXZyb24tZG93bi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvY2hldnJvbi1sZWZ0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9jaGV2cm9uLXJpZ2h0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9jaGV2cm9uLXVwLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9jbG9jay5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvY3Jvc3
25114NoYWlyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9kYXRhYmFzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvZXh0ZXJuYWwtbGluay5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvZ2xvYmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2dyaWQtM3gzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9ob21lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9sYXllcnMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2xpc3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2xvYWRlci0yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9tYWlsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9tYXAtcGluLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9tYXAuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL3Bob25lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9yZWZyZXNoLWN3LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9yb3RhdGUtY2N3LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9zZWFyY2guanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL3NldHRpbmdzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9zaG9wcGluZy1iYWcuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL3VzZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL3VzZXJzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy93aWZpLW9mZi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvd2lmaS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMveC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvem9vbS1pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvem9vbS1vdXQuanMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9VSS9FcnJvckJvdW5kYXJ5LnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL01hcC9NYXBUb29sdGlwSGFuZGxlci50cyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL01hcC9NYXBIYW5kbGVyLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvTWFwL01hcENvbnRyb2xzLnRzeCIsIi4uLy4uL3NyYy9hc3NldHMvbWFwLnN2ZyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL01hcC9NYXBDb250YWluZXIudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvVUkvVW5pZmllZENvbnRhY3RDYXJkLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL0NvbnRhY3QvQ29udGFjdENhcmQudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvQ29udGFjdC9Db250YWN0R3JpZC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9Mb2NhdGlvbi9Mb2NhdGlvbk1pbmlHcmlkQ2FyZC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9VSS9VbmlmaWVkVGFicy50c3giLCIuLi8uLi9zcmMvaG9va3MvdXNlRmlsdGVyRGF0YS50cyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL1VJL1ZpZXdUb2dnbGUudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvVUkvRmlsdGVyQmFyLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL1VJL1NhZmVGaWx0ZXJCYXIudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvVUkvVW5pZmllZExpc3RWaWV3LnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL1VJL01vZGFsLnRzeCIsIi4uLy4uL3NyYy91dGlscy9mb3JtYXRBcmVhLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvTG9jYXRpb24vTG9jYXRpb25Nb2RhbEhlcm8udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvTG9jYXRpb24vTG9jYXRpb25Nb2RhbEluZm8udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvTG9jYXRpb24vTG9jYXRpb25Nb2RhbENvbnRhY3RzLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL1VJL09mZmxpbmVGYWxsYmFjay50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9Mb2NhdGlvbi9Mb2NhdGlvbkNvbnRhY3RNb2RhbC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9Mb2NhdGlvbi9Mb2NhdGlvbk1pbmlDYXJkLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL0NvbnRhY3QvQ29udGFjdE1vZGFsLnRzeCIsIi4uLy4uL3NyYy9hc3NldHMvTUVDLUxvZ28uc3ZnIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvTGF5b3V0L0hlYWRlci50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9MYXlvdXQvRm9vdGVyLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL0xheW91dC9Db250YWluZXIudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvVUkvT2ZmbGluZUluZGljYXRvci50c3giLCIuLi8uLi9zcmMvQXBwLnRzeCIsIi4uLy4uL25vZGVfbW9kdWxlcy90YWlsd2luZC1tZXJnZS9kaXN0L2J1bmRsZS1tanMubWpzIiwiLi4vLi4vc3JjL3V0aWxzL2NuLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvVUkvQ2FyZC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9VSS9CdXR0b24udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvVUkvQmFkZ2UudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvQWRtaW4vU3luY01hbmFnZXIudHN4IiwiLi4vLi4vc3JjL3BhZ2VzL0FkbWluUGFnZS50c3giLCIuLi8uLi9zcmMvcGFnZXMvVGVzdE92ZXJ2aWV3LnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL1VJL1VuaWZpZWRMb2NhdGlvbkNhcmQudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvTG9jYXRpb24vTG9jYXRpb25DYXJkLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL0xvY2F0aW9uL0xvY2F0aW9uR3JpZC50c3giLCIuLi8uLi9zcmMvcGFnZXMvTG9jYXRpb25DYXJkc1Rlc3QudHN4IiwiLi4vLi4vc3JjL3BhZ2VzL0NvbnRhY3RDYXJkc1Rlc3QudHN4IiwiLi4vLi4vc3JjL3BhZ2VzL0J1dHRvblRlc3QudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9pbmRleC50c3giLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3F1ZXJ5LXBlcnNpc3QtY2xpZW50LWNvcmUvYnVpbGQvbW9kZXJuL3BlcnNpc3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3F1ZXJ5LXN5bmMtc3RvcmFnZS1wZXJzaXN0ZXIvYnVpbGQvbW9kZXJuL3V0aWxzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9xdWVyeS1zeW5jLXN0b3JhZ2UtcGVyc2lzdGVyL2J1aWxkL21vZGVybi9pbmRleC5qcyIsIi4uLy4uL3NyYy9saWIvcXVlcnlDbGllbnQudHMiLCIuLi8uLi9zcmMvbGliL3NlcnZpY2VXb3JrZXIudHMiLCIuLi8uLi9zcmMvbWFpbi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aG
25114VcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3ZhciBsPVN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpLG49U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKSxwPVN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSxxPVN5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKSxyPVN5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKSx0PVN5bWJvbC5mb3IoXCJyZWFjdC5wcm92aWRlclwiKSx1PVN5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpLHY9U3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpLHc9U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpLHg9U3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIikseT1TeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSx6PVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBBKGEpe2lmKG51bGw9PT1hfHxcIm9iamVjdFwiIT09dHlwZW9mIGEpcmV0dXJuIG51bGw7YT16JiZhW3pdfHxhW1wiQEBpdGVyYXRvclwiXTtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYT9hOm51bGx9XG52YXIgQj17aXNNb3VudGVkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKCl7fX0sQz1PYmplY3QuYXNzaWduLEQ9e307ZnVuY3Rpb24gRShhLGIsZSl7dGhpcy5wcm9wcz1hO3RoaXMuY29udGV4dD1iO3RoaXMucmVmcz1EO3RoaXMudXBkYXRlcj1lfHxCfUUucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9e307XG5FLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihhLGIpe2lmKFwib2JqZWN0XCIhPT10eXBlb2YgYSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGEmJm51bGwhPWEpdGhyb3cgRXJyb3IoXCJzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy5cIik7dGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLGEsYixcInNldFN0YXRlXCIpfTtFLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsYSxcImZvcmNlVXBkYXRlXCIpfTtmdW5jdGlvbiBGKCl7fUYucHJvdG90eXBlPUUucHJvdG90eXBlO2Z1bmN0aW9uIEcoYSxiLGUpe3RoaXMucHJvcHM9YTt0aGlzLmNvbnRleHQ9Yjt0aGlzLnJlZnM9RDt0aGlzLnVwZGF0ZXI9ZXx8Qn12YXIgSD1HLnByb3RvdHlwZT1uZXcgRjtcbkguY29uc3RydWN0b3I9RztDKEgsRS5wcm90b3R5cGUpO0guaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIEk9QXJyYXkuaXNBcnJheSxKPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksSz17Y3VycmVudDpudWxsfSxMPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07XG5mdW5jdGlvbiBNKGEsYixlKXt2YXIgZCxjPXt9LGs9bnVsbCxoPW51bGw7aWYobnVsbCE9Yilmb3IoZCBpbiB2b2lkIDAhPT1iLnJlZiYmKGg9Yi5yZWYpLHZvaWQgMCE9PWIua2V5JiYoaz1cIlwiK2Iua2V5KSxiKUouY2FsbChiLGQpJiYhTC5oYXNPd25Qcm9wZXJ0eShkKSYmKGNbZF09YltkXSk7dmFyIGc9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1nKWMuY2hpbGRyZW49ZTtlbHNlIGlmKDE8Zyl7Zm9yKHZhciBmPUFycmF5KGcpLG09MDttPGc7bSsrKWZbbV09YXJndW1lbnRzW20rMl07Yy5jaGlsZHJlbj1mfWlmKGEmJmEuZGVmYXVsdFByb3BzKWZvcihkIGluIGc9YS5kZWZhdWx0UHJvcHMsZyl2b2lkIDA9PT1jW2RdJiYoY1tkXT1nW2RdKTtyZXR1cm57JCR0eXBlb2Y6bCx0eXBlOmEsa2V5OmsscmVmOmgscHJvcHM6Yyxfb3duZXI6Sy5jdXJyZW50fX1cbmZ1bmN0aW9uIE4oYSxiKXtyZXR1cm57JCR0eXBlb2Y6bCx0eXBlOmEudHlwZSxrZXk6YixyZWY6YS5yZWYscHJvcHM6YS5wcm9wcyxfb3duZXI6YS5fb3duZXJ9fWZ1bmN0aW9uIE8oYSl7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmYS4kJHR5cGVvZj09PWx9ZnVuY3Rpb24gZXNjYXBlKGEpe3ZhciBiPXtcIj1cIjpcIj0wXCIsXCI6XCI6XCI9MlwifTtyZXR1cm5cIiRcIithLnJlcGxhY2UoL1s9Ol0vZyxmdW5jdGlvbihhKXtyZXR1cm4gYlthXX0pfXZhciBQPS9cXC8rL2c7ZnVuY3Rpb24gUShhLGIpe3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJm51bGwhPWEua2V5P2VzY2FwZShcIlwiK2Eua2V5KTpiLnRvU3RyaW5nKDM2KX1cbmZ1bmN0aW9uIFIoYSxiLGUsZCxjKXt2YXIgaz10eXBlb2YgYTtpZihcInVuZGVmaW5lZFwiPT09a3x8XCJib29sZWFuXCI9PT1rKWE9bnVsbDt2YXIgaD0hMTtpZihudWxsPT09YSloPSEwO2Vsc2Ugc3dpdGNoKGspe2Nhc2UgXCJzdHJpbmdcIjpjYXNlIFwibnVtYmVyXCI6aD0hMDticmVhaztjYXNlIFwib2JqZWN0XCI6c3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgbDpjYXNlIG46aD0hMH19aWYoaClyZXR1cm4gaD1hLGM9YyhoKSxhPVwiXCI9PT1kP1wiLlwiK1EoaCwwKTpkLEkoYyk/KGU9XCJcIixudWxsIT1hJiYoZT1hLnJlcGxhY2UoUCxcIiQmL1wiKStcIi9cIiksUihjLGIsZSxcIlwiLGZ1bmN0aW9uKGEpe3JldHVybiBhfSkpOm51bGwhPWMmJihPKGMpJiYoYz1OKGMsZSsoIWMua2V5fHxoJiZoLmtleT09PWMua2V5P1wiXCI6KFwiXCIrYy5rZXkpLnJlcGxhY2UoUCxcIiQmL1wiKStcIi9cIikrYSkpLGIucHVzaChjKSksMTtoPTA7ZD1cIlwiPT09ZD9cIi5cIjpkK1wiOlwiO2lmKEkoYSkpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspe2s9XG5hW2ddO3ZhciBmPWQrUShrLGcpO2grPVIoayxiLGUsZixjKX1lbHNlIGlmKGY9QShhKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZilmb3IoYT1mLmNhbGwoYSksZz0wOyEoaz1hLm5leHQoKSkuZG9uZTspaz1rLnZhbHVlLGY9ZCtRKGssZysrKSxoKz1SKGssYixlLGYsYyk7ZWxzZSBpZihcIm9iamVjdFwiPT09ayl0aHJvdyBiPVN0cmluZyhhKSxFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBh
25114IFJlYWN0IGNoaWxkIChmb3VuZDogXCIrKFwiW29iamVjdCBPYmplY3RdXCI9PT1iP1wib2JqZWN0IHdpdGgga2V5cyB7XCIrT2JqZWN0LmtleXMoYSkuam9pbihcIiwgXCIpK1wifVwiOmIpK1wiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLlwiKTtyZXR1cm4gaH1cbmZ1bmN0aW9uIFMoYSxiLGUpe2lmKG51bGw9PWEpcmV0dXJuIGE7dmFyIGQ9W10sYz0wO1IoYSxkLFwiXCIsXCJcIixmdW5jdGlvbihhKXtyZXR1cm4gYi5jYWxsKGUsYSxjKyspfSk7cmV0dXJuIGR9ZnVuY3Rpb24gVChhKXtpZigtMT09PWEuX3N0YXR1cyl7dmFyIGI9YS5fcmVzdWx0O2I9YigpO2IudGhlbihmdW5jdGlvbihiKXtpZigwPT09YS5fc3RhdHVzfHwtMT09PWEuX3N0YXR1cylhLl9zdGF0dXM9MSxhLl9yZXN1bHQ9Yn0sZnVuY3Rpb24oYil7aWYoMD09PWEuX3N0YXR1c3x8LTE9PT1hLl9zdGF0dXMpYS5fc3RhdHVzPTIsYS5fcmVzdWx0PWJ9KTstMT09PWEuX3N0YXR1cyYmKGEuX3N0YXR1cz0wLGEuX3Jlc3VsdD1iKX1pZigxPT09YS5fc3RhdHVzKXJldHVybiBhLl9yZXN1bHQuZGVmYXVsdDt0aHJvdyBhLl9yZXN1bHQ7fVxudmFyIFU9e2N1cnJlbnQ6bnVsbH0sVj17dHJhbnNpdGlvbjpudWxsfSxXPXtSZWFjdEN1cnJlbnREaXNwYXRjaGVyOlUsUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6VixSZWFjdEN1cnJlbnRPd25lcjpLfTtmdW5jdGlvbiBYKCl7dGhyb3cgRXJyb3IoXCJhY3QoLi4uKSBpcyBub3Qgc3VwcG9ydGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzIG9mIFJlYWN0LlwiKTt9XG5leHBvcnRzLkNoaWxkcmVuPXttYXA6Uyxmb3JFYWNoOmZ1bmN0aW9uKGEsYixlKXtTKGEsZnVuY3Rpb24oKXtiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZSl9LGNvdW50OmZ1bmN0aW9uKGEpe3ZhciBiPTA7UyhhLGZ1bmN0aW9uKCl7YisrfSk7cmV0dXJuIGJ9LHRvQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIFMoYSxmdW5jdGlvbihhKXtyZXR1cm4gYX0pfHxbXX0sb25seTpmdW5jdGlvbihhKXtpZighTyhhKSl0aHJvdyBFcnJvcihcIlJlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLlwiKTtyZXR1cm4gYX19O2V4cG9ydHMuQ29tcG9uZW50PUU7ZXhwb3J0cy5GcmFnbWVudD1wO2V4cG9ydHMuUHJvZmlsZXI9cjtleHBvcnRzLlB1cmVDb21wb25lbnQ9RztleHBvcnRzLlN0cmljdE1vZGU9cTtleHBvcnRzLlN1c3BlbnNlPXc7XG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPVc7ZXhwb3J0cy5hY3Q9WDtcbmV4cG9ydHMuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGEsYixlKXtpZihudWxsPT09YXx8dm9pZCAwPT09YSl0aHJvdyBFcnJvcihcIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiK2ErXCIuXCIpO3ZhciBkPUMoe30sYS5wcm9wcyksYz1hLmtleSxrPWEucmVmLGg9YS5fb3duZXI7aWYobnVsbCE9Yil7dm9pZCAwIT09Yi5yZWYmJihrPWIucmVmLGg9Sy5jdXJyZW50KTt2b2lkIDAhPT1iLmtleSYmKGM9XCJcIitiLmtleSk7aWYoYS50eXBlJiZhLnR5cGUuZGVmYXVsdFByb3BzKXZhciBnPWEudHlwZS5kZWZhdWx0UHJvcHM7Zm9yKGYgaW4gYilKLmNhbGwoYixmKSYmIUwuaGFzT3duUHJvcGVydHkoZikmJihkW2ZdPXZvaWQgMD09PWJbZl0mJnZvaWQgMCE9PWc/Z1tmXTpiW2ZdKX12YXIgZj1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWYpZC5jaGlsZHJlbj1lO2Vsc2UgaWYoMTxmKXtnPUFycmF5KGYpO1xuZm9yKHZhciBtPTA7bTxmO20rKylnW21dPWFyZ3VtZW50c1ttKzJdO2QuY2hpbGRyZW49Z31yZXR1cm57JCR0eXBlb2Y6bCx0eXBlOmEudHlwZSxrZXk6YyxyZWY6ayxwcm9wczpkLF9vd25lcjpofX07ZXhwb3J0cy5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGEpe2E9eyQkdHlwZW9mOnUsX2N1cnJlbnRWYWx1ZTphLF9jdXJyZW50VmFsdWUyOmEsX3RocmVhZENvdW50OjAsUHJvdmlkZXI6bnVsbCxDb25zdW1lcjpudWxsLF9kZWZhdWx0VmFsdWU6bnVsbCxfZ2xvYmFsTmFtZTpudWxsfTthLlByb3ZpZGVyPXskJHR5cGVvZjp0LF9jb250ZXh0OmF9O3JldHVybiBhLkNvbnN1bWVyPWF9O2V4cG9ydHMuY3JlYXRlRWxlbWVudD1NO2V4cG9ydHMuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbihhKXt2YXIgYj1NLmJpbmQobnVsbCxhKTtiLnR5cGU9YTtyZXR1cm4gYn07ZXhwb3J0cy5jcmVhdGVSZWY9ZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpudWxsfX07XG5leHBvcnRzLmZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJueyQkdHlwZW9mOnYscmVuZGVyOmF9fTtleHBvcnRzLmlzVmFsaWRFbGVtZW50PU87ZXhwb3J0cy5sYXp5PWZ1bmN0aW9uKGEpe3JldHVybnskJHR5cGVvZjp5LF9wYXlsb2FkOntfc3RhdHVzOi0xLF9yZXN1bHQ6YX0sX2luaXQ6VH19O2V4cG9ydHMubWVtbz1mdW5jdGlvbihhLGIpe3JldHVybnskJHR5cGVvZjp4LHR5cGU6YSxjb21wYXJlOnZvaWQgMD09PWI/bnVsbDpifX07ZXhwb3J0cy5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oYSl7dmFyIGI9Vi50cmFuc2l0aW9uO1YudHJhbnNpdGlvbj17fTt0cnl7YSgpfWZpbmFsbHl7Vi50cmFuc2l0aW9uPWJ9fTtleHBvcnRzLnVuc3RhYmxlX2FjdD1YO2V4cG9ydHMudXNlQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5jdXJyZW50LnVzZUNhbGxiYWNrKGEsYil9O2V4cG9ydHMudXNlQ29udGV4dD1mdW5jdGlvbihhKXtyZXR1cm4gVS5jdXJyZW50LnVzZUNvbnRleHQoYSl9O1xuZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlPWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24oYSl7cmV0dXJuIFUuY3VycmVudC51c2VEZWZlcnJlZFZhbHVlKGEpfTtleHBvcnRzLnVzZUVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBVLmN1cnJlbnQudXNlRWZmZWN0KGEsYil9O2V4cG9ydHMudXNlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gVS5jdXJyZW50LnVzZUlkKCl9O2V4cG9ydHMudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihhLGIsZSl7cmV0dXJuIFUuY3VycmVudC51c2VJbXBlcmF0aXZlSGFuZGxlKGEsYixlKX07ZXhwb3J0cy51c2VJbnNlcnRpb25
25114FZmZlY3Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChhLGIpfTtleHBvcnRzLnVzZUxheW91dEVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBVLmN1cnJlbnQudXNlTGF5b3V0RWZmZWN0KGEsYil9O1xuZXhwb3J0cy51c2VNZW1vPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFUuY3VycmVudC51c2VNZW1vKGEsYil9O2V4cG9ydHMudXNlUmVkdWNlcj1mdW5jdGlvbihhLGIsZSl7cmV0dXJuIFUuY3VycmVudC51c2VSZWR1Y2VyKGEsYixlKX07ZXhwb3J0cy51c2VSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIFUuY3VycmVudC51c2VSZWYoYSl9O2V4cG9ydHMudXNlU3RhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFUuY3VycmVudC51c2VTdGF0ZShhKX07ZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbihhLGIsZSl7cmV0dXJuIFUuY3VycmVudC51c2VTeW5jRXh0ZXJuYWxTdG9yZShhLGIsZSl9O2V4cG9ydHMudXNlVHJhbnNpdGlvbj1mdW5jdGlvbigpe3JldHVybiBVLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTtleHBvcnRzLnZlcnNpb249XCIxOC4zLjFcIjtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtanN4LXJ1bnRpbWUucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3ZhciBmPXJlcXVpcmUoXCJyZWFjdFwiKSxrPVN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpLGw9U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLG09T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxuPWYuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQuUmVhY3RDdXJyZW50T3duZXIscD17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O1xuZnVuY3Rpb24gcShjLGEsZyl7dmFyIGIsZD17fSxlPW51bGwsaD1udWxsO3ZvaWQgMCE9PWcmJihlPVwiXCIrZyk7dm9pZCAwIT09YS5rZXkmJihlPVwiXCIrYS5rZXkpO3ZvaWQgMCE9PWEucmVmJiYoaD1hLnJlZik7Zm9yKGIgaW4gYSltLmNhbGwoYSxiKSYmIXAuaGFzT3duUHJvcGVydHkoYikmJihkW2JdPWFbYl0pO2lmKGMmJmMuZGVmYXVsdFByb3BzKWZvcihiIGluIGE9Yy5kZWZhdWx0UHJvcHMsYSl2b2lkIDA9PT1kW2JdJiYoZFtiXT1hW2JdKTtyZXR1cm57JCR0eXBlb2Y6ayx0eXBlOmMsa2V5OmUscmVmOmgscHJvcHM6ZCxfb3duZXI6bi5jdXJyZW50fX1leHBvcnRzLkZyYWdtZW50PWw7ZXhwb3J0cy5qc3g9cTtleHBvcnRzLmpzeHM9cTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0JztmdW5jdGlvbiBmKGEsYil7dmFyIGM9YS5sZW5ndGg7YS5wdXNoKGIpO2E6Zm9yKDswPGM7KXt2YXIgZD1jLTE+Pj4xLGU9YVtkXTtpZigwPGcoZSxiKSlhW2RdPWIsYVtjXT1lLGM9ZDtlbHNlIGJyZWFrIGF9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIDA9PT1hLmxlbmd0aD9udWxsOmFbMF19ZnVuY3Rpb24gayhhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGI9YVswXSxjPWEucG9wKCk7aWYoYyE9PWIpe2FbMF09YzthOmZvcih2YXIgZD0wLGU9YS5sZW5ndGgsdz1lPj4+MTtkPHc7KXt2YXIgbT0yKihkKzEpLTEsQz1hW21dLG49bSsxLHg9YVtuXTtpZigwPmcoQyxjKSluPGUmJjA+Zyh4LEMpPyhhW2RdPXgsYVtuXT1jLGQ9bik6KGFbZF09QyxhW21dPWMsZD1tKTtlbHNlIGlmKG48ZSYmMD5nKHgsYykpYVtkXT14LGFbbl09YyxkPW47ZWxzZSBicmVhayBhfX1yZXR1cm4gYn1cbmZ1bmN0aW9uIGcoYSxiKXt2YXIgYz1hLnNvcnRJbmRleC1iLnNvcnRJbmRleDtyZXR1cm4gMCE9PWM/YzphLmlkLWIuaWR9aWYoXCJvYmplY3RcIj09PXR5cGVvZiBwZXJmb3JtYW5jZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIHBlcmZvcm1hbmNlLm5vdyl7dmFyIGw9cGVyZm9ybWFuY2U7ZXhwb3J0cy51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gbC5ub3coKX19ZWxzZXt2YXIgcD1EYXRlLHE9cC5ub3coKTtleHBvcnRzLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBwLm5vdygpLXF9fXZhciByPVtdLHQ9W10sdT0xLHY9bnVsbCx5PTMsej0hMSxBPSExLEI9ITEsRD1cImZ1bmN0aW9uXCI9PT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0Om51bGwsRT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDpudWxsLEY9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBzZXRJbW1lZGlhdGU/c2V0SW1tZWRpYXRlOm51bGw7XG5cInVuZGVmaW5lZFwiIT09dHlwZW9mIG5hdmlnYXRvciYmdm9pZCAwIT09bmF2aWdhdG9yLnNjaGVkdWxpbmcmJnZvaWQgMCE9PW5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKTtmdW5jdGlvbiBHKGEpe2Zvcih2YXIgYj1oKHQpO251bGwhPT1iOyl7aWYobnVsbD09PWIuY2FsbGJhY2spayh0KTtlbHNlIGlmKGIuc3RhcnRUaW1lPD1hKWsodCksYi5zb3J0SW5kZXg9Yi5leHBpcmF0aW9uVGltZSxmKHIsYik7ZWxzZSBicmVhaztiPWgodCl9fWZ1bmN0aW9uIEgoYSl7Qj0hMTtHKGEpO2lmKCFBKWlmKG51bGwhPT1oKHIpKUE9ITAsSShKKTtlbHNle3ZhciBiPWgodCk7bnVsbCE9PWImJksoSCxiLnN0YXJ0VGltZS1hKX19XG5mdW5jdGlvbiBKKGEsYil7QT0hMTtCJiYoQj0hMSxFKEwpLEw9LTEpO3o9ITA7dmFyIGM9eTt0cnl7RyhiKTtmb3Iodj1oKHIpO251bGwhPT12JiYoISh2LmV4cGlyYXRpb25UaW1lPmIpfHxhJiYhTSgpKTspe3ZhciBkPXYuY2FsbGJhY2s7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe3YuY2FsbGJhY2s9bnVsbDt5PXYucHJpb3JpdHlM
25114ZXZlbDt2YXIgZT1kKHYuZXhwaXJhdGlvblRpbWU8PWIpO2I9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZT92LmNhbGxiYWNrPWU6dj09PWgocikmJmsocik7RyhiKX1lbHNlIGsocik7dj1oKHIpfWlmKG51bGwhPT12KXZhciB3PSEwO2Vsc2V7dmFyIG09aCh0KTtudWxsIT09bSYmSyhILG0uc3RhcnRUaW1lLWIpO3c9ITF9cmV0dXJuIHd9ZmluYWxseXt2PW51bGwseT1jLHo9ITF9fXZhciBOPSExLE89bnVsbCxMPS0xLFA9NSxRPS0xO1xuZnVuY3Rpb24gTSgpe3JldHVybiBleHBvcnRzLnVuc3RhYmxlX25vdygpLVE8UD8hMTohMH1mdW5jdGlvbiBSKCl7aWYobnVsbCE9PU8pe3ZhciBhPWV4cG9ydHMudW5zdGFibGVfbm93KCk7UT1hO3ZhciBiPSEwO3RyeXtiPU8oITAsYSl9ZmluYWxseXtiP1MoKTooTj0hMSxPPW51bGwpfX1lbHNlIE49ITF9dmFyIFM7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIEYpUz1mdW5jdGlvbigpe0YoUil9O2Vsc2UgaWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBNZXNzYWdlQ2hhbm5lbCl7dmFyIFQ9bmV3IE1lc3NhZ2VDaGFubmVsLFU9VC5wb3J0MjtULnBvcnQxLm9ubWVzc2FnZT1SO1M9ZnVuY3Rpb24oKXtVLnBvc3RNZXNzYWdlKG51bGwpfX1lbHNlIFM9ZnVuY3Rpb24oKXtEKFIsMCl9O2Z1bmN0aW9uIEkoYSl7Tz1hO058fChOPSEwLFMoKSl9ZnVuY3Rpb24gSyhhLGIpe0w9RChmdW5jdGlvbigpe2EoZXhwb3J0cy51bnN0YWJsZV9ub3coKSl9LGIpfVxuZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHk9NTtleHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTE7ZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eT00O2V4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk9MztleHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsO2V4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9MjtleHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKGEpe2EuY2FsbGJhY2s9bnVsbH07ZXhwb3J0cy51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe0F8fHp8fChBPSEwLEkoSikpfTtcbmV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oYSl7MD5hfHwxMjU8YT9jb25zb2xlLmVycm9yKFwiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkXCIpOlA9MDxhP01hdGguZmxvb3IoMUUzL2EpOjV9O2V4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4geX07ZXhwb3J0cy51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZT1mdW5jdGlvbigpe3JldHVybiBoKHIpfTtleHBvcnRzLnVuc3RhYmxlX25leHQ9ZnVuY3Rpb24oYSl7c3dpdGNoKHkpe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOnZhciBiPTM7YnJlYWs7ZGVmYXVsdDpiPXl9dmFyIGM9eTt5PWI7dHJ5e3JldHVybiBhKCl9ZmluYWxseXt5PWN9fTtleHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7fTtcbmV4cG9ydHMudW5zdGFibGVfcmVxdWVzdFBhaW50PWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihhLGIpe3N3aXRjaChhKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6YT0zfXZhciBjPXk7eT1hO3RyeXtyZXR1cm4gYigpfWZpbmFsbHl7eT1jfX07XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWV4cG9ydHMudW5zdGFibGVfbm93KCk7XCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yz8oYz1jLmRlbGF5LGM9XCJudW1iZXJcIj09PXR5cGVvZiBjJiYwPGM/ZCtjOmQpOmM9ZDtzd2l0Y2goYSl7Y2FzZSAxOnZhciBlPS0xO2JyZWFrO2Nhc2UgMjplPTI1MDticmVhaztjYXNlIDU6ZT0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDplPTFFNDticmVhaztkZWZhdWx0OmU9NUUzfWU9YytlO2E9e2lkOnUrKyxjYWxsYmFjazpiLHByaW9yaXR5TGV2ZWw6YSxzdGFydFRpbWU6YyxleHBpcmF0aW9uVGltZTplLHNvcnRJbmRleDotMX07Yz5kPyhhLnNvcnRJbmRleD1jLGYodCxhKSxudWxsPT09aChyKSYmYT09PWgodCkmJihCPyhFKEwpLEw9LTEpOkI9ITAsSyhILGMtZCkpKTooYS5zb3J0SW5kZXg9ZSxmKHIsYSksQXx8enx8KEE9ITAsSShKKSkpO3JldHVybiBhfTtcbmV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQ9TTtleHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj15O3JldHVybiBmdW5jdGlvbigpe3ZhciBjPXk7eT1iO3RyeXtyZXR1cm4gYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXt5PWN9fX07XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbi8qXG4gTW9kZXJuaXpyIDMuMC4wcHJlIChDdXN0b20gQnVpbGQpIHwgTUlUXG4qL1xuJ3VzZSBzdHJpY3QnO3ZhciBhYT1yZXF1aXJlKFwicmVhY3RcIiksY2E9cmVxdWlyZShcInNjaGVkdWxlclwiKTtmdW5jdGlvbiBwKGEpe2Zvcih2YXIgYj1cImh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PVwiK2EsYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYis9XCImYXJnc1tdPVwiK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbY10pO3JldHVyblwiTWluaWZpZWQgUmVhY3QgZXJyb3IgI1wiK2ErXCI7IHZpc2l0IFwiK2IrXCIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLlwifXZhciBkYT1uZXcgU2V0LGVhPXt9O2Z1bmN0aW9uIGZ
25114hKGEsYil7aGEoYSxiKTtoYShhK1wiQ2FwdHVyZVwiLGIpfVxuZnVuY3Rpb24gaGEoYSxiKXtlYVthXT1iO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspZGEuYWRkKGJbYV0pfVxudmFyIGlhPSEoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3d8fFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93LmRvY3VtZW50fHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KSxqYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGthPS9eWzpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXVs6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRFxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwXSokLyxsYT1cbnt9LG1hPXt9O2Z1bmN0aW9uIG9hKGEpe2lmKGphLmNhbGwobWEsYSkpcmV0dXJuITA7aWYoamEuY2FsbChsYSxhKSlyZXR1cm4hMTtpZihrYS50ZXN0KGEpKXJldHVybiBtYVthXT0hMDtsYVthXT0hMDtyZXR1cm4hMX1mdW5jdGlvbiBwYShhLGIsYyxkKXtpZihudWxsIT09YyYmMD09PWMudHlwZSlyZXR1cm4hMTtzd2l0Y2godHlwZW9mIGIpe2Nhc2UgXCJmdW5jdGlvblwiOmNhc2UgXCJzeW1ib2xcIjpyZXR1cm4hMDtjYXNlIFwiYm9vbGVhblwiOmlmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpcmV0dXJuIWMuYWNjZXB0c0Jvb2xlYW5zO2E9YS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSk7cmV0dXJuXCJkYXRhLVwiIT09YSYmXCJhcmlhLVwiIT09YTtkZWZhdWx0OnJldHVybiExfX1cbmZ1bmN0aW9uIHFhKGEsYixjLGQpe2lmKG51bGw9PT1ifHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIGJ8fHBhKGEsYixjLGQpKXJldHVybiEwO2lmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpc3dpdGNoKGMudHlwZSl7Y2FzZSAzOnJldHVybiFiO2Nhc2UgNDpyZXR1cm4hMT09PWI7Y2FzZSA1OnJldHVybiBpc05hTihiKTtjYXNlIDY6cmV0dXJuIGlzTmFOKGIpfHwxPmJ9cmV0dXJuITF9ZnVuY3Rpb24gdihhLGIsYyxkLGUsZixnKXt0aGlzLmFjY2VwdHNCb29sZWFucz0yPT09Ynx8Mz09PWJ8fDQ9PT1iO3RoaXMuYXR0cmlidXRlTmFtZT1kO3RoaXMuYXR0cmlidXRlTmFtZXNwYWNlPWU7dGhpcy5tdXN0VXNlUHJvcGVydHk9Yzt0aGlzLnByb3BlcnR5TmFtZT1hO3RoaXMudHlwZT1iO3RoaXMuc2FuaXRpemVVUkw9Zjt0aGlzLnJlbW92ZUVtcHR5U3RyaW5nPWd9dmFyIHo9e307XG5cImNoaWxkcmVuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIGRlZmF1bHRWYWx1ZSBkZWZhdWx0Q2hlY2tlZCBpbm5lckhUTUwgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIHN1cHByZXNzSHlkcmF0aW9uV2FybmluZyBzdHlsZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwwLCExLGEsbnVsbCwhMSwhMSl9KTtbW1wiYWNjZXB0Q2hhcnNldFwiLFwiYWNjZXB0LWNoYXJzZXRcIl0sW1wiY2xhc3NOYW1lXCIsXCJjbGFzc1wiXSxbXCJodG1sRm9yXCIsXCJmb3JcIl0sW1wiaHR0cEVxdWl2XCIsXCJodHRwLWVxdWl2XCJdXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWFbMF07eltiXT1uZXcgdihiLDEsITEsYVsxXSxudWxsLCExLCExKX0pO1tcImNvbnRlbnRFZGl0YWJsZVwiLFwiZHJhZ2dhYmxlXCIsXCJzcGVsbENoZWNrXCIsXCJ2YWx1ZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwyLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuW1wiYXV0b1JldmVyc2VcIixcImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcIixcImZvY3VzYWJsZVwiLFwicHJlc2VydmVBbHBoYVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwyLCExLGEsbnVsbCwhMSwhMSl9KTtcImFsbG93RnVsbFNjcmVlbiBhc3luYyBhdXRvRm9jdXMgYXV0b1BsYXkgY29udHJvbHMgZGVmYXVsdCBkZWZlciBkaXNhYmxlZCBkaXNhYmxlUGljdHVyZUluUGljdHVyZSBkaXNhYmxlUmVtb3RlUGxheWJhY2sgZm9ybU5vVmFsaWRhdGUgaGlkZGVuIGxvb3Agbm9Nb2R1bGUgbm9WYWxpZGF0ZSBvcGVuIHBsYXlzSW5saW5lIHJlYWRPbmx5IHJlcXVpcmVkIHJldmVyc2VkIHNjb3BlZCBzZWFtbGVzcyBpdGVtU2NvcGVcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXt6W2FdPW5ldyB2KGEsMywhMSxhLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtcbltcImNoZWNrZWRcIixcIm11bHRpcGxlXCIsXCJtdXRlZFwiLFwic2VsZWN0ZWRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXt6W2FdPW5ldyB2KGEsMywhMCxhLG51bGwsITEsITEpfSk7W1wiY2FwdHVyZVwiLFwiZG93bmxvYWRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXt6W2FdPW5ldyB2KGEsNCwhMSxhLG51bGwsITEsITEpfSk7W1wiY29sc1wiLFwicm93c1wiLFwic2l6ZVwiLFwic3BhblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSw2LCExLGEsbnVsbCwhMSwhMSl9KTtbXCJyb3dTcGFuXCIsXCJzdGFydFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSw1LCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO3ZhciByYT0vW1xcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIHNhKGEpe3JldHVybiBhWzFdLnRvVXBwZXJDYXNlKCl9XG5cImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbn
25114RhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0XCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKHJhLFxuc2EpO3pbYl09bmV3IHYoYiwxLCExLGEsbnVsbCwhMSwhMSl9KTtcInhsaW5rOmFjdHVhdGUgeGxpbms6YXJjcm9sZSB4bGluazpyb2xlIHhsaW5rOnNob3cgeGxpbms6dGl0bGUgeGxpbms6dHlwZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShyYSxzYSk7eltiXT1uZXcgdihiLDEsITEsYSxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiwhMSwhMSl9KTtbXCJ4bWw6YmFzZVwiLFwieG1sOmxhbmdcIixcInhtbDpzcGFjZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShyYSxzYSk7eltiXT1uZXcgdihiLDEsITEsYSxcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLCExLCExKX0pO1tcInRhYkluZGV4XCIsXCJjcm9zc09yaWdpblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwxLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuei54bGlua0hyZWY9bmV3IHYoXCJ4bGlua0hyZWZcIiwxLCExLFwieGxpbms6aHJlZlwiLFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCEwLCExKTtbXCJzcmNcIixcImhyZWZcIixcImFjdGlvblwiLFwiZm9ybUFjdGlvblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwxLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO1xuZnVuY3Rpb24gdGEoYSxiLGMsZCl7dmFyIGU9ei5oYXNPd25Qcm9wZXJ0eShiKT96W2JdOm51bGw7aWYobnVsbCE9PWU/MCE9PWUudHlwZTpkfHwhKDI8Yi5sZW5ndGgpfHxcIm9cIiE9PWJbMF0mJlwiT1wiIT09YlswXXx8XCJuXCIhPT1iWzFdJiZcIk5cIiE9PWJbMV0pcWEoYixjLGUsZCkmJihjPW51bGwpLGR8fG51bGw9PT1lP29hKGIpJiYobnVsbD09PWM/YS5yZW1vdmVBdHRyaWJ1dGUoYik6YS5zZXRBdHRyaWJ1dGUoYixcIlwiK2MpKTplLm11c3RVc2VQcm9wZXJ0eT9hW2UucHJvcGVydHlOYW1lXT1udWxsPT09Yz8zPT09ZS50eXBlPyExOlwiXCI6YzooYj1lLmF0dHJpYnV0ZU5hbWUsZD1lLmF0dHJpYnV0ZU5hbWVzcGFjZSxudWxsPT09Yz9hLnJlbW92ZUF0dHJpYnV0ZShiKTooZT1lLnR5cGUsYz0zPT09ZXx8ND09PWUmJiEwPT09Yz9cIlwiOlwiXCIrYyxkP2Euc2V0QXR0cmlidXRlTlMoZCxiLGMpOmEuc2V0QXR0cmlidXRlKGIsYykpKX1cbnZhciB1YT1hYS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCx2YT1TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSx3YT1TeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpLHlhPVN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSx6YT1TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIiksQWE9U3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpLEJhPVN5bWJvbC5mb3IoXCJyZWFjdC5wcm92aWRlclwiKSxDYT1TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxEYT1TeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIiksRWE9U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpLEZhPVN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpLEdhPVN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpLEhhPVN5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpO1N5bWJvbC5mb3IoXCJyZWFjdC5zY29wZVwiKTtTeW1ib2wuZm9yKFwicmVhY3QuZGVidWdfdHJhY2VfbW9kZVwiKTtcbnZhciBJYT1TeW1ib2wuZm9yKFwicmVhY3Qub2Zmc2NyZWVuXCIpO1N5bWJvbC5mb3IoXCJyZWFjdC5sZWdhY3lfaGlkZGVuXCIpO1N5bWJvbC5mb3IoXCJyZWFjdC5jYWNoZVwiKTtTeW1ib2wuZm9yKFwicmVhY3QudHJhY2luZ19tYXJrZXJcIik7dmFyIEphPVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBLYShhKXtpZihudWxsPT09YXx8XCJvYmplY3RcIiE9PXR5cGVvZiBhKXJldHVybiBudWxsO2E9SmEmJmFbSmFdfHxhW1wiQEBpdGVyYXRvclwiXTtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYT9hOm51bGx9dmFyIEE9T2JqZWN0LmFzc2lnbixMYTtmdW5jdGlvbiBNYShhKXtpZih2b2lkIDA9PT1MYSl0cnl7dGhyb3cgRXJyb3IoKTt9Y2F0Y2goYyl7dmFyIGI9Yy5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtMYT1iJiZiWzFdfHxcIlwifXJldHVyblwiXFxuXCIrTGErYX12YXIgTmE9ITE7XG5mdW5jdGlvbiBPYShhLGIpe2lmKCFhfHxOYSlyZXR1cm5cIlwiO05hPSEwO3ZhciBjPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYoYilpZihiPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKTt9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSxcInByb3BzXCIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCk7fX0pLFwib2JqZWN0XCI9PT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdC5jb25zdHJ1Y3Qpe3RyeXtSZWZsZWN0LmNvbnN0cnVjdChiLFtdKX1jYXRjaChsKXt2YXIgZD1sfVJlZmxlY3QuY29uc3RydWN0KGEsW10sYil9ZWxzZXt0cnl7Yi5jYWxsKCl9Y2F0Y2gobCl7ZD1sfWEuY2FsbChiLnByb3RvdHlwZSl9ZWxzZXt0cnl7dGhyb3cgRXJyb3IoKTt9Y2F0Y2gobCl7ZD1sfWEoKX19Y2F0Y2gobCl7aWYobCYmZCYmXCJzdHJpbmdcIj09PXR5cGVvZiBsLnN0YWNrKXtmb3IodmFyIGU9bC5zdGFjay5zcGxpdChcIlxcblwiKSxcbmY9ZC5zdGFjay5zcGxpdChcIlxcblwiKSxnPWUubGVuZ3RoLTEsaD1mLmxlbmd0aC0xOzE8PWcmJjA8PWgmJmVbZ10hPT1mW2hdOyloLS07Zm9yKDsxPD1nJiYwPD1oO2ctLSxoLS0paWYoZVtnXSE9PWZbaF0pe2lmKDEhPT1nfHwxIT09aCl7ZG8gaWYoZy0tLGgtLSwwPmh8fGVbZ10hPT1mW2hdKXt2YXIgaz1cIlxcblwiK2VbZ10ucmVwbGFjZShcIiBhdCBuZXcgXCIsXCIgYXQgXCIpO2EuZGlzcGxheU5hbWUmJmsuaW5jbHVkZXMoXCI8YW5vbnltb3VzPlwiKSYmKGs9ay5yZXBsYWNlKFwiPGFub255bW91cz5cIixhLmRpc3BsYXlOYW1lKSk7cmV0dXJuIGt9d2hpbGUoMTw9ZyYmMDw9aCl9YnJlYWt9fX1maW5hbGx5e05hPSExLEVycm9yLnByZXBhcmVTdGFja1RyYWNlPWN9cmV0dXJuKGE9YT9hLmRpc3BsYXlOYW1lfHxhLm5hbWU6XCJcIik/TWEoYSk6XCJcIn1cbmZ1bmN0aW9uIFBhKGEpe3N3aXRjaC
25114hhLnRhZyl7Y2FzZSA1OnJldHVybiBNYShhLnR5cGUpO2Nhc2UgMTY6cmV0dXJuIE1hKFwiTGF6eVwiKTtjYXNlIDEzOnJldHVybiBNYShcIlN1c3BlbnNlXCIpO2Nhc2UgMTk6cmV0dXJuIE1hKFwiU3VzcGVuc2VMaXN0XCIpO2Nhc2UgMDpjYXNlIDI6Y2FzZSAxNTpyZXR1cm4gYT1PYShhLnR5cGUsITEpLGE7Y2FzZSAxMTpyZXR1cm4gYT1PYShhLnR5cGUucmVuZGVyLCExKSxhO2Nhc2UgMTpyZXR1cm4gYT1PYShhLnR5cGUsITApLGE7ZGVmYXVsdDpyZXR1cm5cIlwifX1cbmZ1bmN0aW9uIFFhKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIGEuZGlzcGxheU5hbWV8fGEubmFtZXx8bnVsbDtpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIGE7c3dpdGNoKGEpe2Nhc2UgeWE6cmV0dXJuXCJGcmFnbWVudFwiO2Nhc2Ugd2E6cmV0dXJuXCJQb3J0YWxcIjtjYXNlIEFhOnJldHVyblwiUHJvZmlsZXJcIjtjYXNlIHphOnJldHVyblwiU3RyaWN0TW9kZVwiO2Nhc2UgRWE6cmV0dXJuXCJTdXNwZW5zZVwiO2Nhc2UgRmE6cmV0dXJuXCJTdXNwZW5zZUxpc3RcIn1pZihcIm9iamVjdFwiPT09dHlwZW9mIGEpc3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgQ2E6cmV0dXJuKGEuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Db25zdW1lclwiO2Nhc2UgQmE6cmV0dXJuKGEuX2NvbnRleHQuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Qcm92aWRlclwiO2Nhc2UgRGE6dmFyIGI9YS5yZW5kZXI7YT1hLmRpc3BsYXlOYW1lO2F8fChhPWIuZGlzcGxheU5hbWV8fFxuYi5uYW1lfHxcIlwiLGE9XCJcIiE9PWE/XCJGb3J3YXJkUmVmKFwiK2ErXCIpXCI6XCJGb3J3YXJkUmVmXCIpO3JldHVybiBhO2Nhc2UgR2E6cmV0dXJuIGI9YS5kaXNwbGF5TmFtZXx8bnVsbCxudWxsIT09Yj9iOlFhKGEudHlwZSl8fFwiTWVtb1wiO2Nhc2UgSGE6Yj1hLl9wYXlsb2FkO2E9YS5faW5pdDt0cnl7cmV0dXJuIFFhKGEoYikpfWNhdGNoKGMpe319cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBSYShhKXt2YXIgYj1hLnR5cGU7c3dpdGNoKGEudGFnKXtjYXNlIDI0OnJldHVyblwiQ2FjaGVcIjtjYXNlIDk6cmV0dXJuKGIuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Db25zdW1lclwiO2Nhc2UgMTA6cmV0dXJuKGIuX2NvbnRleHQuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Qcm92aWRlclwiO2Nhc2UgMTg6cmV0dXJuXCJEZWh5ZHJhdGVkRnJhZ21lbnRcIjtjYXNlIDExOnJldHVybiBhPWIucmVuZGVyLGE9YS5kaXNwbGF5TmFtZXx8YS5uYW1lfHxcIlwiLGIuZGlzcGxheU5hbWV8fChcIlwiIT09YT9cIkZvcndhcmRSZWYoXCIrYStcIilcIjpcIkZvcndhcmRSZWZcIik7Y2FzZSA3OnJldHVyblwiRnJhZ21lbnRcIjtjYXNlIDU6cmV0dXJuIGI7Y2FzZSA0OnJldHVyblwiUG9ydGFsXCI7Y2FzZSAzOnJldHVyblwiUm9vdFwiO2Nhc2UgNjpyZXR1cm5cIlRleHRcIjtjYXNlIDE2OnJldHVybiBRYShiKTtjYXNlIDg6cmV0dXJuIGI9PT16YT9cIlN0cmljdE1vZGVcIjpcIk1vZGVcIjtjYXNlIDIyOnJldHVyblwiT2Zmc2NyZWVuXCI7XG5jYXNlIDEyOnJldHVyblwiUHJvZmlsZXJcIjtjYXNlIDIxOnJldHVyblwiU2NvcGVcIjtjYXNlIDEzOnJldHVyblwiU3VzcGVuc2VcIjtjYXNlIDE5OnJldHVyblwiU3VzcGVuc2VMaXN0XCI7Y2FzZSAyNTpyZXR1cm5cIlRyYWNpbmdNYXJrZXJcIjtjYXNlIDE6Y2FzZSAwOmNhc2UgMTc6Y2FzZSAyOmNhc2UgMTQ6Y2FzZSAxNTppZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYilyZXR1cm4gYi5kaXNwbGF5TmFtZXx8Yi5uYW1lfHxudWxsO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYilyZXR1cm4gYn1yZXR1cm4gbnVsbH1mdW5jdGlvbiBTYShhKXtzd2l0Y2godHlwZW9mIGEpe2Nhc2UgXCJib29sZWFuXCI6Y2FzZSBcIm51bWJlclwiOmNhc2UgXCJzdHJpbmdcIjpjYXNlIFwidW5kZWZpbmVkXCI6cmV0dXJuIGE7Y2FzZSBcIm9iamVjdFwiOnJldHVybiBhO2RlZmF1bHQ6cmV0dXJuXCJcIn19XG5mdW5jdGlvbiBUYShhKXt2YXIgYj1hLnR5cGU7cmV0dXJuKGE9YS5ub2RlTmFtZSkmJlwiaW5wdXRcIj09PWEudG9Mb3dlckNhc2UoKSYmKFwiY2hlY2tib3hcIj09PWJ8fFwicmFkaW9cIj09PWIpfVxuZnVuY3Rpb24gVWEoYSl7dmFyIGI9VGEoYSk/XCJjaGVja2VkXCI6XCJ2YWx1ZVwiLGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSxiKSxkPVwiXCIrYVtiXTtpZighYS5oYXNPd25Qcm9wZXJ0eShiKSYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy5nZXQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBjLnNldCl7dmFyIGU9Yy5nZXQsZj1jLnNldDtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGEpe2Q9XCJcIithO2YuY2FsbCh0aGlzLGEpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2VudW1lcmFibGU6Yy5lbnVtZXJhYmxlfSk7cmV0dXJue2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGR9LHNldFZhbHVlOmZ1bmN0aW9uKGEpe2Q9XCJcIithfSxzdG9wVHJhY2tpbmc6ZnVuY3Rpb24oKXthLl92YWx1ZVRyYWNrZXI9XG5udWxsO2RlbGV0ZSBhW2JdfX19fWZ1bmN0aW9uIFZhKGEpe2EuX3ZhbHVlVHJhY2tlcnx8KGEuX3ZhbHVlVHJhY2tlcj1VYShhKSl9ZnVuY3Rpb24gV2EoYSl7aWYoIWEpcmV0dXJuITE7dmFyIGI9YS5fdmFsdWVUcmFja2VyO2lmKCFiKXJldHVybiEwO3ZhciBjPWIuZ2V0VmFsdWUoKTt2YXIgZD1cIlwiO2EmJihkPVRhKGEpP2EuY2hlY2tlZD9cInRydWVcIjpcImZhbHNlXCI6YS52YWx1ZSk7YT1kO3JldHVybiBhIT09Yz8oYi5zZXRWYWx1ZShhKSwhMCk6ITF9ZnVuY3Rpb24gWGEoYSl7YT1hfHwoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudDp2b2lkIDApO2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGEuYWN0aXZlRWxlbWVudHx8YS5ib2R5fWNhdGNoKGIpe3JldHVybiBhLmJvZHl9fVxuZnVuY3Rpb24gWWEoYSxiKXt2YXIgYz1iLmNoZWNrZWQ7cmV0dXJuIEEoe30sYix7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bnVsbCE9Yz9jOmEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZH0pfWZ1bmN0aW9uIFphKGEsYil7dmFyIGM9bnVsbD09Yi5kZWZhdWx0VmFsdWU/XCJcIjpiLmRlZmF1bHRWYWx1ZSxkPW51bGwhPWIuY2hlY2tlZD9iLmNoZWNrZWQ6Yi5kZWZhdWx0Q2hlY2tlZDtjPVNhKG51bGwhPWIudmFsdWU/Yi52YWx1ZTpjKTthLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOmQsaW5pdGlhbFZhbHVlOmMsY29udHJvbGxlZDpcImNoZWNrYm94XCI9PT1iLnR5cGV8fFwicmFkaW9cIj09PWIudHlwZT9udWxsIT1iLmNoZWNrZWQ6bnVsbCE9Yi52YWx1ZX19ZnVuY3Rpb24gYWIoYSxiKXtiPWIuY2hlY2tlZDtudWxsIT1iJiZ0YShhLFwiY2hlY2tlZFwiLGIsITEpfVxuZnVuY3Rpb24gYmIoYSxiKXthYihhLGIpO3ZhciBjPVNhKGIudmFsdWUpLGQ9Yi50eXBlO2lmKG51bGwhPWMpaWYoXCJudW1iZXJcIj09PWQpe2lmK
25114DA9PT1jJiZcIlwiPT09YS52YWx1ZXx8YS52YWx1ZSE9YylhLnZhbHVlPVwiXCIrY31lbHNlIGEudmFsdWUhPT1cIlwiK2MmJihhLnZhbHVlPVwiXCIrYyk7ZWxzZSBpZihcInN1Ym1pdFwiPT09ZHx8XCJyZXNldFwiPT09ZCl7YS5yZW1vdmVBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtyZXR1cm59Yi5oYXNPd25Qcm9wZXJ0eShcInZhbHVlXCIpP2NiKGEsYi50eXBlLGMpOmIuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikmJmNiKGEsYi50eXBlLFNhKGIuZGVmYXVsdFZhbHVlKSk7bnVsbD09Yi5jaGVja2VkJiZudWxsIT1iLmRlZmF1bHRDaGVja2VkJiYoYS5kZWZhdWx0Q2hlY2tlZD0hIWIuZGVmYXVsdENoZWNrZWQpfVxuZnVuY3Rpb24gZGIoYSxiLGMpe2lmKGIuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKXx8Yi5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSl7dmFyIGQ9Yi50eXBlO2lmKCEoXCJzdWJtaXRcIiE9PWQmJlwicmVzZXRcIiE9PWR8fHZvaWQgMCE9PWIudmFsdWUmJm51bGwhPT1iLnZhbHVlKSlyZXR1cm47Yj1cIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU7Y3x8Yj09PWEudmFsdWV8fChhLnZhbHVlPWIpO2EuZGVmYXVsdFZhbHVlPWJ9Yz1hLm5hbWU7XCJcIiE9PWMmJihhLm5hbWU9XCJcIik7YS5kZWZhdWx0Q2hlY2tlZD0hIWEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcIlwiIT09YyYmKGEubmFtZT1jKX1cbmZ1bmN0aW9uIGNiKGEsYixjKXtpZihcIm51bWJlclwiIT09Ynx8WGEoYS5vd25lckRvY3VtZW50KSE9PWEpbnVsbD09Yz9hLmRlZmF1bHRWYWx1ZT1cIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU6YS5kZWZhdWx0VmFsdWUhPT1cIlwiK2MmJihhLmRlZmF1bHRWYWx1ZT1cIlwiK2MpfXZhciBlYj1BcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gZmIoYSxiLGMsZCl7YT1hLm9wdGlvbnM7aWYoYil7Yj17fTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyliW1wiJFwiK2NbZV1dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZT1iLmhhc093blByb3BlcnR5KFwiJFwiK2FbY10udmFsdWUpLGFbY10uc2VsZWN0ZWQhPT1lJiYoYVtjXS5zZWxlY3RlZD1lKSxlJiZkJiYoYVtjXS5kZWZhdWx0U2VsZWN0ZWQ9ITApfWVsc2V7Yz1cIlwiK1NhKGMpO2I9bnVsbDtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKXtpZihhW2VdLnZhbHVlPT09Yyl7YVtlXS5zZWxlY3RlZD0hMDtkJiYoYVtlXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn1udWxsIT09Ynx8YVtlXS5kaXNhYmxlZHx8KGI9YVtlXSl9bnVsbCE9PWImJihiLnNlbGVjdGVkPSEwKX19XG5mdW5jdGlvbiBnYihhLGIpe2lmKG51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpdGhyb3cgRXJyb3IocCg5MSkpO3JldHVybiBBKHt9LGIse3ZhbHVlOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLGNoaWxkcmVuOlwiXCIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIGhiKGEsYil7dmFyIGM9Yi52YWx1ZTtpZihudWxsPT1jKXtjPWIuY2hpbGRyZW47Yj1iLmRlZmF1bHRWYWx1ZTtpZihudWxsIT1jKXtpZihudWxsIT1iKXRocm93IEVycm9yKHAoOTIpKTtpZihlYihjKSl7aWYoMTxjLmxlbmd0aCl0aHJvdyBFcnJvcihwKDkzKSk7Yz1jWzBdfWI9Y31udWxsPT1iJiYoYj1cIlwiKTtjPWJ9YS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6U2EoYyl9fVxuZnVuY3Rpb24gaWIoYSxiKXt2YXIgYz1TYShiLnZhbHVlKSxkPVNhKGIuZGVmYXVsdFZhbHVlKTtudWxsIT1jJiYoYz1cIlwiK2MsYyE9PWEudmFsdWUmJihhLnZhbHVlPWMpLG51bGw9PWIuZGVmYXVsdFZhbHVlJiZhLmRlZmF1bHRWYWx1ZSE9PWMmJihhLmRlZmF1bHRWYWx1ZT1jKSk7bnVsbCE9ZCYmKGEuZGVmYXVsdFZhbHVlPVwiXCIrZCl9ZnVuY3Rpb24gamIoYSl7dmFyIGI9YS50ZXh0Q29udGVudDtiPT09YS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSYmXCJcIiE9PWImJm51bGwhPT1iJiYoYS52YWx1ZT1iKX1mdW5jdGlvbiBrYihhKXtzd2l0Y2goYSl7Y2FzZSBcInN2Z1wiOnJldHVyblwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtjYXNlIFwibWF0aFwiOnJldHVyblwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiO2RlZmF1bHQ6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCJ9fVxuZnVuY3Rpb24gbGIoYSxiKXtyZXR1cm4gbnVsbD09YXx8XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1hP2tiKGIpOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj09PWEmJlwiZm9yZWlnbk9iamVjdFwiPT09Yj9cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjphfVxudmFyIG1iLG5iPWZ1bmN0aW9uKGEpe3JldHVyblwidW5kZWZpbmVkXCIhPT10eXBlb2YgTVNBcHAmJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKGIsYyxkLGUpe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGEoYixjLGQsZSl9KX06YX0oZnVuY3Rpb24oYSxiKXtpZihcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIhPT1hLm5hbWVzcGFjZVVSSXx8XCJpbm5lckhUTUxcImluIGEpYS5pbm5lckhUTUw9YjtlbHNle21iPW1ifHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO21iLmlubmVySFRNTD1cIjxzdmc+XCIrYi52YWx1ZU9mKCkudG9TdHJpbmcoKStcIjwvc3ZnPlwiO2ZvcihiPW1iLmZpcnN0Q2hpbGQ7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWEuYXBwZW5kQ2hpbGQoYi5maXJzdENoaWxkKX19KTtcbmZ1bmN0aW9uIG9iKGEsYil7aWYoYil7dmFyIGM9YS5maXJzdENoaWxkO2lmKGMmJmM9PT1hLmxhc3RDaGlsZCYmMz09PWMubm9kZVR5cGUpe2Mubm9kZVZhbHVlPWI7cmV0dXJufX1hLnRleHRDb250ZW50PWJ9XG52YXIgcGI9e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGFzcGVjdFJhdGlvOiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRlckltYWdlU2xpY2U6ITAsYm9yZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91cDohMCxib3hPcmRpbmFsR3JvdXA6ITAsY29sdW1uQ291bnQ6ITAsY29sdW1uczohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZEFyZWE6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTcGFuOiEwLGdyaWRSb3dTdGFydDohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblNwYW46ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLH
25114RhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCxcbnpvb206ITAsZmlsbE9wYWNpdHk6ITAsZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZURhc2hhcnJheTohMCxzdHJva2VEYXNob2Zmc2V0OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMCxzdHJva2VXaWR0aDohMH0scWI9W1wiV2Via2l0XCIsXCJtc1wiLFwiTW96XCIsXCJPXCJdO09iamVjdC5rZXlzKHBiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3FiLmZvckVhY2goZnVuY3Rpb24oYil7Yj1iK2EuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHJpbmcoMSk7cGJbYl09cGJbYV19KX0pO2Z1bmN0aW9uIHJiKGEsYixjKXtyZXR1cm4gbnVsbD09Ynx8XCJib29sZWFuXCI9PT10eXBlb2YgYnx8XCJcIj09PWI/XCJcIjpjfHxcIm51bWJlclwiIT09dHlwZW9mIGJ8fDA9PT1ifHxwYi5oYXNPd25Qcm9wZXJ0eShhKSYmcGJbYV0/KFwiXCIrYikudHJpbSgpOmIrXCJweFwifVxuZnVuY3Rpb24gc2IoYSxiKXthPWEuc3R5bGU7Zm9yKHZhciBjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9MD09PWMuaW5kZXhPZihcIi0tXCIpLGU9cmIoYyxiW2NdLGQpO1wiZmxvYXRcIj09PWMmJihjPVwiY3NzRmxvYXRcIik7ZD9hLnNldFByb3BlcnR5KGMsZSk6YVtjXT1lfX12YXIgdGI9QSh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtcbmZ1bmN0aW9uIHViKGEsYil7aWYoYil7aWYodGJbYV0mJihudWxsIT1iLmNoaWxkcmVufHxudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcihwKDEzNyxhKSk7aWYobnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCl7aWYobnVsbCE9Yi5jaGlsZHJlbil0aHJvdyBFcnJvcihwKDYwKSk7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MfHwhKFwiX19odG1sXCJpbiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcihwKDYxKSk7fWlmKG51bGwhPWIuc3R5bGUmJlwib2JqZWN0XCIhPT10eXBlb2YgYi5zdHlsZSl0aHJvdyBFcnJvcihwKDYyKSk7fX1cbmZ1bmN0aW9uIHZiKGEsYil7aWYoLTE9PT1hLmluZGV4T2YoXCItXCIpKXJldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYi5pcztzd2l0Y2goYSl7Y2FzZSBcImFubm90YXRpb24teG1sXCI6Y2FzZSBcImNvbG9yLXByb2ZpbGVcIjpjYXNlIFwiZm9udC1mYWNlXCI6Y2FzZSBcImZvbnQtZmFjZS1zcmNcIjpjYXNlIFwiZm9udC1mYWNlLXVyaVwiOmNhc2UgXCJmb250LWZhY2UtZm9ybWF0XCI6Y2FzZSBcImZvbnQtZmFjZS1uYW1lXCI6Y2FzZSBcIm1pc3NpbmctZ2x5cGhcIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgd2I9bnVsbDtmdW5jdGlvbiB4YihhKXthPWEudGFyZ2V0fHxhLnNyY0VsZW1lbnR8fHdpbmRvdzthLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYoYT1hLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KTtyZXR1cm4gMz09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmF9dmFyIHliPW51bGwsemI9bnVsbCxBYj1udWxsO1xuZnVuY3Rpb24gQmIoYSl7aWYoYT1DYihhKSl7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIHliKXRocm93IEVycm9yKHAoMjgwKSk7dmFyIGI9YS5zdGF0ZU5vZGU7YiYmKGI9RGIoYikseWIoYS5zdGF0ZU5vZGUsYS50eXBlLGIpKX19ZnVuY3Rpb24gRWIoYSl7emI/QWI/QWIucHVzaChhKTpBYj1bYV06emI9YX1mdW5jdGlvbiBGYigpe2lmKHpiKXt2YXIgYT16YixiPUFiO0FiPXpiPW51bGw7QmIoYSk7aWYoYilmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKUJiKGJbYV0pfX1mdW5jdGlvbiBHYihhLGIpe3JldHVybiBhKGIpfWZ1bmN0aW9uIEhiKCl7fXZhciBJYj0hMTtmdW5jdGlvbiBKYihhLGIsYyl7aWYoSWIpcmV0dXJuIGEoYixjKTtJYj0hMDt0cnl7cmV0dXJuIEdiKGEsYixjKX1maW5hbGx5e2lmKEliPSExLG51bGwhPT16Ynx8bnVsbCE9PUFiKUhiKCksRmIoKX19XG5mdW5jdGlvbiBLYihhLGIpe3ZhciBjPWEuc3RhdGVOb2RlO2lmKG51bGw9PT1jKXJldHVybiBudWxsO3ZhciBkPURiKGMpO2lmKG51bGw9PT1kKXJldHVybiBudWxsO2M9ZFtiXTthOnN3aXRjaChiKXtjYXNlIFwib25DbGlja1wiOmNhc2UgXCJvbkNsaWNrQ2FwdHVyZVwiOmNhc2UgXCJvbkRvdWJsZUNsaWNrXCI6Y2FzZSBcIm9uRG91YmxlQ2xpY2tDYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VEb3duXCI6Y2FzZSBcIm9uTW91c2VEb3duQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlTW92ZVwiOmNhc2UgXCJvbk1vdXNlTW92ZUNhcHR1cmVcIjpjYXNlIFwib25Nb3VzZVVwXCI6Y2FzZSBcIm9uTW91c2VVcENhcHR1cmVcIjpjYXNlIFwib25Nb3VzZUVudGVyXCI6KGQ9IWQuZGlzYWJsZWQpfHwoYT1hLnR5cGUsZD0hKFwiYnV0dG9uXCI9PT1hfHxcImlucHV0XCI9PT1hfHxcInNlbGVjdFwiPT09YXx8XCJ0ZXh0YXJlYVwiPT09YSkpO2E9IWQ7YnJlYWsgYTtkZWZhdWx0OmE9ITF9aWYoYSlyZXR1cm4gbnVsbDtpZihjJiZcImZ1bmN0aW9uXCIhPT1cbnR5cGVvZiBjKXRocm93IEVycm9yKHAoMjMxLGIsdHlwZW9mIGMpKTtyZXR1cm4gY312YXIgTGI9ITE7aWYoaWEpdHJ5e3ZhciBNYj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTWIsXCJwYXNzaXZlXCIse2dldDpmdW5jdGlvbigpe0xiPSEwfX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidGVzdFwiLE1iLE1iKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRlc3RcIixNYixNYil9Y2F0Y2goYSl7TGI9ITF9ZnVuY3Rpb24gTmIoYSxiLGMsZCxlLGYsZyxoLGspe3ZhciBsPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7Yi5hcHBseShjLGwpfWNhdGNoKG0pe3RoaXMub25FcnJvcihtKX19dmFyIE9iPSExLFBiPW51bGwsUWI9ITEsUmI9bnVsbCxTYj17b25FcnJvcjpmdW5jdGlvbihhKXtPYj0hMDtQYj1hfX07ZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYsZyxoLGspe09iPSExO1BiPW51bGw7TmIuYXBwbHkoU2IsYXJndW1lbnRzKX1cbmZ1bmN0aW9uIFViKGEsYixjLGQsZSxmLGcsaCxrKXtUYi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoT2Ipe2lmKE9iKXt2YXIgbD1QYjtPYj0hMTtQYj1udWxsfWVsc2UgdGhyb3cgRXJyb3IocCgxOTgpKTtRYnx8KFFiPSEwLFJiPWwpfX1mdW5jdGlvbiBWYihhKXt2YXIgYj1hLGM9YTtpZihhLmFsdGVybmF0ZSlmb3IoO2IucmV0dXJuOyliPWIucmV0dXJuO2Vsc2V7YT1iO2RvIGI9YSwwIT09KGIuZmxhZ3MmNDA5OCkmJihjPWIucmV0dXJuKSxhPWIucmV0dXJuO3doaWxlKGEpfXJldHVybiAzPT09Yi50YWc/YzpudWxsfWZ1bmN0aW9uIFdiKGEpe2lmKDEzPT09YS50YWcpe3ZhciBiPWEubWVtb2l6ZWRTdGF0ZTtudWxsPT09YiYmKGE9YS5hbHRlcm5hdGUsbnVsbCE9PWEmJihiPWEubWVtb2l6ZWRTdGF0ZSkpO2lmKG51bGwhPT1iKXJldHVybi
25114BiLmRlaHlkcmF0ZWR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gWGIoYSl7aWYoVmIoYSkhPT1hKXRocm93IEVycm9yKHAoMTg4KSk7fVxuZnVuY3Rpb24gWWIoYSl7dmFyIGI9YS5hbHRlcm5hdGU7aWYoIWIpe2I9VmIoYSk7aWYobnVsbD09PWIpdGhyb3cgRXJyb3IocCgxODgpKTtyZXR1cm4gYiE9PWE/bnVsbDphfWZvcih2YXIgYz1hLGQ9Yjs7KXt2YXIgZT1jLnJldHVybjtpZihudWxsPT09ZSlicmVhazt2YXIgZj1lLmFsdGVybmF0ZTtpZihudWxsPT09Zil7ZD1lLnJldHVybjtpZihudWxsIT09ZCl7Yz1kO2NvbnRpbnVlfWJyZWFrfWlmKGUuY2hpbGQ9PT1mLmNoaWxkKXtmb3IoZj1lLmNoaWxkO2Y7KXtpZihmPT09YylyZXR1cm4gWGIoZSksYTtpZihmPT09ZClyZXR1cm4gWGIoZSksYjtmPWYuc2libGluZ310aHJvdyBFcnJvcihwKDE4OCkpO31pZihjLnJldHVybiE9PWQucmV0dXJuKWM9ZSxkPWY7ZWxzZXtmb3IodmFyIGc9ITEsaD1lLmNoaWxkO2g7KXtpZihoPT09Yyl7Zz0hMDtjPWU7ZD1mO2JyZWFrfWlmKGg9PT1kKXtnPSEwO2Q9ZTtjPWY7YnJlYWt9aD1oLnNpYmxpbmd9aWYoIWcpe2ZvcihoPWYuY2hpbGQ7aDspe2lmKGg9PT1cbmMpe2c9ITA7Yz1mO2Q9ZTticmVha31pZihoPT09ZCl7Zz0hMDtkPWY7Yz1lO2JyZWFrfWg9aC5zaWJsaW5nfWlmKCFnKXRocm93IEVycm9yKHAoMTg5KSk7fX1pZihjLmFsdGVybmF0ZSE9PWQpdGhyb3cgRXJyb3IocCgxOTApKTt9aWYoMyE9PWMudGFnKXRocm93IEVycm9yKHAoMTg4KSk7cmV0dXJuIGMuc3RhdGVOb2RlLmN1cnJlbnQ9PT1jP2E6Yn1mdW5jdGlvbiBaYihhKXthPVliKGEpO3JldHVybiBudWxsIT09YT8kYihhKTpudWxsfWZ1bmN0aW9uICRiKGEpe2lmKDU9PT1hLnRhZ3x8Nj09PWEudGFnKXJldHVybiBhO2ZvcihhPWEuY2hpbGQ7bnVsbCE9PWE7KXt2YXIgYj0kYihhKTtpZihudWxsIT09YilyZXR1cm4gYjthPWEuc2libGluZ31yZXR1cm4gbnVsbH1cbnZhciBhYz1jYS51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLGJjPWNhLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLGNjPWNhLnVuc3RhYmxlX3Nob3VsZFlpZWxkLGRjPWNhLnVuc3RhYmxlX3JlcXVlc3RQYWludCxCPWNhLnVuc3RhYmxlX25vdyxlYz1jYS51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCxmYz1jYS51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSxnYz1jYS51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxoYz1jYS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSxpYz1jYS51bnN0YWJsZV9Mb3dQcmlvcml0eSxqYz1jYS51bnN0YWJsZV9JZGxlUHJpb3JpdHksa2M9bnVsbCxsYz1udWxsO2Z1bmN0aW9uIG1jKGEpe2lmKGxjJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgbGMub25Db21taXRGaWJlclJvb3QpdHJ5e2xjLm9uQ29tbWl0RmliZXJSb290KGtjLGEsdm9pZCAwLDEyOD09PShhLmN1cnJlbnQuZmxhZ3MmMTI4KSl9Y2F0Y2goYil7fX1cbnZhciBvYz1NYXRoLmNsejMyP01hdGguY2x6MzI6bmMscGM9TWF0aC5sb2cscWM9TWF0aC5MTjI7ZnVuY3Rpb24gbmMoYSl7YT4+Pj0wO3JldHVybiAwPT09YT8zMjozMS0ocGMoYSkvcWN8MCl8MH12YXIgcmM9NjQsc2M9NDE5NDMwNDtcbmZ1bmN0aW9uIHRjKGEpe3N3aXRjaChhJi1hKXtjYXNlIDE6cmV0dXJuIDE7Y2FzZSAyOnJldHVybiAyO2Nhc2UgNDpyZXR1cm4gNDtjYXNlIDg6cmV0dXJuIDg7Y2FzZSAxNjpyZXR1cm4gMTY7Y2FzZSAzMjpyZXR1cm4gMzI7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gYSY0MTk0MjQwO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuIGEmMTMwMDIzNDI0O2Nhc2UgMTM0MjE3NzI4OnJldHVybiAxMzQyMTc3Mjg7Y2FzZSAyNjg0MzU0NTY6cmV0dXJuIDI2ODQzNTQ1NjtjYXNlIDUzNjg3MDkxMjpyZXR1cm4gNTM2ODcwOTEyO2Nhc2UgMTA3Mzc0MTgyNDpyZXR1cm4gMTA3Mzc0MTgyNDtcbmRlZmF1bHQ6cmV0dXJuIGF9fWZ1bmN0aW9uIHVjKGEsYil7dmFyIGM9YS5wZW5kaW5nTGFuZXM7aWYoMD09PWMpcmV0dXJuIDA7dmFyIGQ9MCxlPWEuc3VzcGVuZGVkTGFuZXMsZj1hLnBpbmdlZExhbmVzLGc9YyYyNjg0MzU0NTU7aWYoMCE9PWcpe3ZhciBoPWcmfmU7MCE9PWg/ZD10YyhoKTooZiY9ZywwIT09ZiYmKGQ9dGMoZikpKX1lbHNlIGc9YyZ+ZSwwIT09Zz9kPXRjKGcpOjAhPT1mJiYoZD10YyhmKSk7aWYoMD09PWQpcmV0dXJuIDA7aWYoMCE9PWImJmIhPT1kJiYwPT09KGImZSkmJihlPWQmLWQsZj1iJi1iLGU+PWZ8fDE2PT09ZSYmMCE9PShmJjQxOTQyNDApKSlyZXR1cm4gYjswIT09KGQmNCkmJihkfD1jJjE2KTtiPWEuZW50YW5nbGVkTGFuZXM7aWYoMCE9PWIpZm9yKGE9YS5lbnRhbmdsZW1lbnRzLGImPWQ7MDxiOyljPTMxLW9jKGIpLGU9MTw8YyxkfD1hW2NdLGImPX5lO3JldHVybiBkfVxuZnVuY3Rpb24gdmMoYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOmNhc2UgMjpjYXNlIDQ6cmV0dXJuIGIrMjUwO2Nhc2UgODpjYXNlIDE2OmNhc2UgMzI6Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gYis1RTM7Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpyZXR1cm4tMTtjYXNlIDEzNDIxNzcyODpjYXNlIDI2ODQzNTQ1NjpjYXNlIDUzNjg3MDkxMjpjYXNlIDEwNzM3NDE4MjQ6cmV0dXJuLTE7ZGVmYXVsdDpyZXR1cm4tMX19XG5mdW5jdGlvbiB3YyhhLGIpe2Zvcih2YXIgYz1hLnN1c3BlbmRlZExhbmVzLGQ9YS5waW5nZWRMYW5lcyxlPWEuZXhwaXJhdGlvblRpbWVzLGY9YS5wZW5kaW5nTGFuZXM7MDxmOyl7dmFyIGc9MzEtb2MoZiksaD0xPDxnLGs9ZVtnXTtpZigtMT09PWspe2lmKDA9PT0oaCZjKXx8MCE9PShoJmQ
25114pKWVbZ109dmMoaCxiKX1lbHNlIGs8PWImJihhLmV4cGlyZWRMYW5lc3w9aCk7ZiY9fmh9fWZ1bmN0aW9uIHhjKGEpe2E9YS5wZW5kaW5nTGFuZXMmLTEwNzM3NDE4MjU7cmV0dXJuIDAhPT1hP2E6YSYxMDczNzQxODI0PzEwNzM3NDE4MjQ6MH1mdW5jdGlvbiB5Yygpe3ZhciBhPXJjO3JjPDw9MTswPT09KHJjJjQxOTQyNDApJiYocmM9NjQpO3JldHVybiBhfWZ1bmN0aW9uIHpjKGEpe2Zvcih2YXIgYj1bXSxjPTA7MzE+YztjKyspYi5wdXNoKGEpO3JldHVybiBifVxuZnVuY3Rpb24gQWMoYSxiLGMpe2EucGVuZGluZ0xhbmVzfD1iOzUzNjg3MDkxMiE9PWImJihhLnN1c3BlbmRlZExhbmVzPTAsYS5waW5nZWRMYW5lcz0wKTthPWEuZXZlbnRUaW1lcztiPTMxLW9jKGIpO2FbYl09Y31mdW5jdGlvbiBCYyhhLGIpe3ZhciBjPWEucGVuZGluZ0xhbmVzJn5iO2EucGVuZGluZ0xhbmVzPWI7YS5zdXNwZW5kZWRMYW5lcz0wO2EucGluZ2VkTGFuZXM9MDthLmV4cGlyZWRMYW5lcyY9YjthLm11dGFibGVSZWFkTGFuZXMmPWI7YS5lbnRhbmdsZWRMYW5lcyY9YjtiPWEuZW50YW5nbGVtZW50czt2YXIgZD1hLmV2ZW50VGltZXM7Zm9yKGE9YS5leHBpcmF0aW9uVGltZXM7MDxjOyl7dmFyIGU9MzEtb2MoYyksZj0xPDxlO2JbZV09MDtkW2VdPS0xO2FbZV09LTE7YyY9fmZ9fVxuZnVuY3Rpb24gQ2MoYSxiKXt2YXIgYz1hLmVudGFuZ2xlZExhbmVzfD1iO2ZvcihhPWEuZW50YW5nbGVtZW50cztjOyl7dmFyIGQ9MzEtb2MoYyksZT0xPDxkO2UmYnxhW2RdJmImJihhW2RdfD1iKTtjJj1+ZX19dmFyIEM9MDtmdW5jdGlvbiBEYyhhKXthJj0tYTtyZXR1cm4gMTxhPzQ8YT8wIT09KGEmMjY4NDM1NDU1KT8xNjo1MzY4NzA5MTI6NDoxfXZhciBFYyxGYyxHYyxIYyxJYyxKYz0hMSxLYz1bXSxMYz1udWxsLE1jPW51bGwsTmM9bnVsbCxPYz1uZXcgTWFwLFBjPW5ldyBNYXAsUWM9W10sUmM9XCJtb3VzZWRvd24gbW91c2V1cCB0b3VjaGNhbmNlbCB0b3VjaGVuZCB0b3VjaHN0YXJ0IGF1eGNsaWNrIGRibGNsaWNrIHBvaW50ZXJjYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlcnVwIGRyYWdlbmQgZHJhZ3N0YXJ0IGRyb3AgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb25zdGFydCBrZXlkb3duIGtleXByZXNzIGtleXVwIGlucHV0IHRleHRJbnB1dCBjb3B5IGN1dCBwYXN0ZSBjbGljayBjaGFuZ2UgY29udGV4dG1lbnUgcmVzZXQgc3VibWl0XCIuc3BsaXQoXCIgXCIpO1xuZnVuY3Rpb24gU2MoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImZvY3VzaW5cIjpjYXNlIFwiZm9jdXNvdXRcIjpMYz1udWxsO2JyZWFrO2Nhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6TWM9bnVsbDticmVhaztjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcIm1vdXNlb3V0XCI6TmM9bnVsbDticmVhaztjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwicG9pbnRlcm91dFwiOk9jLmRlbGV0ZShiLnBvaW50ZXJJZCk7YnJlYWs7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6Y2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOlBjLmRlbGV0ZShiLnBvaW50ZXJJZCl9fVxuZnVuY3Rpb24gVGMoYSxiLGMsZCxlLGYpe2lmKG51bGw9PT1hfHxhLm5hdGl2ZUV2ZW50IT09ZilyZXR1cm4gYT17YmxvY2tlZE9uOmIsZG9tRXZlbnROYW1lOmMsZXZlbnRTeXN0ZW1GbGFnczpkLG5hdGl2ZUV2ZW50OmYsdGFyZ2V0Q29udGFpbmVyczpbZV19LG51bGwhPT1iJiYoYj1DYihiKSxudWxsIT09YiYmRmMoYikpLGE7YS5ldmVudFN5c3RlbUZsYWdzfD1kO2I9YS50YXJnZXRDb250YWluZXJzO251bGwhPT1lJiYtMT09PWIuaW5kZXhPZihlKSYmYi5wdXNoKGUpO3JldHVybiBhfVxuZnVuY3Rpb24gVWMoYSxiLGMsZCxlKXtzd2l0Y2goYil7Y2FzZSBcImZvY3VzaW5cIjpyZXR1cm4gTGM9VGMoTGMsYSxiLGMsZCxlKSwhMDtjYXNlIFwiZHJhZ2VudGVyXCI6cmV0dXJuIE1jPVRjKE1jLGEsYixjLGQsZSksITA7Y2FzZSBcIm1vdXNlb3ZlclwiOnJldHVybiBOYz1UYyhOYyxhLGIsYyxkLGUpLCEwO2Nhc2UgXCJwb2ludGVyb3ZlclwiOnZhciBmPWUucG9pbnRlcklkO09jLnNldChmLFRjKE9jLmdldChmKXx8bnVsbCxhLGIsYyxkLGUpKTtyZXR1cm4hMDtjYXNlIFwiZ290cG9pbnRlcmNhcHR1cmVcIjpyZXR1cm4gZj1lLnBvaW50ZXJJZCxQYy5zZXQoZixUYyhQYy5nZXQoZil8fG51bGwsYSxiLGMsZCxlKSksITB9cmV0dXJuITF9XG5mdW5jdGlvbiBWYyhhKXt2YXIgYj1XYyhhLnRhcmdldCk7aWYobnVsbCE9PWIpe3ZhciBjPVZiKGIpO2lmKG51bGwhPT1jKWlmKGI9Yy50YWcsMTM9PT1iKXtpZihiPVdiKGMpLG51bGwhPT1iKXthLmJsb2NrZWRPbj1iO0ljKGEucHJpb3JpdHksZnVuY3Rpb24oKXtHYyhjKX0pO3JldHVybn19ZWxzZSBpZigzPT09YiYmYy5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7YS5ibG9ja2VkT249Mz09PWMudGFnP2Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtyZXR1cm59fWEuYmxvY2tlZE9uPW51bGx9XG5mdW5jdGlvbiBYYyhhKXtpZihudWxsIT09YS5ibG9ja2VkT24pcmV0dXJuITE7Zm9yKHZhciBiPWEudGFyZ2V0Q29udGFpbmVyczswPGIubGVuZ3RoOyl7dmFyIGM9WWMoYS5kb21FdmVudE5hbWUsYS5ldmVudFN5c3RlbUZsYWdzLGJbMF0sYS5uYXRpdmVFdmVudCk7aWYobnVsbD09PWMpe2M9YS5uYXRpdmVFdmVudDt2YXIgZD1uZXcgYy5jb25zdHJ1Y3RvcihjLnR5cGUsYyk7d2I9ZDtjLnRhcmdldC5kaXNwYXRjaEV2ZW50KGQpO3diPW51bGx9ZWxzZSByZXR1cm4gYj1DYihjKSxudWxsIT09YiYmRmMoYiksYS5ibG9ja2VkT249YywhMTtiLnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gWmMoYSxiLGMpe1hjKGEpJiZjLmRlbGV0ZShiKX1mdW5jdGlvbiAkYygpe0pjPSExO251bGwhPT1MYyYmWGMoTGMpJiYoTGM9bnVsbCk7bnVsbCE9PU1jJiZYYyhNYykmJihNYz1udWxsKTtudWxsIT09TmMmJlhjKE5jKSYmKE5jPW51bGwpO09jLmZvckVhY2goWmMpO1BjLmZvckVhY2goWmMpfVxuZnVuY3Rpb24gYWQoYSxiKXthLmJsb2NrZWRPbj09PWImJihhLmJsb2NrZWRPbj1udWxsLEpjfHwoSmM9ITAsY2EudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhjYS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSwkYykpKX1cbmZ1bmN0aW9uIGJkKGEpe2Z1bmN0aW9uIGIoYil7cmV0dXJuIGFkKGIsYSl9aWYoMDxLYy5sZW5ndGgpe2FkKEtjWzBdLGEpO2Zvcih2YXIgYz0xO2M8S2MubGVuZ3RoO2MrKyl7dmFyIGQ9S2NbY107ZC5ibG9ja2VkT249PT1hJiYo
25114ZC5ibG9ja2VkT249bnVsbCl9fW51bGwhPT1MYyYmYWQoTGMsYSk7bnVsbCE9PU1jJiZhZChNYyxhKTtudWxsIT09TmMmJmFkKE5jLGEpO09jLmZvckVhY2goYik7UGMuZm9yRWFjaChiKTtmb3IoYz0wO2M8UWMubGVuZ3RoO2MrKylkPVFjW2NdLGQuYmxvY2tlZE9uPT09YSYmKGQuYmxvY2tlZE9uPW51bGwpO2Zvcig7MDxRYy5sZW5ndGgmJihjPVFjWzBdLG51bGw9PT1jLmJsb2NrZWRPbik7KVZjKGMpLG51bGw9PT1jLmJsb2NrZWRPbiYmUWMuc2hpZnQoKX12YXIgY2Q9dWEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsZGQ9ITA7XG5mdW5jdGlvbiBlZChhLGIsYyxkKXt2YXIgZT1DLGY9Y2QudHJhbnNpdGlvbjtjZC50cmFuc2l0aW9uPW51bGw7dHJ5e0M9MSxmZChhLGIsYyxkKX1maW5hbGx5e0M9ZSxjZC50cmFuc2l0aW9uPWZ9fWZ1bmN0aW9uIGdkKGEsYixjLGQpe3ZhciBlPUMsZj1jZC50cmFuc2l0aW9uO2NkLnRyYW5zaXRpb249bnVsbDt0cnl7Qz00LGZkKGEsYixjLGQpfWZpbmFsbHl7Qz1lLGNkLnRyYW5zaXRpb249Zn19XG5mdW5jdGlvbiBmZChhLGIsYyxkKXtpZihkZCl7dmFyIGU9WWMoYSxiLGMsZCk7aWYobnVsbD09PWUpaGQoYSxiLGQsaWQsYyksU2MoYSxkKTtlbHNlIGlmKFVjKGUsYSxiLGMsZCkpZC5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKFNjKGEsZCksYiY0JiYtMTxSYy5pbmRleE9mKGEpKXtmb3IoO251bGwhPT1lOyl7dmFyIGY9Q2IoZSk7bnVsbCE9PWYmJkVjKGYpO2Y9WWMoYSxiLGMsZCk7bnVsbD09PWYmJmhkKGEsYixkLGlkLGMpO2lmKGY9PT1lKWJyZWFrO2U9Zn1udWxsIT09ZSYmZC5zdG9wUHJvcGFnYXRpb24oKX1lbHNlIGhkKGEsYixkLG51bGwsYyl9fXZhciBpZD1udWxsO1xuZnVuY3Rpb24gWWMoYSxiLGMsZCl7aWQ9bnVsbDthPXhiKGQpO2E9V2MoYSk7aWYobnVsbCE9PWEpaWYoYj1WYihhKSxudWxsPT09YilhPW51bGw7ZWxzZSBpZihjPWIudGFnLDEzPT09Yyl7YT1XYihiKTtpZihudWxsIT09YSlyZXR1cm4gYTthPW51bGx9ZWxzZSBpZigzPT09Yyl7aWYoYi5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZClyZXR1cm4gMz09PWIudGFnP2Iuc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDthPW51bGx9ZWxzZSBiIT09YSYmKGE9bnVsbCk7aWQ9YTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIGpkKGEpe3N3aXRjaChhKXtjYXNlIFwiY2FuY2VsXCI6Y2FzZSBcImNsaWNrXCI6Y2FzZSBcImNsb3NlXCI6Y2FzZSBcImNvbnRleHRtZW51XCI6Y2FzZSBcImNvcHlcIjpjYXNlIFwiY3V0XCI6Y2FzZSBcImF1eGNsaWNrXCI6Y2FzZSBcImRibGNsaWNrXCI6Y2FzZSBcImRyYWdlbmRcIjpjYXNlIFwiZHJhZ3N0YXJ0XCI6Y2FzZSBcImRyb3BcIjpjYXNlIFwiZm9jdXNpblwiOmNhc2UgXCJmb2N1c291dFwiOmNhc2UgXCJpbnB1dFwiOmNhc2UgXCJpbnZhbGlkXCI6Y2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5cHJlc3NcIjpjYXNlIFwia2V5dXBcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcIm1vdXNldXBcIjpjYXNlIFwicGFzdGVcIjpjYXNlIFwicGF1c2VcIjpjYXNlIFwicGxheVwiOmNhc2UgXCJwb2ludGVyY2FuY2VsXCI6Y2FzZSBcInBvaW50ZXJkb3duXCI6Y2FzZSBcInBvaW50ZXJ1cFwiOmNhc2UgXCJyYXRlY2hhbmdlXCI6Y2FzZSBcInJlc2V0XCI6Y2FzZSBcInJlc2l6ZVwiOmNhc2UgXCJzZWVrZWRcIjpjYXNlIFwic3VibWl0XCI6Y2FzZSBcInRvdWNoY2FuY2VsXCI6Y2FzZSBcInRvdWNoZW5kXCI6Y2FzZSBcInRvdWNoc3RhcnRcIjpjYXNlIFwidm9sdW1lY2hhbmdlXCI6Y2FzZSBcImNoYW5nZVwiOmNhc2UgXCJzZWxlY3Rpb25jaGFuZ2VcIjpjYXNlIFwidGV4dElucHV0XCI6Y2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjpjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpjYXNlIFwiY29tcG9zaXRpb251cGRhdGVcIjpjYXNlIFwiYmVmb3JlYmx1clwiOmNhc2UgXCJhZnRlcmJsdXJcIjpjYXNlIFwiYmVmb3JlaW5wdXRcIjpjYXNlIFwiYmx1clwiOmNhc2UgXCJmdWxsc2NyZWVuY2hhbmdlXCI6Y2FzZSBcImZvY3VzXCI6Y2FzZSBcImhhc2hjaGFuZ2VcIjpjYXNlIFwicG9wc3RhdGVcIjpjYXNlIFwic2VsZWN0XCI6Y2FzZSBcInNlbGVjdHN0YXJ0XCI6cmV0dXJuIDE7Y2FzZSBcImRyYWdcIjpjYXNlIFwiZHJhZ2VudGVyXCI6Y2FzZSBcImRyYWdleGl0XCI6Y2FzZSBcImRyYWdsZWF2ZVwiOmNhc2UgXCJkcmFnb3ZlclwiOmNhc2UgXCJtb3VzZW1vdmVcIjpjYXNlIFwibW91c2VvdXRcIjpjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcInBvaW50ZXJtb3ZlXCI6Y2FzZSBcInBvaW50ZXJvdXRcIjpjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwic2Nyb2xsXCI6Y2FzZSBcInRvZ2dsZVwiOmNhc2UgXCJ0b3VjaG1vdmVcIjpjYXNlIFwid2hlZWxcIjpjYXNlIFwibW91c2VlbnRlclwiOmNhc2UgXCJtb3VzZWxlYXZlXCI6Y2FzZSBcInBvaW50ZXJlbnRlclwiOmNhc2UgXCJwb2ludGVybGVhdmVcIjpyZXR1cm4gNDtcbmNhc2UgXCJtZXNzYWdlXCI6c3dpdGNoKGVjKCkpe2Nhc2UgZmM6cmV0dXJuIDE7Y2FzZSBnYzpyZXR1cm4gNDtjYXNlIGhjOmNhc2UgaWM6cmV0dXJuIDE2O2Nhc2UgamM6cmV0dXJuIDUzNjg3MDkxMjtkZWZhdWx0OnJldHVybiAxNn1kZWZhdWx0OnJldHVybiAxNn19dmFyIGtkPW51bGwsbGQ9bnVsbCxtZD1udWxsO2Z1bmN0aW9uIG5kKCl7aWYobWQpcmV0dXJuIG1kO3ZhciBhLGI9bGQsYz1iLmxlbmd0aCxkLGU9XCJ2YWx1ZVwiaW4ga2Q/a2QudmFsdWU6a2QudGV4dENvbnRlbnQsZj1lLmxlbmd0aDtmb3IoYT0wO2E8YyYmYlthXT09PWVbYV07YSsrKTt2YXIgZz1jLWE7Zm9yKGQ9MTtkPD1nJiZiW2MtZF09PT1lW2YtZF07ZCsrKTtyZXR1cm4gbWQ9ZS5zbGljZShhLDE8ZD8xLWQ6dm9pZCAwKX1cbmZ1bmN0aW9uIG9kKGEpe3ZhciBiPWEua2V5Q29kZTtcImNoYXJDb2RlXCJpbiBhPyhhPWEuY2hhckNvZGUsMD09PWEmJjEzPT09YiYmKGE9MTMpKTphPWI7MTA9PT1hJiYoYT0xMyk7cmV0dXJuIDMyPD1hfHwxMz09PWE/YTowfWZ1bmN0aW9uIHBkKCl7cmV0dXJuITB9ZnVuY3Rpb24gcWQoKXtyZXR1cm4hMX1cbmZ1bmN0aW9uIHJkKGEpe2Z1bmN0aW9uIGIoYixkLGUsZixnKXt0aGlzLl9yZWFjdE5hbWU9Yjt0aGlzLl90YXJnZXRJbnN0PWU7dGhpcy50eXBlPWQ7dGhpcy5uYXRpdmVFdmVudD1mO3RoaXMudGFyZ2V0PWc7dGhpcy5jdXJyZW50VGFyZ2V0PW51bGw7Zm9yKHZhciBjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmKGI9YVtjXSx0aGlzW2NdPWI/YihmKTpmW2NdKTt0aGlzLmlzRGVmYXVsdFByZXZlbn
25114RlZD0obnVsbCE9Zi5kZWZhdWx0UHJldmVudGVkP2YuZGVmYXVsdFByZXZlbnRlZDohMT09PWYucmV0dXJuVmFsdWUpP3BkOnFkO3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cWQ7cmV0dXJuIHRoaXN9QShiLnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIGE9dGhpcy5uYXRpdmVFdmVudDthJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6XCJ1bmtub3duXCIhPT10eXBlb2YgYS5yZXR1cm5WYWx1ZSYmXG4oYS5yZXR1cm5WYWx1ZT0hMSksdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cGQpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5hdGl2ZUV2ZW50O2EmJihhLnN0b3BQcm9wYWdhdGlvbj9hLnN0b3BQcm9wYWdhdGlvbigpOlwidW5rbm93blwiIT09dHlwZW9mIGEuY2FuY2VsQnViYmxlJiYoYS5jYW5jZWxCdWJibGU9ITApLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cGQpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7fSxpc1BlcnNpc3RlbnQ6cGR9KTtyZXR1cm4gYn1cbnZhciBzZD17ZXZlbnRQaGFzZTowLGJ1YmJsZXM6MCxjYW5jZWxhYmxlOjAsdGltZVN0YW1wOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDowLGlzVHJ1c3RlZDowfSx0ZD1yZChzZCksdWQ9QSh7fSxzZCx7dmlldzowLGRldGFpbDowfSksdmQ9cmQodWQpLHdkLHhkLHlkLEFkPUEoe30sdWQse3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6emQsYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWEucmVsYXRlZFRhcmdldD9hLmZyb21FbGVtZW50PT09YS5zcmNFbGVtZW50P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQ6YS5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24oYSl7aWYoXCJtb3ZlbWVudFhcImluXG5hKXJldHVybiBhLm1vdmVtZW50WDthIT09eWQmJih5ZCYmXCJtb3VzZW1vdmVcIj09PWEudHlwZT8od2Q9YS5zY3JlZW5YLXlkLnNjcmVlblgseGQ9YS5zY3JlZW5ZLXlkLnNjcmVlblkpOnhkPXdkPTAseWQ9YSk7cmV0dXJuIHdkfSxtb3ZlbWVudFk6ZnVuY3Rpb24oYSl7cmV0dXJuXCJtb3ZlbWVudFlcImluIGE/YS5tb3ZlbWVudFk6eGR9fSksQmQ9cmQoQWQpLENkPUEoe30sQWQse2RhdGFUcmFuc2ZlcjowfSksRGQ9cmQoQ2QpLEVkPUEoe30sdWQse3JlbGF0ZWRUYXJnZXQ6MH0pLEZkPXJkKEVkKSxHZD1BKHt9LHNkLHthbmltYXRpb25OYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxIZD1yZChHZCksSWQ9QSh7fSxzZCx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihhKXtyZXR1cm5cImNsaXBib2FyZERhdGFcImluIGE/YS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX0pLEpkPXJkKElkKSxLZD1BKHt9LHNkLHtkYXRhOjB9KSxMZD1yZChLZCksTWQ9e0VzYzpcIkVzY2FwZVwiLFxuU3BhY2ViYXI6XCIgXCIsTGVmdDpcIkFycm93TGVmdFwiLFVwOlwiQXJyb3dVcFwiLFJpZ2h0OlwiQXJyb3dSaWdodFwiLERvd246XCJBcnJvd0Rvd25cIixEZWw6XCJEZWxldGVcIixXaW46XCJPU1wiLE1lbnU6XCJDb250ZXh0TWVudVwiLEFwcHM6XCJDb250ZXh0TWVudVwiLFNjcm9sbDpcIlNjcm9sbExvY2tcIixNb3pQcmludGFibGVLZXk6XCJVbmlkZW50aWZpZWRcIn0sTmQ9ezg6XCJCYWNrc3BhY2VcIiw5OlwiVGFiXCIsMTI6XCJDbGVhclwiLDEzOlwiRW50ZXJcIiwxNjpcIlNoaWZ0XCIsMTc6XCJDb250cm9sXCIsMTg6XCJBbHRcIiwxOTpcIlBhdXNlXCIsMjA6XCJDYXBzTG9ja1wiLDI3OlwiRXNjYXBlXCIsMzI6XCIgXCIsMzM6XCJQYWdlVXBcIiwzNDpcIlBhZ2VEb3duXCIsMzU6XCJFbmRcIiwzNjpcIkhvbWVcIiwzNzpcIkFycm93TGVmdFwiLDM4OlwiQXJyb3dVcFwiLDM5OlwiQXJyb3dSaWdodFwiLDQwOlwiQXJyb3dEb3duXCIsNDU6XCJJbnNlcnRcIiw0NjpcIkRlbGV0ZVwiLDExMjpcIkYxXCIsMTEzOlwiRjJcIiwxMTQ6XCJGM1wiLDExNTpcIkY0XCIsMTE2OlwiRjVcIiwxMTc6XCJGNlwiLDExODpcIkY3XCIsXG4xMTk6XCJGOFwiLDEyMDpcIkY5XCIsMTIxOlwiRjEwXCIsMTIyOlwiRjExXCIsMTIzOlwiRjEyXCIsMTQ0OlwiTnVtTG9ja1wiLDE0NTpcIlNjcm9sbExvY2tcIiwyMjQ6XCJNZXRhXCJ9LE9kPXtBbHQ6XCJhbHRLZXlcIixDb250cm9sOlwiY3RybEtleVwiLE1ldGE6XCJtZXRhS2V5XCIsU2hpZnQ6XCJzaGlmdEtleVwifTtmdW5jdGlvbiBQZChhKXt2YXIgYj10aGlzLm5hdGl2ZUV2ZW50O3JldHVybiBiLmdldE1vZGlmaWVyU3RhdGU/Yi5nZXRNb2RpZmllclN0YXRlKGEpOihhPU9kW2FdKT8hIWJbYV06ITF9ZnVuY3Rpb24gemQoKXtyZXR1cm4gUGR9XG52YXIgUWQ9QSh7fSx1ZCx7a2V5OmZ1bmN0aW9uKGEpe2lmKGEua2V5KXt2YXIgYj1NZFthLmtleV18fGEua2V5O2lmKFwiVW5pZGVudGlmaWVkXCIhPT1iKXJldHVybiBifXJldHVyblwia2V5cHJlc3NcIj09PWEudHlwZT8oYT1vZChhKSwxMz09PWE/XCJFbnRlclwiOlN0cmluZy5mcm9tQ2hhckNvZGUoYSkpOlwia2V5ZG93blwiPT09YS50eXBlfHxcImtleXVwXCI9PT1hLnR5cGU/TmRbYS5rZXlDb2RlXXx8XCJVbmlkZW50aWZpZWRcIjpcIlwifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTp6ZCxjaGFyQ29kZTpmdW5jdGlvbihhKXtyZXR1cm5cImtleXByZXNzXCI9PT1hLnR5cGU/b2QoYSk6MH0sa2V5Q29kZTpmdW5jdGlvbihhKXtyZXR1cm5cImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP2Eua2V5Q29kZTowfSx3aGljaDpmdW5jdGlvbihhKXtyZXR1cm5cImtleXByZXNzXCI9PT1cbmEudHlwZT9vZChhKTpcImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP2Eua2V5Q29kZTowfX0pLFJkPXJkKFFkKSxTZD1BKHt9LEFkLHtwb2ludGVySWQ6MCx3aWR0aDowLGhlaWdodDowLHByZXNzdXJlOjAsdGFuZ2VudGlhbFByZXNzdXJlOjAsdGlsdFg6MCx0aWx0WTowLHR3aXN0OjAscG9pbnRlclR5cGU6MCxpc1ByaW1hcnk6MH0pL
25114FRkPXJkKFNkKSxVZD1BKHt9LHVkLHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6emR9KSxWZD1yZChVZCksV2Q9QSh7fSxzZCx7cHJvcGVydHlOYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxYZD1yZChXZCksWWQ9QSh7fSxBZCx7ZGVsdGFYOmZ1bmN0aW9uKGEpe3JldHVyblwiZGVsdGFYXCJpbiBhP2EuZGVsdGFYOlwid2hlZWxEZWx0YVhcImluIGE/LWEud2hlZWxEZWx0YVg6MH0sXG5kZWx0YVk6ZnVuY3Rpb24oYSl7cmV0dXJuXCJkZWx0YVlcImluIGE/YS5kZWx0YVk6XCJ3aGVlbERlbHRhWVwiaW4gYT8tYS53aGVlbERlbHRhWTpcIndoZWVsRGVsdGFcImluIGE/LWEud2hlZWxEZWx0YTowfSxkZWx0YVo6MCxkZWx0YU1vZGU6MH0pLFpkPXJkKFlkKSwkZD1bOSwxMywyNywzMl0sYWU9aWEmJlwiQ29tcG9zaXRpb25FdmVudFwiaW4gd2luZG93LGJlPW51bGw7aWEmJlwiZG9jdW1lbnRNb2RlXCJpbiBkb2N1bWVudCYmKGJlPWRvY3VtZW50LmRvY3VtZW50TW9kZSk7dmFyIGNlPWlhJiZcIlRleHRFdmVudFwiaW4gd2luZG93JiYhYmUsZGU9aWEmJighYWV8fGJlJiY4PGJlJiYxMT49YmUpLGVlPVN0cmluZy5mcm9tQ2hhckNvZGUoMzIpLGZlPSExO1xuZnVuY3Rpb24gZ2UoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImtleXVwXCI6cmV0dXJuLTEhPT0kZC5pbmRleE9mKGIua2V5Q29kZSk7Y2FzZSBcImtleWRvd25cIjpyZXR1cm4gMjI5IT09Yi5rZXlDb2RlO2Nhc2UgXCJrZXlwcmVzc1wiOmNhc2UgXCJtb3VzZWRvd25cIjpjYXNlIFwiZm9jdXNvdXRcIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBoZShhKXthPWEuZGV0YWlsO3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmXCJkYXRhXCJpbiBhP2EuZGF0YTpudWxsfXZhciBpZT0hMTtmdW5jdGlvbiBqZShhLGIpe3N3aXRjaChhKXtjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpyZXR1cm4gaGUoYik7Y2FzZSBcImtleXByZXNzXCI6aWYoMzIhPT1iLndoaWNoKXJldHVybiBudWxsO2ZlPSEwO3JldHVybiBlZTtjYXNlIFwidGV4dElucHV0XCI6cmV0dXJuIGE9Yi5kYXRhLGE9PT1lZSYmZmU/bnVsbDphO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxuZnVuY3Rpb24ga2UoYSxiKXtpZihpZSlyZXR1cm5cImNvbXBvc2l0aW9uZW5kXCI9PT1hfHwhYWUmJmdlKGEsYik/KGE9bmQoKSxtZD1sZD1rZD1udWxsLGllPSExLGEpOm51bGw7c3dpdGNoKGEpe2Nhc2UgXCJwYXN0ZVwiOnJldHVybiBudWxsO2Nhc2UgXCJrZXlwcmVzc1wiOmlmKCEoYi5jdHJsS2V5fHxiLmFsdEtleXx8Yi5tZXRhS2V5KXx8Yi5jdHJsS2V5JiZiLmFsdEtleSl7aWYoYi5jaGFyJiYxPGIuY2hhci5sZW5ndGgpcmV0dXJuIGIuY2hhcjtpZihiLndoaWNoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIud2hpY2gpfXJldHVybiBudWxsO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOnJldHVybiBkZSYmXCJrb1wiIT09Yi5sb2NhbGU/bnVsbDpiLmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19XG52YXIgbGU9e2NvbG9yOiEwLGRhdGU6ITAsZGF0ZXRpbWU6ITAsXCJkYXRldGltZS1sb2NhbFwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZnVuY3Rpb24gbWUoYSl7dmFyIGI9YSYmYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVyblwiaW5wdXRcIj09PWI/ISFsZVthLnR5cGVdOlwidGV4dGFyZWFcIj09PWI/ITA6ITF9ZnVuY3Rpb24gbmUoYSxiLGMsZCl7RWIoZCk7Yj1vZShiLFwib25DaGFuZ2VcIik7MDxiLmxlbmd0aCYmKGM9bmV3IHRkKFwib25DaGFuZ2VcIixcImNoYW5nZVwiLG51bGwsYyxkKSxhLnB1c2goe2V2ZW50OmMsbGlzdGVuZXJzOmJ9KSl9dmFyIHBlPW51bGwscWU9bnVsbDtmdW5jdGlvbiByZShhKXtzZShhLDApfWZ1bmN0aW9uIHRlKGEpe3ZhciBiPXVlKGEpO2lmKFdhKGIpKXJldHVybiBhfVxuZnVuY3Rpb24gdmUoYSxiKXtpZihcImNoYW5nZVwiPT09YSlyZXR1cm4gYn12YXIgd2U9ITE7aWYoaWEpe3ZhciB4ZTtpZihpYSl7dmFyIHllPVwib25pbnB1dFwiaW4gZG9jdW1lbnQ7aWYoIXllKXt2YXIgemU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt6ZS5zZXRBdHRyaWJ1dGUoXCJvbmlucHV0XCIsXCJyZXR1cm47XCIpO3llPVwiZnVuY3Rpb25cIj09PXR5cGVvZiB6ZS5vbmlucHV0fXhlPXllfWVsc2UgeGU9ITE7d2U9eGUmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSl9ZnVuY3Rpb24gQWUoKXtwZSYmKHBlLmRldGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLEJlKSxxZT1wZT1udWxsKX1mdW5jdGlvbiBCZShhKXtpZihcInZhbHVlXCI9PT1hLnByb3BlcnR5TmFtZSYmdGUocWUpKXt2YXIgYj1bXTtuZShiLHFlLGEseGIoYSkpO0piKHJlLGIpfX1cbmZ1bmN0aW9uIENlKGEsYixjKXtcImZvY3VzaW5cIj09PWE/KEFlKCkscGU9YixxZT1jLHBlLmF0dGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLEJlKSk6XCJmb2N1c291dFwiPT09YSYmQWUoKX1mdW5jdGlvbiBEZShhKXtpZihcInNlbGVjdGlvbmNoYW5nZVwiPT09YXx8XCJrZXl1cFwiPT09YXx8XCJrZXlkb3duXCI9PT1hKXJldHVybiB0ZShxZSl9ZnVuY3Rpb24gRWUoYSxiKXtpZihcImNsaWNrXCI9PT1hKXJldHVybiB0ZShiKX1mdW5jdGlvbiBGZShhLGIpe2lmKFwiaW5wdXRcIj09PWF8fFwiY2hhbmdlXCI9PT1hKXJldHVybiB0ZShiKX1mdW5jdGlvbiBHZShhLGIpe3JldHVybiBhPT09YiYmKDAhPT1hfHwxL2E9PT0xL2IpfHxhIT09YSYmYiE9PWJ9dmFyIEhlPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBPYmplY3QuaXM/T2JqZWN0LmlzOkdlO1xuZnVuY3Rpb24gSWUoYSxiKXtpZihIZShhLGIpKXJldHVybiEwO2lmKFwib2JqZWN0XCIhPT10eXBlb2YgYXx8bnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYnx8bnVsbD09PWIpcmV0dXJuITE7dmFyIGM9T2JqZWN0LmtleXMoYSksZD1PYmplY3Qua2V5cyhiKTtpZihjLmxlbmd0aCE9PWQubGVuZ3RoKXJldHVybiExO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF07aWYoIWphLmNhbGwoYixlKXx8IUhlKGFbZV0sYltlXSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gSmUoYSl7Zm9yKDthJiZhLmZpcnN0Q2hpbGQ7KWE9YS5maXJzdENoaWxkO3JldHVybiBhfVxuZnVuY3Rpb24gS2UoYSxiKXt2YXIgYz1KZShhKTthPTA7Zm9yKHZhciBkO2M7KXtpZigzPT09Yy5ub2RlVHlwZSl7ZD1hK2MudGV4dENvbnRlbnQubGVuZ3RoO2lmKGE8PWImJmQ+PWIpcmV0dXJue25vZGU6YyxvZmZzZXQ6Yi1hfTthPWR9YTp7Zm9yKDtjOyl7aWYoYy5uZXh0U2libGluZyl7Yz1jLm5leHRTaWJsaW5nO2JyZWFrIGF9Yz1jLnBhcmVudE5vZGV9Yz12b2lkIDB9Yz1KZShjKX19ZnVuY3Rpb24gTGUoYSxiKXtyZXR1cm4gYSYmYj9hPT09Yj8hMDphJiYzPT09YS5ub2RlVHlwZT8hMTpiJiYzPT09Yi5ub2RlVHlwZT9MZShhLGIucGFyZW50Tm9kZSk6XCJjb250YWluc1wiaW4gYT9hLmNvbnRhaW5zKGIpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik6ITE6ITF9XG5mdW5jdGlvbiBNZSgpe2Zvcih2YXIgYT13aW5kb3csYj1YYSgpO2IgaW5zdGFuY2VvZiBhLkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBjPVwic3RyaW5nXCI9PT10eXBlb2YgYi5jb250ZW50V2luZG93LmxvY2F0aW9uLmhy
25114ZWZ9Y2F0Y2goZCl7Yz0hMX1pZihjKWE9Yi5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7Yj1YYShhLmRvY3VtZW50KX1yZXR1cm4gYn1mdW5jdGlvbiBOZShhKXt2YXIgYj1hJiZhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGImJihcImlucHV0XCI9PT1iJiYoXCJ0ZXh0XCI9PT1hLnR5cGV8fFwic2VhcmNoXCI9PT1hLnR5cGV8fFwidGVsXCI9PT1hLnR5cGV8fFwidXJsXCI9PT1hLnR5cGV8fFwicGFzc3dvcmRcIj09PWEudHlwZSl8fFwidGV4dGFyZWFcIj09PWJ8fFwidHJ1ZVwiPT09YS5jb250ZW50RWRpdGFibGUpfVxuZnVuY3Rpb24gT2UoYSl7dmFyIGI9TWUoKSxjPWEuZm9jdXNlZEVsZW0sZD1hLnNlbGVjdGlvblJhbmdlO2lmKGIhPT1jJiZjJiZjLm93bmVyRG9jdW1lbnQmJkxlKGMub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYykpe2lmKG51bGwhPT1kJiZOZShjKSlpZihiPWQuc3RhcnQsYT1kLmVuZCx2b2lkIDA9PT1hJiYoYT1iKSxcInNlbGVjdGlvblN0YXJ0XCJpbiBjKWMuc2VsZWN0aW9uU3RhcnQ9YixjLnNlbGVjdGlvbkVuZD1NYXRoLm1pbihhLGMudmFsdWUubGVuZ3RoKTtlbHNlIGlmKGE9KGI9Yy5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJmIuZGVmYXVsdFZpZXd8fHdpbmRvdyxhLmdldFNlbGVjdGlvbil7YT1hLmdldFNlbGVjdGlvbigpO3ZhciBlPWMudGV4dENvbnRlbnQubGVuZ3RoLGY9TWF0aC5taW4oZC5zdGFydCxlKTtkPXZvaWQgMD09PWQuZW5kP2Y6TWF0aC5taW4oZC5lbmQsZSk7IWEuZXh0ZW5kJiZmPmQmJihlPWQsZD1mLGY9ZSk7ZT1LZShjLGYpO3ZhciBnPUtlKGMsXG5kKTtlJiZnJiYoMSE9PWEucmFuZ2VDb3VudHx8YS5hbmNob3JOb2RlIT09ZS5ub2RlfHxhLmFuY2hvck9mZnNldCE9PWUub2Zmc2V0fHxhLmZvY3VzTm9kZSE9PWcubm9kZXx8YS5mb2N1c09mZnNldCE9PWcub2Zmc2V0KSYmKGI9Yi5jcmVhdGVSYW5nZSgpLGIuc2V0U3RhcnQoZS5ub2RlLGUub2Zmc2V0KSxhLnJlbW92ZUFsbFJhbmdlcygpLGY+ZD8oYS5hZGRSYW5nZShiKSxhLmV4dGVuZChnLm5vZGUsZy5vZmZzZXQpKTooYi5zZXRFbmQoZy5ub2RlLGcub2Zmc2V0KSxhLmFkZFJhbmdlKGIpKSl9Yj1bXTtmb3IoYT1jO2E9YS5wYXJlbnROb2RlOykxPT09YS5ub2RlVHlwZSYmYi5wdXNoKHtlbGVtZW50OmEsbGVmdDphLnNjcm9sbExlZnQsdG9wOmEuc2Nyb2xsVG9wfSk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGMuZm9jdXMmJmMuZm9jdXMoKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWE9YltjXSxhLmVsZW1lbnQuc2Nyb2xsTGVmdD1hLmxlZnQsYS5lbGVtZW50LnNjcm9sbFRvcD1hLnRvcH19XG52YXIgUGU9aWEmJlwiZG9jdW1lbnRNb2RlXCJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxRZT1udWxsLFJlPW51bGwsU2U9bnVsbCxUZT0hMTtcbmZ1bmN0aW9uIFVlKGEsYixjKXt2YXIgZD1jLndpbmRvdz09PWM/Yy5kb2N1bWVudDo5PT09Yy5ub2RlVHlwZT9jOmMub3duZXJEb2N1bWVudDtUZXx8bnVsbD09UWV8fFFlIT09WGEoZCl8fChkPVFlLFwic2VsZWN0aW9uU3RhcnRcImluIGQmJk5lKGQpP2Q9e3N0YXJ0OmQuc2VsZWN0aW9uU3RhcnQsZW5kOmQuc2VsZWN0aW9uRW5kfTooZD0oZC5vd25lckRvY3VtZW50JiZkLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCksZD17YW5jaG9yTm9kZTpkLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OmQuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTpkLmZvY3VzTm9kZSxmb2N1c09mZnNldDpkLmZvY3VzT2Zmc2V0fSksU2UmJkllKFNlLGQpfHwoU2U9ZCxkPW9lKFJlLFwib25TZWxlY3RcIiksMDxkLmxlbmd0aCYmKGI9bmV3IHRkKFwib25TZWxlY3RcIixcInNlbGVjdFwiLG51bGwsYixjKSxhLnB1c2goe2V2ZW50OmIsbGlzdGVuZXJzOmR9KSxiLnRhcmdldD1RZSkpKX1cbmZ1bmN0aW9uIFZlKGEsYil7dmFyIGM9e307Y1thLnRvTG93ZXJDYXNlKCldPWIudG9Mb3dlckNhc2UoKTtjW1wiV2Via2l0XCIrYV09XCJ3ZWJraXRcIitiO2NbXCJNb3pcIithXT1cIm1velwiK2I7cmV0dXJuIGN9dmFyIFdlPXthbmltYXRpb25lbmQ6VmUoXCJBbmltYXRpb25cIixcIkFuaW1hdGlvbkVuZFwiKSxhbmltYXRpb25pdGVyYXRpb246VmUoXCJBbmltYXRpb25cIixcIkFuaW1hdGlvbkl0ZXJhdGlvblwiKSxhbmltYXRpb25zdGFydDpWZShcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uU3RhcnRcIiksdHJhbnNpdGlvbmVuZDpWZShcIlRyYW5zaXRpb25cIixcIlRyYW5zaXRpb25FbmRcIil9LFhlPXt9LFllPXt9O1xuaWEmJihZZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLnN0eWxlLFwiQW5pbWF0aW9uRXZlbnRcImluIHdpbmRvd3x8KGRlbGV0ZSBXZS5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBXZS5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uLGRlbGV0ZSBXZS5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLFwiVHJhbnNpdGlvbkV2ZW50XCJpbiB3aW5kb3d8fGRlbGV0ZSBXZS50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb24pO2Z1bmN0aW9uIFplKGEpe2lmKFhlW2FdKXJldHVybiBYZVthXTtpZighV2VbYV0pcmV0dXJuIGE7dmFyIGI9V2VbYV0sYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykmJmMgaW4gWWUpcmV0dXJuIFhlW2FdPWJbY107cmV0dXJuIGF9dmFyICRlPVplKFwiYW5pbWF0aW9uZW5kXCIpLGFmPVplKFwiYW5pbWF0aW9uaXRlcmF0aW9uXCIpLGJmPVplKFwiYW5pbWF0aW9uc3RhcnRcIiksY2Y9WmUoXCJ0cmFuc2l0aW9uZW5kXCIpLGRmPW5ldyBNYXAsZWY9XCJhYm9ydCBhdXhDbGljayBjYW5jZWwgY2FuUGxheSBjYW5QbGF5VGhyb3VnaCBjbGljayBjbG9zZSBjb250ZXh0TWVudSBjb3B5IGN1dCBkcmFnIGRyYWdFbmQgZHJhZ0VudGVyIGRyYWdFeGl0IGRyYWdMZWF2ZSBkcmFnT3ZlciBkcmFnU3RhcnQgZHJvcCBkdXJhdGlvbkNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBnb3RQb2ludGVyQ2FwdHVyZSBpbnB1dCBpbnZhbGlkIGtleURvd24ga2V5UHJlc3Mga2V5VXAgbG9hZCBsb2FkZWREYXRhIGxvYWRlZE1ldGFkYXRhIGxvYWRTdGFydCBsb3N0UG9pbnRlckNhcHR1cmUgbW91c2VEb3duIG1vdXNlTW92ZSBtb3VzZU91dCBtb3VzZU92ZXIgbW91c2VVcCBwYXN0ZSBwYXVzZSBwbGF5IHBsYXlpbmcgcG9pbnRlckNhbmNlbCBwb2ludGVyRG93biBwb2ludGVyTW92ZSBwb2ludGVyT3V0IHBvaW50ZXJPdmVyIHBvaW50ZXJVcCBwcm9ncmVzcyByYXRlQ2hhbmdlIHJlc2V0IHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1Ym1pdCBzdXNwZW5kIHRpbWVVcGRhdGUgdG91Y2hDYW5jZWwgdG91Y2hFbmQgdG91Y2hTdGFydCB2b2x1bWVDaGFuZ2Ugc2Nyb2xsIHRvZ2dsZSB0b3VjaE1vdmUgd2FpdGluZyB3aGVlbFwiLnNwbGl0KFwiIFwiKTtcbmZ1bmN0aW9uIGZmKGEsYil7ZGYuc2V0KGEsYik7ZmEoYixbYV0pfWZvcih2YXIgZ2Y9MDtnZjxlZi5sZW5ndGg7Z2YrKyl7dmFyIGhmPWVmW2dmXSxqZj1oZi50b0xvd2VyQ2FzZSgpLGtmPWhmWzBdLnRvVXBwZXJDYXNlKCkraGYuc2xpY2UoMSk7ZmYoamYsXCJvblwiK2tmKX1mZigkZSxcIm9uQW5pbWF0aW9uRW5kXCIpO2ZmKGFmLFwib25BbmltYXRpb25JdGVyYXRpb25cIik7ZmYoYmYsXCJvbkFuaW1hdGlvblN0YXJ0XCIpO2ZmKFwiZGJsY2xpY2tcIixcIm9uRG91YmxlQ2xpY2tcIik7ZmYoXCJmb2N1c2luXCIsXCJvbkZvY3VzXCIpO2ZmKFwiZm9jdXNvdXRcIixcIm9uQmx1clwiKTtmZihjZixcIm9uVHJhbnNpdGlvbkVuZFwiKTtoYShcIm9uTW91c2VFbnRlclwiLFtcIm1vdXNlb3V0XCIsXCJtb3VzZW92ZXJcIl0pO2hhKFwib25Nb3VzZUxlYXZlXCIsW1wibW91c2VvdXRcIixcIm1vdXNlb3ZlclwiXSk7aGEoXCJvblBvaW50ZXJFbnRlclwiLFtcInBvaW50ZXJvdXRcIixcInBvaW50ZXJvdmVyXCJdKTtcbmhhKFwib25Qb2ludGVyTGVhdmVcIixbXCJwb2ludGVyb3V0XCIsXCJwb2ludGVyb3ZlclwiXSk7ZmEoXCJvbkNoYW5nZVwiLFwiY2hhbmdlIGNsaWNrIGZvY3VzaW4gZm9jdXNvdXQgaW5wdXQga2V5ZG93biBrZXl1cCBzZWxlY3Rpb25jaGFuZ2VcIi5zcGxpdChcIiBcIikpO2ZhKFwib25TZWxlY3RcIixcImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZVwiLnNwbGl0KFwiIFwiKSk7ZmEoXCJvbkJlZm9yZUlucHV0XCIsW1wiY29tcG9zaXRpb25lbmRcIixcImtleXByZXNzXCIsXCJ0ZXh0SW5wdXRcIixcInBhc3RlXCJdKTtmYShcIm9uQ29tcG9zaXRpb25
25114FbmRcIixcImNvbXBvc2l0aW9uZW5kIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpKTtmYShcIm9uQ29tcG9zaXRpb25TdGFydFwiLFwiY29tcG9zaXRpb25zdGFydCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93blwiLnNwbGl0KFwiIFwiKSk7XG5mYShcIm9uQ29tcG9zaXRpb25VcGRhdGVcIixcImNvbXBvc2l0aW9udXBkYXRlIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpKTt2YXIgbGY9XCJhYm9ydCBjYW5wbGF5IGNhbnBsYXl0aHJvdWdoIGR1cmF0aW9uY2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGxvYWRlZGRhdGEgbG9hZGVkbWV0YWRhdGEgbG9hZHN0YXJ0IHBhdXNlIHBsYXkgcGxheWluZyBwcm9ncmVzcyByYXRlY2hhbmdlIHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1c3BlbmQgdGltZXVwZGF0ZSB2b2x1bWVjaGFuZ2Ugd2FpdGluZ1wiLnNwbGl0KFwiIFwiKSxtZj1uZXcgU2V0KFwiY2FuY2VsIGNsb3NlIGludmFsaWQgbG9hZCBzY3JvbGwgdG9nZ2xlXCIuc3BsaXQoXCIgXCIpLmNvbmNhdChsZikpO1xuZnVuY3Rpb24gbmYoYSxiLGMpe3ZhciBkPWEudHlwZXx8XCJ1bmtub3duLWV2ZW50XCI7YS5jdXJyZW50VGFyZ2V0PWM7VWIoZCxiLHZvaWQgMCxhKTthLmN1cnJlbnRUYXJnZXQ9bnVsbH1cbmZ1bmN0aW9uIHNlKGEsYil7Yj0wIT09KGImNCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT1kLmV2ZW50O2Q9ZC5saXN0ZW5lcnM7YTp7dmFyIGY9dm9pZCAwO2lmKGIpZm9yKHZhciBnPWQubGVuZ3RoLTE7MDw9ZztnLS0pe3ZhciBoPWRbZ10saz1oLmluc3RhbmNlLGw9aC5jdXJyZW50VGFyZ2V0O2g9aC5saXN0ZW5lcjtpZihrIT09ZiYmZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGE7bmYoZSxoLGwpO2Y9a31lbHNlIGZvcihnPTA7ZzxkLmxlbmd0aDtnKyspe2g9ZFtnXTtrPWguaW5zdGFuY2U7bD1oLmN1cnJlbnRUYXJnZXQ7aD1oLmxpc3RlbmVyO2lmKGshPT1mJiZlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgYTtuZihlLGgsbCk7Zj1rfX19aWYoUWIpdGhyb3cgYT1SYixRYj0hMSxSYj1udWxsLGE7fVxuZnVuY3Rpb24gRChhLGIpe3ZhciBjPWJbb2ZdO3ZvaWQgMD09PWMmJihjPWJbb2ZdPW5ldyBTZXQpO3ZhciBkPWErXCJfX2J1YmJsZVwiO2MuaGFzKGQpfHwocGYoYixhLDIsITEpLGMuYWRkKGQpKX1mdW5jdGlvbiBxZihhLGIsYyl7dmFyIGQ9MDtiJiYoZHw9NCk7cGYoYyxhLGQsYil9dmFyIHJmPVwiX3JlYWN0TGlzdGVuaW5nXCIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7ZnVuY3Rpb24gc2YoYSl7aWYoIWFbcmZdKXthW3JmXT0hMDtkYS5mb3JFYWNoKGZ1bmN0aW9uKGIpe1wic2VsZWN0aW9uY2hhbmdlXCIhPT1iJiYobWYuaGFzKGIpfHxxZihiLCExLGEpLHFmKGIsITAsYSkpfSk7dmFyIGI9OT09PWEubm9kZVR5cGU/YTphLm93bmVyRG9jdW1lbnQ7bnVsbD09PWJ8fGJbcmZdfHwoYltyZl09ITAscWYoXCJzZWxlY3Rpb25jaGFuZ2VcIiwhMSxiKSl9fVxuZnVuY3Rpb24gcGYoYSxiLGMsZCl7c3dpdGNoKGpkKGIpKXtjYXNlIDE6dmFyIGU9ZWQ7YnJlYWs7Y2FzZSA0OmU9Z2Q7YnJlYWs7ZGVmYXVsdDplPWZkfWM9ZS5iaW5kKG51bGwsYixjLGEpO2U9dm9pZCAwOyFMYnx8XCJ0b3VjaHN0YXJ0XCIhPT1iJiZcInRvdWNobW92ZVwiIT09YiYmXCJ3aGVlbFwiIT09Ynx8KGU9ITApO2Q/dm9pZCAwIT09ZT9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLHtjYXB0dXJlOiEwLHBhc3NpdmU6ZX0pOmEuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITApOnZvaWQgMCE9PWU/YS5hZGRFdmVudExpc3RlbmVyKGIsYyx7cGFzc2l2ZTplfSk6YS5hZGRFdmVudExpc3RlbmVyKGIsYywhMSl9XG5mdW5jdGlvbiBoZChhLGIsYyxkLGUpe3ZhciBmPWQ7aWYoMD09PShiJjEpJiYwPT09KGImMikmJm51bGwhPT1kKWE6Zm9yKDs7KXtpZihudWxsPT09ZClyZXR1cm47dmFyIGc9ZC50YWc7aWYoMz09PWd8fDQ9PT1nKXt2YXIgaD1kLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2lmKGg9PT1lfHw4PT09aC5ub2RlVHlwZSYmaC5wYXJlbnROb2RlPT09ZSlicmVhaztpZig0PT09Zylmb3IoZz1kLnJldHVybjtudWxsIT09Zzspe3ZhciBrPWcudGFnO2lmKDM9PT1rfHw0PT09aylpZihrPWcuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8saz09PWV8fDg9PT1rLm5vZGVUeXBlJiZrLnBhcmVudE5vZGU9PT1lKXJldHVybjtnPWcucmV0dXJufWZvcig7bnVsbCE9PWg7KXtnPVdjKGgpO2lmKG51bGw9PT1nKXJldHVybjtrPWcudGFnO2lmKDU9PT1rfHw2PT09ayl7ZD1mPWc7Y29udGludWUgYX1oPWgucGFyZW50Tm9kZX19ZD1kLnJldHVybn1KYihmdW5jdGlvbigpe3ZhciBkPWYsZT14YihjKSxnPVtdO1xuYTp7dmFyIGg9ZGYuZ2V0KGEpO2lmKHZvaWQgMCE9PWgpe3ZhciBrPXRkLG49YTtzd2l0Y2goYSl7Y2FzZSBcImtleXByZXNzXCI6aWYoMD09PW9kKGMpKWJyZWFrIGE7Y2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5dXBcIjprPVJkO2JyZWFrO2Nhc2UgXCJmb2N1c2luXCI6bj1cImZvY3VzXCI7az1GZDticmVhaztjYXNlIFwiZm9jdXNvdXRcIjpuPVwiYmx1clwiO2s9RmQ7YnJlYWs7Y2FzZSBcImJlZm9yZWJsdXJcIjpjYXNlIFwiYWZ0ZXJibHVyXCI6az1GZDticmVhaztjYXNlIFwiY2xpY2tcIjppZigyPT09Yy5idXR0b24pYnJlYWsgYTtjYXNlIFwiYXV4Y2xpY2tcIjpjYXNlIFwiZGJsY2xpY2tcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcIm1vdXNlbW92ZVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcIm1vdXNlb3V0XCI6Y2FzZSBcIm1vdXNlb3ZlclwiOmNhc2UgXCJjb250ZXh0bWVudVwiOms9QmQ7YnJlYWs7Y2FzZSBcImRyYWdcIjpjYXNlIFwiZHJhZ2VuZFwiOmNhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2V4aXRcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6Y2FzZSBcImRyYWdvdmVyXCI6Y2FzZSBcImRyYWdzdGFydFwiOmNhc2UgXCJkcm9wXCI6az1cbkRkO2JyZWFrO2Nhc2UgXCJ0b3VjaGNhbmNlbFwiOmNhc2UgXCJ0b3VjaGVuZFwiOmNhc2UgXCJ0b3VjaG1vdmVcIjpjYXNlIFwidG91Y2hzdGFydFwiOms9VmQ7YnJlYWs7Y2FzZSAkZTpjYXNlIGFmOmNhc2UgYmY6az1IZDticmVhaztjYXNlIGNmOms9WGQ7YnJlYWs7Y2FzZSBcInNjcm9sbFwiOms9dmQ7YnJlYWs7Y2FzZSBcIndoZWVsXCI6az1aZDticmVhaztjYXNlIFwiY29weVwiOmNhc2UgXCJj
25114dXRcIjpjYXNlIFwicGFzdGVcIjprPUpkO2JyZWFrO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpjYXNlIFwicG9pbnRlcmNhbmNlbFwiOmNhc2UgXCJwb2ludGVyZG93blwiOmNhc2UgXCJwb2ludGVybW92ZVwiOmNhc2UgXCJwb2ludGVyb3V0XCI6Y2FzZSBcInBvaW50ZXJvdmVyXCI6Y2FzZSBcInBvaW50ZXJ1cFwiOms9VGR9dmFyIHQ9MCE9PShiJjQpLEo9IXQmJlwic2Nyb2xsXCI9PT1hLHg9dD9udWxsIT09aD9oK1wiQ2FwdHVyZVwiOm51bGw6aDt0PVtdO2Zvcih2YXIgdz1kLHU7bnVsbCE9PVxudzspe3U9dzt2YXIgRj11LnN0YXRlTm9kZTs1PT09dS50YWcmJm51bGwhPT1GJiYodT1GLG51bGwhPT14JiYoRj1LYih3LHgpLG51bGwhPUYmJnQucHVzaCh0Zih3LEYsdSkpKSk7aWYoSilicmVhazt3PXcucmV0dXJufTA8dC5sZW5ndGgmJihoPW5ldyBrKGgsbixudWxsLGMsZSksZy5wdXNoKHtldmVudDpoLGxpc3RlbmVyczp0fSkpfX1pZigwPT09KGImNykpe2E6e2g9XCJtb3VzZW92ZXJcIj09PWF8fFwicG9pbnRlcm92ZXJcIj09PWE7az1cIm1vdXNlb3V0XCI9PT1hfHxcInBvaW50ZXJvdXRcIj09PWE7aWYoaCYmYyE9PXdiJiYobj1jLnJlbGF0ZWRUYXJnZXR8fGMuZnJvbUVsZW1lbnQpJiYoV2Mobil8fG5bdWZdKSlicmVhayBhO2lmKGt8fGgpe2g9ZS53aW5kb3c9PT1lP2U6KGg9ZS5vd25lckRvY3VtZW50KT9oLmRlZmF1bHRWaWV3fHxoLnBhcmVudFdpbmRvdzp3aW5kb3c7aWYoayl7aWYobj1jLnJlbGF0ZWRUYXJnZXR8fGMudG9FbGVtZW50LGs9ZCxuPW4/V2Mobik6bnVsbCxudWxsIT09XG5uJiYoSj1WYihuKSxuIT09Snx8NSE9PW4udGFnJiY2IT09bi50YWcpKW49bnVsbH1lbHNlIGs9bnVsbCxuPWQ7aWYoayE9PW4pe3Q9QmQ7Rj1cIm9uTW91c2VMZWF2ZVwiO3g9XCJvbk1vdXNlRW50ZXJcIjt3PVwibW91c2VcIjtpZihcInBvaW50ZXJvdXRcIj09PWF8fFwicG9pbnRlcm92ZXJcIj09PWEpdD1UZCxGPVwib25Qb2ludGVyTGVhdmVcIix4PVwib25Qb2ludGVyRW50ZXJcIix3PVwicG9pbnRlclwiO0o9bnVsbD09az9oOnVlKGspO3U9bnVsbD09bj9oOnVlKG4pO2g9bmV3IHQoRix3K1wibGVhdmVcIixrLGMsZSk7aC50YXJnZXQ9SjtoLnJlbGF0ZWRUYXJnZXQ9dTtGPW51bGw7V2MoZSk9PT1kJiYodD1uZXcgdCh4LHcrXCJlbnRlclwiLG4sYyxlKSx0LnRhcmdldD11LHQucmVsYXRlZFRhcmdldD1KLEY9dCk7Sj1GO2lmKGsmJm4pYjp7dD1rO3g9bjt3PTA7Zm9yKHU9dDt1O3U9dmYodSkpdysrO3U9MDtmb3IoRj14O0Y7Rj12ZihGKSl1Kys7Zm9yKDswPHctdTspdD12Zih0KSx3LS07Zm9yKDswPHUtdzspeD1cbnZmKHgpLHUtLTtmb3IoO3ctLTspe2lmKHQ9PT14fHxudWxsIT09eCYmdD09PXguYWx0ZXJuYXRlKWJyZWFrIGI7dD12Zih0KTt4PXZmKHgpfXQ9bnVsbH1lbHNlIHQ9bnVsbDtudWxsIT09ayYmd2YoZyxoLGssdCwhMSk7bnVsbCE9PW4mJm51bGwhPT1KJiZ3ZihnLEosbix0LCEwKX19fWE6e2g9ZD91ZShkKTp3aW5kb3c7az1oLm5vZGVOYW1lJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoXCJzZWxlY3RcIj09PWt8fFwiaW5wdXRcIj09PWsmJlwiZmlsZVwiPT09aC50eXBlKXZhciBuYT12ZTtlbHNlIGlmKG1lKGgpKWlmKHdlKW5hPUZlO2Vsc2V7bmE9RGU7dmFyIHhhPUNlfWVsc2Uoaz1oLm5vZGVOYW1lKSYmXCJpbnB1dFwiPT09ay50b0xvd2VyQ2FzZSgpJiYoXCJjaGVja2JveFwiPT09aC50eXBlfHxcInJhZGlvXCI9PT1oLnR5cGUpJiYobmE9RWUpO2lmKG5hJiYobmE9bmEoYSxkKSkpe25lKGcsbmEsYyxlKTticmVhayBhfXhhJiZ4YShhLGgsZCk7XCJmb2N1c291dFwiPT09YSYmKHhhPWguX3dyYXBwZXJTdGF0ZSkmJlxueGEuY29udHJvbGxlZCYmXCJudW1iZXJcIj09PWgudHlwZSYmY2IoaCxcIm51bWJlclwiLGgudmFsdWUpfXhhPWQ/dWUoZCk6d2luZG93O3N3aXRjaChhKXtjYXNlIFwiZm9jdXNpblwiOmlmKG1lKHhhKXx8XCJ0cnVlXCI9PT14YS5jb250ZW50RWRpdGFibGUpUWU9eGEsUmU9ZCxTZT1udWxsO2JyZWFrO2Nhc2UgXCJmb2N1c291dFwiOlNlPVJlPVFlPW51bGw7YnJlYWs7Y2FzZSBcIm1vdXNlZG93blwiOlRlPSEwO2JyZWFrO2Nhc2UgXCJjb250ZXh0bWVudVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcImRyYWdlbmRcIjpUZT0hMTtVZShnLGMsZSk7YnJlYWs7Y2FzZSBcInNlbGVjdGlvbmNoYW5nZVwiOmlmKFBlKWJyZWFrO2Nhc2UgXCJrZXlkb3duXCI6Y2FzZSBcImtleXVwXCI6VWUoZyxjLGUpfXZhciAkYTtpZihhZSliOntzd2l0Y2goYSl7Y2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjp2YXIgYmE9XCJvbkNvbXBvc2l0aW9uU3RhcnRcIjticmVhayBiO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOmJhPVwib25Db21wb3NpdGlvbkVuZFwiO1xuYnJlYWsgYjtjYXNlIFwiY29tcG9zaXRpb251cGRhdGVcIjpiYT1cIm9uQ29tcG9zaXRpb25VcGRhdGVcIjticmVhayBifWJhPXZvaWQgMH1lbHNlIGllP2dlKGEsYykmJihiYT1cIm9uQ29tcG9zaXRpb25FbmRcIik6XCJrZXlkb3duXCI9PT1hJiYyMjk9PT1jLmtleUNvZGUmJihiYT1cIm9uQ29tcG9zaXRpb25TdGFydFwiKTtiYSYmKGRlJiZcImtvXCIhPT1jLmxvY2FsZSYmKGllfHxcIm9uQ29tcG9zaXRpb25TdGFydFwiIT09YmE/XCJvbkNvbXBvc2l0aW9uRW5kXCI9PT1iYSYmaWUmJigkYT1uZCgpKTooa2Q9ZSxsZD1cInZhbHVlXCJpbiBrZD9rZC52YWx1ZTprZC50ZXh0Q29udGVudCxpZT0hMCkpLHhhPW9lKGQsYmEpLDA8eGEubGVuZ3RoJiYoYmE9bmV3IExkKGJhLGEsbnVsbCxjLGUpLGcucHVzaCh7ZXZlbnQ6YmEsbGlzdGVuZXJzOnhhfSksJGE/YmEuZGF0YT0kYTooJGE9aGUoYyksbnVsbCE9PSRhJiYoYmEuZGF0YT0kYSkpKSk7aWYoJGE9Y2U/amUoYSxjKTprZShhLGMpKWQ9b2UoZCxcIm9uQmVmb3JlSW5wdXRcIiksXG4wPGQubGVuZ3RoJiYoZT1uZXcgTGQoXCJvbkJlZm9yZUlucHV0XCIsXCJiZWZvcmVpbnB1dFwiLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OmUsbGlzdGVuZXJzOmR9KSxlLmRhdGE9JGEpfXNlKGcsYil9KX1mdW5jdGlvbiB0ZihhLGIsYyl7cmV0dXJue2luc3RhbmNlOmEsbGlzdGVuZXI6YixjdXJyZW50VGFyZ2V0OmN9fWZ1bmN0aW9uIG9lKGEsYil7Zm9yKHZhciBjPWIrXCJDYXB0dXJlXCIsZD1bXTtudWxsIT09YTspe3ZhciBlPWEsZj1lLnN0YXRlTm9kZTs1PT09ZS50YWcmJm51bGwhPT1mJiYoZT1mLGY9S2IoYSxjKSxudWxsIT1mJiZkLnVuc2hpZnQodGYoYSxmLGUpKSxmPUtiKGEsYiksbnVsbCE9ZiYmZC5wdXNoKHRmKGEsZixlKSkpO2E9YS5yZXR1cm59cmV0dXJuIGR9ZnVuY3Rpb24gdmYoYSl7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7ZG8gYT1hLnJldHVybjt3aGlsZShhJiY1IT09YS50YWcpO3JldHVybiBhP2E6bnVsbH1cbmZ1bmN0aW9uIHdmKGEsYixjLGQsZSl7Zm9yKHZhciBmPWIuX3JlYWN0TmFtZSxnPVtdO251bGwhPT1jJiZjIT09ZDspe3ZhciBoPWMsaz1oLmFsdGVybmF0ZSxsPWguc3RhdGVOb2RlO2lmKG51bGwhPT1rJiZrPT09ZClicmVhazs1PT09aC50YWcmJm51bGwhPT1sJiYoaD1sLGU/KGs9S2IoYyxmKSxudWxsIT1rJiZnLnVuc2hpZnQodGYoYyxrLGgpKSk6ZXx8KGs9S2IoYyxmKSxudWxsIT1rJiZnLnB1c2godGYoYyxrLGgpKSkpO2M9Yy5yZXR1cm59MCE9PWcubGVuZ3RoJiZhLnB1c2goe2V2ZW50OmIsbGlzdGVuZXJzOmd9KX12YXIgeGY9L1xcclxcbj8vZyx5Zj0vXFx1MDAwMHxcXHVGRkZEL2c7ZnVuY3Rpb24gemYoYSl7cmV0dXJuKFwic3RyaW5nXCI9PT10eXBlb2YgYT9hOlwiXCIrYSkucmVwbGFjZSh4ZixcIlxcblwiKS5yZXBsYWNlKHlmLFwiXCIpfWZ1bmN0aW9uIEFmKGEsYixjKXtiPXpmKGIpO2lmKHpmKGEpIT09YiYmYyl0aHJvdyBFcnJvcihwKDQyNSkpO31mdW5jdGlvbiBCZigpe31cbnZhciBDZj1udWxsLERmPW51bGw7ZnVuY3Rpb24gRWYoYSxiKXtyZXR1cm5cInRleHRhcmVhXCI9PT1hfHxcIm5vc2NyaXB0XCI9PT1hfHxcInN0cmluZ1wiPT09dHlwZW9mIGIuY2hpbGRyZW58fFwibnVtYmVyXCI9PT10eXBlb2YgYi5jaGlsZHJlbnx8XCJvYmplY3RcIj09PXR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZudWxsIT09Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWx9XG52YXIgRmY9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDp2b2lkIDAsR2Y9XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6dm9p
25114ZCAwLEhmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBQcm9taXNlP1Byb21pc2U6dm9pZCAwLEpmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBxdWV1ZU1pY3JvdGFzaz9xdWV1ZU1pY3JvdGFzazpcInVuZGVmaW5lZFwiIT09dHlwZW9mIEhmP2Z1bmN0aW9uKGEpe3JldHVybiBIZi5yZXNvbHZlKG51bGwpLnRoZW4oYSkuY2F0Y2goSWYpfTpGZjtmdW5jdGlvbiBJZihhKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYTt9KX1cbmZ1bmN0aW9uIEtmKGEsYil7dmFyIGM9YixkPTA7ZG97dmFyIGU9Yy5uZXh0U2libGluZzthLnJlbW92ZUNoaWxkKGMpO2lmKGUmJjg9PT1lLm5vZGVUeXBlKWlmKGM9ZS5kYXRhLFwiLyRcIj09PWMpe2lmKDA9PT1kKXthLnJlbW92ZUNoaWxkKGUpO2JkKGIpO3JldHVybn1kLS19ZWxzZVwiJFwiIT09YyYmXCIkP1wiIT09YyYmXCIkIVwiIT09Y3x8ZCsrO2M9ZX13aGlsZShjKTtiZChiKX1mdW5jdGlvbiBMZihhKXtmb3IoO251bGwhPWE7YT1hLm5leHRTaWJsaW5nKXt2YXIgYj1hLm5vZGVUeXBlO2lmKDE9PT1ifHwzPT09YilicmVhaztpZig4PT09Yil7Yj1hLmRhdGE7aWYoXCIkXCI9PT1ifHxcIiQhXCI9PT1ifHxcIiQ/XCI9PT1iKWJyZWFrO2lmKFwiLyRcIj09PWIpcmV0dXJuIG51bGx9fXJldHVybiBhfVxuZnVuY3Rpb24gTWYoYSl7YT1hLnByZXZpb3VzU2libGluZztmb3IodmFyIGI9MDthOyl7aWYoOD09PWEubm9kZVR5cGUpe3ZhciBjPWEuZGF0YTtpZihcIiRcIj09PWN8fFwiJCFcIj09PWN8fFwiJD9cIj09PWMpe2lmKDA9PT1iKXJldHVybiBhO2ItLX1lbHNlXCIvJFwiPT09YyYmYisrfWE9YS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIE5mPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLE9mPVwiX19yZWFjdEZpYmVyJFwiK05mLFBmPVwiX19yZWFjdFByb3BzJFwiK05mLHVmPVwiX19yZWFjdENvbnRhaW5lciRcIitOZixvZj1cIl9fcmVhY3RFdmVudHMkXCIrTmYsUWY9XCJfX3JlYWN0TGlzdGVuZXJzJFwiK05mLFJmPVwiX19yZWFjdEhhbmRsZXMkXCIrTmY7XG5mdW5jdGlvbiBXYyhhKXt2YXIgYj1hW09mXTtpZihiKXJldHVybiBiO2Zvcih2YXIgYz1hLnBhcmVudE5vZGU7Yzspe2lmKGI9Y1t1Zl18fGNbT2ZdKXtjPWIuYWx0ZXJuYXRlO2lmKG51bGwhPT1iLmNoaWxkfHxudWxsIT09YyYmbnVsbCE9PWMuY2hpbGQpZm9yKGE9TWYoYSk7bnVsbCE9PWE7KXtpZihjPWFbT2ZdKXJldHVybiBjO2E9TWYoYSl9cmV0dXJuIGJ9YT1jO2M9YS5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIENiKGEpe2E9YVtPZl18fGFbdWZdO3JldHVybiFhfHw1IT09YS50YWcmJjYhPT1hLnRhZyYmMTMhPT1hLnRhZyYmMyE9PWEudGFnP251bGw6YX1mdW5jdGlvbiB1ZShhKXtpZig1PT09YS50YWd8fDY9PT1hLnRhZylyZXR1cm4gYS5zdGF0ZU5vZGU7dGhyb3cgRXJyb3IocCgzMykpO31mdW5jdGlvbiBEYihhKXtyZXR1cm4gYVtQZl18fG51bGx9dmFyIFNmPVtdLFRmPS0xO2Z1bmN0aW9uIFVmKGEpe3JldHVybntjdXJyZW50OmF9fVxuZnVuY3Rpb24gRShhKXswPlRmfHwoYS5jdXJyZW50PVNmW1RmXSxTZltUZl09bnVsbCxUZi0tKX1mdW5jdGlvbiBHKGEsYil7VGYrKztTZltUZl09YS5jdXJyZW50O2EuY3VycmVudD1ifXZhciBWZj17fSxIPVVmKFZmKSxXZj1VZighMSksWGY9VmY7ZnVuY3Rpb24gWWYoYSxiKXt2YXIgYz1hLnR5cGUuY29udGV4dFR5cGVzO2lmKCFjKXJldHVybiBWZjt2YXIgZD1hLnN0YXRlTm9kZTtpZihkJiZkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT1iKXJldHVybiBkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBlPXt9LGY7Zm9yKGYgaW4gYyllW2ZdPWJbZl07ZCYmKGE9YS5zdGF0ZU5vZGUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PWIsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1lKTtyZXR1cm4gZX1cbmZ1bmN0aW9uIFpmKGEpe2E9YS5jaGlsZENvbnRleHRUeXBlcztyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWF9ZnVuY3Rpb24gJGYoKXtFKFdmKTtFKEgpfWZ1bmN0aW9uIGFnKGEsYixjKXtpZihILmN1cnJlbnQhPT1WZil0aHJvdyBFcnJvcihwKDE2OCkpO0coSCxiKTtHKFdmLGMpfWZ1bmN0aW9uIGJnKGEsYixjKXt2YXIgZD1hLnN0YXRlTm9kZTtiPWIuY2hpbGRDb250ZXh0VHlwZXM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGQuZ2V0Q2hpbGRDb250ZXh0KXJldHVybiBjO2Q9ZC5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIGUgaW4gZClpZighKGUgaW4gYikpdGhyb3cgRXJyb3IocCgxMDgsUmEoYSl8fFwiVW5rbm93blwiLGUpKTtyZXR1cm4gQSh7fSxjLGQpfVxuZnVuY3Rpb24gY2coYSl7YT0oYT1hLnN0YXRlTm9kZSkmJmEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHR8fFZmO1hmPUguY3VycmVudDtHKEgsYSk7RyhXZixXZi5jdXJyZW50KTtyZXR1cm4hMH1mdW5jdGlvbiBkZyhhLGIsYyl7dmFyIGQ9YS5zdGF0ZU5vZGU7aWYoIWQpdGhyb3cgRXJyb3IocCgxNjkpKTtjPyhhPWJnKGEsYixYZiksZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1hLEUoV2YpLEUoSCksRyhILGEpKTpFKFdmKTtHKFdmLGMpfXZhciBlZz1udWxsLGZnPSExLGdnPSExO2Z1bmN0aW9uIGhnKGEpe251bGw9PT1lZz9lZz1bYV06ZWcucHVzaChhKX1mdW5jdGlvbiBpZyhhKXtmZz0hMDtoZyhhKX1cbmZ1bmN0aW9uIGpnKCl7aWYoIWdnJiZudWxsIT09ZWcpe2dnPSEwO3ZhciBhPTAsYj1DO3RyeXt2YXIgYz1lZztmb3IoQz0xO2E8Yy5sZW5ndGg7YSsrKXt2YXIgZD1jW2FdO2RvIGQ9ZCghMCk7d2hpbGUobnVsbCE9PWQpfWVnPW51bGw7Zmc9ITF9Y2F0Y2goZSl7dGhyb3cgbnVsbCE9PWVnJiYoZWc9ZWcuc2xpY2UoYSsxKSksYWMoZmMsamcpLGU7fWZpbmFsbHl7Qz1iLGdnPSExfX1yZXR1cm4gbnVsbH12YXIga2c9W10sbGc9MCxtZz1udWxsLG5nPTAsb2c9W10scGc9MCxxZz1udWxsLHJnPTEsc2c9XCJcIjtmdW5jdGlvbiB0ZyhhLGIpe2tnW2xnKytdPW5nO2tnW2xnKytdPW1nO21nPWE7bmc9Yn1cbmZ1bmN0aW9uIHVnKGEsYixjKXtvZ1twZysrXT1yZztvZ1twZysrXT1zZztvZ1twZysrXT1xZztxZz1hO3ZhciBkPXJnO2E9c2c7dmFyIGU9MzItb2MoZCktMTtkJj1+KDE8PGUpO2MrPTE7dmFyIGY9MzItb2MoYikrZTtpZigzMDxmKXt2YXIgZz1lLWUlNTtmPShkJigxPDxnKS0xKS50b1N0cmluZygzMik7ZD4+PWc7ZS09ZztyZz0xPDwzMi1vYyhiKStlfGM8PGV8ZDtzZz1mK2F9ZWxzZSByZz0xPDxmfGM8PGV8ZCxzZz1hfWZ1bmN0aW9uIHZnKGEpe251bGwhPT1hLnJldHVybiYmKHRnKGEsMSksdWcoYSwxLDApKX1mdW5jdGlvbiB3Zy
25114hhKXtmb3IoO2E9PT1tZzspbWc9a2dbLS1sZ10sa2dbbGddPW51bGwsbmc9a2dbLS1sZ10sa2dbbGddPW51bGw7Zm9yKDthPT09cWc7KXFnPW9nWy0tcGddLG9nW3BnXT1udWxsLHNnPW9nWy0tcGddLG9nW3BnXT1udWxsLHJnPW9nWy0tcGddLG9nW3BnXT1udWxsfXZhciB4Zz1udWxsLHlnPW51bGwsST0hMSx6Zz1udWxsO1xuZnVuY3Rpb24gQWcoYSxiKXt2YXIgYz1CZyg1LG51bGwsbnVsbCwwKTtjLmVsZW1lbnRUeXBlPVwiREVMRVRFRFwiO2Muc3RhdGVOb2RlPWI7Yy5yZXR1cm49YTtiPWEuZGVsZXRpb25zO251bGw9PT1iPyhhLmRlbGV0aW9ucz1bY10sYS5mbGFnc3w9MTYpOmIucHVzaChjKX1cbmZ1bmN0aW9uIENnKGEsYil7c3dpdGNoKGEudGFnKXtjYXNlIDU6dmFyIGM9YS50eXBlO2I9MSE9PWIubm9kZVR5cGV8fGMudG9Mb3dlckNhc2UoKSE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKT9udWxsOmI7cmV0dXJuIG51bGwhPT1iPyhhLnN0YXRlTm9kZT1iLHhnPWEseWc9TGYoYi5maXJzdENoaWxkKSwhMCk6ITE7Y2FzZSA2OnJldHVybiBiPVwiXCI9PT1hLnBlbmRpbmdQcm9wc3x8MyE9PWIubm9kZVR5cGU/bnVsbDpiLG51bGwhPT1iPyhhLnN0YXRlTm9kZT1iLHhnPWEseWc9bnVsbCwhMCk6ITE7Y2FzZSAxMzpyZXR1cm4gYj04IT09Yi5ub2RlVHlwZT9udWxsOmIsbnVsbCE9PWI/KGM9bnVsbCE9PXFnP3tpZDpyZyxvdmVyZmxvdzpzZ306bnVsbCxhLm1lbW9pemVkU3RhdGU9e2RlaHlkcmF0ZWQ6Yix0cmVlQ29udGV4dDpjLHJldHJ5TGFuZToxMDczNzQxODI0fSxjPUJnKDE4LG51bGwsbnVsbCwwKSxjLnN0YXRlTm9kZT1iLGMucmV0dXJuPWEsYS5jaGlsZD1jLHhnPWEseWc9XG5udWxsLCEwKTohMTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBEZyhhKXtyZXR1cm4gMCE9PShhLm1vZGUmMSkmJjA9PT0oYS5mbGFncyYxMjgpfWZ1bmN0aW9uIEVnKGEpe2lmKEkpe3ZhciBiPXlnO2lmKGIpe3ZhciBjPWI7aWYoIUNnKGEsYikpe2lmKERnKGEpKXRocm93IEVycm9yKHAoNDE4KSk7Yj1MZihjLm5leHRTaWJsaW5nKTt2YXIgZD14ZztiJiZDZyhhLGIpP0FnKGQsYyk6KGEuZmxhZ3M9YS5mbGFncyYtNDA5N3wyLEk9ITEseGc9YSl9fWVsc2V7aWYoRGcoYSkpdGhyb3cgRXJyb3IocCg0MTgpKTthLmZsYWdzPWEuZmxhZ3MmLTQwOTd8MjtJPSExO3hnPWF9fX1mdW5jdGlvbiBGZyhhKXtmb3IoYT1hLnJldHVybjtudWxsIT09YSYmNSE9PWEudGFnJiYzIT09YS50YWcmJjEzIT09YS50YWc7KWE9YS5yZXR1cm47eGc9YX1cbmZ1bmN0aW9uIEdnKGEpe2lmKGEhPT14ZylyZXR1cm4hMTtpZighSSlyZXR1cm4gRmcoYSksST0hMCwhMTt2YXIgYjsoYj0zIT09YS50YWcpJiYhKGI9NSE9PWEudGFnKSYmKGI9YS50eXBlLGI9XCJoZWFkXCIhPT1iJiZcImJvZHlcIiE9PWImJiFFZihhLnR5cGUsYS5tZW1vaXplZFByb3BzKSk7aWYoYiYmKGI9eWcpKXtpZihEZyhhKSl0aHJvdyBIZygpLEVycm9yKHAoNDE4KSk7Zm9yKDtiOylBZyhhLGIpLGI9TGYoYi5uZXh0U2libGluZyl9RmcoYSk7aWYoMTM9PT1hLnRhZyl7YT1hLm1lbW9pemVkU3RhdGU7YT1udWxsIT09YT9hLmRlaHlkcmF0ZWQ6bnVsbDtpZighYSl0aHJvdyBFcnJvcihwKDMxNykpO2E6e2E9YS5uZXh0U2libGluZztmb3IoYj0wO2E7KXtpZig4PT09YS5ub2RlVHlwZSl7dmFyIGM9YS5kYXRhO2lmKFwiLyRcIj09PWMpe2lmKDA9PT1iKXt5Zz1MZihhLm5leHRTaWJsaW5nKTticmVhayBhfWItLX1lbHNlXCIkXCIhPT1jJiZcIiQhXCIhPT1jJiZcIiQ/XCIhPT1jfHxiKyt9YT1hLm5leHRTaWJsaW5nfXlnPVxubnVsbH19ZWxzZSB5Zz14Zz9MZihhLnN0YXRlTm9kZS5uZXh0U2libGluZyk6bnVsbDtyZXR1cm4hMH1mdW5jdGlvbiBIZygpe2Zvcih2YXIgYT15ZzthOylhPUxmKGEubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIElnKCl7eWc9eGc9bnVsbDtJPSExfWZ1bmN0aW9uIEpnKGEpe251bGw9PT16Zz96Zz1bYV06emcucHVzaChhKX12YXIgS2c9dWEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7XG5mdW5jdGlvbiBMZyhhLGIsYyl7YT1jLnJlZjtpZihudWxsIT09YSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGEmJlwib2JqZWN0XCIhPT10eXBlb2YgYSl7aWYoYy5fb3duZXIpe2M9Yy5fb3duZXI7aWYoYyl7aWYoMSE9PWMudGFnKXRocm93IEVycm9yKHAoMzA5KSk7dmFyIGQ9Yy5zdGF0ZU5vZGV9aWYoIWQpdGhyb3cgRXJyb3IocCgxNDcsYSkpO3Z
25114hciBlPWQsZj1cIlwiK2E7aWYobnVsbCE9PWImJm51bGwhPT1iLnJlZiYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGIucmVmJiZiLnJlZi5fc3RyaW5nUmVmPT09ZilyZXR1cm4gYi5yZWY7Yj1mdW5jdGlvbihhKXt2YXIgYj1lLnJlZnM7bnVsbD09PWE/ZGVsZXRlIGJbZl06YltmXT1hfTtiLl9zdHJpbmdSZWY9ZjtyZXR1cm4gYn1pZihcInN0cmluZ1wiIT09dHlwZW9mIGEpdGhyb3cgRXJyb3IocCgyODQpKTtpZighYy5fb3duZXIpdGhyb3cgRXJyb3IocCgyOTAsYSkpO31yZXR1cm4gYX1cbmZ1bmN0aW9uIE1nKGEsYil7YT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYik7dGhyb3cgRXJyb3IocCgzMSxcIltvYmplY3QgT2JqZWN0XVwiPT09YT9cIm9iamVjdCB3aXRoIGtleXMge1wiK09iamVjdC5rZXlzKGIpLmpvaW4oXCIsIFwiKStcIn1cIjphKSk7fWZ1bmN0aW9uIE5nKGEpe3ZhciBiPWEuX2luaXQ7cmV0dXJuIGIoYS5fcGF5bG9hZCl9XG5mdW5jdGlvbiBPZyhhKXtmdW5jdGlvbiBiKGIsYyl7aWYoYSl7dmFyIGQ9Yi5kZWxldGlvbnM7bnVsbD09PWQ/KGIuZGVsZXRpb25zPVtjXSxiLmZsYWdzfD0xNik6ZC5wdXNoKGMpfX1mdW5jdGlvbiBjKGMsZCl7aWYoIWEpcmV0dXJuIG51bGw7Zm9yKDtudWxsIT09ZDspYihjLGQpLGQ9ZC5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIGQoYSxiKXtmb3IoYT1uZXcgTWFwO251bGwhPT1iOyludWxsIT09Yi5rZXk/YS5zZXQoYi5rZXksYik6YS5zZXQoYi5pbmRleCxiKSxiPWIuc2libGluZztyZXR1cm4gYX1mdW5jdGlvbiBlKGEsYil7YT1QZyhhLGIpO2EuaW5kZXg9MDthLnNpYmxpbmc9bnVsbDtyZXR1cm4gYX1mdW5jdGlvbiBmKGIsYyxkKXtiLmluZGV4PWQ7aWYoIWEpcmV0dXJuIGIuZmxhZ3N8PTEwNDg1NzYsYztkPWIuYWx0ZXJuYXRlO2lmKG51bGwhPT1kKXJldHVybiBkPWQuaW5kZXgsZDxjPyhiLmZsYWdzfD0yLGMpOmQ7Yi5mbGFnc3w9MjtyZXR1cm4gY31mdW5jdGlvbiBnKGIpe2EmJlxubnVsbD09PWIuYWx0ZXJuYXRlJiYoYi5mbGFnc3w9Mik7cmV0dXJuIGJ9ZnVuY3Rpb24gaChhLGIsYyxkKXtpZihudWxsPT09Ynx8NiE9PWIudGFnKXJldHVybiBiPVFnKGMsYS5tb2RlLGQpLGIucmV0dXJuPWEsYjtiPWUoYixjKTtiLnJldHVybj1hO3JldHVybiBifWZ1bmN0aW9uIGsoYSxiLGMsZCl7dmFyIGY9Yy50eXBlO2lmKGY9PT15YSlyZXR1cm4gbShhLGIsYy5wcm9wcy5jaGlsZHJlbixkLGMua2V5KTtpZihudWxsIT09YiYmKGIuZWxlbWVudFR5cGU9PT1mfHxcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mJiZmLiQkdHlwZW9mPT09SGEmJk5nKGYpPT09Yi50eXBlKSlyZXR1cm4gZD1lKGIsYy5wcm9wcyksZC5yZWY9TGcoYSxiLGMpLGQucmV0dXJuPWEsZDtkPVJnKGMudHlwZSxjLmtleSxjLnByb3BzLG51bGwsYS5tb2RlLGQpO2QucmVmPUxnKGEsYixjKTtkLnJldHVybj1hO3JldHVybiBkfWZ1bmN0aW9uIGwoYSxiLGMsZCl7aWYobnVsbD09PWJ8fDQhPT1iLnRhZ3x8XG5iLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIT09Yy5jb250YWluZXJJbmZvfHxiLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiE9PWMuaW1wbGVtZW50YXRpb24pcmV0dXJuIGI9U2coYyxhLm1vZGUsZCksYi5yZXR1cm49YSxiO2I9ZShiLGMuY2hpbGRyZW58fFtdKTtiLnJldHVybj1hO3JldHVybiBifWZ1bmN0aW9uIG0oYSxiLGMsZCxmKXtpZihudWxsPT09Ynx8NyE9PWIudGFnKXJldHVybiBiPVRnKGMsYS5tb2RlLGQsZiksYi5yZXR1cm49YSxiO2I9ZShiLGMpO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gcShhLGIsYyl7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBiJiZcIlwiIT09Ynx8XCJudW1iZXJcIj09PXR5cGVvZiBiKXJldHVybiBiPVFnKFwiXCIrYixhLm1vZGUsYyksYi5yZXR1cm49YSxiO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYiYmbnVsbCE9PWIpe3N3aXRjaChiLiQkdHlwZW9mKXtjYXNlIHZhOnJldHVybiBjPVJnKGIudHlwZSxiLmtleSxiLnByb3BzLG51bGwsYS5tb2RlLGMpLFxuYy5yZWY9TGcoYSxudWxsLGIpLGMucmV0dXJuPWEsYztjYXNlIHdhOnJldHVybiBiPVNnKGIsYS5tb2RlLGMpLGIucmV0dXJuPWEsYjtjYXNlIEhhOnZhciBkPWIuX2luaXQ7cmV0dXJuIHEoYSxkKGIuX3BheWxvYWQpLGMpfWlmKGViKGIpfHxLYShiKSlyZXR1cm4gYj1UZyhiLGEubW9kZSxjLG51bGwpLGIucmV0dXJuPWEsYjtNZyhhLGIpfXJldHVybiBudWxsfWZ1bmN0aW9uIHIoYSxiLGMsZCl7dmFyIGU9bnVsbCE9PWI/Yi5rZXk6bnVsbDtpZihcInN0cmluZ1wiPT09dHlwZW9mIGMmJlwiXCIhPT1jfHxcIm51bWJlclwiPT09dHlwZW9mIGMpcmV0dXJuIG51bGwhPT1lP251bGw6aChhLGIsXCJcIitjLGQpO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYyYmbnVsbCE9PWMpe3N3aXRjaChjLiQkdHlwZW9mKXtjYXNlIHZhOnJldHVybiBjLmtleT09PWU/ayhhLGIsYyxkKTpudWxsO2Nhc2Ugd2E6cmV0dXJuIGMua2V5PT09ZT9sKGEsYixjLGQpOm51bGw7Y2FzZSBIYTpyZXR1cm4gZT1jLl9pbml0LHIoYSxcbmIsZShjLl9wYXlsb2FkKSxkKX1pZihlYihjKXx8S2EoYykpcmV0dXJuIG51bGwhPT1lP251bGw6bShhLGIsYyxkLG51bGwpO01nKGEsYyl9cmV0dXJuIG51bGx9ZnVuY3Rpb24geShhLGIsYyxkLGUpe2lmKFwic3RyaW5nXCI9PT10eXBlb2YgZCYmXCJcIiE9PWR8fFwibnVtYmVyXCI9PT10eXBlb2YgZClyZXR1cm4gYT1hLmdldChjKXx8bnVsbCxoKGIsYSxcIlwiK2QsZSk7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBkJiZudWxsIT09ZCl7c3dpdGNoKGQuJCR0eXBlb2Ype2Nhc2UgdmE6cmV0dXJuIGE9YS5nZXQobnVsbD09PWQua2V5P2M6ZC5rZXkpfHxudWxsLGsoYixhLGQsZSk7Y2FzZSB3YTpyZXR1cm4gYT1hLmdldChudWxsPT09ZC5rZXk/YzpkLmtleSl8fG51bGwsbChiLGEsZCxlKTtjYXNlIEhhOnZhciBmPWQuX2luaXQ7cmV0dXJuIHkoYSxiLGMsZihkLl9wYXlsb2FkKSxlKX1pZihlYihkKXx8S2EoZCkpcmV0dXJuIGE9YS5nZXQoYyl8fG51bGwsbShiLGEsZCxlLG51bGwpO01nKGIsZCl9cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBuKGUsZyxoLGspe2Zvcih2YXIgbD1udWxsLG09bnVsbCx1PWcsdz1nPTAseD1udWxsO251bGwhPT11JiZ3PGgubGVuZ3RoO3crKyl7dS5pbmRleD53Pyh4PXUsdT1udWxsKTp4PXUuc2libGluZzt2YXIgbj1yKGUsdSxoW3ddLGspO2lmKG51bGw9PT1uKXtudWxsPT09dSYmKHU9eCk7YnJlYWt9YSYmdSYmbnVsbD09PW4uYWx0ZXJuYXRlJiZiKGUsdSk7Zz1mKG4sZyx3KTtudWxsPT09bT9sPW46bS5zaWJsaW5nPW47bT1uO3U9eH1pZih3PT09aC5sZW5ndGgpcmV0dXJuIGMoZSx1KSxJJiZ0ZyhlLHcpLGw7aWYobnVsbD09PXUpe2Zvcig7dzxoLmxlbmd0aDt3Kysp
25114dT1xKGUsaFt3XSxrKSxudWxsIT09dSYmKGc9Zih1LGcsdyksbnVsbD09PW0/bD11Om0uc2libGluZz11LG09dSk7SSYmdGcoZSx3KTtyZXR1cm4gbH1mb3IodT1kKGUsdSk7dzxoLmxlbmd0aDt3KyspeD15KHUsZSx3LGhbd10sayksbnVsbCE9PXgmJihhJiZudWxsIT09eC5hbHRlcm5hdGUmJnUuZGVsZXRlKG51bGw9PT1cbngua2V5P3c6eC5rZXkpLGc9Zih4LGcsdyksbnVsbD09PW0/bD14Om0uc2libGluZz14LG09eCk7YSYmdS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBiKGUsYSl9KTtJJiZ0ZyhlLHcpO3JldHVybiBsfWZ1bmN0aW9uIHQoZSxnLGgsayl7dmFyIGw9S2EoaCk7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGwpdGhyb3cgRXJyb3IocCgxNTApKTtoPWwuY2FsbChoKTtpZihudWxsPT1oKXRocm93IEVycm9yKHAoMTUxKSk7Zm9yKHZhciB1PWw9bnVsbCxtPWcsdz1nPTAseD1udWxsLG49aC5uZXh0KCk7bnVsbCE9PW0mJiFuLmRvbmU7dysrLG49aC5uZXh0KCkpe20uaW5kZXg+dz8oeD1tLG09bnVsbCk6eD1tLnNpYmxpbmc7dmFyIHQ9cihlLG0sbi52YWx1ZSxrKTtpZihudWxsPT09dCl7bnVsbD09PW0mJihtPXgpO2JyZWFrfWEmJm0mJm51bGw9PT10LmFsdGVybmF0ZSYmYihlLG0pO2c9Zih0LGcsdyk7bnVsbD09PXU/bD10OnUuc2libGluZz10O3U9dDttPXh9aWYobi5kb25lKXJldHVybiBjKGUsXG5tKSxJJiZ0ZyhlLHcpLGw7aWYobnVsbD09PW0pe2Zvcig7IW4uZG9uZTt3Kyssbj1oLm5leHQoKSluPXEoZSxuLnZhbHVlLGspLG51bGwhPT1uJiYoZz1mKG4
25114sZyx3KSxudWxsPT09dT9sPW46dS5zaWJsaW5nPW4sdT1uKTtJJiZ0ZyhlLHcpO3JldHVybiBsfWZvcihtPWQoZSxtKTshbi5kb25lO3crKyxuPWgubmV4dCgpKW49eShtLGUsdyxuLnZhbHVlLGspLG51bGwhPT1uJiYoYSYmbnVsbCE9PW4uYWx0ZXJuYXRlJiZtLmRlbGV0ZShudWxsPT09bi5rZXk/dzpuLmtleSksZz1mKG4sZyx3KSxudWxsPT09dT9sPW46dS5zaWJsaW5nPW4sdT1uKTthJiZtLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGIoZSxhKX0pO0kmJnRnKGUsdyk7cmV0dXJuIGx9ZnVuY3Rpb24gSihhLGQsZixoKXtcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mJiZmLnR5cGU9PT15YSYmbnVsbD09PWYua2V5JiYoZj1mLnByb3BzLmNoaWxkcmVuKTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mKXtzd2l0Y2goZi4kJHR5cGVvZil7Y2FzZSB2YTphOntmb3IodmFyIGs9XG5mLmtleSxsPWQ7bnVsbCE9PWw7KXtpZihsLmtleT09PWspe2s9Zi50eXBlO2lmKGs9PT15YSl7aWYoNz09PWwudGFnKXtjKGEsbC5zaWJsaW5nKTtkPWUobCxmLnByb3BzLmNoaWxkcmVuKTtkLnJldHVybj1hO2E9ZDticmVhayBhfX1lbHNlIGlmKGwuZWxlbWVudFR5cGU9PT1rfHxcIm9iamVjdFwiPT09dHlwZW9mIGsmJm51bGwhPT1rJiZrLiQkdHlwZW9mPT09SGEmJk5nKGspPT09bC50eXBlKXtjKGEsbC5zaWJsaW5nKTtkPWUobCxmLnByb3BzKTtkLnJlZj1MZyhhLGwsZik7ZC5yZXR1cm49YTthPWQ7YnJlYWsgYX1jKGEsbCk7YnJlYWt9ZWxzZSBiKGEsbCk7bD1sLnNpYmxpbmd9Zi50eXBlPT09eWE/KGQ9VGcoZi5wcm9wcy5jaGlsZHJlbixhLm1vZGUsaCxmLmtleSksZC5yZXR1cm49YSxhPWQpOihoPVJnKGYudHlwZSxmLmtleSxmLnByb3BzLG51bGwsYS5tb2RlLGgpLGgucmVmPUxnKGEsZCxmKSxoLnJldHVybj1hLGE9aCl9cmV0dXJuIGcoYSk7Y2FzZSB3YTphOntmb3IobD1mLmtleTtudWxsIT09XG5kOyl7aWYoZC5rZXk9PT1sKWlmKDQ9PT1kLnRhZyYmZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbz09PWYuY29udGFpbmVySW5mbyYmZC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb249PT1mLmltcGxlbWVudGF0aW9uKXtjKGEsZC5zaWJsaW5nKTtkPWUoZCxmLmNoaWxkcmVufHxbXSk7ZC5yZXR1cm49YTthPWQ7YnJlYWsgYX1lbHNle2MoYSxkKTticmVha31lbHNlIGIoYSxkKTtkPWQuc2libGluZ31kPVNnKGYsYS5tb2RlLGgpO2QucmV0dXJuPWE7YT1kfXJldHVybiBnKGEpO2Nhc2UgSGE6cmV0dXJuIGw9Zi5faW5pdCxKKGEsZCxsKGYuX3BheWxvYWQpLGgpfWlmKGViKGYpKXJldHVybiBuKGEsZCxmLGgpO2lmKEthKGYpKXJldHVybiB0KGEsZCxmLGgpO01nKGEsZil9cmV0dXJuXCJzdHJpbmdcIj09PXR5cGVvZiBmJiZcIlwiIT09Znx8XCJudW1iZXJcIj09PXR5cGVvZiBmPyhmPVwiXCIrZixudWxsIT09ZCYmNj09PWQudGFnPyhjKGEsZC5zaWJsaW5nKSxkPWUoZCxmKSxkLnJldHVybj1hLGE9ZCk6XG4oYyhhLGQpLGQ9UWcoZixhLm1vZGUsaCksZC5yZXR1cm49YSxhPWQpLGcoYSkpOmMoYSxkKX1yZXR1cm4gSn12YXIgVWc9T2coITApLFZnPU9nKCExKSxXZz1VZihudWxsKSxYZz1udWxsLFlnPW51bGwsWmc9bnVsbDtmdW5jdGlvbiAkZygpe1pnPVlnPVhnPW51bGx9ZnVuY3Rpb24gYWgoYSl7dmFyIGI9V2cuY3VycmVudDtFKFdnKTthLl9jdXJyZW50VmFsdWU9Yn1mdW5jdGlvbiBiaChhLGIsYyl7Zm9yKDtudWxsIT09YTspe3ZhciBkPWEuYWx0ZXJuYXRlOyhhLmNoaWxkTGFuZXMmYikhPT1iPyhhLmNoaWxkTGFuZXN8PWIsbnVsbCE9PWQmJihkLmNoaWxkTGFuZXN8PWIpKTpudWxsIT09ZCYmKGQuY2hpbGRMYW5lcyZiKSE9PWImJihkLmNoaWxkTGFuZXN8PWIpO2lmKGE9PT1jKWJyZWFrO2E9YS5yZXR1cm59fVxuZnVuY3Rpb24gY2goYSxiKXtYZz1hO1pnPVlnPW51bGw7YT1hLmRlcGVuZGVuY2llcztudWxsIT09YSYmbnVsbCE9PWEuZmlyc3RDb250ZXh0JiYoMCE9PShhLmxhbmVzJmIpJiYoZGg9ITApLGEuZmlyc3RDb250ZXh0PW51bGwpfWZ1bmN0aW9uIGVoKGEpe3ZhciBiPWEuX2N1cnJlbnRWYWx1ZTtpZihaZyE9PWEpaWYoYT17Y29udGV4dDphLG1lbW9pemVkVmFsdWU6YixuZXh0Om51bGx9LG51bGw9PT1ZZyl7aWYobnVsbD09PVhnKXRocm93IEVycm9yKHAoMzA4KSk7WWc9YTtYZy5kZXBlbmRlbmNpZXM9e2xhbmVzOjAsZmlyc3RDb250ZXh0OmF9fWVsc2UgWWc9WWcubmV4dD1hO3JldHVybiBifXZhciBmaD1udWxsO2Z1bmN0aW9uIGdoKGEpe251bGw9PT1maD9maD1bYV06ZmgucHVzaChhKX1cbmZ1bmN0aW9uIGhoKGEsYixjLGQpe3ZhciBlPWIuaW50ZXJsZWF2ZWQ7bnVsbD09PWU/KGMubmV4dD1jLGdoKGIpKTooYy5uZXh0PWUubmV4dCxlLm5leHQ9Yyk7Yi5pbnRlcmxlYXZlZD1jO3JldHVybiBpaChhLGQpfWZ1bmN0aW9uIGloKGEsYil7YS5sYW5lc3w9Yjt2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09YyYmKGMubGFuZXN8PWIpO2M9YTtmb3IoYT1hLnJldHVybjtudWxsIT09YTspYS5jaGlsZExhbmVzfD1iLGM9YS5hbHRlcm5hdGUsbnVsbCE9PWMmJihjLmNoaWxkTGFuZXN8PWIpLGM9YSxhPWEucmV0dXJuO3JldHVybiAzPT09Yy50YWc/Yy5zdGF0ZU5vZGU6bnVsbH12YXIgamg9ITE7ZnVuY3Rpb24ga2goYSl7YS51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmEubWVtb2l6ZWRTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6bnVsbCxsYXN0QmFzZVVwZGF0ZTpudWxsLHNoYXJlZDp7cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MH0sZWZmZWN0czpudWxsfX1cbmZ1bmN0aW9uIGxoKGEsYil7YT1hLnVwZGF0ZVF1ZXVlO2IudXBkYXRlUXVldWU9PT1hJiYoYi51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmEuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTphLmZpcnN0QmFzZVVwZGF0ZSxsYXN0QmFzZVVwZGF0ZTphLmxhc3RCYXNlVXBkYXRlLHNoYXJlZDphLnNoYXJlZCxlZmZlY3RzOmEuZWZmZWN0c30pfWZ1bmN0aW9uIG1oKGEsYil7cmV0dXJue2V2ZW50VGltZTphLGxhbmU6Yix0YWc6MCxwYXlsb2FkOm51bGwsY2FsbGJhY2s6bnVsbCxuZXh0Om51bGx9fVxuZnVuY3Rpb24gbmgoYSxiLGMpe3ZhciBkPWEudXBkYXRlUXVldWU7aWYobnVsbD09PWQpcmV0dXJuIG51bGw7ZD1kLnNoYXJlZDtpZigwIT09KEsmMikpe3ZhciBlPWQucGVuZGluZztudWxsPT09ZT9iLm5leHQ9YjooYi5uZXh0PWUubmV4dCxlLm5leHQ9Yik7ZC5wZW5kaW5nPWI
251147cmV0dXJuIGloKGEsYyl9ZT1kLmludGVybGVhdmVkO251bGw9PT1lPyhiLm5leHQ9YixnaChkKSk6KGIubmV4dD1lLm5leHQsZS5uZXh0PWIpO2QuaW50ZXJsZWF2ZWQ9YjtyZXR1cm4gaWgoYSxjKX1mdW5jdGlvbiBvaChhLGIsYyl7Yj1iLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1iJiYoYj1iLnNoYXJlZCwwIT09KGMmNDE5NDI0MCkpKXt2YXIgZD1iLmxhbmVzO2QmPWEucGVuZGluZ0xhbmVzO2N8PWQ7Yi5sYW5lcz1jO0NjKGEsYyl9fVxuZnVuY3Rpb24gcGgoYSxiKXt2YXIgYz1hLnVwZGF0ZVF1ZXVlLGQ9YS5hbHRlcm5hdGU7aWYobnVsbCE9PWQmJihkPWQudXBkYXRlUXVldWUsYz09PWQpKXt2YXIgZT1udWxsLGY9bnVsbDtjPWMuZmlyc3RCYXNlVXBkYXRlO2lmKG51bGwhPT1jKXtkb3t2YXIgZz17ZXZlbnRUaW1lOmMuZXZlbnRUaW1lLGxhbmU6Yy5sYW5lLHRhZzpjLnRhZyxwYXlsb2FkOmMucGF5bG9hZCxjYWxsYmFjazpjLmNhbGxiYWNrLG5leHQ6bnVsbH07bnVsbD09PWY/ZT1mPWc6Zj1mLm5leHQ9ZztjPWMubmV4dH13aGlsZShudWxsIT09Yyk7bnVsbD09PWY/ZT1mPWI6Zj1mLm5leHQ9Yn1lbHNlIGU9Zj1iO2M9e2Jhc2VTdGF0ZTpkLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6ZSxsYXN0QmFzZVVwZGF0ZTpmLHNoYXJlZDpkLnNoYXJlZCxlZmZlY3RzOmQuZWZmZWN0c307YS51cGRhdGVRdWV1ZT1jO3JldHVybn1hPWMubGFzdEJhc2VVcGRhdGU7bnVsbD09PWE/Yy5maXJzdEJhc2VVcGRhdGU9YjphLm5leHQ9XG5iO2MubGFzdEJhc2VVcGRhdGU9Yn1cbmZ1bmN0aW9uIHFoKGEsYixjLGQpe3ZhciBlPWEudXBkYXRlUXVldWU7amg9ITE7dmFyIGY9ZS5maXJzdEJhc2VVcGRhdGUsZz1lLmxhc3RCYXNlVXBkYXRlLGg9ZS5zaGFyZWQucGVuZGluZztpZihudWxsIT09aCl7ZS5zaGFyZWQucGVuZGluZz1udWxsO3ZhciBrPWgsbD1rLm5leHQ7ay5uZXh0PW51bGw7bnVsbD09PWc/Zj1sOmcubmV4dD1sO2c9azt2YXIgbT1hLmFsdGVybmF0ZTtudWxsIT09bSYmKG09bS51cGRhdGVRdWV1ZSxoPW0ubGFzdEJhc2VVcGRhdGUsaCE9PWcmJihudWxsPT09aD9tLmZpcnN0QmFzZVVwZGF0ZT1sOmgubmV4dD1sLG0ubGFzdEJhc2VVcGRhdGU9aykpfWlmKG51bGwhPT1mKXt2YXIgcT1lLmJhc2VTdGF0ZTtnPTA7bT1sPWs9bnVsbDtoPWY7ZG97dmFyIHI9aC5sYW5lLHk9aC5ldmVudFRpbWU7aWYoKGQmcik9PT1yKXtudWxsIT09bSYmKG09bS5uZXh0PXtldmVudFRpbWU6eSxsYW5lOjAsdGFnOmgudGFnLHBheWxvYWQ6aC5wYXlsb2FkLGNhbGxiYWNrOmguY2FsbGJhY2ssXG5uZXh0Om51bGx9KTthOnt2YXIgbj1hLHQ9aDtyPWI7eT1jO3N3aXRjaCh0LnRhZyl7Y2FzZSAxOm49dC5wYXlsb2FkO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBuKXtxPW4uY2FsbCh5LHEscik7YnJlYWsgYX1xPW47YnJlYWsgYTtjYXNlIDM6bi5mbGFncz1uLmZsYWdzJi02NTUzN3wxMjg7Y2FzZSAwOm49dC5wYXlsb2FkO3I9XCJmdW5jdGlvblwiPT09dHlwZW9mIG4/bi5jYWxsKHkscSxyKTpuO2lmKG51bGw9PT1yfHx2b2lkIDA9PT1yKWJyZWFrIGE7cT1BKHt9LHEscik7YnJlYWsgYTtjYXNlIDI6amg9ITB9fW51bGwhPT1oLmNhbGxiYWNrJiYwIT09aC5sYW5lJiYoYS5mbGFnc3w9NjQscj1lLmVmZmVjdHMsbnVsbD09PXI/ZS5lZmZlY3RzPVtoXTpyLnB1c2goaCkpfWVsc2UgeT17ZXZlbnRUaW1lOnksbGFuZTpyLHRhZzpoLnRhZyxwYXlsb2FkOmgucGF5bG9hZCxjYWxsYmFjazpoLmNhbGxiYWNrLG5leHQ6bnVsbH0sbnVsbD09PW0/KGw9bT15LGs9cSk6bT1tLm5leHQ9eSxnfD1yO1xuaD1oLm5leHQ7aWYobnVsbD09PWgpaWYoaD1lLnNoYXJlZC5wZW5kaW5nLG51bGw9PT1oKWJyZWFrO2Vsc2Ugcj1oLGg9ci5uZXh0LHIubmV4dD1udWxsLGUubGFzdEJhc2VVcGRhdGU9cixlLnNoYXJlZC5wZW5kaW5nPW51bGx9d2hpbGUoMSk7bnVsbD09PW0mJihrPXEpO2UuYmFzZVN0YXRlPWs7ZS5maXJzdEJhc2VVcGRhdGU9bDtlLmxhc3RCYXNlVXBkYXRlPW07Yj1lLnNoYXJlZC5pbnRlcmxlYXZlZDtpZihudWxsIT09Yil7ZT1iO2RvIGd8PWUubGFuZSxlPWUubmV4dDt3aGlsZShlIT09Yil9ZWxzZSBudWxsPT09ZiYmKGUuc2hhcmVkLmxhbmVzPTApO3JofD1nO2EubGFuZXM9ZzthLm1lbW9pemVkU3RhdGU9cX19XG5mdW5jdGlvbiBzaChhLGIsYyl7YT1iLmVmZmVjdHM7Yi5lZmZlY3RzPW51bGw7aWYobnVsbCE9PWEpZm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXSxlPWQuY2FsbGJhY2s7aWYobnVsbCE9PWUpe2QuY2FsbGJhY2s9bnVsbDtkPWM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGUpdGhyb3cgRXJyb3IocCgxOTEsZSkpO2UuY2FsbChkKX19fXZhciB0aD17fSx1aD1VZih0aCksdmg9VWYodGgpLHdoPVVmKHRoKTtmdW5jdGlvbiB4aChhKXtpZihhPT09dGgpdGhyb3cgRXJyb3IocCgxNzQpKTtyZXR1cm4gYX1cbmZ1bmN0aW9uIHloKGEsYil7Ryh3aCxiKTtHKHZoLGEpO0codWgsdGgpO2E9Yi5ub2RlVHlwZTtzd2l0Y2goYSl7Y2FzZSA5OmNhc2UgMTE6Yj0oYj1iLmRvY3VtZW50RWxlbWVudCk/Yi5uYW1lc3BhY2VVUkk6bGIobnVsbCxcIlwiKTticmVhaztkZWZhdWx0OmE9OD09PWE/Yi5wYXJlbnROb2RlOmIsYj1hLm5hbWVzcGFjZVVSSXx8bnVsbCxhPWEudGFnTmFtZSxiPWxiKGIsYSl9RSh1aCk7Ryh1aCxiKX1mdW5jdGlvbiB6aCgpe0UodWgpO0UodmgpO0Uod2gpfWZ1bmN0aW9uIEFoKGEpe3hoKHdoLmN1cnJlbnQpO3ZhciBiPXhoKHVoLmN1cnJlbnQpO3ZhciBjPWxiKGIsYS50eXBlKTtiIT09YyYmKEcodmgsYSksRyh1aCxjKSl9ZnVuY3Rpb24gQmgoYSl7dmguY3VycmVudD09PWEmJihFKHVoKSxFKHZoKSl9dmFyIEw9VWYoMCk7XG5mdW5jdGlvbiBDaChhKXtmb3IodmFyIGI9YTtudWxsIT09Yjspe2lmKDEzPT09Yi50YWcpe3ZhciBjPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YyYmKGM9Yy5kZWh5ZHJhdGVkLG51bGw9PT1jfHxcIiQ/XCI9PT1jLmRhdGF8fFwiJCFcIj09PWMuZGF0YSkpcmV0dXJuIGJ9ZWxzZSBpZigxOT09PWIudGFnJiZ2b2lkIDAhPT1iLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIpe2lmKDAhPT0oYi5mbGFncyYxMjgpKXJldHVybi
25114BifWVsc2UgaWYobnVsbCE9PWIuY2hpbGQpe2IuY2hpbGQucmV0dXJuPWI7Yj1iLmNoaWxkO2NvbnRpbnVlfWlmKGI9PT1hKWJyZWFrO2Zvcig7bnVsbD09PWIuc2libGluZzspe2lmKG51bGw9PT1iLnJldHVybnx8Yi5yZXR1cm49PT1hKXJldHVybiBudWxsO2I9Yi5yZXR1cm59Yi5zaWJsaW5nLnJldHVybj1iLnJldHVybjtiPWIuc2libGluZ31yZXR1cm4gbnVsbH12YXIgRGg9W107XG5mdW5jdGlvbiBFaCgpe2Zvcih2YXIgYT0wO2E8RGgubGVuZ3RoO2ErKylEaFthXS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeT1udWxsO0RoLmxlbmd0aD0wfXZhciBGaD11YS5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLEdoPXVhLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLEhoPTAsTT1udWxsLE49bnVsbCxPPW51bGwsSWg9ITEsSmg9ITEsS2g9MCxMaD0wO2Z1bmN0aW9uIFAoKXt0aHJvdyBFcnJvcihwKDMyMSkpO31mdW5jdGlvbiBNaChhLGIpe2lmKG51bGw9PT1iKXJldHVybiExO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGgmJmM8YS5sZW5ndGg7YysrKWlmKCFIZShhW2NdLGJbY10pKXJldHVybiExO3JldHVybiEwfVxuZnVuY3Rpb24gTmgoYSxiLGMsZCxlLGYpe0hoPWY7TT1iO2IubWVtb2l6ZWRTdGF0ZT1udWxsO2IudXBkYXRlUXVldWU9bnVsbDtiLmxhbmVzPTA7RmguY3VycmVudD1udWxsPT09YXx8bnVsbD09PWEubWVtb2l6ZWRTdGF0ZT9PaDpQaDthPWMoZCxlKTtpZihKaCl7Zj0wO2Rve0poPSExO0toPTA7aWYoMjU8PWYpdGhyb3cgRXJyb3IocCgzMDEpKTtmKz0xO089Tj1udWxsO2IudXBkYXRlUXVldWU9bnVsbDtGaC5jdXJyZW50PVFoO2E9YyhkLGUpfXdoaWxlKEpoKX1GaC5jdXJyZW50PVJoO2I9bnVsbCE9PU4mJm51bGwhPT1OLm5leHQ7SGg9MDtPPU49TT1udWxsO0loPSExO2lmKGIpdGhyb3cgRXJyb3IocCgzMDApKTtyZXR1cm4gYX1mdW5jdGlvbiBTaCgpe3ZhciBhPTAhPT1LaDtLaD0wO3JldHVybiBhfVxuZnVuY3Rpb24gVGgoKXt2YXIgYT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtudWxsPT09Tz9NLm1lbW9pemVkU3RhdGU9Tz1hOk89Ty5uZXh0PWE7cmV0dXJuIE99ZnVuY3Rpb24gVWgoKXtpZihudWxsPT09Til7dmFyIGE9TS5hbHRlcm5hdGU7YT1udWxsIT09YT9hLm1lbW9pemVkU3RhdGU6bnVsbH1lbHNlIGE9Ti5uZXh0O3ZhciBiPW51bGw9PT1PP00ubWVtb2l6ZWRTdGF0ZTpPLm5leHQ7aWYobnVsbCE9PWIpTz1iLE49YTtlbHNle2lmKG51bGw9PT1hKXRocm93IEVycm9yKHAoMzEwKSk7Tj1hO2E9e21lbW9pemVkU3RhdGU6Ti5tZW1vaXplZFN0YXRlLGJhc2VTdGF0ZTpOLmJhc2VTdGF0ZSxiYXNlUXVldWU6Ti5iYXNlUXVldWUscXVldWU6Ti5xdWV1ZSxuZXh0Om51bGx9O251bGw9PT1PP00ubWVtb2l6ZWRTdGF0ZT1PPWE6Tz1PLm5leHQ9YX1yZXR1cm4gT31cbmZ1bmN0aW9uIFZoKGEsYil7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGI/YihhKTpifVxuZnVuY3Rpb24gV2goYSl7dmFyIGI9VWgoKSxjPWIucXVldWU7aWYobnVsbD09PWMpdGhyb3cgRXJyb3IocCgzMTEpKTtjLmxhc3RSZW5kZXJlZFJlZHVjZXI9YTt2YXIgZD1OLGU9ZC5iYXNlUXVldWUsZj1jLnBlbmRpbmc7aWYobnVsbCE9PWYpe2lmKG51bGwhPT1lKXt2YXIgZz1lLm5leHQ7ZS5uZXh0PWYubmV4dDtmLm5leHQ9Z31kLmJhc2VRdWV1ZT1lPWY7Yy5wZW5kaW5nPW51bGx9aWYobnVsbCE9PWUpe2Y9ZS5uZXh0O2Q9ZC5iYXNlU3RhdGU7dmFyIGg9Zz1udWxsLGs9bnVsbCxsPWY7ZG97dmFyIG09bC5sYW5lO2lmKChIaCZtKT09PW0pbnVsbCE9PWsmJihrPWsubmV4dD17bGFuZTowLGFjdGlvbjpsLmFjdGlvbixoYXNFYWdlclN0YXRlOmwuaGFzRWFnZXJTdGF0ZSxlYWdlclN0YXRlOmwuZWFnZXJTdGF0ZSxuZXh0Om51bGx9KSxkPWwuaGFzRWFnZXJTdGF0ZT9sLmVhZ2VyU3RhdGU6YShkLGwuYWN0aW9uKTtlbHNle3ZhciBxPXtsYW5lOm0sYWN0aW9uOmwuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6bC5oYXNFYWdlclN0YXRlLFxuZWFnZXJTdGF0ZTpsLmVhZ2VyU3RhdGUsbmV4dDpudWxsfTtudWxsPT09az8oaD1rPXEsZz1kKTprPWsubmV4dD1xO00ubGFuZXN8PW07cmh8PW19bD1sLm5leHR9d2hpbGUobnVsbCE9PWwmJmwhPT1mKTtudWxsPT09az9nPWQ6ay5uZXh0PWg7SGUoZCxiLm1lbW9pemVkU3RhdGUpfHwoZGg9ITApO2IubWVtb2l6ZWRTdGF0ZT1kO2IuYmFzZVN0YXRlPWc7Yi5iYXNlUXVldWU9aztjLmxhc3RSZW5kZXJlZFN0YXRlPWR9YT1jLmludGVybGVhdmVkO2lmKG51bGwhPT1hKXtlPWE7ZG8gZj1lLmxhbmUsTS5sYW5lc3w9ZixyaHw9ZixlPWUubmV4dDt3aGlsZShlIT09YSl9ZWxzZSBudWxsPT09ZSYmKGMubGFuZXM9MCk7cmV0dXJuW2IubWVtb2l6ZWRTdGF0ZSxjLmRpc3BhdGNoXX1cbmZ1bmN0aW9uIFhoKGEpe3ZhciBiPVVoKCksYz1iLnF1ZXVlO2lmKG51bGw9PT1jKXRocm93IEVycm9yKHAoMzExKSk7Yy5sYXN0UmVuZGVyZWRSZWR1Y2VyPWE7dmFyIGQ9Yy5kaXNwYXRjaCxlPWMucGVuZGluZyxmPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZSl7Yy5wZW5kaW5nPW51bGw7dmFyIGc9ZT1lLm5leHQ7ZG8gZj1hKGYsZy5hY3Rpb24pLGc9Zy5uZXh0O3doaWxlKGchPT1lKTtIZShmLGIubWVtb2l6ZWRTdGF0ZSl8fChkaD0hMCk7Yi5tZW1vaXplZFN0YXRlPWY7bnVsbD09PWIuYmFzZVF1ZXVlJiYoYi5iYXNlU3RhdGU9Zik7Yy5sYXN0UmVuZGVyZWRTdGF0ZT1mfXJldHVybltmLGRdfWZ1bmN0aW9uIFloKCl7fVxuZnVuY3Rpb24gWmgoYSxiKXt2YXIgYz1NLGQ9VWgoKSxlPWIoKSxmPSFIZShkLm1lbW9pemVkU3RhdGUsZSk7ZiYmKGQubWVtb2l6ZWRTdGF0ZT1lLGRoPSEwKTtkPWQucXVldWU7JGgoYWkuYmluZChudWxsLGMsZCxhKSxbYV0pO2lmKGQuZ2V0U25hcHNob3QhPT1ifHxmfHxudWxsIT09TyYmTy5tZW1vaXplZFN0YXRlLnRhZyYxKXtjLmZsYWdzfD0yMDQ4O2JpKDksY2kuYmluZChudWxsLGMsZCxlLGIpLHZvaWQgMCxudWxsKTtpZihudWxsPT09USl0aHJvdyBFcnJvcihwKDM0OSkpOzAhPT0oSGgmMzApfHxkaShjLGIsZSl9cmV0dXJuIGV9ZnVuY3Rpb24gZGkoYSxiLGMpe2EuZmxhZ3N8PTE2Mzg0O2E9e2dldFNuYXBzaG90OmIsdmFsdWU6Y307Yj1NLnVwZGF0ZVF1ZXVlO251bGw9PT1iPyhiPXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LE0udXBkYXRlUXVldWU9YixiLnN0b3Jlcz1bYV0pOihjPWIuc3RvcmVzLG51bGw9PT1jP2Iuc3RvcmVzPVthXTpjLnB1c2goYSkpfVxuZnVuY3Rpb24gY2koYSxiLGMsZCl7Yi52YWx1ZT1jO2IuZ2V0U25hcHNob3Q9ZDtlaShiKSYmZmkoYSl9ZnVuY3Rpb24gYWkoYSxiLGMpe3JldHVybiBjKGZ1bmN0aW9uKCl7ZWkoYikmJmZpKGEpfSl9ZnVuY3Rpb24gZWkoYSl7dmFyIGI9YS5nZXRTbmFwc2hvdDthPWEudmFsdWU7dHJ5e3ZhciBjPWIoKTtyZXR1cm4hSGUoYSxjKX1jYXRjaChkKXtyZXR1cm4hMH19ZnVuY3Rpb24gZmkoYSl7dmFyIGI9aWgoYSwxKTtudWxsIT09YiYmZ2koYixhLDEsLT
25114EpfVxuZnVuY3Rpb24gaGkoYSl7dmFyIGI9VGgoKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSYmKGE9YSgpKTtiLm1lbW9pemVkU3RhdGU9Yi5iYXNlU3RhdGU9YTthPXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjpWaCxsYXN0UmVuZGVyZWRTdGF0ZTphfTtiLnF1ZXVlPWE7YT1hLmRpc3BhdGNoPWlpLmJpbmQobnVsbCxNLGEpO3JldHVybltiLm1lbW9pemVkU3RhdGUsYV19XG5mdW5jdGlvbiBiaShhLGIsYyxkKXthPXt0YWc6YSxjcmVhdGU6YixkZXN0cm95OmMsZGVwczpkLG5leHQ6bnVsbH07Yj1NLnVwZGF0ZVF1ZXVlO251bGw9PT1iPyhiPXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LE0udXBkYXRlUXVldWU9YixiLmxhc3RFZmZlY3Q9YS5uZXh0PWEpOihjPWIubGFzdEVmZmVjdCxudWxsPT09Yz9iLmxhc3RFZmZlY3Q9YS5uZXh0PWE6KGQ9Yy5uZXh0LGMubmV4dD1hLGEubmV4dD1kLGIubGFzdEVmZmVjdD1hKSk7cmV0dXJuIGF9ZnVuY3Rpb24gamkoKXtyZXR1cm4gVWgoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIGtpKGEsYixjLGQpe3ZhciBlPVRoKCk7TS5mbGFnc3w9YTtlLm1lbW9pemVkU3RhdGU9YmkoMXxiLGMsdm9pZCAwLHZvaWQgMD09PWQ/bnVsbDpkKX1cbmZ1bmN0aW9uIGxpKGEsYixjLGQpe3ZhciBlPVVoKCk7ZD12b2lkIDA9PT1kP251bGw6ZDt2YXIgZj12b2lkIDA7aWYobnVsbCE9PU4pe3ZhciBnPU4ubWVtb2l6ZWRTdGF0ZTtmPWcuZGVzdHJveTtpZihudWxsIT09ZCYmTWgoZCxnLmRlcHMpKXtlLm1lbW9pemVkU3RhdGU9YmkoYixjLGYsZCk7cmV0dXJufX1NLmZsYWdzfD1hO2UubWVtb2l6ZWRTdGF0ZT1iaSgxfGIsYyxmLGQpfWZ1bmN0aW9uIG1pKGEsYil7cmV0dXJuIGtpKDgzOTA2NTYsOCxhLGIpfWZ1bmN0aW9uICRoKGEsYil7cmV0dXJuIGxpKDIwNDgsOCxhLGIpfWZ1bmN0aW9uIG5pKGEsYil7cmV0dXJuIGxpKDQsMixhLGIpfWZ1bmN0aW9uIG9pKGEsYil7cmV0dXJuIGxpKDQsNCxhLGIpfVxuZnVuY3Rpb24gcGkoYSxiKXtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYilyZXR1cm4gYT1hKCksYihhKSxmdW5jdGlvbigpe2IobnVsbCl9O2lmKG51bGwhPT1iJiZ2b2lkIDAhPT1iKXJldHVybiBhPWEoKSxiLmN1cnJlbnQ9YSxmdW5jdGlvbigpe2IuY3VycmVudD1udWxsfX1mdW5jdGlvbiBxaShhLGIsYyl7Yz1udWxsIT09YyYmdm9pZCAwIT09Yz9jLmNvbmNhdChbYV0pOm51bGw7cmV0dXJuIGxpKDQsNCxwaS5iaW5kKG51bGwsYixhKSxjKX1mdW5jdGlvbiByaSgpe31mdW5jdGlvbiBzaShhLGIpe3ZhciBjPVVoKCk7Yj12b2lkIDA9PT1iP251bGw6Yjt2YXIgZD1jLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWQmJm51bGwhPT1iJiZNaChiLGRbMV0pKXJldHVybiBkWzBdO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX1cbmZ1bmN0aW9uIHRpKGEsYil7dmFyIGM9VWgoKTtiPXZvaWQgMD09PWI/bnVsbDpiO3ZhciBkPWMubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZCYmbnVsbCE9PWImJk1oKGIsZFsxXSkpcmV0dXJuIGRbMF07YT1hKCk7Yy5tZW1vaXplZFN0YXRlPVthLGJdO3JldHVybiBhfWZ1bmN0aW9uIHVpKGEsYixjKXtpZigwPT09KEhoJjIxKSlyZXR1cm4gYS5iYXNlU3RhdGUmJihhLmJhc2VTdGF0ZT0hMSxkaD0hMCksYS5tZW1vaXplZFN0YXRlPWM7SGUoYyxiKXx8KGM9eWMoKSxNLmxhbmVzfD1jLHJofD1jLGEuYmFzZVN0YXRlPSEwKTtyZXR1cm4gYn1mdW5jdGlvbiB2aShhLGIpe3ZhciBjPUM7Qz0wIT09YyYmND5jP2M6NDthKCEwKTt2YXIgZD1HaC50cmFuc2l0aW9uO0doLnRyYW5zaXRpb249e307dHJ5e2EoITEpLGIoKX1maW5hbGx5e0M9YyxHaC50cmFuc2l0aW9uPWR9fWZ1bmN0aW9uIHdpKCl7cmV0dXJuIFVoKCkubWVtb2l6ZWRTdGF0ZX1cbmZ1bmN0aW9uIHhpKGEsYixjKXt2YXIgZD15aShhKTtjPXtsYW5lOmQsYWN0aW9uOmMsaGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfTtpZih6aShhKSlBaShiLGMpO2Vsc2UgaWYoYz1oaChhLGIsYyxkKSxudWxsIT09Yyl7dmFyIGU9UigpO2dpKGMsYSxkLGUpO0JpKGMsYixkKX19XG5mdW5jdGlvbiBpaShhLGIsYyl7dmFyIGQ9eWkoYSksZT17bGFuZTpkLGFjdGlvbjpjLGhhc0VhZ2VyU3RhdGU6ITEsZWFnZXJTdGF0ZTpudWxsLG5leHQ6bnVsbH07aWYoemkoYSkpQWkoYixlKTtlbHNle3ZhciBmPWEuYWx0ZXJuYXRlO2lmKDA9PT1hLmxhbmVzJiYobnVsbD09PWZ8fDA9PT1mLmxhbmVzKSYmKGY9Yi5sYXN0UmVuZGVyZWRSZWR1Y2VyLG51bGwhPT1mKSl0cnl7dmFyIGc9Yi5sYXN0UmVuZGVyZWRTdGF0ZSxoPWYoZyxjKTtlLmhhc0VhZ2VyU3RhdGU9ITA7ZS5lYWdlclN0YXRlPWg7aWYoSGUoaCxnKSl7dmFyIGs9Yi5pbnRlcmxlYXZlZDtudWxsPT09az8oZS5uZXh0PWUsZ2goYikpOihlLm5leHQ9ay5uZXh0LGsubmV4dD1lKTtiLmludGVybGVhdmVkPWU7cmV0dXJufX1jYXRjaChsKXt9ZmluYWxseXt9Yz1oaChhLGIsZSxkKTtudWxsIT09YyYmKGU9UigpLGdpKGMsYSxkLGUpLEJpKGMsYixkKSl9fVxuZnVuY3Rpb24gemkoYSl7dmFyIGI9YS5hbHRlcm5hdGU7cmV0dXJuIGE9PT1NfHxudWxsIT09YiYmYj09PU19ZnVuY3Rpb24gQWkoYSxiKXtKaD1JaD0hMDt2YXIgYz1hLnBlbmRpbmc7bnVsbD09PWM/Yi5uZXh0PWI6KGIubmV4dD1jLm5leHQsYy5uZXh0PWIpO2EucGVuZGluZz1ifWZ1bmN0aW9uIEJpKGEsYixjKXtpZigwIT09KGMmNDE5NDI0MCkpe3ZhciBkPWIubGFuZXM7ZCY9YS5wZW5kaW5nTGFuZXM7Y3w9ZDtiLmxhbmVzPWM7Q2MoYSxjKX19XG52YXIgUmg9e3JlYWRDb250ZXh0OmVoLHVzZUNhbGxiYWNrOlAsdXNlQ29udGV4dDpQLHVzZUVmZmVjdDpQLHVzZUltcGVyYXRpdmVIYW5kbGU6UCx1c2VJbnNlcnRpb25FZmZlY3Q6UCx1c2VMYXlvdXRFZmZlY3Q6UCx1c2VNZW1vOlAsdXNlUmVkdWNlcjpQLHVzZVJlZjpQLHVzZVN0YXRlOlAsdXNlRGVidWdWYWx1ZTpQLHVzZURlZmVycmVkVmFsdWU6UCx1c2VUcmFuc2l0aW9uOlAsdXNlTXV0YWJsZVNvdXJjZTpQLHVzZVN5bmNFeHRlcm5hbFN0b3JlOlAsdXNlSWQ6UCx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LE9oPXtyZWFkQ29udGV4dDplaCx1c2VDYWxsYmFjazpmdW5jdGlvbihhLGIpe1RoKCkubWVtb2l6ZWRTdGF0ZT1bYSx2b2lkIDA9PT1iP251bGw6Yl07cmV0dXJuIGF9LHVzZUNvbnRleHQ6ZWgsdXNlRWZmZWN0Om1pLHVzZUltcGVyYXRpdmVIYW5kbGU6ZnVuY3Rpb24oYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiBraSg0MTk0MzA4LFxuNCxwaS5iaW5kKG51bGwsYixhKSxjKX0sdXNlTGF5b3V0RWZmZWN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGtpKDQxOTQzMDgsNCxhLGIpfSx1c2VJbnNlcnRpb25
25114FZmZlY3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4ga2koNCwyLGEsYil9LHVzZU1lbW86ZnVuY3Rpb24oYSxiKXt2YXIgYz1UaCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7YT1hKCk7Yy5tZW1vaXplZFN0YXRlPVthLGJdO3JldHVybiBhfSx1c2VSZWR1Y2VyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1UaCgpO2I9dm9pZCAwIT09Yz9jKGIpOmI7ZC5tZW1vaXplZFN0YXRlPWQuYmFzZVN0YXRlPWI7YT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6YSxsYXN0UmVuZGVyZWRTdGF0ZTpifTtkLnF1ZXVlPWE7YT1hLmRpc3BhdGNoPXhpLmJpbmQobnVsbCxNLGEpO3JldHVybltkLm1lbW9pemVkU3RhdGUsYV19LHVzZVJlZjpmdW5jdGlvbihhKXt2YXIgYj1cblRoKCk7YT17Y3VycmVudDphfTtyZXR1cm4gYi5tZW1vaXplZFN0YXRlPWF9LHVzZVN0YXRlOmhpLHVzZURlYnVnVmFsdWU6cmksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gVGgoKS5tZW1vaXplZFN0YXRlPWF9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1oaSghMSksYj1hWzBdO2E9dmkuYmluZChudWxsLGFbMV0pO1RoKCkubWVtb2l6ZWRTdGF0ZT1hO3JldHVybltiLGFdfSx1c2VNdXRhYmxlU291cmNlOmZ1bmN0aW9uKCl7fSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9TSxlPVRoKCk7aWYoSSl7aWYodm9pZCAwPT09Yyl0aHJvdyBFcnJvcihwKDQwNykpO2M9YygpfWVsc2V7Yz1iKCk7aWYobnVsbD09PVEpdGhyb3cgRXJyb3IocCgzNDkpKTswIT09KEhoJjMwKXx8ZGkoZCxiLGMpfWUubWVtb2l6ZWRTdGF0ZT1jO3ZhciBmPXt2YWx1ZTpjLGdldFNuYXBzaG90OmJ9O2UucXVldWU9ZjttaShhaS5iaW5kKG51bGwsZCxcbmYsYSksW2FdKTtkLmZsYWdzfD0yMDQ4O2JpKDksY2kuYmluZChudWxsLGQsZixjLGIpLHZvaWQgMCxudWxsKTtyZXR1cm4gY30sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgYT1UaCgpLGI9US5pZGVudGlmaWVyUHJlZml4O2lmKEkpe3ZhciBjPXNnO3ZhciBkPXJnO2M9KGQmfigxPDwzMi1vYyhkKS0xKSkudG9TdHJpbmcoMzIpK2M7Yj1cIjpcIitiK1wiUlwiK2M7Yz1LaCsrOzA8YyYmKGIrPVwiSFwiK2MudG9TdHJpbmcoMzIpKTtiKz1cIjpcIn1lbHNlIGM9TGgrKyxiPVwiOlwiK2IrXCJyXCIrYy50b1N0cmluZygzMikrXCI6XCI7cmV0dXJuIGEubWVtb2l6ZWRTdGF0ZT1ifSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LFBoPXtyZWFkQ29udGV4dDplaCx1c2VDYWxsYmFjazpzaSx1c2VDb250ZXh0OmVoLHVzZUVmZmVjdDokaCx1c2VJbXBlcmF0aXZlSGFuZGxlOnFpLHVzZUluc2VydGlvbkVmZmVjdDpuaSx1c2VMYXlvdXRFZmZlY3Q6b2ksdXNlTWVtbzp0aSx1c2VSZWR1Y2VyOldoLHVzZVJlZjpqaSx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBXaChWaCl9LFxudXNlRGVidWdWYWx1ZTpyaSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPVVoKCk7cmV0dXJuIHVpKGIsTi5tZW1vaXplZFN0YXRlLGEpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9V2goVmgpWzBdLGI9VWgoKS5tZW1vaXplZFN0YXRlO3JldHVyblthLGJdfSx1c2VNdXRhYmxlU291cmNlOlloLHVzZVN5bmNFeHRlcm5hbFN0b3JlOlpoLHVzZUlkOndpLHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sUWg9e3JlYWRDb250ZXh0OmVoLHVzZUNhbGxiYWNrOnNpLHVzZUNvbnRleHQ6ZWgsdXNlRWZmZWN0OiRoLHVzZUltcGVyYXRpdmVIYW5kbGU6cWksdXNlSW5zZXJ0aW9uRWZmZWN0Om5pLHVzZUxheW91dEVmZmVjdDpvaSx1c2VNZW1vOnRpLHVzZVJlZHVjZXI6WGgsdXNlUmVmOmppLHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIFhoKFZoKX0sdXNlRGVidWdWYWx1ZTpyaSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPVVoKCk7cmV0dXJuIG51bGw9PT1cbk4/Yi5tZW1vaXplZFN0YXRlPWE6dWkoYixOLm1lbW9pemVkU3RhdGUsYSl9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1YaChWaClbMF0sYj1VaCgpLm1lbW9pemVkU3RhdGU7cmV0dXJuW2EsYl19LHVzZU11dGFibGVTb3VyY2U6WWgsdXNlU3luY0V4dGVybmFsU3RvcmU6WmgsdXNlSWQ6d2ksdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfTtmdW5jdGlvbiBDaShhLGIpe2lmKGEmJmEuZGVmYXVsdFByb3BzKXtiPUEoe30sYik7YT1hLmRlZmF1bHRQcm9wcztmb3IodmFyIGMgaW4gYSl2b2lkIDA9PT1iW2NdJiYoYltjXT1hW2NdKTtyZXR1cm4gYn1yZXR1cm4gYn1mdW5jdGlvbiBEaShhLGIsYyxkKXtiPWEubWVtb2l6ZWRTdGF0ZTtjPWMoZCxiKTtjPW51bGw9PT1jfHx2b2lkIDA9PT1jP2I6QSh7fSxiLGMpO2EubWVtb2l6ZWRTdGF0ZT1jOzA9PT1hLmxhbmVzJiYoYS51cGRhdGVRdWV1ZS5iYXNlU3RhdGU9Yyl9XG52YXIgRWk9e2lzTW91bnRlZDpmdW5jdGlvbihhKXtyZXR1cm4oYT1hLl9yZWFjdEludGVybmFscyk/VmIoYSk9PT1hOiExfSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oYSxiLGMpe2E9YS5fcmVhY3RJbnRlcm5hbHM7dmFyIGQ9UigpLGU9eWkoYSksZj1taChkLGUpO2YucGF5bG9hZD1iO3ZvaWQgMCE9PWMmJm51bGwhPT1jJiYoZi5jYWxsYmFjaz1jKTtiPW5oKGEsZixlKTtudWxsIT09YiYmKGdpKGIsYSxlLGQpLG9oKGIsYSxlKSl9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oYSxiLGMpe2E9YS5fcmVhY3RJbnRlcm5hbHM7dmFyIGQ9UigpLGU9eWkoYSksZj1taChkLGUpO2YudGFnPTE7Zi5wYXlsb2FkPWI7dm9pZCAwIT09YyYmbnVsbCE9PWMmJihmLmNhbGxiYWNrPWMpO2I9bmgoYSxmLGUpO251bGwhPT1iJiYoZ2koYixhLGUsZCksb2goYixhLGUpKX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGEsYil7YT1hLl9yZWFjdEludGVybmFsczt2YXIgYz1SKCksZD1cbnlpKGEpLGU9bWgoYyxkKTtlLnRhZz0yO3ZvaWQgMCE9PWImJm51bGwhPT1iJiYoZS5jYWxsYmFjaz1iKTtiPW5oKGEsZSxkKTtudWxsIT09YiYmKGdpKGIsYSxkLGMpLG9oKGIsYSxkKSl9fTtmdW5jdGlvbiBGaShhLGIsYyxkLGUsZixnKXthPWEuc3RhdGVOb2RlO3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLnNob3VsZENvbXBvbmVudFVwZGF0ZT9hLnNob3VsZENvbXBvbmVudFVwZGF0ZShkLGYsZyk6Yi5wcm90b3R5cGUmJmIucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50PyFJZShjLGQpfHwhSWUoZSxmKTohMH1cbmZ1bmN0aW9uIEdpKGEsYixjKXt2YXIgZD0hMSxlPVZmO3ZhciBmPWIuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09Zj9mPWVoKGYpOihlPVpmKGIpP1hmOkguY3VycmVudCxkPWIuY29udGV4dFR5cGVzLGY9KGQ9bnVsbCE9PWQmJnZvaWQgMCE9PWQpP
251141lmKGEsZSk6VmYpO2I9bmV3IGIoYyxmKTthLm1lbW9pemVkU3RhdGU9bnVsbCE9PWIuc3RhdGUmJnZvaWQgMCE9PWIuc3RhdGU/Yi5zdGF0ZTpudWxsO2IudXBkYXRlcj1FaTthLnN0YXRlTm9kZT1iO2IuX3JlYWN0SW50ZXJuYWxzPWE7ZCYmKGE9YS5zdGF0ZU5vZGUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PWUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1mKTtyZXR1cm4gYn1cbmZ1bmN0aW9uIEhpKGEsYixjLGQpe2E9Yi5zdGF0ZTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZiLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoYyxkKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmYi5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhjLGQpO2Iuc3RhdGUhPT1hJiZFaS5lbnF1ZXVlUmVwbGFjZVN0YXRlKGIsYi5zdGF0ZSxudWxsKX1cbmZ1bmN0aW9uIElpKGEsYixjLGQpe3ZhciBlPWEuc3RhdGVOb2RlO2UucHJvcHM9YztlLnN0YXRlPWEubWVtb2l6ZWRTdGF0ZTtlLnJlZnM9e307a2goYSk7dmFyIGY9Yi5jb250ZXh0VHlwZTtcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mP2UuY29udGV4dD1laChmKTooZj1aZihiKT9YZjpILmN1cnJlbnQsZS5jb250ZXh0PVlmKGEsZikpO2Uuc3RhdGU9YS5tZW1vaXplZFN0YXRlO2Y9Yi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XCJmdW5jdGlvblwiPT09dHlwZW9mIGYmJihEaShhLGIsZixjKSxlLnN0YXRlPWEubWVtb2l6ZWRTdGF0ZSk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGIuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzfHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGUuY29tcG9uZW50V2lsbE1vdW50fHwoYj1lLnN0YXRlLFxuXCJmdW5jdGlvblwiPT09dHlwZW9mIGUuY29tcG9uZW50V2lsbE1vdW50JiZlLmNvbXBvbmVudFdpbGxNb3VudCgpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJmUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpLGIhPT1lLnN0YXRlJiZFaS5lbnF1ZXVlUmVwbGFjZVN0YXRlKGUsZS5zdGF0ZSxudWxsKSxxaChhLGMsZSxkKSxlLnN0YXRlPWEubWVtb2l6ZWRTdGF0ZSk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGUuY29tcG9uZW50RGlkTW91bnQmJihhLmZsYWdzfD00MTk0MzA4KX1mdW5jdGlvbiBKaShhLGIpe3RyeXt2YXIgYz1cIlwiLGQ9YjtkbyBjKz1QYShkKSxkPWQucmV0dXJuO3doaWxlKGQpO3ZhciBlPWN9Y2F0Y2goZil7ZT1cIlxcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6IFwiK2YubWVzc2FnZStcIlxcblwiK2Yuc3RhY2t9cmV0dXJue3ZhbHVlOmEsc291cmNlOmIsc3RhY2s6ZSxkaWdlc3Q6bnVsbH19XG5mdW5jdGlvbiBLaShhLGIsYyl7cmV0dXJue3ZhbHVlOmEsc291cmNlOm51bGwsc3RhY2s6bnVsbCE9Yz9jOm51bGwsZGlnZXN0Om51bGwhPWI/YjpudWxsfX1mdW5jdGlvbiBMaShhLGIpe3RyeXtjb25zb2xlLmVycm9yKGIudmFsdWUpfWNhdGNoKGMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBjO30pfX12YXIgTWk9XCJmdW5jdGlvblwiPT09dHlwZW9mIFdlYWtNYXA/V2Vha01hcDpNYXA7ZnVuY3Rpb24gTmkoYSxiLGMpe2M9bWgoLTEsYyk7Yy50YWc9MztjLnBheWxvYWQ9e2VsZW1lbnQ6bnVsbH07dmFyIGQ9Yi52YWx1ZTtjLmNhbGxiYWNrPWZ1bmN0aW9uKCl7T2l8fChPaT0hMCxQaT1kKTtMaShhLGIpfTtyZXR1cm4gY31cbmZ1bmN0aW9uIFFpKGEsYixjKXtjPW1oKC0xLGMpO2MudGFnPTM7dmFyIGQ9YS50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZCl7dmFyIGU9Yi52YWx1ZTtjLnBheWxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZChlKX07Yy5jYWxsYmFjaz1mdW5jdGlvbigpe0xpKGEsYil9fXZhciBmPWEuc3RhdGVOb2RlO251bGwhPT1mJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5jb21wb25lbnREaWRDYXRjaCYmKGMuY2FsbGJhY2s9ZnVuY3Rpb24oKXtMaShhLGIpO1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBkJiYobnVsbD09PVJpP1JpPW5ldyBTZXQoW3RoaXNdKTpSaS5hZGQodGhpcykpO3ZhciBjPWIuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaChiLnZhbHVlLHtjb21wb25lbnRTdGFjazpudWxsIT09Yz9jOlwiXCJ9KX0pO3JldHVybiBjfVxuZnVuY3Rpb24gU2koYSxiLGMpe3ZhciBkPWEucGluZ0NhY2hlO2lmKG51bGw9PT1kKXtkPWEucGluZ0NhY2hlPW5ldyBNaTt2YXIgZT1uZXcgU2V0O2Quc2V0KGIsZSl9ZWxzZSBlPWQuZ2V0KGIpLHZvaWQgMD09PWUmJihlPW5ldyBTZXQsZC5zZXQoYixlKSk7ZS5oYXMoYyl8fChlLmFkZChjKSxhPVRpLmJpbmQobnVsbCxhLGIsYyksYi50aGVuKGEsYSkpfWZ1bmN0aW9uIFVpKGEpe2Rve3ZhciBiO2lmKGI9MTM9PT1hLnRhZyliPWEubWVtb2l6ZWRTdGF0ZSxiPW51bGwhPT1iP251bGwhPT1iLmRlaHlkcmF0ZWQ/ITA6ITE6ITA7aWYoYilyZXR1cm4gYTthPWEucmV0dXJufXdoaWxlKG51bGwhPT1hKTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIFZpKGEsYixjLGQsZSl7aWYoMD09PShhLm1vZGUmMSkpcmV0dXJuIGE9PT1iP2EuZmxhZ3N8PTY1NTM2OihhLmZsYWdzfD0xMjgsYy5mbGFnc3w9MTMxMDcyLGMuZmxhZ3MmPS01MjgwNSwxPT09Yy50YWcmJihudWxsPT09Yy5hbHRlcm5hdGU/Yy50YWc9MTc6KGI9bWgoLTEsMSksYi50YWc9MixuaChjLGIsMSkpKSxjLmxhbmVzfD0xKSxhO2EuZmxhZ3N8PTY1NTM2O2EubGFuZXM9ZTtyZXR1cm4gYX12YXIgV2k9dWEuUmVhY3RDdXJyZW50T3duZXIsZGg9ITE7ZnVuY3Rpb24gWGkoYSxiLGMsZCl7Yi5jaGlsZD1udWxsPT09YT9WZyhiLG51bGwsYyxkKTpVZyhiLGEuY2hpbGQsYyxkKX1cbmZ1bmN0aW9uIFlpKGEsYixjLGQsZSl7Yz1jLnJlbmRlcjt2YXIgZj1iLnJlZjtjaChiLGUpO2Q9TmgoYSxiLGMsZCxmLGUpO2M9U2goKTtpZihudWxsIT09YSYmIWRoKXJldHVybi
25114BiLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWUsYi5mbGFncyY9LTIwNTMsYS5sYW5lcyY9fmUsWmkoYSxiLGUpO0kmJmMmJnZnKGIpO2IuZmxhZ3N8PTE7WGkoYSxiLGQsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiAkaShhLGIsYyxkLGUpe2lmKG51bGw9PT1hKXt2YXIgZj1jLnR5cGU7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGYmJiFhaihmKSYmdm9pZCAwPT09Zi5kZWZhdWx0UHJvcHMmJm51bGw9PT1jLmNvbXBhcmUmJnZvaWQgMD09PWMuZGVmYXVsdFByb3BzKXJldHVybiBiLnRhZz0xNSxiLnR5cGU9ZixiaihhLGIsZixkLGUpO2E9UmcoYy50eXBlLG51bGwsZCxiLGIubW9kZSxlKTthLnJlZj1iLnJlZjthLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWF9Zj1hLmNoaWxkO2lmKDA9PT0oYS5sYW5lcyZlKSl7dmFyIGc9Zi5tZW1vaXplZFByb3BzO2M9Yy5jb21wYXJlO2M9bnVsbCE9PWM/YzpJZTtpZihjKGcsZCkmJmEucmVmPT09Yi5yZWYpcmV0dXJuIFppKGEsYixlKX1iLmZsYWdzfD0xO2E9UGcoZixkKTthLnJlZj1iLnJlZjthLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWF9XG5mdW5jdGlvbiBiaihhLGIsYyxkLGUpe2lmKG51bGwhPT1hKXt2YXIgZj1hLm1lbW9pemVkUHJvcHM7aWYoSWUoZixkKSYmYS5yZWY9PT1iLnJlZilpZihkaD0hMSxiLnBlbmRpbmdQcm9wcz1kPWYsMCE9PShhLmxhbmVzJmUpKTAhPT0oYS5mbGFncyYxMzEwNzIpJiYoZGg9ITApO2Vsc2UgcmV0dXJuIGIubGFuZXM9YS5sYW5lcyxaaShhLGIsZSl9cmV0dXJuIGNqKGEsYixjLGQsZSl9XG5mdW5jdGlvbiBkaihhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1kLmNoaWxkcmVuLGY9bnVsbCE9PWE/YS5tZW1vaXplZFN0YXRlOm51bGw7aWYoXCJoaWRkZW5cIj09PWQubW9kZSlpZigwPT09KGIubW9kZSYxKSliLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczowLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LEcoZWosZmopLGZqfD1jO2Vsc2V7aWYoMD09PShjJjEwNzM3NDE4MjQpKXJldHVybiBhPW51bGwhPT1mP2YuYmFzZUxhbmVzfGM6YyxiLmxhbmVzPWIuY2hpbGRMYW5lcz0xMDczNzQxODI0LGIubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOmEsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH0sYi51cGRhdGVRdWV1ZT1udWxsLEcoZWosZmopLGZqfD1hLG51bGw7Yi5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfTtkPW51bGwhPT1mP2YuYmFzZUxhbmVzOmM7Ryhlaixmaik7Zmp8PWR9ZWxzZSBudWxsIT09XG5mPyhkPWYuYmFzZUxhbmVzfGMsYi5tZW1vaXplZFN0YXRlPW51bGwpOmQ9YyxHKGVqLGZqKSxmanw9ZDtYaShhLGIsZSxjKTtyZXR1cm4gYi5jaGlsZH1mdW5jdGlvbiBnaihhLGIpe3ZhciBjPWIucmVmO2lmKG51bGw9PT1hJiZudWxsIT09Y3x8bnVsbCE9PWEmJmEucmVmIT09YyliLmZsYWdzfD01MTIsYi5mbGFnc3w9MjA5NzE1Mn1mdW5jdGlvbiBjaihhLGIsYyxkLGUpe3ZhciBmPVpmKGMpP1hmOkguY3VycmVudDtmPVlmKGIsZik7Y2goYixlKTtjPU5oKGEsYixjLGQsZixlKTtkPVNoKCk7aWYobnVsbCE9PWEmJiFkaClyZXR1cm4gYi51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlLGIuZmxhZ3MmPS0yMDUzLGEubGFuZXMmPX5lLFppKGEsYixlKTtJJiZkJiZ2ZyhiKTtiLmZsYWdzfD0xO1hpKGEsYixjLGUpO3JldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gaGooYSxiLGMsZCxlKXtpZihaZihjKSl7dmFyIGY9ITA7Y2coYil9ZWxzZSBmPSExO2NoKGIsZSk7aWYobnVsbD09PWIuc3RhdGVOb2RlKWlqKGEsYiksR2koYixjLGQpLElpKGIsYyxkLGUpLGQ9ITA7ZWxzZSBpZihudWxsPT09YSl7dmFyIGc9Yi5zdGF0ZU5vZGUsaD1iLm1lbW9pemVkUHJvcHM7Zy5wcm9wcz1oO3ZhciBrPWcuY29udGV4dCxsPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBsJiZudWxsIT09bD9sPWVoKGwpOihsPVpmKGMpP1hmOkguY3VycmVudCxsPVlmKGIsbCkpO3Z
25114hciBtPWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHE9XCJmdW5jdGlvblwiPT09dHlwZW9mIG18fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlO3F8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzfHxcbihoIT09ZHx8ayE9PWwpJiZIaShiLGcsZCxsKTtqaD0hMTt2YXIgcj1iLm1lbW9pemVkU3RhdGU7Zy5zdGF0ZT1yO3FoKGIsZCxnLGUpO2s9Yi5tZW1vaXplZFN0YXRlO2ghPT1kfHxyIT09a3x8V2YuY3VycmVudHx8amg/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBtJiYoRGkoYixjLG0sZCksaz1iLm1lbW9pemVkU3RhdGUpLChoPWpofHxGaShiLGMsaCxkLHIsayxsKSk/KHF8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudHx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudCYmZy5jb21wb25lbnRXaWxsTW91bnQoKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50RGlkTW91bnQmJihiLmZsYWdzfD00MTk0MzA4KSk6XG4oXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50RGlkTW91bnQmJihiLmZsYWdzfD00MTk0MzA4KSxiLm1lbW9pemVkUHJvcHM9ZCxiLm1lbW9pemVkU3RhdGU9ayksZy5wcm9wcz1kLGcuc3RhdGU9ayxnLmNvbnRleHQ9bCxkPWgpOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQxOTQzMDgpLGQ9ITEpfWVsc2V7Zz1iLnN0YXRlTm9kZTtsaChhLGIpO2g9Yi5tZW1vaXplZFByb3BzO2w9Yi50eXBlPT09Yi5lbGVtZW50VHlwZT9oOkNpKGIudHlwZSxoKTtnLnByb3BzPWw7cT1iLnBlbmRpbmdQcm9wcztyPWcuY29udGV4dDtrPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBrJiZudWxsIT09az9rPWVoKGspOihrPVpmKGMpP1hmOkguY3VycmVudCxrPVlmKGIsaykpO3ZhciB5PWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhtPVwiZnVuY3Rpb25cIj09PXR5cGVvZiB5fHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSl8fFxuXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHN8fChoIT09cXx8ciE9PWspJiZIaShiLGcsZCxrKTtqaD0hMTtyPWIubWVtb2l6ZWRTdGF0ZTtnLnN0YXRlPXI7cWgoYixkLGcsZSk7dmFyIG49Yi5tZW1vaXplZFN0YXRlO2ghPT1xfHxyIT09bnx8V2YuY3VycmVudHx8amg/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiB5JiYoRGkoYixjLHksZCksbj1iLm1lbW9pemVkU3RhdGUpLChsPWpofHxGaShiLGMsbCxkLHIsbixrKXx8ITEpPyhtfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFVwZGF0ZXx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGUmJmcuY29tcG9uZW50V2lsbFVwZGF0ZShkLG4sayksXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUmJlxuZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShkLG4saykpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZSYmKGIuZmxhZ3N8PTQpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlJiYoYi5mbGFnc3w9MTAyNCkpOihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnI9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcj09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTEwMjQpLGIubWVtb2l6ZWRQcm9wcz1kLGIubWVtb2l6ZWRTdGF0ZT1uKSxnLnByb3BzPWQsZy5zdGF0ZT1uLGcuY29udGV4dD1rLGQ9bCk6KFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcj09PVxuYS5tZW1vaXplZFN0YXRlfHwoYi5mbGFnc3w9NCksXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnI9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD0xMDI0KSxkPSExKX1yZXR1cm4gamooYSxiLGMsZCxmLGUpfVxuZnVuY3Rpb24gamooYSxiLGMsZCxlLGYpe2dqKGEsYik7dmFyIGc9MCE9PShiLmZsYWdzJjEyOCk7aWYoIWQmJiFnKXJldHVybiBlJiZkZyhiLGMsITEpLFppKGEsYixmKTtkPWIuc3RhdGVOb2RlO1dpLmN1cnJlbnQ9Yjt2YXIgaD1nJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I/bnVsbDpkLnJlbmRlcigpO2IuZmxhZ3N8PTE7bnVsbCE9PWEmJmc/KGIuY2hpbGQ9VWcoYixhLmNoaWxkLG51bGwsZiksYi5jaGlsZD1VZyhiLG51bGwsaCxmKSk6WGkoYSxiLGgsZik7Yi5tZW1vaXplZFN0YXRlPWQuc3RhdGU7ZSYmZGcoYixjLCEwKTtyZXR1cm4gYi5jaGlsZH1mdW5jdGlvbiBraihhKXt2YXIgYj1hLnN0YXRlTm9kZTtiLnBlbmRpbmdDb250ZXh0P2FnKGEsYi5wZW5kaW5nQ29udGV4dCxiLnBlbmRpbmdDb250ZXh0IT09Yi5jb250ZXh0KTpiLmNvbnRleHQmJmFnKGEsYi5jb250ZXh0LCExKTt5aChhLGIuY29udGFpbmVySW5mbyl9XG5mdW5jdGlvbiBsaihhLGIsYyxkLGUpe0lnKCk7SmcoZSk7Yi5mbGFnc3w9MjU2O1hpKGEsYixjLGQpO3JldHVybiBiLmNoaWxkfXZhciBtaj17ZGVoeWRyYXRlZDpudWxsLHRyZWVDb250ZXh0Om51bGwscmV0cnlMYW5lOjB9O2Z1bmN0aW9uIG5qKGEpe3JldHVybntiYXNlTGFuZXM6YSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfX1cbmZ1bmN0aW9uIG9qKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPUwuY3VycmVudCxmPSExLGc9MCE9PShiLmZsYWdzJjEyOCksaDsoaD1nKXx8KGg9bnVsbCE9PWEmJm51bGw9PT1hLm1lbW9pemVkU3RhdGU/ITE6MCE9PShlJjIpKTtpZihoKWY9ITAsYi5mbGFncyY9LTEyOTtlbHNlIGlmKG51bGw9PT1hfHxudWxsIT09YS5tZW1vaXplZFN0YXRlKW
25114V8PTE7RyhMLGUmMSk7aWYobnVsbD09PWEpe0VnKGIpO2E9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1hJiYoYT1hLmRlaHlkcmF0ZWQsbnVsbCE9PWEpKXJldHVybiAwPT09KGIubW9kZSYxKT9iLmxhbmVzPTE6XCIkIVwiPT09YS5kYXRhP2IubGFuZXM9ODpiLmxhbmVzPTEwNzM3NDE4MjQsbnVsbDtnPWQuY2hpbGRyZW47YT1kLmZhbGxiYWNrO3JldHVybiBmPyhkPWIubW9kZSxmPWIuY2hpbGQsZz17bW9kZTpcImhpZGRlblwiLGNoaWxkcmVuOmd9LDA9PT0oZCYxKSYmbnVsbCE9PWY/KGYuY2hpbGRMYW5lcz0wLGYucGVuZGluZ1Byb3BzPVxuZyk6Zj1waihnLGQsMCxudWxsKSxhPVRnKGEsZCxjLG51bGwpLGYucmV0dXJuPWIsYS5yZXR1cm49YixmLnNpYmxpbmc9YSxiLmNoaWxkPWYsYi5jaGlsZC5tZW1vaXplZFN0YXRlPW5qKGMpLGIubWVtb2l6ZWRTdGF0ZT1taixhKTpxaihiLGcpfWU9YS5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1lJiYoaD1lLmRlaHlkcmF0ZWQsbnVsbCE9PWgpKXJldHVybiByaihhLGIsZyxkLGgsZSxjKTtpZihmKXtmPWQuZmFsbGJhY2s7Zz1iLm1vZGU7ZT1hLmNoaWxkO2g9ZS5zaWJsaW5nO3ZhciBrPXttb2RlOlwiaGlkZGVuXCIsY2hpbGRyZW46ZC5jaGlsZHJlbn07MD09PShnJjEpJiZiLmNoaWxkIT09ZT8oZD1iLmNoaWxkLGQuY2hpbGRMYW5lcz0wLGQucGVuZGluZ1Byb3BzPWssYi5kZWxldGlvbnM9bnVsbCk6KGQ9UGcoZSxrKSxkLnN1YnRyZWVGbGFncz1lLnN1YnRyZWVGbGFncyYxNDY4MDA2NCk7bnVsbCE9PWg/Zj1QZyhoLGYpOihmPVRnKGYsZyxjLG51bGwpLGYuZmxhZ3N8PTIpO2YucmV0dXJuPVxuYjtkLnJldHVybj1iO2Quc2libGluZz1mO2IuY2hpbGQ9ZDtkPWY7Zj1iLmNoaWxkO2c9YS5jaGlsZC5tZW1vaXplZFN0YXRlO2c9bnVsbD09PWc/bmooYyk6e2Jhc2VMYW5lczpnLmJhc2VMYW5lc3xjLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOmcudHJhbnNpdGlvbnN9O2YubWVtb2l6ZWRTdGF0ZT1nO2YuY2hpbGRMYW5lcz1hLmNoaWxkTGFuZXMmfmM7Yi5tZW1vaXplZFN0YXRlPW1qO3JldHVybiBkfWY9YS5jaGlsZDthPWYuc2libGluZztkPVBnKGYse21vZGU6XCJ2aXNpYmxlXCIsY2hpbGRyZW46ZC5jaGlsZHJlbn0pOzA9PT0oYi5tb2RlJjEpJiYoZC5sYW5lcz1jKTtkLnJldHVybj1iO2Quc2libGluZz1udWxsO251bGwhPT1hJiYoYz1iLmRlbGV0aW9ucyxudWxsPT09Yz8oYi5kZWxldGlvbnM9W2FdLGIuZmxhZ3N8PTE2KTpjLnB1c2goYSkpO2IuY2hpbGQ9ZDtiLm1lbW9pemVkU3RhdGU9bnVsbDtyZXR1cm4gZH1cbmZ1bmN0aW9uIHFqKGEsYil7Yj1waih7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjpifSxhLm1vZGUsMCxudWxsKTtiLnJldHVybj1hO3JldHVybiBhLmNoaWxkPWJ9ZnVuY3Rpb24gc2ooYSxiLGMsZCl7bnVsbCE9PWQmJkpnKGQpO1VnKGIsYS5jaGlsZCxudWxsLGMpO2E9cWooYixiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbik7YS5mbGFnc3w9MjtiLm1lbW9pemVkU3RhdGU9bnVsbDtyZXR1cm4gYX1cbmZ1bmN0aW9uIHJqKGEsYixjLGQsZSxmLGcpe2lmKGMpe2lmKGIuZmxhZ3MmMjU2KXJldHVybiBiLmZsYWdzJj0tMjU3LGQ9S2koRXJyb3IocCg0MjIpKSksc2ooYSxiLGcsZCk7aWYobnVsbCE9PWIubWVtb2l6ZWRTdGF0ZSlyZXR1cm4gYi5jaGlsZD1hLmNoaWxkLGIuZmxhZ3N8PTEyOCxudWxsO2Y9ZC5mYWxsYmFjaztlPWIubW9kZTtkPXBqKHttb2RlOlwidmlzaWJsZVwiLGNoaWxkcmVuOmQuY2hpbGRyZW59LGUsMCxudWxsKTtmPVRnKGYsZSxnLG51bGwpO2YuZmxhZ3N8PTI7ZC5yZXR1cm49YjtmLnJldHVybj1iO2Quc2libGluZz1mO2IuY2hpbGQ9ZDswIT09KGIubW9kZSYxKSYmVWcoYixhLmNoaWxkLG51bGwsZyk7Yi5jaGlsZC5tZW1vaXplZFN0YXRlPW5qKGcpO2IubWVtb2l6ZWRTdGF0ZT1tajtyZXR1cm4gZn1pZigwPT09KGIubW9kZSYxKSlyZXR1cm4gc2ooYSxiLGcsbnVsbCk7aWYoXCIkIVwiPT09ZS5kYXRhKXtkPWUubmV4dFNpYmxpbmcmJmUubmV4dFNpYmxpbmcuZGF0YXNldDtcbmlmKGQpdmFyIGg9ZC5kZ3N0O2Q9aDtmPUVycm9yKHAoNDE5KSk7ZD1LaShmLGQsdm9pZCAwKTtyZXR1cm4gc2ooYSxiLGcsZCl9aD0wIT09KGcmYS5jaGlsZExhbmVzKTtpZihkaHx8aCl7ZD1RO2lmKG51bGwhPT1kKXtzd2l0Y2goZyYtZyl7Y2FzZSA0OmU9MjticmVhaztjYXNlIDE2OmU9ODticmVhaztjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOmNhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6ZT0zMjticmVhaztjYXNlIDUzNjg3MDkxMjplPTI2ODQzNTQ1NjticmVhaztkZWZhdWx0OmU9MH1lPTAhPT0oZSYoZC5zdXNwZW5kZWRMYW5lc3xnKSk/MDplO1xuMCE9PWUmJmUhPT1mLnJldHJ5TGFuZSYmKGYucmV0cnlMYW5lPWUsaWgoYSxlKSxnaShkLGEsZSwtMSkpfXRqKCk7ZD1LaShFcnJvcihwKDQyMSkpKTtyZXR1cm4gc2ooYSxiLGcsZCl9aWYoXCIkP1wiPT09ZS5kYXRhKXJldHVybiBiLmZsYWdzfD0xMjgsYi5jaGlsZD1hLmNoaWxkLGI9dWouYmluZChudWxsLGEpLGUuX3JlYWN0UmV0cnk9YixudWxsO2E9Zi50cmVlQ29udGV4dDt5Zz1MZihlLm5leHRTaWJsaW5nKTt4Zz1iO0k9ITA7emc9bnVsbDtudWxsIT09YSYmKG9nW3BnKytdPXJnLG9nW3BnKytdPXNnLG9nW3BnKytdPXFnLHJnPWEuaWQsc2c9YS5vdmVyZmxvdyxxZz1iKTtiPXFqKGIsZC5jaGlsZHJlbik7Yi5mbGFnc3w9NDA5NjtyZXR1cm4gYn1mdW5jdGlvbiB2aihhLGIsYyl7YS5sYW5lc3w9Yjt2YXIgZD1hLmFsdGVybmF0ZTtudWxsIT09ZCYmKGQubGFuZXN8PWIpO2JoKGEucmV0dXJuLGIsYyl9XG5mdW5jdGlvbiB3aihhLGIsYyxkLGUpe3ZhciBmPWEubWVtb2l6ZWRTdGF0ZTtudWxsPT09Zj9hLm1lbW9pemVkU3RhdGU9e2lzQmFja3dhcmRzOmIscmVuZGVyaW5nOm51bGwscmVuZGVyaW5nU3RhcnRUaW1lOjAsbGFzdDpkLHRhaWw6Yyx0YWlsTW9kZTplfTooZi5pc0JhY2t3YXJkcz1iLGYucmVuZGVyaW5nPW51bGwsZi5yZW5kZXJpbmdTdGFydFRpbWU9MCxmLmx
25114hc3Q9ZCxmLnRhaWw9YyxmLnRhaWxNb2RlPWUpfVxuZnVuY3Rpb24geGooYSxiLGMpe3ZhciBkPWIucGVuZGluZ1Byb3BzLGU9ZC5yZXZlYWxPcmRlcixmPWQudGFpbDtYaShhLGIsZC5jaGlsZHJlbixjKTtkPUwuY3VycmVudDtpZigwIT09KGQmMikpZD1kJjF8MixiLmZsYWdzfD0xMjg7ZWxzZXtpZihudWxsIT09YSYmMCE9PShhLmZsYWdzJjEyOCkpYTpmb3IoYT1iLmNoaWxkO251bGwhPT1hOyl7aWYoMTM9PT1hLnRhZyludWxsIT09YS5tZW1vaXplZFN0YXRlJiZ2aihhLGMsYik7ZWxzZSBpZigxOT09PWEudGFnKXZqKGEsYyxiKTtlbHNlIGlmKG51bGwhPT1hLmNoaWxkKXthLmNoaWxkLnJldHVybj1hO2E9YS5jaGlsZDtjb250aW51ZX1pZihhPT09YilicmVhayBhO2Zvcig7bnVsbD09PWEuc2libGluZzspe2lmKG51bGw9PT1hLnJldHVybnx8YS5yZXR1cm49PT1iKWJyZWFrIGE7YT1hLnJldHVybn1hLnNpYmxpbmcucmV0dXJuPWEucmV0dXJuO2E9YS5zaWJsaW5nfWQmPTF9RyhMLGQpO2lmKDA9PT0oYi5tb2RlJjEpKWIubWVtb2l6ZWRTdGF0ZT1cbm51bGw7ZWxzZSBzd2l0Y2goZSl7Y2FzZSBcImZvcndhcmRzXCI6Yz1iLmNoaWxkO2ZvcihlPW51bGw7bnVsbCE9PWM7KWE9Yy5hbHRlcm5hdGUsbnVsbCE9PWEmJm51bGw9PT1DaChhKSYmKGU9YyksYz1jLnNpYmxpbmc7Yz1lO251bGw9PT1jPyhlPWIuY2hpbGQsYi5jaGlsZD1udWxsKTooZT1jLnNpYmxpbmcsYy5zaWJsaW5nPW51bGwpO3dqKGIsITEsZSxjLGYpO2JyZWFrO2Nhc2UgXCJiYWNrd2FyZHNcIjpjPW51bGw7ZT1iLmNoaWxkO2ZvcihiLmNoaWxkPW51bGw7bnVsbCE9PWU7KXthPWUuYWx0ZXJuYXRlO2lmKG51bGwhPT1hJiZudWxsPT09Q2goYSkpe2IuY2hpbGQ9ZTticmVha31hPWUuc2libGluZztlLnNpYmxpbmc9YztjPWU7ZT1hfXdqKGIsITAsYyxudWxsLGYpO2JyZWFrO2Nhc2UgXCJ0b2dldGhlclwiOndqKGIsITEsbnVsbCxudWxsLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDpiLm1lbW9pemVkU3RhdGU9bnVsbH1yZXR1cm4gYi5jaGlsZH1cbmZ1bmN0aW9uIGlqKGEsYil7MD09PShiLm1vZGUmMSkmJm51bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpfWZ1bmN0aW9uIFppKGEsYixjKXtudWxsIT09YSYmKGIuZGVwZW5kZW5jaWVzPWEuZGVwZW5kZW5jaWVzKTtyaHw9Yi5sYW5lcztpZigwPT09KGMmYi5jaGlsZExhbmVzKSlyZXR1cm4gbnVsbDtpZihudWxsIT09YSYmYi5jaGlsZCE9PWEuY2hpbGQpdGhyb3cgRXJyb3IocCgxNTMpKTtpZihudWxsIT09Yi5jaGlsZCl7YT1iLmNoaWxkO2M9UGcoYSxhLnBlbmRpbmdQcm9wcyk7Yi5jaGlsZD1jO2ZvcihjLnJldHVybj1iO251bGwhPT1hLnNpYmxpbmc7KWE9YS5zaWJsaW5nLGM9Yy5zaWJsaW5nPVBnKGEsYS5wZW5kaW5nUHJvcHMpLGMucmV0dXJuPWI7Yy5zaWJsaW5nPW51bGx9cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiB5aihhLGIsYyl7c3dpdGNoKGIudGFnKXtjYXNlIDM6a2ooYik7SWcoKTticmVhaztjYXNlIDU6QWgoYik7YnJlYWs7Y2FzZSAxOlpmKGIudHlwZSkmJmNnKGIpO2JyZWFrO2Nhc2UgNDp5aChiLGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6dmFyIGQ9Yi50eXBlLl9jb250ZXh0LGU9Yi5tZW1vaXplZFByb3BzLnZhbHVlO0coV2csZC5fY3VycmVudFZhbHVlKTtkLl9jdXJyZW50VmFsdWU9ZTticmVhaztjYXNlIDEzOmQ9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1kKXtpZihudWxsIT09ZC5kZWh5ZHJhdGVkKXJldHVybiBHKEwsTC5jdXJyZW50JjEpLGIuZmxhZ3N8PTEyOCxudWxsO2lmKDAhPT0oYyZiLmNoaWxkLmNoaWxkTGFuZXMpKXJldHVybiBvaihhLGIsYyk7RyhMLEwuY3VycmVudCYxKTthPVppKGEsYixjKTtyZXR1cm4gbnVsbCE9PWE/YS5zaWJsaW5nOm51bGx9RyhMLEwuY3VycmVudCYxKTticmVhaztjYXNlIDE5OmQ9MCE9PShjJlxuYi5jaGlsZExhbmVzKTtpZigwIT09KGEuZmxhZ3MmMTI4KSl7aWYoZClyZXR1cm4geGooYSxiLGMpO2IuZmxhZ3N8PTEyOH1lPWIubWVtb2l6ZWRTdGF0ZTtudWxsIT09ZSYmKGUucmVuZGVyaW5nPW51bGwsZS50YWlsPW51bGwsZS5sYXN0RWZmZWN0PW51bGwpO0coTCxMLmN1cnJlbnQpO2lmKGQpYnJlYWs7ZWxzZSByZXR1cm4gbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIGIubGFuZXM9MCxkaihhLGIsYyl9cmV0dXJuIFppKGEsYixjKX12YXIgemosQWosQmosQ2o7XG56aj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1iLmNoaWxkO251bGwhPT1jOyl7aWYoNT09PWMudGFnfHw2PT09Yy50YWcpYS5hcHBlbmRDaGlsZChjLnN0YXRlTm9kZSk7ZWxzZSBpZig0IT09Yy50YWcmJm51bGwhPT1jLmNoaWxkKXtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX1pZihjPT09YilicmVhaztmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGMucmV0dXJuPT09YilyZXR1cm47Yz1jLnJldHVybn1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2M9Yy5zaWJsaW5nfX07QWo9ZnVuY3Rpb24oKXt9O1xuQmo9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YS5tZW1vaXplZFByb3BzO2lmKGUhPT1kKXthPWIuc3RhdGVOb2RlO3hoKHVoLmN1cnJlbnQpO3ZhciBmPW51bGw7c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOmU9WWEoYSxlKTtkPVlhKGEsZCk7Zj1bXTticmVhaztjYXNlIFwic2VsZWN0XCI6ZT1BKHt9LGUse3ZhbHVlOnZvaWQgMH0pO2Q9QSh7fSxkLHt2YWx1ZTp2b2lkIDB9KTtmPVtdO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmU9Z2IoYSxlKTtkPWdiKGEsZCk7Zj1bXTticmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLm9uQ2xpY2smJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLm9uQ2xpY2smJihhLm9uY2xpY2s9QmYpfXViKGMsZCk7dmFyIGc7Yz1udWxsO2ZvcihsIGluIGUpaWYoIWQuaGFzT3duUHJvcGVydHkobCkmJmUuaGFzT3duUHJvcGVydHkobCkmJm51bGwhPWVbbF0paWYoXCJzdHlsZVwiPT09bCl7dmFyIGg9ZVtsXTtmb3IoZyBpbiBoKWguaGFzT3duUHJvcGVydHkoZykmJlxuKGN8fChjPXt9KSxjW2ddPVwiXCIpfWVsc2VcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIhPT1sJiZcImNoaWxkcmVuXCIhPT1sJiZcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09bCYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWwmJlwiYXV0b0ZvY3VzXCIhPT1sJiYoZWEuaGFzT3duUHJvcGVydHkobCk/Znx8KGY9W10pOihmPWZ8fFtdKS5wdXNoKGwsbnVsbCkpO2ZvcihsIGluIGQpe3ZhciBrPWRbbF07aD1udWxsIT1lP2VbbF06dm9pZCAwO2lmKGQuaGFzT3duUHJvcGVydHkobCkmJmshPT1oJiYobnVsbCE9a3x8bnVsbCE9aCkpaWYoXCJzdHlsZVwiPT09bClpZihoKXtmb3IoZyBpbiBoKSF
25114oLmhhc093blByb3BlcnR5KGcpfHxrJiZrLmhhc093blByb3BlcnR5KGcpfHwoY3x8KGM9e30pLGNbZ109XCJcIik7Zm9yKGcgaW4gaylrLmhhc093blByb3BlcnR5KGcpJiZoW2ddIT09a1tnXSYmKGN8fChjPXt9KSxjW2ddPWtbZ10pfWVsc2UgY3x8KGZ8fChmPVtdKSxmLnB1c2gobCxcbmMpKSxjPWs7ZWxzZVwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIj09PWw/KGs9az9rLl9faHRtbDp2b2lkIDAsaD1oP2guX19odG1sOnZvaWQgMCxudWxsIT1rJiZoIT09ayYmKGY9Znx8W10pLnB1c2gobCxrKSk6XCJjaGlsZHJlblwiPT09bD9cInN0cmluZ1wiIT09dHlwZW9mIGsmJlwibnVtYmVyXCIhPT10eXBlb2Yga3x8KGY9Znx8W10pLnB1c2gobCxcIlwiK2spOlwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCIhPT1sJiZcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiIT09bCYmKGVhLmhhc093blByb3BlcnR5KGwpPyhudWxsIT1rJiZcIm9uU2Nyb2xsXCI9PT1sJiZEKFwic2Nyb2xsXCIsYSksZnx8aD09PWt8fChmPVtdKSk6KGY9Znx8W10pLnB1c2gobCxrKSl9YyYmKGY9Znx8W10pLnB1c2goXCJzdHlsZVwiLGMpO3ZhciBsPWY7aWYoYi51cGRhdGVRdWV1ZT1sKWIuZmxhZ3N8PTR9fTtDaj1mdW5jdGlvbihhLGIsYyxkKXtjIT09ZCYmKGIuZmxhZ3N8PTQpfTtcbmZ1bmN0aW9uIERqKGEsYil7aWYoIUkpc3dpdGNoKGEudGFpbE1vZGUpe2Nhc2UgXCJoaWRkZW5cIjpiPWEudGFpbDtmb3IodmFyIGM9bnVsbDtudWxsIT09YjspbnVsbCE9PWIuYWx0ZXJuYXRlJiYoYz1iKSxiPWIuc2libGluZztudWxsPT09Yz9hLnRhaWw9bnVsbDpjLnNpYmxpbmc9bnVsbDticmVhaztjYXNlIFwiY29sbGFwc2VkXCI6Yz1hLnRhaWw7Zm9yKHZhciBkPW51bGw7bnVsbCE9PWM7KW51bGwhPT1jLmFsdGVybmF0ZSYmKGQ9YyksYz1jLnNpYmxpbmc7bnVsbD09PWQ/Ynx8bnVsbD09PWEudGFpbD9hLnRhaWw9bnVsbDphLnRhaWwuc2libGluZz1udWxsOmQuc2libGluZz1udWxsfX1cbmZ1bmN0aW9uIFMoYSl7dmFyIGI9bnVsbCE9PWEuYWx0ZXJuYXRlJiZhLmFsdGVybmF0ZS5jaGlsZD09PWEuY2hpbGQsYz0wLGQ9MDtpZihiKWZvcih2YXIgZT1hLmNoaWxkO251bGwhPT1lOyljfD1lLmxhbmVzfGUuY2hpbGRMYW5lcyxkfD1lLnN1YnRyZWVGbGFncyYxNDY4MDA2NCxkfD1lLmZsYWdzJjE0NjgwMDY0LGUucmV0dXJuPWEsZT1lLnNpYmxpbmc7ZWxzZSBmb3IoZT1hLmNoaWxkO251bGwhPT1lOyljfD1lLmxhbmVzfGUuY2hpbGRMYW5lcyxkfD1lLnN1YnRyZWVGbGFncyxkfD1lLmZsYWdzLGUucmV0dXJuPWEsZT1lLnNpYmxpbmc7YS5zdWJ0cmVlRmxhZ3N8PWQ7YS5jaGlsZExhbmVzPWM7cmV0dXJuIGJ9XG5mdW5jdGlvbiBFaihhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHM7d2coYik7c3dpdGNoKGIudGFnKXtjYXNlIDI6Y2FzZSAxNjpjYXNlIDE1OmNhc2UgMDpjYXNlIDExOmNhc2UgNzpjYXNlIDg6Y2FzZSAxMjpjYXNlIDk6Y2FzZSAxNDpyZXR1cm4gUyhiKSxudWxsO2Nhc2UgMTpyZXR1cm4gWmYoYi50eXBlKSYmJGYoKSxTKGIpLG51bGw7Y2FzZSAzOmQ9Yi5zdGF0ZU5vZGU7emgoKTtFKFdmKTtFKEgpO0VoKCk7ZC5wZW5kaW5nQ29udGV4dCYmKGQuY29udGV4dD1kLnBlbmRpbmdDb250ZXh0LGQucGVuZGluZ0NvbnRleHQ9bnVsbCk7aWYobnVsbD09PWF8fG51bGw9PT1hLmNoaWxkKUdnKGIpP2IuZmxhZ3N8PTQ6bnVsbD09PWF8fGEubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQmJjA9PT0oYi5mbGFncyYyNTYpfHwoYi5mbGFnc3w9MTAyNCxudWxsIT09emcmJihGaih6Zyksemc9bnVsbCkpO0FqKGEsYik7UyhiKTtyZXR1cm4gbnVsbDtjYXNlIDU6QmgoYik7dmFyIGU9eGgod2guY3VycmVudCk7XG5jPWIudHlwZTtpZihudWxsIT09YSYmbnVsbCE9Yi5zdGF0ZU5vZGUpQmooYSxiLGMsZCxlKSxhLnJlZiE9PWIucmVmJiYoYi5mbGFnc3w9NTEyLGIuZmxhZ3N8PTIwOTcxNTIpO2Vsc2V7aWYoIWQpe2lmKG51bGw9PT1iLnN0YXRlTm9kZSl0aHJvdyBFcnJvcihwKDE2NikpO1MoYik7cmV0dXJuIG51bGx9YT14aCh1aC5jdXJyZW50KTtpZihHZyhiKSl7ZD1iLnN0YXRlTm9kZTtjPWIudHlwZTt2YXIgZj1iLm1lbW9pemVkUHJvcHM7ZFtPZl09YjtkW1BmXT1mO2E9MCE9PShiLm1vZGUmMSk7c3dpdGNoKGMpe2Nhc2UgXCJkaWFsb2dcIjpEKFwiY2FuY2VsXCIsZCk7RChcImNsb3NlXCIsZCk7YnJlYWs7Y2FzZSBcImlmcmFtZVwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwiZW1iZWRcIjpEKFwibG9hZFwiLGQpO2JyZWFrO2Nhc2UgXCJ2aWRlb1wiOmNhc2UgXCJhdWRpb1wiOmZvcihlPTA7ZTxsZi5sZW5ndGg7ZSsrKUQobGZbZV0sZCk7YnJlYWs7Y2FzZSBcInNvdXJjZVwiOkQoXCJlcnJvclwiLGQpO2JyZWFrO2Nhc2UgXCJpbWdcIjpjYXNlIFwiaW1hZ2VcIjpjYXNlIFwibGlua1wiOkQoXCJlcnJvclwiLFxuZCk7RChcImxvYWRcIixkKTticmVhaztjYXNlIFwiZGV0YWlsc1wiOkQoXCJ0b2dnbGVcIixkKTticmVhaztjYXNlIFwiaW5wdXRcIjpaYShkLGYpO0QoXCJpbnZhbGlkXCIsZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmQuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFmLm11bHRpcGxlfTtEKFwiaW52YWxpZFwiLGQpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmhiKGQsZiksRChcImludmFsaWRcIixkKX11YihjLGYpO2U9bnVsbDtmb3IodmFyIGcgaW4gZilpZihmLmhhc093blByb3BlcnR5KGcpKXt2YXIgaD1mW2ddO1wiY2hpbGRyZW5cIj09PWc/XCJzdHJpbmdcIj09PXR5cGVvZiBoP2QudGV4dENvbnRlbnQhPT1oJiYoITAhPT1mLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyYmQWYoZC50ZXh0Q29udGVudCxoLGEpLGU9W1wiY2hpbGRyZW5cIixoXSk6XCJudW1iZXJcIj09PXR5cGVvZiBoJiZkLnRleHRDb250ZW50IT09XCJcIitoJiYoITAhPT1mLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyYmQWYoZC50ZXh0Q29udGVudCxcbmgsYSksZT1bXCJjaGlsZHJlblwiLFwiXCIraF0pOmVhLmhhc093blByb3BlcnR5KGcpJiZudWxsIT1oJiZcIm9uU2Nyb2xsXCI9PT1nJiZEKFwic2Nyb2xsXCIsZCl9c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOlZhKGQpO2RiKGQsZiwhMCk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6VmEoZCk7amIoZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmNhc2UgXCJvcHRpb25cIjpicmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLm9uQ2xpY2smJihkLm9uY2xpY2s9QmYpfWQ9ZTtiLnVwZGF0ZVF1ZXVlPWQ7bnVsbCE9PWQmJihiLmZsYWdzfD00KX1lbHNle2c9OT09PWUubm9kZVR5cGU/ZTplLm93bmVyRG9jdW1lbnQ7XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1hJiYoYT1rYihjKSk7XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1hP1wic2NyaXB0XCI9PT1jPyhhPWcuY3JlYXRlRWxlbWVudChcImRpdlwiKSxhLmlubmVySFRNTD1cIjxzY3JpcHQ+XFx4M2Mvc2NyaXB0PlwiLGE9YS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpKTpcblwic3RyaW5nXCI9PT10eXBlb2YgZC5pcz9hPWcuY3JlYXRlRWxlbWVudChjLHtpczpkLmlzfSk6KGE9Zy5jcmVhdGVFbGVtZW50KGMpLFwic2VsZWN0XCI9PT1jJiYoZz1hLGQubXVsdGlwbGU/Zy5tdWx0aXBsZT0hMDpkLnNpemUmJihnLnNpemU9ZC5zaXpl
25114KSkpOmE9Zy5jcmVhdGVFbGVtZW50TlMoYSxjKTthW09mXT1iO2FbUGZdPWQ7emooYSxiLCExLCExKTtiLnN0YXRlTm9kZT1hO2E6e2c9dmIoYyxkKTtzd2l0Y2goYyl7Y2FzZSBcImRpYWxvZ1wiOkQoXCJjYW5jZWxcIixhKTtEKFwiY2xvc2VcIixhKTtlPWQ7YnJlYWs7Y2FzZSBcImlmcmFtZVwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwiZW1iZWRcIjpEKFwibG9hZFwiLGEpO2U9ZDticmVhaztjYXNlIFwidmlkZW9cIjpjYXNlIFwiYXVkaW9cIjpmb3IoZT0wO2U8bGYubGVuZ3RoO2UrKylEKGxmW2VdLGEpO2U9ZDticmVhaztjYXNlIFwic291cmNlXCI6RChcImVycm9yXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJpbWdcIjpjYXNlIFwiaW1hZ2VcIjpjYXNlIFwibGlua1wiOkQoXCJlcnJvclwiLFxuYSk7RChcImxvYWRcIixhKTtlPWQ7YnJlYWs7Y2FzZSBcImRldGFpbHNcIjpEKFwidG9nZ2xlXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJpbnB1dFwiOlphKGEsZCk7ZT1ZYShhLGQpO0QoXCJpbnZhbGlkXCIsYSk7YnJlYWs7Y2FzZSBcIm9wdGlvblwiOmU9ZDticmVhaztjYXNlIFwic2VsZWN0XCI6YS5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIWQubXVsdGlwbGV9O2U9QSh7fSxkLHt2YWx1ZTp2b2lkIDB9KTtEKFwiaW52YWxpZFwiLGEpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmhiKGEsZCk7ZT1nYihhLGQpO0QoXCJpbnZhbGlkXCIsYSk7YnJlYWs7ZGVmYXVsdDplPWR9dWIoYyxlKTtoPWU7Zm9yKGYgaW4gaClpZihoLmhhc093blByb3BlcnR5KGYpKXt2YXIgaz1oW2ZdO1wic3R5bGVcIj09PWY/c2IoYSxrKTpcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1mPyhrPWs/ay5fX2h0bWw6dm9pZCAwLG51bGwhPWsmJm5iKGEsaykpOlwiY2hpbGRyZW5cIj09PWY/XCJzdHJpbmdcIj09PXR5cGVvZiBrPyhcInRleHRhcmVhXCIhPT1cbmN8fFwiXCIhPT1rKSYmb2IoYSxrKTpcIm51bWJlclwiPT09dHlwZW9mIGsmJm9iKGEsXCJcIitrKTpcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09ZiYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWYmJlwiYXV0b0ZvY3VzXCIhPT1mJiYoZWEuaGFzT3duUHJvcGVydHkoZik/bnVsbCE9ayYmXCJvblNjcm9sbFwiPT09ZiYmRChcInNjcm9sbFwiLGEpOm51bGwhPWsmJnRhKGEsZixrLGcpKX1zd2l0Y2goYyl7Y2FzZSBcImlucHV0XCI6VmEoYSk7ZGIoYSxkLCExKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpWYShhKTtqYihhKTticmVhaztjYXNlIFwib3B0aW9uXCI6bnVsbCE9ZC52YWx1ZSYmYS5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLFwiXCIrU2EoZC52YWx1ZSkpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjphLm11bHRpcGxlPSEhZC5tdWx0aXBsZTtmPWQudmFsdWU7bnVsbCE9Zj9mYihhLCEhZC5tdWx0aXBsZSxmLCExKTpudWxsIT1kLmRlZmF1bHRWYWx1ZSYmZmIoYSwhIWQubXVsdGlwbGUsZC5kZWZhdWx0VmFsdWUsXG4hMCk7YnJlYWs7ZGVmYXVsdDpcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5vbkNsaWNrJiYoYS5vbmNsaWNrPUJmKX1zd2l0Y2goYyl7Y2FzZSBcImJ1dHRvblwiOmNhc2UgXCJpbnB1dFwiOmNhc2UgXCJzZWxlY3RcIjpjYXNlIFwidGV4dGFyZWFcIjpkPSEhZC5hdXRvRm9jdXM7YnJlYWsgYTtjYXNlIFwiaW1nXCI6ZD0hMDticmVhayBhO2RlZmF1bHQ6ZD0hMX19ZCYmKGIuZmxhZ3N8PTQpfW51bGwhPT1iLnJlZiYmKGIuZmxhZ3N8PTUxMixiLmZsYWdzfD0yMDk3MTUyKX1TKGIpO3JldHVybiBudWxsO2Nhc2UgNjppZihhJiZudWxsIT1iLnN0YXRlTm9kZSlDaihhLGIsYS5tZW1vaXplZFByb3BzLGQpO2Vsc2V7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBkJiZudWxsPT09Yi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IocCgxNjYpKTtjPXhoKHdoLmN1cnJlbnQpO3hoKHVoLmN1cnJlbnQpO2lmKEdnKGIpKXtkPWIuc3RhdGVOb2RlO2M9Yi5tZW1vaXplZFByb3BzO2RbT2ZdPWI7aWYoZj1kLm5vZGVWYWx1ZSE9PWMpaWYoYT1cbnhnLG51bGwhPT1hKXN3aXRjaChhLnRhZyl7Y2FzZSAzOkFmKGQubm9kZVZhbHVlLGMsMCE9PShhLm1vZGUmMSkpO2JyZWFrO2Nhc2UgNTohMCE9PWEubWVtb2l6ZWRQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcmJkFmKGQubm9kZVZhbHVlLGMsMCE9PShhLm1vZGUmMSkpfWYmJihiLmZsYWdzfD00KX1lbHNlIGQ9KDk9PT1jLm5vZGVUeXBlP2M6Yy5vd25lckRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZShkKSxkW09mXT1iLGIuc3RhdGVOb2RlPWR9UyhiKTtyZXR1cm4gbnVsbDtjYXNlIDEzOkUoTCk7ZD1iLm1lbW9pemVkU3RhdGU7aWYobnVsbD09PWF8fG51bGwhPT1hLm1lbW9pemVkU3RhdGUmJm51bGwhPT1hLm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCl7aWYoSSYmbnVsbCE9PXlnJiYwIT09KGIubW9kZSYxKSYmMD09PShiLmZsYWdzJjEyOCkpSGcoKSxJZygpLGIuZmxhZ3N8PTk4NTYwLGY9ITE7ZWxzZSBpZihmPUdnKGIpLG51bGwhPT1kJiZudWxsIT09ZC5kZWh5ZHJhdGVkKXtpZihudWxsPT09XG5hKXtpZighZil0aHJvdyBFcnJvcihwKDMxOCkpO2Y9Yi5tZW1vaXplZFN0YXRlO2Y9bnVsbCE9PWY/Zi5kZWh5ZHJhdGVkOm51bGw7aWYoIWYpdGhyb3cgRXJyb3IocCgzMTcpKTtmW09mXT1ifWVsc2UgSWcoKSwwPT09KGIuZmxhZ3MmMTI4KSYmKGIubWVtb2l6ZWRTdGF0ZT1udWxsKSxiLmZsYWdzfD00O1MoYik7Zj0hMX1lbHNlIG51bGwhPT16ZyYmKEZqKHpnKSx6Zz1udWxsKSxmPSEwO2lmKCFmKXJldHVybi
25114BiLmZsYWdzJjY1NTM2P2I6bnVsbH1pZigwIT09KGIuZmxhZ3MmMTI4KSlyZXR1cm4gYi5sYW5lcz1jLGI7ZD1udWxsIT09ZDtkIT09KG51bGwhPT1hJiZudWxsIT09YS5tZW1vaXplZFN0YXRlKSYmZCYmKGIuY2hpbGQuZmxhZ3N8PTgxOTIsMCE9PShiLm1vZGUmMSkmJihudWxsPT09YXx8MCE9PShMLmN1cnJlbnQmMSk/MD09PVQmJihUPTMpOnRqKCkpKTtudWxsIT09Yi51cGRhdGVRdWV1ZSYmKGIuZmxhZ3N8PTQpO1MoYik7cmV0dXJuIG51bGw7Y2FzZSA0OnJldHVybiB6aCgpLFxuQWooYSxiKSxudWxsPT09YSYmc2YoYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksUyhiKSxudWxsO2Nhc2UgMTA6cmV0dXJuIGFoKGIudHlwZS5fY29udGV4dCksUyhiKSxudWxsO2Nhc2UgMTc6cmV0dXJuIFpmKGIudHlwZSkmJiRmKCksUyhiKSxudWxsO2Nhc2UgMTk6RShMKTtmPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsPT09ZilyZXR1cm4gUyhiKSxudWxsO2Q9MCE9PShiLmZsYWdzJjEyOCk7Zz1mLnJlbmRlcmluZztpZihudWxsPT09ZylpZihkKURqKGYsITEpO2Vsc2V7aWYoMCE9PVR8fG51bGwhPT1hJiYwIT09KGEuZmxhZ3MmMTI4KSlmb3IoYT1iLmNoaWxkO251bGwhPT1hOyl7Zz1DaChhKTtpZihudWxsIT09Zyl7Yi5mbGFnc3w9MTI4O0RqKGYsITEpO2Q9Zy51cGRhdGVRdWV1ZTtudWxsIT09ZCYmKGIudXBkYXRlUXVldWU9ZCxiLmZsYWdzfD00KTtiLnN1YnRyZWVGbGFncz0wO2Q9Yztmb3IoYz1iLmNoaWxkO251bGwhPT1jOylmPWMsYT1kLGYuZmxhZ3MmPTE0NjgwMDY2LFxuZz1mLmFsdGVybmF0ZSxudWxsPT09Zz8oZi5jaGlsZExhbmVzPTAsZi5sYW5lcz1hLGYuY2hpbGQ9bnVsbCxmLnN1YnRyZWVGbGFncz0wLGYubWVtb2l6ZWRQcm9wcz1udWxsLGYubWVtb2l6ZWRTdGF0ZT1udWxsLGYudXBkYXRlUXVldWU9bnVsbCxmLmRlcGVuZGVuY2llcz1udWxsLGYuc3RhdGVOb2RlPW51bGwpOihmLmNoaWxkTGFuZXM9Zy5jaGlsZExhbmVzLGYubGFuZXM9Zy5sYW5lcyxmLmNoaWxkPWcuY2hpbGQsZi5zdWJ0cmVlRmxhZ3M9MCxmLmRlbGV0aW9ucz1udWxsLGYubWVtb2l6ZWRQcm9wcz1nLm1lbW9pemVkUHJvcHMsZi5tZW1vaXplZFN0YXRlPWcubWVtb2l6ZWRTdGF0ZSxmLnVwZGF0ZVF1ZXVlPWcudXBkYXRlUXVldWUsZi50eXBlPWcudHlwZSxhPWcuZGVwZW5kZW5jaWVzLGYuZGVwZW5kZW5jaWVzPW51bGw9PT1hP251bGw6e2xhbmVzOmEubGFuZXMsZmlyc3RDb250ZXh0OmEuZmlyc3RDb250ZXh0fSksYz1jLnNpYmxpbmc7RyhMLEwuY3VycmVudCYxfDIpO3JldHVybiBiLmNoaWxkfWE9XG5hLnNpYmxpbmd9bnVsbCE9PWYudGFpbCYmQigpPkdqJiYoYi5mbGFnc3w9MTI4LGQ9ITAsRGooZiwhMSksYi5sYW5lcz00MTk0MzA0KX1lbHNle2lmKCFkKWlmKGE9Q2goZyksbnVsbCE9PWEpe2lmKGIuZmxhZ3N8PTEyOCxkPSEwLGM9YS51cGRhdGVRdWV1ZSxudWxsIT09YyYmKGIudXBkYXRlUXVldWU9YyxiLmZsYWdzfD00KSxEaihmLCEwKSxudWxsPT09Zi50YWlsJiZcImhpZGRlblwiPT09Zi50YWlsTW9kZSYmIWcuYWx0ZXJuYXRlJiYhSSlyZXR1cm4gUyhiKSxudWxsfWVsc2UgMipCKCktZi5yZW5kZXJpbmdTdGFydFRpbWU+R2omJjEwNzM3NDE4MjQhPT1jJiYoYi5mbGFnc3w9MTI4LGQ9ITAsRGooZiwhMSksYi5sYW5lcz00MTk0MzA0KTtmLmlzQmFja3dhcmRzPyhnLnNpYmxpbmc9Yi5jaGlsZCxiLmNoaWxkPWcpOihjPWYubGFzdCxudWxsIT09Yz9jLnNpYmxpbmc9ZzpiLmNoaWxkPWcsZi5sYXN0PWcpfWlmKG51bGwhPT1mLnRhaWwpcmV0dXJuIGI9Zi50YWlsLGYucmVuZGVyaW5nPVxuYixmLnRhaWw9Yi5zaWJsaW5nLGYucmVuZGVyaW5nU3RhcnRUaW1lPUIoKSxiLnNpYmxpbmc9bnVsbCxjPUwuY3VycmVudCxHKEwsZD9jJjF8MjpjJjEpLGI7UyhiKTtyZXR1cm4gbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIEhqKCksZD1udWxsIT09Yi5tZW1vaXplZFN0YXRlLG51bGwhPT1hJiZudWxsIT09YS5tZW1vaXplZFN0YXRlIT09ZCYmKGIuZmxhZ3N8PTgxOTIpLGQmJjAhPT0oYi5tb2RlJjEpPzAhPT0oZmomMTA3Mzc0MTgyNCkmJihTKGIpLGIuc3VidHJlZUZsYWdzJjYmJihiLmZsYWdzfD04MTkyKSk6UyhiKSxudWxsO2Nhc2UgMjQ6cmV0dXJuIG51bGw7Y2FzZSAyNTpyZXR1cm4gbnVsbH10aHJvdyBFcnJvcihwKDE1NixiLnRhZykpO31cbmZ1bmN0aW9uIElqKGEsYil7d2coYik7c3dpdGNoKGIudGFnKXtjYXNlIDE6cmV0dXJuIFpmKGIudHlwZSkmJiRmKCksYT1iLmZsYWdzLGEmNjU1MzY/KGIuZmxhZ3M9YSYtNjU1Mzd8MTI4LGIpOm51bGw7Y2FzZSAzOnJldHVybiB6aCgpLEUoV2YpLEUoSCksRWgoKSxhPWIuZmxhZ3MsMCE9PShhJjY1NTM2KSYmMD09PShhJjEyOCk/KGIuZmxhZ3M9YSYtNjU1Mzd8MTI4LGIpOm51bGw7Y2FzZSA1OnJldHVybiBCaChiKSxudWxsO2Nhc2UgMTM6RShMKTthPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YSYmbnVsbCE9PWEuZGVoeWRyYXRlZCl7aWYobnVsbD09PWIuYWx0ZXJuYXRlKXRocm93IEVycm9yKHAoMzQwKSk7SWcoKX1hPWIuZmxhZ3M7cmV0dXJuIGEmNjU1MzY/KGIuZmxhZ3M9YSYtNjU1Mzd8MTI4LGIpOm51bGw7Y2FzZSAxOTpyZXR1cm4gRShMKSxudWxsO2Nhc2UgNDpyZXR1cm4gemgoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIGFoKGIudHlwZS5fY29udGV4dCksbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIEhqKCksXG5udWxsO2Nhc2UgMjQ6cmV0dXJuIG51bGw7ZGVmYXVsdDpyZXR1cm4gbnVsbH19dmFyIEpqPSExLFU9ITEsS2o9XCJmdW5jdGlvblwiPT09dHlwZW9mIFdlYWtTZXQ/V2Vha1NldDpTZXQsVj1udWxsO2Z1bmN0aW9uIExqKGEsYil7dmFyIGM9YS5yZWY7aWYobnVsbCE9PWMpaWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGMpdHJ5e2MobnVsbCl9Y2F0Y2goZCl7VyhhLGIsZCl9ZWxzZSBjLmN1cnJlbnQ9bnVsbH1mdW5jdGlvbiBNaihhLGIsYyl7dHJ5e2MoKX1jYXRjaChkKXtXKGEsYixkKX19dmFyIE5qPSExO1xuZnVuY3Rpb24gT2ooYSxiKXtDZj1kZDthPU1lKCk7aWYoTmUoYSkpe2lmKFwic2VsZWN0aW9uU3RhcnRcImluIGEpdmFyIGM9e3N0YXJ0OmEuc2VsZWN0aW9uU3RhcnQsZW5kOmEuc2VsZWN0aW9uRW5kfTtlbHNlIGE6e2M9KGM9YS5vd25lckRvY3VtZW50KSYmYy5kZWZhdWx0Vmlld3x8d2luZG93O3ZhciBkPWMuZ2V0U2VsZWN0aW9uJiZjLmdldFNlbGVjdGlvbigpO2lmKGQmJjAhPT1kLnJhbmdlQ291bnQpe2M9ZC5hbmNob3JOb2RlO3ZhciBlPWQuYW5jaG9yT2Zmc2V0LGY9ZC5mb2N1c05vZGU7ZD1kLmZvY3VzT2Zmc2V0O3RyeXtjLm5vZGVUeXBlLGYubm9kZVR5cGV9Y2F0Y2goRil7Yz1udWxsO2JyZWFrIGF9dmFyIGc9MCxoPS0xLGs9LTEsbD0wLG09MCxxPWEscj1udWxsO2I6Zm9yKDs7KXtmb3IodmFyIHk7Oyl7cSE9PWN8fDAhPT1lJiYzIT09cS5ub2RlVHlwZXx8KGg9ZytlKTtxIT09Znx8MCE9PWQmJjMhPT1xLm5vZGVUeXBlfHwoaz1nK2QpOzM9PT1xLm5vZGVUeXBlJiYoZys9XG5xLm5vZGVWYWx1ZS
251145sZW5ndGgpO2lmKG51bGw9PT0oeT1xLmZpcnN0Q2hpbGQpKWJyZWFrO3I9cTtxPXl9Zm9yKDs7KXtpZihxPT09YSlicmVhayBiO3I9PT1jJiYrK2w9PT1lJiYoaD1nKTtyPT09ZiYmKyttPT09ZCYmKGs9Zyk7aWYobnVsbCE9PSh5PXEubmV4dFNpYmxpbmcpKWJyZWFrO3E9cjtyPXEucGFyZW50Tm9kZX1xPXl9Yz0tMT09PWh8fC0xPT09az9udWxsOntzdGFydDpoLGVuZDprfX1lbHNlIGM9bnVsbH1jPWN8fHtzdGFydDowLGVuZDowfX1lbHNlIGM9bnVsbDtEZj17Zm9jdXNlZEVsZW06YSxzZWxlY3Rpb25SYW5nZTpjfTtkZD0hMTtmb3IoVj1iO251bGwhPT1WOylpZihiPVYsYT1iLmNoaWxkLDAhPT0oYi5zdWJ0cmVlRmxhZ3MmMTAyOCkmJm51bGwhPT1hKWEucmV0dXJuPWIsVj1hO2Vsc2UgZm9yKDtudWxsIT09Vjspe2I9Vjt0cnl7dmFyIG49Yi5hbHRlcm5hdGU7aWYoMCE9PShiLmZsYWdzJjEwMjQpKXN3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpicmVhaztcbmNhc2UgMTppZihudWxsIT09bil7dmFyIHQ9bi5tZW1vaXplZFByb3BzLEo9bi5tZW1vaXplZFN0YXRlLHg9Yi5zdGF0ZU5vZGUsdz14LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGIuZWxlbWVudFR5cGU9PT1iLnR5cGU/dDpDaShiLnR5cGUsdCksSik7eC5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZT13fWJyZWFrO2Nhc2UgMzp2YXIgdT1iLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOzE9PT11Lm5vZGVUeXBlP3UudGV4dENvbnRlbnQ9XCJcIjo5PT09dS5ub2RlVHlwZSYmdS5kb2N1bWVudEVsZW1lbnQmJnUucmVtb3ZlQ2hpbGQodS5kb2N1bWVudEVsZW1lbnQpO2JyZWFrO2Nhc2UgNTpjYXNlIDY6Y2FzZSA0OmNhc2UgMTc6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihwKDE2MykpO319Y2F0Y2goRil7VyhiLGIucmV0dXJuLEYpfWE9Yi5zaWJsaW5nO2lmKG51bGwhPT1hKXthLnJldHVybj1iLnJldHVybjtWPWE7YnJlYWt9Vj1iLnJldHVybn1uPU5qO05qPSExO3JldHVybiBufVxuZnVuY3Rpb24gUGooYSxiLGMpe3ZhciBkPWIudXBkYXRlUXVldWU7ZD1udWxsIT09ZD9kLmxhc3RFZmZlY3Q6bnVsbDtpZihudWxsIT09ZCl7dmFyIGU9ZD1kLm5leHQ7ZG97aWYoKGUudGFnJmEpPT09YSl7dmFyIGY9ZS5kZXN0cm95O2UuZGVzdHJveT12b2lkIDA7dm9pZCAwIT09ZiYmTWooYixjLGYpfWU9ZS5uZXh0fXdoaWxlKGUhPT1kKX19ZnVuY3Rpb24gUWooYSxiKXtiPWIudXBkYXRlUXVldWU7Yj1udWxsIT09Yj9iLmxhc3RFZmZlY3Q6bnVsbDtpZihudWxsIT09Yil7dmFyIGM9Yj1iLm5leHQ7ZG97aWYoKGMudGFnJmEpPT09YSl7dmFyIGQ9Yy5jcmVhdGU7Yy5kZXN0cm95PWQoKX1jPWMubmV4dH13aGlsZShjIT09Yil9fWZ1bmN0aW9uIFJqKGEpe3ZhciBiPWEucmVmO2lmKG51bGwhPT1iKXt2YXIgYz1hLnN0YXRlTm9kZTtzd2l0Y2goYS50YWcpe2Nhc2UgNTphPWM7YnJlYWs7ZGVmYXVsdDphPWN9XCJmdW5jdGlvblwiPT09dHlwZW9mIGI/YihhKTpiLmN1cnJlbnQ9YX19XG5mdW5jdGlvbiBTaihhKXt2YXIgYj1hLmFsdGVybmF0ZTtudWxsIT09YiYmKGEuYWx0ZXJuYXRlPW51bGwsU2ooYikpO2EuY2hpbGQ9bnVsbDthLmRlbGV0aW9ucz1udWxsO2Euc2libGluZz1udWxsOzU9PT1hLnRhZyYmKGI9YS5zdGF0ZU5vZGUsbnVsbCE9PWImJihkZWxldGUgYltPZl0sZGVsZXRlIGJbUGZdLGRlbGV0ZSBiW29mXSxkZWxldGUgYltRZl0sZGVsZXRlIGJbUmZdKSk7YS5zdGF0ZU5vZGU9bnVsbDthLnJldHVybj1udWxsO2EuZGVwZW5kZW5jaWVzPW51bGw7YS5tZW1vaXplZFByb3BzPW51bGw7YS5tZW1vaXplZFN0YXRlPW51bGw7YS5wZW5kaW5nUHJvcHM9bnVsbDthLnN0YXRlTm9kZT1udWxsO2EudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBUaihhKXtyZXR1cm4gNT09PWEudGFnfHwzPT09YS50YWd8fDQ9PT1hLnRhZ31cbmZ1bmN0aW9uIFVqKGEpe2E6Zm9yKDs7KXtmb3IoO251bGw9PT1hLnNpYmxpbmc7KXtpZihudWxsPT09YS5yZXR1cm58fFRqKGEucmV0dXJuKSlyZXR1cm4gbnVsbDthPWEucmV0dXJufWEuc2libGluZy5yZXR1cm49YS5yZXR1cm47Zm9yKGE9YS5zaWJsaW5nOzUhPT1hLnRhZyYmNiE9PWEudGFnJiYxOCE9PWEudGFnOyl7aWYoYS5mbGFncyYyKWNvbnRpbnVlIGE7aWYobnVsbD09PWEuY2hpbGR8fDQ9PT1hLnRhZyljb250aW51ZSBhO2Vsc2UgYS5jaGlsZC5yZXR1cm49YSxhPWEuY2hpbGR9aWYoIShhLmZsYWdzJjIpKXJldHVybiBhLnN0YXRlTm9kZX19XG5mdW5jdGlvbiBWaihhLGIsYyl7dmFyIGQ9YS50YWc7aWYoNT09PWR8fDY9PT1kKWE9YS5zdGF0ZU5vZGUsYj84PT09Yy5ub2RlVHlwZT9jLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsYik6Yy5pbnNlcnRCZWZvcmUoYSxiKTooOD09PWMubm9kZVR5cGU/KGI9Yy5wYXJlbnROb2RlLGIuaW5zZXJ0QmVmb3JlKGEsYykpOihiPWMsYi5hcHBlbmRDaGlsZChhKSksYz1jLl9yZWFjdFJvb3RDb250YWluZXIsbnVsbCE9PWMmJnZvaWQgMCE9PWN8fG51bGwhPT1iLm9uY2xpY2t8fChiLm9uY2xpY2s9QmYpKTtlbHNlIGlmKDQhPT1kJiYoYT1hLmNoaWxkLG51bGwhPT1hKSlmb3IoVmooYSxiLGMpLGE9YS5zaWJsaW5nO251bGwhPT1hOylWaihhLGIsYyksYT1hLnNpYmxpbmd9XG5mdW5jdGlvbiBXaihhLGIsYyl7dmFyIGQ9YS50YWc7aWYoNT09PWR8fDY9PT1kKWE9YS5zdGF0ZU5vZGUsYj9jLmluc2VydEJlZm9yZShhLGIpOmMuYXBwZW5kQ2hpbGQoYSk7ZWxzZSBpZig0IT09ZCYmKGE9YS5jaGlsZCxudWxsIT09YSkpZm9yKFdqKGEsYixjKSxhPWEuc2libGluZztudWxsIT09YTspV2ooYSxiLGMpLGE9YS5zaWJsaW5nfXZhciBYPW51bGwsWGo9ITE7ZnVuY3Rpb24gWWooYSxiLGMpe2ZvcihjPWMuY2hpbGQ7bnVsbCE9PWM7KVpqKGEsYixjKSxjPWMuc2libGluZ31cbmZ1bmN0aW9uIFpqKGEsYixjKXtpZihsYyYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGxjLm9uQ29tbWl0RmliZXJVbm1vdW50KXRyeXtsYy5vbkNvbW1pdEZpYmVyVW5tb3VudChrYyxjKX1jYXRjaChoKXt9c3dpdGNoKGMudGFnKXtjYXNlIDU6VXx8TGooYyxiKTtjYXNlIDY6dmFyIGQ9WCxlPVhqO1g9bnVsbDtZaihhLGIsYyk7WD1kO1hqPWU7bnVsbCE9PVgmJihYaj8oYT1YLGM9Yy5zdGF0ZU5vZGUsOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOmEucmVtb3ZlQ2hpbGQoYykpOlgucmVtb3ZlQ2hpbGQoYy5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDE4Om51bGwhPT1YJiYoWGo/KGE9WCxjPWMuc3RhdGVOb2RlLDg9PT1hLm5vZGVUeXBlP0tmKGEucGFyZW50Tm9kZSxjKToxPT09YS5ub2RlVHlwZSYmS2YoYSxjKSxiZChhKSk6S2YoWCxjLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgNDpkPVg7ZT1YajtYPWMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87WGo9ITA7XG5ZaihhLGIsYyk7WD1kO1hqPWU7YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKCFVJiYoZD1jLnVwZGF0ZVF1ZXVlLG51bGwhPT1kJiYoZD1kLmxhc3RFZmZlY3QsbnVsbCE9PWQpKSl7ZT1kPWQubmV4dDtkb3t2YXIgZj1lLGc9Zi5kZXN0cm95O2Y9Zi50YWc7dm9pZCAwIT09ZyYmKDAhPT0oZiYyKT9NaihjLGIsZyk6MCE9PShmJjQpJiZNaihjLGIsZykpO2U9ZS5uZXh0fXdoaWxlKGUhPT1kKX1ZaihhLGIsYyk7YnJlYWs7Y2FzZSAxOmlmKCFVJiYoTGooYyxiKSxkPWMuc3RhdGVOb2RlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLmNvbXBvbmVudFdpbGxVbm1vdW50KSl0cnl7ZC5wcm9wcz1jLm1lbW9pemVkUHJvcHMsZC5zdGF0ZT1jLm1lbW9pemVkU3RhdGUsZC5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKGgpe1coYyxiLGgpfVlqKGEsYixjKTticmVhaztjYXNlIDIxOllqKGEsYixjKTticmVhaztjYXNlIDIyOmMubW9kZSYxPyhVPShkPVUpfHxudWxsIT09XG5jLm1lbW9pemVkU3RhdGUsWWooYSxiLGMpLFU9ZCk6WWooYSxiLGMpO2JyZWFrO2RlZmF1bHQ6WWooYSxiLGMpfX1mdW5jdGlvbiBhayhhKXt2YXIgYj1hLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1iKXthLnVwZGF0ZVF1ZXVlPW51bGw7dmFyIGM9YS5zdGF0ZU5vZGU7bnVsbD09PWMmJihjPWEuc3RhdGVOb2RlPW5ldyBLaik7Yi5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBkPWJrLmJpbmQobnVsbCxhLGIpO2MuaGFzKGIpfHwoYy5hZGQoYiksYi50aGVuKGQs
25114ZCkpfSl9fVxuZnVuY3Rpb24gY2soYSxiKXt2YXIgYz1iLmRlbGV0aW9ucztpZihudWxsIT09Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt0cnl7dmFyIGY9YSxnPWIsaD1nO2E6Zm9yKDtudWxsIT09aDspe3N3aXRjaChoLnRhZyl7Y2FzZSA1Olg9aC5zdGF0ZU5vZGU7WGo9ITE7YnJlYWsgYTtjYXNlIDM6WD1oLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1hqPSEwO2JyZWFrIGE7Y2FzZSA0Olg9aC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztYaj0hMDticmVhayBhfWg9aC5yZXR1cm59aWYobnVsbD09PVgpdGhyb3cgRXJyb3IocCgxNjApKTtaaihmLGcsZSk7WD1udWxsO1hqPSExO3ZhciBrPWUuYWx0ZXJuYXRlO251bGwhPT1rJiYoay5yZXR1cm49bnVsbCk7ZS5yZXR1cm49bnVsbH1jYXRjaChsKXtXKGUsYixsKX19aWYoYi5zdWJ0cmVlRmxhZ3MmMTI4NTQpZm9yKGI9Yi5jaGlsZDtudWxsIT09YjspZGsoYixhKSxiPWIuc2libGluZ31cbmZ1bmN0aW9uIGRrKGEsYil7dmFyIGM9YS5hbHRlcm5hdGUsZD1hLmZsYWdzO3N3aXRjaChhLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmNrKGIsYSk7ZWsoYSk7aWYoZCY0KXt0cnl7UGooMyxhLGEucmV0dXJuKSxRaigzLGEpfWNhdGNoKHQpe1coYSxhLnJldHVybix0KX10cnl7UGooNSxhLGEucmV0dXJuKX1jYXRjaCh0KXtXKGEsYS5yZXR1cm4sdCl9fWJyZWFrO2Nhc2UgMTpjayhiLGEpO2VrKGEpO2QmNTEyJiZudWxsIT09YyYmTGooYyxjLnJldHVybik7YnJlYWs7Y2FzZSA1OmNrKGIsYSk7ZWsoYSk7ZCY1MTImJm51bGwhPT1jJiZMaihjLGMucmV0dXJuKTtpZihhLmZsYWdzJjMyKXt2YXIgZT1hLnN0YXRlTm9kZTt0cnl7b2IoZSxcIlwiKX1jYXRjaCh0KXtXKGEsYS5yZXR1cm4sdCl9fWlmKGQmNCYmKGU9YS5zdGF0ZU5vZGUsbnVsbCE9ZSkpe3ZhciBmPWEubWVtb2l6ZWRQcm9wcyxnPW51bGwhPT1jP2MubWVtb2l6ZWRQcm9wczpmLGg9YS50eXBlLGs9YS51cGRhdGVRdWV1ZTtcbmEudXBkYXRlUXVldWU9bnVsbDtpZihudWxsIT09ayl0cnl7XCJpbnB1dFwiPT09aCYmXCJyYWRpb1wiPT09Zi50eXBlJiZudWxsIT1mLm5hbWUmJmFiKGUsZik7dmIoaCxnKTt2YXIgbD12YihoLGYpO2ZvcihnPTA7ZzxrLmxlbmd0aDtnKz0yKXt2YXIgbT1rW2ddLHE9a1tnKzFdO1wic3R5bGVcIj09PW0/c2IoZSxxKTpcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1tP25iKGUscSk6XCJjaGlsZHJlblwiPT09bT9vYihlLHEpOnRhKGUsbSxxLGwpfXN3aXRjaChoKXtjYXNlIFwiaW5wdXRcIjpiYihlLGYpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmliKGUsZik7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOnZhciByPWUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU9ISFmLm11bHRpcGxlO3ZhciB5PWYudmFsdWU7bnVsbCE9eT9mYihlLCEhZi5tdWx0aXBsZSx5LCExKTpyIT09ISFmLm11bHRpcGxlJiYobnVsbCE9Zi5kZWZh
25114dWx0VmFsdWU/ZmIoZSwhIWYubXVsdGlwbGUsXG5mLmRlZmF1bHRWYWx1ZSwhMCk6ZmIoZSwhIWYubXVsdGlwbGUsZi5tdWx0aXBsZT9bXTpcIlwiLCExKSl9ZVtQZl09Zn1jYXRjaCh0KXtXKGEsYS5yZXR1cm4sdCl9fWJyZWFrO2Nhc2UgNjpjayhiLGEpO2VrKGEpO2lmKGQmNCl7aWYobnVsbD09PWEuc3RhdGVOb2RlKXRocm93IEVycm9yKHAoMTYyKSk7ZT1hLnN0YXRlTm9kZTtmPWEubWVtb2l6ZWRQcm9wczt0cnl7ZS5ub2RlVmFsdWU9Zn1jYXRjaCh0KXtXKGEsYS5yZXR1cm4sdCl9fWJyZWFrO2Nhc2UgMzpjayhiLGEpO2VrKGEpO2lmKGQmNCYmbnVsbCE9PWMmJmMubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpdHJ5e2JkKGIuY29udGFpbmVySW5mbyl9Y2F0Y2godCl7VyhhLGEucmV0dXJuLHQpfWJyZWFrO2Nhc2UgNDpjayhiLGEpO2VrKGEpO2JyZWFrO2Nhc2UgMTM6Y2soYixhKTtlayhhKTtlPWEuY2hpbGQ7ZS5mbGFncyY4MTkyJiYoZj1udWxsIT09ZS5tZW1vaXplZFN0YXRlLGUuc3RhdGVOb2RlLmlzSGlkZGVuPWYsIWZ8fFxubnVsbCE9PWUuYWx0ZXJuYXRlJiZudWxsIT09ZS5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZXx8KGZrPUIoKSkpO2QmNCYmYWsoYSk7YnJlYWs7Y2FzZSAyMjptPW51bGwhPT1jJiZudWxsIT09Yy5tZW1vaXplZFN0YXRlO2EubW9kZSYxPyhVPShsPVUpfHxtLGNrKGIsYSksVT1sKTpjayhiLGEpO2VrKGEpO2lmKGQmODE5Mil7bD1udWxsIT09YS5tZW1vaXplZFN0YXRlO2lmKChhLnN0YXRlTm9kZS5pc0hpZGRlbj1sKSYmIW0mJjAhPT0oYS5tb2RlJjEpKWZvcihWPWEsbT1hLmNoaWxkO251bGwhPT1tOyl7Zm9yKHE9Vj1tO251bGwhPT1WOyl7cj1WO3k9ci5jaGlsZDtzd2l0Y2goci50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTpQaig0LHIsci5yZXR1cm4pO2JyZWFrO2Nhc2UgMTpMaihyLHIucmV0dXJuKTt2YXIgbj1yLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2Ygbi5jb21wb25lbnRXaWxsVW5tb3VudCl7ZD1yO2M9ci5yZXR1cm47dHJ5e2I9ZCxuLnByb3BzPVxuYi5tZW1vaXplZFByb3BzLG4uc3RhdGU9Yi5tZW1vaXplZFN0YXRlLG4uY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaCh0KXtXKGQsYyx0KX19YnJlYWs7Y2FzZSA1OkxqKHIsci5yZXR1cm4pO2JyZWFrO2Nhc2UgMjI6aWYobnVsbCE9PXIubWVtb2l6ZWRTdGF0ZSl7Z2socSk7Y29udGludWV9fW51bGwhPT15Pyh5LnJldHVybj1yLFY9eSk6Z2socSl9bT1tLnNpYmxpbmd9YTpmb3IobT1udWxsLHE9YTs7KXtpZig1PT09cS50YWcpe2lmKG51bGw9PT1tKXttPXE7dHJ5e2U9cS5zdGF0ZU5vZGUsbD8oZj1lLnN0eWxlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLnNldFByb3BlcnR5P2Yuc2V0UHJvcGVydHkoXCJkaXNwbGF5XCIsXCJub25lXCIsXCJpbXBvcnRhbnRcIik6Zi5kaXNwbGF5PVwibm9uZVwiKTooaD1xLnN0YXRlTm9kZSxrPXEubWVtb2l6ZWRQcm9wcy5zdHlsZSxnPXZvaWQgMCE9PWsmJm51bGwhPT1rJiZrLmhhc093blByb3BlcnR5KFwiZGlzcGxheVwiKT9rLmRpc3BsYXk6bnVsbCxoLnN0eWxlLmRpc3BsYXk9XG5yYihcImRpc3BsYXlcIixnKSl9Y2F0Y2godCl7VyhhLGEucmV0dXJuLHQpfX19ZWxzZSBpZig2PT09cS50YWcpe2lmKG51bGw9PT1tKXRyeXtxLnN0YXRlTm9kZS5ub2RlVmFsdWU9bD9cIlwiOnEubWVtb2l6ZWRQcm9wc31jYXRjaCh0KXtXKGEsYS5yZXR1cm4sdCl9fWVsc2UgaWYoKDIyIT09cS50YWcmJjIzIT09cS50YWd8fG51bGw9PT1xLm1lbW9pemVkU3RhdGV8fHE9PT1hKSYmbnVsbCE9PXEuY2hpbGQpe3EuY2hpbGQucmV0dXJuPXE7cT1xLmNoaWxkO2NvbnRpbnVlfWlmKHE9PT1hKWJyZWFrIGE7Zm9yKDtudWxsPT09cS5zaWJsaW5nOyl7aWYobnVsbD09PXEucmV0dXJufHxxLnJldHVybj09PWEpYnJlYWsgYTttPT09cSYmKG09bnVsbCk7cT1xLnJldHVybn1tPT09cSYmKG09bnVsbCk7cS5zaWJsaW5nLnJldHVybj1xLnJldHVybjtxPXEuc2libGluZ319YnJlYWs7Y2FzZSAxOTpjayhiLGEpO2VrKGEpO2QmNCYmYWsoYSk7YnJlYWs7Y2FzZSAyMTpicmVhaztkZWZhdWx0OmNrKGIsXG5hKSxlayhhKX19ZnVuY3Rpb24gZWsoYSl7dmFyIGI9YS5mbGFncztpZihiJjIpe3RyeXthOntmb3IodmFyIGM9YS5yZXR1cm47bnVsbCE9PWM7KXtpZihUaihjKSl7dmFyIGQ9YzticmVhayBhfWM9Yy5yZXR1cm59dGhyb3cgRXJyb3IocCgxNjApKTt9c3dpdGNoKGQudGFnKXtjYXNlIDU6dmFyIGU9ZC5zdGF0ZU5vZGU7ZC5mbGFncyYzMiYmKG9iKGUsXCJcIiksZC5mbGFncyY9LTMzKTt2YXIgZj1VaihhKTtXaihhLGYsZSk7YnJlYWs7Y2FzZSAzOmNhc2UgNDp2YXIgZz1kLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGg9VWooYSk7VmooYSxoLGcpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IocCgxNjEpKTt9fWNhdGNoKGspe1coYSxhLnJldHVybixrKX1hLmZsYWdzJj0tM31iJjQwOTYmJihhLmZsYWdzJj0tNDA5Nyl9ZnVuY3Rpb24gaGsoYSxiLGMpe1Y9YTtpayhhLGIsYyl9XG5mdW5jdGlvbiBpayhhLGIsYyl7Zm9yKHZhciBkPTAhPT0oYS5tb2RlJjEpO251bGwhPT1WOyl7dmFyIGU9VixmPWUuY2hpbGQ7aWYoMjI9PT1lLnRhZyYmZCl7dmFyIGc9bnVsbCE9PWUubWVtb2l6ZWRTdGF0ZXx8Smo7aWYoIWcpe3ZhciBoPWUuYWx0ZXJuYXRlLGs9bnVsbCE9PWgmJm51bGwhPT1oLm1lbW9pemVkU3RhdGV8fFU7aD1Kajt2YXIgbD1VO0pqPWc7aWYoKFU9aykmJiFsKWZvcihWPWU7bnVsbCE9PVY7KWc9VixrPWcuY2hpbGQsMjI9PT1nLnRhZyYmbnVsbCE9PWcubWVtb2l6ZWRTdGF0ZT9qayhlKTpudWxsIT09az8oay5yZXR1cm49ZyxWPWspOmprKGUpO2Zvcig7bnVsbCE9PWY7KVY9ZixpayhmLGIsYyksZj1mLnNpYmxpbmc7Vj1lO0pqPWg7VT1sfWtrKGEsYixjKX1lbHNlIDAhPT0oZS5zdWJ0cmVlRmxhZ3MmODc3MikmJm51bGwhPT1mPyhmLnJldHVybj1lLFY9Zik6a2soYSxiLGMpfX1cbmZ1bmN0aW9uIGtrKGEpe2Zvcig7bnVsbCE9PVY7KXt2YXIgYj1WO2lmKDAhPT0oYi5mbGFncyY4NzcyKSl7dmFyIGM9Yi5hbHRlcm5hdGU7dHJ5e2lmKDAhPT0oYi5mbGFncyY4NzcyKSlzd2l0Y2goYi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6VXx8UWooNSxiKTticmVhaztjYXNlIDE6dmFyIGQ9Yi5zdGF0ZU5vZGU7aWYoYi5mbGFncyY0JiYhVSlpZihudWxsPT09YylkLmNvbXBvbmVudERpZE1vdW50KCk7ZWxzZXt2YXIgZT1iLmVsZW1lbnRUeXBlPT09Yi50eXBlP2MubWVtb2l6ZWRQcm9wczpDaShiLnR5cGUsYy5tZW1vaXplZFByb3BzKTtkLmNvbXBvbmVudERpZFVwZGF0ZShlLGMubWVtb2l6ZWRTdGF0ZSxkLl9fcmVhY3RJb
25114nRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKX12YXIgZj1iLnVwZGF0ZVF1ZXVlO251bGwhPT1mJiZzaChiLGYsZCk7YnJlYWs7Y2FzZSAzOnZhciBnPWIudXBkYXRlUXVldWU7aWYobnVsbCE9PWcpe2M9bnVsbDtpZihudWxsIT09Yi5jaGlsZClzd2l0Y2goYi5jaGlsZC50YWcpe2Nhc2UgNTpjPVxuYi5jaGlsZC5zdGF0ZU5vZGU7YnJlYWs7Y2FzZSAxOmM9Yi5jaGlsZC5zdGF0ZU5vZGV9c2goYixnLGMpfWJyZWFrO2Nhc2UgNTp2YXIgaD1iLnN0YXRlTm9kZTtpZihudWxsPT09YyYmYi5mbGFncyY0KXtjPWg7dmFyIGs9Yi5tZW1vaXplZFByb3BzO3N3aXRjaChiLnR5cGUpe2Nhc2UgXCJidXR0b25cIjpjYXNlIFwiaW5wdXRcIjpjYXNlIFwic2VsZWN0XCI6Y2FzZSBcInRleHRhcmVhXCI6ay5hdXRvRm9jdXMmJmMuZm9jdXMoKTticmVhaztjYXNlIFwiaW1nXCI6ay5zcmMmJihjLnNyYz1rLnNyYyl9fWJyZWFrO2Nhc2UgNjpicmVhaztjYXNlIDQ6YnJlYWs7Y2FzZSAxMjpicmVhaztjYXNlIDEzOmlmKG51bGw9PT1iLm1lbW9pemVkU3RhdGUpe3ZhciBsPWIuYWx0ZXJuYXRlO2lmKG51bGwhPT1sKXt2YXIgbT1sLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PW0pe3ZhciBxPW0uZGVoeWRyYXRlZDtudWxsIT09cSYmYmQocSl9fX1icmVhaztjYXNlIDE5OmNhc2UgMTc6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMjM6Y2FzZSAyNTpicmVhaztcbmRlZmF1bHQ6dGhyb3cgRXJyb3IocCgxNjMpKTt9VXx8Yi5mbGFncyY1MTImJlJqKGIpfWNhdGNoKHIpe1coYixiLnJldHVybixyKX19aWYoYj09PWEpe1Y9bnVsbDticmVha31jPWIuc2libGluZztpZihudWxsIT09Yyl7Yy5yZXR1cm49Yi5yZXR1cm47Vj1jO2JyZWFrfVY9Yi5yZXR1cm59fWZ1bmN0aW9uIGdrKGEpe2Zvcig7bnVsbCE9PVY7KXt2YXIgYj1WO2lmKGI9PT1hKXtWPW51bGw7YnJlYWt9dmFyIGM9Yi5zaWJsaW5nO2lmKG51bGwhPT1jKXtjLnJldHVybj1iLnJldHVybjtWPWM7YnJlYWt9Vj1iLnJldHVybn19XG5mdW5jdGlvbiBqayhhKXtmb3IoO251bGwhPT1WOyl7dmFyIGI9Vjt0cnl7c3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnZhciBjPWIucmV0dXJuO3RyeXtRaig0LGIpfWNhdGNoKGspe1coYixjLGspfWJyZWFrO2Nhc2UgMTp2YXIgZD1iLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5jb21wb25lbnREaWRNb3VudCl7dmFyIGU9Yi5yZXR1cm47dHJ5e2QuY29tcG9uZW50RGlkTW91bnQoKX1jYXRjaChrKXtXKGIsZSxrKX19dmFyIGY9Yi5yZXR1cm47dHJ5e1JqKGIpfWNhdGNoKGspe1coYixmLGspfWJyZWFrO2Nhc2UgNTp2YXIgZz1iLnJldHVybjt0cnl7UmooYil9Y2F0Y2goayl7VyhiLGcsayl9fX1jYXRjaChrKXtXKGIsYi5yZXR1cm4sayl9aWYoYj09PWEpe1Y9bnVsbDticmVha312YXIgaD1iLnNpYmxpbmc7aWYobnVsbCE9PWgpe2gucmV0dXJuPWIucmV0dXJuO1Y9aDticmVha31WPWIucmV0dXJufX1cbnZhciBsaz1NYXRoLmNlaWwsbWs9dWEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixuaz11YS5SZWFjdEN1cnJlbnRPd25lcixvaz11YS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxLPTAsUT1udWxsLFk9bnVsbCxaPTAsZmo9MCxlaj1VZigwKSxUPTAscGs9bnVsbCxyaD0wLHFrPTAscms9MCxzaz1udWxsLHRrPW51bGwsZms9MCxHaj1JbmZpbml0eSx1az1udWxsLE9pPSExLFBpPW51bGwsUmk9bnVsbCx2az0hMSx3az1udWxsLHhrPTAseWs9MCx6az1udWxsLEFrPS0xLEJrPTA7ZnVuY3Rpb24gUigpe3JldHVybiAwIT09KEsmNik/QigpOi0xIT09QWs/QWs6QWs9QigpfVxuZnVuY3Rpb24geWkoYSl7aWYoMD09PShhLm1vZGUmMSkpcmV0dXJuIDE7aWYoMCE9PShLJjIpJiYwIT09WilyZXR1cm4gWiYtWjtpZihudWxsIT09S2cudHJhbnNpdGlvbilyZXR1cm4gMD09PUJrJiYoQms9eWMoKSksQms7YT1DO2lmKDAhPT1hKXJldHVybiBhO2E9d2luZG93LmV2ZW50O2E9dm9pZCAwPT09YT8xNjpqZChhLnR5cGUpO3JldHVybiBhfWZ1bmN0aW9uIGdpKGEsYixjLGQpe2lmKDUwPHlrKXRocm93IHlrPTAsems9bnVsbCxFcnJvcihwKDE4NSkpO0FjKGEsYyxkKTtpZigwPT09KEsmMil8fGEhPT1RKWE9PT1RJiYoMD09PShLJjIpJiYocWt8PWMpLDQ9PT1UJiZDayhhLFopKSxEayhhLGQpLDE9PT1jJiYwPT09SyYmMD09PShiLm1vZGUmMSkmJihHaj1CKCkrNTAwLGZnJiZqZygpKX1cbmZ1bmN0aW9uIERrKGEsYil7dmFyIGM9YS5jYWxsYmFja05vZGU7d2MoYSxiKTt2YXIgZD11YyhhLGE9PT1RP1o6MCk7aWYoMD09PWQpbnVsbCE9PWMmJmJjKGMpLGEuY2FsbGJhY2tOb2RlPW51bGwsYS5jYWxsYmFja1ByaW9yaXR5PTA7ZWxzZSBpZihiPWQmLWQsYS5jYWxsYmFja1ByaW9yaXR5IT09Yil7bnVsbCE9YyYmYmMoYyk7aWYoMT09PWIpMD09PWEudGFnP2lnKEVrLmJpbmQobnVsbCxhKSk6aGcoRWsuYmluZChudWxsLGEpKSxKZihmdW5jdGlvbigpezA9PT0oSyY2KSYmamcoKX0pLGM9bnVsbDtlbHNle3N3aXRjaChEYyhkKSl7Y2FzZSAxOmM9ZmM7YnJlYWs7Y2FzZSA0OmM9Z2M7YnJlYWs7Y2FzZSAxNjpjPWhjO2JyZWFrO2Nhc2UgNTM2ODcwOTEyOmM9amM7YnJlYWs7ZGVmYXVsdDpjPWhjfWM9RmsoYyxHay5iaW5kKG51bGwsYSkpfWEuY2FsbGJhY2tQcmlvcml0eT1iO2EuY2FsbGJhY2tOb2RlPWN9fVxuZnVuY3Rpb24gR2soYSxiKXtBaz0tMTtCaz0wO2lmKDAhPT0oSyY2KSl0aHJvdyBFcnJvcihwKDMyNykpO3ZhciBjPWEuY2FsbGJhY2tOb2RlO2lmKEhrKCkmJmEuY2FsbGJhY2tOb2RlIT09YylyZXR1cm4gbnVsbDt2YXIgZD11YyhhLGE9PT1RP1o6MCk7aWYoMD09PWQpcmV0dXJuIG51bGw7aWYoMCE9PShkJjMwKXx8MCE9PShkJmEuZXhwaXJlZExhbmVzKXx8YiliPUlrKGEsZCk7ZWxzZXtiPWQ7dmFyIGU9SztLfD0yO3ZhciBmPUprKCk7aWYoUSE9PWF8fFohPT1iKXVrPW51bGwsR2o9QigpKzUwMCxLayhhLGIpO2RvIHRyeXtMaygpO2JyZWFrfWNhdGNoKGgpe01rKGEsaCl9d2hpbGUoMSk7JGcoKTttay5jdXJyZW50PWY7Sz1lO251bGwhPT1ZP2I9MDooUT1udWxsLFo9MCxiPVQpfWlmKDAhPT1iKXsyPT09YiYmKGU9eGMoYSksMCE9PWUmJihkPWUsYj1OayhhLGUpKSk7aWYoMT09PWIpdGhyb3cgYz1wayxLayhhLDApLENrKGEsZCksRGsoYSxCKCkpLGM7aWYoNj09PWIpQ2soYSxkKTtcbmVsc2V7ZT1hLmN1cnJlbnQuYWx0ZXJuYXRlO2lmKDA9PT0oZCYzMCkmJiFPayhlKSYmKGI9SWsoYSxkKSwyPT09YiYmKGY9eGMoYSksMCE9PWYmJihkPWYsYj1OayhhLGYpKSksMT09PWIpKXRocm93IGM9cGssS2soYSwwKSxDayhhLGQpLERrKGEsQigpKSxjO2EuZmluaXNoZWRXb3JrPWU7YS5maW5pc2hlZExhbmVzPWQ7c3dpdGNoKGIpe2Nhc2UgMDpjYXNlIDE6dGhyb3cgRXJyb3IocCgzNDUpKTtjYXNlIDI6UGsoYSx0ayx1ayk7YnJlYWs7Y2FzZSAzOkNrKGEsZCk7aWYoKGQmMTMwMDIzNDI0KT09PWQmJihiPWZrKzUwMC1CKCksMTA8Yikpe2lmKDAhPT11YyhhLDApKWJyZWFrO2U9YS5zdXNwZW5kZWRMYW5lcztpZigoZSZkKSE9PWQpe1IoKTthLnBpbmdlZExhbmVzfD1hLnN1c3BlbmRlZExhbmVzJmU7YnJlYWt9YS50aW1lb3V0SGFuZGxlPUZmKFBrLmJpbmQobnVsbCxhLHRrLHVrKSxiKTticmVha31QayhhLHRrLHVrKTticmVhaztjYXNlIDQ6Q2soYSxkKTtpZigoZCY0MTk0MjQwKT09PVxuZClicmVhaztiPWEuZXZlbnRUaW1lcztmb3IoZT0tMTswPGQ7KXt2YXIgZz0zMS1vYyhkKTtmPTE8PGc7Zz1iW2ddO2c+ZSYmKGU9Zyk7ZCY9fmZ9ZD1lO2Q9QigpLWQ7ZD0oMTIwPmQ/
25114MTIwOjQ4MD5kPzQ4MDoxMDgwPmQ/MTA4MDoxOTIwPmQ/MTkyMDozRTM+ZD8zRTM6NDMyMD5kPzQzMjA6MTk2MCpsayhkLzE5NjApKS1kO2lmKDEwPGQpe2EudGltZW91dEhhbmRsZT1GZihQay5iaW5kKG51bGwsYSx0ayx1ayksZCk7YnJlYWt9UGsoYSx0ayx1ayk7YnJlYWs7Y2FzZSA1OlBrKGEsdGssdWspO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IocCgzMjkpKTt9fX1EayhhLEIoKSk7cmV0dXJuIGEuY2FsbGJhY2tOb2RlPT09Yz9Hay5iaW5kKG51bGwsYSk6bnVsbH1cbmZ1bmN0aW9uIE5rKGEsYil7dmFyIGM9c2s7YS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYoS2soYSxiKS5mbGFnc3w9MjU2KTthPUlrKGEsYik7MiE9PWEmJihiPXRrLHRrPWMsbnVsbCE9PWImJkZqKGIpKTtyZXR1cm4gYX1mdW5jdGlvbiBGaihhKXtudWxsPT09dGs/dGs9YTp0ay5wdXNoLmFwcGx5KHRrLGEpfVxuZnVuY3Rpb24gT2soYSl7Zm9yKHZhciBiPWE7Oyl7aWYoYi5mbGFncyYxNjM4NCl7dmFyIGM9Yi51cGRhdGVRdWV1ZTtpZihudWxsIT09YyYmKGM9Yy5zdG9yZXMsbnVsbCE9PWMpKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT1jW2RdLGY9ZS5nZXRTbmFwc2hvdDtlPWUudmFsdWU7dHJ5e2lmKCFIZShmKCksZSkpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fX1jPWIuY2hpbGQ7aWYoYi5zdWJ0cmVlRmxhZ3MmMTYzODQmJm51bGwhPT1jKWMucmV0dXJuPWIsYj1jO2Vsc2V7aWYoYj09PWEpYnJlYWs7Zm9yKDtudWxsPT09Yi5zaWJsaW5nOyl7aWYobnVsbD09PWIucmV0dXJufHxiLnJldHVybj09PWEpcmV0dXJuITA7Yj1iLnJldHVybn1iLnNpYmxpbmcucmV0dXJuPWIucmV0dXJuO2I9Yi5zaWJsaW5nfX1yZXR1cm4hMH1cbmZ1bmN0aW9uIENrKGEsYil7YiY9fnJrO2ImPX5xazthLnN1c3BlbmRlZExhbmVzfD1iO2EucGluZ2VkTGFuZXMmPX5iO2ZvcihhPWEuZXhwaXJhdGlvblRpbWVzOzA8Yjspe3ZhciBjPTMxLW9jKGIpLGQ9MTw8YzthW2NdPS0xO2ImPX5kfX1mdW5jdGlvbiBFayhhKXtpZigwIT09KEsmNikpdGhyb3cgRXJyb3IocCgzMjcpKTtIaygpO3ZhciBiPXVjKGEsMCk7aWYoMD09PShiJjEpKXJldHVybiBEayhhLEIoKSksbnVsbDt2YXIgYz1JayhhLGIpO2lmKDAhPT1hLnRhZyYmMj09PWMpe3ZhciBkPXhjKGEpOzAhPT1kJiYoYj1kLGM9TmsoYSxkKSl9aWYoMT09PWMpdGhyb3cgYz1wayxLayhhLDApLENrKGEsYiksRGsoYSxCKCkpLGM7aWYoNj09PWMpdGhyb3cgRXJyb3IocCgzNDUpKTthLmZpbmlzaGVkV29yaz1hLmN1cnJlbnQuYWx0ZXJuYXRlO2EuZmluaXNoZWRMYW5lcz1iO1BrKGEsdGssdWspO0RrKGEsQigpKTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIFFrKGEsYil7dmFyIGM9SztLfD0xO3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e0s9YywwPT09SyYmKEdqPUIoKSs1MDAsZmcmJmpnKCkpfX1mdW5jdGlvbiBSayhhKXtudWxsIT09d2smJjA9PT13ay50YWcmJjA9PT0oSyY2KSYmSGsoKTt2YXIgYj1LO0t8PTE7dmFyIGM9b2sudHJhbnNpdGlvbixkPUM7dHJ5e2lmKG9rLnRyYW5zaXRpb249bnVsbCxDPTEsYSlyZXR1cm4gYSgpfWZpbmFsbHl7Qz1kLG9rLnRyYW5zaXRpb249YyxLPWIsMD09PShLJjYpJiZqZygpfX1mdW5jdGlvbiBIaigpe2ZqPWVqLmN1cnJlbnQ7RShlail9XG5mdW5jdGlvbiBLayhhLGIpe2EuZmluaXNoZWRXb3JrPW51bGw7YS5maW5pc2hlZExhbmVzPTA7dmFyIGM9YS50aW1lb3V0SGFuZGxlOy0xIT09YyYmKGEudGltZW91dEhhbmRsZT0tMSxHZihjKSk7aWYobnVsbCE9PVkpZm9yKGM9WS5yZXR1cm47bnVsbCE9PWM7KXt2YXIgZD1jO3dnKGQpO3N3aXRjaChkLnRhZyl7Y2FzZSAxOmQ9ZC50eXBlLmNoaWxkQ29udGV4dFR5cGVzO251bGwhPT1kJiZ2b2lkIDAhPT1kJiYkZigpO2JyZWFrO2Nhc2UgMzp6aCgpO0UoV2YpO0UoSCk7RWgoKTticmVhaztjYXNlIDU6QmgoZCk7YnJlYWs7Y2FzZSA0OnpoKCk7YnJlYWs7Y2FzZSAxMzpFKEwpO2JyZWFrO2Nhc2UgMTk6RShMKTticmVhaztjYXNlIDEwOmFoKGQudHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOkhqKCl9Yz1jLnJldHVybn1RPWE7WT1hPVBnKGEuY3VycmVudCxudWxsKTtaPWZqPWI7VD0wO3BrPW51bGw7cms9cWs9cmg9MDt0az1zaz1udWxsO2lmKG51bGwhPT1maCl7Zm9yKGI9XG4wO2I8ZmgubGVuZ3RoO2IrKylpZihjPWZoW2JdLGQ9Yy5pbnRlcmxlYXZlZCxudWxsIT09ZCl7Yy5pbnRlcmxlYXZlZD1udWxsO3ZhciBlPWQubmV4dCxmPWMucGVuZGluZztpZihudWxsIT09Zil7dmFyIGc9Zi5uZXh0O2YubmV4dD1lO2QubmV4dD1nfWMucGVuZGluZz1kfWZoPW51bGx9cmV0dXJuIGF9XG5mdW5jdGlvbiBNayhhLGIpe2Rve3ZhciBjPVk7dHJ5eyRnKCk7RmguY3VycmVudD1SaDtpZihJaCl7Zm9yKHZhciBkPU0ubWVtb2l6ZWRTdGF0ZTtudWxsIT09ZDspe3ZhciBlPWQucXVldWU7bnVsbCE9PWUmJihlLnBlbmRpbmc9bnVsbCk7ZD1kLm5leHR9SWg9ITF9SGg9MDtPPU49TT1udWxsO0poPSExO0toPTA7bmsuY3VycmVudD1udWxsO2lmKG51bGw9PT1jfHxudWxsPT09Yy5yZXR1cm4pe1Q9MTtwaz1iO1k9bnVsbDticmVha31hOnt2YXIgZj1hLGc9Yy5yZXR1cm4saD1jLGs9YjtiPVo7aC5mbGFnc3w9MzI3Njg7aWYobnVsbCE9PWsmJlwib2JqZWN0XCI9PT10eXBlb2YgayYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGsudGhlbil7dmFyIGw9ayxtPWgscT1tLnRhZztpZigwPT09KG0ubW9kZSYxKSYmKDA9PT1xfHwxMT09PXF8fDE1PT09cSkpe3ZhciByPW0uYWx0ZXJuYXRlO3I/KG0udXBkYXRlUXVldWU9ci51cGRhdGVRdWV1ZSxtLm1lbW9pemVkU3RhdGU9ci5tZW1vaXplZFN0YXRlLFxubS5sYW5lcz1yLmxhbmVzKToobS51cGRhdGVRdWV1ZT1udWxsLG0ubWVtb2l6ZWRTdGF0ZT1udWxsKX12YXIgeT1VaShnKTtpZihudWxsIT09eSl7eS5mbGFncyY9LTI1NztWaSh5LGcsaCxmLGIpO3kubW9kZSYxJiZTaShmLGwsYik7Yj15O2s9bDt2YXIgbj1iLnVwZGF0ZVF1ZXVlO2lmKG51bGw9PT1uKXt2YXIgdD1uZXcgU2V0O3QuYWRkKGspO2IudXBkYXRlUXVldWU9dH1lbHNlIG4uYWRkKGspO2JyZWFrIGF9ZWxzZXtpZigwPT09KGImMSkpe1NpKGYsbCxiKTt0aigpO2JyZWFrIGF9az1FcnJvcihwKDQyNikpfX1lbHNlIGlmKEkmJmgubW9kZSYxKXt2YXIgSj1VaShnKTtpZihudWxsIT09Sil7MD09PShKLmZsYWdzJjY1NTM2KSYmKEouZmxhZ3N8PTI1Nik7VmkoSixnLGgsZixiKTtKZyhKaShrLGgpKTticmVhayBhfX1mPWs9SmkoayxoKTs0IT09VCYmKFQ9Mik7bnVsbD09PXNrP3NrPVtmXTpzay5wdXNoKGYpO2Y9Zztkb3tzd2l0Y2goZi50YWcpe2Nhc2UgMzpmLmZsYWdzfD02NTUzNjtcbmImPS1iO2YubGFuZXN8PWI7dmFyIHg9TmkoZixrLGIpO3BoKGYseCk7YnJlYWsgYTtjYXNlIDE6aD1rO3ZhciB3PWYudHlwZSx1PWYuc3RhdGVOb2RlO2lmKDA9PT0oZi5mbGFncyYxMjgpJiYoXCJmdW5jdGlvblwiPT09dHlwZW9mIHcuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yfHxudWxsIT09dSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIHUuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09Uml8fCFSaS5oYXModSkpKSl7Zi5mbGFnc3w9NjU1MzY7YiY9LWI7Zi
251145sYW5lc3w9Yjt2YXIgRj1RaShmLGgsYik7cGgoZixGKTticmVhayBhfX1mPWYucmV0dXJufXdoaWxlKG51bGwhPT1mKX1TayhjKX1jYXRjaChuYSl7Yj1uYTtZPT09YyYmbnVsbCE9PWMmJihZPWM9Yy5yZXR1cm4pO2NvbnRpbnVlfWJyZWFrfXdoaWxlKDEpfWZ1bmN0aW9uIEprKCl7dmFyIGE9bWsuY3VycmVudDttay5jdXJyZW50PVJoO3JldHVybiBudWxsPT09YT9SaDphfVxuZnVuY3Rpb24gdGooKXtpZigwPT09VHx8Mz09PVR8fDI9PT1UKVQ9NDtudWxsPT09UXx8MD09PShyaCYyNjg0MzU0NTUpJiYwPT09KHFrJjI2ODQzNTQ1NSl8fENrKFEsWil9ZnVuY3Rpb24gSWsoYSxiKXt2YXIgYz1LO0t8PTI7dmFyIGQ9SmsoKTtpZihRIT09YXx8WiE9PWIpdWs9bnVsbCxLayhhLGIpO2RvIHRyeXtUaygpO2JyZWFrfWNhdGNoKGUpe01rKGEsZSl9d2hpbGUoMSk7JGcoKTtLPWM7bWsuY3VycmVudD1kO2lmKG51bGwhPT1ZKXRocm93IEVycm9yKHAoMjYxKSk7UT1udWxsO1o9MDtyZXR1cm4gVH1mdW5jdGlvbiBUaygpe2Zvcig7bnVsbCE9PVk7KVVrKFkpfWZ1bmN0aW9uIExrKCl7Zm9yKDtudWxsIT09WSYmIWNjKCk7KVVrKFkpfWZ1bmN0aW9uIFVrKGEpe3ZhciBiPVZrKGEuYWx0ZXJuYXRlLGEsZmopO2EubWVtb2l6ZWRQcm9wcz1hLnBlbmRpbmdQcm9wcztudWxsPT09Yj9TayhhKTpZPWI7bmsuY3VycmVudD1udWxsfVxuZnVuY3Rpb24gU2soYSl7dmFyIGI9YTtkb3t2YXIgYz1iLmFsdGVybmF0ZTthPWIucmV0dXJuO2lmKDA9PT0oYi5mbGFncyYzMjc2OCkpe2lmKGM9RWooYyxiLGZqKSxudWxsIT09Yyl7WT1jO3JldHVybn19ZWxzZXtjPUlqKGMsYik7aWYobnVsbCE9PWMpe2MuZmxhZ3MmPTMyNzY3O1k9YztyZXR1cm59aWYobnVsbCE9PWEpYS5mbGFnc3w9MzI3NjgsYS5zdWJ0cmVlRmxhZ3M9MCxhLmRlbGV0aW9ucz1udWxsO2Vsc2V7VD02O1k9bnVsbDtyZXR1cm59fWI9Yi5zaWJsaW5nO2lmKG51bGwhPT1iKXtZPWI7cmV0dXJufVk9Yj1hfXdoaWxlKG51bGwhPT1iKTswPT09VCYmKFQ9NSl9ZnVuY3Rpb24gUGsoYSxiLGMpe3ZhciBkPUMsZT1vay50cmFuc2l0aW9uO3RyeXtvay50cmFuc2l0aW9uPW51bGwsQz0xLFdrKGEsYixjLGQpfWZpbmFsbHl7b2sudHJhbnNpdGlvbj1lLEM9ZH1yZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIFdrKGEsYixjLGQpe2RvIEhrKCk7d2hpbGUobnVsbCE9PXdrKTtpZigwIT09KEsmNikpdGhyb3cgRXJyb3IocCgzMjcpKTtjPWEuZmluaXNoZWRXb3JrO3ZhciBlPWEuZmluaXNoZWRMYW5lcztpZihudWxsPT09YylyZXR1cm4gbnVsbDthLmZpbmlzaGVkV29yaz1udWxsO2EuZmluaXNoZWRMYW5lcz0wO2lmKGM9PT1hLmN1cnJlbnQpdGhyb3cgRXJyb3IocCgxNzcpKTthLmNhbGxiYWNrTm9kZT1udWxsO2EuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBmPWMubGFuZXN8Yy5jaGlsZExhbmVzO0JjKGEsZik7YT09PVEmJihZPVE9bnVsbCxaPTApOzA9PT0oYy5zdWJ0cmVlRmxhZ3MmMjA2NCkmJjA9PT0oYy5mbGFncyYyMDY0KXx8dmt8fCh2az0hMCxGayhoYyxmdW5jdGlvbigpe0hrKCk7cmV0dXJuIG51bGx9KSk7Zj0wIT09KGMuZmxhZ3MmMTU5OTApO2lmKDAhPT0oYy5zdWJ0cmVlRmxhZ3MmMTU5OTApfHxmKXtmPW9rLnRyYW5zaXRpb247b2sudHJhbnNpdGlvbj1udWxsO1xudmFyIGc9QztDPTE7dmFyIGg9SztLfD00O25rLmN1cnJlbnQ9bnVsbDtPaihhLGMpO2RrKGMsYSk7T2UoRGYpO2RkPSEhQ2Y7RGY9Q2Y9bnVsbDthLmN1cnJlbnQ9YztoayhjLGEsZSk7ZGMoKTtLPWg7Qz1nO29rLnRyYW5zaXRpb249Zn1lbHNlIGEuY3VycmVudD1jO3ZrJiYodms9ITEsd2s9YSx4az1lKTtmPWEucGVuZGluZ0xhbmVzOzA9PT1mJiYoUmk9bnVsbCk7bWMoYy5zdGF0ZU5vZGUsZCk7RGsoYSxCKCkpO2lmKG51bGwhPT1iKWZvcihkPWEub25SZWNvdmVyYWJsZUVycm9yLGM9MDtjPGIubGVuZ3RoO2MrKyllPWJbY10sZChlLnZhbHVlLHtjb21wb25lbnRTdGFjazplLnN0YWNrLGRpZ2VzdDplLmRpZ2VzdH0pO2lmKE9pKXRocm93IE9pPSExLGE9UGksUGk9bnVsbCxhOzAhPT0oeGsmMSkmJjAhPT1hLnRhZyYmSGsoKTtmPWEucGVuZGluZ0xhbmVzOzAhPT0oZiYxKT9hPT09ems/eWsrKzooeWs9MCx6az1hKTp5az0wO2pnKCk7cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBIaygpe2lmKG51bGwhPT13ayl7dmFyIGE9RGMoeGspLGI9b2sudHJhbnNpdGlvbixjPUM7dHJ5e29rLnRyYW5zaXRpb249bnVsbDtDPTE2PmE/MTY6YTtpZihudWxsPT09d2spdmFyIGQ9ITE7ZWxzZXthPXdrO3drPW51bGw7eGs9MDtpZigwIT09KEsmNikpdGhyb3cgRXJyb3IocCgzMzEpKTt2YXIgZT1LO0t8PTQ7Zm9yKFY9YS5jdXJyZW50O251bGwhPT1WOyl7dmFyIGY9VixnPWYuY2hpbGQ7aWYoMCE9PShWLmZsYWdzJjE2KSl7dmFyIGg9Zi5kZWxldGlvbnM7aWYobnVsbCE9PWgpe2Zvcih2YXIgaz0wO2s8aC5sZW5ndGg7aysrKXt2YXIgbD1oW2tdO2ZvcihWPWw7bnVsbCE9PVY7KXt2YXIgbT1WO3N3aXRjaChtLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpQaig4LG0sZil9dmFyIHE9bS5jaGlsZDtpZihudWxsIT09cSlxLnJldHVybj1tLFY9cTtlbHNlIGZvcig7bnVsbCE9PVY7KXttPVY7dmFyIHI9bS5zaWJsaW5nLHk9bS5yZXR1cm47U2oobSk7aWYobT09PVxubCl7Vj1udWxsO2JyZWFrfWlmKG51bGwhPT1yKXtyLnJldHVybj15O1Y9cjticmVha31WPXl9fX12YXIgbj1mLmFsdGVybmF0ZTtpZihudWxsIT09bil7dmFyIHQ9bi5jaGlsZDtpZihudWxsIT09dCl7bi5jaGlsZD1udWxsO2Rve3ZhciBKPXQuc2libGluZzt0LnNpYmxpbmc9bnVsbDt0PUp9d2hpbGUobnVsbCE9PXQpfX1WPWZ9fWlmKDAhPT0oZi5zdWJ0cmVlRmxhZ3MmMjA2NCkmJm51bGwhPT1nKWcucmV0dXJuPWYsVj1nO2Vsc2UgYjpmb3IoO251bGwhPT1WOyl7Zj1WO2lmKDAhPT0oZi5mbGFncyYyMDQ4KSlzd2l0Y2goZi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6UGooOSxmLGYucmV0dXJuKX12YXIgeD1mLnNpYmxpbmc7aWYobnVsbCE9PXgpe3gucmV0dXJuPWYucmV0dXJuO1Y9eDticmVhayBifVY9Zi5yZXR1cm59fXZhciB3PWEuY3VycmVudDtmb3IoVj13O251bGwhPT1WOyl7Zz1WO3ZhciB1PWcuY2hpbGQ7aWYoMCE9PShnLnN1YnRyZWVGbGFncyYyMDY0KSYmbnVsbCE9PVxudSl1LnJldHVybj1nLFY9dTtlbHNlIGI6Zm9yKGc9dztudWxsIT09Vjspe2g9VjtpZigwIT09KGguZmxhZ3MmMjA0OCkpdHJ5e3N3aXRjaC
25114hoLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpRaig5LGgpfX1jYXRjaChuYSl7VyhoLGgucmV0dXJuLG5hKX1pZihoPT09Zyl7Vj1udWxsO2JyZWFrIGJ9dmFyIEY9aC5zaWJsaW5nO2lmKG51bGwhPT1GKXtGLnJldHVybj1oLnJldHVybjtWPUY7YnJlYWsgYn1WPWgucmV0dXJufX1LPWU7amcoKTtpZihsYyYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGxjLm9uUG9zdENvbW1pdEZpYmVyUm9vdCl0cnl7bGMub25Qb3N0Q29tbWl0RmliZXJSb290KGtjLGEpfWNhdGNoKG5hKXt9ZD0hMH1yZXR1cm4gZH1maW5hbGx5e0M9Yyxvay50cmFuc2l0aW9uPWJ9fXJldHVybiExfWZ1bmN0aW9uIFhrKGEsYixjKXtiPUppKGMsYik7Yj1OaShhLGIsMSk7YT1uaChhLGIsMSk7Yj1SKCk7bnVsbCE9PWEmJihBYyhhLDEsYiksRGsoYSxiKSl9XG5mdW5jdGlvbiBXKGEsYixjKXtpZigzPT09YS50YWcpWGsoYSxhLGMpO2Vsc2UgZm9yKDtudWxsIT09Yjspe2lmKDM9PT1iLnRhZyl7WGsoYixhLGMpO2JyZWFrfWVsc2UgaWYoMT09PWIudGFnKXt2YXIgZD1iLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcnx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGQuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09Uml8fCFSaS5oYXMoZCkpKXthPUppKGMsYSk7YT1RaShiLGEsMSk7Yj1uaChiLGEsMSk7YT1SKCk7bnVsbCE9PWImJihBYyhiLDEsYSksRGsoYixhKSk7YnJlYWt9fWI9Yi5yZXR1cm59fVxuZnVuY3Rpb24gVGkoYSxiLGMpe3ZhciBkPWEucGluZ0NhY2hlO251bGwhPT1kJiZkLmRlbGV0ZShiKTtiPVIoKTthLnBpbmdlZExhbmVzfD1hLnN1c3BlbmRlZExhbmVzJmM7UT09PWEmJihaJmMpPT09YyYmKDQ9PT1UfHwzPT09VCYmKFomMTMwMDIzNDI0KT09PVomJjUwMD5CKCktZms/S2soYSwwKTpya3w9Yyk7RGsoYSxiKX1mdW5jdGlvbiBZayhhLGIpezA9PT1iJiYoMD09PShhLm1vZGUmMSk/Yj0xOihiPXNjLHNjPDw9MSwwPT09KHNjJjEzMDAyMzQyNCkmJihzYz00MTk0MzA0KSkpO3ZhciBjPVIoKTthPWloKGEsYik7bnVsbCE9PWEmJihBYyhhLGIsYyksRGsoYSxjKSl9ZnVuY3Rpb24gdWooYSl7dmFyIGI9YS5tZW1vaXplZFN0YXRlLGM9MDtudWxsIT09YiYmKGM9Yi5yZXRyeUxhbmUpO1lrKGEsYyl9XG5mdW5jdGlvbiBiayhhLGIpe3ZhciBjPTA7c3dpdGNoKGEudGFnKXtjYXNlIDEzOnZhciBkPWEuc3RhdGVOb2RlO3ZhciBlPWEubWVtb2l6ZWRTdGF0ZTtudWxsIT09ZSYmKGM9ZS5yZXRyeUxhbmUpO2JyZWFrO2Nhc2UgMTk6ZD1hLnN0YXRlTm9kZTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHAoMzE0KSk7fW51bGwhPT1kJiZkLmRlbGV0ZShiKTtZayhhLGMpfXZhciBWaztcblZrPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSlpZihhLm1lbW9pemVkUHJvcHMhPT1iLnBlbmRpbmdQcm9wc3x8V2YuY3VycmVudClkaD0hMDtlbHNle2lmKDA9PT0oYS5sYW5lcyZjKSYmMD09PShiLmZsYWdzJjEyOCkpcmV0dXJuIGRoPSExLHlqKGEsYixjKTtkaD0wIT09KGEuZmxhZ3MmMTMxMDcyKT8hMDohMX1lbHNlIGRoPSExLEkmJjAhPT0oYi5mbGFncyYxMDQ4NTc2KSYmdWcoY
25114ixuZyxiLmluZGV4KTtiLmxhbmVzPTA7c3dpdGNoKGIudGFnKXtjYXNlIDI6dmFyIGQ9Yi50eXBlO2lqKGEsYik7YT1iLnBlbmRpbmdQcm9wczt2YXIgZT1ZZihiLEguY3VycmVudCk7Y2goYixjKTtlPU5oKG51bGwsYixkLGEsZSxjKTt2YXIgZj1TaCgpO2IuZmxhZ3N8PTE7XCJvYmplY3RcIj09PXR5cGVvZiBlJiZudWxsIT09ZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGUucmVuZGVyJiZ2b2lkIDA9PT1lLiQkdHlwZW9mPyhiLnRhZz0xLGIubWVtb2l6ZWRTdGF0ZT1udWxsLGIudXBkYXRlUXVldWU9XG5udWxsLFpmKGQpPyhmPSEwLGNnKGIpKTpmPSExLGIubWVtb2l6ZWRTdGF0ZT1udWxsIT09ZS5zdGF0ZSYmdm9pZCAwIT09ZS5zdGF0ZT9lLnN0YXRlOm51bGwsa2goYiksZS51cGRhdGVyPUVpLGIuc3RhdGVOb2RlPWUsZS5fcmVhY3RJbnRlcm5hbHM9YixJaShiLGQsYSxjKSxiPWpqKG51bGwsYixkLCEwLGYsYykpOihiLnRhZz0wLEkmJmYmJnZnKGIpLFhpKG51bGwsYixlLGMpLGI9Yi5jaGlsZCk7cmV0dXJuIGI7Y2FzZSAxNjpkPWIuZWxlbWVudFR5cGU7YTp7aWooYSxiKTthPWIucGVuZGluZ1Byb3BzO2U9ZC5faW5pdDtkPWUoZC5fcGF5bG9hZCk7Yi50eXBlPWQ7ZT1iLnRhZz1aayhkKTthPUNpKGQsYSk7c3dpdGNoKGUpe2Nhc2UgMDpiPWNqKG51bGwsYixkLGEsYyk7YnJlYWsgYTtjYXNlIDE6Yj1oaihudWxsLGIsZCxhLGMpO2JyZWFrIGE7Y2FzZSAxMTpiPVlpKG51bGwsYixkLGEsYyk7YnJlYWsgYTtjYXNlIDE0OmI9JGkobnVsbCxiLGQsQ2koZC50eXBlLGEpLGMpO2JyZWFrIGF9dGhyb3cgRXJyb3IocCgzMDYsXG5kLFwiXCIpKTt9cmV0dXJuIGI7Y2FzZSAwOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpDaShkLGUpLGNqKGEsYixkLGUsYyk7Y2FzZSAxOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpDaShkLGUpLGhqKGEsYixkLGUsYyk7Y2FzZSAzOmE6e2tqKGIpO2lmKG51bGw9PT1hKXRocm93IEVycm9yKHAoMzg3KSk7ZD1iLnBlbmRpbmdQcm9wcztmPWIubWVtb2l6ZWRTdGF0ZTtlPWYuZWxlbWVudDtsaChhLGIpO3FoKGIsZCxudWxsLGMpO3ZhciBnPWIubWVtb2l6ZWRTdGF0ZTtkPWcuZWxlbWVudDtpZihmLmlzRGVoeWRyYXRlZClpZihmPXtlbGVtZW50OmQsaXNEZWh5ZHJhdGVkOiExLGNhY2hlOmcuY2FjaGUscGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczpnLnBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXMsdHJhbnNpdGlvbnM6Zy50cmFuc2l0aW9uc30sYi51cGRhdGVRdWV1ZS5iYXNlU3RhdGU9XG5mLGIubWVtb2l6ZWRTdGF0ZT1mLGIuZmxhZ3MmMjU2KXtlPUppKEVycm9yKHAoNDIzKSksYik7Yj1saihhLGIsZCxjLGUpO2JyZWFrIGF9ZWxzZSBpZihkIT09ZSl7ZT1KaShFcnJvcihwKDQyNCkpLGIpO2I9bGooYSxiLGQsYyxlKTticmVhayBhfWVsc2UgZm9yKHlnPUxmKGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8uZmlyc3RDaGlsZCkseGc9YixJPSEwLHpnPW51bGwsYz1WZyhiLG51bGwsZCxjKSxiLmNoaWxkPWM7YzspYy5mbGFncz1jLmZsYWdzJi0zfDQwOTYsYz1jLnNpYmxpbmc7ZWxzZXtJZygpO2lmKGQ9PT1lKXtiPVppKGEsYixjKTticmVhayBhfVhpKGEsYixkLGMpfWI9Yi5jaGlsZH1yZXR1cm4gYjtjYXNlIDU6cmV0dXJuIEFoKGIpLG51bGw9PT1hJiZFZyhiKSxkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGY9bnVsbCE9PWE/YS5tZW1vaXplZFByb3BzOm51bGwsZz1lLmNoaWxkcmVuLEVmKGQsZSk/Zz1udWxsOm51bGwhPT1mJiZFZihkLGYpJiYoYi5mbGFnc3w9MzIpLFxuZ2ooYSxiKSxYaShhLGIsZyxjKSxiLmNoaWxkO2Nhc2UgNjpyZXR1cm4gbnVsbD09PWEmJkVnKGIpLG51bGw7Y2FzZSAxMzpyZXR1cm4gb2ooYSxiLGMpO2Nhc2UgNDpyZXR1cm4geWgoYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxkPWIucGVuZGluZ1Byb3BzLG51bGw9PT1hP2IuY2hpbGQ9VWcoYixudWxsLGQsYyk6WGkoYSxiLGQsYyksYi5jaGlsZDtjYXNlIDExOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpDaShkLGUpLFlpKGEsYixkLGUsYyk7Y2FzZSA3OnJldHVybiBYaShhLGIsYi5wZW5kaW5nUHJvcHMsYyksYi5jaGlsZDtjYXNlIDg6cmV0dXJuIFhpKGEsYixiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixjKSxiLmNoaWxkO2Nhc2UgMTI6cmV0dXJuIFhpKGEsYixiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixjKSxiLmNoaWxkO2Nhc2UgMTA6YTp7ZD1iLnR5cGUuX2NvbnRleHQ7ZT1iLnBlbmRpbmdQcm9wcztmPWIubWVtb2l6ZWRQcm9wcztcbmc9ZS52YWx1ZTtHKFdnLGQuX2N1cnJlbnRWYWx1ZSk7ZC5fY3VycmVudFZhbHVlPWc7aWYobnVsbCE9PWYpaWYoSGUoZi52YWx1ZSxnKSl7aWYoZi5jaGlsZHJlbj09PWUuY2hpbGRyZW4mJiFXZi5jdXJyZW50KXtiPVppKGEsYixjKTticmVhayBhfX1lbHNlIGZvcihmPWIuY2hpbGQsbnVsbCE9PWYmJihmLnJldHVybj1iKTtudWxsIT09Zjspe3ZhciBoPWYuZGVwZW5kZW5jaWVzO2lmKG51bGwhPT1oKXtnPWYuY2hpbGQ7Zm9yKHZhciBrPWguZmlyc3RDb250ZXh0O251bGwhPT1rOyl7aWYoay5jb250ZXh0PT09ZCl7aWYoMT09PWYudGFnKXtrPW1oKC0xLGMmLWMpO2sudGFnPTI7dmFyIGw9Zi51cGRhdGVRdWV1ZTtpZihudWxsIT09bCl7bD1sLnNoYXJlZDt2YXIgbT1sLnBlbmRpbmc7bnVsbD09PW0/ay5uZXh0PWs6KGsubmV4dD1tLm5leHQsbS5uZXh0PWspO2wucGVuZGluZz1rfX1mLmxhbmVzfD1jO2s9Zi5hbHRlcm5hdGU7bnVsbCE9PWsmJihrLmxhbmVzfD1jKTtiaChmLnJldHVybixcbmMsYik7aC5sYW5lc3w9YzticmVha31rPWsubmV4dH19ZWxzZSBpZigxMD09PWYudGFnKWc9Zi50eXBlPT09Yi50eXBlP251bGw6Zi5jaGlsZDtlbHNlIGlmKDE4PT09Zi50YWcpe2c9Zi5yZXR1cm47aWYobnVsbD09PWcpdGhyb3cgRXJyb3IocCgzNDEpKTtnLmxhbmVzfD1jO2g9Zy5hbHRlcm5hdGU7bnVsbCE9PWgmJihoLmxhbmVzfD1jKTtiaChnLGMsYik7Zz1mLnNpYmxpbmd9ZWxzZSBnPWYuY2hpbGQ7aWYobnVsbCE9PWcpZy5yZXR1cm49ZjtlbHNlIGZvcihnPWY7bnVsbCE9PWc7KXtp
25114ZihnPT09Yil7Zz1udWxsO2JyZWFrfWY9Zy5zaWJsaW5nO2lmKG51bGwhPT1mKXtmLnJldHVybj1nLnJldHVybjtnPWY7YnJlYWt9Zz1nLnJldHVybn1mPWd9WGkoYSxiLGUuY2hpbGRyZW4sYyk7Yj1iLmNoaWxkfXJldHVybiBiO2Nhc2UgOTpyZXR1cm4gZT1iLnR5cGUsZD1iLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixjaChiLGMpLGU9ZWgoZSksZD1kKGUpLGIuZmxhZ3N8PTEsWGkoYSxiLGQsYyksXG5iLmNoaWxkO2Nhc2UgMTQ6cmV0dXJuIGQ9Yi50eXBlLGU9Q2koZCxiLnBlbmRpbmdQcm9wcyksZT1DaShkLnR5cGUsZSksJGkoYSxiLGQsZSxjKTtjYXNlIDE1OnJldHVybiBiaihhLGIsYi50eXBlLGIucGVuZGluZ1Byb3BzLGMpO2Nhc2UgMTc6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOkNpKGQsZSksaWooYSxiKSxiLnRhZz0xLFpmKGQpPyhhPSEwLGNnKGIpKTphPSExLGNoKGIsYyksR2koYixkLGUpLElpKGIsZCxlLGMpLGpqKG51bGwsYixkLCEwLGEsYyk7Y2FzZSAxOTpyZXR1cm4geGooYSxiLGMpO2Nhc2UgMjI6cmV0dXJuIGRqKGEsYixjKX10aHJvdyBFcnJvcihwKDE1NixiLnRhZykpO307ZnVuY3Rpb24gRmsoYSxiKXtyZXR1cm4gYWMoYSxiKX1cbmZ1bmN0aW9uICRrKGEsYixjLGQpe3RoaXMudGFnPWE7dGhpcy5rZXk9Yzt0aGlzLnNpYmxpbmc9dGhpcy5jaGlsZD10aGlzLnJldHVybj10aGlzLnN0YXRlTm9kZT10aGlzLnR5cGU9dGhpcy5lbGVtZW50VHlwZT1udWxsO3RoaXMuaW5kZXg9MDt0aGlzLnJlZj1udWxsO3RoaXMucGVuZGluZ1Byb3BzPWI7dGhpcy5kZXBlbmRlbmNpZXM9dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPW51bGw7dGhpcy5tb2RlPWQ7dGhpcy5zdWJ0cmVlRmxhZ3M9dGhpcy5mbGFncz0wO3RoaXMuZGVsZXRpb25zPW51bGw7dGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MDt0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIEJnKGEsYixjLGQpe3JldHVybiBuZXcgJGsoYSxiLGMsZCl9ZnVuY3Rpb24gYWooYSl7YT1hLnByb3RvdHlwZTtyZXR1cm4hKCFhfHw
25114hYS5pc1JlYWN0Q29tcG9uZW50KX1cbmZ1bmN0aW9uIFprKGEpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKXJldHVybiBhaihhKT8xOjA7aWYodm9pZCAwIT09YSYmbnVsbCE9PWEpe2E9YS4kJHR5cGVvZjtpZihhPT09RGEpcmV0dXJuIDExO2lmKGE9PT1HYSlyZXR1cm4gMTR9cmV0dXJuIDJ9XG5mdW5jdGlvbiBQZyhhLGIpe3ZhciBjPWEuYWx0ZXJuYXRlO251bGw9PT1jPyhjPUJnKGEudGFnLGIsYS5rZXksYS5tb2RlKSxjLmVsZW1lbnRUeXBlPWEuZWxlbWVudFR5cGUsYy50eXBlPWEudHlwZSxjLnN0YXRlTm9kZT1hLnN0YXRlTm9kZSxjLmFsdGVybmF0ZT1hLGEuYWx0ZXJuYXRlPWMpOihjLnBlbmRpbmdQcm9wcz1iLGMudHlwZT1hLnR5cGUsYy5mbGFncz0wLGMuc3VidHJlZUZsYWdzPTAsYy5kZWxldGlvbnM9bnVsbCk7Yy5mbGFncz1hLmZsYWdzJjE0NjgwMDY0O2MuY2hpbGRMYW5lcz1hLmNoaWxkTGFuZXM7Yy5sYW5lcz1hLmxhbmVzO2MuY2hpbGQ9YS5jaGlsZDtjLm1lbW9pemVkUHJvcHM9YS5tZW1vaXplZFByb3BzO2MubWVtb2l6ZWRTdGF0ZT1hLm1lbW9pemVkU3RhdGU7Yy51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlO2I9YS5kZXBlbmRlbmNpZXM7Yy5kZXBlbmRlbmNpZXM9bnVsbD09PWI/bnVsbDp7bGFuZXM6Yi5sYW5lcyxmaXJzdENvbnRleHQ6Yi5maXJzdENvbnRleHR9O1xuYy5zaWJsaW5nPWEuc2libGluZztjLmluZGV4PWEuaW5kZXg7Yy5yZWY9YS5yZWY7cmV0dXJuIGN9XG5mdW5jdGlvbiBSZyhhLGIsYyxkLGUsZil7dmFyIGc9MjtkPWE7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpYWooYSkmJihnPTEpO2Vsc2UgaWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKWc9NTtlbHNlIGE6c3dpdGNoKGEpe2Nhc2UgeWE6cmV0dXJuIFRnKGMuY2hpbGRyZW4sZSxmLGIpO2Nhc2UgemE6Zz04O2V8PTg7YnJlYWs7Y2FzZSBBYTpyZXR1cm4gYT1CZygxMixjLGIsZXwyKSxhLmVsZW1lbnRUeXBlPUFhLGEubGFuZXM9ZixhO2Nhc2UgRWE6cmV0dXJuIGE9QmcoMTMsYyxiLGUpLGEuZWxlbWVudFR5cGU9RWEsYS5sYW5lcz1mLGE7Y2FzZSBGYTpyZXR1cm4gYT1CZygxOSxjLGIsZSksYS5lbGVtZW50VHlwZT1GYSxhLmxhbmVzPWYsYTtjYXNlIElhOnJldHVybiBwaihjLGUsZixiKTtkZWZhdWx0OmlmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpc3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgQmE6Zz0xMDticmVhayBhO2Nhc2UgQ2E6Zz05O2JyZWFrIGE7Y2FzZSBEYTpnPTExO1xuYnJlYWsgYTtjYXNlIEdhOmc9MTQ7YnJlYWsgYTtjYXNlIEhhOmc9MTY7ZD1udWxsO2JyZWFrIGF9dGhyb3cgRXJyb3IocCgxMzAsbnVsbD09YT9hOnR5cGVvZiBhLFwiXCIpKTt9Yj1CZyhnLGMsYixlKTtiLmVsZW1lbnRUeXBlPWE7Yi50eXBlPWQ7Yi5sYW5lcz1mO3JldHVybiBifWZ1bmN0aW9uIFRnKGEsYixjLGQpe2E9QmcoNyxhLGQsYik7YS5sYW5lcz1jO3JldHVybiBhfWZ1bmN0aW9uIHBqKGEsYixjLGQpe2E9QmcoMjIsYSxkLGIpO2EuZWxlbWVudFR5cGU9SWE7YS5sYW5lcz1jO2Euc3RhdGVOb2RlPXtpc0hpZGRlbjohMX07cmV0dXJuIGF9ZnVuY3Rpb24gUWcoYSxiLGMpe2E9QmcoNixhLG51bGwsYik7YS5sYW5lcz1jO3JldHVybiBhfVxuZnVuY3Rpb24gU2coYSxiLGMpe2I9QmcoNCxudWxsIT09YS5jaGlsZHJlbj9hLmNoaWxkcmVuOltdLGEua2V5LGIpO2IubGFuZXM9YztiLnN0YXRlTm9kZT17Y29udGFpbmVySW5mbzphLmNvbnRhaW5lckluZm8scGVuZGluZ0NoaWxkcmVuOm51bGwsaW1wbGVtZW50YXRpb246YS5pbXBsZW1lbnRhdGlvbn07cmV0dXJuIGJ9XG5mdW5jdGlvbiBhbChhLGIsYyxkLGUpe3RoaXMudGFnPWI7dGhpcy5jb250YWluZXJJbmZvPWE7dGhpcy5maW5pc2hlZFdvcms9dGhpcy5waW5nQ2FjaGU9dGhpcy5jdXJyZW50PXRoaXMucGVuZGluZ0NoaWxkcmVuPW51bGw7dGhpcy50aW1lb3V0SGFuZGxlPS0xO3RoaXMuY2FsbGJhY2tOb2RlPXRoaXMucGVuZGluZ0NvbnRleHQ9dGhpcy5jb250ZXh0PW51bGw7dGhpcy5jYWxsYmFja1ByaW9yaXR5PTA7dGhpcy5ldmVudFRpbWVzPXpjKDApO3RoaXMuZXhwaXJhdGlvblRpbWVzPXpjKC0xKTt0aGlzLmVudGFuZ2xlZExhbmVzPXRoaXMuZmluaXNoZWRMYW5lcz10aGlzLm11dGFibGVSZWFkTGFuZXM9dGhpcy5leHBpcmVkTGFuZXM9dGhpcy5waW5nZWRMYW5lcz10aGlzLnN1c3BlbmRlZExhbmVzPXRoaXMucGVuZGluZ0xhbmVzPTA7dGhpcy5lbnRhbmdsZW1lbnRzPXpjKDApO3RoaXMuaWRlbnRpZmllclByZWZpeD1kO3RoaXMub25SZWNvdmVyYWJsZUVycm9yPWU7dGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVxubnVsbH1mdW5jdGlvbiBibChhLGIsYyxkLGUsZixnLGgsayl7YT1uZXcgYWwoYSxiLGMsaCxrKTsxPT09Yj8oYj0xLCEwPT09ZiYmKGJ8PTgpKTpiPTA7Zj1CZygzLG51bGwsbnVsbCxiKTthLmN1cnJlbnQ9ZjtmLnN0YXRlTm9kZT1hO2YubWVtb2l6ZWRTdGF0ZT17ZWxlbWVudDpkLGlzRGVoeWRyYXRlZDpjLGNhY2hlOm51bGwsdHJhbnNpdGlvbnM6bnVsbCxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOm51bGx9O2toKGYpO3JldHVybiBhfWZ1bmN0aW9uIGNsKGEsYixjKXt2YXIgZD0zPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbDtyZXR1cm57JCR0eXBlb2Y6d2Esa2V5Om51bGw9PWQ/bnVsbDpcIlwiK2QsY2hpbGRyZW46YSxjb250YWluZXJJbmZvOmIsaW1wbGVtZW50YXRpb246Y319XG5mdW5jdGlvbiBkbChhKXtpZighYSlyZXR1cm4gVmY7YT1hLl9yZWFjdEludGVybmFsczthOntpZihWYihhKSE9PWF8fDEhPT1hLnRhZyl0aHJvdyBFcnJvcihwKDE3MCkpO3ZhciBiPWE7ZG97c3dpdGNoKGIudGFnKXtjYXNlIDM6Yj1iLnN0YXRlTm9kZS5jb250ZXh0O2JyZWFrIGE7Y2FzZSAxOmlmKFpmKGIudHlwZSkpe2I9Yi5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7YnJlYWsgYX19Yj1iLnJldHVybn13aGlsZShudWxsIT09Yik7dGhyb3cgRXJyb3IocCgxNzEpKTt9aWYoMT09PWEudGFnKXt2YXIgYz1hLnR5cGU7aWYoWmYoYykpcmV0dXJuIGJnKGEsYyxiKX1yZXR1cm4gYn1cbmZ1bmN0aW9uIGVsKGEsYixjLGQsZSxmLGcsaCxrKXthPWJsKGMsZCwhMCxhLGUsZixnLGgsayk7YS5jb250ZXh0PWRsKG51bGwpO2M9YS5jdXJyZW50O2Q9UigpO2U9eWkoYyk7Zj1taChkLGUpO2YuY2FsbGJhY2s9dm9pZCAwIT09YiYmbnVsbCE9PWI/YjpudWxsO25oKGMsZixlKTthLmN1cnJlbnQubGFuZXM9ZTtBYyhhLGUsZCk7RGsoYSxkKTtyZXR1cm4gYX1mdW5jdGlvbiBmbChhLGIsYyxkKXt2YXIgZT1iLmN1cnJlbnQsZj1SKCksZz15aShlKTtjPWRsKGMpO251bGw9PT1iLmNvbnRleHQ/Yi5jb250ZXh0PWM6Yi5wZW5kaW5nQ29udGV4dD1jO2I9bWgoZixnKTtiLnBheWxvYWQ9e2VsZW1lbnQ6YX07ZD12b2lkIDA9PT1kP251bGw6ZDtudWxsIT09ZCYmKGIuY2FsbGJhY2s9ZCk7YT1uaChlLGIsZyk7bnVsbCE9PWEmJihnaShhLGUsZyxmKSxvaChhLGUsZykpO3JldHVybiBnfVxuZnVuY3Rpb24gZ2woYSl7YT1hLmN1cnJlbnQ7aWYoIWEuY2hpbGQpcmV0dXJuIG51bGw7c3dpdGNoKGEuY2hpbGQudGFnKXtjYXNlIDU6cmV0dXJuIGEuY2hpbGQuc3RhdGVOb2RlO2RlZmF1bHQ6cmV0dXJuIGEuY2hpbGQuc3RhdGVOb2RlfX1mdW5jdGlvbiBobChhLGIpe2E9YS5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1hJiZudWxsIT09YS5kZWh5ZHJhdGVkKXt2YXIgYz1hLnJldHJ5TGFuZTthLnJldHJ5TGFuZT0wIT09YyYmYzxiP2M6Yn19ZnVuY3Rpb24gaWwoYSxiKXtobChhLGIpOyhhPWEuYWx0ZXJuYXRlKSYmaGwoYSxiKX1mdW5jdGlvbiBqbCgpe3JldHVybiBudWxsfXZhciBrbD1cImZ1bmN0aW9uXCI9PT10eXBlb2YgcmVwb3J0RXJyb3I/cmVwb3J0RXJyb3I6ZnVuY3Rpb24oYSl7Y29uc29sZS5lcnJvcihhKX07ZnVuY3Rpb24gbGwoYSl7dGhpcy5faW50ZXJuYWxSb290PWF9XG5tbC5wcm90b3R5cGUucmVuZGVyPWxsLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5faW50ZXJuYWxSb290O2lmKG51bGw9PT1iKXRocm93IEVycm9yKHAoNDA5KSk7ZmwoYSxiLG51bGwsbnVsbCl9O21sLnByb3RvdHlwZS51bm1vdW50PWxsLnByb3RvdHlwZS51bm1vdW50PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5faW50ZXJuYWxSb290O2lmKG51bGwhPT1hKXt0aGlzLl9pbnRlcm5hbFJvb3Q9bnVsbDt2YXIgYj1hLmNvbnRhaW5lckluZm87UmsoZnVuY3Rpb24oKXtmbChudWxsLGEsbnVsbCxudWxsKX0pO2JbdWZdPW51bGx9fTtmdW5jdGlvbiBtbChhKXt0
25114aGlzLl9pbnRlcm5hbFJvb3Q9YX1cbm1sLnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbj1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1IYygpO2E9e2Jsb2NrZWRPbjpudWxsLHRhcmdldDphLHByaW9yaXR5OmJ9O2Zvcih2YXIgYz0wO2M8UWMubGVuZ3RoJiYwIT09YiYmYjxRY1tjXS5wcmlvcml0eTtjKyspO1FjLnNwbGljZShjLDAsYSk7MD09PWMmJlZjKGEpfX07ZnVuY3Rpb24gbmwoYSl7cmV0dXJuISghYXx8MSE9PWEubm9kZVR5cGUmJjkhPT1hLm5vZGVUeXBlJiYxMSE9PWEubm9kZVR5cGUpfWZ1bmN0aW9uIG9sKGEpe3JldHVybiEoIWF8fDEhPT1hLm5vZGVUeXBlJiY5IT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlJiYoOCE9PWEubm9kZVR5cGV8fFwiIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlIFwiIT09YS5ub2RlVmFsdWUpKX1mdW5jdGlvbiBwbCgpe31cbmZ1bmN0aW9uIHFsKGEsYixjLGQsZSl7aWYoZSl7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe3ZhciBmPWQ7ZD1mdW5jdGlvbigpe3ZhciBhPWdsKGcpO2YuY2FsbChhKX19dmFyIGc9ZWwoYixkLGEsMCxudWxsLCExLCExLFwiXCIscGwpO2EuX3JlYWN0Um9vdENvbnRhaW5lcj1nO2FbdWZdPWcuY3VycmVudDtzZig4PT09YS5ub2RlVHlwZT9hLnBhcmVudE5vZGU6YSk7UmsoKTtyZXR1cm4gZ31mb3IoO2U9YS5sYXN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoZSk7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe3ZhciBoPWQ7ZD1mdW5jdGlvbigpe3ZhciBhPWdsKGspO2guY2FsbChhKX19dmFyIGs9YmwoYSwwLCExLG51bGwsbnVsbCwhMSwhMSxcIlwiLHBsKTthLl9yZWFjdFJvb3RDb250YWluZXI9azthW3VmXT1rLmN1cnJlbnQ7c2YoOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmEpO1JrKGZ1bmN0aW9uKCl7ZmwoYixrLGMsZCl9KTtyZXR1cm4ga31cbmZ1bmN0aW9uIHJsKGEsYixjLGQsZSl7dmFyIGY9Yy5fcmVhY3RSb290Q29udGFpbmVyO2lmKGYpe3ZhciBnPWY7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGUpe3ZhciBoPWU7ZT1mdW5jdGlvbigpe3ZhciBhPWdsKGcpO2guY2FsbChhKX19ZmwoYixnLGEsZSl9ZWxzZSBnPXFsKGMsYixhLGUsZCk7cmV0dXJuIGdsKGcpfUVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhLnRhZyl7Y2FzZSAzOnZhciBiPWEuc3RhdGVOb2RlO2lmKGIuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7dmFyIGM9dGMoYi5wZW5kaW5nTGFuZXMpOzAhPT1jJiYoQ2MoYixjfDEpLERrKGIsQigpKSwwPT09KEsmNikmJihHaj1CKCkrNTAwLGpnKCkpKX1icmVhaztjYXNlIDEzOlJrKGZ1bmN0aW9uKCl7dmFyIGI9aWgoYSwxKTtpZihudWxsIT09Yil7dmFyIGM9UigpO2dpKGIsYSwxLGMpfX0pLGlsKGEsMSl9fTtcbkZjPWZ1bmN0aW9uKGEpe2lmKDEzPT09YS50YWcpe3ZhciBiPWloKGEsMTM0MjE3NzI4KTtpZihudWxsIT09Yil7dmFyIGM9UigpO2dpKGIsYSwxMzQyMTc3MjgsYyl9aWwoYSwxMzQyMTc3MjgpfX07R2M9ZnVuY3Rpb24oYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9eWkoYSksYz1paChhLGIpO2lmKG51bGwhPT1jKXt2YXIgZD1SKCk7Z2koYyxhLGIsZCl9aWwoYSxiKX19O0hjPWZ1bmN0aW9uKCl7cmV0dXJuIEN9O0ljPWZ1bmN0aW9uKGEsYil7dmFyIGM9Qzt0cnl7cmV0dXJuIEM9YSxiKCl9ZmluYWxseXtDPWN9fTtcbnliPWZ1bmN0aW9uKGEsYixjKXtzd2l0Y2goYil7Y2FzZSBcImlucHV0XCI6YmIoYSxjKTtiPWMubmFtZTtpZihcInJhZGlvXCI9PT1jLnR5cGUmJm51bGwhPWIpe2ZvcihjPWE7Yy5wYXJlbnROb2RlOyljPWMucGFyZW50Tm9kZTtjPWMucXVlcnlTZWxlY3RvckFsbChcImlucHV0W25hbWU9XCIrSlNPTi5zdHJpbmdpZnkoXCJc
25114IitiKSsnXVt0eXBlPVwicmFkaW9cIl0nKTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKXt2YXIgZD1jW2JdO2lmKGQhPT1hJiZkLmZvcm09PT1hLmZvcm0pe3ZhciBlPURiKGQpO2lmKCFlKXRocm93IEVycm9yKHAoOTApKTtXYShkKTtiYihkLGUpfX19YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6aWIoYSxjKTticmVhaztjYXNlIFwic2VsZWN0XCI6Yj1jLnZhbHVlLG51bGwhPWImJmZiKGEsISFjLm11bHRpcGxlLGIsITEpfX07R2I9UWs7SGI9Ums7XG52YXIgc2w9e3VzaW5nQ2xpZW50RW50cnlQb2ludDohMSxFdmVudHM6W0NiLHVlLERiLEViLEZiLFFrXX0sdGw9e2ZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOldjLGJ1bmRsZVR5cGU6MCx2ZXJzaW9uOlwiMTguMy4xXCIscmVuZGVyZXJQYWNrYWdlTmFtZTpcInJlYWN0LWRvbVwifTtcbnZhciB1bD17YnVuZGxlVHlwZTp0bC5idW5kbGVUeXBlLHZlcnNpb246dGwudmVyc2lvbixyZW5kZXJlclBhY2thZ2VOYW1lOnRsLnJlbmRlcmVyUGFja2FnZU5hbWUscmVuZGVyZXJDb25maWc6dGwucmVuZGVyZXJDb25maWcsb3ZlcnJpZGVIb29rU3RhdGU6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzOm51bGwsb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzUmVuYW1lUGF0aDpudWxsLHNldEVycm9ySGFuZGxlcjpudWxsLHNldFN1c3BlbnNlSGFuZGxlcjpudWxsLHNjaGVkdWxlVXBkYXRlOm51bGwsY3VycmVudERpc3BhdGNoZXJSZWY6dWEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjpmdW5jdGlvbihhKXthPVpiKGEpO3JldHVybiBudWxsPT09YT9udWxsOmEuc3RhdGVOb2RlfSxmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTp0bC5maW5kRmliZXJCeUhvc3RJbnN0YW5jZXx8XG5qbCxmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6bnVsbCxzY2hlZHVsZVJlZnJlc2g6bnVsbCxzY2hlZHVsZVJvb3Q6bnVsbCxzZXRSZWZyZXNoSGFuZGxlcjpudWxsLGdldEN1cnJlbnRGaWJlcjpudWxsLHJlY29uY2lsZXJWZXJzaW9uOlwiMTguMy4xLW5leHQtZjEzMzhmODA4MC0yMDI0MDQyNlwifTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyl7dmFyIHZsPV9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztpZighdmwuaXNEaXNhYmxlZCYmdmwuc3VwcG9ydHNGaWJlcil0cnl7a2M9dmwuaW5qZWN0KHVsKSxsYz12bH1jYXRjaChhKXt9fWV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9c2w7XG5leHBvcnRzLmNyZWF0ZVBvcnRhbD1mdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsO2lmKCFubChiKSl0aHJvdyBFcnJvcihwKDIwMCkpO3JldHVybiBjbChhLGIsbnVsbCxjKX07ZXhwb3J0cy5jcmVhdGVSb290PWZ1bmN0aW9uKGEsYil7aWYoIW5sKGEpKXRocm93IEVycm9yKHAoMjk5KSk7dmFyIGM9ITEsZD1cIlwiLGU9a2w7bnVsbCE9PWImJnZvaWQgMCE9PWImJighMD09PWIudW5zdGFibGVfc3RyaWN0TW9kZSYmKGM9ITApLHZvaWQgMCE9PWIuaWRlbnRpZmllclByZWZpeCYmKGQ9Yi5pZGVudGlmaWVyUHJlZml4KSx2b2lkIDAhPT1iLm9uUmVjb3ZlcmFibGVFcnJvciYmKGU9Yi5vblJlY292ZXJhYmxlRXJyb3IpKTtiPWJsKGEsMSwhMSxudWxsLG51bGwsYywhMSxkLGUpO2FbdWZdPWIuY3VycmVudDtzZig4PT09YS5ub2RlVHlwZT9hLnBhcmVudE5vZGU6YSk7cmV0dXJuIG5ldyBsbChiKX07XG5leHBvcnRzLmZpbmRET01Ob2RlPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoMT09PWEubm9kZVR5cGUpcmV0dXJuIGE7dmFyIGI9YS5fcmVhY3RJbnRlcm5hbHM7aWYodm9pZCAwPT09Yil7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEucmVuZGVyKXRocm93IEVycm9yKHAoMTg4KSk7YT1PYmplY3Qua2V5cyhhKS5qb2luKFwiLFwiKTt0aHJvdyBFcnJvcihwKDI2OCxhKSk7fWE9WmIoYik7YT1udWxsPT09YT9udWxsOmEuc3RhdGVOb2RlO3JldHVybiBhfTtleHBvcnRzLmZsdXNoU3luYz1mdW5jdGlvbihhKXtyZXR1cm4gUmsoYSl9O2V4cG9ydHMuaHlkcmF0ZT1mdW5jdGlvbihhLGIsYyl7aWYoIW9sKGIpKXRocm93IEVycm9yKHAoMjAwKSk7cmV0dXJuIHJsKG51bGwsYSxiLCEwLGMpfTtcbmV4cG9ydHMuaHlkcmF0ZVJvb3Q9ZnVuY3Rpb24oYSxiLGMpe2lmKCFubChhKSl0aHJvdyBFcnJvcihwKDQwNSkpO3ZhciBkPW51bGwhPWMmJmMuaHlkcmF0ZWRTb3VyY2VzfHxudWxsLGU9ITEsZj1cIlwiLGc9a2w7bnVsbCE9PWMmJnZvaWQgMCE9PWMmJighMD09PWMudW5zdGFibGVfc3RyaWN0TW9kZSYmKGU9ITApLHZvaWQgMCE9PWMuaWRlbnRpZmllclByZWZpeCYmKGY9Yy5pZGVudGlmaWVyUHJlZml4KSx2b2lkIDAhPT1jLm9uUmVjb3ZlcmFibGVFcnJvciYmKGc9Yy5vblJlY292ZXJhYmxlRXJyb3IpKTtiPWVsKGIsbnVsbCxhLDEsbnVsbCE9Yz9jOm51bGwsZSwhMSxmLGcpO2FbdWZdPWIuY3VycmVudDtzZihhKTtpZihkKWZvcihhPTA7YTxkLmxlbmd0aDthKyspYz1kW2FdLGU9Yy5fZ2V0VmVyc2lvbixlPWUoYy5fc291cmNlKSxudWxsPT1iLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE/Yi5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVtjLGVdOmIubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKGMsXG5lKTtyZXR1cm4gbmV3IG1sKGIpfTtleHBvcnRzLnJlbmRlcj1mdW5jdGlvbihhLGIsYyl7aWYoIW9sKGIpKXRocm93IEVycm9yKHAoMjAwKSk7cmV0dXJuIHJsKG51bGwsYSxiLCExLGMpfTtleHBvcnRzLnVubW91bnRDb21wb25lbnRBdE5vZGU9ZnVuY3Rpb24oYSl7aWYoIW9sKGEpKXRocm93IEVycm9yKHAoNDApKTtyZXR1cm4gYS5fcmVhY3RSb290Q29udGFpbmVyPyhSayhmdW5jdGlvbigpe3JsKG51bGwsbnVsbCxhLCExLGZ1bmN0aW9uKCl7YS5fcmVhY3RSb290Q29udGFpbmVyPW51bGw7YVt1Zl09bnVsbH0pfSksITApOiExfTtleHBvcnRzLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzPVFrO1xuZXhwb3J0cy51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcj1mdW5jdGlvbihhLGIsYyxkKXtpZighb2woYykpdGhyb3cgRXJyb3IocCgyMDApKTtpZihudWxsPT1hfHx2b2lkIDA9PT1hLl9yZWFjdEludGVybmFscyl0aHJvdyBFcnJvcihwKDM4KSk7cmV0dXJuIHJsKGEsYixjLCExLGQpfTtleHBvcnRzLnZlcnNpb249XCIxOC4zLjEtbmV4dC1mMTMzOGY4MDgwLTIwMjQwNDI2XCI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19S
25114RUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBtLmNyZWF0ZVJvb3Q7XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBtLmh5ZHJhdGVSb290O1xufSBlbHNlIHtcbiAgdmFyIGkgPSBtLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBmdW5jdGlvbihjLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5jcmVhdGVSb290KGMsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgZXhwb3J0cy5oeWRyYXRlUm9vdCA9IGZ1bmN0aW9uKGMsIGgsIG8pIHtcbiAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtLmh5ZHJhdGVSb290KGMsIGgsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbn1cbiIsIi8vIHNyYy9zdWJzY3JpYmFibGUudHNcbnZhciBTdWJzY3JpYmFibGUgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICB0aGlzLnN1YnNjcmliZSA9IHRoaXMuc3Vic2NyaWJlLmJpbmQodGhpcyk7XG4gIH1cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICB0aGlzLm9uU3Vic2NyaWJlKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgICB0aGlzLm9uVW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICB9XG4gIGhhc0xpc3RlbmVycygpIHtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lcnMuc2l6ZSA+IDA7XG4gIH1cbiAgb25TdWJzY3JpYmUoKSB7XG4gIH1cbiAgb25VbnN1YnNjcmliZSgpIHtcbiAgfVxufTtcbmV4cG9ydCB7XG4gIFN1YnNjcmliYWJsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1YnNjcmliYWJsZS5qcy5tYXAiLCIvLyBzcmMvdGltZW91dE1hbmFnZXIudHNcbnZhciBkZWZhdWx0VGltZW91dFByb3ZpZGVyID0ge1xuICAvLyBXZSBuZWVkIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIHN5bnRheCBiZWxvdyBpbnN0ZWFkIG9mIGRpcmVjdCByZWZlcmVuY2VzIHRvXG4gIC8vIGdsb2JhbCBzZXRUaW1lb3V0IGV0Yy5cbiAgLy9cbiAgLy8gQkFEOiBgc2V0VGltZW91dDogc2V0VGltZW91dGBcbiAgLy8gR09PRDogYHNldFRpbWVvdXQ6IChjYiwgZGVsYXkpID0+IHNldFRpbWVvdXQoY2IsIGRlbGF5KWBcbiAgLy9cbiAgLy8gSWYgd2UgdXNlIGRpcmVjdCByZWZlcmVuY2VzIGhlcmUsIHRoZW4gYW55dGhpbmcgdGhhdCB3YW50cyB0byBzcHkgb24gb3JcbiAgLy8gcmVwbGFjZSB0aGUgZ2xvYmFsIHNldFRpbWVvdXQgKGxpa2UgdGVzdHMpIHdvbid0IHdvcmsgc2luY2Ugd2UnbGwgYWxyZWFkeVxuICAvLyBoYXZlIGEgaGFyZCByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGF0IHRoZSB0aW1lIHdoZW4gdGhpc1xuICAvLyBmaWxlIHdhcyBpbXBvcnRlZC5cbiAgc2V0VGltZW91dDogKGNhbGxiYWNrLCBkZWxheSkgPT4gc2V0VGltZW91dChjYWxsYmFjaywgZGVsYXkpLFxuICBjbGVhclRpbWVvdXQ6ICh0aW1lb3V0SWQpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0SWQpLFxuICBzZXRJbnRlcnZhbDogKGNhbGxiYWNrLCBkZWxheSkgPT4gc2V0SW50ZXJ2YWwoY2FsbGJhY2ssIGRlbGF5KSxcbiAgY2xlYXJJbnRlcnZhbDogKGludGVydmFsSWQpID0+IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZClcbn07XG52YXIgVGltZW91dE1hbmFnZXIgPSBjbGFzcyB7XG4gIC8vIFdlIGNhbm5vdCBoYXZlIFRpbWVvdXRNYW5hZ2VyPFQ+IGFzIHdlIG11c3QgaW5zdGFudGlhdGUgaXQgd2l0aCBhIGNvbmNyZXRlXG4gIC8vIHR5cGUgYXQgYXBwIGJvb3Q7IGFuZCBpZiB3ZSBsZWF2ZSB0aGF0IHR5cGUsIHR
25114oZW4gYW55IG5ldyB0aW1lciBwcm92aWRlclxuICAvLyB3b3VsZCBuZWVkIHRvIHN1cHBvcnQgUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4sIHdoaWNoIGlzIGluZmVhc2libGUuXG4gIC8vXG4gIC8vIFdlIHNldHRsZSBmb3IgdHlwZSBzYWZldHkgZm9yIHRoZSBUaW1lb3V0UHJvdmlkZXIgdHlwZSwgYW5kIGFjY2VwdCB0aGF0XG4gIC8vIHRoaXMgY2xhc3MgaXMgdW5zYWZlIGludGVybmFsbHkgdG8gYWxsb3cgZm9yIGV4dGVuc2lvbi5cbiAgI3Byb3ZpZGVyID0gZGVmYXVsdFRpbWVvdXRQcm92aWRlcjtcbiAgI3Byb3ZpZGVyQ2FsbGVkID0gZmFsc2U7XG4gIHNldFRpbWVvdXRQcm92aWRlcihwcm92aWRlcikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmICh0aGlzLiNwcm92aWRlckNhbGxlZCAmJiBwcm92aWRlciAhPT0gdGhpcy4jcHJvdmlkZXIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW3RpbWVvdXRNYW5hZ2VyXTogU3dpdGNoaW5nIHByb3ZpZGVyIGFmdGVyIGNhbGxzIHRvIHByZXZpb3VzIHByb3ZpZGVyIG1pZ2h0IHJlc3VsdCBpbiB1bmV4cGVjdGVkIGJlaGF2aW9yLmAsXG4gICAgICAgICAgeyBwcmV2aW91czogdGhpcy4jcHJvdmlkZXIsIHByb3ZpZGVyIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jcHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICB0aGlzLiNwcm92aWRlckNhbGxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkZWxheSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuI3Byb3ZpZGVyQ2FsbGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI3Byb3ZpZGVyLnNldFRpbWVvdXQoY2FsbGJhY2ssIGRlbGF5KTtcbiAgfVxuICBjbGVhclRpbWVvdXQodGltZW91dElkKSB7XG4gICAgdGhpcy4jcHJvdmlkZXIuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gIH1cbiAgc2V0SW50ZXJ2YWwoY2FsbGJhY2ssIGRlbGF5KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgdGhpcy4jcHJvdmlkZXJDYWxsZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jcHJvdmlkZXIuc2V0SW50ZXJ2YWwoY2FsbGJhY2ssIGRlbGF5KTtcbiAgfVxuICBjbGVhckludGVydmFsKGludGVydmFsSWQpIHtcbiAgICB0aGlzLiNwcm92aWRlci5jbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICB9XG59O1xudmFyIHRpbWVvdXRNYW5hZ2VyID0gbmV3IFRpbWVvdXRNYW5hZ2VyKCk7XG5mdW5jdGlvbiBzeXN0ZW1TZXRUaW1lb3V0WmVybyhjYWxsYmFjaykge1xuICBzZXRUaW1lb3V0KGNhbGxiYWNrLCAwKTtcbn1cbmV4cG9ydCB7XG4gIFRpbWVvdXRNYW5hZ2VyLFxuICBkZWZhdWx0VGltZW91dFByb3ZpZGVyLFxuICBzeXN0ZW1TZXRUaW1lb3V0WmVybyxcbiAgdGltZW91dE1hbmFnZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lb3V0TWFuYWdlci5qcy5tYXAiLCIvLyBzcmMvdXRpbHMudHNcbmltcG9ydCB7IHRpbWVvdXRNYW5hZ2VyIH0gZnJvbSBcIi4vdGltZW91dE1hbmFnZXIuanNcIjtcbnZhciBpc1NlcnZlciA9IHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgXCJEZW5vXCIgaW4gZ2xvYmFsVGhpcztcbmZ1bmN0aW9uIG5vb3AoKSB7XG59XG5mdW5jdGlvbiBmdW5jdGlvbmFsVXBkYXRlKHVwZGF0ZXIsIGlucHV0KSB7XG4gIHJldHVybiB0eXBlb2YgdXBkYXRlciA9PT0gXCJmdW5jdGlvblwiID8gdXBkYXRlcihpbnB1dCkgOiB1cGRhdGVyO1xufVxuZnVuY3Rpb24gaXNWYWxpZFRpbWVvdXQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiB2YWx1ZSA+PSAwICYmIHZhbHVlICE9PSBJbmZpbml0eTtcbn1cbmZ1bmN0aW9uIHRpbWVVbnRpbFN0YWxlKHVwZGF0ZWRBdCwgc3RhbGVUaW1lKSB7XG4gIHJldHVybiBNYXRoLm1heCh1cGRhdGVkQXQgKyAoc3RhbGVUaW1lIHx8IDApIC0gRGF0ZS5ub3coKSwgMCk7XG59XG5mdW5jdGlvbiByZXNvbHZlU3RhbGVUaW
251141lKHN0YWxlVGltZSwgcXVlcnkpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdGFsZVRpbWUgPT09IFwiZnVuY3Rpb25cIiA/IHN0YWxlVGltZShxdWVyeSkgOiBzdGFsZVRpbWU7XG59XG5mdW5jdGlvbiByZXNvbHZlRW5hYmxlZChlbmFibGVkLCBxdWVyeSkge1xuICByZXR1cm4gdHlwZW9mIGVuYWJsZWQgPT09IFwiZnVuY3Rpb25cIiA/IGVuYWJsZWQocXVlcnkpIDogZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIG1hdGNoUXVlcnkoZmlsdGVycywgcXVlcnkpIHtcbiAgY29uc3Qge1xuICAgIHR5cGUgPSBcImFsbFwiLFxuICAgIGV4YWN0LFxuICAgIGZldGNoU3RhdHVzLFxuICAgIHByZWRpY2F0ZSxcbiAgICBxdWVyeUtleSxcbiAgICBzdGFsZVxuICB9ID0gZmlsdGVycztcbiAgaWYgKHF1ZXJ5S2V5KSB7XG4gICAgaWYgKGV4YWN0KSB7XG4gICAgICBpZiAocXVlcnkucXVlcnlIYXNoICE9PSBoYXNoUXVlcnlLZXlCeU9wdGlvbnMocXVlcnlLZXksIHF1ZXJ5Lm9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFwYXJ0aWFsTWF0Y2hLZXkocXVlcnkucXVlcnlLZXksIHF1ZXJ5S2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAodHlwZSAhPT0gXCJhbGxcIikge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gcXVlcnkuaXNBY3RpdmUoKTtcbiAgICBpZiAodHlwZSA9PT0gXCJhY3RpdmVcIiAmJiAhaXNBY3RpdmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwiaW5hY3RpdmVcIiAmJiBpc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIHN0YWxlID09PSBcImJvb2xlYW5cIiAmJiBxdWVyeS5pc1N0YWxlKCkgIT09IHN0YWxlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChmZXRjaFN0YXR1cyAmJiBmZXRjaFN0YXR1cyAhPT0gcXVlcnkuc3RhdGUuZmV0Y2hTdGF0dXMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHByZWRpY2F0ZSAmJiAhcHJlZGljYXRlKHF1ZXJ5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG1hdGNoTXV0YXRpb24oZmlsdGVycywgbXV0YXRpb24pIHtcbiAgY29uc3QgeyBleGFjdCwgc3RhdHVzLCBwcmVkaWNhdGUsIG11dGF0aW9uS2V5IH0gPSBmaWx0ZXJzO1xuICBpZiAobXV0YXRpb25LZXkpIHtcbiAgICBpZiAoIW11dGF0aW9uLm9wdGlvbnMubXV0YXRpb25LZXkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGV4YWN0KSB7XG4gICAgICBpZiAoaGFzaEtleShtdXRhdGlvbi5vcHRpb25zLm11dGF0aW9uS2V5KSAhPT0gaGFzaEtleShtdXRhdGlvbktleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXBhcnRpYWxNYXRjaEtleShtdXRhdGlvbi5vcHRpb25zLm11dGF0aW9uS2V5LCBtdXRhdGlvbktleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKHN0YXR1cyAmJiBtdXRhdGlvbi5zdGF0ZS5zdGF0dXMgIT09IHN0YXR1cykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAocHJlZGljYXRlICYmICFwcmVkaWNhdGUobXV0YXRpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gaGFzaFF1ZXJ5S2V5QnlPcHRpb25zKHF1ZXJ5S2V5LCBvcHRpb25zKSB7XG4gIGNvbnN0IGhhc2hGbiA9IG9wdGlvbnM/LnF1ZXJ5S2V5SGFzaEZuIHx8IGhhc2hLZXk7XG4gIHJldHVybiBoYXNoRm4ocXVlcnlLZXkpO1xufVxuZnVuY3Rpb24gaGFzaEtleShxdWVyeUtleSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoXG4gICAgcXVlcnlLZXksXG4gICAgKF8sIHZhbCkgPT4gaXNQbGFpbk9iamVjdCh2YWwpID8gT2JqZWN0LmtleXModmFsKS5zb3J0KCkucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWxba2V5XTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwge30pIDogdmFsXG4gICk7XG59XG5mdW5jdGlvbiBwYXJ0aWFsTWF0Y2hLZXkoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGEgJiYgYiAmJiB0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhiKS5ldmVyeSgoa2V5KSA9PiBwYXJ0aWFsTWF0Y2hLZXkoYVtrZXldLCBiW2tleV0pKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIHJlcGxhY2VFcXVhbERlZXAoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiBhO1xuICB9XG4gIGNvbnN0IGFycmF5ID0gaXNQbGFpbkFycmF5KGEpICYmIGlzUGxhaW5BcnJheShiKTtcbiAgaWYgKCFhcnJheSAmJiAhKGlzUGxhaW5PYmplY3QoYSkgJiYgaXNQbGFpbk9iamVjdChiKSkpIHJldHVybiBiO1xuICBjb25zdCBhSXRlbXMgPSBhcnJheSA/IGEgOiBPYmplY3Qua2V5cyhhKTtcbiAgY29uc3QgYVNpemUgPSBhSXRlbXMubGVuZ3RoO1xuICBjb25zdCBiSXRlbXMgPSBhcnJheSA/IGIgOiBPYmplY3Qua2V5cyhiKTtcbiAgY29uc3QgYlNpemUgPSBiSXRlbXMubGVuZ3RoO1xuICBjb25zdCBjb3B5ID0gYXJyYXkgPyBuZXcgQXJyYXkoYlNpemUpIDoge307XG4gIGxldCBlcXVhbEl0ZW1zID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiU2l6ZTsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gYXJyYXkgPyBpIDogYkl0ZW1zW2ldO1xuICAgIGNvbnN0IGFJdGVtID0gYVtrZXldO1xuICAgIGNvbnN0IGJJdGVtID0gYltrZXldO1xuICAgIGlmIChhSXRlbSA9PT0gYkl0ZW0pIHtcbiAgICAgIGNvcHlba2V5XSA9IGFJdGVtO1xuICAgICAgaWYgKGFycmF5ID8gaSA8IGFTaXplIDogaGFzT3duLmNhbGwoYSwga2V5KSkgZXF1YWxJdGVtcysrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhSXRlbSA9PT0gbnVsbCB8fCBiSXRlbSA9PT0gbnVsbCB8fCB0eXBlb2YgYUl0ZW0gIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGJJdGVtICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb3B5W2tleV0gPSBiSXRlbTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2ID0gcmVwbGFjZUVxdWFsRGVlcChhSXRlbSwgYkl0ZW0pO1xuICAgIGNvcHlba2V5XSA9IHY7XG4gICAgaWYgKHYgPT09IGFJdGVtKSBlcXVhbEl0ZW1zKys7XG4gIH1cbiAgcmV0dXJuIGFTaXplID09PSBiU2l6ZSAmJiBlcXVhbEl0ZW1zID09PSBhU2l6ZSA/IGEgOiBjb3B5O1xufVxuZnVuY3Rpb24gc2hhbGxvd0VxdWFsT2JqZWN0cyhhLCBiKSB7XG4gIGlmICghYiB8fCBPYmplY3Qua2V5cyhhKS5sZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkge1xuICAgIHJldHVybi
25114BmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBhKSB7XG4gICAgaWYgKGFba2V5XSAhPT0gYltrZXldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gaXNQbGFpbkFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGg7XG59XG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG8pIHtcbiAgaWYgKCFoYXNPYmplY3RQcm90b3R5cGUobykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY3RvciA9IG8uY29uc3RydWN0b3I7XG4gIGlmIChjdG9yID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBwcm90ID0gY3Rvci5wcm90b3R5cGU7XG4gIGlmICghaGFzT2JqZWN0UHJvdG90eXBlKHByb3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghcHJvdC5oYXNPd25Qcm9wZXJ0eShcImlzUHJvdG90eXBlT2ZcIikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihvKSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGhhc09iamVjdFByb3RvdHlwZShvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09IFwiW29iamVjdCBPYmplY3RdXCI7XG59XG5mdW5jdGlvbiBzbGVlcCh0aW1lb3V0KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHRpbWVvdXRNYW5hZ2VyLnNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gcmVwbGFjZURhdGEocHJldkRhdGEsIGRhdGEsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLnN0cnVjdHVyYWxTaGFyaW5nID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHJ1Y3R1cmFsU2hhcmluZyhwcmV2RGF0YSwgZGF0YSk7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5zdHJ1Y3R1cmFsU2hhcmluZyAhPT0gZmFsc2UpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVwbGFjZUVxdWFsRGVlcChwcmV2RGF0YSwgZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBTdHJ1Y3R1cmFsIHNoYXJpbmcgcmVxdWlyZXMgZGF0YSB0byBiZSBKU09OIHNlcmlhbGl6YWJsZS4gVG8gZml4IHRoaXMsIHR1cm4gb2ZmIHN0cnVjdHVyYWxTaGFyaW5nIG9yIHJldHVybiBKU09OLXNlcmlhbGl6YWJsZSBkYXRhIGZyb20geW91ciBxdWVyeUZuLiBbJHtvcHRpb25zLnF1ZXJ5SGFzaH1dOiAke2Vycm9yfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXBsYWNlRXF1YWxEZWVwKHByZXZEYXRhLCBkYXRhKTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cbmZ1bmN0aW9uIGtlZXBQcmV2aW91c0RhdGEocHJldmlvdXNEYXRhKSB7XG4gIHJldHVybiBwcmV2aW91c0RhdGE7XG59XG5mdW5jdGlvbiBhZGRUb0VuZChpdGVtcywgaXRlbSwgbWF4ID0gMCkge1xuICBjb25zdCBuZXdJdGVtcyA9IFsuLi5pdGVtcywgaXRlbV07XG4gIHJldHVybiBtYXggJiYgbmV3SXRlbXMubGVuZ3RoID4gbWF4ID8gbmV3SXRlbXMuc2xpY2UoMSkgOiBuZXdJdGVtcztcbn1cbmZ1bmN0aW9uIGFkZFRvU3RhcnQoaXRlbXMsIGl0ZW0sIG1heCA9IDApIHtcbiAgY29uc3QgbmV3SXRlbXMgPSBbaXRlbSwgLi4uaXRlbXNdO1xuICByZXR1cm4gbWF4ICYmIG5ld0l0ZW1zLmxlbmd0aCA+IG1heCA/IG5ld0l0ZW1zLnNsaWNlKDAsIC0xKSA6IG5ld0l0ZW1zO1xufVxudmFyIHNraXBUb2tlbiA9IFN5bWJvbCgpO1xuZnVuY3Rpb24gZW5zdXJlUXVlcnlGbihvcHRpb25zLCBmZXRjaE9wdGlvbnMpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmIChvcHRpb25zLnF1ZXJ5Rm4gPT09IHNraXBUb2tlbikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEF0dGVtcHRlZCB0byBpbnZva2UgcXVlcnlGbiB3aGVuIHNldCB0byBza2lwVG9rZW4uIFRoaXMgaXMgbGlrZWx5IGEgY29uZmlndXJhdGlvbiBlcnJvci4gUXVlcnkgaGFzaDogJyR7b3B0aW9ucy5xdWVyeUhhc2h9J2BcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGlmICghb3B0aW9ucy5xdWVyeUZuICYmIGZldGNoT3B0aW9ucz8uaW5pdGlhbFByb21pc2UpIHtcbiAgICByZXR1cm4gKCkgPT4gZmV0Y2hPcHRpb25zLmluaXRpYWxQcm9taXNlO1xuICB9XG4gIGlmICghb3B0aW9ucy5xdWVyeUZuIHx8IG9wdGlvbnMucXVlcnlGbiA9PT0gc2tpcFRva2VuKSB7XG4gICAgcmV0dXJuICgpID0+IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTWlzc2luZyBxdWVyeUZuOiAnJHtvcHRpb25zLnF1ZXJ5SGFzaH0nYCkpO1xuICB9XG4gIHJldHVybiBvcHRpb25zLnF1ZXJ5Rm47XG59XG5mdW5jdGlvbiBzaG91bGRUaHJvd0Vycm9yKHRocm93T25FcnJvciwgcGFyYW1zKSB7XG4gIGlmICh0eXBlb2YgdGhyb3dPbkVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdGhyb3dPbkVycm9yKC4uLnBhcmFtcyk7XG4gIH1cbiAgcmV0dXJuICEhdGhyb3dPbkVycm9yO1xufVxuZXhwb3J0IHtcbiAgYWRkVG9FbmQsXG4gIGFkZFRvU3RhcnQsXG4gIGVuc3VyZVF1ZXJ5Rm4sXG4gIGZ1bmN0aW9uYWxVcGRhdGUsXG4gIGhhc2hLZXksXG4gIGhhc2hRdWVyeUtleUJ5T3B0aW9ucyxcbiAgaXNQbGFpbkFycmF5LFxuICBpc1BsYWluT2JqZWN0LFxuICBpc1NlcnZlcixcbiAgaXNWYWxpZFRpbWVvdXQsXG4gIGtlZXBQcmV2aW91c0RhdGEsXG4gIG1hdGNoTXV0YXRpb24sXG4gIG1hdGNoUXVlcnksXG4gIG5vb3AsXG4gIHBhcnRpYWxNYXRjaEtleSxcbiAgcmVwbGFjZURhdGEsXG4gIHJlcGxhY2VFcXVhbERlZXAsXG4gIHJlc29sdmVFbmFibGVkLFxuICByZXNvbHZlU3RhbGVUaW
251141lLFxuICBzaGFsbG93RXF1YWxPYmplY3RzLFxuICBzaG91bGRUaHJvd0Vycm9yLFxuICBza2lwVG9rZW4sXG4gIHNsZWVwLFxuICB0aW1lVW50aWxTdGFsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIi8vIHNyYy9mb2N1c01hbmFnZXIudHNcbmltcG9ydCB7IFN1YnNjcmliYWJsZSB9IGZyb20gXCIuL3N1YnNjcmliYWJsZS5qc1wiO1xuaW1wb3J0IHsgaXNTZXJ2ZXIgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xudmFyIEZvY3VzTWFuYWdlciA9IGNsYXNzIGV4dGVuZHMgU3Vic2NyaWJhYmxlIHtcbiAgI2ZvY3VzZWQ7XG4gICNjbGVhbnVwO1xuICAjc2V0dXA7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jc2V0dXAgPSAob25Gb2N1cykgPT4ge1xuICAgICAgaWYgKCFpc1NlcnZlciAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9ICgpID0+IG9uRm9jdXMoKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIGxpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9O1xuICB9XG4gIG9uU3Vic2NyaWJlKCkge1xuICAgIGlmICghdGhpcy4jY2xlYW51cCkge1xuICAgICAgdGhpcy5zZXRFdmVudExpc3RlbmVyKHRoaXMuI3NldHVwKTtcbiAgICB9XG4gIH1cbiAgb25VbnN1YnNjcmliZSgpIHtcbiAgICBpZiAoIXRoaXMuaGFzTGlzdGVuZXJzKCkpIHtcbiAgICAgIHRoaXMuI2NsZWFudXA/LigpO1xuICAgICAgdGhpcy4jY2xlYW51cCA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgc2V0RXZlbnRMaXN0ZW5lcihzZXR1cCkge1xuICAgIHRoaXMuI3NldHVwID0gc2V0dXA7XG4gICAgdGhpcy4jY2xlYW51cD8uKCk7XG4gICAgdGhpcy4jY2xlYW51cCA9IHNldHVwKChmb2N1c2VkKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGZvY3VzZWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9jdXNlZChmb2N1c2VkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25Gb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHNldEZvY3VzZWQoZm9jdXNlZCkge1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLiNmb2N1c2VkICE9PSBmb2N1c2VkO1xuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICB0aGlzLiNmb2N1c2VkID0gZm9jdXNlZDtcbiAgICAgIHRoaXMub25Gb2N1cygpO1xuICAgIH1cbiAgfVxuICBvbkZvY3VzKCkge1xuICAgIGNvbnN0IGlzRm9jdXNlZCA9IHRoaXMuaXNGb2N1c2VkKCk7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgIGxpc3RlbmVyKGlzRm9jdXNlZCk7XG4gICAgfSk7XG4gIH1cbiAgaXNGb2N1c2VkKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy4jZm9jdXNlZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLiNmb2N1c2VkO1xuICAgIH1cbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5kb2N1bWVudD8udmlzaWJpbGl0eVN0YXRlICE9PSBcImhpZGRlblwiO1xuICB9XG59O1xudmFyIGZvY3VzTWFuYWdlciA9IG5ldyBGb2N1c01hbmFnZXIoKTtcbmV4cG9ydCB7XG4gIEZvY3VzTWFuYWdlcixcbiAgZm9jdXNNYW5hZ2VyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9jdXNNYW5hZ2VyLmpzLm1hcCIsIi8vIHNyYy90aGVuYWJsZS50c1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5mdW5jdGlvbiBwZW5kaW5nVGhlbmFibGUoKSB7XG4gIGxldCByZXNvbHZlO1xuICBsZXQgcmVqZWN0O1xuICBjb25zdCB0aGVuYWJsZSA9IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuICAgIHJlc29sdmUgPSBfcmVzb2x2ZTtcbiAgICByZWplY3QgPSBfcmVqZWN0O1xuICB9KTtcbiAgdGhlbmFibGUuc3RhdHVzID0gXCJwZW5kaW5nXCI7XG4gIHRoZW5hYmxlLmNhdGNoKCgpID0+IHtcbiAgfSk7XG4gIGZ1bmN0aW9uIGZpbmFsaXplKGRhdGEpIHtcbiAgICBPYmplY3QuYXNzaWduKHRoZW5hYmxlLCBkYXRhKTtcbiAgICBkZWxldGUgdGhlbmFibGUucmVzb2x2ZTtcbiAgICBkZWxldGUgdGhlbmFibGUucmVqZWN0O1xuICB9XG4gIHRoZW5hYmxlLnJlc29sdmUgPSAodmFsdWUpID0+IHtcbiAgICBmaW5hbGl6ZSh7XG4gICAgICBzdGF0dXM6IFwiZnVsZmlsbGVkXCIsXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICAgIHJlc29sdmUodmFsdWUpO1xuICB9O1xuICB0aGVuYWJsZS5yZWplY3QgPSAocmVhc29uKSA9PiB7XG4gICAgZmluYWxpemUoe1xuICAgICAgc3RhdHVzOiBcInJlamVjdGVkXCIsXG4gICAgICByZWFzb25cbiAgICB9KTtcbiAgICByZWplY3QocmVhc29uKTtcbiAgfTtcbiAgcmV0dXJuIHRoZW5hYmxlO1xufVxuZnVuY3Rpb24gdHJ5UmVzb2x2ZVN5bmMocHJvbWlzZSkge1xuICBsZXQgZGF0YTtcbiAgcHJvbWlzZS50aGVuKChyZXN1bHQpID0+IHtcbiAgICBkYXRhID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIG5vb3ApPy5jYXRjaChub29wKTtcbiAgaWYgKGRhdGEgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiB7IGRhdGEgfTtcbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuZXhwb3J0IHtcbiAgcGVuZGluZ1RoZW5hYmxlLFxuICB0cnlSZXNvbHZlU3luY1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRoZW5hYmxlLmpzLm1hcCIsIi8vIHNyYy9oeWRyYXRpb24udHNcbmltcG9ydCB7IHRyeVJlc29sdmVTeW5jIH0gZnJvbSBcIi4vdGhlbmFibGUuanNcIjtcbmZ1bmN0aW9uIGRlZmF1bHRUcmFuc2Zvcm1lckZuKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGE7XG59XG5mdW5jdGlvbiBkZWh5ZHJhdGVNdXRhdGlvbihtdXRhdGlvbikge1xuICByZXR1cm4ge1xuICAgIG11dGF0aW9uS2V5OiBtdXRhdGlvbi5vcHRpb25zLm11dGF0aW9uS2V5LFxuICAgIHN0YXRlOiBtdXRhdGlvbi5zdGF0ZSxcbiAgICAuLi5tdXRhdGlvbi5vcHRpb25zLnNjb3BlICYmIHsgc2NvcGU6IG11dGF0aW9uLm9wdGlvbnMuc2NvcGUgfSxcbiAgICAuLi5tdXRhdGlvbi5tZXRhICYmIHsgbWV0YTogbXV0YXRpb24ubWV0YSB9XG4gIH07XG59XG5mdW5jdGlvbiBkZWh5ZHJhdGVRdWVyeShxdWVyeSwgc2VyaWFsaXplRGF0YSwgc2hvdWxkUmVkYWN0RXJyb3JzKSB7XG4gIHJldHVybi
25114B7XG4gICAgZGVoeWRyYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgIHN0YXRlOiB7XG4gICAgICAuLi5xdWVyeS5zdGF0ZSxcbiAgICAgIC4uLnF1ZXJ5LnN0YXRlLmRhdGEgIT09IHZvaWQgMCAmJiB7XG4gICAgICAgIGRhdGE6IHNlcmlhbGl6ZURhdGEocXVlcnkuc3RhdGUuZGF0YSlcbiAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5S2V5OiBxdWVyeS5xdWVyeUtleSxcbiAgICBxdWVyeUhhc2g6IHF1ZXJ5LnF1ZXJ5SGFzaCxcbiAgICAuLi5xdWVyeS5zdGF0ZS5zdGF0dXMgPT09IFwicGVuZGluZ1wiICYmIHtcbiAgICAgIHByb21pc2U6IHF1ZXJ5LnByb21pc2U/LnRoZW4oc2VyaWFsaXplRGF0YSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGlmICghc2hvdWxkUmVkYWN0RXJyb3JzKGVycm9yKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgQSBxdWVyeSB0aGF0IHdhcyBkZWh5ZHJhdGVkIGFzIHBlbmRpbmcgZW5kZWQgdXAgcmVqZWN0aW5nLiBbJHtxdWVyeS5xdWVyeUhhc2h9XTogJHtlcnJvcn07IFRoZSBlcnJvciB3aWxsIGJlIHJlZGFjdGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInJlZGFjdGVkXCIpKTtcbiAgICAgIH0pXG4gICAgfSxcbiAgICAuLi5xdWVyeS5tZXRhICYmIHsgbWV0YTogcXVlcnkubWV0YSB9XG4gIH07XG59XG5mdW5jdGlvbiBkZWZhdWx0U2hvdWxkRGVoeWRyYXRlTXV0YXRpb24obXV0YXRpb24pIHtcbiAgcmV0dXJuIG11dGF0aW9uLnN0YXRlLmlzUGF1c2VkO1xufVxuZnVuY3Rpb24gZGVmYXVsdFNob3VsZERlaHlkcmF0ZVF1ZXJ5KHF1ZXJ5KSB7XG4gIHJldHVybiBxdWVyeS5zdGF0ZS5zdGF0dXMgPT09IFwic3VjY2Vzc1wiO1xufVxuZnVuY3Rpb24gZGVmYXVsdFNob3VsZFJlZGFjdEVycm9ycyhfKSB7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZGVoeWRyYXRlKGNsaWVudCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGZpbHRlck11dGF0aW9uID0gb3B0aW9ucy5zaG91bGREZWh5ZHJhdGVNdXRhdGlvbiA/PyBjbGllbnQuZ2V0RGVmYXVsdE9wdGlvbnMoKS5kZWh5ZHJhdGU/LnNob3VsZERlaHlkcmF0ZU11dGF0aW9uID8/IGRlZmF1bHRTaG91bGREZWh5ZHJhdGVNdXRhdGlvbjtcbiAgY29uc3QgbXV0YXRpb25zID0gY2xpZW50LmdldE11dGF0aW9uQ2FjaGUoKS5nZXRBbGwoKS5mbGF0TWFwKFxuICAgIChtdXRhdGlvbikgPT4gZmlsdGVyTXV0YXRpb24obXV0YXRpb24pID8gW2RlaHlkcmF0ZU11dGF0aW9uKG11dGF0aW9uKV0gOiBbXVxuICApO1xuICBjb25zdCBmaWx0ZXJRdWVyeSA9IG9wdGlvbnMuc2hvdWxkRGVoeWRyYXRlUXVlcnkgPz8gY2xpZW50LmdldERlZmF1bHRPcHRpb25zKCkuZGVoeWRyYXRlPy5zaG91bGREZWh5ZHJhdGVRdWVyeSA/PyBkZWZhdWx0U2hvdWxkRGVoeWRyYXRlUXVlcnk7XG4gIGNvbnN0IHNob3VsZFJlZGFjdEVycm9ycyA9IG9wdGlvbnMuc2hvdWxkUmVkYWN0RXJyb3JzID8/IGNsaWVudC5nZXREZWZhdWx0T3B0aW9ucygpLmRlaHlkcmF0ZT8uc2hvdWxkUmVkYWN0RXJyb3JzID8/IGRlZmF1bHRTaG91bGRSZWRhY3RFcnJvcnM7XG4gIGNvbnN0IHNlcmlhbGl6ZURhdGEgPSBvcHRpb25zLnNlcmlhbGl6ZURhdGEgPz8gY2xpZW50LmdldERlZmF1bHRPcHRpb25zKCkuZGVoeWRyYXRlPy5zZXJpYWxpemVEYXRhID8/IGRlZmF1bHRUcmFuc2Zvcm1lckZuO1xuICBjb25zdCBxdWVyaWVzID0gY2xpZW50LmdldFF1ZXJ5Q2FjaGUoKS5nZXRBbGwoKS5mbGF0TWFwKFxuICAgIChxdWVyeSkgPT4gZmlsdGVyUXVlcnkocXVlcnkpID8gW2RlaHlkcmF0ZVF1ZXJ5KHF1ZXJ5LCBzZXJpYWxpemVEYXRhLCBzaG91bGRSZWRhY3RFcnJvcnMpXSA6IFtdXG4gICk7XG4gIHJldHVybiB7IG11dGF0aW9ucywgcXVlcmllcyB9O1xufVxuZnVuY3Rpb24gaHlkcmF0ZShjbGllbnQsIGRlaHlkcmF0ZWRTdGF0ZSwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGRlaHlkcmF0ZWRTdGF0ZSAhPT0gXCJvYmplY3RcIiB8fCBkZWh5ZHJhdGVkU3RhdGUgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbXV0YXRpb25DYWNoZSA9IGNsaWVudC5nZXRNdXRhdGlvbkNhY2hlKCk7XG4gIGNvbnN0IHF1ZXJ5Q2FjaGUgPSBjbGllbnQuZ2V0UXVlcnlDYWNoZSgpO1xuICBjb25zdCBkZXNlcmlhbGl6ZURhdGEgPSBvcHRpb25zPy5kZWZhdWx0T3B0aW9ucz8uZGVzZXJpYWxpemVEYXRhID8/IGNsaWVudC5nZXREZWZhdWx0T3B0aW9ucygpLmh5ZHJhdGU/LmRlc2VyaWFsaXplRGF0YSA/PyBkZWZhdWx0VHJhbnNmb3JtZXJGbjtcbiAgY29uc3QgbXV0YXRpb25zID0gZGVoeWRyYXRlZFN0YXRlLm11dGF0aW9ucyB8fCBbXTtcbiAgY29uc3QgcXVlcmllcyA9IGRlaHlkcmF0ZWRTdGF0ZS5xdWVyaWVzIHx8IFtdO1xuICBtdXRhdGlvbnMuZm9yRWFjaCgoeyBzdGF0ZSwgLi4ubXV0YXRpb25PcHRpb25zIH0pID0+IHtcbiAgICBtdXRhdGlvbkNhY2hlLmJ1aWxkKFxuICAgICAgY2xpZW50LFxuICAgICAge1xuICAgICAgICAuLi5jbGllbnQuZ2V0RGVmYXVsdE9wdGlvbnMoKS5oeWRyYXRlPy5tdXRhdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnM/LmRlZmF1bHRPcHRpb25zPy5tdXRhdGlvbnMsXG4gICAgICAgIC4uLm11dGF0aW9uT3B0aW9uc1xuICAgICAgfSxcbiAgICAgIHN0YXRlXG4gICAgKTtcbiAgfSk7XG4gIHF1ZXJpZXMuZm9yRWFjaChcbiAgICAoeyBxdWVyeUtleSwgc3RhdGUsIHF1ZXJ5SGFzaCwgbWV0YSwgcHJvbWlzZSwgZGVoeWRyYXRlZEF0IH0pID0+IHtcbiAgICAgIGNvbnN0IHN5bmNEYXRhID0gcHJvbWlzZSA/IHRyeVJlc29sdmVTeW5jKHByb21pc2UpIDogdm9pZCAwO1xuICAgICAgY29uc3QgcmF3RGF0YSA9IHN0YXRlLmRhdGEgPT09IHZvaWQgMCA/IHN5bmNEYXRhPy5kYXRhIDogc3RhdGUuZGF0YTtcbiAgICAgIGNvbnN0IGRhdGEgPSByYXdEYXRhID09PSB2b2lkIDAgPyByYXdEYXRhIDogZGVzZXJpYWxpemVEYXRhKHJhd0RhdGEpO1xuICAgICAgbGV0IHF1ZXJ5ID0gcXVlcnlDYWNoZS5nZXQocXVlcnlIYXNoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUXVlcnlJc1BlbmRpbmcgPSBxdWVyeT8uc3RhdGUuc3RhdHVzID09PSBcInBlbmRpbmdcIjtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUXVlcnlJc0ZldGNoaW5nID0gcXVlcnk/LnN0YXRlLmZldGNoU3RhdHVzID09PSBcImZldGNoaW5nXCI7XG4gICAgICBpZiAocXVlcnkpIHtcbiAgICAgICAgY29uc3QgaGFzTmV3ZXJTeW5jRGF0YSA9IHN5bmNEYXRhICYmIC8vIFdlIG9ubHkgbmVlZCB0aGlzIHVuZGVmaW5lZCBjaGVjayB0byBoYW5kbGUgb2xkZXIgZGVoeWRyYXRpb25cbiAgICAgICAgLy8gcGF5bG9hZHMgdGh
25114hdCBtaWdodCBub3QgaGF2ZSBkZWh5ZHJhdGVkQXRcbiAgICAgICAgZGVoeWRyYXRlZEF0ICE9PSB2b2lkIDAgJiYgZGVoeWRyYXRlZEF0ID4gcXVlcnkuc3RhdGUuZGF0YVVwZGF0ZWRBdDtcbiAgICAgICAgaWYgKHN0YXRlLmRhdGFVcGRhdGVkQXQgPiBxdWVyeS5zdGF0ZS5kYXRhVXBkYXRlZEF0IHx8IGhhc05ld2VyU3luY0RhdGEpIHtcbiAgICAgICAgICBjb25zdCB7IGZldGNoU3RhdHVzOiBfaWdub3JlZCwgLi4uc2VyaWFsaXplZFN0YXRlIH0gPSBzdGF0ZTtcbiAgICAgICAgICBxdWVyeS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi5zZXJpYWxpemVkU3RhdGUsXG4gICAgICAgICAgICBkYXRhXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnlDYWNoZS5idWlsZChcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uY2xpZW50LmdldERlZmF1bHRPcHRpb25zKCkuaHlkcmF0ZT8ucXVlcmllcyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnM/LmRlZmF1bHRPcHRpb25zPy5xdWVyaWVzLFxuICAgICAgICAgICAgcXVlcnlLZXksXG4gICAgICAgICAgICBxdWVyeUhhc2gsXG4gICAgICAgICAgICBtZXRhXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBSZXNldCBmZXRjaCBzdGF0dXMgdG8gaWRsZSB0byBhdm9pZFxuICAgICAgICAgIC8vIHF1ZXJ5IGJlaW5nIHN0dWNrIGluIGZldGNoaW5nIHN0YXRlIHVwb24gaHlkcmF0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgZmV0Y2hTdGF0dXM6IFwiaWRsZVwiLFxuICAgICAgICAgICAgc3RhdHVzOiBkYXRhICE9PSB2b2lkIDAgPyBcInN1Y2Nlc3NcIiA6IHN0YXRlLnN0YXR1c1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9taXNlICYmICFleGlzdGluZ1F1ZXJ5SXNQZW5kaW5nICYmICFleGlzdGluZ1F1ZXJ5SXNGZXRjaGluZyAmJiAvLyBPbmx5IGh5ZHJhdGUgaWYgZGVoeWRyYXRpb24gaXMgbmV3ZXIgdGhhbiBhbnkgZXhpc3RpbmcgZGF0YSxcbiAgICAgIC8vIHRoaXMgaXMgYWx3YXlzIHRydWUgZm9yIG5ldyBxdWVyaWVzXG4gICAgICAoZGVoeWRyYXRlZEF0ID09PSB2b2lkIDAgfHwgZGVoeWRyYXRlZEF0ID4gcXVlcnkuc3RhdGUuZGF0YVVwZGF0ZWRBdCkpIHtcbiAgICAgICAgdm9pZCBxdWVyeS5mZXRjaCh2b2lkIDAsIHtcbiAgICAgICAgICAvLyBSU0MgdHJhbnNmb3JtZWQgcHJvbWlzZXMgYXJlIG5vdCB0aGVuYWJsZVxuICAgICAgICAgIGluaXRpYWxQcm9taXNlOiBQcm9taXNlLnJlc29sdmUocHJvbWlzZSkudGhlbihkZXNlcmlhbGl6ZURhdGEpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cbmV4cG9ydCB7XG4gIGRlZmF1bHRTaG91bGREZWh5ZHJhdGVNdXRhdGlvbixcbiAgZGVmYXVsdFNob3VsZERlaHlkcmF0ZVF1ZXJ5LFxuICBkZWh5ZHJhdGUsXG4gIGh5ZHJhdGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oeWRyYXRpb24uanMubWFwIiwiLy8gc3JjL25vdGlmeU1hbmFnZXIudHNcbmltcG9ydCB7IHN5c3RlbVNldFRpbWVvdXRaZXJvIH0gZnJvbSBcIi4vdGltZW91dE1hbmFnZXIuanNcIjtcbnZhciBkZWZhdWx0U2NoZWR1bGVyID0gc3lzdGVtU2V0VGltZW91dFplcm87XG5mdW5jdGlvbiBjcmVhdGVOb3RpZnlNYW5hZ2VyKCkge1xuICBsZXQgcXVldWUgPSBbXTtcbiAgbGV0IHRyYW5zYWN0aW9ucyA9IDA7XG4gIGxldCBub3RpZnlGbiA9IChjYWxsYmFjaykgPT4ge1xuICAgIGNhbGxiYWNrKCk7XG4gIH07XG4gIGxldCBiYXRjaE5vdGlmeUZuID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgY2FsbGJhY2soKTtcbiAgfTtcbiAgbGV0IHNjaGVkdWxlRm4gPSBkZWZhdWx0U2NoZWR1bGVyO1xuICBjb25zdCBzY2hlZHVsZSA9IChjYWxsYmFjaykgPT4ge1xuICAgIGlmICh0cmFuc2FjdGlvbnMpIHtcbiAgICAgIHF1ZXVlLnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlZHVsZUZuKCgpID0+IHtcbiAgICAgICAgbm90aWZ5Rm4oY2FsbGJhY2spO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBmbHVzaCA9ICgpID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbFF1ZXVlID0gcXVldWU7XG4gICAgcXVldWUgPSBbXTtcbiAgICBpZiAob3JpZ2luYWxRdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHNjaGVkdWxlRm4oKCkgPT4ge1xuICAgICAgICBiYXRjaE5vdGlmeUZuKCgpID0+IHtcbiAgICAgICAgICBvcmlnaW5hbFF1ZXVlLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICBub3RpZnlGbihjYWxsYmFjayk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4ge1xuICAgIGJhdGNoOiAoY2FsbGJhY2spID0+IHtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICB0cmFuc2FjdGlvbnMrKztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cmFuc2FjdGlvbnMtLTtcbiAgICAgICAgaWYgKCF0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQWxsIGNhbGxzIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uIHdpbGwgYmUgYmF0Y2hlZC5cbiAgICAgKi9cbiAgICBiYXRjaENhbGxzOiAoY2FsbGJhY2spID0+IHtcbiAgICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgICBzY2hlZHVsZSgoKSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9LFxuICAgIHNjaGVkdWxlLFxuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBzZXQgYSBjdXN0b20gbm90aWZ5IGZ1bmN0aW9uLlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gZm9yIGV4YW1wbGUgd3JhcCBub3RpZmljYXRpb25zIHdpdGggYFJlYWN0LmFjdGAgd2hpbGUgcnVubmluZyB0ZXN0cy5cbiAgICAgKi9cbiAgICBzZXROb3RpZnlGdW5jdGlvbjogKGZuKSA9PiB7XG4gICAgICBub3RpZnlGbiA9IGZuO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHNldCBhIGN1c3RvbSBmdW5jdGlvbiB0byBiYXRjaCBub3RpZmljYXRpb25zIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgdGljay5cbiAgICAgKiBCeSBkZWZh
25114dWx0IFJlYWN0IFF1ZXJ5IHdpbGwgdXNlIHRoZSBiYXRjaCBmdW5jdGlvbiBwcm92aWRlZCBieSBSZWFjdERPTSBvciBSZWFjdCBOYXRpdmUuXG4gICAgICovXG4gICAgc2V0QmF0Y2hOb3RpZnlGdW5jdGlvbjogKGZuKSA9PiB7XG4gICAgICBiYXRjaE5vdGlmeUZuID0gZm47XG4gICAgfSxcbiAgICBzZXRTY2hlZHVsZXI6IChmbikgPT4ge1xuICAgICAgc2NoZWR1bGVGbiA9IGZuO1xuICAgIH1cbiAgfTtcbn1cbnZhciBub3RpZnlNYW5hZ2VyID0gY3JlYXRlTm90aWZ5TWFuYWdlcigpO1xuZXhwb3J0IHtcbiAgY3JlYXRlTm90aWZ5TWFuYWdlcixcbiAgZGVmYXVsdFNjaGVkdWxlcixcbiAgbm90aWZ5TWFuYWdlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vdGlmeU1hbmFnZXIuanMubWFwIiwiLy8gc3JjL29ubGluZU1hbmFnZXIudHNcbmltcG9ydCB7IFN1YnNjcmliYWJsZSB9IGZyb20gXCIuL3N1YnNjcmliYWJsZS5qc1wiO1xuaW1wb3J0IHsgaXNTZXJ2ZXIgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xudmFyIE9ubGluZU1hbmFnZXIgPSBjbGFzcyBleHRlbmRzIFN1YnNjcmliYWJsZSB7XG4gICNvbmxpbmUgPSB0cnVlO1xuICAjY2xlYW51cDtcbiAgI3NldHVwO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI3NldHVwID0gKG9uT25saW5lKSA9PiB7XG4gICAgICBpZiAoIWlzU2VydmVyICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IG9ubGluZUxpc3RlbmVyID0gKCkgPT4gb25PbmxpbmUodHJ1ZSk7XG4gICAgICAgIGNvbnN0IG9mZmxpbmVMaXN0ZW5lciA9ICgpID0+IG9uT25saW5lKGZhbHNlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgb25saW5lTGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIG9mZmxpbmVMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwib25saW5lXCIsIG9ubGluZUxpc3RlbmVyKTtcbiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9mZmxpbmVcIiwgb2ZmbGluZUxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9O1xuICB9XG4gIG9uU3Vic2NyaWJlKCkge1xuICAgIGlmICghdGhpcy4jY2xlYW51cCkge1xuICAgICAgdGhpcy5zZXRFdmVudExpc3RlbmVyKHRoaXMuI3NldHVwKTtcbiAgICB9XG4gIH1cbiAgb25VbnN1YnNjcmliZSgpIHtcbiAgICBpZiAoIXRoaXMuaGFzTGlzdGVuZXJzKCkpIHtcbiAgICAgIHRoaXMuI2NsZWFudXA/LigpO1xuICAgICAgdGhpcy4jY2xlYW51cCA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgc2V0RXZlbnRMaXN0ZW5lcihzZXR1cCkge1xuICAgIHRoaXMuI3NldHVwID0gc2V0dXA7XG4gICAgdGhpcy4jY2xlYW51cD8uKCk7XG4gICAgdGhpcy4jY2xlYW51cCA9IHNldHVwKHRoaXMuc2V0T25saW5lLmJpbmQodGhpcykpO1xuICB9XG4gIHNldE9ubGluZShvbmxpbmUpIHtcbiAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy4jb25saW5lICE9PSBvbmxpbmU7XG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMuI29ubGluZSA9IG9ubGluZTtcbiAgICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyKG9ubGluZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaXNPbmxpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI29ubGluZTtcbiAgfVxufTtcbnZhciBvbmxpbmVNYW5hZ2VyID0gbmV3IE9ubGluZU1hbmFnZXIoKTtcbmV4cG9ydCB7XG4gIE9ubGluZU1hbmFnZXIsXG4gIG9ubGluZU1hbmFnZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vbmxpbmVNYW5hZ2VyLmpzLm1hcCIsIi8vIHNyYy9yZXRyeWVyLnRzXG5pbXBvcnQgeyBmb2N1c01hbmFnZXIgfSBmcm9tIFwiLi9mb2N1c01hbmFnZXIuanNcIjtcbmltcG9ydCB7IG9ubGluZU1hbmFnZXIgfSBmcm9tIFwiLi9vbmxpbmVNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBwZW5kaW5nVGhlbmFibGUgfSBmcm9tIFwiLi90aGVuYWJsZS5qc1wiO1xuaW1wb3J0IHsgaXNTZXJ2ZXIsIHNsZWVwIH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmZ1bmN0aW9uIGRlZmF1bHRSZXRyeURlbGF5KGZhaWx1cmVDb3VudCkge1xuICByZXR1cm4gTWF0aC5taW4oMWUzICogMiAqKiBmYWlsdXJlQ291bnQsIDNlNCk7XG59XG5mdW5jdGlvbiBjYW5GZXRjaChuZXR3b3JrTW9kZSkge1xuICByZXR1cm4gKG5ldHdvcmtNb2RlID8/IFwib25saW5lXCIpID09PSBcIm9ubGluZVwiID8gb25saW5lTWFuYWdlci5pc09ubGluZSgpIDogdHJ1ZTtcbn1cbnZhciBDYW5jZWxsZWRFcnJvciA9IGNsYXNzIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIoXCJDYW5jZWxsZWRFcnJvclwiKTtcbiAgICB0aGlzLnJldmVydCA9IG9wdGlvbnM/LnJldmVydDtcbiAgICB0aGlzLnNpbGVudCA9IG9wdGlvbnM/LnNpbGVudDtcbiAgfVxufTtcbmZ1bmN0aW9uIGlzQ2FuY2VsbGVkRXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQ2FuY2VsbGVkRXJyb3I7XG59XG5mdW5jdGlvbiBjcmVhdGVSZXRyeWVyKGNvbmZpZykge1xuICBsZXQgaXNSZXRyeUNhbmNlbGxlZCA9IGZhbHNlO1xuICBsZXQgZmFpbHVyZUNvdW50ID0gMDtcbiAgbGV0IGNvbnRpbnVlRm47XG4gIGNvbnN0IHRoZW5hYmxlID0gcGVuZGluZ1RoZW5hYmxlKCk7XG4gIGNvbnN0IGlzUmVzb2x2ZWQgPSAoKSA9PiB0aGVuYWJsZS5zdGF0dXMgIT09IFwicGVuZGluZ1wiO1xuICBjb25zdCBjYW5jZWwgPSAoY2FuY2VsT3B0aW9ucykgPT4ge1xuICAgIGlmICghaXNSZXNvbHZlZCgpKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBDYW5jZWxsZWRFcnJvcihjYW5jZWxPcHRpb25zKTtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICBjb25maWcub25DYW5jZWw/LihlcnJvcik7XG4gICAgfVxuICB9O1xuICBjb25zdCBjYW5jZWxS
25114ZXRyeSA9ICgpID0+IHtcbiAgICBpc1JldHJ5Q2FuY2VsbGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgY29udGludWVSZXRyeSA9ICgpID0+IHtcbiAgICBpc1JldHJ5Q2FuY2VsbGVkID0gZmFsc2U7XG4gIH07XG4gIGNvbnN0IGNhbkNvbnRpbnVlID0gKCkgPT4gZm9jdXNNYW5hZ2VyLmlzRm9jdXNlZCgpICYmIChjb25maWcubmV0d29ya01vZGUgPT09IFwiYWx3YXlzXCIgfHwgb25saW5lTWFuYWdlci5pc09ubGluZSgpKSAmJiBjb25maWcuY2FuUnVuKCk7XG4gIGNvbnN0IGNhblN0YXJ0ID0gKCkgPT4gY2FuRmV0Y2goY29uZmlnLm5ldHdvcmtNb2RlKSAmJiBjb25maWcuY2FuUnVuKCk7XG4gIGNvbnN0IHJlc29sdmUgPSAodmFsdWUpID0+IHtcbiAgICBpZiAoIWlzUmVzb2x2ZWQoKSkge1xuICAgICAgY29udGludWVGbj8uKCk7XG4gICAgICB0aGVuYWJsZS5yZXNvbHZlKHZhbHVlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlamVjdCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICghaXNSZXNvbHZlZCgpKSB7XG4gICAgICBjb250aW51ZUZuPy4oKTtcbiAgICAgIHRoZW5hYmxlLnJlamVjdCh2YWx1ZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXVzZSA9ICgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKGNvbnRpbnVlUmVzb2x2ZSkgPT4ge1xuICAgICAgY29udGludWVGbiA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXNSZXNvbHZlZCgpIHx8IGNhbkNvbnRpbnVlKCkpIHtcbiAgICAgICAgICBjb250aW51ZVJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uZmlnLm9uUGF1c2U/LigpO1xuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgY29udGludWVGbiA9IHZvaWQgMDtcbiAgICAgIGlmICghaXNSZXNvbHZlZCgpKSB7XG4gICAgICAgIGNvbmZpZy5vbkNvbnRpbnVlPy4oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgcnVuID0gKCkgPT4ge1xuICAgIGlmIChpc1Jlc29sdmVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHByb21pc2VPclZhbHVlO1xuICAgIGNvbnN0IGluaXRpYWxQcm9taXNlID0gZmFpbHVyZUNvdW50ID09PSAwID8gY29uZmlnLmluaXRpYWxQcm9taXNlIDogdm9pZCAwO1xuICAgIHRyeSB7XG4gICAgICBwcm9taXNlT3JWYWx1ZSA9IGluaXRpYWxQcm9taXNlID8/IGNvbmZpZy5mbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBwcm9taXNlT3JWYWx1ZSA9IFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gICAgUHJvbWlzZS5yZXNvbHZlKHByb21pc2VPclZhbHVlKS50aGVuKHJlc29sdmUpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgaWYgKGlzUmVzb2x2ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByZXRyeSA9IGNvbmZpZy5yZXRyeSA/PyAoaXNTZXJ2ZXIgPyAwIDogMyk7XG4gICAgICBjb25zdCByZXRyeURlbGF5ID0gY29uZmlnLnJldHJ5RGVsYXkgPz8gZGVmYXVsdFJldHJ5RGVsYXk7XG4gICAgICBjb25zdCBkZWxheSA9IHR5cGVvZiByZXRyeURlbGF5ID09PSBcImZ1bmN0aW9uXCIgPyByZXRyeURlbGF5KGZhaWx1cmVDb3VudCwgZXJyb3IpIDogcmV0cnlEZWxheTtcbiAgICAgIGNvbnN0IHNob3VsZFJldHJ5ID0gcmV0cnkgPT09IHRydWUgfHwgdHlwZW9mIHJldHJ5ID09PSBcIm51bWJlclwiICYmIGZhaWx1cmVDb3VudCA8IHJldHJ5IHx8IHR5cGVvZiByZXRyeSA9PT0gXCJmdW5jdGlvblwiICYmIHJldHJ5KGZhaWx1cmVDb3VudCwgZXJyb3IpO1xuICAgICAgaWYgKGlzUmV0cnlDYW5jZWxsZWQgfHwgIXNob3VsZFJldHJ5KSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZhaWx1cmVDb3VudCsrO1xuICAgICAgY29uZmlnLm9uRmFpbD8uKGZhaWx1cmVDb3VudCwgZXJyb3IpO1xuICAgICAgc2xlZXAoZGVsYXkpLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gY2FuQ29udGludWUoKSA/IHZvaWQgMCA6IHBhdXNlKCk7XG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKGlzUmV0cnlDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJ1bigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBwcm9taXNlOiB0aGVuYWJsZSxcbiAgICBzdGF0dXM6ICgpID0+IHRoZW5hYmxlLnN0YXR1cyxcbiAgICBjYW5jZWwsXG4gICAgY29udGludWU6ICgpID0+IHtcbiAgICAgIGNvbnRpbnVlRm4/LigpO1xuICAgICAgcmV0dXJuIHRoZW5hYmxlO1xuICAgIH0sXG4gICAgY2FuY2VsUmV0cnksXG4gICAgY29udGludWVSZXRyeSxcbiAgICBjYW5TdGFydCxcbiAgICBzdGFydDogKCkgPT4ge1xuICAgICAgaWYgKGNhblN0YXJ0KCkpIHtcbiAgICAgICAgcnVuKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXVzZSgpLnRoZW4ocnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGVuYWJsZTtcbiAgICB9XG4gIH07XG59XG5leHBvcnQge1xuICBDYW5jZWxsZWRFcnJvcixcbiAgY2FuRmV0Y2gsXG4gIGNyZWF0ZVJldHJ5ZXIsXG4gIGlzQ2FuY2VsbGVkRXJyb3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXRyeWVyLmpzLm1hcCIsIi8vIHNyYy9yZW1vdmFibGUudHNcbmltcG9ydCB7IHRpbWVvdXRNYW5hZ2VyIH0gZnJvbSBcIi4vdGltZW91dE1hbmFnZXIuanNcIjtcbmltcG9ydCB7IGlzU2VydmVyLCBpc1ZhbGlkVGltZW91dCB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG52YXIgUmVtb3ZhYmxlID0gY2xhc3Mge1xuICAjZ2NUaW1lb3V0O1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuY2xlYXJHY1RpbWVvdXQoKTtcbiAgfVxuICBzY2hlZHVsZUdjKCkge1xuICAgIHRoaXMuY2xlYXJHY1RpbWVvdXQoKTtcbiAgICBpZiAoaXNWYWxpZFRpbWVvdXQodGhpcy5nY1RpbWUpKSB7XG4gICAgICB0aGlzLiNnY1RpbWVvdXQgPSB0aW1lb3V0TWFuYWdlci5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5vcHRpb25hbFJlbW92ZSgpO1xuICAgICAgfSwgdGhpcy5nY1RpbWUpO1xuICAgIH1cbiAgfVxuICB1cGRhdGVHY1RpbWUobmV3R2NUaW1lKSB7XG4gICAgdGhpcy5nY1RpbWUgPSBNYXRoLm1heChcbiAgICAgIHRoaXMuZ2NUaW1lIHx8IDAsXG4gICAgICBuZXdHY1RpbWUgPz8gKGlzU2VydmVyID8gSW5maW5pdHkgOiA1ICogNjAgKiAxZTMpXG4gICAgKTtcbiAgfVxuICBjbGVhckdjVGltZW91dCgpIHtcbiAgICBpZiAodGhpcy4jZ2NUaW1lb3V0KSB7XG4gICAgICB0aW1lb3V0TWFuYWdlci5jbGVhclRpbWVvdXQodGhpcy4jZ2NUaW1lb3V0KTtcbiAgICAgIHRoaXMuI2djVGltZW91dCA9IHZvaWQgMDtcbiAgICB9XG4gI
25114H1cbn07XG5leHBvcnQge1xuICBSZW1vdmFibGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZW1vdmFibGUuanMubWFwIiwiLy8gc3JjL3F1ZXJ5LnRzXG5pbXBvcnQge1xuICBlbnN1cmVRdWVyeUZuLFxuICBub29wLFxuICByZXBsYWNlRGF0YSxcbiAgcmVzb2x2ZUVuYWJsZWQsXG4gIHJlc29sdmVTdGFsZVRpbWUsXG4gIHNraXBUb2tlbixcbiAgdGltZVVudGlsU3RhbGVcbn0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IG5vdGlmeU1hbmFnZXIgfSBmcm9tIFwiLi9ub3RpZnlNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBDYW5jZWxsZWRFcnJvciwgY2FuRmV0Y2gsIGNyZWF0ZVJldHJ5ZXIgfSBmcm9tIFwiLi9yZXRyeWVyLmpzXCI7XG5pbXBvcnQgeyBSZW1vdmFibGUgfSBmcm9tIFwiLi9yZW1vdmFibGUuanNcIjtcbnZhciBRdWVyeSA9IGNsYXNzIGV4dGVuZHMgUmVtb3ZhYmxlIHtcbiAgI2luaXRpYWxTdGF0ZTtcbiAgI3JldmVydFN0YXRlO1xuICAjY2FjaGU7XG4gICNjbGllbnQ7XG4gICNyZXRyeWVyO1xuICAjZGVmYXVsdE9wdGlvbnM7XG4gICNhYm9ydFNpZ25hbENvbnN1bWVkO1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI2Fib3J0U2lnbmFsQ29uc3VtZWQgPSBmYWxzZTtcbiAgICB0aGlzLiNkZWZhdWx0T3B0aW9ucyA9IGNvbmZpZy5kZWZhdWx0T3B0aW9ucztcbiAgICB0aGlzLnNldE9wdGlvbnMoY29uZmlnLm9wdGlvbnMpO1xuICAgIHRoaXMub2JzZXJ2ZXJzID0gW107XG4gICAgdGhpcy4jY2xpZW50ID0gY29uZmlnLmNsaWVudDtcbiAgICB0aGlzLiNjYWNoZSA9IHRoaXMuI2NsaWVudC5nZXRRdWVyeUNhY2hlKCk7XG4gICAgdGhpcy5xdWVyeUtleSA9IGNvbmZpZy5xdWVyeUtleTtcbiAgICB0aGlzLnF1ZXJ5SGFzaCA9IGNvbmZpZy5xdWVyeUhhc2g7XG4gICAgdGhpcy4jaW5pdGlhbFN0YXRlID0gZ2V0RGVmYXVsdFN0YXRl
25114KHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5zdGF0ZSA9IGNvbmZpZy5zdGF0ZSA/PyB0aGlzLiNpbml0aWFsU3RhdGU7XG4gICAgdGhpcy5zY2hlZHVsZUdjKCk7XG4gIH1cbiAgZ2V0IG1ldGEoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhO1xuICB9XG4gIGdldCBwcm9taXNlKCkge1xuICAgIHJldHVybiB0aGlzLiNyZXRyeWVyPy5wcm9taXNlO1xuICB9XG4gIHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IHsgLi4udGhpcy4jZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICB0aGlzLnVwZGF0ZUdjVGltZSh0aGlzLm9wdGlvbnMuZ2NUaW1lKTtcbiAgICBpZiAodGhpcy5zdGF0ZSAmJiB0aGlzLnN0YXRlLmRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgY29uc3QgZGVmYXVsdFN0YXRlID0gZ2V0RGVmYXVsdFN0YXRlKHRoaXMub3B0aW9ucyk7XG4gICAgICBpZiAoZGVmYXVsdFN0YXRlLmRhdGEgIT09IHZvaWQgMCkge1xuICAgICAgICB0aGlzLnNldERhdGEoZGVmYXVsdFN0YXRlLmRhdGEsIHtcbiAgICAgICAgICB1cGRhdGVkQXQ6IGRlZmF1bHRTdGF0ZS5kYXRhVXBkYXRlZEF0LFxuICAgICAgICAgIG1hbnVhbDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jaW5pdGlhbFN0YXRlID0gZGVmYXVsdFN0YXRlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBvcHRpb25hbFJlbW92ZSgpIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJzLmxlbmd0aCAmJiB0aGlzLnN0YXRlLmZldGNoU3RhdHVzID09PSBcImlkbGVcIikge1xuICAgICAgdGhpcy4jY2FjaGUucmVtb3ZlKHRoaXMpO1xuICAgIH1cbiAgfVxuICBzZXREYXRhKG5ld0RhdGEsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXRhID0gcmVwbGFjZURhdGEodGhpcy5zdGF0ZS5kYXRhLCBuZXdEYXRhLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuI2Rpc3BhdGNoKHtcbiAgICAgIGRhdGEsXG4gICAgICB0eXBlOiBcInN1Y2Nlc3NcIixcbiAgICAgIGRhdGFVcGRhdGVkQXQ6IG9wdGlvbnM/LnVwZGF0ZWRBdCxcbiAgICAgIG1hbnVhbDogb3B0aW9ucz8ubWFudWFsXG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgc2V0U3RhdGUoc3RhdGUsIHNldFN0YXRlT3B0aW9ucykge1xuICAgIHRoaXMuI2Rpc3BhdGNoKHsgdHlwZTogXCJzZXRTdGF0ZVwiLCBzdGF0ZSwgc2V0U3RhdGVPcHRpb25zIH0pO1xuICB9XG4gIGNhbmNlbChvcHRpb25zKSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuI3JldHJ5ZXI/LnByb21pc2U7XG4gICAgdGhpcy4jcmV0cnllcj8uY2FuY2VsKG9wdGlvbnMpO1xuICAgIHJldHVybiBwcm9taXNlID8gcHJvbWlzZS50aGVuKG5vb3ApLmNhdGNoKG5vb3ApIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5jYW5jZWwoeyBzaWxlbnQ6IHRydWUgfSk7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh0aGlzLiNpbml0aWFsU3RhdGUpO1xuICB9XG4gIGlzQWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5zb21lKFxuICAgICAgKG9ic2VydmVyKSA9PiByZXNvbHZlRW5hYmxlZChvYnNlcnZlci5vcHRpb25zLmVuYWJsZWQsIHRoaXMpICE9PSBmYWxzZVxuICAgICk7XG4gIH1cbiAgaXNEaXNhYmxlZCgpIHtcbiAgICBpZiAodGhpcy5nZXRPYnNlcnZlcnNDb3VudCgpID4gMCkge1xuICAgICAgcmV0dXJuICF0aGlzLmlzQWN0aXZlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucXVlcnlGbiA9PT0gc2tpcFRva2VuIHx8IHRoaXMuc3RhdGUuZGF0YVVwZGF0ZUNvdW50ICsgdGh
25114pcy5zdGF0ZS5lcnJvclVwZGF0ZUNvdW50ID09PSAwO1xuICB9XG4gIGlzU3RhdGljKCkge1xuICAgIGlmICh0aGlzLmdldE9ic2VydmVyc0NvdW50KCkgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMuc29tZShcbiAgICAgICAgKG9ic2VydmVyKSA9PiByZXNvbHZlU3RhbGVUaW1lKG9ic2VydmVyLm9wdGlvbnMuc3RhbGVUaW1lLCB0aGlzKSA9PT0gXCJzdGF0aWNcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzU3RhbGUoKSB7XG4gICAgaWYgKHRoaXMuZ2V0T2JzZXJ2ZXJzQ291bnQoKSA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5zb21lKFxuICAgICAgICAob2JzZXJ2ZXIpID0+IG9ic2VydmVyLmdldEN1cnJlbnRSZXN1bHQoKS5pc1N0YWxlXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5kYXRhID09PSB2b2lkIDAgfHwgdGhpcy5zdGF0ZS5pc0ludmFsaWRhdGVkO1xuICB9XG4gIGlzU3RhbGVCeVRpbWUoc3RhbGVUaW1lID0gMCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdGFsZVRpbWUgPT09IFwic3RhdGljXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNJbnZhbGlkYXRlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAhdGltZVVudGlsU3RhbGUodGhpcy5zdGF0ZS5kYXRhVXBkYXRlZEF0LCBzdGFsZVRpbWUpO1xuICB9XG4gIG9uRm9jdXMoKSB7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmVycy5maW5kKCh4KSA9PiB4LnNob3VsZEZldGNoT25XaW5kb3dGb2N1cygpKTtcbiAgICBvYnNlcnZlcj8ucmVmZXRjaCh7IGNhbmNlbFJlZmV0Y2g6IGZhbHNlIH0pO1xuICAgIHRoaXMuI3JldHJ5ZXI/LmNvbnRpbnVlKCk7XG4gIH1cbiAgb25PbmxpbmUoKSB7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmVycy5maW5kKCh4KSA9PiB4LnNob3VsZEZldGNoT25SZWNvbm5lY3QoKSk7XG4gICAgb2JzZXJ2ZXI/LnJlZmV0Y2goeyBjYW5jZWxSZWZldGNoOiBmYWxzZSB9KTtcbiAgICB0aGlzLiNyZXRyeWVyPy5jb250aW51ZSgpO1xuICB9XG4gIGFkZE9ic2VydmVyKG9ic2VydmVyKSB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVycy5pbmNsdWRlcyhvYnNlcnZlcikpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICAgICAgdGhpcy5jbGVhckdjVGltZW91dCgpO1xuICAgICAgdGhpcy4jY2FjaGUubm90aWZ5KHsgdHlwZTogXCJvYnNlcnZlckFkZGVkXCIsIHF1ZXJ5OiB0aGlzLCBvYnNlcnZlciB9KTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICBpZiAodGhpcy5vYnNlcnZlcnMuaW5jbHVkZXMob2JzZXJ2ZXIpKSB7XG4gICAgICB0aGlzLm9ic2VydmVycyA9IHRoaXMub2JzZXJ2ZXJzLmZpbHRlcigoeCkgPT4geCAhPT0gb2JzZXJ2ZXIpO1xuICAgICAgaWYgKCF0aGlzLm9ic2VydmVycy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuI3JldHJ5ZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy4jYWJvcnRTaWduYWxDb25zdW1lZCkge1xuICAgICAgICAgICAgdGhpcy4jcmV0cnllci5jYW5jZWwoeyByZXZlcnQ6IHRydWUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI3JldHJ5ZXIuY2FuY2VsUmV0cnkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY2hlZHVsZUdjKCk7XG4gICAgICB9XG4gICAgICB0aGlzLiNjYWNoZS5ub3RpZnkoeyB0eXBlOiBcIm9ic2VydmVyUmVtb3ZlZFwiLCBxdWVyeTogdGhpcywgb2JzZXJ2ZXIgfSk7XG4gICAgfVxuICB9XG4gIGdldE9ic2VydmVyc0NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5sZW5ndGg7XG4gIH1cbiAgaW52YWxpZGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNJbnZhbGlkYXRlZCkge1xuICAgICAgdGhpcy4jZGlzcGF0Y2goeyB0eXBlOiBcImludmFsaWRhdGVcIiB9KTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgZmV0Y2gob3B0aW9ucywgZmV0Y2hPcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZmV0Y2hTdGF0dXMgIT09IFwiaWRsZVwiICYmIC8vIElmIHRoZSBwcm9taXNlIGluIHRoZSByZXR5ZXIgaXMgYWxyZWFkeSByZWplY3RlZCwgd2UgaGF2ZSB0byBkZWZpbml0ZWx5XG4gICAgLy8gcmUtc3RhcnQgdGhlIGZldGNoOyB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IHRoZSBxdWVyeSBpcyBzdGlsbCBpbiBhXG4gICAgLy8gcGVuZGluZyBzdGF0ZSB3aGVuIHRoYXQgaGFwcGVuc1xuICAgIHRoaXMuI3JldHJ5ZXI/LnN0YXR1cygpICE9PSBcInJlamVjdGVkXCIpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmRhdGEgIT09IHZvaWQgMCAmJiBmZXRjaE9wdGlvbnM/LmNhbmNlbFJlZmV0Y2gpIHtcbiAgICAgICAgdGhpcy5jYW5jZWwoeyBzaWxlbnQ6IHRydWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI3JldHJ5ZXIpIHtcbiAgICAgICAgdGhpcy4jcmV0cnllci5jb250aW51ZVJldHJ5KCk7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXRyeWVyLnByb21pc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5vcHRpb25zLnF1ZXJ5Rm4pIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyID0gdGhpcy5vYnNlcnZlcnMuZmluZCgoeCkgPT4geC5vcHRpb25zLnF1ZXJ5Rm4pO1xuICAgICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyhvYnNlcnZlci5vcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5xdWVyeUtleSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgQXMgb2YgdjQsIHF1ZXJ5S2V5IG5lZWRzIHRvIGJlIGFuIEFycmF5LiBJZiB5b3UgYXJlIHVzaW5nIGEgc3RyaW5nIGxpa2UgJ3JlcG9EYXRhJywgcGxlYXNlIGNoYW5nZSBpdCB0byBhbiBBcnJheSwgZS5nLiBbJ3JlcG9EYXRhJ11gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBhZGRTaWduYWxQcm9wZXJ0eSA9IChvYmplY3QpID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIFwic2lnbmFsXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jYWJvcnRTaWduYWxDb25zdW1lZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gICAgICAgI
25114H1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgZmV0Y2hGbiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5Rm4gPSBlbnN1cmVRdWVyeUZuKHRoaXMub3B0aW9ucywgZmV0Y2hPcHRpb25zKTtcbiAgICAgIGNvbnN0IGNyZWF0ZVF1ZXJ5Rm5Db250ZXh0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeUZuQ29udGV4dDIgPSB7XG4gICAgICAgICAgY2xpZW50OiB0aGlzLiNjbGllbnQsXG4gICAgICAgICAgcXVlcnlLZXk6IHRoaXMucXVlcnlLZXksXG4gICAgICAgICAgbWV0YTogdGhpcy5tZXRhXG4gICAgICAgIH07XG4gICAgICAgIGFkZFNpZ25hbFByb3BlcnR5KHF1ZXJ5Rm5Db250ZXh0Mik7XG4gICAgICAgIHJldHVybiBxdWVyeUZuQ29udGV4dDI7XG4gICAgICB9O1xuICAgICAgY29uc3QgcXVlcnlGbkNvbnRleHQgPSBjcmVhdGVRdWVyeUZuQ29udGV4dCgpO1xuICAgICAgdGhpcy4jYWJvcnRTaWduYWxDb25zdW1lZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZXJzaXN0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wZXJzaXN0ZXIoXG4gICAgICAgICAgcXVlcnlGbixcbiAgICAgICAgICBxdWVyeUZuQ29udGV4dCxcbiAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcXVlcnlGbihxdWVyeUZuQ29udGV4dCk7XG4gICAgfTtcbiAgICBjb25zdCBjcmVhdGVGZXRjaENvbnRleHQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0MiA9IHtcbiAgICAgICAgZmV0Y2hPcHRpb25zLFxuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIHF1ZXJ5S2V5OiB0aGlzLnF1ZXJ5S2V5LFxuICAgICAgICBjbGllbnQ6IHRoaXMuI2NsaWVudCxcbiAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgIGZldGNoRm5cbiAgICAgIH07XG4gICAgICBhZGRTaWduYWxQcm9wZXJ0eShjb250ZXh0Mik7XG4gICAgICByZXR1cm4gY29udGV4dDI7XG4gICAgfTtcbiAgICBjb25zdCBjb250ZXh0ID0gY3JlYXRlRmV0Y2hDb250ZXh0KCk7XG4gICAgdGhpcy5vcHRpb25zLmJlaGF2aW9yPy5vbkZldGNoKGNvbnRleHQsIHRoaXMpO1xuICAgIHRoaXMuI3JldmVydFN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAodGhpcy5zdGF0ZS5mZXRjaFN0YXR1cyA9PT0gXCJpZGxlXCIgfHwgdGhpcy5zdGF0ZS5mZXRjaE1ldGEgIT09IGNvbnRleHQuZmV0Y2hPcHRpb25zPy5tZXRhKSB7XG4gICAgICB0aGlzLiNkaXNwYXRjaCh7IHR5cGU6IFwiZmV0Y2hcIiwgbWV0YTogY29udGV4dC5mZXRjaE9wdGlvbnM/Lm1ldGEgfSk7XG4gICAgfVxuICAgIHRoaXMuI3JldHJ5ZXIgPSBjcmVhdGVSZXRyeWVyKHtcbiAgICAgIGluaXRpYWxQcm9taXNlOiBmZXRjaE9wdGlvbnM/LmluaXRpYWxQcm9taXNlLFxuICAgICAgZm46IGNvbnRleHQuZmV0Y2hGbixcbiAgICAgIG9uQ2FuY2VsOiAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ2FuY2VsbGVkRXJyb3IgJiYgZXJyb3IucmV2ZXJ0KSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLiNyZXZlcnRTdGF0ZSxcbiAgICAgICAgICAgIGZldGNoU3RhdHVzOiBcImlkbGVcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfSxcbiAgICAgIG9uRmFpbDogKGZhaWx1cmVDb3VudCwgZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy4jZGlzcGF0Y2goeyB0eXBlOiBcImZhaWxlZFwiLCBmYWlsdXJlQ291bnQsIGVycm9yIH0pO1xuICAgICAgfSxcbiAgICAgIG9uUGF1c2U6ICgpID0+IHtcbiAgICAgICAgdGhpcy4jZGlzcGF0Y2goeyB0eXBlOiBcInBhdXNlXCIgfSk7XG4gICAgICB9LFxuICAgICAgb25Db250aW51ZTogKCkgPT4ge1xuICAgICAgICB0aGlzLiNkaXNwYXRjaCh7IHR5cGU6IFwiY29udGludWVcIiB9KTtcbiAgICAgIH0sXG4gICAgICByZXRyeTogY29udGV4dC5vcHRpb25zLnJldHJ5LFxuICAgICAgcmV0cnlEZWxheTogY29udGV4dC5vcHRpb25zLnJldHJ5RGVsYXksXG4gICAgICBuZXR3b3JrTW9kZTogY29udGV4dC5vcHRpb25zLm5ldHdvcmtNb2RlLFxuICAgICAgY2FuUnVuOiAoKSA9PiB0cnVlXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLiNyZXRyeWVyLnN0YXJ0KCk7XG4gICAgICBpZiAoZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFF1ZXJ5IGRhdGEgY2Fubm90IGJlIHVuZGVmaW5lZC4gUGxlYXNlIG1ha2Ugc3VyZSB0byByZXR1cm4gYSB2YWx1ZSBvdGhlciB0aGFuIHVuZGVmaW5lZCBmcm9tIHlvdXIgcXVlcnkgZnVuY3Rpb24uIEFmZmVjdGVkIHF1ZXJ5IGtleTogJHt0aGlzLnF1ZXJ5SGFzaH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5xdWVyeUhhc2h9IGRhdGEgaXMgdW5kZWZpbmVkYCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldERhdGEoZGF0YSk7XG4gICAgICB0aGlzLiNjYWNoZS5jb25maWcub25TdWNjZXNzPy4oZGF0YSwgdGhpcyk7XG4gICAgICB0aGlzLiNjYWNoZS5jb25maWcub25TZXR0bGVkPy4oXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHRoaXMuc3RhdGUuZXJyb3IsXG4gICAgICAgIHRoaXNcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ2FuY2VsbGVkRXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLnNpbGVudCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLiNyZXRyeWVyLnByb21pc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IucmV2ZXJ0KSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUuZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuZGF0YTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy4jZGlzcGF0Y2goe1xuICAgICAgICB0eX
25114BlOiBcImVycm9yXCIsXG4gICAgICAgIGVycm9yXG4gICAgICB9KTtcbiAgICAgIHRoaXMuI2NhY2hlLmNvbmZpZy5vbkVycm9yPy4oXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgICAgdGhpcy4jY2FjaGUuY29uZmlnLm9uU2V0dGxlZD8uKFxuICAgICAgICB0aGlzLnN0YXRlLmRhdGEsXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2NoZWR1bGVHYygpO1xuICAgIH1cbiAgfVxuICAjZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgY29uc3QgcmVkdWNlciA9IChzdGF0ZSkgPT4ge1xuICAgICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgZmV0Y2hGYWlsdXJlQ291bnQ6IGFjdGlvbi5mYWlsdXJlQ291bnQsXG4gICAgICAgICAgICBmZXRjaEZhaWx1cmVSZWFzb246IGFjdGlvbi5lcnJvclxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJwYXVzZVwiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGZldGNoU3RhdHVzOiBcInBhdXNlZFwiXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBcImNvbnRpbnVlXCI6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgZmV0Y2hTdGF0dXM6IFwiZmV0Y2hpbmdcIlxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJmZXRjaFwiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIC4uLmZldGNoU3RhdGUoc3RhdGUuZGF0YSwgdGhpcy5vcHRpb25zKSxcbiAgICAgICAgICAgIGZldGNoTWV0YTogYWN0aW9uLm1ldGEgPz8gbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJzdWNjZXNzXCI6XG4gICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGRhdGE6IGFjdGlvbi5kYXRhLFxuICAgICAgICAgICAgZGF0YVVwZGF0ZUNvdW50OiBzdGF0ZS5kYXRhVXBkYXRlQ291bnQgKyAxLFxuICAgICAgICAgICAgZGF0YVVwZGF0ZWRBdDogYWN0aW9uLmRhdGFVcGRhdGVkQXQgPz8gRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgaXNJbnZhbGlkYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgLi4uIWFjdGlvbi5tYW51YWwgJiYge1xuICAgICAgICAgICAgICBmZXRjaFN0YXR1czogXCJpZGxlXCIsXG4gICAgICAgICAgICAgIGZldGNoRmFpbHVyZUNvdW50OiAwLFxuICAgICAgICAgICAgICBmZXRjaEZhaWx1cmVSZWFzb246IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuI3JldmVydFN0YXRlID0gYWN0aW9uLm1hbnVhbCA/IG5ld1N0YXRlIDogdm9pZCAwO1xuICAgICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBhY3Rpb24uZXJyb3I7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICBlcnJvclVwZGF0ZUNvdW50OiBzdGF0ZS5lcnJvclVwZGF0ZUNvdW50ICsgMSxcbiAgICAgICAgICAgIGVycm9yVXBkYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgZmV0Y2hGYWlsdXJlQ291bnQ6IHN0YXRlLmZldGNoRmFpbHVyZUNvdW50ICsgMSxcbiAgICAgICAgICAgIGZldGNoRmFpbHVyZVJlYXNvbjogZXJyb3IsXG4gICAgICAgICAgICBmZXRjaFN0YXR1czogXCJpZGxlXCIsXG4gICAgICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIlxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJpbnZhbGlkYXRlXCI6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgaXNJbnZhbGlkYXRlZDogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJzZXRTdGF0ZVwiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIC4uLmFjdGlvbi5zdGF0ZVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnN0YXRlID0gcmVkdWNlcih0aGlzLnN0YXRlKTtcbiAgICBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMub2JzZXJ2ZXJzLmZvckVhY2goKG9ic2VydmVyKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLm9uUXVlcnlVcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy4jY2FjaGUubm90aWZ5KHsgcXVlcnk6IHRoaXMsIHR5cGU6IFwidXBkYXRlZFwiLCBhY3Rpb24gfSk7XG4gICAgfSk7XG4gIH1cbn07XG5mdW5jdGlvbiBmZXRjaFN0YXRlKGRhdGEsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBmZXRjaEZhaWx1cmVDb3VudDogMCxcbiAgICBmZXRjaEZhaWx1cmVSZWFzb246IG51bGwsXG4gICAgZmV0Y2hTdGF0dXM6IGNhbkZldGNoKG9wdGlvbnMubmV0d29ya01vZGUpID8gXCJmZXRjaGluZ1wiIDogXCJwYXVzZWRcIixcbiAgICAuLi5kYXRhID09PSB2b2lkIDAgJiYge1xuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICBzdGF0dXM6IFwicGVuZGluZ1wiXG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0RGVmYXVsdFN0YXRl
25114KG9wdGlvbnMpIHtcbiAgY29uc3QgZGF0YSA9IHR5cGVvZiBvcHRpb25zLmluaXRpYWxEYXRhID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLmluaXRpYWxEYXRhKCkgOiBvcHRpb25zLmluaXRpYWxEYXRhO1xuICBjb25zdCBoYXNEYXRhID0gZGF0YSAhPT0gdm9pZCAwO1xuICBjb25zdCBpbml0aWFsRGF0YVVwZGF0ZWRBdCA9IGhhc0RhdGEgPyB0eXBlb2Ygb3B0aW9ucy5pbml0aWFsRGF0YVVwZGF0ZWRBdCA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy5pbml0aWFsRGF0YVVwZGF0ZWRBdCgpIDogb3B0aW9ucy5pbml0aWFsRGF0YVVwZGF0ZWRBdCA6IDA7XG4gIHJldHVybiB7XG4gICAgZGF0YSxcbiAgICBkYXRhVXBkYXRlQ291bnQ6IDAsXG4gICAgZGF0YVVwZGF0ZWRBdDogaGFzRGF0YSA/IGluaXRpYWxEYXRhVXBkYXRlZEF0ID8/IERhdGUubm93KCkgOiAwLFxuICAgIGVycm9yOiBudWxsLFxuICAgIGVycm9yVXBkYXRlQ291bnQ6IDAsXG4gICAgZXJyb3JVcGRhdGVkQXQ6IDAsXG4gICAgZmV0Y2hGYWlsdXJlQ291bnQ6IDAsXG4gICAgZmV0Y2hGYWlsdXJlUmVhc29uOiBudWxsLFxuICAgIGZldGNoTWV0YTogbnVsbCxcbiAgICBpc0ludmFsaWRhdGVkOiBmYWxzZSxcbiAgICBzdGF0dXM6IGhhc0RhdGEgPyBcInN1Y2Nlc3NcIiA6IFwicGVuZGluZ1wiLFxuICAgIGZldGNoU3RhdHVzOiBcImlkbGVcIlxuICB9O1xufVxuZXhwb3J0IHtcbiAgUXVlcnksXG4gIGZldGNoU3RhdGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeS5qcy5tYXAiLCIvLyBzcmMvcXVlcnlPYnNlcnZlci50c1xuaW1wb3J0IHsgZm9jdXNNYW5hZ2VyIH0gZnJvbSBcIi4vZm9jdXNNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBub3RpZnlNYW5hZ2VyIH0gZnJvbSBcIi4vbm90aWZ5TWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgZmV0Y2hTdGF0ZSB9IGZyb20gXCIuL3F1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBTdWJzY3JpYmFibGUgfSBmcm9tIFwiLi9zdWJzY3JpYmFibGUuanNcIjtcbmltcG9ydCB7IHBlbmRpbmdUaGVuYWJsZSB9IGZyb20gXCIuL3RoZW5hYmxlLmpzXCI7XG5pbXBvcnQge1xuICBpc1NlcnZlcixcbiAgaXNWYWxpZFRpbWVvdXQsXG4gIG5vb3AsXG4gIHJlcGxhY2VEYXRhLFxuICByZXNvbHZlRW5hYmxlZCxcbiAgcmVzb2x2ZVN0YWxlVGltZSxcbiAgc2hhbGxvd0VxdWFsT2JqZWN0cyxcbiAgdGltZVVudGlsU3RhbGVcbn0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IHRpbWVvdXRNYW5hZ2VyIH0gZnJvbSBcIi4vdGltZW91dE1hbmFnZXIuanNcIjtcbnZhciBRdWVyeU9ic2VydmVyID0gY2xhc3MgZXh0ZW5kcyBTdWJzY3JpYmFibGUge1xuICBjb25zdHJ1Y3RvcihjbGllbnQsIG9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuI3NlbGVjdEVycm9yID0gbnVsbDtcbiAgICB0aGlzLiNjdXJyZW50VGhlbmFibGUgPSBwZW5kaW5nVGhlbmFibGUoKTtcbiAgICB0aGlzLmJpbmRNZXRob2RzKCk7XG4gICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICB9XG4gICNjbGllbnQ7XG4gICNjdXJyZW50UXVlcnkgPSB2b2lkIDA7XG4gICNjdXJyZW50UXVlcnlJbml0aWFsU3RhdGUgPSB2b2lkIDA7XG4gICNjdXJyZW50UmVzdWx0ID0gdm9pZCAwO1xuICAjY3VycmVudFJlc3VsdFN0YXRlO1xuICAjY3VycmVudFJlc3VsdE9wdGlvbnM7XG4gICNjdXJyZW50VGhlbmFibGU7XG4gICNzZWxlY3RFcnJvcjtcbiAgI3NlbGVjdEZuO1xuICAjc2VsZWN0UmVzdWx0O1xuICAvLyBUaGlzIHByb3BlcnR5IGtlZXBzIHRyYWNrIG9mIHRoZSBsYXN0IHF1ZXJ5IHdpdGggZGVmaW5lZCBkYXRhLlxuICAvLyBJdCB3aWxsIGJlIHVzZWQgdG8gcGFzcyB0aGUgcHJldmlvdXMgZGF0YSBhbmQgcXVlcnkgdG8gdGhlIHBsYWNlaG9sZGVyIGZ1bmN0aW9uIGJldHdlZW4gcmVuZGVycy5cbiAgI2xhc3RRdWVyeVdpdGhEZWZpbmVkRGF0YTtcbiAgI3N0YWxlVGltZW91dElkO1xuICAjcmVmZXRjaEludGVydmFsSWQ7XG4gICNjdXJyZW50UmVmZXRjaEludGVydmFsO1xuICAjdHJhY2tlZFByb3BzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgYmluZE1ldGhvZHMoKSB7XG4gICAgdGhpcy5yZWZldGNoID0gdGhpcy5yZWZldGNoLmJpbmQodGhpcyk7XG4gIH1cbiAgb25TdWJzY3JpYmUoKSB7XG4gICAgaWYgKHRoaXMubGlzdGVuZXJzLnNpemUgPT09IDEpIHtcbiAgICAgIHRoaXMuI2N1cnJlbnRRdWVyeS5hZGRPYnNlcnZlcih0aGlzKTtcbiAgICAgIGlmIChzaG91bGRGZXRjaE9uTW91bnQodGhpcy4jY3VycmVudFF1ZXJ5LCB0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgIHRoaXMuI2V4ZWN1dGVGZXRjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVSZXN1bHQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3VwZGF0ZVRpbWVycygpO1xuICAgIH1cbiAgfVxuICBvblVuc3Vic2NyaWJlKCkge1xuICAgIGlmICghdGhpcy5oYXNMaXN0ZW5lcnMoKSkge1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG4gIHNob3VsZEZldGNoT25SZWNvbm5lY3QoKSB7XG4gICAgcmV0dXJuIHNob3VsZEZldGNoT24oXG4gICAgICB0aGlzLiNjdXJyZW50UXVlcnksXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICB0aGlzLm9wdGlvbnMucmVmZXRjaE9uUmVjb25uZWN0XG4gICAgKTtcbiAgfVxuICBzaG91bGRGZXRjaE9uV2luZG93Rm9jdXMoKSB7XG4gICAgcmV0dXJuIHNob3VsZEZldGNoT24oXG4gICAgICB0aGlzLiNjdXJyZW50UXVlcnksXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICB0aGlzLm9wdGlvbnMucmVmZXRjaE9uV2luZG93Rm9jdXNcbiAgICApO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIHRoaXMuI2NsZWFyU3RhbGVUaW1lb3V0KCk7XG4gICAgdGhpcy4jY2xlYXJSZWZldGNoSW50ZXJ2YWwoKTtcbiAgICB0aGlzLiNjdXJyZW50UXVlcnkucmVtb3ZlT2JzZXJ2ZXIodGhpcyk7XG4gIH1cbiAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgY29uc3QgcHJldk9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgcHJldlF1ZXJ5ID0gdGhpcy4jY3VycmVudFF1ZXJ5O1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuI2NsaWVudC5kZWZhdWx0UXVlcnlPcHRpb25zKG9wdGlvbnMpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlZCAhPT0gdm9pZCAwICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuZW5hYmxlZCAhPT0gXCJib29sZWFuXCIgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5lbmFibGVkICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHJlc29sdmVFbmFibGVkKHRoaXMub3B0aW9ucy5lbmFibGVkLCB0aGlzLiNjdXJyZW50UXVlcnkpICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkV4cGVjdGVkIGVuYWJsZWQgdG8gYmUgYSBib29sZWFuIG9yIGEgY2FsbGJhY2sgdGhhdCByZXR1cm5zIGEgYm9vbGVhblwiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLiN1cGRhdGV
25114RdWVyeSgpO1xuICAgIHRoaXMuI2N1cnJlbnRRdWVyeS5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyk7XG4gICAgaWYgKHByZXZPcHRpb25zLl9kZWZhdWx0ZWQgJiYgIXNoYWxsb3dFcXVhbE9iamVjdHModGhpcy5vcHRpb25zLCBwcmV2T3B0aW9ucykpIHtcbiAgICAgIHRoaXMuI2NsaWVudC5nZXRRdWVyeUNhY2hlKCkubm90aWZ5KHtcbiAgICAgICAgdHlwZTogXCJvYnNlcnZlck9wdGlvbnNVcGRhdGVkXCIsXG4gICAgICAgIHF1ZXJ5OiB0aGlzLiNjdXJyZW50UXVlcnksXG4gICAgICAgIG9ic2VydmVyOiB0aGlzXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgbW91bnRlZCA9IHRoaXMuaGFzTGlzdGVuZXJzKCk7XG4gICAgaWYgKG1vdW50ZWQgJiYgc2hvdWxkRmV0Y2hPcHRpb25hbGx5KFxuICAgICAgdGhpcy4jY3VycmVudFF1ZXJ5LFxuICAgICAgcHJldlF1ZXJ5LFxuICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgcHJldk9wdGlvbnNcbiAgICApKSB7XG4gICAgICB0aGlzLiNleGVjdXRlRmV0Y2goKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVSZXN1bHQoKTtcbiAgICBpZiAobW91bnRlZCAmJiAodGhpcy4jY3VycmVudFF1ZXJ5ICE9PSBwcmV2UXVlcnkgfHwgcmVzb2x2ZUVuYWJsZWQodGhpcy5vcHRpb25zLmVuYWJsZWQsIHRoaXMuI2N1cnJlbnRRdWVyeSkgIT09IHJlc29sdmVFbmFibGVkKHByZXZPcHRpb25zLmVuYWJsZWQsIHRoaXMuI2N1cnJlbnRRdWVyeSkgfHwgcmVzb2x2ZVN0YWxlVGltZSh0aGlzLm9wdGlvbnMuc3RhbGVUaW1lLCB0aGlzLiNjdXJyZW50UXVlcnkpICE9PSByZXNvbHZlU3RhbGVUaW
251141lKHByZXZPcHRpb25zLnN0YWxlVGltZSwgdGhpcy4jY3VycmVudFF1ZXJ5KSkpIHtcbiAgICAgIHRoaXMuI3VwZGF0ZVN0YWxlVGltZW91dCgpO1xuICAgIH1cbiAgICBjb25zdCBuZXh0UmVmZXRjaEludGVydmFsID0gdGhpcy4jY29tcHV0ZVJlZmV0Y2hJbnRlcnZhbCgpO1xuICAgIGlmIChtb3VudGVkICYmICh0aGlzLiNjdXJyZW50UXVlcnkgIT09IHByZXZRdWVyeSB8fCByZXNvbHZlRW5hYmxlZCh0aGlzLm9wdGlvbnMuZW5hYmxlZCwgdGhpcy4jY3VycmVudFF1ZXJ5KSAhPT0gcmVzb2x2ZUVuYWJsZWQocHJldk9wdGlvbnMuZW5hYmxlZCwgdGhpcy4jY3VycmVudFF1ZXJ5KSB8fCBuZXh0UmVmZXRjaEludGVydmFsICE9PSB0aGlzLiNjdXJyZW50UmVmZXRjaEludGVydmFsKSkge1xuICAgICAgdGhpcy4jdXBkYXRlUmVmZXRjaEludGVydmFsKG5leHRSZWZldGNoSW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuICBnZXRPcHRpbWlzdGljUmVzdWx0KG9wdGlvbnMpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuI2NsaWVudC5nZXRRdWVyeUNhY2hlKCkuYnVpbGQodGhpcy4jY2xpZW50LCBvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNyZWF0ZVJlc3VsdChxdWVyeSwgb3B0aW9ucyk7XG4gICAgaWYgKHNob3VsZEFzc2lnbk9ic2VydmVyQ3VycmVudFByb3BlcnRpZXModGhpcywgcmVzdWx0KSkge1xuICAgICAgdGhpcy4jY3VycmVudFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgIHRoaXMuI2N1cnJlbnRSZXN1bHRPcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgdGhpcy4jY3VycmVudFJlc3VsdFN0YXRlID0gdGhpcy4jY3VycmVudFF1ZXJ5LnN0YXRlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGdldEN1cnJlbnRSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRSZXN1bHQ7XG4gIH1cbiAgdHJhY2tSZXN1bHQocmVzdWx0LCBvblByb3BUcmFja2VkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShyZXN1bHQsIHtcbiAgICAgIGdldDogKHRhcmdldCwga2V5KSA9PiB7XG4gICAgICAgIHRoaXMudHJhY2tQcm9wKGtleSk7XG4gICAgICAgIG9uUHJvcFRyYWNrZWQ/LihrZXkpO1xuICAgICAgICBpZiAoa2V5ID09PSBcInByb21pc2VcIiAmJiAhdGhpcy5vcHRpb25zLmV4cGVyaW1lbnRhbF9wcmVmZXRjaEluUmVuZGVyICYmIHRoaXMuI2N1cnJlbnRUaGVuYWJsZS5zdGF0dXMgPT09IFwicGVuZGluZ1wiKSB7XG4gICAgICAgICAgdGhpcy4jY3VycmVudFRoZW5hYmxlLnJlamVjdChcbiAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgXCJleHBlcmltZW50YWxfcHJlZmV0Y2hJblJlbmRlciBmZWF0dXJlIGZsYWcgaXMgbm90IGVuYWJsZWRcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICB0cmFja1Byb3Aoa2V5KSB7XG4gICAgdGhpcy4jdHJhY2tlZFByb3BzLmFkZChrZXkpO1xuICB9XG4gIGdldEN1cnJlbnRRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy4jY3VycmVudFF1ZXJ5O1xuICB9XG4gIHJlZmV0Y2goeyAuLi5vcHRpb25zIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmZldGNoKHtcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgfVxuICBmZXRjaE9wdGltaXN0aWMob3B0aW9ucykge1xuICAgIGNvbnN0IGRlZmF1bHRlZE9wdGlvbnMgPSB0aGlzLiNjbGllbnQuZGVmYXVsdFF1ZXJ5T3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuI2NsaWVudC5nZXRRdWVyeUNhY2hlKCkuYnVpbGQodGhpcy4jY2xpZW50LCBkZWZhdWx0ZWRPcHRpb25zKTtcbiAgICByZXR1cm4gcXVlcnkuZmV0Y2goKS50aGVuKCgpID0+IHRoaXMuY3JlYXRlUmVzdWx0KHF1ZXJ5LCBkZWZhdWx0ZWRPcHRpb25zKSk7XG4gIH1cbiAgZmV0Y2goZmV0Y2hPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuI2V4ZWN1dGVGZXRjaCh7XG4gICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICBjYW5jZWxSZWZldGNoOiBmZXRjaE9wdGlvbnMuY2FuY2VsUmVmZXRjaCA/PyB0cnVlXG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVJlc3VsdCgpO1xuICAgICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRSZXN1bHQ7XG4gICAgfSk7XG4gIH1cbiAgI2V4ZWN1dGVGZXRjaChmZXRjaE9wdGlvbnMpIHtcbiAgICB0aGlzLiN1cGRhdGVRdWVyeSgpO1xuICAgIGxldCBwcm9taXNlID0gdGhpcy4jY3VycmVudFF1ZXJ5LmZldGNoKFxuICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgZmV0Y2hPcHRpb25zXG4gICAgKTtcbiAgICBpZiAoIWZldGNoT3B0aW9ucz8udGhyb3dPbkVycm9yKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS5jYXRjaChub29wKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cbiAgI3VwZGF0ZVN0YWxlVGltZW91dCgpIHtcbiAgICB0aGlzLiNjbGVhclN0YWxlVGltZW91dCgpO1xuICAgIGNvbnN0IHN0YWxlVGltZSA9IHJlc29sdmVTdGFsZVRpbWUoXG4gICAgICB0aGlzLm9wdGlvbnMuc3RhbGVUaW1lLFxuICAgICAgdGhpcy4jY3VycmVudFF1ZXJ5XG4gICAgKTtcbiAgICBpZiAoaXNTZXJ2ZXIgfHwgdGhpcy4jY3VycmVudFJlc3VsdC5pc1N0YWxlIHx8ICFpc1ZhbGlkVGltZW91dChzdGFsZVRpbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpbWUgPSB0aW1lVW50aWxTdGFsZSh0aGlzLiNjdXJyZW50UmVzdWx0LmRhdGFVcGRhdGVkQXQsIHN0YWxlVGltZSk7XG4gICAgY29uc3QgdGltZW91dCA9IHRpbWUgKyAxO1xuICAgIHRoaXMuI3N0YWxlVGltZW91dElkID0gdGltZW91dE1hbmFnZXIuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuI2N1cnJlbnRSZXN1bHQuaXNTdGFsZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdCgpO1xuICAgICAgfVxuICAgIH0sIHRpbWVvdXQpO1xuICB9XG4gICNjb21wdXRlUmVmZXRjaEludGVydmFsKCkge1xuICAgIHJldHVybiAodHlwZW9mIHRoaXMub3B0aW9ucy5yZWZldGNoSW50ZXJ2YWwgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMub3B0aW9ucy5yZWZldGNoSW50ZXJ2YWwodGhpcy4jY3VycmVudFF1ZXJ5KSA6IHRoaXMub3B0aW9ucy5yZWZldGNoSW50ZXJ2YWwpID8/IGZhbHNlO1xuICB9XG4gICN1cGRhdGVSZWZldGNoSW50ZXJ2YWwobmV4dEludGVydmFsKSB7XG4gICAgdGhpcy4jY2xlYXJSZWZldGNoSW50ZXJ2YWwoKTtcbiAgICB0aGlzLiNjdXJyZW50UmVmZXRjaEludGVydmFsID0gbmV4dEludGVydmFsO1xuICAgIGlmIChpc1NlcnZlciB8fCByZXNvbHZlRW5hYmxlZCh0aGlzLm9wdGlvbnMuZW5hYmxlZCwgdGhpcy4jY3VycmVudFF1ZXJ5KSA9PT0gZmFsc2UgfHwgIWlzVmFsaWRUaW1lb3V0KHRoaXMuI2N1cnJlbnRSZWZldGNoSW50ZXJ2YWwpIHx8IHRoaXMuI2N1cnJlbnRSZWZldGNoSW50ZXJ2YWwgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jcmVmZXRjaEludGVydmFsSWQgPSB0aW1lb3V0TWFuYWdlci5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnJlZmV0Y2hJbnRlcnZhbEluQmFja2dyb3VuZCB8fCBmb2N1c01hbmFnZXIuaXNGb2N1c2VkKCkpIHtcbiAgICAgICAgdGhpcy4jZXhlY3V0ZUZldGNoKCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy4jY3VycmVudFJlZmV0Y2hJbnRlcnZhbCk7XG4gIH1cbiAgI3VwZGF0ZVRpbWVycygpIHtcbiAgICB0aGlzLiN1cGRhdGVTdGFsZVRpbWVvdXQoKTtcbiAgICB0aGlzLiN1cGRhdGVSZWZldGNoSW50ZXJ2YWwodGhpcy4jY29tcHV0ZVJlZmV0Y2hJbnRlcnZhbCgpKTtcbiAgfVxuICAjY2xlYXJTdGFsZVRpbWVvdXQoKSB7XG4gICAgaWYgKHRoaXMuI3N0YWxlVGltZW91dElkKSB7XG4gICAgICB0aW1lb3V0TWFuYWdlci5jbGVhclRpbWVvdXQodGhpcy4jc3RhbGVUaW
251141lb3V0SWQpO1xuICAgICAgdGhpcy4jc3RhbGVUaW1lb3V0SWQgPSB2b2lkIDA7XG4gICAgfVxuICB9XG4gICNjbGVhclJlZmV0Y2hJbnRlcnZhbCgpIHtcbiAgICBpZiAodGhpcy4jcmVmZXRjaEludGVydmFsSWQpIHtcbiAgICAgIHRpbWVvdXRNYW5hZ2VyLmNsZWFySW50ZXJ2YWwodGhpcy4jcmVmZXRjaEludGVydmFsSWQpO1xuICAgICAgdGhpcy4jcmVmZXRjaEludGVydmFsSWQgPSB2b2lkIDA7XG4gICAgfVxuICB9XG4gIGNyZWF0ZVJlc3VsdChxdWVyeSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHByZXZRdWVyeSA9IHRoaXMuI2N1cnJlbnRRdWVyeTtcbiAgICBjb25zdCBwcmV2T3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBwcmV2UmVzdWx0ID0gdGhpcy4jY3VycmVudFJlc3VsdDtcbiAgICBjb25zdCBwcmV2UmVzdWx0U3RhdGUgPSB0aGlzLiNjdXJyZW50UmVzdWx0U3RhdGU7XG4gICAgY29uc3QgcHJldlJlc3VsdE9wdGlvbnMgPSB0aGlzLiNjdXJyZW50UmVzdWx0T3B0aW9ucztcbiAgICBjb25zdCBxdWVyeUNoYW5nZSA9IHF1ZXJ5ICE9PSBwcmV2UXVlcnk7XG4gICAgY29uc3QgcXVlcnlJbml0aWFsU3RhdGUgPSBxdWVyeUNoYW5nZSA/IHF1ZXJ5LnN0YXRlIDogdGhpcy4jY3VycmVudFF1ZXJ5SW5pdGlhbFN0YXRlO1xuICAgIGNvbnN0IHsgc3RhdGUgfSA9IHF1ZXJ5O1xuICAgIGxldCBuZXdTdGF0ZSA9IHsgLi4uc3RhdGUgfTtcbiAgICBsZXQgaXNQbGFjZWhvbGRlckRhdGEgPSBmYWxzZTtcbiAgICBsZXQgZGF0YTtcbiAgICBpZiAob3B0aW9ucy5fb3B0aW1pc3RpY1Jlc3VsdHMpIHtcbiAgICAgIGNvbnN0IG1vdW50ZWQgPSB0aGlzLmhhc0xpc3RlbmVycygpO1xuICAgICAgY29uc3QgZmV0Y2hPbk1vdW50ID0gIW1vdW50ZWQgJiYgc2hvdWxkRmV0Y2hPbk1vdW50KHF1ZXJ5LCBvcHRpb25zKTtcbiAgICAgIGNvbnN0IGZldGNoT3B0aW9uYWxseSA9IG1vdW50ZWQgJiYgc2hvdWxkRmV0Y2hPcHRpb25hbGx5KHF1ZXJ5LCBwcmV2UXVlcnksIG9wdGlvbnMsIHByZXZPcHRpb25zKTtcbiAgICAgIGlmIChmZXRjaE9uTW91bnQgfHwgZmV0Y2hPcHRpb25hbGx5KSB7XG4gICAgICAgIG5ld1N0YXRlID0ge1xuICAgICAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgICAgIC4uLmZldGNoU3RhdGUoc3RhdGUuZGF0YSwgcXVlcnkub3B0aW9ucylcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLl9vcHRpbWlzdGljUmVzdWx0cyA9PT0gXCJpc1Jlc3RvcmluZ1wiKSB7XG4gICAgICAgIG5ld1N0YXRlLmZldGNoU3RhdHVzID0gXCJpZGxlXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCB7IGVycm9yLCBlcnJvclVwZGF0ZWRBdCwgc3RhdHVzIH0gPSBuZXdTdGF0ZTtcbiAgICBkYXRhID0gbmV3U3RhdGUuZGF0YTtcbiAgICBsZXQgc2tpcFNlbGVjdCA9IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLnBsYWNlaG9sZGVyRGF0YSAhPT0gdm9pZCAwICYmIGRhdGEgPT09IHZvaWQgMCAmJiBzdGF0dXMgPT09IFwicGVuZGluZ1wiKSB7XG4gICAgICBsZXQgcGxhY2Vob2xkZXJEYXRhO1xuICAgICAgaWYgKHByZXZSZXN1bHQ/LmlzUGxhY2Vob2xkZXJEYXRhICYmIG9wdGlvbnMucGxhY2Vob2xkZXJEYXRhID09PSBwcmV2UmVzdWx0T3B0aW9ucz8ucGxhY2Vob2xkZXJEYXRhKSB7XG4gICAgICAgIHBsYWNlaG9sZGVyRGF0YSA9IHByZXZSZXN1bHQuZGF0YTtcbiAgICAgICAgc2tpcFNlbGVjdCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwbGFjZWhvbGRlckRhdGEgPSB0eXBlb2Ygb3B0aW9ucy5wbGFjZWhvbGRlckRhdGEgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMucGxhY2Vob2xkZXJEYXRhKFxuICAgICAgICAgIHRoaXMuI2xhc3RRdWVyeVdpdGhEZWZpbmVkRGF0YT8uc3RhdGUuZGF0YSxcbiAgICAgICAgICB0aGlzLiNsYXN0UXVlcnlXaXRoRGVmaW5lZERhdGFcbiAgICAgICAgKSA6IG9wdGlvbnMucGxhY2Vob2xkZXJEYXRhO1xuICAgICAgfVxuICAgICAgaWYgKHBsYWNlaG9sZGVyRGF0YSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHN0YXR1cyA9IFwic3VjY2Vzc1wiO1xuICAgICAgICBkYXRhID0gcmVwbGFjZURhdGEoXG4gICAgICAgICAgcHJldlJlc3VsdD8uZGF0YSxcbiAgICAgICAgICBwbGFjZWhvbGRlckRhdGEsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpc1BsYWNlaG9sZGVyRGF0YSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNlbGVjdCAmJiBkYXRhICE9PSB2b2lkIDAgJiYgIXNraXBTZWxlY3QpIHtcbiAgICAgIGlmIChwcmV2UmVzdWx0ICYmIGRhdGEgPT09IHByZXZSZXN1bHRTdGF0ZT8uZGF0YSAmJiBvcHRpb25zLnNlbGVjdCA9PT0gdGhpcy4jc2VsZWN0Rm4pIHtcbiAgICAgICAgZGF0YSA9IHRoaXMuI3NlbGVjdFJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy4jc2VsZWN0Rm4gPSBvcHRpb25zLnNlbGVjdDtcbiAgICAgICAgICBkYXRhID0gb3B0aW9ucy5zZWxlY3QoZGF0YSk7XG4gICAgICAgICAgZGF0YSA9IHJlcGxhY2VEYXRhKHByZXZSZXN1bHQ/LmRhdGEsIGRhdGEsIG9wdGlvbnMpO1xuICAgICAgICAgIHRoaXMuI3NlbGVjdFJlc3VsdCA9IGRhdGE7XG4gICAgICAgICAgdGhpcy4jc2VsZWN0RXJyb3IgPSBudWxsO1xuICAgICAgICB9IGNhdGNoIChzZWxlY3RFcnJvcikge1xuICAgICAgICAgIHRoaXMuI3NlbGVjdEVycm9yID0gc2VsZWN0RXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuI3NlbGVjdEVycm9yKSB7XG4gICAgICBlcnJvciA9IHRoaXMuI3NlbGVjdEVycm9yO1xuICAgICAgZGF0YSA9IHRoaXMuI3NlbGVjdFJlc3VsdDtcbiAgICAgIGVycm9yVXBkYXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgIHN0YXR1cyA9IFwiZXJyb3JcIjtcbiAgICB9XG4gICAgY29uc3QgaXNGZXRjaGluZyA9IG5ld1N0YXRlLmZldGNoU3RhdHVzID09PSBcImZldGNoaW5nXCI7XG4gICAgY29uc3QgaXNQZW5kaW5nID0gc3RhdHVzID09PSBcInBlbmRpbmdcIjtcbiAgICBjb25zdCBpc0Vycm9yID0gc3RhdHVzID09PSBcImVycm9yXCI7XG4gICAgY29uc3QgaXNMb2FkaW5nID0gaXNQZW5kaW5nICYmIGlzRmV0Y2hpbmc7XG4gICAgY29uc3QgaGFzRGF0YSA9IGRhdGEgIT09IHZvaWQgMDtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBzdGF0dXMsXG4gICAgICBmZXRjaFN0YXR1czogbmV3U3RhdGUuZmV0Y2hTdGF0dXMsXG4gICAgICBpc1BlbmRpbmcsXG4gICAgICBpc1N1Y2Nlc3M6IHN0YXR1cyA9PT0gXCJzdWNjZXNzXCIsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaXNJbml0aWFsTG9hZGluZzogaXNMb2FkaW5nLFxuICAgICAgaXNMb2FkaW5nLFxuICAgICAgZGF0YSxcbiAgICAgIGRhdGFVcGRhdGVkQXQ6IG5ld1N0YXRlLmRhdGFVcGRhdGVkQXQsXG4gICAgICBlcnJvcixcbiAgICAgIGVycm9yVXBkYXRlZEF0LFxuICAgICAgZmFpbHVy
25114ZUNvdW50OiBuZXdTdGF0ZS5mZXRjaEZhaWx1cmVDb3VudCxcbiAgICAgIGZhaWx1cmVSZWFzb246IG5ld1N0YXRlLmZldGNoRmFpbHVyZVJlYXNvbixcbiAgICAgIGVycm9yVXBkYXRlQ291bnQ6IG5ld1N0YXRlLmVycm9yVXBkYXRlQ291bnQsXG4gICAgICBpc0ZldGNoZWQ6IG5ld1N0YXRlLmRhdGFVcGRhdGVDb3VudCA+IDAgfHwgbmV3U3RhdGUuZXJyb3JVcGRhdGVDb3VudCA+IDAsXG4gICAgICBpc0ZldGNoZWRBZnRlck1vdW50OiBuZXdTdGF0ZS5kYXRhVXBkYXRlQ291bnQgPiBxdWVyeUluaXRpYWxTdGF0ZS5kYXRhVXBkYXRlQ291bnQgfHwgbmV3U3RhdGUuZXJyb3JVcGRhdGVDb3VudCA+IHF1ZXJ5SW5pdGlhbFN0YXRlLmVycm9yVXBkYXRlQ291bnQsXG4gICAgICBpc0ZldGNoaW5nLFxuICAgICAgaXNSZWZldGNoaW5nOiBpc0ZldGNoaW5nICYmICFpc1BlbmRpbmcsXG4gICAgICBpc0xvYWRpbmdFcnJvcjogaXNFcnJvciAmJiAhaGFzRGF0YSxcbiAgICAgIGlzUGF1c2VkOiBuZXdTdGF0ZS5mZXRjaFN0YXR1cyA9PT0gXCJwYXVzZWRcIixcbiAgICAgIGlzUGxhY2Vob2xkZXJEYXRhLFxuICAgICAgaXNSZWZldGNoRXJyb3I6IGlzRXJyb3IgJiYgaGFzRGF0YSxcbiAgICAgIGlzU3RhbGU6IGlzU3RhbGUocXVlcnksIG9wdGlvbnMpLFxuICAgICAgcmVmZXRjaDogdGhpcy5yZWZldGNoLFxuICAgICAgcHJvbWlzZTogdGhpcy4jY3VycmVudFRoZW5hYmxlLFxuICAgICAgaXNFbmFibGVkOiByZXNvbHZlRW5hYmxlZChvcHRpb25zLmVuYWJsZWQsIHF1ZXJ5KSAhPT0gZmFsc2VcbiAgICB9O1xuICAgIGNvbnN0IG5leHRSZXN1bHQgPSByZXN1bHQ7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5leHBlcmltZW50YWxfcHJlZmV0Y2hJblJlbmRlcikge1xuICAgICAgY29uc3QgZmluYWxpemVUaGVuYWJsZUlmUG9zc2libGUgPSAodGhlbmFibGUpID0+IHtcbiAgICAgICAgaWYgKG5leHRSZXN1bHQuc3RhdHVzID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICB0aGVuYWJsZS5yZWplY3QobmV4dFJlc3VsdC5lcnJvcik7XG4gICAgICAgIH0gZWxzZSBpZiAobmV4dFJlc3VsdC5kYXRhICE9PSB2b2lkIDApIHtcbiAgICAgICAgICB0aGVuYWJsZS5yZXNvbHZlKG5leHRSZXN1bHQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCByZWNyZWF0ZVRoZW5hYmxlID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy4jY3VycmVudFRoZW5hYmxlID0gbmV4dFJlc3VsdC5wcm9taXNlID0gcGVuZGluZ1RoZW5hYmxlKCk7XG4gICAgICAgIGZpbmFsaXplVGhlbmFibGVJZlBvc3NpYmxlKHBlbmRpbmcpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHByZXZUaGVuYWJsZSA9IHRoaXMuI2N1cnJlbnRUaGVuYWJsZTtcbiAgICAgIHN3aXRjaCAocHJldlRoZW5hYmxlLnN0YXR1cykge1xuICAgICAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgICAgICAgIGlmIChxdWVyeS5xdWVyeUhhc2ggPT09IHByZXZRdWVyeS5xdWVyeUhhc2gpIHtcbiAgICAgICAgICAgIGZpbmFsaXplVGhlbmFibGVJZlBvc3NpYmxlKHByZXZUaGVuYWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZnVsZmlsbGVkXCI6XG4gICAgICAgICAgaWYgKG5leHRSZXN1bHQuc3RhdHVzID09PSBcImVycm9yXCIgfHwgbmV4dFJlc3VsdC5kYXRhICE9PSBwcmV2VGhlbmFibGUudmFsdWUpIHtcbiAgICAgICAgICAgIHJlY3JlYXRlVGhlbmFibGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJyZWplY3RlZFwiOlxuICAgICAgICAgIGlmIChuZXh0UmVzdWx0LnN0YXR1cyAhPT0gXCJlcnJvclwiIHx8IG5leHRSZXN1bHQuZXJyb3IgIT09IHByZXZUaGVuYWJsZS5yZWFzb24pIHtcbiAgICAgICAgICAgIHJlY3JlYXRlVGhlbmFibGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXh0UmVzdWx0O1xuICB9XG4gIHVwZGF0ZVJlc3VsdCgpIHtcbiAgICBjb25zdCBwcmV2UmVzdWx0ID0gdGhpcy4jY3VycmVudFJlc3VsdDtcbiAgICBjb25zdCBuZXh0UmVzdWx0ID0gdGhpcy5jcmVhdGVSZXN1bHQodGhpcy4jY3VycmVudFF1ZXJ5LCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuI2N1cnJlbnRSZXN1bHRTdGF0ZSA9IHRoaXMuI2N1cnJlbnRRdWVyeS5zdGF0ZTtcbiAgICB0aGlzLiNjdXJyZW50UmVzdWx0T3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAodGhpcy4jY3VycmVudFJlc3VsdFN0YXRlLmRhdGEgIT09IHZvaWQgMCkge1xuICAgICAgdGhpcy4jbGFzdFF1ZXJ5V2l0aERlZmluZWREYXRhID0gdGhpcy4jY3VycmVudFF1ZXJ5O1xuICAgIH1cbiAgICBpZiAoc2hhbGxvd0VxdWFsT2JqZWN0cyhuZXh0UmVzdWx0LCBwcmV2UmVzdWx0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNjdXJyZW50UmVzdWx0ID0gbmV4dFJlc3VsdDtcbiAgICBjb25zdCBzaG91bGROb3RpZnlMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgICBpZiAoIXByZXZSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB7IG5vdGlmeU9uQ2hhbmdlUHJvcHMgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgIGNvbnN0IG5vdGlmeU9uQ2hhbmdlUHJvcHNWYWx1ZSA9IHR5cGVvZiBub3RpZnlPbkNoYW5nZVByb3BzID09PSBcImZ1bmN0aW9uXCIgPyBub3RpZnlPbkNoYW5nZVByb3BzKCkgOiBub3RpZnlPbkNoYW5nZVByb3BzO1xuICAgICAgaWYgKG5vdGlmeU9uQ2hhbmdlUHJvcHNWYWx1ZSA9PT0gXCJhbGxcIiB8fCAhbm90aWZ5T25DaGFuZ2VQcm9wc1ZhbHVlICYmICF0aGlzLiN0cmFja2VkUHJvcHMuc2l6ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluY2x1ZGVkUHJvcHMgPSBuZXcgU2V0KFxuICAgICAgICBub3RpZnlPbkNoYW5nZVByb3BzVmFsdWUgPz8gdGhpcy4jdHJhY2tlZFByb3BzXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy50aHJvd09uRXJyb3IpIHtcbiAgICAgICAgaW5jbHVkZWRQcm9wcy5hZGQoXCJlcnJvclwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybi
25114BPYmplY3Qua2V5cyh0aGlzLiNjdXJyZW50UmVzdWx0KS5zb21lKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdHlwZWRLZXkgPSBrZXk7XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLiNjdXJyZW50UmVzdWx0W3R5cGVkS2V5XSAhPT0gcHJldlJlc3VsdFt0eXBlZEtleV07XG4gICAgICAgIHJldHVybiBjaGFuZ2VkICYmIGluY2x1ZGVkUHJvcHMuaGFzKHR5cGVkS2V5KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdGhpcy4jbm90aWZ5KHsgbGlzdGVuZXJzOiBzaG91bGROb3RpZnlMaXN0ZW5lcnMoKSB9KTtcbiAgfVxuICAjdXBkYXRlUXVlcnkoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLiNjbGllbnQuZ2V0UXVlcnlDYWNoZSgpLmJ1aWxkKHRoaXMuI2NsaWVudCwgdGhpcy5vcHRpb25zKTtcbiAgICBpZiAocXVlcnkgPT09IHRoaXMuI2N1cnJlbnRRdWVyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcmV2UXVlcnkgPSB0aGlzLiNjdXJyZW50UXVlcnk7XG4gICAgdGhpcy4jY3VycmVudFF1ZXJ5ID0gcXVlcnk7XG4gICAgdGhpcy4jY3VycmVudFF1ZXJ5SW5pdGlhbFN0YXRlID0gcXVlcnkuc3RhdGU7XG4gICAgaWYgKHRoaXMuaGFzTGlzdGVuZXJzKCkpIHtcbiAgICAgIHByZXZRdWVyeT8ucmVtb3ZlT2JzZXJ2ZXIodGhpcyk7XG4gICAgICBxdWVyeS5hZGRPYnNlcnZlcih0aGlzKTtcbiAgICB9XG4gIH1cbiAgb25RdWVyeVVwZGF0ZSgpIHtcbiAgICB0aGlzLnVwZGF0ZVJlc3VsdCgpO1xuICAgIGlmICh0aGlzLmhhc0xpc3RlbmVycygpKSB7XG4gICAgICB0aGlzLiN1cGRhdGVUaW1lcnMoKTtcbiAgICB9XG4gIH1cbiAgI25vdGlmeShub3RpZnlPcHRpb25zKSB7XG4gICAgbm90aWZ5TWFuYWdlci5iYXRjaCgoKSA9PiB7XG4gICAgICBpZiAobm90aWZ5T3B0aW9ucy5saXN0ZW5lcnMpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICBsaXN0ZW5lcih0aGlzLiNjdXJyZW50UmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLiNjbGllbnQuZ2V0UXVlcnlDYWNoZSgpLm5vdGlmeSh7XG4gICAgICAgIHF1ZXJ5OiB0aGlzLiNjdXJyZW50UXVlcnksXG4gICAgICAgIHR5cGU6IFwib2JzZXJ2ZXJSZXN1bHRzVXBkYXRlZFwiXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNob3VsZExvYWRPbk1vdW50KHF1ZXJ5LCBvcHRpb25zKSB7XG4gIHJldHVybiByZXNvbHZlRW5hYmxlZChvcHRpb25zLmVuYWJsZWQsIHF1ZXJ5KSAhPT0gZmFsc2UgJiYgcXVlcnkuc3RhdGUuZGF0YSA9PT0gdm9pZCAwICYmICEocXVlcnkuc3RhdGUuc3RhdHVzID09PSBcImVycm9yXCIgJiYgb3B0aW9ucy5yZXRyeU9uTW91bnQgPT09IGZhbHNlKTtcbn1cbmZ1bmN0aW9uIHNob3VsZEZldGNoT25Nb3VudChxdWVyeSwgb3B0aW9ucykge1xuICByZXR1cm4gc2hvdWxkTG9hZE9uTW91bnQocXVlcnksIG9wdGlvbnMpIHx8IHF1ZXJ5LnN0YXRlLmRhdGEgIT09IHZvaWQgMCAmJiBzaG91bGRGZXRjaE9uKHF1ZXJ5LCBvcHRpb25zLCBvcHRpb25zLnJlZmV0Y2hPbk1vdW50KTtcbn1cbmZ1bmN0aW9uIHNob3VsZEZldGNoT24ocXVlcnksIG9wdGlvbnMsIGZpZWxkKSB7XG4gIGlmIChyZXNvbHZlRW5hYmxlZChvcHRpb25zLmVuYWJsZWQsIHF1ZXJ5KSAhPT0gZmFsc2UgJiYgcmVzb2x2ZVN0YWxlVGltZShvcHRpb25zLnN0YWxlVGltZSwgcXVlcnkpICE9PSBcInN0YXRpY1wiKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgZmllbGQgPT09IFwiZnVuY3Rpb25cIiA/IGZpZWxkKHF1ZXJ5KSA6IGZpZWxkO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gXCJhbHdheXNcIiB8fCB2YWx1ZSAhPT0gZmFsc2UgJiYgaXNTdGFsZShxdWVyeSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2hvdWxkRmV0Y2hPcHRpb25hbGx5KHF1ZXJ5LCBwcmV2UXVlcnksIG9wdGlvbnMsIHByZXZPcHRpb25zKSB7XG4gIHJldHVybiAocXVlcnkgIT09IHByZXZRdWVyeSB8fCByZXNvbHZlRW5hYmxlZChwcmV2T3B0aW9ucy5lbmFibGVkLCBxdWVyeSkgPT09IGZhbHNlKSAmJiAoIW9wdGlvbnMuc3VzcGVuc2UgfHwgcXVlcnkuc3RhdGUuc3RhdHVzICE9PSBcImVycm9yXCIpICYmIGlzU3RhbGUocXVlcnksIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gaXNTdGFsZShxdWVyeSwgb3B0aW9ucykge1xuICByZXR1cm4gcmVzb2x2ZUVuYWJsZWQob3B0aW9ucy5lbmFibGVkLCBxdWVyeSkgIT09IGZhbHNlICYmIHF1ZXJ5LmlzU3RhbGVCeVRpbWUocmVzb2x2ZVN0YWxlVGltZShvcHRpb25zLnN0YWxlVGltZSwgcXVlcnkpKTtcbn1cbmZ1bmN0aW9uIHNob3VsZEFzc2lnbk9ic2VydmVyQ3VycmVudFByb3BlcnRpZXMob2JzZXJ2ZXIsIG9wdGltaXN0aWNSZXN1bHQpIHtcbiAgaWYgKCFzaGFsbG93RXF1YWxPYmplY3RzKG9ic2VydmVyLmdldEN1cnJlbnRSZXN1bHQoKSwgb3B0aW1pc3RpY1Jlc3VsdCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQge1xuICBRdWVyeU9ic2VydmVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnlPYnNlcnZlci5qcy5tYXAiLCIvLyBzcmMvaW5maW5pdGVRdWVyeUJlaGF2aW9yLnRzXG5pbXBvcnQgeyBhZGRUb0VuZCwgYWRkVG9TdGFydCwgZW5zdXJlUXVlcnlGbiB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5mdW5jdGlvbiBpbmZpbml0ZVF1ZXJ5QmVoYXZpb3IocGFnZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBvbkZldGNoOiAoY29udGV4dCwgcXVlcnkpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgICBjb25zdCBkaXJlY3Rpb24gPSBjb250ZXh0LmZldGNoT3B0aW9ucz8ubWV0YT8uZmV0Y2hNb3JlPy5kaXJlY3Rpb247XG4gICAgICBjb25zdCBvbGRQYWdlcyA9IGNvbnRleHQuc3RhdGUuZGF0YT8ucGFnZXMgfHwgW107XG4gICAgICBjb25zdCBvbGRQYWdlUGFyYW1zID0gY29udGV4dC5zdGF0ZS5kYXRhPy5wYWdlUGFyYW1zIHx8IFtdO1xuICAgICAgbGV0IHJlc3VsdCA9IHsgcGFnZXM6IFtdLCBwYWdlUGFyYW1zOiBbXSB9O1xuICAgICAgbGV0IGN1cnJlbnRQYWdlID0gMDtcbiAgICAgIGNvbnN0IGZldGNoRm4gPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgYWRkU2lnbmFsUHJvcGVydHkgPSAob2JqZWN0KSA9PiB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgXCJzaWduYWxcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udGV4dC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgI
25114H0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuc2lnbmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBxdWVyeUZuID0gZW5zdXJlUXVlcnlGbihjb250ZXh0Lm9wdGlvbnMsIGNvbnRleHQuZmV0Y2hPcHRpb25zKTtcbiAgICAgICAgY29uc3QgZmV0Y2hQYWdlID0gYXN5bmMgKGRhdGEsIHBhcmFtLCBwcmV2aW91cykgPT4ge1xuICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCAmJiBkYXRhLnBhZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY3JlYXRlUXVlcnlGbkNvbnRleHQgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeUZuQ29udGV4dDIgPSB7XG4gICAgICAgICAgICAgIGNsaWVudDogY29udGV4dC5jbGllbnQsXG4gICAgICAgICAgICAgIHF1ZXJ5S2V5OiBjb250ZXh0LnF1ZXJ5S2V5LFxuICAgICAgICAgICAgICBwYWdlUGFyYW06IHBhcmFtLFxuICAgICAgICAgICAgICBkaXJlY3Rpb246IHByZXZpb3VzID8gXCJiYWNrd2FyZFwiIDogXCJmb3J3YXJkXCIsXG4gICAgICAgICAgICAgIG1ldGE6IGNvbnRleHQub3B0aW9ucy5tZXRhXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWRkU2lnbmFsUHJvcGVydHkocXVlcnlGbkNvbnRleHQyKTtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeUZuQ29udGV4dDI7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBxdWVyeUZuQ29udGV4dCA9IGNyZWF0ZVF1ZXJ5Rm5Db250ZXh0KCk7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHF1ZXJ5Rm4ocXVlcnlGbkNvbnRleHQpO1xuICAgICAgICAgIGNvbnN0IHsgbWF4UGFnZXMgfSA9IGNvbnRleHQub3B0aW9ucztcbiAgICAgICAgICBjb25zdCBhZGRUbyA9IHByZXZpb3VzID8gYWRkVG9TdGFydCA6IGFkZFRvRW5kO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYWdlczogYWRkVG8oZGF0YS5wYWdlcywgcGFnZSwgbWF4UGFnZXMpLFxuICAgICAgICAgICAgcGFnZVBhcmFtczogYWRkVG8oZGF0YS5wYWdlUGFyYW1zLCBwYXJhbSwgbWF4UGFnZXMpXG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiAmJiBvbGRQYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiO1xuICAgICAgICAgIGNvbnN0IHBhZ2VQYXJhbUZuID0gcHJldmlvdXMgPyBnZXRQcmV2aW91c1BhZ2VQYXJhbSA6IGdldE5leHRQYWdlUGFyYW07XG4gICAgICAgICAgY29uc3Qgb2xkRGF0YSA9IHtcbiAgICAgICAgICAgIHBhZ2VzOiBvbGRQYWdlcyxcbiAgICAgICAgICAgIHBhZ2VQYXJhbXM6IG9sZFBhZ2VQYXJhbXNcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHBhcmFtID0gcGFnZVBhcmFtRm4ob3B0aW9ucywgb2xkRGF0YSk7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmV0Y2hQYWdlKG9sZERhdGEsIHBhcmFtLCBwcmV2aW91cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVtYWluaW5nUGFnZXMgPSBwYWdlcyA/PyBvbGRQYWdlcy5sZW5ndGg7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgY29uc3QgcGFyYW0gPSBjdXJyZW50UGFnZSA9PT0gMCA/IG9sZFBhZ2VQYXJhbXNbMF0gPz8gb3B0aW9ucy5pbml0aWFsUGFnZVBhcmFtIDogZ2V0TmV4dFBhZ2VQYXJhbShvcHRpb25zLCByZXN1bHQpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlID4gMCAmJiBwYXJhbSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmV0Y2hQYWdlKHJlc3VsdCwgcGFyYW0pO1xuICAgICAgICAgICAgY3VycmVudFBhZ2UrKztcbiAgICAgICAgICB9IHdoaWxlIChjdXJyZW50UGFnZSA8IHJlbWFpbmluZ1BhZ2VzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIGlmIChjb250ZXh0Lm9wdGlvbnMucGVyc2lzdGVyKSB7XG4gICAgICAgIGNvbnRleHQuZmV0Y2hGbiA9ICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5vcHRpb25zLnBlcnNpc3Rlcj8uKFxuICAgICAgICAgICAgZmV0Y2hGbixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xpZW50OiBjb250ZXh0LmNsaWVudCxcbiAgICAgICAgICAgICAgcXVlcnlLZXk6IGNvbnRleHQucXVlcnlLZXksXG4gICAgICAgICAgICAgIG1ldGE6IGNvbnRleHQub3B0aW9ucy5tZXRhLFxuICAgICAgICAgICAgICBzaWduYWw6IGNvbnRleHQuc2lnbmFsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcXVlcnlcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5mZXRjaEZuID0gZmV0Y2hGbjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBnZXROZXh0UGFnZVBhcmFtKG9wdGlvbnMsIHsgcGFnZXMsIHBhZ2VQYXJhbXMgfSkge1xuICBjb25zdCBsYXN0SW5kZXggPSBwYWdlcy5sZW5ndGggLSAxO1xuICByZXR1cm4gcGFnZXMubGVuZ3RoID4gMCA/IG9wdGlvbnMuZ2V0TmV4dFBhZ2VQYXJhbShcbiAgICBwYWdlc1tsYXN0SW5kZXhdLFxuICAgIHBhZ2VzLFxuICAgIHBhZ2VQYXJhbXNbbGFzdEluZGV4XSxcbiAgICBwYWdlUGFyYW1zXG4gICkgOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBnZXRQcmV2aW91c1BhZ2VQYXJhbShvcHRpb25zLCB7IHBhZ2VzLCBwYWdlUGFyYW1zIH0pIHtcbiAgcmV0dXJuIHBhZ2VzLmxlbmd0aCA+IDAgPyBvcHRpb25zLmdldFByZXZpb3VzUGFnZVBhcmFtPy4ocGFnZXNbMF0sIHBhZ2VzLCBwYWdlUGFyYW1zWzBdLCBwYWdlUGFyYW1zKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGhhc05leHRQYWdlKG9wdGlvbnMsIGRhdGEpIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybi
25114BnZXROZXh0UGFnZVBhcmFtKG9wdGlvbnMsIGRhdGEpICE9IG51bGw7XG59XG5mdW5jdGlvbiBoYXNQcmV2aW91c1BhZ2Uob3B0aW9ucywgZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgIW9wdGlvbnMuZ2V0UHJldmlvdXNQYWdlUGFyYW0pIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGdldFByZXZpb3VzUGFnZVBhcmFtKG9wdGlvbnMsIGRhdGEpICE9IG51bGw7XG59XG5leHBvcnQge1xuICBoYXNOZXh0UGFnZSxcbiAgaGFzUHJldmlvdXNQYWdlLFxuICBpbmZpbml0ZVF1ZXJ5QmVoYXZpb3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmZpbml0ZVF1ZXJ5QmVoYXZpb3IuanMubWFwIiwiLy8gc3JjL211dGF0aW9uLnRzXG5pbXBvcnQgeyBub3RpZnlNYW5hZ2VyIH0gZnJvbSBcIi4vbm90aWZ5TWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgUmVtb3ZhYmxlIH0gZnJvbSBcIi4vcmVtb3ZhYmxlLmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXRyeWVyIH0gZnJvbSBcIi4vcmV0cnllci5qc1wiO1xudmFyIE11dGF0aW9uID0gY2xhc3MgZXh0ZW5kcyBSZW1vdmFibGUge1xuICAjY2xpZW50O1xuICAjb2JzZXJ2ZXJzO1xuICAjbXV0YXRpb25DYWNoZTtcbiAgI3JldHJ5ZXI7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jY2xpZW50ID0gY29uZmlnLmNsaWVudDtcbiAgICB0aGlzLm11dGF0aW9uSWQgPSBjb25maWcubXV0YXRpb25JZDtcbiAgICB0aGlzLiNtdXRhdGlvbkNhY2hlID0gY29uZmlnLm11dGF0aW9uQ2FjaGU7XG4gICAgdGhpcy4jb2JzZXJ2ZXJzID0gW107XG4gICAgdGhpcy5zdGF0ZSA9IGNvbmZpZy5zdGF0ZSB8fCBnZXREZWZhdWx0U3RhdGUoKTtcbiAgICB0aGlzLnNldE9wdGlvbnMoY29uZmlnLm9wdGlvbnMpO1xuICAgIHRoaXMuc2NoZWR1bGVHYygpO1xuICB9XG4gIHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy51cGRhdGVHY1RpbWUodGhpcy5vcHRpb25zLmdjVGltZSk7XG4gIH1cbiAgZ2V0IG1ldGEoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhO1xuICB9XG4gIGFkZE9ic2VydmVyKG9ic2VydmVyKSB7XG4gICAgaWYgKCF0aGlzLiNvYnNlcnZlcnMuaW5jbHVkZXMob2JzZXJ2ZXIpKSB7XG4gICAgICB0aGlzLiNvYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gICAgICB0aGlzLmNsZWFyR2NUaW1lb3V0KCk7XG4gICAgICB0aGlzLiNtdXRhdGlvbkNhY2hlLm5vdGlmeSh7XG4gICAgICAgIHR5cGU6IFwib2JzZXJ2ZXJBZGRlZFwiLFxuICAgICAgICBtdXRhdGlvbjogdGhpcyxcbiAgICAgICAgb2JzZXJ2ZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZW1vdmVPYnNlcnZlcihvYnNlcnZlcikge1xuICAgIHRoaXMuI29ic2VydmVycyA9IHRoaXMuI29ic2VydmVycy5maWx0ZXIoKHgpID0+IHggIT09IG9ic2VydmVyKTtcbiAgICB0aGlzLnNjaGVkdWxlR2MoKTtcbiAgICB0aGlzLiNtdXRhdGlvbkNhY2hlLm5vdGlmeSh7XG4gICAgICB0eXBlOiBcIm9ic2VydmVyUmVtb3ZlZFwiLFxuICAgICAgbXV0YXRpb246IHRoaXMsXG4gICAgICBvYnNlcnZlclxuICAgIH0pO1xuICB9XG4gIG9wdGlvbmFsUmVtb3ZlKCkge1xuICAgIGlmICghdGhpcy4jb2JzZXJ2ZXJzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuc3RhdHVzID09PSBcInBlbmRpbmdcIikge1xuICAgICAgICB0aGlzLnNjaGVkdWxlR2MoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuI211dGF0aW9uQ2FjaGUucmVtb3ZlKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb250aW51ZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmV0cnllcj8uY29udGludWUoKSA/PyAvLyBjb250aW51aW5nIGEgbXV0YXRpb24gYXNzdW1lcyB0aGF0IHZhcmlhYmxlcyBhcmUgc2V0LCBtdXRhdGlvbiBtdXN0IGhhdmUgYmVlbiBkZWh5ZHJhdGVkIGJlZm9yZVxuICAgIHRoaXMuZXhlY3V0ZSh0aGlzLnN0YXRlLnZhcmlhYmxlcyk7XG4gIH1cbiAgYXN5bmMgZXhlY3V0ZSh2YXJpYWJsZXMpIHtcbiAgICBjb25zdCBvbkNvbnRpbnVlID0gKCkgPT4ge1xuICAgICAgdGhpcy4jZGlzcGF0Y2goeyB0eXBlOiBcImNvbnRpbnVlXCIgfSk7XG4gICAgfTtcbiAgICBjb25zdCBtdXRhdGlvbkZuQ29udGV4dCA9IHtcbiAgICAgIGNsaWVudDogdGhpcy4jY2xpZW50LFxuICAgICAgbWV0YTogdGhpcy5vcHRpb25zLm1ldGEsXG4gICAgICBtdXRhdGlvbktleTogdGhpcy5vcHRpb25zLm11dGF0aW9uS2V5XG4gICAgfTtcbiAgICB0aGlzLiNyZXRyeWVyID0gY3JlYXRlUmV0cnllcih7XG4gICAgICBmbjogKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5tdXRhdGlvbkZuKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIG11dGF0aW9uRm4gZm91bmRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubXV0YXRpb25Gbih2YXJpYWJsZXMsIG11dGF0aW9uRm5Db250ZXh0KTtcbiAgICAgIH0sXG4gICAgICBvbkZhaWw6IChmYWlsdXJlQ291bnQsIGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuI2Rpc3BhdGNoKHsgdHlwZTogXCJmYWlsZWRcIiwgZmFpbHVyZUNvdW50LCBlcnJvciB9KTtcbiAgICAgIH0sXG4gICAgICBvblBhdXNlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuI2Rpc3BhdGNoKHsgdHlwZTogXCJwYXVzZVwiIH0pO1xuICAgICAgfSxcbiAgICAgIG9uQ29udGludWUsXG4gICAgICByZXRyeTogdGhpcy5vcHRpb25zLnJldHJ5ID8/IDAsXG4gICAgICByZXRyeURlbGF5OiB0aGlzLm9wdGlvbnMucmV0cnlEZWxheSxcbiAgICAgIG5ldHdvcmtNb2RlOiB0aGlzLm9wdGlvbnMubmV0d29ya01vZGUsXG4gICAgICBjYW5SdW46ICgpID0+IHRoaXMuI211dGF0aW9uQ2FjaGUuY2FuUnVuKHRoaXMpXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZWQgPSB0aGlzLnN0YXRlLnN0YXR1cyA9PT0gXCJwZW5kaW5nXCI7XG4gICAgY29uc3QgaXNQYXVzZWQgPSAhdGhpcy4jcmV0cnllci5jYW5TdGFydCgpO1xuICAgIHRyeSB7XG4gICAgICBpZiAocmVzdG9yZWQpIHtcbiAgICAgICAgb25Db250aW51ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jZGlzcGF0Y2goeyB0eXBlOiBcInBlbmRpbmdcIiwgdmFyaWFibGVzLCBpc1BhdXNlZCB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy4jbXV0YXRpb25DYWNoZS5jb25maWcub25NdXRhdGU/LihcbiAgICAgICAgICB2Y
25114XJpYWJsZXMsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBtdXRhdGlvbkZuQ29udGV4dFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5vcHRpb25zLm9uTXV0YXRlPy4oXG4gICAgICAgICAgdmFyaWFibGVzLFxuICAgICAgICAgIG11dGF0aW9uRm5Db250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGlmIChjb250ZXh0ICE9PSB0aGlzLnN0YXRlLmNvbnRleHQpIHtcbiAgICAgICAgICB0aGlzLiNkaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiBcInBlbmRpbmdcIixcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICB2YXJpYWJsZXMsXG4gICAgICAgICAgICBpc1BhdXNlZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy4jcmV0cnllci5zdGFydCgpO1xuICAgICAgYXdhaXQgdGhpcy4jbXV0YXRpb25DYWNoZS5jb25maWcub25TdWNjZXNzPy4oXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHZhcmlhYmxlcyxcbiAgICAgICAgdGhpcy5zdGF0ZS5jb250ZXh0LFxuICAgICAgICB0aGlzLFxuICAgICAgICBtdXRhdGlvbkZuQ29udGV4dFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5vblN1Y2Nlc3M/LihcbiAgICAgICAgZGF0YSxcbiAgICAgICAgdmFyaWFibGVzLFxuICAgICAgICB0aGlzLnN0YXRlLmNvbnRleHQsXG4gICAgICAgIG11dGF0aW9uRm5Db250ZXh0XG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy4jbXV0YXRpb25DYWNoZS5jb25maWcub25TZXR0bGVkPy4oXG4gICAgICAgIGRhdGEsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuc3RhdGUudmFyaWFibGVzLFxuICAgICAgICB0aGlzLnN0YXRlLmNvbnRleHQsXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG11dGF0aW9uRm5Db250ZXh0XG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLm9uU2V0dGxlZD8uKFxuICAgICAgICBkYXRhLFxuICAgICAgICBudWxsLFxuICAgICAgICB2Y
25114XJpYWJsZXMsXG4gICAgICAgIHRoaXMuc3RhdGUuY29udGV4dCxcbiAgICAgICAgbXV0YXRpb25GbkNvbnRleHRcbiAgICAgICk7XG4gICAgICB0aGlzLiNkaXNwYXRjaCh7IHR5cGU6IFwic3VjY2Vzc1wiLCBkYXRhIH0pO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI211dGF0aW9uQ2FjaGUuY29uZmlnLm9uRXJyb3I/LihcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICB2YXJpYWJsZXMsXG4gICAgICAgICAgdGhpcy5zdGF0ZS5jb250ZXh0LFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgbXV0YXRpb25GbkNvbnRleHRcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLm9uRXJyb3I/LihcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICB2YXJpYWJsZXMsXG4gICAgICAgICAgdGhpcy5zdGF0ZS5jb250ZXh0LFxuICAgICAgICAgIG11dGF0aW9uRm5Db250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuI211dGF0aW9uQ2FjaGUuY29uZmlnLm9uU2V0dGxlZD8uKFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICB0aGlzLnN0YXRlLnZhcmlhYmxlcyxcbiAgICAgICAgICB0aGlzLnN0YXRlLmNvbnRleHQsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBtdXRhdGlvbkZuQ29udGV4dFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLm9wdGlvbnMub25TZXR0bGVkPy4oXG4gICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIHZhcmlhYmxlcyxcbiAgICAgICAgICB0aGlzLnN0YXRlLmNvbnRleHQsXG4gICAgICAgICAgbXV0YXRpb25GbkNvbnRleHRcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLiNkaXNwYXRjaCh7IHR5cGU6IFwiZXJyb3JcIiwgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuI211dGF0aW9uQ2FjaGUucnVuTmV4dCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgI2Rpc3BhdGNoKGFjdGlvbikge1xuICAgIGNvbnN0IHJlZHVjZXIgPSAoc3RhdGUpID0+IHtcbiAgICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGZhaWx1cmVDb3VudDogYWN0aW9uLmZhaWx1cmVDb3VudCxcbiAgICAgICAgICAgIGZhaWx1cmVSZWFzb246IGFjdGlvbi5lcnJvclxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJwYXVzZVwiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGlzUGF1c2VkOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBcImNvbnRpbnVlXCI6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgaXNQYXVzZWQ6IGZhbHNlXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBcInBlbmRpbmdcIjpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBjb250ZXh0OiBhY3Rpb24uY29udGV4dCxcbiAgICAgICAgICAgIGRhdGE6IHZvaWQgMCxcbiAgICAgICAgICAgIGZhaWx1cmVDb3VudDogMCxcbiAgICAgICAgICAgIGZhaWx1cmVSZWFzb246IG51bGwsXG4gICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgIGlzUGF1c2VkOiBhY3Rpb24uaXNQYXVzZWQsXG4gICAgICAgICAgICBzdGF0dXM6IFwicGVuZGluZ1wiLFxuICAgICAgICAgICAgdmFyaWFibGVzOiBhY3Rpb24udmFyaWFibGVzLFxuICAgICAgICAgICAgc3VibWl0dGVkQXQ6IERhdGUubm93KClcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIFwic3VjY2Vzc1wiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGRhdGE6IGFjdGlvbi5kYXRhLFxuICAgICAgICAgICAgZmFpbHVyZUNvdW50OiAwLFxuICAgICAgICAgICAgZmFpbHVyZVJlYXNvbjogbnVsbCxcbiAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgc3RhdHVzOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgIGlzUGF1c2VkOiBmYWxzZVxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGRhdGE6IHZvaWQgMCxcbiAgICAgICAgICAgIGVycm9yOiBhY3Rpb24uZXJyb3IsXG4gICAgICAgICAgICBmYWlsdXJlQ291bnQ6IHN0YXRlLmZhaWx1cmVDb3VudCArIDEsXG4gICAgICAgICAgICBmYWlsdXJlUmVhc29uOiBhY3Rpb24uZXJyb3IsXG4gICAgICAgICAgICBpc1BhdXNlZDogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIlxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnN0YXRlID0gcmVkdWNlcih0aGlzLnN0YXRlKTtcbiAgICBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMuI29ic2VydmVycy5mb3JFYWNoKChvYnNlcnZlcikgPT4ge1xuICAgICAgICBvYnNlcnZlci5vbk11dGF0aW9uVXBkYXRlKGFjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuI211dGF0aW9uQ2FjaGUubm90aWZ5KHtcbiAgICAgICAgbXV0YXRpb246IHRoaXMsXG4gICAgICAgIHR5cGU6IFwidXBkYXRlZFwiLFxuICAgICAgICBhY3Rpb25cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFN0YXRl
25114KCkge1xuICByZXR1cm4ge1xuICAgIGNvbnRleHQ6IHZvaWQgMCxcbiAgICBkYXRhOiB2b2lkIDAsXG4gICAgZXJyb3I6IG51bGwsXG4gICAgZmFpbHVyZUNvdW50OiAwLFxuICAgIGZhaWx1cmVSZWFzb246IG51bGwsXG4gICAgaXNQYXVzZWQ6IGZhbHNlLFxuICAgIHN0YXR1czogXCJpZGxlXCIsXG4gICAgdmFyaWFibGVzOiB2b2lkIDAsXG4gICAgc3VibWl0dGVkQXQ6IDBcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIE11dGF0aW9uLFxuICBnZXREZWZhdWx0U3RhdGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdXRhdGlvbi5qcy5tYXAiLCIvLyBzcmMvbXV0YXRpb25DYWNoZS50c1xuaW1wb3J0IHsgbm90aWZ5TWFuYWdlciB9IGZyb20gXCIuL25vdGlmeU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IE11dGF0aW9uIH0gZnJvbSBcIi4vbXV0YXRpb24uanNcIjtcbmltcG9ydCB7IG1hdGNoTXV0YXRpb24sIG5vb3AgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU3Vic2NyaWJhYmxlIH0gZnJvbSBcIi4vc3Vic2NyaWJhYmxlLmpzXCI7XG52YXIgTXV0YXRpb25DYWNoZSA9IGNsYXNzIGV4dGVuZHMgU3Vic2NyaWJhYmxlIHtcbiAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuI211dGF0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgdGhpcy4jc2NvcGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB0aGlzLiNtdXRhdGlvbklkID0gMDtcbiAgfVxuICAjbXV0YXRpb25zO1xuICAjc2NvcGVzO1xuICAjbXV0YXRpb25JZDtcbiAgYnVpbGQoY2xpZW50LCBvcHRpb25zLCBzdGF0ZSkge1xuICAgIGNvbnN0IG11dGF0aW9uID0gbmV3IE11dGF0aW9uKHtcbiAgICAgIGNsaWVudCxcbiAgICAgIG11dGF0aW9uQ2FjaGU6IHRoaXMsXG4gICAgICBtdXRhdGlvbklkOiArK3RoaXMuI211dGF0aW9uSWQsXG4gICAgICBvcHRpb25zOiBjbGllbnQuZGVmYXVsdE11dGF0aW9uT3B0aW9ucyhvcHRpb25zKSxcbiAgICAgIHN0YXRlXG4gICAgfSk7XG4gICAgdGhpcy5hZGQobXV0YXRpb24pO1xuICAgIHJldHVybiBtdXRhdGlvbjtcbiAgfVxuICBhZGQobXV0YXRpb24pIHtcbiAgICB0aGlzLiNtdXRhdGlvbnMuYWRkKG11dGF0aW9uKTtcbiAgICBjb25zdCBzY29wZSA9IHNjb3BlRm9yKG11dGF0aW9uKTtcbiAgICBpZiAodHlwZW9mIHNjb3BlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBzY29wZWRNdXRhdGlvbnMgPSB0aGlzLiNzY29wZXMuZ2V0KHNjb3BlKTtcbiAgICAgIGlmIChzY29wZWRNdXRhdGlvbnMpIHtcbiAgICAgICAgc2NvcGVkTXV0YXRpb25zLnB1c2gobXV0YXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jc2NvcGVzLnNldChzY29wZSwgW211dGF0aW9uXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubm90aWZ5KHsgdHlwZTogXCJhZGRlZFwiLCBtdXRhdGlvbiB9KTtcbiAgfVxuICByZW1vdmUobXV0YXRpb24pIHtcbiAgICBpZiAodGhpcy4jbXV0YXRpb25zLmRlbGV0ZShtdXRhdGlvbikpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gc2NvcGVGb3IobXV0YXRpb24pO1xuICAgICAgaWYgKHR5cGVvZiBzY29wZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBzY29wZWRNdXRhdGlvbnMgPSB0aGlzLiNzY29wZXMuZ2V0KHNjb3BlKTtcbiAgICAgICAgaWYgKHNjb3BlZE11dGF0aW9ucykge1xuICAgICAgICAgIGlmIChzY29wZWRNdXRhdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzY29wZWRNdXRhdGlvbnMuaW5kZXhPZihtdXRhdGlvbik7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIHNjb3BlZE11dGF0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc2NvcGVkTXV0YXRpb25zWzBdID09PSBtdXRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy4jc2NvcGVzLmRlbGV0ZShzY29wZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubm90aWZ5KHsgdHlwZTogXCJyZW1vdmVkXCIsIG11dGF0aW9uIH0pO1xuICB9XG4gIGNhblJ1bihtdXRhdGlvbikge1xuICAgIGNvbnN0IHNjb3BlID0gc2NvcGVGb3IobXV0YXRpb24pO1xuICAgIGlmICh0eXBlb2Ygc2NvcGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IG11dGF0aW9uc1dpdGhTYW1lU2NvcGUgPSB0aGlzLiNzY29wZXMuZ2V0KHNjb3BlKTtcbiAgICAgIGNvbnN0IGZpcnN0UGVuZGluZ011dGF0aW9uID0gbXV0YXRpb25zV2l0aFNhbWVTY29wZT8uZmluZChcbiAgICAgICAgKG0pID0+IG0uc3RhdGUuc3RhdHVzID09PSBcInBlbmRpbmdcIlxuICAgICAgKTtcbiAgICAgIHJldHVybiAhZmlyc3RQZW5kaW5nTXV0YXRpb24gfHwgZmlyc3RQZW5kaW5nTXV0YXRpb24gPT09IG11dGF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcnVuTmV4dChtdXRhdGlvbikge1xuICAgIGNvbnN0IHNjb3BlID0gc2NvcGVGb3IobXV0YXRpb24pO1xuICAgIGlmICh0eXBlb2Ygc2NvcGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGZvdW5kTXV0YXRpb24gPSB0aGlzLiNzY29wZXMuZ2V0KHNjb3BlKT8uZmluZCgobSkgPT4gbSAhPT0gbXV0YXRpb24gJiYgbS5zdGF0ZS5pc1BhdXNlZCk7XG4gICAgICByZXR1cm4gZm91bmRNdXRhdGlvbj8uY29udGludWUoKSA/PyBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgfVxuICBjbGVhcigpIHtcbiAgICBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMuI211dGF0aW9ucy5mb3JFYWNoKChtdXRhdGlvbikgPT4ge1xuICAgICAgICB0aGlzLm5vdGlmeSh7IHR5cGU6IFwicmVtb3ZlZFwiLCBtdXRhdGlvbiB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy4jbXV0YXRpb25zLmNsZWFyKCk7XG4gICAgICB0aGlzLiNzY29wZXMuY2xlYXIoKTtcbiAgICB9KTtcbiAgfVxuICBnZXRBbGwoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy4jbXV0YXRpb25zKTtcbiAgfVxuICBmaW5kKGZpbHRlcnMpIHtcbiAgICBjb25zdCBkZWZhdWx0ZWRGaWx0ZXJzID0geyBleGFjdDogdHJ1ZSwgLi4uZmlsdGVycyB9O1xuICAgIHJldHVybi
25114B0aGlzLmdldEFsbCgpLmZpbmQoXG4gICAgICAobXV0YXRpb24pID0+IG1hdGNoTXV0YXRpb24oZGVmYXVsdGVkRmlsdGVycywgbXV0YXRpb24pXG4gICAgKTtcbiAgfVxuICBmaW5kQWxsKGZpbHRlcnMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmdldEFsbCgpLmZpbHRlcigobXV0YXRpb24pID0+IG1hdGNoTXV0YXRpb24oZmlsdGVycywgbXV0YXRpb24pKTtcbiAgfVxuICBub3RpZnkoZXZlbnQpIHtcbiAgICBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHJlc3VtZVBhdXNlZE11dGF0aW9ucygpIHtcbiAgICBjb25zdCBwYXVzZWRNdXRhdGlvbnMgPSB0aGlzLmdldEFsbCgpLmZpbHRlcigoeCkgPT4geC5zdGF0ZS5pc1BhdXNlZCk7XG4gICAgcmV0dXJuIG5vdGlmeU1hbmFnZXIuYmF0Y2goXG4gICAgICAoKSA9PiBQcm9taXNlLmFsbChcbiAgICAgICAgcGF1c2VkTXV0YXRpb25zLm1hcCgobXV0YXRpb24pID0+IG11dGF0aW9uLmNvbnRpbnVlKCkuY2F0Y2gobm9vcCkpXG4gICAgICApXG4gICAgKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNjb3BlRm9yKG11dGF0aW9uKSB7XG4gIHJldHVybiBtdXRhdGlvbi5vcHRpb25zLnNjb3BlPy5pZDtcbn1cbmV4cG9ydCB7XG4gIE11dGF0aW9uQ2FjaGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdXRhdGlvbkNhY2hlLmpzLm1hcCIsIi8vIHNyYy9xdWVyeUNhY2hlLnRzXG5pbXBvcnQgeyBoYXNoUXVlcnlLZXlCeU9wdGlvbnMsIG1hdGNoUXVlcnkgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiLi9xdWVyeS5qc1wiO1xuaW1wb3J0IHsgbm90aWZ5TWFuYWdlciB9IGZyb20gXCIuL25vdGlmeU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IFN1YnNjcmliYWJsZSB9IGZyb20gXCIuL3N1YnNjcmliYWJsZS5qc1wiO1xudmFyIFF1ZXJ5Q2FjaGUgPSBjbGFzcyBleHRlbmRzIFN1YnNjcmliYWJsZSB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLiNxdWVyaWVzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgfVxuICAjcXVlcmllcztcbiAgYnVpbGQoY2xpZW50LCBvcHRpb25zLCBzdGF0ZSkge1xuICAgIGNvbnN0IHF1ZXJ5S2V5ID0gb3B0aW9ucy5xdWVyeUtleTtcbiAgICBjb25zdCBxdWVyeUhhc2ggPSBvcHRpb25zLnF1ZXJ5SGFzaCA/PyBoYXNoUXVlcnlLZXlCeU9wdGlvbnMocXVlcnlLZXksIG9wdGlvbnMpO1xuICAgIGxldCBxdWVyeSA9IHRoaXMuZ2V0KHF1ZXJ5SGFzaCk7XG4gICAgaWYgKCFxdWVyeSkge1xuICAgICAgcXVlcnkgPSBuZXcgUXVlcnkoe1xuICAgICAgICBjbGllbnQsXG4gICAgICAgIHF1ZXJ5S2V5LFxuICAgICAgICBxdWVyeUhhc2gsXG4gICAgICAgIG9wdGlvbnM6IGNsaWVudC5kZWZhdWx0UXVlcnlPcHRpb25zKG9wdGlvbnMpLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgZGVmYXVsdE9wdGlvbnM6IGNsaWVudC5nZXRRdWVyeURlZmF1bHRzKHF1ZXJ5S2V5KVxuICAgICAgfSk7XG4gICAgICB0aGlzLmFkZChxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuICBhZGQocXVlcnkpIHtcbiAgICBpZiAoIXRoaXMuI3F1ZXJpZXMuaGFzKHF1ZXJ5LnF1ZXJ5SGFzaCkpIHtcbiAgICAgIHRoaXMuI3F1ZXJpZXMuc2V0KHF1ZXJ5LnF1ZXJ5SGFzaCwgcXVlcnkpO1xuICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICB0eXBlOiBcImFkZGVkXCIsXG4gICAgICAgIHF1ZXJ5XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlKHF1ZXJ5KSB7XG4gICAgY29uc3QgcXVlcnlJbk1hcCA9IHRoaXMuI3F1ZXJpZXMuZ2V0KHF1ZXJ5LnF1ZXJ5SGFzaCk7XG4gICAgaWYgKHF1ZXJ5SW5NYXApIHtcbiAgICAgIHF1ZXJ5LmRlc3Ryb3koKTtcbiAgICAgIGlmIChxdWVyeUluTWFwID09PSBxdWVyeSkge1xuICAgICAgICB0aGlzLiNxdWVyaWVzLmRlbGV0ZShxdWVyeS5xdWVyeUhhc2gpO1xuICAgICAgfVxuICAgICAgdGhpcy5ub3RpZnkoeyB0eXBlOiBcInJlbW92ZWRcIiwgcXVlcnkgfSk7XG4gICAgfVxuICB9XG4gIGNsZWFyKCkge1xuICAgIG5vdGlmeU1hbmFnZXIuYmF0Y2goKCkgPT4ge1xuICAgICAgdGhpcy5nZXRBbGwoKS5mb3JFYWNoKChxdWVyeSkgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZShxdWVyeSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBnZXQocXVlcnlIYXNoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3F1ZXJpZXMuZ2V0KHF1ZXJ5SGFzaCk7XG4gIH1cbiAgZ2V0QWxsKCkge1xuICAgIHJldHVybiBbLi4udGhpcy4jcXVlcmllcy52YWx1ZXMoKV07XG4gIH1cbiAgZmluZChmaWx0ZXJzKSB7XG4gICAgY29uc3QgZGVmYXVsdGVkRmlsdGVycyA9IHsgZXhhY3Q6IHRydWUsIC4uLmZpbHRlcnMgfTtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGwoKS5maW5kKFxuICAgICAgKHF1ZXJ5KSA9PiBtYXRjaFF1ZXJ5KGRlZmF1bHRlZEZpbHRlcnMsIHF1ZXJ5KVxuICAgICk7XG4gIH1cbiAgZmluZEFsbChmaWx0ZXJzID0ge30pIHtcbiAgICBjb25zdCBxdWVyaWVzID0gdGhpcy5nZXRBbGwoKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZmlsdGVycykubGVuZ3RoID4gMCA/IHF1ZXJpZXMuZmlsdGVyKChxdWVyeSkgPT4gbWF0Y2hRdWVyeShmaWx0ZXJzLCBxdWVyeSkpIDogcXVlcmllcztcbiAgfVxuICBub3RpZnkoZXZlbnQpIHtcbiAgICBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIG9uRm9jdXMoKSB7XG4gICAgbm90aWZ5TWFuYWdlci5iYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLmdldEFsbCgpLmZvckVhY2goKHF1ZXJ5KSA9PiB7XG4gICAgICAgIHF1ZXJ5Lm9uRm9jdXMoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIG9uT25saW5lKCkge1xuICAgIG5vdGlmeU1hbmFnZXIuYmF0Y2goKCkgPT4ge1xuICAgICAgdGhpcy5nZXRBbGwoKS5mb3JFYWNoKChxdWVyeSkgPT4ge1xuICAgICAgICBxdWVyeS5vbk9ubGluZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn07XG5leHBvcnQge1xuICBRdWVyeUNhY2hlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnlDYWNoZS5qcy5tYXAiLCIvLyBzcmMvcXVlcnlDbGllbnQudHNcbmltcG9ydCB7XG4gIGZ1bmN0aW9uYWxVcGRhdGUsXG4gIGhhc2hL
25114ZXksXG4gIGhhc2hRdWVyeUtleUJ5T3B0aW9ucyxcbiAgbm9vcCxcbiAgcGFydGlhbE1hdGNoS2V5LFxuICByZXNvbHZlU3RhbGVUaW1lLFxuICBza2lwVG9rZW5cbn0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUgfSBmcm9tIFwiLi9xdWVyeUNhY2hlLmpzXCI7XG5pbXBvcnQgeyBNdXRhdGlvbkNhY2hlIH0gZnJvbSBcIi4vbXV0YXRpb25DYWNoZS5qc1wiO1xuaW1wb3J0IHsgZm9jdXNNYW5hZ2VyIH0gZnJvbSBcIi4vZm9jdXNNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBvbmxpbmVNYW5hZ2VyIH0gZnJvbSBcIi4vb25saW5lTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgbm90aWZ5TWFuYWdlciB9IGZyb20gXCIuL25vdGlmeU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IGluZmluaXRlUXVlcnlCZWhhdmlvciB9IGZyb20gXCIuL2luZmluaXRlUXVlcnlCZWhhdmlvci5qc1wiO1xudmFyIFF1ZXJ5Q2xpZW50ID0gY2xhc3Mge1xuICAjcXVlcnlDYWNoZTtcbiAgI211dGF0aW9uQ2FjaGU7XG4gICNkZWZhdWx0T3B0aW9ucztcbiAgI3F1ZXJ5RGVmYXVsdHM7XG4gICNtdXRhdGlvbkRlZmF1bHRzO1xuICAjbW91bnRDb3VudDtcbiAgI3Vuc3Vic2NyaWJlRm9jdXM7XG4gICN1bnN1YnNjcmliZU9ubGluZTtcbiAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICB0aGlzLiNxdWVyeUNhY2hlID0gY29uZmlnLnF1ZXJ5Q2FjaGUgfHwgbmV3IFF1ZXJ5Q2FjaGUoKTtcbiAgICB0aGlzLiNtdXRhdGlvbkNhY2hlID0gY29uZmlnLm11dGF0aW9uQ2FjaGUgfHwgbmV3IE11dGF0aW9uQ2FjaGUoKTtcbiAgICB0aGlzLiNkZWZhdWx0T3B0aW9ucyA9IGNvbmZpZy5kZWZhdWx0T3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLiNxdWVyeURlZmF1bHRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB0aGlzLiNtdXRhdGlvbkRlZmF1bHRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB0aGlzLiNtb3VudENvdW50ID0gMDtcbiAgfVxuICBtb3VudCgpIHtcbiAgICB0aGlzLiNtb3VudENvdW50Kys7XG4gICAgaWYgKHRoaXMuI21vdW50Q291bnQgIT09IDEpIHJldHVybjtcbiAgICB0aGlzLiN1bnN1YnNjcmliZUZvY3VzID0gZm9jdXNNYW5hZ2VyLnN1YnNjcmliZShhc3luYyAoZm9jdXNlZCkgPT4ge1xuICAgICAgaWYgKGZvY3VzZWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWVQYXVzZWRNdXRhdGlvbnMoKTtcbiAgICAgICAgdGhpcy4jcXVlcnlDYWNoZS5vbkZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy4jdW5zdWJzY3JpYmVPbmxpbmUgPSBvbmxpbmVNYW5hZ2VyLnN1YnNjcmliZShhc3luYyAob25saW5lKSA9PiB7XG4gICAgICBpZiAob25saW5lKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lUGF1c2VkTXV0YXRpb25zKCk7XG4gICAgICAgIHRoaXMuI3F1ZXJ5Q2FjaGUub25PbmxpbmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICB1bm1vdW50KCkge1xuICAgIHRoaXMuI21vdW50Q291bnQtLTtcbiAgICBpZiAodGhpcy4jbW91bnRDb3VudCAhPT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuI3Vuc3Vic2NyaWJlRm9jdXM/LigpO1xuICAgIHRoaXMuI3Vuc3Vic2NyaWJlRm9jdXMgPSB2b2lkIDA7XG4gICAgdGhpcy4jdW5zdWJzY3JpYmVPbmxpbmU/LigpO1xuICAgIHRoaXMuI3Vuc3Vic2NyaWJlT25saW5lID0gdm9pZCAwO1xuICB9XG4gIGlzRmV0Y2hpbmcoZmlsdGVycykge1xuICAgIHJldHVybiB0aGlzLiNxdWVyeUNhY2hlLmZpbmRBbGwoeyAuLi5maWx0ZXJzLCBmZXRjaFN0YXR1czogXCJmZXRjaGluZ1wiIH0pLmxlbmd0aDtcbiAgfVxuICBpc011dGF0aW5nKGZpbHRlcnMpIHtcbiAgICByZXR1cm4gdGhpcy4jbXV0YXRpb25DYWNoZS5maW5kQWxsKHsgLi4uZmlsdGVycywgc3RhdHVzOiBcInBlbmRpbmdcIiB9KS5sZW5ndGg7XG4gIH1cbiAgLyoqXG4gICAqIEltcGVyYXRpdmUgKG5vbi1yZWFjdGl2ZSkgd2F5IHRvIHJldHJpZXZlIGRhdGEgZm9yIGEgUXVlcnlLZXkuXG4gICAqIFNob3VsZCBvbmx5IGJlIHVzZWQgaW4gY2FsbGJhY2tzIG9yIGZ1bmN0aW9ucyB3aGVyZSByZWFkaW5nIHRoZSBsYXRlc3QgZGF0YSBpcyBuZWNlc3NhcnksIGUuZy4gZm9yIG9wdGltaXN0aWMgdXBkYXRlcy5cbiAgICpcbiAgICogSGludDogRG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uIGluc2lkZSBhIGNvbXBvbmVudCwgYmVjYXVzZSBpdCB3b24ndCByZWNlaXZlIHVwZGF0ZXMuXG4gICAqIFVzZSBgdXNlUXVlcnlgIHRvIGNyZWF0ZSBhIGBRdWVyeU9ic2VydmVyYCB0aGF0IHN1YnNjcmliZXMgdG8gY2hhbmdlcy5cbiAgICovXG4gIGdldFF1ZXJ5RGF0YShxdWVyeUtleSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmRlZmF1bHRRdWVyeU9wdGlvbnMoeyBxdWVyeUtleSB9KTtcbiAgICByZXR1cm4gdGhpcy4jcXVlcnlDYWNoZS5nZXQob3B0aW9ucy5xdWVyeUhhc2gpPy5zdGF0ZS5kYXRhO1xuICB9XG4gIGVuc3VyZVF1ZXJ5RGF0YShvcHRpb25zKSB7XG4gICAgY29uc3QgZGVmYXVsdGVkT3B0aW9ucyA9IHRoaXMuZGVmYXVsdFF1ZXJ5T3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuI3F1ZXJ5Q2FjaGUuYnVpbGQodGhpcywgZGVmYXVsdGVkT3B0aW9ucyk7XG4gICAgY29uc3QgY2FjaGVkRGF0YSA9IHF1ZXJ5LnN0YXRlLmRhdGE7XG4gICAgaWYgKGNhY2hlZERhdGEgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hRdWVyeShvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucmV2YWxpZGF0ZUlmU3RhbGUgJiYgcXVlcnkuaXNTdGFsZUJ5VGltZShyZXNvbHZlU3RhbGVUaW
251141lKGRlZmF1bHRlZE9wdGlvbnMuc3RhbGVUaW1lLCBxdWVyeSkpKSB7XG4gICAgICB2b2lkIHRoaXMucHJlZmV0Y2hRdWVyeShkZWZhdWx0ZWRPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjYWNoZWREYXRhKTtcbiAgfVxuICBnZXRRdWVyaWVzRGF0YShmaWx0ZXJzKSB7XG4gICAgcmV0dXJuIHRoaXMuI3F1ZXJ5Q2FjaGUuZmluZEFsbChmaWx0ZXJzKS5tYXAoKHsgcXVlcnlLZXksIHN0YXRlIH0pID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBzdGF0ZS5kYXRhO1xuICAgICAgcmV0dXJuIFtxdWVyeUtleSwgZGF0YV07XG4gICAgfSk7XG4gIH1cbiAgc2V0UXVlcnlEYXRhKHF1ZXJ5S2V5LCB1cGRhdGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGVmYXVsdGVkT3B0aW9ucyA9IHRoaXMuZGVmYXVsdFF1ZXJ5T3B0aW9ucyh7IHF1ZXJ5S2V5IH0pO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy4jcXVlcnlDYWNoZS5nZXQoXG4gICAgICBkZWZhdWx0ZWRPcHRpb25zLnF1ZXJ5SGFzaFxuICAgICk7XG4gICAgY29uc3QgcHJldkRhdGEgPSBxdWVyeT8uc3RhdGUuZGF0YTtcbiAgICBjb25zdCBkYXRhID0gZnVuY3Rpb25hbFVwZGF0ZSh1cGRhdGVyLCBwcmV2RGF0YSk7XG4gICAgaWYgKGRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI3F1ZXJ5Q2FjaGUuYnVpbGQodGhpcywgZGVmYXVsdGVkT3B0aW9ucykuc2V0RGF0YShkYXRhLCB7IC4uLm9wdGlvbnMsIG1hbnVhbDogdHJ1ZSB9KTtcbiAgfVxuICBzZXRRdWVyaWVzRGF0YShmaWx0ZXJzLCB1cGRhdGVyLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5vdGlmeU1hbmFnZXIuYmF0Y2goXG4gICAgICAoKSA9PiB0aGlzLiNxdWVyeUNhY2hlLmZpbmRBbGwoZmlsdGVycykubWFwKCh7IHF1ZXJ5S2V5IH0pID0+IFtcbiAgICAgICAgcXVlcnlLZXksXG4gICAgICAgIHRoaXMuc2V0UXVlcnlEYXRhKHF1ZXJ5S2V5LCB1cGRhdGVyLCBvcHRpb25zKVxuICAgICAgXSlcbiAgICApO1xuICB9XG4gIGdldFF1ZXJ5U3RhdGUocXVlcnlLZXkpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5kZWZhdWx0UXVlcnlPcHRpb25zKHsgcXVlcnlLZXkgfSk7XG4gICAgcmV0dXJuIHRoaXMuI3F1ZXJ5Q2FjaGUuZ2V0KFxuICAgICAgb3B0aW9ucy5xdWVyeUhhc2hcbiAgICApPy5zdGF0ZTtcbiAgfVxuICByZW1vdmVRdWVyaWVzKGZpbHRlcnMpIHtcbiAgICBjb25zdCBxdWVyeUNhY2hlID0gdGhpcy4jcXVlcnlDYWNoZTtcbiAgICBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHF1ZXJ5Q2FjaGUuZmluZEFsbChmaWx0ZXJzKS5mb3JFYWNoKChxdWVyeSkgPT4ge1xuICAgICAgICBxdWVyeUNhY2hlLnJlbW92ZShxdWVyeSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXNldFF1ZXJpZXMoZmlsdGVycywgb3B0aW9ucykge1xuICAgIGNvbnN0IHF1ZXJ5Q2FjaGUgPSB0aGlzLiNxdWVyeUNhY2hlO1xuICAgIHJldHVybiBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHF1ZXJ5Q2FjaGUuZmluZEFsbChmaWx0ZXJzKS5mb3JFYWNoKChxdWVyeSkgPT4ge1xuICAgICAgICBxdWVyeS5yZXNldCgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5yZWZldGNoUXVlcmllcyhcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiYWN0aXZlXCIsXG4gICAgICAgICAgLi4uZmlsdGVyc1xuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIGNhbmNlbFF1ZXJpZXMoZmlsdGVycywgY2FuY2VsT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgZGVmYXVsdGVkQ2FuY2VsT3B0aW9ucyA9IHsgcmV2ZXJ0OiB0cnVlLCAuLi5jYW5jZWxPcHRpb25zIH07XG4gICAgY29uc3QgcHJvbWlzZXMgPSBub3RpZnlNYW5hZ2VyLmJhdGNoKFxuICAgICAgKCkgPT4gdGhpcy4jcXVlcnlDYWNoZS5maW5kQWxsKGZpbHRlcnMpLm1hcCgocXVlcnkpID0+IHF1ZXJ5LmNhbmNlbChkZWZhdWx0ZWRDYW5jZWxPcHRpb25zKSlcbiAgICApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihub29wKS5jYXRjaChub29wKTtcbiAgfVxuICBpbnZhbGlkYXRlUXVlcmllcyhmaWx0ZXJzLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbm90aWZ5TWFuYWdlci5iYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLiNxdWVyeUNhY2hlLmZpbmRBbGwoZmlsdGVycykuZm9yRWFjaCgocXVlcnkpID0+IHtcbiAgICAgICAgcXVlcnkuaW52YWxpZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmlsdGVycz8ucmVmZXRjaFR5cGUgPT09IFwibm9uZVwiKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlZmV0Y2hRdWVyaWVzKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uZmlsdGVycyxcbiAgICAgICAgICB0eXBlOiBmaWx0ZXJzPy5yZWZldGNoVHlwZSA/PyBmaWx0ZXJzPy50eXBlID8/IFwiYWN0aXZlXCJcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICByZWZldGNoUXVlcmllcyhmaWx0ZXJzLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgY2FuY2VsUmVmZXRjaDogb3B0aW9ucy5jYW5jZWxSZWZldGNoID8/IHRydWVcbiAgICB9O1xuICAgIGNvbnN0IHByb21pc2VzID0gbm90aWZ5TWFuYWdlci5iYXRjaChcbiAgICAgICgpID0+IHRoaXMuI3F1ZXJ5Q2FjaGUuZmluZEFsbChmaWx0ZXJzKS5maWx0ZXIoKHF1ZXJ5KSA9PiAhcXVlcnkuaXNEaXNhYmxlZCgpICYmICFxdWVyeS5pc1N0YXRpYygpKS5tYXAoKHF1ZXJ5KSA9PiB7XG4gICAgICAgIGxldCBwcm9taXNlID0gcXVlcnkuZmV0Y2godm9pZCAwLCBmZXRjaE9wdGlvbnMpO1xuICAgICAgICBpZiAoIWZldGNoT3B0aW9ucy50aHJvd09uRXJyb3IpIHtcbiAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS5jYXRjaChub29wKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcXVlcnkuc3RhdGUuZmV0Y2hTdGF0dXMgPT09IFwicGF1c2VkXCIgPyBQcm9taXNlLnJlc29sdmUoKSA6IHByb21pc2U7XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKG5vb3ApO1xuICB9XG4gIGZldGNoUXVlcnkob3B0aW9ucykge1xuICAgIGNvbnN0IGRlZmF1bHRlZE9wdGlvbnMgPSB0aGlzLmRlZmF1bHRRdWVyeU9
25114wdGlvbnMob3B0aW9ucyk7XG4gICAgaWYgKGRlZmF1bHRlZE9wdGlvbnMucmV0cnkgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdGVkT3B0aW9ucy5yZXRyeSA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuI3F1ZXJ5Q2FjaGUuYnVpbGQodGhpcywgZGVmYXVsdGVkT3B0aW9ucyk7XG4gICAgcmV0dXJuIHF1ZXJ5LmlzU3RhbGVCeVRpbWUoXG4gICAgICByZXNvbHZlU3RhbGVUaW1lKGRlZmF1bHRlZE9wdGlvbnMuc3RhbGVUaW1lLCBxdWVyeSlcbiAgICApID8gcXVlcnkuZmV0Y2goZGVmYXVsdGVkT3B0aW9ucykgOiBQcm9taXNlLnJlc29sdmUocXVlcnkuc3RhdGUuZGF0YSk7XG4gIH1cbiAgcHJlZmV0Y2hRdWVyeShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hRdWVyeShvcHRpb25zKS50aGVuKG5vb3ApLmNhdGNoKG5vb3ApO1xuICB9XG4gIGZldGNoSW5maW5pdGVRdWVyeShvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5iZWhhdmlvciA9IGluZmluaXRlUXVlcnlCZWhhdmlvcihvcHRpb25zLnBhZ2VzKTtcbiAgICByZXR1cm4gdGhpcy5mZXRjaFF1ZXJ5KG9wdGlvbnMpO1xuICB9XG4gIHByZWZldGNoSW5maW5pdGVRdWVyeShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hJbmZpbml0ZVF1ZXJ5KG9wdGlvbnMpLnRoZW4obm9vcCkuY2F0Y2gobm9vcCk7XG4gIH1cbiAgZW5zdXJlSW5maW5pdGVRdWVyeURhdGEob3B0aW9ucykge1xuICAgIG9wdGlvbnMuYmVoYXZpb3IgPSBpbmZpbml0ZVF1ZXJ5QmVoYXZpb3Iob3B0aW9ucy5wYWdlcyk7XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlUXVlcnlEYXRhKG9wdGlvbnMpO1xuICB9XG4gIHJlc3VtZVBhdXNlZE11dGF0aW9ucygpIHtcbiAgICBpZiAob25saW5lTWFuYWdlci5pc09ubGluZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy4jbXV0YXRpb25DYWNoZS5yZXN1bWVQYXVzZWRNdXRhdGlvbnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG4gIGdldFF1ZXJ5Q2FjaGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3F1ZXJ5Q2FjaGU7XG4gIH1cbiAgZ2V0TXV0YXRpb25DYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbXV0YXRpb25DYWNoZTtcbiAgfVxuICBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVmYXVsdE9wdGlvbnM7XG4gIH1cbiAgc2V0RGVmYXVsdE9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMuI2RlZmF1bHRPcHRpb25zID0gb3B0aW9ucztcbiAgfVxuICBzZXRRdWVyeURlZmF1bHRzKHF1ZXJ5S2V5LCBvcHRpb25zKSB7XG4gICAgdGhpcy4jcXVlcnlEZWZhdWx0cy5zZXQoaGFzaEtleShxdWVyeUtleSksIHtcbiAgICAgIHF1ZXJ5S2V5LFxuICAgICAgZGVmYXVsdE9wdGlvbnM6IG9wdGlvbnNcbiAgICB9KTtcbiAgfVxuICBnZXRRdWVyeURlZmF1bHRzKHF1ZXJ5S2V5KSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBbLi4udGhpcy4jcXVlcnlEZWZhdWx0cy52YWx1ZXMoKV07XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZGVmYXVsdHMuZm9yRWFjaCgocXVlcnlEZWZhdWx0KSA9PiB7XG4gICAgICBpZiAocGFydGlhbE1hdGNoS2V5KHF1ZXJ5S2V5LCBxdWVyeURlZmF1bHQucXVlcnlLZXkpKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBxdWVyeURlZmF1bHQuZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc2V0TXV0YXRpb25EZWZhdWx0cyhtdXRhdGlvbktleSwgb3B0aW9ucykge1xuICAgIHRoaXMuI211dGF0aW9uRGVmYXVsdHMuc2V0KGhhc2hLZXkobXV0YXRpb25LZXkpLCB7XG4gICAgICBtdXRhdGlvbktleSxcbiAgICAgIGRlZmF1bHRPcHRpb25zOiBvcHRpb25zXG4gICAgfSk7XG4gIH1cbiAgZ2V0TXV0YXRpb25EZWZhdWx0cyhtdXRhdGlvbktleSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gWy4uLnRoaXMuI211dGF0aW9uRGVmYXVsdHMudmFsdWVzKCldO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGRlZmF1bHRzLmZvckVhY2goKHF1ZXJ5RGVmYXVsdCkgPT4ge1xuICAgICAgaWYgKHBhcnRpYWxNYXRjaEtleShtdXRhdGlvbktleSwgcXVlcnlEZWZhdWx0Lm11dGF0aW9uS2V5KSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgcXVlcnlEZWZhdWx0LmRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlZmF1bHRRdWVyeU9wdGlvbnMob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLl9kZWZhdWx0ZWQpIHtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0ZWRPcHRpb25zID0ge1xuICAgICAgLi4udGhpcy4jZGVmYXVsdE9wdGlvbnMucXVlcmllcyxcbiAgICAgIC4uLnRoaXMuZ2V0UXVlcnlEZWZhdWx0cyhvcHRpb25zLnF1ZXJ5S2V5KSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBfZGVmYXVsdGVkOiB0cnVlXG4gICAgfTtcbiAgICBpZiAoIWRlZmF1bHRlZE9wdGlvbnMucXVlcnlIYXNoKSB7XG4gICAgICBkZWZhdWx0ZWRPcHRpb25zLnF1ZXJ5SGFzaCA9IGhhc2hRdWVyeUtleUJ5T3B0aW9ucyhcbiAgICAgICAgZGVmYXVsdGVkT3B0aW9ucy5xdWVyeUtleSxcbiAgICAgICAgZGVmYXVsdGVkT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRlZmF1bHRlZE9wdGlvbnMucmVmZXRjaE9uUmVjb25uZWN0ID09PSB2b2lkIDApIHtcbiAgICAgIGRlZmF1bHRlZE9wdGlvbnMucmVmZXRjaE9uUmVjb25uZWN0ID0gZGVmYXVsdGVkT3B0aW9ucy5uZXR3b3JrTW9kZSAhPT0gXCJhbHdheXNcIjtcbiAgICB9XG4gICAgaWYgKGRlZmF1bHRlZE9wdGlvbnMudGhyb3dPbkVycm9yID09PSB2b2lkIDApIHtcbiAgICAgIGRlZmF1bHRlZE9wdGlvbnMudGhyb3dPbkVycm9yID0gISFkZWZhdWx0ZWRPcHRpb25zLnN1c3BlbnNlO1xuICAgIH1cbiAgICBpZiAoIWRlZmF1bHRlZE9wdGlvbnMubmV0d29ya01vZGUgJiYgZGVmYXVsdGVkT3B0aW9ucy5wZXJzaXN0ZXIpIHtcbiAgICAgIGRlZmF1bHRlZE9wdGlvbnMubmV0d29ya01vZGUgPSBcIm9mZmxpbmVGaXJzdFwiO1xuICAgIH1cbiAgICBpZiAoZGVmYXVsdGVkT3B0aW9ucy5xdWVyeUZuID09PSBza2lwVG9rZW4pIHtcbiAgICAgIGRlZmF1bHRlZE9wdGlvbnMuZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdGVkT3B0aW9ucztcbiAgfVxuICBkZWZhdWx0TXV0YXRpb25PcHRpb25zKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucz8uX2RlZmF1bHRlZCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIHJldHVybi
25114B7XG4gICAgICAuLi50aGlzLiNkZWZhdWx0T3B0aW9ucy5tdXRhdGlvbnMsXG4gICAgICAuLi5vcHRpb25zPy5tdXRhdGlvbktleSAmJiB0aGlzLmdldE11dGF0aW9uRGVmYXVsdHMob3B0aW9ucy5tdXRhdGlvbktleSksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgX2RlZmF1bHRlZDogdHJ1ZVxuICAgIH07XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy4jcXVlcnlDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuI211dGF0aW9uQ2FjaGUuY2xlYXIoKTtcbiAgfVxufTtcbmV4cG9ydCB7XG4gIFF1ZXJ5Q2xpZW50XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnlDbGllbnQuanMubWFwIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHNyYy9RdWVyeUNsaWVudFByb3ZpZGVyLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBRdWVyeUNsaWVudENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KFxuICB2b2lkIDBcbik7XG52YXIgdXNlUXVlcnlDbGllbnQgPSAocXVlcnlDbGllbnQpID0+IHtcbiAgY29uc3QgY2xpZW50ID0gUmVhY3QudXNlQ29udGV4dChRdWVyeUNsaWVudENvbnRleHQpO1xuICBpZiAocXVlcnlDbGllbnQpIHtcbiAgICByZXR1cm4gcXVlcnlDbGllbnQ7XG4gIH1cbiAgaWYgKCFjbGllbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBRdWVyeUNsaWVudCBzZXQsIHVzZSBRdWVyeUNsaWVudFByb3ZpZGVyIHRvIHNldCBvbmVcIik7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn07XG52YXIgUXVlcnlDbGllbnRQcm92aWRlciA9ICh7XG4gIGNsaWVudCxcbiAgY2hpbGRyZW5cbn0pID0+IHtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjbGllbnQubW91bnQoKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xpZW50LnVubW91bnQoKTtcbiAgICB9O1xuICB9LCBbY2xpZW50XSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFF1ZXJ5Q2xpZW50Q29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogY2xpZW50LCBjaGlsZHJlbiB9KTtcbn07XG5leHBvcnQge1xuICBRdWVyeUNsaWVudENvbnRleHQsXG4gIFF1ZXJ5Q2xpZW50UHJvdmlkZXIsXG4gIHVzZVF1ZXJ5Q2xpZW50XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UXVlcnlDbGllbnRQcm92aWRlci5qcy5tYXAiLCJcInVzZSBjbGllbnRcIjtcblxuLy8gc3JjL0lzUmVzdG9yaW5nUHJvdmlkZXIudHNcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIElzUmVzdG9yaW5nQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoZmFsc2UpO1xudmFyIHVzZUlzUmVzdG9yaW5nID0gKCkgPT4gUmVhY3QudXNlQ29udGV4dChJc1Jlc3RvcmluZ0NvbnRleHQpO1xudmFyIElzUmVzdG9yaW5nUHJvdmlkZXIgPSBJc1Jlc3RvcmluZ0NvbnRleHQuUHJvdmlkZXI7XG5leHBvcnQge1xuICBJc1Jlc3RvcmluZ1Byb3ZpZGVyLFxuICB1c2VJc1Jlc3RvcmluZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlzUmVzdG9yaW5nUHJvdmlkZXIuanMubWFwIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHNyYy9RdWVyeUVycm9yUmVzZXRCb3VuZGFyeS50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYW
25114N0L2pzeC1ydW50aW1lXCI7XG5mdW5jdGlvbiBjcmVhdGVWYWx1ZSgpIHtcbiAgbGV0IGlzUmVzZXQgPSBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBjbGVhclJlc2V0OiAoKSA9PiB7XG4gICAgICBpc1Jlc2V0ID0gZmFsc2U7XG4gICAgfSxcbiAgICByZXNldDogKCkgPT4ge1xuICAgICAgaXNSZXNldCA9IHRydWU7XG4gICAgfSxcbiAgICBpc1Jlc2V0OiAoKSA9PiB7XG4gICAgICByZXR1cm4gaXNSZXNldDtcbiAgICB9XG4gIH07XG59XG52YXIgUXVlcnlFcnJvclJlc2V0Qm91bmRhcnlDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChjcmVhdGVWYWx1ZSgpKTtcbnZhciB1c2VRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSA9ICgpID0+IFJlYWN0LnVzZUNvbnRleHQoUXVlcnlFcnJvclJlc2V0Qm91bmRhcnlDb250ZXh0KTtcbnZhciBRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSA9ICh7XG4gIGNoaWxkcmVuXG59KSA9PiB7XG4gIGNvbnN0IFt2YWx1ZV0gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBjcmVhdGVWYWx1ZSgpKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUXVlcnlFcnJvclJlc2V0Qm91bmRhcnlDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlLCBjaGlsZHJlbjogdHlwZW9mIGNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIgPyBjaGlsZHJlbih2YWx1ZSkgOiBjaGlsZHJlbiB9KTtcbn07XG5leHBvcnQge1xuICBRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSxcbiAgdXNlUXVlcnlFcnJvclJlc2V0Qm91bmRhcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeUVycm9yUmVzZXRCb3VuZGFyeS5qcy5tYXAiLCJcInVzZSBjbGllbnRcIjtcblxuLy8gc3JjL2Vycm9yQm91bmRhcnlVdGlscy50c1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYW
25114N0XCI7XG5pbXBvcnQgeyBzaG91bGRUaHJvd0Vycm9yIH0gZnJvbSBcIkB0YW5zdGFjay9xdWVyeS1jb3JlXCI7XG52YXIgZW5zdXJlUHJldmVudEVycm9yQm91bmRhcnlSZXRyeSA9IChvcHRpb25zLCBlcnJvclJlc2V0Qm91bmRhcnkpID0+IHtcbiAgaWYgKG9wdGlvbnMuc3VzcGVuc2UgfHwgb3B0aW9ucy50aHJvd09uRXJyb3IgfHwgb3B0aW9ucy5leHBlcmltZW50YWxfcHJlZmV0Y2hJblJlbmRlcikge1xuICAgIGlmICghZXJyb3JSZXNldEJvdW5kYXJ5LmlzUmVzZXQoKSkge1xuICAgICAgb3B0aW9ucy5yZXRyeU9uTW91bnQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG52YXIgdXNlQ2xlYXJSZXNldEVycm9yQm91bmRhcnkgPSAoZXJyb3JSZXNldEJvdW5kYXJ5KSA9PiB7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZXJyb3JSZXNldEJvdW5kYXJ5LmNsZWFyUmVzZXQoKTtcbiAgfSwgW2Vycm9yUmVzZXRCb3VuZGFyeV0pO1xufTtcbnZhciBnZXRIYXNFcnJvciA9ICh7XG4gIHJlc3VsdCxcbiAgZXJyb3JSZXNldEJvdW5kYXJ5LFxuICB0aHJvd09uRXJyb3IsXG4gIHF1ZXJ5LFxuICBzdXNwZW5zZVxufSkgPT4ge1xuICByZXR1cm4gcmVzdWx0LmlzRXJyb3IgJiYgIWVycm9yUmVzZXRCb3VuZGFyeS5pc1Jlc2V0KCkgJiYgIXJlc3VsdC5pc0ZldGNoaW5nICYmIHF1ZXJ5ICYmIChzdXNwZW5zZSAmJiByZXN1bHQuZGF0YSA9PT0gdm9pZCAwIHx8IHNob3VsZFRocm93RXJyb3IodGhyb3dPbkVycm9yLCBbcmVzdWx0LmVycm9yLCBxdWVyeV0pKTtcbn07XG5leHBvcnQge1xuICBlbnN1cmVQcmV2ZW50RXJyb3JCb3VuZGFyeVJldHJ5LFxuICBnZXRIYXNFcnJvcixcbiAgdXNlQ2xlYXJSZXNldEVycm9yQm91bmRhcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvckJvdW5kYXJ5VXRpbHMuanMubWFwIiwiLy8gc3JjL3N1c3BlbnNlLnRzXG52YXIgZGVmYXVsdFRocm93T25FcnJvciA9IChfZXJyb3IsIHF1ZXJ5KSA9PiBxdWVyeS5zdGF0ZS5kYXRhID09PSB2b2lkIDA7XG52YXIgZW5zdXJlU3VzcGVuc2VUaW1lcnMgPSAoZGVmYXVsdGVkT3B0aW9ucykgPT4ge1xuICBpZiAoZGVmYXVsdGVkT3B0aW9ucy5zdXNwZW5zZSkge1xuICAgIGNvbnN0IE1JTl9TVVNQRU5TRV9USU1FX01TID0gMWUzO1xuICAgIGNvbnN0IGNsYW1wID0gKHZhbHVlKSA9PiB2YWx1ZSA9PT0gXCJzdGF0aWNcIiA/IHZhbHVlIDogTWF0aC5tYXgodmFsdWUgPz8gTUlOX1NVU1BFTlNFX1RJTUVfTVMsIE1JTl9TVVNQRU5TRV9USU1FX01TKTtcbiAgICBjb25zdCBvcmlnaW5hbFN0YWxlVGltZSA9IGRlZmF1bHRlZE9wdGlvbnMuc3RhbGVUaW1lO1xuICAgIGRlZmF1bHRlZE9wdGlvbnMuc3RhbGVUaW1lID0gdHlwZW9mIG9yaWdpbmFsU3RhbGVUaW1lID09PSBcImZ1bmN0aW9uXCIgPyAoLi4uYXJncykgPT4gY2xhbXAob3JpZ2luYWxTdGFsZVRpbWUoLi4uYXJncykpIDogY2xhbXAob3JpZ2luYWxTdGFsZVRpbWUpO1xuICAgIGlmICh0eXBlb2YgZGVmYXVsdGVkT3B0aW9ucy5nY1RpbWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGRlZmF1bHRlZE9wdGlvbnMuZ2NUaW1lID0gTWF0aC5tYXgoXG4gICAgICAgIGRlZmF1bHRlZE9wdGlvbnMuZ2NUaW1lLFxuICAgICAgICBNSU5fU1VTUEVOU0VfVElNRV9NU1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG52YXIgd2lsbEZldGNoID0gKHJlc3VsdCwgaXNSZXN0b3JpbmcpID0+IHJlc3VsdC5pc0xvYWRpbmcgJiYgcmVzdWx0LmlzRmV0Y2hpbmcgJiYgIWlzUmVzdG9yaW5nO1xudmFyIHNob3VsZFN1c3BlbmQgPSAoZGVmYXVsdGVkT3B0aW9ucywgcmVzdWx0KSA9PiBkZWZhdWx0ZWRPcHRpb25zPy5zdXNwZW5zZSAmJiByZXN1bHQuaXNQZW5kaW5nO1xudmFyIGZldGNoT3B0aW1pc3RpYyA9IChkZWZhdWx0ZWRPcHRpb25zLCBvYnNlcnZlciwgZXJyb3JSZXNldEJvdW5kYXJ5KSA9PiBvYnNlcnZlci5mZXRjaE9wdGltaXN0aWMoZGVmYXVsdGVkT3B0aW9ucykuY2F0Y2goKCkgPT4ge1xuICBlcnJvclJlc2V0Qm91bmRhcnkuY2xlYXJSZXNldCgpO1xufSk7XG5leHBvcnQge1xuICBkZWZhdWx0VGhyb3dPbkVycm9yLFxuICBlbnN1cmVTdXNwZW5zZVRpbWVycyxcbiAgZmV0Y2hPcHRpbWlzdGljLFxuICBzaG91bGRTdXNwZW5kLFxuICB3aWxsRmV0Y2hcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdXNwZW5zZS5qcy5tYXAiLCJcInVzZSBjbGllbnRcIjtcblxuLy8gc3JjL3VzZUJhc2VRdWVyeS50c1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYW
25114N0XCI7XG5pbXBvcnQgeyBpc1NlcnZlciwgbm9vcCwgbm90aWZ5TWFuYWdlciB9IGZyb20gXCJAdGFuc3RhY2svcXVlcnktY29yZVwiO1xuaW1wb3J0IHsgdXNlUXVlcnlDbGllbnQgfSBmcm9tIFwiLi9RdWVyeUNsaWVudFByb3ZpZGVyLmpzXCI7XG5pbXBvcnQgeyB1c2VRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSB9IGZyb20gXCIuL1F1ZXJ5RXJyb3JSZXNldEJvdW5kYXJ5LmpzXCI7XG5pbXBvcnQge1xuICBlbnN1cmVQcmV2ZW50RXJyb3JCb3VuZGFyeVJldHJ5LFxuICBnZXRIYXNFcnJvcixcbiAgdXNlQ2xlYXJSZXNldEVycm9yQm91bmRhcnlcbn0gZnJvbSBcIi4vZXJyb3JCb3VuZGFyeVV0aWxzLmpzXCI7XG5pbXBvcnQgeyB1c2VJc1Jlc3RvcmluZyB9IGZyb20gXCIuL0lzUmVzdG9yaW5nUHJvdmlkZXIuanNcIjtcbmltcG9ydCB7XG4gIGVuc3VyZVN1c3BlbnNlVGltZXJzLFxuICBmZXRjaE9wdGltaXN0aWMsXG4gIHNob3VsZFN1c3BlbmQsXG4gIHdpbGxGZXRjaFxufSBmcm9tIFwiLi9zdXNwZW5zZS5qc1wiO1xuZnVuY3Rpb24gdXNlQmFzZVF1ZXJ5KG9wdGlvbnMsIE9ic2VydmVyLCBxdWVyeUNsaWVudCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0JhZCBhcmd1bWVudCB0eXBlLiBTdGFydGluZyB3aXRoIHY1LCBvbmx5IHRoZSBcIk9iamVjdFwiIGZvcm0gaXMgYWxsb3dlZCB3aGVuIGNhbGxpbmcgcXVlcnkgcmVsYXRlZCBmdW5jdGlvbnMuIFBsZWFzZSB1c2UgdGhlIGVycm9yIHN0YWNrIHRvIGZpbmQgdGhlIGN1bHByaXQgY2FsbC4gTW9yZSBpbmZvIGhlcmU6IGh0dHBzOi8vdGFuc3RhY2suY29tL3F1ZXJ5L2xhdGVzdC9kb2NzL3JlYWN0L2d1aWRlcy9taWdyYXRpbmctdG8tdjUjc3VwcG9ydHMtYS1zaW5nbGUtc2lnbmF0dXJlLW9uZS1vYmplY3QnXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBjb25zdCBpc1Jlc3RvcmluZyA9IHVzZUlzUmVzdG9yaW5nKCk7XG4gIGNvbnN0IGVycm9yUmVzZXRCb3VuZGFyeSA9IHVzZVF1ZXJ5RXJyb3JSZXNldEJvdW5kYXJ5KCk7XG4gIGNvbnN0IGNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KHF1ZXJ5Q2xpZW50KTtcbiAgY29uc3QgZGVmYXVsdGVkT3B0aW9ucyA9IGNsaWVudC5kZWZhdWx0UXVlcnlPcHRpb25zKG9wdGlvbnMpO1xuICBjbGllbnQuZ2V0RGVmYXVsdE9wdGlvbnMoKS5xdWVyaWVzPy5fZXhwZXJpbWVudGFsX2JlZm9yZVF1ZXJ5Py4oXG4gICAgZGVmYXVsdGVkT3B0aW9uc1xuICApO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKCFkZWZhdWx0ZWRPcHRpb25zLnF1ZXJ5Rm4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbJHtkZWZhdWx0ZWRPcHRpb25zLnF1ZXJ5SGFzaH1dOiBObyBxdWVyeUZuIHdhcyBwYXNzZWQgYXMgYW4gb3B0aW9uLCBhbmQgbm8gZGVmYXVsdCBxdWVyeUZuIHdhcyBmb3VuZC4gVGhlIHF1ZXJ5Rm4gcGFyYW1ldGVyIGlzIG9ubHkgb3B0aW9uYWwgd2hlbiB1c2luZyBhIGRlZmF1bHQgcXVlcnlGbi4gTW9yZSBpbmZvIGhlcmU6IGh0dHBzOi8vdGFuc3RhY2suY29tL3F1ZXJ5L2xhdGVzdC9kb2NzL2ZyYW1ld29yay9yZWFjdC9ndWlkZXMvZGVmYXVsdC1xdWVyeS1mdW5jdGlvbmBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGRlZmF1bHRlZE9wdGlvbnMuX29wdGltaXN0aWNSZXN1bHRzID0gaXNSZXN0b3JpbmcgPyBcImlzUmVzdG9yaW5nXCIgOiBcIm9wdGltaXN0aWNcIjtcbiAgZW5zdXJlU3VzcGVuc2VUaW1lcnMoZGVmYXVsdGVkT3B0aW9ucyk7XG4gIGVuc3VyZVByZXZlbnRFcnJvckJvdW5kYXJ5UmV0cnkoZGVmYXVsdGVkT3B0aW9ucywgZXJyb3JSZXNldEJvdW5kYXJ5KTtcbiAgdXNlQ2xlYXJSZXNldEVycm9yQm91bmRhcnkoZXJyb3JSZXNldEJvdW5kYXJ5KTtcbiAgY29uc3QgaXNOZXdDYWNoZUVudHJ5ID0gIWNsaWVudC5nZXRRdWVyeUNhY2hlKCkuZ2V0KGRlZmF1bHRlZE9wdGlvbnMucXVlcnlIYXNoKTtcbiAgY29uc3QgW29ic2VydmVyXSA9IFJlYWN0LnVzZVN0YXRlKFxuICAgICgpID0+IG5ldyBPYnNlcnZlcihcbiAgICAgIGNsaWVudCxcbiAgICAgIGRlZmF1bHRlZE9wdGlvbnNcbiAgICApXG4gICk7XG4gIGNvbnN0IHJlc3VsdCA9IG9ic2VydmVyLmdldE9wdGltaXN0aWNSZXN1bHQoZGVmYXVsdGVkT3B0aW9ucyk7XG4gIGNvbnN0IHNob3VsZFN1YnNjcmliZSA9ICFpc1Jlc3RvcmluZyAmJiBvcHRpb25zLnN1YnNjcmliZWQgIT09IGZhbHNlO1xuICBSZWFjdC51c2VTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgIChvblN0b3JlQ2hhbmdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc2hvdWxkU3Vic2NyaWJlID8gb2JzZXJ2ZXIuc3Vic2NyaWJlKG5vdGlmeU1hbmFnZXIuYmF0Y2hDYWxscyhvblN0b3JlQ2hhbmdlKSkgOiBub29wO1xuICAgICAgICBvYnNlcnZlci51cGRhdGVSZXN1bHQoKTtcbiAgICAgICAgcmV0dXJuIHVuc3Vic2NyaWJlO1xuICAgICAgfSxcbiAgICAgIFtvYnNlcnZlciwgc2hvdWxkU3Vic2NyaWJlXVxuICAgICksXG4gICAgKCkgPT4gb2JzZXJ2ZXIuZ2V0Q3VycmVudFJlc3VsdCgpLFxuICAgICgpID0+IG9ic2VydmVyLmdldEN1cnJlbnRSZXN1bHQoKVxuICApO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9ic2VydmVyLnNldE9wdGlvbnMoZGVmYXVsdGVkT3B0aW9ucyk7XG4gIH0sIFtkZWZhdWx0ZWRPcHRpb25zLCBvYnNlcnZlcl0pO1xuICBpZiAoc2hvdWxkU3VzcGVuZChkZWZhdWx0ZWRPcHRpb25zLCByZXN1bHQpKSB7XG4gICAgdGhyb3cgZmV0Y2hPcHRpbWlzdGljKGRlZmF1bHRlZE9wdGlvbnMsIG9ic2VydmVyLCBlcnJvclJlc2V0Qm91bmRhcnkpO1xuICB9XG4gIGlmIChnZXRIYXNFcnJvcih7XG4gICAgcmVzdWx0LFxuICAgIGVycm9yUmVzZXRCb3VuZGFyeSxcbiAgICB0aHJvd09uRXJyb3I6IGRlZmF1bHRlZE9wdGlvbnMudGhyb3dPbkVycm9yLFxuICAgIHF1ZXJ5OiBjbGllbnQuZ2V0UXVlcnlDYWNoZSgpLmdldChkZWZh
25114dWx0ZWRPcHRpb25zLnF1ZXJ5SGFzaCksXG4gICAgc3VzcGVuc2U6IGRlZmF1bHRlZE9wdGlvbnMuc3VzcGVuc2VcbiAgfSkpIHtcbiAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gIH1cbiAgO1xuICBjbGllbnQuZ2V0RGVmYXVsdE9wdGlvbnMoKS5xdWVyaWVzPy5fZXhwZXJpbWVudGFsX2FmdGVyUXVlcnk/LihcbiAgICBkZWZhdWx0ZWRPcHRpb25zLFxuICAgIHJlc3VsdFxuICApO1xuICBpZiAoZGVmYXVsdGVkT3B0aW9ucy5leHBlcmltZW50YWxfcHJlZmV0Y2hJblJlbmRlciAmJiAhaXNTZXJ2ZXIgJiYgd2lsbEZldGNoKHJlc3VsdCwgaXNSZXN0b3JpbmcpKSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IGlzTmV3Q2FjaGVFbnRyeSA/IChcbiAgICAgIC8vIEZldGNoIGltbWVkaWF0ZWx5IG9uIHJlbmRlciBpbiBvcmRlciB0byBlbnN1cmUgYC5wcm9taXNlYCBpcyByZXNvbHZlZCBldmVuIGlmIHRoZSBjb21wb25lbnQgaXMgdW5tb3VudGVkXG4gICAgICBmZXRjaE9wdGltaXN0aWMoZGVmYXVsdGVkT3B0aW9ucywgb2JzZXJ2ZXIsIGVycm9yUmVzZXRCb3VuZGFyeSlcbiAgICApIDogKFxuICAgICAgLy8gc3Vic2NyaWJlIHRvIHRoZSBcImNhY2hlIHByb21pc2VcIiBzbyB0aGF0IHdlIGNhbiBmaW5hbGl6ZSB0aGUgY3VycmVudFRoZW5hYmxlIG9uY2UgZGF0YSBjb21lcyBpblxuICAgICAgY2xpZW50LmdldFF1ZXJ5Q2FjaGUoKS5nZXQoZGVmYXVsdGVkT3B0aW9ucy5xdWVyeUhhc2gpPy5wcm9taXNlXG4gICAgKTtcbiAgICBwcm9taXNlPy5jYXRjaChub29wKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIG9ic2VydmVyLnVwZGF0ZVJlc3VsdCgpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiAhZGVmYXVsdGVkT3B0aW9ucy5ub3RpZnlPbkNoYW5nZVByb3BzID8gb2JzZXJ2ZXIudHJhY2tSZXN1bHQocmVzdWx0KSA6IHJlc3VsdDtcbn1cbmV4cG9ydCB7XG4gIHVzZUJhc2VRdWVyeVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZUJhc2VRdWVyeS5qcy5tYXAiLCJcInVzZSBjbGllbnRcIjtcblxuLy8gc3JjL3VzZVF1ZXJ5LnRzXG5pbXBvcnQgeyBRdWVyeU9ic2VydmVyIH0gZnJvbSBcIkB0YW5zdGFjay9xdWVyeS1jb3JlXCI7XG5pbXBvcnQgeyB1c2VCYXNlUXVlcnkgfSBmcm9tIFwiLi91c2VCYXNlUXVlcnkuanNcIjtcbmZ1bmN0aW9uIHVzZVF1ZXJ5KG9wdGlvbnMsIHF1ZXJ5Q2xpZW50KSB7XG4gIHJldHVybiB1c2VCYXNlUXVlcnkob3B0aW9ucywgUXVlcnlPYnNlcnZlciwgcXVlcnlDbGllbnQpO1xufVxuZXhwb3J0IHtcbiAgdXNlUXVlcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VRdWVyeS5qcy5tYXAiLCIvKipcbiAqIHJlYWN0LXJvdXRlciB2Ny45LjNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xudmFyIF9fdHlwZUVycm9yID0gKG1zZykgPT4ge1xuICB0aHJvdyBUeXBlRXJyb3IobXNnKTtcbn07XG52YXIgX19hY2Nlc3NDaGVjayA9IChvYmosIG1lbWJlciwgbXNnKSA9PiBtZW1iZXIuaGFzKG9iaikgfHwgX190eXBlRXJyb3IoXCJDYW5ub3QgXCIgKyBtc2cpO1xudmFyIF9fcHJpdmF0ZUdldCA9IChvYmosIG1lbWJlciwgZ2V0dGVyKSA9PiAoX19hY2Nlc3NDaGVjayhvYmosIG1lbWJlciwgXCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZFwiKSwgZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IG1lbWJlci5nZXQob2JqKSk7XG52YXIgX19wcml2YXRlQWRkID0gKG9iaiwgbWVtYmVyLCB2YWx1ZSkgPT4gbWVtYmVyLmhhcyhvYmopID8gX190eXBlRXJyb3IoXCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlXCIpIDogbWVtYmVyIGluc3RhbmNlb2YgV2Vha1NldCA/IG1lbWJlci5hZGQob2JqKSA6IG1lbWJlci5zZXQob2JqLCB2YWx1ZSk7XG5cbi8vIGxpYi9yb3V0ZXIvaGlzdG9yeS50c1xudmFyIEFjdGlvbiA9IC8qIEBfX1BVUkVfXyAqLyAoKEFjdGlvbjIpID0+IHtcbiAgQWN0aW9uMltcIlBvcFwiXSA9IFwiUE9QXCI7XG4gIEFjdGlvbjJbXCJQdXNoXCJdID0gXCJQVVNIXCI7XG4gIEFjdGlvbjJbXCJSZXBsYWNlXCJdID0gXCJSRVBMQUNFXCI7XG4gIHJldHVybiBBY3Rpb24yO1xufSkoQWN0aW9uIHx8IHt9KTtcbnZhciBQb3BTdGF0ZUV2ZW50VHlwZSA9IFwicG9wc3RhdGVcIjtcbmZ1bmN0aW9uIGNyZWF0ZU1lbW9yeUhpc3Rvcnkob3B0aW9ucyA9IHt9KSB7XG4gIGxldCB7IGluaXRpYWxFbnRyaWVzID0gW1wiL1wiXSwgaW5pdGlhbEluZGV4LCB2NUNvbXBhdCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICBsZXQgZW50cmllcztcbiAgZW50cmllcyA9IGluaXRpYWxFbnRyaWVzLm1hcChcbiAgICAoZW50cnksIGluZGV4MikgPT4gY3JlYXRlTWVtb3J5TG9jYXRpb24oXG4gICAgICBlbnRyeSxcbiAgICAgIHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiA/IG51bGwgOiBlbnRyeS5zdGF0ZSxcbiAgICAgIGluZGV4MiA9PT0gMCA/IFwiZGVmYXVsdFwiIDogdm9pZCAwXG4gICAgKVxuICApO1xuICBsZXQgaW5kZXggPSBjbGFtcEluZGV4KFxuICAgIGluaXRpYWxJbmRleCA9PSBudWxsID8gZW50cmllcy5sZW5ndGggLSAxIDogaW5pdGlhbEluZGV4XG4gICk7XG4gIGxldCBhY3Rpb24gPSBcIlBPUFwiIC8qIFBvcCAqLztcbiAgbGV0IGxpc3RlbmVyID0gbnVsbDtcbiAgZnVuY3Rpb24gY2xhbXBJbmRleChuKSB7XG4gICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG4sIDApLCBlbnRyaWVzLmxlbmd0aCAtIDEpO1xuICB9XG4gIGZ1bmN0aW9uIGdldEN1cnJlbnRMb2NhdGlvbigpIHtcbiAgICByZXR1cm4gZW50cmllc1tpbmRleF07XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlTWVtb3J5TG9jYXRpb24odG8sIHN0YXRlID0gbnVsbCwga2V5KSB7XG4gICAgbGV0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oXG4gICAgICBlbnRyaWVzID8gZ2V0Q3VycmVudExvY2F0aW9uKCkucGF0aG5hbWUgOiBcIi9cIixcbiAgICAgIHRvLFxuICAgICAgc3RhdGUsXG4gICAgICBrZXlcbiAgICApO
251141xuICAgIHdhcm5pbmcoXG4gICAgICBsb2NhdGlvbi5wYXRobmFtZS5jaGFyQXQoMCkgPT09IFwiL1wiLFxuICAgICAgYHJlbGF0aXZlIHBhdGhuYW1lcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBtZW1vcnkgaGlzdG9yeTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgdG9cbiAgICAgICl9YFxuICAgICk7XG4gICAgcmV0dXJuIGxvY2F0aW9uO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUhyZWYyKHRvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHRvIDogY3JlYXRlUGF0aCh0byk7XG4gIH1cbiAgbGV0IGhpc3RvcnkgPSB7XG4gICAgZ2V0IGluZGV4KCkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH0sXG4gICAgZ2V0IGFjdGlvbigpIHtcbiAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfSxcbiAgICBnZXQgbG9jYXRpb24oKSB7XG4gICAgICByZXR1cm4gZ2V0Q3VycmVudExvY2F0aW9uKCk7XG4gICAgfSxcbiAgICBjcmVhdGVIcmVmOiBjcmVhdGVIcmVmMixcbiAgICBjcmVhdGVVUkwodG8pIHtcbiAgICAgIHJldHVybiBuZXcgVVJMKGNyZWF0ZUhyZWYyKHRvKSwgXCJodHRwOi8vbG9jYWxob3N0XCIpO1xuICAgIH0sXG4gICAgZW5jb2RlTG9jYXRpb24odG8pIHtcbiAgICAgIGxldCBwYXRoID0gdHlwZW9mIHRvID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKHRvKSA6IHRvO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aG5hbWU6IHBhdGgucGF0aG5hbWUgfHwgXCJcIixcbiAgICAgICAgc2VhcmNoOiBwYXRoLnNlYXJjaCB8fCBcIlwiLFxuICAgICAgICBoYXNoOiBwYXRoLmhhc2ggfHwgXCJcIlxuICAgICAgfTtcbiAgICB9LFxuICAgIHB1c2godG8sIHN0YXRl
25114KSB7XG4gICAgICBhY3Rpb24gPSBcIlBVU0hcIiAvKiBQdXNoICovO1xuICAgICAgbGV0IG5leHRMb2NhdGlvbiA9IGNyZWF0ZU1lbW9yeUxvY2F0aW9uKHRvLCBzdGF0ZSk7XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIGVudHJpZXMubGVuZ3RoLCBuZXh0TG9jYXRpb24pO1xuICAgICAgaWYgKHY1Q29tcGF0ICYmIGxpc3RlbmVyKSB7XG4gICAgICAgIGxpc3RlbmVyKHsgYWN0aW9uLCBsb2NhdGlvbjogbmV4dExvY2F0aW9uLCBkZWx0YTogMSB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlcGxhY2UodG8sIHN0YXRlKSB7XG4gICAgICBhY3Rpb24gPSBcIlJFUExBQ0VcIiAvKiBSZXBsYWNlICovO1xuICAgICAgbGV0IG5leHRMb2NhdGlvbiA9IGNyZWF0ZU1lbW9yeUxvY2F0aW9uKHRvLCBzdGF0ZSk7XG4gICAgICBlbnRyaWVzW2luZGV4XSA9IG5leHRMb2NhdGlvbjtcbiAgICAgIGlmICh2NUNvbXBhdCAmJiBsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcih7IGFjdGlvbiwgbG9jYXRpb246IG5leHRMb2NhdGlvbiwgZGVsdGE6IDAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnbyhkZWx0YSkge1xuICAgICAgYWN0aW9uID0gXCJQT1BcIiAvKiBQb3AgKi87XG4gICAgICBsZXQgbmV4dEluZGV4ID0gY2xhbXBJbmRleChpbmRleCArIGRlbHRhKTtcbiAgICAgIGxldCBuZXh0TG9jYXRpb24gPSBlbnRyaWVzW25leHRJbmRleF07XG4gICAgICBpbmRleCA9IG5leHRJbmRleDtcbiAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcih7IGFjdGlvbiwgbG9jYXRpb246IG5leHRMb2NhdGlvbiwgZGVsdGEgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBsaXN0ZW4oZm4pIHtcbiAgICAgIGxpc3RlbmVyID0gZm47XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBsaXN0ZW5lciA9IG51bGw7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhpc3Rvcnk7XG59XG5mdW5jdGlvbiBjcmVhdGVCcm93c2VySGlzdG9yeShvcHRpb25zID0ge30pIHtcbiAgZnVuY3Rpb24gY3JlYXRlQnJvd3NlckxvY2F0aW9uKHdpbmRvdzIsIGdsb2JhbEhpc3RvcnkpIHtcbiAgICBsZXQgeyBwYXRobmFtZSwgc2VhcmNoLCBoYXNoIH0gPSB3aW5kb3cyLmxvY2F0aW9uO1xuICAgIHJldHVybiBjcmVhdGVMb2NhdGlvbihcbiAgICAgIFwiXCIsXG4gICAgICB7IHBhdGhuYW1lLCBzZWFyY2gsIGhhc2ggfSxcbiAgICAgIC8vIHN0YXRlIGRlZmF1bHRzIHRvIGBudWxsYCBiZWNhdXNlIGB3aW5kb3cuaGlzdG9yeS5zdGF0ZWAgZG9lc1xuICAgICAgZ2xvYmFsSGlzdG9yeS5zdGF0ZSAmJiBnbG9iYWxIaXN0b3J5LnN0YXRlLnVzciB8fCBudWxsLFxuICAgICAgZ2xvYmFsSGlzdG9yeS5zdGF0ZSAmJiBnbG9iYWxIaXN0b3J5LnN0YXRlLmtleSB8fCBcImRlZmF1bHRcIlxuICAgICk7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlQnJvd3NlckhyZWYod2luZG93MiwgdG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIHRvID09PSBcInN0cmluZ1wiID8gdG8gOiBjcmVhdGVQYXRoKHRvKTtcbiAgfVxuICByZXR1cm4gZ2V0VXJsQmFzZWRIaXN0b3J5KFxuICAgIGNyZWF0ZUJyb3dzZXJMb2NhdGlvbixcbiAgICBjcmVhdGVCcm93c2VySHJlZixcbiAgICBudWxsLFxuICAgIG9wdGlvbnNcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUhhc2hIaXN0b3J5KG9wdGlvbnMgPSB7fSkge1xuICBmdW5jdGlvbiBjcmVhdGVIYXNoTG9jYXRpb24od2luZG93MiwgZ2xvYmFsSGlzdG9yeSkge1xuICAgIGxldCB7XG4gICAgICBwYXRobmFtZSA9IFwiL1wiLFxuICAgICAgc2VhcmNoID0gXCJcIixcbiAgICAgIGhhc2ggPSBcIlwiXG4gICAgfSA9IHBhcnNlUGF0aCh3aW5kb3cyLmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKTtcbiAgICBpZiAoIXBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvXCIpICYmICFwYXRobmFtZS5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgcGF0aG5hbWUgPSBcIi9cIiArIHBhdGhuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlTG9jYXRpb24oXG4gICAgICBcIlwiLFxuICAgICAgeyBwYXRobmFtZSwgc2VhcmNoLCBoYXNoIH0sXG4gICAgICAvLyBzdGF0ZSBkZWZhdWx0cyB0byBgbnVsbGAgYmVjYXVzZSBgd2luZG93Lmhpc3Rvcnkuc3RhdGVgIGRvZXNcbiAgICAgIGdsb2JhbEhpc3Rvcnkuc3RhdGUgJiYgZ2xvYmFsSGlzdG9yeS5zdGF0ZS51c3IgfHwgbnVsbCxcbiAgICAgIGdsb2JhbEhpc3Rvcnkuc3RhdGUgJiYgZ2xvYmFsSGlzdG9yeS5zdGF0ZS5rZXkgfHwgXCJkZWZhdWx0XCJcbiAgICApO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUhhc2hIcmVmKHdpbmRvdzIsIHRvKSB7XG4gICAgbGV0IGJhc2UgPSB3aW5kb3cyLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJiYXNlXCIpO1xuICAgIGxldCBocmVmID0gXCJcIjtcbiAgICBpZiAoYmFzZSAmJiBiYXNlLmdldEF0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgIGxldCB1cmwgPSB3aW5kb3cyLmxvY2F0aW9uLmhyZWY7XG4gICAgICBsZXQgaGFzaEluZGV4ID0gdXJsLmluZGV4T2YoXCIjXCIpO1xuICAgICAgaHJlZiA9IGhhc2hJbmRleCA9PT0gLTEgPyB1cmwgOiB1cmwuc2xpY2UoMCwgaGFzaEluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGhyZWYgKyBcIiNcIiArICh0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIgPyB0byA6IGNyZWF0ZVBhdGgodG8pKTtcbiAgfVxuICBmdW5jdGlvbiB2YWxpZGF0ZUhhc2hMb2NhdGlvbihsb2NhdGlvbiwgdG8pIHtcbiAgICB3YXJuaW5nKFxuICAgICAgbG9jYXRpb24ucGF0aG5hbWUuY2hhckF0KDApID09PSBcIi9cIixcbiAgICAgIGByZWxhdGl2ZSBwYXRobmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gaGFzaCBoaXN0b3J5LnB1c2goJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgdG9cbiAgICAgICl9KWBcbiAgICApO1xuICB9XG4gIHJldHVybiBnZXRVcmxCYXNlZEhpc3RvcnkoXG4gICAgY3JlYXRlSGFzaExvY2F0aW9uLFxuICAgIGNyZWF0ZUhhc2hIcmVmLFxuICAgIHZhbGlkYXRlSGFzaExvY2F0aW9uLFxuICAgIG9wdGlvbnNcbiAgKTtcbn1cbmZ1bmN0aW9uIGludmFyaWFudCh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybmluZyhjb25kLCBtZXNzYWdlKSB7XG4gIGlmICghY29uZCkge1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIikgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgIHRyeSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlS2V5KCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDEwKTtcbn1cbmZ1bmN0aW9uIGdldEhpc3RvcnlTdGF0ZShsb2NhdGlvbiwgaW5kZXgpIHtcbiAgcmV0dXJuIHtcbiAgICB1c3I6IGxvY2F0aW9uLnN0YXRlLFxuICAgIGtleTogbG9jYXRpb24ua2V5LFxuICAgIGl
25114keDogaW5kZXhcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUxvY2F0aW9uKGN1cnJlbnQsIHRvLCBzdGF0ZSA9IG51bGwsIGtleSkge1xuICBsZXQgbG9jYXRpb24gPSB7XG4gICAgcGF0aG5hbWU6IHR5cGVvZiBjdXJyZW50ID09PSBcInN0cmluZ1wiID8gY3VycmVudCA6IGN1cnJlbnQucGF0aG5hbWUsXG4gICAgc2VhcmNoOiBcIlwiLFxuICAgIGhhc2g6IFwiXCIsXG4gICAgLi4udHlwZW9mIHRvID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKHRvKSA6IHRvLFxuICAgIHN0YXRlLFxuICAgIC8vIFRPRE86IFRoaXMgY291bGQgYmUgY2xlYW5lZCB1cC4gIHB1c2gvcmVwbGFjZSBzaG91bGQgcHJvYmFibHkganVzdCB0YWtlXG4gICAgLy8gZnVsbCBMb2NhdGlvbnMgbm93IGFuZCBhdm9pZCB0aGUgbmVlZCB0byBydW4gdGhyb3VnaCB0aGlzIGZsb3cgYXQgYWxsXG4gICAgLy8gQnV0IHRoYXQncyBhIHByZXR0eSBiaWcgcmVmYWN0b3IgdG8gdGhlIGN1cnJlbnQgdGVzdCBzdWl0ZSBzbyBnb2luZyB0b1xuICAgIC8vIGtlZXAgYXMgaXMgZm9yIHRoZSB0aW1lIGJlaW5nIGFuZCBqdXN0IGxldCBhbnkgaW5jb21pbmcga2V5cyB0YWtlIHByZWNlZGVuY2VcbiAgICBrZXk6IHRvICYmIHRvLmtleSB8fCBrZXkgfHwgY3JlYXRlS2V5KClcbiAgfTtcbiAgcmV0dXJuIGxvY2F0aW9uO1xufVxuZnVuY3Rpb24gY3JlYXRlUGF0aCh7XG4gIHBhdGhuYW1lID0gXCIvXCIsXG4gIHNlYXJjaCA9IFwiXCIsXG4gIGhhc2ggPSBcIlwiXG59KSB7XG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoICE9PSBcIj9cIilcbiAgICBwYXRobmFtZSArPSBzZWFyY2guY2hhckF0KDApID09PSBcIj9cIiA/IHNlYXJjaCA6IFwiP1wiICsgc2VhcmNoO1xuICBpZiAoaGFzaCAmJiBoYXNoICE9PSBcIiNcIilcbiAgICBwYXRobmFtZSArPSBoYXNoLmNoYXJBdCgwKSA9PT0gXCIjXCIgPyBoYXNoIDogXCIjXCIgKyBoYXNoO1xuICByZXR1cm4gcGF0aG5hbWU7XG59XG5mdW5jdGlvbiBwYXJzZVBhdGgocGF0aCkge1xuICBsZXQgcGFyc2VkUGF0aCA9IHt9O1xuICBpZiAocGF0aCkge1xuICAgIGxldCBoYXNoSW5kZXggPSBwYXRoLmluZGV4T2YoXCIjXCIpO1xuICAgIGlmIChoYXNoSW5kZXggPj0gMCkge1xuICAgICAgcGFyc2VkUGF0aC5oYXNoID0gcGF0aC5zdWJzdHJpbmcoaGFzaEluZGV4KTtcbiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBoYXNoSW5kZXgpO1xuICAgIH1cbiAgICBsZXQgc2VhcmNoSW5kZXggPSBwYXRoLmluZGV4T2YoXCI/XCIpO1xuICAgIGlmIChzZWFyY2hJbmRleCA+PSAwKSB7XG4gICAgICBwYXJzZWRQYXRoLnNlYXJjaCA9IHBhdGguc3Vic3RyaW5nKHNlYXJjaEluZGV4KTtcbiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBzZWFyY2hJbmRleCk7XG4gICAgfVxuICAgIGlmIChwYXRoKSB7XG4gICAgICBwYXJzZWRQYXRoLnBhdGhuYW1lID0gcGF0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhcnNlZFBhdGg7XG59XG5mdW5jdGlvbiBnZXRVcmxCYXNlZEhpc3RvcnkoZ2V0TG9jYXRpb24sIGNyZWF0ZUhyZWYyLCB2YWxpZGF0ZUxvY2F0aW9uLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IHsgd2luZG93OiB3aW5kb3cyID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcsIHY1Q29tcGF0ID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gIGxldCBnbG9iYWxIaXN0b3J5ID0gd2luZG93Mi5oaXN0b3J5O1xuICBsZXQgYWN0aW9uID0gXCJQT1BcIiAvKiBQb3AgKi87XG4gIGxldCBsaXN0ZW5lciA9IG51bGw7XG4gIGxldCBpbmRleCA9IGdldEluZGV4KCk7XG4gIGlmIChpbmRleCA9PSBudWxsKSB7XG4gICAgaW5kZXggPSAwO1xuICAgIGdsb2JhbEhpc3RvcnkucmVwbGFjZVN0YXRlKHsgLi4uZ2xvYmFsSGlzdG9yeS5zdGF0ZSwgaWR4OiBpbmRleCB9LCBcIlwiKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRJbmRleCgpIHtcbiAgICBsZXQgc3RhdGUgPSBnbG9iYWxIaXN0b3J5LnN0YXRlIHx8IHsgaWR4OiBudWxsIH07XG4gICAgcmV0dXJuIHN0YXRlLmlkeDtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVQb3AoKSB7XG4gICAgYWN0aW9uID0gXCJQT1BcIiAvKiBQb3AgKi87XG4gICAgbGV0IG5leHRJbmRleCA9IGdldEluZGV4KCk7XG4gICAgbGV0IGRlbHRhID0gbmV4dEluZGV4ID09IG51bGwgPyBudWxsIDogbmV4dEluZGV4IC0gaW5kZXg7XG4gICAgaW5kZXggPSBuZXh0SW5kZXg7XG4gICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lcih7IGFjdGlvbiwgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb24sIGRlbHRhIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwdXNoKHRvLCBzdGF0ZSkge1xuICAgIGFjdGlvbiA9IFwiUFVTSFwiIC8qIFB1c2ggKi87XG4gICAgbGV0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbiwgdG8sIHN0YXRlKTtcbiAgICBpZiAodmFsaWRhdGVMb2NhdGlvbikgdmFsaWRhdGVMb2NhdGlvbihsb2NhdGlvbiwgdG8pO1xuICAgIGluZGV4ID0gZ2V0SW5kZXgoKSArIDE7XG4gICAgbGV0IGhpc3RvcnlTdGF0ZSA9IGdldEhpc3RvcnlTdGF0ZShsb2NhdGlvbiwgaW5kZXgpO1xuICAgIGxldCB1cmwgPSBoaXN0b3J5LmNyZWF0ZUhyZWYobG9jYXRpb24pO1xuICAgIHRyeSB7XG4gICAgICBnbG9iYWxIaXN0b3J5LnB1c2hTdGF0ZShoaXN0b3J5U3RhdGUsIFwiXCIsIHVybCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlcnJvci5uYW1lID09PSBcIkRhdGFDbG9uZUVycm9yXCIpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICB3aW5kb3cyLmxvY2F0aW9uLmFzc2lnbih1cmwpO1xuICAgIH1cbiAgICBpZiAodjVDb21wYXQgJiYgbGlzdGVuZXIpIHtcbiAgICAgIGxpc3RlbmVyKHsgYWN0aW9uLCBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvbiwgZGVsdGE6IDEgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlcGxhY2UyKHRvLCBzdGF0ZSkge1xuICAgIGFjdGlvbiA9IFwiUkVQTEFDRVwiIC8qIFJlcGxhY2UgKi87XG4gICAgbGV0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbiwgdG8sIHN0YXRl
25114KTtcbiAgICBpZiAodmFsaWRhdGVMb2NhdGlvbikgdmFsaWRhdGVMb2NhdGlvbihsb2NhdGlvbiwgdG8pO1xuICAgIGluZGV4ID0gZ2V0SW5kZXgoKTtcbiAgICBsZXQgaGlzdG9yeVN0YXRlID0gZ2V0SGlzdG9yeVN0YXRlKGxvY2F0aW9uLCBpbmRleCk7XG4gICAgbGV0IHVybCA9IGhpc3RvcnkuY3JlYXRlSHJlZihsb2NhdGlvbik7XG4gICAgZ2xvYmFsSGlzdG9yeS5yZXBsYWNlU3RhdGUoaGlzdG9yeVN0YXRlLCBcIlwiLCB1cmwpO1xuICAgIGlmICh2NUNvbXBhdCAmJiBsaXN0ZW5lcikge1xuICAgICAgbGlzdGVuZXIoeyBhY3Rpb24sIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLCBkZWx0YTogMCB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlVVJMKHRvKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJyb3dzZXJVUkxJbXBsKHRvKTtcbiAgfVxuICBsZXQgaGlzdG9yeSA9IHtcbiAgICBnZXQgYWN0aW9uKCkge1xuICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9LFxuICAgIGdldCBsb2NhdGlvbigpIHtcbiAgICAgIHJldHVybiBnZXRMb2NhdGlvbih3aW5kb3cyLCBnbG9iYWxIaXN0b3J5KTtcbiAgICB9LFxuICAgIGxpc3Rlbihmbikge1xuICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgaGlzdG9yeSBvbmx5IGFjY2VwdHMgb25lIGFjdGl2ZSBsaXN0ZW5lclwiKTtcbiAgICAgIH1cbiAgICAgIHdpbmRvdzIuYWRkRXZlbnRMaXN0ZW5lcihQb3BTdGF0ZUV2ZW50VHlwZSwgaGFuZGxlUG9wKTtcbiAgICAgIGxpc3RlbmVyID0gZm47XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB3aW5kb3cyLnJlbW92ZUV2ZW50TGlzdGVuZXIoUG9wU3RhdGVFdmVudFR5cGUsIGhhbmRsZVBvcCk7XG4gICAgICAgIGxpc3RlbmVyID0gbnVsbDtcbiAgICAgIH07XG4gICAgfSxcbiAgICBjcmVhdGVIcmVmKHRvKSB7XG4gICAgICByZXR1cm4gY3JlYXRlSHJlZjIod2luZG93MiwgdG8pO1xuICAgIH0sXG4gICAgY3JlYXRlVVJMLFxuICAgIGVuY29kZUxvY2F0aW9uKHRvKSB7XG4gICAgICBsZXQgdXJsID0gY3JlYXRlVVJMKHRvKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGhuYW1lOiB1cmwucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogdXJsLnNlYXJjaCxcbiAgICAgICAgaGFzaDogdXJsLmhhc2hcbiAgICAgIH07XG4gICAgfSxcbiAgICBwdXNoLFxuICAgIHJlcGxhY2U6IHJlcGxhY2UyLFxuICAgIGdvKG4pIHtcbiAgICAgIHJldHVybiBnbG9iYWxIaXN0b3J5LmdvKG4pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhpc3Rvcnk7XG59XG5mdW5jdGlvbiBjcmVhdGVCcm93c2VyVVJMSW1wbCh0bywgaXNBYnNvbHV0ZSA9IGZhbHNlKSB7XG4gIGxldCBiYXNlID0gXCJodHRwOi8vbG9jYWxob3N0XCI7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgYmFzZSA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gIT09IFwibnVsbFwiID8gd2luZG93LmxvY2F0aW9uLm9yaWdpbiA6IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICB9XG4gIGludmFyaWFudChiYXNlLCBcIk5vIHdpbmRvdy5sb2NhdGlvbi4ob3JpZ2lufGhyZWYpIGF2YWlsYWJsZSB0byBjcmVhdGUgVVJMXCIpO1xuICBsZXQgaHJlZiA9IHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHRvIDogY3JlYXRlUGF0aCh0byk7XG4gIGhyZWYgPSBocmVmLnJlcGxhY2UoLyAkLywgXCIlMjBcIik7XG4gIGlmICghaXNBYnNvbHV0ZSAmJiBocmVmLnN0YXJ0c1dpdGgoXCIvL1wiKSkge1xuICAgIGhyZWYgPSBiYXNlICsgaHJlZjtcbiAgfVxuICByZXR1cm4gbmV3IFVSTChocmVmLCBiYXNlKTtcbn1cblxuLy8gbGliL3JvdXRlci91dGlscy50c1xuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHsgZGVmYXVsdFZhbHVlIH07XG59XG52YXIgX21hcDtcbnZhciBSb3V0ZXJDb250ZXh0UHJvdmlkZXIgPSBjbGFzcyB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYFJvdXRlckNvbnRleHRQcm92aWRlcmAgaW5zdGFuY2VcbiAgICogQHBhcmFtIGluaXQgQW4gb3B0aW9uYWwgaW5pdGlhbCBjb250ZXh0IG1hcCB0byBwb3B1bGF0ZSB0aGUgcHJvdmlkZXIgd2l0aFxuICAgKi9cbiAgY29uc3RydWN0b3IoaW5pdCkge1xuICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbWFwLCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgICBpZiAoaW5pdCkge1xuICAgICAgZm9yIChsZXQgW2NvbnRleHQsIHZhbHVlXSBvZiBpbml0KSB7XG4gICAgICAgIHRoaXMuc2V0KGNvbnRleHQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEFjY2VzcyBhIHZhbHVlIGZyb20gdGhlIGNvbnRleHQuIElmIG5vIHZhbHVlIGhhcyBiZWVuIHNldCBmb3IgdGhlIGNvbnRleHQsXG4gICAqIGl0IHdpbGwgcmV0dXJuIHRoZSBjb250ZXh0J3MgYGRlZmF1bHRWYWx1ZWAgaWYgcHJvdmlkZWQsIG9yIHRocm93IGFuIGVycm9yXG4gICAqIGlmIG5vIGBkZWZhdWx0VmFsdWVgIHdhcyBzZXQuXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGdldCB0aGUgdmFsdWUgZm9yXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBmb3IgdGhlIGNvbnRleHQsIG9yIHRoZSBjb250ZXh0J3MgYGRlZmF1bHRWYWx1ZWAgaWYgbm9cbiAgICogdmFsdWUgd2FzIHNldFxuICAgKi9cbiAgZ2V0KGNvbnRleHQpIHtcbiAgICBpZiAoX19wcml2YXRlR2V0KHRoaXMsIF9tYXApLmhhcyhjb250ZXh0KSkge1xuICAgICAgcmV0dXJuIF9fcHJpdmF0ZUdldCh0aGlzLCBfbWFwKS5nZXQoY29udGV4dCk7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LmRlZmF1bHRWYWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gY29udGV4dC5kZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHZhbHVlIGZvdW5kIGZvciBjb250ZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgYSB2YWx1ZSBmb3IgdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGFscmVhZHkgaGFzIGEgdmFsdWUgc2V0LCB0aGlzXG4gICAqIHdpbGwgb3ZlcndyaXRlIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBzZXQgdGhlIHZhbHVlIGZvclxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGNvbnRleHRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXQoY29udGV4dCwgdmFsdWUpIHtcbiAgICBfX3ByaXZhdGVHZXQodGhpcywgX21hcCkuc2V0KGNvbnRleHQsIHZhbHVlKTtcbiAgfVxufTtcbl9tYXAgPSBuZXcgV2Vha01hcCgpO1xudmFyIHVuc3VwcG9ydGVkTGF6eVJvdXRlT2JqZWN0S2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcbiAgXCJsYXp5XCIsXG4gIFwiY2FzZVNlbnNpdGl2ZVwiLFxuICBcInBhdGhcIixcbiAgXCJpZFwiLFxuICBcImluZGV4XCIsXG4gIFwiY2hpbGRyZW5cIlxuXSk7XG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkTGF6eVJvdXRlT2JqZWN0S2V5KGtleSkge1xuICByZXR1cm4gdW5zdXBwb3J0ZWRMYXp5Um91dGVPYmplY3RLZXlzLmhhcyhcbiAgICBrZXlcbiAgKTtcbn1cbnZhciB1bnN1cHBvcnRlZExhenlSb3V0ZUZ1bmN0aW9uS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcbiAgXCJsYXp5XCIsXG4gIFwiY2FzZVNlbnNpdGl2ZVwiLFxuICBcInBhdGhcIixcbiAgXCJpZFwiLFxuICBcImluZGV4XCIsXG4gIFwibWlkZGxld2FyZVwiLFxuICBcImNoaWxkcmVuXCJcbl0pO1xuZnVuY3Rpb24gaXNVbnN1cHBvcnRlZExhenlSb3V0ZUZ1bmN0aW9uS2V5KGtleSkge1xuICByZXR1cm4gdW5zdXBwb3J0ZWRMYXp5Um91dGVGdW5jdGlvbktleXMuaGFzKFxuICAgIGtleVxuICApO1xufVxuZnVuY3Rpb24gaXNJbmRleFJvdXRlKHJvdXRlKSB7XG4gIHJldHVybi
25114Byb3V0ZS5pbmRleCA9PT0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMocm91dGVzLCBtYXBSb3V0ZVByb3BlcnRpZXMyLCBwYXJlbnRQYXRoID0gW10sIG1hbmlmZXN0ID0ge30sIGFsbG93SW5QbGFjZU11dGF0aW9ucyA9IGZhbHNlKSB7XG4gIHJldHVybiByb3V0ZXMubWFwKChyb3V0ZSwgaW5kZXgpID0+IHtcbiAgICBsZXQgdHJlZVBhdGggPSBbLi4ucGFyZW50UGF0aCwgU3RyaW5nKGluZGV4KV07XG4gICAgbGV0IGlkID0gdHlwZW9mIHJvdXRlLmlkID09PSBcInN0cmluZ1wiID8gcm91dGUuaWQgOiB0cmVlUGF0aC5qb2luKFwiLVwiKTtcbiAgICBpbnZhcmlhbnQoXG4gICAgICByb3V0ZS5pbmRleCAhPT0gdHJ1ZSB8fCAhcm91dGUuY2hpbGRyZW4sXG4gICAgICBgQ2Fubm90IHNwZWNpZnkgY2hpbGRyZW4gb24gYW4gaW5kZXggcm91dGVgXG4gICAgKTtcbiAgICBpbnZhcmlhbnQoXG4gICAgICBhbGxvd0luUGxhY2VNdXRhdGlvbnMgfHwgIW1hbmlmZXN0W2lkXSxcbiAgICAgIGBGb3VuZCBhIHJvdXRlIGlkIGNvbGxpc2lvbiBvbiBpZCBcIiR7aWR9XCIuICBSb3V0ZSBpZCdzIG11c3QgYmUgZ2xvYmFsbHkgdW5pcXVlIHdpdGhpbiBEYXRhIFJvdXRlciB1c2FnZXNgXG4gICAgKTtcbiAgICBpZiAoaXNJbmRleFJvdXRlKHJvdXRlKSkge1xuICAgICAgbGV0IGluZGV4Um91dGUgPSB7XG4gICAgICAgIC4uLnJvdXRlLFxuICAgICAgICAuLi5tYXBSb3V0ZVByb3BlcnRpZXMyKHJvdXRlKSxcbiAgICAgICAgaWRcbiAgICAgIH07XG4gICAgICBtYW5pZmVzdFtpZF0gPSBpbmRleFJvdXRlO1xuICAgICAgcmV0dXJuIGluZGV4Um91dGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwYXRoT3JMYXlvdXRSb3V0ZSA9IHtcbiAgICAgICAgLi4ucm91dGUsXG4gICAgICAgIC4uLm1hcFJvdXRlUHJvcGVydGllczIocm91dGUpLFxuICAgICAgICBpZCxcbiAgICAgICAgY2hpbGRyZW46IHZvaWQgMFxuICAgICAgfTtcbiAgICAgIG1hbmlmZXN0W2lkXSA9IHBhdGhPckxheW91dFJvdXRlO1xuICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgIHBhdGhPckxheW91dFJvdXRlLmNoaWxkcmVuID0gY29udmVydFJvdXRlc1RvRGF0YVJvdXRlcyhcbiAgICAgICAgICByb3V0ZS5jaGlsZHJlbixcbiAgICAgICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgICAgIHRyZWVQYXRoLFxuICAgICAgICAgIG1hbmlmZXN0LFxuICAgICAgICAgIGFsbG93SW5QbGFjZU11dGF0aW9uc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhPckxheW91dFJvdXRlO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBtYXRjaFJvdXRlcyhyb3V0ZXMsIGxvY2F0aW9uQXJnLCBiYXNlbmFtZSA9IFwiL1wiKSB7XG4gIHJldHVybiBtYXRjaFJvdXRlc0ltcGwocm91dGVzLCBsb2NhdGlvbkFyZywgYmFzZW5hbWUsIGZhbHNlKTtcbn1cbmZ1bmN0aW9uIG1hdGNoUm91dGVzSW1wbChyb3V0ZXMsIGxvY2F0aW9uQXJnLCBiYXNlbmFtZSwgYWxsb3dQYXJ0aWFsKSB7XG4gIGxldCBsb2NhdGlvbiA9IHR5cGVvZiBsb2NhdGlvbkFyZyA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aChsb2NhdGlvbkFyZykgOiBsb2NhdGlvbkFyZztcbiAgbGV0IHBhdGhuYW1lID0gc3RyaXBCYXNlbmFtZShsb2NhdGlvbi5wYXRobmFtZSB8fCBcIi9cIiwgYmFzZW5hbWUpO1xuICBpZiAocGF0aG5hbWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGxldCBicmFuY2hlcyA9IGZsYXR0ZW5Sb3V0ZXMocm91dGVzKTtcbiAgcmFua1JvdXRlQnJhbmNoZXMoYnJhbmNoZXMpO1xuICBsZXQgbWF0Y2hlcyA9IG51bGw7XG4gIGZvciAobGV0IGkgPSAwOyBtYXRjaGVzID09IG51bGwgJiYgaSA8IGJyYW5jaGVzLmxlbmd0aDsgKytpKSB7XG4gICAgbGV0IGRlY29kZWQgPSBkZWNvZGVQYXRoKHBhdGhuYW1lKTtcbiAgICBtYXRjaGVzID0gbWF0Y2hSb3V0ZUJyYW5jaChcbiAgICAgIGJyYW5jaGVzW2ldLFxuICAgICAgZGVjb2RlZCxcbiAgICAgIGFsbG93UGFydGlhbFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXM7XG59XG5mdW5jdGlvbiBjb252ZXJ0Um91dGVNYXRjaFRvVWlNYXRjaChtYXRjaCwgbG9hZGVyRGF0YSkge1xuICBsZXQgeyByb3V0ZSwgcGF0aG5hbWUsIHBhcmFtcyB9ID0gbWF0Y2g7XG4gIHJldHVybiB7XG4gICAgaWQ6IHJvdXRlLmlkLFxuICAgIHBhdGhuYW1lLFxuICAgIHBhcmFtcyxcbiAgICBkYXRhOiBsb2FkZXJEYXRhW3JvdXRlLmlkXSxcbiAgICBsb2FkZXJEYXRhOiBsb2FkZXJEYXRhW3JvdXRlLmlkXSxcbiAgICBoYW5kbGU6IHJvdXRlLmhhbmRsZVxuICB9O1xufVxuZnVuY3Rpb24gZmxhdHRlblJvdXRlcyhyb3V0ZXMsIGJyYW5jaGVzID0gW10sIHBhcmVudHNNZXRhID0gW10sIHBhcmVudFBhdGggPSBcIlwiLCBfaGFzUGFyZW50T3B0aW9uYWxTZWdtZW50cyA9IGZhbHNlKSB7XG4gIGxldCBmbGF0dGVuUm91dGUgPSAocm91dGUsIGluZGV4LCBoYXNQYXJlbnRPcHRpb25hbFNlZ21lbnRzID0gX2hhc1BhcmVudE9wdGlvbmFsU2VnbWVudHMsIHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgIGxldCBtZXRhID0ge1xuICAgICAgcmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGggPT09IHZvaWQgMCA/IHJvdXRlLnBhdGggfHwgXCJcIiA6IHJlbGF0aXZlUGF0aCxcbiAgICAgIGNhc2VTZW5zaXRpdmU6IHJvdXRlLmNhc2VTZW5zaXRpdmUgPT09IHRydWUsXG4gICAgICBjaGlsZHJlbkluZGV4OiBpbmRleCxcbiAgICAgIHJvdXRlXG4gICAgfTtcbiAgICBpZiAobWV0YS5yZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgIGlmICghbWV0YS5yZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChwYXJlbnRQYXRoKSAmJiBoYXNQYXJlbnRPcHRpb25hbFNlZ21lbnRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGludmFyaWFudChcbiAgICAgICAgbWV0YS5yZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChwYXJlbnRQYXRoKSxcbiAgICAgICAgYEFic29sdXRlIHJvdXRlIHBhdGggXCIke21ldGEucmVsYXRpdmVQYXRofVwiIG5lc3RlZCB1bmRlciBwYXRoIFwiJHtwYXJlbnRQYXRofVwiIGlzIG5vdCB2YWxpZC4gQW4gYWJzb2x1dGUgY2hpbGQgcm91dGUgcGF0aCBtdXN0IHN0YXJ0IHdpdGggdGhlIGNvbWJpbmVkIHBhdGggb2YgYWxsIGl0cyBwYXJlbnQgcm91dGVzLmBcbiAgICAgICk7XG4gICAgICBtZXRhLnJlbGF0aXZlUGF0aCA9IG1ldGEucmVsYXRpdmVQYXRoLnNsaWNlKHBhcmVudFBhdGgubGVuZ3RoKTtcbiAgICB9XG4gICAgbGV0IHBhdGggPSBqb2luUGF0aHMoW3BhcmVudFBhdGgsIG1ldGEucmVsYXRpdmVQYXRoXSk7XG4gICAgbGV0IHJvdXRlc01ldGEgPSBwYXJlbnRzTWV0YS5jb25jYXQobWV0YSk7XG4gICAgaWYgKHJvdXRlLmNoaWxkcmVuICYmIHJvdXRlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGludmFyaWFudChcbiAgICAgICAgLy8gT3VyIHR5cGVzIGtub3cgYmV0dGVyLCBidXQgcnVudGltZSBKUyBtYXkgbm90IVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgI
25114HJvdXRlLmluZGV4ICE9PSB0cnVlLFxuICAgICAgICBgSW5kZXggcm91dGVzIG11c3Qgbm90IGhhdmUgY2hpbGQgcm91dGVzLiBQbGVhc2UgcmVtb3ZlIGFsbCBjaGlsZCByb3V0ZXMgZnJvbSByb3V0ZSBwYXRoIFwiJHtwYXRofVwiLmBcbiAgICAgICk7XG4gICAgICBmbGF0dGVuUm91dGVzKFxuICAgICAgICByb3V0ZS5jaGlsZHJlbixcbiAgICAgICAgYnJhbmNoZXMsXG4gICAgICAgIHJvdXRlc01ldGEsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGhhc1BhcmVudE9wdGlvbmFsU2VnbWVudHNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChyb3V0ZS5wYXRoID09IG51bGwgJiYgIXJvdXRlLmluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGJyYW5jaGVzLnB1c2goe1xuICAgICAgcGF0aCxcbiAgICAgIHNjb3JlOiBjb21wdXRlU2NvcmUocGF0aCwgcm91dGUuaW5kZXgpLFxuICAgICAgcm91dGVzTWV0YVxuICAgIH0pO1xuICB9O1xuICByb3V0ZXMuZm9yRWFjaCgocm91dGUsIGluZGV4KSA9PiB7XG4gICAgaWYgKHJvdXRlLnBhdGggPT09IFwiXCIgfHwgIXJvdXRlLnBhdGg/LmluY2x1ZGVzKFwiP1wiKSkge1xuICAgICAgZmxhdHRlblJvdXRlKHJvdXRlLCBpbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGV4cGxvZGVkIG9mIGV4cGxvZGVPcHRpb25hbFNlZ21lbnRzKHJvdXRlLnBhdGgpKSB7XG4gICAgICAgIGZsYXR0ZW5Sb3V0ZShyb3V0ZSwgaW5kZXgsIHRydWUsIGV4cGxvZGVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gYnJhbmNoZXM7XG59XG5mdW5jdGlvbiBleHBsb2RlT3B0aW9uYWxTZWdtZW50cyhwYXRoKSB7XG4gIGxldCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGxldCBbZmlyc3QsIC4uLnJlc3RdID0gc2VnbWVudHM7XG4gIGxldCBpc09wdGlvbmFsID0gZmlyc3QuZW5kc1dpdGgoXCI/XCIpO1xuICBsZXQgcmVxdWlyZWQgPSBmaXJzdC5yZXBsYWNlKC9cXD8kLywgXCJcIik7XG4gIGlmIChyZXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBpc09wdGlvbmFsID8gW3JlcXVpcmVkLCBcIlwiXSA6IFtyZXF1aXJlZF07XG4gIH1cbiAgbGV0IHJlc3RFeHBsb2RlZCA9IGV4cGxvZGVPcHRpb25hbFNlZ21lbnRzKHJlc3Quam9pbihcIi9cIikpO1xuICBsZXQgcmVzdWx0ID0gW107XG4gIHJlc3VsdC5wdXNoKFxuICAgIC4uLnJlc3RFeHBsb2RlZC5tYXAoXG4gICAgICAoc3VicGF0aCkgPT4gc3VicGF0aCA9PT0gXCJcIiA/IHJlcXVpcmVkIDogW3JlcXVpcmVkLCBzdWJwYXRoXS5qb2luKFwiL1wiKVxuICAgIClcbiAgKTtcbiAgaWYgKGlzT3B0aW9uYWwpIHtcbiAgICByZXN1bHQucHVzaCguLi5yZXN0RXhwbG9kZWQpO1xuICB9XG4gIHJldHVybiByZXN1bHQubWFwKFxuICAgIChleHBsb2RlZCkgPT4gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSAmJiBleHBsb2RlZCA9PT0gXCJcIiA/IFwiL1wiIDogZXhwbG9kZWRcbiAgKTtcbn1cbmZ1bmN0aW9uIHJhbmtSb3V0ZUJyYW5jaGVzKGJyYW5jaGVzKSB7XG4gIGJyYW5jaGVzLnNvcnQoXG4gICAgKGEsIGIpID0+IGEuc2NvcmUgIT09IGIuc2NvcmUgPyBiLnNjb3JlIC0gYS5zY29yZSA6IGNvbXBhcmVJbmRleGVzKFxuICAgICAgYS5yb3V0ZXNNZXRhLm1hcCgobWV0YSkgPT4gbWV0YS5jaGlsZHJlbkluZGV4KSxcbiAgICAgIGIucm91dGVzTWV0YS5tYXAoKG1ldGEpID0+IG1ldGEuY2hpbGRyZW5JbmRleClcbiAgICApXG4gICk7XG59XG52YXIgcGFyYW1SZSA9IC9eOltcXHctXSskLztcbnZhciBkeW5hbWljU2VnbWVudFZhbHVlID0gMztcbnZhciBpbmRleFJvdXRlVmFsdWUgPSAyO1xudmFyIGVtcHR5U2VnbWVudFZhbHVlID0gMTtcbnZhciBzdGF0aWNTZWdtZW50VmFsdWUgPSAxMDtcbnZhciBzcGxhdFBlbmFsdHkgPSAtMjtcbnZhciBpc1NwbGF0ID0gKHMpID0+IHMgPT09IFwiKlwiO1xuZnVuY3Rpb24gY29tcHV0ZVNjb3JlKHBhdGgsIGluZGV4KSB7XG4gIGxldCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICBsZXQgaW5pdGlhbFNjb3JlID0gc2VnbWVudHMubGVuZ3RoO1xuICBpZiAoc2VnbWVudHMuc29tZShpc1NwbGF0KSkge1xuICAgIGluaXRpYWxTY29yZSArPSBzcGxhdFBlbmFsdHk7XG4gIH1cbiAgaWYgKGluZGV4KSB7XG4gICAgaW5pdGlhbFNjb3JlICs9IGluZGV4Um91dGVWYWx1ZTtcbiAgfVxuICByZXR1cm4gc2VnbWVudHMuZmlsdGVyKChzKSA9PiAhaXNTcGxhdChzKSkucmVkdWNlKFxuICAgIChzY29yZSwgc2VnbWVudCkgPT4gc2NvcmUgKyAocGFyYW1SZS50ZXN0KHNlZ21lbnQpID8gZHluYW1pY1NlZ21lbnRWYWx1ZSA6IHNlZ21lbnQgPT09IFwiXCIgPyBlbXB0eVNlZ21lbnRWYWx1ZSA6IHN0YXRpY1NlZ21lbnRWYWx1ZSksXG4gICAgaW5pdGlhbFNjb3JlXG4gICk7XG59XG5mdW5jdGlvbiBjb21wYXJlSW5kZXhlcyhhLCBiKSB7XG4gIGxldCBzaWJsaW5ncyA9IGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLnNsaWNlKDAsIC0xKS5ldmVyeSgobiwgaSkgPT4gbiA9PT0gYltpXSk7XG4gIHJldHVybiBzaWJsaW5ncyA/IChcbiAgICAvLyBJZiB0d28gcm91dGVzIGFyZSBzaWJsaW5ncywgd2Ugc2hvdWxkIHRyeSB0byBtYXRjaCB0aGUgZWFybGllciBzaWJsaW5nXG4gICAgLy8gZmlyc3QuIFRoaXMgYWxsb3dzIHBlb3BsZSB0byBoYXZlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIG1hdGNoaW5nXG4gICAgLy8gYmVoYXZpb3IgYnkgc2ltcGx5IHB1dHRpbmcgcm91dGVzIHdpdGggaWRlbnRpY2FsIHBhdGhzIGluIHRoZSBvcmRlciB0aGV5XG4gICAgLy8gd2FudCB0aGVtIHRyaWVkLlxuICAgIGFbYS5sZW5ndGggLSAxXSAtIGJbYi5sZW5ndGggLSAxXVxuICApIDogKFxuICAgIC8vIE90aGVyd2lzZSwgaXQgZG9lc24ndCByZWFsbHkgbWFrZSBzZW5zZSB0byByYW5rIG5vbi1zaWJsaW5ncyBieSBpbmRleCxcbiAgICAvLyBzbyB0aGV5IHNvcnQgZXF1YWxseS5cbiAgICAwXG4gICk7XG59XG5mdW5jdGlvbiBtYXRjaFJvdXRlQnJhbmNoKGJyYW5jaCwgcGF0aG5hbWUsIGFsbG93UGFydGlhbCA9IGZ
25114hbHNlKSB7XG4gIGxldCB7IHJvdXRlc01ldGEgfSA9IGJyYW5jaDtcbiAgbGV0IG1hdGNoZWRQYXJhbXMgPSB7fTtcbiAgbGV0IG1hdGNoZWRQYXRobmFtZSA9IFwiL1wiO1xuICBsZXQgbWF0Y2hlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRlc01ldGEubGVuZ3RoOyArK2kpIHtcbiAgICBsZXQgbWV0YSA9IHJvdXRlc01ldGFbaV07XG4gICAgbGV0IGVuZCA9IGkgPT09IHJvdXRlc01ldGEubGVuZ3RoIC0gMTtcbiAgICBsZXQgcmVtYWluaW5nUGF0aG5hbWUgPSBtYXRjaGVkUGF0aG5hbWUgPT09IFwiL1wiID8gcGF0aG5hbWUgOiBwYXRobmFtZS5zbGljZShtYXRjaGVkUGF0aG5hbWUubGVuZ3RoKSB8fCBcIi9cIjtcbiAgICBsZXQgbWF0Y2ggPSBtYXRjaFBhdGgoXG4gICAgICB7IHBhdGg6IG1ldGEucmVsYXRpdmVQYXRoLCBjYXNlU2Vuc2l0aXZlOiBtZXRhLmNhc2VTZW5zaXRpdmUsIGVuZCB9LFxuICAgICAgcmVtYWluaW5nUGF0aG5hbWVcbiAgICApO1xuICAgIGxldCByb3V0ZSA9IG1ldGEucm91dGU7XG4gICAgaWYgKCFtYXRjaCAmJiBlbmQgJiYgYWxsb3dQYXJ0aWFsICYmICFyb3V0ZXNNZXRhW3JvdXRlc01ldGEubGVuZ3RoIC0gMV0ucm91dGUuaW5kZXgpIHtcbiAgICAgIG1hdGNoID0gbWF0Y2hQYXRoKFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogbWV0YS5yZWxhdGl2ZVBhdGgsXG4gICAgICAgICAgY2FzZVNlbnNpdGl2ZTogbWV0YS5jYXNlU2Vuc2l0aXZlLFxuICAgICAgICAgIGVuZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgcmVtYWluaW5nUGF0aG5hbWVcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKG1hdGNoZWRQYXJhbXMsIG1hdGNoLnBhcmFtcyk7XG4gICAgbWF0Y2hlcy5wdXNoKHtcbiAgICAgIC8vIFRPRE86IENhbiB0aGlzIGFzIGJlIGF2b2lkZWQ/XG4gICAgICBwYXJhbXM6IG1hdGNoZWRQYXJhbXMsXG4gICAgICBwYXRobmFtZTogam9pblBhdGhzKFttYXRjaGVkUGF0aG5hbWUsIG1hdGNoLnBhdGhuYW1lXSksXG4gICAgICBwYXRobmFtZUJhc2U6IG5vcm1hbGl6ZVBhdGhuYW1lKFxuICAgICAgICBqb2luUGF0aHMoW21hdGNoZWRQYXRobmFtZSwgbWF0Y2gucGF0aG5hbWVCYXNlXSlcbiAgICAgICksXG4gICAgICByb3V0ZVxuICAgIH0pO1xuICAgIGlmIChtYXRjaC5wYXRobmFtZUJhc2UgIT09IFwiL1wiKSB7XG4gICAgICBtYXRjaGVkUGF0aG5hbWUgPSBqb2luUGF0aHMoW21hdGNoZWRQYXRobmFtZSwgbWF0Y2gucGF0aG5hbWVCYXNlXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRjaGVzO1xufVxuZnVuY3Rpb24gZ2VuZXJhdGVQYXRoKG9yaWdpbmFsUGF0aCwgcGFyYW1zID0ge30pIHtcbiAgbGV0IHBhdGggPSBvcmlnaW5hbFBhdGg7XG4gIGlmIChwYXRoLmVuZHNXaXRoKFwiKlwiKSAmJiBwYXRoICE9PSBcIipcIiAmJiAhcGF0aC5lbmRzV2l0aChcIi8qXCIpKSB7XG4gICAgd2FybmluZyhcbiAgICAgIGZhbHNlLFxuICAgICAgYFJvdXRlIHBhdGggXCIke3BhdGh9XCIgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgXCIke3BhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIil9XCIgYmVjYXVzZSB0aGUgXFxgKlxcYCBjaGFyYWN0ZXIgbXVzdCBhbHdheXMgZm9sbG93IGEgXFxgL1xcYCBpbiB0aGUgcGF0dGVybi4gVG8gZ2V0IHJpZCBvZiB0aGlzIHdhcm5pbmcsIHBsZWFzZSBjaGFuZ2UgdGhlIHJvdXRlIHBhdGggdG8gXCIke3BhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIil9XCIuYFxuICAgICk7XG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIik7XG4gIH1cbiAgY29uc3QgcHJlZml4ID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IFwiL1wiIDogXCJcIjtcbiAgY29uc3Qgc3RyaW5naWZ5MiA9IChwKSA9PiBwID09IG51bGwgPyBcIlwiIDogdHlwZW9mIHAgPT09IFwic3RyaW5nXCIgPyBwIDogU3RyaW5nKHApO1xuICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoL1xcLysvKS5tYXAoKHNlZ21lbnQsIGluZGV4LCBhcnJheSkgPT4ge1xuICAgIGNvbnN0IGlzTGFzdFNlZ21lbnQgPSBpbmRleCA9PT0gYXJyYXkubGVuZ3RoIC0gMTtcbiAgICBpZiAoaXNMYXN0U2VnbWVudCAmJiBzZWdtZW50ID09PSBcIipcIikge1xuICAgICAgY29uc3Qgc3RhciA9IFwiKlwiO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmeTIocGFyYW1zW3N0YXJdKTtcbiAgICB9XG4gICAgY29uc3Qga2V5TWF0Y2ggPSBzZWdtZW50Lm1hdGNoKC9eOihbXFx3LV0rKShcXD8/KSQvKTtcbiAgICBpZiAoa2V5TWF0Y2gpIHtcbiAgICAgIGNvbnN0IFssIGtleSwgb3B0aW9uYWxdID0ga2V5TWF0Y2g7XG4gICAgICBsZXQgcGFyYW0gPSBwYXJhbXNba2V5XTtcbiAgICAgIGludmFyaWFudChvcHRpb25hbCA9PT0gXCI/XCIgfHwgcGFyYW0gIT0gbnVsbCwgYE1pc3NpbmcgXCI6JHtrZXl9XCIgcGFyYW1gKTtcbiAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5MihwYXJhbSkpO1xuICAgIH1cbiAgICByZXR1cm4gc2VnbWVudC5yZXBsYWNlKC9cXD8kL2csIFwiXCIpO1xuICB9KS5maWx0ZXIoKHNlZ21lbnQpID0+ICEhc2VnbWVudCk7XG4gIHJldHVybiBwcmVmaXggKyBzZWdtZW50cy5qb2luKFwiL1wiKTtcbn1cbmZ1bmN0aW9uIG1hdGNoUGF0aChwYXR0ZXJuLCBwYXRobmFtZSkge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09IFwic3RyaW5nXCIpIHtcbiAgICBwYXR0ZXJuID0geyBwYXRoOiBwYXR0ZXJuLCBjYXNlU2Vuc2l0aXZlOiBmYWxzZSwgZW5kOiB0cnVlIH07XG4gIH1cbiAgbGV0IFttYXRjaGVyLCBjb21waWxlZFBhcmFtc10gPSBjb21waWxlUGF0aChcbiAgICBwYXR0ZXJuLnBhdGgsXG4gICAgcGF0dGVybi5jYXNlU2Vuc2l0aXZlLFxuICAgIHBhdHRlcm4uZW5kXG4gICk7XG4gIGxldCBtYXRjaCA9IHBhdGhuYW1lLm1hdGNoKG1hdGNoZXIpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgbGV0IG1hdGNoZWRQYXRobmFtZSA9IG1hdGNoWzBdO1xuICBsZXQgcGF0aG5hbWVCYXNlID0gbWF0Y2hlZFBhdGhuYW1lLnJlcGxhY2UoLyguKVxcLyskLywgXCIkMVwiKTtcbiAgbGV0IGNhcHR1cmVHcm91cHMgPSBtYXRjaC5zbGljZSgxKTtcbiAgbGV0IHBhcmFtcyA9IGNvbXBpbGVkUGFyYW1zLnJlZHVjZShcbiAgICAobWVtbzIsIHsgcGFyYW1OYW1lLCBpc09wdGlvbmFsIH0sIGluZGV4KSA9PiB7XG4gICAgICBpZiAocGFyYW1OYW1lID09PSBcIipcIikge1xuICAgICAgICBsZXQgc3BsYXRWYWx1ZSA9IGNhcHR1cmVHcm91cHNbaW5kZXhdIHx8IFwiXCI7XG4gICAgICAgI
25114HBhdGhuYW1lQmFzZSA9IG1hdGNoZWRQYXRobmFtZS5zbGljZSgwLCBtYXRjaGVkUGF0aG5hbWUubGVuZ3RoIC0gc3BsYXRWYWx1ZS5sZW5ndGgpLnJlcGxhY2UoLyguKVxcLyskLywgXCIkMVwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gY2FwdHVyZUdyb3Vwc1tpbmRleF07XG4gICAgICBpZiAoaXNPcHRpb25hbCAmJiAhdmFsdWUpIHtcbiAgICAgICAgbWVtbzJbcGFyYW1OYW1lXSA9IHZvaWQgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbW8yW3BhcmFtTmFtZV0gPSAodmFsdWUgfHwgXCJcIikucmVwbGFjZSgvJTJGL2csIFwiL1wiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZW1vMjtcbiAgICB9LFxuICAgIHt9XG4gICk7XG4gIHJldHVybiB7XG4gICAgcGFyYW1zLFxuICAgIHBhdGhuYW1lOiBtYXRjaGVkUGF0aG5hbWUsXG4gICAgcGF0aG5hbWVCYXNlLFxuICAgIHBhdHRlcm5cbiAgfTtcbn1cbmZ1bmN0aW9uIGNvbXBpbGVQYXRoKHBhdGgsIGNhc2VTZW5zaXRpdmUgPSBmYWxzZSwgZW5kID0gdHJ1ZSkge1xuICB3YXJuaW5nKFxuICAgIHBhdGggPT09IFwiKlwiIHx8ICFwYXRoLmVuZHNXaXRoKFwiKlwiKSB8fCBwYXRoLmVuZHNXaXRoKFwiLypcIiksXG4gICAgYFJvdXRlIHBhdGggXCIke3BhdGh9XCIgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgXCIke3BhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIil9XCIgYmVjYXVzZSB0aGUgXFxgKlxcYCBjaGFyYWN0ZXIgbXVzdCBhbHdheXMgZm9sbG93IGEgXFxgL1xcYCBpbiB0aGUgcGF0dGVybi4gVG8gZ2V0IHJpZCBvZiB0aGlzIHdhcm5pbmcsIHBsZWFzZSBjaGFuZ2UgdGhlIHJvdXRlIHBhdGggdG8gXCIke3BhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIil9XCIuYFxuICApO1xuICBsZXQgcGFyYW1zID0gW107XG4gIGxldCByZWdleHBTb3VyY2UgPSBcIl5cIiArIHBhdGgucmVwbGFjZSgvXFwvKlxcKj8kLywgXCJcIikucmVwbGFjZSgvXlxcLyovLCBcIi9cIikucmVwbGFjZSgvW1xcXFwuKiteJHt9fCgpW1xcXV0vZywgXCJcXFxcJCZcIikucmVwbGFjZShcbiAgICAvXFwvOihbXFx3LV0rKShcXD8pPy9nLFxuICAgIChfLCBwYXJhbU5hbWUsIGlzT3B0aW9uYWwpID0+IHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgcGFyYW1OYW1lLCBpc09wdGlvbmFsOiBpc09wdGlvbmFsICE9IG51bGwgfSk7XG4gICAgICByZXR1cm4gaXNPcHRpb25hbCA/IFwiLz8oW15cXFxcL10rKT9cIiA6IFwiLyhbXlxcXFwvXSspXCI7XG4gICAgfVxuICApLnJlcGxhY2UoL1xcLyhbXFx3LV0rKVxcPyhcXC98JCkvZywgXCIoLyQxKT8kMlwiKTtcbiAgaWYgKHBhdGguZW5kc1dpdGgoXCIqXCIpKSB7XG4gICAgcGFyYW1zLnB1c2goeyBwYXJhbU5hbWU6IFwiKlwiIH0pO1xuICAgIHJlZ2V4cFNvdXJjZSArPSBwYXRoID09PSBcIipcIiB8fCBwYXRoID09PSBcIi8qXCIgPyBcIiguKikkXCIgOiBcIig/OlxcXFwvKC4rKXxcXFxcLyopJFwiO1xuICB9IGVsc2UgaWYgKGVuZCkge1xuICAgIHJlZ2V4cFNvdXJjZSArPSBcIlxcXFwvKiRcIjtcbiAgfSBlbHNlIGlmIChwYXRoICE9PSBcIlwiICYmIHBhdGggIT09IFwiL1wiKSB7XG4gICAgcmVnZXhwU291cmNlICs9IFwiKD86KD89XFxcXC98JCkpXCI7XG4gIH0gZWxzZSB7XG4gIH1cbiAgbGV0IG1hdGNoZXIgPSBuZXcgUmVnRXhwKHJlZ2V4cFNvdXJjZSwgY2FzZVNlbnNpdGl2ZSA/IHZvaWQgMCA6IFwiaVwiKTtcbiAgcmV0dXJuIFttYXRjaGVyLCBwYXJhbXNdO1xufVxuZnVuY3Rpb24gZGVjb2RlUGF0aCh2YWx1ZSkge1xuICB0cnkge1xuICAgIHJldHVybiB2YWx1ZS5zcGxpdChcIi9cIikubWFwKCh2KSA9PiBkZWNvZGVVUklDb21wb25lbnQodikucmVwbGFjZSgvXFwvL2csIFwiJTJGXCIpKS5qb2luKFwiL1wiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB3YXJuaW5nKFxuICAgICAgZmFsc2UsXG4gICAgICBgVGhlIFVSTCBwYXRoIFwiJHt2YWx1ZX1cIiBjb3VsZCBub3QgYmUgZGVjb2RlZCBiZWNhdXNlIGl0IGlzIGEgbWFsZm9ybWVkIFVSTCBzZWdtZW50LiBUaGlzIGlzIHByb2JhYmx5IGR1ZSB0byBhIGJhZCBwZXJjZW50IGVuY29kaW5nICgke2Vycm9yfSkuYFxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBzdHJpcEJhc2VuYW1lKHBhdGhuYW1lLCBiYXNlbmFtZSkge1xuICBpZiAoYmFzZW5hbWUgPT09IFwiL1wiKSByZXR1cm4gcGF0aG5hbWU7XG4gIGlmICghcGF0aG5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGJhc2VuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgbGV0IHN0YXJ0SW5kZXggPSBiYXNlbmFtZS5lbmRzV2l0aChcIi9cIikgPyBiYXNlbmFtZS5sZW5ndGggLSAxIDogYmFzZW5hbWUubGVuZ3RoO1xuICBsZXQgbmV4dENoYXIgPSBwYXRobmFtZS5jaGFyQXQoc3RhcnRJbmRleCk7XG4gIGlmIChuZXh0Q2hhciAmJiBuZXh0Q2hhciAhPT0gXCIvXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gcGF0aG5hbWUuc2xpY2Uoc3RhcnRJbmRleCkgfHwgXCIvXCI7XG59XG5mdW5jdGlvbiBwcmVwZW5kQmFzZW5hbWUoe1xuICBiYXNlbmFtZSxcbiAgcGF0aG5hbWVcbn0pIHtcbiAgcmV0dXJuIHBhdGhuYW1lID09PSBcIi9cIiA/IGJhc2VuYW1lIDogam9pblBhdGhzKFtiYXNlbmFtZSwgcGF0aG5hbWVdKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVQYXRoKHRvLCBmcm9tUGF0aG5hbWUgPSBcIi9cIikge1xuICBsZXQge1xuICAgIHBhdGhuYW1lOiB0b1BhdGhuYW1lLFxuICAgIHNlYXJjaCA9IFwiXCIsXG4gICAgaGFzaCA9IFwiXCJcbiAgfSA9IHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aCh0bykgOiB0bztcbiAgbGV0IHBhdGhuYW1lID0gdG9QYXRobmFtZSA/IHRvUGF0aG5hbWUuc3RhcnRzV2l0aChcIi9cIikgPyB0b1BhdGhuYW1lIDogcmVzb2x2ZVBhdGhuYW1lKHRvUGF0aG5hbWUsIGZyb21QYXRobmFtZSkgOiBmcm9tUGF0aG5hbWU7XG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWUsXG4gICAgc2VhcmNoOiBub3JtYWxpemVTZWFyY2goc2VhcmNoKSxcbiAgICBoYXNoOiBub3JtYWxpem
25114VIYXNoKGhhc2gpXG4gIH07XG59XG5mdW5jdGlvbiByZXNvbHZlUGF0aG5hbWUocmVsYXRpdmVQYXRoLCBmcm9tUGF0aG5hbWUpIHtcbiAgbGV0IHNlZ21lbnRzID0gZnJvbVBhdGhuYW1lLnJlcGxhY2UoL1xcLyskLywgXCJcIikuc3BsaXQoXCIvXCIpO1xuICBsZXQgcmVsYXRpdmVTZWdtZW50cyA9IHJlbGF0aXZlUGF0aC5zcGxpdChcIi9cIik7XG4gIHJlbGF0aXZlU2VnbWVudHMuZm9yRWFjaCgoc2VnbWVudCkgPT4ge1xuICAgIGlmIChzZWdtZW50ID09PSBcIi4uXCIpIHtcbiAgICAgIGlmIChzZWdtZW50cy5sZW5ndGggPiAxKSBzZWdtZW50cy5wb3AoKTtcbiAgICB9IGVsc2UgaWYgKHNlZ21lbnQgIT09IFwiLlwiKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzZWdtZW50cy5sZW5ndGggPiAxID8gc2VnbWVudHMuam9pbihcIi9cIikgOiBcIi9cIjtcbn1cbmZ1bmN0aW9uIGdldEludmFsaWRQYXRoRXJyb3IoY2hhciwgZmllbGQsIGRlc3QsIHBhdGgpIHtcbiAgcmV0dXJuIGBDYW5ub3QgaW5jbHVkZSBhICcke2NoYXJ9JyBjaGFyYWN0ZXIgaW4gYSBtYW51YWxseSBzcGVjaWZpZWQgXFxgdG8uJHtmaWVsZH1cXGAgZmllbGQgWyR7SlNPTi5zdHJpbmdpZnkoXG4gICAgcGF0aFxuICApfV0uICBQbGVhc2Ugc2VwYXJhdGUgaXQgb3V0IHRvIHRoZSBcXGB0by4ke2Rlc3R9XFxgIGZpZWxkLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgcHJvdmlkZSB0aGUgZnVsbCBwYXRoIGFzIGEgc3RyaW5nIGluIDxMaW5rIHRvPVwiLi4uXCI+IGFuZCB0aGUgcm91dGVyIHdpbGwgcGFyc2UgaXQgZm9yIHlvdS5gO1xufVxuZnVuY3Rpb24gZ2V0UGF0aENvbnRyaWJ1dGluZ01hdGNoZXMobWF0Y2hlcykge1xuICByZXR1cm4gbWF0Y2hlcy5maWx0ZXIoXG4gICAgKG1hdGNoLCBpbmRleCkgPT4gaW5kZXggPT09IDAgfHwgbWF0Y2gucm91dGUucGF0aCAmJiBtYXRjaC5yb3V0ZS5wYXRoLmxlbmd0aCA+IDBcbiAgKTtcbn1cbmZ1bmN0aW9uIGdldFJlc29sdmVUb01hdGNoZXMobWF0Y2hlcykge1xuICBsZXQgcGF0aE1hdGNoZXMgPSBnZXRQYXRoQ29udHJpYnV0aW5nTWF0Y2hlcyhtYXRjaGVzKTtcbiAgcmV0dXJuIHBhdGhNYXRjaGVzLm1hcChcbiAgICAobWF0Y2gsIGlkeCkgPT4gaWR4ID09PSBwYXRoTWF0Y2hlcy5sZW5ndGggLSAxID8gbWF0Y2gucGF0aG5hbWUgOiBtYXRjaC5wYXRobmFtZUJhc2VcbiAgKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVUbyh0b0FyZywgcm91dGVQYXRobmFtZXMsIGxvY2F0aW9uUGF0aG5hbWUsIGlzUGF0aFJlbGF0aXZlID0gZmFsc2UpIHtcbiAgbGV0IHRvO1xuICBpZiAodHlwZW9mIHRvQXJnID09PSBcInN0cmluZ1wiKSB7XG4gICAgdG8gPSBwYXJzZVBhdGgodG9BcmcpO1xuICB9IGVsc2Uge1xuICAgIHRvID0geyAuLi50b0FyZyB9O1xuICAgIGludmFyaWFudChcbiAgICAgICF0by5wYXRobmFtZSB8fCAhdG8ucGF0aG5hbWUuaW5jbHVkZXMoXCI/XCIpLFxuICAgICAgZ2V0SW52YWxpZFBhdGhFcnJvcihcIj9cIiwgXCJwYXRobmFtZVwiLCBcInNlYXJjaFwiLCB0bylcbiAgICApO1xuICAgIGludmFyaWFudChcbiAgICAgICF0by5wYXRobmFtZSB8fCAhdG8ucGF0aG5hbWUuaW5jbHVkZXMoXCIjXCIpLFxuICAgICAgZ2V0SW52YWxpZFBhdGhFcnJvcihcIiNcIiwgXCJwYXRobmFtZVwiLCBcImhhc2hcIiwgdG8pXG4gICAgKTtcbiAgICBpbnZhcmlhbnQoXG4gICAgICAhdG8uc2VhcmNoIHx8ICF0by5zZWFyY2guaW5jbHVkZXMoXCIjXCIpLFxuICAgICAgZ2V0SW52YWxpZFBhdGhFcnJvcihcIiNcIiwgXCJzZWFyY2hcIiwgXCJoYXNoXCIsIHRvKVxuICAgICk7XG4gIH1cbiAgbGV0IGlzRW1wdHlQYXRoID0gdG9BcmcgPT09IFwiXCIgfHwgdG8ucGF0aG5hbWUgPT09IFwiXCI7XG4gIGxldCB0b1BhdGhuYW1lID0gaXNFbXB0eVBhdGggPyBcIi9cIiA6IHRvLnBhdGhuYW1lO1xuICBsZXQgZnJvbTtcbiAgaWYgKHRvUGF0aG5hbWUgPT0gbnVsbCkge1xuICAgIGZyb20gPSBsb2NhdGlvblBhdGhuYW1lO1xuICB9IGVsc2Uge1xuICAgIGxldCByb3V0ZVBhdGhuYW1lSW5kZXggPSByb3V0ZVBhdGhuYW1lcy5sZW5ndGggLSAxO1xuICAgIGlmICghaXNQYXRoUmVsYXRpdmUgJiYgdG9QYXRobmFtZS5zdGFydHNXaXRoKFwiLi5cIikpIHtcbiAgICAgIGxldCB0b1NlZ21lbnRzID0gdG9QYXRobmFtZS5zcGxpdChcIi9cIik7XG4gICAgICB3aGlsZSAodG9TZWdtZW50c1swXSA9PT0gXCIuLlwiKSB7XG4gICAgICAgIHRvU2VnbWVudHMuc2hpZnQoKTtcbiAgICAgICAgcm91dGVQYXRobmFtZUluZGV4IC09IDE7XG4gICAgICB9XG4gICAgICB0by5wYXRobmFtZSA9IHRvU2VnbWVudHMuam9pbihcIi9cIik7XG4gICAgfVxuICAgIGZyb20gPSByb3V0ZVBhdGhuYW1lSW5kZXggPj0gMCA/IHJvdXRlUGF0aG5hbWVzW3JvdXRlUGF0aG5hbWVJbmRleF0gOiBcIi9cIjtcbiAgfVxuICBsZXQgcGF0aCA9IHJlc29sdmVQYXRoKHRvLCBmcm9tKTtcbiAgbGV0IGhhc0V4cGxpY2l0VHJhaWxpbmdTbGFzaCA9IHRvUGF0aG5hbWUgJiYgdG9QYXRobmFtZSAhPT0gXCIvXCIgJiYgdG9QYXRobmFtZS5lbmRzV2l0aChcIi9cIik7XG4gIGxldCBoYXNDdXJyZW50VHJhaWxpbmdTbGFzaCA9IChpc0VtcHR5UGF0aCB8fCB0b1BhdGhuYW1lID09PSBcIi5cIikgJiYgbG9jYXRpb25QYXRobmFtZS5lbmRzV2l0aChcIi9cIik7XG4gIGlmICghcGF0aC5wYXRobmFtZS5lbmRzV2l0aChcIi9cIikgJiYgKGhhc0V4cGxpY2l0VHJhaWxpbmdTbGFzaCB8fCBoYXNDdXJyZW50VHJhaWxpbmdTbGFzaCkpIHtcbiAgICBwYXRoLnBhdGhuYW1lICs9IFwiL1wiO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxudmFyIGpvaW5QYXRocyA9IChwYXRocykgPT4gcGF0aHMuam9pbihcIi9cIikucmVwbGFjZSgvXFwvXFwvKy9nLCBcIi9cIik7XG52YXIgbm9ybWFsaXplUGF0aG5hbWUgPSAocGF0aG5hbWUpID0+IHBhdGhuYW1lLnJlcGxhY2UoL1xcLyskLywgXCJcIikucmVwbGFjZSgvXlxcLyovLCBcIi9cIik7XG52YXIgbm9ybWFsaXplU2VhcmNoID0gKHNlYXJjaCkgPT4gIXNlYXJjaCB8fCBzZWFyY2ggPT
2511409IFwiP1wiID8gXCJcIiA6IHNlYXJjaC5zdGFydHNXaXRoKFwiP1wiKSA/IHNlYXJjaCA6IFwiP1wiICsgc2VhcmNoO1xudmFyIG5vcm1hbGl6ZUhhc2ggPSAoaGFzaCkgPT4gIWhhc2ggfHwgaGFzaCA9PT0gXCIjXCIgPyBcIlwiIDogaGFzaC5zdGFydHNXaXRoKFwiI1wiKSA/IGhhc2ggOiBcIiNcIiArIGhhc2g7XG52YXIgRGF0YVdpdGhSZXNwb25zZUluaXQgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGRhdGEyLCBpbml0KSB7XG4gICAgdGhpcy50eXBlID0gXCJEYXRhV2l0aFJlc3BvbnNlSW5pdFwiO1xuICAgIHRoaXMuZGF0YSA9IGRhdGEyO1xuICAgIHRoaXMuaW5pdCA9IGluaXQgfHwgbnVsbDtcbiAgfVxufTtcbmZ1bmN0aW9uIGRhdGEoZGF0YTIsIGluaXQpIHtcbiAgcmV0dXJuIG5ldyBEYXRhV2l0aFJlc3BvbnNlSW5pdChcbiAgICBkYXRhMixcbiAgICB0eXBlb2YgaW5pdCA9PT0gXCJudW1iZXJcIiA/IHsgc3RhdHVzOiBpbml0IH0gOiBpbml0XG4gICk7XG59XG52YXIgcmVkaXJlY3QgPSAodXJsLCBpbml0ID0gMzAyKSA9PiB7XG4gIGxldCByZXNwb25zZUluaXQgPSBpbml0O1xuICBpZiAodHlwZW9mIHJlc3BvbnNlSW5pdCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJlc3BvbnNlSW5pdCA9IHsgc3RhdHVzOiByZXNwb25zZUluaXQgfTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcmVzcG9uc2VJbml0LnN0YXR1cyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJlc3BvbnNlSW5pdC5zdGF0dXMgPSAzMDI7XG4gIH1cbiAgbGV0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXNwb25zZUluaXQuaGVhZGVycyk7XG4gIGhlYWRlcnMuc2V0KFwiTG9jYXRpb25cIiwgdXJsKTtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7IC4uLnJlc3BvbnNlSW5pdCwgaGVhZGVycyB9KTtcbn07XG52YXIgcmVkaXJlY3REb2N1bWVudCA9ICh1cmwsIGluaXQpID0+IHtcbiAgbGV0IHJlc3BvbnNlID0gcmVkaXJlY3QodXJsLCBpbml0KTtcbiAgcmVzcG9uc2UuaGVhZGVycy5zZXQoXCJYLVJlbWl4LVJlbG9hZC1Eb2N1bWVudFwiLCBcInRydWVcIik7XG4gIHJldHVybiByZXNwb25zZTtcbn07XG52YXIgcmVwbGFjZSA9ICh1cmwsIGluaXQpID0+IHtcbiAgbGV0IHJlc3BvbnNlID0gcmVkaXJlY3QodXJsLCBpbml0KTtcbiAgcmVzcG9uc2UuaGVhZGVycy5zZXQoXCJYLVJlbWl4LVJlcGxhY2VcIiwgXCJ0cnVlXCIpO1xuICByZXR1cm4gcmVzcG9uc2U7XG59O1xudmFyIEVycm9yUmVzcG9uc2VJbXBsID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihzdGF0dXMsIHN0YXR1c1RleHQsIGRhdGEyLCBpbnRlcm5hbCA9IGZhbHNlKSB7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gc3RhdHVzVGV4dCB8fCBcIlwiO1xuICAgIHRoaXMuaW50ZXJuYWwgPSBpbnRlcm5hbDtcbiAgICBpZiAoZGF0YTIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhpcy5kYXRhID0gZGF0YTIudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMuZXJyb3IgPSBkYXRhMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0gZGF0YTI7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gaXNSb3V0ZUVycm9yUmVzcG9uc2UoZXJyb3IpIHtcbiAgcmV0dXJuIGVycm9yICE9IG51bGwgJiYgdHlwZW9mIGVycm9yLnN0YXR1cyA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgZXJyb3Iuc3RhdHVzVGV4dCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgZXJyb3IuaW50ZXJuYWwgPT09IFwiYm9vbGVhblwiICYmIFwiZGF0YVwiIGluIGVycm9yO1xufVxuXG4vLyBsaWIvcm91dGVyL3JvdXRlci50c1xudmFyIHZhbGlkTXV0YXRpb25NZXRob2RzQXJyID0gW1xuICBcIlBPU1RcIixcbiAgXCJQVVRcIixcbiAgXCJQQVRDSFwiLFxuICBcIkRFTEVURVwiXG5dO1xudmFyIHZhbGlkTXV0YXRpb25NZXRob2RzID0gbmV3IFNldChcbiAgdmFsaWRNdXRhdGlvbk1ldGhvZHNBcnJcbik7XG52YXIgdmFsaWRSZXF1ZXN0TWV0aG9kc0FyciA9IFtcbiAgXCJHRVRcIixcbiAgLi4udmFsaWRNdXRhdGlvbk1ldGhvZHNBcnJcbl07XG52YXIgdmFsaWRSZXF1ZXN0TWV0aG9kcyA9IG5ldyBTZXQodmFsaWRSZXF1ZXN0TWV0aG9kc0Fycik7XG52YXIgcmVkaXJlY3RTdGF0dXNDb2RlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF0pO1xudmFyIHJlZGlyZWN0UHJlc2VydmVNZXRob2RTdGF0dXNDb2RlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFszMDcsIDMwOF0pO1xudmFyIElETEVfTkFWSUdBVElPTiA9IHtcbiAgc3RhdGU6IFwiaWRsZVwiLFxuICBsb2NhdGlvbjogdm9pZCAwLFxuICBmb3JtTWV0aG9kOiB2b2lkIDAsXG4gIGZvcm1BY3Rpb246IHZvaWQgMCxcbiAgZm9ybUVuY1R5cGU6IHZvaWQgMCxcbiAgZm9ybURhdGE6IHZvaWQgMCxcbiAganNvbjogdm9pZCAwLFxuICB0ZXh0OiB2b2lkIDBcbn07XG52YXIgSURMRV9GRVRDSEVSID0ge1xuICBzdGF0ZTogXCJpZGxlXCIsXG4gIGRhdGE6IHZvaWQgMCxcbiAgZm9ybU1ldGhvZDogdm9pZCAwLFxuICBmb3JtQWN0aW9uOiB2b2lkIDAsXG4gIGZvcm1FbmNUeXBlOiB2b2lkIDAsXG4gIGZvcm1EYXRhOiB2b2lkIDAsXG4gIGpzb246IHZvaWQgMCxcbiAgdGV4dDogdm9pZCAwXG59O1xudmFyIElETEVfQkxPQ0tFUiA9IHtcbiAgc3RhdGU6IFwidW5ibG9ja2VkXCIsXG4gIHByb2NlZWQ6IHZvaWQgMCxcbiAgcmVzZXQ6IHZvaWQgMCxcbiAgbG9jYXRpb246IHZvaWQgMFxufTtcbnZhciBBQlNPTFVURV9VUkxfUkVHRVggPSAvXig/OlthLXpdW2EtejAtOSsuLV0qOnxcXC9cXC8pL2k7XG52YXIgaXNBYnNvbHV0ZVVybCA9ICh1cmwpID0+IEFCU09MVVRFX1VSTF9SRUdFWC50ZXN0KHVybCk7XG52YXIgZGVmYXVsdE1hcFJvdXRlUHJvcGVydGllcyA9IChyb3V0ZSkgPT4gKHtcbiAgaGFzRXJyb3JCb3VuZGFyeTogQm9vbGVhbihyb3V0ZS5oYXNFcnJvckJvdW5kYXJ5KVxufSk7XG52YXIgVFJBTlNJVElPTlNfU1RPUkFHRV9LRVkgPSBcInJlbWl4LXJvdXRlci10cmFuc2l0aW9uc1wiO1xudmFyIFJlc2V0TG9hZGVyRGF0YVN5bWJvbCA9IFN5bWJvbChcIlJlc2V0TG9hZGVyRGF0YVwiKTtcbmZ1bmN0aW9uIGNyZWF0ZVJvdXRlcihpbml0KSB7XG4gIGNvbnN0IHJvdXRlcldpbmRvdyA9IGluaXQud2luZG93ID8gaW5pdC53aW5kb3cgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdm9pZCAwO1xuICBjb25zdCBpc0Jyb3dzZXIyID0gdHlwZW9mIHJvdXRlcldpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygcm91dGVyV2luZG93LmRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiByb3V0ZXJXaW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaW52YXJpYW50KFxuICAgIGluaXQucm91dGVzLmxlbmd0aCA+IDAsXG4gICAgXCJZb3UgbXVzdCBwcm92aWRlIGEgbm9uLWVtcHR5IHJvdXRlcyBhcnJheSB0byBjcmVhdGVSb3V0ZXJcIlxuICApO
251141xuICBsZXQgaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzMiA9IGluaXQuaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzIHx8IFtdO1xuICBsZXQgbWFwUm91dGVQcm9wZXJ0aWVzMiA9IGluaXQubWFwUm91dGVQcm9wZXJ0aWVzIHx8IGRlZmF1bHRNYXBSb3V0ZVByb3BlcnRpZXM7XG4gIGxldCBtYW5pZmVzdCA9IHt9O1xuICBsZXQgZGF0YVJvdXRlcyA9IGNvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMoXG4gICAgaW5pdC5yb3V0ZXMsXG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzMixcbiAgICB2b2lkIDAsXG4gICAgbWFuaWZlc3RcbiAgKTtcbiAgbGV0IGluRmxpZ2h0RGF0YVJvdXRlcztcbiAgbGV0IGJhc2VuYW1lID0gaW5pdC5iYXNlbmFtZSB8fCBcIi9cIjtcbiAgaWYgKCFiYXNlbmFtZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIGJhc2VuYW1lID0gYC8ke2Jhc2VuYW1lfWA7XG4gIH1cbiAgbGV0IGRhdGFTdHJhdGVneUltcGwgPSBpbml0LmRhdGFTdHJhdGVneSB8fCBkZWZhdWx0RGF0YVN0cmF0ZWd5V2l0aE1pZGRsZXdhcmU7XG4gIGxldCBmdXR1cmUgPSB7XG4gICAgLi4uaW5pdC5mdXR1cmVcbiAgfTtcbiAgbGV0IHVubGlzdGVuSGlzdG9yeSA9IG51bGw7XG4gIGxldCBzdWJzY3JpYmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGxldCBzYXZlZFNjcm9sbFBvc2l0aW9uczIgPSBudWxsO1xuICBsZXQgZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkyID0gbnVsbDtcbiAgbGV0IGdldFNjcm9sbFBvc2l0aW9uID0gbnVsbDtcbiAgbGV0IGluaXRpYWxTY3JvbGxSZXN0b3JlZCA9IGluaXQuaHlkcmF0aW9uRGF0YSAhPSBudWxsO1xuICBsZXQgaW5pdGlhbE1hdGNoZXMgPSBtYXRjaFJvdXRlcyhkYXRhUm91dGVzLCBpbml0Lmhpc3RvcnkubG9jYXRpb24sIGJhc2VuYW1lKTtcbiAgbGV0IGluaXRpYWxNYXRjaGVzSXNGT1cgPSBmYWxzZTtcbiAgbGV0IGluaXRpYWxFcnJvcnMgPSBudWxsO1xuICBsZXQgaW5pdGlhbGl6ZWQ7XG4gIGlmIChpbml0aWFsTWF0Y2hlcyA9PSBudWxsICYmICFpbml0LnBhdGNoUm91dGVzT25OYXZpZ2F0aW9uKSB7XG4gICAgbGV0IGVycm9yID0gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDQsIHtcbiAgICAgIHBhdGhuYW1lOiBpbml0Lmhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWVcbiAgICB9KTtcbiAgICBsZXQgeyBtYXRjaGVzLCByb3V0ZSB9ID0gZ2V0U2hvcnRDaXJjdWl0TWF0Y2hlcyhkYXRhUm91dGVzKTtcbiAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gICAgaW5pdGlhbE1hdGNoZXMgPSBtYXRjaGVzO1xuICAgIGluaXRpYWxFcnJvcnMgPSB7IFtyb3V0ZS5pZF06IGVycm9yIH07XG4gIH0gZWxzZSB7XG4gICAgaWYgKGluaXRpYWxNYXRjaGVzICYmICFpbml0Lmh5ZHJhdGlvbkRhdGEpIHtcbiAgICAgIGxldCBmb2dPZldhciA9IGNoZWNrRm9nT2ZXYXIoXG4gICAgICAgIGluaXRpYWxNYXRjaGVzLFxuICAgICAgICBkYXRhUm91dGVzLFxuICAgICAgICBpbml0Lmhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoZm9nT2ZXYXIuYWN0aXZlKSB7XG4gICAgICAgIGluaXRpYWxNYXRjaGVzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpbml0aWFsTWF0Y2hlcykge1xuICAgICAgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgIGluaXRpYWxNYXRjaGVzID0gW107XG4gICAgICBsZXQgZm9nT2ZXYXIgPSBjaGVja0ZvZ09mV2FyKFxuICAgICAgICBudWxsLFxuICAgICAgICBkYXRhUm91dGVzLFxuICAgICAgICBpbml0Lmhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoZm9nT2ZXYXIuYWN0aXZlICYmIGZvZ09mV2FyLm1hdGNoZXMpIHtcbiAgICAgICAgaW5pdGlhbE1hdGNoZXNJc0ZPVyA9IHRydWU7XG4gICAgICAgIGluaXRpYWxNYXRjaGVzID0gZm9nT2ZXYXIubWF0Y2hlcztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluaXRpYWxNYXRjaGVzLnNvbWUoKG0pID0+IG0ucm91dGUubGF6eSkpIHtcbiAgICAgIGluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghaW5pdGlhbE1hdGNoZXMuc29tZSgobSkgPT4gcm91dGVIYXNMb2FkZXJPck1pZGRsZXdhcmUobS5yb3V0ZSkpKSB7XG4gICAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBsb2FkZXJEYXRhID0gaW5pdC5oeWRyYXRpb25EYXRhID8gaW5pdC5oeWRyYXRpb25EYXRhLmxvYWRlckRhdGEgOiBudWxsO1xuICAgICAgbGV0IGVycm9ycyA9IGluaXQuaHlkcmF0aW9uRGF0YSA/IGluaXQuaHlkcmF0aW9uRGF0YS5lcnJvcnMgOiBudWxsO1xuICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICBsZXQgaWR4ID0gaW5pdGlhbE1hdGNoZXMuZmluZEluZGV4KFxuICAgICAgICAgIChtKSA9PiBlcnJvcnNbbS5yb3V0ZS5pZF0gIT09IHZvaWQgMFxuICAgICAgICApO1xuICAgICAgICBpbml0aWFsaXplZCA9IGluaXRpYWxNYXRjaGVzLnNsaWNlKDAsIGlkeCArIDEpLmV2ZXJ5KFxuICAgICAgICAgIChtKSA9PiAhc2hvdWxkTG9hZFJvdXRlT25IeWRyYXRpb24obS5yb3V0ZSwgbG9hZGVyRGF0YSwgZXJyb3JzKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5pdGlhbGl6ZWQgPSBpbml0aWFsTWF0Y2hlcy5ldmVyeShcbiAgICAgICAgICAobSkgPT4gIXNob3VsZExvYWRSb3V0ZU9uSHlkcmF0aW9uKG0ucm91dGUsIGxvYWRlckRhdGEsIGVycm9ycylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0IHJvdXRlcjtcbiAgbGV0IHN0YXRlID0ge1xuICAgIGhpc3RvcnlBY3Rpb246IGluaXQuaGlzdG9yeS5hY3Rpb24sXG4gICAgbG9jYXRpb246IGluaXQuaGlzdG9yeS5sb2NhdGlvbixcbiAgICBtYXRjaGVzOiBpbml0aWFsTWF0Y2hlcyxcbiAgICBpbml0aWFsaXplZCxcbiAgICBuYXZpZ2F0aW9uOiBJRExFX05BVklHQVRJT04sXG4gICAgLy8gRG9uJ3QgcmVzdG9yZSBvbiBpbml0aWFsIHVwZGF0ZVN0YXRlKCkgaWYgd2Ugd2VyZSBTU1InZFxuICAgIHJlc3RvcmVTY3JvbGxQb3NpdGlvbjogaW5pdC5oeWRyYXRpb25EYXRhICE9IG51bGwgPyBmYWxzZSA6IG51bGwsXG4gICAgcHJldmVudFNjcm9sbFJlc2V0OiBmYWxzZSxcbiAgICByZXZhbGlkYXRpb246IFwiaWRsZVwiLFxuICAgIGxvYWRlckRhdGE6IGluaXQuaHlkcmF0aW9uRGF0YSAmJiBpbml0Lmh5ZHJhdGlvbkRhdGEubG9hZGVyRGF0YSB8fCB7fSxcbiAgICBhY3Rpb25EYXRhOiBpbml0Lmh5ZHJhdGlvbkRhdGEgJiYgaW5pdC5oeWRyYXRpb25EYXRhLmFjdGlvbkRhdGEgfHwgbnVsbCxcbiAgICBlcnJvcnM6IGluaXQuaHlkcmF0aW9uRGF0YSAmJiBpbml0Lmh5ZHJhdGlvbkRhdGEuZXJyb3JzIHx8IGluaXRpYWxFcnJvcnMsXG4gICAgZmV0Y2hlcnM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgYmxvY2tlcnM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKClcbiAgfTtcbiAgbGV0IHBlbmRpbmdBY3Rpb24gPSBcIlBPUFwiIC8qIFBvcCAqLztcbiAgbGV0IHBlbmRpbmdQcmV2ZW50U2Nyb2xsUmVzZXQgP
25114SBmYWxzZTtcbiAgbGV0IHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlcjtcbiAgbGV0IHBlbmRpbmdWaWV3VHJhbnNpdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgbGV0IGFwcGxpZWRWaWV3VHJhbnNpdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgcmVtb3ZlUGFnZUhpZGVFdmVudExpc3RlbmVyID0gbnVsbDtcbiAgbGV0IGlzVW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbiA9IGZhbHNlO1xuICBsZXQgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCA9IGZhbHNlO1xuICBsZXQgY2FuY2VsbGVkRmV0Y2hlckxvYWRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgbGV0IGZldGNoQ29udHJvbGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgaW5jcmVtZW50aW5nTG9hZElkID0gMDtcbiAgbGV0IHBlbmRpbmdOYXZpZ2F0aW9uTG9hZElkID0gLTE7XG4gIGxldCBmZXRjaFJlbG9hZElkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGxldCBmZXRjaFJlZGlyZWN0SWRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgbGV0IGZldGNoTG9hZE1hdGNoZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgYWN0aXZlRmV0Y2hlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgZmV0Y2hlcnNRdWV1ZWRGb3JEZWxldGlvbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGxldCBibG9ja2VyRnVuY3Rpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IHVuYmxvY2tCbG9ja2VySGlzdG9yeVVwZGF0ZSA9IHZvaWQgMDtcbiAgbGV0IHBlbmRpbmdSZXZhbGlkYXRpb25EZmQgPSBudWxsO1xuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIHVubGlzdGVuSGlzdG9yeSA9IGluaXQuaGlzdG9yeS5saXN0ZW4oXG4gICAgICAoeyBhY3Rpb246IGhpc3RvcnlBY3Rpb24sIGxvY2F0aW9uLCBkZWx0YSB9KSA9PiB7XG4gICAgICAgIGlmICh1bmJsb2NrQmxvY2tlckhpc3RvcnlVcGRhdGUpIHtcbiAgICAgICAgICB1bmJsb2NrQmxvY2tlckhpc3RvcnlVcGRhdGUoKTtcbiAgICAgICAgICB1bmJsb2NrQmxvY2tlckhpc3RvcnlVcGRhdGUgPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgYmxvY2tlckZ1bmN0aW9ucy5zaXplID09PSAwIHx8IGRlbHRhICE9IG51bGwsXG4gICAgICAgICAgXCJZb3UgYXJlIHRyeWluZyB0byB1c2UgYSBibG9ja2VyIG9uIGEgUE9QIG5hdmlnYXRpb24gdG8gYSBsb2NhdGlvbiB0aGF0IHdhcyBub3QgY3JlYXRlZCBieSBAcmVtaXgtcnVuL3JvdXRlci4gVGhpcyB3aWxsIGZhaWwgc2lsZW50bHkgaW4gcHJvZHVjdGlvbi4gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBhcmUgbmF2aWdhdGluZyBvdXRzaWRlIHRoZSByb3V0ZXIgdmlhIGB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGVgL2B3aW5kb3cubG9jYXRpb24uaGFzaGAgaW5zdGVhZCBvZiB1c2luZyByb3V0ZXIgbmF2aWdhdGlvbiBBUElzLiAgVGhpcyBjYW4gYWxzbyBoYXBwZW4gaWYgeW91IGFyZSB1c2luZyBjcmVhdGVIYXNoUm91dGVyIGFuZCB0aGUgdXNlciBtYW51YWxseSBjaGFuZ2VzIHRoZSBVUkwuXCJcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGJsb2NrZXJLZXkgPSBzaG91bGRCbG9ja05hdmlnYXRpb24oe1xuICAgICAgICAgIGN1cnJlbnRMb2NhdGlvbjogc3RhdGUubG9jYXRpb24sXG4gICAgICAgICAgbmV4dExvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgICBoaXN0b3J5QWN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYmxvY2tlcktleSAmJiBkZWx0YSAhPSBudWxsKSB7XG4gICAgICAgICAgbGV0IG5leHRIaXN0b3J5VXBkYXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB1bmJsb2NrQmxvY2tlckhpc3RvcnlVcGRhdGUgPSByZXNvbHZlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGluaXQuaGlzdG9yeS5nbyhkZWx0YSAqIC0xKTtcbiAgICAgICAgICB1cGRhdGVCbG9ja2VyKGJsb2NrZXJLZXksIHtcbiAgICAgICAgICAgIHN0YXRlOiBcImJsb2NrZWRcIixcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcHJvY2VlZCgpIHtcbiAgICAgICAgICAgICAgdXBkYXRlQmxvY2tlcihibG9ja2VyS2V5LCB7XG4gICAgICAgICAgICAgICAgc3RhdGU6IFwicHJvY2VlZGluZ1wiLFxuICAgICAgICAgICAgICAgIHByb2NlZWQ6IHZvaWQgMCxcbiAgICAgICAgICAgICAgICByZXNldDogdm9pZCAwLFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuZXh0SGlzdG9yeVVwZGF0ZVByb21pc2UudGhlbigoKSA9PiBpbml0Lmhpc3RvcnkuZ28oZGVsdGEpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXNldCgpIHtcbiAgICAgICAgICAgICAgbGV0IGJsb2NrZXJzID0gbmV3IE1hcChzdGF0ZS5ibG9ja2Vycyk7XG4gICAgICAgICAgICAgIGJsb2NrZXJzLnNldChibG9ja2VyS2V5LCBJRExFX0JMT0NLRVIpO1xuICAgICAgICAgICAgICB1cGRhdGVTdGF0ZSh7IGJsb2NrZXJzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhcnROYXZpZ2F0aW9uKGhpc3RvcnlBY3Rpb24sIGxvY2F0aW9uKTtcbiAgICAgIH1cbiAgICApO1xuICAgIGlmIChpc0Jyb3dzZXIyKSB7XG4gICAgICByZXN0b3JlQXBwbGllZFRyYW5zaXRpb25zKHJvdXRlcldpbmRvdywgYXBwbGllZFZpZXdUcmFuc2l0aW9ucyk7XG4gICAgICBsZXQgX3NhdmVBcHBsaWVkVHJhbnNpdGlvbnMgPSAoKSA9PiBwZXJzaXN0QXBwbGllZFRyYW5zaXRpb25zKHJvdXRlcldpbmRvdywgYXBwbGllZFZpZXdUcmFuc2l0aW9ucyk7XG4gICAgICByb3V0ZXJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIF9zYXZlQXBwbGllZFRyYW5zaXRpb25zKTtcbiAgICAgIHJlbW92ZVBhZ2VIaWRlRXZlbnRMaXN0ZW5lciA9ICgpID0+IHJvdXRlcldpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgX3NhdmVBcHBsaWVkVHJhbnNpdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLmluaXRpYWxpemVkKSB7XG4gICAgICBzdGFydE5hdmlnYXRpb24oXCJQT1BcIiAvKiBQb3AgKi8sIHN0YXRlLmxvY2F0aW9uLCB7XG4gICAgICAgIGluaXRpYWxIeWRyYXRpb246IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcm91dGVyO1xuICB9XG4gIGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHVubGlzdGVuSGlzdG9yeSkge1xuICAgICAgdW5saXN0ZW5IaXN0b3J5KCk7XG4gICAgfVxuICAgIGlmIChyZW1vdmVQYWdlSGlkZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHJlbW92ZVBhZ2VIaWRlRXZlbnRMaXN0ZW5lcigpO1xuICAgIH1cbiAgICBzdWJzY3JpYmVycy5jbGVhcigpO1xuICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlciAmJiBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBzdGF0ZS5mZXRjaGVycy5mb3JFYWNoKChfLCBrZXkpID0+IGRlbGV0ZUZldGNoZXIoa2V5KSk7XG4gICAgc3RhdGUuYmxvY2tlcnMuZm9yRWFjaCgoXywga2V5KSA9PiBkZWxldGVCbG9ja2VyKGtleSkpO1xuICB9XG4gIGZ1bmN0aW9uIHN1YnNjcmliZShmbikge1xuICAgIHN1YnNjcmliZXJzLmFkZChmbik7XG4gICAgcmV0dXJuICgpID0+IHN1YnNjcmliZXJzLmRlbGV0ZShmb
25114ik7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlU3RhdGUobmV3U3RhdGUsIG9wdHMgPSB7fSkge1xuICAgIGlmIChuZXdTdGF0ZS5tYXRjaGVzKSB7XG4gICAgICBuZXdTdGF0ZS5tYXRjaGVzID0gbmV3U3RhdGUubWF0Y2hlcy5tYXAoKG0pID0+IHtcbiAgICAgICAgbGV0IHJvdXRlID0gbWFuaWZlc3RbbS5yb3V0ZS5pZF07XG4gICAgICAgIGxldCBtYXRjaFJvdXRlID0gbS5yb3V0ZTtcbiAgICAgICAgaWYgKG1hdGNoUm91dGUuZWxlbWVudCAhPT0gcm91dGUuZWxlbWVudCB8fCBtYXRjaFJvdXRlLmVycm9yRWxlbWVudCAhPT0gcm91dGUuZXJyb3JFbGVtZW50IHx8IG1hdGNoUm91dGUuaHlkcmF0ZUZhbGxiYWNrRWxlbWVudCAhPT0gcm91dGUuaHlkcmF0ZUZhbGxiYWNrRWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgcm91dGVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICAuLi5uZXdTdGF0ZVxuICAgIH07XG4gICAgbGV0IHVubW91bnRlZEZldGNoZXJzID0gW107XG4gICAgbGV0IG1vdW50ZWRGZXRjaGVycyA9IFtdO1xuICAgIHN0YXRlLmZldGNoZXJzLmZvckVhY2goKGZldGNoZXIsIGtleSkgPT4ge1xuICAgICAgaWYgKGZldGNoZXIuc3RhdGUgPT09IFwiaWRsZVwiKSB7XG4gICAgICAgIGlmIChmZXRjaGVyc1F1ZXVlZEZvckRlbGV0aW9uLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdW5tb3VudGVkRmV0Y2hlcnMucHVzaChrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1vdW50ZWRGZXRjaGVycy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBmZXRjaGVyc1F1ZXVlZEZvckRlbGV0aW9uLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKCFzdGF0ZS5mZXRjaGVycy5oYXMoa2V5KSAmJiAhZmV0Y2hDb250cm9sbGVycy5oYXMoa2V5KSkge1xuICAgICAgICB1bm1vdW50ZWRGZXRjaGVycy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgWy4uLnN1YnNjcmliZXJzXS5mb3JFYWNoKFxuICAgICAgKHN1YnNjcmliZXIpID0+IHN1YnNjcmliZXIoc3RhdGUsIHtcbiAgICAgICAgZGVsZXRlZEZldGNoZXJzOiB1bm1vdW50ZWRGZXRjaGVycyxcbiAgICAgICAgdmlld1RyYW5zaXRpb25PcHRzOiBvcHRzLnZpZXdUcmFuc2l0aW9uT3B0cyxcbiAgICAgICAgZmx1c2hTeW5jOiBvcHRzLmZsdXNoU3luYyA9PT0gdHJ1ZVxuICAgICAgfSlcbiAgICApO1xuICAgIHVubW91bnRlZEZldGNoZXJzLmZvckVhY2goKGtleSkgPT4gZGVsZXRlRmV0Y2hlcihrZXkpKTtcbiAgICBtb3VudGVkRmV0Y2hlcnMuZm9yRWFjaCgoa2V5KSA9PiBzdGF0ZS5mZXRjaGVycy5kZWxldGUoa2V5KSk7XG4gIH1cbiAgZnVuY3Rpb24gY29tcGxldGVOYXZpZ2F0aW9uKGxvY2F0aW9uLCBuZXdTdGF0ZSwgeyBmbHVzaFN5bmMgfSA9IHt9KSB7XG4gICAgbGV0IGlzQWN0aW9uUmVsb2FkID0gc3RhdGUuYWN0aW9uRGF0YSAhPSBudWxsICYmIHN0YXRlLm5hdmlnYXRpb24uZm9ybU1ldGhvZCAhPSBudWxsICYmIGlzTXV0YXRpb25NZXRob2Qoc3RhdGUubmF2aWdhdGlvbi5mb3JtTWV0aG9kKSAmJiBzdGF0ZS5uYXZpZ2F0aW9uLnN0YXRlID09PSBcImxvYWRpbmdcIiAmJiBsb2NhdGlvbi5zdGF0ZT8uX2lzUmVkaXJlY3QgIT09IHRydWU7XG4gICAgbGV0IGFjdGlvbkRhdGE7XG4gICAgaWYgKG5ld1N0YXRlLmFjdGlvbkRhdGEpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhuZXdTdGF0ZS5hY3Rpb25EYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFjdGlvbkRhdGEgPSBuZXdTdGF0ZS5hY3Rpb25EYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aW9uRGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FjdGlvblJlbG9hZCkge1xuICAgICAgYWN0aW9uRGF0YSA9IHN0YXRlLmFjdGlvbkRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGlvbkRhdGEgPSBudWxsO1xuICAgIH1cbiAgICBsZXQgbG9hZGVyRGF0YSA9IG5ld1N0YXRlLmxvYWRlckRhdGEgPyBtZXJnZUxvYWRlckRhdGEoXG4gICAgICBzdGF0ZS5sb2FkZXJEYXRhLFxuICAgICAgbmV3U3RhdGUubG9hZGVyRGF0YSxcbiAgICAgIG5ld1N0YXRlLm1hdGNoZXMgfHwgW10sXG4gICAgICBuZXdTdGF0ZS5lcnJvcnNcbiAgICApIDogc3RhdGUubG9hZGVyRGF0YTtcbiAgICBsZXQgYmxvY2tlcnMgPSBzdGF0ZS5ibG9ja2VycztcbiAgICBpZiAoYmxvY2tlcnMuc2l6ZSA+IDApIHtcbiAgICAgIGJsb2NrZXJzID0gbmV3IE1hcChibG9ja2Vycyk7XG4gICAgICBibG9ja2Vycy5mb3JFYWNoKChfLCBrKSA9PiBibG9ja2Vycy5zZXQoaywgSURMRV9CTE9DS0VSKSk7XG4gICAgfVxuICAgIGxldCByZXN0b3JlU2Nyb2xsUG9zaXRpb24gPSBpc1VuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb24gPyBmYWxzZSA6IGdldFNhdmVkU2Nyb2xsUG9zaXRpb24obG9jYXRpb24sIG5ld1N0YXRlLm1hdGNoZXMgfHwgc3RhdGUubWF0Y2hlcyk7XG4gICAgbGV0IHByZXZlbnRTY3JvbGxSZXNldCA9IHBlbmRpbmdQcmV2ZW50U2Nyb2xsUmVzZXQgPT09IHRydWUgfHwgc3RhdGUubmF2aWdhdGlvbi5mb3JtTWV0aG9kICE9IG51bGwgJiYgaXNNdXRhdGlvbk1ldGhvZChzdGF0ZS5uYXZpZ2F0aW9uLmZvcm1NZXRob2QpICYmIGxvY2F0aW9uLnN0YXRlPy5faXNSZWRpcmVjdCAhPT0gdHJ1ZTtcbiAgICBpZiAoaW5GbGlnaHREYXRhUm91dGVzKSB7XG4gICAgICBkYXRhUm91dGVzID0gaW5GbGlnaHREYXRhUm91dGVzO1xuICAgICAgaW5GbGlnaHREYXRhUm91dGVzID0gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAoaXNVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uKSB7XG4gICAgfSBlbHNlIGlmIChwZW5kaW5nQWN0aW9uID09PSBcIlBPUFwiIC8qIFBvcCAqLykge1xuICAgIH0gZWxzZSBpZiAocGVuZGluZ0FjdGlvbiA9PT0gXCJQVVNIXCIgLyogUHVzaCAqLykge1xuICAgICAgaW5pdC5oaXN0b3J5LnB1c2gobG9jYXRpb24sIGxvY2F0aW9uLnN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKHBlbmRpbmdBY3Rpb24gPT09IFwiUkVQTEFDRVwiIC8qIFJlcGxhY2UgKi8pIHtcbiAgICAgIGluaXQuaGlzdG9yeS5yZXBsYWNlKGxvY2F0aW9uLCBsb2NhdGlvbi5zdGF0ZSk7XG4gICAgfVxuICAgIGxldCB2aWV3VHJhbnNpdGlvbk9wdHM7XG4gICAgaWYgKHBlbmRpbmdBY3Rpb24gPT09IFwiUE9QXCIgLyogUG9wICovKSB7XG4gICAgICBsZXQgcHJpb3JQYXRocyA9IGFwcGxpZWRWaWV3VHJhbnNpdGlvbnMuZ2V0KHN0YXRlLmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIGlmIChwcmlvclBhdGhzICYmIHByaW9yUGF0aHMuaGFzKGxvY2F0aW9uLnBhdGhuYW1lKSkge1xuICAgICAgICB2aWV3VHJhbnNpdGlvbk9wdHMgP
25114SB7XG4gICAgICAgICAgY3VycmVudExvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICAgICAgICBuZXh0TG9jYXRpb246IGxvY2F0aW9uXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGFwcGxpZWRWaWV3VHJhbnNpdGlvbnMuaGFzKGxvY2F0aW9uLnBhdGhuYW1lKSkge1xuICAgICAgICB2aWV3VHJhbnNpdGlvbk9wdHMgPSB7XG4gICAgICAgICAgY3VycmVudExvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgICBuZXh0TG9jYXRpb246IHN0YXRlLmxvY2F0aW9uXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwZW5kaW5nVmlld1RyYW5zaXRpb25FbmFibGVkKSB7XG4gICAgICBsZXQgdG9QYXRocyA9IGFwcGxpZWRWaWV3VHJhbnNpdGlvbnMuZ2V0KHN0YXRlLmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIGlmICh0b1BhdGhzKSB7XG4gICAgICAgIHRvUGF0aHMuYWRkKGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvUGF0aHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbbG9jYXRpb24ucGF0aG5hbWVdKTtcbiAgICAgICAgYXBwbGllZFZpZXdUcmFuc2l0aW9ucy5zZXQoc3RhdGUubG9jYXRpb24ucGF0aG5hbWUsIHRvUGF0aHMpO1xuICAgICAgfVxuICAgICAgdmlld1RyYW5zaXRpb25PcHRzID0ge1xuICAgICAgICBjdXJyZW50TG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgICBuZXh0TG9jYXRpb246IGxvY2F0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgICB1cGRhdGVTdGF0ZShcbiAgICAgIHtcbiAgICAgICAgLi4ubmV3U3RhdGUsXG4gICAgICAgIC8vIG1hdGNoZXMsIGVycm9ycywgZmV0Y2hlcnMgZ28gdGhyb3VnaCBhcy1pc1xuICAgICAgICBhY3Rpb25EYXRhLFxuICAgICAgICBsb2FkZXJEYXRhLFxuICAgICAgICBoaXN0b3J5QWN0aW9uOiBwZW5kaW5nQWN0aW9uLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgaW5pdGlhbGl6ZWQ6IHRydWUsXG4gICAgICAgIG5hdmlnYXRpb246IElETEVfTkFWSUdBVElPTixcbiAgICAgICAgcmV2YWxpZGF0aW9uOiBcImlkbGVcIixcbiAgICAgICAgcmVzdG9yZVNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICAgIGJsb2NrZXJzXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2aWV3VHJhbnNpdGlvbk9wdHMsXG4gICAgICAgIGZsdXNoU3luYzogZmx1c2hTeW5jID09PSB0cnVlXG4gICAgICB9XG4gICAgKTtcbiAgICBwZW5kaW5nQWN0aW9uID0gXCJQT1BcIiAvKiBQb3AgKi87XG4gICAgcGVuZGluZ1ByZXZlbnRTY3JvbGxSZXNldCA9IGZhbHNlO1xuICAgIHBlbmRpbmdWaWV3VHJhbnNpdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICBpc1VuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICBpc1JldmFsaWRhdGlvblJlcXVpcmVkID0gZmFsc2U7XG4gICAgcGVuZGluZ1JldmFsaWRhdGlvbkRmZD8ucmVzb2x2ZSgpO1xuICAgIHBlbmRpbmdSZXZhbGlkYXRpb25EZmQgPSBudWxsO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlKHRvLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiB0byA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaW5pdC5oaXN0b3J5LmdvKHRvKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplVG8oXG4gICAgICBzdGF0ZS5sb2NhdGlvbixcbiAgICAgIHN0YXRlLm1hdGNoZXMsXG4gICAgICBiYXNlbmFtZSxcbiAgICAgIHRvLFxuICAgICAgb3B0cz8uZnJvbVJvdXRlSWQsXG4gICAgICBvcHRzPy5yZWxhdGl2ZVxuICAgICk7XG4gICAgbGV0IHsgcGF0aCwgc3VibWlzc2lvbiwgZXJyb3IgfSA9IG5vcm1hbGl6ZU5hdmlnYXRlT3B0aW9ucyhcbiAgICAgIGZhbHNlLFxuICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICBvcHRzXG4gICAgKTtcbiAgICBsZXQgY3VycmVudExvY2F0aW9uID0gc3RhdGUubG9jYXRpb247XG4gICAgbGV0IG5leHRMb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uKHN0YXRlLmxvY2F0aW9uLCBwYXRoLCBvcHRzICYmIG9wdHMuc3RhdGUpO1xuICAgIG5leHRMb2NhdGlvbiA9IHtcbiAgICAgIC4uLm5leHRMb2NhdGlvbixcbiAgICAgIC4uLmluaXQuaGlzdG9yeS5lbmNvZGVMb2NhdGlvbihuZXh0TG9jYXRpb24pXG4gICAgfTtcbiAgICBsZXQgdXNlclJlcGxhY2UgPSBvcHRzICYmIG9wdHMucmVwbGFjZSAhPSBudWxsID8gb3B0cy5yZXBsYWNlIDogdm9pZCAwO1xuICAgIGxldCBoaXN0b3J5QWN0aW9uID0gXCJQVVNIXCIgLyogUHVzaCAqLztcbiAgICBpZiAodXNlclJlcGxhY2UgPT09IHRydWUpIHtcbiAgICAgIGhpc3RvcnlBY3Rpb24gPSBcIlJFUExBQ0VcIiAvKiBSZXBsYWNlICovO1xuICAgIH0gZWxzZSBpZiAodXNlclJlcGxhY2UgPT09IGZhbHNlKSB7XG4gICAgfSBlbHNlIGlmIChzdWJtaXNzaW9uICE9IG51bGwgJiYgaXNNdXRhdGlvbk1ldGhvZChzdWJtaXNzaW9uLmZvcm1NZXRob2QpICYmIHN1Ym1pc3Npb24uZm9ybUFjdGlvbiA9PT0gc3RhdGUubG9jYXRpb24ucGF0aG5hbWUgKyBzdGF0ZS5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgIGhpc3RvcnlBY3Rpb24gPSBcIlJFUExBQ0VcIiAvKiBSZXBsYWNlICovO1xuICAgIH1cbiAgICBsZXQgcHJldmVudFNjcm9sbFJlc2V0ID0gb3B0cyAmJiBcInByZXZlbnRTY3JvbGxSZXNldFwiIGluIG9wdHMgPyBvcHRzLnByZXZlbnRTY3JvbGxSZXNldCA9PT0gdHJ1ZSA6IHZvaWQgMDtcbiAgICBsZXQgZmx1c2hTeW5jID0gKG9wdHMgJiYgb3B0cy5mbHVzaFN5bmMpID09PSB0cnVlO1xuICAgIGxldCBibG9ja2VyS2V5ID0gc2hvdWxkQmxvY2tOYXZpZ2F0aW9uKHtcbiAgICAgIGN1cnJlbnRMb2NhdGlvbixcbiAgICAgIG5leHRMb2NhdGlvbixcbiAgICAgIGhpc3RvcnlBY3Rpb25cbiAgICB9KTtcbiAgICBpZiAoYmxvY2tlcktleSkge1xuICAgICAgdXBkYXRlQmxvY2tlcihibG9ja2VyS2V5LCB7XG4gICAgICAgIHN0YXRlOiBcImJsb2NrZWRcIixcbiAgICAgICAgbG9jYXRpb246IG5leHRMb2NhdGlvbixcbiAgICAgICAgcHJvY2VlZCgpIHtcbiAgICAgICAgICB1cGRhdGVCbG9ja2VyKGJsb2NrZXJLZXksIHtcbiAgICAgICAgICAgI
25114HN0YXRlOiBcInByb2NlZWRpbmdcIixcbiAgICAgICAgICAgIHByb2NlZWQ6IHZvaWQgMCxcbiAgICAgICAgICAgIHJlc2V0OiB2b2lkIDAsXG4gICAgICAgICAgICBsb2NhdGlvbjogbmV4dExvY2F0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbmF2aWdhdGUodG8sIG9wdHMpO1xuICAgICAgICB9LFxuICAgICAgICByZXNldCgpIHtcbiAgICAgICAgICBsZXQgYmxvY2tlcnMgPSBuZXcgTWFwKHN0YXRlLmJsb2NrZXJzKTtcbiAgICAgICAgICBibG9ja2Vycy5zZXQoYmxvY2tlcktleSwgSURMRV9CTE9DS0VSKTtcbiAgICAgICAgICB1cGRhdGVTdGF0ZSh7IGJsb2NrZXJzIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgc3RhcnROYXZpZ2F0aW9uKGhpc3RvcnlBY3Rpb24sIG5leHRMb2NhdGlvbiwge1xuICAgICAgc3VibWlzc2lvbixcbiAgICAgIC8vIFNlbmQgdGhyb3VnaCB0aGUgZm9ybURhdGEgc2VyaWFsaXphdGlvbiBlcnJvciBpZiB3ZSBoYXZlIG9uZSBzbyB3ZSBjYW5cbiAgICAgIC8vIHJlbmRlciBhdCB0aGUgcmlnaHQgZXJyb3IgYm91bmRhcnkgYWZ0ZXIgd2UgbWF0Y2ggcm91dGVzXG4gICAgICBwZW5kaW5nRXJyb3I6IGVycm9yLFxuICAgICAgcHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgcmVwbGFjZTogb3B0cyAmJiBvcHRzLnJlcGxhY2UsXG4gICAgICBlbmFibGVWaWV3VHJhbnNpdGlvbjogb3B0cyAmJiBvcHRzLnZpZXdUcmFuc2l0aW9uLFxuICAgICAgZmx1c2hTeW5jXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gcmV2YWxpZGF0ZSgpIHtcbiAgICBpZiAoIXBlbmRpbmdSZXZhbGlkYXRpb25EZmQpIHtcbiAgICAgIHBlbmRpbmdSZXZhbGlkYXRpb25EZmQgPSBjcmVhdGVEZWZlcnJlZCgpO1xuICAgIH1cbiAgICBpbnRlcnJ1cHRBY3RpdmVMb2FkcygpO1xuICAgIHVwZGF0ZVN0YXRlKHsgcmV2YWxpZGF0aW9uOiBcImxvYWRpbmdcIiB9KTtcbiAgICBsZXQgcHJvbWlzZSA9IHBlbmRpbmdSZXZhbGlkYXRpb25EZmQucHJvbWlzZTtcbiAgICBpZiAoc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJzdWJtaXR0aW5nXCIpIHtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICBpZiAoc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJpZGxlXCIpIHtcbiAgICAgIHN0YXJ0TmF2aWdhdGlvbihzdGF0ZS5oaXN0b3J5QWN0aW9uLCBzdGF0ZS5sb2NhdGlvbiwge1xuICAgICAgICBzdGFydFVuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb246IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHN0YXJ0TmF2aWdhdGlvbihcbiAgICAgIHBlbmRpbmdBY3Rpb24gfHwgc3RhdGUuaGlzdG9yeUFjdGlvbixcbiAgICAgIHN0YXRlLm5hdmlnYXRpb24ubG9jYXRpb24sXG4gICAgICB7XG4gICAgICAgIG92ZXJyaWRlTmF2aWdhdGlvbjogc3RhdGUubmF2aWdhdGlvbixcbiAgICAgICAgLy8gUHJveHkgdGhyb3VnaCBhbnkgcmVuZGluZyB2aWV3IHRyYW5zaXRpb25cbiAgICAgICAgZW5hYmxlVmlld1RyYW5zaXRpb246IHBlbmRpbmdWaWV3VHJhbnNpdGlvbkVuYWJsZWQgPT09IHRydWVcbiAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIHN0YXJ0TmF2aWdhdGlvbihoaXN0b3J5QWN0aW9uLCBsb2NhdGlvbiwgb3B0cykge1xuICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlciAmJiBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBudWxsO1xuICAgIHBlbmRpbmdBY3Rpb24gPSBoaXN0b3J5QWN0aW9uO1xuICAgIGlzVW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbiA9IChvcHRzICYmIG9wdHMuc3RhcnRVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uKSA9PT0gdHJ1ZTtcbiAgICBzYXZlU2Nyb2xsUG9zaXRpb24oc3RhdGUubG9jYXRpb24sIHN0YXRlLm1hdGNoZXMpO1xuICAgIHBlbmRpbmdQcmV2ZW50U2Nyb2xsUmVzZXQgPSAob3B0cyAmJiBvcHRzLnByZXZlbnRTY3JvbGxSZXNldCkgPT09IHRydWU7XG4gICAgcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRW5hYmxlZCA9IChvcHRzICYmIG9wdHMuZW5hYmxlVmlld1RyYW5zaXRpb24pID09PSB0cnVlO1xuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIGxldCBsb2FkaW5nTmF2aWdhdGlvbiA9IG9wdHMgJiYgb3B0cy5vdmVycmlkZU5hdmlnYXRpb247XG4gICAgbGV0IG1hdGNoZXMgPSBvcHRzPy5pbml0aWFsSHlkcmF0aW9uICYmIHN0YXRlLm1hdGNoZXMgJiYgc3RhdGUubWF0Y2hlcy5sZW5ndGggPiAwICYmICFpbml0aWFsTWF0Y2hlc0lzRk9XID8gKFxuICAgICAgLy8gYG1hdGNoUm91dGVzKClgIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGlmIHdlJ3JlIGluIGhlcmUgdmlhIGByb3V0ZXIuaW5pdGlhbGl6ZSgpYFxuICAgICAgc3RhdGUubWF0Y2hlc1xuICAgICkgOiBtYXRjaFJvdXRlcyhyb3V0ZXNUb1VzZSwgbG9jYXRpb24sIGJhc2VuYW1lKTtcbiAgICBsZXQgZmx1c2hTeW5jID0gKG9wdHMgJiYgb3B0cy5mbHVzaFN5bmMpID09PSB0cnVlO1xuICAgIGlmIChtYXRjaGVzICYmIHN0YXRlLmluaXRpYWxpemVkICYmICFpc1JldmFsaWRhdGlvblJlcXVpcmVkICYmIGlzSGFzaENoYW5nZU9ubHkoc3RhdGUubG9jYXRpb24sIGxvY2F0aW9uKSAmJiAhKG9wdHMgJiYgb3B0cy5zdWJtaXNzaW9uICYmIGlzTXV0YXRpb25NZXRob2Qob3B0cy5zdWJtaXNzaW9uLmZvcm1NZXRob2QpKSkge1xuICAgICAgY29tcGxldGVOYXZpZ2F0aW9uKGxvY2F0aW9uLCB7IG1hdGNoZXMgfSwgeyBmbHVzaFN5bmMgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBmb2dPZldhciA9IGNoZWNrRm9nT2ZXYXIobWF0Y2hlcywgcm91dGVzVG9Vc2UsIGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICBpZiAoZm9nT2ZXYXIuYWN0aXZlICYmIGZvZ09mV2FyLm1hdGNoZXMpIHtcbiAgICAgIG1hdGNoZXMgPSBmb2dPZldhci5tYXRjaGVzO1xuICAgIH1cbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIGxldCB7IGVycm9yLCBub3RGb3VuZE1hdGNoZXMsIHJvdXRlIH0gPSBoYW5kbGVOYXZpZ2F0aW9uYWw0MDQoXG4gICAgICAgIGxvY2F0aW9uLnBhdGhuYW1lXG4gICAgICApO1xuICAgICAgY29tcGxldGVOYXZpZ2F0aW9uKFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAge1xuICAgICAgICAgIG1hdGNoZXM6IG5vdEZvdW5kTWF0Y2hlcyxcbiAgICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICAgIFtyb3V0ZS5pZF06IGVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7IGZsdXNoU3luYyB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgbGV0IHJlcXVlc3QgPSBjcmVhdGVDbGllbnRTaWRlUmVxdWVzdChcbiAgICAgIGluaXQuaGlzdG9yeSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyLnNpZ25hbCxcbiAgICAgIG9wdHMgJiYgb3B0cy5zdWJtaXNzaW9uXG4gICAgKTtcbiAgICBsZXQgc2NvcGVkQ29udGV4dCA9IGluaXQuZ2V0Q29udGV4dCA/IGF3YWl0IGluaXQuZ2V0Q29udGV4dCgpIDogbmV3IFJvdXRlckNvbnRleHRQcm92aWRlcigpO1xuICAgIGxldCBwZW5kaW5nQWN0aW9uUmVzdWx0O1xuICAgIGlmIChvcHRzICYmIG9wdHMucGVuZGluZ0Vycm9yKSB7XG4gICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0ID0gW1xuICAgICAgICBmaW5kTmVhcmVzdEJvdW5kYXJ5KG1hdGNoZXMpLnJvdXRlLmlkLFxuICAgICAgICB7IHR5cGU6IFwiZXJyb3JcIiAvKiBlcnJvciAqLywgZXJyb3I6IG9wdHMucGVuZGluZ0Vycm9yIH1cbiAgICAgIF07XG4gICAgfSBlbHNlIGlmIChvcHRzICYmIG9wdHMuc3VibWlzc2lvbiAmJiBpc011dGF0aW9uTWV0aG9kKG9wdHMuc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkge1xuICAgICAgbGV0IGFjdGlvblJlc3VsdCA9IGF3YWl0IGhhbmRsZUFjdGlvbihcbiAgICAgICAgcmVxdW
25114VzdCxcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIG9wdHMuc3VibWlzc2lvbixcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgICAgZm9nT2ZXYXIuYWN0aXZlLFxuICAgICAgICBvcHRzICYmIG9wdHMuaW5pdGlhbEh5ZHJhdGlvbiA9PT0gdHJ1ZSxcbiAgICAgICAgeyByZXBsYWNlOiBvcHRzLnJlcGxhY2UsIGZsdXNoU3luYyB9XG4gICAgICApO1xuICAgICAgaWYgKGFjdGlvblJlc3VsdC5zaG9ydENpcmN1aXRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoYWN0aW9uUmVzdWx0LnBlbmRpbmdBY3Rpb25SZXN1bHQpIHtcbiAgICAgICAgbGV0IFtyb3V0ZUlkLCByZXN1bHRdID0gYWN0aW9uUmVzdWx0LnBlbmRpbmdBY3Rpb25SZXN1bHQ7XG4gICAgICAgIGlmIChpc0Vycm9yUmVzdWx0KHJlc3VsdCkgJiYgaXNSb3V0ZUVycm9yUmVzcG9uc2UocmVzdWx0LmVycm9yKSAmJiByZXN1bHQuZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBudWxsO1xuICAgICAgICAgIGNvbXBsZXRlTmF2aWdhdGlvbihsb2NhdGlvbiwge1xuICAgICAgICAgICAgbWF0Y2hlczogYWN0aW9uUmVzdWx0Lm1hdGNoZXMsXG4gICAgICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgICAgIGVycm9yczoge1xuICAgICAgICAgICAgICBbcm91dGVJZF06IHJlc3VsdC5lcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWF0Y2hlcyA9IGFjdGlvblJlc3VsdC5tYXRjaGVzIHx8IG1hdGNoZXM7XG4gICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0ID0gYWN0aW9uUmVzdWx0LnBlbmRpbmdBY3Rpb25SZXN1bHQ7XG4gICAgICBsb2FkaW5nTmF2aWdhdGlvbiA9IGdldExvYWRpbmdOYXZpZ2F0aW9uKGxvY2F0aW9uLCBvcHRzLnN1Ym1pc3Npb24pO1xuICAgICAgZmx1c2hTeW5jID0gZmFsc2U7XG4gICAgICBmb2dPZldhci5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIHJlcXVlc3QgPSBjcmVhdGVDbGllbnRTaWRlUmVxdWVzdChcbiAgICAgICAgaW5pdC5oaXN0b3J5LFxuICAgICAgICByZXF1ZXN0LnVybCxcbiAgICAgICAgcmVxdWVzdC5zaWduYWxcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCB7XG4gICAgICBzaG9ydENpcmN1aXRlZCxcbiAgICAgIG1hdGNoZXM6IHVwZGF0ZWRNYXRjaGVzLFxuICAgICAgbG9hZGVyRGF0YSxcbiAgICAgIGVycm9yc1xuICAgIH0gPSBhd2FpdCBoYW5kbGVMb2FkZXJzKFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgbWF0Y2hlcyxcbiAgICAgIHNjb3BlZENvbnRleHQsXG4gICAgICBmb2dPZldhci5hY3RpdmUsXG4gICAgICBsb2FkaW5nTmF2aWdhdGlvbixcbiAgICAgIG9wdHMgJiYgb3B0cy5zdWJtaXNzaW9uLFxuICAgICAgb3B0cyAmJiBvcHRzLmZldGNoZXJTdWJtaXNzaW9uLFxuICAgICAgb3B0cyAmJiBvcHRzLnJlcGxhY2UsXG4gICAgICBvcHRzICYmIG9wdHMuaW5pdGlhbEh5ZHJhdGlvbiA9PT0gdHJ1ZSxcbiAgICAgIGZsdXNoU3luYyxcbiAgICAgIHBlbmRpbmdBY3Rpb25SZXN1bHRcbiAgICApO1xuICAgIGlmIChzaG9ydENpcmN1aXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBudWxsO1xuICAgIGNvbXBsZXRlTmF2aWdhdGlvbihsb2NhdGlvbiwge1xuICAgICAgbWF0Y2hlczogdXBkYXRlZE1hdGNoZXMgfHwgbWF0Y2hlcyxcbiAgICAgIC4uLmdldEFjdGlvbkRhdGFGb3JDb21taXQocGVuZGluZ0FjdGlvblJlc3VsdCksXG4gICAgICBsb2FkZXJEYXRhLFxuICAgICAgZXJyb3JzXG4gICAgfSk7XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlQWN0aW9uKHJlcXVlc3QsIGxvY2F0aW9uLCBzdWJtaXNzaW9uLCBtYXRjaGVzLCBzY29wZWRDb250ZXh0LCBpc0ZvZ09mV2FyLCBpbml0aWFsSHlkcmF0aW9uLCBvcHRzID0ge30pIHtcbiAgICBpbnRlcnJ1cHRBY3RpdmVMb2FkcygpO1xuICAgIGxldCBuYXZpZ2F0aW9uID0gZ2V0U3VibWl0dGluZ05hdmlnYXRpb24obG9jYXRpb24sIHN1Ym1pc3Npb24pO1xuICAgIHVwZGF0ZVN0YXRlKHsgbmF2aWdhdGlvbiB9LCB7IGZsdXNoU3luYzogb3B0cy5mbHVzaFN5bmMgPT09IHRydWUgfSk7XG4gICAgaWYgKGlzRm9nT2ZXYXIpIHtcbiAgICAgIGxldCBkaXNjb3ZlclJlc3VsdCA9IGF3YWl0IGRpc2NvdmVyUm91dGVzKFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgcmVxdWVzdC5zaWduYWxcbiAgICAgICk7XG4gICAgICBpZiAoZGlzY292ZXJSZXN1bHQudHlwZSA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgcmV0dXJuIHsgc2hvcnRDaXJjdWl0ZWQ6IHRydWUgfTtcbiAgICAgIH0gZWxzZSBpZiAoZGlzY292ZXJSZXN1bHQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgIGlmIChkaXNjb3ZlclJlc3VsdC5wYXJ0aWFsTWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsZXQgeyBtYXRjaGVzOiBtYXRjaGVzMiwgcm91dGUgfSA9IGdldFNob3J0Q2lyY3VpdE1hdGNoZXMoZGF0YVJvdXRlcyk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1hdGNoZXM6IG1hdGNoZXMyLFxuICAgICAgICAgICAgcGVuZGluZ0FjdGlvblJlc3VsdDogW1xuICAgICAgICAgICAgICByb3V0ZS5pZCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIiAvKiBlcnJvciAqLyxcbiAgICAgICAgICAgICAgICBlcnJvcjogZGlzY292ZXJSZXN1bHQuZXJyb3JcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJvdW5kYXJ5SWQgPSBmaW5kTmVhcmVzdEJvdW5kYXJ5KGRpc2NvdmVyUmVzdWx0LnBhcnRpYWxNYXRjaGVzKS5yb3V0ZS5pZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtYXRjaGVzOiBkaXNjb3ZlclJlc3VsdC5wYXJ0aWFsTWF0Y2hlcyxcbiAgICAgICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0OiBbXG4gICAgICAgICAgICBib3VuZGFyeUlkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eX
25114BlOiBcImVycm9yXCIgLyogZXJyb3IgKi8sXG4gICAgICAgICAgICAgIGVycm9yOiBkaXNjb3ZlclJlc3VsdC5lcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoIWRpc2NvdmVyUmVzdWx0Lm1hdGNoZXMpIHtcbiAgICAgICAgbGV0IHsgbm90Rm91bmRNYXRjaGVzLCBlcnJvciwgcm91dGUgfSA9IGhhbmRsZU5hdmlnYXRpb25hbDQwNChcbiAgICAgICAgICBsb2NhdGlvbi5wYXRobmFtZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1hdGNoZXM6IG5vdEZvdW5kTWF0Y2hlcyxcbiAgICAgICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0OiBbXG4gICAgICAgICAgICByb3V0ZS5pZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiIC8qIGVycm9yICovLFxuICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdGNoZXMgPSBkaXNjb3ZlclJlc3VsdC5tYXRjaGVzO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmVzdWx0O1xuICAgIGxldCBhY3Rpb25NYXRjaCA9IGdldFRhcmdldE1hdGNoKG1hdGNoZXMsIGxvY2F0aW9uKTtcbiAgICBpZiAoIWFjdGlvbk1hdGNoLnJvdXRlLmFjdGlvbiAmJiAhYWN0aW9uTWF0Y2gucm91dGUubGF6eSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICB0eXBlOiBcImVycm9yXCIgLyogZXJyb3IgKi8sXG4gICAgICAgIGVycm9yOiBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNSwge1xuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgIHJvdXRlSWQ6IGFjdGlvbk1hdGNoLnJvdXRlLmlkXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZHNNYXRjaGVzID0gZ2V0VGFyZ2V0ZWREYXRhU3RyYXRlZ3lNYXRjaGVzKFxuICAgICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgYWN0aW9uTWF0Y2gsXG4gICAgICAgIGluaXRpYWxIeWRyYXRpb24gPyBbXSA6IGh5ZHJhdGlvblJvdXRlUHJvcGVydGllczIsXG4gICAgICAgIHNjb3BlZENvbnRleHRcbiAgICAgICk7XG4gICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IGNhbGxEYXRhU3RyYXRlZ3koXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGRzTWF0Y2hlcyxcbiAgICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdHNbYWN0aW9uTWF0Y2gucm91dGUuaWRdO1xuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgIGlmIChyZXN1bHRzW21hdGNoLnJvdXRlLmlkXSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0c1ttYXRjaC5yb3V0ZS5pZF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybiB7IHNob3J0Q2lyY3VpdGVkOiB0cnVlIH07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1JlZGlyZWN0UmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIGxldCByZXBsYWNlMjtcbiAgICAgIGlmIChvcHRzICYmIG9wdHMucmVwbGFjZSAhPSBudWxsKSB7XG4gICAgICAgIHJlcGxhY2UyID0gb3B0cy5yZXBsYWNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGxvY2F0aW9uMiA9IG5vcm1hbGl6ZVJlZGlyZWN0TG9jYXRpb24oXG4gICAgICAgICAgcmVzdWx0LnJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiTG9jYXRpb25cIiksXG4gICAgICAgICAgbmV3IFVSTChyZXF1ZXN0LnVybCksXG4gICAgICAgICAgYmFzZW5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgcmVwbGFjZTIgPSBsb2NhdGlvbjIgPT09IHN0YXRlLmxvY2F0aW9uLnBhdGhuYW1lICsgc3RhdGUubG9jYXRpb24uc2VhcmNoO1xuICAgICAgfVxuICAgICAgYXdhaXQgc3RhcnRSZWRpcmVjdE5hdmlnYXRpb24ocmVxdWVzdCwgcmVzdWx0LCB0cnVlLCB7XG4gICAgICAgIHN1Ym1pc3Npb24sXG4gICAgICAgIHJlcGxhY2U6IHJlcGxhY2UyXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHNob3J0Q2lyY3VpdGVkOiB0cnVlIH07XG4gICAgfVxuICAgIGlmIChpc0Vycm9yUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIGxldCBib3VuZGFyeU1hdGNoID0gZmluZE5lYXJlc3RCb3VuZGFyeShtYXRjaGVzLCBhY3Rpb25NYXRjaC5yb3V0ZS5pZCk7XG4gICAgICBpZiAoKG9wdHMgJiYgb3B0cy5yZXBsYWNlKSAhPT0gdHJ1ZSkge1xuICAgICAgICBwZW5kaW5nQWN0aW9uID0gXCJQVVNIXCIgLyogUHVzaCAqLztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIHBlbmRpbmdBY3Rpb25SZXN1bHQ6IFtcbiAgICAgICAgICBib3VuZGFyeU1hdGNoLnJvdXRlLmlkLFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICBhY3Rpb25NYXRjaC5yb3V0ZS5pZFxuICAgICAgICBdXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbWF0Y2hlcyxcbiAgICAgIHBlbmRpbmdBY3Rpb25SZXN1bHQ6IFthY3Rpb25NYXRjaC5yb3V0ZS5pZCwgcmVzdWx0XVxuICAgIH07XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlTG9hZGVycyhyZXF1ZXN0LCBsb2NhdGlvbiwgbWF0Y2hlcywgc2NvcGVkQ29udGV4dCwgaXNGb2dPZldhciwgb3ZlcnJpZGVOYXZpZ2F0aW9uLCBzdWJtaXNzaW9uLCBmZXRjaGVyU3VibWlzc2lvbiwgcmVwbGFjZTIsIGluaXRpYWxIeWRyYXRpb24sIGZsdXNoU3luYywgcGVuZGluZ0FjdGlvblJlc3VsdCkge1xuICAgIGxldCBsb2FkaW5nTmF2aWdhdGlvbiA9IG92ZXJyaWRlTmF2aWdhdGlvbiB8fCBnZXRMb2FkaW5nTmF2aWdhdGlvbihsb2NhdGlvbiwgc3VibWlzc2lvbik7XG4gICAgbGV0IGFjdGl2ZVN1Ym1pc3Npb24gPSBzdWJtaXNzaW9uIHx8IGZldGNoZXJTdWJtaXNzaW9uIHx8IGdldFN1Ym1pc3Npb25Gcm9tTmF2aWdhdGlvbihsb2FkaW5nTmF2aWdhdGlvbik7XG4gICAgbGV0IHNob3VsZFVwZGF0ZU5hdmlnYXRpb25TdGF0ZSA9ICFpc1VuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb24gJiYgIWluaXRpYWxIeWRyYXRpb247XG4gICAgaWYgKGlzRm9nT2ZXYXIpIHtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVOYXZpZ2F0aW9uU3RhdGUpIHtcbiAgICAgICAgbGV0IGFjdGlvbkRhdGEgPSBnZXRVcGRhdGVkQWN0aW9uRGF0YShwZW5kaW5nQWN0aW9uUmVzdWx0KTtcbiAgICAgICAgdXBkYXRlU3RhdGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmF2aWdhdGlvbjogbG9hZGluZ05hdmlnYXRpb24sXG4gICAgICAgICAgICAuLi5hY3Rpb25EYXRhICE9PSB2b2lkIDAgPyB7IGFjdGlvbkRhdGEgfSA6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmbHVzaFN5bmNcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgZGlzY292ZXJSZXN1bHQgPSBhd2FpdCBkaXNjb3ZlclJvdXRlcyhcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgI
25114HJlcXVlc3Quc2lnbmFsXG4gICAgICApO1xuICAgICAgaWYgKGRpc2NvdmVyUmVzdWx0LnR5cGUgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICAgIHJldHVybiB7IHNob3J0Q2lyY3VpdGVkOiB0cnVlIH07XG4gICAgICB9IGVsc2UgaWYgKGRpc2NvdmVyUmVzdWx0LnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICBpZiAoZGlzY292ZXJSZXN1bHQucGFydGlhbE1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbGV0IHsgbWF0Y2hlczogbWF0Y2hlczIsIHJvdXRlIH0gPSBnZXRTaG9ydENpcmN1aXRNYXRjaGVzKGRhdGFSb3V0ZXMpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYXRjaGVzOiBtYXRjaGVzMixcbiAgICAgICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICAgICAgZXJyb3JzOiB7XG4gICAgICAgICAgICAgIFtyb3V0ZS5pZF06IGRpc2NvdmVyUmVzdWx0LmVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYm91bmRhcnlJZCA9IGZpbmROZWFyZXN0Qm91bmRhcnkoZGlzY292ZXJSZXN1bHQucGFydGlhbE1hdGNoZXMpLnJvdXRlLmlkO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1hdGNoZXM6IGRpc2NvdmVyUmVzdWx0LnBhcnRpYWxNYXRjaGVzLFxuICAgICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICAgIGVycm9yczoge1xuICAgICAgICAgICAgW2JvdW5kYXJ5SWRdOiBkaXNjb3ZlclJlc3VsdC5lcnJvclxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoIWRpc2NvdmVyUmVzdWx0Lm1hdGNoZXMpIHtcbiAgICAgICAgbGV0IHsgZXJyb3IsIG5vdEZvdW5kTWF0Y2hlcywgcm91dGUgfSA9IGhhbmRsZU5hdmlnYXRpb25hbDQwNChcbiAgICAgICAgICBsb2NhdGlvbi5wYXRobmFtZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1hdGNoZXM6IG5vdEZvdW5kTWF0Y2hlcyxcbiAgICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICAgIFtyb3V0ZS5pZF06IGVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF0Y2hlcyA9IGRpc2NvdmVyUmVzdWx0Lm1hdGNoZXM7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIGxldCB7IGRzTWF0Y2hlcywgcmV2YWxpZGF0aW5nRmV0Y2hlcnMgfSA9IGdldE1hdGNoZXNUb0xvYWQoXG4gICAgICByZXF1ZXN0LFxuICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIGluaXQuaGlzdG9yeSxcbiAgICAgIHN0YXRlLFxuICAgICAgbWF0Y2hlcyxcbiAgICAgIGFjdGl2ZVN1Ym1pc3Npb24sXG4gICAgICBsb2NhdGlvbixcbiAgICAgIGluaXRpYWxIeWRyYXRpb24gPyBbXSA6IGh5ZHJhdGlvblJvdXRlUHJvcGVydGllczIsXG4gICAgICBpbml0aWFsSHlkcmF0aW9uID09PSB0cnVlLFxuICAgICAgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCxcbiAgICAgIGNhbmNlbGxlZEZldGNoZXJMb2FkcyxcbiAgICAgIGZldGNoZXJzUXVldWVkRm9yRGVsZXRpb24sXG4gICAgICBmZXRjaExvYWRNYXRjaGVzLFxuICAgICAgZmV0Y2hSZWRpcmVjdElkcyxcbiAgICAgIHJvdXRlc1RvVXNlLFxuICAgICAgYmFzZW5hbWUsXG4gICAgICBpbml0LnBhdGNoUm91dGVzT25OYXZpZ2F0aW9uICE9IG51bGwsXG4gICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0XG4gICAgKTtcbiAgICBwZW5kaW5nTmF2aWdhdGlvbkxvYWRJZCA9ICsraW5jcmVtZW50aW5nTG9hZElkO1xuICAgIGlmICghaW5pdC5kYXRhU3RyYXRlZ3kgJiYgIWRzTWF0Y2hlcy5zb21lKChtKSA9PiBtLnNob3VsZExvYWQpICYmICFkc01hdGNoZXMuc29tZShcbiAgICAgIChtKSA9PiBtLnJvdXRlLm1pZGRsZXdhcmUgJiYgbS5yb3V0ZS5taWRkbGV3YXJlLmxlbmd0aCA+IDBcbiAgICApICYmIHJldmFsaWRhdGluZ0ZldGNoZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbGV0IHVwZGF0ZWRGZXRjaGVyczIgPSBtYXJrRmV0Y2hSZWRpcmVjdHNEb25lKCk7XG4gICAgICBjb21wbGV0ZU5hdmlnYXRpb24oXG4gICAgICAgIGxvY2F0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgICAvLyBDb21taXQgcGVuZGluZyBlcnJvciBpZiB3ZSdyZSBzaG9ydCBjaXJjdWl0aW5nXG4gICAgICAgICAgZXJyb3JzOiBwZW5kaW5nQWN0aW9uUmVzdWx0ICYmIGlzRXJyb3JSZXN1bHQocGVuZGluZ0FjdGlvblJlc3VsdFsxXSkgPyB7IFtwZW5kaW5nQWN0aW9uUmVzdWx0WzBdXTogcGVuZGluZ0FjdGlvblJlc3VsdFsxXS5lcnJvciB9IDogbnVsbCxcbiAgICAgICAgICAuLi5nZXRBY3Rpb25EYXRhRm9yQ29tbWl0KHBlbmRpbmdBY3Rpb25SZXN1bHQpLFxuICAgICAgICAgIC4uLnVwZGF0ZWRGZXRjaGVyczIgPyB7IGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKSB9IDoge31cbiAgICAgICAgfSxcbiAgICAgICAgeyBmbHVzaFN5bmMgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHNob3J0Q2lyY3VpdGVkOiB0cnVlIH07XG4gICAgfVxuICAgIGlmIChzaG91bGRVcGRhdGVOYXZpZ2F0aW9uU3RhdGUpIHtcbiAgICAgIGxldCB1cGRhdGVzID0ge307XG4gICAgICBpZiAoIWlzRm9nT2ZXYXIpIHtcbiAgICAgICAgdXBkYXRlcy5uYXZpZ2F0aW9uID0gbG9hZGluZ05hdmlnYXRpb247XG4gICAgICAgIGxldCBhY3Rpb25EYXRhID0gZ2V0VXBkYXRlZEFjdGlvbkRhdGEocGVuZGluZ0FjdGlvblJlc3VsdCk7XG4gICAgICAgIGlmIChhY3Rpb25EYXRhICE9PSB2b2lkIDApIHtcbiAgICAgICAgICB1cGRhdGVzLmFjdGlvbkRhdGEgPSBhY3Rpb25EYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmV2YWxpZGF0aW5nRmV0Y2hlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB1cGRhdGVzLmZldGNoZXJzID0gZ2V0VXBkYXRlZFJldmFsaWRhdGluZ0ZldGNoZXJzKHJldmFsaWRhdGluZ0ZldGNoZXJzKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZVN0YXRlKHVwZGF0ZXMsIHsgZmx1c2hTeW5jIH0pO1xuICAgIH1cbiAgICByZXZhbGlkYXRpbmdGZXRjaGVycy5mb3JFYWNoKChyZikgPT4ge1xuICAgICAgYWJvcnRGZXRjaGVyKHJmLmtleSk7XG4gICAgICBpZiAocmYuY29udHJvbGxlcikge1xuICAgICAgICBmZXRjaENvbnRyb2xsZXJzLnNldChyZi5rZXksIHJmLmNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnMgPSAoKSA9PiByZXZhbGlkYXRpbmdGZXRjaGVycy5mb3JFYWNoKChmKSA9PiBhYm9ydEZldGNoZXIoZi
251145rZXkpKTtcbiAgICBpZiAocGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyKSB7XG4gICAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFwiYWJvcnRcIixcbiAgICAgICAgYWJvcnRQZW5kaW5nRmV0Y2hSZXZhbGlkYXRpb25zXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgeyBsb2FkZXJSZXN1bHRzLCBmZXRjaGVyUmVzdWx0cyB9ID0gYXdhaXQgY2FsbExvYWRlcnNBbmRNYXliZVJlc29sdmVEYXRhKFxuICAgICAgZHNNYXRjaGVzLFxuICAgICAgcmV2YWxpZGF0aW5nRmV0Y2hlcnMsXG4gICAgICByZXF1ZXN0LFxuICAgICAgc2NvcGVkQ29udGV4dFxuICAgICk7XG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybiB7IHNob3J0Q2lyY3VpdGVkOiB0cnVlIH07XG4gICAgfVxuICAgIGlmIChwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIpIHtcbiAgICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlci5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJhYm9ydFwiLFxuICAgICAgICBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLmZvckVhY2goKHJmKSA9PiBmZXRjaENvbnRyb2xsZXJzLmRlbGV0ZShyZi5rZXkpKTtcbiAgICBsZXQgcmVkaXJlY3QyID0gZmluZFJlZGlyZWN0KGxvYWRlclJlc3VsdHMpO1xuICAgIGlmIChyZWRpcmVjdDIpIHtcbiAgICAgIGF3YWl0IHN0YXJ0UmVkaXJlY3ROYXZpZ2F0aW9uKHJlcXVlc3QsIHJlZGlyZWN0Mi5yZXN1bHQsIHRydWUsIHtcbiAgICAgICAgcmVwbGFjZTogcmVwbGFjZTJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgc2hvcnRDaXJjdWl0ZWQ6IHRydWUgfTtcbiAgICB9XG4gICAgcmVkaXJlY3QyID0gZmluZFJlZGlyZWN0KGZldGNoZXJSZXN1bHRzKTtcbiAgICBpZiAocmVkaXJlY3QyKSB7XG4gICAgICBmZXRjaFJlZGlyZWN0SWRzLmFkZChyZWRpcmVjdDIua2V5KTtcbiAgICAgIGF3YWl0IHN0YXJ0UmVkaXJlY3ROYXZpZ2F0aW9uKHJlcXVlc3QsIHJlZGlyZWN0Mi5yZXN1bHQsIHRydWUsIHtcbiAgICAgICAgcmVwbGFjZTogcmVwbGFjZTJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgc2hvcnRDaXJjdWl0ZWQ6IHRydWUgfTtcbiAgICB9XG4gICAgbGV0IHsgbG9hZGVyRGF0YSwgZXJyb3JzIH0gPSBwcm9jZXNzTG9hZGVyRGF0YShcbiAgICAgIHN0YXRlLFxuICAgICAgbWF0Y2hlcyxcbiAgICAgIGxvYWRlclJlc3VsdHMsXG4gICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0LFxuICAgICAgcmV2YWxpZGF0aW5nRmV0Y2hlcnMsXG4gICAgICBmZXRjaGVyUmVzdWx0c1xuICAgICk7XG4gICAgaWYgKGluaXRpYWxIeWRyYXRpb24gJiYgc3RhdGUuZXJyb3JzKSB7XG4gICAgICBlcnJvcnMgPSB7IC4uLnN0YXRlLmVycm9ycywgLi4uZXJyb3JzIH07XG4gICAgfVxuICAgIGxldCB1cGRhdGVkRmV0Y2hlcnMgPSBtYXJrRmV0Y2hSZWRpcmVjdHNEb25lKCk7XG4gICAgbGV0IGRpZEFib3J0RmV0Y2hMb2FkcyA9IGFib3J0U3RhbGVGZXRjaExvYWRzKHBlbmRpbmdOYXZpZ2F0aW9uTG9hZElkKTtcbiAgICBsZXQgc2hvdWxkVXBkYXRlRmV0Y2hlcnMgPSB1cGRhdGVkRmV0Y2hlcnMgfHwgZGlkQWJvcnRGZXRjaExvYWRzIHx8IHJldmFsaWRhdGluZ0ZldGNoZXJzLmxlbmd0aCA+IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hdGNoZXMsXG4gICAgICBsb2FkZXJEYXRhLFxuICAgICAgZXJyb3JzLFxuICAgICAgLi4uc2hvdWxkVXBkYXRlRmV0Y2hlcnMgPyB7IGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKSB9IDoge31cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGdldFVwZGF0ZWRBY3Rpb25EYXRhKHBlbmRpbmdBY3Rpb25SZXN1bHQpIHtcbiAgICBpZiAocGVuZGluZ0FjdGlvblJlc3VsdCAmJiAhaXNFcnJvclJlc3VsdChwZW5kaW5nQWN0aW9uUmVzdWx0WzFdKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW3BlbmRpbmdBY3Rpb25SZXN1bHRbMF1dOiBwZW5kaW5nQWN0aW9uUmVzdWx0WzFdLmRhdGFcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5hY3Rpb25EYXRhKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoc3RhdGUuYWN0aW9uRGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmFjdGlvbkRhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdldFVwZGF0ZWRSZXZhbGlkYXRpbmdGZXRjaGVycyhyZXZhbGlkYXRpbmdGZXRjaGVycykge1xuICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLmZvckVhY2goKHJmKSA9PiB7XG4gICAgICBsZXQgZmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChyZi5rZXkpO1xuICAgICAgbGV0IHJldmFsaWRhdGluZ0ZldGNoZXIgPSBnZXRMb2FkaW5nRmV0Y2hlcihcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBmZXRjaGVyID8gZmV0Y2hlci5kYXRhIDogdm9pZCAwXG4gICAgICApO1xuICAgICAgc3RhdGUuZmV0Y2hlcnMuc2V0KHJmLmtleSwgcmV2YWxpZGF0aW5nRmV0Y2hlcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBNYXAoc3RhdGUuZmV0Y2hlcnMpO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoMihrZXksIHJvdXRlSWQsIGhyZWYsIG9wdHMpIHtcbiAgICBhYm9ydEZldGNoZXIoa2V5KTtcbiAgICBsZXQgZmx1c2hTeW5jID0gKG9wdHMgJiYgb3B0cy5mbHVzaFN5bmMpID09PSB0cnVlO1xuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIGxldCBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZVRvKFxuICAgICAgc3RhdGUubG9jYXRpb24sXG4gICAgICBzdGF0ZS5tYXRjaGVzLFxuICAgICAgYmFzZW5hbWUsXG4gICAgICBocmVmLFxuICAgICAgcm91dGVJZCxcbiAgICAgIG9wdHM/LnJlbGF0aXZlXG4gICAgKTtcbiAgICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKHJvdXRlc1RvVXNlLCBub3JtYWxpem
25114VkUGF0aCwgYmFzZW5hbWUpO1xuICAgIGxldCBmb2dPZldhciA9IGNoZWNrRm9nT2ZXYXIobWF0Y2hlcywgcm91dGVzVG9Vc2UsIG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBpZiAoZm9nT2ZXYXIuYWN0aXZlICYmIGZvZ09mV2FyLm1hdGNoZXMpIHtcbiAgICAgIG1hdGNoZXMgPSBmb2dPZldhci5tYXRjaGVzO1xuICAgIH1cbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHNldEZldGNoZXJFcnJvcihcbiAgICAgICAga2V5LFxuICAgICAgICByb3V0ZUlkLFxuICAgICAgICBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwgeyBwYXRobmFtZTogbm9ybWFsaXplZFBhdGggfSksXG4gICAgICAgIHsgZmx1c2hTeW5jIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB7IHBhdGgsIHN1Ym1pc3Npb24sIGVycm9yIH0gPSBub3JtYWxpemVOYXZpZ2F0ZU9wdGlvbnMoXG4gICAgICB0cnVlLFxuICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICBvcHRzXG4gICAgKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHNldEZldGNoZXJFcnJvcihrZXksIHJvdXRlSWQsIGVycm9yLCB7IGZsdXNoU3luYyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNjb3BlZENvbnRleHQgPSBpbml0LmdldENvbnRleHQgPyBhd2FpdCBpbml0LmdldENvbnRleHQoKSA6IG5ldyBSb3V0ZXJDb250ZXh0UHJvdmlkZXIoKTtcbiAgICBsZXQgcHJldmVudFNjcm9sbFJlc2V0ID0gKG9wdHMgJiYgb3B0cy5wcmV2ZW50U2Nyb2xsUmVzZXQpID09PSB0cnVlO1xuICAgIGlmIChzdWJtaXNzaW9uICYmIGlzTXV0YXRpb25NZXRob2Qoc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkge1xuICAgICAgYXdhaXQgaGFuZGxlRmV0Y2hlckFjdGlvbihcbiAgICAgICAga2V5LFxuICAgICAgICByb3V0ZUlkLFxuICAgICAgICBwYXRoLFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBzY29wZWRDb250ZXh0LFxuICAgICAgICBmb2dPZldhci5hY3RpdmUsXG4gICAgICAgIGZsdXNoU3luYyxcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgICBzdWJtaXNzaW9uXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmZXRjaExvYWRNYXRjaGVzLnNldChrZXksIHsgcm91dGVJZCwgcGF0aCB9KTtcbiAgICBhd2FpdCBoYW5kbGVGZXRjaGVyTG9hZGVyKFxuICAgICAga2V5LFxuICAgICAgcm91dGVJZCxcbiAgICAgIHBhdGgsXG4gICAgICBtYXRjaGVzLFxuICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgIGZvZ09mV2FyLmFjdGl2ZSxcbiAgICAgIGZsdXNoU3luYyxcbiAgICAgIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgICAgIHN1Ym1pc3Npb25cbiAgICApO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUZldGNoZXJBY3Rpb24oa2V5LCByb3V0ZUlkLCBwYXRoLCByZXF1ZXN0TWF0Y2hlcywgc2NvcGVkQ29udGV4dCwgaXNGb2dPZldhciwgZmx1c2hTeW5jLCBwcmV2ZW50U2Nyb2xsUmVzZXQsIHN1Ym1pc3Npb24pIHtcbiAgICBpbnRlcnJ1cHRBY3RpdmVMb2FkcygpO1xuICAgIGZldGNoTG9hZE1hdGNoZXMuZGVsZXRlKGtleSk7XG4gICAgbGV0IGV4aXN0aW5nRmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChrZXkpO1xuICAgIHVwZGF0ZUZldGNoZXJTdGF0ZShrZXksIGdldFN1Ym1pdHRpbmdGZXRjaGVyKHN1Ym1pc3Npb24sIGV4aXN0aW5nRmV0Y2hlciksIHtcbiAgICAgIGZsdXNoU3luY1xuICAgIH0pO1xuICAgIGxldCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgbGV0IGZldGNoUmVxdWVzdCA9IGNyZWF0ZUNsaWVudFNpZGVSZXF1ZXN0KFxuICAgICAgaW5pdC5oaXN0b3J5LFxuICAgICAgcGF0aCxcbiAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICBzdWJtaXNzaW9uXG4gICAgKTtcbiAgICBpZiAoaXNGb2dPZldhcikge1xuICAgICAgbGV0IGRpc2NvdmVyUmVzdWx0ID0gYXdhaXQgZGlzY292ZXJSb3V0ZXMoXG4gICAgICAgIHJlcXVlc3RNYXRjaGVzLFxuICAgICAgICBuZXcgVVJMKGZldGNoUmVxdWVzdC51cmwpLnBhdGhuYW1lLFxuICAgICAgICBmZXRjaFJlcXVlc3Quc2lnbmFsLFxuICAgICAgICBrZXlcbiAgICAgICk7XG4gICAgICBpZiAoZGlzY292ZXJSZXN1bHQudHlwZSA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChkaXNjb3ZlclJlc3VsdC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgZGlzY292ZXJSZXN1bHQuZXJyb3IsIHsgZmx1c2hTeW5jIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKCFkaXNjb3ZlclJlc3VsdC5tYXRjaGVzKSB7XG4gICAgICAgIHNldEZldGNoZXJFcnJvcihcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgcm91dGVJZCxcbiAgICAgICAgICBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwgeyBwYXRobmFtZTogcGF0aCB9KSxcbiAgICAgICAgICB7IGZsdXNoU3luYyB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3RNYXRjaGVzID0gZGlzY292ZXJSZXN1bHQubWF0Y2hlcztcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IG1hdGNoID0gZ2V0VGFyZ2V0TWF0Y2gocmVxdWVzdE1hdGNoZXMsIHBhdGgpO1xuICAgIGlmICghbWF0Y2gucm91dGUuYWN0aW9uICYmICFtYXRjaC5yb3V0ZS5sYXp5KSB7XG4gICAgICBsZXQgZXJyb3IgPSBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNSwge1xuICAgICAgICBtZXRob2Q6IHN1Ym1pc3Npb24uZm9ybU1ldGhvZCxcbiAgICAgICAgcGF0aG5hbWU6IHBhdGgsXG4gICAgICAgIHJvdXRlSWRcbiAgICAgIH0pO1xuICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgZXJyb3IsIHsgZmx1c2hTeW5jIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmZXRjaENvbnRyb2xsZXJzLnNldChrZXksIGFib3J0Q29udHJvbGxlcik7XG4gICAgbGV0IG9yaWdpbmF0aW5nTG9hZElkID0gaW5jcmVtZW50aW5nTG9hZElkO1xuICAgIGxldCBmZXRjaE1hdGNoZXMgPSBnZXRUYXJnZXRlZERhdGFTdHJhdGVneU1hdGNoZXMoXG4gICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBmZXRjaFJlcXVlc3QsXG4gICAgICByZXF1ZXN0TWF0Y2hlcyxcbiAgICAgIG1hdGNoLFxuICAgICAgaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzMixcbiAgICAgIHNjb3BlZENvbnRleHRcbiAgICApO
251141xuICAgIGxldCBhY3Rpb25SZXN1bHRzID0gYXdhaXQgY2FsbERhdGFTdHJhdGVneShcbiAgICAgIGZldGNoUmVxdWVzdCxcbiAgICAgIGZldGNoTWF0Y2hlcyxcbiAgICAgIHNjb3BlZENvbnRleHQsXG4gICAgICBrZXlcbiAgICApO1xuICAgIGxldCBhY3Rpb25SZXN1bHQgPSBhY3Rpb25SZXN1bHRzW21hdGNoLnJvdXRlLmlkXTtcbiAgICBpZiAoZmV0Y2hSZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBpZiAoZmV0Y2hDb250cm9sbGVycy5nZXQoa2V5KSA9PT0gYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgIGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChmZXRjaGVyc1F1ZXVlZEZvckRlbGV0aW9uLmhhcyhrZXkpKSB7XG4gICAgICBpZiAoaXNSZWRpcmVjdFJlc3VsdChhY3Rpb25SZXN1bHQpIHx8IGlzRXJyb3JSZXN1bHQoYWN0aW9uUmVzdWx0KSkge1xuICAgICAgICB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBnZXREb25lRmV0Y2hlcih2b2lkIDApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNSZWRpcmVjdFJlc3VsdChhY3Rpb25SZXN1bHQpKSB7XG4gICAgICAgIGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKGtleSk7XG4gICAgICAgIGlmIChwZW5kaW5nTmF2aWdhdGlvbkxvYWRJZCA+IG9yaWdpbmF0aW5nTG9hZElkKSB7XG4gICAgICAgICAgdXBkYXRlRmV0Y2hlclN0YXRlKGtleSwgZ2V0RG9uZUZldGNoZXIodm9pZCAwKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZldGNoUmVkaXJlY3RJZHMuYWRkKGtleSk7XG4gICAgICAgICAgdXBkYXRlRmV0Y2hlclN0YXRlKGtleSwgZ2V0TG9hZGluZ0ZldGNoZXIoc3VibWlzc2lvbikpO1xuICAgICAgICAgIHJldHVybiBzdGFydFJlZGlyZWN0TmF2aWdhdGlvbihmZXRjaFJlcXVlc3QsIGFjdGlvblJlc3VsdCwgZmFsc2UsIHtcbiAgICAgICAgICAgIGZldGNoZXJTdWJtaXNzaW9uOiBzdWJtaXNzaW9uLFxuICAgICAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0Vycm9yUmVzdWx0KGFjdGlvblJlc3VsdCkpIHtcbiAgICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgYWN0aW9uUmVzdWx0LmVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgbmV4dExvY2F0aW9uID0gc3RhdGUubmF2aWdhdGlvbi5sb2NhdGlvbiB8fCBzdGF0ZS5sb2NhdGlvbjtcbiAgICBsZXQgcmV2YWxpZGF0aW9uUmVxdWVzdCA9IGNyZWF0ZUNsaWVudFNpZGVSZXF1ZXN0KFxuICAgICAgaW5pdC5oaXN0b3J5LFxuICAgICAgbmV4dExvY2F0aW9uLFxuICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbFxuICAgICk7XG4gICAgbGV0IHJvdXRlc1RvVXNlID0gaW5GbGlnaHREYXRhUm91dGVzIHx8IGRhdGFSb3V0ZXM7XG4gICAgbGV0IG1hdGNoZXMgPSBzdGF0ZS5uYXZpZ2F0aW9uLnN0YXRlICE9PSBcImlkbGVcIiA/IG1hdGNoUm91dGVzKHJvdXRlc1RvVXNlLCBzdGF0ZS5uYXZpZ2F0aW9uLmxvY2F0aW9uLCBiYXNlbmFtZSkgOiBzdGF0ZS5tYXRjaGVzO1xuICAgIGludmFyaWFudChtYXRjaGVzLCBcIkRpZG4ndCBmaW5kIGFueSBtYXRjaGVzIGFmdGVyIGZldGNoZXIgYWN0aW9uXCIpO1xuICAgIGxldCBsb2FkSWQgPSArK2luY3JlbWVudGluZ0xvYWRJZDtcbiAgICBmZXRjaFJlbG9hZElkcy5zZXQoa2V5LCBsb2FkSWQpO1xuICAgIGxldCBsb2FkRmV0Y2hlciA9IGdldExvYWRpbmdGZXRjaGVyKHN1Ym1pc3Npb24sIGFjdGlvblJlc3VsdC5kYXRhKTtcbiAgICBzdGF0ZS5mZXRjaGVycy5zZXQoa2V5LCBsb2FkRmV0Y2hlcik7XG4gICAgbGV0IHsgZHNNYXRjaGVzLCByZXZhbGlkYXRpbmdGZXRjaGVycyB9ID0gZ2V0TWF0Y2hlc1RvTG9hZChcbiAgICAgIHJldmFsaWRhdGlvblJlcXVlc3QsXG4gICAgICBzY29wZWRDb250ZXh0LFxuICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzMixcbiAgICAgIG1hbmlmZXN0LFxuICAgICAgaW5pdC5oaXN0b3J5LFxuICAgICAgc3RhdGUsXG4gICAgICBtYXRjaGVzLFxuICAgICAgc3VibWlzc2lvbixcbiAgICAgIG5leHRMb2NhdGlvbixcbiAgICAgIGh5ZHJhdGlvblJvdXRlUHJvcGVydGllczIsXG4gICAgICBmYWxzZSxcbiAgICAgIGlzUmV2YWxpZGF0aW9uUmVxdWlyZWQsXG4gICAgICBjYW5jZWxsZWRGZXRjaGVyTG9hZHMsXG4gICAgICBmZXRjaGVyc1F1ZXVlZEZvckRlbGV0aW9uLFxuICAgICAgZmV0Y2hMb2FkTWF0Y2hlcyxcbiAgICAgIGZldGNoUmVkaXJlY3RJZHMsXG4gICAgICByb3V0ZXNUb1VzZSxcbiAgICAgIGJhc2VuYW1lLFxuICAgICAgaW5pdC5wYXRjaFJvdXRlc09uTmF2aWdhdGlvbiAhPSBudWxsLFxuICAgICAgW21hdGNoLnJvdXRlLmlkLCBhY3Rpb25SZXN1bHRdXG4gICAgKTtcbiAgICByZXZhbGlkYXRpbmdGZXRjaGVycy5maWx0ZXIoKHJmKSA9PiByZi5rZXkgIT09IGtleSkuZm9yRWFjaCgocmYpID0+IHtcbiAgICAgIGxldCBzdGFsZUtleSA9IHJmLmtleTtcbiAgICAgIGxldCBleGlzdGluZ0ZldGNoZXIyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KHN0YWxlS2V5KTtcbiAgICAgIGxldCByZXZhbGlkYXRpbmdGZXRjaGVyID0gZ2V0TG9hZGluZ0ZldGNoZXIoXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgZXhpc3RpbmdGZXRjaGVyMiA/IGV4aXN0aW5nRmV0Y2hlcjIuZGF0YSA6IHZvaWQgMFxuICAgICAgKTtcbiAgICAgIHN0YXRlLmZldGNoZXJzLnNldChzdGFsZUtleSwgcmV2YWxpZGF0aW5nRmV0Y2hlcik7XG4gICAgICBhYm9ydEZldGNoZXIoc3RhbGVLZXkpO1xuICAgICAgaWYgKHJmLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgZmV0Y2hDb250cm9sbGVycy5zZXQoc3RhbGVLZXksIHJmLmNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHVwZGF0ZVN0YXRlKHsgZmV0Y2hlcnM6IG5ldyBNYXAoc3RhdGUuZmV0Y2hlcnMpIH0pO1xuICAgIGxldCBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnMgPSAoKSA9PiByZXZhbGlkYXRpbmdGZXRjaGVycy5mb3JFYWNoKChyZikgPT4gYWJvcnRGZXRjaGVyKHJmLmtleSkpO1xuICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIFwiYWJvcnRcIixcbiAgICAgIGFib3J0UGVuZGluZ0ZldGNoUmV2YWxpZGF0aW9uc1xuICAgICk7XG4gICAgbGV0IHsgbG9hZGVyUmVzdWx0cywgZmV0Y2hlclJlc3VsdHMgfSA9IGF3YWl0IGNhbGxMb2FkZXJzQW5kTWF5YmVSZXNvbHZlRGF0YShcbiAgICAgIGRzTWF0Y2hlcyxcbiAgICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLF
25114xuICAgICAgcmV2YWxpZGF0aW9uUmVxdWVzdCxcbiAgICAgIHNjb3BlZENvbnRleHRcbiAgICApO1xuICAgIGlmIChhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgXCJhYm9ydFwiLFxuICAgICAgYWJvcnRQZW5kaW5nRmV0Y2hSZXZhbGlkYXRpb25zXG4gICAgKTtcbiAgICBmZXRjaFJlbG9hZElkcy5kZWxldGUoa2V5KTtcbiAgICBmZXRjaENvbnRyb2xsZXJzLmRlbGV0ZShrZXkpO1xuICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLmZvckVhY2goKHIpID0+IGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKHIua2V5KSk7XG4gICAgaWYgKHN0YXRlLmZldGNoZXJzLmhhcyhrZXkpKSB7XG4gICAgICBsZXQgZG9uZUZldGNoZXIgPSBnZXREb25lRmV0Y2hlcihhY3Rpb25SZXN1bHQuZGF0YSk7XG4gICAgICBzdGF0ZS5mZXRjaGVycy5zZXQoa2V5LCBkb25lRmV0Y2hlcik7XG4gICAgfVxuICAgIGxldCByZWRpcmVjdDIgPSBmaW5kUmVkaXJlY3QobG9hZGVyUmVzdWx0cyk7XG4gICAgaWYgKHJlZGlyZWN0Mikge1xuICAgICAgcmV0dXJuIHN0YXJ0UmVkaXJlY3ROYXZpZ2F0aW9uKFxuICAgICAgICByZXZhbGlkYXRpb25SZXF1ZXN0LFxuICAgICAgICByZWRpcmVjdDIucmVzdWx0LFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgeyBwcmV2ZW50U2Nyb2xsUmVzZXQgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmVkaXJlY3QyID0gZmluZFJlZGlyZWN0KGZldGNoZXJSZXN1bHRzKTtcbiAgICBpZiAocmVkaXJlY3QyKSB7XG4gICAgICBmZXRjaFJlZGlyZWN0SWRzLmFkZChyZWRpcmVjdDIua2V5KTtcbiAgICAgIHJldHVybiBzdGFydFJlZGlyZWN0TmF2aWdhdGlvbihcbiAgICAgICAgcmV2YWxpZGF0aW9uUmVxdWVzdCxcbiAgICAgICAgcmVkaXJlY3QyLnJlc3VsdCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHsgcHJldmVudFNjcm9sbFJlc2V0IH1cbiAgICAgICk7XG4gICAgfVxuICAgIGxldCB7IGxvYWRlckRhdGEsIGVycm9ycyB9ID0gcHJvY2Vzc0xvYWRlckRhdGEoXG4gICAgICBzdGF0ZSxcbiAgICAgIG1hdGNoZXMsXG4gICAgICBsb2FkZXJSZXN1bHRzLFxuICAgICAgdm9pZCAwLFxuICAgICAgcmV2YWxpZGF0aW5nRmV0Y2hlcnMsXG4gICAgICBmZXRjaGVyUmVzdWx0c1xuICAgICk7XG4gICAgYWJvcnRTdGFsZUZldGNoTG9hZHMobG9hZElkKTtcbiAgICBpZiAoc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJsb2FkaW5nXCIgJiYgbG9hZElkID4gcGVuZGluZ05hdmlnYXRpb25Mb2FkSWQpIHtcbiAgICAgIGludmFyaWFudChwZW5kaW5nQWN0aW9uLCBcIkV4cGVjdGVkIHBlbmRpbmcgYWN0aW9uXCIpO1xuICAgICAgcGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyICYmIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgY29tcGxldGVOYXZpZ2F0aW9uKHN0YXRlLm5hdmlnYXRpb24ubG9jYXRpb24sIHtcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgbG9hZGVyRGF0YSxcbiAgICAgICAgZXJyb3JzLFxuICAgICAgICBmZXRjaGVyczogbmV3IE1hcChzdGF0ZS5mZXRjaGVycylcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICAgIGVycm9ycyxcbiAgICAgICAgbG9hZGVyRGF0YTogbWVyZ2VMb2FkZXJEYXRhKFxuICAgICAgICAgIHN0YXRlLmxvYWRlckRhdGEsXG4gICAgICAgICAgbG9hZGVyRGF0YSxcbiAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgIGVycm9yc1xuICAgICAgICApLFxuICAgICAgICBmZXRjaGVyczogbmV3IE1hcChzdGF0ZS5mZXRjaGVycylcbiAgICAgIH0pO1xuICAgICAgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBhc3luYyBmdW5jdGlvbiBoYW5kbGVGZXRjaGVyTG9hZGVyKGtleSwgcm91dGVJZCwgcGF0aCwgbWF0Y2hlcywgc2NvcGVkQ29udGV4dCwgaXNGb2dPZldhciwgZmx1c2hTeW5jLCBwcmV2ZW50U2Nyb2xsUmVzZXQsIHN1Ym1pc3Npb24pIHtcbiAgICBsZXQgZXhpc3RpbmdGZXRjaGVyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KGtleSk7XG4gICAgdXBkYXRlRmV0Y2hlclN0YXRlKFxuICAgICAga2V5LFxuICAgICAgZ2V0TG9hZGluZ0ZldGNoZXIoXG4gICAgICAgIHN1Ym1pc3Npb24sXG4gICAgICAgIGV4aXN0aW5nRmV0Y2hlciA/IGV4aXN0aW5nRmV0Y2hlci5kYXRhIDogdm9pZCAwXG4gICAgICApLFxuICAgICAgeyBmbHVzaFN5bmMgfVxuICAgICk7XG4gICAgbGV0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBsZXQgZmV0Y2hSZXF1ZXN0ID0gY3JlYXRlQ2xpZW50U2lkZVJlcXVlc3QoXG4gICAgICBpbml0Lmhpc3RvcnksXG4gICAgICBwYXRoLFxuICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbFxuICAgICk7XG4gICAgaWYgKGlzRm9nT2ZXYXIpIHtcbiAgICAgIGxldCBkaXNjb3ZlclJlc3VsdCA9IGF3YWl0IGRpc2NvdmVyUm91dGVzKFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBuZXcgVVJMKGZldGNoUmVxdWVzdC51cmwpLnBhdGhuYW1lLFxuICAgICAgICBmZXRjaFJlcXVlc3Quc2lnbmFsLFxuICAgICAgICBrZXlcbiAgICAgICk7XG4gICAgICBpZiAoZGlzY292ZXJSZXN1bHQudHlwZSA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChkaXNjb3ZlclJlc3VsdC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgZGlzY292ZXJSZXN1bHQuZXJyb3IsIHsgZmx1c2hTeW5jIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKCFkaXNjb3ZlclJlc3VsdC5tYXRjaGVzKSB7XG4gICAgICAgIHNldEZldGNoZXJFcnJvcihcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgcm91dGVJZCxcbiAgICAgICAgICBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwgeyBwYXRobmFtZTogcGF0aCB9KSxcbiAgICAgICAgICB7IGZsdXNoU3luYyB9XG4gICAgICAgICk7XG4gICAgICAgI
25114HJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdGNoZXMgPSBkaXNjb3ZlclJlc3VsdC5tYXRjaGVzO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgbWF0Y2ggPSBnZXRUYXJnZXRNYXRjaChtYXRjaGVzLCBwYXRoKTtcbiAgICBmZXRjaENvbnRyb2xsZXJzLnNldChrZXksIGFib3J0Q29udHJvbGxlcik7XG4gICAgbGV0IG9yaWdpbmF0aW5nTG9hZElkID0gaW5jcmVtZW50aW5nTG9hZElkO1xuICAgIGxldCBkc01hdGNoZXMgPSBnZXRUYXJnZXRlZERhdGFTdHJhdGVneU1hdGNoZXMoXG4gICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBmZXRjaFJlcXVlc3QsXG4gICAgICBtYXRjaGVzLFxuICAgICAgbWF0Y2gsXG4gICAgICBoeWRyYXRpb25Sb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgc2NvcGVkQ29udGV4dFxuICAgICk7XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjYWxsRGF0YVN0cmF0ZWd5KFxuICAgICAgZmV0Y2hSZXF1ZXN0LFxuICAgICAgZHNNYXRjaGVzLFxuICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgIGtleVxuICAgICk7XG4gICAgbGV0IHJlc3VsdCA9IHJlc3VsdHNbbWF0Y2gucm91dGUuaWRdO1xuICAgIGlmIChmZXRjaENvbnRyb2xsZXJzLmdldChrZXkpID09PSBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGlmIChmZXRjaFJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGZldGNoZXJzUXVldWVkRm9yRGVsZXRpb24uaGFzKGtleSkpIHtcbiAgICAgIHVwZGF0ZUZldGNoZXJTdGF0ZShrZXksIGdldERvbmVGZXRjaGVyKHZvaWQgMCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNSZWRpcmVjdFJlc3VsdChyZXN1bHQpKSB7XG4gICAgICBpZiAocGVuZGluZ05hdmlnYXRpb25Mb2FkSWQgPiBvcmlnaW5hdGluZ0xvYWRJZCkge1xuICAgICAgICB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBnZXREb25lRmV0Y2hlcih2b2lkIDApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmV0Y2hSZWRpcmVjdElkcy5hZGQoa2V5KTtcbiAgICAgICAgYXdhaXQgc3RhcnRSZWRpcmVjdE5hdmlnYXRpb24oZmV0Y2hSZXF1ZXN0LCByZXN1bHQsIGZhbHNlLCB7XG4gICAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIHNldEZldGNoZXJFcnJvcihrZXksIHJvdXRlSWQsIHJlc3VsdC5lcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHVwZGF0ZUZldGNoZXJTdGF0ZShrZXksIGdldERvbmVGZXRjaGVyKHJlc3VsdC5kYXRhKSk7XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gc3RhcnRSZWRpcmVjdE5hdmlnYXRpb24ocmVxdWVzdCwgcmVkaXJlY3QyLCBpc05hdmlnYXRpb24sIHtcbiAgICBzdWJtaXNzaW9uLFxuICAgIGZldGNoZXJTdWJtaXNzaW9uLFxuICAgIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgICByZXBsYWNlOiByZXBsYWNlMlxuICB9ID0ge30pIHtcbiAgICBpZiAocmVkaXJlY3QyLnJlc3BvbnNlLmhlYWRlcnMuaGFzKFwiWC1SZW1peC1SZXZhbGlkYXRlXCIpKSB7XG4gICAgICBpc1JldmFsaWRhdGlvblJlcXVpcmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IGxvY2F0aW9uID0gcmVkaXJlY3QyLnJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiTG9jYXRpb25cIik7XG4gICAgaW52YXJpYW50KGxvY2F0aW9uLCBcIkV4cGVjdGVkIGEgTG9jYXRpb24gaGVhZGVyIG9uIHRoZSByZWRpcmVjdCBSZXNwb25zZVwiKTtcbiAgICBsb2NhdGlvbiA9IG5vcm1hbGl6ZVJlZGlyZWN0TG9jYXRpb24oXG4gICAgICBsb2NhdGlvbixcbiAgICAgIG5ldyBVUkwocmVxdWVzdC51cmwpLFxuICAgICAgYmFzZW5hbWVcbiAgICApO1xuICAgIGxldCByZWRpcmVjdExvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oc3RhdGUubG9jYXRpb24sIGxvY2F0aW9uLCB7XG4gICAgICBfaXNSZWRpcmVjdDogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChpc0Jyb3dzZXIyKSB7XG4gICAgICBsZXQgaXNEb2N1bWVudFJlbG9hZCA9IGZhbHNlO1xuICAgICAgaWYgKHJlZGlyZWN0Mi5yZXNwb25zZS5oZWFkZXJzLmhhcyhcIlgtUmVtaXgtUmVsb2FkLURvY3VtZW50XCIpKSB7XG4gICAgICAgIGlzRG9jdW1lbnRSZWxvYWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChpc0Fic29sdXRlVXJsKGxvY2F0aW9uKSkge1xuICAgICAgICBjb25zdCB1cmwgPSBjcmVhdGVCcm93c2VyVVJMSW1wbChsb2NhdGlvbiwgdHJ1ZSk7XG4gICAgICAgIGlzRG9jdW1lbnRSZWxvYWQgPSAvLyBIYXJkIHJlbG9hZCBpZiBpdCdzIGFuIGFic29sdXRlIFVSTCB0byBhIG5ldyBvcmlnaW5cbiAgICAgICAgdXJsLm9yaWdpbiAhPT0gcm91dGVyV2luZG93LmxvY2F0aW9uLm9yaWdpbiB8fCAvLyBIYXJkIHJlbG9hZCBpZiBpdCdzIGFuIGFic29sdXRlIFVSTCB0aGF0IGRvZXMgbm90IG1hdGNoIG91ciBiYXNlbmFtZVxuICAgICAgICBzdHJpcEJhc2VuYW1lKHVybC5wYXRobmFtZSwgYmFzZW5hbWUpID09IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoaXNEb2N1bWVudFJlbG9hZCkge1xuICAgICAgICBpZiAocmVwbGFjZTIpIHtcbiAgICAgICAgICByb3V0ZXJXaW5kb3cubG9jYXRpb24ucmVwbGFjZShsb2NhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcm91dGVyV2luZG93LmxvY2F0aW9uLmFzc2lnbihsb2NhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBudWxsO1xuICAgIGxldCByZWRpcmVjdE5hdmlnYXRpb25UeXBlID0gcmVwbGFjZTIgPT09IHRydWUgfHwgcmVkaXJlY3QyLnJlc3BvbnNlLmhlYWRlcnMuaGFzKFwiWC1SZW1peC1SZXBsYWNlXCIpID8gXCJSRVBMQUNFXCIgLyogUmVwbGFjZSAqLyA6IFwiUFVTSFwiIC8qIFB1c2ggKi87XG4gICAgbGV0IHsgZm9ybU1ldGhvZCwgZm9ybUFjdGlvbiwgZm9ybUVuY1R5cGUgfSA9IHN0YXRlLm5hdmlnYXRpb247XG4gICAgaWYgKCFzdWJtaXNzaW9uICYmICFmZXRjaGVyU3VibWlzc2lvbiAmJiBmb3JtTWV0aG9kICYmIGZvcm1BY3Rpb24gJiYgZm9ybUVuY1R5cGUpIHtcbiAgICAgIHN1Ym1pc3Npb24gPSBnZXRTdWJtaXNzaW9uRnJvbU5hdmlnYXRpb24oc3RhdGUubmF2aWdhdGlvbik7XG4gICAgfVxuICAgIGxldCBhY3RpdmVTdWJtaXNzaW9uID0gc3VibWlzc2lvbiB8fCBmZXRjaGVyU3VibWlzc2lvbjtcbiAgICBpZiAocmVkaXJlY3RQcmVzZXJ2ZU1ldGhvZFN0YXR1c0NvZGVzLmhhcyhyZWRpcmVjdDIucmVzcG9uc2Uuc3RhdHVzKSAmJiBhY3RpdmVTdWJtaXNzaW9uICYmIGlzTXV0YXRpb25NZXRob2QoYWN0aXZlU3VibWlzc2lvbi5mb3JtTWV0aG9kKSkge1xuICAgICAgYXdhaXQgc3RhcnROYXZpZ2F0aW9uKHJlZGlyZWN0TmF2aWdhdGlvblR5cGUsIHJlZGlyZWN0TG9jYXRpb24sIHtcbiAgICAgICAgc3VibWlzc2lvbjoge1xuICAgICAgICAgIC4uLmFjdGl2ZVN1Ym1pc3Npb24sXG4gICAgICAgICAgZm9ybUFjdGlvbj
25114ogbG9jYXRpb25cbiAgICAgICAgfSxcbiAgICAgICAgLy8gUHJlc2VydmUgdGhlc2UgZmxhZ3MgYWNyb3NzIHJlZGlyZWN0c1xuICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQ6IHByZXZlbnRTY3JvbGxSZXNldCB8fCBwZW5kaW5nUHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgICBlbmFibGVWaWV3VHJhbnNpdGlvbjogaXNOYXZpZ2F0aW9uID8gcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRW5hYmxlZCA6IHZvaWQgMFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBvdmVycmlkZU5hdmlnYXRpb24gPSBnZXRMb2FkaW5nTmF2aWdhdGlvbihcbiAgICAgICAgcmVkaXJlY3RMb2NhdGlvbixcbiAgICAgICAgc3VibWlzc2lvblxuICAgICAgKTtcbiAgICAgIGF3YWl0IHN0YXJ0TmF2aWdhdGlvbihyZWRpcmVjdE5hdmlnYXRpb25UeXBlLCByZWRpcmVjdExvY2F0aW9uLCB7XG4gICAgICAgIG92ZXJyaWRlTmF2aWdhdGlvbixcbiAgICAgICAgLy8gU2VuZCBmZXRjaGVyIHN1Ym1pc3Npb25zIHRocm91Z2ggZm9yIHNob3VsZFJldmFsaWRhdGVcbiAgICAgICAgZmV0Y2hlclN1Ym1pc3Npb24sXG4gICAgICAgIC8vIFByZXNlcnZlIHRoZXNlIGZsYWdzIGFjcm9zcyByZWRpcmVjdHNcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBwcmV2ZW50U2Nyb2xsUmVzZXQgfHwgcGVuZGluZ1ByZXZlbnRTY3JvbGxSZXNldCxcbiAgICAgICAgZW5hYmxlVmlld1RyYW5zaXRpb246IGlzTmF2aWdhdGlvbiA/IHBlbmRpbmdWaWV3VHJhbnNpdGlvbkVuYWJsZWQgOiB2b2lkIDBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBhc3luYyBmdW5jdGlvbiBjYWxsRGF0YVN0cmF0ZWd5KHJlcXVlc3QsIG1hdGNoZXMsIHNjb3BlZENvbnRleHQsIGZldGNoZXJLZXkpIHtcbiAgICBsZXQgcmVzdWx0cztcbiAgICBsZXQgZGF0YVJlc3VsdHMgPSB7fTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0cyA9IGF3YWl0IGNhbGxEYXRhU3RyYXRlZ3lJbXBsKFxuICAgICAgICBkYXRhU3RyYXRlZ3lJbXBsLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBmZXRjaGVyS2V5LFxuICAgICAgICBzY29wZWRDb250ZXh0LFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBtYXRjaGVzLmZpbHRlcigobSkgPT4gbS5zaG91bGRMb2FkKS5mb3JFYWNoKChtKSA9PiB7XG4gICAgICAgIGRhdGFSZXN1bHRzW20ucm91dGUuaWRdID0ge1xuICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIiAvKiBlcnJvciAqLyxcbiAgICAgICAgICBlcnJvcjogZVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGF0YVJlc3VsdHM7XG4gICAgfVxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gZGF0YVJlc3VsdHM7XG4gICAgfVxuICAgIGZvciAobGV0IFtyb3V0ZUlkLCByZXN1bHRdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdHMpKSB7XG4gICAgICBpZiAoaXNSZWRpcmVjdERhdGFTdHJhdGVneVJlc3VsdChyZXN1bHQpKSB7XG4gICAgICAgIGxldCByZXNwb25zZSA9IHJlc3VsdC5yZXN1bHQ7XG4gICAgICAgIGRhdGFSZXN1bHRzW3JvdXRlSWRdID0ge1xuICAgICAgICAgIHR5cGU6IFwicmVkaXJlY3RcIiAvKiByZWRpcmVjdCAqLyxcbiAgICAgICAgICByZXNwb25zZTogbm9ybWFsaXplUmVsYXRpdmVSb3V0aW5nUmVkaXJlY3RSZXNwb25zZShcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHJvdXRlSWQsXG4gICAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgICAgYmFzZW5hbWVcbiAgICAgICAgICApXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhUmVzdWx0c1tyb3V0ZUlkXSA9IGF3YWl0IGNvbnZlcnREYXRhU3RyYXRlZ3lSZXN1bHRUb0RhdGFSZXN1bHQocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFSZXN1bHRzO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIGNhbGxMb2FkZXJzQW5kTWF5YmVSZXNvbHZlRGF0YShtYXRjaGVzLCBmZXRjaGVyc1RvTG9hZCwgcmVxdWVzdCwgc2NvcGVkQ29udGV4dCkge1xuICAgIGxldCBsb2FkZXJSZXN1bHRzUHJvbWlzZSA9IGNhbGxEYXRhU3RyYXRlZ3koXG4gICAgICByZXF1ZXN0LFxuICAgICAgbWF0Y2hlcyxcbiAgICAgIHNjb3BlZENvbnRleHQsXG4gICAgICBudWxsXG4gICAgKTtcbiAgICBsZXQgZmV0Y2hlclJlc3VsdHNQcm9taXNlID0gUHJvbWlzZS5hbGwoXG4gICAgICBmZXRjaGVyc1RvTG9hZC5tYXAoYXN5bmMgKGYpID0+IHtcbiAgICAgICAgaWYgKGYubWF0Y2hlcyAmJiBmLm1hdGNoICYmIGYucmVxdWVzdCAmJiBmLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IGNhbGxEYXRhU3RyYXRlZ3koXG4gICAgICAgICAgICBmLnJlcXVlc3QsXG4gICAgICAgICAgICBmLm1hdGNoZXMsXG4gICAgICAgICAgICBzY29wZWRDb250ZXh0LFxuICAgICAgICAgICAgZi5rZXlcbiAgICAgICAgICApO1xuICAgICAgICAgIGxldCByZXN1bHQgPSByZXN1bHRzW2YubWF0Y2gucm91dGUuaWRdO1xuICAgICAgICAgIHJldHVybiB7IFtmLmtleV06IHJlc3VsdCB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgW2Yua2V5XToge1xuICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCIgLyogZXJyb3IgKi8sXG4gICAgICAgICAgICAgIGVycm9yOiBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwge1xuICAgICAgICAgICAgICAgIHBhdGhuYW1lOiBmLnBhdGhcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIGxldCBsb2FkZXJSZXN1bHRzID0gYXdhaXQgbG9hZGVyUmVzdWx0c1Byb21pc2U7XG4gICAgbGV0IGZldGNoZXJSZXN1bHRzID0gKGF3YWl0IGZldGNoZXJSZXN1bHRzUHJvbWlzZSkucmVkdWNlKFxuICAgICAgKGFjYywgcikgPT4gT2JqZWN0LmFzc2lnbihhY2MsIHIpLFxuICAgICAge31cbiAgICApO
251141xuICAgIHJldHVybiB7XG4gICAgICBsb2FkZXJSZXN1bHRzLFxuICAgICAgZmV0Y2hlclJlc3VsdHNcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGludGVycnVwdEFjdGl2ZUxvYWRzKCkge1xuICAgIGlzUmV2YWxpZGF0aW9uUmVxdWlyZWQgPSB0cnVlO1xuICAgIGZldGNoTG9hZE1hdGNoZXMuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICBpZiAoZmV0Y2hDb250cm9sbGVycy5oYXMoa2V5KSkge1xuICAgICAgICBjYW5jZWxsZWRGZXRjaGVyTG9hZHMuYWRkKGtleSk7XG4gICAgICB9XG4gICAgICBhYm9ydEZldGNoZXIoa2V5KTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBmZXRjaGVyLCBvcHRzID0ge30pIHtcbiAgICBzdGF0ZS5mZXRjaGVycy5zZXQoa2V5LCBmZXRjaGVyKTtcbiAgICB1cGRhdGVTdGF0ZShcbiAgICAgIHsgZmV0Y2hlcnM6IG5ldyBNYXAoc3RhdGUuZmV0Y2hlcnMpIH0sXG4gICAgICB7IGZsdXNoU3luYzogKG9wdHMgJiYgb3B0cy5mbHVzaFN5bmMpID09PSB0cnVlIH1cbiAgICApO1xuICB9XG4gIGZ1bmN0aW9uIHNldEZldGNoZXJFcnJvcihrZXksIHJvdXRlSWQsIGVycm9yLCBvcHRzID0ge30pIHtcbiAgICBsZXQgYm91bmRhcnlNYXRjaCA9IGZpbmROZWFyZXN0Qm91bmRhcnkoc3RhdGUubWF0Y2hlcywgcm91dGVJZCk7XG4gICAgZGVsZXRlRmV0Y2hlcihrZXkpO1xuICAgIHVwZGF0ZVN0YXRlKFxuICAgICAge1xuICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICBbYm91bmRhcnlNYXRjaC5yb3V0ZS5pZF06IGVycm9yXG4gICAgICAgIH0sXG4gICAgICAgIGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKVxuICAgICAgfSxcbiAgICAgIHsgZmx1c2hTeW5jOiAob3B0cyAmJiBvcHRzLmZsdXNoU3luYykgPT09IHRydWUgfVxuICAgICk7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0RmV0Y2hlcihrZXkpIHtcbiAgICBhY3RpdmVGZXRjaGVycy5zZXQoa2V5LCAoYWN0aXZlRmV0Y2hlcnMuZ2V0KGtleSkgfHwgMCkgKyAxKTtcbiAgICBpZiAoZmV0Y2hlcnNRdWV1ZWRGb3JEZWxldGlvbi5oYXMoa2V5KSkge1xuICAgICAgZmV0Y2hlcnNRdWV1ZWRGb3JEZWxldGlvbi5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmZldGNoZXJzLmdldChrZXkpIHx8IElETEVfRkVUQ0hFUjtcbiAgfVxuICBmdW5jdGlvbiByZXNldEZldGNoZXIoa2V5LCBvcHRzKSB7XG4gICAgYWJvcnRGZXRjaGVyKGtleSwgb3B0cz8ucmVhc29uKTtcbiAgICB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBnZXREb25lRmV0Y2hlcihudWxsKSk7XG4gIH1cbiAgZnVuY3Rpb24gZGVsZXRlRmV0Y2hlcihrZXkpIHtcbiAgICBsZXQgZmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChrZXkpO1xuICAgIGlmIChmZXRjaENvbnRyb2xsZXJzLmhhcyhrZXkpICYmICEoZmV0Y2hlciAmJiBmZXRjaGVyLnN0YXRlID09PSBcImxvYWRpbmdcIiAmJiBmZXRjaFJlbG9hZElkcy5oYXMoa2V5KSkpIHtcbiAgICAgIGFib3J0RmV0Y2hlcihrZXkpO1xuICAgIH1cbiAgICBmZXRjaExvYWRNYXRjaGVzLmRlbGV0ZShrZXkpO1xuICAgIGZldGNoUmVsb2FkSWRzLmRlbGV0ZShrZXkpO1xuICAgIGZldGNoUmVkaXJlY3RJZHMuZGVsZXRlKGtleSk7XG4gICAgZmV0Y2hlcnNRdWV1ZWRGb3JEZWxldGlvbi5kZWxldGUoa2V5KTtcbiAgICBjYW5jZWxsZWRGZXRjaGVyTG9hZHMuZGVsZXRlKGtleSk7XG4gICAgc3RhdGUuZmV0Y2hlcnMuZGVsZXRlKGtleSk7XG4gIH1cbiAgZnVuY3Rpb24gcXVldWVGZXRjaGVyRm9yRGVsZXRpb24oa2V5KSB7XG4gICAgbGV0IGNvdW50ID0gKGFjdGl2ZUZldGNoZXJzLmdldChrZXkpIHx8IDApIC0gMTtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgYWN0aXZlRmV0Y2hlcnMuZGVsZXRlKGtleSk7XG4gICAgICBmZXRjaGVyc1F1ZXVlZEZvckRlbGV0aW9uLmFkZChrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3RpdmVGZXRjaGVycy5zZXQoa2V5LCBjb3VudCk7XG4gICAgfVxuICAgIHVwZGF0ZVN0YXRlKHsgZmV0Y2hlcnM6IG5ldyBNYXAoc3RhdGUuZmV0Y2hlcnMpIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGFib3J0RmV0Y2hlcihrZXksIHJlYXNvbikge1xuICAgIGxldCBjb250cm9sbGVyID0gZmV0Y2hDb250cm9sbGVycy5nZXQoa2V5KTtcbiAgICBpZiAoY29udHJvbGxlcikge1xuICAgICAgY29udHJvbGxlci5hYm9ydChyZWFzb24pO1xuICAgICAgZmV0Y2hDb250cm9sbGVycy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gbWFya0ZldGNoZXJzRG9uZShrZXlzKSB7XG4gICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgIGxldCBmZXRjaGVyID0gZ2V0RmV0Y2hlcihrZXkpO1xuICAgICAgbGV0IGRvbmVGZXRjaGVyID0gZ2V0RG9uZUZldGNoZXIoZmV0Y2hlci5kYXRhKTtcbiAgICAgIHN0YXRlLmZldGNoZXJzLnNldChrZXksIGRvbmVGZXRjaGVyKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gbWFya0ZldGNoUmVkaXJlY3RzRG9uZSgpIHtcbiAgICBsZXQgZG9uZUtleXMgPSBbXTtcbiAgICBsZXQgdXBkYXRlZEZldGNoZXJzID0gZmFsc2U7XG4gICAgZm9yIChsZXQga2V5IG9mIGZldGNoUmVkaXJlY3RJZHMpIHtcbiAgICAgIGxldCBmZXRjaGVyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KGtleSk7XG4gICAgICBpbnZhcmlhbnQoZmV0Y2hlciwgYEV4cGVjdGVkIGZldGNoZXI6ICR7a2V5fWApO1xuICAgICAgaWYgKGZldGNoZXIuc3RhdGUgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgICAgIGZldGNoUmVkaXJlY3RJZHMuZGVsZXRlKGtleSk7XG4gICAgICAgIGRvbmVLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgdXBkYXRlZEZldGNoZXJzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbWFya0ZldGNoZXJzRG9uZShkb25lS2V5cyk7XG4gICAgcmV0dXJuIHVwZGF0ZWRGZXRjaGVycztcbiAgfVxuICBmdW5jdGlvbiBhYm9ydFN0YWxlRmV0Y2hMb2FkcyhsYW5kZWRJZCkge1xuICAgIGxldCB5ZWV0ZWRLZXlzID0gW107XG4gICAgZm9yIChsZXQgW2tleSwgaWRdIG9mIGZldGNoUmVsb2FkSWRzKSB7XG4gICAgICBpZiAoaWQgPCBsYW5kZWRJZCkge1xuICAgICAgICBsZXQgZmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChrZXkpO1xuICAgICAgICBpbnZhcmlhbnQoZmV0Y2hlciwgYEV4cGVjdGVkIGZldGNoZXI6ICR7a2V5fWApO1xuICAgICAgICBpZiAoZmV0Y2hlci5zdGF0ZSA9PT0gXCJsb2FkaW5nXCIpIHtcbiAgICAgICAgICBhYm9ydEZldGNoZXIoa2V5KTtcbiAgICAgICAgICBmZXRjaFJlbG9hZElkcy5kZWxldGUoa2V5KTtcbiAgICAgICAgICB5ZWV0ZWRLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBtYXJrRmV0Y2hlcnNEb25lKHllZXRlZEtleXMpO1xuICAgIHJldHVybi
25114B5ZWV0ZWRLZXlzLmxlbmd0aCA+IDA7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0QmxvY2tlcihrZXksIGZuKSB7XG4gICAgbGV0IGJsb2NrZXIgPSBzdGF0ZS5ibG9ja2Vycy5nZXQoa2V5KSB8fCBJRExFX0JMT0NLRVI7XG4gICAgaWYgKGJsb2NrZXJGdW5jdGlvbnMuZ2V0KGtleSkgIT09IGZuKSB7XG4gICAgICBibG9ja2VyRnVuY3Rpb25zLnNldChrZXksIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGJsb2NrZXI7XG4gIH1cbiAgZnVuY3Rpb24gZGVsZXRlQmxvY2tlcihrZXkpIHtcbiAgICBzdGF0ZS5ibG9ja2Vycy5kZWxldGUoa2V5KTtcbiAgICBibG9ja2VyRnVuY3Rpb25zLmRlbGV0ZShrZXkpO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZUJsb2NrZXIoa2V5LCBuZXdCbG9ja2VyKSB7XG4gICAgbGV0IGJsb2NrZXIgPSBzdGF0ZS5ibG9ja2Vycy5nZXQoa2V5KSB8fCBJRExFX0JMT0NLRVI7XG4gICAgaW52YXJpYW50KFxuICAgICAgYmxvY2tlci5zdGF0ZSA9PT0gXCJ1bmJsb2NrZWRcIiAmJiBuZXdCbG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIiB8fCBibG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIiAmJiBuZXdCbG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIiB8fCBibG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIiAmJiBuZXdCbG9ja2VyLnN0YXRlID09PSBcInByb2NlZWRpbmdcIiB8fCBibG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIiAmJiBuZXdCbG9ja2VyLnN0YXRlID09PSBcInVuYmxvY2tlZFwiIHx8IGJsb2NrZXIuc3RhdGUgPT09IFwicHJvY2VlZGluZ1wiICYmIG5ld0Jsb2NrZXIuc3RhdGUgPT09IFwidW5ibG9ja2VkXCIsXG4gICAgICBgSW52YWxpZCBibG9ja2VyIHN0YXRlIHRyYW5zaXRpb246ICR7YmxvY2tlci5zdGF0ZX0gLT4gJHtuZXdCbG9ja2VyLnN0YXRlfWBcbiAgICApO1xuICAgIGxldCBibG9ja2VycyA9IG5ldyBNYXAoc3RhdGUuYmxvY2tlcnMpO1xuICAgIGJsb2NrZXJzLnNldChrZXksIG5ld0Jsb2NrZXIpO1xuICAgIHVwZGF0ZVN0YXRlKHsgYmxvY2tlcnMgfSk7XG4gIH1cbiAgZnVuY3Rpb24gc2hvdWxkQmxvY2tOYXZpZ2F0aW9uKHtcbiAgICBjdXJyZW50TG9jYXRpb24sXG4gICAgbmV4dExvY2F0aW9uLFxuICAgIGhpc3RvcnlBY3Rpb25cbiAgfSkge1xuICAgIGlmIChibG9ja2VyRnVuY3Rpb25zLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGJsb2NrZXJGdW5jdGlvbnMuc2l6ZSA+IDEpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsIFwiQSByb3V0ZXIgb25seSBzdXBwb3J0cyBvbmUgYmxvY2tlciBhdCBhIHRpbWVcIik7XG4gICAgfVxuICAgIGxldCBlbnRyaWVzID0gQXJyYXkuZnJvbShibG9ja2VyRnVuY3Rpb25zLmVudHJpZXMoKSk7XG4gICAgbGV0IFtibG9ja2VyS2V5LCBibG9ja2VyRnVuY3Rpb25dID0gZW50cmllc1tlbnRyaWVzLmxlbmd0aCAtIDFdO1xuICAgIGxldCBibG9ja2VyID0gc3RhdGUuYmxvY2tlcnMuZ2V0KGJsb2NrZXJLZXkpO1xuICAgIGlmIChibG9ja2VyICYmIGJsb2NrZXIuc3RhdGUgPT09IFwicHJvY2VlZGluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChibG9ja2VyRnVuY3Rpb24oeyBjdXJyZW50TG9jYXRpb24sIG5leHRMb2NhdGlvbiwgaGlzdG9yeUFjdGlvbiB9KSkge1xuICAgICAgcmV0dXJuIGJsb2NrZXJLZXk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZU5hdmlnYXRpb25hbDQwNChwYXRobmFtZSkge1xuICAgIGxldCBlcnJvciA9IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7IHBhdGhuYW1lIH0pO1xuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIGxldCB7IG1hdGNoZXMsIHJvdXRlIH0gPSBnZXRTaG9ydENpcmN1aXRNYXRjaGVzKHJvdXRlc1RvVXNlKTtcbiAgICByZXR1cm4geyBub3RGb3VuZE1hdGNoZXM6IG1hdGNoZXMsIHJvdXRlLCBlcnJvciB9O1xuICB9XG4gIGZ1bmN0aW9uIGVuYWJsZVNjcm9sbFJlc3RvcmF0aW9uKHBvc2l0aW9ucywgZ2V0UG9zaXRpb24sIGdldEtleSkge1xuICAgIHNhdmVkU2Nyb2xsUG9zaXRpb25zMiA9IHBvc2l0aW9ucztcbiAgICBnZXRTY3JvbGxQb3NpdGlvbiA9IGdldFBvc2l0aW9uO1xuICAgIGdldFNjcm9sbFJlc3RvcmF0aW9uS2V5MiA9IGdldEtleSB8fCBudWxsO1xuICAgIGlmICghaW5pdGlhbFNjcm9sbFJlc3RvcmVkICYmIHN0YXRlLm5hdmlnYXRpb24gPT09IElETEVfTkFWSUdBVElPTikge1xuICAgICAgaW5pdGlhbFNjcm9sbFJlc3RvcmVkID0gdHJ1ZTtcbiAgICAgIGxldCB5ID0gZ2V0U2F2ZWRTY3JvbGxQb3NpdGlvbihzdGF0ZS5sb2NhdGlvbiwgc3RhdGUubWF0Y2hlcyk7XG4gICAgICBpZiAoeSAhPSBudWxsKSB7XG4gICAgICAgIHVwZGF0ZVN0YXRlKHsgcmVzdG9yZVNjcm9sbFBvc2l0aW9uOiB5IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgc2F2ZWRTY3JvbGxQb3NpdGlvbnMyID0gbnVsbDtcbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uID0gbnVsbDtcbiAgICAgIGdldFNjcm9sbFJlc3RvcmF0aW9uS2V5MiA9IG51bGw7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBnZXRTY3JvbGxLZXkobG9jYXRpb24sIG1hdGNoZXMpIHtcbiAgICBpZiAoZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkyKSB7XG4gICAgICBsZXQga2V5ID0gZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkyKFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgbWF0Y2hlcy5tYXAoKG0pID0+IGNvbnZlcnRSb3V0ZU1hdGNoVG9VaU1hdGNoKG0sIHN0YXRlLmxvYWRlckRhdGEpKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBrZXkgfHwgbG9jYXRpb24ua2V5O1xuICAgIH1cbiAgICByZXR1cm4gbG9jYXRpb24ua2V5O1xuICB9XG4gIGZ1bmN0aW9uIHNhdmVTY3JvbGxQb3NpdGlvbihsb2NhdGlvbiwgbWF0Y2hlcykge1xuICAgIGlmIChzYXZlZFNjcm9sbFBvc2l0aW9uczIgJiYgZ2V0U2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgIGxldCBrZXkgPSBnZXRTY3JvbGxLZXkobG9jYXRpb24sIG1hdGNoZXMpO1xuICAgICAgc2F2ZWRTY3JvbGxQb3NpdGlvbnMyW2tleV0gPSBnZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZXRTYXZlZFNjcm9sbFBvc2l0aW9uKGxvY2F0aW9uLCBtYXRjaGVzKSB7XG4gICAgaWYgKHNhdmVkU2Nyb2xsUG9zaXRpb25zMikge1xuICAgICAgbGV0IGtleSA9IGdldFNjcm9sbEtleShsb2NhdGlvbiwgbWF0Y2hlcyk7XG4gICAgICBsZXQgeSA9IHNhdmVkU2Nyb2xsUG9zaXRpb25zMltrZXldO1xuICAgICAgaWYgKHR5cGVvZiB5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgI
25114HJldHVybiB5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBjaGVja0ZvZ09mV2FyKG1hdGNoZXMsIHJvdXRlc1RvVXNlLCBwYXRobmFtZSkge1xuICAgIGlmIChpbml0LnBhdGNoUm91dGVzT25OYXZpZ2F0aW9uKSB7XG4gICAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgbGV0IGZvZ01hdGNoZXMgPSBtYXRjaFJvdXRlc0ltcGwoXG4gICAgICAgICAgcm91dGVzVG9Vc2UsXG4gICAgICAgICAgcGF0aG5hbWUsXG4gICAgICAgICAgYmFzZW5hbWUsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBhY3RpdmU6IHRydWUsIG1hdGNoZXM6IGZvZ01hdGNoZXMgfHwgW10gfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhtYXRjaGVzWzBdLnBhcmFtcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxldCBwYXJ0aWFsTWF0Y2hlcyA9IG1hdGNoUm91dGVzSW1wbChcbiAgICAgICAgICAgIHJvdXRlc1RvVXNlLFxuICAgICAgICAgICAgcGF0aG5hbWUsXG4gICAgICAgICAgICBiYXNlbmFtZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IGFjdGl2ZTogdHJ1ZSwgbWF0Y2hlczogcGFydGlhbE1hdGNoZXMgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBtYXRjaGVzOiBudWxsIH07XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJSb3V0ZXMobWF0Y2hlcywgcGF0aG5hbWUsIHNpZ25hbCwgZmV0Y2hlcktleSkge1xuICAgIGlmICghaW5pdC5wYXRjaFJvdXRlc09uTmF2aWdhdGlvbikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJzdWNjZXNzXCIsIG1hdGNoZXMgfTtcbiAgICB9XG4gICAgbGV0IHBhcnRpYWxNYXRjaGVzID0gbWF0Y2hlcztcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGV0IGlzTm9uSE1SID0gaW5GbGlnaHREYXRhUm91dGVzID09IG51bGw7XG4gICAgICBsZXQgcm91dGVzVG9Vc2UgPSBpbkZsaWdodERhdGFSb3V0ZXMgfHwgZGF0YVJvdXRlcztcbiAgICAgIGxldCBsb2NhbE1hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBpbml0LnBhdGNoUm91dGVzT25OYXZpZ2F0aW9uKHtcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgcGF0aDogcGF0aG5hbWUsXG4gICAgICAgICAgbWF0Y2hlczogcGFydGlhbE1hdGNoZXMsXG4gICAgICAgICAgZmV0Y2hlcktleSxcbiAgICAgICAgICBwYXRjaDogKHJvdXRlSWQsIGNoaWxkcmVuKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgICAgIHBhdGNoUm91dGVzSW1wbChcbiAgICAgICAgICAgICAgcm91dGVJZCxcbiAgICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHJvdXRlc1RvVXNlLFxuICAgICAgICAgICAgICBsb2NhbE1hbmlmZXN0LFxuICAgICAgICAgICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcImVycm9yXCIsIGVycm9yOiBlLCBwYXJ0aWFsTWF0Y2hlcyB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGlzTm9uSE1SICYmICFzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGRhdGFSb3V0ZXMgPSBbLi4uZGF0YVJvdXRlc107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcImFib3J0ZWRcIiB9O1xuICAgICAgfVxuICAgICAgbGV0IG5ld01hdGNoZXMgPSBtYXRjaFJvdXRlcyhyb3V0ZXNUb1VzZSwgcGF0aG5hbWUsIGJhc2VuYW1lKTtcbiAgICAgIGlmIChuZXdNYXRjaGVzKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwic3VjY2Vzc1wiLCBtYXRjaGVzOiBuZXdNYXRjaGVzIH07XG4gICAgICB9XG4gICAgICBsZXQgbmV3UGFydGlhbE1hdGNoZXMgPSBtYXRjaFJvdXRlc0ltcGwoXG4gICAgICAgIHJvdXRlc1RvVXNlLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgICAgYmFzZW5hbWUsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBpZiAoIW5ld1BhcnRpYWxNYXRjaGVzIHx8IHBhcnRpYWxNYXRjaGVzLmxlbmd0aCA9PT0gbmV3UGFydGlhbE1hdGNoZXMubGVuZ3RoICYmIHBhcnRpYWxNYXRjaGVzLmV2ZXJ5KFxuICAgICAgICAobSwgaSkgPT4gbS5yb3V0ZS5pZCA9PT0gbmV3UGFydGlhbE1hdGNoZXNbaV0ucm91dGUuaWRcbiAgICAgICkpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJzdWNjZXNzXCIsIG1hdGNoZXM6IG51bGwgfTtcbiAgICAgIH1cbiAgICAgIHBhcnRpYWxNYXRjaGVzID0gbmV3UGFydGlhbE1hdGNoZXM7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIF9pbnRlcm5hbFNldFJvdXRlcyhuZXdSb3V0ZXMpIHtcbiAgICBtYW5pZmVzdCA9IHt9O1xuICAgIGluRmxpZ2h0RGF0YVJvdXRlcyA9IGNvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMoXG4gICAgICBuZXdSb3V0ZXMsXG4gICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgdm9pZCAwLFxuICAgICAgbWFuaWZlc3RcbiAgICApO1xuICB9XG4gIGZ1bmN0aW9uIHBhdGNoUm91dGVzKHJvdXRlSWQsIGNoaWxkcmVuLCB1bnN0YWJsZV9hbGxvd0VsZW1lbnRNdXRhdGlvbnMgPSBmYWxzZSkge1xuICAgIGxldCBpc05vbkhNUiA9IGluRmxpZ2h0RGF0YVJvdXRlcyA9PSBudWxsO1xuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIHBhdGNoUm91dGVzSW1wbChcbiAgICAgIHJvdXRlSWQsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIHJvdXRlc1RvVXNlLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgdW5zdGFibGVfYWxsb3dFbGVtZW50TXV0YXRpb25zXG4gICAgKTtcbiAgICBpZiAoaXNOb25ITVIpIHtcbiAgICAgIGRhdGFSb3V0ZXMgPSBbLi4uZGF0YVJvdXRlc107XG4gICAgICB1cGRhdGVTdGF0ZSh7fSk7XG4gICAgfVxuICB9XG4gI
25114HJvdXRlciA9IHtcbiAgICBnZXQgYmFzZW5hbWUoKSB7XG4gICAgICByZXR1cm4gYmFzZW5hbWU7XG4gICAgfSxcbiAgICBnZXQgZnV0dXJlKCkge1xuICAgICAgcmV0dXJuIGZ1dHVyZTtcbiAgICB9LFxuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9LFxuICAgIGdldCByb3V0ZXMoKSB7XG4gICAgICByZXR1cm4gZGF0YVJvdXRlcztcbiAgICB9LFxuICAgIGdldCB3aW5kb3coKSB7XG4gICAgICByZXR1cm4gcm91dGVyV2luZG93O1xuICAgIH0sXG4gICAgaW5pdGlhbGl6ZSxcbiAgICBzdWJzY3JpYmUsXG4gICAgZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb24sXG4gICAgbmF2aWdhdGUsXG4gICAgZmV0Y2g6IGZldGNoMixcbiAgICByZXZhbGlkYXRlLFxuICAgIC8vIFBhc3N0aHJvdWdoIHRvIGhpc3RvcnktYXdhcmUgY3JlYXRlSHJlZiB1c2VkIGJ5IHVzZUhyZWYgc28gd2UgZ2V0IHByb3BlclxuICAgIC8vIGhhc2gtYXdhcmUgVVJMcyBpbiBET00gcGF0aHNcbiAgICBjcmVhdGVIcmVmOiAodG8pID0+IGluaXQuaGlzdG9yeS5jcmVhdGVIcmVmKHRvKSxcbiAgICBlbmNvZGVMb2NhdGlvbjogKHRvKSA9PiBpbml0Lmhpc3RvcnkuZW5jb2RlTG9jYXRpb24odG8pLFxuICAgIGdldEZldGNoZXIsXG4gICAgcmVzZXRGZXRjaGVyLFxuICAgIGRlbGV0ZUZldGNoZXI6IHF1ZXVlRmV0Y2hlckZvckRlbGV0aW9uLFxuICAgIGRpc3Bvc2UsXG4gICAgZ2V0QmxvY2tlcixcbiAgICBkZWxldGVCbG9ja2VyLFxuICAgIHBhdGNoUm91dGVzLFxuICAgIF9pbnRlcm5hbEZldGNoQ29udHJvbGxlcnM6IGZldGNoQ29udHJvbGxlcnMsXG4gICAgLy8gVE9ETzogUmVtb3ZlIHNldFJvdXRlcywgaXQncyB0ZW1wb3JhcnkgdG8gYXZvaWQgZGVhbGluZyB3aXRoXG4gICAgLy8gdXBkYXRpbmcgdGhlIHRyZWUgd2hpbGUgdmFsaWRhdGluZyB0aGUgdXBkYXRlIGFsZ29yaXRobS5cbiAgICBfaW50ZXJuYWxTZXRSb3V0ZXMsXG4gICAgX2ludGVybmFsU2V0U3RhdGVEb05vdFVzZU9yWW91V2lsbEJyZWFrWW91ckFwcChuZXdTdGF0ZSkge1xuICAgICAgdXBkYXRlU3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJvdXRlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN0YXRpY0hhbmRsZXIocm91dGVzLCBvcHRzKSB7XG4gIGludmFyaWFudChcbiAgICByb3V0ZXMubGVuZ3RoID4gMCxcbiAgICBcIllvdSBtdXN0IHByb3ZpZGUgYSBub24tZW1wdHkgcm91dGVzIGFycmF5IHRvIGNyZWF0ZVN0YXRpY0hhbmRsZXJcIlxuICApO1xuICBsZXQgbWFuaWZlc3QgPSB7fTtcbiAgbGV0IGJhc2VuYW1lID0gKG9wdHMgPyBvcHRzLmJhc2VuYW1lIDogbnVsbCkgfHwgXCIvXCI7XG4gIGxldCBtYXBSb3V0ZVByb3BlcnRpZXMyID0gb3B0cz8ubWFwUm91dGVQcm9wZXJ0aWVzIHx8IGRlZmF1bHRNYXBSb3V0ZVByb3BlcnRpZXM7XG4gIGxldCBkYXRhUm91dGVzID0gY29udmVydFJvdXRlc1RvRGF0YVJvdXRlcyhcbiAgICByb3V0ZXMsXG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzMixcbiAgICB2b2lkIDAsXG4gICAgbWFuaWZlc3RcbiAgKTtcbiAgYXN5bmMgZnVuY3Rpb24gcXVlcnkocmVxdWVzdCwge1xuICAgIHJlcXVlc3RDb250ZXh0LFxuICAgIGZpbHRlck1hdGNoZXNUb0xvYWQsXG4gICAgc2tpcExvYWRlckVycm9yQnViYmxpbmcsXG4gICAgc2tpcFJldmFsaWRhdGlvbixcbiAgICBkYXRhU3RyYXRlZ3ksXG4gICAgZ2VuZXJhdGVNaWRkbGV3YXJlUmVzcG9uc2VcbiAgfSA9IHt9KSB7XG4gICAgbGV0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICAgIGxldCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZDtcbiAgICBsZXQgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihcIlwiLCBjcmVhdGVQYXRoKHVybCksIG51bGwsIFwiZGVmYXVsdFwiKTtcbiAgICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKGRhdGFSb3V0ZXMsIGxvY2F0aW9uLCBiYXNlbmFtZSk7XG4gICAgcmVxdWVzdENvbnRleHQgPSByZXF1ZXN0Q29udGV4dCAhPSBudWxsID8gcmVxdWVzdENvbnRleHQgOiBuZXcgUm91dGVyQ29udGV4dFByb3ZpZGVyKCk7XG4gICAgaWYgKCFpc1ZhbGlkTWV0aG9kKG1ldGhvZCkgJiYgbWV0aG9kICE9PSBcIkhFQURcIikge1xuICAgICAgbGV0IGVycm9yID0gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHsgbWV0aG9kIH0pO1xuICAgICAgbGV0IHsgbWF0Y2hlczogbWV0aG9kTm90QWxsb3dlZE1hdGNoZXMsIHJvdXRlIH0gPSBnZXRTaG9ydENpcmN1aXRNYXRjaGVzKGRhdGFSb3V0ZXMpO1xuICAgICAgbGV0IHN0YXRpY0NvbnRleHQgPSB7XG4gICAgICAgIGJhc2VuYW1lLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgbWF0Y2hlczogbWV0aG9kTm90QWxsb3dlZE1hdGNoZXMsXG4gICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICBhY3Rpb25EYXRhOiBudWxsLFxuICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICBbcm91dGUuaWRdOiBlcnJvclxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5zdGF0dXMsXG4gICAgICAgIGxvYWRlckhlYWRlcnM6IHt9LFxuICAgICAgICBhY3Rpb25IZWFkZXJzOiB7fVxuICAgICAgfTtcbiAgICAgIHJldHVybiBnZW5lcmF0ZU1pZGRsZXdhcmVSZXNwb25zZSA/IGdlbmVyYXRlTWlkZGxld2FyZVJlc3BvbnNlKCgpID0+IFByb21pc2UucmVzb2x2ZShzdGF0aWNDb250ZXh0KSkgOiBzdGF0aWNDb250ZXh0O1xuICAgIH0gZWxzZSBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIGxldCBlcnJvciA9IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7IHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSB9KTtcbiAgICAgIGxldCB7IG1hdGNoZXM6IG5vdEZvdW5kTWF0Y2hlcywgcm91dGUgfSA9IGdldFNob3J0Q2lyY3VpdE1hdGNoZXMoZGF0YVJvdXRlcyk7XG4gICAgICBsZXQgc3RhdGljQ29udGV4dCA9IHtcbiAgICAgICAgYmFzZW5hbWUsXG4gICAgICAgIGxvY2F0aW9uLFxuICAgICAgICBtYXRjaGVzOiBub3RGb3VuZE1hdGNoZXMsXG4gICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICBhY3Rpb25EYXRhOiBudWxsLFxuICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICBbcm91dGUuaWRdOiBlcnJvclxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5zdGF0dXMsXG4gICAgICAgIGxvYWRlckhlYWRlcnM6IHt9LFxuICAgICAgICBhY3Rpb25IZWFkZXJzOiB7fVxuICAgICAgfTtcbiAgICAgIHJldHVybi
25114BnZW5lcmF0ZU1pZGRsZXdhcmVSZXNwb25zZSA/IGdlbmVyYXRlTWlkZGxld2FyZVJlc3BvbnNlKCgpID0+IFByb21pc2UucmVzb2x2ZShzdGF0aWNDb250ZXh0KSkgOiBzdGF0aWNDb250ZXh0O1xuICAgIH1cbiAgICBpZiAoZ2VuZXJhdGVNaWRkbGV3YXJlUmVzcG9uc2UpIHtcbiAgICAgIGludmFyaWFudChcbiAgICAgICAgcmVxdWVzdENvbnRleHQgaW5zdGFuY2VvZiBSb3V0ZXJDb250ZXh0UHJvdmlkZXIsXG4gICAgICAgIFwiV2hlbiB1c2luZyBtaWRkbGV3YXJlIGluIGBzdGF0aWNIYW5kbGVyLnF1ZXJ5KClgLCBhbnkgcHJvdmlkZWQgYHJlcXVlc3RDb250ZXh0YCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGBSb3V0ZXJDb250ZXh0UHJvdmlkZXJgXCJcbiAgICAgICk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBsb2FkTGF6eU1pZGRsZXdhcmVGb3JNYXRjaGVzKFxuICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzMlxuICAgICAgICApO1xuICAgICAgICBsZXQgcmVuZGVyZWRTdGF0aWNDb250ZXh0O1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBydW5TZXJ2ZXJNaWRkbGV3YXJlUGlwZWxpbmUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgICBwYXJhbXM6IG1hdGNoZXNbMF0ucGFyYW1zLFxuICAgICAgICAgICAgLy8gSWYgd2UncmUgY2FsbGluZyBtaWRkbGV3YXJlIHRoZW4gaXQgbXVzdCBiZSBlbmFibGVkIHNvIHdlIGNhbiBjYXN0XG4gICAgICAgICAgICAvLyB0aGlzIHRvIHRoZSBwcm9wZXIgdHlwZSBrbm93aW5nIGl0J3Mgbm90IGFuIGBBcHBMb2FkQ29udGV4dGBcbiAgICAgICAgICAgIGNvbnRleHQ6IHJlcXVlc3RDb250ZXh0XG4gICAgICAgICAgfSxcbiAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgZ2VuZXJhdGVNaWRkbGV3YXJlUmVzcG9uc2UoXG4gICAgICAgICAgICAgIGFzeW5jIChyZXZhbGlkYXRpb25SZXF1ZXN0LCBvcHRzMiA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDIgPSBhd2FpdCBxdWVyeUltcGwoXG4gICAgICAgICAgICAgICAgICByZXZhbGlkYXRpb25SZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICAgICAgICAgICAgICBkYXRhU3RyYXRlZ3kgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nID09PSB0cnVlLFxuICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIFwiZmlsdGVyTWF0Y2hlc1RvTG9hZFwiIGluIG9wdHMyID8gb3B0czIuZmlsdGVyTWF0Y2hlc1RvTG9hZCA/PyBudWxsIDogZmlsdGVyTWF0Y2hlc1RvTG9hZCA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgc2tpcFJldmFsaWRhdGlvbiA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVzcG9uc2UocmVzdWx0MikpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZW5kZXJlZFN0YXRpY0NvbnRleHQgPSB7IGxvY2F0aW9uLCBiYXNlbmFtZSwgLi4ucmVzdWx0MiB9O1xuICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXJlZFN0YXRpY0NvbnRleHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYXN5bmMgKGVycm9yLCByb3V0ZUlkKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNSZWRpcmVjdFJlc3BvbnNlKGVycm9yKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNSZXNwb25zZShlcnJvcikpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvclJlc3BvbnNlSW1wbChcbiAgICAgICAgICAgICAgICAgIGVycm9yLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgIGVycm9yLnN0YXR1c1RleHQsXG4gICAgICAgICAgICAgICAgICBhd2FpdCBwYXJzZVJlc3BvbnNlQm9keShlcnJvcilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNEYXRhV2l0aFJlc3BvbnNlSW5pdChlcnJvcikpIHtcbiAgICAgICAgICAgICAgZXJyb3IgPSBkYXRhV2l0aFJlc3BvbnNlSW5pdFRvRXJyb3JSZXNwb25zZShlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVuZGVyZWRTdGF0aWNDb250ZXh0KSB7XG4gICAgICAgICAgICAgIGlmIChyb3V0ZUlkIGluIHJlbmRlcmVkU3RhdGljQ29udGV4dC5sb2FkZXJEYXRhKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyZWRTdGF0aWNDb250ZXh0LmxvYWRlckRhdGFbcm91dGVJZF0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGV0IHN0YXRpY0NvbnRleHQgPSBnZXRTdGF0aWNDb250ZXh0RnJvbUVycm9yKFxuICAgICAgICAgICAgICAgIGRhdGFSb3V0ZXMsXG4gICAgICAgICAgICAgICAgcmVuZGVyZWRTdGF0aWNDb250ZXh0LFxuICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nID8gcm91dGVJZCA6IGZpbmROZWFyZXN0Qm91bmRhcnkobWF0Y2hlcywgcm91dGVJZCkucm91dGUuaWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlTWlkZGxld2FyZVJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICgpID0+IFByb21pc2UucmVzb2x2ZShzdGF0aWNDb250ZXh0KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbGV0IGJvdW5kYXJ5Um91dGVJZCA9IHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nID8gcm91dGVJZCA6IGZpbmROZWFyZXN0Qm91bmRhcnkoXG4gICAgICAgICAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgICAgICAgICBtYXRjaGVzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAobSkgPT4gbS5yb3V0ZS5pZCA9PT0gcm91dGVJZCB8fCBtLnJvdXRlLmxvYWRlclxuICAgICAgICAgICAgICAgICk/LnJvdXRlLmlkIHx8IHJvdXRlSWRcbiAgICAgICAgICAgICAgKS5yb3V0ZS5pZDtcbiAgICAgICAgICAgICAgbGV0IHN0YXRpY0NvbnRleHQgPSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgICAgICBiYXNlbmFtZSxcbiAgICAgICAgICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgICAgICAgICBhY3Rpb25EYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yczoge1xuICAgICAgICAgICAgICAgICAgW2JvdW5kYXJ5Um91dGVJZF06IGVycm9yXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiBpc1JvdXRlRXJyb3JSZXNwb25zZShlcnJvcikgPyBlcnJvci5zdGF0dXMgOiA1MDAsXG4gICAgICAgICAgICAgICAgYWN0aW9uSGVhZGVyczoge30sXG4gICAgICAgICAgICAgICAgbG9hZGVySGVhZGVyczoge31cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlTWlkZGxld2FyZVJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICgpID0+IFByb21pc2UucmVzb2x2ZShzdGF0aWNDb250ZXh0KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgI
25114H1cbiAgICAgICAgKTtcbiAgICAgICAgaW52YXJpYW50KGlzUmVzcG9uc2UocmVzcG9uc2UpLCBcIkV4cGVjdGVkIGEgcmVzcG9uc2UgaW4gcXVlcnkoKVwiKTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaXNSZXNwb25zZShlKSkge1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSBhd2FpdCBxdWVyeUltcGwoXG4gICAgICByZXF1ZXN0LFxuICAgICAgbG9jYXRpb24sXG4gICAgICBtYXRjaGVzLFxuICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICBkYXRhU3RyYXRlZ3kgfHwgbnVsbCxcbiAgICAgIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nID09PSB0cnVlLFxuICAgICAgbnVsbCxcbiAgICAgIGZpbHRlck1hdGNoZXNUb0xvYWQgfHwgbnVsbCxcbiAgICAgIHNraXBSZXZhbGlkYXRpb24gPT09IHRydWVcbiAgICApO1xuICAgIGlmIChpc1Jlc3BvbnNlKHJlc3VsdCkpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiB7IGxvY2F0aW9uLCBiYXNlbmFtZSwgLi4ucmVzdWx0IH07XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gcXVlcnlSb3V0ZShyZXF1ZXN0LCB7XG4gICAgcm91dGVJZCxcbiAgICByZXF1ZXN0Q29udGV4dCxcbiAgICBkYXRhU3RyYXRlZ3ksXG4gICAgZ2VuZXJhdGVNaWRkbGV3YXJlUmVzcG9uc2VcbiAgfSA9IHt9KSB7XG4gICAgbGV0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICAgIGxldCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZDtcbiAgICBsZXQgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihcIlwiLCBjcmVhdGVQYXRoKHVybCksIG51bGwsIFwiZGVmYXVsdFwiKTtcbiAgICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKGRhdGFSb3V0ZXMsIGxvY2F0aW9uLCBiYXNlbmFtZSk7XG4gICAgcmVxdWVzdENvbnRleHQgPSByZXF1ZXN0Q29udGV4dCAhPSBudWxsID8gcmVxdWVzdENvbnRleHQgOiBuZXcgUm91dGVyQ29udGV4dFByb3ZpZGVyKCk7XG4gICAgaWYgKCFpc1ZhbGlkTWV0aG9kKG1ldGhvZCkgJiYgbWV0aG9kICE9PSBcIkhFQURcIiAmJiBtZXRob2QgIT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNSwgeyBtZXRob2QgfSk7XG4gICAgfSBlbHNlIGlmICghbWF0Y2hlcykge1xuICAgICAgdGhyb3cgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDQsIHsgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lIH0pO1xuICAgIH1cbiAgICBsZXQgbWF0Y2ggPSByb3V0ZUlkID8gbWF0Y2hlcy5maW5kKChtKSA9PiBtLnJvdXRlLmlkID09PSByb3V0ZUlkKSA6IGdldFRhcmdldE1hdGNoKG1hdGNoZXMsIGxvY2F0aW9uKTtcbiAgICBpZiAocm91dGVJZCAmJiAhbWF0Y2gpIHtcbiAgICAgIHRocm93IGdldEludGVybmFsUm91dGVyRXJyb3IoNDAzLCB7XG4gICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgcm91dGVJZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7IHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSB9KTtcbiAgICB9XG4gICAgaWYgKGdlbmVyYXRlTWlkZGxld2FyZVJlc3BvbnNlKSB7XG4gICAgICBpbnZhcmlhbnQoXG4gICAgICAgIHJlcXVlc3RDb250ZXh0IGluc3RhbmNlb2YgUm91dGVyQ29udGV4dFByb3ZpZGVyLFxuICAgICAgICBcIldoZW4gdXNpbmcgbWlkZGxld2FyZSBpbiBgc3RhdGljSGFuZGxlci5xdWVyeVJvdXRlKClgLCBhbnkgcHJvdmlkZWQgYHJlcXVlc3RDb250ZXh0YCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGBSb3V0ZXJDb250ZXh0UHJvdmlkZXJgXCJcbiAgICAgICk7XG4gICAgICBhd2FpdCBsb2FkTGF6eU1pZGRsZXdhcmVGb3JNYXRjaGVzKG1hdGNoZXMsIG1hbmlmZXN0LCBtYXBSb3V0ZVByb3BlcnRpZXMyKTtcbiAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJ1blNlcnZlck1pZGRsZXdhcmVQaXBlbGluZShcbiAgICAgICAge1xuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgICBwYXJhbXM6IG1hdGNoZXNbMF0ucGFyYW1zLFxuICAgICAgICAgIC8vIElmIHdlJ3JlIGNhbGxpbmcgbWlkZGxld2FyZSB0aGVuIGl0IG11c3QgYmUgZW5hYmxlZCBzbyB3ZSBjYW4gY2FzdFxuICAgICAgICAgIC8vIHRoaXMgdG8gdGhlIHByb3BlciB0eXBlIGtub3dpbmcgaXQncyBub3QgYW4gYEFwcExvYWRDb250ZXh0YFxuICAgICAgICAgIGNvbnRleHQ6IHJlcXVlc3RDb250ZXh0XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgZ2VuZXJhdGVNaWRkbGV3YXJlUmVzcG9uc2UoXG4gICAgICAgICAgICBhc3luYyAoaW5uZXJSZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgIGxldCByZXN1bHQyID0gYXdhaXQgcXVlcnlJbXBsKFxuICAgICAgICAgICAgICAgIGlubmVyUmVxdWVzdCxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LFxuICAgICAgICAgICAgICAgIGRhdGFTdHJhdGVneSB8fCBudWxsLFxuICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIG1hdGNoLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgbGV0IHByb2Nlc3NlZCA9IGhhbmRsZVF1ZXJ5UmVzdWx0KHJlc3VsdDIpO1xuICAgICAgICAgICAgICByZXR1cm4gaXNSZXNwb25zZShwcm9jZXNzZWQpID8gcHJvY2Vzc2VkIDogdHlwZW9mIHByb2Nlc3NlZCA9PT0gXCJzdHJpbmdcIiA/IG5ldyBSZXNwb25zZShwcm9jZXNzZWQpIDogUmVzcG9uc2UuanNvbihwcm9jZXNzZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGlzRGF0YVdpdGhSZXNwb25zZUluaXQoZXJyb3IpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhdGFXaXRoUmVzcG9uc2VJbml0VG9SZXNwb25zZShlcnJvcikpO1xuICAgICAgICAgI
25114H1cbiAgICAgICAgICBpZiAoaXNSZXNwb25zZShlcnJvcikpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5SW1wbChcbiAgICAgIHJlcXVlc3QsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIG1hdGNoZXMsXG4gICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgIGRhdGFTdHJhdGVneSB8fCBudWxsLFxuICAgICAgZmFsc2UsXG4gICAgICBtYXRjaCxcbiAgICAgIG51bGwsXG4gICAgICBmYWxzZVxuICAgICk7XG4gICAgcmV0dXJuIGhhbmRsZVF1ZXJ5UmVzdWx0KHJlc3VsdCk7XG4gICAgZnVuY3Rpb24gaGFuZGxlUXVlcnlSZXN1bHQocmVzdWx0Mikge1xuICAgICAgaWYgKGlzUmVzcG9uc2UocmVzdWx0MikpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDI7XG4gICAgICB9XG4gICAgICBsZXQgZXJyb3IgPSByZXN1bHQyLmVycm9ycyA/IE9iamVjdC52YWx1ZXMocmVzdWx0Mi5lcnJvcnMpWzBdIDogdm9pZCAwO1xuICAgICAgaWYgKGVycm9yICE9PSB2b2lkIDApIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0Mi5hY3Rpb25EYXRhKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJlc3VsdDIuYWN0aW9uRGF0YSlbMF07XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0Mi5sb2FkZXJEYXRhKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJlc3VsdDIubG9hZGVyRGF0YSlbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgfVxuICBhc3luYyBmdW5jdGlvbiBxdWVyeUltcGwocmVxdWVzdCwgbG9jYXRpb24sIG1hdGNoZXMsIHJlcXVlc3RDb250ZXh0LCBkYXRhU3RyYXRlZ3ksIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nLCByb3V0ZU1hdGNoLCBmaWx0ZXJNYXRjaGVzVG9Mb2FkLCBza2lwUmV2YWxpZGF0aW9uKSB7XG4gICAgaW52YXJpYW50KFxuICAgICAgcmVxdWVzdC5zaWduYWwsXG4gICAgICBcInF1ZXJ5KCkvcXVlcnlSb3V0ZSgpIHJlcXVlc3RzIG11c3QgY29udGFpbiBhbiBBYm9ydENvbnRyb2xsZXIgc2lnbmFsXCJcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaXNNdXRhdGlvbk1ldGhvZChyZXF1ZXN0Lm1ldGhvZCkpIHtcbiAgICAgICAgbGV0IHJlc3VsdDIgPSBhd2FpdCBzdWJtaXQoXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgIHJvdXRlTWF0Y2ggfHwgZ2V0VGFyZ2V0TWF0Y2gobWF0Y2hlcywgbG9jYXRpb24pLFxuICAgICAgICAgIHJlcXVlc3RDb250ZXh0LFxuICAgICAgICAgIGRhdGFTdHJhdGVneSxcbiAgICAgICAgICBza2lwTG9hZGVyRXJyb3JCdWJibGluZyxcbiAgICAgICAgICByb3V0ZU1hdGNoICE9IG51bGwsXG4gICAgICAgICAgZmlsdGVyTWF0Y2hlc1RvTG9hZCxcbiAgICAgICAgICBza2lwUmV2YWxpZGF0aW9uXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZXN1bHQyO1xuICAgICAgfVxuICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGxvYWRSb3V0ZURhdGEoXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIHJlcXVlc3RDb250ZXh0LFxuICAgICAgICBkYXRhU3RyYXRlZ3ksXG4gICAgICAgIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nLFxuICAgICAgICByb3V0ZU1hdGNoLFxuICAgICAgICBmaWx0ZXJNYXRjaGVzVG9Mb2FkXG4gICAgICApO1xuICAgICAgcmV0dXJuIGlzUmVzcG9uc2UocmVzdWx0KSA/IHJlc3VsdCA6IHtcbiAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICBhY3Rpb25EYXRhOiBudWxsLFxuICAgICAgICBhY3Rpb25IZWFkZXJzOiB7fVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoaXNEYXRhU3RyYXRlZ3lSZXN1bHQoZSkgJiYgaXNSZXNwb25zZShlLnJlc3VsdCkpIHtcbiAgICAgICAgaWYgKGUudHlwZSA9PT0gXCJlcnJvclwiIC8qIGVycm9yICovKSB7XG4gICAgICAgICAgdGhyb3cgZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGUucmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVkaXJlY3RSZXNwb25zZShlKSkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdChyZXF1ZXN0LCBtYXRjaGVzLCBhY3Rpb25NYXRjaCwgcmVxdWVzdENvbnRleHQsIGRhdGFTdHJhdGVneSwgc2tpcExvYWRlckVycm9yQnViYmxpbmcsIGlzUm91dGVSZXF1ZXN0LCBmaWx0ZXJNYXRjaGVzVG9Mb2FkLCBza2lwUmV2YWxpZGF0aW9uKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoIWFjdGlvbk1hdGNoLnJvdXRlLmFjdGlvbiAmJiAhYWN0aW9uTWF0Y2gucm91dGUubGF6eSkge1xuICAgICAgbGV0IGVycm9yID0gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHtcbiAgICAgICAgbWV0aG9kOiByZXF1
25114ZXN0Lm1ldGhvZCxcbiAgICAgICAgcGF0aG5hbWU6IG5ldyBVUkwocmVxdWVzdC51cmwpLnBhdGhuYW1lLFxuICAgICAgICByb3V0ZUlkOiBhY3Rpb25NYXRjaC5yb3V0ZS5pZFxuICAgICAgfSk7XG4gICAgICBpZiAoaXNSb3V0ZVJlcXVlc3QpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIHR5cGU6IFwiZXJyb3JcIiAvKiBlcnJvciAqLyxcbiAgICAgICAgZXJyb3JcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBkc01hdGNoZXMgPSBnZXRUYXJnZXRlZERhdGFTdHJhdGVneU1hdGNoZXMoXG4gICAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICAgIG1hbmlmZXN0LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBhY3Rpb25NYXRjaCxcbiAgICAgICAgW10sXG4gICAgICAgIHJlcXVlc3RDb250ZXh0XG4gICAgICApO1xuICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjYWxsRGF0YVN0cmF0ZWd5KFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBkc01hdGNoZXMsXG4gICAgICAgIGlzUm91dGVSZXF1ZXN0LFxuICAgICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgZGF0YVN0cmF0ZWd5XG4gICAgICApO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0c1thY3Rpb25NYXRjaC5yb3V0ZS5pZF07XG4gICAgICBpZiAocmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICB0aHJvd1N0YXRpY0hhbmRsZXJBYm9ydGVkRXJyb3IocmVxdWVzdCwgaXNSb3V0ZVJlcXVlc3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNSZWRpcmVjdFJlc3VsdChyZXN1bHQpKSB7XG4gICAgICB0aHJvdyBuZXcgUmVzcG9uc2UobnVsbCwge1xuICAgICAgICBzdGF0dXM6IHJlc3VsdC5yZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBMb2NhdGlvbjogcmVzdWx0LnJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiTG9jYXRpb25cIilcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc1JvdXRlUmVxdWVzdCkge1xuICAgICAgaWYgKGlzRXJyb3JSZXN1bHQocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXRjaGVzOiBbYWN0aW9uTWF0Y2hdLFxuICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgYWN0aW9uRGF0YTogeyBbYWN0aW9uTWF0Y2gucm91dGUuaWRdOiByZXN1bHQuZGF0YSB9LFxuICAgICAgICBlcnJvcnM6IG51bGwsXG4gICAgICAgIC8vIE5vdGU6IHN0YXR1c0NvZGUgKyBoZWFkZXJzIGFyZSB1bnVzZWQgaGVyZSBzaW5jZSBxdWVyeVJvdXRlIHdpbGxcbiAgICAgICAgLy8gcmV0dXJuIHRoZSByYXcgUmVzcG9uc2Ugb3IgdmFsdWVcbiAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICBsb2FkZXJIZWFkZXJzOiB7fSxcbiAgICAgICAgYWN0aW9uSGVhZGVyczoge31cbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChza2lwUmV2YWxpZGF0aW9uKSB7XG4gICAgICBpZiAoaXNFcnJvclJlc3VsdChyZXN1bHQpKSB7XG4gICAgICAgIGxldCBib3VuZGFyeU1hdGNoID0gc2tpcExvYWRlckVycm9yQnViYmxpbmcgPyBhY3Rpb25NYXRjaCA6IGZpbmROZWFyZXN0Qm91bmRhcnkobWF0Y2hlcywgYWN0aW9uTWF0Y2gucm91dGUuaWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IGlzUm91dGVFcnJvclJlc3BvbnNlKHJlc3VsdC5lcnJvcikgPyByZXN1bHQuZXJyb3Iuc3RhdHVzIDogcmVzdWx0LnN0YXR1c0NvZGUgIT0gbnVsbCA/IHJlc3VsdC5zdGF0dXNDb2RlIDogNTAwLFxuICAgICAgICAgIGFjdGlvbkRhdGE6IG51bGwsXG4gICAgICAgICAgYWN0aW9uSGVhZGVyczoge1xuICAgICAgICAgICAgLi4ucmVzdWx0LmhlYWRlcnMgPyB7IFthY3Rpb25NYXRjaC5yb3V0ZS5pZF06IHJlc3VsdC5oZWFkZXJzIH0gOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICAgIFtib3VuZGFyeU1hdGNoLnJvdXRlLmlkXTogcmVzdWx0LmVycm9yXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsb2FkZXJIZWFkZXJzOiB7fVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY3Rpb25EYXRhOiB7XG4gICAgICAgICAgICBbYWN0aW9uTWF0Y2gucm91dGUuaWRdOiByZXN1bHQuZGF0YVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWN0aW9uSGVhZGVyczogcmVzdWx0LmhlYWRlcnMgPyB7IFthY3Rpb25NYXRjaC5yb3V0ZS5pZF06IHJlc3VsdC5oZWFkZXJzIH0gOiB7fSxcbiAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICAgIGVycm9yczogbnVsbCxcbiAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQuc3RhdHVzQ29kZSB8fCAyMDAsXG4gICAgICAgICAgbG9hZGVySGVhZGVyczoge31cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGxvYWRlclJlcXVlc3QgPSBuZXcgUmVxdWVzdChyZXF1ZXN0LnVybCwge1xuICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgcmVkaXJlY3Q6IHJlcXVlc3QucmVkaXJlY3QsXG4gICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsXG4gICAgfSk7XG4gICAgaWYgKGlzRXJyb3JSZXN1bHQocmVzdWx0KSkge1xuICAgICAgbGV0IGJvdW5kYXJ5TWF0Y2ggPSBza2lwTG9hZGVyRXJyb3JCdWJibGluZyA/IGFjdGlvbk1hdGNoIDogZmluZE5lYXJlc3RCb3VuZGFyeShtYXRjaGVzLCBhY3Rpb25NYXRjaC5yb3V0ZS5pZCk7XG4gICAgICBsZXQgaGFuZGxlckNvbnRleHQyID0gYXdhaXQgbG9hZFJvdXRlRGF0YShcbiAgICAgICAgbG9hZGVyUmVxdWVzdCxcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICAgIGRhdGFTdHJhdGVneSxcbiAgICAgICAgc2tpcExvYWRlckVycm9yQnViYmxpbmcsXG4gICAgICAgIG51bGwsXG4gICAgICAgIGZpbHRlck1hdGNoZXNUb0xvYWQsXG4gICAgICAgIFtib3VuZGFyeU1hdGNoLnJvdXRlLmlkLCByZXN1bHRdXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaGFuZGxlckNvbnRleHQyLFxuICAgICAgICBzdGF0dXNDb2RlOiBpc1JvdXRlRXJyb3JSZXNwb25zZShyZXN1bHQuZXJyb3IpID8gcmVzdWx0LmVycm9yLnN0YXR1cyA6IHJlc3VsdC5zdGF0dXNDb2RlICE9IG51bGwgPyByZXN1bHQuc3RhdHVzQ29kZSA6IDUwMCxcbiAgICAgICAgYWN0aW9uRGF0YTogbnVsbCxcbiAgICAgICAgYWN0aW9uSGVhZGVyczoge1xuICAgICAgICAgIC4uLnJlc3VsdC5oZWFkZXJzID8geyBbYWN0aW9uTWF0Y2gucm91dGUuaWRdOiByZXN1bHQuaGVhZGVycyB9IDoge31cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IGhhbmRsZXJDb250ZXh0ID0gYXdhaXQgbG9hZFJvdXRlRGF0YShcbiAgICAgIGxvYWRlclJlcXVlc3QsXG4gICAgICBtYXRjaGVzLFxuICAgICAgcmVxdW
25114VzdENvbnRleHQsXG4gICAgICBkYXRhU3RyYXRlZ3ksXG4gICAgICBza2lwTG9hZGVyRXJyb3JCdWJibGluZyxcbiAgICAgIG51bGwsXG4gICAgICBmaWx0ZXJNYXRjaGVzVG9Mb2FkXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaGFuZGxlckNvbnRleHQsXG4gICAgICBhY3Rpb25EYXRhOiB7XG4gICAgICAgIFthY3Rpb25NYXRjaC5yb3V0ZS5pZF06IHJlc3VsdC5kYXRhXG4gICAgICB9LFxuICAgICAgLy8gYWN0aW9uIHN0YXR1cyBjb2RlcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBsb2FkZXIgc3RhdHVzIGNvZGVzXG4gICAgICAuLi5yZXN1bHQuc3RhdHVzQ29kZSA/IHsgc3RhdHVzQ29kZTogcmVzdWx0LnN0YXR1c0NvZGUgfSA6IHt9LFxuICAgICAgYWN0aW9uSGVhZGVyczogcmVzdWx0LmhlYWRlcnMgPyB7IFthY3Rpb25NYXRjaC5yb3V0ZS5pZF06IHJlc3VsdC5oZWFkZXJzIH0gOiB7fVxuICAgIH07XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFJvdXRlRGF0YShyZXF1ZXN0LCBtYXRjaGVzLCByZXF1ZXN0Q29udGV4dCwgZGF0YVN0cmF0ZWd5LCBza2lwTG9hZGVyRXJyb3JCdWJibGluZywgcm91dGVNYXRjaCwgZmlsdGVyTWF0Y2hlc1RvTG9hZCwgcGVuZGluZ0FjdGlvblJlc3VsdCkge1xuICAgIGxldCBpc1JvdXRlUmVxdWVzdCA9IHJvdXRlTWF0Y2ggIT0gbnVsbDtcbiAgICBpZiAoaXNSb3V0ZVJlcXVlc3QgJiYgIXJvdXRlTWF0Y2g/LnJvdXRlLmxvYWRlciAmJiAhcm91dGVNYXRjaD8ucm91dGUubGF6eSkge1xuICAgICAgdGhyb3cgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDAsIHtcbiAgICAgICAgbWV0aG9kOiByZXF1
25114ZXN0Lm1ldGhvZCxcbiAgICAgICAgcGF0aG5hbWU6IG5ldyBVUkwocmVxdWVzdC51cmwpLnBhdGhuYW1lLFxuICAgICAgICByb3V0ZUlkOiByb3V0ZU1hdGNoPy5yb3V0ZS5pZFxuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBkc01hdGNoZXM7XG4gICAgaWYgKHJvdXRlTWF0Y2gpIHtcbiAgICAgIGRzTWF0Y2hlcyA9IGdldFRhcmdldGVkRGF0YVN0cmF0ZWd5TWF0Y2hlcyhcbiAgICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzMixcbiAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIHJvdXRlTWF0Y2gsXG4gICAgICAgIFtdLFxuICAgICAgICByZXF1ZXN0Q29udGV4dFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG1heElkeCA9IHBlbmRpbmdBY3Rpb25SZXN1bHQgJiYgaXNFcnJvclJlc3VsdChwZW5kaW5nQWN0aW9uUmVzdWx0WzFdKSA/IChcbiAgICAgICAgLy8gVXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGJvdW5kYXJ5XG4gICAgICAgIG1hdGNoZXMuZmluZEluZGV4KChtKSA9PiBtLnJvdXRlLmlkID09PSBwZW5kaW5nQWN0aW9uUmVzdWx0WzBdKSAtIDFcbiAgICAgICkgOiB2b2lkIDA7XG4gICAgICBkc01hdGNoZXMgPSBtYXRjaGVzLm1hcCgobWF0Y2gsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChtYXhJZHggIT0gbnVsbCAmJiBpbmRleCA+IG1heElkeCkge1xuICAgICAgICAgIHJldHVybiBnZXREYXRhU3RyYXRlZ3lNYXRjaChcbiAgICAgICAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldERhdGFTdHJhdGVneU1hdGNoKFxuICAgICAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICBbXSxcbiAgICAgICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgICAobWF0Y2gucm91dGUubG9hZGVyIHx8IG1hdGNoLnJvdXRlLmxhenkpICE9IG51bGwgJiYgKCFmaWx0ZXJNYXRjaGVzVG9Mb2FkIHx8IGZpbHRlck1hdGNoZXNUb0xvYWQobWF0Y2gpKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghZGF0YVN0cmF0ZWd5ICYmICFkc01hdGNoZXMuc29tZSgobSkgPT4gbS5zaG91bGRMb2FkKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgbG9hZGVyRGF0YToge30sXG4gICAgICAgIGVycm9yczogcGVuZGluZ0FjdGlvblJlc3VsdCAmJiBpc0Vycm9yUmVzdWx0KHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0pID8ge1xuICAgICAgICAgIFtwZW5kaW5nQWN0aW9uUmVzdWx0WzBdXTogcGVuZGluZ0FjdGlvblJlc3VsdFsxXS5lcnJvclxuICAgICAgICB9IDogbnVsbCxcbiAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICBsb2FkZXJIZWFkZXJzOiB7fVxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjYWxsRGF0YVN0cmF0ZWd5KFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGRzTWF0Y2hlcyxcbiAgICAgIGlzUm91dGVSZXF1ZXN0LFxuICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICBkYXRhU3RyYXRlZ3lcbiAgICApO
251141xuICAgIGlmIChyZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICB0aHJvd1N0YXRpY0hhbmRsZXJBYm9ydGVkRXJyb3IocmVxdWVzdCwgaXNSb3V0ZVJlcXVlc3QpO1xuICAgIH1cbiAgICBsZXQgaGFuZGxlckNvbnRleHQgPSBwcm9jZXNzUm91dGVMb2FkZXJEYXRhKFxuICAgICAgbWF0Y2hlcyxcbiAgICAgIHJlc3VsdHMsXG4gICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0LFxuICAgICAgdHJ1ZSxcbiAgICAgIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaGFuZGxlckNvbnRleHQsXG4gICAgICBtYXRjaGVzXG4gICAgfTtcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBjYWxsRGF0YVN0cmF0ZWd5KHJlcXVlc3QsIG1hdGNoZXMsIGlzUm91dGVSZXF1ZXN0LCByZXF1ZXN0Q29udGV4dCwgZGF0YVN0cmF0ZWd5KSB7XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjYWxsRGF0YVN0cmF0ZWd5SW1wbChcbiAgICAgIGRhdGFTdHJhdGVneSB8fCBkZWZhdWx0RGF0YVN0cmF0ZWd5LFxuICAgICAgcmVxdWVzdCxcbiAgICAgIG1hdGNoZXMsXG4gICAgICBudWxsLFxuICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBsZXQgZGF0YVJlc3VsdHMgPSB7fTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hdGNoZXMubWFwKGFzeW5jIChtYXRjaCkgPT4ge1xuICAgICAgICBpZiAoIShtYXRjaC5yb3V0ZS5pZCBpbiByZXN1bHRzKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVzdWx0c1ttYXRjaC5yb3V0ZS5pZF07XG4gICAgICAgIGlmIChpc1JlZGlyZWN0RGF0YVN0cmF0ZWd5UmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgICAgICBsZXQgcmVzcG9uc2UgPSByZXN1bHQucmVzdWx0O1xuICAgICAgICAgIHRocm93IG5vcm1hbGl6ZVJlbGF0aXZlUm91dGluZ1JlZGlyZWN0UmVzcG9uc2UoXG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICBtYXRjaC5yb3V0ZS5pZCxcbiAgICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgICBiYXNlbmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUm91dGVSZXF1ZXN0KSB7XG4gICAgICAgICAgaWYgKGlzUmVzcG9uc2UocmVzdWx0LnJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzRGF0YVdpdGhSZXNwb25zZUluaXQocmVzdWx0LnJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRocm93IGRhdGFXaXRoUmVzcG9uc2VJbml0VG9SZXNwb25zZShyZXN1bHQucmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVJlc3VsdHNbbWF0Y2gucm91dGUuaWRdID0gYXdhaXQgY29udmVydERhdGFTdHJhdGVneVJlc3VsdFRvRGF0YVJlc3VsdChyZXN1bHQpO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBkYXRhUmVzdWx0cztcbiAgfVxuICByZXR1cm4ge1xuICAgIGRhdGFSb3V0ZXMsXG4gICAgcXVlcnksXG4gICAgcXVlcnlSb3V0ZVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0U3RhdGljQ29udGV4dEZyb21FcnJvcihyb3V0ZXMsIGhhbmRsZXJDb250ZXh0LCBlcnJvciwgYm91bmRhcnlJZCkge1xuICBsZXQgZXJyb3JCb3VuZGFyeUlkID0gYm91bmRhcnlJZCB8fCBoYW5kbGVyQ29udGV4dC5fZGVlcGVzdFJlbmRlcmVkQm91bmRhcnlJZCB8fCByb3V0ZXNbMF0uaWQ7XG4gIHJldHVybiB7XG4gICAgLi4uaGFuZGxlckNvbnRleHQsXG4gICAgc3RhdHVzQ29kZTogaXNSb3V0ZUVycm9yUmVzcG9uc2UoZXJyb3IpID8gZXJyb3Iuc3RhdHVzIDogNTAwLFxuICAgIGVycm9yczoge1xuICAgICAgW2Vycm9yQm91bmRhcnlJZF06IGVycm9yXG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gdGhyb3dTdGF0aWNIYW5kbGVyQWJvcnRlZEVycm9yKHJlcXVlc3QsIGlzUm91dGVSZXF1ZXN0KSB7XG4gIGlmIChyZXF1ZXN0LnNpZ25hbC5yZWFzb24gIT09IHZvaWQgMCkge1xuICAgIHRocm93IHJlcXVlc3Quc2lnbmFsLnJlYXNvbjtcbiAgfVxuICBsZXQgbWV0aG9kID0gaXNSb3V0ZVJlcXVlc3QgPyBcInF1ZXJ5Um91dGVcIiA6IFwicXVlcnlcIjtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGAke21ldGhvZH0oKSBjYWxsIGFib3J0ZWQgd2l0aG91dCBhbiBcXGBBYm9ydFNpZ25hbC5yZWFzb25cXGA6ICR7cmVxdWVzdC5tZXRob2R9ICR7cmVxdWVzdC51cmx9YFxuICApO1xufVxuZnVuY3Rpb24gaXNTdWJtaXNzaW9uTmF2aWdhdGlvbihvcHRzKSB7XG4gIHJldHVybiBvcHRzICE9IG51bGwgJiYgKFwiZm9ybURhdGFcIiBpbiBvcHRzICYmIG9wdHMuZm9ybURhdGEgIT0gbnVsbCB8fCBcImJvZHlcIiBpbiBvcHRzICYmIG9wdHMuYm9keSAhPT0gdm9pZCAwKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRvKGxvY2F0aW9uLCBtYXRjaGVzLCBiYXNlbmFtZSwgdG8sIGZyb21Sb3V0ZUlkLCByZWxhdGl2ZSkge1xuICBsZXQgY29udGV4dHVhbE1hdGNoZXM7XG4gIGxldCBhY3RpdmVSb3V0ZU1hdGNoO1xuICBpZiAoZnJvbVJvdXRlSWQpIHtcbiAgICBjb250ZXh0dWFsTWF0Y2hlcyA9IFtdO1xuICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgIGNvbnRleHR1YWxNYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgICAgaWYgKG1hdGNoLnJvdXRlLmlkID09PSBmcm9tUm91dGVJZCkge1xuICAgICAgICBhY3RpdmVSb3V0ZU1hdGNoID0gbWF0Y2g7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb250ZXh0dWFsTWF0Y2hlcyA9IG1hdGNoZXM7XG4gICAgYWN0aXZlUm91dGVNYXRjaCA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgfVxuICBsZXQgcGF0aCA9IHJlc29sdmVUbyhcbiAgICB0byA/IHRvIDogXCIuXCIsXG4gICAgZ2V0UmVzb2x2ZVRvTWF0Y2hlcyhjb250ZXh0dWFsTWF0Y2hlcyksXG4gICAgc3RyaXBCYXNlbmFtZShsb2NhdGlvbi5wYXRobmFtZSwgYmFzZW5hbWUpIHx8IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgIHJlbGF0aXZlID09PSBcInBhdGhcIlxuICApO
251141xuICBpZiAodG8gPT0gbnVsbCkge1xuICAgIHBhdGguc2VhcmNoID0gbG9jYXRpb24uc2VhcmNoO1xuICAgIHBhdGguaGFzaCA9IGxvY2F0aW9uLmhhc2g7XG4gIH1cbiAgaWYgKCh0byA9PSBudWxsIHx8IHRvID09PSBcIlwiIHx8IHRvID09PSBcIi5cIikgJiYgYWN0aXZlUm91dGVNYXRjaCkge1xuICAgIGxldCBuYWtlZEluZGV4ID0gaGFzTmFrZWRJbmRleFF1ZXJ5KHBhdGguc2VhcmNoKTtcbiAgICBpZiAoYWN0aXZlUm91dGVNYXRjaC5yb3V0ZS5pbmRleCAmJiAhbmFrZWRJbmRleCkge1xuICAgICAgcGF0aC5zZWFyY2ggPSBwYXRoLnNlYXJjaCA/IHBhdGguc2VhcmNoLnJlcGxhY2UoL15cXD8vLCBcIj9pbmRleCZcIikgOiBcIj9pbmRleFwiO1xuICAgIH0gZWxzZSBpZiAoIWFjdGl2ZVJvdXRlTWF0Y2gucm91dGUuaW5kZXggJiYgbmFrZWRJbmRleCkge1xuICAgICAgbGV0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGF0aC5zZWFyY2gpO1xuICAgICAgbGV0IGluZGV4VmFsdWVzID0gcGFyYW1zLmdldEFsbChcImluZGV4XCIpO1xuICAgICAgcGFyYW1zLmRlbGV0ZShcImluZGV4XCIpO1xuICAgICAgaW5kZXhWYWx1ZXMuZmlsdGVyKCh2KSA9PiB2KS5mb3JFYWNoKCh2KSA9PiBwYXJhbXMuYXBwZW5kKFwiaW5kZXhcIiwgdikpO1xuICAgICAgbGV0IHFzID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgICBwYXRoLnNlYXJjaCA9IHFzID8gYD8ke3FzfWAgOiBcIlwiO1xuICAgIH1cbiAgfVxuICBpZiAoYmFzZW5hbWUgIT09IFwiL1wiKSB7XG4gICAgcGF0aC5wYXRobmFtZSA9IHByZXBlbmRCYXNlbmFtZSh7IGJhc2VuYW1lLCBwYXRobmFtZTogcGF0aC5wYXRobmFtZSB9KTtcbiAgfVxuICByZXR1cm4gY3JlYXRlUGF0aChwYXRoKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5hdmlnYXRlT3B0aW9ucyhpc0ZldGNoZXIsIHBhdGgsIG9wdHMpIHtcbiAgaWYgKCFvcHRzIHx8ICFpc1N1Ym1pc3Npb25OYXZpZ2F0aW9uKG9wdHMpKSB7XG4gICAgcmV0dXJuIHsgcGF0aCB9O1xuICB9XG4gIGlmIChvcHRzLmZvcm1NZXRob2QgJiYgIWlzVmFsaWRNZXRob2Qob3B0cy5mb3JtTWV0aG9kKSkge1xuICAgIHJldHVybiB7XG4gICAgICBwYXRoLFxuICAgICAgZXJyb3I6IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA1LCB7IG1ldGhvZDogb3B0cy5mb3JtTWV0aG9kIH0pXG4gICAgfTtcbiAgfVxuICBsZXQgZ2V0SW52YWxpZEJvZHlFcnJvciA9ICgpID0+ICh7XG4gICAgcGF0aCxcbiAgICBlcnJvcjogZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDAsIHsgdHlwZTogXCJpbnZhbGlkLWJvZHlcIiB9KVxuICB9KTtcbiAgbGV0IHJhd0Zvcm1NZXRob2QgPSBvcHRzLmZvcm1NZXRob2QgfHwgXCJnZXRcIjtcbiAgbGV0IGZvcm1NZXRob2QgPSByYXdGb3JtTWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gIGxldCBmb3JtQWN0aW9uID0gc3RyaXBIYXNoRnJvbVBhdGgocGF0aCk7XG4gIGlmIChvcHRzLmJvZHkgIT09IHZvaWQgMCkge1xuICAgIGlmIChvcHRzLmZvcm1FbmNUeXBlID09PSBcInRleHQvcGxhaW5cIikge1xuICAgICAgaWYgKCFpc011dGF0aW9uTWV0aG9kKGZvcm1NZXRob2QpKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnZhbGlkQm9keUVycm9yKCk7XG4gICAgICB9XG4gICAgICBsZXQgdGV4dCA9IHR5cGVvZiBvcHRzLmJvZHkgPT09IFwic3RyaW5nXCIgPyBvcHRzLmJvZHkgOiBvcHRzLmJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSB8fCBvcHRzLmJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMgPyAoXG4gICAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm0tY29udHJvbC1pbmZyYXN0cnVjdHVyZS5odG1sI3BsYWluLXRleHQtZm9ybS1kYXRhXG4gICAgICAgIEFycmF5LmZyb20ob3B0cy5ib2R5LmVudHJpZXMoKSkucmVkdWNlKFxuICAgICAgICAgIChhY2MsIFtuYW1lLCB2YWx1ZV0pID0+IGAke2FjY30ke25hbWV9PSR7dmFsdWV9XG5gLFxuICAgICAgICAgIFwiXCJcbiAgICAgICAgKVxuICAgICAgKSA6IFN0cmluZyhvcHRzLmJvZHkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgc3VibWlzc2lvbjoge1xuICAgICAgICAgIGZvcm1NZXRob2QsXG4gICAgICAgICAgZm9ybUFjdGlvbixcbiAgICAgICAgICBmb3JtRW5jVHlwZTogb3B0cy5mb3JtRW5jVHlwZSxcbiAgICAgICAgICBmb3JtRGF0YTogdm9pZCAwLFxuICAgICAgICAgIGpzb246IHZvaWQgMCxcbiAgICAgICAgICB0ZXh0XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChvcHRzLmZvcm1FbmNUeXBlID09PSBcImFwcGxpY2F0aW9uL2pzb25cIikge1xuICAgICAgaWYgKCFpc011dGF0aW9uTWV0aG9kKGZvcm1NZXRob2QpKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnZhbGlkQm9keUVycm9yKCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBsZXQganNvbiA9IHR5cGVvZiBvcHRzLmJvZHkgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKG9wdHMuYm9keSkgOiBvcHRzLmJvZHk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBzdWJtaXNzaW9uOiB7XG4gICAgICAgICAgICBmb3JtTWV0aG9kLFxuICAgICAgICAgICAgZm9ybUFjdGlvbixcbiAgICAgICAgICAgIGZvcm1FbmNUeXBlOiBvcHRzLmZvcm1FbmNUeXBlLFxuICAgICAgICAgICAgZm9ybURhdGE6IHZvaWQgMCxcbiAgICAgICAgICAgIGpzb24sXG4gICAgICAgICAgICB0ZXh0OiB2b2lkIDBcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnZhbGlkQm9keUVycm9yKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGludmFyaWFudChcbiAgICB0eXBlb2YgRm9ybURhdGEgPT09IFwiZnVuY3Rpb25cIixcbiAgICBcIkZvcm1EYXRhIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudFwiXG4gICk7XG4gIGxldCBzZWFyY2hQYXJhbXM7XG4gIGxldCBmb3JtRGF0YTtcbiAgaWYgKG9wdHMuZm9ybURhdGEpIHtcbiAgICBzZWFyY2hQYXJhbXMgPSBjb252ZXJ0Rm9ybURhdGFUb1NlYXJjaFBhcmFtcyhvcHRzLmZvcm1EYXRhKTtcbiAgICBmb3JtRGF0YSA9IG9wdHMuZm9ybURhdGE7XG4gIH0gZWxzZSBpZiAob3B0cy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICBzZWFyY2hQYXJhbXMgPSBjb252ZXJ0Rm9ybURhdGFUb1NlYXJjaFBhcmFtcyhvcHRzLmJvZHkpO1xuICAgIGZvcm1EYXRhID0gb3B0cy5ib2R5O1xuICB9IGVsc2UgaWYgKG9wdHMuYm9keSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgIHNlYXJjaFBhcmFtcyA9IG9wdHMuYm9keTtcbiAgICBmb3JtRGF0YSA9IGNvbnZlcnRTZWFyY2hQYXJhbXNUb0Zvcm1EYXRhKHNlYXJjaFBhcmFtcyk7XG4gIH0gZWxzZSBpZiAob3B0cy5ib2R5ID09IG51bGwpIHtcbiAgICBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhvcHRzLmJvZHkpO1xuICAgICAgZm9ybURhdGEgPSBjb252ZXJ0U2VhcmNoUGFyYW1zVG9Gb3JtRGF0YShzZWFyY2hQYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybi
25114BnZXRJbnZhbGlkQm9keUVycm9yKCk7XG4gICAgfVxuICB9XG4gIGxldCBzdWJtaXNzaW9uID0ge1xuICAgIGZvcm1NZXRob2QsXG4gICAgZm9ybUFjdGlvbixcbiAgICBmb3JtRW5jVHlwZTogb3B0cyAmJiBvcHRzLmZvcm1FbmNUeXBlIHx8IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIsXG4gICAgZm9ybURhdGEsXG4gICAganNvbjogdm9pZCAwLFxuICAgIHRleHQ6IHZvaWQgMFxuICB9O1xuICBpZiAoaXNNdXRhdGlvbk1ldGhvZChzdWJtaXNzaW9uLmZvcm1NZXRob2QpKSB7XG4gICAgcmV0dXJuIHsgcGF0aCwgc3VibWlzc2lvbiB9O1xuICB9XG4gIGxldCBwYXJzZWRQYXRoID0gcGFyc2VQYXRoKHBhdGgpO1xuICBpZiAoaXNGZXRjaGVyICYmIHBhcnNlZFBhdGguc2VhcmNoICYmIGhhc05ha2VkSW5kZXhRdWVyeShwYXJzZWRQYXRoLnNlYXJjaCkpIHtcbiAgICBzZWFyY2hQYXJhbXMuYXBwZW5kKFwiaW5kZXhcIiwgXCJcIik7XG4gIH1cbiAgcGFyc2VkUGF0aC5zZWFyY2ggPSBgPyR7c2VhcmNoUGFyYW1zfWA7XG4gIHJldHVybiB7IHBhdGg6IGNyZWF0ZVBhdGgocGFyc2VkUGF0aCksIHN1Ym1pc3Npb24gfTtcbn1cbmZ1bmN0aW9uIGdldE1hdGNoZXNUb0xvYWQocmVxdWVzdCwgc2NvcGVkQ29udGV4dCwgbWFwUm91dGVQcm9wZXJ0aWVzMiwgbWFuaWZlc3QsIGhpc3RvcnksIHN0YXRlLCBtYXRjaGVzLCBzdWJtaXNzaW9uLCBsb2NhdGlvbiwgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCwgaW5pdGlhbEh5ZHJhdGlvbiwgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCwgY2FuY2VsbGVkRmV0Y2hlckxvYWRzLCBmZXRjaGVyc1F1ZXVlZEZvckRlbGV0aW9uLCBmZXRjaExvYWRNYXRjaGVzLCBmZXRjaFJlZGlyZWN0SWRzLCByb3V0ZXNUb1VzZSwgYmFzZW5hbWUsIGhhc1BhdGNoUm91dGVzT25OYXZpZ2F0aW9uLCBwZW5kaW5nQWN0aW9uUmVzdWx0KSB7XG4gIGxldCBhY3Rpb25SZXN1bHQgPSBwZW5kaW5nQWN0aW9uUmVzdWx0ID8gaXNFcnJvclJlc3VsdChwZW5kaW5nQWN0aW9uUmVzdWx0WzFdKSA/IHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0uZXJyb3IgOiBwZW5kaW5nQWN0aW9uUmVzdWx0WzFdLmRhdGEgOiB2b2lkIDA7XG4gIGxldCBjdXJyZW50VXJsID0gaGlzdG9yeS5jcmVhdGVVUkwoc3RhdGUubG9jYXRpb24pO1xuICBsZXQgbmV4dFVybCA9IGhpc3RvcnkuY3JlYXRlVVJMKGxvY2F0aW9uKTtcbiAgbGV0IG1heElkeDtcbiAgaWYgKGluaXRpYWxIeWRyYXRpb24gJiYgc3RhdGUuZXJyb3JzKSB7XG4gICAgbGV0IGJvdW5kYXJ5SWQgPSBPYmplY3Qua2V5cyhzdGF0ZS5lcnJvcnMpWzBdO1xuICAgIG1heElkeCA9IG1hdGNoZXMuZmluZEluZGV4KChtKSA9PiBtLnJvdXRlLmlkID09PSBib3VuZGFyeUlkKTtcbiAgfSBlbHNlIGlmIChwZW5kaW5nQWN0aW9uUmVzdWx0ICYmIGlzRXJyb3JSZXN1bHQocGVuZGluZ0FjdGlvblJlc3VsdFsxXSkpIHtcbiAgICBsZXQgYm91bmRhcnlJZCA9IHBlbmRpbmdBY3Rpb25SZXN1bHRbMF07XG4gICAgbWF4SWR4ID0gbWF0Y2hlcy5maW5kSW5kZXgoKG0pID0+IG0ucm91dGUuaWQgPT09IGJvdW5kYXJ5SWQpIC0gMTtcbiAgfVxuICBsZXQgYWN0aW9uU3RhdHVzID0gcGVuZGluZ0FjdGlvblJlc3VsdCA/IHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0uc3RhdHVzQ29kZSA6IHZvaWQgMDtcbiAgbGV0IHNob3VsZFNraXBSZXZhbGlkYXRpb24gPSBhY3Rpb25TdGF0dXMgJiYgYWN0aW9uU3RhdHVzID49IDQwMDtcbiAgbGV0IGJhc2VTaG91bGRSZXZhbGlkYXRlQXJncyA9IHtcbiAgICBjdXJyZW50VXJsLFxuICAgIGN1cnJlbnRQYXJhbXM6IHN0YXRlLm1hdGNoZXNbMF0/LnBhcmFtcyB8fCB7fSxcbiAgICBuZXh0VXJsLFxuICAgIG5leHRQYXJhbXM6IG1hdGNoZXNbMF0ucGFyYW1zLFxuICAgIC4uLnN1Ym1pc3Npb24sXG4gICAgYWN0aW9uUmVzdWx0LFxuICAgIGFjdGlvblN0YXR1c1xuICB9O1xuICBsZXQgZHNNYXRjaGVzID0gbWF0Y2hlcy5tYXAoKG1hdGNoLCBpbmRleCkgPT4ge1xuICAgIGxldCB7IHJvdXRlIH0gPSBtYXRjaDtcbiAgICBsZXQgZm9yY2VTaG91bGRMb2FkID0gbnVsbDtcbiAgICBpZiAobWF4SWR4ICE9IG51bGwgJiYgaW5kZXggPiBtYXhJZHgpIHtcbiAgICAgIGZvcmNlU2hvdWxkTG9hZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAocm91dGUubGF6eSkge1xuICAgICAgZm9yY2VTaG91bGRMb2FkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFyb3V0ZUhhc0xvYWRlck9yTWlkZGxld2FyZShyb3V0ZSkpIHtcbiAgICAgIGZvcmNlU2hvdWxkTG9hZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoaW5pdGlhbEh5ZHJhdGlvbikge1xuICAgICAgZm9yY2VTaG91bGRMb2FkID0gc2hvdWxkTG9hZFJvdXRlT25IeWRyYXRpb24oXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBzdGF0ZS5sb2FkZXJEYXRhLFxuICAgICAgICBzdGF0ZS5lcnJvcnNcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChpc05ld0xvYWRlcihzdGF0ZS5sb2FkZXJEYXRhLCBzdGF0ZS5tYXRjaGVzW2luZGV4XSwgbWF0Y2gpKSB7XG4gICAgICBmb3JjZVNob3VsZExvYWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZm9yY2VTaG91bGRMb2FkICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZ2V0RGF0YVN0cmF0ZWd5TWF0Y2goXG4gICAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICAgIG1hbmlmZXN0LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBtYXRjaCxcbiAgICAgICAgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCxcbiAgICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgICAgZm9yY2VTaG91bGRMb2FkXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgZGVmYXVsdFNob3VsZFJldmFsaWRhdGUgPSBzaG91bGRTa2lwUmV2YWxpZGF0aW9uID8gZmFsc2UgOiAoXG4gICAgICAvLyBGb3JjZWQgcmV2YWxpZGF0aW9uIGR1ZSB0byBzdWJtaXNzaW9uLCB1c2VSZXZhbGlkYXRvciwgb3IgWC1SZW1peC1SZXZhbGlkYXRlXG4gICAgICBpc1JldmFsaWRhdGlvblJlcXVpcmVkIHx8IGN1cnJlbnRVcmwucGF0aG5hbWUgKyBjdXJyZW50VXJsLnNlYXJjaCA9PT0gbmV4dFVybC5wYXRobmFtZSArIG5leHRVcmwuc2VhcmNoIHx8IC8vIFNlYXJjaCBwYXJhbXMgYWZmZWN0IGFsbCBsb2FkZXJzXG4gICAgICBjdXJyZW50VXJsLnNlYXJjaCAhPT0gbm
25114V4dFVybC5zZWFyY2ggfHwgaXNOZXdSb3V0ZUluc3RhbmNlKHN0YXRlLm1hdGNoZXNbaW5kZXhdLCBtYXRjaClcbiAgICApO1xuICAgIGxldCBzaG91bGRSZXZhbGlkYXRlQXJncyA9IHtcbiAgICAgIC4uLmJhc2VTaG91bGRSZXZhbGlkYXRlQXJncyxcbiAgICAgIGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlXG4gICAgfTtcbiAgICBsZXQgc2hvdWxkTG9hZCA9IHNob3VsZFJldmFsaWRhdGVMb2FkZXIobWF0Y2gsIHNob3VsZFJldmFsaWRhdGVBcmdzKTtcbiAgICByZXR1cm4gZ2V0RGF0YVN0cmF0ZWd5TWF0Y2goXG4gICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICByZXF1ZXN0LFxuICAgICAgbWF0Y2gsXG4gICAgICBsYXp5Um91dGVQcm9wZXJ0aWVzVG9Ta2lwLFxuICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgIHNob3VsZExvYWQsXG4gICAgICBzaG91bGRSZXZhbGlkYXRlQXJnc1xuICAgICk7XG4gIH0pO1xuICBsZXQgcmV2YWxpZGF0aW5nRmV0Y2hlcnMgPSBbXTtcbiAgZmV0Y2hMb2FkTWF0Y2hlcy5mb3JFYWNoKChmLCBrZXkpID0+IHtcbiAgICBpZiAoaW5pdGlhbEh5ZHJhdGlvbiB8fCAhbWF0Y2hlcy5zb21lKChtKSA9PiBtLnJvdXRlLmlkID09PSBmLnJvdXRlSWQpIHx8IGZldGNoZXJzUXVldWVkRm9yRGVsZXRpb24uaGFzKGtleSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGZldGNoZXIgPSBzdGF0ZS5mZXRjaGVycy5nZXQoa2V5KTtcbiAgICBsZXQgaXNNaWRJbml0aWFsTG9hZCA9IGZldGNoZXIgJiYgZmV0Y2hlci5zdGF0ZSAhPT0gXCJpZGxlXCIgJiYgZmV0Y2hlci5kYXRhID09PSB2b2lkIDA7XG4gICAgbGV0IGZldGNoZXJNYXRjaGVzID0gbWF0Y2hSb3V0ZXMocm91dGVzVG9Vc2UsIGYucGF0aCwgYmFzZW5hbWUpO1xuICAgIGlmICghZmV0Y2hlck1hdGNoZXMpIHtcbiAgICAgIGlmIChoYXNQYXRjaFJvdXRlc09uTmF2aWdhdGlvbiAmJiBpc01pZEluaXRpYWxMb2FkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHJvdXRlSWQ6IGYucm91dGVJZCxcbiAgICAgICAgcGF0aDogZi5wYXRoLFxuICAgICAgICBtYXRjaGVzOiBudWxsLFxuICAgICAgICBtYXRjaDogbnVsbCxcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgY29udHJvbGxlcjogbnVsbFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChmZXRjaFJlZGlyZWN0SWRzLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBmZXRjaGVyTWF0Y2ggPSBnZXRUYXJnZXRNYXRjaChmZXRjaGVyTWF0Y2hlcywgZi5wYXRoKTtcbiAgICBsZXQgZmV0Y2hDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGxldCBmZXRjaFJlcXVlc3QgPSBjcmVhdGVDbGllbnRTaWRlUmVxdWVzdChcbiAgICAgIGhpc3RvcnksXG4gICAgICBmLnBhdGgsXG4gICAgICBmZXRjaENvbnRyb2xsZXIuc2lnbmFsXG4gICAgKTtcbiAgICBsZXQgZmV0Y2hlckRzTWF0Y2hlcyA9IG51bGw7XG4gICAgaWYgKGNhbmNlbGxlZEZldGNoZXJMb2Fkcy5oYXMoa2V5KSkge1xuICAgICAgY2FuY2VsbGVkRmV0Y2hlckxvYWRzLmRlbGV0ZShrZXkpO1xuICAgICAgZmV0Y2hlckRzTWF0Y2hlcyA9IGdldFRhcmdldGVkRGF0YVN0cmF0ZWd5TWF0Y2hlcyhcbiAgICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzMixcbiAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgIGZldGNoUmVxdWVzdCxcbiAgICAgICAgZmV0Y2hlck1hdGNoZXMsXG4gICAgICAgIGZldGNoZXJNYXRjaCxcbiAgICAgICAgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCxcbiAgICAgICAgc2NvcGVkQ29udGV4dFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzTWlkSW5pdGlhbExvYWQpIHtcbiAgICAgIGlmIChpc1JldmFsaWRhdGlvblJlcXVpcmVkKSB7XG4gICAgICAgIGZldGNoZXJEc01hdGNoZXMgPSBnZXRUYXJnZXRlZERhdGFTdHJhdGVneU1hdGNoZXMoXG4gICAgICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzMixcbiAgICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgICBmZXRjaFJlcXVlc3QsXG4gICAgICAgICAgZmV0Y2hlck1hdGNoZXMsXG4gICAgICAgICAgZmV0Y2hlck1hdGNoLFxuICAgICAgICAgIGxhenlSb3V0ZVByb3BlcnRpZXNUb1NraXAsXG4gICAgICAgICAgc2NvcGVkQ29udGV4dFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgc2hvdWxkUmV2YWxpZGF0ZUFyZ3MgPSB7XG4gICAgICAgIC4uLmJhc2VTaG91bGRSZXZhbGlkYXRlQXJncyxcbiAgICAgICAgZGVmYXVsdFNob3VsZFJldmFsaWRhdGU6IHNob3VsZFNraXBSZXZhbGlkYXRpb24gPyBmYWxzZSA6IGlzUmV2YWxpZGF0aW9uUmVxdWlyZWRcbiAgICAgIH07XG4gICAgICBpZiAoc2hvdWxkUmV2YWxpZGF0ZUxvYWRlcihmZXRjaGVyTWF0Y2gsIHNob3VsZFJldmFsaWRhdGVBcmdzKSkge1xuICAgICAgICBmZXRjaGVyRHNNYXRjaGVzID0gZ2V0VGFyZ2V0ZWREYXRhU3RyYXRlZ3lNYXRjaGVzKFxuICAgICAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgZmV0Y2hSZXF1ZXN0LFxuICAgICAgICAgIGZldGNoZXJNYXRjaGVzLFxuICAgICAgICAgIGZldGNoZXJNYXRjaCxcbiAgICAgICAgICBsYXp5Um91dGVQcm9wZXJ0aWVzVG9Ta2lwLFxuICAgICAgICAgIHNjb3BlZENvbnRleHQsXG4gICAgICAgICAgc2hvdWxkUmV2YWxpZGF0ZUFyZ3NcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZldGNoZXJEc01hdGNoZXMpIHtcbiAgICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHJvdXRlSWQ6IGYucm91dGVJZCxcbiAgICAgICAgcGF0aDogZi5wYXRoLFxuICAgICAgICBtYXRjaGVzOiBmZXRjaGVyRHNNYXRjaGVzLFxuICAgICAgICBtYXRjaDogZmV0Y2hlck1hdGNoLFxuICAgICAgICByZXF1ZXN0OiBmZXRjaFJlcXVlc3QsXG4gICAgICAgIGNvbnRyb2xsZXI6IGZldGNoQ29udHJvbGxlclxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHsgZHNNYXRjaGVzLCByZXZhbGlkYXRpbmdGZXRjaGVycyB9O1xufVxuZnVuY3Rpb24gcm91dGVIYXNMb2FkZXJPck1pZGRsZXdhcmUocm91dGUpIHtcbiAgcmV0dXJuIHJvdXRlLmxvYWRlciAhPSBudWxsIHx8IHJvdXRlLm1pZGRsZXdhcmUgIT0gbnVsbCAmJiByb3V0ZS5taWRkbGV3YXJlLmxlbmd0aCA+IDA7XG59XG5mdW5jdGlvbiBzaG91bGRMb2FkUm91dGVPbkh5ZHJhdGlvbihyb3V0ZSwgbG9hZGVyRGF0YSwgZXJyb3JzKSB7XG4gIGlmIChyb3V0ZS5sYXp5KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFyb3V0ZUhhc0xvYWRlck9yTWlkZGxld2FyZShyb3V0ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGhhc0RhdGEgPSBsb2FkZXJEYXRhICE9IG51bGwgJiYgcm91dGUuaWQgaW4gbG9hZGVyRGF0YTtcbiAgbGV0IGhhc0Vycm9yID0gZXJyb3JzICE9IG51bGwgJiYgZXJyb3JzW3JvdXRlLmlkXSAhPT0gdm9pZCAwO1xuICBpZiAoIWhhc0RhdGEgJiYgaGFzRXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiByb3V0ZS5sb2FkZXIgPT09IFwiZnVuY3Rpb25cIiAmJiByb3V0ZS5sb2FkZXIuaHlkcmF0ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybi
25114B0cnVlO1xuICB9XG4gIHJldHVybiAhaGFzRGF0YSAmJiAhaGFzRXJyb3I7XG59XG5mdW5jdGlvbiBpc05ld0xvYWRlcihjdXJyZW50TG9hZGVyRGF0YSwgY3VycmVudE1hdGNoLCBtYXRjaCkge1xuICBsZXQgaXNOZXcgPSAoXG4gICAgLy8gW2FdIC0+IFthLCBiXVxuICAgICFjdXJyZW50TWF0Y2ggfHwgLy8gW2EsIGJdIC0+IFthLCBjXVxuICAgIG1hdGNoLnJvdXRlLmlkICE9PSBjdXJyZW50TWF0Y2gucm91dGUuaWRcbiAgKTtcbiAgbGV0IGlzTWlzc2luZ0RhdGEgPSAhY3VycmVudExvYWRlckRhdGEuaGFzT3duUHJvcGVydHkobWF0Y2gucm91dGUuaWQpO1xuICByZXR1cm4gaXNOZXcgfHwgaXNNaXNzaW5nRGF0YTtcbn1cbmZ1bmN0aW9uIGlzTmV3Um91dGVJbnN0YW5jZShjdXJyZW50TWF0Y2gsIG1hdGNoKSB7XG4gIGxldCBjdXJyZW50UGF0aCA9IGN1cnJlbnRNYXRjaC5yb3V0ZS5wYXRoO1xuICByZXR1cm4gKFxuICAgIC8vIHBhcmFtIGNoYW5nZSBmb3IgdGhpcyBtYXRjaCwgL3VzZXJzLzEyMyAtPiAvdXNlcnMvNDU2XG4gICAgY3VycmVudE1hdGNoLnBhdGhuYW1lICE9PSBtYXRjaC5wYXRobmFtZSB8fCAvLyBzcGxhdCBwYXJhbSBjaGFuZ2VkLCB3aGljaCBpcyBub3QgcHJlc2VudCBpbiBtYXRjaC5wYXRoXG4gICAgLy8gZS5nLiAvZmlsZXMvaW1hZ2VzL2F2YXRhci5qcGcgLT4gZmlsZXMvZmluYW5jZXMueGxzXG4gICAgY3VycmVudFBhdGggIT0gbnVsbCAmJiBjdXJyZW50UGF0aC5lbmRzV2l0aChcIipcIikgJiYgY3VycmVudE1hdGNoLnBhcmFtc1tcIipcIl0gIT09IG1hdGNoLnBhcmFtc1tcIipcIl1cbiAgKTtcbn1cbmZ1bmN0aW9uIHNob3VsZFJldmFsaWRhdGVMb2FkZXIobG9hZGVyTWF0Y2gsIGFyZykge1xuICBpZiAobG9hZGVyTWF0Y2gucm91dGUuc2hvdWxkUmV2YWxpZGF0ZSkge1xuICAgIGxldCByb3V0ZUNob2ljZSA9IGxvYWRlck1hdGNoLnJvdXRlLnNob3VsZFJldmFsaWRhdGUoYXJnKTtcbiAgICBpZiAodHlwZW9mIHJvdXRlQ2hvaWNlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIHJvdXRlQ2hvaWNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJnLmRlZmF1bHRTaG91bGRSZXZhbGlkYXRlO1xufVxuZnVuY3Rpb24gcGF0Y2hSb3V0ZXNJbXBsKHJvdXRlSWQsIGNoaWxkcmVuLCByb3V0ZXNUb1VzZSwgbWFuaWZlc3QsIG1hcFJvdXRlUHJvcGVydGllczIsIGFsbG93RWxlbWVudE11dGF0aW9ucykge1xuICBsZXQgY2hpbGRyZW5Ub1BhdGNoO1xuICBpZiAocm91dGVJZCkge1xuICAgIGxldCByb3V0ZSA9IG1hbmlmZXN0W3JvdXRlSWRdO1xuICAgIGludmFyaWFudChcbiAgICAgIHJvdXRlLFxuICAgICAgYE5vIHJvdXRlIGZvdW5kIHRvIHBhdGNoIGNoaWxkcmVuIGludG86IHJvdXRlSWQgPSAke3JvdXRlSWR9YFxuICAgICk7XG4gICAgaWYgKCFyb3V0ZS5jaGlsZHJlbikge1xuICAgICAgcm91dGUuY2hpbGRyZW4gPSBbXTtcbiAgICB9XG4gICAgY2hpbGRyZW5Ub1BhdGNoID0gcm91dGUuY2hpbGRyZW47XG4gIH0gZWxzZSB7XG4gICAgY2hpbGRyZW5Ub1BhdGNoID0gcm91dGVzVG9Vc2U7XG4gIH1cbiAgbGV0IHVuaXF1ZUNoaWxkcmVuID0gW107XG4gIGxldCBleGlzdGluZ0NoaWxkcmVuID0gW107XG4gIGNoaWxkcmVuLmZvckVhY2goKG5ld1JvdXRlKSA9PiB7XG4gICAgbGV0IGV4aXN0aW5nUm91dGUgPSBjaGlsZHJlblRvUGF0Y2guZmluZChcbiAgICAgIChleGlzdGluZ1JvdXRlMikgPT4gaXNTYW1lUm91dGUobmV3Um91dGUsIGV4aXN0aW5nUm91dGUyKVxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nUm91dGUpIHtcbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4ucHVzaCh7IGV4aXN0aW5nUm91dGUsIG5ld1JvdXRlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bmlxdWVDaGlsZHJlbi5wdXNoKG5ld1JvdXRlKTtcbiAgICB9XG4gIH0pO1xuICBpZiAodW5pcXVlQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgIGxldCBuZXdSb3V0ZXMgPSBjb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzKFxuICAgICAgdW5pcXVlQ2hpbGRyZW4sXG4gICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgW3JvdXRlSWQgfHwgXCJfXCIsIFwicGF0Y2hcIiwgU3RyaW5nKGNoaWxkcmVuVG9QYXRjaD8ubGVuZ3RoIHx8IFwiMFwiKV0sXG4gICAgICBtYW5pZmVzdFxuICAgICk7XG4gICAgY2hpbGRyZW5Ub1BhdGNoLnB1c2goLi4ubmV3Um91dGVzKTtcbiAgfVxuICBpZiAoYWxsb3dFbGVtZW50TXV0YXRpb25zICYmIGV4aXN0aW5nQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHsgZXhpc3RpbmdSb3V0ZSwgbmV3Um91dGUgfSA9IGV4aXN0aW5nQ2hpbGRyZW5baV07XG4gICAgICBsZXQgZXhpc3RpbmdSb3V0ZVR5cGVkID0gZXhpc3RpbmdSb3V0ZTtcbiAgICAgIGxldCBbbmV3Um91dGVUeXBlZF0gPSBjb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzKFxuICAgICAgICBbbmV3Um91dGVdLFxuICAgICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgICBbXSxcbiAgICAgICAgLy8gRG9lc24ndCBtYXR0ZXIgZm9yIG11dGF0ZWQgcm91dGVzIHNpbmNlIHRoZXkgYWxyZWFkeSBoYXZlIGFuIGlkXG4gICAgICAgIHt9LFxuICAgICAgICAvLyBEb24ndCB0b3VjaCB0aGUgbWFuaWZlc3QgaGVyZSBzaW5jZSB3ZSdyZSB1cGRhdGluZyBpbiBwbGFjZVxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihleGlzdGluZ1JvdXRlVHlwZWQsIHtcbiAgICAgICAgZWxlbWVudDogbmV3Um91dGVUeXBlZC5lbGVtZW50ID8gbmV3Um91dGVUeXBlZC5lbGVtZW50IDogZXhpc3RpbmdSb3V0ZVR5cGVkLmVsZW1lbnQsXG4gICAgICAgIGVycm9yRWxlbWVudDogbmV3Um91dGVUeXBlZC5lcnJvckVsZW1lbnQgPyBuZXdSb3V0ZVR5cGVkLmVycm9yRWxlbWVudCA6IGV4aXN0aW5nUm91dGVUeXBlZC5lcnJvckVsZW1lbnQsXG4gICAgICAgIGh5ZHJhdGVGYWxsYmFja0VsZW1lbnQ6IG5ld1JvdXRlVHlwZWQuaHlkcmF0ZUZhbGxiYWNrRWxlbWVudCA/IG5ld1JvdXRlVHlwZWQuaHlkcmF0ZUZhbGxiYWNrRWxlbWVudCA6IGV4aXN0aW5nUm91dGVUeXBlZC5oeWRyYXRlRmFsbGJhY2tFbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gI
25114H1cbn1cbmZ1bmN0aW9uIGlzU2FtZVJvdXRlKG5ld1JvdXRlLCBleGlzdGluZ1JvdXRlKSB7XG4gIGlmIChcImlkXCIgaW4gbmV3Um91dGUgJiYgXCJpZFwiIGluIGV4aXN0aW5nUm91dGUgJiYgbmV3Um91dGUuaWQgPT09IGV4aXN0aW5nUm91dGUuaWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIShuZXdSb3V0ZS5pbmRleCA9PT0gZXhpc3RpbmdSb3V0ZS5pbmRleCAmJiBuZXdSb3V0ZS5wYXRoID09PSBleGlzdGluZ1JvdXRlLnBhdGggJiYgbmV3Um91dGUuY2FzZVNlbnNpdGl2ZSA9PT0gZXhpc3RpbmdSb3V0ZS5jYXNlU2Vuc2l0aXZlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKCFuZXdSb3V0ZS5jaGlsZHJlbiB8fCBuZXdSb3V0ZS5jaGlsZHJlbi5sZW5ndGggPT09IDApICYmICghZXhpc3RpbmdSb3V0ZS5jaGlsZHJlbiB8fCBleGlzdGluZ1JvdXRlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gbmV3Um91dGUuY2hpbGRyZW4uZXZlcnkoXG4gICAgKGFDaGlsZCwgaSkgPT4gZXhpc3RpbmdSb3V0ZS5jaGlsZHJlbj8uc29tZSgoYkNoaWxkKSA9PiBpc1NhbWVSb3V0ZShhQ2hpbGQsIGJDaGlsZCkpXG4gICk7XG59XG52YXIgbGF6eVJvdXRlUHJvcGVydHlDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xudmFyIGxvYWRMYXp5Um91dGVQcm9wZXJ0eSA9ICh7XG4gIGtleSxcbiAgcm91dGUsXG4gIG1hbmlmZXN0LFxuICBtYXBSb3V0ZVByb3BlcnRpZXM6IG1hcFJvdXRlUHJvcGVydGllczJcbn0pID0+IHtcbiAgbGV0IHJvdXRlVG9VcGRhdGUgPSBtYW5pZmVzdFtyb3V0ZS5pZF07XG4gIGludmFyaWFudChyb3V0ZVRvVXBkYXRlLCBcIk5vIHJvdXRlIGZvdW5kIGluIG1hbmlmZXN0XCIpO1xuICBpZiAoIXJvdXRlVG9VcGRhdGUubGF6eSB8fCB0eXBlb2Ygcm91dGVUb1VwZGF0ZS5sYXp5ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBsYXp5Rm4gPSByb3V0ZVRvVXBkYXRlLmxhenlba2V5XTtcbiAgaWYgKCFsYXp5Rm4pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGNhY2hlID0gbGF6eVJvdXRlUHJvcGVydHlDYWNoZS5nZXQocm91dGVUb1VwZGF0ZSk7XG4gIGlmICghY2FjaGUpIHtcbiAgICBjYWNoZSA9IHt9O1xuICAgIGxhenlSb3V0ZVByb3BlcnR5Q2FjaGUuc2V0KHJvdXRlVG9VcGRhdGUsIGNhY2hlKTtcbiAgfVxuICBsZXQgY2FjaGVkUHJvbWlzZSA9IGNhY2hlW2tleV07XG4gIGlmIChjYWNoZWRQcm9taXNlKSB7XG4gICAgcmV0dXJuIGNhY2hlZFByb21pc2U7XG4gIH1cbiAgbGV0IHByb3BlcnR5UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgbGV0IGlzVW5zdXBwb3J0ZWQgPSBpc1Vuc3VwcG9ydGVkTGF6eVJvdXRlT2JqZWN0S2V5KGtleSk7XG4gICAgbGV0IHN0YXRpY1JvdXRlVmFsdWUgPSByb3V0ZVRvVXBkYXRlW2tleV07XG4gICAgbGV0IGlzU3RhdGljYWxseURlZmluZWQgPSBzdGF0aWNSb3V0ZVZhbHVlICE9PSB2b2lkIDAgJiYga2V5ICE9PSBcImhhc0Vycm9yQm91bmRhcnlcIjtcbiAgICBpZiAoaXNVbnN1cHBvcnRlZCkge1xuICAgICAgd2FybmluZyhcbiAgICAgICAgIWlzVW5zdXBwb3J0ZWQsXG4gICAgICAgIFwiUm91dGUgcHJvcGVydHkgXCIgKyBrZXkgKyBcIiBpcyBub3QgYSBzdXBwb3J0ZWQgbGF6eSByb3V0ZSBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuXCJcbiAgICAgICk7XG4gICAgICBjYWNoZVtrZXldID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSBlbHNlIGlmIChpc1N0YXRpY2FsbHlEZWZpbmVkKSB7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgYFJvdXRlIFwiJHtyb3V0ZVRvVXBkYXRlLmlkfVwiIGhhcyBhIHN0YXRpYyBwcm9wZXJ0eSBcIiR7a2V5fVwiIGRlZmluZWQuIFRoZSBsYXp5IHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZC5gXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdmFsdWUgPSBhd2FpdCBsYXp5Rm4oKTtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocm91dGVUb1VwZGF0ZSwgeyBba2V5XTogdmFsdWUgfSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocm91dGVUb1VwZGF0ZSwgbWFwUm91dGVQcm9wZXJ0aWVzMihyb3V0ZVRvVXBkYXRlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygcm91dGVUb1VwZGF0ZS5sYXp5ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByb3V0ZVRvVXBkYXRlLmxhenlba2V5XSA9IHZvaWQgMDtcbiAgICAgIGlmIChPYmplY3QudmFsdWVzKHJvdXRlVG9VcGRhdGUubGF6eSkuZXZlcnkoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gdm9pZCAwKSkge1xuICAgICAgICByb3V0ZVRvVXBkYXRlLmxhenkgPSB2b2lkIDA7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuICBjYWNoZVtrZXldID0gcHJvcGVydHlQcm9taXNlO1xuICByZXR1cm4gcHJvcGVydHlQcm9taXNlO1xufTtcbnZhciBsYXp5Um91dGVGdW5jdGlvbkNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBsb2FkTGF6eVJvdXRlKHJvdXRlLCB0eXBlLCBtYW5pZmVzdCwgbWFwUm91dGVQcm9wZXJ0aWVzMiwgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCkge1xuICBsZXQgcm91dGVUb1VwZGF0ZSA9IG1hbmlmZXN0W3JvdXRlLmlkXTtcbiAgaW52YXJpYW50KHJvdXRlVG9VcGRhdGUsIFwiTm8gcm91dGUgZm91bmQgaW4gbWFuaWZlc3RcIik7XG4gIGlmICghcm91dGUubGF6eSkge1xuICAgIHJldHVybiB7XG4gICAgICBsYXp5Um91dGVQcm9taXNlOiB2b2lkIDAsXG4gICAgICBsYXp5SGFuZGxlclByb21pc2U6IHZvaWQgMFxuICAgIH07XG4gIH1cbiAgaWYgKHR5cGVvZiByb3V0ZS5sYXp5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBsZXQgY2FjaGVkUHJvbWlzZSA9IGxhenlSb3V0ZUZ1bmN0aW9uQ2FjaGUuZ2V0KHJvdXRlVG9VcGRhdGUpO1xuICAgIGlmIChjYWNoZWRQcm9taXNlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYXp5Um91dGVQcm9taXNlOiBjYWNoZWRQcm9taXNlLFxuICAgICAgICBsYXp5SGFuZGxlclByb21pc2U6IGNhY2hlZFByb21pc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCBsYXp5Um91dGVQcm9taXNlMiA9IChhc3luYyAoKSA9PiB7XG4gICAgICBpbnZhcmlhbnQoXG4gICAgICAgI
25114HR5cGVvZiByb3V0ZS5sYXp5ID09PSBcImZ1bmN0aW9uXCIsXG4gICAgICAgIFwiTm8gbGF6eSByb3V0ZSBmdW5jdGlvbiBmb3VuZFwiXG4gICAgICApO1xuICAgICAgbGV0IGxhenlSb3V0ZSA9IGF3YWl0IHJvdXRlLmxhenkoKTtcbiAgICAgIGxldCByb3V0ZVVwZGF0ZXMgPSB7fTtcbiAgICAgIGZvciAobGV0IGxhenlSb3V0ZVByb3BlcnR5IGluIGxhenlSb3V0ZSkge1xuICAgICAgICBsZXQgbGF6eVZhbHVlID0gbGF6eVJvdXRlW2xhenlSb3V0ZVByb3BlcnR5XTtcbiAgICAgICAgaWYgKGxhenlWYWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlzVW5zdXBwb3J0ZWQgPSBpc1Vuc3VwcG9ydGVkTGF6eVJvdXRlRnVuY3Rpb25LZXkobGF6eVJvdXRlUHJvcGVydHkpO1xuICAgICAgICBsZXQgc3RhdGljUm91dGVWYWx1ZSA9IHJvdXRlVG9VcGRhdGVbbGF6eVJvdXRlUHJvcGVydHldO1xuICAgICAgICBsZXQgaXNTdGF0aWNhbGx5RGVmaW5lZCA9IHN0YXRpY1JvdXRlVmFsdWUgIT09IHZvaWQgMCAmJiAvLyBUaGlzIHByb3BlcnR5IGlzbid0IHN0YXRpYyBzaW5jZSBpdCBzaG91bGQgYWx3YXlzIGJlIHVwZGF0ZWQgYmFzZWRcbiAgICAgICAgLy8gb24gdGhlIHJvdXRlIHVwZGF0ZXNcbiAgICAgICAgbGF6eVJvdXRlUHJvcGVydHkgIT09IFwiaGFzRXJyb3JCb3VuZGFyeVwiO1xuICAgICAgICBpZiAoaXNVbnN1cHBvcnRlZCkge1xuICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICAhaXNVbnN1cHBvcnRlZCxcbiAgICAgICAgICAgIFwiUm91dGUgcHJvcGVydHkgXCIgKyBsYXp5Um91dGVQcm9wZXJ0eSArIFwiIGlzIG5vdCBhIHN1cHBvcnRlZCBwcm9wZXJ0eSB0byBiZSByZXR1cm5lZCBmcm9tIGEgbGF6eSByb3V0ZSBmdW5jdGlvbi4gVGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuXCJcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGlzU3RhdGljYWxseURlZmluZWQpIHtcbiAgICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgICAgIWlzU3RhdGljYWxseURlZmluZWQsXG4gICAgICAgICAgICBgUm91dGUgXCIke3JvdXRlVG9VcGRhdGUuaWR9XCIgaGFzIGEgc3RhdGljIHByb3BlcnR5IFwiJHtsYXp5Um91dGVQcm9wZXJ0eX1cIiBkZWZpbmVkIGJ1dCBpdHMgbGF6eSBmdW5jdGlvbiBpcyBhbHNvIHJldHVybmluZyBhIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5LiBUaGUgbGF6eSByb3V0ZSBwcm9wZXJ0eSBcIiR7bGF6eVJvdXRlUHJvcGVydHl9XCIgd2lsbCBiZSBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvdXRlVXBkYXRlc1tsYXp5Um91dGVQcm9wZXJ0eV0gPSBsYXp5VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIE9iamVjdC5hc3NpZ24ocm91dGVUb1VwZGF0ZSwgcm91dGVVcGRhdGVzKTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocm91dGVUb1VwZGF0ZSwge1xuICAgICAgICAvLyBUbyBrZWVwIHRoaW5ncyBmcmFtZXdvcmsgYWdub3N0aWMsIHdlIHVzZSB0aGUgcHJvdmlkZWQgYG1hcFJvdXRlUHJvcGVydGllc2BcbiAgICAgICAgLy8gZnVuY3Rpb24gdG8gc2V0IHRoZSBmcmFtZXdvcmstYXdhcmUgcHJvcGVydGllcyAoYGVsZW1lbnRgL2BoYXNFcnJvckJvdW5kYXJ5YClcbiAgICAgICAgLy8gc2luY2UgdGhlIGxvZ2ljIHdpbGwgZGlmZmVyIGJldHdlZW4gZnJhbWV3b3Jrcy5cbiAgICAgICAgLi4ubWFwUm91dGVQcm9wZXJ0aWVzMihyb3V0ZVRvVXBkYXRlKSxcbiAgICAgICAgbGF6eTogdm9pZCAwXG4gICAgICB9KTtcbiAgICB9KSgpO1xuICAgIGxhenlSb3V0ZUZ1bmN0aW9uQ2FjaGUuc2V0KHJvdXRlVG9VcGRhdGUsIGxhenlSb3V0ZVByb21pc2UyKTtcbiAgICBsYXp5Um91dGVQcm9taXNlMi5jYXRjaCgoKSA9PiB7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhenlSb3V0ZVByb21pc2U6IGxhenlSb3V0ZVByb21pc2UyLFxuICAgICAgbGF6eUhhbmRsZXJQcm9taXNlOiBsYXp5Um91dGVQcm9taXNlMlxuICAgIH07XG4gIH1cbiAgbGV0IGxhenlLZXlzID0gT2JqZWN0LmtleXMocm91dGUubGF6eSk7XG4gIGxldCBsYXp5UHJvcGVydHlQcm9taXNlcyA9IFtdO1xuICBsZXQgbGF6eUhhbmRsZXJQcm9taXNlID0gdm9pZCAwO1xuICBmb3IgKGxldCBrZXkgb2YgbGF6eUtleXMpIHtcbiAgICBpZiAobGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCAmJiBsYXp5Um91dGVQcm9wZXJ0aWVzVG9Ta2lwLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBsZXQgcHJvbWlzZSA9IGxvYWRMYXp5Um91dGVQcm9wZXJ0eSh7XG4gICAgICBrZXksXG4gICAgICByb3V0ZSxcbiAgICAgIG1hbmlmZXN0LFxuICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzOiBtYXBSb3V0ZVByb3BlcnRpZXMyXG4gICAgfSk7XG4gICAgaWYgKHByb21pc2UpIHtcbiAgICAgIGxhenlQcm9wZXJ0eVByb21pc2VzLnB1c2gocHJvbWlzZSk7XG4gICAgICBpZiAoa2V5ID09PSB0eXBlKSB7XG4gICAgICAgIGxhenlIYW5kbGVyUHJvbWlzZSA9IHByb21pc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxldCBsYXp5Um91dGVQcm9taXNlID0gbGF6eVByb3BlcnR5UHJvbWlzZXMubGVuZ3RoID4gMCA/IFByb21pc2UuYWxsKGxhenlQcm9wZXJ0eVByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgfSkgOiB2b2lkIDA7XG4gIGxhenlSb3V0ZVByb21pc2U/LmNhdGNoKCgpID0+IHtcbiAgfSk7XG4gIGxhenlIYW5kbGVyUHJvbWlzZT8uY2F0Y2goKCkgPT4ge1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBsYXp5Um91dGVQcm9taXNlLFxuICAgIGxhenlIYW5kbGVyUHJvbWlzZVxuICB9O1xufVxuZnVuY3Rpb24gaXNOb25OdWxsYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGxvYWRMYXp5TWlkZGxld2FyZUZvck1hdGNoZXMobWF0Y2hlcywgbWFuaWZlc3QsIG1hcFJvdXRlUHJvcGVydGllczIpIHtcbiAgbGV0IHByb21pc2VzID0gbWF0Y2hlcy5tYXAoKHsgcm91dGUgfSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygcm91dGUubGF6eSAhPT0gXCJvYmplY3RcIiB8fCAhcm91dGUubGF6eS5taWRkbGV3YXJlKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gbG9hZExhenlSb3V0ZVByb3BlcnR5KHtcbiAgICAgIGtleTogXCJtaWRkbGV3YXJlXCIsXG4gICAgICByb3V0ZSxcbiAgICAgIG1hbmlmZXN0LFxuICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzOiBtYXBSb3V0ZVByb3BlcnRpZXMyXG4gICAgfSk7XG4gIH0pLmZpbHRlcihpc05vbk51bGxhYmxlKTtcbiAgcmV0dXJuIHByb21pc2VzLmxlbmd0aCA+IDAgPyBQcm9taXNlLmFsbChwcm9taXNlcykgOiB2b2lkIDA7XG59XG5hc3luYyBmdW5jdGlvbiBkZWZh
25114dWx0RGF0YVN0cmF0ZWd5KGFyZ3MpIHtcbiAgbGV0IG1hdGNoZXNUb0xvYWQgPSBhcmdzLm1hdGNoZXMuZmlsdGVyKChtKSA9PiBtLnNob3VsZExvYWQpO1xuICBsZXQga2V5ZWRSZXN1bHRzID0ge307XG4gIGxldCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwobWF0Y2hlc1RvTG9hZC5tYXAoKG0pID0+IG0ucmVzb2x2ZSgpKSk7XG4gIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpKSA9PiB7XG4gICAga2V5ZWRSZXN1bHRzW21hdGNoZXNUb0xvYWRbaV0ucm91dGUuaWRdID0gcmVzdWx0O1xuICB9KTtcbiAgcmV0dXJuIGtleWVkUmVzdWx0cztcbn1cbmFzeW5jIGZ1bmN0aW9uIGRlZmF1bHREYXRhU3RyYXRlZ3lXaXRoTWlkZGxld2FyZShhcmdzKSB7XG4gIGlmICghYXJncy5tYXRjaGVzLnNvbWUoKG0pID0+IG0ucm91dGUubWlkZGxld2FyZSkpIHtcbiAgICByZXR1cm4gZGVmYXVsdERhdGFTdHJhdGVneShhcmdzKTtcbiAgfVxuICByZXR1cm4gcnVuQ2xpZW50TWlkZGxld2FyZVBpcGVsaW5lKGFyZ3MsICgpID0+IGRlZmF1bHREYXRhU3RyYXRlZ3koYXJncykpO1xufVxuZnVuY3Rpb24gcnVuU2VydmVyTWlkZGxld2FyZVBpcGVsaW5lKGFyZ3MsIGhhbmRsZXIsIGVycm9ySGFuZGxlcikge1xuICByZXR1cm4gcnVuTWlkZGxld2FyZVBpcGVsaW5lKFxuICAgIGFyZ3MsXG4gICAgaGFuZGxlcixcbiAgICBwcm9jZXNzUmVzdWx0LFxuICAgIGlzUmVzcG9uc2UsXG4gICAgZXJyb3JIYW5kbGVyXG4gICk7XG4gIGZ1bmN0aW9uIHByb2Nlc3NSZXN1bHQocmVzdWx0KSB7XG4gICAgcmV0dXJuIGlzRGF0YVdpdGhSZXNwb25zZUluaXQocmVzdWx0KSA/IGRhdGFXaXRoUmVzcG9uc2VJbml0VG9SZXNwb25zZShyZXN1bHQpIDogcmVzdWx0O1xuICB9XG59XG5mdW5jdGlvbiBydW5DbGllbnRNaWRkbGV3YXJlUGlwZWxpbmUoYXJncywgaGFuZGxlcikge1xuICByZXR1cm4gcnVuTWlkZGxld2FyZVBpcGVsaW5lKFxuICAgIGFyZ3MsXG4gICAgaGFuZGxlcixcbiAgICAocikgPT4gcixcbiAgICAvLyBObyBwb3N0LXByb2Nlc3NpbmcgbmVlZGVkIG9uIHRoZSBjbGllbnRcbiAgICBpc0RhdGFTdHJhdGVneVJlc3VsdHMsXG4gICAgZXJyb3JIYW5kbGVyXG4gICk7XG4gIGZ1bmN0aW9uIGVycm9ySGFuZGxlcihlcnJvciwgcm91dGVJZCwgbmV4dFJlc3VsdCkge1xuICAgIGlmIChuZXh0UmVzdWx0KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBPYmplY3QuYXNzaWduKG5leHRSZXN1bHQudmFsdWUsIHtcbiAgICAgICAgICBbcm91dGVJZF06IHsgdHlwZTogXCJlcnJvclwiLCByZXN1bHQ6IGVycm9yIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IG1hdGNoZXMgfSA9IGFyZ3M7XG4gICAgICBsZXQgbWF4Qm91bmRhcnlJZHggPSBNYXRoLm1pbihcbiAgICAgICAgLy8gVGhyb3dpbmcgcm91dGVcbiAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgbWF0Y2hlcy5maW5kSW5kZXgoKG0pID0+IG0ucm91dGUuaWQgPT09IHJvdXRlSWQpLFxuICAgICAgICAgIDBcbiAgICAgICAgKSxcbiAgICAgICAgLy8gb3IgdGhlIHNoYWxsb3dlc3Qgcm91dGUgdGhhdCBuZWVkcyB0byBsb2FkIGRhdGFcbiAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgbWF0Y2hlcy5maW5kSW5kZXgoKG0pID0+IG0udW5zdGFibGVfc2hvdWxkQ2FsbEhhbmRsZXIoKSksXG4gICAgICAgICAgMFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgbGV0IGJvdW5kYXJ5Um91dGVJZCA9IGZpbmROZWFyZXN0Qm91bmRhcnkoXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIG1hdGNoZXNbbWF4Qm91bmRhcnlJZHhdLnJvdXRlLmlkXG4gICAgICApLnJvdXRlLmlkO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIFtib3VuZGFyeVJvdXRlSWRdOiB7IHR5cGU6IFwiZXJyb3JcIiwgcmVzdWx0OiBlcnJvciB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHJ1bk1pZGRsZXdhcmVQaXBlbGluZShhcmdzLCBoYW5kbGVyLCBwcm9jZXNzUmVzdWx0LCBpc1Jlc3VsdCwgZXJyb3JIYW5kbGVyKSB7XG4gIGxldCB7IG1hdGNoZXMsIHJlcXVlc3QsIHBhcmFtcywgY29udGV4dCB9ID0gYXJncztcbiAgbGV0IHR1cGxlcyA9IG1hdGNoZXMuZmxhdE1hcChcbiAgICAobSkgPT4gbS5yb3V0ZS5taWRkbGV3YXJlID8gbS5yb3V0ZS5taWRkbGV3YXJlLm1hcCgoZm4pID0+IFttLnJvdXRlLmlkLCBmbl0pIDogW11cbiAgKTtcbiAgbGV0IHJlc3VsdCA9IGF3YWl0IGNhbGxSb3V0ZU1pZGRsZXdhcmUoXG4gICAgeyByZXF1ZXN0LCBwYXJhbXMsIGNvbnRleHQgfSxcbiAgICB0dXBsZXMsXG4gICAgaGFuZGxlcixcbiAgICBwcm9jZXNzUmVzdWx0LFxuICAgIGlzUmVzdWx0LFxuICAgIGVycm9ySGFuZGxlclxuICApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuYXN5bmMgZnVuY3Rpb24gY2FsbFJvdXRlTWlkZGxld2FyZShhcmdzLCBtaWRkbGV3YXJlcywgaGFuZGxlciwgcHJvY2Vzc1Jlc3VsdCwgaXNSZXN1bHQsIGVycm9ySGFuZGxlciwgaWR4ID0gMCkge1xuICBsZXQgeyByZXF1ZXN0IH0gPSBhcmdzO1xuICBpZiAocmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IHJlcXVlc3Quc2lnbmFsLnJlYXNvbiA/PyBuZXcgRXJyb3IoYFJlcXVlc3QgYWJvcnRlZDogJHtyZXF1ZXN0Lm1ldGhvZH0gJHtyZXF1ZXN0LnVybH1gKTtcbiAgfVxuICBsZXQgdHVwbGUgPSBtaWRkbGV3YXJlc1tpZHhdO1xuICBpZiAoIXR1cGxlKSB7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGxldCBbcm91dGVJZCwgbWlkZGxld2FyZV0gPSB0dXBsZTtcbiAgbGV0IG5leHRSZXN1bHQ7XG4gIGxldCBuZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChuZXh0UmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbWF5IG9ubHkgY2FsbCBgbmV4dCgpYCBvbmNlIHBlciBtaWRkbGV3YXJlXCIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGNhbGxSb3V0ZU1pZGRsZXdhcmUoXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBwcm9jZXNzUmVzdWx0LFxuICAgICAgICBpc1Jlc3VsdCxcbiAgICAgICAgZXJyb3JIYW5kbGVyLFxuICAgICAgICBpZHggKyAxXG4gICAgICApO1xuICAgICAgbmV4dFJlc3VsdCA9IHsgdmFsdWU6IHJlc3VsdCB9O1xuICAgICAgcmV0dXJuIG5leHRSZXN1bHQudmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG5leHRSZXN1bHQgPSB7IHZhbHVlOiBhd2FpdCBlcnJvckhhbmRsZXIoZXJyb3IsIHJvdXRlSWQsIG5leHRSZXN1bHQpIH07XG4gICAgICByZXR1cm4gbmV4dFJlc3VsdC52YWx1ZTtcbiAgICB9XG4gI
25114H07XG4gIHRyeSB7XG4gICAgbGV0IHZhbHVlID0gYXdhaXQgbWlkZGxld2FyZShhcmdzLCBuZXh0KTtcbiAgICBsZXQgcmVzdWx0ID0gdmFsdWUgIT0gbnVsbCA/IHByb2Nlc3NSZXN1bHQodmFsdWUpIDogdm9pZCAwO1xuICAgIGlmIChpc1Jlc3VsdChyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSBpZiAobmV4dFJlc3VsdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCA/PyBuZXh0UmVzdWx0LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0UmVzdWx0ID0geyB2YWx1ZTogYXdhaXQgbmV4dCgpIH07XG4gICAgICByZXR1cm4gbmV4dFJlc3VsdC52YWx1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZXJyb3JIYW5kbGVyKGVycm9yLCByb3V0ZUlkLCBuZXh0UmVzdWx0KTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldERhdGFTdHJhdGVneU1hdGNoTGF6eVByb21pc2VzKG1hcFJvdXRlUHJvcGVydGllczIsIG1hbmlmZXN0LCByZXF1ZXN0LCBtYXRjaCwgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCkge1xuICBsZXQgbGF6eU1pZGRsZXdhcmVQcm9taXNlID0gbG9hZExhenlSb3V0ZVByb3BlcnR5KHtcbiAgICBrZXk6IFwibWlkZGxld2FyZVwiLFxuICAgIHJvdXRlOiBtYXRjaC5yb3V0ZSxcbiAgICBtYW5pZmVzdCxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXM6IG1hcFJvdXRlUHJvcGVydGllczJcbiAgfSk7XG4gIGxldCBsYXp5Um91dGVQcm9taXNlcyA9IGxvYWRMYXp5Um91dGUoXG4gICAgbWF0Y2gucm91dGUsXG4gICAgaXNNdXRhdGlvbk1ldGhvZChyZXF1ZXN0Lm1ldGhvZCkgPyBcImFjdGlvblwiIDogXCJsb2FkZXJcIixcbiAgICBtYW5pZmVzdCxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgIGxhenlSb3V0ZVByb3BlcnRpZXNUb1NraXBcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBtaWRkbGV3YXJlOiBsYXp5TWlkZGxld2FyZVByb21pc2UsXG4gICAgcm91dGU6IGxhenlSb3V0ZVByb21pc2VzLmxhenlSb3V0ZVByb21pc2UsXG4gICAgaGFuZGxlcjogbGF6eVJvdXRlUHJvbWlzZXMubGF6eUhhbmRsZXJQcm9taXNlXG4gIH07XG59XG5mdW5jdGlvbiBnZXREYXRhU3RyYXRlZ3lNYXRjaChtYXBSb3V0ZVByb3BlcnRpZXMyLCBtYW5pZmVzdCwgcmVxdWVzdCwgbWF0Y2gsIGxhenlSb3V0ZVByb3BlcnRpZXNUb1NraXAsIHNjb3BlZENvbnRleHQsIHNob3VsZExvYWQsIHVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzID0gbnVsbCkge1xuICBsZXQgaXNVc2luZ05ld0FwaSA9IGZhbHNlO1xuICBsZXQgX2xhenlQcm9taXNlcyA9IGdldERhdGFTdHJhdGVneU1hdGNoTGF6eVByb21pc2VzKFxuICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgbWFuaWZlc3QsXG4gICAgcmVxdWVzdCxcbiAgICBtYXRjaCxcbiAgICBsYXp5Um91dGVQcm9wZXJ0aWVzVG9Ta2lwXG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4ubWF0Y2gsXG4gICAgX2xhenlQcm9taXNlcyxcbiAgICBzaG91bGRMb2FkLFxuICAgIHVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzLFxuICAgIHVuc3RhYmxlX3Nob3VsZENhbGxIYW5kbGVyKGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlKSB7XG4gICAgICBpc1VzaW5nTmV3QXBpID0gdHJ1ZTtcbiAgICAgIGlmICghdW5zdGFibGVfc2hvdWxkUmV2YWxpZGF0ZUFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHNob3VsZExvYWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICByZXR1cm4gc2hvdWxkUmV2YWxpZGF0ZUxvYWRlcihtYXRjaCwge1xuICAgICAgICAgIC4uLnVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzLFxuICAgICAgICAgIGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNob3VsZFJldmFsaWRhdGVMb2FkZXIobWF0Y2gsIHVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzKTtcbiAgICB9LFxuICAgIHJlc29sdmUoaGFuZGxlck92ZXJyaWRlKSB7XG4gICAgICBsZXQgeyBsYXp5LCBsb2FkZXIsIG1pZGRsZXdhcmUgfSA9IG1hdGNoLnJvdXRlO1xuICAgICAgbGV0IGNhbGxIYW5kbGVyID0gaXNVc2luZ05ld0FwaSB8fCBzaG91bGRMb2FkIHx8IGhhbmRsZXJPdmVycmlkZSAmJiAhaXNNdXRhdGlvbk1ldGhvZChyZXF1ZXN0Lm1ldGhvZCkgJiYgKGxhenkgfHwgbG9hZGVyKTtcbiAgICAgIGxldCBpc01pZGRsZXdhcmVPbmx5Um91dGUgPSBtaWRkbGV3YXJlICYmIG1pZGRsZXdhcmUubGVuZ3RoID4gMCAmJiAhbG9hZGVyICYmICFsYXp5O1xuICAgICAgaWYgKGNhbGxIYW5kbGVyICYmICFpc01pZGRsZXdhcmVPbmx5Um91dGUpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxMb2FkZXJPckFjdGlvbih7XG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICBsYXp5SGFuZGxlclByb21pc2U6IF9sYXp5UHJvbWlzZXM/LmhhbmRsZXIsXG4gICAgICAgICAgbGF6eVJvdXRlUHJvbWlzZTogX2xhenlQcm9taXNlcz8ucm91dGUsXG4gICAgICAgICAgaGFuZGxlck92ZXJyaWRlLFxuICAgICAgICAgIHNjb3BlZENvbnRleHRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgdHlwZTogXCJkYXRhXCIgLyogZGF0YSAqLywgcmVzdWx0OiB2b2lkIDAgfSk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0VGFyZ2V0ZWREYXRhU3RyYXRlZ3lNYXRjaGVzKG1hcFJvdXRlUHJvcGVydGllczIsIG1hbmlmZXN0LCByZXF1ZXN0LCBtYXRjaGVzLCB0YXJnZXRNYXRjaCwgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCwgc2NvcGVkQ29udGV4dCwgc2hvdWxkUmV2YWxpZGF0ZUFyZ3MgPSBudWxsKSB7XG4gIHJldHVybiBtYXRjaGVzLm1hcCgobWF0Y2gpID0+IHtcbiAgICBpZiAobWF0Y2gucm91dGUuaWQgIT09IHRhcmdldE1hdGNoLnJvdXRlLmlkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5tYXRjaCxcbiAgICAgICAgc2hvdWxkTG9hZDogZmFsc2UsXG4gICAgICAgI
25114HVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzOiBzaG91bGRSZXZhbGlkYXRlQXJncyxcbiAgICAgICAgdW5zdGFibGVfc2hvdWxkQ2FsbEhhbmRsZXI6ICgpID0+IGZhbHNlLFxuICAgICAgICBfbGF6eVByb21pc2VzOiBnZXREYXRhU3RyYXRlZ3lNYXRjaExhenlQcm9taXNlcyhcbiAgICAgICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgICAgIG1hbmlmZXN0LFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgbWF0Y2gsXG4gICAgICAgICAgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcFxuICAgICAgICApLFxuICAgICAgICByZXNvbHZlOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoeyB0eXBlOiBcImRhdGFcIiwgcmVzdWx0OiB2b2lkIDAgfSlcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBnZXREYXRhU3RyYXRlZ3lNYXRjaChcbiAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBtYXRjaCxcbiAgICAgIGxhenlSb3V0ZVByb3BlcnRpZXNUb1NraXAsXG4gICAgICBzY29wZWRDb250ZXh0LFxuICAgICAgdHJ1ZSxcbiAgICAgIHNob3VsZFJldmFsaWRhdGVBcmdzXG4gICAgKTtcbiAgfSk7XG59XG5hc3luYyBmdW5jdGlvbiBjYWxsRGF0YVN0cmF0ZWd5SW1wbChkYXRhU3RyYXRlZ3lJbXBsLCByZXF1ZXN0LCBtYXRjaGVzLCBmZXRjaGVyS2V5LCBzY29wZWRDb250ZXh0LCBpc1N0YXRpY0hhbmRsZXIpIHtcbiAgaWYgKG1hdGNoZXMuc29tZSgobSkgPT4gbS5fbGF6eVByb21pc2VzPy5taWRkbGV3YXJlKSkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKG1hdGNoZXMubWFwKChtKSA9PiBtLl9sYXp5UHJvbWlzZXM/Lm1pZGRsZXdhcmUpKTtcbiAgfVxuICBsZXQgZGF0YVN0cmF0ZWd5QXJncyA9IHtcbiAgICByZXF1ZXN0LFxuICAgIHBhcmFtczogbWF0Y2hlc1swXS5wYXJhbXMsXG4gICAgY29udGV4dDogc2NvcGVkQ29udGV4dCxcbiAgICBtYXRjaGVzXG4gIH07XG4gIGxldCBydW5DbGllbnRNaWRkbGV3YXJlID0gaXNTdGF0aWNIYW5kbGVyID8gKCkgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiWW91IGNhbm5vdCBjYWxsIGBydW5DbGllbnRNaWRkbGV3YXJlKClgIGZyb20gYSBzdGF0aWMgaGFuZGxlciBgZGF0YVN0cmF0ZWd5YC4gTWlkZGxld2FyZSBpcyBydW4gb3V0c2lkZSBvZiBgZGF0YVN0cmF0ZWd5YCBkdXJpbmcgU1NSIGluIG9yZGVyIHRvIGJ1YmJsZSB1cCB0aGUgUmVzcG9uc2UuICBZb3UgY2FuIGVuYWJsZSBtaWRkbGV3YXJlIHZpYSB0aGUgYHJlc3BvbmRgIEFQSSBpbiBgcXVlcnlgL2BxdWVyeVJvdXRlYFwiXG4gICAgKTtcbiAgfSA6IChjYikgPT4ge1xuICAgIGxldCB0eXBlZERhdGFTdHJhdGVneUFyZ3MgPSBkYXRhU3RyYXRlZ3lBcmdzO1xuICAgIHJldHVybiBydW5DbGllbnRNaWRkbGV3YXJlUGlwZWxpbmUodHlwZWREYXRhU3RyYXRlZ3lBcmdzLCAoKSA9PiB7XG4gICAgICByZXR1cm4gY2Ioe1xuICAgICAgICAuLi50eXBlZERhdGFTdHJhdGVneUFyZ3MsXG4gICAgICAgIGZldGNoZXJLZXksXG4gICAgICAgIHJ1bkNsaWVudE1pZGRsZXdhcmU6ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNhbm5vdCBjYWxsIGBydW5DbGllbnRNaWRkbGV3YXJlKClgIGZyb20gd2l0aGluIGFuIGBydW5DbGllbnRNaWRkbGV3YXJlYCBoYW5kbGVyXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgbGV0IHJlc3VsdHMgPSBhd2FpdCBkYXRhU3RyYXRlZ3lJbXBsKHtcbiAgICAuLi5kYXRhU3RyYXRlZ3lBcmdzLFxuICAgIGZldGNoZXJLZXksXG4gICAgcnVuQ2xpZW50TWlkZGxld2FyZVxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hdGNoZXMuZmxhdE1hcCgobSkgPT4gW1xuICAgICAgICBtLl9sYXp5UHJvbWlzZXM/LmhhbmRsZXIsXG4gICAgICAgIG0uX2xhenlQcm9taXNlcz8ucm91dGVcbiAgICAgIF0pXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuYXN5bmMgZnVuY3Rpb24gY2FsbExvYWRlck9yQWN0aW9uKHtcbiAgcmVxdWVzdCxcbiAgbWF0Y2gsXG4gIGxhenlIYW5kbGVyUHJvbWlzZSxcbiAgbGF6eVJvdXRlUHJvbWlzZSxcbiAgaGFuZGxlck92ZXJyaWRlLFxuICBzY29wZWRDb250ZXh0XG59KSB7XG4gIGxldCByZXN1bHQ7XG4gIGxldCBvblJlamVjdDtcbiAgbGV0IGlzQWN0aW9uID0gaXNNdXRhdGlvbk1ldGhvZChyZXF1ZXN0Lm1ldGhvZCk7XG4gIGxldCB0eXBlID0gaXNBY3Rpb24gPyBcImFjdGlvblwiIDogXCJsb2FkZXJcIjtcbiAgbGV0IHJ1bkhhbmRsZXIgPSAoaGFuZGxlcikgPT4ge1xuICAgIGxldCByZWplY3Q7XG4gICAgbGV0IGFib3J0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChfLCByKSA9PiByZWplY3QgPSByKTtcbiAgICBvblJlamVjdCA9ICgpID0+IHJlamVjdCgpO1xuICAgIHJlcXVlc3Quc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvblJlamVjdCk7XG4gICAgbGV0IGFjdHVhbEhhbmRsZXIgPSAoY3R4KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFlvdSBjYW5ub3QgY2FsbCB0aGUgaGFuZGxlciBmb3IgYSByb3V0ZSB3aGljaCBkZWZpbmVzIGEgYm9vbGVhbiBcIiR7dHlwZX1cIiBbcm91dGVJZDogJHttYXRjaC5yb3V0ZS5pZH1dYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYW5kbGVyKFxuICAgICAgICB7XG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBwYXJhbXM6IG1hdGNoLnBhcmFtcyxcbiAgICAgICAgICBjb250ZXh0OiBzY29wZWRDb250ZXh0XG4gICAgICAgIH0sXG4gICAgICAgIC4uLmN0eCAhPT0gdm9pZCAwID8gW2N0eF0gOiBbXVxuICAgICAgKTtcbiAgICB9O1xuICAgIGxldCBoYW5kbGVyUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgdmFsID0gYXdhaXQgKGhhbmRsZXJPdmVycmlkZSA/IGhhbmRsZXJPdmVycmlkZSgoY3R4KSA9PiBhY3R1YWxIYW5kbGVyKGN0eCkpIDogYW
25114N0dWFsSGFuZGxlcigpKTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJkYXRhXCIsIHJlc3VsdDogdmFsIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwiZXJyb3JcIiwgcmVzdWx0OiBlIH07XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtoYW5kbGVyUHJvbWlzZSwgYWJvcnRQcm9taXNlXSk7XG4gIH07XG4gIHRyeSB7XG4gICAgbGV0IGhhbmRsZXIgPSBpc0FjdGlvbiA/IG1hdGNoLnJvdXRlLmFjdGlvbiA6IG1hdGNoLnJvdXRlLmxvYWRlcjtcbiAgICBpZiAobGF6eUhhbmRsZXJQcm9taXNlIHx8IGxhenlSb3V0ZVByb21pc2UpIHtcbiAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgIGxldCBoYW5kbGVyRXJyb3I7XG4gICAgICAgIGxldCBbdmFsdWVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIC8vIElmIHRoZSBoYW5kbGVyIHRocm93cywgZG9uJ3QgbGV0IGl0IGltbWVkaWF0ZWx5IGJ1YmJsZSBvdXQsXG4gICAgICAgICAgLy8gc2luY2Ugd2UgbmVlZCB0byBsZXQgdGhlIGxhenkoKSBleGVjdXRpb24gZmluaXNoIHNvIHdlIGtub3cgaWYgdGhpc1xuICAgICAgICAgIC8vIHJvdXRlIGhhcyBhIGJvdW5kYXJ5IHRoYXQgY2FuIGhhbmRsZSB0aGUgZXJyb3JcbiAgICAgICAgICBydW5IYW5kbGVyKGhhbmRsZXIpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICBoYW5kbGVyRXJyb3IgPSBlO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIEVuc3VyZSBhbGwgbGF6eSByb3V0ZSBwcm9taXNlcyBhcmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmdcbiAgICAgICAgICBsYXp5SGFuZGxlclByb21pc2UsXG4gICAgICAgICAgbGF6eVJvdXRlUHJvbWlzZVxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKGhhbmRsZXJFcnJvciAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgdGhyb3cgaGFuZGxlckVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgbGF6eUhhbmRsZXJQcm9taXNlO1xuICAgICAgICBsZXQgaGFuZGxlcjIgPSBpc0FjdGlvbiA/IG1hdGNoLnJvdXRlLmFjdGlvbiA6IG1hdGNoLnJvdXRlLmxvYWRlcjtcbiAgICAgICAgaWYgKGhhbmRsZXIyKSB7XG4gICAgICAgICAgW3Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbcnVuSGFuZGxlcihoYW5kbGVyMiksIGxhenlSb3V0ZVByb21pc2VdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcImFjdGlvblwiKSB7XG4gICAgICAgICAgbGV0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICAgICAgICAgIGxldCBwYXRobmFtZSA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2g7XG4gICAgICAgICAgdGhyb3cgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHtcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgICBwYXRobmFtZSxcbiAgICAgICAgICAgIHJvdXRlSWQ6IG1hdGNoLnJvdXRlLmlkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJkYXRhXCIgLyogZGF0YSAqLywgcmVzdWx0OiB2b2lkIDAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIGxldCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAgICAgIGxldCBwYXRobmFtZSA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2g7XG4gICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwge1xuICAgICAgICBwYXRobmFtZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHJ1bkhhbmRsZXIoaGFuZGxlcik7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJlcnJvclwiIC8qIGVycm9yICovLCByZXN1bHQ6IGUgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAob25SZWplY3QpIHtcbiAgICAgIHJlcXVlc3Quc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvblJlamVjdCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5hc3luYyBmdW5jdGlvbiBwYXJzZVJlc3BvbnNlQm9keShyZXNwb25zZSkge1xuICBsZXQgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKTtcbiAgaWYgKGNvbnRlbnRUeXBlICYmIC9cXGJhcHBsaWNhdGlvblxcL2pzb25cXGIvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmJvZHkgPT0gbnVsbCA/IG51bGwgOiByZXNwb25zZS5qc29uKCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnREYXRhU3RyYXRlZ3lSZXN1bHRUb0RhdGFSZXN1bHQoZGF0YVN0cmF0ZWd5UmVzdWx0KSB7XG4gIGxldCB7IHJlc3VsdCwgdHlwZSB9ID0gZGF0YVN0cmF0ZWd5UmVzdWx0O1xuICBpZiAoaXNSZXNwb25zZShyZXN1bHQpKSB7XG4gICAgbGV0IGRhdGEyO1xuICAgIHRyeSB7XG4gICAgICBkYXRhMiA9IGF3YWl0IHBhcnNlUmVzcG9uc2VCb2R5KHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJlcnJvclwiIC8qIGVycm9yICovLCBlcnJvcjogZSB9O1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJlcnJvclwiIC8qIGVycm9yICovKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImVycm9yXCIgLyogZXJyb3IgKi8sXG4gICAgICAgIGVycm9yOiBuZXcgRXJyb3JSZXNwb25zZUltcGwocmVzdWx0LnN0YXR1cywgcmVzdWx0LnN0YXR1c1RleHQsIGRhdGEyKSxcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgaGVhZGVyczogcmVzdWx0LmhlYWRlcnNcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImRhdGFcIiAvKiBkYXRhICovLFxuICAgICAgZGF0YTogZGF0YTIsXG4gICAgICBzdGF0dXNDb2RlOiByZXN1bHQuc3RhdHVzLFxuICAgICAgaGVhZGVyczogcmVzdWx0LmhlYWRlcnNcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlID09PSBcImVycm9yXCIgLyogZXJyb3IgKi8pIHtcbiAgICBpZiAoaXNEYXRhV2l0aFJlc3BvbnNlSW5pdChyZXN1bHQpKSB7XG4gICAgICBpZiAocmVzdWx0LmRhdGEgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgI
25114HR5cGU6IFwiZXJyb3JcIiAvKiBlcnJvciAqLyxcbiAgICAgICAgICBlcnJvcjogcmVzdWx0LmRhdGEsXG4gICAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LmluaXQ/LnN0YXR1cyxcbiAgICAgICAgICBoZWFkZXJzOiByZXN1bHQuaW5pdD8uaGVhZGVycyA/IG5ldyBIZWFkZXJzKHJlc3VsdC5pbml0LmhlYWRlcnMpIDogdm9pZCAwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImVycm9yXCIgLyogZXJyb3IgKi8sXG4gICAgICAgIGVycm9yOiBuZXcgRXJyb3JSZXNwb25zZUltcGwoXG4gICAgICAgICAgcmVzdWx0LmluaXQ/LnN0YXR1cyB8fCA1MDAsXG4gICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgIHJlc3VsdC5kYXRhXG4gICAgICAgICksXG4gICAgICAgIHN0YXR1c0NvZGU6IGlzUm91dGVFcnJvclJlc3BvbnNlKHJlc3VsdCkgPyByZXN1bHQuc3RhdHVzIDogdm9pZCAwLFxuICAgICAgICBoZWFkZXJzOiByZXN1bHQuaW5pdD8uaGVhZGVycyA/IG5ldyBIZWFkZXJzKHJlc3VsdC5pbml0LmhlYWRlcnMpIDogdm9pZCAwXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJlcnJvclwiIC8qIGVycm9yICovLFxuICAgICAgZXJyb3I6IHJlc3VsdCxcbiAgICAgIHN0YXR1c0NvZGU6IGlzUm91dGVFcnJvclJlc3BvbnNlKHJlc3VsdCkgPyByZXN1bHQuc3RhdHVzIDogdm9pZCAwXG4gICAgfTtcbiAgfVxuICBpZiAoaXNEYXRhV2l0aFJlc3BvbnNlSW5pdChyZXN1bHQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiZGF0YVwiIC8qIGRhdGEgKi8sXG4gICAgICBkYXRhOiByZXN1bHQuZGF0YSxcbiAgICAgIHN0YXR1c0NvZGU6IHJlc3VsdC5pbml0Py5zdGF0dXMsXG4gICAgICBoZWFkZXJzOiByZXN1bHQuaW5pdD8uaGVhZGVycyA/IG5ldyBIZWFkZXJzKHJlc3VsdC5pbml0LmhlYWRlcnMpIDogdm9pZCAwXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyB0eXBlOiBcImRhdGFcIiAvKiBkYXRhICovLCBkYXRhOiByZXN1bHQgfTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlbGF0aXZlUm91dGluZ1JlZGlyZWN0UmVzcG9uc2UocmVzcG9uc2UsIHJlcXVlc3QsIHJvdXRlSWQsIG1hdGNoZXMsIGJhc2VuYW1lKSB7XG4gIGxldCBsb2NhdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiTG9jYXRpb25cIik7XG4gIGludmFyaWFudChcbiAgICBsb2NhdGlvbixcbiAgICBcIlJlZGlyZWN0cyByZXR1cm5lZC90aHJvd24gZnJvbSBsb2FkZXJzL2FjdGlvbnMgbXVzdCBoYXZlIGEgTG9jYXRpb24gaGVhZGVyXCJcbiAgKTtcbiAgaWYgKCFpc0Fic29sdXRlVXJsKGxvY2F0aW9uKSkge1xuICAgIGxldCB0cmltbWVkTWF0Y2hlcyA9IG1hdGNoZXMuc2xpY2UoXG4gICAgICAwLFxuICAgICAgbWF0Y2hlcy5maW5kSW5kZXgoKG0pID0+IG0ucm91dGUuaWQgPT09IHJvdXRlSWQpICsgMVxuICAgICk7XG4gICAgbG9jYXRpb24gPSBub3JtYWxpemVUbyhcbiAgICAgIG5ldyBVUkwocmVxdWVzdC51cmwpLFxuICAgICAgdHJpbW1lZE1hdGNoZXMsXG4gICAgICBiYXNlbmFtZSxcbiAgICAgIGxvY2F0aW9uXG4gICAgKTtcbiAgICByZXNwb25zZS5oZWFkZXJzLnNldChcIkxvY2F0aW9uXCIsIGxvY2F0aW9uKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5mdW5jdGlvbiBub3JtYWxpemVSZWRpcmVjdExvY2F0aW9uKGxvY2F0aW9uLCBjdXJyZW50VXJsLCBiYXNlbmFtZSkge1xuICBpZiAoaXNBYnNvbHV0ZVVybChsb2NhdGlvbikpIHtcbiAgICBsZXQgbm9ybWFsaXplZExvY2F0aW9uID0gbG9jYXRpb247XG4gICAgbGV0IHVybCA9IG5vcm1hbGl6ZWRMb2NhdGlvbi5zdGFydHNXaXRoKFwiLy9cIikgPyBuZXcgVVJMKGN1cnJlbnRVcmwucHJvdG9jb2wgKyBub3JtYWxpemVkTG9jYXRpb24pIDogbmV3IFVSTChub3JtYWxpemVkTG9jYXRpb24pO1xuICAgIGxldCBpc1NhbWVCYXNlbmFtZSA9IHN0cmlwQmFzZW5hbWUodXJsLnBhdGhuYW1lLCBiYXNlbmFtZSkgIT0gbnVsbDtcbiAgICBpZiAodXJsLm9yaWdpbiA9PT0gY3VycmVudFVybC5vcmlnaW4gJiYgaXNTYW1lQmFzZW5hbWUpIHtcbiAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoICsgdXJsLmhhc2g7XG4gICAgfVxuICB9XG4gIHJldHVybiBsb2NhdGlvbjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNsaWVudFNpZGVSZXF1ZXN0KGhpc3RvcnksIGxvY2F0aW9uLCBzaWduYWwsIHN1Ym1pc3Npb24pIHtcbiAgbGV0IHVybCA9IGhpc3RvcnkuY3JlYXRlVVJMKHN0cmlwSGFzaEZyb21QYXRoKGxvY2F0aW9uKSkudG9TdHJpbmcoKTtcbiAgbGV0IGluaXQgPSB7IHNpZ25hbCB9O1xuICBpZiAoc3VibWlzc2lvbiAmJiBpc011dGF0aW9uTWV0aG9kKHN1Ym1pc3Npb24uZm9ybU1ldGhvZCkpIHtcbiAgICBsZXQgeyBmb3JtTWV0aG9kLCBmb3JtRW5jVHlwZSB9ID0gc3VibWlzc2lvbjtcbiAgICBpbml0Lm1ldGhvZCA9IGZvcm1NZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoZm9ybUVuY1R5cGUgPT09IFwiYXBwbGljYXRpb24vanNvblwiKSB7XG4gICAgICBpbml0LmhlYWRlcnMgPSBuZXcgSGVhZGVycyh7IFwiQ29udGVudC1UeXBlXCI6IGZvcm1FbmNUeXBlIH0pO1xuICAgICAgaW5pdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoc3VibWlzc2lvbi5qc29uKTtcbiAgICB9IGVsc2UgaWYgKGZvcm1FbmNUeXBlID09PSBcInRleHQvcGxhaW5cIikge1xuICAgICAgaW5pdC5ib2R5ID0gc3VibWlzc2lvbi50ZXh0O1xuICAgIH0gZWxzZSBpZiAoZm9ybUVuY1R5cGUgPT09IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgJiYgc3VibWlzc2lvbi5mb3JtRGF0YSkge1xuICAgICAgaW5pdC5ib2R5ID0gY29udmVydEZvcm1EYXRhVG9TZWFyY2hQYXJhbXMoc3VibWlzc2lvbi5mb3JtRGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluaXQuYm9keSA9IHN1Ym1pc3Npb24uZm9ybURhdGE7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgUmVxdWVzdCh1cmwsIGluaXQpO1xufVxuZnVuY3Rpb24gY29udmVydEZvcm1EYXRhVG9TZWFyY2hQYXJhbXMoZm9ybURhdGEpIHtcbiAgbGV0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIGZvcm1EYXRhLmVudHJpZXMoKSkge1xuICAgIHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLm5hbWUpO1xuICB9XG4gI
25114HJldHVybiBzZWFyY2hQYXJhbXM7XG59XG5mdW5jdGlvbiBjb252ZXJ0U2VhcmNoUGFyYW1zVG9Gb3JtRGF0YShzZWFyY2hQYXJhbXMpIHtcbiAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBzZWFyY2hQYXJhbXMuZW50cmllcygpKSB7XG4gICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmb3JtRGF0YTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NSb3V0ZUxvYWRlckRhdGEobWF0Y2hlcywgcmVzdWx0cywgcGVuZGluZ0FjdGlvblJlc3VsdCwgaXNTdGF0aWNIYW5kbGVyID0gZmFsc2UsIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nID0gZmFsc2UpIHtcbiAgbGV0IGxvYWRlckRhdGEgPSB7fTtcbiAgbGV0IGVycm9ycyA9IG51bGw7XG4gIGxldCBzdGF0dXNDb2RlO1xuICBsZXQgZm91bmRFcnJvciA9IGZhbHNlO1xuICBsZXQgbG9hZGVySGVhZGVycyA9IHt9O1xuICBsZXQgcGVuZGluZ0Vycm9yID0gcGVuZGluZ0FjdGlvblJlc3VsdCAmJiBpc0Vycm9yUmVzdWx0KHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0pID8gcGVuZGluZ0FjdGlvblJlc3VsdFsxXS5lcnJvciA6IHZvaWQgMDtcbiAgbWF0Y2hlcy5mb3JFYWNoKChtYXRjaCkgPT4ge1xuICAgIGlmICghKG1hdGNoLnJvdXRlLmlkIGluIHJlc3VsdHMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBpZCA9IG1hdGNoLnJvdXRlLmlkO1xuICAgIGxldCByZXN1bHQgPSByZXN1bHRzW2lkXTtcbiAgICBpbnZhcmlhbnQoXG4gICAgICAhaXNSZWRpcmVjdFJlc3VsdChyZXN1bHQpLFxuICAgICAgXCJDYW5ub3QgaGFuZGxlIHJlZGlyZWN0IHJlc3VsdHMgaW4gcHJvY2Vzc0xvYWRlckRhdGFcIlxuICAgICk7XG4gICAgaWYgKGlzRXJyb3JSZXN1bHQocmVzdWx0KSkge1xuICAgICAgbGV0IGVycm9yID0gcmVzdWx0LmVycm9yO1xuICAgICAgaWYgKHBlbmRpbmdFcnJvciAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGVycm9yID0gcGVuZGluZ0Vycm9yO1xuICAgICAgICBwZW5kaW5nRXJyb3IgPSB2b2lkIDA7XG4gICAgICB9XG4gICAgICBlcnJvcnMgPSBlcnJvcnMgfHwge307XG4gICAgICBpZiAoc2tpcExvYWRlckVycm9yQnViYmxpbmcpIHtcbiAgICAgICAgZXJyb3JzW2lkXSA9IGVycm9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGJvdW5kYXJ5TWF0Y2ggPSBmaW5kTmVhcmVzdEJvdW5kYXJ5KG1hdGNoZXMsIGlkKTtcbiAgICAgICAgaWYgKGVycm9yc1tib3VuZGFyeU1hdGNoLnJvdXRlLmlkXSA9PSBudWxsKSB7XG4gICAgICAgICAgZXJyb3JzW2JvdW5kYXJ5TWF0Y2gucm91dGUuaWRdID0gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaXNTdGF0aWNIYW5kbGVyKSB7XG4gICAgICAgIGxvYWRlckRhdGFbaWRdID0gUmVzZXRMb2FkZXJEYXRhU3ltYm9sO1xuICAgICAgfVxuICAgICAgaWYgKCFmb3VuZEVycm9yKSB7XG4gICAgICAgIGZvdW5kRXJyb3IgPSB0cnVlO1xuICAgICAgICBzdGF0dXNDb2RlID0gaXNSb3V0ZUVycm9yUmVzcG9uc2UocmVzdWx0LmVycm9yKSA/IHJlc3VsdC5lcnJvci5zdGF0dXMgOiA1MDA7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgbG9hZGVySGVhZGVyc1tpZF0gPSByZXN1bHQuaGVhZGVycztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZGVyRGF0YVtpZF0gPSByZXN1bHQuZGF0YTtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzQ29kZSAmJiByZXN1bHQuc3RhdHVzQ29kZSAhPT0gMjAwICYmICFmb3VuZEVycm9yKSB7XG4gICAgICAgIHN0YXR1c0NvZGUgPSByZXN1bHQuc3RhdHVzQ29kZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQuaGVhZGVycykge1xuICAgICAgICBsb2FkZXJIZWFkZXJzW2lkXSA9IHJlc3VsdC5oZWFkZXJzO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGlmIChwZW5kaW5nRXJyb3IgIT09IHZvaWQgMCAmJiBwZW5kaW5nQWN0aW9uUmVzdWx0KSB7XG4gICAgZXJyb3JzID0geyBbcGVuZGluZ0FjdGlvblJlc3VsdFswXV06IHBlbmRpbmdFcnJvciB9O1xuICAgIGlmIChwZW5kaW5nQWN0aW9uUmVzdWx0WzJdKSB7XG4gICAgICBsb2FkZXJEYXRhW3BlbmRpbmdBY3Rpb25SZXN1bHRbMl1dID0gdm9pZCAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGxvYWRlckRhdGEsXG4gICAgZXJyb3JzLFxuICAgIHN0YXR1c0NvZGU6IHN0YXR1c0NvZGUgfHwgMjAwLFxuICAgIGxvYWRlckhlYWRlcnNcbiAgfTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NMb2FkZXJEYXRhKHN0YXRlLCBtYXRjaGVzLCByZXN1bHRzLCBwZW5kaW5nQWN0aW9uUmVzdWx0LCByZXZhbGlkYXRpbmdGZXRjaGVycywgZmV0Y2hlclJlc3VsdHMpIHtcbiAgbGV0IHsgbG9hZGVyRGF0YSwgZXJyb3JzIH0gPSBwcm9jZXNzUm91dGVMb2FkZXJEYXRhKFxuICAgIG1hdGNoZXMsXG4gICAgcmVzdWx0cyxcbiAgICBwZW5kaW5nQWN0aW9uUmVzdWx0XG4gICk7XG4gIHJldmFsaWRhdGluZ0ZldGNoZXJzLmZpbHRlcigoZikgPT4gIWYubWF0Y2hlcyB8fCBmLm1hdGNoZXMuc29tZSgobSkgPT4gbS5zaG91bGRMb2FkKSkuZm9yRWFjaCgocmYpID0+IHtcbiAgICBsZXQgeyBrZXksIG1hdGNoLCBjb250cm9sbGVyIH0gPSByZjtcbiAgICBpZiAoY29udHJvbGxlciAmJiBjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSBmZXRjaGVyUmVzdWx0c1trZXldO1xuICAgIGludmFyaWFudChyZXN1bHQsIFwiRGlkIG5vdCBmaW5kIGNvcnJlc3BvbmRpbmcgZmV0Y2hlciByZXN1bHRcIik7XG4gICAgaWYgKGlzRXJyb3JSZXN1bHQocmVzdWx0KSkge1xuICAgICAgbGV0IGJvdW5kYXJ5TWF0Y2ggPSBmaW5kTmVhcmVzdEJvdW5kYXJ5KHN0YXRlLm1hdGNoZXMsIG1hdGNoPy5yb3V0ZS5pZCk7XG4gICAgICBpZiAoIShlcnJvcnMgJiYgZXJyb3JzW2JvdW5kYXJ5TWF0Y2gucm91dGUuaWRdKSkge1xuICAgICAgICBlcnJvcnMgPSB7XG4gICAgICAgICAgLi4uZXJyb3JzLFxuICAgICAgICAgIFtib3VuZGFyeU1hdGNoLnJvdXRlLmlkXTogcmVzdWx0LmVycm9yXG4gICAgICAgI
25114H07XG4gICAgICB9XG4gICAgICBzdGF0ZS5mZXRjaGVycy5kZWxldGUoa2V5KTtcbiAgICB9IGVsc2UgaWYgKGlzUmVkaXJlY3RSZXN1bHQocmVzdWx0KSkge1xuICAgICAgaW52YXJpYW50KGZhbHNlLCBcIlVuaGFuZGxlZCBmZXRjaGVyIHJldmFsaWRhdGlvbiByZWRpcmVjdFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGRvbmVGZXRjaGVyID0gZ2V0RG9uZUZldGNoZXIocmVzdWx0LmRhdGEpO1xuICAgICAgc3RhdGUuZmV0Y2hlcnMuc2V0KGtleSwgZG9uZUZldGNoZXIpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7IGxvYWRlckRhdGEsIGVycm9ycyB9O1xufVxuZnVuY3Rpb24gbWVyZ2VMb2FkZXJEYXRhKGxvYWRlckRhdGEsIG5ld0xvYWRlckRhdGEsIG1hdGNoZXMsIGVycm9ycykge1xuICBsZXQgbWVyZ2VkTG9hZGVyRGF0YSA9IE9iamVjdC5lbnRyaWVzKG5ld0xvYWRlckRhdGEpLmZpbHRlcigoWywgdl0pID0+IHYgIT09IFJlc2V0TG9hZGVyRGF0YVN5bWJvbCkucmVkdWNlKChtZXJnZWQsIFtrLCB2XSkgPT4ge1xuICAgIG1lcmdlZFtrXSA9IHY7XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfSwge30pO1xuICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgbGV0IGlkID0gbWF0Y2gucm91dGUuaWQ7XG4gICAgaWYgKCFuZXdMb2FkZXJEYXRhLmhhc093blByb3BlcnR5KGlkKSAmJiBsb2FkZXJEYXRhLmhhc093blByb3BlcnR5KGlkKSAmJiBtYXRjaC5yb3V0ZS5sb2FkZXIpIHtcbiAgICAgIG1lcmdlZExvYWRlckRhdGFbaWRdID0gbG9hZGVyRGF0YVtpZF07XG4gICAgfVxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZWRMb2FkZXJEYXRhO1xufVxuZnVuY3Rpb24gZ2V0QWN0aW9uRGF0YUZvckNvbW1pdChwZW5kaW5nQWN0aW9uUmVzdWx0KSB7XG4gIGlmICghcGVuZGluZ0FjdGlvblJlc3VsdCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICByZXR1cm4gaXNFcnJvclJlc3VsdChwZW5kaW5nQWN0aW9uUmVzdWx0WzFdKSA/IHtcbiAgICAvLyBDbGVhciBvdXQgcHJpb3IgYWN0aW9uRGF0YSBvbiBlcnJvcnNcbiAgICBhY3Rpb25EYXRhOiB7fVxuICB9IDoge1xuICAgIGFjdGlvbkRhdGE6IHtcbiAgICAgIFtwZW5kaW5nQWN0aW9uUmVzdWx0WzBdXTogcGVuZGluZ0FjdGlvblJlc3VsdFsxXS5kYXRhXG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZmluZE5lYXJlc3RCb3VuZGFyeShtYXRjaGVzLCByb3V0ZUlkKSB7XG4gIGxldCBlbGlnaWJsZU1hdGNoZXMgPSByb3V0ZUlkID8gbWF0Y2hlcy5zbGljZSgwLCBtYXRjaGVzLmZpbmRJbmRleCgobSkgPT4gbS5yb3V0ZS5pZCA9PT0gcm91dGVJZCkgKyAxKSA6IFsuLi5tYXRjaGVzXTtcbiAgcmV0dXJuIGVsaWdpYmxlTWF0Y2hlcy5yZXZlcnNlKCkuZmluZCgobSkgPT4gbS5yb3V0ZS5oYXNFcnJvckJvdW5kYXJ5ID09PSB0cnVlKSB8fCBtYXRjaGVzWzBdO1xufVxuZnVuY3Rpb24gZ2V0U2hvcnRDaXJjdWl0TWF0Y2hlcyhyb3V0ZXMpIHtcbiAgbGV0IHJvdXRlID0gcm91dGVzLmxlbmd0aCA9PT0gMSA/IHJvdXRlc1swXSA6IHJvdXRlcy5maW5kKChyKSA9PiByLmluZGV4IHx8ICFyLnBhdGggfHwgci5wYXRoID09PSBcIi9cIikgfHwge1xuICAgIGlkOiBgX19zaGltLWVycm9yLXJvdXRlX19gXG4gIH07XG4gIHJldHVybiB7XG4gICAgbWF0Y2hlczogW1xuICAgICAge1xuICAgICAgICBwYXJhbXM6IHt9LFxuICAgICAgICBwYXRobmFtZTogXCJcIixcbiAgICAgICAgcGF0aG5hbWVCYXNlOiBcIlwiLFxuICAgICAgICByb3V0ZVxuICAgICAgfVxuICAgIF0sXG4gICAgcm91dGVcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldEludGVybmFsUm91dGVyRXJyb3Ioc3RhdHVzLCB7XG4gIHBhdGhuYW1lLFxuICByb3V0ZUlkLFxuICBtZXRob2QsXG4gIHR5cGUsXG4gIG1lc3NhZ2Vcbn0gPSB7fSkge1xuICBsZXQgc3RhdHVzVGV4dCA9IFwiVW5rbm93biBTZXJ2ZXIgRXJyb3JcIjtcbiAgbGV0IGVycm9yTWVzc2FnZSA9IFwiVW5rbm93biBAcmVtaXgtcnVuL3JvdXRlciBlcnJvclwiO1xuICBpZiAoc3RhdHVzID09PSA0MDApIHtcbiAgICBzdGF0dXNUZXh0ID0gXCJCYWQgUmVxdWVzdFwiO1xuICAgIGlmIChtZXRob2QgJiYgcGF0aG5hbWUgJiYgcm91dGVJZCkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gYFlvdSBtYWRlIGEgJHttZXRob2R9IHJlcXVlc3QgdG8gXCIke3BhdGhuYW1lfVwiIGJ1dCBkaWQgbm90IHByb3ZpZGUgYSBcXGBsb2FkZXJcXGAgZm9yIHJvdXRlIFwiJHtyb3V0ZUlkfVwiLCBzbyB0aGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LmA7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImludmFsaWQtYm9keVwiKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcIlVuYWJsZSB0byBlbmNvZGUgc3VibWlzc2lvbiBib2R5XCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgc3RhdHVzVGV4dCA9IFwiRm9yYmlkZGVuXCI7XG4gICAgZXJyb3JNZXNzYWdlID0gYFJvdXRlIFwiJHtyb3V0ZUlkfVwiIGRvZXMgbm90IG1hdGNoIFVSTCBcIiR7cGF0aG5hbWV9XCJgO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgc3RhdHVzVGV4dCA9IFwiTm90IEZvdW5kXCI7XG4gICAgZXJyb3JNZXNzYWdlID0gYE5vIHJvdXRlIG1hdGNoZXMgVVJMIFwiJHtwYXRobmFtZX1cImA7XG4gIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDUpIHtcbiAgICBzdGF0dXNUZXh0ID0gXCJNZXRob2QgTm90IEFsbG93ZWRcIjtcbiAgICBpZiAobWV0aG9kICYmIHBhdGhuYW1lICYmIHJvdXRlSWQpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IGBZb3UgbWFkZSBhICR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9IHJlcXVlc3QgdG8gXCIke3BhdGhuYW1lfVwiIGJ1dCBkaWQgbm90IHByb3ZpZGUgYW4gXFxgYWN0aW9uXFxgIGZvciByb3V0ZSBcIiR7cm91dGVJZH1cIiwgc28gdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC5gO1xuICAgIH0gZWxzZSBpZiAobWV0aG9kKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBgSW52YWxpZCByZXF1ZXN0IG1ldGhvZCBcIiR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9XCJgO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IEVycm9yUmVzcG9uc2VJbXBsKFxuICAgIHN0YXR1cyB8fCA1MDAsXG4gICAgc3RhdHVzVGV4dCxcbiAgICBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSxcbiAgICB0cnVlXG4gICk7XG59XG5mdW5jdGlvbiBmaW5kUmVkaXJlY3QocmVzdWx0cykge1xuICBsZXQgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHJlc3VsdHMpO1xuICBmb3IgKGxldCBpID0gZW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGxldCBba2V5LCByZXN1bHRdID0gZW50cmllc1tpXTtcbiAgICBpZiAoaXNSZWRpcmVjdFJlc3VsdChyZXN1bHQpKSB7XG4gICAgICByZXR1cm4geyBrZXksIHJlc3VsdCB9O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc3RyaXBIYXNoRnJvbVBhdGgocGF0aCkge1xuICBsZXQgcGFyc2VkUGF0aCA9IHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKHBhdGgpIDogcGF0aDtcbiAgcmV0dXJuIGNyZWF0ZVBhdGgoeyAuLi5wYXJzZWRQYXRoLCBoYXNoOiBcIlwiIH0pO1xufVxuZnVuY3Rpb24gaXNIYXNoQ2hhbmdlT25seShhLCBiKSB7XG4gIGlmIChhLnBhdGhuYW1lICE9PSBiLnBhdGhuYW1lIHx8IGEuc2VhcmNoICE9PSBiLnNlYXJjaCkge1xuICAgIHJldHVybi
25114BmYWxzZTtcbiAgfVxuICBpZiAoYS5oYXNoID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGIuaGFzaCAhPT0gXCJcIjtcbiAgfSBlbHNlIGlmIChhLmhhc2ggPT09IGIuaGFzaCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGIuaGFzaCAhPT0gXCJcIikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGRhdGFXaXRoUmVzcG9uc2VJbml0VG9SZXNwb25zZShkYXRhMikge1xuICByZXR1cm4gUmVzcG9uc2UuanNvbihkYXRhMi5kYXRhLCBkYXRhMi5pbml0ID8/IHZvaWQgMCk7XG59XG5mdW5jdGlvbiBkYXRhV2l0aFJlc3BvbnNlSW5pdFRvRXJyb3JSZXNwb25zZShkYXRhMikge1xuICByZXR1cm4gbmV3IEVycm9yUmVzcG9uc2VJbXBsKFxuICAgIGRhdGEyLmluaXQ/LnN0YXR1cyA/PyA1MDAsXG4gICAgZGF0YTIuaW5pdD8uc3RhdHVzVGV4dCA/PyBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgIGRhdGEyLmRhdGFcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzRGF0YVN0cmF0ZWd5UmVzdWx0cyhyZXN1bHQpIHtcbiAgcmV0dXJuIHJlc3VsdCAhPSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmVudHJpZXMocmVzdWx0KS5ldmVyeShcbiAgICAoW2tleSwgdmFsdWVdKSA9PiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiICYmIGlzRGF0YVN0cmF0ZWd5UmVzdWx0KHZhbHVlKVxuICApO1xufVxuZnVuY3Rpb24gaXNEYXRhU3RyYXRlZ3lSZXN1bHQocmVzdWx0KSB7XG4gIHJldHVybiByZXN1bHQgIT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmIFwidHlwZVwiIGluIHJlc3VsdCAmJiBcInJlc3VsdFwiIGluIHJlc3VsdCAmJiAocmVzdWx0LnR5cGUgPT09IFwiZGF0YVwiIC8qIGRhdGEgKi8gfHwgcmVzdWx0LnR5cGUgPT09IFwiZXJyb3JcIiAvKiBlcnJvciAqLyk7XG59XG5mdW5jdGlvbiBpc1JlZGlyZWN0RGF0YVN0cmF0ZWd5UmVzdWx0KHJlc3VsdCkge1xuICByZXR1cm4gaXNSZXNwb25zZShyZXN1bHQucmVzdWx0KSAmJiByZWRpcmVjdFN0YXR1c0NvZGVzLmhhcyhyZXN1bHQucmVzdWx0LnN0YXR1cyk7XG59XG5mdW5jdGlvbiBpc0Vycm9yUmVzdWx0KHJlc3VsdCkge1xuICByZXR1cm4gcmVzdWx0LnR5cGUgPT09IFwiZXJyb3JcIiAvKiBlcnJvciAqLztcbn1cbmZ1bmN0aW9uIGlzUmVkaXJlY3RSZXN1bHQocmVzdWx0KSB7XG4gIHJldHVybiAocmVzdWx0ICYmIHJlc3VsdC50eXBlKSA9PT0gXCJyZWRpcmVjdFwiIC8qIHJlZGlyZWN0ICovO1xufVxuZnVuY3Rpb24gaXNEYXRhV2l0aFJlc3BvbnNlSW5pdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9IG51bGwgJiYgXCJ0eXBlXCIgaW4gdmFsdWUgJiYgXCJkYXRhXCIgaW4gdmFsdWUgJiYgXCJpbml0XCIgaW4gdmFsdWUgJiYgdmFsdWUudHlwZSA9PT0gXCJ
25114EYXRhV2l0aFJlc3BvbnNlSW5pdFwiO1xufVxuZnVuY3Rpb24gaXNSZXNwb25zZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUuc3RhdHVzID09PSBcIm51bWJlclwiICYmIHR5cGVvZiB2YWx1ZS5zdGF0dXNUZXh0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB2YWx1ZS5oZWFkZXJzID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZS5ib2R5ICE9PSBcInVuZGVmaW5lZFwiO1xufVxuZnVuY3Rpb24gaXNSZWRpcmVjdFN0YXR1c0NvZGUoc3RhdHVzQ29kZSkge1xuICByZXR1cm4gcmVkaXJlY3RTdGF0dXNDb2Rlcy5oYXMoc3RhdHVzQ29kZSk7XG59XG5mdW5jdGlvbiBpc1JlZGlyZWN0UmVzcG9uc2UocmVzdWx0KSB7XG4gIHJldHVybiBpc1Jlc3BvbnNlKHJlc3VsdCkgJiYgaXNSZWRpcmVjdFN0YXR1c0NvZGUocmVzdWx0LnN0YXR1cykgJiYgcmVzdWx0LmhlYWRlcnMuaGFzKFwiTG9jYXRpb25cIik7XG59XG5mdW5jdGlvbiBpc1ZhbGlkTWV0aG9kKG1ldGhvZCkge1xuICByZXR1cm4gdmFsaWRSZXF1ZXN0TWV0aG9kcy5oYXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpO1xufVxuZnVuY3Rpb24gaXNNdXRhdGlvbk1ldGhvZChtZXRob2QpIHtcbiAgcmV0dXJuIHZhbGlkTXV0YXRpb25NZXRob2RzLmhhcyhtZXRob2QudG9VcHBlckNhc2UoKSk7XG59XG5mdW5jdGlvbiBoYXNOYWtlZEluZGV4UXVlcnkoc2VhcmNoKSB7XG4gIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHNlYXJjaCkuZ2V0QWxsKFwiaW5kZXhcIikuc29tZSgodikgPT4gdiA9PT0gXCJcIik7XG59XG5mdW5jdGlvbiBnZXRUYXJnZXRNYXRjaChtYXRjaGVzLCBsb2NhdGlvbikge1xuICBsZXQgc2VhcmNoID0gdHlwZW9mIGxvY2F0aW9uID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKGxvY2F0aW9uKS5zZWFyY2ggOiBsb2NhdGlvbi5zZWFyY2g7XG4gIGlmIChtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0ucm91dGUuaW5kZXggJiYgaGFzTmFrZWRJbmRleFF1ZXJ5KHNlYXJjaCB8fCBcIlwiKSkge1xuICAgIHJldHVybiBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV07XG4gIH1cbiAgbGV0IHBhdGhNYXRjaGVzID0gZ2V0UGF0aENvbnRyaWJ1dGluZ01hdGNoZXMobWF0Y2hlcyk7XG4gIHJldHVybiBwYXRoTWF0Y2hlc1twYXRoTWF0Y2hlcy5sZW5ndGggLSAxXTtcbn1cbmZ1bmN0aW9uIGdldFN1Ym1pc3Npb25Gcm9tTmF2aWdhdGlvbihuYXZpZ2F0aW9uKSB7XG4gIGxldCB7IGZvcm1NZXRob2QsIGZvcm1BY3Rpb24sIGZvcm1FbmNUeXBlLCB0ZXh0LCBmb3JtRGF0YSwganNvbiB9ID0gbmF2aWdhdGlvbjtcbiAgaWYgKCFmb3JtTWV0aG9kIHx8ICFmb3JtQWN0aW9uIHx8ICFmb3JtRW5jVHlwZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodGV4dCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1NZXRob2QsXG4gICAgICBmb3JtQWN0aW9uLFxuICAgICAgZm9ybUVuY1R5cGUsXG4gICAgICBmb3JtRGF0YTogdm9pZCAwLFxuICAgICAganNvbjogdm9pZCAwLFxuICAgICAgdGV4dFxuICAgIH07XG4gIH0gZWxzZSBpZiAoZm9ybURhdGEgIT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtTWV0aG9kLFxuICAgICAgZm9ybUFjdGlvbixcbiAgICAgIGZvcm1FbmNUeXBlLFxuICAgICAgZm9ybURhdGEsXG4gICAgICBqc29uOiB2b2lkIDAsXG4gICAgICB0ZXh0OiB2b2lkIDBcbiAgICB9O1xuICB9IGVsc2UgaWYgKGpzb24gIT09IHZvaWQgMCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtTWV0aG9kLFxuICAgICAgZm9ybUFjdGlvbixcbiAgICAgIGZvcm1FbmNUeXBlLFxuICAgICAgZm9ybURhdGE6IHZvaWQgMCxcbiAgICAgIGpzb24sXG4gICAgICB0ZXh0OiB2b2lkIDBcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRMb2FkaW5nTmF2aWdhdGlvbihsb2NhdGlvbiwgc3VibWlzc2lvbikge1xuICBpZiAoc3VibWlzc2lvbikge1xuICAgIGxldCBuYXZpZ2F0aW9uID0ge1xuICAgICAgc3RhdGU6IFwibG9hZGluZ1wiLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBmb3JtTWV0aG9kOiBzdWJtaXNzaW9uLmZvcm1NZXRob2QsXG4gICAgICBmb3JtQWN0aW9uOiBzdWJtaXNzaW9uLmZvcm1BY3Rpb24sXG4gICAgICBmb3JtRW5jVHlwZTogc3VibWlzc2lvbi5mb3JtRW5jVHlwZSxcbiAgICAgIGZvcm1EYXRhOiBzdWJtaXNzaW9uLmZvcm1EYXRhLFxuICAgICAganNvbjogc3VibWlzc2lvbi5qc29uLFxuICAgICAgdGV4dDogc3VibWlzc2lvbi50ZXh0XG4gICAgfTtcbiAgICByZXR1cm4gbmF2aWdhdGlvbjtcbiAgfSBlbHNlIHtcbiAgICBsZXQgbmF2aWdhdGlvbiA9IHtcbiAgICAgIHN0YXRlOiBcImxvYWRpbmdcIixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgZm9ybU1ldGhvZDogdm9pZCAwLFxuICAgICAgZm9ybUFjdGlvbjogdm9pZCAwLFxuICAgICAgZm9ybUVuY1R5cGU6IHZvaWQgMCxcbiAgICAgIGZvcm1EYXRhOiB2b2lkIDAsXG4gICAgICBqc29uOiB2b2lkIDAsXG4gICAgICB0ZXh0OiB2b2lkIDBcbiAgICB9O1xuICAgIHJldHVybiBuYXZpZ2F0aW9uO1xuICB9XG59XG5mdW5jdGlvbiBnZXRTdWJtaXR0aW5nTmF2aWdhdGlvbihsb2NhdGlvbiwgc3VibWlzc2lvbikge1xuICBsZXQgbmF2aWdhdGlvbiA9IHtcbiAgICBzdGF0ZTogXCJzdWJtaXR0aW5nXCIsXG4gICAgbG9jYXRpb24sXG4gICAgZm9ybU1ldGhvZDogc3VibWlzc2lvbi5mb3JtTWV0aG9kLFxuICAgIGZvcm1BY3Rpb246IHN1Ym1pc3Npb24uZm9ybUFjdGlvbixcbiAgICBmb3JtRW5jVHlwZTogc3VibWlzc2lvbi5mb3JtRW5jVHlwZSxcbiAgICBmb3JtRGF0YTogc3VibWlzc2lvbi5mb3JtRGF0YSxcbiAgICBqc29uOiBzdWJtaXNzaW9uLmpzb24sXG4gICAgdGV4dDogc3VibWlzc2lvbi50ZXh0XG4gIH07XG4gIHJldHVybiBuYXZpZ2F0aW9uO1xufVxuZnVuY3Rpb24gZ2V0TG9hZGluZ0ZldGNoZXIoc3VibWlzc2lvbiwgZGF0YTIpIHtcbiAgaWYgKHN1Ym1pc3Npb24pIHtcbiAgICBsZXQgZmV0Y2hlciA9IHtcbiAgICAgIHN0YXRlOiBcImxvYWRpbmdcIixcbiAgICAgIGZvcm1NZXRob2Q6IHN1Ym1pc3Npb24uZm9ybU1ldGhvZCxcbiAgICAgIGZvcm1BY3Rpb246IHN1Ym1pc3Npb24uZm9ybUFjdGlvbixcbiAgICAgIGZvcm1FbmNUeXBlOiBzdWJtaXNzaW9uLmZvcm1FbmNUeXBlLFxuICAgICAgZm9ybURhdGE6IHN1Ym1pc3Npb24uZm9ybURhdGEsXG4gICAgICBqc29uOiBzdWJtaXNzaW9uLmpzb24sXG4gICAgICB0ZXh0OiBzdWJtaXNzaW9uLnRleHQsXG4gICAgICBkYXRhOiBkYXRhMlxuICAgIH07XG4gICAgcmV0dXJuIGZldGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgbGV0IGZldGNoZXIgPSB7XG4gICAgICBzdGF0ZTogXCJsb2FkaW5nXCIsXG4gICAgICBmb3JtTWV0aG9kOiB2b2lkIDAsXG4gICAgICBmb3JtQWN0aW9uOiB2b2lkIDAsXG4gICAgICBmb3JtRW5jVHlwZTogdm9pZCAwLFxuICAgICAgZm9ybURhdGE6IHZvaWQgMCxcbiAgICAgIGpzb246IHZvaWQgMCxcbiAgICAgIHRleHQ6IHZvaWQgMCxcbiAgICAgIGRhdGE6IGRhdGEyXG4gICAgfTtcbiAgICByZXR1cm4gZmV0Y2hlcjtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U3VibWl0dGluZ0ZldGNoZXIoc3VibWlzc2lvbiwgZXhpc3RpbmdGZXRjaGVyKSB7XG4gIGxldCBmZXRjaGVyID0ge1xuICAgIHN0YXRlOiBcInN1Ym1pdHRpbmdcIixcbiAgICBmb3JtTWV0aG9kOiBzdWJtaXNzaW9uLmZvcm1NZXRob2QsXG4gICAgZm9ybUFjdGlvbj
25114ogc3VibWlzc2lvbi5mb3JtQWN0aW9uLFxuICAgIGZvcm1FbmNUeXBlOiBzdWJtaXNzaW9uLmZvcm1FbmNUeXBlLFxuICAgIGZvcm1EYXRhOiBzdWJtaXNzaW9uLmZvcm1EYXRhLFxuICAgIGpzb246IHN1Ym1pc3Npb24uanNvbixcbiAgICB0ZXh0OiBzdWJtaXNzaW9uLnRleHQsXG4gICAgZGF0YTogZXhpc3RpbmdGZXRjaGVyID8gZXhpc3RpbmdGZXRjaGVyLmRhdGEgOiB2b2lkIDBcbiAgfTtcbiAgcmV0dXJuIGZldGNoZXI7XG59XG5mdW5jdGlvbiBnZXREb25lRmV0Y2hlcihkYXRhMikge1xuICBsZXQgZmV0Y2hlciA9IHtcbiAgICBzdGF0ZTogXCJpZGxlXCIsXG4gICAgZm9ybU1ldGhvZDogdm9pZCAwLFxuICAgIGZvcm1BY3Rpb246IHZvaWQgMCxcbiAgICBmb3JtRW5jVHlwZTogdm9pZCAwLFxuICAgIGZvcm1EYXRhOiB2b2lkIDAsXG4gICAganNvbjogdm9pZCAwLFxuICAgIHRleHQ6IHZvaWQgMCxcbiAgICBkYXRhOiBkYXRhMlxuICB9O1xuICByZXR1cm4gZmV0Y2hlcjtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVBcHBsaWVkVHJhbnNpdGlvbnMoX3dpbmRvdywgdHJhbnNpdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBsZXQgc2Vzc2lvblBvc2l0aW9ucyA9IF93aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgIFRSQU5TSVRJT05TX1NUT1JBR0VfS0VZXG4gICAgKTtcbiAgICBpZiAoc2Vzc2lvblBvc2l0aW9ucykge1xuICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25Qb3NpdGlvbnMpO1xuICAgICAgZm9yIChsZXQgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGpzb24gfHwge30pKSB7XG4gICAgICAgIGlmICh2ICYmIEFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgICB0cmFuc2l0aW9ucy5zZXQoaywgbmV3IFNldCh2IHx8IFtdKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxufVxuZnVuY3Rpb24gcGVyc2lzdEFwcGxpZWRUcmFuc2l0aW9ucyhfd2luZG93LCB0cmFuc2l0aW9ucykge1xuICBpZiAodHJhbnNpdGlvbnMuc2l6ZSA+IDApIHtcbiAgICBsZXQganNvbiA9IHt9O1xuICAgIGZvciAobGV0IFtrLCB2XSBvZiB0cmFuc2l0aW9ucykge1xuICAgICAganNvbltrXSA9IFsuLi52XTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIF93aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgVFJBTlNJVElPTlNfU1RPUkFHRV9LRVksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGpzb24pXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgYEZhaWxlZCB0byBzYXZlIGFwcGxpZWQgdmlldyB0cmFuc2l0aW9ucyBpbiBzZXNzaW9uU3RvcmFnZSAoJHtlcnJvcn0pLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVEZWZlcnJlZCgpIHtcbiAgbGV0IHJlc29sdmU7XG4gIGxldCByZWplY3Q7XG4gIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgcmVzb2x2ZSA9IGFzeW5jICh2YWwpID0+IHtcbiAgICAgIHJlcyh2YWwpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJlamVjdCA9IGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgcmVqKGVycm9yKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHByb21pc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcHJvbWlzZSxcbiAgICAvL0B0cy1pZ25vcmVcbiAgICByZXNvbHZlLFxuICAgIC8vQHRzLWlnbm9yZVxuICAgIHJlamVjdFxuICB9O1xufVxuXG4vLyBsaWIvY29udGV4dC50c1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYW
25114N0XCI7XG52YXIgRGF0YVJvdXRlckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuRGF0YVJvdXRlckNvbnRleHQuZGlzcGxheU5hbWUgPSBcIkRhdGFSb3V0ZXJcIjtcbnZhciBEYXRhUm91dGVyU3RhdGVDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbkRhdGFSb3V0ZXJTdGF0ZUNvbnRleHQuZGlzcGxheU5hbWUgPSBcIkRhdGFSb3V0ZXJTdGF0ZVwiO1xudmFyIFJTQ1JvdXRlckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KGZhbHNlKTtcbmZ1bmN0aW9uIHVzZUlzUlNDUm91dGVyQ29udGV4dCgpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoUlNDUm91dGVyQ29udGV4dCk7XG59XG52YXIgVmlld1RyYW5zaXRpb25Db250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGlzVHJhbnNpdGlvbmluZzogZmFsc2Vcbn0pO1xuVmlld1RyYW5zaXRpb25Db250ZXh0LmRpc3BsYXlOYW1lID0gXCJWaWV3VHJhbnNpdGlvblwiO1xudmFyIEZldGNoZXJzQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoXG4gIC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKClcbik7XG5GZXRjaGVyc0NvbnRleHQuZGlzcGxheU5hbWUgPSBcIkZldGNoZXJzXCI7XG52YXIgQXdhaXRDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbkF3YWl0Q29udGV4dC5kaXNwbGF5TmFtZSA9IFwiQXdhaXRcIjtcbnZhciBBd2FpdENvbnRleHRQcm92aWRlciA9IChwcm9wcykgPT4gUmVhY3QuY3JlYXRlRWxlbWVudChBd2FpdENvbnRleHQuUHJvdmlkZXIsIHByb3BzKTtcbnZhciBOYXZpZ2F0aW9uQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoXG4gIG51bGxcbik7XG5OYXZpZ2F0aW9uQ29udGV4dC5kaXNwbGF5TmFtZSA9IFwiTmF2aWdhdGlvblwiO1xudmFyIExvY2F0aW9uQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoXG4gIG51bGxcbik7XG5Mb2NhdGlvbkNvbnRleHQuZGlzcGxheU5hbWUgPSBcIkxvY2F0aW9uXCI7XG52YXIgUm91dGVDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIG91dGxldDogbnVsbCxcbiAgbWF0Y2hlczogW10sXG4gIGlzRGF0YVJvdXRlOiBmYWxzZVxufSk7XG5Sb3V0ZUNvbnRleHQuZGlzcGxheU5hbWUgPSBcIlJvdXRlXCI7XG52YXIgUm91dGVFcnJvckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuUm91dGVFcnJvckNvbnRleHQuZGlzcGxheU5hbWUgPSBcIlJvdXRlRXJyb3JcIjtcbnZhciBFTkFCTEVfREVWX1dBUk5JTkdTID0gdHJ1ZTtcblxuLy8gbGliL2hvb2tzLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QyIGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gdXNlSHJlZih0bywgeyByZWxhdGl2ZSB9ID0ge30pIHtcbiAgaW52YXJpYW50KFxuICAgIHVzZUluUm91dGVyQ29udGV4dCgpLFxuICAgIC8vIFRPRE86IFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHNvbWVob3cgaGF2ZSAyIHZlcnNpb25zIG9mIHRoZVxuICAgIC8vIHJvdXRlciBsb2FkZWQuIFdlIGNhbiBoZWxwIHRoZW0gdW5kZXJzdGFuZCBob3cgdG8gYXZvaWQgdGhhdC5cbiAgICBgdXNlSHJlZigpIG1heSBiZSB1c2VkIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYSA8Um91dGVyPiBjb21wb25lbnQuYFxuICApO1xuICBsZXQgeyBiYXNlbmFtZSwgbmF2aWdhdG9yIH0gPSBSZWFjdDIudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCB7IGhhc2gsIHBhdGhuYW1lLCBzZWFyY2ggfSA9IHVzZVJlc29sdmVkUGF0aCh0bywgeyByZWxhdGl2ZSB9KTtcbiAgbGV0IGpvaW5lZFBhdGhuYW1lID0gcGF0aG5hbWU7XG4gIGlmIChiYXNlbmFtZSAhPT0gXCIvXCIpIHtcbiAgICBqb2luZWRQYXRobmFtZSA9IHBhdGhuYW1lID09PSBcIi9cIiA/IGJhc2VuYW1lIDogam9pblBhdGhzKFtiYXNlbmFtZSwgcGF0aG5hbWVdKTtcbiAgfVxuICByZXR1cm4gbmF2aWdhdG9yLmNyZWF0ZUhyZWYoeyBwYXRobmFtZTogam9pbmVkUGF0aG5hbWUsIHNlYXJjaCwgaGFzaCB9KTtcbn1cbmZ1bmN0aW9uIHVzZUluUm91dGVyQ29udGV4dCgpIHtcbiAgcmV0dXJuIFJlYWN0Mi51c2VDb250ZXh0KExvY2F0aW9uQ29udGV4dCkgIT0gbnVsbDtcbn1cbmZ1bmN0aW9uIHVzZUxvY2F0aW9uKCkge1xuICBpbnZhcmlhbnQoXG4gICAgdXNlSW5Sb3V0ZXJDb250ZXh0KCksXG4gICAgLy8gVE9ETzogVGhpcyBlcnJvciBpcyBwcm9iYWJseSBiZWNhdXNlIHRoZXkgc29tZWhvdyBoYXZlIDIgdmVyc2lvbnMgb2YgdGhlXG4gICAgLy8gcm91dGVyIGxvYWRlZC4gV2UgY2FuIGhlbHAgdGhlbSB1bmRlcnN0YW5kIGhvdyB0byBhdm9pZCB0aGF0LlxuICAgIGB1c2VMb2NhdGlvbigpIG1heSBiZSB1c2VkIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYSA8Um91dGVyPiBjb21wb25lbnQuYFxuICApO1xuICByZXR1cm4gUmVhY3QyLnVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KS5sb2NhdGlvbjtcbn1cbmZ1bmN0aW9uIHVzZU5hdmlnYXRpb25UeXBlKCkge1xuICByZXR1cm4gUmVhY3QyLnVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KS5uYXZpZ2F0aW9uVHlwZTtcbn1cbmZ1bmN0aW9uIHVzZU1hdGNoKHBhdHRlcm4pIHtcbiAgaW52YXJpYW50KFxuICAgIHVzZUluUm91dGVyQ29udGV4dCgpLFxuICAgIC8vIFRPRE86IFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHNvbWVob3cgaGF2ZSAyIHZlcnNpb25zIG9mIHRoZVxuICAgIC8vIHJvdXRlciBsb2FkZWQuIFdlIGNhbiBoZWxwIHRoZW0gdW5kZXJzdGFuZCBob3cgdG8gYXZvaWQgdGhhdC5cbiAgICBgdXNlTWF0Y2goKSBtYXkgYmUgdXNlZCBvbmx5IGluIHRoZSBjb250ZXh0IG9mIGEgPFJvdXRlcj4gY29tcG9uZW50LmBcbiAgKTtcbiAgbGV0IHsgcGF0aG5hbWUgfSA9IHVzZUxvY2F0aW9uKCk7XG4gIHJldHVybiBSZWFjdDIudXNlTWVtbyhcbiAgICAoKSA9PiBtYXRjaFBhdGgocGF0dGVybiwgZGVjb2RlUGF0aChwYXRobmFtZSkpLFxuICAgIFtwYXRobmFtZSwgcGF0dGVybl1cbiAgKTtcbn1cbnZhciBuYXZpZ2F0ZUVmZmVjdFdhcm5pbmcgPSBgWW91IHNob3VsZCBjYWxsIG5hdmlnYXRlKCkgaW4gYSBSZWFjdC51c2VFZmZlY3QoKSwgbm90IHdoZW4geW91ciBjb21wb25lbnQgaXMgZmlyc3QgcmVuZGVyZWQuYDtcbmZ1bmN0aW9uIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoY2IpIHtcbiAgbGV0IGlzU3RhdGljID0gUmVhY3QyLnVzZUNvbnRleHQoTmF2aWdhdGlvbkNvbnRleHQpLnN0YXRpYztcbiAgaWYgKCFpc1N0YXRpYykge1xuICAgIFJlYWN0Mi51c2VMYXlvdXRFZmZlY3QoY2IpO1xuICB9XG59XG5mdW5jdGlvbiB1c2VOYXZpZ2F0ZSgpIHtcbiAgbGV0IHsgaXNEYXRhUm91dGUgfSA9IFJlYWN0Mi51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gIHJldHVybi
25114Bpc0RhdGFSb3V0ZSA/IHVzZU5hdmlnYXRlU3RhYmxlKCkgOiB1c2VOYXZpZ2F0ZVVuc3RhYmxlKCk7XG59XG5mdW5jdGlvbiB1c2VOYXZpZ2F0ZVVuc3RhYmxlKCkge1xuICBpbnZhcmlhbnQoXG4gICAgdXNlSW5Sb3V0ZXJDb250ZXh0KCksXG4gICAgLy8gVE9ETzogVGhpcyBlcnJvciBpcyBwcm9iYWJseSBiZWNhdXNlIHRoZXkgc29tZWhvdyBoYXZlIDIgdmVyc2lvbnMgb2YgdGhlXG4gICAgLy8gcm91dGVyIGxvYWRlZC4gV2UgY2FuIGhlbHAgdGhlbSB1bmRlcnN0YW5kIGhvdyB0byBhdm9pZCB0aGF0LlxuICAgIGB1c2VOYXZpZ2F0ZSgpIG1heSBiZSB1c2VkIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYSA8Um91dGVyPiBjb21wb25lbnQuYFxuICApO1xuICBsZXQgZGF0YVJvdXRlckNvbnRleHQgPSBSZWFjdDIudXNlQ29udGV4dChEYXRhUm91dGVyQ29udGV4dCk7XG4gIGxldCB7IGJhc2VuYW1lLCBuYXZpZ2F0b3IgfSA9IFJlYWN0Mi51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgbGV0IHsgbWF0Y2hlcyB9ID0gUmVhY3QyLnVzZUNvbnRleHQoUm91dGVDb250ZXh0KTtcbiAgbGV0IHsgcGF0aG5hbWU6IGxvY2F0aW9uUGF0aG5hbWUgfSA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCByb3V0ZVBhdGhuYW1lc0pzb24gPSBKU09OLnN0cmluZ2lmeShnZXRSZXNvbHZlVG9NYXRjaGVzKG1hdGNoZXMpKTtcbiAgbGV0IGFjdGl2ZVJlZiA9IFJlYWN0Mi51c2VSZWYoZmFsc2UpO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBhY3RpdmVSZWYuY3VycmVudCA9IHRydWU7XG4gIH0pO1xuICBsZXQgbmF2aWdhdGUgPSBSZWFjdDIudXNlQ2FsbGJhY2soXG4gICAgKHRvLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgIHdhcm5pbmcoYWN0aXZlUmVmLmN1cnJlbnQsIG5hdmlnYXRlRWZmZWN0V2FybmluZyk7XG4gICAgICBpZiAoIWFjdGl2ZVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICBpZiAodHlwZW9mIHRvID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIG5hdmlnYXRvci5nbyh0byk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBwYXRoID0gcmVzb2x2ZVRvKFxuICAgICAgICB0byxcbiAgICAgICAgSlNPTi5wYXJzZShyb3V0ZVBhdGhuYW1lc0pzb24pLFxuICAgICAgICBsb2NhdGlvblBhdGhuYW1lLFxuICAgICAgICBvcHRpb25zLnJlbGF0aXZlID09PSBcInBhdGhcIlxuICAgICAgKTtcbiAgICAgIGlmIChkYXRhUm91dGVyQ29udGV4dCA9PSBudWxsICYmIGJhc2VuYW1lICE9PSBcIi9cIikge1xuICAgICAgICBwYXRoLnBhdGhuYW1lID0gcGF0aC5wYXRobmFtZSA9PT0gXCIvXCIgPyBiYXNlbmFtZSA6IGpvaW5QYXRocyhbYmFzZW5hbWUsIHBhdGgucGF0aG5hbWVdKTtcbiAgICAgIH1cbiAgICAgICghIW9wdGlvbnMucmVwbGFjZSA/IG5hdmlnYXRvci5yZXBsYWNlIDogbmF2aWdhdG9yLnB1c2gpKFxuICAgICAgICBwYXRoLFxuICAgICAgICBvcHRpb25zLnN0YXRlLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgIH0sXG4gICAgW1xuICAgICAgYmFzZW5hbWUsXG4gICAgICBuYXZpZ2F0b3IsXG4gICAgICByb3V0ZVBhdGhuYW1lc0pzb24sXG4gICAgICBsb2NhdGlvblBhdGhuYW1lLFxuICAgICAgZGF0YVJvdXRlckNvbnRleHRcbiAgICBdXG4gICk7XG4gIHJldHVybiBuYXZpZ2F0ZTtcbn1cbnZhciBPdXRsZXRDb250ZXh0ID0gUmVhY3QyLmNyZWF0ZUNvbnRleHQobnVsbCk7XG5mdW5jdGlvbiB1c2VPdXRsZXRDb250ZXh0KCkge1xuICByZXR1cm4gUmVhY3QyLnVzZUNvbnRleHQoT3V0bGV0Q29udGV4dCk7XG59XG5mdW5jdGlvbiB1c2VPdXRsZXQoY29udGV4dCkge1xuICBsZXQgb3V0bGV0ID0gUmVhY3QyLnVzZUNvbnRleHQoUm91dGVDb250ZXh0KS5vdXRsZXQ7XG4gIHJldHVybiBSZWFjdDIudXNlTWVtbyhcbiAgICAoKSA9PiBvdXRsZXQgJiYgLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KE91dGxldENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNvbnRleHQgfSwgb3V0bGV0KSxcbiAgICBbb3V0bGV0LCBjb250ZXh0XVxuICApO1xufVxuZnVuY3Rpb24gdXNlUGFyYW1zKCkge1xuICBsZXQgeyBtYXRjaGVzIH0gPSBSZWFjdDIudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBsZXQgcm91dGVNYXRjaCA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIHJvdXRlTWF0Y2ggPyByb3V0ZU1hdGNoLnBhcmFtcyA6IHt9O1xufVxuZnVuY3Rpb24gdXNlUmVzb2x2ZWRQYXRoKHRvLCB7IHJlbGF0aXZlIH0gPSB7fSkge1xuICBsZXQgeyBtYXRjaGVzIH0gPSBSZWFjdDIudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBsZXQgeyBwYXRobmFtZTogbG9jYXRpb25QYXRobmFtZSB9ID0gdXNlTG9jYXRpb24oKTtcbiAgbGV0IHJvdXRlUGF0aG5hbWVzSnNvbiA9IEpTT04uc3RyaW5naWZ5KGdldFJlc29sdmVUb01hdGNoZXMobWF0Y2hlcykpO1xuICByZXR1cm4gUmVhY3QyLnVzZU1lbW8oXG4gICAgKCkgPT4gcmVzb2x2ZVRvKFxuICAgICAgdG8sXG4gICAgICBKU09OLnBhcnNlKHJvdXRlUGF0aG5hbWVzSnNvbiksXG4gICAgICBsb2NhdGlvblBhdGhuYW1lLFxuICAgICAgcmVsYXRpdmUgPT09IFwicGF0aFwiXG4gICAgKSxcbiAgICBbdG8sIHJvdXRlUGF0aG5hbWVzSnNvbiwgbG9jYXRpb25QYXRobmFtZSwgcmVsYXRpdmVdXG4gICk7XG59XG5mdW5jdGlvbiB1c2VSb3V0ZXMocm91dGVzLCBsb2NhdGlvbkFyZykge1xuICByZXR1cm4gdXNlUm91dGVzSW1wbChyb3V0ZXMsIGxvY2F0aW9uQXJnKTtcbn1cbmZ1bmN0aW9uIHVzZVJvdXRlc0ltcGwocm91dGVzLCBsb2NhdGlvbkFyZywgZGF0YVJvdXRlclN0YXRlLCB1bnN0YWJsZV9vbkVycm9yLCBmdXR1cmUpIHtcbiAgaW52YXJpYW50KFxuICAgIHVzZUluUm91dGVyQ29udGV4dCgpLFxuICAgIC8vIFRPRE86IFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHNvbWVob3cgaGF2ZSAyIHZlcnNpb25zIG9mIHRoZVxuICAgIC8vIHJvdXRlciBsb2FkZWQuIFdlIGNhbiBoZWxwIHRoZW0gdW5kZXJzdGFuZCBob3cgdG8gYXZvaWQgdGhhdC5cbiAgICBgdXNlUm91dGVzKCkgbWF5IGJlIHVzZWQgb25seSBpbiB0aGUgY29udGV4dCBvZiBhIDxSb3V0ZXI+IGNvbXBvbmVudC5gXG4gICk7XG4gIGxldCB7IG5hdmlnYXRvciB9ID0gUmVhY3QyLnVzZUNvbnRleHQoTmF2aWdhdGlvbkNvbnRleHQpO1xuICBsZXQgeyBtYXRjaGVzOiBwYXJlbnRNYXRjaGVzIH0gPSBSZWFjdDIudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBsZXQgcm91dGVNYXRjaCA9IHBhcmVudE1hdGNoZXNbcGFyZW50TWF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgbGV0IHBhcmVudFBhcmFtcyA9IHJvdXRlTWF0Y2ggPyByb3V0ZU1hdGNoLnBhcmFtcyA6IHt9O1xuICBsZXQgcGFyZW50UGF0aG5hbWUgPSByb3V0ZU1hdGNoID8gcm91dGVNYXRjaC5wYXRobmFtZSA6IFwiL1wiO1xuICBsZXQgcGFyZW50UGF0aG5hbWVCYXNlID0gcm91dGVNYXRjaCA/IHJvdXRlTWF0Y2gucGF0aG5hbWVCYXNlIDogXCIvXCI7XG4gIGxldCBwYXJlbnRSb3V0ZSA9IHJvdXRlTWF0Y2ggJiYgcm91dGVNYXRjaC5yb3V0ZTtcbiAgaWYgKEVOQUJMRV9ERVZfV0FSTklOR1MpIHtcbiAgICBsZXQgcGFyZW50UGF0aCA9IHBhcmVudFJvdXRlICYmIHBhcmVudFJvdXRlLnBhdGggfHwgXCJcIjtcbiAgICB3YXJuaW5nT25jZShcbiAgICAgIHBhcmVudFBhdGhuYW1lLFxuICAgICAgIXBhcmVudFJvdXRlIHx8IHBhcmVudFBhdGguZW5kc1dpdGgoXCIqXCIpIHx8IHBhcmVudFBhdGguZW5kc1dpdGgoXCIqP1wiKSxcbiAgICAgIGBZb3UgcmVuZGVyZWQgZGVzY2VuZGFudCA8Um91dGVzPiAob3IgY2FsbGVkIFxcYHVzZVJvdXRlcygpXFxgKSBhdCBcIiR7cGFyZW50UGF0aG5hbWV9XCIgKHVuZGVyIDxSb3V0ZSBwYXRoPVwiJHtwYXJlbnRQYXRofVwiPikgYnV0IHRoZSBwYXJlbnQgcm91dGUgcGF0aCBoYXMgbm8gdHJhaWxpbmcgXCIqXCIuIFRoaXMgbWVhbnMgaWYgeW91IG5hdmlnYXRlIGRlZXBlciwgdGhlI
25114HBhcmVudCB3b24ndCBtYXRjaCBhbnltb3JlIGFuZCB0aGVyZWZvcmUgdGhlIGNoaWxkIHJvdXRlcyB3aWxsIG5ldmVyIHJlbmRlci5cblxuUGxlYXNlIGNoYW5nZSB0aGUgcGFyZW50IDxSb3V0ZSBwYXRoPVwiJHtwYXJlbnRQYXRofVwiPiB0byA8Um91dGUgcGF0aD1cIiR7cGFyZW50UGF0aCA9PT0gXCIvXCIgPyBcIipcIiA6IGAke3BhcmVudFBhdGh9LypgfVwiPi5gXG4gICAgKTtcbiAgfVxuICBsZXQgbG9jYXRpb25Gcm9tQ29udGV4dCA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBsb2NhdGlvbjtcbiAgaWYgKGxvY2F0aW9uQXJnKSB7XG4gICAgbGV0IHBhcnNlZExvY2F0aW9uQXJnID0gdHlwZW9mIGxvY2F0aW9uQXJnID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKGxvY2F0aW9uQXJnKSA6IGxvY2F0aW9uQXJnO1xuICAgIGludmFyaWFudChcbiAgICAgIHBhcmVudFBhdGhuYW1lQmFzZSA9PT0gXCIvXCIgfHwgcGFyc2VkTG9jYXRpb25BcmcucGF0aG5hbWU/LnN0YXJ0c1dpdGgocGFyZW50UGF0aG5hbWVCYXNlKSxcbiAgICAgIGBXaGVuIG92ZXJyaWRpbmcgdGhlIGxvY2F0aW9uIHVzaW5nIFxcYDxSb3V0ZXMgbG9jYXRpb24+XFxgIG9yIFxcYHVzZVJvdXRlcyhyb3V0ZXMsIGxvY2F0aW9uKVxcYCwgdGhlIGxvY2F0aW9uIHBhdGhuYW1lIG11c3QgYmVnaW4gd2l0aCB0aGUgcG9ydGlvbiBvZiB0aGUgVVJMIHBhdGhuYW1lIHRoYXQgd2FzIG1hdGNoZWQgYnkgYWxsIHBhcmVudCByb3V0ZXMuIFRoZSBjdXJyZW50IHBhdGhuYW1lIGJhc2UgaXMgXCIke3BhcmVudFBhdGhuYW1lQmFzZX1cIiBidXQgcGF0aG5hbWUgXCIke3BhcnNlZExvY2F0aW9uQXJnLnBhdGhuYW1lfVwiIHdhcyBnaXZlbiBpbiB0aGUgXFxgbG9jYXRpb25cXGAgcHJvcC5gXG4gICAgKTtcbiAgICBsb2NhdGlvbiA9IHBhcnNlZExvY2F0aW9uQXJnO1xuICB9IGVsc2Uge1xuICAgIGxvY2F0aW9uID0gbG9jYXRpb25Gcm9tQ29udGV4dDtcbiAgfVxuICBsZXQgcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSB8fCBcIi9cIjtcbiAgbGV0IHJlbWFpbmluZ1BhdGhuYW1lID0gcGF0aG5hbWU7XG4gIGlmIChwYXJlbnRQYXRobmFtZUJhc2UgIT09IFwiL1wiKSB7XG4gICAgbGV0IHBhcmVudFNlZ21lbnRzID0gcGFyZW50UGF0aG5hbWVCYXNlLnJlcGxhY2UoL15cXC8vLCBcIlwiKS5zcGxpdChcIi9cIik7XG4gICAgbGV0IHNlZ21lbnRzID0gcGF0aG5hbWUucmVwbGFjZSgvXlxcLy8sIFwiXCIpLnNwbGl0KFwiL1wiKTtcbiAgICByZW1haW5pbmdQYXRobmFtZSA9IFwiL1wiICsgc2VnbWVudHMuc2xpY2UocGFyZW50U2VnbWVudHMubGVuZ3RoKS5qb2luKFwiL1wiKTtcbiAgfVxuICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKHJvdXRlcywgeyBwYXRobmFtZTogcmVtYWluaW5nUGF0aG5hbWUgfSk7XG4gIGlmIChFTkFCTEVfREVWX1dBUk5JTkdTKSB7XG4gICAgd2FybmluZyhcbiAgICAgIHBhcmVudFJvdXRlIHx8IG1hdGNoZXMgIT0gbnVsbCxcbiAgICAgIGBObyByb3V0ZXMgbWF0Y2hlZCBsb2NhdGlvbiBcIiR7bG9jYXRpb24ucGF0aG5hbWV9JHtsb2NhdGlvbi5zZWFyY2h9JHtsb2NhdGlvbi5oYXNofVwiIGBcbiAgICApO1xuICAgIHdhcm5pbmcoXG4gICAgICBtYXRjaGVzID09IG51bGwgfHwgbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdLnJvdXRlLmVsZW1lbnQgIT09IHZvaWQgMCB8fCBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0ucm91dGUuQ29tcG9uZW50ICE9PSB2b2lkIDAgfHwgbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdLnJvdXRlLmxhenkgIT09IHZvaWQgMCxcbiAgICAgIGBNYXRjaGVkIGxlYWYgcm91dGUgYXQgbG9jYXRpb24gXCIke2xvY2F0aW9uLnBhdGhuYW1lfSR7bG9jYXRpb24uc2VhcmNofSR7bG9jYXRpb24uaGFzaH1cIiBkb2VzIG5vdCBoYXZlIGFuIGVsZW1lbnQgb3IgQ29tcG9uZW50LiBUaGlzIG1lYW5zIGl0IHdpbGwgcmVuZGVyIGFuIDxPdXRsZXQgLz4gd2l0aCBhIG51bGwgdmFsdWUgYnkgZGVmYXVsdCByZXN1bHRpbmcgaW4gYW4gXCJlbXB0eVwiIHBhZ2UuYFxuICAgICk7XG4gIH1cbiAgbGV0IHJlbmRlcmVkTWF0Y2hlcyA9IF9yZW5kZXJNYXRjaGVzKFxuICAgIG1hdGNoZXMgJiYgbWF0Y2hlcy5tYXAoXG4gICAgICAobWF0Y2gpID0+IE9iamVjdC5hc3NpZ24oe30sIG1hdGNoLCB7XG4gICAgICAgIHBhcmFtczogT2JqZWN0LmFzc2lnbih7fSwgcGFyZW50UGFyYW1zLCBtYXRjaC5wYXJhbXMpLFxuICAgICAgICBwYXRobmFtZTogam9pblBhdGhzKFtcbiAgICAgICAgICBwYXJlbnRQYXRobmFtZUJhc2UsXG4gICAgICAgICAgLy8gUmUtZW5jb2RlIHBhdGhuYW1lcyB0aGF0IHdlcmUgZGVjb2RlZCBpbnNpZGUgbWF0Y2hSb3V0ZXMuXG4gICAgICAgICAgLy8gUHJlLWVuY29kZSBgP2AgYW5kIGAjYCBhaGVhZCBvZiBgZW5jb2RlTG9jYXRpb25gIGJlY2F1c2UgaXQgdXNlc1xuICAgICAgICAgIC8vIGBuZXcgVVJMKClgIGludGVybmFsbHkgYW5kIHdlIG5lZWQgdG8gcHJldmVudCBpdCBmcm9tIHRyZWF0aW5nXG4gICAgICAgICAgLy8gdGhlbSBhcyBzZXBhcmF0b3JzXG4gICAgICAgICAgbmF2aWdhdG9yLmVuY29kZUxvY2F0aW9uID8gbmF2aWdhdG9yLmVuY29kZUxvY2F0aW9uKFxuICAgICAgICAgICAgbWF0Y2gucGF0aG5hbWUucmVwbGFjZSgvXFw/L2csIFwiJTNGXCIpLnJlcGxhY2UoLyMvZywgXCIlMjNcIilcbiAgICAgICAgICApLnBhdGhuYW1lIDogbWF0Y2gucGF0aG5hbWVcbiAgICAgICAgXSksXG4gICAgICAgIHBhdGhuYW1lQmFzZTogbWF0Y2gucGF0aG5hbWVCYXNlID09PSBcIi9cIiA/IHBhcmVudFBhdGhuYW1lQmFzZSA6IGpvaW5QYXRocyhbXG4gICAgICAgICAgcGFyZW50UGF0aG5hbWVCYXNlLFxuICAgICAgICAgIC8vIFJlLWVuY29kZSBwYXRobmFtZXMgdGhhdCB3ZXJlIGRlY29kZWQgaW5zaWRlIG1hdGNoUm91dGVzXG4gICAgICAgICAgLy8gUHJlLWVuY29kZSBgP2AgYW5kIGAjYCBhaGVhZCBvZiBgZW5jb2RlTG9jYXRpb25gIGJlY2F1c2UgaXQgdXNlc1xuICAgICAgICAgIC8vIGBuZXcgVVJMKClgIGludGVybmFsbHkgYW5kIHdlIG5lZWQgdG8gcHJldmVudCBpdCBmcm9tIHRyZWF0aW5nXG4gICAgICAgICAgLy8gdGhlbSBhcyBzZXBhcmF0b3JzXG4gICAgICAgICAgbmF2aWdhdG9yLmVuY29kZUxvY2F0aW9uID8gbmF2aWdhdG9yLmVuY29kZUxvY2F0aW9uKFxuICAgICAgICAgICAgbWF0Y2gucGF0aG5hbWVCYXNlLnJlcGxhY2UoL1xcPy9nLCBcIiUzRlwiKS5yZXBsYWNlKC8jL2csIFwiJTIzXCIpXG4gICAgICAgICAgKS5wYXRobmFtZSA6IG1hdGNoLnBhdGhuYW1lQmFzZVxuICAgICAgICBdKVxuICAgICAgfSlcbiAgICApLFxuICAgIHBhcmVudE1hdGNoZXMsXG4gICAgZGF0YVJvdXRlclN0YXRlLFxuICAgIHVuc3RhYmxlX29uRXJyb3IsXG4gICAgZnV0dXJlXG4gICk7XG4gIGlmIChsb2NhdGlvbkFyZyAmJiByZW5kZXJlZE1hdGNoZXMpIHtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KFxuICAgICAgTG9jYXRpb25Db250ZXh0LlByb3ZpZGVyLFxuICAgICAge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgICBwYXRobmFtZTogXCIvXCIsXG4gICAgICAgICAgICBzZWFyY2g6IFwiXCIsXG4gICAgICAgICAgICBoYXNoOiBcIlwiLFxuICAgICAgICAgICAgc3RhdGU6IG51bGwsXG4gICAgICAgICAgICBrZXk6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgLi4ubG9jYXRpb25cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hdmlnYXRpb25UeXBlOiBcIlBPUFwiIC8qIFBvcCAqL1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVuZGVyZWRNYXRjaGVzXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVuZGVyZWRNYXRjaGVzO1xufVxuZnVuY3Rpb24gRGVmYXVsdEVycm9yQ29tcG9uZW50KCkge1xuICBsZXQgZXJyb3IgPSB1c2VSb3V0ZUVycm9yKCk7XG4gIGxldCBtZXNzYWdlID0gaXNSb3V0ZUVycm9yUmVzcG9uc2UoZXJyb3IpID8gYCR7ZXJyb3Iuc3RhdHVzfSAke2Vycm9yLnN0YXR1c1RleHR9YCA6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICBsZXQgc3RhY2sgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBudWxsO1xuICBsZXQgbGlnaHRncmV5ID0gXCJyZ2JhKDIwMCwyMDAsMjAwLCAwLjUpXCI7XG4gIGxldCBwcmVTdHlsZXMgPSB7IHBhZGRpbmc6IFwiMC41cmVtXCIsIGJhY2tncm91bmRDb2xvcjogbGlnaHRncmV5IH07XG4gIGxldCBjb2RlU3R5bGVzID0geyBwYWRkaW5nOiBcIjJweCA0cHhcIiwgYmFja2dyb3VuZENvbG9yOiBsaWdodGdyZXkgfTtcbiAgbGV0IGRldkluZm8gPSBudWxsO1xuICBpZiAoRU5BQkxFX0RFVl9XQVJOSU5HUykge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIkVycm9yIGhhbmRsZWQgYnkgUmVhY3QgUm91dGVyIGRlZmF1bHQgRXJyb3JCb3VuZGFyeTpcIixcbiAgICAgIGVycm9yXG4gICAgKTtcbiAgICBkZXZJbmZvID0gLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KFJlYWN0Mi5GcmFnbWVudCwgbnVsbCwgLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KFwicFwiLCBudWxsLCBcIlxcdXsxRjRCRn0gSGV5IGRldmVsb3BlciBcXHV7MUY0NEJ9XCIpLCAvKiBAX19QVVJFX18gKi8gUmVhY3QyLmNyZWF0ZUVsZW1lbnQoXCJwXCIsIG51bGwsIFwiWW91IGNhbiBwcm92aWRlIGEgd2F5IGJldHRlciBVWCB0aGFuIHRoaXMgd2hlbiB5b3VyIGFwcCB0aHJvd3MgZXJyb3JzIGJ5IHByb3ZpZGluZyB5b3VyIG93biBcIiwgLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KFwiY29kZVwiLCB7IHN0eWxlOiBjb2RlU3R5bGVzIH0sIFwiRXJyb3JCb3VuZGFyeVwiKSwgXCIgb3JcIiwgXCIgXCIsIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChcImNvZGVcIiwgeyBzdHlsZTogY29kZVN0eWxlcyB9LCBcImVycm9yRWxlbWVudFwiKSwgXCIg
25114cHJvcCBvbiB5b3VyIHJvdXRlLlwiKSk7XG4gIH1cbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChSZWFjdDIuRnJhZ21lbnQsIG51bGwsIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChcImgyXCIsIG51bGwsIFwiVW5leHBlY3RlZCBBcHBsaWNhdGlvbiBFcnJvciFcIiksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChcImgzXCIsIHsgc3R5bGU6IHsgZm9udFN0eWxlOiBcIml0YWxpY1wiIH0gfSwgbWVzc2FnZSksIHN0YWNrID8gLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KFwicHJlXCIsIHsgc3R5bGU6IHByZVN0eWxlcyB9LCBzdGFjaykgOiBudWxsLCBkZXZJbmZvKTtcbn1cbnZhciBkZWZhdWx0RXJyb3JFbGVtZW50ID0gLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KERlZmF1bHRFcnJvckNvbXBvbmVudCwgbnVsbCk7XG52YXIgUmVuZGVyRXJyb3JCb3VuZGFyeSA9IGNsYXNzIGV4dGVuZHMgUmVhY3QyLkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsb2NhdGlvbjogcHJvcHMubG9jYXRpb24sXG4gICAgICByZXZhbGlkYXRpb246IHByb3BzLnJldmFsaWRhdGlvbixcbiAgICAgIGVycm9yOiBwcm9wcy5lcnJvclxuICAgIH07XG4gIH1cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yIH07XG4gIH1cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUubG9jYXRpb24gIT09IHByb3BzLmxvY2F0aW9uIHx8IHN0YXRlLnJldmFsaWRhdGlvbiAhPT0gXCJpZGxlXCIgJiYgcHJvcHMucmV2YWxpZGF0aW9uID09PSBcImlkbGVcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IHByb3BzLmVycm9yLFxuICAgICAgICBsb2NhdGlvbjogcHJvcHMubG9jYXRpb24sXG4gICAgICAgIHJldmFsaWRhdGlvbjogcHJvcHMucmV2YWxpZGF0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHByb3BzLmVycm9yICE9PSB2b2lkIDAgPyBwcm9wcy5lcnJvciA6IHN0YXRlLmVycm9yLFxuICAgICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgcmV2YWxpZGF0aW9uOiBwcm9wcy5yZXZhbGlkYXRpb24gfHwgc3RhdGUucmV2YWxpZGF0aW9uXG4gICAgfTtcbiAgfVxuICBjb21wb25lbnREaWRDYXRjaChlcnJvciwgZXJyb3JJbmZvKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudW5zdGFibGVfb25FcnJvcikge1xuICAgICAgdGhpcy5wcm9wcy51bnN0YWJsZV9vbkVycm9yKGVycm9yLCBlcnJvckluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIlJlYWN0IFJvdXRlciBjYXVnaHQgdGhlIGZvbGxvd2luZyBlcnJvciBkdXJpbmcgcmVuZGVyXCIsXG4gICAgICAgIGVycm9yXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZXJyb3IgIT09IHZvaWQgMCA/IC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChSb3V0ZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHRoaXMucHJvcHMucm91dGVDb250ZXh0IH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChcbiAgICAgIFJvdXRlRXJyb3JDb250ZXh0LlByb3ZpZGVyLFxuICAgICAge1xuICAgICAgICB2YWx1ZTogdGhpcy5zdGF0ZS5lcnJvcixcbiAgICAgICAgY2hpbGRyZW46IHRoaXMucHJvcHMuY29tcG9uZW50XG4gICAgICB9XG4gICAgKSkgOiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICB9XG59O1xuZnVuY3Rpb24gUmVuZGVyZWRSb3V0ZSh7IHJvdXRlQ29udGV4dCwgbWF0Y2gsIGNoaWxkcmVuIH0pIHtcbiAgbGV0IGRhdGFSb3V0ZXJDb250ZXh0ID0gUmVhY3QyLnVzZUNvbnRleHQoRGF0YVJvdXRlckNvbnRleHQpO1xuICBpZiAoZGF0YVJvdXRlckNvbnRleHQgJiYgZGF0YVJvdXRlckNvbnRleHQuc3RhdGljICYmIGRhdGFSb3V0ZXJDb250ZXh0LnN0YXRpY0NvbnRleHQgJiYgKG1hdGNoLnJvdXRlLmVycm9yRWxlbWVudCB8fCBtYXRjaC5yb3V0ZS5FcnJvckJvdW5kYXJ5KSkge1xuICAgIGRhdGFSb3V0ZXJDb250ZXh0LnN0YXRpY0NvbnRleHQuX2RlZXBlc3RSZW5kZXJlZEJvdW5kYXJ5SWQgPSBtYXRjaC5yb3V0ZS5pZDtcbiAgfVxuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KFJvdXRlQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogcm91dGVDb250ZXh0IH0sIGNoaWxkcmVuKTtcbn1cbmZ1bmN0aW9uIF9yZW5kZXJNYXRjaGVzKG1hdGNoZXMsIHBhcmVudE1hdGNoZXMgPSBbXSwgZGF0YVJvdXRlclN0YXRlID0gbnVsbCwgdW5zdGFibGVfb25FcnJvciA9IG51bGwsIGZ1dHVyZSA9IG51bGwpIHtcbiAgaWYgKG1hdGNoZXMgPT0gbnVsbCkge1xuICAgIGlmICghZGF0YVJvdXRlclN0YXRlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGRhdGFSb3V0ZXJTdGF0ZS5lcnJvcnMpIHtcbiAgICAgIG1hdGNoZXMgPSBkYXRhUm91dGVyU3RhdGUubWF0Y2hlcztcbiAgICB9IGVsc2UgaWYgKHBhcmVudE1hdGNoZXMubGVuZ3RoID09PSAwICYmICFkYXRhUm91dGVyU3RhdGUuaW5pdGlhbGl6ZWQgJiYgZGF0YVJvdXRlclN0YXRlLm1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgbWF0Y2hlcyA9IGRhdGFSb3V0ZXJTdGF0ZS5tYXRjaGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgbGV0IHJlbmRlcmVkTWF0Y2hlcyA9IG1hdGNoZXM7XG4gIGxldCBlcnJvcnMgPSBkYXRhUm91dGVyU3RhdGU/LmVycm9ycztcbiAgaWYgKGVycm9ycyAhPSBudWxsKSB7XG4gICAgbGV0IGVycm9ySW5kZXggPSByZW5kZXJlZE1hdGNoZXMuZmluZEluZGV4KFxuICAgICAgKG0pID0+IG0ucm91dGUuaWQgJiYgZXJyb3JzPy5bbS5yb3V0ZS5pZF0gIT09IHZvaWQgMFxuICAgICk7XG4gICAgaW52YXJpYW50KFxuICAgICAgZXJyb3JJbmRleCA+PSAwLFxuICAgICAgYENvdWxkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgcm91dGUgZm9yIGVycm9ycyBvb
25114iByb3V0ZSBJRHM6ICR7T2JqZWN0LmtleXMoXG4gICAgICAgIGVycm9yc1xuICAgICAgKS5qb2luKFwiLFwiKX1gXG4gICAgKTtcbiAgICByZW5kZXJlZE1hdGNoZXMgPSByZW5kZXJlZE1hdGNoZXMuc2xpY2UoXG4gICAgICAwLFxuICAgICAgTWF0aC5taW4ocmVuZGVyZWRNYXRjaGVzLmxlbmd0aCwgZXJyb3JJbmRleCArIDEpXG4gICAgKTtcbiAgfVxuICBsZXQgcmVuZGVyRmFsbGJhY2sgPSBmYWxzZTtcbiAgbGV0IGZhbGxiYWNrSW5kZXggPSAtMTtcbiAgaWYgKGRhdGFSb3V0ZXJTdGF0ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyZWRNYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbWF0Y2ggPSByZW5kZXJlZE1hdGNoZXNbaV07XG4gICAgICBpZiAobWF0Y2gucm91dGUuSHlkcmF0ZUZhbGxiYWNrIHx8IG1hdGNoLnJvdXRlLmh5ZHJhdGVGYWxsYmFja0VsZW1lbnQpIHtcbiAgICAgICAgZmFsbGJhY2tJbmRleCA9IGk7XG4gICAgICB9XG4gICAgICBpZiAobWF0Y2gucm91dGUuaWQpIHtcbiAgICAgICAgbGV0IHsgbG9hZGVyRGF0YSwgZXJyb3JzOiBlcnJvcnMyIH0gPSBkYXRhUm91dGVyU3RhdGU7XG4gICAgICAgIGxldCBuZWVkc1RvUnVuTG9hZGVyID0gbWF0Y2gucm91dGUubG9hZGVyICYmICFsb2FkZXJEYXRhLmhhc093blByb3BlcnR5KG1hdGNoLnJvdXRlLmlkKSAmJiAoIWVycm9yczIgfHwgZXJyb3JzMlttYXRjaC5yb3V0ZS5pZF0gPT09IHZvaWQgMCk7XG4gICAgICAgIGlmIChtYXRjaC5yb3V0ZS5sYXp5IHx8IG5lZWRzVG9SdW5Mb2FkZXIpIHtcbiAgICAgICAgICByZW5kZXJGYWxsYmFjayA9IHRydWU7XG4gICAgICAgICAgaWYgKGZhbGxiYWNrSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgcmVuZGVyZWRNYXRjaGVzID0gcmVuZGVyZWRNYXRjaGVzLnNsaWNlKDAsIGZhbGxiYWNrSW5kZXggKyAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyZWRNYXRjaGVzID0gW3JlbmRlcmVkTWF0Y2hlc1swXV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZW5kZXJlZE1hdGNoZXMucmVkdWNlUmlnaHQoXG4gICAgKG91dGxldCwgbWF0Y2gsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgZXJyb3I7XG4gICAgICBsZXQgc2hvdWxkUmVuZGVySHlkcmF0ZUZhbGxiYWNrID0gZmFsc2U7XG4gICAgICBsZXQgZXJyb3JFbGVtZW50ID0gbnVsbDtcbiAgICAgIGxldCBoeWRyYXRlRmFsbGJhY2tFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlmIChkYXRhUm91dGVyU3RhdGUpIHtcbiAgICAgICAgZXJyb3IgPSBlcnJvcnMgJiYgbWF0Y2gucm91dGUuaWQgPyBlcnJvcnNbbWF0Y2gucm91dGUuaWRdIDogdm9pZCAwO1xuICAgICAgICBlcnJvckVsZW1lbnQgPSBtYXRjaC5yb3V0ZS5lcnJvckVsZW1lbnQgfHwgZGVmYXVsdEVycm9yRWxlbWVudDtcbiAgICAgICAgaWYgKHJlbmRlckZhbGxiYWNrKSB7XG4gICAgICAgICAgaWYgKGZhbGxiYWNrSW5kZXggPCAwICYmIGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICB3YXJuaW5nT25jZShcbiAgICAgICAgICAgICAgXCJyb3V0ZS1mYWxsYmFja1wiLFxuICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgXCJObyBgSHlkcmF0ZUZhbGxiYWNrYCBlbGVtZW50IHByb3ZpZGVkIHRvIHJlbmRlciBkdXJpbmcgaW5pdGlhbCBoeWRyYXRpb25cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHNob3VsZFJlbmRlckh5ZHJhdGVGYWxsYmFjayA9IHRydWU7XG4gICAgICAgICAgICBoeWRyYXRlRmFsbGJhY2tFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZhbGxiYWNrSW5kZXggPT09IGluZGV4KSB7XG4gICAgICAgICAgICBzaG91bGRSZW5kZXJIeWRyYXRlRmFsbGJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgaHlkcmF0ZUZhbGxiYWNrRWxlbWVudCA9IG1hdGNoLnJvdXRlLmh5ZHJhdGVGYWxsYmFja0VsZW1lbnQgfHwgbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBtYXRjaGVzMiA9IHBhcmVudE1hdGNoZXMuY29uY2F0KHJlbmRlcmVkTWF0Y2hlcy5zbGljZSgwLCBpbmRleCArIDEpKTtcbiAgICAgIGxldCBnZXRDaGlsZHJlbiA9ICgpID0+IHtcbiAgICAgICAgbGV0IGNoaWxkcmVuO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBjaGlsZHJlbiA9IGVycm9yRWxlbWVudDtcbiAgICAgICAgfSBlbHNlIGlmIChzaG91bGRSZW5kZXJIeWRyYXRlRmFsbGJhY2spIHtcbiAgICAgICAgICBjaGlsZHJlbiA9IGh5ZHJhdGVGYWxsYmFja0VsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2gucm91dGUuQ29tcG9uZW50KSB7XG4gICAgICAgICAgY2hpbGRyZW4gPSAvKiBAX19QVVJFX18gKi8gUmVhY3QyLmNyZWF0ZUVsZW1lbnQobWF0Y2gucm91dGUuQ29tcG9uZW50LCBudWxsKTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaC5yb3V0ZS5lbGVtZW50KSB7XG4gICAgICAgICAgY2hpbGRyZW4gPSBtYXRjaC5yb3V0ZS5lbGVtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoaWxkcmVuID0gb3V0bGV0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgUmVuZGVyZWRSb3V0ZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICAgIHJvdXRlQ29udGV4dDoge1xuICAgICAgICAgICAgICBvdXRsZXQsXG4gICAgICAgICAgICAgIG1hdGNoZXM6IG1hdGNoZXMyLFxuICAgICAgICAgICAgICBpc0RhdGFSb3V0ZTogZGF0YVJvdXRlclN0YXRlICE9IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlblxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gZGF0YVJvdXRlclN0YXRlICYmIChtYXRjaC5yb3V0ZS5FcnJvckJvdW5kYXJ5IHx8IG1hdGNoLnJvdXRlLmVycm9yRWxlbWVudCB8fCBpbmRleCA9PT0gMCkgPyAvKiBAX19QVVJFX18gKi8gUmVhY3QyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFJlbmRlckVycm9yQm91bmRhcnksXG4gICAgICAgI
25114HtcbiAgICAgICAgICBsb2NhdGlvbjogZGF0YVJvdXRlclN0YXRlLmxvY2F0aW9uLFxuICAgICAgICAgIHJldmFsaWRhdGlvbjogZGF0YVJvdXRlclN0YXRlLnJldmFsaWRhdGlvbixcbiAgICAgICAgICBjb21wb25lbnQ6IGVycm9yRWxlbWVudCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBjaGlsZHJlbjogZ2V0Q2hpbGRyZW4oKSxcbiAgICAgICAgICByb3V0ZUNvbnRleHQ6IHsgb3V0bGV0OiBudWxsLCBtYXRjaGVzOiBtYXRjaGVzMiwgaXNEYXRhUm91dGU6IHRydWUgfSxcbiAgICAgICAgICB1bnN0YWJsZV9vbkVycm9yXG4gICAgICAgIH1cbiAgICAgICkgOiBnZXRDaGlsZHJlbigpO1xuICAgIH0sXG4gICAgbnVsbFxuICApO1xufVxuZnVuY3Rpb24gZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcihob29rTmFtZSkge1xuICByZXR1cm4gYCR7aG9va05hbWV9IG11c3QgYmUgdXNlZCB3aXRoaW4gYSBkYXRhIHJvdXRlci4gIFNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS9lbi9tYWluL3JvdXRlcnMvcGlja2luZy1hLXJvdXRlci5gO1xufVxuZnVuY3Rpb24gdXNlRGF0YVJvdXRlckNvbnRleHQoaG9va05hbWUpIHtcbiAgbGV0IGN0eCA9IFJlYWN0Mi51c2VDb250ZXh0KERhdGFSb3V0ZXJDb250ZXh0KTtcbiAgaW52YXJpYW50KGN0eCwgZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcihob29rTmFtZSkpO1xuICByZXR1cm4gY3R4O1xufVxuZnVuY3Rpb24gdXNlRGF0YVJvdXRlclN0YXRlKGhvb2tOYW1lKSB7XG4gIGxldCBzdGF0ZSA9IFJlYWN0Mi51c2VDb250ZXh0KERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQpO1xuICBpbnZhcmlhbnQoc3RhdGUsIGdldERhdGFSb3V0ZXJDb25zb2xlRXJyb3IoaG9va05hbWUpKTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gdXNlUm91dGVDb250ZXh0KGhvb2tOYW1lKSB7XG4gIGxldCByb3V0ZSA9IFJlYWN0Mi51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gIGludmFyaWFudChyb3V0ZSwgZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcihob29rTmFtZSkpO1xuICByZXR1cm4gcm91dGU7XG59XG5mdW5jdGlvbiB1c2VDdXJyZW50Um91dGVJZChob29rTmFtZSkge1xuICBsZXQgcm91dGUgPSB1c2VSb3V0ZUNvbnRleHQoaG9va05hbWUpO1xuICBsZXQgdGhpc1JvdXRlID0gcm91dGUubWF0Y2hlc1tyb3V0ZS5tYXRjaGVzLmxlbmd0aCAtIDFdO1xuICBpbnZhcmlhbnQoXG4gICAgdGhpc1JvdXRlLnJvdXRlLmlkLFxuICAgIGAke2hvb2tOYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIHJvdXRlcyB0aGF0IGNvbnRhaW4gYSB1bmlxdWUgXCJpZFwiYFxuICApO1xuICByZXR1cm4gdGhpc1JvdXRlLnJvdXRlLmlkO1xufVxuZnVuY3Rpb24gdXNlUm91dGVJZCgpIHtcbiAgcmV0dXJuIHVzZUN1cnJlbnRSb3V0ZUlkKFwidXNlUm91dGVJZFwiIC8qIFVzZVJvdXRlSWQgKi8pO1xufVxuZnVuY3Rpb24gdXNlTmF2aWdhdGlvbigpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKFwidXNlTmF2aWdhdGlvblwiIC8qIFVzZU5hdmlnYXRpb24gKi8pO1xuICByZXR1cm4gc3RhdGUubmF2aWdhdGlvbjtcbn1cbmZ1bmN0aW9uIHVzZVJldmFsaWRhdG9yKCkge1xuICBsZXQgZGF0YVJvdXRlckNvbnRleHQgPSB1c2VEYXRhUm91dGVyQ29udGV4dChcInVzZVJldmFsaWRhdG9yXCIgLyogVXNlUmV2YWxpZGF0b3IgKi8pO1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUoXCJ1c2VSZXZhbGlkYXRvclwiIC8qIFVzZVJldmFsaWRhdG9yICovKTtcbiAgbGV0IHJldmFsaWRhdGUgPSBSZWFjdDIudXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGRhdGFSb3V0ZXJDb250ZXh0LnJvdXRlci5yZXZhbGlkYXRlKCk7XG4gIH0sIFtkYXRhUm91dGVyQ29udGV4dC5yb3V0ZXJdKTtcbiAgcmV0dXJuIFJlYWN0Mi51c2VNZW1vKFxuICAgICgpID0+ICh7IHJldmFsaWRhdGUsIHN0YXRlOiBzdGF0ZS5yZXZhbGlkYXRpb24gfSksXG4gICAgW3JldmFsaWRhdGUsIHN0YXRlLnJldmFsaWRhdGlvbl1cbiAgKTtcbn1cbmZ1bmN0aW9uIHVzZU1hdGNoZXMoKSB7XG4gIGxldCB7IG1hdGNoZXMsIGxvYWRlckRhdGEgfSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShcbiAgICBcInVzZU1hdGNoZXNcIiAvKiBVc2VNYXRjaGVzICovXG4gICk7XG4gIHJldHVybiBSZWFjdDIudXNlTWVtbyhcbiAgICAoKSA9PiBtYXRjaGVzLm1hcCgobSkgPT4gY29udmVydFJvdXRlTWF0Y2hUb1VpTWF0Y2gobSwgbG9hZGVyRGF0YSkpLFxuICAgIFttYXRjaGVzLCBsb2FkZXJEYXRhXVxuICApO1xufVxuZnVuY3Rpb24gdXNlTG9hZGVyRGF0YSgpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKFwidXNlTG9hZGVyRGF0YVwiIC8qIFVzZUxvYWRlckRhdGEgKi8pO1xuICBsZXQgcm91dGVJZCA9IHVzZUN1cnJlbnRSb3V0ZUlkKFwidXNlTG9hZGVyRGF0YVwiIC8qIFVzZUxvYWRlckRhdGEgKi8pO1xuICByZXR1cm4gc3RhdGUubG9hZGVyRGF0YVtyb3V0ZUlkXTtcbn1cbmZ1bmN0aW9uIHVzZVJvdXRlTG9hZGVyRGF0YShyb3V0ZUlkKSB7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShcInVzZVJvdXRlTG9hZGVyRGF0YVwiIC8qIFVzZVJvdXRlTG9hZGVyRGF0YSAqLyk7XG4gIHJldHVybiBzdGF0ZS5sb2FkZXJEYXRhW3JvdXRlSWRdO1xufVxuZnVuY3Rpb24gdXNlQWN0aW9uRGF0YSgpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKFwidXNlQWN0aW9uRGF0YVwiIC8qIFVzZUFjdGlvbkRhdGEgKi8pO1xuICBsZXQgcm91dGVJZCA9IHVzZUN1cnJlbnRSb3V0ZUlkKFwidXNlTG9hZGVyRGF0YVwiIC8qIFVzZUxvYWRlckRhdGEgKi8pO1xuICByZXR1cm4gc3RhdGUuYWN0aW9uRGF0YSA/IHN0YXRlLmFjdGlvbkRhdGFbcm91dGVJZF0gOiB2b2lkIDA7XG59XG5mdW5jdGlvbiB1c2VSb3V0ZUVycm9yKCkge1xuICBsZXQgZXJyb3IgPSBSZWFjdDIudXNlQ29udGV4dChSb3V0ZUVycm9yQ29udGV4dCk7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShcInVzZVJvdXRlRXJyb3JcIiAvKiBVc2VSb3V0ZUVycm9yICovKTtcbiAgbGV0IHJvdXRlSWQgPSB1c2VDdXJyZW50Um91dGVJZChcInVzZVJvdXRlRXJyb3JcIiAvKiBVc2VSb3V0ZUVycm9yICovKTtcbiAgaWYgKGVycm9yICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmVycm9ycz8uW3JvdXRlSWRdO1xufVxuZnVuY3Rpb24gdXNlQXN5bmNWYWx1ZSgpIHtcbiAgbGV0IHZhbHVlID0gUmVhY3QyLnVzZUNvbnRleHQoQXdhaXRDb250ZXh0KTtcbiAgcmV0dXJuIHZhbHVlPy5fZGF0YTtcbn1cbmZ1bmN0aW9uIHVzZUFzeW5jRXJyb3IoKSB7XG4gIGxldCB2YWx1ZSA9IFJlYWN0Mi51c2VDb250ZXh0KEF3YWl0Q29udGV4dCk7XG4gIHJldHVybi
25114B2YWx1ZT8uX2Vycm9yO1xufVxudmFyIGJsb2NrZXJJZCA9IDA7XG5mdW5jdGlvbiB1c2VCbG9ja2VyKHNob3VsZEJsb2NrKSB7XG4gIGxldCB7IHJvdXRlciwgYmFzZW5hbWUgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0KFwidXNlQmxvY2tlclwiIC8qIFVzZUJsb2NrZXIgKi8pO1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUoXCJ1c2VCbG9ja2VyXCIgLyogVXNlQmxvY2tlciAqLyk7XG4gIGxldCBbYmxvY2tlcktleSwgc2V0QmxvY2tlcktleV0gPSBSZWFjdDIudXNlU3RhdGUoXCJcIik7XG4gIGxldCBibG9ja2VyRnVuY3Rpb24gPSBSZWFjdDIudXNlQ2FsbGJhY2soXG4gICAgKGFyZykgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBzaG91bGRCbG9jayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiAhIXNob3VsZEJsb2NrO1xuICAgICAgfVxuICAgICAgaWYgKGJhc2VuYW1lID09PSBcIi9cIikge1xuICAgICAgICByZXR1cm4gc2hvdWxkQmxvY2soYXJnKTtcbiAgICAgIH1cbiAgICAgIGxldCB7IGN1cnJlbnRMb2NhdGlvbiwgbmV4dExvY2F0aW9uLCBoaXN0b3J5QWN0aW9uIH0gPSBhcmc7XG4gICAgICByZXR1cm4gc2hvdWxkQmxvY2soe1xuICAgICAgICBjdXJyZW50TG9jYXRpb246IHtcbiAgICAgICAgICAuLi5jdXJyZW50TG9jYXRpb24sXG4gICAgICAgICAgcGF0aG5hbWU6IHN0cmlwQmFzZW5hbWUoY3VycmVudExvY2F0aW9uLnBhdGhuYW1lLCBiYXNlbmFtZSkgfHwgY3VycmVudExvY2F0aW9uLnBhdGhuYW1lXG4gICAgICAgIH0sXG4gICAgICAgIG5leHRMb2NhdGlvbjoge1xuICAgICAgICAgIC4uLm5leHRMb2NhdGlvbixcbiAgICAgICAgICBwYXRobmFtZTogc3RyaXBCYXNlbmFtZShuZXh0TG9jYXRpb24ucGF0aG5hbWUsIGJhc2VuYW1lKSB8fCBuZXh0TG9jYXRpb24ucGF0aG5hbWVcbiAgICAgICAgfSxcbiAgICAgICAgaGlzdG9yeUFjdGlvblxuICAgICAgfSk7XG4gICAgfSxcbiAgICBbYmFzZW5hbWUsIHNob3VsZEJsb2NrXVxuICApO1xuICBSZWFjdDIudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQga2V5ID0gU3RyaW5nKCsrYmxvY2tlcklkKTtcbiAgICBzZXRCbG9ja2VyS2V5KGtleSk7XG4gICAgcmV0dXJuICgpID0+IHJvdXRlci5kZWxldGVCbG9ja2VyKGtleSk7XG4gIH0sIFtyb3V0ZXJdKTtcbiAgUmVhY3QyLnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGJsb2NrZXJLZXkgIT09IFwiXCIpIHtcbiAgICAgIHJvdXRlci5nZXRCbG9ja2VyKGJsb2NrZXJLZXksIGJsb2NrZXJGdW5jdGlvbik7XG4gICAgfVxuICB9LCBbcm91dGVyLCBibG9ja2VyS2V5LCBibG9ja2VyRnVuY3Rpb25dKTtcbiAgcmV0dXJuIGJsb2NrZXJLZXkgJiYgc3RhdGUuYmxvY2tlcnMuaGFzKGJsb2NrZXJLZXkpID8gc3RhdGUuYmxvY2tlcnMuZ2V0KGJsb2NrZXJLZXkpIDogSURMRV9CTE9DS0VSO1xufVxuZnVuY3Rpb24gdXNlTmF2aWdhdGVTdGFibGUoKSB7XG4gIGxldCB7IHJvdXRlciB9ID0gdXNlRGF0YVJvdXRlckNvbnRleHQoXCJ1c2VOYXZpZ2F0ZVwiIC8qIFVzZU5hdmlnYXRlU3RhYmxlICovKTtcbiAgbGV0IGlkID0gdXNlQ3VycmVudFJvdXRlSWQoXCJ1c2VOYXZpZ2F0ZVwiIC8qIFVzZU5hdmlnYXRlU3RhYmxlICovKTtcbiAgbGV0IGFjdGl2ZVJlZiA9IFJlYWN0Mi51c2VSZWYoZmFsc2UpO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBhY3RpdmVSZWYuY3VycmVudCA9IHRydWU7XG4gIH0pO1xuICBsZXQgbmF2aWdhdGUgPSBSZWFjdDIudXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHRvLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgIHdhcm5pbmcoYWN0aXZlUmVmLmN1cnJlbnQsIG5hdmlnYXRlRWZmZWN0V2FybmluZyk7XG4gICAgICBpZiAoIWFjdGl2ZVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICBpZiAodHlwZW9mIHRvID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJvdXRlci5uYXZpZ2F0ZSh0byk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCByb3V0ZXIubmF2aWdhdGUodG8sIHsgZnJvbVJvdXRlSWQ6IGlkLCAuLi5vcHRpb25zIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW3JvdXRlciwgaWRdXG4gICk7XG4gIHJldHVybiBuYXZpZ2F0ZTtcbn1cbnZhciBhbHJlYWR5V2FybmVkID0ge307XG5mdW5jdGlvbiB3YXJuaW5nT25jZShrZXksIGNvbmQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kICYmICFhbHJlYWR5V2FybmVkW2tleV0pIHtcbiAgICBhbHJlYWR5V2FybmVkW2tleV0gPSB0cnVlO1xuICAgIHdhcm5pbmcoZmFsc2UsIG1lc3NhZ2UpO1xuICB9XG59XG5cbi8vIGxpYi9jb21wb25lbnRzLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QzIGZyb20gXCJyZWFjdFwiO1xuXG4vLyBsaWIvc2VydmVyLXJ1bnRpbWUvd2FybmluZ3MudHNcbnZhciBhbHJlYWR5V2FybmVkMiA9IHt9O1xuZnVuY3Rpb24gd2Fybk9uY2UoY29uZGl0aW9uLCBtZXNzYWdlKSB7XG4gIGlmICghY29uZGl0aW9uICYmICFhbHJlYWR5V2FybmVkMlttZXNzYWdlXSkge1xuICAgIGFscmVhZHlXYXJuZWQyW21lc3NhZ2VdID0gdHJ1ZTtcbiAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gIH1cbn1cblxuLy8gbGliL2NvbXBvbmVudHMudHN4XG5mdW5jdGlvbiBtYXBSb3V0ZVByb3BlcnRpZXMocm91dGUpIHtcbiAgbGV0IHVwZGF0ZXMgPSB7XG4gICAgLy8gTm90ZTogdGhpcyBjaGVjayBhbHNvIG9jY3VycyBpbiBjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW4gc28gdXBkYXRlXG4gICAgLy8gdGhlcmUgaWYgeW91IGNoYW5nZSB0aGlzIC0tIHBsZWFzZSBhbmQgdGhhbmsgeW91IVxuICAgIGhhc0Vycm9yQm91bmRhcnk6IHJvdXRlLmhhc0Vycm9yQm91bmRhcnkgfHwgcm91dGUuRXJyb3JCb3VuZGFyeSAhPSBudWxsIHx8IHJvdXRlLmVycm9yRWxlbWVudCAhPSBudWxsXG4gIH07XG4gIGlmIChyb3V0ZS5Db21wb25lbnQpIHtcbiAgICBpZiAoRU5BQkxFX0RFVl9XQVJOSU5HUykge1xuICAgICAgaWYgKHJvdXRlLmVsZW1lbnQpIHtcbiAgICAgICAgd2FybmluZyhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBcIllvdSBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBgQ29tcG9uZW50YCBhbmQgYGVsZW1lbnRgIG9uIHlvdXIgcm91dGUgLSBgQ29tcG9uZW50YCB3aWxsIGJlIHVzZWQuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih1cGRhdGVzLCB7XG4gICAgICBlbGVtZW50OiBSZWFjdDMuY3JlYXRlRWxlbWVudChyb3V0ZS5Db21wb25lbnQpLFxuICAgICAgQ29tcG9uZW50OiB2b2lkIDBcbiAgICB9KTtcbiAgfVxuICBpZiAocm91dGUuSHlkcmF0ZUZhbGxiYWNrKSB7XG4gICAgaWYgKEVOQUJMRV9ERVZfV0FSTklOR1MpIHtcbiAgICAgIGlmIChyb3V0ZS5oeWRyYXRlRmFsbGJhY2tFbGVtZW50KSB7XG4gICAgICAgI
25114Hdhcm5pbmcoXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgXCJZb3Ugc2hvdWxkIG5vdCBpbmNsdWRlIGJvdGggYEh5ZHJhdGVGYWxsYmFja2AgYW5kIGBoeWRyYXRlRmFsbGJhY2tFbGVtZW50YCBvbiB5b3VyIHJvdXRlIC0gYEh5ZHJhdGVGYWxsYmFja2Agd2lsbCBiZSB1c2VkLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24odXBkYXRlcywge1xuICAgICAgaHlkcmF0ZUZhbGxiYWNrRWxlbWVudDogUmVhY3QzLmNyZWF0ZUVsZW1lbnQocm91dGUuSHlkcmF0ZUZhbGxiYWNrKSxcbiAgICAgIEh5ZHJhdGVGYWxsYmFjazogdm9pZCAwXG4gICAgfSk7XG4gIH1cbiAgaWYgKHJvdXRlLkVycm9yQm91bmRhcnkpIHtcbiAgICBpZiAoRU5BQkxFX0RFVl9XQVJOSU5HUykge1xuICAgICAgaWYgKHJvdXRlLmVycm9yRWxlbWVudCkge1xuICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFwiWW91IHNob3VsZCBub3QgaW5jbHVkZSBib3RoIGBFcnJvckJvdW5kYXJ5YCBhbmQgYGVycm9yRWxlbWVudGAgb24geW91ciByb3V0ZSAtIGBFcnJvckJvdW5kYXJ5YCB3aWxsIGJlIHVzZWQuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih1cGRhdGVzLCB7XG4gICAgICBlcnJvckVsZW1lbnQ6IFJlYWN0My5jcmVhdGVFbGVtZW50KHJvdXRlLkVycm9yQm91bmRhcnkpLFxuICAgICAgRXJyb3JCb3VuZGFyeTogdm9pZCAwXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZXM7XG59XG52YXIgaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzID0gW1xuICBcIkh5ZHJhdGVGYWxsYmFja1wiLFxuICBcImh5ZHJhdGVGYWxsYmFja0VsZW1lbnRcIlxuXTtcbmZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVJvdXRlcihyb3V0ZXMsIG9wdHMpIHtcbiAgcmV0dXJuIGNyZWF0ZVJvdXRlcih7XG4gICAgYmFzZW5hbWU6IG9wdHM/LmJhc2VuYW1lLFxuICAgIGdldENvbnRleHQ6IG9wdHM/LmdldENvbnRleHQsXG4gICAgZnV0dXJlOiBvcHRzPy5mdXR1cmUsXG4gICAgaGlzdG9yeTogY3JlYXRlTWVtb3J5SGlzdG9yeSh7XG4gICAgICBpbml0aWFsRW50cmllczogb3B0cz8uaW5pdGlhbEVudHJpZXMsXG4gICAgICBpbml0aWFsSW5kZXg6IG9wdHM/LmluaXRpYWxJbmRleFxuICAgIH0pLFxuICAgIGh5ZHJhdGlvbkRhdGE6IG9wdHM/Lmh5ZHJhdGlvbkRhdGEsXG4gICAgcm91dGVzLFxuICAgIGh5ZHJhdGlvblJvdXRlUHJvcGVydGllcyxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXMsXG4gICAgZGF0YVN0cmF0ZWd5OiBvcHRzPy5kYXRhU3RyYXRlZ3ksXG4gICAgcGF0Y2hSb3V0ZXNPbk5hdmlnYXRpb246IG9wdHM/LnBhdGNoUm91dGVzT25OYXZpZ2F0aW9uXG4gIH0pLmluaXRpYWxpemUoKTtcbn1cbnZhciBEZWZlcnJlZCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zdGF0dXMgPSBcInBlbmRpbmdcIjtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmUgPSAodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSBcInBlbmRpbmdcIikge1xuICAgICAgICAgIHRoaXMuc3RhdHVzID0gXCJyZXNvbHZlZFwiO1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5yZWplY3QgPSAocmVhc29uKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gXCJwZW5kaW5nXCIpIHtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IFwicmVqZWN0ZWRcIjtcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNoYWxsb3dEaWZmKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGFLZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gIGxldCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKGxldCBrZXkgb2YgYUtleXMpIHtcbiAgICBpZiAoYVtrZXldICE9PSBiW2tleV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBVTlNUQUJMRV9UcmFuc2l0aW9uRW5hYmxlZFJvdXRlclByb3ZpZGVyKHtcbiAgcm91dGVyLFxuICBmbHVzaFN5bmM6IHJlYWN0RG9tRmx1c2hTeW5jSW1wbCxcbiAgdW5zdGFibGVfb25FcnJvclxufSkge1xuICBsZXQgZmV0Y2hlckRhdGEgPSBSZWFjdDMudXNlUmVmKC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpO1xuICBsZXQgW3JldmFsaWRhdGluZywgc3RhcnRSZX
25114ZhbGlkYXRpb25dID0gUmVhY3QzLnVzZVRyYW5zaXRpb24oKTtcbiAgbGV0IFtzdGF0ZSwgc2V0U3RhdGVdID0gUmVhY3QzLnVzZVN0YXRlKHJvdXRlci5zdGF0ZSk7XG4gIHJvdXRlci5fX3NldFBlbmRpbmdSZXJlbmRlciA9IChwcm9taXNlKSA9PiBzdGFydFJldmFsaWRhdGlvbihcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbmVlZCByZWFjdCAxOSB0eXBlcyBmb3IgdGhpcyB0byBiZSBhc3luY1xuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcmVuZGVyID0gYXdhaXQgcHJvbWlzZTtcbiAgICAgIHN0YXJ0UmV2YWxpZGF0aW9uKCgpID0+IHtcbiAgICAgICAgcmVyZW5kZXIoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgKTtcbiAgbGV0IG5hdmlnYXRvciA9IFJlYWN0My51c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY3JlYXRlSHJlZjogcm91dGVyLmNyZWF0ZUhyZWYsXG4gICAgICBlbmNvZGVMb2NhdGlvbjogcm91dGVyLmVuY29kZUxvY2F0aW9uLFxuICAgICAgZ286IChuKSA9PiByb3V0ZXIubmF2aWdhdGUobiksXG4gICAgICBwdXNoOiAodG8sIHN0YXRlMiwgb3B0cykgPT4gcm91dGVyLm5hdmlnYXRlKHRvLCB7XG4gICAgICAgIHN0YXRlOiBzdGF0ZTIsXG4gICAgICAgIHByZXZlbnRTY3JvbGxSZXNldDogb3B0cz8ucHJldmVudFNjcm9sbFJlc2V0XG4gICAgICB9KSxcbiAgICAgIHJlcGxhY2U6ICh0bywgc3RhdGUyLCBvcHRzKSA9PiByb3V0ZXIubmF2aWdhdGUodG8sIHtcbiAgICAgICAgcmVwbGFjZTogdHJ1ZSxcbiAgICAgICAgc3RhdGU6IHN0YXRlMixcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBvcHRzPy5wcmV2ZW50U2Nyb2xsUmVzZXRcbiAgICAgIH0pXG4gICAgfTtcbiAgfSwgW3JvdXRlcl0pO1xuICBsZXQgYmFzZW5hbWUgPSByb3V0ZXIuYmFzZW5hbWUgfHwgXCIvXCI7XG4gIGxldCBkYXRhUm91dGVyQ29udGV4dCA9IFJlYWN0My51c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICByb3V0ZXIsXG4gICAgICBuYXZpZ2F0b3IsXG4gICAgICBzdGF0aWM6IGZhbHNlLFxuICAgICAgYmFzZW5hbWUsXG4gICAgICB1bnN0YWJsZV9vbkVycm9yXG4gICAgfSksXG4gICAgW3JvdXRlciwgbmF2aWdhdG9yLCBiYXNlbmFtZSwgdW5zdGFibGVfb25FcnJvcl1cbiAgKTtcbiAgUmVhY3QzLnVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuIHJvdXRlci5zdWJzY3JpYmUoXG4gICAgICAobmV3U3RhdGUsIHsgZGVsZXRlZEZldGNoZXJzLCBmbHVzaFN5bmMsIHZpZXdUcmFuc2l0aW9uT3B0cyB9KSA9PiB7XG4gICAgICAgIG5ld1N0YXRlLmZldGNoZXJzLmZvckVhY2goKGZldGNoZXIsIGtleSkgPT4ge1xuICAgICAgICAgIGlmIChmZXRjaGVyLmRhdGEgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgZmV0Y2hlckRhdGEuY3VycmVudC5zZXQoa2V5LCBmZXRjaGVyLmRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRlbGV0ZWRGZXRjaGVycy5mb3JFYWNoKChrZXkpID0+IGZldGNoZXJEYXRhLmN1cnJlbnQuZGVsZXRlKGtleSkpO1xuICAgICAgICBjb25zdCBkaWZmID0gc2hhbGxvd0RpZmYoc3RhdGUsIG5ld1N0YXRlKTtcbiAgICAgICAgaWYgKCFkaWZmKSByZXR1cm47XG4gICAgICAgIGlmIChmbHVzaFN5bmMpIHtcbiAgICAgICAgICBpZiAocmVhY3REb21GbHVzaFN5bmNJbXBsKSB7XG4gICAgICAgICAgICByZWFjdERvbUZsdXNoU3luY0ltcGwoKCkgPT4gc2V0U3RhdGUobmV3U3RhdGUpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBSZWFjdDMuc3RhcnRUcmFuc2l0aW9uKCgpID0+IHtcbiAgICAgICAgICAgIHNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH0sIFtyb3V0ZXIsIHJlYWN0RG9tRmx1c2hTeW5jSW1wbCwgc3RhdGVdKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChSZWFjdDMuRnJhZ21lbnQsIG51bGwsIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChEYXRhUm91dGVyQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogZGF0YVJvdXRlckNvbnRleHQgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFxuICAgIERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQuUHJvdmlkZXIsXG4gICAge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHJldmFsaWRhdGlvbjogcmV2YWxpZGF0aW5nID8gXCJsb2FkaW5nXCIgOiBzdGF0ZS5yZXZhbGlkYXRpb25cbiAgICAgIH1cbiAgICB9LFxuICAgIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChGZXRjaGVyc0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGZldGNoZXJEYXRhLmN1cnJlbnQgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFxuICAgICAgUm91dGVyLFxuICAgICAge1xuICAgICAgICBiYXNlbmFtZSxcbiAgICAgICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgICBuYXZpZ2F0aW9uVHlwZTogc3RhdGUuaGlzdG9yeUFjdGlvbixcbiAgICAgICAgbmF2aWdhdG9yXG4gICAgICB9LFxuICAgICAgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFxuICAgICAgICBNZW1vaXplZERhdGFSb3V0ZXMsXG4gICAgICAgIHtcbiAgICAgICAgICByb3V0ZXM6IHJvdXRlci5yb3V0ZXMsXG4gICAgICAgICAgZnV0dXJlOiByb3V0ZXIuZnV0dXJlLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIHVuc3RhYmxlX29uRXJyb3JcbiAgICAgICAgfVxuICAgICAgKVxuICAgICkpXG4gICkpLCBudWxsKTtcbn1cbmZ1bmN0aW9uIFJvdXRlclByb3ZpZGVyKHtcbiAgcm91dGVyLFxuICBmbHVzaFN5bmM6IHJlYWN0RG9tRmx1c2hTeW5jSW1wbCxcbiAgdW5zdGFibGVfb25FcnJvclxufSkge1xuICBsZXQgW3N0YXRlLCBzZXRTdGF0ZUltcGxdID0gUmVhY3QzLnVzZVN0YXRlKHJvdXRlci5zdGF0ZSk7XG4gIGxldCBbcGVuZGluZ1N0YXRlLCBzZXRQZW5kaW5nU3RhdGVdID0gUmVhY3QzLnVzZVN0YXRlKCk7XG4gIGxldCBbdnRDb250ZXh0LCBzZXRWdENvbnRleHRdID0gUmVhY3QzLnVzZVN0YXRlKHtcbiAgICBpc1RyYW5zaXRpb25pbmc6IGZhbHNlXG4gI
25114H0pO1xuICBsZXQgW3JlbmRlckRmZCwgc2V0UmVuZGVyRGZkXSA9IFJlYWN0My51c2VTdGF0ZSgpO1xuICBsZXQgW3RyYW5zaXRpb24sIHNldFRyYW5zaXRpb25dID0gUmVhY3QzLnVzZVN0YXRlKCk7XG4gIGxldCBbaW50ZXJydXB0aW9uLCBzZXRJbnRlcnJ1cHRpb25dID0gUmVhY3QzLnVzZVN0YXRlKCk7XG4gIGxldCBmZXRjaGVyRGF0YSA9IFJlYWN0My51c2VSZWYoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSk7XG4gIGxldCBsb2dFcnJvcnNBbmRTZXRTdGF0ZSA9IFJlYWN0My51c2VDYWxsYmFjayhcbiAgICAobmV3U3RhdGUpID0+IHtcbiAgICAgIHNldFN0YXRlSW1wbCgocHJldlN0YXRlKSA9PiB7XG4gICAgICAgIGlmIChuZXdTdGF0ZS5lcnJvcnMgJiYgdW5zdGFibGVfb25FcnJvcikge1xuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG5ld1N0YXRlLmVycm9ycykuZm9yRWFjaCgoW3JvdXRlSWQsIGVycm9yXSkgPT4ge1xuICAgICAgICAgICAgaWYgKHByZXZTdGF0ZS5lcnJvcnM/Lltyb3V0ZUlkXSAhPT0gZXJyb3IpIHtcbiAgICAgICAgICAgICAgdW5zdGFibGVfb25FcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBbdW5zdGFibGVfb25FcnJvcl1cbiAgKTtcbiAgbGV0IHNldFN0YXRlID0gUmVhY3QzLnVzZUNhbGxiYWNrKFxuICAgIChuZXdTdGF0ZSwgeyBkZWxldGVkRmV0Y2hlcnMsIGZsdXNoU3luYywgdmlld1RyYW5zaXRpb25PcHRzIH0pID0+IHtcbiAgICAgIG5ld1N0YXRlLmZldGNoZXJzLmZvckVhY2goKGZldGNoZXIsIGtleSkgPT4ge1xuICAgICAgICBpZiAoZmV0Y2hlci5kYXRhICE9PSB2b2lkIDApIHtcbiAgICAgICAgICBmZXRjaGVyRGF0YS5jdXJyZW50LnNldChrZXksIGZldGNoZXIuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZGVsZXRlZEZldGNoZXJzLmZvckVhY2goKGtleSkgPT4gZmV0Y2hlckRhdGEuY3VycmVudC5kZWxldGUoa2V5KSk7XG4gICAgICB3YXJuT25jZShcbiAgICAgICAgZmx1c2hTeW5jID09PSBmYWxzZSB8fCByZWFjdERvbUZsdXNoU3luY0ltcGwgIT0gbnVsbCxcbiAgICAgICAgJ1lvdSBwcm92aWRlZCB0aGUgYGZsdXNoU3luY2Agb3B0aW9uIHRvIGEgcm91dGVyIHVwZGF0ZSwgYnV0IHlvdSBhcmUgbm90IHVzaW5nIHRoZSBgPFJvdXRlclByb3ZpZGVyPmAgZnJvbSBgcmVhY3Qtcm91dGVyL2RvbWAgc28gYFJlYWN0RE9NLmZsdXNoU3luYygpYCBpcyB1bmF2YWlsYWJsZS4gIFBsZWFzZSB1cGRhdGUgeW91ciBhcHAgdG8gYGltcG9ydCB7IFJvdXRlclByb3ZpZGVyIH0gZnJvbSBcInJlYW
25114N0LXJvdXRlci9kb21cImAgYW5kIGVuc3VyZSB5b3UgaGF2ZSBgcmVhY3QtZG9tYCBpbnN0YWxsZWQgYXMgYSBkZXBlbmRlbmN5IHRvIHVzZSB0aGUgYGZsdXNoU3luY2Agb3B0aW9uLidcbiAgICAgICk7XG4gICAgICBsZXQgaXNWaWV3VHJhbnNpdGlvbkF2YWlsYWJsZSA9IHJvdXRlci53aW5kb3cgIT0gbnVsbCAmJiByb3V0ZXIud2luZG93LmRvY3VtZW50ICE9IG51bGwgJiYgdHlwZW9mIHJvdXRlci53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbiA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgd2Fybk9uY2UoXG4gICAgICAgIHZpZXdUcmFuc2l0aW9uT3B0cyA9PSBudWxsIHx8IGlzVmlld1RyYW5zaXRpb25BdmFpbGFibGUsXG4gICAgICAgIFwiWW91IHByb3ZpZGVkIHRoZSBgdmlld1RyYW5zaXRpb25gIG9wdGlvbiB0byBhIHJvdXRlciB1cGRhdGUsIGJ1dCB5b3UgZG8gbm90IGFwcGVhciB0byBiZSBydW5uaW5nIGluIGEgRE9NIGVudmlyb25tZW50IGFzIGB3aW5kb3cuc3RhcnRWaWV3VHJhbnNpdGlvbmAgaXMgbm90IGF2YWlsYWJsZS5cIlxuICAgICAgKTtcbiAgICAgIGlmICghdmlld1RyYW5zaXRpb25PcHRzIHx8ICFpc1ZpZXdUcmFuc2l0aW9uQXZhaWxhYmxlKSB7XG4gICAgICAgIGlmIChyZWFjdERvbUZsdXNoU3luY0ltcGwgJiYgZmx1c2hTeW5jKSB7XG4gICAgICAgICAgcmVhY3REb21GbHVzaFN5bmNJbXBsKCgpID0+IGxvZ0Vycm9yc0FuZFNldFN0YXRlKG5ld1N0YXRlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgUmVhY3QzLnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBsb2dFcnJvcnNBbmRTZXRTdGF0ZShuZXdTdGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyZWFjdERvbUZsdXNoU3luY0ltcGwgJiYgZmx1c2hTeW5jKSB7XG4gICAgICAgIHJlYWN0RG9tRmx1c2hTeW5jSW1wbCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIHJlbmRlckRmZCAmJiByZW5kZXJEZmQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgdHJhbnNpdGlvbi5za2lwVHJhbnNpdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRWdENvbnRleHQoe1xuICAgICAgICAgICAgaXNUcmFuc2l0aW9uaW5nOiB0cnVlLFxuICAgICAgICAgICAgZmx1c2hTeW5jOiB0cnVlLFxuICAgICAgICAgICAgY3VycmVudExvY2F0aW9uOiB2aWV3VHJhbnNpdGlvbk9wdHMuY3VycmVudExvY2F0aW9uLFxuICAgICAgICAgICAgbmV4dExvY2F0aW9uOiB2aWV3VHJhbnNpdGlvbk9wdHMubmV4dExvY2F0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgdCA9IHJvdXRlci53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKSA9PiB7XG4gICAgICAgICAgcmVhY3REb21GbHVzaFN5bmNJbXBsKCgpID0+IGxvZ0Vycm9yc0FuZFNldFN0YXRlKG5ld1N0YXRlKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0LmZpbmlzaGVkLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIHJlYWN0RG9tRmx1c2hTeW5jSW1wbCgoKSA9PiB7XG4gICAgICAgICAgICBzZXRSZW5kZXJEZmQodm9pZCAwKTtcbiAgICAgICAgICAgIHNldFRyYW5zaXRpb24odm9pZCAwKTtcbiAgICAgICAgICAgIHNldFBlbmRpbmdTdGF0ZSh2b2lkIDApO1xuICAgICAgICAgICAgc2V0VnRDb250ZXh0KHsgaXNUcmFuc2l0aW9uaW5nOiBmYWxzZSB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWN0RG9tRmx1c2hTeW5jSW1wbCgoKSA9PiBzZXRUcmFuc2l0aW9uKHQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgcmVuZGVyRGZkICYmIHJlbmRlckRmZC5yZXNvbHZlKCk7XG4gICAgICAgIHRyYW5zaXRpb24uc2tpcFRyYW5zaXRpb24oKTtcbiAgICAgICAgc2V0SW50ZXJydXB0aW9uKHtcbiAgICAgICAgICBzdGF0ZTogbmV3U3RhdGUsXG4gICAgICAgICAgY3VycmVudExvY2F0aW9uOiB2aWV3VHJhbnNpdGlvbk9wdHMuY3VycmVudExvY2F0aW9uLFxuICAgICAgICAgIG5leHRMb2NhdGlvbjogdmlld1RyYW5zaXRpb25PcHRzLm5leHRMb2NhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFBlbmRpbmdTdGF0ZShuZXdTdGF0ZSk7XG4gICAgICAgIHNldFZ0Q29udGV4dCh7XG4gICAgICAgICAgaXNUcmFuc2l0aW9uaW5nOiB0cnVlLFxuICAgICAgICAgIGZsdXNoU3luYzogZmFsc2UsXG4gICAgICAgICAgY3VycmVudExvY2F0aW9uOiB2aWV3VHJhbnNpdGlvbk9wdHMuY3VycmVudExvY2F0aW9uLFxuICAgICAgICAgIG5leHRMb2NhdGlvbjogdmlld1RyYW5zaXRpb25PcHRzLm5leHRMb2NhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIHJvdXRlci53aW5kb3csXG4gICAgICByZWFjdERvbUZsdXNoU3luY0ltcGwsXG4gICAgICB0cmFuc2l0aW9uLFxuICAgICAgcmVuZGVyRGZkLFxuICAgICAgbG9nRXJyb3JzQW5kU2V0U3RhdGVcbiAgICBdXG4gICk7XG4gIFJlYWN0My51c2VMYXlvdXRFZmZlY3QoKCkgPT4gcm91dGVyLnN1YnNjcmliZShzZXRTdGF0ZSksIFtyb3V0ZXIsIHNldFN0YXRlXSk7XG4gIFJlYWN0My51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh2dENvbnRleHQuaXNUcmFuc2l0aW9uaW5nICYmICF2dENvbnRleHQuZmx1c2hTeW5jKSB7XG4gICAgICBzZXRSZW5kZXJEZmQobmV3IERlZmVycmVkKCkpO1xuICAgIH1cbiAgfSwgW3Z0Q29udGV4dF0pO1xuICBSZWFjdDMudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocmVuZGVyRGZkICYmIHBlbmRpbmdTdGF0ZSAmJiByb3V0ZXIud2luZG93KSB7XG4gICAgICBsZXQgbmV3U3RhdGUgPSBwZW5kaW5nU3RhdGU7XG4gICAgICBsZXQgcmVuZGVyUHJvbWlzZSA9IHJlbmRlckRmZC5wcm9taXNlO1xuICAgICAgbGV0IHRyYW5zaXRpb24yID0gcm91dGVyLndpbmRvdy5kb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgUmVhY3QzLnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBsb2dFcnJvcnNBbmRTZXRTdGF0ZShuZXdTdGF0ZSkpO1xuICAgICAgICBhd2FpdCByZW5kZXJQcm9taXNlO1xuICAgICAgfSk7XG4gICAgICB0cmFuc2l0aW9uMi5maW5pc2hlZC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgc2V0UmVuZGVyRGZkKHZvaWQgMCk7XG4gICAgICAgI
25114HNldFRyYW5zaXRpb24odm9pZCAwKTtcbiAgICAgICAgc2V0UGVuZGluZ1N0YXRlKHZvaWQgMCk7XG4gICAgICAgIHNldFZ0Q29udGV4dCh7IGlzVHJhbnNpdGlvbmluZzogZmFsc2UgfSk7XG4gICAgICB9KTtcbiAgICAgIHNldFRyYW5zaXRpb24odHJhbnNpdGlvbjIpO1xuICAgIH1cbiAgfSwgW3BlbmRpbmdTdGF0ZSwgcmVuZGVyRGZkLCByb3V0ZXIud2luZG93LCBsb2dFcnJvcnNBbmRTZXRTdGF0ZV0pO1xuICBSZWFjdDMudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocmVuZGVyRGZkICYmIHBlbmRpbmdTdGF0ZSAmJiBzdGF0ZS5sb2NhdGlvbi5rZXkgPT09IHBlbmRpbmdTdGF0ZS5sb2NhdGlvbi5rZXkpIHtcbiAgICAgIHJlbmRlckRmZC5yZXNvbHZlKCk7XG4gICAgfVxuICB9LCBbcmVuZGVyRGZkLCB0cmFuc2l0aW9uLCBzdGF0ZS5sb2NhdGlvbiwgcGVuZGluZ1N0YXRlXSk7XG4gIFJlYWN0My51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghdnRDb250ZXh0LmlzVHJhbnNpdGlvbmluZyAmJiBpbnRlcnJ1cHRpb24pIHtcbiAgICAgIHNldFBlbmRpbmdTdGF0ZShpbnRlcnJ1cHRpb24uc3RhdGUpO1xuICAgICAgc2V0VnRDb250ZXh0KHtcbiAgICAgICAgaXNUcmFuc2l0aW9uaW5nOiB0cnVlLFxuICAgICAgICBmbHVzaFN5bmM6IGZhbHNlLFxuICAgICAgICBjdXJyZW50TG9jYXRpb246IGludGVycnVwdGlvbi5jdXJyZW50TG9jYXRpb24sXG4gICAgICAgIG5leHRMb2NhdGlvbjogaW50ZXJydXB0aW9uLm5leHRMb2NhdGlvblxuICAgICAgfSk7XG4gICAgICBzZXRJbnRlcnJ1cHRpb24odm9pZCAwKTtcbiAgICB9XG4gIH0sIFt2dENvbnRleHQuaXNUcmFuc2l0aW9uaW5nLCBpbnRlcnJ1cHRpb25dKTtcbiAgbGV0IG5hdmlnYXRvciA9IFJlYWN0My51c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY3JlYXRlSHJlZjogcm91dGVyLmNyZWF0ZUhyZWYsXG4gICAgICBlbmNvZGVMb2NhdGlvbjogcm91dGVyLmVuY29kZUxvY2F0aW9uLFxuICAgICAgZ286IChuKSA9PiByb3V0ZXIubmF2aWdhdGUobiksXG4gICAgICBwdXNoOiAodG8sIHN0YXRlMiwgb3B0cykgPT4gcm91dGVyLm5hdmlnYXRlKHRvLCB7XG4gICAgICAgIHN0YXRlOiBzdGF0ZTIsXG4gICAgICAgIHByZXZlbnRTY3JvbGxSZXNldDogb3B0cz8ucHJldmVudFNjcm9sbFJlc2V0XG4gICAgICB9KSxcbiAgICAgIHJlcGxhY2U6ICh0bywgc3RhdGUyLCBvcHRzKSA9PiByb3V0ZXIubmF2aWdhdGUodG8sIHtcbiAgICAgICAgcmVwbGFjZTogdHJ1ZSxcbiAgICAgICAgc3RhdGU6IHN0YXRlMixcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBvcHRzPy5wcmV2ZW50U2Nyb2xsUmVzZXRcbiAgICAgIH0pXG4gICAgfTtcbiAgfSwgW3JvdXRlcl0pO1xuICBsZXQgYmFzZW5hbWUgPSByb3V0ZXIuYmFzZW5hbWUgfHwgXCIvXCI7XG4gIGxldCBkYXRhUm91dGVyQ29udGV4dCA9IFJlYWN0My51c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICByb3V0ZXIsXG4gICAgICBuYXZpZ2F0b3IsXG4gICAgICBzdGF0aWM6IGZhbHNlLFxuICAgICAgYmFzZW5hbWUsXG4gICAgICB1bnN0YWJsZV9vbkVycm9yXG4gICAgfSksXG4gICAgW3JvdXRlciwgbmF2aWdhdG9yLCBiYXNlbmFtZSwgdW5zdGFibGVfb25FcnJvcl1cbiAgKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChSZWFjdDMuRnJhZ21lbnQsIG51bGwsIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChEYXRhUm91dGVyQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogZGF0YVJvdXRlckNvbnRleHQgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHN0YXRlIH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChGZXRjaGVyc0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGZldGNoZXJEYXRhLmN1cnJlbnQgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFZpZXdUcmFuc2l0aW9uQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogdnRDb250ZXh0IH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChcbiAgICBSb3V0ZXIsXG4gICAge1xuICAgICAgYmFzZW5hbWUsXG4gICAgICBsb2NhdGlvbjogc3RhdGUubG9jYXRpb24sXG4gICAgICBuYXZpZ2F0aW9uVHlwZTogc3RhdGUuaGlzdG9yeUFjdGlvbixcbiAgICAgIG5hdmlnYXRvclxuICAgIH0sXG4gICAgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFxuICAgICAgTWVtb2l6ZWREYXRhUm91dGVzLFxuICAgICAge1xuICAgICAgICByb3V0ZXM6IHJvdXRlci5yb3V0ZXMsXG4gICAgICAgIGZ1dHVyZTogcm91dGVyLmZ1dHVyZSxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHVuc3RhYmxlX29uRXJyb3JcbiAgICAgIH1cbiAgICApXG4gICkpKSkpLCBudWxsKTtcbn1cbnZhciBNZW1vaXplZERhdGFSb3V0ZXMgPSBSZWFjdDMubWVtbyhEYXRhUm91dGVzKTtcbmZ1bmN0aW9uIERhdGFSb3V0ZXMoe1xuICByb3V0ZXMsXG4gIGZ1dHVyZSxcbiAgc3RhdGUsXG4gIHVuc3RhYmxlX29uRXJyb3Jcbn0pIHtcbiAgcmV0dXJuIHVzZVJvdXRlc0ltcGwocm91dGVzLCB2b2lkIDAsIHN0YXRlLCB1bnN0YWJsZV9vbkVycm9yLCBmdXR1cmUpO1xufVxuZnVuY3Rpb24gTWVtb3J5Um91dGVyKHtcbiAgYmFzZW5hbWUsXG4gIGNoaWxkcmVuLFxuICBpbml0aWFsRW50cmllcyxcbiAgaW5pdGlhbEluZGV4XG59KSB7XG4gIGxldCBoaXN0b3J5UmVmID0gUmVhY3QzLnVzZVJlZigpO1xuICBpZiAoaGlzdG9yeVJlZi5jdXJyZW50ID09IG51bGwpIHtcbiAgICBoaXN0b3J5UmVmLmN1cnJlbnQgPSBjcmVhdGVNZW1vcnlIaXN0b3J5KHtcbiAgICAgIGluaXRpYWxFbnRyaWVzLFxuICAgICAgaW5pdGlhbEluZGV4LFxuICAgICAgdjVDb21wYXQ6IHRydWVcbiAgICB9KTtcbiAgfVxuICBsZXQgaGlzdG9yeSA9IGhpc3RvcnlSZWYuY3VycmVudDtcbiAgbGV0IFtzdGF0ZSwgc2V0U3RhdGVJbXBsXSA9IFJlYWN0My51c2VTdGF0ZSh7XG4gICAgYWN0aW9uOiBoaXN0b3J5LmFjdGlvbixcbiAgICBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvblxuICB9KTtcbiAgbGV0IHNldFN0YXRlID0gUmVhY3QzLnVzZUNhbGxiYWNrKFxuICAgIChuZXdTdGF0ZSkgPT4ge1xuICAgICAgUmVhY3QzLnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpKTtcbiAgICB9LFxuICAgIFtzZXRTdGF0ZUltcGxdXG4gICk7XG4gIFJlYWN0My51c2VMYXlvdXRFZmZlY3QoKCkgPT4gaGlzdG9yeS5saXN0ZW4oc2V0U3RhdGUpLCBbaGlzdG9yeSwgc2V0U3RhdGVdKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChcbiAgICBSb3V0ZXIsXG4gICAge1xuICAgICAgYmFzZW5hbWUsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGxvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICAgIG5hdmlnYXRpb25UeXBlOiBzdGF0ZS5hY3Rpb24sXG4gICAgICBuYXZpZ2F0b3I6IGhpc3RvcnlcbiAgICB9XG4gICk7XG59XG5mdW5jdGlvbiBOYXZpZ2F0ZSh7XG4gIHRvLFxuICByZXBsYWNlOiByZXBsYWNlMixcbiAgc3RhdGUsXG4gIHJlbGF0aXZlXG59KSB7XG4gIGludmFyaWFudChcbiAgICB1c2VJblJvdXRlckNvbnRleHQoKSxcbiAgICAvLyBUT0RPOiBUaGlzIGVycm9yIGlzIHByb2JhYmx5IGJlY2F1c2UgdGhleSBzb21laG93IGhhdmUgMiB2ZXJzaW9ucyBvZlxuICAgIC8vIHRoZSByb3V0ZXIgbG9hZGVkLiBXZSBjYW4gaGVscCB0aGVtIHVuZGVyc3RhbmQgaG93IHRvIGF2b2lkIHRoYXQuXG4gICAgYDxOYXZpZ2F0ZT4gbWF5IGJlIHVzZWQgb25seSBpbiB0aGUgY29udGV4dCBvZiBhIDxSb3V0ZXI+IGNvbXBvbmVudC5gXG4gICk7XG4gIGxldCB7IHN0YXRpYzogaXNTdGF0aWMgfSA9IFJlYWN0My51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgd2FybmluZyhcbiAgICAhaXNTdGF0aWMsXG4gICAgYDxOYXZpZ2F0ZT4gbXVzdCBub3QgYmUgdXNlZCBvbiB0aGUgaW5pdGlhbCByZW5kZXIgaW4gYSA8U3RhdGljUm91dGVyPi4gVGhpcyBpcyBh
25114IG5vLW9wLCBidXQgeW91IHNob3VsZCBtb2RpZnkgeW91ciBjb2RlIHNvIHRoZSA8TmF2aWdhdGU+IGlzIG9ubHkgZXZlciByZW5kZXJlZCBpbiByZXNwb25zZSB0byBzb21lIHVzZXIgaW50ZXJhY3Rpb24gb3Igc3RhdGUgY2hhbmdlLmBcbiAgKTtcbiAgbGV0IHsgbWF0Y2hlcyB9ID0gUmVhY3QzLnVzZUNvbnRleHQoUm91dGVDb250ZXh0KTtcbiAgbGV0IHsgcGF0aG5hbWU6IGxvY2F0aW9uUGF0aG5hbWUgfSA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XG4gIGxldCBwYXRoID0gcmVzb2x2ZVRvKFxuICAgIHRvLFxuICAgIGdldFJlc29sdmVUb01hdGNoZXMobWF0Y2hlcyksXG4gICAgbG9jYXRpb25QYXRobmFtZSxcbiAgICByZWxhdGl2ZSA9PT0gXCJwYXRoXCJcbiAgKTtcbiAgbGV0IGpzb25QYXRoID0gSlNPTi5zdHJpbmdpZnkocGF0aCk7XG4gIFJlYWN0My51c2VFZmZlY3QoKCkgPT4ge1xuICAgIG5hdmlnYXRlKEpTT04ucGFyc2UoanNvblBhdGgpLCB7IHJlcGxhY2U6IHJlcGxhY2UyLCBzdGF0ZSwgcmVsYXRpdmUgfSk7XG4gIH0sIFtuYXZpZ2F0ZSwganNvblBhdGgsIHJlbGF0aXZlLCByZXBsYWNlMiwgc3RhdGVdKTtcbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBPdXRsZXQocHJvcHMpIHtcbiAgcmV0dXJuIHVzZU91dGxldChwcm9wcy5jb250ZXh0KTtcbn1cbmZ1bmN0aW9uIFJvdXRlKHByb3BzKSB7XG4gIGludmFyaWFudChcbiAgICBmYWxzZSxcbiAgICBgQSA8Um91dGU+IGlzIG9ubHkgZXZlciB0byBiZSB1c2VkIGFzIHRoZSBjaGlsZCBvZiA8Um91dGVzPiBlbGVtZW50LCBuZXZlciByZW5kZXJlZCBkaXJlY3RseS4gUGxlYXNlIHdyYXAgeW91ciA8Um91dGU+IGluIGEgPFJvdXRlcz4uYFxuICApO1xufVxuZnVuY3Rpb24gUm91dGVyKHtcbiAgYmFzZW5hbWU6IGJhc2VuYW1lUHJvcCA9IFwiL1wiLFxuICBjaGlsZHJlbiA9IG51bGwsXG4gIGxvY2F0aW9uOiBsb2NhdGlvblByb3AsXG4gIG5hdmlnYXRpb25UeXBlID0gXCJQT1BcIiAvKiBQb3AgKi8sXG4gIG5hdmlnYXRvcixcbiAgc3RhdGljOiBzdGF0aWNQcm9wID0gZmFsc2Vcbn0pIHtcbiAgaW52YXJpYW50KFxuICAgICF1c2VJblJvdXRlckNvbnRleHQoKSxcbiAgICBgWW91IGNhbm5vdCByZW5kZXIgYSA8Um91dGVyPiBpbnNpZGUgYW5vdGhlciA8Um91dGVyPi4gWW91IHNob3VsZCBuZXZlciBoYXZlIG1vcmUgdGhhbiBvbmUgaW4geW91ciBhcHAuYFxuICApO1xuICBsZXQgYmFzZW5hbWUgPSBiYXNlbmFtZVByb3AucmVwbGFjZSgvXlxcLyovLCBcIi9cIik7XG4gIGxldCBuYXZpZ2F0aW9uQ29udGV4dCA9IFJlYWN0My51c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBiYXNlbmFtZSxcbiAgICAgIG5hdmlnYXRvcixcbiAgICAgIHN0YXRpYzogc3RhdGljUHJvcCxcbiAgICAgIGZ1dHVyZToge31cbiAgICB9KSxcbiAgICBbYmFzZW5hbWUsIG5hdmlnYXRvciwgc3RhdGljUHJvcF1cbiAgKTtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvblByb3AgPT09IFwic3RyaW5nXCIpIHtcbiAgICBsb2NhdGlvblByb3AgPSBwYXJzZVBhdGgobG9jYXRpb25Qcm9wKTtcbiAgfVxuICBsZXQge1xuICAgIHBhdGhuYW1lID0gXCIvXCIsXG4gICAgc2VhcmNoID0gXCJcIixcbiAgICBoYXNoID0gXCJcIixcbiAgICBzdGF0ZSA9IG51bGwsXG4gICAga2V5ID0gXCJkZWZhdWx0XCJcbiAgfSA9IGxvY2F0aW9uUHJvcDtcbiAgbGV0IGxvY2F0aW9uQ29udGV4dCA9IFJlYWN0My51c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgdHJhaWxpbmdQYXRobmFtZSA9IHN0cmlwQmFzZW5hbWUocGF0aG5hbWUsIGJhc2VuYW1lKTtcbiAgICBpZiAodHJhaWxpbmdQYXRobmFtZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgIHBhdGhuYW1lOiB0cmFpbGluZ1BhdGhuYW1lLFxuICAgICAgICBzZWFyY2gsXG4gICAgICAgIGhhc2gsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBrZXlcbiAgICAgIH0sXG4gICAgICBuYXZpZ2F0aW9uVHlwZVxuICAgIH07XG4gIH0sIFtiYXNlbmFtZSwgcGF0aG5hbWUsIHNlYXJjaCwgaGFzaCwgc3RhdGUsIGtleSwgbmF2aWdhdGlvblR5cGVdKTtcbiAgd2FybmluZyhcbiAgICBsb2NhdGlvbkNvbnRleHQgIT0gbnVsbCxcbiAgICBgPFJvdXRlciBiYXNlbmFtZT1cIiR7YmFzZW5hbWV9XCI+IGlzIG5vdCBhYmxlIHRvIG1hdGNoIHRoZSBVUkwgXCIke3BhdGhuYW1lfSR7c2VhcmNofSR7aGFzaH1cIiBiZWNhdXNlIGl0IGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGJhc2VuYW1lLCBzbyB0aGUgPFJvdXRlcj4gd29uJ3QgcmVuZGVyIGFueXRoaW5nLmBcbiAgKTtcbiAgaWYgKGxvY2F0aW9uQ29udGV4dCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChOYXZpZ2F0aW9uQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogbmF2aWdhdGlvbkNvbnRleHQgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KExvY2F0aW9uQ29udGV4dC5Qcm92aWRlciwgeyBjaGlsZHJlbiwgdmFsdWU6IGxvY2F0aW9uQ29udGV4dCB9KSk7XG59XG5mdW5jdGlvbiBSb3V0ZXMoe1xuICBjaGlsZHJlbixcbiAgbG9jYXRpb25cbn0pIHtcbiAgcmV0dXJuIHVzZVJvdXRlcyhjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4pLCBsb2NhdGlvbik7XG59XG5mdW5jdGlvbiBBd2FpdCh7XG4gIGNoaWxkcmVuLFxuICBlcnJvckVsZW1lbnQsXG4gIHJlc29sdmVcbn0pIHtcbiAgbGV0IGRhdGFSb3V0ZXJDb250ZXh0ID0gUmVhY3QzLnVzZUNvbnRleHQoRGF0YVJvdXRlckNvbnRleHQpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFxuICAgIEF3YWl0RXJyb3JCb3VuZGFyeSxcbiAgICB7XG4gICAgICByZXNvbHZlLFxuICAgICAgZXJyb3JFbGVtZW50LFxuICAgICAgdW5zdGFibGVfb25FcnJvcjogZGF0YVJvdXRlckNvbnRleHQ/LnVuc3RhYmxlX29uRXJyb3JcbiAgICB9LFxuICAgIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChSZXNvbHZlQXdhaXQsIG51bGwsIGNoaWxkcmVuKVxuICApO1xufVxudmFyIEF3YWl0RXJyb3JCb3VuZGFyeSA9IGNsYXNzIGV4dGVuZHMgUmVhY3QzLkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7IGVycm9yOi
25114BudWxsIH07XG4gIH1cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yIH07XG4gIH1cbiAgY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGVycm9ySW5mbykge1xuICAgIGlmICh0aGlzLnByb3BzLnVuc3RhYmxlX29uRXJyb3IpIHtcbiAgICAgIHRoaXMucHJvcHMudW5zdGFibGVfb25FcnJvcihlcnJvciwgZXJyb3JJbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCI8QXdhaXQ+IGNhdWdodCB0aGUgZm9sbG93aW5nIGVycm9yIGR1cmluZyByZW5kZXJcIixcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGVycm9ySW5mb1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGxldCB7IGNoaWxkcmVuLCBlcnJvckVsZW1lbnQsIHJlc29sdmUgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHByb21pc2UgPSBudWxsO1xuICAgIGxldCBzdGF0dXMgPSAwIC8qIHBlbmRpbmcgKi87XG4gICAgaWYgKCEocmVzb2x2ZSBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG4gICAgICBzdGF0dXMgPSAxIC8qIHN1Y2Nlc3MgKi87XG4gICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvbWlzZSwgXCJfdHJhY2tlZFwiLCB7IGdldDogKCkgPT4gdHJ1ZSB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl9kYXRhXCIsIHsgZ2V0OiAoKSA9PiByZXNvbHZlIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgc3RhdHVzID0gMiAvKiBlcnJvciAqLztcbiAgICAgIGxldCByZW5kZXJFcnJvciA9IHRoaXMuc3RhdGUuZXJyb3I7XG4gICAgICBwcm9taXNlID0gUHJvbWlzZS5yZWplY3QoKS5jYXRjaCgoKSA9PiB7XG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl90cmFja2VkXCIsIHsgZ2V0OiAoKSA9PiB0cnVlIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsIFwiX2Vycm9yXCIsIHsgZ2V0OiAoKSA9PiByZW5kZXJFcnJvciB9KTtcbiAgICB9IGVsc2UgaWYgKHJlc29sdmUuX3RyYWNrZWQpIHtcbiAgICAgIHByb21pc2UgPSByZXNvbHZlO1xuICAgICAgc3RhdHVzID0gXCJfZXJyb3JcIiBpbiBwcm9taXNlID8gMiAvKiBlcnJvciAqLyA6IFwiX2RhdGFcIiBpbiBwcm9taXNlID8gMSAvKiBzdWNjZXNzICovIDogMCAvKiBwZW5kaW5nICovO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXMgPSAwIC8qIHBlbmRpbmcgKi87XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzb2x2ZSwgXCJfdHJhY2tlZFwiLCB7IGdldDogKCkgPT4gdHJ1ZSB9KTtcbiAgICAgIHByb21pc2UgPSByZXNvbHZlLnRoZW4oXG4gICAgICAgIChkYXRhMikgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc29sdmUsIFwiX2RhdGFcIiwgeyBnZXQ6ICgpID0+IGRhdGEyIH0pLFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLnByb3BzLnVuc3RhYmxlX29uRXJyb3I/LihlcnJvcik7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc29sdmUsIFwiX2Vycm9yXCIsIHsgZ2V0OiAoKSA9PiBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gMiAvKiBlcnJvciAqLyAmJiAhZXJyb3JFbGVtZW50KSB7XG4gICAgICB0aHJvdyBwcm9taXNlLl9lcnJvcjtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gMiAvKiBlcnJvciAqLykge1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChBd2FpdENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHByb21pc2UsIGNoaWxkcmVuOiBlcnJvckVsZW1lbnQgfSk7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IDEgLyogc3VjY2VzcyAqLykge1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChBd2FpdENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHByb21pc2UsIGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgICB0aHJvdyBwcm9taXNlO1xuICB9XG59O1xuZnVuY3Rpb24gUmVzb2x2ZUF3YWl0KHtcbiAgY2hpbGRyZW5cbn0pIHtcbiAgbGV0IGRhdGEyID0gdXNlQXN5bmNWYWx1ZSgpO1xuICBsZXQgdG9SZW5kZXIgPSB0eXBlb2YgY2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIiA/IGNoaWxkcmVuKGRhdGEyKSA6IGNoaWxkcmVuO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFJlYWN0My5GcmFnbWVudCwgbnVsbCwgdG9SZW5kZXIpO1xufVxuZnVuY3Rpb24gY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCBwYXJlbnRQYXRoID0gW10pIHtcbiAgbGV0IHJvdXRlcyA9IFtdO1xuICBSZWFjdDMuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgaWYgKCFSZWFjdDMuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRyZWVQYXRoID0gWy4uLnBhcmVudFBhdGgsIGluZGV4XTtcbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBSZWFjdDMuRnJhZ21lbnQpIHtcbiAgICAgIHJvdXRlcy5wdXNoLmFwcGx5KFxuICAgICAgICByb3V0ZXMsXG4gICAgICAgIGNyZWF0ZVJvdXRlc0Zyb21DaGlsZHJlbihlbGVtZW50LnByb3BzLmNoaWxkcmVuLCB0cmVlUGF0aClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGludmFyaWFudChcbiAgICAgIGVsZW1lbnQudHlwZSA9PT0gUm91dGUsXG4gICAgICBgWyR7dHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gXCJzdHJpbmdcIiA/IGVsZW1lbnQudHlwZSA6IGVsZW1lbnQudHlwZS5uYW1lfV0gaXMgbm90IGEgPFJvdXRlPiBjb21wb25lbnQuIEFsbCBjb21wb25lbnQgY2hpbGRyZW4gb2YgPFJvdXRlcz4gbXVzdCBiZSBhIDxSb3V0ZT4gb3IgPFJlYWN0LkZyYWdtZW50PmBcbiAgICApO1xuICAgIGludmFyaWFudChcbiAgICAgICFlbGVtZW50LnByb3BzLmluZGV4IHx8ICFlbGVtZW50LnByb3BzLmNoaWxkcmVuLFxuICAgICAgXCJBbiBpbmRleCByb3V0ZSBjYW5ub3QgaGF2ZSBjaGlsZCByb3V0ZXMuXCJcbiAgICApO
251141xuICAgIGxldCByb3V0ZSA9IHtcbiAgICAgIGlkOiBlbGVtZW50LnByb3BzLmlkIHx8IHRyZWVQYXRoLmpvaW4oXCItXCIpLFxuICAgICAgY2FzZVNlbnNpdGl2ZTogZWxlbWVudC5wcm9wcy5jYXNlU2Vuc2l0aXZlLFxuICAgICAgZWxlbWVudDogZWxlbWVudC5wcm9wcy5lbGVtZW50LFxuICAgICAgQ29tcG9uZW50OiBlbGVtZW50LnByb3BzLkNvbXBvbmVudCxcbiAgICAgIGluZGV4OiBlbGVtZW50LnByb3BzLmluZGV4LFxuICAgICAgcGF0aDogZWxlbWVudC5wcm9wcy5wYXRoLFxuICAgICAgbWlkZGxld2FyZTogZWxlbWVudC5wcm9wcy5taWRkbGV3YXJlLFxuICAgICAgbG9hZGVyOiBlbGVtZW50LnByb3BzLmxvYWRlcixcbiAgICAgIGFjdGlvbjogZWxlbWVudC5wcm9wcy5hY3Rpb24sXG4gICAgICBoeWRyYXRlRmFsbGJhY2tFbGVtZW50OiBlbGVtZW50LnByb3BzLmh5ZHJhdGVGYWxsYmFja0VsZW1lbnQsXG4gICAgICBIeWRyYXRlRmFsbGJhY2s6IGVsZW1lbnQucHJvcHMuSHlkcmF0ZUZhbGxiYWNrLFxuICAgICAgZXJyb3JFbGVtZW50OiBlbGVtZW50LnByb3BzLmVycm9yRWxlbWVudCxcbiAgICAgIEVycm9yQm91bmRhcnk6IGVsZW1lbnQucHJvcHMuRXJyb3JCb3VuZGFyeSxcbiAgICAgIGhhc0Vycm9yQm91bmRhcnk6IGVsZW1lbnQucHJvcHMuaGFzRXJyb3JCb3VuZGFyeSA9PT0gdHJ1ZSB8fCBlbGVtZW50LnByb3BzLkVycm9yQm91bmRhcnkgIT0gbnVsbCB8fCBlbGVtZW50LnByb3BzLmVycm9yRWxlbWVudCAhPSBudWxsLFxuICAgICAgc2hvdWxkUmV2YWxpZGF0ZTogZWxlbWVudC5wcm9wcy5zaG91bGRSZXZhbGlkYXRlLFxuICAgICAgaGFuZGxlOiBlbGVtZW50LnByb3BzLmhhbmRsZSxcbiAgICAgIGxhenk6IGVsZW1lbnQucHJvcHMubGF6eVxuICAgIH07XG4gICAgaWYgKGVsZW1lbnQucHJvcHMuY2hpbGRyZW4pIHtcbiAgICAgIHJvdXRlLmNoaWxkcmVuID0gY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuKFxuICAgICAgICBlbGVtZW50LnByb3BzLmNoaWxkcmVuLFxuICAgICAgICB0cmVlUGF0aFxuICAgICAgKTtcbiAgICB9XG4gICAgcm91dGVzLnB1c2gocm91dGUpO1xuICB9KTtcbiAgcmV0dXJuIHJvdXRlcztcbn1cbnZhciBjcmVhdGVSb3V0ZXNGcm9tRWxlbWVudHMgPSBjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW47XG5mdW5jdGlvbiByZW5kZXJNYXRjaGVzKG1hdGNoZXMpIHtcbiAgcmV0dXJuIF9yZW5kZXJNYXRjaGVzKG1hdGNoZXMpO1xufVxuZnVuY3Rpb24gdXNlUm91dGVDb21wb25lbnRQcm9wcygpIHtcbiAgcmV0dXJuIHtcbiAgICBwYXJhbXM6IHVzZVBhcmFtcygpLFxuICAgIGxvYWRlckRhdGE6IHVzZUxvYWRlckRhdGEoKSxcbiAgICBhY3Rpb25EYXRhOiB1c2VBY3Rpb25EYXRhKCksXG4gICAgbWF0Y2hlczogdXNlTWF0Y2hlcygpXG4gIH07XG59XG5mdW5jdGlvbiBXaXRoQ29tcG9uZW50UHJvcHMoe1xuICBjaGlsZHJlblxufSkge1xuICBjb25zdCBwcm9wcyA9IHVzZVJvdXRlQ29tcG9uZW50UHJvcHMoKTtcbiAgcmV0dXJuIFJlYWN0My5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHByb3BzKTtcbn1cbmZ1bmN0aW9uIHdpdGhDb21wb25lbnRQcm9wcyhDb21wb25lbnQ0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXaXRoQ29tcG9uZW50UHJvcHMyKCkge1xuICAgIGNvbnN0IHByb3BzID0gdXNlUm91dGVDb21wb25lbnRQcm9wcygpO1xuICAgIHJldHVybiBSZWFjdDMuY3JlYXRlRWxlbWVudChDb21wb25lbnQ0LCBwcm9wcyk7XG4gIH07XG59XG5mdW5jdGlvbiB1c2VIeWRyYXRlRmFsbGJhY2tQcm9wcygpIHtcbiAgcmV0dXJuIHtcbiAgICBwYXJhbXM6IHVzZVBhcmFtcygpLFxuICAgIGxvYWRlckRhdGE6IHVzZUxvYWRlckRhdGEoKSxcbiAgICBhY3Rpb25EYXRhOiB1c2VBY3Rpb25EYXRhKClcbiAgfTtcbn1cbmZ1bmN0aW9uIFdpdGhIeWRyYXRlRmFsbGJhY2tQcm9wcyh7XG4gIGNoaWxkcmVuXG59KSB7XG4gIGNvbnN0IHByb3BzID0gdXNlSHlkcmF0ZUZhbGxiYWNrUHJvcHMoKTtcbiAgcmV0dXJuIFJlYWN0My5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHByb3BzKTtcbn1cbmZ1bmN0aW9uIHdpdGhIeWRyYXRlRmFsbGJhY2tQcm9wcyhIeWRyYXRlRmFsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdpdGhIeWRyYXRlRmFsbGJhY2tQcm9wczIoKSB7XG4gICAgY29uc3QgcHJvcHMgPSB1c2VIeWRyYXRlRmFsbGJhY2tQcm9wcygpO1xuICAgIHJldHVybiBSZWFjdDMuY3JlYXRlRWxlbWVudChIeWRyYXRlRmFsbGJhY2ssIHByb3BzKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHVzZUVycm9yQm91bmRhcnlQcm9wcygpIHtcbiAgcmV0dXJuIHtcbiAgICBwYXJhbXM6IHVzZVBhcmFtcygpLFxuICAgIGxvYWRlckRhdGE6IHVzZUxvYWRlckRhdGEoKSxcbiAgICBhY3Rpb25EYXRhOiB1c2VBY3Rpb25EYXRhKCksXG4gICAgZXJyb3I6IHVzZVJvdXRlRXJyb3IoKVxuICB9O1xufVxuZnVuY3Rpb24gV2l0aEVycm9yQm91bmRhcnlQcm9wcyh7XG4gIGNoaWxkcmVuXG59KSB7XG4gIGNvbnN0IHByb3BzID0gdXNlRXJyb3JCb3VuZGFyeVByb3BzKCk7XG4gIHJldHVybiBSZWFjdDMuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCBwcm9wcyk7XG59XG5mdW5jdGlvbiB3aXRoRXJyb3JCb3VuZGFyeVByb3BzKEVycm9yQm91bmRhcnkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdpdGhFcnJvckJvdW5kYXJ5UHJvcHMyKCkge1xuICAgIGNvbnN0IHByb3BzID0gdXNlRXJyb3JCb3VuZGFyeVByb3BzKCk7XG4gICAgcmV0dXJuIFJlYWN0My5jcmVhdGVFbGVtZW50KEVycm9yQm91bmRhcnksIHByb3BzKTtcbiAgfTtcbn1cblxuLy8gbGliL2RvbS9kb20udHNcbnZhciBkZWZhdWx0TWV0aG9kID0gXCJnZXRcIjtcbnZhciBkZWZhdWx0RW5jVHlwZSA9IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCI7XG5mdW5jdGlvbiBpc0h0bWxFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgdHlwZW9mIG9iamVjdC50YWdOYW1lID09PSBcInN0cmluZ1wiO1xufVxuZnVuY3Rpb24gaXNCdXR0b25FbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gaXNIdG1sRWxlbWVudChvYmplY3QpICYmIG9iamVjdC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYnV0dG9uXCI7XG59XG5mdW5jdGlvbiBpc0Zvcm1FbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gaXNIdG1sRWxlbWVudChvYmplY3QpICYmIG9iamVjdC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZm9ybVwiO1xufVxuZnVuY3Rpb24gaXNJbnB1dEVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybi
25114Bpc0h0bWxFbGVtZW50KG9iamVjdCkgJiYgb2JqZWN0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiO1xufVxuZnVuY3Rpb24gaXNNb2RpZmllZEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiAhIShldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KTtcbn1cbmZ1bmN0aW9uIHNob3VsZFByb2Nlc3NMaW5rQ2xpY2soZXZlbnQsIHRhcmdldCkge1xuICByZXR1cm4gZXZlbnQuYnV0dG9uID09PSAwICYmIC8vIElnbm9yZSBldmVyeXRoaW5nIGJ1dCBsZWZ0IGNsaWNrc1xuICAoIXRhcmdldCB8fCB0YXJnZXQgPT09IFwiX3NlbGZcIikgJiYgLy8gTGV0IGJyb3dzZXIgaGFuZGxlIFwidGFyZ2V0PV9ibGFua1wiIGV0Yy5cbiAgIWlzTW9kaWZpZWRFdmVudChldmVudCk7XG59XG5mdW5jdGlvbiBjcmVhdGVTZWFyY2hQYXJhbXMoaW5pdCA9IFwiXCIpIHtcbiAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoXG4gICAgdHlwZW9mIGluaXQgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheShpbml0KSB8fCBpbml0IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zID8gaW5pdCA6IE9iamVjdC5rZXlzKGluaXQpLnJlZHVjZSgobWVtbzIsIGtleSkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gaW5pdFtrZXldO1xuICAgICAgcmV0dXJuIG1lbW8yLmNvbmNhdChcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoKHYpID0+IFtrZXksIHZdKSA6IFtba2V5LCB2YWx1ZV1dXG4gICAgICApO1xuICAgIH0sIFtdKVxuICApO1xufVxuZnVuY3Rpb24gZ2V0U2VhcmNoUGFyYW1zRm9yTG9jYXRpb24obG9jYXRpb25TZWFyY2gsIGRlZmF1bHRTZWFyY2hQYXJhbXMpIHtcbiAgbGV0IHNlYXJjaFBhcmFtcyA9IGNyZWF0ZVNlYXJjaFBhcmFtcyhsb2NhdGlvblNlYXJjaCk7XG4gIGlmIChkZWZhdWx0U2VhcmNoUGFyYW1zKSB7XG4gICAgZGVmYXVsdFNlYXJjaFBhcmFtcy5mb3JFYWNoKChfLCBrZXkpID0+IHtcbiAgICAgIGlmICghc2VhcmNoUGFyYW1zLmhhcyhrZXkpKSB7XG4gICAgICAgIGRlZmF1bHRTZWFyY2hQYXJhbXMuZ2V0QWxsKGtleSkuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICBzZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gc2VhcmNoUGFyYW1zO1xufVxudmFyIF9mb3JtRGF0YVN1cHBvcnRzU3VibWl0dGVyID0gbnVsbDtcbmZ1bmN0aW9uIGlzRm9ybURhdGFTdWJtaXR0ZXJTdXBwb3J0ZWQoKSB7XG4gIGlmIChfZm9ybURhdGFTdXBwb3J0c1N1Ym1pdHRlciA9PT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgRm9ybURhdGEoXG4gICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlmIEZvcm1EYXRhIHN1cHBvcnRzIHRoZSBzdWJtaXR0ZXIgcGFyYW1ldGVyLCB0aGlzIHdpbGwgdGhyb3dcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIF9mb3JtRGF0YVN1cHBvcnRzU3VibWl0dGVyID0gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgX2Zvcm1EYXRhU3VwcG9ydHNTdWJtaXR0ZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX2Zvcm1EYXRhU3VwcG9ydHNTdWJtaXR0ZXI7XG59XG52YXIgc3VwcG9ydGVkRm9ybUVuY1R5cGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1xuICBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiLFxuICBcIm11bHRpcGFydC9mb3JtLWRhdGFcIixcbiAgXCJ0ZXh0L3BsYWluXCJcbl0pO1xuZnVuY3Rpb24gZ2V0Rm9ybUVuY1R5cGUoZW5jVHlwZSkge1xuICBpZiAoZW5jVHlwZSAhPSBudWxsICYmICFzdXBwb3J0ZWRGb3JtRW5jVHlwZXMuaGFzKGVuY1R5cGUpKSB7XG4gICAgd2FybmluZyhcbiAgICAgIGZhbHNlLFxuICAgICAgYFwiJHtlbmNUeXBlfVwiIGlzIG5vdCBhIHZhbGlkIFxcYGVuY1R5cGVcXGAgZm9yIFxcYDxGb3JtPlxcYC9cXGA8ZmV0Y2hlci5Gb3JtPlxcYCBhbmQgd2lsbCBkZWZhdWx0IHRvIFwiJHtkZWZhdWx0RW5jVHlwZX1cImBcbiAgICApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBlbmNUeXBlO1xufVxuZnVuY3Rpb24gZ2V0Rm9ybVN1Ym1pc3Npb25JbmZvKHRhcmdldCwgYmFzZW5hbWUpIHtcbiAgbGV0IG1ldGhvZDtcbiAgbGV0IGFjdGlvbjtcbiAgbGV0IGVuY1R5cGU7XG4gIGxldCBmb3JtRGF0YTtcbiAgbGV0IGJvZHk7XG4gIGlmIChpc0Zvcm1FbGVtZW50KHRhcmdldCkpIHtcbiAgICBsZXQgYXR0ciA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIik7XG4gICAgYWN0aW9uID0gYXR0ciA/IHN0cmlwQmFzZW5hbWUoYXR0ciwgYmFzZW5hbWUpIDogbnVsbDtcbiAgICBtZXRob2QgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwibWV0aG9kXCIpIHx8IGRlZmF1bHRNZXRob2Q7XG4gICAgZW5jVHlwZSA9IGdldEZvcm1FbmNUeXBlKHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJlbmN0eXBlXCIpKSB8fCBkZWZhdWx0RW5jVHlwZTtcbiAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSh0YXJnZXQpO1xuICB9IGVsc2UgaWYgKGlzQnV0dG9uRWxlbWVudCh0YXJnZXQpIHx8IGlzSW5wdXRFbGVtZW50KHRhcmdldCkgJiYgKHRhcmdldC50eXBlID09PSBcInN1Ym1pdFwiIHx8IHRhcmdldC50eXBlID09PSBcImltYWdlXCIpKSB7XG4gICAgbGV0IGZvcm0gPSB0YXJnZXQuZm9ybTtcbiAgICBpZiAoZm9ybSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3Qgc3VibWl0IGEgPGJ1dHRvbj4gb3IgPGlucHV0IHR5cGU9XCJzdWJtaXRcIj4gd2l0aG91dCBhIDxmb3JtPmBcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBhdHRyID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcImZvcm1hY3Rpb25cIikgfHwgZm9ybS5nZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIik7XG4gICAgYWN0aW9uID0gYXR0ciA/IHN0cmlwQmFzZW5hbWUoYXR0ciwgYmFzZW5hbWUpIDogbnVsbDtcbiAgICBtZXRob2QgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZm9ybW1ldGhvZFwiKSB8fCBmb3JtLmdldEF0dHJpYnV0ZShcIm1ldGhvZFwiKSB8fCBkZWZhdWx0TWV0aG9kO1xuICAgIGVuY1R5cGUgPSBnZXRGb3JtRW5jVHlwZSh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZm9ybWVuY3R5cGVcIikpIHx8IGdldEZvcm1FbmNUeXBlKGZvcm0uZ2V0QXR0cmlidXRlKFwiZW5jdHlwZVwiKSkgfHwgZGVmYXVsdEVuY1R5cGU7XG4gICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSwgdGFyZ2V0KTtcbiAgICBpZiAoIWlzRm9ybURhdGFTdWJtaXR0ZXJTdXBwb3J0ZWQoKSkge1xuICAgICAgbGV0IHsgbmFtZSwgdHlwZSwgdmFsdWUgfSA9IHRhcmdldDtcbiAgICAgIGlmICh0eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgbGV0IHByZWZpeCA9IG5hbWUgPyBgJHtuYW1lfS5gIDogXCJcIjtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGAke3ByZWZpeH14YCwgXCIwXCIpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoYCR7cHJlZml4fXlgLCBcIjBcIik7XG4gICAgICB9IGVsc2UgaWYgKG5hbWUpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gI
25114H0gZWxzZSBpZiAoaXNIdG1sRWxlbWVudCh0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCBzdWJtaXQgZWxlbWVudCB0aGF0IGlzIG5vdCA8Zm9ybT4sIDxidXR0b24+LCBvciA8aW5wdXQgdHlwZT1cInN1Ym1pdHxpbWFnZVwiPmBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIG1ldGhvZCA9IGRlZmF1bHRNZXRob2Q7XG4gICAgYWN0aW9uID0gbnVsbDtcbiAgICBlbmNUeXBlID0gZGVmYXVsdEVuY1R5cGU7XG4gICAgYm9keSA9IHRhcmdldDtcbiAgfVxuICBpZiAoZm9ybURhdGEgJiYgZW5jVHlwZSA9PT0gXCJ0ZXh0L3BsYWluXCIpIHtcbiAgICBib2R5ID0gZm9ybURhdGE7XG4gICAgZm9ybURhdGEgPSB2b2lkIDA7XG4gIH1cbiAgcmV0dXJuIHsgYWN0aW9uLCBtZXRob2Q6IG1ldGhvZC50b0xvd2VyQ2FzZSgpLCBlbmNUeXBlLCBmb3JtRGF0YSwgYm9keSB9O1xufVxuXG4vLyBsaWIvZG9tL3Nzci9zaW5nbGUtZmV0Y2gudHN4XG5pbXBvcnQgKiBhcyBSZWFjdDQgZnJvbSBcInJlYWN0XCI7XG5cbi8vIHZlbmRvci90dXJiby1zdHJlYW0tdjIvdXRpbHMudHNcbnZhciBIT0xFID0gLTE7XG52YXIgTkFOID0gLTI7XG52YXIgTkVHQVRJVkVfSU5GSU5JVFkgPSAtMztcbnZhciBORUdBVElWRV9aRVJPID0gLTQ7XG52YXIgTlVMTCA9IC01O1xudmFyIFBPU0lUSVZFX0lORklOSVRZID0gLTY7XG52YXIgVU5ERUZJTkVEID0gLTc7XG52YXIgVFlQRV9CSUdJTlQgPSBcIkJcIjtcbnZhciBUWVBFX0RBVEUgPSBcIkRcIjtcbnZhciBUWVBFX0VSUk9SID0gXCJFXCI7XG52YXIgVFlQRV9NQVAgPSBcIk1cIjtcbnZhciBUWVBFX05VTExfT0JKRUNUID0gXCJOXCI7XG52YXIgVFlQRV9QUk9NSVNFID0gXCJQXCI7XG52YXIgVFlQRV9SRUdFWFAgPSBcIlJcIjtcbnZhciBUWVBFX1NFVCA9IFwiU1wiO1xudmFyIFRZUEVfU1lNQk9MID0gXCJZXCI7XG52YXIgVFlQRV9VUkwgPSBcIlVcIjtcbnZhciBUWVBFX1BSRVZJT1VTX1JFU09MVkVEID0gXCJaXCI7XG52YXIgRGVmZXJyZWQyID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVMaW5lU3BsaXR0aW5nVHJhbnNmb3JtKCkge1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBsZWZ0b3ZlciA9IFwiXCI7XG4gIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIGNvbnN0IHN0ciA9IGRlY29kZXIuZGVjb2RlKGNodW5rLCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHBhcnRzID0gKGxlZnRvdmVyICsgc3RyKS5zcGxpdChcIlxcblwiKTtcbiAgICAgIGxlZnRvdmVyID0gcGFydHMucG9wKCkgfHwgXCJcIjtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUocGFydCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICBpZiAobGVmdG92ZXIpIHtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGxlZnRvdmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG4vLyB2ZW5kb3IvdHVyYm8tc3RyZWFtLXYyL2ZsYXR0ZW4udHNcbmZ1bmN0aW9uIGZsYXR0ZW4oaW5wdXQpIHtcbiAgY29uc3QgeyBpbmRpY2VzIH0gPSB0aGlzO1xuICBjb25zdCBleGlzdGluZyA9IGluZGljZXMuZ2V0KGlucHV0KTtcbiAgaWYgKGV4aXN0aW5nKSByZXR1cm4gW2V4aXN0aW5nXTtcbiAgaWYgKGlucHV0ID09PSB2b2lkIDApIHJldHVybiBVTkRFRklORUQ7XG4gIGlmIChpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIE5VTEw7XG4gIGlmIChOdW1iZXIuaXNOYU4oaW5wdXQpKSByZXR1cm4gTkFOO1xuICBpZiAoaW5wdXQgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgcmV0dXJuIFBPU0lUSVZFX0lORklOSVRZO1xuICBpZiAoaW5wdXQgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkgcmV0dXJuIE5FR0FUSVZFX0lORklOSVRZO1xuICBpZiAoaW5wdXQgPT09IDAgJiYgMSAvIGlucHV0IDwgMCkgcmV0dXJuIE5FR0FUSVZFX1pFUk87XG4gIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleCsrO1xuICBpbmRpY2VzLnNldChpbnB1dCwgaW5kZXgpO1xuICBzdHJpbmdpZnkuY2FsbCh0aGlzLCBpbnB1dCwgaW5kZXgpO1xuICByZXR1cm4gaW5kZXg7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoaW5wdXQsIGluZGV4KSB7XG4gIGNvbnN0IHsgZGVmZXJyZWQsIHBsdWdpbnMsIHBvc3RQbHVnaW5zIH0gPSB0aGlzO1xuICBjb25zdCBzdHIgPSB0aGlzLnN0cmluZ2lmaWVkO1xuICBjb25zdCBzdGFjayA9IFtbaW5wdXQsIGluZGV4XV07XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgW2lucHV0MiwgaW5kZXgyXSA9IHN0YWNrLnBvcCgpO1xuICAgIGNvbnN0IHBhcnRzRm9yT2JqID0gKG9iaikgPT4gT2JqZWN0LmtleXMob2JqKS5tYXAoKGspID0+IGBcIl8ke2ZsYXR0ZW4uY2FsbCh0aGlzLCBrKX1cIjoke2ZsYXR0ZW4uY2FsbCh0aGlzLCBvYmpba10pfWApLmpvaW4oXCIsXCIpO1xuICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgc3dpdGNoICh0eXBlb2YgaW5wdXQyKSB7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICBzdHJbaW5kZXgyXSA9IEpTT04uc3RyaW5naWZ5KGlucHV0Mik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfQklHSU5UfVwiLFwiJHtpbnB1dDJ9XCJdYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwic3ltYm9sXCI6IHtcbiAgICAgICAgY29uc3Qga2V5Rm9yID0gU3ltYm9sLmtleUZvcihpbnB1dDIpO1xuICAgICAgICBpZiAoIWtleUZvcikge1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgZW5jb2RlIHN5bWJvbCB1bmxlc3MgY3JlYXRlZCB3aXRoIFN5bWJvbC5mb3IoKVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfU1lNQk9MfVwiLCR7SlNPTi5zdHJpbmdpZnkoa2V5Rm9yKX1dYDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgICBpZiAoIWlucHV0Mikge1xuICAgICAgICAgI
25114HN0cltpbmRleDJdID0gYCR7TlVMTH1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGlucHV0Mik7XG4gICAgICAgIGxldCBwbHVnaW5IYW5kbGVkID0gZmFsc2U7XG4gICAgICAgIGlmICghaXNBcnJheSAmJiBwbHVnaW5zKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgY29uc3QgcGx1Z2luUmVzdWx0ID0gcGx1Z2luKGlucHV0Mik7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwbHVnaW5SZXN1bHQpKSB7XG4gICAgICAgICAgICAgIHBsdWdpbkhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBjb25zdCBbcGx1Z2luSWRlbnRpZmllciwgLi4ucmVzdF0gPSBwbHVnaW5SZXN1bHQ7XG4gICAgICAgICAgICAgIHN0cltpbmRleDJdID0gYFske0pTT04uc3RyaW5naWZ5KHBsdWdpbklkZW50aWZpZXIpfWA7XG4gICAgICAgICAgICAgIGlmIChyZXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzdHJbaW5kZXgyXSArPSBgLCR7cmVzdC5tYXAoKHYpID0+IGZsYXR0ZW4uY2FsbCh0aGlzLCB2KSkuam9pbihcIixcIil9YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdHJbaW5kZXgyXSArPSBcIl1cIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcGx1Z2luSGFuZGxlZCkge1xuICAgICAgICAgIGxldCByZXN1bHQgPSBpc0FycmF5ID8gXCJbXCIgOiBcIntcIjtcbiAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dDIubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgIHJlc3VsdCArPSAoaSA/IFwiLFwiIDogXCJcIikgKyAoaSBpbiBpbnB1dDIgPyBmbGF0dGVuLmNhbGwodGhpcywgaW5wdXQyW2ldKSA6IEhPTEUpO1xuICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgJHtyZXN1bHR9XWA7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dDIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlVGltZSA9IGlucHV0Mi5nZXRUaW1lKCk7XG4gICAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfREFURX1cIiwke051bWJlci5pc05hTihkYXRlVGltZSkgPyBKU09OLnN0cmluZ2lmeShcImludmFsaWRcIikgOiBkYXRlVGltZX1dYDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0MiBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgW1wiJHtUWVBFX1VSTH1cIiwke0pTT04uc3RyaW5naWZ5KGlucHV0Mi5ocmVmKX1dYDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0MiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgW1wiJHtUWVBFX1JFR0VYUH1cIiwke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICBpbnB1dDIuc291cmNlXG4gICAgICAgICAgICApfSwke0pTT04uc3RyaW5naWZ5KGlucHV0Mi5mbGFncyl9XWA7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dDIgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dDIuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgW1wiJHtUWVBFX1NFVH1cIiwke1suLi5pbnB1dDJdLm1hcCgodmFsKSA9PiBmbGF0dGVuLmNhbGwodGhpcywgdmFsKSkuam9pbihcIixcIil9XWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfU0VUfVwiXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dDIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGlmIChpbnB1dDIuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgW1wiJHtUWVBFX01BUH1cIiwke1suLi5pbnB1dDJdLmZsYXRNYXAoKFtrLCB2XSkgPT4gW1xuICAgICAgICAgICAgICAgIGZsYXR0ZW4uY2FsbCh0aGlzLCBrKSxcbiAgICAgICAgICAgICAgICBmbGF0dGVuLmNhbGwodGhpcywgdilcbiAgICAgICAgICAgICAgXSkuam9pbihcIixcIil9XWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfTUFQfVwiXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dDIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfUFJPTUlTRX1cIiwke2luZGV4Mn1dYDtcbiAgICAgICAgICAgIGRlZmVycmVkW2luZGV4Ml0gPSBpbnB1dDI7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dDIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgW1wiJHtUWVBFX0VSUk9SfVwiLCR7SlNPTi5zdHJpbmdpZnkoaW5wdXQyLm1lc3NhZ2UpfWA7XG4gICAgICAgICAgICBpZiAoaW5wdXQyLm5hbWUgIT09IFwiRXJyb3JcIikge1xuICAgICAgICAgICAgICBzdHJbaW5kZXgyXSArPSBgLCR7SlNPTi5zdHJpbmdpZnkoaW5wdXQyLm5hbWUpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJbaW5kZXgyXSArPSBcIl1cIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnB1dDIpID09PSBudWxsKSB7XG4gICAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfTlVMTF9PQkpFQ1R9XCIseyR7cGFydHNGb3JPYmooaW5wdXQyKX19XWA7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGlucHV0MikpIHtcbiAgICAgICAgICAgIHN0cltpbmRleDJdID0gYHske3BhcnRzRm9yT2JqKGlucHV0Mil9fWA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFwiQ2Fubm90IGVuY29kZSBvYmplY3Qgd2l0aCBwcm90b3R5cGVcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBpc0FycmF
251145ID0gQXJyYXkuaXNBcnJheShpbnB1dDIpO1xuICAgICAgICBsZXQgcGx1Z2luSGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWlzQXJyYXkgJiYgcGx1Z2lucykge1xuICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpblJlc3VsdCA9IHBsdWdpbihpbnB1dDIpO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGx1Z2luUmVzdWx0KSkge1xuICAgICAgICAgICAgICBwbHVnaW5IYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29uc3QgW3BsdWdpbklkZW50aWZpZXIsIC4uLnJlc3RdID0gcGx1Z2luUmVzdWx0O1xuICAgICAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbJHtKU09OLnN0cmluZ2lmeShwbHVnaW5JZGVudGlmaWVyKX1gO1xuICAgICAgICAgICAgICBpZiAocmVzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc3RyW2luZGV4Ml0gKz0gYCwke3Jlc3QubWFwKCh2KSA9PiBmbGF0dGVuLmNhbGwodGhpcywgdikpLmpvaW4oXCIsXCIpfWA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RyW2luZGV4Ml0gKz0gXCJdXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBsdWdpbkhhbmRsZWQpIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihcIkNhbm5vdCBlbmNvZGUgZnVuY3Rpb24gb3IgdW5leHBlY3RlZCB0eXBlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgbGV0IHBsdWdpbkhhbmRsZWQgPSBmYWxzZTtcbiAgICAgIGlmIChwb3N0UGx1Z2lucykge1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwb3N0UGx1Z2lucykge1xuICAgICAgICAgIGNvbnN0IHBsdWdpblJlc3VsdCA9IHBsdWdpbihpbnB1dDIpO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBsdWdpblJlc3VsdCkpIHtcbiAgICAgICAgICAgIHBsdWdpbkhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgW3BsdWdpbklkZW50aWZpZXIsIC4uLnJlc3RdID0gcGx1Z2luUmVzdWx0O1xuICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgWyR7SlNPTi5zdHJpbmdpZnkocGx1Z2luSWRlbnRpZmllcil9YDtcbiAgICAgICAgICAgIGlmIChyZXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgc3RyW2luZGV4Ml0gKz0gYCwke3Jlc3QubWFwKCh2KSA9PiBmbGF0dGVuLmNhbGwodGhpcywgdikpLmpvaW4oXCIsXCIpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJbaW5kZXgyXSArPSBcIl1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFwbHVnaW5IYW5kbGVkKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxudmFyIG9iamVjdFByb3RvTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QucHJvdG90eXBlKS5zb3J0KCkuam9pbihcIlxcMFwiKTtcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodGhpbmcpIHtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpbmcpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwgfHwgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG8pLnNvcnQoKS5qb2luKFwiXFwwXCIpID09PSBvYmplY3RQcm90b05hbWVzO1xufVxuXG4vLyB2ZW5kb3IvdHVyYm8tc3RyZWFtLXYyL3VuZmxhdHRlbi50c1xudmFyIGdsb2JhbE9iaiA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbFRoaXMgOiB2b2lkIDA7XG5mdW5jdGlvbiB1bmZsYXR0ZW4ocGFyc2VkKSB7XG4gIGNvbnN0IHsgaHlkcmF0ZWQsIHZhbHVlcyB9ID0gdGhpcztcbiAgaWYgKHR5cGVvZiBwYXJzZWQgPT09IFwibnVtYmVyXCIpIHJldHVybiBoeWRyYXRlLmNhbGwodGhpcywgcGFyc2VkKTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcnNlZCkgfHwgIXBhcnNlZC5sZW5ndGgpIHRocm93IG5ldyBTeW50YXhFcnJvcigpO1xuICBjb25zdCBzdGFydEluZGV4ID0gdmFsdWVzLmxlbmd0aDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBwYXJzZWQpIHtcbiAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gIH1cbiAgaHlkcmF0ZWQubGVuZ3RoID0gdmFsdWVzLmxlbmd0aDtcbiAgcmV0dXJuIGh5ZHJhdGUuY2FsbCh0aGlzLCBzdGFydEluZGV4KTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGUoaW5kZXgpIHtcbiAgY29uc3QgeyBoeWRyYXRlZCwgdmFsdWVzLCBkZWZlcnJlZCwgcGx1Z2lucyB9ID0gdGhpcztcbiAgbGV0IHJlc3VsdDtcbiAgY29uc3Qgc3RhY2sgPSBbXG4gICAgW1xuICAgICAgaW5kZXgsXG4gICAgICAodikgPT4ge1xuICAgICAgICByZXN1bHQgPSB2O1xuICAgICAgfVxuICAgIF1cbiAgXTtcbiAgbGV0IHBvc3RSdW4gPSBbXTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBbaW5kZXgyLCBzZXRdID0gc3RhY2sucG9wKCk7XG4gICAgc3dpdGNoIChpbmRleDIpIHtcbiAgICAgIGNhc2UgVU5ERUZJTkVEOlxuICAgICAgICBzZXQodm9pZCAwKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICBjYXNlIE5VTEw6XG4gICAgICAgIHNldChudWxsKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICBjYXNlIE5BTjpcbiAgICAgICAgc2V0KE5hTik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgY2FzZSBQT1NJVElWRV9JTkZJTklUWTpcbiAgICAgICAgc2V0KEluZmluaXR5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICBjYXNlIE5FR0FUSVZFX0lORklOSVRZOlxuICAgICAgICBzZXQoLUluZmluaXR5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICBjYXNlIE5FR0FUSVZFX1pFUk86XG4gICAgICAgIHNldCgtMCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoaHlkcmF0ZWRbaW5kZXgyXSkge1xuICAgICAgc2V0KGh5ZHJhdGVkW2luZGV4Ml0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2luZGV4Ml07XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGh5ZHJhdGVkW2luZGV4Ml0gPSB2YWx1ZTtcbiAgICAgIHNldCh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlWzBdID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IFt0eXBlLCBiLCBjXSA9IHZhbHVlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFRZUEVfREFURTpcbiAgICAgICAgICAgI
25114HNldChoeWRyYXRlZFtpbmRleDJdID0gbmV3IERhdGUoYikpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSBUWVBFX1VSTDpcbiAgICAgICAgICAgIHNldChoeWRyYXRlZFtpbmRleDJdID0gbmV3IFVSTChiKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIFRZUEVfQklHSU5UOlxuICAgICAgICAgICAgc2V0KGh5ZHJhdGVkW2luZGV4Ml0gPSBCaWdJbnQoYikpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSBUWVBFX1JFR0VYUDpcbiAgICAgICAgICAgIHNldChoeWRyYXRlZFtpbmRleDJdID0gbmV3IFJlZ0V4cChiLCBjKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIFRZUEVfU1lNQk9MOlxuICAgICAgICAgICAgc2V0KGh5ZHJhdGVkW2luZGV4Ml0gPSBTeW1ib2wuZm9yKGIpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgVFlQRV9TRVQ6XG4gICAgICAgICAgICBjb25zdCBuZXdTZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgICAgICAgICAgaHlkcmF0ZWRbaW5kZXgyXSA9IG5ld1NldDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB2YWx1ZS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKVxuICAgICAgICAgICAgICBzdGFjay5wdXNoKFtcbiAgICAgICAgICAgICAgICB2YWx1ZVtpXSxcbiAgICAgICAgICAgICAgICAodikgPT4ge1xuICAgICAgICAgICAgICAgICAgbmV3U2V0LmFkZCh2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgc2V0KG5ld1NldCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIFRZUEVfTUFQOlxuICAgICAgICAgICAgY29uc3QgbWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGh5ZHJhdGVkW2luZGV4Ml0gPSBtYXA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdmFsdWUubGVuZ3RoIC0gMjsgaSA+IDA7IGkgLT0gMikge1xuICAgICAgICAgICAgICBjb25zdCByID0gW107XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goW1xuICAgICAgICAgICAgICAgIHZhbHVlW2kgKyAxXSxcbiAgICAgICAgICAgICAgICAodikgPT4ge1xuICAgICAgICAgICAgICAgICAgclsxXSA9IHY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgc3RhY2sucHVzaChbXG4gICAgICAgICAgICAgICAgdmFsdWVbaV0sXG4gICAgICAgICAgICAgICAgKGspID0+IHtcbiAgICAgICAgICAgICAgICAgIHJbMF0gPSBrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIHBvc3RSdW4ucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWFwLnNldChyWzBdLCByWzFdKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXQobWFwKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgVFlQRV9OVUxMX09CSkVDVDpcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgaHlkcmF0ZWRbaW5kZXgyXSA9IG9iajtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGIpLnJldmVyc2UoKSkge1xuICAgICAgICAgICAgICBjb25zdCByID0gW107XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goW1xuICAgICAgICAgICAgICAgIGJba2V5XSxcbiAgICAgICAgICAgICAgICAodikgPT4ge1xuICAgICAgICAgICAgICAgICAgclsxXSA9IHY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgc3RhY2sucHVzaChbXG4gICAgICAgICAgICAgICAgTnVtYmVyKGtleS5zbGljZSgxKSksXG4gICAgICAgICAgICAgICAgKGspID0+IHtcbiAgICAgICAgICAgICAgICAgIHJbMF0gPSBrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIHBvc3RSdW4ucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgb2JqW3JbMF1dID0gclsxXTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXQob2JqKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgVFlQRV9QUk9NSVNFOlxuICAgICAgICAgICAgaWYgKGh5ZHJhdGVkW2JdKSB7XG4gICAgICAgICAgICAgIHNldChoeWRyYXRlZFtpbmRleDJdID0gaHlkcmF0ZWRbYl0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEZWZlcnJlZDIoKTtcbiAgICAgICAgICAgICAgZGVmZXJyZWRbYl0gPSBkO1xuICAgICAgICAgICAgICBzZXQoaHlkcmF0ZWRbaW5kZXgyXSA9IGQucHJvbWlzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIFRZUEVfRVJST1I6XG4gICAgICAgICAgICBjb25zdCBbLCBtZXNzYWdlLCBlcnJvclR5cGVdID0gdmFsdWU7XG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBlcnJvclR5cGUgJiYgZ2xvYmFsT2JqICYmIGdsb2JhbE9ialtlcnJvclR5cGVdID8gbmV3IGdsb2JhbE9ialtlcnJvclR5cGVdKG1lc3NhZ2UpIDogbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgaHlkcmF0ZWRbaW5kZXgyXSA9IGVycm9yO1xuICAgICAgICAgICAgc2V0KGVycm9yKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgVFlQRV9QUkVWSU9VU19SRVNPTFZFRDpcbiAgICAgICAgICAgIHNldChoeWRyYXRlZFtpbmRleDJdID0gaHlkcmF0ZWRbYl0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBsdWdpbnMpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHIgPSBbXTtcbiAgICAgICAgICAgICAgY29uc3QgdmFscyA9IHZhbHVlLnNsaWNlKDEpO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdmFsc1tpXTtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKFtcbiAgICAgICAgICAgICAgICAgI
25114HYsXG4gICAgICAgICAgICAgICAgICAodjIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcltpXSA9IHYyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHBvc3RSdW4ucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0MiA9IHBsdWdpbih2YWx1ZVswXSwgLi4ucik7XG4gICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Mikge1xuICAgICAgICAgICAgICAgICAgICBzZXQoaHlkcmF0ZWRbaW5kZXgyXSA9IHJlc3VsdDIudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICAgICAgaHlkcmF0ZWRbaW5kZXgyXSA9IGFycmF5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHZhbHVlW2ldO1xuICAgICAgICAgIGlmIChuICE9PSBIT0xFKSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKFtcbiAgICAgICAgICAgICAgbixcbiAgICAgICAgICAgICAgKHYpID0+IHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXQoYXJyYXkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb2JqZWN0ID0ge307XG4gICAgICBoeWRyYXRlZFtpbmRleDJdID0gb2JqZWN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpLnJldmVyc2UoKSkge1xuICAgICAgICBjb25zdCByID0gW107XG4gICAgICAgIHN0YWNrLnB1c2goW1xuICAgICAgICAgIHZhbHVlW2tleV0sXG4gICAgICAgICAgKHYpID0+IHtcbiAgICAgICAgICAgIHJbMV0gPSB2O1xuICAgICAgICAgIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHN0YWNrLnB1c2goW1xuICAgICAgICAgIE51bWJlcihrZXkuc2xpY2UoMSkpLFxuICAgICAgICAgIChrKSA9PiB7XG4gICAgICAgICAgICByWzBdID0gaztcbiAgICAgICAgICB9XG4gICAgICAgIF0pO1xuICAgICAgICBwb3N0UnVuLnB1c2goKCkgPT4ge1xuICAgICAgICAgIG9iamVjdFtyWzBdXSA9IHJbMV07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc2V0KG9iamVjdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbiAgd2hpbGUgKHBvc3RSdW4ubGVuZ3RoID4gMCkge1xuICAgIHBvc3RSdW4ucG9wKCkoKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyB2ZW5kb3IvdHVyYm8tc3RyZWFtLXYyL3R1cmJvLXN0cmVhbS50c1xuYXN5bmMgZnVuY3Rpb24gZGVjb2RlKHJlYWRhYmxlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHsgcGx1Z2lucyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgY29uc3QgZG9uZSA9IG5ldyBEZWZlcnJlZDIoKTtcbiAgY29uc3QgcmVhZGVyID0gcmVhZGFibGUucGlwZVRocm91Z2goY3JlYXRlTGluZVNwbGl0dGluZ1RyYW5zZm9ybSgpKS5nZXRSZWFkZXIoKTtcbiAgY29uc3QgZGVjb2RlciA9IHtcbiAgICB2YWx1ZXM6IFtdLFxuICAgIGh5ZHJhdGVkOiBbXSxcbiAgICBkZWZlcnJlZDoge30sXG4gICAgcGx1Z2luc1xuICB9O1xuICBjb25zdCBkZWNvZGVkID0gYXdhaXQgZGVjb2RlSW5pdGlhbC5jYWxsKGRlY29kZXIsIHJlYWRlcik7XG4gIGxldCBkb25lUHJvbWlzZSA9IGRvbmUucHJvbWlzZTtcbiAgaWYgKGRlY29kZWQuZG9uZSkge1xuICAgIGRvbmUucmVzb2x2ZSgpO1xuICB9IGVsc2Uge1xuICAgIGRvbmVQcm9taXNlID0gZGVjb2RlRGVmZXJyZWQuY2FsbChkZWNvZGVyLCByZWFkZXIpLnRoZW4oZG9uZS5yZXNvbHZlKS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGRlZmVycmVkIG9mIE9iamVjdC52YWx1ZXMoZGVjb2Rlci5kZWZlcnJlZCkpIHtcbiAgICAgICAgZGVmZXJyZWQucmVqZWN0KHJlYXNvbik7XG4gICAgICB9XG4gICAgICBkb25lLnJlamVjdChyZWFzb24pO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgZG9uZTogZG9uZVByb21pc2UudGhlbigoKSA9PiByZWFkZXIuY2xvc2VkKSxcbiAgICB2YWx1ZTogZGVjb2RlZC52YWx1ZVxuICB9O1xufVxuYXN5bmMgZnVuY3Rpb24gZGVjb2RlSW5pdGlhbChyZWFkZXIpIHtcbiAgY29uc3QgcmVhZCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gIGlmICghcmVhZC52YWx1ZSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigpO1xuICB9XG4gIGxldCBsaW5lO1xuICB0cnkge1xuICAgIGxpbmUgPSBKU09OLnBhcnNlKHJlYWQudmFsdWUpO1xuICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGRvbmU6IHJlYWQuZG9uZSxcbiAgICB2YWx1ZTogdW5mbGF0dGVuLmNhbGwodGhpcywgbGluZSlcbiAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGRlY29kZURlZmVycmVkKHJlYWRlcikge1xuICBsZXQgcmVhZCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gIHdoaWxlICghcmVhZC5kb25lKSB7XG4gICAgaWYgKCFyZWFkLnZhbHVlKSBjb250aW51ZTtcbiAgICBjb25zdCBsaW5lID0gcmVhZC52YWx1ZTtcbiAgICBzd2l0Y2ggKGxpbmVbMF0pIHtcbiAgICAgIGNhc2UgVFlQRV9QUk9NSVNFOiB7XG4gICAgICAgIGNvbnN0IGNvbG9uSW5kZXggPSBsaW5lLmluZGV4T2YoXCI6XCIpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZElkID0gTnVtYmVyKGxpbmUuc2xpY2UoMSwgY29sb25JbmRleCkpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IHRoaXMuZGVmZXJyZWRbZGVmZXJyZWRJZF07XG4gICAgICAgIGlmICghZGVmZXJyZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlZmVycmVkIElEICR7ZGVmZXJyZWRJZH0gbm90IGZvdW5kIGluIHN0cmVhbWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpbmVEYXRhID0gbGluZS5zbGljZShjb2xvbkluZGV4ICsgMSk7XG4gICAgICAgIGxldCBqc29uTGluZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBqc29uTGluZSA9IEpTT04ucGFyc2UobGluZURhdGEpO1xuICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHVuZmxhdHRlbi5jYWxsKHRoaXMsIGpzb25MaW5lKTtcbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUWVBFX0VSUk9SOiB7XG4gICAgICAgIGNvbnN0IGNvbG9uSW5kZXggPSBsaW5lLmluZGV4T2YoXCI6XCIpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZElkID0gTnVtYmVyKGxpbmUuc2xpY2UoMSwgY29sb25JbmRleCkpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IHRoaXMuZGVmZXJyZWRbZGVmZXJyZWRJZF07XG4gICAgICAgIGlmICghZGVmZXJyZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlZmVycmVkIElEICR7ZGVmZXJyZWRJZH0gbm90IGZvdW5kIGluIHN0cmVhbWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpbmVEYXRhID0gbGluZS5zbGljZShjb2xvbkluZGV4ICsgMSk7XG4gICAgICAgIGxldCBqc29uTGluZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBqc29uTGluZSA9IEpTT04ucGFyc2UobGluZURhdGEpO1xuICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHVuZmxhdHRlbi5jYWxsKHRoaXMsIGpzb25MaW5lKTtcbiAgICAgICAgZGVmZXJyZWQucmVqZWN0KHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoKTtcbiAgICB9XG4gICAgcmVhZCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVuY29kZShpbnB1dCwgb3B0aW9ucykge1xuICBjb25zdCB7IHBsdWdpbnMsIHBvc3RQbHVnaW5zLCBzaWduYWwgfSA9IG9wdGlvbnMgPz8ge307XG4gIGNvbnN0IGVuY29kZXIgPSB7XG4gICAgZGVmZXJyZWQ6IHt9LFxuICAgIGluZGV4OiAwLFxuICAgIGluZGljZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgc3RyaW5naWZpZWQ6IFtdLFxuICAgIHBsdWdpbnMsXG4gICAgcG9zdFBsdWdpbnMsXG4gICAgc2lnbmFsXG4gIH07XG4gIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGxldCBsYXN0U2VudEluZGV4ID0gMDtcbiAgY29uc3QgcmVhZGFibGUgPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgIGNvbnN0IGlkID0gZmxhdHRlbi5jYWxsKGVuY29kZXIsIGlucHV0KTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF
251145KGlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNob3VsZCBuZXZlciBoYXBwZW5cIik7XG4gICAgICB9XG4gICAgICBpZiAoaWQgPCAwKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh0ZXh0RW5jb2Rlci5lbmNvZGUoYCR7aWR9XG5gKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoXG4gICAgICAgICAgdGV4dEVuY29kZXIuZW5jb2RlKGBbJHtlbmNvZGVyLnN0cmluZ2lmaWVkLmpvaW4oXCIsXCIpfV1cbmApXG4gICAgICAgICk7XG4gICAgICAgIGxhc3RTZW50SW5kZXggPSBlbmNvZGVyLnN0cmluZ2lmaWVkLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWVuUHJvbWlzZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhlbmNvZGVyLmRlZmVycmVkKS5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHJhY2VEb25lO1xuICAgICAgICBjb25zdCByYWNlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICByYWNlRG9uZSA9IHJlc29sdmU7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgY29uc3QgcmVqZWN0UHJvbWlzZSA9ICgpID0+IHJlamVjdChzaWduYWwucmVhc29uIHx8IG5ldyBFcnJvcihcIlNpZ25hbCB3YXMgYWJvcnRlZC5cIikpO1xuICAgICAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgIHJlamVjdFByb21pc2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0UHJvbWlzZSgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB3aGlsZSAoT2JqZWN0LmtleXMoZW5jb2Rlci5kZWZlcnJlZCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZvciAoY29uc3QgW2RlZmVycmVkSWQsIGRlZmVycmVkXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgIGVuY29kZXIuZGVmZXJyZWRcbiAgICAgICAgICApKSB7XG4gICAgICAgICAgICBpZiAoc2VlblByb21pc2VzLmhhcyhkZWZlcnJlZCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2VlblByb21pc2VzLmFkZChcbiAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgICAgZW5jb2Rlci5kZWZlcnJlZFtOdW1iZXIoZGVmZXJyZWRJZCldID0gUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICAgICAgICByYWNlUHJvbWlzZSxcbiAgICAgICAgICAgICAgICBkZWZlcnJlZFxuICAgICAgICAgICAgICBdKS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXNvbHZlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaWQyID0gZmxhdHRlbi5jYWxsKGVuY29kZXIsIHJlc29sdmVkKTtcbiAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkMikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGVyLmVuY29kZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke1RZUEVfUFJPTUlTRX0ke2RlZmVycmVkSWR9OltbXCIke1RZUEVfUFJFVklPVVNfUkVTT0xWRUR9XCIsJHtpZDJbMF19XV1cbmBcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGVuY29kZXIuaW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNlbnRJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZDIgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW5jb2Rlci5lbmNvZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtUWVBFX1BST01JU0V9JHtkZWZlcnJlZElkfToke2lkMn1cbmBcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBlbmNvZGVyLnN0cmluZ2lmaWVkLnNsaWNlKGxhc3RTZW50SW5kZXggKyAxKS5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGVyLmVuY29kZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke1RZUEVfUFJPTUlTRX0ke2RlZmVycmVkSWR9Olske3ZhbHVlc31dXG5gXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2VudEluZGV4ID0gZW5jb2Rlci5zdHJpbmdpZmllZC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFyZWFzb24gfHwgdHlwZW9mIHJlYXNvbiAhPT0gXCJvYmplY3RcIiB8fCAhKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICByZWFzb24gPSBuZXcgRXJyb3IoXCJBbiB1bmtub3duIGVycm9yIG9jY3VycmVkXCIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29uc3QgaWQyID0gZmxhdHRlbi5jYWxsKGVuY29kZXIsIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpZDIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW5jb2Rlci5lbmNvZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtUWVBFX0VSUk9SfSR7ZGVmZXJyZWRJZH06W1tcIiR7VFlQRV9QUkVWSU9VU19SRVNPTFZFRH1cIiwke2lkMlswXX1dXVxuYFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2VudEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlkMiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKFxuICAgICAgICAgICAgICAgICAgICAgI
25114HRleHRFbmNvZGVyLmVuY29kZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke1RZUEVfRVJST1J9JHtkZWZlcnJlZElkfToke2lkMn1cbmBcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBlbmNvZGVyLnN0cmluZ2lmaWVkLnNsaWNlKGxhc3RTZW50SW5kZXggKyAxKS5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGVyLmVuY29kZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke1RZUEVfRVJST1J9JHtkZWZlcnJlZElkfTpbJHt2YWx1ZXN9XVxuYFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNlbnRJbmRleCA9IGVuY29kZXIuc3RyaW5naWZpZWQubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGVuY29kZXIuZGVmZXJyZWRbTnVtYmVyKGRlZmVycmVkSWQpXTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IFByb21pc2UucmFjZShPYmplY3QudmFsdWVzKGVuY29kZXIuZGVmZXJyZWQpKTtcbiAgICAgICAgfVxuICAgICAgICByYWNlRG9uZSgpO1xuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LnZhbHVlcyhlbmNvZGVyLmRlZmVycmVkKSk7XG4gICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlYWRhYmxlO1xufVxuXG4vLyBsaWIvZG9tL3Nzci9kYXRhLnRzXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0SW5pdChyZXF1ZXN0KSB7XG4gIGxldCBpbml0ID0geyBzaWduYWw6IHJlcXVlc3Quc2lnbmFsIH07XG4gIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gXCJHRVRcIikge1xuICAgIGluaXQubWV0aG9kID0gcmVxdWVzdC5tZXRob2Q7XG4gICAgbGV0IGNvbnRlbnRUeXBlID0gcmVxdWVzdC5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKTtcbiAgICBpZiAoY29udGVudFR5cGUgJiYgL1xcYmFwcGxpY2F0aW9uXFwvanNvblxcYi8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICAgIGluaXQuaGVhZGVycyA9IHsgXCJDb250ZW50LVR5cGVcIjogY29udGVudFR5cGUgfTtcbiAgICAgIGluaXQuYm9keSA9IEpTT04uc3RyaW5naWZ5KGF3YWl0IHJlcXVlc3QuanNvbigpKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlICYmIC9cXGJ0ZXh0XFwvcGxhaW5cXGIvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgICBpbml0LmhlYWRlcnMgPSB7IFwiQ29udGVudC1UeXBlXCI6IGNvbnRlbnRUeXBlIH07XG4gICAgICBpbml0LmJvZHkgPSBhd2FpdCByZXF1ZXN0LnRleHQoKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlICYmIC9cXGJhcHBsaWNhdGlvblxcL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxcYi8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICAgIGluaXQuYm9keSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoYXdhaXQgcmVxdWVzdC50ZXh0KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbml0LmJvZHkgPSBhd2FpdCByZXF1ZXN0LmZvcm1EYXRhKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbml0O1xufVxuXG4vLyBsaWIvZG9tL3Nzci9tYXJrdXAudHNcbnZhciBFU0NBUEVfTE9PS1VQID0ge1xuICBcIiZcIjogXCJcXFxcdTAwMjZcIixcbiAgXCI+XCI6IFwiXFxcXHUwMDNlXCIsXG4gIFwiPFwiOiBcIlxcXFx1MDAzY1wiLFxuICBcIlxcdTIwMjhcIjogXCJcXFxcdTIwMjhcIixcbiAgXCJcXHUyMDI5XCI6IFwiXFxcXHUyMDI5XCJcbn07XG52YXIgRVNDQVBFX1JFR0VYID0gL1smPjxcXHUyMDI4XFx1MjAyOV0vZztcbmZ1bmN0aW9uIGVzY2FwZUh0bWwoaHRtbCkge1xuICByZXR1cm4gaHRtbC5yZXBsYWNlKEVTQ0FQRV9SRUdFWCwgKG1hdGNoKSA9PiBFU0NBUEVfTE9PS1VQW21hdGNoXSk7XG59XG5cbi8vIGxpYi9kb20vc3NyL2ludmFyaWFudC50c1xuZnVuY3Rpb24gaW52YXJpYW50Mih2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vLyBsaWIvZG9tL3Nzci9zaW5nbGUtZmV0Y2gudHN4XG52YXIgU2luZ2xlRmV0Y2hSZWRpcmVjdFN5bWJvbCA9IFN5bWJvbChcIlNpbmdsZUZldGNoUmVkaXJlY3RcIik7XG52YXIgU2luZ2xlRmV0Y2hOb1Jlc3VsdEVycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG59O1xudmFyIFNJTkdMRV9GRVRDSF9SRURJUkVDVF9TVEFUVVMgPSAyMDI7XG52YXIgTk9fQk9EWV9TVEFUVVNfQ09ERVMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbMTAwLCAxMDEsIDIwNCwgMjA1XSk7XG5mdW5jdGlvbiBTdHJlYW1UcmFuc2Zlcih7XG4gIGNvbnRleHQsXG4gIGlkZW50aWZpZXIsXG4gIHJlYWRlcixcbiAgdGV4dERlY29kZXIsXG4gIG5vbmNlXG59KSB7XG4gIGlmICghY29udGV4dC5yZW5kZXJNZXRhIHx8ICFjb250ZXh0LnJlbmRlck1ldGEuZGlkUmVuZGVyU2NyaXB0cykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghY29udGV4dC5yZW5kZXJNZXRhLnN0cmVhbUNhY2hlKSB7XG4gICAgY29udGV4dC5yZW5kZXJNZXRhLnN0cmVhbUNhY2hlID0ge307XG4gIH1cbiAgbGV0IHsgc3RyZWFtQ2FjaGUgfSA9IGNvbnRleHQucmVuZGVyTWV0YTtcbiAgbGV0IHByb21pc2UgPSBzdHJlYW1DYWNoZVtpZGVudGlmaWVyXTtcbiAgaWYgKCFwcm9taXNlKSB7XG4gICAgcHJvbWlzZSA9IHN0cmVhbUNhY2hlW2lkZW50aWZpZXJdID0gcmVhZGVyLnJlYWQoKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIHN0cmVhbUNhY2hlW2lkZW50aWZpZXJdLnJlc3VsdCA9IHtcbiAgICAgICAgZG9uZTogcmVzdWx0LmRvbmUsXG4gICAgICAgI
25114HZhbHVlOiB0ZXh0RGVjb2Rlci5kZWNvZGUocmVzdWx0LnZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KVxuICAgICAgfTtcbiAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgc3RyZWFtQ2FjaGVbaWRlbnRpZmllcl0uZXJyb3IgPSBlO1xuICAgIH0pO1xuICB9XG4gIGlmIChwcm9taXNlLmVycm9yKSB7XG4gICAgdGhyb3cgcHJvbWlzZS5lcnJvcjtcbiAgfVxuICBpZiAocHJvbWlzZS5yZXN1bHQgPT09IHZvaWQgMCkge1xuICAgIHRocm93IHByb21pc2U7XG4gIH1cbiAgbGV0IHsgZG9uZSwgdmFsdWUgfSA9IHByb21pc2UucmVzdWx0O1xuICBsZXQgc2NyaXB0VGFnID0gdmFsdWUgPyAvKiBAX19QVVJFX18gKi8gUmVhY3Q0LmNyZWF0ZUVsZW1lbnQoXG4gICAgXCJzY3JpcHRcIixcbiAgICB7XG4gICAgICBub25jZSxcbiAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgIF9faHRtbDogYHdpbmRvdy5fX3JlYWN0Um91dGVyQ29udGV4dC5zdHJlYW1Db250cm9sbGVyLmVucXVldWUoJHtlc2NhcGVIdG1sKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgICAgICApfSk7YFxuICAgICAgfVxuICAgIH1cbiAgKSA6IG51bGw7XG4gIGlmIChkb25lKSB7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDQuY3JlYXRlRWxlbWVudChSZWFjdDQuRnJhZ21lbnQsIG51bGwsIHNjcmlwdFRhZywgLyogQF9fUFVSRV9fICovIFJlYWN0NC5jcmVhdGVFbGVtZW50KFxuICAgICAgXCJzY3JpcHRcIixcbiAgICAgIHtcbiAgICAgICAgbm9uY2UsXG4gICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgICAgX19odG1sOiBgd2luZG93Ll9fcmVhY3RSb3V0ZXJDb250ZXh0LnN0cmVhbUNvbnRyb2xsZXIuY2xvc2UoKTtgXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0NC5jcmVhdGVFbGVtZW50KFJlYWN0NC5GcmFnbWVudCwgbnVsbCwgc2NyaXB0VGFnLCAvKiBAX19QVVJFX18gKi8gUmVhY3Q0LmNyZWF0ZUVsZW1lbnQoUmVhY3Q0LlN1c3BlbnNlLCBudWxsLCAvKiBAX19QVVJFX18gKi8gUmVhY3Q0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICBTdHJlYW1UcmFuc2ZlcixcbiAgICAgIHtcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllciArIDEsXG4gICAgICAgIHJlYWRlcixcbiAgICAgICAgdGV4dERlY29kZXIsXG4gICAgICAgIG5vbmNlXG4gICAgICB9XG4gICAgKSkpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUdXJib1N0cmVhbVNpbmdsZUZldGNoRGF0YVN0cmF0ZWd5KGdldFJvdXRlciwgbWFuaWZlc3QsIHJvdXRlTW9kdWxlcywgc3NyLCBiYXNlbmFtZSkge1xuICBsZXQgZGF0YVN0cmF0ZWd5ID0gZ2V0U2luZ2xlRmV0Y2hEYXRhU3RyYXRlZ3lJbXBsKFxuICAgIGdldFJvdXRlcixcbiAgICAobWF0Y2gpID0+IHtcbiAgICAgIGxldCBtYW5pZmVzdFJvdXRlID0gbWFuaWZlc3Qucm91dGVzW21hdGNoLnJvdXRlLmlkXTtcbiAgICAgIGludmFyaWFudDIobWFuaWZlc3RSb3V0ZSwgXCJSb3V0ZSBub3QgZm91bmQgaW4gbWFuaWZlc3RcIik7XG4gICAgICBsZXQgcm91dGVNb2R1bGUgPSByb3V0ZU1vZHVsZXNbbWF0Y2gucm91dGUuaWRdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGFzTG9hZGVyOiBtYW5pZmVzdFJvdXRlLmhhc0xvYWRlcixcbiAgICAgICAgaGFzQ2xpZW50TG9hZGVyOiBtYW5pZmVzdFJvdXRlLmhhc0NsaWVudExvYWRlcixcbiAgICAgICAgaGFzU2hvdWxkUmV2YWxpZGF0ZTogQm9vbGVhbihyb3V0ZU1vZHVsZT8uc2hvdWxkUmV2YWxpZGF0ZSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBmZXRjaEFuZERlY29kZVZpYVR1cmJvU3RyZWFtLFxuICAgIHNzcixcbiAgICBiYXNlbmFtZVxuICApO1xuICByZXR1cm4gYXN5bmMgKGFyZ3MpID0+IGFyZ3MucnVuQ2xpZW50TWlkZGxld2FyZShkYXRhU3RyYXRlZ3kpO1xufVxuZnVuY3Rpb24gZ2V0U2luZ2xlRmV0Y2hEYXRhU3RyYXRlZ3lJbXBsKGdldFJvdXRlciwgZ2V0Um91dGVJbmZvLCBmZXRjaEFuZERlY29kZSwgc3NyLCBiYXNlbmFtZSwgc2hvdWxkQWxsb3dPcHRPdXQgPSAoKSA9PiB0cnVlKSB7XG4gIHJldHVybiBhc3luYyAoYXJncykgPT4ge1xuICAgIGxldCB7IHJlcXVlc3QsIG1hdGNoZXMsIGZldGNoZXJLZXkgfSA9IGFyZ3M7XG4gICAgbGV0IHJvdXRlciA9IGdldFJvdXRlcigpO1xuICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gXCJHRVRcIikge1xuICAgICAgcmV0dXJuIHNpbmdsZUZldGNoQWN0aW9uU3RyYXRlZ3koYXJncywgZmV0Y2hBbmREZWNvZGUsIGJhc2VuYW1lKTtcbiAgICB9XG4gICAgbGV0IGZvdW5kUmV2YWxpZGF0aW5nU2VydmVyTG9hZGVyID0gbWF0Y2hlcy5zb21lKChtKSA9PiB7XG4gICAgICBsZXQgeyBoYXNMb2FkZXIsIGhhc0NsaWVudExvYWRlciB9ID0gZ2V0Um91dGVJbmZvKG0pO1xuICAgICAgcmV0dXJuIG0udW5zdGFibGVfc2hvdWxkQ2FsbEhhbmRsZXIoKSAmJiBoYXNMb2FkZXIgJiYgIWhhc0NsaWVudExvYWRlcjtcbiAgICB9KTtcbiAgICBpZiAoIXNzciAmJiAhZm91bmRSZXZhbGlkYXRpbmdTZXJ2ZXJMb2FkZXIpIHtcbiAgICAgIHJldHVybiBub25Tc3JTdHJhdGVneShhcmdzLCBnZXRSb3V0ZUluZm8sIGZldGNoQW5kRGVjb2RlLCBiYXNlbmFtZSk7XG4gICAgfVxuICAgIGlmIChmZXRjaGVyS2V5KSB7XG4gICAgICByZXR1cm4gc2luZ2xlRmV0Y2hMb2FkZXJGZXRjaGVyU3RyYXRlZ3koYXJncywgZmV0Y2hBbmREZWNvZGUsIGJhc2VuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpbmdsZUZldGNoTG9hZGVyTmF2aWdhdGlvblN0cmF0ZWd5KFxuICAgICAgYXJncyxcbiAgICAgIHJvdXRlcixcbiAgICAgIGdldFJvdXRlSW5mbyxcbiAgICAgIGZldGNoQW5kRGVjb2RlLFxuICAgICAgc3NyLFxuICAgICAgYmFzZW5hbWUsXG4gICAgICBzaG91bGRBbGxvd09wdE91dFxuICAgICk7XG4gIH07XG59XG5hc3luYyBmdW5jdGlvbiBzaW5nbGVGZXRjaEFjdGlvblN0cmF0ZWd5KGFyZ3MsIGZldGNoQW5kRGVjb2RlLCBiYXNlbmFtZSkge1xuICBsZXQgYWN0aW9uTWF0Y2ggPSBhcmdzLm1hdGNoZXMuZmluZCgobSkgPT4gbS51bnN0YWJsZV9zaG91bGRDYWxsSGFuZGxlcigpKTtcbiAgaW52YXJpYW50MihhY3Rpb25NYXRjaCwgXCJObyBhY3Rpb24gbWF0Y2ggZm91bmRcIik7XG4gIGxldCBhY3Rpb25TdGF0dXMgPSB2b2lkIDA7XG4gIGxldCByZXN1bHQgPSBhd2FpdCBhY3Rpb25NYXRjaC5yZXNvbHZlKGFzeW5jIChoYW5kbGVyKSA9PiB7XG4gICAgbGV0IHJlc3VsdDIgPSBhd2FpdCBoYW5kbGVyKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCB7IGRhdGE6IGRhdGEyLCBzdGF0dXMgfSA9IGF3YWl0IGZldGNoQW5kRGVjb2RlKGFyZ3MsIGJhc2VuYW1lLCBbXG4gICAgICAgIGFjdGlvbk1hdGNoLnJvdXRlLmlkXG4gICAgICBdKTtcbiAgICAgIGFjdGlvblN0YXR1cyA9IHN0YXR1cztcbiAgICAgIHJldHVybi
25114B1bndyYXBTaW5nbGVGZXRjaFJlc3VsdChkYXRhMiwgYWN0aW9uTWF0Y2gucm91dGUuaWQpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQyO1xuICB9KTtcbiAgaWYgKGlzUmVzcG9uc2UocmVzdWx0LnJlc3VsdCkgfHwgaXNSb3V0ZUVycm9yUmVzcG9uc2UocmVzdWx0LnJlc3VsdCkgfHwgaXNEYXRhV2l0aFJlc3BvbnNlSW5pdChyZXN1bHQucmVzdWx0KSkge1xuICAgIHJldHVybiB7IFthY3Rpb25NYXRjaC5yb3V0ZS5pZF06IHJlc3VsdCB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgW2FjdGlvbk1hdGNoLnJvdXRlLmlkXToge1xuICAgICAgdHlwZTogcmVzdWx0LnR5cGUsXG4gICAgICByZXN1bHQ6IGRhdGEocmVzdWx0LnJlc3VsdCwgYWN0aW9uU3RhdHVzKVxuICAgIH1cbiAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIG5vblNzclN0cmF0ZWd5KGFyZ3MsIGdldFJvdXRlSW5mbywgZmV0Y2hBbmREZWNvZGUsIGJhc2VuYW1lKSB7XG4gIGxldCBtYXRjaGVzVG9Mb2FkID0gYXJncy5tYXRjaGVzLmZpbHRlcihcbiAgICAobSkgPT4gbS51bnN0YWJsZV9zaG91bGRDYWxsSGFuZGxlcigpXG4gICk7XG4gIGxldCByZXN1bHRzID0ge307XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIG1hdGNoZXNUb0xvYWQubWFwKFxuICAgICAgKG0pID0+IG0ucmVzb2x2ZShhc3luYyAoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCB7IGhhc0NsaWVudExvYWRlciB9ID0gZ2V0Um91dGVJbmZvKG0pO1xuICAgICAgICAgIGxldCByb3V0ZUlkID0gbS5yb3V0ZS5pZDtcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gaGFzQ2xpZW50TG9hZGVyID8gYXdhaXQgaGFuZGxlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBkYXRhOiBkYXRhMiB9ID0gYXdhaXQgZmV0Y2hBbmREZWNvZGUoYXJncywgYmFzZW5hbWUsIFtyb3V0ZUlkXSk7XG4gICAgICAgICAgICByZXR1cm4gdW53cmFwU2luZ2xlRmV0Y2hSZXN1bHQoZGF0YTIsIHJvdXRlSWQpO1xuICAgICAgICAgIH0pIDogYXdhaXQgaGFuZGxlcigpO1xuICAgICAgICAgIHJlc3VsdHNbbS5yb3V0ZS5pZF0gPSB7IHR5cGU6IFwiZGF0YVwiLCByZXN1bHQgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlc3VsdHNbbS5yb3V0ZS5pZF0gPSB7IHR5cGU6IFwiZXJyb3JcIiwgcmVzdWx0OiBlIH07XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICApO1xuICByZXR1cm4gcmVzdWx0cztcbn1cbmFzeW5jIGZ1bmN0aW9uIHNpbmdsZUZldGNoTG9hZGVyTmF2aWdhdGlvblN0cmF0ZWd5KGFyZ3MsIHJvdXRlciwgZ2V0Um91dGVJbmZvLCBmZXRjaEFuZERlY29kZSwgc3NyLCBiYXNlbmFtZSwgc2hvdWxkQWxsb3dPcHRPdXQgPSAoKSA9PiB0cnVlKSB7XG4gIGxldCByb3V0ZXNQYXJhbXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBsZXQgZm91bmRPcHRPdXRSb3V0ZSA9IGZhbHNlO1xuICBsZXQgcm91dGVEZmRzID0gYXJncy5tYXRjaGVzLm1hcCgoKSA9PiBjcmVhdGVEZWZlcnJlZDIoKSk7XG4gIGxldCBzaW5nbGVGZXRjaERmZCA9IGNyZWF0ZURlZmVycmVkMigpO1xuICBsZXQgcmVzdWx0cyA9IHt9O1xuICBsZXQgcmVzb2x2ZVByb21pc2UgPSBQcm9taXNlLmFsbChcbiAgICBhcmdzLm1hdGNoZXMubWFwKFxuICAgICAgYXN5bmMgKG0sIGkpID0+IG0ucmVzb2x2ZShhc3luYyAoaGFuZGxlcikgPT4ge1xuICAgICAgICByb3V0ZURmZHNbaV0ucmVzb2x2ZSgpO1xuICAgICAgICBsZXQgcm91dGVJZCA9IG0ucm91dGUuaWQ7XG4gICAgICAgIGxldCB7IGhhc0xvYWRlciwgaGFzQ2xpZW50TG9hZGVyLCBoYXNTaG91bGRSZXZhbGlkYXRlIH0gPSBnZXRSb3V0ZUluZm8obSk7XG4gICAgICAgIGxldCBkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZSA9ICFtLnVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzIHx8IG0udW5zdGFibGVfc2hvdWxkUmV2YWxpZGF0ZUFyZ3MuYWN0aW9uU3RhdHVzID09IG51bGwgfHwgbS51bnN0YWJsZV9zaG91bGRSZXZhbGlkYXRlQXJncy5hY3Rpb25TdGF0dXMgPCA0MDA7XG4gICAgICAgIGxldCBzaG91bGRDYWxsID0gbS51bnN0YWJsZV9zaG91bGRDYWxsSGFuZGxlcihkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZSk7XG4gICAgICAgIGlmICghc2hvdWxkQ2FsbCkge1xuICAgICAgICAgIGZvdW5kT3B0T3V0Um91dGUgfHwgKGZvdW5kT3B0T3V0Um91dGUgPSBtLnVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzICE9IG51bGwgJiYgLy8gVGhpcyBpcyBhIHJldmFsaWRhdGlvbixcbiAgICAgICAgICBoYXNMb2FkZXIgJiYgLy8gZm9yIGEgcm91dGUgd2l0aCBhIHNlcnZlciBsb2FkZXIsXG4gICAgICAgICAgaGFzU2hvdWxkUmV2YWxpZGF0ZSA9PT0gdHJ1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRBbGxvd09wdE91dChtKSAmJiBoYXNDbGllbnRMb2FkZXIpIHtcbiAgICAgICAgICBpZiAoaGFzTG9hZGVyKSB7XG4gICAgICAgICAgICBmb3VuZE9wdE91dFJvdXRlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHsgZGF0YTogZGF0YTIgfSA9IGF3YWl0IGZldGNoQW5kRGVjb2RlKGFyZ3MsIGJhc2VuYW1lLCBbcm91dGVJZF0pO1xuICAgICAgICAgICAgICByZXR1cm4gdW53cmFwU2luZ2xlRmV0Y2hSZXN1bHQoZGF0YTIsIHJvdXRlSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHRzW3JvdXRlSWRdID0geyB0eXBlOiBcImRhdGFcIiwgcmVzdWx0IH07XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVzdWx0c1tyb3V0ZUlkXSA9IHsgdHlwZTogXCJlcnJvclwiLCByZXN1bHQ6IGUgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNMb2FkZXIpIHtcbiAgICAgICAgICByb3V0ZXNQYXJhbXMuYWRkKHJvdXRlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGRhdGEyID0gYXdhaXQgc2luZ2xlRmV0Y2hEZmQucHJvbWlzZTtcbiAgICAgICAgICAgI
25114HJldHVybiB1bndyYXBTaW5nbGVGZXRjaFJlc3VsdChkYXRhMiwgcm91dGVJZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzdWx0c1tyb3V0ZUlkXSA9IHsgdHlwZTogXCJkYXRhXCIsIHJlc3VsdCB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVzdWx0c1tyb3V0ZUlkXSA9IHsgdHlwZTogXCJlcnJvclwiLCByZXN1bHQ6IGUgfTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApXG4gICk7XG4gIGF3YWl0IFByb21pc2UuYWxsKHJvdXRlRGZkcy5tYXAoKGQpID0+IGQucHJvbWlzZSkpO1xuICBsZXQgaXNJbml0aWFsTG9hZCA9ICFyb3V0ZXIuc3RhdGUuaW5pdGlhbGl6ZWQgJiYgcm91dGVyLnN0YXRlLm5hdmlnYXRpb24uc3RhdGUgPT09IFwiaWRsZVwiO1xuICBpZiAoKGlzSW5pdGlhbExvYWQgfHwgcm91dGVzUGFyYW1zLnNpemUgPT09IDApICYmICF3aW5kb3cuX19yZWFjdFJvdXRlckhkckFjdGl2ZSkge1xuICAgIHNpbmdsZUZldGNoRGZkLnJlc29sdmUoeyByb3V0ZXM6IHt9IH0pO1xuICB9IGVsc2Uge1xuICAgIGxldCB0YXJnZXRSb3V0ZXMgPSBzc3IgJiYgZm91bmRPcHRPdXRSb3V0ZSAmJiByb3V0ZXNQYXJhbXMuc2l6ZSA+IDAgPyBbLi4ucm91dGVzUGFyYW1zLmtleXMoKV0gOiB2b2lkIDA7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBkYXRhMiA9IGF3YWl0IGZldGNoQW5kRGVjb2RlKGFyZ3MsIGJhc2VuYW1lLCB0YXJnZXRSb3V0ZXMpO1xuICAgICAgc2luZ2xlRmV0Y2hEZmQucmVzb2x2ZShkYXRhMi5kYXRhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaW5nbGVGZXRjaERmZC5yZWplY3QoZSk7XG4gICAgfVxuICB9XG4gIGF3YWl0IHJlc29sdmVQcm9taXNlO1xuICBhd2FpdCBidWJibGVNaWRkbGV3YXJlRXJyb3JzKFxuICAgIHNpbmdsZUZldGNoRGZkLnByb21pc2UsXG4gICAgYXJncy5tYXRjaGVzLFxuICAgIHJvdXRlc1BhcmFtcyxcbiAgICByZXN1bHRzXG4gICk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuYXN5bmMgZnVuY3Rpb24gYnViYmxlTWlkZGxld2FyZUVycm9ycyhzaW5nbGVGZXRjaFByb21pc2UsIG1hdGNoZXMsIHJvdXRlc1BhcmFtcywgcmVzdWx0cykge1xuICB0cnkge1xuICAgIGxldCBtaWRkbGV3YXJlRXJyb3I7XG4gICAgbGV0IGZldGNoZWREYXRhID0gYXdhaXQgc2luZ2xlRmV0Y2hQcm9taXNlO1xuICAgIGlmIChcInJvdXRlc1wiIGluIGZldGNoZWREYXRhKSB7XG4gICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgIGlmIChtYXRjaC5yb3V0ZS5pZCBpbiBmZXRjaGVkRGF0YS5yb3V0ZXMpIHtcbiAgICAgICAgICBsZXQgcm91dGVSZXN1bHQgPSBmZXRjaGVkRGF0YS5yb3V0ZXNbbWF0Y2gucm91dGUuaWRdO1xuICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gcm91dGVSZXN1bHQpIHtcbiAgICAgICAgICAgIG1pZGRsZXdhcmVFcnJvciA9IHJvdXRlUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgaWYgKHJlc3VsdHNbbWF0Y2gucm91dGUuaWRdPy5yZXN1bHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXN1bHRzW21hdGNoLnJvdXRlLmlkXSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiBtaWRkbGV3YXJlRXJyb3JcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWlkZGxld2FyZUVycm9yICE9PSB2b2lkIDApIHtcbiAgICAgIEFycmF5LmZyb20ocm91dGVzUGFyYW1zLnZhbHVlcygpKS5mb3JFYWNoKChyb3V0ZUlkKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHRzW3JvdXRlSWRdLnJlc3VsdCBpbnN0YW5jZW9mIFNpbmdsZUZldGNoTm9SZXN1bHRFcnJvcikge1xuICAgICAgICAgIHJlc3VsdHNbcm91dGVJZF0ucmVzdWx0ID0gbWlkZGxld2FyZUVycm9yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gc2luZ2xlRmV0Y2hMb2FkZXJGZXRjaGVyU3RyYXRlZ3koYXJncywgZmV0Y2hBbmREZWNvZGUsIGJhc2VuYW1lKSB7XG4gIGxldCBmZXRjaGVyTWF0Y2ggPSBhcmdzLm1hdGNoZXMuZmluZCgobSkgPT4gbS51bnN0YWJsZV9zaG91bGRDYWxsSGFuZGxlcigpKTtcbiAgaW52YXJpYW50MihmZXRjaGVyTWF0Y2gsIFwiTm8gZmV0Y2hlciBtYXRjaCBmb3VuZFwiKTtcbiAgbGV0IHJvdXRlSWQgPSBmZXRjaGVyTWF0Y2gucm91dGUuaWQ7XG4gIGxldCByZXN1bHQgPSBhd2FpdCBmZXRjaGVyTWF0Y2gucmVzb2x2ZShcbiAgICBhc3luYyAoaGFuZGxlcikgPT4gaGFuZGxlcihhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgeyBkYXRhOiBkYXRhMiB9ID0gYXdhaXQgZmV0Y2hBbmREZWNvZGUoYXJncywgYmFzZW5hbWUsIFtyb3V0ZUlkXSk7XG4gICAgICByZXR1cm4gdW53cmFwU2luZ2xlRmV0Y2hSZXN1bHQoZGF0YTIsIHJvdXRlSWQpO1xuICAgIH0pXG4gICk7XG4gIHJldHVybiB7IFtmZXRjaGVyTWF0Y2gucm91dGUuaWRdOiByZXN1bHQgfTtcbn1cbmZ1bmN0aW9uIHN0cmlwSW5kZXhQYXJhbSh1cmwpIHtcbiAgbGV0IGluZGV4VmFsdWVzID0gdXJsLnNlYXJjaFBhcmFtcy5nZXRBbGwoXCJpbmRleFwiKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoXCJpbmRleFwiKTtcbiAgbGV0IGluZGV4VmFsdWVzVG9LZWVwID0gW107XG4gIGZvciAobGV0IGluZGV4VmFsdWUgb2YgaW5kZXhWYWx1ZXMpIHtcbiAgICBpZiAoaW5kZXhWYWx1ZSkge1xuICAgICAgaW5kZXhWYWx1ZXNUb0tlZXAucHVzaChpbmRleFZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZm9yIChsZXQgdG9LZWVwIG9mIGluZGV4VmFsdWVzVG9LZWVwKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJpbmRleFwiLCB0b0tlZXApO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5mdW5jdGlvbiBzaW5nbGVGZXRjaFVybChyZXFVcmwsIGJhc2VuYW1lLCBleHRlbnNpb24pIHtcbiAgbGV0IHVybCA9IHR5cGVvZiByZXFVcmwgPT09IFwic3RyaW5nXCIgPyBuZXcgVVJMKFxuICAgIHJlcVVybCxcbiAgICAvLyBUaGlzIGNhbiBiZSBjYWxsZWQgZHVyaW5nIHRoZSBTU1IgZmxvdyB2aWEgUHJlZmV0Y2hQYWdlTGlua3NJbXBsIHNvXG4gICAgLy8gZG9uJ3QgYXNzdW1lIH
25114dpbmRvdyBpcyBhdmFpbGFibGVcbiAgICB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiID8gXCJzZXJ2ZXI6Ly9zaW5nbGVmZXRjaC9cIiA6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW5cbiAgKSA6IHJlcVVybDtcbiAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvXCIpIHtcbiAgICB1cmwucGF0aG5hbWUgPSBgX3Jvb3QuJHtleHRlbnNpb259YDtcbiAgfSBlbHNlIGlmIChiYXNlbmFtZSAmJiBzdHJpcEJhc2VuYW1lKHVybC5wYXRobmFtZSwgYmFzZW5hbWUpID09PSBcIi9cIikge1xuICAgIHVybC5wYXRobmFtZSA9IGAke2Jhc2VuYW1lLnJlcGxhY2UoL1xcLyQvLCBcIlwiKX0vX3Jvb3QuJHtleHRlbnNpb259YDtcbiAgfSBlbHNlIHtcbiAgICB1cmwucGF0aG5hbWUgPSBgJHt1cmwucGF0aG5hbWUucmVwbGFjZSgvXFwvJC8sIFwiXCIpfS4ke2V4dGVuc2lvbn1gO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5hc3luYyBmdW5jdGlvbiBmZXRjaEFuZERlY29kZVZpYVR1cmJvU3RyZWFtKGFyZ3MsIGJhc2VuYW1lLCB0YXJnZXRSb3V0ZXMpIHtcbiAgbGV0IHsgcmVxdWVzdCB9ID0gYXJncztcbiAgbGV0IHVybCA9IHNpbmdsZUZldGNoVXJsKHJlcXVlc3QudXJsLCBiYXNlbmFtZSwgXCJkYXRhXCIpO1xuICBpZiAocmVxdWVzdC5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICB1cmwgPSBzdHJpcEluZGV4UGFyYW0odXJsKTtcbiAgICBpZiAodGFyZ2V0Um91dGVzKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcIl9yb3V0ZXNcIiwgdGFyZ2V0Um91dGVzLmpvaW4oXCIsXCIpKTtcbiAgICB9XG4gIH1cbiAgbGV0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgYXdhaXQgY3JlYXRlUmVxdWVzdEluaXQocmVxdWVzdCkpO1xuICBpZiAocmVzLnN0YXR1cyA+PSA0MDAgJiYgIXJlcy5oZWFkZXJzLmhhcyhcIlgtUmVtaXgtUmVzcG9uc2VcIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JSZXNwb25zZUltcGwocmVzLnN0YXR1cywgcmVzLnN0YXR1c1RleHQsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICB9XG4gIGlmIChyZXMuc3RhdHVzID09PSAyMDQgJiYgcmVzLmhlYWRlcnMuaGFzKFwiWC1SZW1peC1SZWRpcmVjdFwiKSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFNJTkdMRV9GRVRDSF9SRURJUkVDVF9TVEFUVVMsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlZGlyZWN0OiB7XG4gICAgICAgICAgcmVkaXJlY3Q6IHJlcy5oZWFkZXJzLmdldChcIlgtUmVtaXgtUmVkaXJlY3RcIiksXG4gICAgICAgICAgc3RhdHVzOiBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KFwiWC1SZW1peC1TdGF0dXNcIikgfHwgXCIzMDJcIiksXG4gICAgICAgICAgcmV2YWxpZGF0ZTogcmVzLmhlYWRlcnMuZ2V0KFwiWC1SZW1peC1SZXZhbGlkYXRlXCIpID09PSBcInRydWVcIixcbiAgICAgICAgICByZWxvYWQ6IHJlcy5oZWFkZXJzLmdldChcIlgtUmVtaXgtUmVsb2FkLURvY3VtZW50XCIpID09PSBcInRydWVcIixcbiAgICAgICAgICByZXBsYWNlOiByZXMuaGVhZGVycy5nZXQoXCJYLVJlbWl4LVJlcGxhY2VcIikgPT09IFwidHJ1ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGlmIChOT19CT0RZX1NUQVRVU19DT0RFUy5oYXMocmVzLnN0YXR1cykpIHtcbiAgICBsZXQgcm91dGVzID0ge307XG4gICAgaWYgKHRhcmdldFJvdXRlcyAmJiByZXF1ZXN0Lm1ldGhvZCAhPT0gXCJHRVRcIikge1xuICAgICAgcm91dGVzW3RhcmdldFJvdXRlc1swXV0gPSB7IGRhdGE6IHZvaWQgMCB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgZGF0YTogeyByb3V0ZXMgfVxuICAgIH07XG4gIH1cbiAgaW52YXJpYW50MihyZXMuYm9keSwgXCJObyByZXNwb25zZSBib2R5IHRvIGRlY29kZVwiKTtcbiAgdHJ5IHtcbiAgICBsZXQgZGVjb2RlZCA9IGF3YWl0IGRlY29kZVZpYVR1cmJvU3RyZWFtKHJlcy5ib2R5LCB3aW5kb3cpO1xuICAgIGxldCBkYXRhMjtcbiAgICBpZiAocmVxdWVzdC5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIGxldCB0eXBlZCA9IGRlY29kZWQudmFsdWU7XG4gICAgICBpZiAoU2luZ2xlRmV0Y2hSZWRpcmVjdFN5bWJvbCBpbiB0eXBlZCkge1xuICAgICAgICBkYXRhMiA9IHsgcmVkaXJlY3Q6IHR5cGVkW1NpbmdsZUZldGNoUmVkaXJlY3RTeW1ib2xdIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhMiA9IHsgcm91dGVzOiB0eXBlZCB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdHlwZWQgPSBkZWNvZGVkLnZhbHVlO1xuICAgICAgbGV0IHJvdXRlSWQgPSB0YXJnZXRSb3V0ZXM/LlswXTtcbiAgICAgIGludmFyaWFudDIocm91dGVJZCwgXCJObyByb3V0ZUlkIGZvdW5kIGZvciBzaW5nbGUgZmV0Y2ggY2FsbCBkZWNvZGluZ1wiKTtcbiAgICAgIGlmIChcInJlZGlyZWN0XCIgaW4gdHlwZWQpIHtcbiAgICAgICAgZGF0YTIgPSB7IHJlZGlyZWN0OiB0eXBlZCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YTIgPSB7IHJvdXRlczogeyBbcm91dGVJZF06IHR5cGVkIH0gfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhdHVzOiByZXMuc3RhdHVzLCBkYXRhOiBkYXRhMiB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGRlY29kZSB0dXJiby1zdHJlYW0gcmVzcG9uc2VcIik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlY29kZVZpYVR1cmJvU3RyZWFtKGJvZHksIGdsb2JhbCkge1xuICByZXR1cm4gZGVjb2RlKGJvZHksIHtcbiAgICBwbHVnaW5zOiBbXG4gICAgICAodHlwZSwgLi4ucmVzdCkgPT4ge1xuICAgICAgICBpZiAodHlwZSA9PT0gXCJTYW5pdGl6ZWRFcnJvclwiKSB7XG4gICAgICAgICAgbGV0IFtuYW1lLCBtZXNzYWdlLCBzdGFja10gPSByZXN0O1xuICAgICAgICAgIGxldCBDb25zdHJ1Y3RvciA9IEVycm9yO1xuICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUgaW4gZ2xvYmFsICYmIHR5cGVvZiBnbG9iYWxbbmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgQ29uc3RydWN0b3IgPSBnbG9iYWxbbmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBDb25zdHJ1Y3RvcihtZXNzYWdlKTtcbiAgICAgICAgICBlcnJvci5zdGFjayA9IHN0YWNrO1xuICAgICAgICAgI
25114HJldHVybiB7IHZhbHVlOiBlcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBcIkVycm9yUmVzcG9uc2VcIikge1xuICAgICAgICAgIGxldCBbZGF0YTIsIHN0YXR1cywgc3RhdHVzVGV4dF0gPSByZXN0O1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogbmV3IEVycm9yUmVzcG9uc2VJbXBsKHN0YXR1cywgc3RhdHVzVGV4dCwgZGF0YTIpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gXCJTaW5nbGVGZXRjaFJlZGlyZWN0XCIpIHtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogeyBbU2luZ2xlRmV0Y2hSZWRpcmVjdFN5bWJvbF06IHJlc3RbMF0gfSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBcIlNpbmdsZUZldGNoQ2xhc3NJbnN0YW5jZVwiKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3RbMF0gfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gXCJTaW5nbGVGZXRjaEZhbGxiYWNrXCIpIHtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdm9pZCAwIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH0pO1xufVxuZnVuY3Rpb24gdW53cmFwU2luZ2xlRmV0Y2hSZXN1bHQocmVzdWx0LCByb3V0ZUlkKSB7XG4gIGlmIChcInJlZGlyZWN0XCIgaW4gcmVzdWx0KSB7XG4gICAgbGV0IHtcbiAgICAgIHJlZGlyZWN0OiBsb2NhdGlvbixcbiAgICAgIHJldmFsaWRhdGUsXG4gICAgICByZWxvYWQsXG4gICAgICByZXBsYWNlOiByZXBsYWNlMixcbiAgICAgIHN0YXR1c1xuICAgIH0gPSByZXN1bHQucmVkaXJlY3Q7XG4gICAgdGhyb3cgcmVkaXJlY3QobG9jYXRpb24sIHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLy8gVGhyZWUgUidzIG9mIHJlZGlyZWN0aW5nIChsb2wgVmVlcClcbiAgICAgICAgLi4ucmV2YWxpZGF0ZSA/IHsgXCJYLVJlbWl4LVJldmFsaWRhdGVcIjogXCJ5ZXNcIiB9IDogbnVsbCxcbiAgICAgICAgLi4ucmVsb2FkID8geyBcIlgtUmVtaXgtUmVsb2FkLURvY3VtZW50XCI6IFwieWVzXCIgfSA6IG51bGwsXG4gICAgICAgIC4uLnJlcGxhY2UyID8geyBcIlgtUmVtaXgtUmVwbGFjZVwiOiBcInllc1wiIH0gOiBudWxsXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgbGV0IHJvdXRlUmVzdWx0ID0gcmVzdWx0LnJvdXRlc1tyb3V0ZUlkXTtcbiAgaWYgKHJvdXRlUmVzdWx0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgU2luZ2xlRmV0Y2hOb1Jlc3VsdEVycm9yKFxuICAgICAgYE5vIHJlc3VsdCBmb3VuZCBmb3Igcm91dGVJZCBcIiR7cm91dGVJZH1cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKFwiZXJyb3JcIiBpbiByb3V0ZVJlc3VsdCkge1xuICAgIHRocm93IHJvdXRlUmVzdWx0LmVycm9yO1xuICB9IGVsc2UgaWYgKFwiZGF0YVwiIGluIHJvdXRlUmVzdWx0KSB7XG4gICAgcmV0dXJuIHJvdXRlUmVzdWx0LmRhdGE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlc3BvbnNlIGZvdW5kIGZvciByb3V0ZUlkIFwiJHtyb3V0ZUlkfVwiYCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZURlZmVycmVkMigpIHtcbiAgbGV0IHJlc29sdmU7XG4gIGxldCByZWplY3Q7XG4gIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgcmVzb2x2ZSA9IGFzeW5jICh2YWwpID0+IHtcbiAgICAgIHJlcyh2YWwpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJlamVjdCA9IGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgcmVqKGVycm9yKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHByb21pc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcHJvbWlzZSxcbiAgICAvL0B0cy1pZ25vcmVcbiAgICByZXNvbHZlLFxuICAgIC8vQHRzLWlnbm9yZVxuICAgIHJlamVjdFxuICB9O1xufVxuXG4vLyBsaWIvZG9tL3Nzci9lcnJvckJvdW5kYXJpZXMudHN4XG5pbXBvcnQgKiBhcyBSZWFjdDkgZnJvbSBcInJlYW
25114N0XCI7XG5cbi8vIGxpYi9kb20vc3NyL2NvbXBvbmVudHMudHN4XG5pbXBvcnQgKiBhcyBSZWFjdDggZnJvbSBcInJlYWN0XCI7XG5cbi8vIGxpYi9kb20vc3NyL3JvdXRlTW9kdWxlcy50c1xuYXN5bmMgZnVuY3Rpb24gbG9hZFJvdXRlTW9kdWxlKHJvdXRlLCByb3V0ZU1vZHVsZXNDYWNoZSkge1xuICBpZiAocm91dGUuaWQgaW4gcm91dGVNb2R1bGVzQ2FjaGUpIHtcbiAgICByZXR1cm4gcm91dGVNb2R1bGVzQ2FjaGVbcm91dGUuaWRdO1xuICB9XG4gIHRyeSB7XG4gICAgbGV0IHJvdXRlTW9kdWxlID0gYXdhaXQgaW1wb3J0KFxuICAgICAgLyogQHZpdGUtaWdub3JlICovXG4gICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovXG4gICAgICByb3V0ZS5tb2R1bGVcbiAgICApO1xuICAgIHJvdXRlTW9kdWxlc0NhY2hlW3JvdXRlLmlkXSA9IHJvdXRlTW9kdWxlO1xuICAgIHJldHVybiByb3V0ZU1vZHVsZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYEVycm9yIGxvYWRpbmcgcm91dGUgbW9kdWxlIFxcYCR7cm91dGUubW9kdWxlfVxcYCwgcmVsb2FkaW5nIHBhZ2UuLi5gXG4gICAgKTtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICBpZiAod2luZG93Ll9fcmVhY3RSb3V0ZXJDb250ZXh0ICYmIHdpbmRvdy5fX3JlYWN0Um91dGVyQ29udGV4dC5pc1NwYU1vZGUgJiYgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGltcG9ydC5tZXRhLmhvdCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKCkgPT4ge1xuICAgIH0pO1xuICB9XG59XG5cbi8vIGxpYi9kb20vc3NyL2xpbmtzLnRzXG5mdW5jdGlvbiBnZXRLZXllZExpbmtzRm9yTWF0Y2hlcyhtYXRjaGVzLCByb3V0ZU1vZHVsZXMsIG1hbmlmZXN0KSB7XG4gIGxldCBkZXNjcmlwdG9ycyA9IG1hdGNoZXMubWFwKChtYXRjaCkgPT4ge1xuICAgIGxldCBtb2R1bGUgPSByb3V0ZU1vZHVsZXNbbWF0Y2gucm91dGUuaWRdO1xuICAgIGxldCByb3V0ZSA9IG1hbmlmZXN0LnJvdXRlc1ttYXRjaC5yb3V0ZS5pZF07XG4gICAgcmV0dXJuIFtcbiAgICAgIHJvdXRlICYmIHJvdXRlLmNzcyA/IHJvdXRlLmNzcy5tYXAoKGhyZWYpID0+ICh7IHJlbDogXCJzdHlsZXNoZWV0XCIsIGhyZWYgfSkpIDogW10sXG4gICAgICBtb2R1bGU/LmxpbmtzPy4oKSB8fCBbXVxuICAgIF07XG4gIH0pLmZsYXQoMik7XG4gIGxldCBwcmVsb2FkcyA9IGdldE1vZHVsZUxpbmtIcmVmcyhtYXRjaGVzLCBtYW5pZmVzdCk7XG4gIHJldHVybiBkZWR1cGVMaW5rRGVzY3JpcHRvcnMoZGVzY3JpcHRvcnMsIHByZWxvYWRzKTtcbn1cbmZ1bmN0aW9uIGdldFJvdXRlQ3NzRGVzY3JpcHRvcnMocm91dGUpIHtcbiAgaWYgKCFyb3V0ZS5jc3MpIHJldHVybiBbXTtcbiAgcmV0dXJuIHJvdXRlLmNzcy5tYXAoKGhyZWYpID0+ICh7IHJlbDogXCJzdHlsZXNoZWV0XCIsIGhyZWYgfSkpO1xufVxuYXN5bmMgZnVuY3Rpb24gcHJlZmV0Y2hSb3V0ZUNzcyhyb3V0ZSkge1xuICBpZiAoIXJvdXRlLmNzcykgcmV0dXJuO1xuICBsZXQgZGVzY3JpcHRvcnMgPSBnZXRSb3V0ZUNzc0Rlc2NyaXB0b3JzKHJvdXRlKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoZGVzY3JpcHRvcnMubWFwKHByZWZldGNoU3R5bGVMaW5rKSk7XG59XG5hc3luYyBmdW5jdGlvbiBwcmVmZXRjaFN0eWxlTGlua3Mocm91dGUsIHJvdXRlTW9kdWxlKSB7XG4gIGlmICghcm91dGUuY3NzICYmICFyb3V0ZU1vZHVsZS5saW5rcyB8fCAhaXNQcmVsb2FkU3VwcG9ydGVkKCkpIHJldHVybjtcbiAgbGV0IGRlc2NyaXB0b3JzID0gW107XG4gIGlmIChyb3V0ZS5jc3MpIHtcbiAgICBkZXNjcmlwdG9ycy5wdXNoKC4uLmdldFJvdXRlQ3NzRGVzY3JpcHRvcnMocm91dGUpKTtcbiAgfVxuICBpZiAocm91dGVNb2R1bGUubGlua3MpIHtcbiAgICBkZXNjcmlwdG9ycy5wdXNoKC4uLnJvdXRlTW9kdWxlLmxpbmtzKCkpO1xuICB9XG4gIGlmIChkZXNjcmlwdG9ycy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgbGV0IHN0eWxlTGlua3MgPSBbXTtcbiAgZm9yIChsZXQgZGVzY3JpcHRvciBvZiBkZXNjcmlwdG9ycykge1xuICAgIGlmICghaXNQYWdlTGlua0Rlc2NyaXB0b3IoZGVzY3JpcHRvcikgJiYgZGVzY3JpcHRvci
251145yZWwgPT09IFwic3R5bGVzaGVldFwiKSB7XG4gICAgICBzdHlsZUxpbmtzLnB1c2goe1xuICAgICAgICAuLi5kZXNjcmlwdG9yLFxuICAgICAgICByZWw6IFwicHJlbG9hZFwiLFxuICAgICAgICBhczogXCJzdHlsZVwiXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoc3R5bGVMaW5rcy5tYXAocHJlZmV0Y2hTdHlsZUxpbmspKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHByZWZldGNoU3R5bGVMaW5rKGRlc2NyaXB0b3IpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgaWYgKGRlc2NyaXB0b3IubWVkaWEgJiYgIXdpbmRvdy5tYXRjaE1lZGlhKGRlc2NyaXB0b3IubWVkaWEpLm1hdGNoZXMgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIGBsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl1baHJlZj1cIiR7ZGVzY3JpcHRvci5ocmVmfVwiXWBcbiAgICApKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgIH1cbiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xuICAgIE9iamVjdC5hc3NpZ24obGluaywgZGVzY3JpcHRvcik7XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGluaygpIHtcbiAgICAgIGlmIChkb2N1bWVudC5oZWFkLmNvbnRhaW5zKGxpbmspKSB7XG4gICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgICB9XG4gICAgfVxuICAgIGxpbmsub25sb2FkID0gKCkgPT4ge1xuICAgICAgcmVtb3ZlTGluaygpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgbGluay5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgcmVtb3ZlTGluaygpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBpc1BhZ2VM
25114aW5rRGVzY3JpcHRvcihvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIHR5cGVvZiBvYmplY3QucGFnZSA9PT0gXCJzdHJpbmdcIjtcbn1cbmZ1bmN0aW9uIGlzSHRtbExpbmtEZXNjcmlwdG9yKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG9iamVjdC5ocmVmID09IG51bGwpIHtcbiAgICByZXR1cm4gb2JqZWN0LnJlbCA9PT0gXCJwcmVsb2FkXCIgJiYgdHlwZW9mIG9iamVjdC5pbWFnZVNyY1NldCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2Ygb2JqZWN0LmltYWdlU2l6ZXMgPT09IFwic3RyaW5nXCI7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QucmVsID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBvYmplY3QuaHJlZiA9PT0gXCJzdHJpbmdcIjtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldEtleWVkUHJlZmV0Y2hMaW5rcyhtYXRjaGVzLCBtYW5pZmVzdCwgcm91dGVNb2R1bGVzKSB7XG4gIGxldCBsaW5rcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIG1hdGNoZXMubWFwKGFzeW5jIChtYXRjaCkgPT4ge1xuICAgICAgbGV0IHJvdXRlID0gbWFuaWZlc3Qucm91dGVzW21hdGNoLnJvdXRlLmlkXTtcbiAgICAgIGlmIChyb3V0ZSkge1xuICAgICAgICBsZXQgbW9kID0gYXdhaXQgbG9hZFJvdXRlTW9kdWxlKHJvdXRlLCByb3V0ZU1vZHVsZXMpO1xuICAgICAgICByZXR1cm4gbW9kLmxpbmtzID8gbW9kLmxpbmtzKCkgOiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICApO1xuICByZXR1cm4gZGVkdXBlTGlua0Rlc2NyaXB0b3JzKFxuICAgIGxpbmtzLmZsYXQoMSkuZmlsdGVyKGlzSHRtbExpbmtEZXNjcmlwdG9yKS5maWx0ZXIoKGxpbmspID0+IGxpbmsucmVsID09PSBcInN0eWxlc2hlZXRcIiB8fCBsaW5rLnJlbCA9PT0gXCJwcmVsb2FkXCIpLm1hcChcbiAgICAgIChsaW5rKSA9PiBsaW5rLnJlbCA9PT0gXCJzdHlsZXNoZWV0XCIgPyB7IC4uLmxpbmssIHJlbDogXCJwcmVmZXRjaFwiLCBhczogXCJzdHlsZVwiIH0gOiB7IC4uLmxpbmssIHJlbDogXCJwcmVmZXRjaFwiIH1cbiAgICApXG4gICk7XG59XG5mdW5jdGlvbiBnZXROZXdNYXRjaGVzRm9yTGlua3MocGFnZSwgbmV4dE1hdGNoZXMsIGN1cnJlbnRNYXRjaGVzLCBtYW5pZmVzdCwgbG9jYXRpb24sIG1vZGUpIHtcbiAgbGV0IGlzTmV3ID0gKG1hdGNoLCBpbmRleCkgPT4ge1xuICAgIGlmICghY3VycmVudE1hdGNoZXNbaW5kZXhdKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gbWF0Y2gucm91dGUuaWQgIT09IGN1cnJlbnRNYXRjaGVzW2luZGV4XS5yb3V0ZS5pZDtcbiAgfTtcbiAgbGV0IG1hdGNoUGF0aENoYW5nZWQgPSAobWF0Y2gsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIC8vIHBhcmFtIGNoYW5nZSwgL3VzZXJzLzEyMyAtPiAvdXNlcnMvNDU2XG4gICAgICBjdXJyZW50TWF0Y2hlc1tpbmRleF0ucGF0aG5hbWUgIT09IG1hdGNoLnBhdGhuYW1lIHx8IC8vIHNwbGF0IHBhcmFtIGNoYW5nZWQsIHdoaWNoIGlzIG5vdCBwcmVzZW50IGluIG1hdGNoLnBhdGhcbiAgICAgIC8vIGUuZy4gL2ZpbGVzL2ltYWdlcy9hdmF0YXIuanBnIC0+IGZpbGVzL2ZpbmFuY2VzLnhsc1xuICAgICAgY3VycmVudE1hdGNoZXNbaW5kZXhdLnJvdXRlLnBhdGg/LmVuZHNXaXRoKFwiKlwiKSAmJiBjdXJyZW50TWF0Y2hlc1tpbmRleF0ucGFyYW1zW1wiKlwiXSAhPT0gbWF0Y2gucGFyYW1zW1wiKlwiXVxuICAgICk7XG4gIH07XG4gIGlmIChtb2RlID09PSBcImFzc2V0c1wiKSB7XG4gICAgcmV0dXJuIG5leHRNYXRjaGVzLmZpbHRlcihcbiAgICAgIChtYXRjaCwgaW5kZXgpID0+IGlzTmV3KG1hdGNoLCBpbmRleCkgfHwgbWF0Y2hQYXRoQ2hhbmdlZChtYXRjaCwgaW5kZXgpXG4gICAgKTtcbiAgfVxuICBpZiAobW9kZSA9PT0gXCJkYXRhXCIpIHtcbiAgICByZXR1cm4gbmV4dE1hdGNoZXMuZmlsdGVyKChtYXRjaCwgaW5kZXgpID0+IHtcbiAgICAgIGxldCBtYW5pZmVzdFJvdXRlID0gbWFuaWZlc3Qucm91dGVzW21hdGNoLnJvdXRlLmlkXTtcbiAgICAgIGlmICghbWFuaWZlc3RSb3V0ZSB8fCAhbWFuaWZlc3RSb3V0ZS5oYXNMb2FkZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlzTmV3KG1hdGNoLCBpbmRleCkgfHwgbWF0Y2hQYXRoQ2hhbmdlZChtYXRjaCwgaW5kZXgpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKG1hdGNoLnJvdXRlLnNob3VsZFJldmFsaWRhdGUpIHtcbiAgICAgICAgbGV0IHJvdXRlQ2hvaWNlID0gbWF0Y2gucm91dGUuc2hvdWxkUmV2YWxpZGF0ZSh7XG4gICAgICAgICAgY3VycmVudFVybDogbmV3IFVSTChcbiAgICAgICAgICAgIGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoICsgbG9jYXRpb24uaGFzaCxcbiAgICAgICAgICAgIHdpbmRvdy5vcmlnaW5cbiAgICAgICAgICApLFxuICAgICAgICAgIGN1cnJlbnRQYXJhbXM6IGN1cnJlbnRNYXRjaGVzWzBdPy5wYXJhbXMgfHwge30sXG4gICAgICAgICAgbmV4dFVybDogbmV3IFVSTChwYWdlLCB3aW5kb3cub3JpZ2luKSxcbiAgICAgICAgICBuZXh0UGFyYW1zOiBtYXRjaC5wYXJhbXMsXG4gICAgICAgICAgZGVmYXVsdFNob3VsZFJldmFsaWRhdGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm91dGVDaG9pY2UgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHJvdXRlQ2hvaWNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gW107XG59XG5mdW5jdGlvbiBnZXRNb2R1bGVMaW5rSHJlZnMobWF0Y2hlcywgbWFuaWZlc3QsIHsgaW5jbHVkZUh5ZHJhdGVGYWxsYmFjayB9ID0ge30pIHtcbiAgcmV0dXJuIGRlZHVwZUhyZWZzKFxuICAgIG1hdGNoZXMubWFwKChtYXRjaCkgPT4ge1xuICAgICAgbGV0IHJvdXRlID0gbWFuaWZlc3Qucm91dGVzW21hdGNoLnJvdXRlLmlkXTtcbiAgICAgIGlmICghcm91dGUpIHJldHVybiBbXTtcbiAgICAgIGxldCBocmVmcyA9IFtyb3V0ZS5tb2R1bGVdO1xuICAgICAgaWYgKHJvdXRlLmNsaWVudEFjdGlvbk1vZHVsZSkge1xuICAgICAgICBocmVmcyA9IGhyZWZzLmNvbmNhdChyb3V0ZS5jbGllbnRBY3Rpb25Nb2R1bGUpO1xuICAgICAgfVxuICAgICAgaWYgKHJvdXRlLmNsaWVudExvYWRlck1vZHVsZSkge1xuICAgICAgICBocmVmcyA9IGhyZWZzLmNvbmNhdChyb3V0ZS5jbGllbnRMb2FkZXJNb2R1bGUpO1xuICAgICAgfVxuICAgICAgaWYgKGluY2x1ZGVIeWRyYXRlRmFsbGJhY2sgJiYgcm91dGUuaHlkcmF0ZUZhbGxiYWNrTW9kdWxlKSB7XG4gICAgICAgIGhyZWZzID0gaHJlZnMuY29uY2F0KHJvdXRlLmh5ZHJhdGVGYWxsYmFja01vZHVsZSk7XG4gICAgICB9XG4gICAgICBpZiAocm91dGUuaW1wb3J0cykge1xuICAgICAgICBocmVmcyA9IGhyZWZzLmNvbmNhdChyb3V0ZS5pbXBvcnRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybi
25114BocmVmcztcbiAgICB9KS5mbGF0KDEpXG4gICk7XG59XG5mdW5jdGlvbiBkZWR1cGVIcmVmcyhocmVmcykge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoaHJlZnMpXTtcbn1cbmZ1bmN0aW9uIHNvcnRLZXlzKG9iaikge1xuICBsZXQgc29ydGVkID0ge307XG4gIGxldCBrZXlzID0gT2JqZWN0LmtleXMob2JqKS5zb3J0KCk7XG4gIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgc29ydGVkW2tleV0gPSBvYmpba2V5XTtcbiAgfVxuICByZXR1cm4gc29ydGVkO1xufVxuZnVuY3Rpb24gZGVkdXBlTGlua0Rlc2NyaXB0b3JzKGRlc2NyaXB0b3JzLCBwcmVsb2Fkcykge1xuICBsZXQgc2V0ID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgbGV0IHByZWxvYWRzU2V0ID0gbmV3IFNldChwcmVsb2Fkcyk7XG4gIHJldHVybiBkZXNjcmlwdG9ycy5yZWR1Y2UoKGRlZHVwZWQsIGRlc2NyaXB0b3IpID0+IHtcbiAgICBsZXQgYWxyZWFkeU1vZHVsZVByZWxvYWQgPSBwcmVsb2FkcyAmJiAhaXNQYWdlTGlua0Rlc2NyaXB0b3IoZGVzY3JpcHRvcikgJiYgZGVzY3JpcHRvci5hcyA9PT0gXCJzY3JpcHRcIiAmJiBkZXNjcmlwdG9yLmhyZWYgJiYgcHJlbG9hZHNTZXQuaGFzKGRlc2NyaXB0b3IuaHJlZik7XG4gICAgaWYgKGFscmVhZHlNb2R1bGVQcmVsb2FkKSB7XG4gICAgICByZXR1cm4gZGVkdXBlZDtcbiAgICB9XG4gICAgbGV0IGtleSA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKGRlc2NyaXB0b3IpKTtcbiAgICBpZiAoIXNldC5oYXMoa2V5KSkge1xuICAgICAgc2V0LmFkZChrZXkpO1xuICAgICAgZGVkdXBlZC5wdXNoKHsga2V5LCBsaW5rOiBkZXNjcmlwdG9yIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGVkdXBlZDtcbiAgfSwgW10pO1xufVxudmFyIF9pc1ByZWxvYWRTdXBwb3J0ZWQ7XG5mdW5jdGlvbiBpc1ByZWxvYWRTdXBwb3J0ZWQoKSB7XG4gIGlmIChfaXNQcmVsb2FkU3VwcG9ydGVkICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gX2lzUHJlbG9hZFN1cHBvcnRlZDtcbiAgfVxuICBsZXQgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcbiAgX2lzUHJlbG9hZFN1cHBvcnRlZCA9IGVsLnJlbExpc3Quc3VwcG9ydHMoXCJwcmVsb2FkXCIpO1xuICBlbCA9IG51bGw7XG4gIHJldHVybiBfaXNQcmVsb2FkU3VwcG9ydGVkO1xufVxuXG4vLyBsaWIvZG9tL3Nzci9mb2ctb2Ytd2FyLnRzXG5pbXBvcnQgKiBhcyBSZWFjdDcgZnJvbSBcInJlYW
25114N0XCI7XG5cbi8vIGxpYi9kb20vc3NyL3JvdXRlcy50c3hcbmltcG9ydCAqIGFzIFJlYWN0NiBmcm9tIFwicmVhY3RcIjtcblxuLy8gbGliL2RvbS9zc3IvZmFsbGJhY2sudHN4XG5pbXBvcnQgKiBhcyBSZWFjdDUgZnJvbSBcInJlYWN0XCI7XG5mdW5jdGlvbiBSZW1peFJvb3REZWZhdWx0SHlkcmF0ZUZhbGxiYWNrKCkge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0NS5jcmVhdGVFbGVtZW50KEJvdW5kYXJ5U2hlbGwsIHsgdGl0bGU6IFwiTG9hZGluZy4uLlwiLCByZW5kZXJTY3JpcHRzOiB0cnVlIH0sIEVOQUJMRV9ERVZfV0FSTklOR1MgPyAvKiBAX19QVVJFX18gKi8gUmVhY3Q1LmNyZWF0ZUVsZW1lbnQoXG4gICAgXCJzY3JpcHRcIixcbiAgICB7XG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgICBfX2h0bWw6IGBcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgXCJcXHV7MUY0QkZ9IEhleSBkZXZlbG9wZXIgXFx1ezFGNDRCfS4gWW91IGNhbiBwcm92aWRlIGEgd2F5IGJldHRlciBVWCB0aGFuIHRoaXMgXCIgK1xuICAgICAgICAgICAgICAgIFwid2hlbiB5b3VyIGFwcCBpcyBsb2FkaW5nIEpTIG1vZHVsZXMgYW5kL29yIHJ1bm5pbmcgXFxgY2xpZW50TG9hZGVyXFxgIFwiICtcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9ucy4gQ2hlY2sgb3V0IGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL3N0YXJ0L2ZyYW1ld29yay9yb3V0ZS1tb2R1bGUjaHlkcmF0ZWZhbGxiYWNrIFwiICtcbiAgICAgICAgICAgICAgICBcImZvciBtb3JlIGluZm9ybWF0aW9uLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBgXG4gICAgICB9XG4gICAgfVxuICApIDogbnVsbCk7XG59XG5cbi8vIGxpYi9kb20vc3NyL3JvdXRlcy50c3hcbmZ1bmN0aW9uIGdyb3VwUm91dGVzQnlQYXJlbnRJZChtYW5pZmVzdCkge1xuICBsZXQgcm91dGVzID0ge307XG4gIE9iamVjdC52YWx1ZXMobWFuaWZlc3QpLmZvckVhY2goKHJvdXRlKSA9PiB7XG4gICAgaWYgKHJvdXRlKSB7XG4gICAgICBsZXQgcGFyZW50SWQgPSByb3V0ZS5wYXJlbnRJZCB8fCBcIlwiO1xuICAgICAgaWYgKCFyb3V0ZXNbcGFyZW50SWRdKSB7XG4gICAgICAgIHJvdXRlc1twYXJlbnRJZF0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHJvdXRlc1twYXJlbnRJZF0ucHVzaChyb3V0ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJvdXRlcztcbn1cbmZ1bmN0aW9uIGdldFJvdXRlQ29tcG9uZW50cyhyb3V0ZSwgcm91dGVNb2R1bGUsIGlzU3BhTW9kZSkge1xuICBsZXQgQ29tcG9uZW50NCA9IGdldFJvdXRlTW9kdWxlQ29tcG9uZW50KHJvdXRlTW9kdWxlKTtcbiAgbGV0IEh5ZHJhdGVGYWxsYmFjayA9IHJvdXRlTW9kdWxlLkh5ZHJhdGVGYWxsYmFjayAmJiAoIWlzU3BhTW9kZSB8fCByb3V0ZS5pZCA9PT0gXCJyb290XCIpID8gcm91dGVNb2R1bGUuSHlkcmF0ZUZhbGxiYWNrIDogcm91dGUuaWQgPT09IFwicm9vdFwiID8gUmVtaXhSb290RGVmYXVsdEh5ZHJhdGVGYWxsYmFjayA6IHZvaWQgMDtcbiAgbGV0IEVycm9yQm91bmRhcnkgPSByb3V0ZU1vZHVsZS5FcnJvckJvdW5kYXJ5ID8gcm91dGVNb2R1bGUuRXJyb3JCb3VuZGFyeSA6IHJvdXRlLmlkID09PSBcInJvb3RcIiA/ICgpID0+IC8qIEBfX1BVUkVfXyAqLyBSZWFjdDYuY3JlYXRlRWxlbWVudChSZW1peFJvb3REZWZhdWx0RXJyb3JCb3VuZGFyeSwgeyBlcnJvcjogdXNlUm91dGVFcnJvcigpIH0pIDogdm9pZCAwO1xuICBpZiAocm91dGUuaWQgPT09IFwicm9vdFwiICYmIHJvdXRlTW9kdWxlLkxheW91dCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5Db21wb25lbnQ0ID8ge1xuICAgICAgICBlbGVtZW50OiAvKiBAX19QVVJFX18gKi8gUmVhY3Q2LmNyZWF0ZUVsZW1lbnQocm91dGVNb2R1bGUuTGF5b3V0LCBudWxsLCAvKiBAX19QVVJFX18gKi8gUmVhY3Q2LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50NCwgbnVsbCkpXG4gICAgICB9IDogeyBDb21wb25lbnQ6IENvbXBvbmVudDQgfSxcbiAgICAgIC4uLkVycm9yQm91bmRhcnkgPyB7XG4gICAgICAgIGVycm9yRWxlbWVudDogLyogQF9fUFVSRV9fICovIFJlYWN0Ni5jcmVhdGVFbGVtZW50KHJvdXRlTW9kdWxlLkxheW91dCwgbnVsbCwgLyogQF9fUFVSRV9fICovIFJlYWN0Ni5jcmVhdGVFbGVtZW50KEVycm9yQm91bmRhcnksIG51bGwpKVxuICAgICAgfSA6IHsgRXJyb3JCb3VuZGFyeSB9LFxuICAgICAgLi4uSHlkcmF0ZUZhbGxiYWNrID8ge1xuICAgICAgICBoeWRyYXRlRmFsbGJhY2tFbGVtZW50OiAvKiBAX19QVVJFX18gKi8gUmVhY3Q2LmNyZWF0ZUVsZW1lbnQocm91dGVNb2R1bGUuTGF5b3V0LCBudWxsLCAvKiBAX19QVVJFX18gKi8gUmVhY3Q2LmNyZWF0ZUVsZW1lbnQoSHlkcmF0ZUZhbGxiYWNrLCBudWxsKSlcbiAgICAgIH0gOiB7IEh5ZHJhdGVGYWxsYmFjayB9XG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBDb21wb25lbnQ6IENvbXBvbmVudDQsIEVycm9yQm91bmRhcnksIEh5ZHJhdGVGYWxsYmFjayB9O1xufVxuZnVuY3Rpb24gY3JlYXRlU2VydmVyUm91dGVzKG1hbmlmZXN0LCByb3V0ZU1vZHVsZXMsIGZ1dHVyZSwgaXNTcGFNb2RlLCBwYXJlbnRJZCA9IFwiXCIsIHJvdXRlc0J5UGFyZW50SWQgPSBncm91cFJvdXRlc0J5UGFyZW50SWQobWFuaWZlc3QpLCBzcGFNb2RlTGF6eVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoeyBDb21wb25lbnQ6ICgpID0+IG51bGwgfSkpIHtcbiAgcmV0dXJuIChyb3V0ZXNCeVBhcmVudElkW3BhcmVudElkXSB8fCBbXSkubWFwKChyb3V0ZSkgPT4ge1xuICAgIGxldCByb3V0ZU1vZHVsZSA9IHJvdXRlTW9kdWxlc1tyb3V0ZS5pZF07XG4gICAgaW52YXJpYW50MihcbiAgICAgIHJvdXRlTW9kdWxlLFxuICAgICAgXCJObyBgcm91dGVNb2R1bGVgIGF2YWlsYWJsZSB0byBjcmVhdGUgc2VydmVyIHJvdXRlc1wiXG4gICAgKTtcbiAgICBsZXQgZGF0YVJvdXRlID0ge1xuICAgICAgLi4uZ2V0Um91dGVDb21wb25lbnRzKHJvdXRlLCByb3V0ZU1vZHVsZSwgaXNTcGFNb2RlKSxcbiAgICAgIGNhc2VTZW5zaXRpdmU6IHJvdXRlLmNhc2VTZW5zaXRpdmUsXG4gICAgICBpZDogcm91dGUuaWQsXG4gICAgICBpbmRleDogcm91dGUuaW5kZXgsXG4gICAgICBwYXRoOiByb3V0ZS5wYXRoLFxuICAgICAgaGFuZGxlOiByb3V0ZU1vZHVsZS5oYW5kbGUsXG4gICAgICAvLyBGb3IgU1BBIE1vZGUsIGFsbCByb3V0ZXMgYXJlIGxhenkgZXhjZXB0IHJvb3QuICBIb3dldmVyIHdlIHRlbGwgdGhlXG4gICAgICAvLyByb3V0ZXIgcm9vdCBpcyBhbHNvIGxhenkgaGVyZSB0b28gc2luY2Ugd2UgZG9uJ3QgbmVlZCBhIGZ1bGxcbiAgICAgIC8vIGltcGxlbWVudGF0aW9uIC0gd2UganVzdCBuZWVkIGEgYGxhenlgIHByb3AgdG8gdGVsbCB0aGUgUlIgcmVuZGVyaW5nXG4gICAgICAvLyB3aGVyZSB0byBzdG9wIHdoaWNoIGlzIGFsd2F5cyBhdCB0aGUgcm9vdCByb3V0ZSBpbiBTUEEgbW9kZVxuICAgICAgbGF6eTogaXNTcGFNb2RlID8gKCkgPT4gc3B
25114hTW9kZUxhenlQcm9taXNlIDogdm9pZCAwLFxuICAgICAgLy8gRm9yIHBhcnRpYWwgaHlkcmF0aW9uIHJlbmRlcmluZywgd2UgbmVlZCB0byBpbmRpY2F0ZSB3aGVuIHRoZSByb3V0ZVxuICAgICAgLy8gaGFzIGEgbG9hZGVyL2NsaWVudExvYWRlciwgYnV0IGl0IHdvbid0IGV2ZXIgYmUgY2FsbGVkIGR1cmluZyB0aGUgc3RhdGljXG4gICAgICAvLyByZW5kZXIsIHNvIGp1c3QgZ2l2ZSBpdCBhIG5vLW9wIGZ1bmN0aW9uIHNvIHdlIGNhbiByZW5kZXIgZG93biB0byB0aGVcbiAgICAgIC8vIHByb3BlciBmYWxsYmFja1xuICAgICAgbG9hZGVyOiByb3V0ZS5oYXNMb2FkZXIgfHwgcm91dGUuaGFzQ2xpZW50TG9hZGVyID8gKCkgPT4gbnVsbCA6IHZvaWQgMFxuICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBtaWRkbGV3YXJlL2FjdGlvbi9zaG91bGRSZXZhbGlkYXRlIG9uIHRoZXNlIHJvdXRlcyBzaW5jZVxuICAgICAgLy8gdGhleSdyZSBmb3IgYSBzdGF0aWMgcmVuZGVyXG4gICAgfTtcbiAgICBsZXQgY2hpbGRyZW4gPSBjcmVhdGVTZXJ2ZXJSb3V0ZXMoXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIHJvdXRlTW9kdWxlcyxcbiAgICAgIGZ1dHVyZSxcbiAgICAgIGlzU3BhTW9kZSxcbiAgICAgIHJvdXRlLmlkLFxuICAgICAgcm91dGVzQnlQYXJlbnRJZCxcbiAgICAgIHNwYU1vZGVMYXp5UHJvbWlzZVxuICAgICk7XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIGRhdGFSb3V0ZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIHJldHVybiBkYXRhUm91dGU7XG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlQ2xpZW50Um91dGVzV2l0aEhNUlJldmFsaWRhdGlvbk9wdE91dChuZWVkc1JldmFsaWRhdGlvbiwgbWFuaWZlc3QsIHJvdXRlTW9kdWxlc0NhY2hlLCBpbml0aWFsU3RhdGUsIHNzciwgaXNTcGFNb2RlKSB7XG4gIHJldHVybiBjcmVhdGVDbGllbnRSb3V0ZXMoXG4gICAgbWFuaWZlc3QsXG4gICAgcm91dGVNb2R1bGVzQ2FjaGUsXG4gICAgaW5pdGlhbFN0YXRlLFxuICAgIHNzcixcbiAgICBpc1NwYU1vZGUsXG4gICAgXCJcIixcbiAgICBncm91cFJvdXRlc0J5UGFyZW50SWQobWFuaWZlc3QpLFxuICAgIG5lZWRzUmV2YWxpZGF0aW9uXG4gICk7XG59XG5mdW5jdGlvbiBwcmV2ZW50SW52YWxpZFNlcnZlckhhbmRsZXJDYWxsKHR5cGUsIHJvdXRlKSB7XG4gIGlmICh0eXBlID09PSBcImxvYWRlclwiICYmICFyb3V0ZS5oYXNMb2FkZXIgfHwgdHlwZSA9PT0gXCJhY3Rpb25cIiAmJiAhcm91dGUuaGFzQWN0aW9uKSB7XG4gICAgbGV0IGZuID0gdHlwZSA9PT0gXCJhY3Rpb25cIiA/IFwic2VydmVyQWN0aW9uKClcIiA6IFwic2VydmVyTG9hZGVyKClcIjtcbiAgICBsZXQgbXNnID0gYFlvdSBhcmUgdHJ5aW5nIHRvIGNhbGwgJHtmbn0gb24gYSByb3V0ZSB0aGF0IGRvZXMgbm90IGhhdmUgYSBzZXJ2ZXIgJHt0eXBlfSAocm91dGVJZDogXCIke3JvdXRlLmlkfVwiKWA7XG4gICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgIHRocm93IG5ldyBFcnJvclJlc3BvbnNlSW1wbCg0MDAsIFwiQmFkIFJlcXVlc3RcIiwgbmV3IEVycm9yKG1zZyksIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBub0FjdGlvbkRlZmluZWRFcnJvcih0eXBlLCByb3V0ZUlkKSB7XG4gIGxldCBhcnRpY2xlID0gdHlwZSA9PT0gXCJjbGllbnRBY3Rpb25cIiA/IFwiYVwiIDogXCJhblwiO1xuICBsZXQgbXNnID0gYFJvdXRlIFwiJHtyb3V0ZUlkfVwiIGRvZXMgbm90IGhhdmUgJHthcnRpY2xlfSAke3R5cGV9LCBidXQgeW91IGFyZSB0cnlpbmcgdG8gc3VibWl0IHRvIGl0LiBUbyBmaXggdGhpcywgcGxlYXNlIGFkZCAke2FydGljbGV9IFxcYCR7dHlwZX1cXGAgZnVuY3Rpb24gdG8gdGhlIHJvdXRlYDtcbiAgY29uc29sZS5lcnJvcihtc2cpO1xuICB0aHJvdyBuZXcgRXJyb3JSZXNwb25zZUltcGwoNDA1LCBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiLCBuZXcgRXJyb3IobXNnKSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVDbGllbnRSb3V0ZXMobWFuaWZlc3QsIHJvdXRlTW9kdWxlc0NhY2hlLCBpbml0aWFsU3RhdGUsIHNzciwgaXNTcGFNb2RlLCBwYXJlbnRJZCA9IFwiXCIsIHJvdXRlc0J5UGFyZW50SWQgPSBncm91cFJvdXRlc0J5UGFyZW50SWQobWFuaWZlc3QpLCBuZWVkc1JldmFsaWRhdGlvbikge1xuICByZXR1cm4gKHJvdXRlc0J5UGFyZW50SWRbcGFyZW50SWRdIHx8IFtdKS5tYXAoKHJvdXRlKSA9PiB7XG4gICAgbGV0IHJvdXRlTW9kdWxlID0gcm91dGVNb2R1bGVzQ2FjaGVbcm91dGUuaWRdO1xuICAgIGZ1bmN0aW9uIGZldGNoU2VydmVySGFuZGxlcihzaW5nbGVGZXRjaCkge1xuICAgICAgaW52YXJpYW50MihcbiAgICAgICAgdHlwZW9mIHNpbmdsZUZldGNoID09PSBcImZ1bmN0aW9uXCIsXG4gICAgICAgIFwiTm8gc2luZ2xlIGZldGNoIGZ1bmN0aW9uIGF2YWlsYWJsZSBmb3Igcm91dGUgaGFuZGxlclwiXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNpbmdsZUZldGNoKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZldGNoU2VydmVyTG9hZGVyKHNpbmdsZUZldGNoKSB7XG4gICAgICBpZiAoIXJvdXRlLmhhc0xvYWRlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgIHJldHVybiBmZXRjaFNlcnZlckhhbmRsZXIoc2luZ2xlRmV0Y2gpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmZXRjaFNlcnZlckFjdGlvbihzaW5nbGVGZXRjaCkge1xuICAgICAgaWYgKCFyb3V0ZS5oYXNBY3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbm9BY3Rpb25EZWZpbmVkRXJyb3IoXCJhY3Rpb25cIiwgcm91dGUuaWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZldGNoU2VydmVySGFuZGxlcihzaW5nbGVGZXRjaCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByZWZldGNoTW9kdWxlKG1vZHVsZVBhdGgpIHtcbiAgICAgIGltcG9ydChcbiAgICAgICAgLyogQHZpdGUtaWdub3JlICovXG4gICAgICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi9cbiAgICAgICAgbW9kdWxlUGF0aFxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJlZmV0Y2hSb3V0ZU1vZHVsZUNodW5rcyhyb3V0ZTIpIHtcbiAgICAgIGlmIChyb3V0ZTIuY2xpZW50QWN0aW9uTW9kdWxlKSB7XG4gICAgICAgI
25114HByZWZldGNoTW9kdWxlKHJvdXRlMi5jbGllbnRBY3Rpb25Nb2R1bGUpO1xuICAgICAgfVxuICAgICAgaWYgKHJvdXRlMi5jbGllbnRMb2FkZXJNb2R1bGUpIHtcbiAgICAgICAgcHJlZmV0Y2hNb2R1bGUocm91dGUyLmNsaWVudExvYWRlck1vZHVsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGZ1bmN0aW9uIHByZWZldGNoU3R5bGVzQW5kQ2FsbEhhbmRsZXIoaGFuZGxlcikge1xuICAgICAgbGV0IGNhY2hlZE1vZHVsZSA9IHJvdXRlTW9kdWxlc0NhY2hlW3JvdXRlLmlkXTtcbiAgICAgIGxldCBsaW5rUHJlZmV0Y2hQcm9taXNlID0gY2FjaGVkTW9kdWxlID8gcHJlZmV0Y2hTdHlsZUxpbmtzKHJvdXRlLCBjYWNoZWRNb2R1bGUpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gaGFuZGxlcigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgbGlua1ByZWZldGNoUHJvbWlzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGRhdGFSb3V0ZSA9IHtcbiAgICAgIGlkOiByb3V0ZS5pZCxcbiAgICAgIGluZGV4OiByb3V0ZS5pbmRleCxcbiAgICAgIHBhdGg6IHJvdXRlLnBhdGhcbiAgICB9O1xuICAgIGlmIChyb3V0ZU1vZHVsZSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihkYXRhUm91dGUsIHtcbiAgICAgICAgLi4uZGF0YVJvdXRlLFxuICAgICAgICAuLi5nZXRSb3V0ZUNvbXBvbmVudHMocm91dGUsIHJvdXRlTW9kdWxlLCBpc1NwYU1vZGUpLFxuICAgICAgICBtaWRkbGV3YXJlOiByb3V0ZU1vZHVsZS5jbGllbnRNaWRkbGV3YXJlLFxuICAgICAgICBoYW5kbGU6IHJvdXRlTW9kdWxlLmhhbmRsZSxcbiAgICAgICAgc2hvdWxkUmV2YWxpZGF0ZTogZ2V0U2hvdWxkUmV2YWxpZGF0ZUZ1bmN0aW9uKFxuICAgICAgICAgIGRhdGFSb3V0ZS5wYXRoLFxuICAgICAgICAgIHJvdXRlTW9kdWxlLFxuICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgIHNzcixcbiAgICAgICAgICBuZWVkc1JldmFsaWRhdGlvblxuICAgICAgICApXG4gICAgICB9KTtcbiAgICAgIGxldCBoYXNJbml0aWFsRGF0YSA9IGluaXRpYWxTdGF0ZSAmJiBpbml0aWFsU3RhdGUubG9hZGVyRGF0YSAmJiByb3V0ZS5pZCBpbiBpbml0aWFsU3RhdGUubG9hZGVyRGF0YTtcbiAgICAgIGxldCBpbml0aWFsRGF0YSA9IGhhc0luaXRpYWxEYXRhID8gaW5pdGlhbFN0YXRlPy5sb2FkZXJEYXRhPy5bcm91dGUuaWRdIDogdm9pZCAwO1xuICAgICAgbGV0IGhhc0luaXRpYWxFcnJvciA9IGluaXRpYWxTdGF0ZSAmJiBpbml0aWFsU3RhdGUuZXJyb3JzICYmIHJvdXRlLmlkIGluIGluaXRpYWxTdGF0ZS5lcnJvcnM7XG4gICAgICBsZXQgaW5pdGlhbEVycm9yID0gaGFzSW5pdGlhbEVycm9yID8gaW5pdGlhbFN0YXRlPy5lcnJvcnM/Lltyb3V0ZS5pZF0gOiB2b2lkIDA7XG4gICAgICBsZXQgaXNIeWRyYXRpb25SZXF1ZXN0ID0gbmVlZHNSZXZhbGlkYXRpb24gPT0gbnVsbCAmJiAocm91dGVNb2R1bGUuY2xpZW50TG9hZGVyPy5oeWRyYXRlID09PSB0cnVlIHx8ICFyb3V0ZS5oYXNMb2FkZXIpO1xuICAgICAgZGF0YVJvdXRlLmxvYWRlciA9IGFzeW5jICh7IHJlcXVlc3QsIHBhcmFtcywgY29udGV4dCB9LCBzaW5nbGVGZXRjaCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBwcmVmZXRjaFN0eWxlc0FuZENhbGxIYW5kbGVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGludmFyaWFudDIoXG4gICAgICAgICAgICAgIHJvdXRlTW9kdWxlLFxuICAgICAgICAgICAgICBcIk5vIGByb3V0ZU1vZHVsZWAgYXZhaWxhYmxlIGZvciBjcml0aWNhbC1yb3V0ZSBsb2FkZXJcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghcm91dGVNb2R1bGUuY2xpZW50TG9hZGVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmZXRjaFNlcnZlckxvYWRlcihzaW5nbGVGZXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcm91dGVNb2R1bGUuY2xpZW50TG9hZGVyKHtcbiAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICBhc3luYyBzZXJ2ZXJMb2FkZXIoKSB7XG4gICAgICAgICAgICAgICAgcHJldmVudEludmFsaWRTZXJ2ZXJIYW5kbGVyQ2FsbChcImxvYWRlclwiLCByb3V0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzSHlkcmF0aW9uUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgaWYgKGhhc0luaXRpYWxEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbml0aWFsRGF0YTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChoYXNJbml0aWFsRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW5pdGlhbEVycm9yO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2hTZXJ2ZXJMb2FkZXIoc2luZ2xlRmV0Y2gpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlzSHlkcmF0aW9uUmVxdWVzdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZGF0YVJvdXRlLmxvYWRlci5oeWRyYXRlID0gc2hvdWxkSHlkcmF0ZVJvdXRlTG9hZGVyKFxuICAgICAgICByb3V0ZS5pZCxcbiAgICAgICAgcm91dGVNb2R1bGUuY2xpZW50TG9hZGVyLFxuICAgICAgICByb3V0ZS5oYXNMb2FkZXIsXG4gICAgICAgIGlzU3BhTW9kZVxuICAgICAgKTtcbiAgICAgIGRhdGFSb3V0ZS5hY3Rpb24gPSAoeyByZXF1ZXN0LCBwYXJhbXMsIGNvbnRleHQgfSwgc2luZ2xlRmV0Y2gpID0+IHtcbiAgICAgICAgcmV0dXJuIHByZWZldGNoU3R5bGVzQW5kQ2FsbEhhbmRsZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGludmFyaWFudDIoXG4gICAgICAgICAgICByb3V0ZU1vZHVsZSxcbiAgICAgICAgICAgIFwiTm8gYHJvdXRlTW9kdWxlYCBhdmFpbGFibGUgZm9yIGNyaXRpY2FsLXJvdXRlIGFjdGlvblwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXJvdXRlTW9kdWxlLmNsaWVudEFjdGlvbikge1xuICAgICAgICAgICAgaWYgKGlzU3BhTW9kZSkge1xuICAgICAgICAgICAgICB0aHJvdyBub0FjdGlvbkRlZmluZWRFcnJvcihcImNsaWVudEFjdGlvblwiLCByb3V0ZS5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmV0Y2hTZXJ2ZXJBY3Rpb24oc2luZ2xlRmV0Y2gpO1xuICAgICAgICAgI
25114H1cbiAgICAgICAgICByZXR1cm4gcm91dGVNb2R1bGUuY2xpZW50QWN0aW9uKHtcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgYXN5bmMgc2VydmVyQWN0aW9uKCkge1xuICAgICAgICAgICAgICBwcmV2ZW50SW52YWxpZFNlcnZlckhhbmRsZXJDYWxsKFwiYWN0aW9uXCIsIHJvdXRlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZldGNoU2VydmVyQWN0aW9uKHNpbmdsZUZldGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXJvdXRlLmhhc0NsaWVudExvYWRlcikge1xuICAgICAgICBkYXRhUm91dGUubG9hZGVyID0gKF8sIHNpbmdsZUZldGNoKSA9PiBwcmVmZXRjaFN0eWxlc0FuZENhbGxIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gZmV0Y2hTZXJ2ZXJMb2FkZXIoc2luZ2xlRmV0Y2gpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghcm91dGUuaGFzQ2xpZW50QWN0aW9uKSB7XG4gICAgICAgIGRhdGFSb3V0ZS5hY3Rpb24gPSAoXywgc2luZ2xlRmV0Y2gpID0+IHByZWZldGNoU3R5bGVzQW5kQ2FsbEhhbmRsZXIoKCkgPT4ge1xuICAgICAgICAgIGlmIChpc1NwYU1vZGUpIHtcbiAgICAgICAgICAgIHRocm93IG5vQWN0aW9uRGVmaW5lZEVycm9yKFwiY2xpZW50QWN0aW9uXCIsIHJvdXRlLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZldGNoU2VydmVyQWN0aW9uKHNpbmdsZUZldGNoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsZXQgbGF6eVJvdXRlUHJvbWlzZTtcbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldExhenlSb3V0ZSgpIHtcbiAgICAgICAgaWYgKGxhenlSb3V0ZVByb21pc2UpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgbGF6eVJvdXRlUHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBsYXp5Um91dGVQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAocm91dGUuY2xpZW50TG9hZGVyTW9kdWxlIHx8IHJvdXRlLmNsaWVudEFjdGlvbk1vZHVsZSkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgcm91dGVNb2R1bGVQcm9taXNlID0gbG9hZFJvdXRlTW9kdWxlV2l0aEJsb2NraW5nTGlua3MoXG4gICAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICAgIHJvdXRlTW9kdWxlc0NhY2hlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcmVmZXRjaFJvdXRlTW9kdWxlQ2h1bmtzKHJvdXRlKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcm91dGVNb2R1bGVQcm9taXNlO1xuICAgICAgICB9KSgpO1xuICAgICAgICByZXR1cm4gYXdhaXQgbGF6eVJvdXRlUHJvbWlzZTtcbiAgICAgIH1cbiAgICAgIGRhdGFSb3V0ZS5sYXp5ID0ge1xuICAgICAgICBsb2FkZXI6IHJvdXRlLmhhc0NsaWVudExvYWRlciA/IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBsZXQgeyBjbGllbnRMb2FkZXIgfSA9IHJvdXRlLmNsaWVudExvYWRlck1vZHVsZSA/IGF3YWl0IGltcG9ydChcbiAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqL1xuICAgICAgICAgICAgLyogd2VicGFja0lnbm9yZTogdHJ1ZSAqL1xuICAgICAgICAgICAgcm91dGUuY2xpZW50TG9hZGVyTW9kdWxlXG4gICAgICAgICAgKSA6IGF3YWl0IGdldExhenlSb3V0ZSgpO1xuICAgICAgICAgIGludmFyaWFudDIoY2xpZW50TG9hZGVyLCBcIk5vIGBjbGllbnRMb2FkZXJgIGV4cG9ydCBmb3VuZFwiKTtcbiAgICAgICAgICByZXR1cm4gKGFyZ3MsIHNpbmdsZUZldGNoKSA9PiBjbGllbnRMb2FkZXIoe1xuICAgICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICAgIGFzeW5jIHNlcnZlckxvYWRlcigpIHtcbiAgICAgICAgICAgICAgcHJldmVudEludmFsaWRTZXJ2ZXJIYW5kbGVyQ2FsbChcImxvYWRlclwiLCByb3V0ZSk7XG4gICAgICAgICAgICAgIHJldHVybiBmZXRjaFNlcnZlckxvYWRlcihzaW5nbGVGZXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gOiB2b2lkIDAsXG4gICAgICAgIGFjdGlvbjogcm91dGUuaGFzQ2xpZW50QWN0aW9uID8gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGxldCBjbGllbnRBY3Rpb25Qcm9taXNlID0gcm91dGUuY2xpZW50QWN0aW9uTW9kdWxlID8gaW1wb3J0KFxuICAgICAgICAgICAgLyogQHZpdGUtaWdub3JlICovXG4gICAgICAgICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovXG4gICAgICAgICAgICByb3V0ZS5jbGllbnRBY3Rpb25Nb2R1bGVcbiAgICAgICAgICApIDogZ2V0TGF6eVJvdXRlKCk7XG4gICAgICAgICAgcHJlZmV0Y2hSb3V0ZU1vZHVsZUNodW5rcyhyb3V0ZSk7XG4gICAgICAgICAgbGV0IHsgY2xpZW50QWN0aW9uIH0gPSBhd2FpdCBjbGllbnRBY3Rpb25Qcm9taXNlO1xuICAgICAgICAgIGludmFyaWFudDIoY2xpZW50QWN0aW9uLCBcIk5vIGBjbGllbnRBY3Rpb25gIGV4cG9ydCBmb3VuZFwiKTtcbiAgICAgICAgICByZXR1cm4gKGFyZ3MsIHNpbmdsZUZldGNoKSA9PiBjbGllbnRBY3Rpb24oe1xuICAgICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICAgIGFzeW5jIHNlcnZlckFjdGlvbigpIHtcbiAgICAgICAgICAgICAgcHJldmVudEludmFsaWRTZXJ2ZXJIYW5kbGVyQ2FsbChcImFjdGlvblwiLCByb3V0ZSk7XG4gICAgICAgICAgICAgIHJldHVybiBmZXRjaFNlcnZlckFjdGlvbihzaW5nbGVGZXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gOiB2b2lkIDAsXG4gICAgICAgIG1pZGRsZXdhcmU6IHJvdXRlLmhhc0NsaWVudE1pZGRsZXdhcmUgPyBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgbGV0IHsgY2xpZW50TWlkZGxld2FyZSB9ID0gcm91dGUuY2xpZW50TWlkZGxld2FyZU1vZHVsZSA/IGF3YWl0IGltcG9ydChcbiAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqL1xuICAgICAgICAgICAgLyogd2VicGFja0lnbm9yZTogdHJ1ZSAqL1xuICAgICAgICAgICAgcm91dGUuY2xpZW50TWlkZGxld2FyZU1vZHVsZVxuICAgICAgICAgICkgOiBhd2FpdCBnZXRMYXp5Um91dGUoKTtcbiAgICAgICAgICBpbnZhcmlhbnQyKGNsaWVudE1pZGRsZXdhcmUsIFwiTm8gYGNsaWVudE1pZGRsZXdhcmVgIGV4cG9ydCBmb3VuZFwiKTtcbiAgICAgICAgICByZXR1cm4gY2xpZW50TWlkZGxld2FyZTtcbiAgICAgICAgfSA6IHZvaWQgMCxcbiAgICAgICAgc2hvdWxkUmV2YWxpZGF0ZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGxldCBsYXp5Um91dGUgPSBhd2FpdCBnZXRMYXp5Um91dGUoKTtcbiAgICAgICAgICByZXR1cm4gZ2V0U2hvdWxkUmV2YWxpZGF0ZUZ1bmN0aW9uKFxuICAgICAgICAgICAgZGF0YVJvdXRlLnBhdGgsXG4gICAgICAgICAgICBsYXp5Um91dGUsXG4gICAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICAgI
25114HNzcixcbiAgICAgICAgICAgIG5lZWRzUmV2YWxpZGF0aW9uXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFuZGxlOiBhc3luYyAoKSA9PiAoYXdhaXQgZ2V0TGF6eVJvdXRlKCkpLmhhbmRsZSxcbiAgICAgICAgLy8gTm8gbmVlZCB0byB3cmFwIHRoZXNlIGluIGxheW91dCBzaW5jZSB0aGUgcm9vdCByb3V0ZSBpcyBuZXZlclxuICAgICAgICAvLyBsb2FkZWQgdmlhIHJvdXRlLmxhenkoKVxuICAgICAgICBDb21wb25lbnQ6IGFzeW5jICgpID0+IChhd2FpdCBnZXRMYXp5Um91dGUoKSkuQ29tcG9uZW50LFxuICAgICAgICBFcnJvckJvdW5kYXJ5OiByb3V0ZS5oYXNFcnJvckJvdW5kYXJ5ID8gYXN5bmMgKCkgPT4gKGF3YWl0IGdldExhenlSb3V0ZSgpKS5FcnJvckJvdW5kYXJ5IDogdm9pZCAwXG4gICAgICB9O1xuICAgIH1cbiAgICBsZXQgY2hpbGRyZW4gPSBjcmVhdGVDbGllbnRSb3V0ZXMoXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIHJvdXRlTW9kdWxlc0NhY2hlLFxuICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgc3NyLFxuICAgICAgaXNTcGFNb2RlLFxuICAgICAgcm91dGUuaWQsXG4gICAgICByb3V0ZXNCeVBhcmVudElkLFxuICAgICAgbmVlZHNSZXZhbGlkYXRpb25cbiAgICApO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSBkYXRhUm91dGUuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICByZXR1cm4gZGF0YVJvdXRlO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGdldFNob3VsZFJldmFsaWRhdGVGdW5jdGlvbihwYXRoLCByb3V0ZSwgbWFuaWZlc3RSb3V0ZSwgc3NyLCBuZWVkc1JldmFsaWRhdGlvbikge1xuICBpZiAobmVlZHNSZXZhbGlkYXRpb24pIHtcbiAgICByZXR1cm4gd3JhcFNob3VsZFJldmFsaWRhdGVGb3JIZHIoXG4gICAgICBtYW5pZmVzdFJvdXRlLmlkLFxuICAgICAgcm91dGUuc2hvdWxkUmV2YWxpZGF0ZSxcbiAgICAgIG5lZWRzUmV2YWxpZGF0aW9uXG4gICAgKTtcbiAgfVxuICBpZiAoIXNzciAmJiBtYW5pZmVzdFJvdXRlLmhhc0xvYWRlciAmJiAhbWFuaWZlc3RSb3V0ZS5oYXNDbGllbnRMb2FkZXIpIHtcbiAgICBsZXQgbXlQYXJhbXMgPSBwYXRoID8gY29tcGlsZVBhdGgocGF0aClbMV0ubWFwKChwKSA9PiBwLnBhcmFtTmFtZSkgOiBbXTtcbiAgICBjb25zdCBkaWRQYXJhbXNDaGFuZ2UgPSAob3B0cykgPT4gbXlQYXJhbXMuc29tZSgocCkgPT4gb3B0cy5jdXJyZW50UGFyYW1zW3BdICE9PSBvcHRzLm5leHRQYXJhbXNbcF0pO1xuICAgIGlmIChyb3V0ZS5zaG91bGRSZXZhbGlkYXRlKSB7XG4gICAgICBsZXQgZm4gPSByb3V0ZS5zaG91bGRSZXZhbGlkYXRlO1xuICAgICAgcmV0dXJuIChvcHRzKSA9PiBmbih7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlOiBkaWRQYXJhbXNDaGFuZ2Uob3B0cylcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKG9wdHMpID0+IGRpZFBhcmFtc0NoYW5nZShvcHRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNzciAmJiByb3V0ZS5zaG91bGRSZXZhbGlkYXRlKSB7XG4gICAgbGV0IGZuID0gcm91dGUuc2hvdWxkUmV2YWxpZGF0ZTtcbiAgICByZXR1cm4gKG9wdHMpID0+IGZuKHsgLi4ub3B0cywgZGVmYXVsdFNob3VsZFJldmFsaWRhdGU6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHJvdXRlLnNob3VsZFJldmFsaWRhdGU7XG59XG5mdW5jdGlvbiB3cmFwU2hvdWxkUmV2YWxpZGF0ZUZvckhkcihyb3V0ZUlkLCByb3V0ZVNob3VsZFJldmFsaWRhdGUsIG5lZWRzUmV2YWxpZGF0aW9uKSB7XG4gIGxldCBoYW5kbGVkUmV2YWxpZGF0aW9uID0gZmFsc2U7XG4gIHJldHVybiAoYXJnKSA9PiB7XG4gICAgaWYgKCFoYW5kbGVkUmV2YWxpZGF0aW9uKSB7XG4gICAgICBoYW5kbGVkUmV2YWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZWVkc1JldmFsaWRhdGlvbi5oYXMocm91dGVJZCk7XG4gICAgfVxuICAgIHJldHVybiByb3V0ZVNob3VsZFJldmFsaWRhdGUgPyByb3V0ZVNob3VsZFJldmFsaWRhdGUoYXJnKSA6IGFyZy5kZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTtcbiAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGxvYWRSb3V0ZU1vZHVsZVdpdGhCbG9ja2luZ0xpbmtzKHJvdXRlLCByb3V0ZU1vZHVsZXMpIHtcbiAgbGV0IHJvdXRlTW9kdWxlUHJvbWlzZSA9IGxvYWRSb3V0ZU1vZHVsZShyb3V0ZSwgcm91dGVNb2R1bGVzKTtcbiAgbGV0IHByZWZldGNoUm91dGVDc3NQcm9taXNlID0gcHJlZmV0Y2hSb3V0ZUNzcyhyb3V0ZSk7XG4gIGxldCByb3V0ZU1vZHVsZSA9IGF3YWl0IHJvdXRlTW9kdWxlUHJvbWlzZTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHByZWZldGNoUm91dGVDc3NQcm9taXNlLFxuICAgIHByZWZldGNoU3R5bGVMaW5rcyhyb3V0ZSwgcm91dGVNb2R1bGUpXG4gIF0pO1xuICByZXR1cm4ge1xuICAgIENvbXBvbmVudDogZ2V0Um91dGVNb2R1bGVDb21wb25lbnQocm91dGVNb2R1bGUpLFxuICAgIEVycm9yQm91bmRhcnk6IHJvdXRlTW9kdWxlLkVycm9yQm91bmRhcnksXG4gICAgY2xpZW50TWlkZGxld2FyZTogcm91dGVNb2R1bGUuY2xpZW50TWlkZGxld2FyZSxcbiAgICBjbGllbnRBY3Rpb246IHJvdXRlTW9kdWxlLmNsaWVudEFjdGlvbixcbiAgICBjbGllbnRMb2FkZXI6IHJvdXRlTW9kdWxlLmNsaWVudExvYWRlcixcbiAgICBoYW5kbGU6IHJvdXRlTW9kdWxlLmhhbmRsZSxcbiAgICBsaW5rczogcm91dGVNb2R1bGUubGlua3MsXG4gICAgbWV0YTogcm91dGVNb2R1bGUubWV0YSxcbiAgICBzaG91bGRSZXZhbGlkYXRlOiByb3V0ZU1vZHVsZS5zaG91bGRSZXZhbGlkYXRlXG4gIH07XG59XG5mdW5jdGlvbiBnZXRSb3V0ZU1vZHVsZUNvbXBvbmVudChyb3V0ZU1vZHVsZSkge1xuICBpZiAocm91dGVNb2R1bGUuZGVmYXVsdCA9PSBudWxsKSByZXR1cm4gdm9pZCAwO1xuICBsZXQgaXNFbXB0eU9iamVjdCA9IHR5cGVvZiByb3V0ZU1vZHVsZS5kZWZhdWx0ID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKHJvdXRlTW9kdWxlLmRlZmF1bHQpLmxlbmd0aCA9PT0gMDtcbiAgaWYgKCFpc0VtcHR5T2JqZWN0KSB7XG4gICAgcmV0dXJuIHJvdXRlTW9kdWxlLmRlZmF1bHQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHNob3VsZEh5ZHJhdGVSb3V0ZUxvYWRlcihyb3V0ZUlkLCBjbGllbnRMb2FkZXIsIGhhc0xvYWRlciwgaXNTcGFNb2RlKSB7XG4gIHJldHVybi
25114Bpc1NwYU1vZGUgJiYgcm91dGVJZCAhPT0gXCJyb290XCIgfHwgY2xpZW50TG9hZGVyICE9IG51bGwgJiYgKGNsaWVudExvYWRlci5oeWRyYXRlID09PSB0cnVlIHx8IGhhc0xvYWRlciAhPT0gdHJ1ZSk7XG59XG5cbi8vIGxpYi9kb20vc3NyL2ZvZy1vZi13YXIudHNcbnZhciBuZXh0UGF0aHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xudmFyIGRpc2NvdmVyZWRQYXRoc01heFNpemUgPSAxZTM7XG52YXIgZGlzY292ZXJlZFBhdGhzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbnZhciBVUkxfTElNSVQgPSA3NjgwO1xuZnVuY3Rpb24gaXNGb2dPZldhckVuYWJsZWQocm91dGVEaXNjb3ZlcnksIHNzcikge1xuICByZXR1cm4gcm91dGVEaXNjb3ZlcnkubW9kZSA9PT0gXCJsYXp5XCIgJiYgc3NyID09PSB0cnVlO1xufVxuZnVuY3Rpb24gZ2V0UGFydGlhbE1hbmlmZXN0KHsgc3JpLCAuLi5tYW5pZmVzdCB9LCByb3V0ZXIpIHtcbiAgbGV0IHJvdXRlSWRzID0gbmV3IFNldChyb3V0ZXIuc3RhdGUubWF0Y2hlcy5tYXAoKG0pID0+IG0ucm91dGUuaWQpKTtcbiAgbGV0IHNlZ21lbnRzID0gcm91dGVyLnN0YXRlLmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gIGxldCBwYXRocyA9IFtcIi9cIl07XG4gIHNlZ21lbnRzLnBvcCgpO1xuICB3aGlsZSAoc2VnbWVudHMubGVuZ3RoID4gMCkge1xuICAgIHBhdGhzLnB1c2goYC8ke3NlZ21lbnRzLmpvaW4oXCIvXCIpfWApO1xuICAgIHNlZ21lbnRzLnBvcCgpO1xuICB9XG4gIHBhdGhzLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKHJvdXRlci5yb3V0ZXMsIHBhdGgsIHJvdXRlci5iYXNlbmFtZSk7XG4gICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgIG1hdGNoZXMuZm9yRWFjaCgobSkgPT4gcm91dGVJZHMuYWRkKG0ucm91dGUuaWQpKTtcbiAgICB9XG4gIH0pO1xuICBsZXQgaW5pdGlhbFJvdXRlcyA9IFsuLi5yb3V0ZUlkc10ucmVkdWNlKFxuICAgIChhY2MsIGlkKSA9PiBPYmplY3QuYXNzaWduKGFjYywgeyBbaWRdOiBtYW5pZmVzdC5yb3V0ZXNbaWRdIH0pLFxuICAgIHt9XG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4ubWFuaWZlc3QsXG4gICAgcm91dGVzOiBpbml0aWFsUm91dGVzLFxuICAgIHNyaTogc3JpID8gdHJ1ZSA6IHZvaWQgMFxuICB9O1xufVxuZnVuY3Rpb24gZ2V0UGF0Y2hSb3V0ZXNPbk5hdmlnYXRpb25GdW5jdGlvbihtYW5pZmVzdCwgcm91dGVNb2R1bGVzLCBzc3IsIHJvdXRlRGlzY292ZXJ5LCBpc1NwYU1vZGUsIGJhc2VuYW1lKSB7XG4gIGlmICghaXNGb2dPZldhckVuYWJsZWQocm91dGVEaXNjb3ZlcnksIHNzcikpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIHJldHVybiBhc3luYyAoeyBwYXRoLCBwYXRjaCwgc2lnbmFsLCBmZXRjaGVyS2V5IH0pID0+IHtcbiAgICBpZiAoZGlzY292ZXJlZFBhdGhzLmhhcyhwYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmZXRjaEFuZEFwcGx5TWFuaWZlc3RQYXRjaGVzKFxuICAgICAgW3BhdGhdLFxuICAgICAgZmV0Y2hlcktleSA/IHdpbmRvdy5sb2NhdGlvbi5ocmVmIDogcGF0aCxcbiAgICAgIG1hbmlmZXN0LFxuICAgICAgcm91dGVNb2R1bGVzLFxuICAgICAgc3NyLFxuICAgICAgaXNTcGFNb2RlLFxuICAgICAgYmFzZW5hbWUsXG4gICAgICByb3V0ZURpc2NvdmVyeS5tYW5pZmVzdFBhdGgsXG4gICAgICBwYXRjaCxcbiAgICAgIHNpZ25hbFxuICAgICk7XG4gIH07XG59XG5mdW5jdGlvbiB1c2VGb2dPRldhckRpc2NvdmVyeShyb3V0ZXIsIG1hbmlmZXN0LCByb3V0ZU1vZHVsZXMsIHNzciwgcm91dGVEaXNjb3ZlcnksIGlzU3BhTW9kZSkge1xuICBSZWFjdDcudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzRm9nT2ZXYXJFbmFibGVkKHJvdXRlRGlzY292ZXJ5LCBzc3IpIHx8IC8vIEB0cy1leHBlY3QtZXJyb3IgLSBUUyBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyB5ZXRcbiAgICB3aW5kb3cubmF2aWdhdG9yPy5jb25uZWN0aW9uPy5zYXZlRGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWdpc3RlckVsZW1lbnQoZWwpIHtcbiAgICAgIGxldCBwYXRoID0gZWwudGFnTmFtZSA9PT0gXCJGT1JNXCIgPyBlbC5nZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIikgOiBlbC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBwYXRobmFtZSA9IGVsLnRhZ05hbWUgPT09IFwiQVwiID8gZWwucGF0aG5hbWUgOiBuZXcgVVJMKHBhdGgsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pLnBhdGhuYW1lO1xuICAgICAgaWYgKCFkaXNjb3ZlcmVkUGF0aHMuaGFzKHBhdGhuYW1lKSkge1xuICAgICAgICBuZXh0UGF0aHMuYWRkKHBhdGhuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQYXRjaGVzKCkge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImFbZGF0YS1kaXNjb3Zlcl0sIGZvcm1bZGF0YS1kaXNjb3Zlcl1cIikuZm9yRWFjaChyZWdpc3RlckVsZW1lbnQpO1xuICAgICAgbGV0IGxhenlQYXRocyA9IEFycmF5LmZyb20obmV4dFBhdGhzLmtleXMoKSkuZmlsdGVyKChwYXRoKSA9PiB7XG4gICAgICAgIGlmIChkaXNjb3ZlcmVkUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgICAgICAgbmV4dFBhdGhzLmRlbGV0ZShwYXRoKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICAgIGlmIChsYXp5UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZldGNoQW5kQXBwbHlNYW5pZmVzdFBhdGNoZXMoXG4gICAgICAgICAgbGF6eVBhdGhzLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgcm91dGVNb2R1bGVzLFxuICAgICAgICAgIHNzcixcbiAgICAgICAgICBpc1NwYU1vZGUsXG4gICAgICAgICAgcm91dGVyLmJhc2VuYW1lLFxuICAgICAgICAgI
25114HJvdXRlRGlzY292ZXJ5Lm1hbmlmZXN0UGF0aCxcbiAgICAgICAgICByb3V0ZXIucGF0Y2hSb3V0ZXNcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBmZXRjaCBtYW5pZmVzdCBwYXRjaGVzXCIsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgZGVib3VuY2VkRmV0Y2hQYXRjaGVzID0gZGVib3VuY2UoZmV0Y2hQYXRjaGVzLCAxMDApO1xuICAgIGZldGNoUGF0Y2hlcygpO1xuICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IGRlYm91bmNlZEZldGNoUGF0Y2hlcygpKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFtcImRhdGEtZGlzY292ZXJcIiwgXCJocmVmXCIsIFwiYWN0aW9uXCJdXG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW3NzciwgaXNTcGFNb2RlLCBtYW5pZmVzdCwgcm91dGVNb2R1bGVzLCByb3V0ZXIsIHJvdXRlRGlzY292ZXJ5XSk7XG59XG5mdW5jdGlvbiBnZXRNYW5pZmVzdFBhdGgoX21hbmlmZXN0UGF0aCwgYmFzZW5hbWUpIHtcbiAgbGV0IG1hbmlmZXN0UGF0aCA9IF9tYW5pZmVzdFBhdGggfHwgXCIvX19tYW5pZmVzdFwiO1xuICBpZiAoYmFzZW5hbWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBtYW5pZmVzdFBhdGg7XG4gIH1cbiAgcmV0dXJuIGAke2Jhc2VuYW1lfSR7bWFuaWZlc3RQYXRofWAucmVwbGFjZSgvXFwvKy9nLCBcIi9cIik7XG59XG52YXIgTUFOSUZFU1RfVkVSU0lPTl9TVE9SQUdFX0tFWSA9IFwicmVhY3Qtcm91dGVyLW1hbmlmZXN0LXZlcnNpb25cIjtcbmFzeW5jIGZ1bmN0aW9uIGZldGNoQW5kQXBwbHlNYW5pZmVzdFBhdGNoZXMocGF0aHMsIGVycm9yUmVsb2FkUGF0aCwgbWFuaWZlc3QsIHJvdXRlTW9kdWxlcywgc3NyLCBpc1NwYU1vZGUsIGJhc2VuYW1lLCBtYW5pZmVzdFBhdGgsIHBhdGNoUm91dGVzLCBzaWduYWwpIHtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICBzZWFyY2hQYXJhbXMuc2V0KFwicGF0aHNcIiwgcGF0aHMuc29ydCgpLmpvaW4oXCIsXCIpKTtcbiAgc2VhcmNoUGFyYW1zLnNldChcInZlcnNpb25cIiwgbWFuaWZlc3QudmVyc2lvbik7XG4gIGxldCB1cmwgPSBuZXcgVVJMKFxuICAgIGdldE1hbmlmZXN0UGF0aChtYW5pZmVzdFBhdGgsIGJhc2VuYW1lKSxcbiAgICB3aW5kb3cubG9jYXRpb24ub3JpZ2luXG4gICk7XG4gIHVybC5zZWFyY2ggPSBzZWFyY2hQYXJhbXMudG9TdHJpbmcoKTtcbiAgaWYgKHVybC50b1N0cmluZygpLmxlbmd0aCA+IFVSTF9MSU1JVCkge1xuICAgIG5leHRQYXRocy5jbGVhcigpO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgc2VydmVyUGF0Y2hlcztcbiAgdHJ5IHtcbiAgICBsZXQgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbCB9KTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzID09PSAyMDQgJiYgcmVzLmhlYWRlcnMuaGFzKFwiWC1SZW1peC1SZWxvYWQtRG9jdW1lbnRcIikpIHtcbiAgICAgIGlmICghZXJyb3JSZWxvYWRQYXRoKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIkRldGVjdGVkIGEgbWFuaWZlc3QgdmVyc2lvbiBtaXNtYXRjaCBkdXJpbmcgZWFnZXIgcm91dGUgZGlzY292ZXJ5LiBUaGUgbmV4dCBuYXZpZ2F0aW9uL2ZldGNoIHRvIGFuIHVuZGlzY292ZXJlZCByb3V0ZSB3aWxsIHJlc3VsdCBpbiBhIG5ldyBkb2N1bWVudCBuYXZpZ2F0aW9uIHRvIHN5bmMgdXAgd2l0aCB0aGUgbGF0ZXN0IG1hbmlmZXN0LlwiXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKE1BTklGRVNUX1ZFUlNJT05fU1RPUkFHRV9LRVkpID09PSBtYW5pZmVzdC52ZXJzaW9uKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiVW5hYmxlIHRvIGRpc2NvdmVyIHJvdXRlcyBkdWUgdG8gbWFuaWZlc3QgdmVyc2lvbiBtaXNtYXRjaC5cIlxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTUFOSUZFU1RfVkVSU0lPTl9TVE9SQUdFX0tFWSwgbWFuaWZlc3QudmVyc2lvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZXJyb3JSZWxvYWRQYXRoO1xuICAgICAgY29uc29sZS53YXJuKFwiRGV0ZWN0ZWQgbWFuaWZlc3QgdmVyc2lvbiBtaXNtYXRjaCwgcmVsb2FkaW5nLi4uXCIpO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKCkgPT4ge1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzID49IDQwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShNQU5JRkVTVF9WRVJTSU9OX1NUT1JBR0VfS0VZKTtcbiAgICB9IGNhdGNoIHtcbiAgICB9XG4gICAgc2VydmVyUGF0Y2hlcyA9IGF3YWl0IHJlcy5qc29uKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhyb3cgZTtcbiAgfVxuICBsZXQga25vd25Sb3V0ZXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG1hbmlmZXN0LnJvdXRlcykpO1xuICBsZXQgcGF0Y2hlcyA9IE9iamVjdC52YWx1ZXMoc2VydmVyUGF0Y2hlcykucmVkdWNlKChhY2MsIHJvdXRlKSA9PiB7XG4gICAgaWYgKHJvdXRlICYmICFrbm93blJvdXRlcy5oYXMocm91dGUuaWQpKSB7XG4gICAgICBhY2Nbcm91dGUuaWRdID0gcm91dGU7XG4gICAgfVxuICAgIHJldHVybi
25114BhY2M7XG4gIH0sIHt9KTtcbiAgT2JqZWN0LmFzc2lnbihtYW5pZmVzdC5yb3V0ZXMsIHBhdGNoZXMpO1xuICBwYXRocy5mb3JFYWNoKChwKSA9PiBhZGRUb0ZpZm9RdWV1ZShwLCBkaXNjb3ZlcmVkUGF0aHMpKTtcbiAgbGV0IHBhcmVudElkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIE9iamVjdC52YWx1ZXMocGF0Y2hlcykuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICBpZiAocGF0Y2ggJiYgKCFwYXRjaC5wYXJlbnRJZCB8fCAhcGF0Y2hlc1twYXRjaC5wYXJlbnRJZF0pKSB7XG4gICAgICBwYXJlbnRJZHMuYWRkKHBhdGNoLnBhcmVudElkKTtcbiAgICB9XG4gIH0pO1xuICBwYXJlbnRJZHMuZm9yRWFjaChcbiAgICAocGFyZW50SWQpID0+IHBhdGNoUm91dGVzKFxuICAgICAgcGFyZW50SWQgfHwgbnVsbCxcbiAgICAgIGNyZWF0ZUNsaWVudFJvdXRlcyhwYXRjaGVzLCByb3V0ZU1vZHVsZXMsIG51bGwsIHNzciwgaXNTcGFNb2RlLCBwYXJlbnRJZClcbiAgICApXG4gICk7XG59XG5mdW5jdGlvbiBhZGRUb0ZpZm9RdWV1ZShwYXRoLCBxdWV1ZSkge1xuICBpZiAocXVldWUuc2l6ZSA+PSBkaXNjb3ZlcmVkUGF0aHNNYXhTaXplKSB7XG4gICAgbGV0IGZpcnN0ID0gcXVldWUudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgIHF1ZXVlLmRlbGV0ZShmaXJzdCk7XG4gIH1cbiAgcXVldWUuYWRkKHBhdGgpO1xufVxuZnVuY3Rpb24gZGVib3VuY2UoY2FsbGJhY2ssIHdhaXQpIHtcbiAgbGV0IHRpbWVvdXRJZDtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIHRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKC4uLmFyZ3MpLCB3YWl0KTtcbiAgfTtcbn1cblxuLy8gbGliL2RvbS9zc3IvY29tcG9uZW50cy50c3hcbmZ1bmN0aW9uIHVzZURhdGFSb3V0ZXJDb250ZXh0MigpIHtcbiAgbGV0IGNvbnRleHQgPSBSZWFjdDgudXNlQ29udGV4dChEYXRhUm91dGVyQ29udGV4dCk7XG4gIGludmFyaWFudDIoXG4gICAgY29udGV4dCxcbiAgICBcIllvdSBtdXN0IHJlbmRlciB0aGlzIGVsZW1lbnQgaW5zaWRlIGEgPERhdGFSb3V0ZXJDb250ZXh0LlByb3ZpZGVyPiBlbGVtZW50XCJcbiAgKTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5mdW5jdGlvbiB1c2VEYXRhUm91dGVyU3RhdGVDb250ZXh0KCkge1xuICBsZXQgY29udGV4dCA9IFJlYWN0OC51c2VDb250ZXh0KERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQpO1xuICBpbnZhcmlhbnQyKFxuICAgIGNvbnRleHQsXG4gICAgXCJZb3UgbXVzdCByZW5kZXIgdGhpcyBlbGVtZW50IGluc2lkZSBhIDxEYXRhUm91dGVyU3RhdGVDb250ZXh0LlByb3ZpZGVyPiBlbGVtZW50XCJcbiAgKTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG52YXIgRnJhbWV3b3JrQ29udGV4dCA9IFJlYWN0OC5jcmVhdGVDb250ZXh0KHZvaWQgMCk7XG5GcmFtZXdvcmtDb250ZXh0LmRpc3BsYXlOYW1lID0gXCJGcmFtZXdvcmtDb250ZXh0XCI7XG5mdW5jdGlvbiB1c2VGcmFtZXdvcmtDb250ZXh0KCkge1xuICBsZXQgY29udGV4dCA9IFJlYWN0OC51c2VDb250ZXh0KEZyYW1ld29ya0NvbnRleHQpO1xuICBpbnZhcmlhbnQyKFxuICAgIGNvbnRleHQsXG4gICAgXCJZb3UgbXVzdCByZW5kZXIgdGhpcyBlbGVtZW50IGluc2lkZSBhIDxIeWRyYXRlZFJvdXRlcj4gZWxlbWVudFwiXG4gICk7XG4gIHJldHVybiBjb250ZXh0O1xufVxuZnVuY3Rpb24gdXNlUHJlZmV0Y2hCZWhhdmlvcihwcmVmZXRjaCwgdGhlaXJFbGVtZW50UHJvcHMpIHtcbiAgbGV0IGZyYW1ld29ya0NvbnRleHQgPSBSZWFjdDgudXNlQ29udGV4dChGcmFtZXdvcmtDb250ZXh0KTtcbiAgbGV0IFttYXliZVByZWZldGNoLCBzZXRNYXliZVByZWZldGNoXSA9IFJlYWN0OC51c2VTdGF0ZShmYWxzZSk7XG4gIGxldCBbc2hvdWxkUHJlZmV0Y2gsIHNldFNob3VsZFByZWZldGNoXSA9IFJlYWN0OC51c2VTdGF0ZShmYWxzZSk7XG4gIGxldCB7IG9uRm9jdXMsIG9uQmx1ciwgb25Nb3VzZUVudGVyLCBvbk1vdXNlTGVhdmUsIG9uVG91Y2hTdGFydCB9ID0gdGhlaXJFbGVtZW50UHJvcHM7XG4gIGxldCByZWYgPSBSZWFjdDgudXNlUmVmKG51bGwpO1xuICBSZWFjdDgudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocHJlZmV0Y2ggPT
2511409IFwicmVuZGVyXCIpIHtcbiAgICAgIHNldFNob3VsZFByZWZldGNoKHRydWUpO1xuICAgIH1cbiAgICBpZiAocHJlZmV0Y2ggPT09IFwidmlld3BvcnRcIikge1xuICAgICAgbGV0IGNhbGxiYWNrID0gKGVudHJpZXMpID0+IHtcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHNldFNob3VsZFByZWZldGNoKGVudHJ5LmlzSW50ZXJzZWN0aW5nKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbGV0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGNhbGxiYWNrLCB7IHRocmVzaG9sZDogMC41IH0pO1xuICAgICAgaWYgKHJlZi5jdXJyZW50KSBvYnNlcnZlci5vYnNlcnZlKHJlZi5jdXJyZW50KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbcHJlZmV0Y2hdKTtcbiAgUmVhY3Q4LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG1heWJlUHJlZmV0Y2gpIHtcbiAgICAgIGxldCBpZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZXRTaG91bGRQcmVmZXRjaCh0cnVlKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQoaWQpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFttYXliZVByZWZldGNoXSk7XG4gIGxldCBzZXRJbnRlbnQgPSAoKSA9PiB7XG4gICAgc2V0TWF5YmVQcmVmZXRjaCh0cnVlKTtcbiAgfTtcbiAgbGV0IGNhbmNlbEludGVudCA9ICgpID0+IHtcbiAgICBzZXRNYXliZVByZWZldGNoKGZhbHNlKTtcbiAgICBzZXRTaG91bGRQcmVmZXRjaChmYWxzZSk7XG4gIH07XG4gIGlmICghZnJhbWV3b3JrQ29udGV4dCkge1xuICAgIHJldHVybiBbZmFsc2UsIHJlZiwge31dO1xuICB9XG4gIGlmIChwcmVmZXRjaCAhPT0gXCJpbnRlbnRcIikge1xuICAgIHJldHVybiBbc2hvdWxkUHJlZmV0Y2gsIHJlZiwge31dO1xuICB9XG4gIHJldHVybiBbXG4gICAgc2hvdWxkUHJlZmV0Y2gsXG4gICAgcmVmLFxuICAgIHtcbiAgICAgIG9uRm9jdXM6IGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uRm9jdXMsIHNldEludGVudCksXG4gICAgICBvbkJsdXI6IGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uQmx1ciwgY2FuY2VsSW50ZW50KSxcbiAgICAgIG9uTW91c2VFbnRlcjogY29tcG9zZUV2ZW50SGFuZGxlcnMob25Nb3VzZUVudGVyLCBzZXRJbnRlbnQpLFxuICAgICAgb25Nb3VzZUxlYXZlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhvbk1vdXNlTGVhdmUsIGNhbmNlbEludGVudCksXG4gICAgICBvblRvdWNoU3RhcnQ6IGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uVG91Y2hTdGFydCwgc2V0SW50ZW50KVxuICAgIH1cbiAgXTtcbn1cbmZ1bmN0aW9uIGNvbXBvc2VFdmVudEhhbmRsZXJzKHRoZWlySGFuZGxlciwgb3VySGFuZGxlcikge1xuICByZXR1cm4gKGV2ZW50KSA9PiB7XG4gICAgdGhlaXJIYW5kbGVyICYmIHRoZWlySGFuZGxlcihldmVudCk7XG4gICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICBvdXJIYW5kbGVyKGV2ZW50KTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBnZXRBY3RpdmVNYXRjaGVzKG1hdGNoZXMsIGVycm9ycywgaXNTcGFNb2RlKSB7XG4gIGlmIChpc1NwYU1vZGUgJiYgIWlzSHlkcmF0ZWQpIHtcbiAgICByZXR1cm4gW21hdGNoZXNbMF1dO1xuICB9XG4gIGlmIChlcnJvcnMpIHtcbiAgICBsZXQgZXJyb3JJZHggPSBtYXRjaGVzLmZpbmRJbmRleCgobSkgPT4gZXJyb3JzW20ucm91dGUuaWRdICE9PSB2b2lkIDApO1xuICAgIHJldHVybiBtYXRjaGVzLnNsaWNlKDAsIGVycm9ySWR4ICsgMSk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXM7XG59XG52YXIgQ1JJVElDQUxfQ1NTX0RBVEFfQVRUUklCVVRFID0gXCJkYXRhLXJlYWN0LXJvdXRlci1jcml0aWNhbC1jc3NcIjtcbmZ1bmN0aW9uIExpbmtzKHsgbm9uY2UgfSkge1xuICBsZXQgeyBpc1NwYU1vZGUsIG1hbmlmZXN0LCByb3V0ZU1vZHVsZXMsIGNyaXRpY2FsQ3NzIH0gPSB1c2VGcmFtZXdvcmtDb250ZXh0KCk7XG4gIGxldCB7IGVycm9ycywgbWF0Y2hlczogcm91dGVyTWF0Y2hlcyB9ID0gdXNlRGF0YVJvdXRlclN0YXRlQ29udGV4dCgpO1xuICBsZXQgbWF0Y2hlcyA9IGdldEFjdGl2ZU1hdGNoZXMocm91dGVyTWF0Y2hlcywgZXJyb3JzLCBpc1NwYU1vZGUpO1xuICBsZXQga2V5ZWRMaW5rcyA9IFJlYWN0OC51c2VNZW1vKFxuICAgICgpID0+IGdldEtleWVkTGlua3NGb3JNYXRjaGVzKG1hdGNoZXMsIHJvdXRlTW9kdWxlcywgbWFuaWZlc3QpLFxuICAgIFttYXRjaGVzLCByb3V0ZU1vZHVsZXMsIG1hbmlmZXN0XVxuICApO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFJlYWN0OC5GcmFnbWVudCwgbnVsbCwgdHlwZW9mIGNyaXRpY2FsQ3NzID09PSBcInN0cmluZ1wiID8gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFxuICAgIFwic3R5bGVcIixcbiAgICB7XG4gICAgICAuLi57IFtDUklUSUNBTF9DU1NfREFUQV9BVFRSSUJVVEVdOiBcIlwiIH0sXG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IGNyaXRpY2FsQ3NzIH1cbiAgICB9XG4gICkgOiBudWxsLCB0eXBlb2YgY3JpdGljYWxDc3MgPT09IFwib2JqZWN0XCIgPyAvKiBAX19QVVJFX18gKi8gUmVhY3Q4LmNyZWF0ZUVsZW1lbnQoXG4gICAgXCJsaW5rXCIsXG4gICAge1xuICAgICAgLi4ueyBbQ1JJVElDQUxfQ1NTX0RBVEFfQVRUUklCVVRFXTogXCJcIiB9LFxuICAgICAgcmVsOiBcInN0eWxlc2hlZXRcIixcbiAgICAgIGhyZWY6IGNyaXRpY2FsQ3NzLmhyZWYsXG4gICAgICBub25jZVxuICAgIH1cbiAgKSA6IG51bGwsIGtleWVkTGlua3MubWFwKFxuICAgICh7IGtleSwgbGluayB9KSA9PiBpc1BhZ2VM
25114aW5rRGVzY3JpcHRvcihsaW5rKSA/IC8qIEBfX1BVUkVfXyAqLyBSZWFjdDguY3JlYXRlRWxlbWVudChQcmVmZXRjaFBhZ2VMaW5rcywgeyBrZXksIG5vbmNlLCAuLi5saW5rIH0pIDogLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFwibGlua1wiLCB7IGtleSwgbm9uY2UsIC4uLmxpbmsgfSlcbiAgKSk7XG59XG5mdW5jdGlvbiBQcmVmZXRjaFBhZ2VMaW5rcyh7IHBhZ2UsIC4uLmxpbmtQcm9wcyB9KSB7XG4gIGxldCB7IHJvdXRlciB9ID0gdXNlRGF0YVJvdXRlckNvbnRleHQyKCk7XG4gIGxldCBtYXRjaGVzID0gUmVhY3Q4LnVzZU1lbW8oXG4gICAgKCkgPT4gbWF0Y2hSb3V0ZXMocm91dGVyLnJvdXRlcywgcGFnZSwgcm91dGVyLmJhc2VuYW1lKSxcbiAgICBbcm91dGVyLnJvdXRlcywgcGFnZSwgcm91dGVyLmJhc2VuYW1lXVxuICApO1xuICBpZiAoIW1hdGNoZXMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFByZWZldGNoUGFnZUxpbmtzSW1wbCwgeyBwYWdlLCBtYXRjaGVzLCAuLi5saW5rUHJvcHMgfSk7XG59XG5mdW5jdGlvbiB1c2VLZXllZFByZWZldGNoTGlua3MobWF0Y2hlcykge1xuICBsZXQgeyBtYW5pZmVzdCwgcm91dGVNb2R1bGVzIH0gPSB1c2VGcmFtZXdvcmtDb250ZXh0KCk7XG4gIGxldCBba2V5ZWRQcmVmZXRjaExpbmtzLCBzZXRLZXllZFByZWZldGNoTGlua3NdID0gUmVhY3Q4LnVzZVN0YXRlKFtdKTtcbiAgUmVhY3Q4LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGludGVycnVwdGVkID0gZmFsc2U7XG4gICAgdm9pZCBnZXRLZXllZFByZWZldGNoTGlua3MobWF0Y2hlcywgbWFuaWZlc3QsIHJvdXRlTW9kdWxlcykudGhlbihcbiAgICAgIChsaW5rcykgPT4ge1xuICAgICAgICBpZiAoIWludGVycnVwdGVkKSB7XG4gICAgICAgICAgc2V0S2V5ZWRQcmVmZXRjaExpbmtzKGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGludGVycnVwdGVkID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbbWF0Y2hlcywgbWFuaWZlc3QsIHJvdXRlTW9kdWxlc10pO1xuICByZXR1cm4ga2V5ZWRQcmVmZXRjaExpbmtzO1xufVxuZnVuY3Rpb24gUHJlZmV0Y2hQYWdlTGlua3NJbXBsKHtcbiAgcGFnZSxcbiAgbWF0Y2hlczogbmV4dE1hdGNoZXMsXG4gIC4uLmxpbmtQcm9wc1xufSkge1xuICBsZXQgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICBsZXQgeyBtYW5pZmVzdCwgcm91dGVNb2R1bGVzIH0gPSB1c2VGcmFtZXdvcmtDb250ZXh0KCk7XG4gIGxldCB7IGJhc2VuYW1lIH0gPSB1c2VEYXRhUm91dGVyQ29udGV4dDIoKTtcbiAgbGV0IHsgbG9hZGVyRGF0YSwgbWF0Y2hlcyB9ID0gdXNlRGF0YVJvdXRlclN0YXRlQ29udGV4dCgpO1xuICBsZXQgbmV3TWF0Y2hlc0ZvckRhdGEgPSBSZWFjdDgudXNlTWVtbyhcbiAgICAoKSA9PiBnZXROZXdNYXRjaGVzRm9yTGlua3MoXG4gICAgICBwYWdlLFxuICAgICAgbmV4dE1hdGNoZXMsXG4gICAgICBtYXRjaGVzLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIFwiZGF0YVwiXG4gICAgKSxcbiAgICBbcGFnZSwgbmV4dE1hdGNoZXMsIG1hdGNoZXMsIG1hbmlmZXN0LCBsb2NhdGlvbl1cbiAgKTtcbiAgbGV0IG5ld01hdGNoZXNGb3JBc3NldHMgPSBSZWFjdDgudXNlTWVtbyhcbiAgICAoKSA9PiBnZXROZXdNYXRjaGVzRm9yTGlua3MoXG4gICAgICBwYWdlLFxuICAgICAgbmV4dE1hdGNoZXMsXG4gICAgICBtYXRjaGVzLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIFwiYXNzZXRzXCJcbiAgICApLFxuICAgIFtwYWdlLCBuZXh0TWF0Y2hlcywgbWF0Y2hlcywgbWFuaWZlc3QsIGxvY2F0aW9uXVxuICApO1xuICBsZXQgZGF0YUhyZWZzID0gUmVhY3Q4LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChwYWdlID09PSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaCArIGxvY2F0aW9uLmhhc2gpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHJvdXRlc1BhcmFtcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgbGV0IGZvdW5kT3B0T3V0Um91dGUgPSBmYWxzZTtcbiAgICBuZXh0TWF0Y2hlcy5mb3JFYWNoKChtKSA9PiB7XG4gICAgICBsZXQgbWFuaWZlc3RSb3V0ZSA9IG1hbmlmZXN0LnJvdXRlc1ttLnJvdXRlLmlkXTtcbiAgICAgIGlmICghbWFuaWZlc3RSb3V0ZSB8fCAhbWFuaWZlc3RSb3V0ZS5oYXNMb2FkZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFuZXdNYXRjaGVzRm9yRGF0YS5zb21lKChtMikgPT4gbTIucm91dGUuaWQgPT09IG0ucm91dGUuaWQpICYmIG0ucm91dGUuaWQgaW4gbG9hZGVyRGF0YSAmJiByb3V0ZU1vZHVsZXNbbS5yb3V0ZS5pZF0/LnNob3VsZFJldmFsaWRhdGUpIHtcbiAgICAgICAgZm91bmRPcHRPdXRSb3V0ZSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG1hbmlmZXN0Um91dGUuaGFzQ2xpZW50TG9hZGVyKSB7XG4gICAgICAgIGZvdW5kT3B0T3V0Um91dGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm91dGVzUGFyYW1zLmFkZChtLnJvdXRlLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocm91dGVzUGFyYW1zLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHVybCA9IHNpbmdsZUZldGNoVXJsKHBhZ2UsIGJhc2VuYW1lLCBcImRhdGFcIik7XG4gICAgaWYgKGZvdW5kT3B0T3V0Um91dGUgJiYgcm91dGVzUGFyYW1zLnNpemUgPiAwKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcbiAgICAgICAgXCJfcm91dGVzXCIsXG4gICAgICAgIG5leHRNYXRjaGVzLmZpbHRlcigobSkgPT4gcm91dGVzUGFyYW1zLmhhcyhtLnJvdXRlLmlkKSkubWFwKChtKSA9PiBtLnJvdXRlLmlkKS5qb2luKFwiLFwiKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFt1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXTtcbiAgfSwgW1xuICAgIGJhc2VuYW1lLFxuICAgIGxvYWRlckRhdGEsXG4gICAgbG9jYXRpb24sXG4gICAgbWFuaWZlc3QsXG4gICAgbmV3TWF0Y2hlc0ZvckRhdGEsXG4gICAgbmV4dE1hdGNoZXMsXG4gICAgcGFnZSxcbiAgICByb3V0ZU1vZHVsZXNcbiAgXSk7XG4gIGxldCBtb2R1bGVIcmVmcyA9IFJlYWN0OC51c2VNZW1vKFxuICAgICgpID0+IGdldE1vZHVsZUxpbmtIcmVmcyhuZXdNYXRjaGVzRm9yQXNzZXRzLCBtYW5pZmVzdCksXG4gICAgW25ld01hdGNoZXNGb3JBc3NldHMsIG1hbmlmZXN0XVxuICApO1xuICBsZXQga2V5ZWRQcmVmZXRjaExpbmtzID0gdXNlS2V5ZWRQcmVmZXRjaExpbmtzKG5ld01hdGNoZXNGb3JBc3NldHMpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFJlYWN0OC5GcmFnbWVudCwgbnVsbCwgZGF0YUhyZWZzLm1hcCgoaHJlZikgPT4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFwibGlua1wiLCB7IGtleTogaHJlZiwgcmVsOiBcInByZWZldGNoXCIsIGFzOiBcImZldGNoXCIsIGhyZWYsIC4uLmxpbmtQcm9wcyB9KSksIG1vZHVsZUhyZWZzLm1hcCgoaHJlZikgPT4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFwibGlua1wiLCB7IGtleTogaHJlZiwgcmVsOiBcIm1vZHVsZXByZWxvYWRcIiwgaHJlZiwgLi4ubGlua1Byb3BzIH0pKSwga2V5ZWRQcmVmZXRjaExpbmtzLm1hcCgoeyBrZXksIGxpbmsgfSkgPT4gKFxuICAgIC8vIHRoZXNlIGRvbid0IHNwcmVhZCBgbGlua1Byb3BzYCBiZWNhdXNlIHRoZXkgYXJlIGZ1bGwgbGluayBkZXNjcmlwdG9yc1xuICAgIC8vIGFscmVhZHkgd2l0aCB0aGVpciBvd24gcHJvcHNcbiAgICAvKiBAX19QVVJFX18gKi8gUmVhY3Q4LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIsIHsga2V5LCBub25jZTogbGlua1Byb3BzLm5vbmNlLCAuLi5saW5rIH0pXG4gICkpKTtcbn1cbmZ1bmN0aW9uIE1ldGEoKSB7XG4gIGxldCB7IGlzU3BhTW9kZSwgcm91dGVNb2R1bGVzIH0gPSB1c2VGcmFtZXdvcmtDb250ZXh0KCk7XG4gIGxldCB7XG4gICAgZXJyb3JzLFxuICAgIG1hdGNoZXM6IHJvdXRlck1hdGNoZXMsXG4gICAgbG9hZGVyRGF0YVxuICB9ID0gdXNlRGF0YVJvdXRlclN0YXRlQ29udGV4dCgpO1xuICBsZXQgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICBsZXQgX21hdGNoZXMgPSBnZXRBY3RpdmVNYXRjaGVzKHJvdXRlck1hdGNoZXMsIGVycm9ycywgaXNTcGFNb2RlKTtcbiAgbGV0IGVycm9yID0gbnVsbDtcbiAgaWYgKGVycm9ycykge1xuICAgIGVycm9yID0gZXJyb3JzW19tYXRjaGVzW19tYXRjaGVzLmxlbmd0aCAtIDFdLnJvdXRlLmlkXTtcbiAgfVxuICBsZXQgbWV0YSA9IFtdO1xuICBsZXQgbGVhZk1ldGEgPSBudWxsO1xuICBsZXQgbWF0Y2hlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IF9tYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IF9tYXRjaCA9IF9tYXRjaGVzW2ldO1xuICAgIGxldCByb3V0ZUlkID0gX21hdGNoLnJvdXRlLmlkO1xuICAgIGxldCBkYXRhMiA9IGxvYWRlckRhdGFbcm91dGVJZF07XG4gICAgbGV0IHBhcmFtcyA9IF9tYXRjaC5wYXJhbXM7XG4gICAgbGV0IHJvdXRlTW9kdWxlID0gcm91dGVNb2R1bGVzW3JvdXRlSWRdO1xuICAgIGxldCByb3V0ZU1ldGEgPSBbXTtcbiAgICBsZXQgbWF0Y2ggPSB7XG4gICAgICBpZDogcm91dGVJZCxcbiAgICAgIGRhdGE6IGRhdGEyLFxuICAgICAgbG9hZGVyRGF0YTogZGF0YTIsXG4gICAgICBtZXRhOiBbXSxcbiAgICAgIHBhcmFtczogX21hdGNoLnBhcmFtcyxcbiAgICAgIHBhdGhuYW1lOiBfbWF0Y2gucGF0aG5hbWUsXG4gICAgICBoYW5kbGU6IF9tYXRjaC5yb3V0ZS5oYW5kbGUsXG4gICAgICBlcnJvclxuICAgIH07XG4gICAgbWF0Y2hlc1tpXSA9IG1hdGNoO1xuICAgIGlmIChyb3V0ZU1vZHVsZT8ubWV0YSkge1xuICAgICAgcm91dGVNZXRhID0gdHlwZW9mIHJvdXRlTW9kdWxlLm1ldGEgPT09IFwiZnVuY3Rpb25cIiA/IHJvdXRlTW9kdWxlLm1ldGEoe1xuICAgICAgICBkYXRhOiBkYXRhMixcbiAgICAgICAgbG9hZGVyRGF0YTogZGF0YTIsXG4gICAgICAgI
25114HBhcmFtcyxcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIGVycm9yXG4gICAgICB9KSA6IEFycmF5LmlzQXJyYXkocm91dGVNb2R1bGUubWV0YSkgPyBbLi4ucm91dGVNb2R1bGUubWV0YV0gOiByb3V0ZU1vZHVsZS5tZXRhO1xuICAgIH0gZWxzZSBpZiAobGVhZk1ldGEpIHtcbiAgICAgIHJvdXRlTWV0YSA9IFsuLi5sZWFmTWV0YV07XG4gICAgfVxuICAgIHJvdXRlTWV0YSA9IHJvdXRlTWV0YSB8fCBbXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocm91dGVNZXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSByb3V0ZSBhdCBcIiArIF9tYXRjaC5yb3V0ZS5wYXRoICsgXCIgcmV0dXJucyBhbiBpbnZhbGlkIHZhbHVlLiBBbGwgcm91dGUgbWV0YSBmdW5jdGlvbnMgbXVzdCByZXR1cm4gYW4gYXJyYXkgb2YgbWV0YSBvYmplY3RzLlxcblxcblRvIHJlZmVyZW5jZSB0aGUgbWV0YSBmdW5jdGlvbiBBUEksIHNlZSBodHRwczovL3JlbWl4LnJ1bi9yb3V0ZS9tZXRhXCJcbiAgICAgICk7XG4gICAgfVxuICAgIG1hdGNoLm1ldGEgPSByb3V0ZU1ldGE7XG4gICAgbWF0Y2hlc1tpXSA9IG1hdGNoO1xuICAgIG1ldGEgPSBbLi4ucm91dGVNZXRhXTtcbiAgICBsZWFmTWV0YSA9IG1ldGE7XG4gIH1cbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDguY3JlYXRlRWxlbWVudChSZWFjdDguRnJhZ21lbnQsIG51bGwsIG1ldGEuZmxhdCgpLm1hcCgobWV0YVByb3BzKSA9PiB7XG4gICAgaWYgKCFtZXRhUHJvcHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoXCJ0YWdOYW1lXCIgaW4gbWV0YVByb3BzKSB7XG4gICAgICBsZXQgeyB0YWdOYW1lLCAuLi5yZXN0IH0gPSBtZXRhUHJvcHM7XG4gICAgICBpZiAoIWlzVmFsaWRNZXRhVGFnKHRhZ05hbWUpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgQSBtZXRhIG9iamVjdCB1c2VzIGFuIGludmFsaWQgdGFnTmFtZTogJHt0YWdOYW1lfS4gRXhwZWN0ZWQgZWl0aGVyICdsaW5rJyBvciAnbWV0YSdgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbGV0IENvbXAgPSB0YWdOYW1lO1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDguY3JlYXRlRWxlbWVudChDb21wLCB7IGtleTogSlNPTi5zdHJpbmdpZnkocmVzdCksIC4uLnJlc3QgfSk7XG4gICAgfVxuICAgIGlmIChcInRpdGxlXCIgaW4gbWV0YVByb3BzKSB7XG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwgeyBrZXk6IFwidGl0bGVcIiB9LCBTdHJpbmcobWV0YVByb3BzLnRpdGxlKSk7XG4gICAgfVxuICAgIGlmIChcImNoYXJzZXRcIiBpbiBtZXRhUHJvcHMpIHtcbiAgICAgIG1ldGFQcm9wcy5jaGFyU2V0ID8/IChtZXRhUHJvcHMuY2hhclNldCA9IG1ldGFQcm9wcy5jaGFyc2V0KTtcbiAgICAgIGRlbGV0ZSBtZXRhUHJvcHMuY2hhcnNldDtcbiAgICB9XG4gICAgaWYgKFwiY2hhclNldFwiIGluIG1ldGFQcm9wcyAmJiBtZXRhUHJvcHMuY2hhclNldCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG1ldGFQcm9wcy5jaGFyU2V0ID09PSBcInN0cmluZ1wiID8gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFwibWV0YVwiLCB7IGtleTogXCJjaGFyU2V0XCIsIGNoYXJTZXQ6IG1ldGFQcm9wcy5jaGFyU2V0IH0pIDogbnVsbDtcbiAgICB9XG4gICAgaWYgKFwic2NyaXB0OmxkK2pzb25cIiBpbiBtZXRhUHJvcHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBqc29uID0gSlNPTi5zdHJpbmdpZnkobWV0YVByb3BzW1wic2NyaXB0OmxkK2pzb25cIl0pO1xuICAgICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIFwic2NyaXB0XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiBgc2NyaXB0OmxkK2pzb246JHtqc29ufWAsXG4gICAgICAgICAgICB0eXBlOiBcImFwcGxpY2F0aW9uL2xkK2pzb25cIixcbiAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogZXNjYXBlSHRtbChqc29uKSB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFwibWV0YVwiLCB7IGtleTogSlNPTi5zdHJpbmdpZnkobWV0YVByb3BzKSwgLi4ubWV0YVByb3BzIH0pO1xuICB9KSk7XG59XG5mdW5jdGlvbiBpc1ZhbGlkTWV0YVRhZyh0YWdOYW1lKSB7XG4gIHJldHVybiB0eXBlb2YgdGFnTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiAvXihtZXRhfGxpbmspJC8udGVzdCh0YWdOYW1lKTtcbn1cbnZhciBpc0h5ZHJhdGVkID0gZmFsc2U7XG5mdW5jdGlvbiBzZXRJc0h5ZHJhdGVkKCkge1xuICBpc0h5ZHJhdGVkID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFNjcmlwdHMoc2NyaXB0UHJvcHMpIHtcbiAgbGV0IHtcbiAgICBtYW5pZmVzdCxcbiAgICBzZXJ2ZXJIYW5kb2ZmU3RyaW5nLFxuICAgIGlzU3BhTW9kZSxcbiAgICByZW5kZXJNZXRhLFxuICAgIHJvdXRlRGlzY292ZXJ5LFxuICAgIHNzclxuICB9ID0gdXNlRnJhbWV3b3JrQ29udGV4dCgpO1xuICBsZXQgeyByb3V0ZXIsIHN0YXRpYzogaXNTdGF0aWMsIHN0YXRpY0NvbnRleHQgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0MigpO1xuICBsZXQgeyBtYXRjaGVzOiByb3V0ZXJNYXRjaGVzIH0gPSB1c2VEYXRhUm91dGVyU3RhdGVDb250ZXh0KCk7XG4gIGxldCBpc1JTQ1JvdXRlckNvbnRleHQgPSB1c2VJc1JTQ1JvdXRlckNvbnRleHQoKTtcbiAgbGV0IGVuYWJsZUZvZ09mV2FyID0gaXNGb2dPZldhckVuYWJsZWQocm91dGVEaXNjb3ZlcnksIHNzcik7XG4gIGlmIChyZW5kZXJNZXRhKSB7XG4gICAgcmVuZGVyTWV0YS5kaWRSZW5kZXJTY3JpcHRzID0gdHJ1ZTtcbiAgfVxuICBsZXQgbWF0Y2hlcyA9IGdldEFjdGl2ZU1hdGNoZXMocm91dGVyTWF0Y2hlcywgbnVsbCwgaXNTcGFNb2RlKTtcbiAgUmVhY3Q4LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0SXNIeWRyYXRlZCgpO1xuICB9LCBbXSk7XG4gIGxldCBpbml0aWFsU2NyaXB0cyA9IFJlYWN0OC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoaXNSU0NSb3V0ZXJDb250ZXh0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0IHN0cmVhbVNjcmlwdCA9IFwid2luZG93Ll9fcmVhY3RSb3V0ZXJDb250ZXh0LnN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7c3RhcnQoY29udHJvbGxlcil7d2luZG93Ll9fcmVhY3RSb3V0ZXJDb250ZXh0LnN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO319KS5waXBlVGhyb3VnaChuZXcgVGV4dEVuY29kZXJTdHJlYW0oKSk7XCI7XG4gICAgbGV0IGNvbnRleHRTY3JpcHQgPSBzdGF0aWNDb250ZXh0ID8gYHdpbmRvdy5fX3JlYWN0Um91dGVyQ29udGV4dCA9ICR7c2VydmVySGFuZG9mZlN0cmluZ307JHtzdHJlYW1TY3JpcHR9YCA6IFwiIFwiO1xuICAgIGxldCByb3V0ZU1vZHVsZXNTY3JpcHQgPSAhaXNTdGF0aWMgPyBcIiBcIiA6IGAke21hbmlmZXN0Lmhtcj8ucnVudGltZSA/IGBpbXBvcnQgJHtKU09OLnN0cmluZ2lmeShtYW5pZmVzdC5obXIucnVudGltZSl9O2AgOiBcIlwifSR7IWVuYWJsZUZvZ09mV2FyID8gYGltcG9ydCAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LnVybCl9YCA6IFwiXCJ9O1xuJHttYXRjaGVzLm1hcCgobWF0Y2gsIHJvdXRlSW5kZXgpID0+IHtcbiAgICAgIGxldCByb3V0ZVZhck5hbWUgPSBgcm91dGUke3JvdXRlSW5kZXh9YDtcbiAgICAgIGxldCBtYW5pZmVzdEVudHJ5ID0gbWFuaWZlc3Qucm91dGVzW21hdGNoLnJvdXRlLmlkXTtcbiAgICAgIGludmFyaWFudDIobWFuaWZlc3RFbnRyeSwgYFJvdXRlICR7bWF0Y2gucm91dGUuaWR9IG5vdCBmb3VuZCBpbiBtYW5pZmVzdGApO1xuICAgICAgbGV0IHtcbiAgICAgICAgY2xpZW50QWN0aW9uTW9kdWxlLFxuICAgICAgICBjbGllbnRMb2FkZXJNb2R1bGUsXG4gICAgICAgIGNsaWVudE1pZGRsZXdhcmVNb2R1bGUsXG4gICAgICAgIGh5ZHJhdGVGYWxsYmFja01vZHVsZSxcbiAgICAgICAgbW9kdWxlXG4gICAgICB9ID0gbWFuaWZlc3RFbnRyeTtcbiAgICAgIGxldCBjaHVua3MgPSBbXG4gICAgICAgIC4uLmNsaWVudEFjdGlvbk1vZHVsZSA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGU6IGNsaWVudEFjdGlvbk1vZHVsZSxcbiAgICAgICAgICAgI
25114HZhck5hbWU6IGAke3JvdXRlVmFyTmFtZX1fY2xpZW50QWN0aW9uYFxuICAgICAgICAgIH1cbiAgICAgICAgXSA6IFtdLFxuICAgICAgICAuLi5jbGllbnRMb2FkZXJNb2R1bGUgPyBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlOiBjbGllbnRMb2FkZXJNb2R1bGUsXG4gICAgICAgICAgICB2YXJOYW1lOiBgJHtyb3V0ZVZhck5hbWV9X2NsaWVudExvYWRlcmBcbiAgICAgICAgICB9XG4gICAgICAgIF0gOiBbXSxcbiAgICAgICAgLi4uY2xpZW50TWlkZGxld2FyZU1vZHVsZSA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGU6IGNsaWVudE1pZGRsZXdhcmVNb2R1bGUsXG4gICAgICAgICAgICB2YXJOYW1lOiBgJHtyb3V0ZVZhck5hbWV9X2NsaWVudE1pZGRsZXdhcmVgXG4gICAgICAgICAgfVxuICAgICAgICBdIDogW10sXG4gICAgICAgIC4uLmh5ZHJhdGVGYWxsYmFja01vZHVsZSA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGU6IGh5ZHJhdGVGYWxsYmFja01vZHVsZSxcbiAgICAgICAgICAgIHZhck5hbWU6IGAke3JvdXRlVmFyTmFtZX1fSHlkcmF0ZUZhbGxiYWNrYFxuICAgICAgICAgIH1cbiAgICAgICAgXSA6IFtdLFxuICAgICAgICB7IG1vZHVsZSwgdmFyTmFtZTogYCR7cm91dGVWYXJOYW1lfV9tYWluYCB9XG4gICAgICBdO1xuICAgICAgaWYgKGNodW5rcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgKiBhcyAke3JvdXRlVmFyTmFtZX0gZnJvbSAke0pTT04uc3RyaW5naWZ5KG1vZHVsZSl9O2A7XG4gICAgICB9XG4gICAgICBsZXQgY2h1bmtJbXBvcnRzU25pcHBldCA9IGNodW5rcy5tYXAoKGNodW5rKSA9PiBgaW1wb3J0ICogYXMgJHtjaHVuay52YXJOYW1lfSBmcm9tIFwiJHtjaHVuay5tb2R1bGV9XCI7YCkuam9pbihcIlxcblwiKTtcbiAgICAgIGxldCBtZXJnZWRDaHVua3NTbmlwcGV0ID0gYGNvbnN0ICR7cm91dGVWYXJOYW1lfSA9IHske2NodW5rcy5tYXAoKGNodW5rKSA9PiBgLi4uJHtjaHVuay52YXJOYW1lfWApLmpvaW4oXCIsXCIpfX07YDtcbiAgICAgIHJldHVybiBbY2h1bmtJbXBvcnRzU25pcHBldCwgbWVyZ2VkQ2h1bmtzU25pcHBldF0uam9pbihcIlxcblwiKTtcbiAgICB9KS5qb2luKFwiXFxuXCIpfVxuICAke2VuYWJsZUZvZ09mV2FyID8gKFxuICAgICAgLy8gSW5saW5lIGEgbWluaW1hbCBtYW5pZmVzdCB3aXRoIHRoZSBTU1IgbWF0Y2hlc1xuICAgICAgYHdpbmRvdy5fX3JlYWN0Um91dGVyTWFuaWZlc3QgPSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICBnZXRQYXJ0aWFsTWFuaWZlc3QobWFuaWZlc3QsIHJvdXRlciksXG4gICAgICAgIG51bGwsXG4gICAgICAgIDJcbiAgICAgICl9O2BcbiAgICApIDogXCJcIn1cbiAgd2luZG93Ll9fcmVhY3RSb3V0ZXJSb3V0ZU1vZHVsZXMgPSB7JHttYXRjaGVzLm1hcCgobWF0Y2gsIGluZGV4KSA9PiBgJHtKU09OLnN0cmluZ2lmeShtYXRjaC5yb3V0ZS5pZCl9OnJvdXRlJHtpbmRleH1gKS5qb2luKFwiLFwiKX19O1xuXG5pbXBvcnQoJHtKU09OLnN0cmluZ2lmeShtYW5pZmVzdC5lbn
25114RyeS5tb2R1bGUpfSk7YDtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFJlYWN0OC5GcmFnbWVudCwgbnVsbCwgLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFxuICAgICAgXCJzY3JpcHRcIixcbiAgICAgIHtcbiAgICAgICAgLi4uc2NyaXB0UHJvcHMsXG4gICAgICAgIHN1cHByZXNzSHlkcmF0aW9uV2FybmluZzogdHJ1ZSxcbiAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHsgX19odG1sOiBjb250ZXh0U2NyaXB0IH0sXG4gICAgICAgIHR5cGU6IHZvaWQgMFxuICAgICAgfVxuICAgICksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDguY3JlYXRlRWxlbWVudChcbiAgICAgIFwic2NyaXB0XCIsXG4gICAgICB7XG4gICAgICAgIC4uLnNjcmlwdFByb3BzLFxuICAgICAgICBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmc6IHRydWUsXG4gICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogcm91dGVNb2R1bGVzU2NyaXB0IH0sXG4gICAgICAgIHR5cGU6IFwibW9kdWxlXCIsXG4gICAgICAgIGFzeW5jOiB0cnVlXG4gICAgICB9XG4gICAgKSk7XG4gIH0sIFtdKTtcbiAgbGV0IHByZWxvYWRzID0gaXNIeWRyYXRlZCB8fCBpc1JTQ1JvdXRlckNvbnRleHQgPyBbXSA6IGRlZHVwZShcbiAgICBtYW5pZmVzdC5lbnRyeS5pbXBvcnRzLmNvbmNhdChcbiAgICAgIGdldE1vZHVsZUxpbmtIcmVmcyhtYXRjaGVzLCBtYW5pZmVzdCwge1xuICAgICAgICBpbmNsdWRlSHlkcmF0ZUZhbGxiYWNrOiB0cnVlXG4gICAgICB9KVxuICAgIClcbiAgKTtcbiAgbGV0IHNyaSA9IHR5cGVvZiBtYW5pZmVzdC5zcmkgPT09IFwib2JqZWN0XCIgPyBtYW5pZmVzdC5zcmkgOiB7fTtcbiAgd2Fybk9uY2UoXG4gICAgIWlzUlNDUm91dGVyQ29udGV4dCxcbiAgICBcIlRoZSA8U2NyaXB0cyAvPiBlbGVtZW50IGlzIGEgbm8tb3Agd2hlbiB1c2luZyBSU0MgYW5kIGNhbiBiZSBzYWZlbHkgcmVtb3ZlZC5cIlxuICApO1xuICByZXR1cm4gaXNIeWRyYXRlZCB8fCBpc1JTQ1JvdXRlckNvbnRleHQgPyBudWxsIDogLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFJlYWN0OC5GcmFnbWVudCwgbnVsbCwgdHlwZW9mIG1hbmlmZXN0LnNyaSA9PT0gXCJvYmplY3RcIiA/IC8qIEBfX1BVUkVfXyAqLyBSZWFjdDguY3JlYXRlRWxlbWVudChcbiAgICBcInNjcmlwdFwiLFxuICAgIHtcbiAgICAgIFwicnItaW1wb3J0bWFwXCI6IFwiXCIsXG4gICAgICB0eXBlOiBcImltcG9ydG1hcFwiLFxuICAgICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nOiB0cnVlLFxuICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtcbiAgICAgICAgX19odG1sOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgaW50ZWdyaXR5OiBzcmlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICkgOiBudWxsLCAhZW5hYmxlRm9nT2ZXYXIgPyAvKiBAX19QVVJFX18gKi8gUmVhY3Q4LmNyZWF0ZUVsZW1lbnQoXG4gICAgXCJsaW5rXCIsXG4gICAge1xuICAgICAgcmVsOiBcIm1vZHVsZXByZWxvYWRcIixcbiAgICAgIGhyZWY6IG1hbmlmZXN0LnVybCxcbiAgICAgIGNyb3NzT3JpZ2luOiBzY3JpcHRQcm9wcy5jcm9zc09yaWdpbixcbiAgICAgIGludGVncml0eTogc3JpW21hbmlmZXN0LnVybF0sXG4gICAgICBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmc6IHRydWVcbiAgICB9XG4gICkgOiBudWxsLCAvKiBAX19QVVJFX18gKi8gUmVhY3Q4LmNyZWF0ZUVsZW1lbnQoXG4gICAgXCJsaW5rXCIsXG4gICAge1xuICAgICAgcmVsOiBcIm1vZHVsZXByZWxvYWRcIixcbiAgICAgIGhyZWY6IG1hbmlmZXN0LmVudHJ5Lm1vZHVsZSxcbiAgICAgIGNyb3NzT3JpZ2luOiBzY3JpcHRQcm9wcy5jcm9zc09yaWdpbixcbiAgICAgIGludGVncml0eTogc3JpW21hbmlmZXN0LmVudHJ5Lm1vZHVsZV0sXG4gICAgICBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmc6IHRydWVcbiAgICB9XG4gICksIHByZWxvYWRzLm1hcCgocGF0aCkgPT4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFxuICAgIFwibGlua1wiLFxuICAgIHtcbiAgICAgIGtleTogcGF0aCxcbiAgICAgIHJlbDogXCJtb2R1bGVwcmVsb2FkXCIsXG4gICAgICBocmVmOiBwYXRoLFxuICAgICAgY3Jvc3NPcmlnaW46IHNjcmlwdFByb3BzLmNyb3NzT3JpZ2luLFxuICAgICAgaW50ZWdyaXR5OiBzcmlbcGF0aF0sXG4gICAgICBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmc6IHRydWVcbiAgICB9XG4gICkpLCBpbml0aWFsU2NyaXB0cyk7XG59XG5mdW5jdGlvbiBkZWR1cGUoYXJyYXkpIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGFycmF5KV07XG59XG5mdW5jdGlvbiBtZXJnZVJlZnMoLi4ucmVmcykge1xuICByZXR1cm4gKHZhbHVlKSA9PiB7XG4gICAgcmVmcy5mb3JFYWNoKChyZWYpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmVmKHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAocmVmICE9IG51bGwpIHtcbiAgICAgICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn1cblxuLy8gbGliL2RvbS9zc3IvZXJyb3JCb3VuZGFyaWVzLnRzeFxudmFyIFJlbWl4RXJyb3JCb3VuZGFyeSA9IGNsYXNzIGV4dGVuZHMgUmVhY3Q5LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7IGVycm9yOiBwcm9wcy5lcnJvciB8fCBudWxsLCBsb2NhdGlvbjogcHJvcHMubG9jYXRpb24gfTtcbiAgfVxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZXJyb3IgfTtcbiAgfVxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5sb2NhdGlvbiAhPT0gcHJvcHMubG9jYXRpb24pIHtcbiAgICAgIHJldHVybiB7IGVycm9yOiBwcm9wcy5lcnJvciB8fCBudWxsLCBsb2NhdGlvbjogcHJvcHMubG9jYXRpb24gfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZXJyb3I6IHByb3BzLmVycm9yIHx8IHN0YXRlLmVycm9yLCBsb2NhdGlvbjogc3RhdGUubG9jYXRpb24gfTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3Q5LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFJlbWl4Um9vdERlZmF1bHRFcnJvckJvdW5kYXJ5LFxuICAgICAgICB7XG4gICAgICAgICAgZXJyb3I6IHRoaXMuc3RhdGUuZXJyb3IsXG4gICAgICAgICAgaXNPdXRzaWRlUmVtaXhBcHA6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gUmVtaXhSb290RGVmYXVsdEVycm9yQm91bmRhcnkoe1xuICBlcnJvcixcbiAgaXNPdXRzaWRlUmVtaXhBcHBcbn0pIHtcbiAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gIGxldCBoZXlEZXZlbG9wZXIgPSAvKiBAX19QVVJFX18gKi8gUmVhY3Q5LmNyZWF0ZUVsZW1lbnQoXG4gICAgXCJzY3JpcHRcIixcbiAgICB7XG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgICBfX2h0bWw6IGBcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgXCJcXHV7MUY0QkZ9IEhleSBkZXZlbG9wZXIgXFx1ezFGNDRCfS4gWW91IGNhbiBwcm92aWRlIGEgd2F5IGJldHRlciBVWCB0aGFuIHRoaXMgd2hlbiB5b3VyIGFwcCB0aHJvd3MgZXJyb3JzLiBDaGVjayBvdXQgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG93LXRvL2Vycm9yLWJvdW5kYXJ5IGZvciBtb3JlIGluZm9ybWF0aW9uLlwiXG4gICAgICAgICk7XG4gICAgICBgXG4gICAgICB9XG4gICAgfVxuICApO1xuICBpZiAoaXNSb3V0ZUVycm9yUmVzcG9uc2UoZXJyb3IpKSB7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDkuY3JlYXRlRWxlbWVudChCb3VuZGFyeVNoZWxsLCB7IHRpdGxlOiBcIlVuaGFuZGxlZCBUaHJvd24gUmVzcG9uc2UhXCIgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFwiaDFcIiwgeyBzdHlsZTogeyBmb250U2l6ZTogXCIyNHB4XCIgfSB9LCBlcnJvci5zdGF0dXMsIFwiIFwiLCBlcnJvci5zdGF0dXNUZXh0KSwgRU5BQkxFX0RFVl9XQVJOSU5HUyA/IGhleURldmVsb3BlciA6IG51bGwpO1xuICB9XG4gIGxldCBlcnJvckluc3RhbmNlO1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGVycm9ySW5zdGFuY2UgPSBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICBsZXQgZXJyb3JTdHJpbmcgPSBlcnJvciA9PSBudWxsID8gXCJVbmtub3duIEVycm9yXCIgOiB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiYgXCJ0b1N0cmluZ1wiIGluIGVycm9yID8gZXJyb3IudG9TdHJpbmc
25114oKSA6IEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgICBlcnJvckluc3RhbmNlID0gbmV3IEVycm9yKGVycm9yU3RyaW5nKTtcbiAgfVxuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFxuICAgIEJvdW5kYXJ5U2hlbGwsXG4gICAge1xuICAgICAgdGl0bGU6IFwiQXBwbGljYXRpb24gRXJyb3IhXCIsXG4gICAgICBpc091dHNpZGVSZW1peEFwcFxuICAgIH0sXG4gICAgLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFwiaDFcIiwgeyBzdHlsZTogeyBmb250U2l6ZTogXCIyNHB4XCIgfSB9LCBcIkFwcGxpY2F0aW9uIEVycm9yXCIpLFxuICAgIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDkuY3JlYXRlRWxlbWVudChcbiAgICAgIFwicHJlXCIsXG4gICAgICB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgcGFkZGluZzogXCIycmVtXCIsXG4gICAgICAgICAgYmFja2dyb3VuZDogXCJoc2xhKDEwLCA1MCUsIDUwJSwgMC4xKVwiLFxuICAgICAgICAgIGNvbG9yOiBcInJlZFwiLFxuICAgICAgICAgIG92ZXJmbG93OiBcImF1dG9cIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3JJbnN0YW5jZS5zdGFja1xuICAgICksXG4gICAgaGV5RGV2ZWxvcGVyXG4gICk7XG59XG5mdW5jdGlvbiBCb3VuZGFyeVNoZWxsKHtcbiAgdGl0bGUsXG4gIHJlbmRlclNjcmlwdHMsXG4gIGlzT3V0c2lkZVJlbWl4QXBwLFxuICBjaGlsZHJlblxufSkge1xuICBsZXQgeyByb3V0ZU1vZHVsZXMgfSA9IHVzZUZyYW1ld29ya0NvbnRleHQoKTtcbiAgaWYgKHJvdXRlTW9kdWxlcy5yb290Py5MYXlvdXQgJiYgIWlzT3V0c2lkZVJlbWl4QXBwKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3Q5LmNyZWF0ZUVsZW1lbnQoXCJodG1sXCIsIHsgbGFuZzogXCJlblwiIH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDkuY3JlYXRlRWxlbWVudChcImhlYWRcIiwgbnVsbCwgLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFwibWV0YVwiLCB7IGNoYXJTZXQ6IFwidXRmLThcIiB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFxuICAgIFwibWV0YVwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwidmlld3BvcnRcIixcbiAgICAgIGNvbnRlbnQ6IFwid2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSx2aWV3cG9ydC1maXQ9Y292ZXJcIlxuICAgIH1cbiAgKSwgLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwgbnVsbCwgdGl0bGUpKSwgLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFwiYm9keVwiLCBudWxsLCAvKiBAX19QVVJFX18gKi8gUmVhY3Q5LmNyZWF0ZUVsZW1lbnQoXCJtYWluXCIsIHsgc3R5bGU6IHsgZm9udEZhbWlseTogXCJzeXN0ZW0tdWksIHNhbnMtc2VyaWZcIiwgcGFkZGluZzogXCIycmVtXCIgfSB9LCBjaGlsZHJlbiwgcmVuZGVyU2NyaXB0cyA/IC8qIEBfX1BVUkVfXyAqLyBSZWFjdDkuY3JlYXRlRWxlbWVudChTY3JpcHRzLCBudWxsKSA6IG51bGwpKSk7XG59XG5cbi8vIGxpYi9kb20vbGliLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QxMCBmcm9tIFwicmVhY3RcIjtcbnZhciBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiO1xudHJ5IHtcbiAgaWYgKGlzQnJvd3Nlcikge1xuICAgIHdpbmRvdy5fX3JlYWN0Um91dGVyVmVyc2lvbiA9IC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBcIjcuOS4zXCI7XG4gIH1cbn0gY2F0Y2ggKGUpIHtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUJyb3dzZXJSb3V0ZXIocm91dGVzLCBvcHRzKSB7XG4gIHJldHVybiBjcmVhdGVSb3V0ZXIoe1xuICAgIGJhc2VuYW1lOiBvcHRzPy5iYXNlbmFtZSxcbiAgICBnZXRDb250ZXh0OiBvcHRzPy5nZXRDb250ZXh0LFxuICAgIGZ1dHVyZTogb3B0cz8uZnV0dXJlLFxuICAgIGhpc3Rvcnk6IGNyZWF0ZUJyb3dzZXJIaXN0b3J5KHsgd2luZG93OiBvcHRzPy53aW5kb3cgfSksXG4gICAgaHlkcmF0aW9uRGF0YTogb3B0cz8uaHlkcmF0aW9uRGF0YSB8fCBwYXJzZUh5ZHJhdGlvbkRhdGEoKSxcbiAgICByb3V0ZXMsXG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzLFxuICAgIGh5ZHJhdGlvblJvdXRlUHJvcGVydGllcyxcbiAgICBkYXRhU3RyYXRlZ3k6IG9wdHM/LmRhdGFTdHJhdGVneSxcbiAgICBwYXRjaFJvdXRlc09uTmF2aWdhdGlvbjogb3B0cz8ucGF0Y2hSb3V0ZXNPbk5hdmlnYXRpb24sXG4gICAgd2luZG93OiBvcHRzPy53aW5kb3dcbiAgfSkuaW5pdGlhbGl6ZSgpO1xufVxuZnVuY3Rpb24gY3JlYXRlSGFzaFJvdXRlcihyb3V0ZXMsIG9wdHMpIHtcbiAgcmV0dXJuIGNyZWF0ZVJvdXRlcih7XG4gICAgYmFzZW5hbWU6IG9wdHM/LmJhc2VuYW1lLFxuICAgIGdldENvbnRleHQ6IG9wdHM/LmdldENvbnRleHQsXG4gICAgZnV0dXJlOiBvcHRzPy5mdXR1cmUsXG4gICAgaGlzdG9yeTogY3JlYXRlSGFzaEhpc3RvcnkoeyB3aW5kb3c6IG9wdHM/LndpbmRvdyB9KSxcbiAgICBoeWRyYXRpb25EYXRhOiBvcHRzPy5oeWRyYXRpb25EYXRhIHx8IHBhcnNlSHlkcmF0aW9uRGF0YSgpLFxuICAgIHJvdXRlcyxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXMsXG4gICAgaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzLFxuICAgIGRhdGFTdHJhdGVneTogb3B0cz8uZGF0YVN0cmF0ZWd5LFxuICAgIHBhdGNoUm91dGVzT25OYXZpZ2F0aW9uOiBvcHRzPy5wYXRjaFJvdXRlc09uTmF2aWdhdGlvbixcbiAgICB3aW5kb3c6IG9wdHM/LndpbmRvd1xuICB9KS5pbml0aWFsaXplKCk7XG59XG5mdW5jdGlvbiBwYXJzZUh5ZHJhdGlvbkRhdGEoKSB7XG4gIGxldCBzdGF0ZSA9IHdpbmRvdz8uX19zdGF0aWNSb3V0ZXJIeWRyYXRpb25EYXRhO1xuICBpZiAoc3RhdGUgJiYgc3RhdGUuZXJyb3JzKSB7XG4gICAgc3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGVycm9yczogZGVzZXJpYWxpemVFcnJvcnMoc3RhdGUuZXJyb3JzKVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gZGVzZXJpYWxpemVFcnJvcnMoZXJyb3JzKSB7XG4gIGlmICghZXJyb3JzKSByZXR1cm4gbnVsbDtcbiAgbGV0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhlcnJvcnMpO1xuICBsZXQgc2VyaWFsaXplZCA9IHt9O1xuICBmb3IgKGxldCBba2V5LCB2YWxdIG9mIGVudHJpZXMpIHtcbiAgICBpZiAodmFsICYmIHZhbC5fX3R5cGUgPT09IFwiUm91dGVFcnJvclJlc3BvbnNlXCIpIHtcbiAgICAgIHNlcmlhbGl6ZWRba2V5XSA9IG5ldyBFcnJvclJlc3BvbnNlSW1wbChcbiAgICAgICAgdmFsLnN0YXR1cyxcbiAgICAgICAgdmFsLnN0YXR1c1RleHQsXG4gICAgICAgI
25114HZhbC5kYXRhLFxuICAgICAgICB2YWwuaW50ZXJuYWwgPT09IHRydWVcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh2YWwgJiYgdmFsLl9fdHlwZSA9PT0gXCJFcnJvclwiKSB7XG4gICAgICBpZiAodmFsLl9fc3ViVHlwZSkge1xuICAgICAgICBsZXQgRXJyb3JDb25zdHJ1Y3RvciA9IHdpbmRvd1t2YWwuX19zdWJUeXBlXTtcbiAgICAgICAgaWYgKHR5cGVvZiBFcnJvckNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yQ29uc3RydWN0b3IodmFsLm1lc3NhZ2UpO1xuICAgICAgICAgICAgZXJyb3Iuc3RhY2sgPSBcIlwiO1xuICAgICAgICAgICAgc2VyaWFsaXplZFtrZXldID0gZXJyb3I7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNlcmlhbGl6ZWRba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcih2YWwubWVzc2FnZSk7XG4gICAgICAgIGVycm9yLnN0YWNrID0gXCJcIjtcbiAgICAgICAgc2VyaWFsaXplZFtrZXldID0gZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlcmlhbGl6ZWRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59XG5mdW5jdGlvbiBCcm93c2VyUm91dGVyKHtcbiAgYmFzZW5hbWUsXG4gIGNoaWxkcmVuLFxuICB3aW5kb3c6IHdpbmRvdzJcbn0pIHtcbiAgbGV0IGhpc3RvcnlSZWYgPSBSZWFjdDEwLnVzZVJlZigpO1xuICBpZiAoaGlzdG9yeVJlZi5jdXJyZW50ID09IG51bGwpIHtcbiAgICBoaXN0b3J5UmVmLmN1cnJlbnQgPSBjcmVhdGVCcm93c2VySGlzdG9yeSh7IHdpbmRvdzogd2luZG93MiwgdjVDb21wYXQ6IHRydWUgfSk7XG4gIH1cbiAgbGV0IGhpc3RvcnkgPSBoaXN0b3J5UmVmLmN1cnJlbnQ7XG4gIGxldCBbc3RhdGUsIHNldFN0YXRlSW1wbF0gPSBSZWFjdDEwLnVzZVN0YXRlKHtcbiAgICBhY3Rpb246IGhpc3RvcnkuYWN0aW9uLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uXG4gIH0pO1xuICBsZXQgc2V0U3RhdGUgPSBSZWFjdDEwLnVzZUNhbGxiYWNrKFxuICAgIChuZXdTdGF0ZSkgPT4ge1xuICAgICAgUmVhY3QxMC5zdGFydFRyYW5zaXRpb24oKCkgPT4gc2V0U3RhdGVJbXBsKG5ld1N0YXRlKSk7XG4gICAgfSxcbiAgICBbc2V0U3RhdGVJbXBsXVxuICApO1xuICBSZWFjdDEwLnVzZUxheW91dEVmZmVjdCgoKSA9PiBoaXN0b3J5Lmxpc3RlbihzZXRTdGF0ZSksIFtoaXN0b3J5LCBzZXRTdGF0ZV0pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0MTAuY3JlYXRlRWxlbWVudChcbiAgICBSb3V0ZXIsXG4gICAge1xuICAgICAgYmFzZW5hbWUsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGxvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICAgIG5hdmlnYXRpb25UeXBlOiBzdGF0ZS5hY3Rpb24sXG4gICAgICBuYXZpZ2F0b3I6IGhpc3RvcnlcbiAgICB9XG4gICk7XG59XG5mdW5jdGlvbiBIYXNoUm91dGVyKHsgYmFzZW5hbWUsIGNoaWxkcmVuLCB3aW5kb3c6IHdpbmRvdzIgfSkge1xuICBsZXQgaGlzdG9yeVJlZiA9IFJlYWN0MTAudXNlUmVmKCk7XG4gIGlmIChoaXN0b3J5UmVmLmN1cnJlbnQgPT0gbnVsbCkge1xuICAgIGhpc3RvcnlSZWYuY3VycmVudCA9IGNyZWF0ZUhhc2hIaXN0b3J5KHsgd2luZG93OiB3aW5kb3cyLCB2NUNvbXBhdDogdHJ1ZSB9KTtcbiAgfVxuICBsZXQgaGlzdG9yeSA9IGhpc3RvcnlSZWYuY3VycmVudDtcbiAgbGV0IFtzdGF0ZSwgc2V0U3RhdGVJbXBsXSA9IFJlYWN0MTAudXNlU3RhdGUoe1xuICAgIGFjdGlvbjogaGlzdG9yeS5hY3Rpb24sXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb25cbiAgfSk7XG4gIGxldCBzZXRTdGF0ZSA9IFJlYWN0MTAudXNlQ2FsbGJhY2soXG4gICAgKG5ld1N0YXRlKSA9PiB7XG4gICAgICBSZWFjdDEwLnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpKTtcbiAgICB9LFxuICAgIFtzZXRTdGF0ZUltcGxdXG4gICk7XG4gIFJlYWN0MTAudXNlTGF5b3V0RWZmZWN0KCgpID0+IGhpc3RvcnkubGlzdGVuKHNldFN0YXRlKSwgW2hpc3RvcnksIHNldFN0YXRlXSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QxMC5jcmVhdGVFbGVtZW50KFxuICAgIFJvdXRlcixcbiAgICB7XG4gICAgICBiYXNlbmFtZSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgbmF2aWdhdGlvblR5cGU6IHN0YXRlLmFjdGlvbixcbiAgICAgIG5hdmlnYXRvcjogaGlzdG9yeVxuICAgIH1cbiAgKTtcbn1cbmZ1bmN0aW9uIEhpc3RvcnlSb3V0ZXIoe1xuICBiYXNlbmFtZSxcbiAgY2hpbGRyZW4sXG4gIGhpc3Rvcnlcbn0pIHtcbiAgbGV0IFtzdGF0ZSwgc2V0U3RhdGVJbXBsXSA9IFJlYWN0MTAudXNlU3RhdGUoe1xuICAgIGFjdGlvbjogaGlzdG9yeS5hY3Rpb24sXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb25cbiAgfSk7XG4gIGxldCBzZXRTdGF0ZSA9IFJlYWN0MTAudXNlQ2FsbGJhY2soXG4gICAgKG5ld1N0YXRlKSA9PiB7XG4gICAgICBSZWFjdDEwLnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpKTtcbiAgICB9LFxuICAgIFtzZXRTdGF0ZUltcGxdXG4gICk7XG4gIFJlYWN0MTAudXNlTGF5b3V0RWZmZWN0KCgpID0+IGhpc3RvcnkubGlzdGVuKHNldFN0YXRlKSwgW2hpc3RvcnksIHNldFN0YXRlXSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QxMC5jcmVhdGVFbGVtZW50KFxuICAgIFJvdXRlcixcbiAgICB7XG4gICAgICBiYXNlbmFtZSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgbmF2aWdhdGlvblR5cGU6IHN0YXRlLmFjdGlvbixcbiAgICAgIG5hdmlnYXRvcjogaGlzdG9yeVxuICAgIH1cbiAgKTtcbn1cbkhpc3RvcnlSb3V0ZXIuZGlzcGxheU5hbWUgPSBcInVuc3RhYmxlX0hpc3RvcnlSb3V0ZXJcIjtcbnZhciBBQlNPTFVURV9VUkxfUkVHRVgyID0gL14oPzpbYS16XVthLXowLTkrLi1dKjp8XFwvXFwvKS9pO1xudmFyIExpbmsgPSBSZWFjdDEwLmZvcndhcmRSZWYoXG4gIGZ1bmN0aW9uIExpbmtXaXRoUmVmKHtcbiAgICBvbkNsaWNrLFxuICAgIGRpc2NvdmVyID0gXCJyZW5kZXJcIixcbiAgICBwcmVmZXRjaCA9IFwibm9uZVwiLFxuICAgIHJlbGF0aXZlLFxuICAgIHJlbG9hZERvY3VtZW50LFxuICAgIHJlcGxhY2U6IHJlcGxhY2UyLFxuICAgIHN0YXRlLFxuICAgIHRhcmdldCxcbiAgICB0byxcbiAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgdmlld1RyYW5zaXRpb24sXG4gICAgLi4ucmVzdFxuICB9LCBmb3J3YXJkZWRSZWYpIHtcbiAgICBsZXQgeyBiYXNlbmFtZSB9ID0gUmVhY3QxMC51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgICBsZXQgaXNBYnNvbHV0ZSA9IHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiAmJiBBQlNPTFVURV9VUkxfUkVHRVgyLnRlc3QodG8pO1xuICAgIGxldCBhYnNvbHV0ZUhyZWY7XG4gICAgbGV0IGlzRXh0ZXJuYWwgPSBmYWxzZTtcbiAgICBpZiAodHlwZW9mIHRvID09PSBcInN0cmluZ1wiICYmIGlzQWJzb2x1dGUpIHtcbiAgICAgIGFic29sdXRlSHJlZiA9IHRvO1xuICAgICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCBjdXJyZW50VXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgICAgbGV0IHRhcmdldFVybCA9IHRvLnN0YXJ0c1dpdGgoXCIvL1wiKSA/IG5ldyBVUkwoY3VycmVudFVybC5wcm90b2NvbCArIHRvKSA6IG5ldyBVUkwodG8pO1xuICAgICAgICAgIGxldCBwYXRoID0gc3RyaXBCYXNlbmFtZSh0YXJnZXRVcmwucGF0aG5hbWUsIGJhc2VuYW1lKTtcbiAgICAgICAgICBpZiAodGFyZ2V0VXJsLm9yaWdpbiA9PT0gY3VycmVudFVybC5vcmlnaW4gJiYgcGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0byA9IHBhdGggKyB0YXJnZXRVcmwuc2VhcmNoICsgdGFyZ2V0VXJsLmhhc2g7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlzRXh0ZXJuYWwgPSB0cnVlO1xuICAgICAgICAgI
25114H1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIGA8TGluayB0bz1cIiR7dG99XCI+IGNvbnRhaW5zIGFuIGludmFsaWQgVVJMIHdoaWNoIHdpbGwgcHJvYmFibHkgYnJlYWsgd2hlbiBjbGlja2VkIC0gcGxlYXNlIHVwZGF0ZSB0byBhIHZhbGlkIFVSTCBwYXRoLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBocmVmID0gdXNlSHJlZih0bywgeyByZWxhdGl2ZSB9KTtcbiAgICBsZXQgW3Nob3VsZFByZWZldGNoLCBwcmVmZXRjaFJlZiwgcHJlZmV0Y2hIYW5kbGVyc10gPSB1c2VQcmVmZXRjaEJlaGF2aW9yKFxuICAgICAgcHJlZmV0Y2gsXG4gICAgICByZXN0XG4gICAgKTtcbiAgICBsZXQgaW50ZXJuYWxPbkNsaWNrID0gdXNlTGlua0NsaWNrSGFuZGxlcih0bywge1xuICAgICAgcmVwbGFjZTogcmVwbGFjZTIsXG4gICAgICBzdGF0ZSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgICAgIHJlbGF0aXZlLFxuICAgICAgdmlld1RyYW5zaXRpb25cbiAgICB9KTtcbiAgICBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgICAgaWYgKG9uQ2xpY2spIG9uQ2xpY2soZXZlbnQpO1xuICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIGludGVybmFsT25DbGljayhldmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBsaW5rID0gKFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzeC1hMTF5L2FuY2hvci1oYXMtY29udGVudFxuICAgICAgLyogQF9fUFVSRV9fICovIFJlYWN0MTAuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJhXCIsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5yZXN0LFxuICAgICAgICAgIC4uLnByZWZldGNoSGFuZGxlcnMsXG4gICAgICAgICAgaHJlZjogYWJzb2x1dGVIcmVmIHx8IGhyZWYsXG4gICAgICAgICAgb25DbGljazogaXNFeHRlcm5hbCB8fCByZWxvYWREb2N1bWVudCA/IG9uQ2xpY2sgOiBoYW5kbGVDbGljayxcbiAgICAgICAgICByZWY6IG1lcmdlUmVmcyhmb3J3YXJkZWRSZWYsIHByZWZldGNoUmVmKSxcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgXCJkYXRhLWRpc2NvdmVyXCI6ICFpc0Fic29sdXRlICYmIGRpc2NvdmVyID09PSBcInJlbmRlclwiID8gXCJ0cnVlXCIgOiB2b2lkIDBcbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHNob3VsZFByZWZldGNoICYmICFpc0Fic29sdXRlID8gLyogQF9fUFVSRV9fICovIFJlYWN0MTAuY3JlYXRlRWxlbWVudChSZWFjdDEwLkZyYWdtZW50LCBudWxsLCBsaW5rLCAvKiBAX19QVVJFX18gKi8gUmVhY3QxMC5jcmVhdGVFbGVtZW50KFByZWZldGNoUGFnZUxpbmtzLCB7IHBhZ2U6IGhyZWYgfSkpIDogbGluaztcbiAgfVxuKTtcbkxpbmsuZGlzcGxheU5hbWUgPSBcIkxpbmtcIjtcbnZhciBOYXZMaW5rID0gUmVhY3QxMC5mb3J3YXJkUmVmKFxuICBmdW5jdGlvbiBOYXZMaW5rV2l0aFJlZih7XG4gICAgXCJhcmlhLWN1cnJlbnRcIjogYXJpYUN1cnJlbnRQcm9wID0gXCJwYWdlXCIsXG4gICAgY2FzZVNlbnNpdGl2ZSA9IGZhbHNlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lUHJvcCA9IFwiXCIsXG4gICAgZW5kID0gZmFsc2UsXG4gICAgc3R5bGU6IHN0eWxlUHJvcCxcbiAgICB0byxcbiAgICB2aWV3VHJhbnNpdGlvbixcbiAgICBjaGlsZHJlbixcbiAgICAuLi5yZXN0XG4gIH0sIHJlZikge1xuICAgIGxldCBwYXRoID0gdXNlUmVzb2x2ZWRQYXRoKHRvLCB7IHJlbGF0aXZlOiByZXN0LnJlbGF0aXZlIH0pO1xuICAgIGxldCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gICAgbGV0IHJvdXRlclN0YXRlID0gUmVhY3QxMC51c2VDb250ZXh0KERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQpO1xuICAgIGxldCB7IG5hdmlnYXRvciwgYmFzZW5hbWUgfSA9IFJlYWN0MTAudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCk7XG4gICAgbGV0IGlzVHJhbnNpdGlvbmluZyA9IHJvdXRlclN0YXRlICE9IG51bGwgJiYgLy8gQ29uZGl0aW9uYWwgdXNhZ2UgaXMgT0sgaGVyZSBiZWNhdXNlIHRoZSB1c2FnZSBvZiBhIGRhdGEgcm91dGVyIGlzIHN0YXRpY1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuICAgIHVzZVZpZXdUcmFuc2l0aW9uU3RhdGUocGF0aCkgJiYgdmlld1RyYW5zaXRpb24gPT09IHRydWU7XG4gICAgbGV0IHRvUGF0aG5hbWUgPSBuYXZpZ2F0b3IuZW5jb2RlTG9jYXRpb24gPyBuYXZpZ2F0b3IuZW5jb2RlTG9jYXRpb24ocGF0aCkucGF0aG5hbWUgOiBwYXRoLnBhdGhuYW1lO1xuICAgIGxldCBsb2NhdGlvblBhdGhuYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgbGV0IG5leHRMb2NhdGlvblBhdGhuYW1lID0gcm91dGVyU3RhdGUgJiYgcm91dGVyU3RhdGUubmF2aWdhdGlvbiAmJiByb3V0ZXJTdGF0ZS5uYXZpZ2F0aW9uLmxvY2F0aW9uID8gcm91dGVyU3RhdGUubmF2aWdhdGlvbi5sb2NhdGlvbi5wYXRobmFtZSA6IG51bGw7XG4gICAgaWYgKCFjYXNlU2Vuc2l0aXZlKSB7XG4gICAgICBsb2NhdGlvblBhdGhuYW1lID0gbG9jYXRpb25QYXRobmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgbmV4dExvY2F0aW9uUGF0aG5hbWUgPSBuZXh0TG9jYXRpb25QYXRobmFtZSA/IG5leHRMb2NhdGlvblBhdGhuYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgdG9QYXRobmFtZSA9IHRvUGF0aG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgaWYgKG5leHRMb2NhdGlvblBhdGhuYW1lICYmIGJhc2VuYW1lKSB7XG4gICAgICBuZXh0TG9jYXRpb25QYXRobmFtZSA9IHN0cmlwQmFzZW5hbWUobmV4dExvY2F0aW9uUGF0aG5hbWUsIGJhc2VuYW1lKSB8fCBuZXh0TG9jYXRpb25QYXRobmFtZTtcbiAgICB9XG4gICAgY29uc3QgZW5kU2xhc2hQb3NpdGlvbiA9IHRvUGF0aG5hbWUgIT09IFwiL1wiICYmIHRvUGF0aG5hbWUuZW5kc1dpdGgoXCIvXCIpID8gdG9QYXRobmFtZS5sZW5ndGggLSAxIDogdG9QYXRobmFtZS5sZW5ndGg7XG4gICAgbGV0IGlzQWN0aXZlID0gbG9jYXRpb25QYXRobmFtZSA9PT0gdG9QYXRobmFtZSB8fCAhZW5kICYmIGxvY2F0aW9uUGF0aG5hbWUuc3RhcnRzV2l0aCh0b1BhdGhuYW1lKSAmJiBsb2NhdGlvblBhdGhuYW1lLmNoYXJBdChlbmRTbGFzaFBvc2l0aW9uKSA9PT0gXCIvXCI7XG4gICAgbGV0IGlzUGVuZGluZyA9IG5leHRMb2NhdGlvblBhdGhuYW1lICE9IG51bGwgJiYgKG5leHR
25114Mb2NhdGlvblBhdGhuYW1lID09PSB0b1BhdGhuYW1lIHx8ICFlbmQgJiYgbmV4dExvY2F0aW9uUGF0aG5hbWUuc3RhcnRzV2l0aCh0b1BhdGhuYW1lKSAmJiBuZXh0TG9jYXRpb25QYXRobmFtZS5jaGFyQXQodG9QYXRobmFtZS5sZW5ndGgpID09PSBcIi9cIik7XG4gICAgbGV0IHJlbmRlclByb3BzID0ge1xuICAgICAgaXNBY3RpdmUsXG4gICAgICBpc1BlbmRpbmcsXG4gICAgICBpc1RyYW5zaXRpb25pbmdcbiAgICB9O1xuICAgIGxldCBhcmlhQ3VycmVudCA9IGlzQWN0aXZlID8gYXJpYUN1cnJlbnRQcm9wIDogdm9pZCAwO1xuICAgIGxldCBjbGFzc05hbWU7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWVQcm9wID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZVByb3AocmVuZGVyUHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGFzc05hbWUgPSBbXG4gICAgICAgIGNsYXNzTmFtZVByb3AsXG4gICAgICAgIGlzQWN0aXZlID8gXCJhY3RpdmVcIiA6IG51bGwsXG4gICAgICAgIGlzUGVuZGluZyA/IFwicGVuZGluZ1wiIDogbnVsbCxcbiAgICAgICAgaXNUcmFuc2l0aW9uaW5nID8gXCJ0cmFuc2l0aW9uaW5nXCIgOiBudWxsXG4gICAgICBdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgbGV0IHN0eWxlID0gdHlwZW9mIHN0eWxlUHJvcCA9PT0gXCJmdW5jdGlvblwiID8gc3R5bGVQcm9wKHJlbmRlclByb3BzKSA6IHN0eWxlUHJvcDtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0MTAuY3JlYXRlRWxlbWVudChcbiAgICAgIExpbmssXG4gICAgICB7XG4gICAgICAgIC4uLnJlc3QsXG4gICAgICAgIFwiYXJpYS1jdXJyZW50XCI6IGFyaWFDdXJyZW50LFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHJlZixcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIHRvLFxuICAgICAgICB2aWV3VHJhbnNpdGlvblxuICAgICAgfSxcbiAgICAgIHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiID8gY2hpbGRyZW4ocmVuZGVyUHJvcHMpIDogY2hpbGRyZW5cbiAgICApO1xuICB9XG4pO1xuTmF2TGluay5kaXNwbGF5TmFtZSA9IFwiTmF2TGlua1wiO1xudmFyIEZvcm0gPSBSZWFjdDEwLmZvcndhcmRSZWYoXG4gICh7XG4gICAgZGlzY292ZXIgPSBcInJlbmRlclwiLFxuICAgIGZldGNoZXJLZXksXG4gICAgbmF2aWdhdGUsXG4gICAgcmVsb2FkRG9jdW1lbnQsXG4gICAgcmVwbGFjZTogcmVwbGFjZTIsXG4gICAgc3RhdGUsXG4gICAgbWV0aG9kID0gZGVmYXVsdE1ldGhvZCxcbiAgICBhY3Rpb24sXG4gICAgb25TdWJtaXQsXG4gICAgcmVsYXRpdmUsXG4gICAgcHJldmVudFNjcm9sbFJlc2V0LFxuICAgIHZpZXdUcmFuc2l0aW9uLFxuICAgIC4uLnByb3BzXG4gIH0sIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGxldCBzdWJtaXQgPSB1c2VTdWJtaXQoKTtcbiAgICBsZXQgZm9ybUFjdGlvbiA9IHVzZUZvcm1BY3Rpb24oYWN0aW9uLCB7IHJlbGF0aXZlIH0pO1xuICAgIGxldCBmb3JtTWV0aG9kID0gbWV0aG9kLnRvTG93ZXJDYXNlKCkgPT09IFwiZ2V0XCIgPyBcImdldFwiIDogXCJwb3N0XCI7XG4gICAgbGV0IGlzQWJzb2x1dGUgPSB0eXBlb2YgYWN0aW9uID09PSBcInN0cmluZ1wiICYmIEFCU09MVVRFX1VSTF9SRUdFWDIudGVzdChhY3Rpb24pO1xuICAgIGxldCBzdWJtaXRIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgICBvblN1Ym1pdCAmJiBvblN1Ym1pdChldmVudCk7XG4gICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGxldCBzdWJtaXR0ZXIgPSBldmVudC5uYXRpdmVFdmVudC5zdWJtaXR0ZXI7XG4gICAgICBsZXQgc3VibWl0TWV0aG9kID0gc3VibWl0dGVyPy5nZXRBdHRyaWJ1dGUoXCJmb3JtbWV0aG9kXCIpIHx8IG1ldGhvZDtcbiAgICAgIHN1Ym1pdChzdWJtaXR0ZXIgfHwgZXZlbnQuY3VycmVudFRhcmdldCwge1xuICAgICAgICBmZXRjaGVyS2V5LFxuICAgICAgICBtZXRob2Q6IHN1Ym1pdE1ldGhvZCxcbiAgICAgICAgbmF2aWdhdGUsXG4gICAgICAgIHJlcGxhY2U6IHJlcGxhY2UyLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcmVsYXRpdmUsXG4gICAgICAgIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgICAgICAgdmlld1RyYW5zaXRpb25cbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDEwLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBcImZvcm1cIixcbiAgICAgIHtcbiAgICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICAgIG1ldGhvZDogZm9ybU1ldGhvZCxcbiAgICAgICAgYWN0aW9uOiBmb3JtQWN0aW9uLFxuICAgICAgICBvblN1Ym1pdDogcmVsb2FkRG9jdW1lbnQgPyBvblN1Ym1pdCA6IHN1Ym1pdEhhbmRsZXIsXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICBcImRhdGEtZGlzY292ZXJcIjogIWlzQWJzb2x1dGUgJiYgZGlzY292ZXIgPT09IFwicmVuZGVyXCIgPyBcInRydWVcIiA6IHZvaWQgMFxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5Gb3JtLmRpc3BsYXlOYW1lID0gXCJGb3JtXCI7XG5mdW5jdGlvbiBTY3JvbGxSZXN0b3JhdGlvbih7XG4gIGdldEtleSxcbiAgc3RvcmFnZUtleSxcbiAgLi4ucHJvcHNcbn0pIHtcbiAgbGV0IHJlbWl4Q29udGV4dCA9IFJlYWN0MTAudXNlQ29udGV4dChGcmFtZXdvcmtDb250ZXh0KTtcbiAgbGV0IHsgYmFzZW5hbWUgfSA9IFJlYWN0MTAudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBtYXRjaGVzID0gdXNlTWF0Y2hlcygpO1xuICB1c2VTY3JvbGxSZXN0b3JhdGlvbih7IGdldEtleSwgc3RvcmFnZUtleSB9KTtcbiAgbGV0IHNzcktleSA9IFJlYWN0MTAudXNlTWVtbyhcbiAgICAoKSA9PiB7XG4gICAgICBpZiAoIXJlbWl4Q29udGV4dCB8fCAhZ2V0S2V5KSByZXR1cm4gbnVsbDtcbiAgICAgIGxldCB1c2VyS2V5ID0gZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkoXG4gICAgICAgIGxvY2F0aW9uLFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBiYXNlbmFtZSxcbiAgICAgICAgZ2V0S2V5XG4gICAgICApO1xuICAgICAgcmV0dXJuIHVzZXJLZXkgIT09IGxvY2F0aW9uLmtleSA/IHVzZXJLZXkgOiBudWxsO1xuICAgIH0sXG4gICAgLy8gTmFoLCB3ZSBvbmx5IG5lZWQgdGhpcyB0aGUgZmlyc3QgdGltZSBmb3IgdGhlIFNTUiByZW5kZXJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgW11cbiAgKTtcbiAgaWYgKCFyZW1peENvbnRleHQgfHwgcmVtaXhDb250ZXh0LmlzU3BhTW9kZSkge1xuICAgIHJldHVybi
25114BudWxsO1xuICB9XG4gIGxldCByZXN0b3JlU2Nyb2xsID0gKChzdG9yYWdlS2V5MiwgcmVzdG9yZUtleSkgPT4ge1xuICAgIGlmICghd2luZG93Lmhpc3Rvcnkuc3RhdGUgfHwgIXdpbmRvdy5oaXN0b3J5LnN0YXRlLmtleSkge1xuICAgICAgbGV0IGtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzIpLnNsaWNlKDIpO1xuICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHsga2V5IH0sIFwiXCIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbGV0IHBvc2l0aW9ucyA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5MikgfHwgXCJ7fVwiKTtcbiAgICAgIGxldCBzdG9yZWRZID0gcG9zaXRpb25zW3Jlc3RvcmVLZXkgfHwgd2luZG93Lmhpc3Rvcnkuc3RhdGUua2V5XTtcbiAgICAgIGlmICh0eXBlb2Ygc3RvcmVkWSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgc3RvcmVkWSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5Mik7XG4gICAgfVxuICB9KS50b1N0cmluZygpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0MTAuY3JlYXRlRWxlbWVudChcbiAgICBcInNjcmlwdFwiLFxuICAgIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nOiB0cnVlLFxuICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtcbiAgICAgICAgX19odG1sOiBgKCR7cmVzdG9yZVNjcm9sbH0pKCR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgc3RvcmFnZUtleSB8fCBTQ1JPTExfUkVTVE9SQVRJT05fU1RPUkFHRV9LRVlcbiAgICAgICAgKX0sICR7SlNPTi5zdHJpbmdpZnkoc3NyS2V5KX0pYFxuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblNjcm9sbFJlc3RvcmF0aW9uLmRpc3BsYXlOYW1lID0gXCJTY3JvbGxSZXN0b3JhdGlvblwiO1xuZnVuY3Rpb24gZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcjIoaG9va05hbWUpIHtcbiAgcmV0dXJuIGAke2hvb2tOYW1lfSBtdXN0IGJlIHVzZWQgd2l0aGluIGEgZGF0YSByb3V0ZXIuICBTZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vZW4vbWFpbi9yb3V0ZXJzL3BpY2tpbmctYS1yb3V0ZXIuYDtcbn1cbmZ1bmN0aW9uIHVzZURhdGFSb3V0ZXJDb250ZXh0Myhob29rTmFtZSkge1xuICBsZXQgY3R4ID0gUmVhY3QxMC51c2VDb250ZXh0KERhdGFSb3V0ZXJDb250ZXh0KTtcbiAgaW52YXJpYW50KGN0eCwgZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcjIoaG9va05hbWUpKTtcbiAgcmV0dXJuIGN0eDtcbn1cbmZ1bmN0aW9uIHVzZURhdGFSb3V0ZXJTdGF0ZTIoaG9va05hbWUpIHtcbiAgbGV0IHN0YXRlID0gUmVhY3QxMC51c2VDb250ZXh0KERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQpO1xuICBpbnZhcmlhbnQoc3RhdGUsIGdldERhdGFSb3V0ZXJDb25zb2xlRXJyb3IyKGhvb2tOYW1lKSk7XG4gIHJldHVybiBzdGF0ZTtcbn1cbmZ1bmN0aW9uIHVzZUxpbmtDbGlja0hhbmRsZXIodG8sIHtcbiAgdGFyZ2V0LFxuICByZXBsYWNlOiByZXBsYWNlUHJvcCxcbiAgc3RhdGUsXG4gIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgcmVsYXRpdmUsXG4gIHZpZXdUcmFuc2l0aW9uXG59ID0ge30pIHtcbiAgbGV0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcbiAgbGV0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgbGV0IHBhdGggPSB1c2VSZXNvbHZlZFBhdGgodG8sIHsgcmVsYXRpdmUgfSk7XG4gIHJldHVybiBSZWFjdDEwLnVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgaWYgKHNob3VsZFByb2Nlc3NMaW5rQ2xpY2soZXZlbnQsIHRhcmdldCkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IHJlcGxhY2UyID0gcmVwbGFjZVByb3AgIT09IHZvaWQgMCA/IHJlcGxhY2VQcm9wIDogY3JlYXRlUGF0aChsb2NhdGlvbikgPT09IGNyZWF0ZVBhdGgocGF0aCk7XG4gICAgICAgIG5hdmlnYXRlKHRvLCB7XG4gICAgICAgICAgcmVwbGFjZTogcmVwbGFjZTIsXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgICAgIHJlbGF0aXZlLFxuICAgICAgICAgIHZpZXdUcmFuc2l0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgbG9jYXRpb24sXG4gICAgICBuYXZpZ2F0ZSxcbiAgICAgIHBhdGgsXG4gICAgICByZXBsYWNlUHJvcCxcbiAgICAgIHN0YXRlLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdG8sXG4gICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICByZWxhdGl2ZSxcbiAgICAgIHZpZXdUcmFuc2l0aW9uXG4gICAgXVxuICApO1xufVxuZnVuY3Rpb24gdXNlU2VhcmNoUGFyYW1zKGRlZmF1bHRJbml0KSB7XG4gIHdhcm5pbmcoXG4gICAgdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gXCJ1bmRlZmluZWRcIixcbiAgICBgWW91IGNhbm5vdCB1c2UgdGhlIFxcYHVzZVNlYXJjaFBhcmFtc1xcYCBob29rIGluIGEgYnJvd3NlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIFVSTFNlYXJjaFBhcmFtcyBBUEkuIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgSW50ZXJuZXQgRXhwbG9yZXIgMTEsIHdlIHJlY29tbWVuZCB5b3UgbG9hZCBhIHBvbHlmaWxsIHN1Y2ggYXMgaHR0cHM6Ly9naXRodWIuY29tL3VuZ2FwL3VybC1zZWFyY2gtcGFyYW1zLmBcbiAgKTtcbiAgbGV0IGRlZmF1bHRTZWFyY2hQYXJhbXNSZWYgPSBSZWFjdDEwLnVzZVJlZihjcmVhdGVTZWFyY2hQYXJhbXMoZGVmYXVsdEluaXQpKTtcbiAgbGV0IGhhc1NldFNlYXJjaFBhcmFtc1JlZiA9IFJlYWN0MTAudXNlUmVmKGZhbHNlKTtcbiAgbGV0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgbGV0IHNlYXJjaFBhcmFtcyA9IFJlYWN0MTAudXNlTWVtbyhcbiAgICAoKSA9PiAoXG4gICAgICAvLyBPbmx5IG1lcmdlIGluIHRoZSBkZWZhdWx0cyBpZiB3ZSBoYXZlbid0IHlldCBjYWxsZWQgc2V0U2VhcmNoUGFyYW1zLlxuICAgICAgLy8gT25jZSB3ZSBjYWxsIHRoYXQgd2Ugd2FudCB0aG9zZSB0byB0YWtlIHByZWNlZGVuY2UsIG90aGVyd2lzZSB5b3UgY2FuJ3RcbiAgICAgIC8vIHJlbW92ZSBhIHBhcmFtIHdpdGggc2V0U2VhcmNoUGFyYW1zKHt9KSBpZiBpdCBoYXMgYW4gaW5pdGlhbCB2YWx1ZVxuICAgICAgZ2V0U2VhcmNoUGFyYW1zRm9yTG9jYXRpb24oXG4gICAgICAgIGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgICAgaGFzU2V0U2VhcmNoUGFyYW1zUmVmLmN1cnJlbnQgPyBudWxsIDogZGVmYXVsdFNlYXJjaFBhcmFtc1JlZi5jdXJyZW50XG4gICAgICApXG4gICAgKSxcbiAgICBbbG9jYXRpb24uc2VhcmNoXVxuICApO1xuICBsZXQgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuICBsZXQgc2V0U2VhcmNoUGFyYW1zID0gUmVhY3QxMC51c2VDYWxsYmFjayhcbiAgICAobmV4dEluaX
25114QsIG5hdmlnYXRlT3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgbmV3U2VhcmNoUGFyYW1zID0gY3JlYXRlU2VhcmNoUGFyYW1zKFxuICAgICAgICB0eXBlb2YgbmV4dEluaXQgPT09IFwiZnVuY3Rpb25cIiA/IG5leHRJbml0KG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoUGFyYW1zKSkgOiBuZXh0SW5pdFxuICAgICAgKTtcbiAgICAgIGhhc1NldFNlYXJjaFBhcmFtc1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIG5hdmlnYXRlKFwiP1wiICsgbmV3U2VhcmNoUGFyYW1zLCBuYXZpZ2F0ZU9wdGlvbnMpO1xuICAgIH0sXG4gICAgW25hdmlnYXRlLCBzZWFyY2hQYXJhbXNdXG4gICk7XG4gIHJldHVybiBbc2VhcmNoUGFyYW1zLCBzZXRTZWFyY2hQYXJhbXNdO1xufVxudmFyIGZldGNoZXJJZCA9IDA7XG52YXIgZ2V0VW5pcXVlRmV0Y2hlcklkID0gKCkgPT4gYF9fJHtTdHJpbmcoKytmZXRjaGVySWQpfV9fYDtcbmZ1bmN0aW9uIHVzZVN1Ym1pdCgpIHtcbiAgbGV0IHsgcm91dGVyIH0gPSB1c2VEYXRhUm91dGVyQ29udGV4dDMoXCJ1c2VTdWJtaXRcIiAvKiBVc2VTdWJtaXQgKi8pO1xuICBsZXQgeyBiYXNlbmFtZSB9ID0gUmVhY3QxMC51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgbGV0IGN1cnJlbnRSb3V0ZUlkID0gdXNlUm91dGVJZCgpO1xuICByZXR1cm4gUmVhY3QxMC51c2VDYWxsYmFjayhcbiAgICBhc3luYyAodGFyZ2V0LCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgIGxldCB7IGFjdGlvbiwgbWV0aG9kLCBlbmNUeXBlLCBmb3JtRGF0YSwgYm9keSB9ID0gZ2V0Rm9ybVN1Ym1pc3Npb25JbmZvKFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIGJhc2VuYW1lXG4gICAgICApO1xuICAgICAgaWYgKG9wdGlvbnMubmF2aWdhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGxldCBrZXkgPSBvcHRpb25zLmZldGNoZXJLZXkgfHwgZ2V0VW5pcXVlRmV0Y2hlcklkKCk7XG4gICAgICAgIGF3YWl0IHJvdXRlci5mZXRjaChrZXksIGN1cnJlbnRSb3V0ZUlkLCBvcHRpb25zLmFjdGlvbiB8fCBhY3Rpb24sIHtcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQ6IG9wdGlvbnMucHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgICAgIGZvcm1EYXRhLFxuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgZm9ybU1ldGhvZDogb3B0aW9ucy5tZXRob2QgfHwgbWV0aG9kLFxuICAgICAgICAgIGZvcm1FbmNUeXBlOiBvcHRpb25zLmVuY1R5cGUgfHwgZW5jVHlwZSxcbiAgICAgICAgICBmbHVzaFN5bmM6IG9wdGlvbnMuZmx1c2hTeW5jXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlKG9wdGlvbnMuYWN0aW9uIHx8IGFjdGlvbiwge1xuICAgICAgICAgIHByZXZlbnRTY3JvbGxSZXNldDogb3B0aW9ucy5wcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICAgICAgZm9ybURhdGEsXG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBmb3JtTWV0aG9kOiBvcHRpb25zLm1ldGhvZCB8fCBtZXRob2QsXG4gICAgICAgICAgZm9ybUVuY1R5cGU6IG9wdGlvbnMuZW5jVHlwZSB8fCBlbmNUeXBlLFxuICAgICAgICAgIHJlcGxhY2U6IG9wdGlvbnMucmVwbGFjZSxcbiAgICAgICAgICBzdGF0ZTogb3B0aW9ucy5zdGF0ZSxcbiAgICAgICAgICBmcm9tUm91dGVJZDogY3VycmVudFJvdXRlSWQsXG4gICAgICAgICAgZmx1c2hTeW5jOiBvcHRpb25zLmZsdXNoU3luYyxcbiAgICAgICAgICB2aWV3VHJhbnNpdGlvbjogb3B0aW9ucy52aWV3VHJhbnNpdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtyb3V0ZXIsIGJhc2VuYW1lLCBjdXJyZW50Um91dGVJZF1cbiAgKTtcbn1cbmZ1bmN0aW9uIHVzZUZvcm1BY3Rpb24oYWN0aW9uLCB7IHJlbGF0aXZlIH0gPSB7fSkge1xuICBsZXQgeyBiYXNlbmFtZSB9ID0gUmVhY3QxMC51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgbGV0IHJvdXRlQ29udGV4dCA9IFJlYWN0MTAudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBpbnZhcmlhbnQocm91dGVDb250ZXh0LCBcInVzZUZvcm1BY3Rpb24gbXVzdCBiZSB1c2VkIGluc2lkZSBhIFJvdXRlQ29udGV4dFwiKTtcbiAgbGV0IFttYXRjaF0gPSByb3V0ZUNvbnRleHQubWF0Y2hlcy5zbGljZSgtMSk7XG4gIGxldCBwYXRoID0geyAuLi51c2VSZXNvbHZlZFBhdGgoYWN0aW9uID8gYWN0aW9uIDogXCIuXCIsIHsgcmVsYXRpdmUgfSkgfTtcbiAgbGV0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgaWYgKGFjdGlvbiA9PSBudWxsKSB7XG4gICAgcGF0aC5zZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2g7XG4gICAgbGV0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGF0aC5zZWFyY2gpO1xuICAgIGxldCBpbmRleFZhbHVlcyA9IHBhcmFtcy5nZXRBbGwoXCJpbmRleFwiKTtcbiAgICBsZXQgaGFzTmFrZWRJbmRleFBhcmFtID0gaW5kZXhWYWx1ZXMuc29tZSgodikgPT4gdiA9PT0gXCJcIik7XG4gICAgaWYgKGhhc05ha2VkSW5kZXhQYXJhbSkge1xuICAgICAgcGFyYW1zLmRlbGV0ZShcImluZGV4XCIpO1xuICAgICAgaW5kZXhWYWx1ZXMuZmlsdGVyKCh2KSA9PiB2KS5mb3JFYWNoKCh2KSA9PiBwYXJhbXMuYXBwZW5kKFwiaW5kZXhcIiwgdikpO1xuICAgICAgbGV0IHFzID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgICBwYXRoLnNlYXJjaCA9IHFzID8gYD8ke3FzfWAgOiBcIlwiO1xuICAgIH1cbiAgfVxuICBpZiAoKCFhY3Rpb24gfHwgYWN0aW9uID09PSBcIi5cIikgJiYgbWF0Y2gucm91dGUuaW5kZXgpIHtcbiAgICBwYXRoLnNlYXJjaCA9IHBhdGguc2VhcmNoID8gcGF0aC5zZWFyY2gucmVwbGFjZSgvXlxcPy8sIFwiP2luZGV4JlwiKSA6IFwiP2luZGV4XCI7XG4gIH1cbiAgaWYgKGJhc2VuYW1lICE9PSBcIi9cIikge1xuICAgIHBhdGgucGF0aG5hbWUgPSBwYXRoLnBhdGhuYW1lID09PSBcIi9cIiA/IGJhc2VuYW1lIDogam9pblBhdGhzKFtiYXNlbmFtZSwgcGF0aC5wYXRobmFtZV0pO1xuICB9XG4gIHJldHVybiBjcmVhdGVQYXRoKHBhdGgpO1xufVxuZnVuY3Rpb24gdXNlRmV0Y2hlcih7XG4gIGtleVxufSA9IHt9KSB7XG4gIGxldCB7IHJvdXRlciB9ID0gdXNlRGF0YVJvdXRlckNvbnRleHQzKFwidXNlRmV0Y2hlclwiIC8qIFVzZUZldGNoZXIgKi8pO1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUyKFwidXNlRmV0Y2hlclwiIC8qIFVzZUZldGNoZXIgKi8pO1xuICBsZXQgZmV0Y2hlckRhdGEgPSBSZWFjdDEwLnVzZUNvbnRleHQoRmV0Y2hlcnNDb250ZXh0KTtcbiAgbGV0IHJvdXRlID0gUmVhY3QxMC51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gIGxldCByb3V0ZUlkID0gcm91dGUubWF0Y2hlc1tyb3V0ZS5tYXRjaGVzLmxlbmd0aCAtIDFdPy5yb3V0ZS5pZDtcbiAgaW52YXJpYW50KGZldGNoZXJEYXRhLCBgdXNlRmV0Y2hlciBtdXN0IGJlIHVzZWQgaW5zaWRlIGEgRmV0Y2hlcnNDb250ZXh0YCk7XG4gIGludmFyaWFudChyb3V0ZSwgYHVzZUZldGNoZXIgbXVzdCBiZSB1c2VkIGluc2lkZSBhIFJvdXRlQ29udGV4dGApO1xuICBpbnZhcmlhbnQoXG4gICAgcm91dGVJZCAhPSBudWxsLFxuICAgIGB1c2VGZXRjaGVyIGNhbiBvbmx5IGJlIHVzZWQgb24gcm91dGVzIHRoYXQgY29udGFpbiBhIHVuaXF1ZSBcImlkXCJgXG4gICk7XG4gIGxldCBkZWZhdWx0S2V5ID0gUmVhY3QxMC51c2VJZCgpO1xuICBsZXQgW2ZldGNoZXJLZXksIHNldEZldGNoZXJLZXldID0gUmVhY3QxMC51c2VTdGF0ZShrZXkgfHwgZGVmYXVsdEtleSk7XG4gIGlmIChrZXkgJiYga2V5ICE9PSBmZXRjaGVyS2V5KSB7XG4gICAgc2V0RmV0Y2hlcktleShrZXkpO1xuICB9XG4gIFJlYWN0MTAudXNlRWZmZWN0KCgpID0+IHtcbiAgICByb3V0ZXIuZ2V0RmV0Y2hlcihmZXRjaGVyS2V5KTtcbiAgICByZXR1cm4gKCkgPT4gcm91dGVyLmRlbGV0ZUZldGNoZXIoZmV0Y2hlcktleSk7XG4gIH0sIFtyb3V0ZXIsIGZldGNoZXJLZXldKTtcbiAgbGV0IGxvYWQgPSBSZWFjdDEwLnVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChocmVmLCBvcHRzKSA9PiB7XG4gICAgICBpbnZhcmlhbnQocm91dGVJZCwgXCJObyByb3V0ZUlkIGF2YWlsYWJsZSBmb3IgZmV0Y2hlci5sb2FkKClcIik7XG4gICAgICBhd2FpdCByb3V0ZXIuZmV0Y2goZmV0Y2hlcktleSwgcm91dGVJZCwgaHJlZiwgb3B0cyk7XG4gICAgfSxcbiAgICBbZmV0Y2hlcktleSwgcm91dGVJZCwgcm91dGVyXVxuICApO1xuICBsZXQgc3VibWl0SW1wbCA9IHVzZVN1Ym1pdCgpO1xuICBsZXQgc3VibWl0ID0gUmVhY3QxMC51c2VDYWxsYmFjayhcbiAgICBhc3luYyAodGFyZ2V0LCBvcHRzKSA9PiB7XG4gICAgICBhd2FpdCBzdWJtaXRJbXBsKHRhcmdldCwge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBuYXZpZ2F0ZTogZmFsc2UsXG4gICAgICAgIGZldGNoZXJLZXlcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW2ZldGNoZXJLZXksIHN1Ym1pdEltcGxdXG4gICk7XG4gIGxldCB1bnN0YWJsZV9yZXNldCA9IFJlYWN0MTAudXNlQ2FsbGJhY2soKG9wdHMpID0+IHJvdXRlci5yZXNldEZldGNoZXIoZmV0Y2hlcktleSwgb3B0cyksIFtyb3V0ZXIsIGZldGNoZXJLZXldKTtcbiAgbGV0IEZldGNoZXJGb3JtID0gUmVhY3QxMC51c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgRmV0Y2hlck
25114Zvcm0yID0gUmVhY3QxMC5mb3J3YXJkUmVmKFxuICAgICAgKHByb3BzLCByZWYpID0+IHtcbiAgICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDEwLmNyZWF0ZUVsZW1lbnQoRm9ybSwgeyAuLi5wcm9wcywgbmF2aWdhdGU6IGZhbHNlLCBmZXRjaGVyS2V5LCByZWYgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgICBGZXRjaGVyRm9ybTIuZGlzcGxheU5hbWUgPSBcImZldGNoZXIuRm9ybVwiO1xuICAgIHJldHVybiBGZXRjaGVyRm9ybTI7XG4gIH0sIFtmZXRjaGVyS2V5XSk7XG4gIGxldCBmZXRjaGVyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KGZldGNoZXJLZXkpIHx8IElETEVfRkVUQ0hFUjtcbiAgbGV0IGRhdGEyID0gZmV0Y2hlckRhdGEuZ2V0KGZldGNoZXJLZXkpO1xuICBsZXQgZmV0Y2hlcldpdGhDb21wb25lbnRzID0gUmVhY3QxMC51c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBGb3JtOiBGZXRjaGVyRm9ybSxcbiAgICAgIHN1Ym1pdCxcbiAgICAgIGxvYWQsXG4gICAgICB1bnN0YWJsZV9yZXNldCxcbiAgICAgIC4uLmZldGNoZXIsXG4gICAgICBkYXRhOiBkYXRhMlxuICAgIH0pLFxuICAgIFtGZXRjaGVyRm9ybSwgc3VibWl0LCBsb2FkLCB1bnN0YWJsZV9yZXNldCwgZmV0Y2hlciwgZGF0YTJdXG4gICk7XG4gIHJldHVybiBmZXRjaGVyV2l0aENvbXBvbmVudHM7XG59XG5mdW5jdGlvbiB1c2VGZXRjaGVycygpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlMihcInVzZUZldGNoZXJzXCIgLyogVXNlRmV0Y2hlcnMgKi8pO1xuICByZXR1cm4gQXJyYXkuZnJvbShzdGF0ZS5mZXRjaGVycy5lbnRyaWVzKCkpLm1hcCgoW2tleSwgZmV0Y2hlcl0pID0+ICh7XG4gICAgLi4uZmV0Y2hlcixcbiAgICBrZXlcbiAgfSkpO1xufVxudmFyIFNDUk9MTF9SRVNUT1JBVElPTl9TVE9SQUdFX0tFWSA9IFwicmVhY3Qtcm91dGVyLXNjcm9sbC1wb3NpdGlvbnNcIjtcbnZhciBzYXZlZFNjcm9sbFBvc2l0aW9ucyA9IHt9O1xuZnVuY3Rpb24gZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkobG9jYXRpb24sIG1hdGNoZXMsIGJhc2VuYW1lLCBnZXRLZXkpIHtcbiAgbGV0IGtleSA9IG51bGw7XG4gIGlmIChnZXRLZXkpIHtcbiAgICBpZiAoYmFzZW5hbWUgIT09IFwiL1wiKSB7XG4gICAgICBrZXkgPSBnZXRLZXkoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5sb2NhdGlvbixcbiAgICAgICAgICBwYXRobmFtZTogc3RyaXBCYXNlbmFtZShsb2NhdGlvbi5wYXRobmFtZSwgYmFzZW5hbWUpIHx8IGxvY2F0aW9uLnBhdGhuYW1lXG4gICAgICAgIH0sXG4gICAgICAgIG1hdGNoZXNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleSA9IGdldEtleShsb2NhdGlvbiwgbWF0Y2hlcyk7XG4gICAgfVxuICB9XG4gIGlmIChrZXkgPT0gbnVsbCkge1xuICAgIGtleSA9IGxvY2F0aW9uLmtleTtcbiAgfVxuICByZXR1cm4ga2V5O1xufVxuZnVuY3Rpb24gdXNlU2Nyb2xsUmVzdG9yYXRpb24oe1xuICBnZXRLZXksXG4gIHN0b3JhZ2VLZXlcbn0gPSB7fSkge1xuICBsZXQgeyByb3V0ZXIgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0MyhcInVzZVNjcm9sbFJlc3RvcmF0aW9uXCIgLyogVXNlU2Nyb2xsUmVzdG9yYXRpb24gKi8pO1xuICBsZXQgeyByZXN0b3JlU2Nyb2xsUG9zaXRpb24sIHByZXZlbnRTY3JvbGxSZXNldCB9ID0gdXNlRGF0YVJvdXRlclN0YXRlMihcbiAgICBcInVzZVNjcm9sbFJlc3RvcmF0aW9uXCIgLyogVXNlU2Nyb2xsUmVzdG9yYXRpb24gKi9cbiAgKTtcbiAgbGV0IHsgYmFzZW5hbWUgfSA9IFJlYWN0MTAudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBtYXRjaGVzID0gdXNlTWF0Y2hlcygpO1xuICBsZXQgbmF2aWdhdGlvbiA9IHVzZU5hdmlnYXRpb24oKTtcbiAgUmVhY3QxMC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHdpbmRvdy5oaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gXCJtYW51YWxcIjtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93Lmhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24gPSBcImF1dG9cIjtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHVzZVBhZ2VIaWRlKFxuICAgIFJlYWN0MTAudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgaWYgKG5hdmlnYXRpb24uc3RhdGUgPT09IFwiaWRsZVwiKSB7XG4gICAgICAgIGxldCBrZXkgPSBnZXRTY3JvbGxSZXN0b3JhdGlvbktleShsb2NhdGlvbiwgbWF0Y2hlcywgYmFzZW5hbWUsIGdldEtleSk7XG4gICAgICAgIHNhdmVkU2Nyb2xsUG9zaXRpb25zW2tleV0gPSB3aW5kb3cuc2Nyb2xsWTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgc3RvcmFnZUtleSB8fCBTQ1JPTExfUkVTVE9SQVRJT05fU1RPUkFHRV9LRVksXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoc2F2ZWRTY3JvbGxQb3NpdGlvbnMpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGBGYWlsZWQgdG8gc2F2ZSBzY3JvbGwgcG9zaXRpb25zIGluIHNlc3Npb25TdG9yYWdlLCA8U2Nyb2xsUmVzdG9yYXRpb24gLz4gd2lsbCBub3Qgd29yayBwcm9wZXJseSAoJHtlcnJvcn0pLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5oaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gXCJhdXRvXCI7XG4gICAgfSwgW25hdmlnYXRpb24uc3RhdGUsIGdldEtleSwgYmFzZW5hbWUsIGxvY2F0aW9uLCBtYXRjaGVzLCBzdG9yYWdlS2V5XSlcbiAgKTtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIFJlYWN0MTAudXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBzZXNzaW9uUG9zaXRpb25zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgICAgICBzdG9yYWdlS2V5IHx8IFNDUk9MTF9SRVNUT1JBVElPTl9TVE9SQUdFX0tFWVxuICAgICAgICApO1xuICAgICAgICBpZiAoc2Vzc2lvblBvc2l0aW9ucykge1xuICAgICAgICAgI
25114HNhdmVkU2Nyb2xsUG9zaXRpb25zID0gSlNPTi5wYXJzZShzZXNzaW9uUG9zaXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgfVxuICAgIH0sIFtzdG9yYWdlS2V5XSk7XG4gICAgUmVhY3QxMC51c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgbGV0IGRpc2FibGVTY3JvbGxSZXN0b3JhdGlvbiA9IHJvdXRlcj8uZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb24oXG4gICAgICAgIHNhdmVkU2Nyb2xsUG9zaXRpb25zLFxuICAgICAgICAoKSA9PiB3aW5kb3cuc2Nyb2xsWSxcbiAgICAgICAgZ2V0S2V5ID8gKGxvY2F0aW9uMiwgbWF0Y2hlczIpID0+IGdldFNjcm9sbFJlc3RvcmF0aW9uS2V5KGxvY2F0aW9uMiwgbWF0Y2hlczIsIGJhc2VuYW1lLCBnZXRLZXkpIDogdm9pZCAwXG4gICAgICApO1xuICAgICAgcmV0dXJuICgpID0+IGRpc2FibGVTY3JvbGxSZXN0b3JhdGlvbiAmJiBkaXNhYmxlU2Nyb2xsUmVzdG9yYXRpb24oKTtcbiAgICB9LCBbcm91dGVyLCBiYXNlbmFtZSwgZ2V0S2V5XSk7XG4gICAgUmVhY3QxMC51c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHJlc3RvcmVTY3JvbGxQb3NpdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXN0b3JlU2Nyb2xsUG9zaXRpb24gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHJlc3RvcmVTY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChsb2NhdGlvbi5oYXNoKSB7XG4gICAgICAgICAgbGV0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zbGljZSgxKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGBcIiR7bG9jYXRpb24uaGFzaC5zbGljZShcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApfVwiIGlzIG5vdCBhIGRlY29kYWJsZSBlbGVtZW50IElELiBUaGUgdmlldyB3aWxsIG5vdCBzY3JvbGwgdG8gaXQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZlbnRTY3JvbGxSZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG4gICAgfSwgW2xvY2F0aW9uLCByZXN0b3JlU2Nyb2xsUG9zaXRpb24sIHByZXZlbnRTY3JvbGxSZXNldF0pO1xuICB9XG59XG5mdW5jdGlvbiB1c2VCZWZvcmVVbmxvYWQoY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgbGV0IHsgY2FwdHVyZSB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgUmVhY3QxMC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBvcHRzID0gY2FwdHVyZSAhPSBudWxsID8geyBjYXB0dXJlIH0gOiB2b2lkIDA7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgY2FsbGJhY2ssIG9wdHMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBjYWxsYmFjaywgb3B0cyk7XG4gICAgfTtcbiAgfSwgW2NhbGxiYWNrLCBjYXB0dXJlXSk7XG59XG5mdW5jdGlvbiB1c2VQYWdlSGlkZShjYWxsYmFjaywgb3B0aW9ucykge1xuICBsZXQgeyBjYXB0dXJlIH0gPSBvcHRpb25zIHx8IHt9O1xuICBSZWFjdDEwLnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IG9wdHMgPSBjYXB0dXJlICE9IG51bGwgPyB7IGNhcHR1cmUgfSA6IHZvaWQgMDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIGNhbGxiYWNrLCBvcHRzKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBjYWxsYmFjaywgb3B0cyk7XG4gICAgfTtcbiAgfSwgW2NhbGxiYWNrLCBjYXB0dXJlXSk7XG59XG5mdW5jdGlvbiB1c2VQcm9tcHQoe1xuICB3aGVuLFxuICBtZXNzYWdlXG59KSB7XG4gIGxldCBibG9ja2VyID0gdXNlQmxvY2tlcih3aGVuKTtcbiAgUmVhY3QxMC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChibG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIikge1xuICAgICAgbGV0IHByb2NlZWQgPSB3aW5kb3cuY29uZmlybShtZXNzYWdlKTtcbiAgICAgIGlmIChwcm9jZWVkKSB7XG4gICAgICAgIHNldFRpbWVvdXQoYmxvY2tlci5wcm9jZWVkLCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJsb2NrZXIucmVzZXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtibG9ja2VyLCBtZXNzYWdlXSk7XG4gIFJlYWN0MTAudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoYmxvY2tlci5zdGF0ZSA9PT0gXCJibG9ja2VkXCIgJiYgIXdoZW4pIHtcbiAgICAgIGJsb2NrZXIucmVzZXQoKTtcbiAgICB9XG4gIH0sIFtibG9ja2VyLCB3aGVuXSk7XG59XG5mdW5jdGlvbiB1c2VWaWV3VHJhbnNpdGlvblN0YXRlKHRvLCB7IHJlbGF0aXZlIH0gPSB7fSkge1xuICBsZXQgdnRDb250ZXh0ID0gUmVhY3QxMC51c2VDb250ZXh0KFZpZXdUcmFuc2l0aW9uQ29udGV4dCk7XG4gIGludmFyaWFudChcbiAgICB2dENvbnRleHQgIT0gbnVsbCxcbiAgICBcImB1c2VWaWV3VHJhbnNpdGlvblN0YXRlYCBtdXN0IGJlIHVzZWQgd2l0aGluIGByZWFjdC1yb3V0ZXItZG9tYCdzIGBSb3V0ZXJQcm92aWRlcmAuICBEaWQgeW91IGFjY2lkZW50YWxseSBpbXBvcnQgYFJvdXRlclByb3ZpZGVyYCBmcm9tIGByZWFjdC1yb3V0ZXJgP1wiXG4gICk7XG4gIGxldCB7IGJhc2VuYW1lIH0gPSB1c2VEYXRhUm91dGVyQ29udGV4dDMoXG4gICAgXCJ1c2VWaWV3VHJhbnNpdGlvblN0YXRlXCIgLyogdXNlVmlld1RyYW5zaXRpb25TdGF0ZSAqL1xuICApO1xuICBsZXQgcGF0aCA9IHVzZVJlc29sdmVkUGF0aCh0bywgeyByZWxhdGl2ZSB9KTtcbiAgaWYgKCF2dENvbnRleHQuaXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBjdXJyZW50UGF0aCA9IHN0cmlwQmFzZW5hbWUodnRDb250ZXh0LmN1cnJlbnRMb2NhdGlvbi5wYXRobmFtZSwgYmFzZW5hbWUpIHx8IHZ0Q29udGV4dC5jdXJyZW50TG9jYXRpb24ucGF0aG5hbWU7XG4gIGxldCBuZXh0UGF0aCA9IHN0cmlwQmFzZW5hbWUodnRDb250ZXh0Lm5leHRMb2NhdGlvbi5wYXRobmFtZSwgYmFzZW5hbWUpIHx8IHZ0Q29udGV4dC5uZXh0TG9jYXRpb24ucGF0aG5hbWU7XG4gIHJldHVybi
25114BtYXRjaFBhdGgocGF0aC5wYXRobmFtZSwgbmV4dFBhdGgpICE9IG51bGwgfHwgbWF0Y2hQYXRoKHBhdGgucGF0aG5hbWUsIGN1cnJlbnRQYXRoKSAhPSBudWxsO1xufVxuXG4vLyBsaWIvZG9tL3NlcnZlci50c3hcbmltcG9ydCAqIGFzIFJlYWN0MTEgZnJvbSBcInJlYWN0XCI7XG5mdW5jdGlvbiBTdGF0aWNSb3V0ZXIoe1xuICBiYXNlbmFtZSxcbiAgY2hpbGRyZW4sXG4gIGxvY2F0aW9uOiBsb2NhdGlvblByb3AgPSBcIi9cIlxufSkge1xuICBpZiAodHlwZW9mIGxvY2F0aW9uUHJvcCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGxvY2F0aW9uUHJvcCA9IHBhcnNlUGF0aChsb2NhdGlvblByb3ApO1xuICB9XG4gIGxldCBhY3Rpb24gPSBcIlBPUFwiIC8qIFBvcCAqLztcbiAgbGV0IGxvY2F0aW9uID0ge1xuICAgIHBhdGhuYW1lOiBsb2NhdGlvblByb3AucGF0aG5hbWUgfHwgXCIvXCIsXG4gICAgc2VhcmNoOiBsb2NhdGlvblByb3Auc2VhcmNoIHx8IFwiXCIsXG4gICAgaGFzaDogbG9jYXRpb25Qcm9wLmhhc2ggfHwgXCJcIixcbiAgICBzdGF0ZTogbG9jYXRpb25Qcm9wLnN0YXRlICE9IG51bGwgPyBsb2NhdGlvblByb3Auc3RhdGUgOiBudWxsLFxuICAgIGtleTogbG9jYXRpb25Qcm9wLmtleSB8fCBcImRlZmF1bHRcIlxuICB9O1xuICBsZXQgc3RhdGljTmF2aWdhdG9yID0gZ2V0U3RhdGVsZXNzTmF2aWdhdG9yKCk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QxMS5jcmVhdGVFbGVtZW50KFxuICAgIFJvdXRlcixcbiAgICB7XG4gICAgICBiYXNlbmFtZSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBuYXZpZ2F0aW9uVHlwZTogYWN0aW9uLFxuICAgICAgbmF2aWdhdG9yOiBzdGF0aWNOYXZpZ2F0b3IsXG4gICAgICBzdGF0aWM6IHRydWVcbiAgICB9XG4gICk7XG59XG5mdW5jdGlvbiBTdGF0aWNSb3V0ZXJQcm92aWRlcih7XG4gIGNvbnRleHQsXG4gIHJvdXRlcixcbiAgaHlkcmF0ZTogaHlkcmF0ZTIgPSB0cnVlLFxuICBub25jZVxufSkge1xuICBpbnZhcmlhbnQoXG4gICAgcm91dGVyICYmIGNvbnRleHQsXG4gICAgXCJZb3UgbXVzdCBwcm92aWRlIGByb3V0ZXJgIGFuZCBgY29udGV4dGAgdG8gPFN0YXRpY1JvdXRlclByb3ZpZGVyPlwiXG4gICk7XG4gIGxldCBkYXRhUm91dGVyQ29udGV4dCA9IHtcbiAgICByb3V0ZXIsXG4gICAgbmF2aWdhdG9yOiBnZXRTdGF0ZWxlc3NOYXZpZ2F0b3IoKSxcbiAgICBzdGF0aWM6IHRydWUsXG4gICAgc3RhdGljQ29udGV4dDogY29udGV4dCxcbiAgICBiYXNlbmFtZTogY29udGV4dC5iYXNlbmFtZSB8fCBcIi9cIlxuICB9O1xuICBsZXQgZmV0Y2hlcnNDb250ZXh0ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IGh5ZHJhdGVTY3JpcHQgPSBcIlwiO1xuICBpZiAoaHlkcmF0ZTIgIT09IGZhbHNlKSB7XG4gICAgbGV0IGRhdGEyID0ge1xuICAgICAgbG9hZGVyRGF0YTogY29udGV4dC5sb2FkZXJEYXRhLFxuICAgICAgYWN0aW9uRGF0YTogY29udGV4dC5hY3Rpb25EYXRhLFxuICAgICAgZXJyb3JzOiBzZXJpYWxpemVFcnJvcnMoY29udGV4dC5lcnJvcnMpXG4gICAgfTtcbiAgICBsZXQganNvbiA9IGh0bWxFc2NhcGUoSlNPTi5zdHJpbmdpZnkoSlNPTi5zdHJpbmdpZnkoZGF0YTIpKSk7XG4gICAgaHlkcmF0ZVNjcmlwdCA9IGB3aW5kb3cuX19zdGF0aWNSb3V0ZXJIeWRyYXRpb25EYXRhID0gSlNPTi5wYXJzZSgke2pzb259KTtgO1xuICB9XG4gIGxldCB7IHN0YXRlIH0gPSBkYXRhUm91dGVyQ29udGV4dC5yb3V0ZXI7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QxMS5jcmVhdGVFbGVtZW50KFJlYWN0MTEuRnJhZ21lbnQsIG51bGwsIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDExLmNyZWF0ZUVsZW1lbnQoRGF0YVJvdXRlckNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGRhdGFSb3V0ZXJDb250ZXh0IH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDExLmNyZWF0ZUVsZW1lbnQoRGF0YVJvdXRlclN0YXRlQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogc3RhdGUgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0MTEuY3JlYXRlRWxlbWVudChGZXRjaGVyc0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGZldGNoZXJzQ29udGV4dCB9LCAvKiBAX19QVVJFX18gKi8gUmVhY3QxMS5jcmVhdGVFbGVtZW50KFZpZXdUcmFuc2l0aW9uQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogeyBpc1RyYW5zaXRpb25pbmc6IGZhbHNlIH0gfSwgLyogQF9fUFVSRV9fICovIFJlYWN0MTEuY3JlYXRlRWxlbWVudChcbiAgICBSb3V0ZXIsXG4gICAge1xuICAgICAgYmFzZW5hbWU6IGRhdGFSb3V0ZXJDb250ZXh0LmJhc2VuYW1lLFxuICAgICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgbmF2aWdhdGlvblR5cGU6IHN0YXRlLmhpc3RvcnlBY3Rpb24sXG4gICAgICBuYXZpZ2F0b3I6IGRhdGFSb3V0ZXJDb250ZXh0Lm5hdmlnYXRvcixcbiAgICAgIHN0YXRpYzogZGF0YVJvdXRlckNvbnRleHQuc3RhdGljXG4gICAgfSxcbiAgICAvKiBAX19QVVJFX18gKi8gUmVhY3QxMS5jcmVhdGVFbGVtZW50KFxuICAgICAgRGF0YVJvdXRlczIsXG4gICAgICB7XG4gICAgICAgIHJvdXRlczogcm91dGVyLnJvdXRlcyxcbiAgICAgICAgZnV0dXJlOiByb3V0ZXIuZnV0dXJlLFxuICAgICAgICBzdGF0ZVxuICAgICAgfVxuICAgIClcbiAgKSkpKSksIGh5ZHJhdGVTY3JpcHQgPyAvKiBAX19QVVJFX18gKi8gUmVhY3QxMS5jcmVhdGVFbGVtZW50KFxuICAgIFwic2NyaXB0XCIsXG4gICAge1xuICAgICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nOiB0cnVlLFxuICAgICAgbm9uY2UsXG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IGh5ZHJhdGVTY3JpcHQgfVxuICAgIH1cbiAgKSA6IG51bGwpO1xufVxuZnVuY3Rpb24gRGF0YVJvdXRlczIoe1xuICByb3V0ZXMsXG4gIGZ1dHVyZSxcbiAgc3RhdGVcbn0pIHtcbiAgcmV0dXJuIHVzZVJvdXRlc0ltcGwocm91dGVzLCB2b2lkIDAsIHN0YXRlLCB2b2lkIDAsIGZ1dHVyZSk7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVFcnJvcnMoZXJyb3JzKSB7XG4gIGlmICghZXJyb3JzKSByZXR1cm4gbnVsbDtcbiAgbGV0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhlcnJvcnMpO1xuICBsZXQgc2VyaWFsaXplZCA9IHt9O1xuICBmb3IgKGxldCBba2V5LCB2YWxdIG9mIGVudHJpZXMpIHtcbiAgICBpZiAoaXNSb3V0ZUVycm9yUmVzcG9uc2UodmFsKSkge1xuICAgICAgc2VyaWFsaXplZFtrZXldID0geyAuLi52YWwsIF9fdHlwZTogXCJSb3V0
25114ZUVycm9yUmVzcG9uc2VcIiB9O1xuICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHNlcmlhbGl6ZWRba2V5XSA9IHtcbiAgICAgICAgbWVzc2FnZTogdmFsLm1lc3NhZ2UsXG4gICAgICAgIF9fdHlwZTogXCJFcnJvclwiLFxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViY2xhc3MgKGkuZS4sIFJlZmVyZW5jZUVycm9yKSwgc2VuZCB1cCB0aGUgdHlwZSBzbyB3ZVxuICAgICAgICAvLyBjYW4gcmUtY3JlYXRlIHRoZSBzYW1lIHR5cGUgZHVyaW5nIGh5ZHJhdGlvbi5cbiAgICAgICAgLi4udmFsLm5hbWUgIT09IFwiRXJyb3JcIiA/IHtcbiAgICAgICAgICBfX3N1YlR5cGU6IHZhbC5uYW1lXG4gICAgICAgIH0gOiB7fVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VyaWFsaXplZFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2VyaWFsaXplZDtcbn1cbmZ1bmN0aW9uIGdldFN0YXRlbGVzc05hdmlnYXRvcigpIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGVIcmVmLFxuICAgIGVuY29kZUxvY2F0aW9uLFxuICAgIHB1c2godG8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSBjYW5ub3QgdXNlIG5hdmlnYXRvci5wdXNoKCkgb24gdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIGEgc3RhdGVsZXNzIGVudmlyb25tZW50LiBUaGlzIGVycm9yIHdhcyBwcm9iYWJseSB0cmlnZ2VyZWQgd2hlbiB5b3UgZGlkIGEgXFxgbmF2aWdhdGUoJHtKU09OLnN0cmluZ2lmeSh0byl9KVxcYCBzb21ld2hlcmUgaW4geW91ciBhcHAuYFxuICAgICAgKTtcbiAgICB9LFxuICAgIHJlcGxhY2UodG8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSBjYW5ub3QgdXNlIG5hdmlnYXRvci5yZXBsYWNlKCkgb24gdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIGEgc3RhdGVsZXNzIGVudmlyb25tZW50LiBUaGlzIGVycm9yIHdhcyBwcm9iYWJseSB0cmlnZ2VyZWQgd2hlbiB5b3UgZGlkIGEgXFxgbmF2aWdhdGUoJHtKU09OLnN0cmluZ2lmeSh0byl9LCB7IHJlcGxhY2U6IHRydWUgfSlcXGAgc29tZXdoZXJlIGluIHlvdXIgYXBwLmBcbiAgICAgICk7XG4gICAgfSxcbiAgICBnbyhkZWx0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IGNhbm5vdCB1c2UgbmF2aWdhdG9yLmdvKCkgb24gdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIGEgc3RhdGVsZXNzIGVudmlyb25tZW50LiBUaGlzIGVycm9yIHdhcyBwcm9iYWJseSB0cmlnZ2VyZWQgd2hlbiB5b3UgZGlkIGEgXFxgbmF2aWdhdGUoJHtkZWx0YX0pXFxgIHNvbWV3aGVyZSBpbiB5b3VyIGFwcC5gXG4gICAgICApO1xuICAgIH0sXG4gICAgYmFjaygpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSBjYW5ub3QgdXNlIG5hdmlnYXRvci5iYWNrKCkgb24gdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIGEgc3RhdGVsZXNzIGVudmlyb25tZW50LmBcbiAgICAgICk7XG4gICAgfSxcbiAgICBmb3J3YXJkKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IGNhbm5vdCB1c2UgbmF2aWdhdG9yLmZvcndhcmQoKSBvbiB0aGUgc2VydmVyIGJlY2F1c2UgaXQgaXMgYSBzdGF0ZWxlc3MgZW52aXJvbm1lbnQuYFxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVTdGF0aWNIYW5kbGVyMihyb3V0ZXMsIG9wdHMpIHtcbiAgcmV0dXJuIGNyZWF0ZVN0YXRpY0hhbmRsZXIocm91dGVzLCB7XG4gICAgLi4ub3B0cyxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXNcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVTdGF0aWNSb3V0ZXIocm91dGVzLCBjb250ZXh0LCBvcHRzID0ge30pIHtcbiAgbGV0IG1hbmlmZXN0ID0ge307XG4gIGxldCBkYXRhUm91dGVzID0gY29udmVydFJvdXRlc1RvRGF0YVJvdXRlcyhcbiAgICByb3V0ZXMsXG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzLFxuICAgIHZvaWQgMCxcbiAgICBtYW5pZmVzdFxuICApO1xuICBsZXQgbWF0Y2hlcyA9IGNvbnRleHQubWF0Y2hlcy5tYXAoKG1hdGNoKSA9PiB7XG4gICAgbGV0IHJvdXRlID0gbWFuaWZlc3RbbWF0Y2gucm91dGUuaWRdIHx8IG1hdGNoLnJvdXRlO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5tYXRjaCxcbiAgICAgIHJvdXRlXG4gICAgfTtcbiAgfSk7XG4gIGxldCBtc2cgPSAobWV0aG9kKSA9PiBgWW91IGNhbm5vdCB1c2Ugcm91dGVyLiR7bWV0aG9kfSgpIG9uIHRoZSBzZXJ2ZXIgYmVjYXVzZSBpdCBpcyBhIHN0YXRlbGVzcyBlbnZpcm9ubWVudGA7XG4gIHJldHVybiB7XG4gICAgZ2V0IGJhc2VuYW1lKCkge1xuICAgICAgcmV0dXJuIGNvbnRleHQuYmFzZW5hbWU7XG4gICAgfSxcbiAgICBnZXQgZnV0dXJlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdjhfbWlkZGxld2FyZTogZmFsc2UsXG4gICAgICAgIC4uLm9wdHM/LmZ1dHVyZVxuICAgICAgfTtcbiAgICB9LFxuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhpc3RvcnlBY3Rpb246IFwiUE9QXCIgLyogUG9wICovLFxuICAgICAgICBsb2NhdGlvbjogY29udGV4dC5sb2NhdGlvbixcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgbG9hZGVyRGF0YTogY29udGV4dC5sb2FkZXJEYXRhLFxuICAgICAgICBhY3Rpb25EYXRhOiBjb250ZXh0LmFjdGlvbkRhdGEsXG4gICAgICAgIGVycm9yczogY29udGV4dC5lcnJvcnMsXG4gICAgICAgIGluaXRpYWxpemVkOiB0cnVlLFxuICAgICAgICBuYXZpZ2F0aW9uOiBJRExFX05BVklHQVRJT04sXG4gICAgICAgIHJlc3RvcmVTY3JvbGxQb3NpdGlvbjogbnVsbCxcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBmYWxzZSxcbiAgICAgICAgcmV2YWxpZGF0aW9uOiBcImlkbGVcIixcbiAgICAgICAgZmV0Y2hlcnM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgICAgIGJsb2NrZXJzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpXG4gICAgICB9O1xuICAgIH0sXG4gICAgZ2V0IHJvdXRlcygpIHtcbiAgICAgIHJldHVybiBkYXRhUm91dGVzO1xuICAgIH0sXG4gICAgZ2V0IHdpbmRvdygpIHtcbiAgICAgIHJldHVybi
25114B2b2lkIDA7XG4gICAgfSxcbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgdGhyb3cgbXNnKFwiaW5pdGlhbGl6ZVwiKTtcbiAgICB9LFxuICAgIHN1YnNjcmliZSgpIHtcbiAgICAgIHRocm93IG1zZyhcInN1YnNjcmliZVwiKTtcbiAgICB9LFxuICAgIGVuYWJsZVNjcm9sbFJlc3RvcmF0aW9uKCkge1xuICAgICAgdGhyb3cgbXNnKFwiZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb25cIik7XG4gICAgfSxcbiAgICBuYXZpZ2F0ZSgpIHtcbiAgICAgIHRocm93IG1zZyhcIm5hdmlnYXRlXCIpO1xuICAgIH0sXG4gICAgZmV0Y2goKSB7XG4gICAgICB0aHJvdyBtc2coXCJmZXRjaFwiKTtcbiAgICB9LFxuICAgIHJldmFsaWRhdGUoKSB7XG4gICAgICB0aHJvdyBtc2coXCJyZXZhbGlkYXRlXCIpO1xuICAgIH0sXG4gICAgY3JlYXRlSHJlZixcbiAgICBlbmNvZGVMb2NhdGlvbixcbiAgICBnZXRGZXRjaGVyKCkge1xuICAgICAgcmV0dXJuIElETEVfRkVUQ0hFUjtcbiAgICB9LFxuICAgIGRlbGV0ZUZldGNoZXIoKSB7XG4gICAgICB0aHJvdyBtc2coXCJkZWxldGVGZXRjaGVyXCIpO1xuICAgIH0sXG4gICAgcmVzZXRGZXRjaGVyKCkge1xuICAgICAgdGhyb3cgbXNnKFwicmVzZXRGZXRjaGVyXCIpO1xuICAgIH0sXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgIHRocm93IG1zZyhcImRpc3Bvc2VcIik7XG4gICAgfSxcbiAgICBnZXRCbG9ja2VyKCkge1xuICAgICAgcmV0dXJuIElETEVfQkxPQ0tFUjtcbiAgICB9LFxuICAgIGRlbGV0ZUJsb2NrZXIoKSB7XG4gICAgICB0aHJvdyBtc2coXCJkZWxldGVCbG9ja2VyXCIpO1xuICAgIH0sXG4gICAgcGF0Y2hSb3V0ZXMoKSB7XG4gICAgICB0aHJvdyBtc2coXCJwYXRjaFJvdXRlc1wiKTtcbiAgICB9LFxuICAgIF9pbnRlcm5hbEZldGNoQ29udHJvbGxlcnM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgX2ludGVybmFsU2V0Um91dGVzKCkge1xuICAgICAgdGhyb3cgbXNnKFwiX2ludGVybmFsU2V0Um91dGVzXCIpO1xuICAgIH0sXG4gICAgX2ludGVybmFsU2V0U3RhdGVEb05vdFVzZU9yWW91V2lsbEJyZWFrWW91ckFwcCgpIHtcbiAgICAgIHRocm93IG1zZyhcIl9pbnRlcm5hbFNldFN0YXRlRG9Ob3RVc2VPcllvdVdpbGxCcmVha1lvdXJBcHBcIik7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSHJlZih0bykge1xuICByZXR1cm4gdHlwZW9mIHRvID09PSBcInN0cmluZ1wiID8gdG8gOiBjcmVhdGVQYXRoKHRvKTtcbn1cbmZ1bmN0aW9uIGVuY29kZUxvY2F0aW9uKHRvKSB7XG4gIGxldCBocmVmID0gdHlwZW9mIHRvID09PSBcInN0cmluZ1wiID8gdG8gOiBjcmVhdGVQYXRoKHRvKTtcbiAgaHJlZiA9IGhyZWYucmVwbGFjZSgvICQvLCBcIiUyMFwiKTtcbiAgbGV0IGVuY29kZWQgPSBBQlNPTFVURV9VUkxfUkVHRVgzLnRlc3QoaHJlZikgPyBuZXcgVVJMKGhyZWYpIDogbmV3IFVSTChocmVmLCBcImh0dHA6Ly9sb2NhbGhvc3RcIik7XG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWU6IGVuY29kZWQucGF0aG5hbWUsXG4gICAgc2VhcmNoOiBlbmNvZGVkLnNlYXJjaCxcbiAgICBoYXNoOiBlbmNvZGVkLmhhc2hcbiAgfTtcbn1cbnZhciBBQlNPTFVURV9VUkxfUkVHRVgzID0gL14oPzpbYS16XVthLXowLTkrLi1dKjp8XFwvXFwvKS9pO1xudmFyIEVTQ0FQRV9MT09LVVAyID0ge1xuICBcIiZcIjogXCJcXFxcdTAwMjZcIixcbiAgXCI+XCI6IFwiXFxcXHUwMDNlXCIsXG4gIFwiPFwiOiBcIlxcXFx1MDAzY1wiLFxuICBcIlxcdTIwMjhcIjogXCJcXFxcdTIwMjhcIixcbiAgXCJcXHUyMDI5XCI6IFwiXFxcXHUyMDI5XCJcbn07XG52YXIgRVNDQVBFX1JFR0VYMiA9IC9bJj48XFx1MjAyOFxcdTIwMjldL2c7XG5mdW5jdGlvbiBodG1sRXNjYXBlKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoRVNDQVBFX1JFR0VYMiwgKG1hdGNoKSA9PiBFU0NBUEVfTE9PS1VQMlttYXRjaF0pO1xufVxuXG5leHBvcnQge1xuICBBY3Rpb24sXG4gIGNyZWF0ZUJyb3dzZXJIaXN0b3J5LFxuICBpbnZhcmlhbnQsXG4gIGNyZWF0ZVBhdGgsXG4gIHBhcnNlUGF0aCxcbiAgY3JlYXRlQ29udGV4dCxcbiAgUm91dGVyQ29udGV4dFByb3ZpZGVyLFxuICBjb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzLFxuICBtYXRjaFJvdXRlcyxcbiAgZ2VuZXJhdGVQYXRoLFxuICBtYXRjaFBhdGgsXG4gIHN0cmlwQmFzZW5hbWUsXG4gIHJlc29sdmVQYXRoLFxuICBkYXRhLFxuICByZWRpcmVjdCxcbiAgcmVkaXJlY3REb2N1bWVudCxcbiAgcmVwbGFjZSxcbiAgRXJyb3JSZXNwb25zZUltcGwsXG4gIGlzUm91dGVFcnJvclJlc3BvbnNlLFxuICBJRExFX05BVklHQVRJT04sXG4gIElETEVfRkVUQ0hFUixcbiAgSURMRV9CTE9DS0VSLFxuICBjcmVhdGVSb3V0ZXIsXG4gIGNyZWF0ZVN0YXRpY0hhbmRsZXIsXG4gIGdldFN0YXRpY0NvbnRleHRGcm9tRXJyb3IsXG4gIGlzRGF0YVdpdGhSZXNwb25zZUluaXQsXG4gIGlzUmVzcG9uc2UsXG4gIGlzUmVkaXJlY3RTdGF0dXNDb2RlLFxuICBpc1JlZGlyZWN0UmVzcG9uc2UsXG4gIGlzTXV0YXRpb25NZXRob2QsXG4gIERhdGFSb3V0ZXJDb250ZXh0LFxuICBEYXRhUm91dGVyU3RhdGVDb250ZXh0LFxuICBSU0NSb3V0ZXJDb250ZXh0LFxuICBWaWV3VHJhbnNpdGlvbkNvbnRleHQsXG4gIEZldGNoZXJzQ29udGV4dCxcbiAgQXdhaXRDb250ZXh0UHJvdmlkZXIsXG4gIE5hdmlnYXRpb25Db250ZXh0LFxuICBMb2NhdGlvbkNvbnRleHQsXG4gIFJvdXRlQ29udGV4dCxcbiAgRU5BQkxFX0RFVl9XQVJOSU5HUyxcbiAgdXNlSHJlZixcbiAgdXNlSW5Sb3V0ZXJDb250ZXh0LFxuICB1c2VMb2NhdGlvbixcbiAgdXNlTmF2aWdhdGlvblR5cGUsXG4gIHVzZU1hdGNoLFxuICB1c2VOYXZpZ2F0ZSxcbiAgdXNlT3V0bGV0Q29udGV4dCxcbiAgdXNlT3V0bGV0LFxuICB1c2VQYXJhbXMsXG4gIHVzZVJlc29sdmVkUGF0aCxcbiAgdXNlUm91dGVzLFxuICB1c2VOYXZpZ2F0aW9uLFxuICB1c2VSZXZhbGlkYXRvcixcbiAgdXNlTWF0Y2hlcyxcbiAgdXNlTG9hZGVyRGF0YSxcbiAgdXNlUm91dGVMb2FkZXJEYXRhLFxuICB1c2VBY3Rpb25EYXRhLFxuICB1c2VSb3V0ZUVycm9yLFxuICB1c2VBc3luY1ZhbHVlLFxuICB1c2VBc3luY0Vycm9yLFxuICB1c2VCbG9ja2VyLFxuICB3YXJuT25jZSxcbiAgbWFwUm91dGVQcm9wZXJ0aWVzLFxuICBoeWRyYXRpb25Sb3V0ZVByb3BlcnRpZXMsXG4gIGNyZWF0ZU1lbW9yeVJvdXRlcixcbiAgVU5TVEFCTEVfVHJhbnNpdGlvbkVuYWJsZWRSb3V0ZXJQcm92aWRlcixcbiAgUm91dGVyUHJvdmlkZXIsXG4gIE1lbW9yeVJvdXRlcixcbiAgTmF2aWdhdGUsXG4gIE91dGxldCxcbiAgUm91dGUsXG4gIFJvdXRlcixcbiAgUm91dGVzLFxuICBBd2FpdCxcbiAgY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuLFxuICBjcmVhdGVSb3V0ZXNGcm9tRWxlbWVudHMsXG4gIHJlbmRlck1hdGNoZXMsXG4gIFdpdGhDb21wb25lbnRQcm9wcyxcbiAgd2l0aENvbXBvbmVudFByb3BzLFxuICBXaXRoSHlkcmF0ZUZhbGxiYWNrUHJvcHMsXG4gIHdpdGhIeWRyYXRlRmFsbGJhY2tQcm9wcyxcbiAgV2l0aEVycm9yQm91bmRhcnlQcm9wcyxcbiAgd2l0aEVycm9yQm91bmRhcnlQcm9wcyxcbiAgY3JlYXRlU2VhcmNoUGFyYW1zLFxuICBlc2NhcGVIdG1sLFxuICBlbmNvZGUsXG4gIGNyZWF0ZVJlcXVlc3RJbml0LFxuICBTaW5nbGVGZXRjaFJlZGlyZWN0U3ltYm9sLFxuICBTSU5HTEVfRkVUQ0hfUkVESVJFQ1RfU1RBVFVTLFxuICBOT19CT0RZX1NUQVRVU19DT0RFUyxcbiAgU3RyZWFtVHJhbnNmZXIsXG4gIGdldFR1cmJvU3RyZWFtU2luZ2xlRmV0Y2hEYXRhU3RyYXRlZ3ksXG4gIGdldFNpbmdsZUZldGNoRGF0YVN0cmF0ZWd5SW1wbCxcbiAgc3RyaXBJbmRleFBhcmFtLFxuICBzaW5nbGVGZXRjaFVybCxcbiAgZGVjb2RlVmlhVHVyYm9TdHJlYW0sXG4gIFJlbWl4RXJyb3JCb3VuZGFyeSxcbiAgY3JlYXRlU2VydmVyUm91dGVzLFxuICBjcmVhdGVDbGllbnRSb3V0ZXNXaXRoSE1SUmV2YWxpZGF0aW9uT3B0T3V0LFxuICBub0FjdGlvbkRlZmluZWRFcnJvcixcbiAgY3JlYXRlQ2xpZW50Um91dGVzLFxuICBzaG91bGRIeWRyYXRlUm91dGVMb2FkZXIsXG4gIGdldFBhdGNoUm91dGVzT25OYXZpZ2F0aW9uRnVuY3Rpb24sXG4gIHVzZUZvZ09GV2FyRGlzY292ZXJ5LFxuICBnZXRNYW5pZmVzdFBhdGgsXG4gIEZyYW1ld29ya0NvbnRleHQsXG4gIENSSVRJQ0FMX0NTU19EQVRBX0FUVFJJQlVURSxcbiAgTGlua3MsXG4gIFByZWZldGNoUGFnZUxpbmtzLFxuICBNZXRhLFxuICBzZXRJc0h5ZHJhdGVkLFxuICBTY3JpcHRzLFxuICBjcmVhdGVCcm93c2VyUm91dGVyLFxuICBjcmVhdGVIYXNoUm91dGVyLFxuICBCcm93c2VyUm91dGVyLFxuICBIYXNoUm91dGVyLFxuICBIaXN0b3J5Um91dGVyLFxuICBMaW5rLFxuICBOYXZMaW5rLFxuICBGb3JtLFxuICBTY3JvbGxSZXN0b3JhdGlvbixcbiAgdXNlTGlua0NsaWNrSGFuZGxlcixcbiAgdXNlU2VhcmNoUGFyYW1zLFxuICB1c2VTdWJtaXQsXG4gIHVzZUZvcm1BY3Rpb24sXG4gIHVzZUZldGNoZXIsXG4gIHVzZUZldGNoZXJzLF
25114xuICB1c2VTY3JvbGxSZXN0b3JhdGlvbixcbiAgdXNlQmVmb3JlVW5sb2FkLFxuICB1c2VQcm9tcHQsXG4gIHVzZVZpZXdUcmFuc2l0aW9uU3RhdGUsXG4gIFN0YXRpY1JvdXRlcixcbiAgU3RhdGljUm91dGVyUHJvdmlkZXIsXG4gIGNyZWF0ZVN0YXRpY0hhbmRsZXIyLFxuICBjcmVhdGVTdGF0aWNSb3V0ZXJcbn07XG4iLCIvKipcbiAqIHJlYWN0LXJvdXRlciB2Ny45LjNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXCJ1c2UgY2xpZW50XCI7XG5pbXBvcnQge1xuICBkZXNlcmlhbGl6ZUVycm9ycyxcbiAgZ2V0SHlkcmF0aW9uRGF0YVxufSBmcm9tIFwiLi9jaHVuay02NVhKTU1MTy5tanNcIjtcbmltcG9ydCB7XG4gIENSSVRJQ0FMX0NTU19EQVRBX0FUVFJJQlVURSxcbiAgRnJhbWV3b3JrQ29udGV4dCxcbiAgUmVtaXhFcnJvckJvdW5kYXJ5LFxuICBSb3V0ZXJQcm92aWRlcixcbiAgY3JlYXRlQnJvd3Nlckhpc3RvcnksXG4gIGNyZWF0ZUNsaWVudFJvdXRlcyxcbiAgY3JlYXRlQ2xpZW50Um91dGVzV2l0aEhNUlJldmFsaWRhdGlvbk9wdE91dCxcbiAgY3JlYXRlUm91dGVyLFxuICBkZWNvZGVWaWFUdXJib1N0cmVhbSxcbiAgZ2V0UGF0Y2hSb3V0ZXNPbk5hdmlnYXRpb25GdW5jdGlvbixcbiAgZ2V0VHVyYm9TdHJlYW1TaW5nbGVGZXRjaERhdGFTdHJhdGVneSxcbiAgaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzLFxuICBpbnZhcmlhbnQsXG4gIG1hcFJvdXRlUHJvcGVydGllcyxcbiAgdXNlRm9nT0ZXYXJEaXNjb3Zlcnlcbn0gZnJvbSBcIi4vY2h1bmstTklTSFlSSUsubWpzXCI7XG5cbi8vIGxpYi9kb20tZXhwb3J0L2RvbS1yb3V0ZXItcHJvdmlkZXIudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmZ1bmN0aW9uIFJvdXRlclByb3ZpZGVyMihwcm9wcykge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyUHJvdmlkZXIsIHsgZmx1c2hTeW5jOiBSZWFjdERPTS5mbHVzaFN5bmMsIC4uLnByb3BzIH0pO1xufVxuXG4vLyBsaWIvZG9tLWV4cG9ydC9oeWRyYXRlZC1yb3V0ZXIudHN4XG5pbXBvcnQgKiBhcyBSZWFjdDIgZnJvbSBcInJlYW
25114N0XCI7XG52YXIgc3NySW5mbyA9IG51bGw7XG52YXIgcm91dGVyID0gbnVsbDtcbmZ1bmN0aW9uIGluaXRTc3JJbmZvKCkge1xuICBpZiAoIXNzckluZm8gJiYgd2luZG93Ll9fcmVhY3RSb3V0ZXJDb250ZXh0ICYmIHdpbmRvdy5fX3JlYWN0Um91dGVyTWFuaWZlc3QgJiYgd2luZG93Ll9fcmVhY3RSb3V0ZXJSb3V0ZU1vZHVsZXMpIHtcbiAgICBpZiAod2luZG93Ll9fcmVhY3RSb3V0ZXJNYW5pZmVzdC5zcmkgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGltcG9ydE1hcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzY3JpcHRbcnItaW1wb3J0bWFwXVwiKTtcbiAgICAgIGlmIChpbXBvcnRNYXA/LnRleHRDb250ZW50KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgd2luZG93Ll9fcmVhY3RSb3V0ZXJNYW5pZmVzdC5zcmkgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgaW1wb3J0TWFwLnRleHRDb250ZW50XG4gICAgICAgICAgKS5pbnRlZ3JpdHk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgaW1wb3J0IG1hcFwiLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNzckluZm8gPSB7XG4gICAgICBjb250ZXh0OiB3aW5kb3cuX19yZWFjdFJvdXRlckNvbnRleHQsXG4gICAgICBtYW5pZmVzdDogd2luZG93Ll9fcmVhY3RSb3V0ZXJNYW5pZmVzdCxcbiAgICAgIHJvdXRlTW9kdWxlczogd2luZG93Ll9fcmVhY3RSb3V0ZXJSb3V0ZU1vZHVsZXMsXG4gICAgICBzdGF0ZURlY29kaW5nUHJvbWlzZTogdm9pZCAwLFxuICAgICAgcm91dGVyOiB2b2lkIDAsXG4gICAgICByb3V0ZXJJbml0aWFsaXplZDogZmFsc2VcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRlZFJvdXRlcih7XG4gIGdldENvbnRleHRcbn0pIHtcbiAgaW5pdFNzckluZm8oKTtcbiAgaWYgKCFzc3JJbmZvKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJZb3UgbXVzdCBiZSB1c2luZyB0aGUgU1NSIGZlYXR1cmVzIG9mIFJlYWN0IFJvdXRlciBpbiBvcmRlciB0byBza2lwIHBhc3NpbmcgYSBgcm91dGVyYCBwcm9wIHRvIGA8Um91dGVyUHJvdmlkZXI+YFwiXG4gICAgKTtcbiAgfVxuICBsZXQgbG9jYWxTc3JJbmZvID0gc3NySW5mbztcbiAgaWYgKCFzc3JJbmZvLnN0YXRlRGVjb2RpbmdQcm9taXNlKSB7XG4gICAgbGV0IHN0cmVhbSA9IHNzckluZm8uY29udGV4dC5zdHJlYW07XG4gICAgaW52YXJpYW50KHN0cmVhbSwgXCJObyBzdHJlYW0gZm91bmQgZm9yIHNpbmdsZSBmZXRjaCBkZWNvZGluZ1wiKTtcbiAgICBzc3JJbmZvLmNvbnRleHQuc3RyZWFtID0gdm9pZCAwO1xuICAgIHNzckluZm8uc3RhdGVEZWNvZGluZ1Byb21pc2UgPSBkZWNvZGVWaWFUdXJib1N0cmVhbShzdHJlYW0sIHdpbmRvdykudGhlbigodmFsdWUpID0+IHtcbiAgICAgIHNzckluZm8uY29udGV4dC5zdGF0ZSA9IHZhbHVlLnZhbHVlO1xuICAgICAgbG9jYWxTc3JJbmZvLnN0YXRlRGVjb2RpbmdQcm9taXNlLnZhbHVlID0gdHJ1ZTtcbiAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgbG9jYWxTc3JJbmZvLnN0YXRlRGVjb2RpbmdQcm9taXNlLmVycm9yID0gZTtcbiAgICB9KTtcbiAgfVxuICBpZiAoc3NySW5mby5zdGF0ZURlY29kaW5nUHJvbWlzZS5lcnJvcikge1xuICAgIHRocm93IHNzckluZm8uc3RhdGVEZWNvZGluZ1Byb21pc2UuZXJyb3I7XG4gIH1cbiAgaWYgKCFzc3JJbmZvLnN0YXRlRGVjb2RpbmdQcm9taXNlLnZhbHVlKSB7XG4gICAgdGhyb3cgc3NySW5mby5zdGF0ZURlY29kaW5nUHJvbWlzZTtcbiAgfVxuICBsZXQgcm91dGVzID0gY3JlYXRlQ2xpZW50Um91dGVzKFxuICAgIHNzckluZm8ubWFuaWZlc3Qucm91dGVzLFxuICAgIHNzckluZm8ucm91dGVNb2R1bGVzLFxuICAgIHNzckluZm8uY29udGV4dC5zdGF0ZSxcbiAgICBzc3JJbmZvLmNvbnRleHQuc3NyLFxuICAgIHNzckluZm8uY29udGV4dC5pc1NwYU1vZGVcbiAgKTtcbiAgbGV0IGh5ZHJhdGlvbkRhdGEgPSB2b2lkIDA7XG4gIGlmIChzc3JJbmZvLmNvbnRleHQuaXNTcGFNb2RlKSB7XG4gICAgbGV0IHsgbG9hZGVyRGF0YSB9ID0gc3NySW5mby5jb250ZXh0LnN0YXRlO1xuICAgIGlmIChzc3JJbmZvLm1hbmlmZXN0LnJvdXRlcy5yb290Py5oYXNMb2FkZXIgJiYgbG9hZGVyRGF0YSAmJiBcInJvb3RcIiBpbiBsb2FkZXJEYXRhKSB7XG4gICAgICBoeWRyYXRpb25EYXRhID0ge1xuICAgICAgICBsb2FkZXJEYXRhOiB7XG4gICAgICAgICAgcm9vdDogbG9hZGVyRGF0YS5yb290XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGh5ZHJhdGlvbkRhdGEgPSBnZXRIeWRyYXRpb25EYXRhKHtcbiAgICAgIHN0YXRlOiBzc3JJbmZvLmNvbnRleHQuc3RhdGUsXG4gICAgICByb3V0ZXMsXG4gICAgICBnZXRSb3V0ZUluZm86IChyb3V0ZUlkKSA9PiAoe1xuICAgICAgICBjbGllbnRMb2FkZXI6IHNzckluZm8ucm91dGVNb2R1bGVzW3JvdXRlSWRdPy5jbGllbnRMb2FkZXIsXG4gICAgICAgIGhhc0xvYWRlcjogc3NySW5mby5tYW5pZmVzdC5yb3V0ZXNbcm91dGVJZF0/Lmhhc0xvYWRlciA9PT0gdHJ1ZSxcbiAgICAgICAgaGFzSHlkcmF0ZUZhbGxiYWNrOiBzc3JJbmZvLnJvdXRlTW9kdWxlc1tyb3V0ZUlkXT8uSHlkcmF0ZUZhbGxiYWNrICE9IG51bGxcbiAgICAgIH0pLFxuICAgICAgbG9jYXRpb246IHdpbmRvdy5sb2NhdGlvbixcbiAgICAgIGJhc2VuYW1lOiB3aW5kb3cuX19yZWFjdFJvdXRlckNvbnRleHQ/LmJhc2VuYW1lLFxuICAgICAgaXNTcGFNb2RlOiBzc3JJbmZvLmNvbnRleHQuaXNTcGFNb2RlXG4gICAgfSk7XG4gICAgaWYgKGh5ZHJhdGlvbkRhdGEgJiYgaHlkcmF0aW9uRGF0YS5lcnJvcnMpIHtcbiAgICAgIGh5ZHJhdGlvbkRhdGEuZXJyb3JzID0gZGVzZXJpYWxpemVFcnJvcnMoaHlkcmF0aW9uRGF0YS5lcnJvcnMpO1xuICAgIH1cbiAgfVxuICBsZXQgcm91dGVyMiA9IGNyZWF0ZVJvdXRlcih7XG4gICAgcm91dGVzLFxuICAgIGhpc3Rvcnk6IGNyZWF0ZUJyb3dzZXJIaXN0b3J5KCksXG4gICAgYmFzZW5hbWU6IHNzckluZm8uY29udGV4dC5iYXNlbmFtZSxcbiAgICBnZXRDb250ZXh0LFxuICAgIGh5ZHJhdGlvbkRhdGEsXG4gICAgaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzLFxuICAgIG1hcFJvdXRlUHJvcGVydGllcyxcbiAgICBmdXR1cmU6IHtcbiAgICAgIG1pZGRsZXdhcmU6IHNzckluZm8uY29udGV4dC5mdXR1cmUudjhfbWlkZGxld2FyZVxuICAgIH0sXG4gICAgZGF0YVN0cmF0ZWd5OiBnZXRUdXJib1N0cmVhbVNpbmdsZUZldGNoRGF0YVN0cmF0ZWd5KFxuICAgICAgKCkgPT4gcm91dGVyMixcbiAgICAgIHNzckluZm8ubWFuaWZlc3QsXG4gICAgICBzc3JJbmZvLnJvdXRlTW9kdWxlcyxcbiAgICAgIHNzckluZm8uY29udGV4dC5zc3IsXG4gICAgICBzc3JJbmZvLmNvbnRleHQuYmFzZW5hbWVcbiAgICApLFxuICAgIHBhdGNoUm91dGVzT25OYXZpZ2F0aW9uOiBnZXRQYXRjaFJvdXRlc09uTmF2aWdhdGlvbkZ1bmN0aW9uKFxuICAgICAgc3NySW5mby5tYW5pZmVzdCxcbiAgICAgIHNzckluZm8ucm91dGVNb2R1bGVzLFxuICAgICAgc3NySW5mby5jb250ZXh0LnNzcixcbiAgICAgIHNzckluZm8uY29udGV4dC5yb3V0ZURpc2NvdmVyeSxcbiAgICAgIHNzckluZm8uY29udGV4dC5pc1NwYU1vZGUsXG4gICAgICBzc3JJbmZvLmNvbnRleHQuYmFzZW5hbWVcbiAgICApXG4gIH0pO1xuICBzc3JJbmZvLnJvdXRlciA9IHJvdXRlcjI7XG4gIGlmIChyb3V0ZXIyLnN0YXRlLmluaXRpYWxpemVkKSB7XG4gICAgc3NySW5mby5yb3V0ZXJJbml0aWFsaXplZCA9IHRydWU7XG4gICAgcm91dGVyMi5pbml0aWFsaXplKCk7XG4gIH1cbiAgcm91dGVyMi5jcmVhdGVSb3V0ZXNGb3JITVIgPSAvKiBzcGFjZXIgc28gdHMtaWdub3JlIGRvZXMgbm90IGFmZmVjdCB0aGUgcmlnaHQgaGFuZCBvZiB0aGUgYXNzaWdubWVudCAqL1xuICBjcmVhdGVDbGllbnRSb3V0ZXNXaXRoSE1SUmV2YWxpZGF0aW9uT3B0T3V0O1xuICB3aW5kb3cuX19yZWFjdFJvdXRlckRhdGFSb3V0ZXIgPSByb3V0ZXIyO1xuICByZXR1cm4gcm91dGVyMjtcbn1cbmZ1bmN0aW9uIEh5ZHJhdGVkUm91dGVyKHByb3BzKSB7XG4gIGlmICghcm91dGVyKSB7XG4gICAgcm91dGVyID0gY3JlYXRlSHlkcmF0ZWRSb3V0ZXIoe1xuICAgICAgZ2V0Q29udGV4dDogcHJvcHMuZ2V0Q29udGV4dFxuICAgIH0pO1xuICB9XG4gIGxldCBbY3JpdGljYWxDc3MsIHNldENyaXRpY2FsQ3NzXSA9IFJlYWN0Mi51c2VTdGF0ZShcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiID8gc3NySW5mbz8uY29udGV4dC5jcml0aWNhbENzcyA6IHZvaWQgMFxuICApO1xuICBSZWFjdDIudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgICAgc2V0Q3JpdGljYWxDc3Modm9pZCAwKTtcbiAgICB9XG4gI
25114H0sIFtdKTtcbiAgUmVhY3QyLnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIgJiYgY3JpdGljYWxDc3MgPT09IHZvaWQgMCkge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgWyR7Q1JJVElDQUxfQ1NTX0RBVEFfQVRUUklCVVRFfV1gKS5mb3JFYWNoKChlbGVtZW50KSA9PiBlbGVtZW50LnJlbW92ZSgpKTtcbiAgICB9XG4gIH0sIFtjcml0aWNhbENzc10pO1xuICBsZXQgW2xvY2F0aW9uLCBzZXRMb2NhdGlvbl0gPSBSZWFjdDIudXNlU3RhdGUocm91dGVyLnN0YXRlLmxvY2F0aW9uKTtcbiAgUmVhY3QyLnVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNzckluZm8gJiYgc3NySW5mby5yb3V0ZXIgJiYgIXNzckluZm8ucm91dGVySW5pdGlhbGl6ZWQpIHtcbiAgICAgIHNzckluZm8ucm91dGVySW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgc3NySW5mby5yb3V0ZXIuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgfSwgW10pO1xuICBSZWFjdDIudXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc3NySW5mbyAmJiBzc3JJbmZvLnJvdXRlcikge1xuICAgICAgcmV0dXJuIHNzckluZm8ucm91dGVyLnN1YnNjcmliZSgobmV3U3RhdGUpID0+IHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLmxvY2F0aW9uICE9PSBsb2NhdGlvbikge1xuICAgICAgICAgIHNldExvY2F0aW9uKG5ld1N0YXRlLmxvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbbG9jYXRpb25dKTtcbiAgaW52YXJpYW50KHNzckluZm8sIFwic3NySW5mbyB1bmF2YWlsYWJsZSBmb3IgSHlkcmF0ZWRSb3V0ZXJcIik7XG4gIHVzZUZvZ09GV2FyRGlzY292ZXJ5KFxuICAgIHJvdXRlcixcbiAgICBzc3JJbmZvLm1hbmlmZXN0LFxuICAgIHNzckluZm8ucm91dGVNb2R1bGVzLFxuICAgIHNzckluZm8uY29udGV4dC5zc3IsXG4gICAgc3NySW5mby5jb250ZXh0LnJvdXRlRGlzY292ZXJ5LFxuICAgIHNzckluZm8uY29udGV4dC5pc1NwYU1vZGVcbiAgKTtcbiAgcmV0dXJuIChcbiAgICAvLyBUaGlzIGZyYWdtZW50IGlzIGltcG9ydGFudCB0byBlbnN1cmUgd2UgbWF0Y2ggdGhlIDxTZXJ2ZXJSb3V0ZXI+IEpTWFxuICAgIC8vIHN0cnVjdHVyZSBzbyB0aGF0IHVzZUlkIHZhbHVlcyBoeWRyYXRlIGNvcnJlY3RseVxuICAgIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChSZWFjdDIuRnJhZ21lbnQsIG51bGwsIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChcbiAgICAgIEZyYW1ld29ya0NvbnRleHQuUHJvdmlkZXIsXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgbWFuaWZlc3Q6IHNzckluZm8ubWFuaWZlc3QsXG4gICAgICAgICAgcm91dGVNb2R1bGVzOiBzc3JJbmZvLnJvdXRlTW9kdWxlcyxcbiAgICAgICAgICBmdXR1cmU6IHNzckluZm8uY29udGV4dC5mdXR1cmUsXG4gICAgICAgICAgY3JpdGljYWxDc3MsXG4gICAgICAgICAgc3NyOiBzc3JJbmZvLmNvbnRleHQuc3NyLFxuICAgICAgICAgIGlzU3BhTW9kZTogc3NySW5mby5jb250ZXh0LmlzU3BhTW9kZSxcbiAgICAgICAgICByb3V0ZURpc2NvdmVyeTogc3NySW5mby5jb250ZXh0LnJvdXRlRGlzY292ZXJ5XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvKiBAX19QVVJFX18gKi8gUmVhY3QyLmNyZWF0ZUVsZW1lbnQoUmVtaXhFcnJvckJvdW5kYXJ5LCB7IGxvY2F0aW9uIH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChcbiAgICAgICAgUm91dGVyUHJvdmlkZXIyLFxuICAgICAgICB7XG4gICAgICAgICAgcm91dGVyLFxuICAgICAgICAgIHVuc3RhYmxlX29uRXJyb3I6IHByb3BzLnVuc3RhYmxlX29uRXJyb3JcbiAgICAgICAgfVxuICAgICAgKSlcbiAgICApLCAvKiBAX19QVVJFX18gKi8gUmVhY3QyLmNyZWF0ZUVsZW1lbnQoUmVhY3QyLkZyYWdtZW50LCBudWxsKSlcbiAgKTtcbn1cbmV4cG9ydCB7XG4gIEh5ZHJhdGVkUm91dGVyLFxuICBSb3V0ZXJQcm92aWRlcjIgYXMgUm91dGVyUHJvdmlkZXJcbn07XG4iLCJjb25zdCBjcmVhdGVTdG9yZUltcGwgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgbGV0IHN0YXRlO1xuICBjb25zdCBsaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBzZXRTdGF0ZSA9IChwYXJ0aWFsLCByZXBsYWNlKSA9PiB7XG4gICAgY29uc3QgbmV4dFN0YXRlID0gdHlwZW9mIHBhcnRpYWwgPT09IFwiZnVuY3Rpb25cIiA/IHBhcnRpYWwoc3RhdGUpIDogcGFydGlhbDtcbiAgICBpZiAoIU9iamVjdC5pcyhuZXh0U3RhdGUsIHN0YXRlKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNTdGF0ZSA9IHN0YXRlO1xuICAgICAgc3RhdGUgPSAocmVwbGFjZSAhPSBudWxsID8gcmVwbGFjZSA6IHR5cGVvZiBuZXh0U3RhdGUgIT09IFwib2JqZWN0XCIgfHwgbmV4dFN0YXRlID09PSBudWxsKSA/IG5leHRTdGF0ZSA6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXh0U3RhdGUpO1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihzdGF0ZSwgcHJldmlvdXNTdGF0ZSkpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ2V0U3RhdGUgPSAoKSA9PiBzdGF0ZTtcbiAgY29uc3QgZ2V0SW5pdGlhbFN0YXRlID0gKCkgPT4gaW5pdGlhbFN0YXRlO1xuICBjb25zdCBzdWJzY3JpYmUgPSAobGlzdGVuZXIpID0+IHtcbiAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gIH07XG4gIGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW0RFUFJFQ0FURURdIFR
25114oZSBgZGVzdHJveWAgbWV0aG9kIHdpbGwgYmUgdW5zdXBwb3J0ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gSW5zdGVhZCB1c2UgdW5zdWJzY3JpYmUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgc3Vic2NyaWJlLiBFdmVyeXRoaW5nIHdpbGwgYmUgZ2FyYmFnZS1jb2xsZWN0ZWQgaWYgc3RvcmUgaXMgZ2FyYmFnZS1jb2xsZWN0ZWQuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGxpc3RlbmVycy5jbGVhcigpO1xuICB9O1xuICBjb25zdCBhcGkgPSB7IHNldFN0YXRlLCBnZXRTdGF0ZSwgZ2V0SW5pdGlhbFN0YXRlLCBzdWJzY3JpYmUsIGRlc3Ryb3kgfTtcbiAgY29uc3QgaW5pdGlhbFN0YXRlID0gc3RhdGUgPSBjcmVhdGVTdGF0ZShzZXRTdGF0ZSwgZ2V0U3RhdGUsIGFwaSk7XG4gIHJldHVybiBhcGk7XG59O1xuY29uc3QgY3JlYXRlU3RvcmUgPSAoY3JlYXRlU3RhdGUpID0+IGNyZWF0ZVN0YXRlID8gY3JlYXRlU3RvcmVJbXBsKGNyZWF0ZVN0YXRlKSA6IGNyZWF0ZVN0b3JlSW1wbDtcbnZhciB2YW5pbGxhID0gKGNyZWF0ZVN0YXRlKSA9PiB7XG4gIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiW0RFUFJFQ0FURURdIERlZmF1bHQgZXhwb3J0IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQgdXNlIGltcG9ydCB7IGNyZWF0ZVN0b3JlIH0gZnJvbSAnenVzdGFuZC92YW5pbGxhJy5cIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVN0b3JlKGNyZWF0ZVN0YXRlKTtcbn07XG5cbmV4cG9ydCB7IGNyZWF0ZVN0b3JlLCB2YW5pbGxhIGFzIGRlZmF1bHQgfTtcbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0ucHJvZHVjdGlvbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgUmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiAoeCA9PT0geSAmJiAoMCAhPT0geCB8fCAxIC8geCA9PT0gMSAvIHkpKSB8fCAoeCAhPT0geCAmJiB5ICE9PSB5KTtcbn1cbnZhciBvYmplY3RJcyA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIE9iamVjdC5pcyA/IE9iamVjdC5pcyA6IGlzLFxuICB1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlLFxuICB1c2VFZmZlY3QgPSBSZWFjdC51c2VFZmZlY3QsXG4gIHVzZUxheW91dEVmZmVjdCA9IFJlYWN0LnVzZUxheW91dEVmZmVjdCxcbiAgdXNlRGVidWdWYWx1ZSA9IFJlYWN0LnVzZURlYnVnVmFsdWU7XG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQyKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpIHtcbiAgdmFyIHZhbHVlID0gZ2V0U25hcHNob3QoKSxcbiAgICBfdXNlU3RhdGUgPSB1c2VTdGF0ZSh7IGluc3Q6IHsgdmFsdWU6IHZhbHVlLCBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QgfSB9KSxcbiAgICBpbnN0ID0gX3VzZVN0YXRlWzBdLmluc3QsXG4gICAgZm9yY2VVcGRhdGUgPSBfdXNlU3RhdGVbMV07XG4gIHVzZUxheW91dEVmZmVjdChcbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBpbnN0LnZhbHVlID0gdmFsdWU7XG4gICAgICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7XG4gICAgICBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpICYmIGZvcmNlVXBkYXRlKHsgaW5zdDogaW5zdCB9KTtcbiAgICB9LFxuICAgIFtzdWJzY3JpYmUsIHZhbHVlLCBnZXRTbmFwc2hvdF1cbiAgKTtcbiAgdXNlRWZmZWN0KFxuICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkgJiYgZm9yY2VVcGRhdGUoeyBpbnN0OiBpbnN0IH0pO1xuICAgICAgcmV0dXJuIHN1YnNjcmliZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkgJiYgZm9yY2VVcGRhdGUoeyBpbnN0OiBpbnN0IH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBbc3Vic2NyaWJlXVxuICApO1xuICB1c2VEZWJ1Z1ZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSB7XG4gIHZhciBsYXRlc3RHZXRTbmFwc2hvdCA9IGluc3QuZ2V0U25hcHNob3Q7XG4gIGluc3QgPSBpbnN0LnZhbHVlO1xuICB0cnkge1xuICAgIHZhciBuZXh0VmFsdWUgPSBsYXRlc3RHZXRTbmFwc2hvdCgpO1xuICAgIHJldHVybiAhb2JqZWN0SXMoaW5zdCwgbmV4dFZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gITA7XG4gIH1cbn1cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlJDEoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCkge1xuICByZXR1cm4gZ2V0U25hcHNob3QoKTtcbn1cbnZhciBzaGltID1cbiAgXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIHdpbmRvdyB8fFxuICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2Ygd2luZG93LmRvY3VtZW50IHx8XG4gIFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudFxuICAgID8gdXNlU3luY0V4dGVybmFsU3RvcmUkMVxuICAgIDogdXNlU3luY0V4dGVybmFsU3RvcmUkMjtcbmV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmUgPVxuICB2b2lkIDAgIT09IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlID8gUmVhY3QudXNlU3luY0V4dGVybmFsU3RvcmUgOiBzaGltO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0uZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5wcm9kdWN0aW9uLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aG
25114VcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcbnZhciBSZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKSxcbiAgc2hpbSA9IHJlcXVpcmUoXCJ1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltXCIpO1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4gKHggPT09IHkgJiYgKDAgIT09IHggfHwgMSAvIHggPT09IDEgLyB5KSkgfHwgKHggIT09IHggJiYgeSAhPT0geSk7XG59XG52YXIgb2JqZWN0SXMgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBPYmplY3QuaXMgPyBPYmplY3QuaXMgOiBpcyxcbiAgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBzaGltLnVzZVN5bmNFeHRlcm5hbFN0b3JlLFxuICB1c2VSZWYgPSBSZWFjdC51c2VSZWYsXG4gIHVzZUVmZmVjdCA9IFJlYWN0LnVzZUVmZmVjdCxcbiAgdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8sXG4gIHVzZURlYnVnVmFsdWUgPSBSZWFjdC51c2VEZWJ1Z1ZhbHVlO1xuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IGZ1bmN0aW9uIChcbiAgc3Vic2NyaWJlLFxuICBnZXRTbmFwc2hvdCxcbiAgZ2V0U2VydmVyU25hcHNob3QsXG4gIHNlbGVjdG9yLFxuICBpc0VxdWFsXG4pIHtcbiAgdmFyIGluc3RSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGlmIChudWxsID09PSBpbnN0UmVmLmN1cnJlbnQpIHtcbiAgICB2YXIgaW5zdCA9IHsgaGFzVmFsdWU6ICExLCB2YWx1ZTogbnVsbCB9O1xuICAgIGluc3RSZWYuY3VycmVudCA9IGluc3Q7XG4gIH0gZWxzZSBpbnN0ID0gaW5zdFJlZi5jdXJyZW50O1xuICBpbnN0UmVmID0gdXNlTWVtbyhcbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBtZW1vaXplZFNlbGVjdG9yKG5leHRTbmFwc2hvdCkge1xuICAgICAgICBpZiAoIWhhc01lbW8pIHtcbiAgICAgICAgICBoYXNNZW1vID0gITA7XG4gICAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcbiAgICAgICAgICBuZXh0U25hcHNob3QgPSBzZWxlY3RvcihuZXh0U25hcHNob3QpO1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IGlzRXF1YWwgJiYgaW5zdC5oYXNWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBpbnN0LnZhbHVlO1xuICAgICAgICAgICAgaWYgKGlzRXF1YWwoY3VycmVudFNlbGVjdGlvbiwgbmV4dFNuYXBzaG90KSlcbiAgICAgICAgICAgICAgcmV0dXJuIChtZW1vaXplZFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKG1lbW9pemVkU2VsZWN0aW9uID0gbmV4dFNuYXBzaG90KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50U2VsZWN0aW9uID0gbWVtb2l6ZWRTZWxlY3Rpb247XG4gICAgICAgIGlmIChvYmplY3RJcyhtZW1vaXplZFNuYXBzaG90LCBuZXh0U25hcHNob3QpKSByZXR1cm4gY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgdmFyIG5leHRTZWxlY3Rpb24gPSBzZWxlY3RvcihuZXh0U25hcHNob3QpO1xuICAgICAgICBpZiAodm9pZCAwICE9PSBpc0VxdWFsICYmIGlzRXF1YWwoY3VycmVudFNlbGVjdGlvbiwgbmV4dFNlbGVjdGlvbikpXG4gICAgICAgICAgcmV0dXJuIChtZW1vaXplZFNuYXBzaG90ID0gbmV4dFNuYXBzaG90KSwgY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcbiAgICAgICAgcmV0dXJuIChtZW1vaXplZFNlbGVjdGlvbiA9IG5leHRTZWxlY3Rpb24pO1xuICAgICAgfVxuICAgICAgdmFyIGhhc01lbW8gPSAhMSxcbiAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCxcbiAgICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24sXG4gICAgICAgIG1heWJlR2V0U2VydmVyU25hcHNob3QgPVxuICAgICAgICAgIHZvaWQgMCA9PT0gZ2V0U2VydmVyU25hcHNob3QgPyBudWxsIDogZ2V0U2VydmVyU25hcHNob3Q7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbW9pemVkU2VsZWN0b3IoZ2V0U25hcHNob3QoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIG51bGwgPT09IG1heWJlR2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgICA/IHZvaWQgMFxuICAgICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihtYXliZUdldFNlcnZlclNuYXBzaG90KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgXTtcbiAgICB9LFxuICAgIFtnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QsIHNlbGVjdG9yLCBpc0VxdWFsXVxuICApO1xuICB2YXIgdmFsdWUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGluc3RSZWZbMF0sIGluc3RSZWZbMV0pO1xuICB1c2VFZmZlY3QoXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgaW5zdC5oYXNWYWx1ZSA9ICEwO1xuICAgICAgaW5zdC52YWx1ZSA9IHZhbHVlO1xuICAgIH0sXG4gICAgW3ZhbHVlXVxuICApO1xuICB1c2VEZWJ1Z1ZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlU3RvcmUgfSBmcm9tICd6dXN0YW5kL3ZhbmlsbGEnO1xuZXhwb3J0ICogZnJvbSAnenVzdGFuZC92YW5pbGxhJztcbmltcG9ydCBSZWFjdEV4cG9ydHMgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZVN5bmNFeHRlcm5hbFN0b3JlRXhwb3J0cyBmcm9tICd1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL3dpdGgtc2VsZWN0b3IuanMnO1xuXG5jb25zdCB7IHVzZURlYnVnVmFsdWUgfSA9IFJlYWN0RXhwb3J0cztcbmNvbnN0IHsgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgfSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlRXhwb3J0cztcbmxldCBkaWRXYXJuQWJvdXRFcXVhbGl0eUZuID0gZmFsc2U7XG5jb25zdCBpZGVudGl0eSA9IChhcmcpID0+IGFyZztcbmZ1bmN0aW9uIHVzZVN0b3JlKGFwaSwgc2VsZWN0b3IgPSBpZGVudGl0eSwgZXF1YWxpdHlGbikge1xuICBpZiAoKGltcG9ydC5tZXRhLmVudiA/IGltcG9ydC5tZXRhLmVudi5NT0RFIDogdm9pZCAwKSAhPT0gXCJwcm9k
25114dWN0aW9uXCIgJiYgZXF1YWxpdHlGbiAmJiAhZGlkV2FybkFib3V0RXF1YWxpdHlGbikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiW0RFUFJFQ0FURURdIFVzZSBgY3JlYXRlV2l0aEVxdWFsaXR5Rm5gIGluc3RlYWQgb2YgYGNyZWF0ZWAgb3IgdXNlIGB1c2VTdG9yZVdpdGhFcXVhbGl0eUZuYCBpbnN0ZWFkIG9mIGB1c2VTdG9yZWAuIFRoZXkgY2FuIGJlIGltcG9ydGVkIGZyb20gJ3p1c3RhbmQvdHJhZGl0aW9uYWwnLiBodHRwczovL2dpdGh1Yi5jb20vcG1uZHJzL3p1c3RhbmQvZGlzY3Vzc2lvbnMvMTkzN1wiXG4gICAgKTtcbiAgICBkaWRXYXJuQWJvdXRFcXVhbGl0eUZuID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBzbGljZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKFxuICAgIGFwaS5zdWJzY3JpYmUsXG4gICAgYXBpLmdldFN0YXRlLFxuICAgIGFwaS5nZXRTZXJ2ZXJTdGF0ZSB8fCBhcGkuZ2V0SW5pdGlhbFN0YXRlLFxuICAgIHNlbGVjdG9yLFxuICAgIGVxdWFsaXR5Rm5cbiAgKTtcbiAgdXNlRGVidWdWYWx1ZShzbGljZSk7XG4gIHJldHVybiBzbGljZTtcbn1cbmNvbnN0IGNyZWF0ZUltcGwgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiICYmIHR5cGVvZiBjcmVhdGVTdGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbREVQUkVDQVRFRF0gUGFzc2luZyBhIHZhbmlsbGEgc3RvcmUgd2lsbCBiZSB1bnN1cHBvcnRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBJbnN0ZWFkIHVzZSBgaW1wb3J0IHsgdXNlU3RvcmUgfSBmcm9tICd6dXN0YW5kJ2AuXCJcbiAgICApO1xuICB9XG4gIGNvbnN0IGFwaSA9IHR5cGVvZiBjcmVhdGVTdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gY3JlYXRlU3RvcmUoY3JlYXRlU3RhdGUpIDogY3JlYXRlU3RhdGU7XG4gIGNvbnN0IHVzZUJvdW5kU3RvcmUgPSAoc2VsZWN0b3IsIGVxdWFsaXR5Rm4pID0+IHVzZVN0b3JlKGFwaSwgc2VsZWN0b3IsIGVxdWFsaXR5Rm4pO1xuICBPYmplY3QuYXNzaWduKHVzZUJvdW5kU3RvcmUsIGFwaSk7XG4gIHJldHVybiB1c2VCb3VuZFN0b3JlO1xufTtcbmNvbnN0IGNyZWF0ZSA9IChjcmVhdGVTdGF0ZSkgPT4gY3JlYXRlU3RhdGUgPyBjcmVhdGVJbXBsKGNyZWF0ZVN0YXRlKSA6IGNyZWF0ZUltcGw7XG52YXIgcmVhY3QgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbREVQUkVDQVRFRF0gRGVmYXVsdCBleHBvcnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCB1c2UgYGltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3p1c3RhbmQnYC5cIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZShjcmVhdGVTdGF0ZSk7XG59O1xuXG5leHBvcnQgeyBjcmVhdGUsIHJlYWN0IGFzIGRlZmF1bHQsIHVzZVN0b3JlIH07XG4iLCJjb25zdCByZWR1eEltcGwgPSAocmVkdWNlciwgaW5pdGlhbCkgPT4gKHNldCwgX2dldCwgYXBpKSA9PiB7XG4gIGFwaS5kaXNwYXRjaCA9IChhY3Rpb24pID0+IHtcbiAgICBzZXQoKHN0YXRlKSA9PiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pLCBmYWxzZSwgYWN0aW9uKTtcbiAgICByZXR1cm4gYWN0aW9uO1xuICB9O1xuICBhcGkuZGlzcGF0Y2hGcm9tRGV2dG9vbHMgPSB0cnVlO1xuICByZXR1cm4geyBkaXNwYXRjaDogKC4uLmEpID0+IGFwaS5kaXNwYXRjaCguLi5hKSwgLi4uaW5pdGlhbCB9O1xufTtcbmNvbnN0IHJlZHV4ID0gcmVkdXhJbXBsO1xuXG5jb25zdCB0cmFja2VkQ29ubmVjdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuY29uc3QgZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZSA9IChuYW1lKSA9PiB7XG4gIGNvbnN0IGFwaSA9IHRyYWNrZWRDb25uZWN0aW9ucy5nZXQobmFtZSk7XG4gIGlmICghYXBpKSByZXR1cm4ge307XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVud
25114HJpZXMoYXBpLnN0b3JlcykubWFwKChba2V5LCBhcGkyXSkgPT4gW2tleSwgYXBpMi5nZXRTdGF0ZSgpXSlcbiAgKTtcbn07XG5jb25zdCBleHRyYWN0Q29ubmVjdGlvbkluZm9ybWF0aW9uID0gKHN0b3JlLCBleHRlbnNpb25Db25uZWN0b3IsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJ1bnRyYWNrZWRcIixcbiAgICAgIGNvbm5lY3Rpb246IGV4dGVuc2lvbkNvbm5lY3Rvci5jb25uZWN0KG9wdGlvbnMpXG4gICAgfTtcbiAgfVxuICBjb25zdCBleGlzdGluZ0Nvbm5lY3Rpb24gPSB0cmFja2VkQ29ubmVjdGlvbnMuZ2V0KG9wdGlvbnMubmFtZSk7XG4gIGlmIChleGlzdGluZ0Nvbm5lY3Rpb24pIHtcbiAgICByZXR1cm4geyB0eXBlOiBcInRyYWNrZWRcIiwgc3RvcmUsIC4uLmV4aXN0aW5nQ29ubmVjdGlvbiB9O1xuICB9XG4gIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSB7XG4gICAgY29ubmVjdGlvbjogZXh0ZW5zaW9uQ29ubmVjdG9yLmNvbm5lY3Qob3B0aW9ucyksXG4gICAgc3RvcmVzOiB7fVxuICB9O1xuICB0cmFja2VkQ29ubmVjdGlvbnMuc2V0KG9wdGlvbnMubmFtZSwgbmV3Q29ubmVjdGlvbik7XG4gIHJldHVybiB7IHR5cGU6IFwidHJhY2tlZFwiLCBzdG9yZSwgLi4ubmV3Q29ubmVjdGlvbiB9O1xufTtcbmNvbnN0IGRldnRvb2xzSW1wbCA9IChmbiwgZGV2dG9vbHNPcHRpb25zID0ge30pID0+IChzZXQsIGdldCwgYXBpKSA9PiB7XG4gIGNvbnN0IHsgZW5hYmxlZCwgYW5vbnltb3VzQWN0aW9uVHlwZSwgc3RvcmUsIC4uLm9wdGlvbnMgfSA9IGRldnRvb2xzT3B0aW9ucztcbiAgbGV0IGV4dGVuc2lvbkNvbm5lY3RvcjtcbiAgdHJ5IHtcbiAgICBleHRlbnNpb25Db25uZWN0b3IgPSAoZW5hYmxlZCAhPSBudWxsID8gZW5hYmxlZCA6IChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXztcbiAgfSBjYXRjaCAoX2UpIHtcbiAgfVxuICBpZiAoIWV4dGVuc2lvbkNvbm5lY3Rvcikge1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIiAmJiBlbmFibGVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW3p1c3RhbmQgZGV2dG9vbHMgbWlkZGxld2FyZV0gUGxlYXNlIGluc3RhbGwvZW5hYmxlIFJlZHV4IGRldnRvb2xzIGV4dGVuc2lvblwiXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZm4oc2V0LCBnZXQsIGFwaSk7XG4gIH1cbiAgY29uc3QgeyBjb25uZWN0aW9uLCAuLi5jb25uZWN0aW9uSW5mb3JtYXRpb24gfSA9IGV4dHJhY3RDb25uZWN0aW9uSW5mb3JtYXRpb24oc3RvcmUsIGV4dGVuc2lvbkNvbm5lY3Rvciwgb3B0aW9ucyk7XG4gIGxldCBpc1JlY29yZGluZyA9IHRydWU7XG4gIGFwaS5zZXRTdGF0ZSA9IChzdGF0ZSwgcmVwbGFjZSwgbmFtZU9yQWN0aW9uKSA9PiB7XG4gICAgY29uc3QgciA9IHNldChzdGF0ZSwgcmVwbGFjZSk7XG4gICAgaWYgKCFpc1JlY29yZGluZykgcmV0dXJuIHI7XG4gICAgY29uc3QgYWN0aW9uID0gbmFtZU9yQWN0aW9uID09PSB2b2lkIDAgPyB7IHR5cGU6IGFub255bW91c0FjdGlvblR5cGUgfHwgXCJhbm9ueW1vdXNcIiB9IDogdHlwZW9mIG5hbWVPckFjdGlvbiA9PT0gXCJzdHJpbmdcIiA/IHsgdHlwZTogbmFtZU9yQWN0aW9uIH0gOiBuYW1lT3JBY3Rpb247XG4gICAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICAgIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uc2VuZChhY3Rpb24sIGdldCgpKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cbiAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLnNlbmQoXG4gICAgICB7XG4gICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgdHlwZTogYCR7c3RvcmV9LyR7YWN0aW9uLnR5cGV9YFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLi4uZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZShvcHRpb25zLm5hbWUpLFxuICAgICAgICBbc3RvcmVdOiBhcGkuZ2V0U3RhdGUoKVxuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIHI7XG4gIH07XG4gIGNvbnN0IHNldFN0YXRlRnJvbURldnRvb2xzID0gKC4uLmEpID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbElzUmVjb3JkaW5nID0gaXNSZWNvcmRpbmc7XG4gICAgaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICBzZXQoLi4uYSk7XG4gICAgaXNSZWNvcmRpbmcgPSBvcmlnaW5hbElzUmVjb3JkaW5nO1xuICB9O1xuICBjb25zdCBpbml0aWFsU3RhdGUgPSBmbihhcGkuc2V0U3RhdGUsIGdldCwgYXBpKTtcbiAgaWYgKGNvbm5lY3Rpb25JbmZvcm1hdGlvbi50eXBlID09PSBcInVudHJhY2tlZFwiKSB7XG4gICAgY29ubmVjdGlvbiA9PSBudWxsID8gdm9pZCAwIDogY29ubmVjdGlvbi5pbml0KGluaXRpYWxTdGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgY29ubmVjdGlvbkluZm9ybWF0aW9uLnN0b3Jlc1tjb25uZWN0aW9uSW5mb3JtYXRpb24uc3RvcmVdID0gYXBpO1xuICAgIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uaW5pdChcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVud
25114HJpZXMoY29ubmVjdGlvbkluZm9ybWF0aW9uLnN0b3JlcykubWFwKChba2V5LCBzdG9yZTJdKSA9PiBbXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGtleSA9PT0gY29ubmVjdGlvbkluZm9ybWF0aW9uLnN0b3JlID8gaW5pdGlhbFN0YXRlIDogc3RvcmUyLmdldFN0YXRlKClcbiAgICAgICAgXSlcbiAgICAgIClcbiAgICApO1xuICB9XG4gIGlmIChhcGkuZGlzcGF0Y2hGcm9tRGV2dG9vbHMgJiYgdHlwZW9mIGFwaS5kaXNwYXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbGV0IGRpZFdhcm5BYm91dFJlc2VydmVkQWN0aW9uVHlwZSA9IGZhbHNlO1xuICAgIGNvbnN0IG9yaWdpbmFsRGlzcGF0Y2ggPSBhcGkuZGlzcGF0Y2g7XG4gICAgYXBpLmRpc3BhdGNoID0gKC4uLmEpID0+IHtcbiAgICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIiAmJiBhWzBdLnR5cGUgPT09IFwiX19zZXRTdGF0ZVwiICYmICFkaWRXYXJuQWJvdXRSZXNlcnZlZEFjdGlvblR5cGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdbenVzdGFuZCBkZXZ0b29scyBtaWRkbGV3YXJlXSBcIl9fc2V0U3RhdGVcIiBhY3Rpb24gdHlwZSBpcyByZXNlcnZlZCB0byBzZXQgc3RhdGUgZnJvbSB0aGUgZGV2dG9vbHMuIEF2b2lkIHVzaW5nIGl0LidcbiAgICAgICAgKTtcbiAgICAgICAgZGlkV2FybkFib3V0UmVzZXJ2ZWRBY3Rpb25UeXBlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsRGlzcGF0Y2goLi4uYSk7XG4gICAgfTtcbiAgfVxuICBjb25uZWN0aW9uLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgY2FzZSBcIkFDVElPTlwiOlxuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UucGF5bG9hZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlt6dXN0YW5kIGRldnRvb2xzIG1pZGRsZXdhcmVdIFVuc3VwcG9ydGVkIGFjdGlvbiBmb3JtYXRcIlxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZUpzb25UaGVuKFxuICAgICAgICAgIG1lc3NhZ2UucGF5bG9hZCxcbiAgICAgICAgICAoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09IFwiX19zZXRTdGF0ZVwiKSB7XG4gICAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoYWN0aW9uLnN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGFjdGlvbi5zdGF0ZSkubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICAgICAgW3p1c3RhbmQgZGV2dG9vbHMgbWlkZGxld2FyZV0gVW5zdXBwb3J0ZWQgX19zZXRTdGF0ZSBhY3Rpb24gZm9ybWF0LiBcbiAgICAgICAgICAgICAgICAgICAgV2hlbiB1c2luZyAnc3RvcmUnIG9wdGlvbiBpbiBkZXZ0b29scygpLCB0aGUgJ3N0YXRlJyBzaG91bGQgaGF2ZSBvbmx5IG9uZSBrZXksIHdoaWNoIGlzIGEgdmFsdWUgb2YgJ3N0b3JlJyB0aGF0IHdhcyBwYXNzZWQgaW4gZGV2dG9vbHMoKSxcbiAgICAgICAgICAgICAgICAgICAgYW5kIHZhbHVlIG9mIHRoaXMgb25seSBrZXkgc2hvdWxkIGJlIGEgc3RhdGUgb2JqZWN0LiBFeGFtcGxlOiB7IFwidHlwZVwiOiBcIl9fc2V0U3RhdGVcIiwgXCJzdGF0ZVwiOiB7IFwiYWJjMTIzU3RvcmVcIjogeyBcImZvb1wiOiBcImJhclwiIH0gfSB9XG4gICAgICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXRlRnJvbURldnRvb2xzID0gYWN0aW9uLnN0YXRlW3N0b3JlXTtcbiAgICAgICAgICAgICAgaWYgKHN0YXRlRnJvbURldnRvb2xzID09PSB2b2lkIDAgfHwgc3RhdGVGcm9tRGV2dG9vbHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGFwaS5nZXRTdGF0ZSgpKSAhPT0gSlNPTi5zdHJpbmdpZnkoc3RhdGVGcm9tRGV2dG9vbHMpKSB7XG4gICAgICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoc3RhdGVGcm9tRGV2dG9vbHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYXBpLmRpc3BhdGNoRnJvbURldnRvb2xzKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFwaS5kaXNwYXRjaCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgICAgICAgICBhcGkuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiRElTUEFUQ0hcIjpcbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLnBheWxvYWQudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJSRVNFVFwiOlxuICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoYXBpLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uaW5pdChnZXRUcmFja2VkQ29ubmVjdGlvblN0YXRlKG9wdGlvbnMubmFtZSkpO1xuICAgICAgICAgIGNhc2UgXCJDT01NSVRcIjpcbiAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uaW5pdChhcGkuZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgICAgI
25114HJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZShvcHRpb25zLm5hbWUpKTtcbiAgICAgICAgICBjYXNlIFwiUk9MTEJBQ0tcIjpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUpzb25UaGVuKG1lc3NhZ2Uuc3RhdGUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoc3RvcmUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKHN0YXRlKTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoYXBpLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZVtzdG9yZV0pO1xuICAgICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZShvcHRpb25zLm5hbWUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGNhc2UgXCJKVU1QX1RPX1NUQVRFXCI6XG4gICAgICAgICAgY2FzZSBcIkpVTVBfVE9fQUNUSU9OXCI6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VKc29uVGhlbihtZXNzYWdlLnN0YXRlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShhcGkuZ2V0U3RhdGUoKSkgIT09IEpTT04uc3RyaW5naWZ5KHN0YXRlW3N0b3JlXSkpIHtcbiAgICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZVtzdG9yZV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBjYXNlIFwiSU1QT1JUX1NUQVRFXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmV4dExpZnRlZFN0YXRlIH0gPSBtZXNzYWdlLnBheWxvYWQ7XG4gICAgICAgICAgICBjb25zdCBsYXN0Q29tcHV0ZWRTdGF0ZSA9IChfYSA9IG5leHRMaWZ0ZWRTdGF0ZS5jb21wdXRlZFN0YXRlcy5zbGljZSgtMSlbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfYS5zdGF0ZTtcbiAgICAgICAgICAgIGlmICghbGFzdENvbXB1dGVkU3RhdGUpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKGxhc3RDb21wdXRlZFN0YXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKGxhc3RDb21wdXRlZFN0YXRlW3N0b3JlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLnNlbmQoXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIC8vIEZJWE1FIG5vLWFueVxuICAgICAgICAgICAgICBuZXh0TGlmdGVkU3RhdGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJQQVVTRV9SRUNPUkRJTkdcIjpcbiAgICAgICAgICAgIHJldHVybiBpc1JlY29yZGluZyA9ICFpc1JlY29yZGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGluaXRpYWxTdGF0ZTtcbn07XG5jb25zdCBkZXZ0b29scyA9IGRldnRvb2xzSW1wbDtcbmNvbnN0IHBhcnNlSnNvblRoZW4gPSAoc3RyaW5naWZpZWQsIGYpID0+IHtcbiAgbGV0IHBhcnNlZDtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHN0cmluZ2lmaWVkKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIlt6dXN0YW5kIGRldnRvb2xzIG1pZGRsZXdhcmVdIENvdWxkIG5vdCBwYXJzZSB0aGUgcmVjZWl2ZWQganNvblwiLFxuICAgICAgZVxuICAgICk7XG4gIH1cbiAgaWYgKHBhcnNlZCAhPT0gdm9pZCAwKSBmKHBhcnNlZCk7XG59O1xuXG5jb25zdCBzdWJzY3JpYmVXaXRoU2VsZWN0b3JJbXBsID0gKGZuKSA9PiAoc2V0LCBnZXQsIGFwaSkgPT4ge1xuICBjb25zdCBvcmlnU3Vic2NyaWJlID0gYXBpLnN1YnNjcmliZTtcbiAgYXBpLnN1YnNjcmliZSA9IChzZWxlY3Rvciwgb3B0TGlzdGVuZXIsIG9wdGlvbnMpID0+IHtcbiAgICBsZXQgbGlzdGVuZXIgPSBzZWxlY3RvcjtcbiAgICBpZiAob3B0TGlzdGVuZXIpIHtcbiAgICAgIGNvbnN0IGVxdWFsaXR5Rm4gPSAob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5lcXVhbGl0eUZuKSB8fCBPYmplY3QuaXM7XG4gICAgICBsZXQgY3VycmVudFNsaWNlID0gc2VsZWN0b3IoYXBpLmdldFN0YXRlKCkpO1xuICAgICAgbGlzdGVuZXIgPSAoc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgbmV4dFNsaWNlID0gc2VsZWN0b3Ioc3RhdGUpO1xuICAgICAgICBpZiAoIWVxdWFsaXR5Rm4oY3VycmVudFNsaWNlLCBuZXh0U2xpY2UpKSB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNTbGljZSA9IGN1cnJlbnRTbGljZTtcbiAgICAgICAgICBvcHRMaXN0ZW5lcihjdXJyZW50U2xpY2UgPSBuZXh0U2xpY2UsIHByZXZpb3VzU2xpY2UpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIG9wdExpc3RlbmVyKGN1cnJlbnRTbGljZSwgY3VycmVudFNsaWNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yaWdTdWJzY3JpYmUobGlzdGVuZXIpO1xuICB9O1xuICBjb25zdCBpbml0aWFsU3RhdGUgPSBmbihzZXQsIGdldCwgYXBpKTtcbiAgcmV0dXJuIGluaXRpYWxTdGF0ZTtcbn07XG5jb25zdCBzdWJzY3JpYmVXaXRoU2VsZWN0b3IgPSBzdWJzY3JpYmVXaXRoU2VsZWN0b3JJbXBsO1xuXG5jb25zdCBjb21iaW5lID0gKGluaXRpYWxTdGF0ZSwgY3JlYXRlKSA9PiAoLi4uYSkgPT4gT2JqZWN0LmFzc2lnbih7fSwgaW5pdGlhbFN0YXRlLCBjcmVhdGUoLi4uYSk
25114pO1xuXG5mdW5jdGlvbiBjcmVhdGVKU09OU3RvcmFnZShnZXRTdG9yYWdlLCBvcHRpb25zKSB7XG4gIGxldCBzdG9yYWdlO1xuICB0cnkge1xuICAgIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKCk7XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBlcnNpc3RTdG9yYWdlID0ge1xuICAgIGdldEl0ZW06IChuYW1lKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICBjb25zdCBwYXJzZSA9IChzdHIyKSA9PiB7XG4gICAgICAgIGlmIChzdHIyID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyMiwgb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5yZXZpdmVyKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBzdHIgPSAoX2EgPSBzdG9yYWdlLmdldEl0ZW0obmFtZSkpICE9IG51bGwgPyBfYSA6IG51bGw7XG4gICAgICBpZiAoc3RyIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gc3RyLnRoZW4ocGFyc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnNlKHN0cik7XG4gICAgfSxcbiAgICBzZXRJdGVtOiAobmFtZSwgbmV3VmFsdWUpID0+IHN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgIG5hbWUsXG4gICAgICBKU09OLnN0cmluZ2lmeShuZXdWYWx1ZSwgb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5yZXBsYWNlcilcbiAgICApLFxuICAgIHJlbW92ZUl0ZW06IChuYW1lKSA9PiBzdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSlcbiAgfTtcbiAgcmV0dXJuIHBlcnNpc3RTdG9yYWdlO1xufVxuY29uc3QgdG9UaGVuYWJsZSA9IChmbikgPT4gKGlucHV0KSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZm4oaW5wdXQpO1xuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdGhlbihvbkZ1bGZpbGxlZCkge1xuICAgICAgICByZXR1cm4gdG9UaGVuYWJsZShvbkZ1bGZpbGxlZCkocmVzdWx0KTtcbiAgICAgIH0sXG4gICAgICBjYXRjaChfb25SZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW4oX29uRnVsZmlsbGVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIGNhdGNoKG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRvVGhlbmFibGUob25SZWplY3RlZCkoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IG9sZEltcGwgPSAoY29uZmlnLCBiYXNlT3B0aW9ucykgPT4gKHNldCwgZ2V0LCBhcGkpID0+IHtcbiAgbGV0IG9wdGlvbnMgPSB7XG4gICAgZ2V0U3RvcmFnZTogKCkgPT4gbG9jYWxTdG9yYWdlLFxuICAgIHNlcmlhbGl6ZTogSlNPTi5zdHJpbmdpZnksXG4gICAgZGVzZXJpYWxpemU6IEpTT04ucGFyc2UsXG4gICAgcGFydGlhbGl6ZTogKHN0YXRlKSA9PiBzdGF0ZSxcbiAgICB2ZXJzaW9uOiAwLFxuICAgIG1lcmdlOiAocGVyc2lzdGVkU3RhdGUsIGN1cnJlbnRTdGF0ZSkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnRTdGF0ZSxcbiAgICAgIC4uLnBlcnNpc3RlZFN0YXRlXG4gICAgfSksXG4gICAgLi4uYmFzZU9wdGlvbnNcbiAgfTtcbiAgbGV0IGhhc0h5ZHJhdGVkID0gZmFsc2U7XG4gIGNvbnN0IGh5ZHJhdGlvbkxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGNvbnN0IGZpbmlzaEh5ZHJhdGlvbkxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGxldCBzdG9yYWdlO1xuICB0cnkge1xuICAgIHN0b3JhZ2UgPSBvcHRpb25zLmdldFN0b3JhZ2UoKTtcbiAgfSBjYXRjaCAoX2UpIHtcbiAgfVxuICBpZiAoIXN0b3JhZ2UpIHtcbiAgICByZXR1cm4gY29uZmlnKFxuICAgICAgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbenVzdGFuZCBwZXJzaXN0IG1pZGRsZXdhcmVdIFVuYWJsZSB0byB1cGRhdGUgaXRlbSAnJHtvcHRpb25zLm5hbWV9JywgdGhlIGdpdmVuIHN0b3JhZ2UgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlLmBcbiAgICAgICAgKTtcbiAgICAgICAgc2V0KC4uLmFyZ3MpO1xuICAgICAgfSxcbiAgICAgIGdldCxcbiAgICAgIGFwaVxuICAgICk7XG4gIH1cbiAgY29uc3QgdGhlbmFibGVTZXJpYWxpemUgPSB0b1RoZW5hYmxlKG9wdGlvbnMuc2VyaWFsaXplKTtcbiAgY29uc3Qgc2V0SXRlbSA9ICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IG9wdGlvbnMucGFydGlhbGl6ZSh7IC4uLmdldCgpIH0pO1xuICAgIGxldCBlcnJvckluU3luYztcbiAgICBjb25zdCB0aGVuYWJsZSA9IHRoZW5hYmxlU2VyaWFsaXplKHsgc3RhdGUsIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiB9KS50aGVuKFxuICAgICAgKHNlcmlhbGl6ZWRWYWx1ZSkgPT4gc3RvcmFnZS5zZXRJdGVtKG9wdGlvbnMubmFtZSwgc2VyaWFsaXplZFZhbHVlKVxuICAgICkuY2F0Y2goKGUpID0+IHtcbiAgICAgIGVycm9ySW5TeW5jID0gZTtcbiAgICB9KTtcbiAgICBpZiAoZXJyb3JJblN5bmMpIHtcbiAgICAgIHRocm93IGVycm9ySW5TeW5jO1xuICAgIH1cbiAgICByZXR1cm4gdGhlbmFibGU7XG4gIH07XG4gIGNvbnN0IHNhdmVkU2V0U3RhdGUgPSBhcGkuc2V0U3RhdGU7XG4gIGFwaS5zZXRTdGF0ZSA9IChzdGF0ZSwgcmVwbGFjZSkgPT4ge1xuICAgIHNhdmVkU2V0U3RhdGUoc3RhdGUsIHJlcGxhY2UpO1xuICAgIHZvaWQgc2V0SXRlbSgpO1xuICB9O1xuICBjb25zdCBjb25maWdSZXN1bHQgPSBjb25maWcoXG4gICAgKC4uLmFyZ3MpID0+IHtcbiAgICAgIHNldCguLi5hcmdzKTtcbiAgICAgIHZvaWQgc2V0SXRlbSgpO1xuICAgIH0sXG4gICAgZ2V0LFxuICAgIGFwaVxuICApO1xuICBsZXQgc3RhdGVGcm9tU3RvcmFnZTtcbiAgY29uc3QgaHlkcmF0ZSA9ICgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKCFzdG9yYWdlKSByZXR1cm47XG4gICAgaGFzSHlkcmF0ZWQgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25MaXN0ZW5lcnMuZm9yRWFjaCgoY2IpID0+IGNiKGdldCgpKSk7XG4gICAgY29uc3QgcG9zdFJlaHlkcmF0aW9uQ2FsbGJhY2sgPSAoKF9hID0gb3B0aW9ucy5vblJlaHlkcmF0ZVN0b3JhZ2UpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKG9wdGlvbnMsIGdldCgpKSkgfHwgdm9pZCAwO1xuICAgIHJldHVybi
25114B0b1RoZW5hYmxlKHN0b3JhZ2UuZ2V0SXRlbS5iaW5kKHN0b3JhZ2UpKShvcHRpb25zLm5hbWUpLnRoZW4oKHN0b3JhZ2VWYWx1ZSkgPT4ge1xuICAgICAgaWYgKHN0b3JhZ2VWYWx1ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5kZXNlcmlhbGl6ZShzdG9yYWdlVmFsdWUpO1xuICAgICAgfVxuICAgIH0pLnRoZW4oKGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uID09PSBcIm51bWJlclwiICYmIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uICE9PSBvcHRpb25zLnZlcnNpb24pIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5taWdyYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5taWdyYXRlKFxuICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUuc3RhdGUsXG4gICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFN0YXRlIGxvYWRlZCBmcm9tIHN0b3JhZ2UgY291bGRuJ3QgYmUgbWlncmF0ZWQgc2luY2Ugbm8gbWlncmF0ZSBmdW5jdGlvbiB3YXMgcHJvdmlkZWRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVkU3RvcmFnZVZhbHVlLnN0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkudGhlbigobWlncmF0ZWRTdGF0ZSkgPT4ge1xuICAgICAgdmFyIF9hMjtcbiAgICAgIHN0YXRlRnJvbVN0b3JhZ2UgPSBvcHRpb25zLm1lcmdlKFxuICAgICAgICBtaWdyYXRlZFN0YXRlLFxuICAgICAgICAoX2EyID0gZ2V0KCkpICE9IG51bGwgPyBfYTIgOiBjb25maWdSZXN1bHRcbiAgICAgICk7XG4gICAgICBzZXQoc3RhdGVGcm9tU3RvcmFnZSwgdHJ1ZSk7XG4gICAgICByZXR1cm4gc2V0SXRlbSgpO1xuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgcG9zdFJlaHlkcmF0aW9uQ2FsbGJhY2sgPT0gbnVsbCA/IHZvaWQgMCA6IHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrKHN0YXRlRnJvbVN0b3JhZ2UsIHZvaWQgMCk7XG4gICAgICBoYXNIeWRyYXRlZCA9IHRydWU7XG4gICAgICBmaW5pc2hIeWRyYXRpb25MaXN0ZW5lcnMuZm9yRWFjaCgoY2IpID0+IGNiKHN0YXRlRnJvbVN0b3JhZ2UpKTtcbiAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgcG9zdFJlaHlkcmF0aW9uQ2FsbGJhY2sgPT0gbnVsbCA/IHZvaWQgMCA6IHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrKHZvaWQgMCwgZSk7XG4gICAgfSk7XG4gIH07XG4gIGFwaS5wZXJzaXN0ID0ge1xuICAgIHNldE9wdGlvbnM6IChuZXdPcHRpb25zKSA9PiB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAuLi5uZXdPcHRpb25zXG4gICAgICB9O1xuICAgICAgaWYgKG5ld09wdGlvbnMuZ2V0U3RvcmFnZSkge1xuICAgICAgICBzdG9yYWdlID0gbmV3T3B0aW9ucy5nZXRTdG9yYWdlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBjbGVhclN0b3JhZ2U6ICgpID0+IHtcbiAgICAgIHN0b3JhZ2UgPT0gbnVsbCA/IHZvaWQgMCA6IHN0b3JhZ2UucmVtb3ZlSXRlbShvcHRpb25zLm5hbWUpO1xuICAgIH0sXG4gICAgZ2V0T3B0aW9uczogKCkgPT4gb3B0aW9ucyxcbiAgICByZWh5ZHJhdGU6ICgpID0+IGh5ZHJhdGUoKSxcbiAgICBoYXNIeWRyYXRlZDogKCkgPT4gaGFzSHlkcmF0ZWQsXG4gICAgb25IeWRyYXRlOiAoY2IpID0+IHtcbiAgICAgIGh5ZHJhdGlvbkxpc3RlbmVycy5hZGQoY2IpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaHlkcmF0aW9uTGlzdGVuZXJzLmRlbGV0ZShjYik7XG4gICAgICB9O1xuICAgIH0sXG4gICAgb25GaW5pc2hIeWRyYXRpb246IChjYikgPT4ge1xuICAgICAgZmluaXNoSHlkcmF0aW9uTGlzdGVuZXJzLmFkZChjYik7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBmaW5pc2hIeWRyYXRpb25MaXN0ZW5lcnMuZGVsZXRlKGNiKTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xuICBoeWRyYXRlKCk7XG4gIHJldHVybiBzdGF0ZUZyb21TdG9yYWdlIHx8IGNvbmZpZ1Jlc3VsdDtcbn07XG5jb25zdCBuZXdJbXBsID0gKGNvbmZpZywgYmFzZU9wdGlvbnMpID0+IChzZXQsIGdldCwgYXBpKSA9PiB7XG4gIGxldCBvcHRpb25zID0ge1xuICAgIHN0b3JhZ2U6IGNyZWF0ZUpTT05TdG9yYWdlKCgpID0+IGxvY2FsU3RvcmFnZSksXG4gICAgcGFydGlhbGl6ZTogKHN0YXRlKSA9PiBzdGF0ZSxcbiAgICB2ZXJzaW9uOiAwLFxuICAgIG1lcmdlOiAocGVyc2lzdGVkU3RhdGUsIGN1cnJlbnRTdGF0ZSkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnRTdGF0ZSxcbiAgICAgIC4uLnBlcnNpc3RlZFN0YXRlXG4gICAgfSksXG4gICAgLi4uYmFzZU9wdGlvbnNcbiAgfTtcbiAgbGV0IGhhc0h5ZHJhdGVkID0gZmFsc2U7XG4gIGNvbnN0IGh5ZHJhdGlvbkxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGNvbnN0IGZpbmlzaEh5ZHJhdGlvbkxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGxldCBzdG9yYWdlID0gb3B0aW9ucy5zdG9yYWdlO1xuICBpZiAoIXN0b3JhZ2UpIHtcbiAgICByZXR1cm4gY29uZmlnKFxuICAgICAgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbenVzdGFuZCBwZXJzaXN0IG1pZGRsZXdhcmVdIFVuYWJsZSB0byB1cGRhdGUgaXRlbSAnJHtvcHRpb25zLm5hbWV9JywgdGhlIGdpdmVuIHN0b3JhZ2UgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlLmBcbiAgICAgICAgKTtcbiAgICAgICAgc2V0KC4uLmFyZ3MpO1xuICAgICAgfSxcbiAgICAgIGdldCxcbiAgICAgIGFwaVxuICAgICk7XG4gIH1cbiAgY29uc3Qgc2V0SXRlbSA9ICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IG9wdGlvbnMucGFydGlhbGl6ZSh7IC4uLmdldCgpIH0pO1xuICAgIHJldHVybiBzdG9yYWdlLnNldEl0ZW0ob3B0aW9ucy5uYW1lLCB7XG4gICAgICBzdGF0ZSxcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvblxuICAgI
25114H0pO1xuICB9O1xuICBjb25zdCBzYXZlZFNldFN0YXRlID0gYXBpLnNldFN0YXRlO1xuICBhcGkuc2V0U3RhdGUgPSAoc3RhdGUsIHJlcGxhY2UpID0+IHtcbiAgICBzYXZlZFNldFN0YXRlKHN0YXRlLCByZXBsYWNlKTtcbiAgICB2b2lkIHNldEl0ZW0oKTtcbiAgfTtcbiAgY29uc3QgY29uZmlnUmVzdWx0ID0gY29uZmlnKFxuICAgICguLi5hcmdzKSA9PiB7XG4gICAgICBzZXQoLi4uYXJncyk7XG4gICAgICB2b2lkIHNldEl0ZW0oKTtcbiAgICB9LFxuICAgIGdldCxcbiAgICBhcGlcbiAgKTtcbiAgYXBpLmdldEluaXRpYWxTdGF0ZSA9ICgpID0+IGNvbmZpZ1Jlc3VsdDtcbiAgbGV0IHN0YXRlRnJvbVN0b3JhZ2U7XG4gIGNvbnN0IGh5ZHJhdGUgPSAoKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBpZiAoIXN0b3JhZ2UpIHJldHVybjtcbiAgICBoYXNIeWRyYXRlZCA9IGZhbHNlO1xuICAgIGh5ZHJhdGlvbkxpc3RlbmVycy5mb3JFYWNoKChjYikgPT4ge1xuICAgICAgdmFyIF9hMjtcbiAgICAgIHJldHVybiBjYigoX2EyID0gZ2V0KCkpICE9IG51bGwgPyBfYTIgOiBjb25maWdSZXN1bHQpO1xuICAgIH0pO1xuICAgIGNvbnN0IHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrID0gKChfYiA9IG9wdGlvbnMub25SZWh5ZHJhdGVTdG9yYWdlKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChvcHRpb25zLCAoX2EgPSBnZXQoKSkgIT0gbnVsbCA/IF9hIDogY29uZmlnUmVzdWx0KSkgfHwgdm9pZCAwO1xuICAgIHJldHVybiB0b1RoZW5hYmxlKHN0b3JhZ2UuZ2V0SXRlbS5iaW5kKHN0b3JhZ2UpKShvcHRpb25zLm5hbWUpLnRoZW4oKGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uID09PSBcIm51bWJlclwiICYmIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uICE9PSBvcHRpb25zLnZlcnNpb24pIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5taWdyYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICBvcHRpb25zLm1pZ3JhdGUoXG4gICAgICAgICAgICAgICAgZGVzZXJpYWxpemVkU3RvcmFnZVZhbHVlLnN0YXRlLFxuICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgU3RhdGUgbG9hZGVkIGZyb20gc3RvcmFnZSBjb3VsZG4ndCBiZSBtaWdyYXRlZCBzaW5jZSBubyBtaWdyYXRlIGZ1bmN0aW9uIHdhcyBwcm92aWRlZGBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbZmFsc2UsIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS5zdGF0ZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbZmFsc2UsIHZvaWQgMF07XG4gICAgfSkudGhlbigobWlncmF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICB2Y
25114XIgX2EyO1xuICAgICAgY29uc3QgW21pZ3JhdGVkLCBtaWdyYXRlZFN0YXRlXSA9IG1pZ3JhdGlvblJlc3VsdDtcbiAgICAgIHN0YXRlRnJvbVN0b3JhZ2UgPSBvcHRpb25zLm1lcmdlKFxuICAgICAgICBtaWdyYXRlZFN0YXRlLFxuICAgICAgICAoX2EyID0gZ2V0KCkpICE9IG51bGwgPyBfYTIgOiBjb25maWdSZXN1bHRcbiAgICAgICk7XG4gICAgICBzZXQoc3RhdGVGcm9tU3RvcmFnZSwgdHJ1ZSk7XG4gICAgICBpZiAobWlncmF0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHNldEl0ZW0oKTtcbiAgICAgIH1cbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrID09IG51bGwgPyB2b2lkIDAgOiBwb3N0UmVoeWRyYXRpb25DYWxsYmFjayhzdGF0ZUZyb21TdG9yYWdlLCB2b2lkIDApO1xuICAgICAgc3RhdGVGcm9tU3RvcmFnZSA9IGdldCgpO1xuICAgICAgaGFzSHlkcmF0ZWQgPSB0cnVlO1xuICAgICAgZmluaXNoSHlkcmF0aW9uTGlzdGVuZXJzLmZvckVhY2goKGNiKSA9PiBjYihzdGF0ZUZyb21TdG9yYWdlKSk7XG4gICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgIHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrID09IG51bGwgPyB2b2lkIDAgOiBwb3N0UmVoeWRyYXRpb25DYWxsYmFjayh2b2lkIDAsIGUpO1xuICAgIH0pO1xuICB9O1xuICBhcGkucGVyc2lzdCA9IHtcbiAgICBzZXRPcHRpb25zOiAobmV3T3B0aW9ucykgPT4ge1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgLi4ubmV3T3B0aW9uc1xuICAgICAgfTtcbiAgICAgIGlmIChuZXdPcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZSA9IG5ld09wdGlvbnMuc3RvcmFnZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsZWFyU3RvcmFnZTogKCkgPT4ge1xuICAgICAgc3RvcmFnZSA9PSBudWxsID8gdm9pZCAwIDogc3RvcmFnZS5yZW1vdmVJdGVtKG9wdGlvbnMubmFtZSk7XG4gICAgfSxcbiAgICBnZXRPcHRpb25zOiAoKSA9PiBvcHRpb25zLFxuICAgIHJlaHlkcmF0ZTogKCkgPT4gaHlkcmF0ZSgpLFxuICAgIGhhc0h5ZHJhdGVkOiAoKSA9PiBoYXNIeWRyYXRlZCxcbiAgICBvbkh5ZHJhdGU6IChjYikgPT4ge1xuICAgICAgaHlkcmF0aW9uTGlzdGVuZXJzLmFkZChjYik7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBoeWRyYXRpb25MaXN0ZW5lcnMuZGVsZXRlKGNiKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBvbkZpbmlzaEh5ZHJhdGlvbjogKGNiKSA9PiB7XG4gICAgICBmaW5pc2hIeWRyYXRpb25MaXN0ZW5lcnMuYWRkKGNiKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGZpbmlzaEh5ZHJhdGlvbkxpc3RlbmVycy5kZWxldGUoY2IpO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG4gIGlmICghb3B0aW9ucy5za2lwSHlkcmF0aW9uKSB7XG4gICAgaHlkcmF0ZSgpO1xuICB9XG4gIHJldHVybiBzdGF0ZUZyb21TdG9yYWdlIHx8IGNvbmZpZ1Jlc3VsdDtcbn07XG5jb25zdCBwZXJzaXN0SW1wbCA9IChjb25maWcsIGJhc2VPcHRpb25zKSA9PiB7XG4gIGlmIChcImdldFN0b3JhZ2VcIiBpbiBiYXNlT3B0aW9ucyB8fCBcInNlcmlhbGl6ZVwiIGluIGJhc2VPcHRpb25zIHx8IFwiZGVzZXJpYWxpemVcIiBpbiBiYXNlT3B0aW9ucykge1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltERVBSRUNBVEVEXSBgZ2V0U3RvcmFnZWAsIGBzZXJpYWxpemVgIGFuZCBgZGVzZXJpYWxpemVgIG9wdGlvbnMgYXJlIGRlcHJlY2F0ZWQuIFVzZSBgc3RvcmFnZWAgb3B0aW9uIGluc3RlYWQuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvbGRJbXBsKGNvbmZpZywgYmFzZU9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBuZXdJbXBsKGNvbmZpZywgYmFzZU9wdGlvbnMpO1xufTtcbmNvbnN0IHBlcnNpc3QgPSBwZXJzaXN0SW1wbDtcblxuZXhwb3J0IHsgY29tYmluZSwgY3JlYXRlSlNPTlN0b3JhZ2UsIGRldnRvb2xzLCBwZXJzaXN0LCByZWR1eCwgc3Vic2NyaWJlV2l0aFNlbGVjdG9yIH07XG4iLCJpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJ1xuaW1wb3J0IHsgZGV2dG9vbHMsIHN1YnNjcmliZVdpdGhTZWxlY3RvciwgcGVyc2lzdCB9IGZyb20gJ3p1c3RhbmQvbWlkZGxld2FyZSdcbmltcG9ydCB0eXBlIHsgQXBwU3RhdGUsIEFwcEFjdGlvbnMgfSBmcm9tICcuLi90eXBlcy9pbmRleCdcblxuLy8gQ29tYmluZWQgc3RvcmUgaW50ZXJmYWNlXG5pbnRlcmZhY2UgQXBwU3RvcmUgZXh0ZW5kcyBBcHBTdGF0ZSwgQXBwQWN0aW9ucyB7fVxuXG4vLyBJbml0aWFsIHN0YXRlXG5jb25zdCBpbml0aWFsU3RhdGU6IEFwcFN0YXRlID0ge1xuICAvLyBVSSBTdGF0ZVxuICBzZWxlY3RlZExvY2F0aW9uSWQ6IG51bGwsXG4gIHNlbGVjdGVkQ29udGFjdDogbnVsbCxcbiAgaXNMb2NhdGlvbk1vZGFsT3BlbjogZmFsc2UsXG4gIGlzQ29udGFjdE1vZGFsT3BlbjogZmFsc2UsXG4gIFxuICAvLyBGaWx0ZXJzXG4gIHNlYXJjaFF1ZXJ5OiAnJyxcbiAgc2VsZWN0ZWREZXBhcnRtZW50czogW10sXG4gIHNlbGVjdGVkTGFuZ3VhZ2VzOiBbXSxcbiAgc2VsZWN0ZWRTdGF0ZXM6IFtdLFxuICBzZWxlY3RlZFNlcnZpY2VzOiBbXSxcbiAgXG4gIC8vIFZpZXcgcHJlZmVyZW5jZXNcbiAgbWFwVmlldzogJ2xpc3QnLFxuICBjb250YWN0TGF5b3V0OiAnZ3JpZCcsXG4gIGFjdGl2ZVRhYjogJ2xvY2F0aW9ucycgYXMgJ2xvY2F0aW9ucycgfCAnY29udGFjdHMnLFxuXG4gIC8vIExvYWRpbmcgc3RhdGVzXG4gIGlzTG9hZGluZzogZmFsc2UsXG4gIGVycm9yOiBudWxsXG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBsb2NhbFN0b3JhZ2UgaXMgYXZhaWxhYmxlIChmb3IgaWZyYW1lIGNvbXBhdGliaWxpdHkpXG5jb25zdCBpc0xvY2FsU3RvcmFnZUF2YWlsYWJsZSA9ICgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0ZXN0ID0gJ19fbG9jYWxTdG9yYWdlX3Rlc3RfXydcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vLyBDcmVhdGUgdGhlIHN0b3JlIHdpdGggY29uZGl0aW9uYWwgcGVyc2lzdGVuY2VcbmNvbnN0IGNyZWF0ZVN0b3JlID0gKCkgPT4ge1xuICBjb25zdCBzdG9yZUNvbmZpZyA9IHN1YnNjcmliZVdpdGhTZWxlY3Rvcigoc2V0LCBnZXQpID0+ICh7XG4gICAgLy8gSW5pdGlhbCBzdGF0ZVxuICAgIC4uLmluaXRpYWxTdGF0ZSxcblxuICAgIC8vIExvY2F0aW9uIGFjdGlvbnNcbiAgICBzZXRTZWxlY3RlZExvY2F0aW9uOiAobG9jYXRpb25JZCkgPT4ge1xuICAgICAgc2V0KHsgc2VsZWN0ZWRMb2NhdGlvbklkOiBsb2NhdGlvbklkIH0pXG4gICAgfSxcblxuICAgICAgb3BlbkxvY2F0aW9uTW9kYWw6IChsb2NhdGlvbklkKSA9PiB7XG4gICAgICAgI
25114HNldCh7XG4gICAgICAgICAgc2VsZWN0ZWRMb2NhdGlvbklkOiBsb2NhdGlvbklkLFxuICAgICAgICAgIGlzTG9jYXRpb25Nb2RhbE9wZW46IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0sXG5cbiAgICAgIGNsb3NlTG9jYXRpb25Nb2RhbDogKCkgPT4ge1xuICAgICAgICBzZXQoe1xuICAgICAgICAgIGlzTG9jYXRpb25Nb2RhbE9wZW46IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICB9LFxuXG4gICAgICAvLyBDb250YWN0IGFjdGlvbnNcbiAgICAgIHNldFNlbGVjdGVkQ29udGFjdDogKGNvbnRhY3QpID0+IHtcbiAgICAgICAgc2V0KHsgc2VsZWN0ZWRDb250YWN0OiBjb250YWN0IH0pXG4gICAgICB9LFxuXG4gICAgICBvcGVuQ29udGFjdE1vZGFsOiAoY29udGFjdCkgPT4ge1xuICAgICAgICBzZXQoe1xuICAgICAgICAgIHNlbGVjdGVkQ29udGFjdDogY29udGFjdCxcbiAgICAgICAgICBpc0NvbnRhY3RNb2RhbE9wZW46IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0sXG5cbiAgICAgIGNsb3NlQ29udGFjdE1vZGFsOiAoKSA9PiB7XG4gICAgICAgIHNldCh7XG4gICAgICAgICAgaXNDb250YWN0TW9kYWxPcGVuOiBmYWxzZSxcbiAgICAgICAgICBzZWxlY3RlZENvbnRhY3Q6IG51bGxcbiAgICAgICAgfSlcbiAgICAgIH0sXG5cbiAgICAgIC8vIEZpbHRlciBhY3Rpb25zXG4gICAgICBzZXRTZWFyY2hRdWVyeTogKHF1ZXJ5KSA9PiB7XG4gICAgICAgIHNldCh7IHNlYXJjaFF1ZXJ5OiBxdWVyeSB9KVxuICAgICAgfSxcblxuICAgICAgc2V0U2VsZWN0ZWREZXBhcnRtZW50czogKGRlcGFydG1lbnRzKSA9PiB7XG4gICAgICAgIHNldCh7IHNlbGVjdGVkRGVwYXJ0bWVudHM6IGRlcGFydG1lbnRzIH0pXG4gICAgICB9LFxuXG4gICAgICBzZXRTZWxlY3RlZExhbmd1YWdlczogKGxhbmd1YWdlcykgPT4ge1xuICAgICAgICBzZXQoeyBzZWxlY3RlZExhbmd1YWdlczogbGFuZ3VhZ2VzIH0pXG4gICAgICB9LFxuXG4gICAgICBzZXRTZWxlY3RlZFN0YXRlczogKHN0YXRlcykgPT4ge1xuICAgICAgICBzZXQoeyBzZWxlY3RlZFN0YXRlczogc3RhdGVzIH0pXG4gICAgICB9LFxuXG4gICAgICBzZXRTZWxlY3RlZFNlcnZpY2VzOiAoc2VydmljZXMpID0+IHtcbiAgICAgICAgc2V0KHsgc2VsZWN0ZWRTZXJ2aWNlczogc2VydmljZXMgfSlcbiAgICAgIH0sXG5cbiAgICAgIC8vIFZpZXcgYWN0aW9uc1xuICAgICAgc2V0TWFwVmlldzogKHZpZXcpID0+IHtcbiAgICAgICAgc2V0KHsgbWFwVmlldzogdmlldyB9KVxuICAgICAgfSxcblxuICAgICAgc2V0Q29udGFjdExheW91dDogKGxheW91dCkgPT4ge1xuICAgICAgICBzZXQoeyBjb250YWN0TGF5b3V0OiBsYXlvdXQgfSlcbiAgICAgIH0sXG5cbiAgICAgIHNldEFjdGl2ZVRhYjogKHRhYikgPT4ge1xuICAgICAgICBzZXQoeyBhY3RpdmVUYWI6IHRhYiB9KVxuICAgICAgfSxcblxuICAgICAgLy8gTG9hZGluZyBhY3Rpb25zXG4gICAgICBzZXRMb2FkaW5nOiAobG9hZGluZykgPT4ge1xuICAgICAgICBzZXQoeyBpc0xvYWRpbmc6IGxvYWRpbmcgfSlcbiAgICAgIH0sXG5cbiAgICAgIHNldEVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgc2V0KHsgZXJyb3IgfSlcbiAgICAgIH1cbiAgICB9KSlcblxuICAvLyBBcHBseSBkZXZ0b29scyBhbmQgY29uZGl0aW9uYWwgcGVyc2lzdGVuY2VcbiAgdHJ5IHtcbiAgICBpZiAoaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSkge1xuICAgICAgcmV0dXJuIGRldnRvb2xzKFxuICAgICAgICBwZXJzaXN0KHN0b3JlQ29uZmlnLCB7XG4gICAgICAgICAgbmFtZTogJ21lYy1wb3J0Zm9saW8tc3RvcmUnLFxuICAgICAgICAgIC8vIE9ubHkgc2VyaWFsaXplIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBzdGF0ZVxuICAgICAgICAgIHBhcnRpYWxpemU6IChzdGF0ZTogYW55KSA9PiAoe1xuICAgICAgICAgICAgbWFwVmlldzogc3RhdGUubWFwVmlldyxcbiAgICAgICAgICAgIGNvbnRhY3RMYXlvdXQ6IHN0YXRlLmNvbnRhY3RMYXlvdXQsXG4gICAgICAgICAgICBzZWxlY3RlZERlcGFydG1lbnRzOiBzdGF0ZS5zZWxlY3RlZERlcGFydG1lbnRzLFxuICAgICAgICAgICAgc2VsZWN0ZWRMYW5ndWFnZXM6IHN0YXRlLnNlbGVjdGVkTGFuZ3VhZ2VzLFxuICAgICAgICAgICAgc2VsZWN0ZWRTdGF0ZXM6IHN0YXRlLnNlbGVjdGVkU3RhdGVzLFxuICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2aWNlczogc3RhdGUuc2VsZWN0ZWRTZXJ2aWNlc1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pLFxuICAgICAgICB7IG5hbWU6ICdtZWMtcG9ydGZvbGlvLXN0b3JlJyB9XG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIHBlcnNpc3RlbmNlIGluIGlmcmFtZSBtb2RlXG4gICAgICBjb25zb2xlLmxvZygn4pqg77iPIGxvY2FsU3RvcmFnZSBub3QgYXZhaWxhYmxlIC0gcnVubmluZyB3aXRob3V0IHBlcnNpc3RlbmNlIChpZnJhbWUgbW9kZSknKVxuICAgICAgcmV0dXJuIGRldnRvb2xzKHN0b3JlQ29uZmlnLCB7IG5hbWU6ICdtZWMtcG9ydGZvbGlvLXN0b3JlLW5vLXBlcnNpc3QnIH0pXG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZhbGxiYWNrOiBubyBwZXJzaXN0ZW5jZSwgbm8gZGV2dG9vbHNcbiAgICBjb25zb2xlLmVycm9yKCfimqDvuI8gU3RvcmUgY3JlYXRpb24gZmFpbGVkLCB1c2luZyBiYXNpYyBzdG9yZTonLCBlcnJvcilcbiAgICByZXR1cm4gc3RvcmVDb25maWdcbiAgfVxufVxuXG4vLyBDcmVhdGUgc3RvcmUgd2l0aCBlcnJvciBoYW5kbGluZ1xubGV0IHN0b3JlOiBhbnlcbnRyeSB7XG4gIHN0b3JlID0gY3JlYXRlU3RvcmUoKVxufSBjYXRjaCAoZXJyb3IpIHtcbiAgY29uc29sZS5lcnJvcign4pqg77iPIFN0b3JlIGNyZWF0aW9uIGZhaWxlZCwgdXNpbmcgYmFzaWMgc3RvcmU6JywgZXJyb3IpXG4gIC8vIEZhbGxiYWNrOiBiYXNpYyBzdG9yZSB3aXRob3V0IHBlcnNpc3RlbmNlIG9yIGRldnRvb2xzXG4gIHN0b3JlID0gc3Vic2NyaWJlV2l0aFNlbGVjdG9yKChzZXQsIGdldCkgPT4gKHtcbiAgICAuLi5pbml0aWFsU3RhdGUsXG4gICAgc2V0U2VsZWN0ZWRMb2NhdGlvbjogKGxvY2F0aW9uSWQpID0+IHNldCh7IHNlbGVjdGVkTG9jYXRpb25JZDogbG9jYXRpb25JZCB9KSxcbiAgICBzZXRTZWxlY3RlZENvbnRhY3Q6IChjb250YWN0SWQpID0+IHNldCh7IHNlbGVjdGVkQ29udGFjdElkOiBjb250YWN0SWQgfSksXG4gICAgc2V0TWFwVmlldzogKHZpZXcpID0+IHNldCh7IG1hcFZpZXc6IHZpZXcgfSksXG4gICAgc2V0Q29udGFjdExheW91dDogKGxheW91dCkgPT4gc2V0KHsgY29udGFjdExheW91dDogbGF5b3V0IH0pLFxuICAgIHNldFNlYXJjaFF1ZXJ5OiAocXVlcnkpID0+IHNldCh7IHNlYXJjaFF1ZXJ5OiBxdWVyeSB9KSxcbiAgICBzZXRTZWxlY3RlZERlcGFydG1lbnRzOiAoZGVwYXJ0bWVudHMpID0+IHNldCh7IHNlbGVjdGVkRGVwYXJ0bWVudHM6IGRlcGFydG1lbnRzIH0pLFxuICAgIHNldFNlbGVjdGVkTGFuZ3VhZ2VzOiAobGFuZ3VhZ2VzKSA9PiBzZXQoeyBzZWxlY3RlZExhbmd1YWdlczogbGFuZ3VhZ2VzIH0pLFxuICAgIHNldFNlbGVjdGVkU3RhdGVzOiAoc3RhdGVzKSA9PiBzZXQoeyBzZWxlY3RlZFN0YXRlczogc3RhdGVzIH0pLFxuICAgIHNldFNlbGVjdGVkU2VydmljZXM6IChzZXJ2aWNlcykgPT4gc2V0KHsgc2VsZWN0ZWRTZXJ2aWNlczogc2VydmljZXMgfSksXG4gICAgc2V0RXJyb3I6IChlcnJvcikgPT4gc2V0KHsgZXJyb3IgfSlcbiAgfSkpXG59XG5cbmV4cG9ydCBjb25zdCB1c2VBcHBTdG9yZSA9IGNyZWF0ZTxBcHBTdG9yZT4oKShzdG9yZSlcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNlbGVjdG9ycyAoZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbilcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIFVJIHNlbGVjdG9yc1xuZXhwb3J0IGNvbnN0IHVzZVNlbGVjdGVkTG9jYXRpb24gPSAoKSA9PiB1c2VBcHBTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZWxlY3RlZExvY2F0aW9uSWQpXG5leHBvcnQgY29uc3QgdXNlU2VsZWN0ZWRDb250YWN0ID0gKCkgPT4gdXNlQXBwU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2VsZWN0ZWRDb250YWN0KVxuZXhwb3J0IGNvbnN0IHVzZUxvY2F0aW9uTW9kYWwgPSAoKSA9PiB1c2VBcHBTdG9yZShzdGF0ZSA9PiAoe1xuICBpc09wZW46IHN0YXRlLmlzTG9jYXRpb25Nb2RhbE9wZW4sXG4gIGxvY2F0aW9uSWQ6IHN0YXRlLnNlbGVjdGVkTG9jYXRpb25JZCxcbiAgb3Blbjogc3RhdGUub3BlbkxvY2F0aW9uTW9kYWwsXG4gIGNsb3NlOiBzdGF0ZS5jbG9zZUxvY2F0aW9uTW9kYWxcbn0pKVxuZXhwb3J0IGNvbnN0IHVzZUNvbnRhY3RNb2RhbCA9ICgpID0+IHVzZUFwcFN0b3JlKHN0YXRlID0+ICh7XG4gIGlzT3Blbjogc3RhdGUuaXNDb250YWN0TW9kYWxPcGVuLFxuICBjb250YWN0OiBzdGF0ZS5zZWxlY3RlZENvbnRhY3QsXG4gIG9wZW46IHN0YXRlLm9wZW5Db250YWN0TW9kYWwsXG4gIGNsb3NlOiBzdGF0ZS5jbG9zZUNvbnRhY3RNb2RhbFxufSkpXG5cbi8vIEZpbHRlciBzZWxlY3RvcnNcbmV4cG9ydCBjb25zdCB1c2VGaWx0ZXJzID0gKCkgPT4gdXNlQXBwU3RvcmUoc3RhdGUgPT4gKHtcbiAgc2VhcmNoUXVlcnk6IHN0YXRlLnNlYXJjaFF1ZXJ5LFxuICBzZWxlY3RlZERlcGFydG1lbnRzOiBzdGF0ZS5zZWxlY3RlZERlcGFydG1lbnRzLFxuICBzZWxlY3RlZExhbmd1YWdlczogc3RhdGUuc2VsZWN0ZWRMYW5ndWFnZXMsXG4gIHNlbGVjdGVkU3RhdGVzOiBzdGF0ZS5zZWxlY3RlZFN0YXRlcyxcbiAgc2VsZWN0ZWRTZXJ2aWNlczogc3RhdGUuc2VsZWN0ZWRTZXJ2aWNlcyxcbiAgc2V0U2VhcmNoUXVlcnk6IHN0YXRlLnNldFNlYXJjaFF1ZXJ5LFxuICBzZXRTZWxlY3RlZERlcGFydG1lbnRzOiBzdGF0ZS5zZXRTZWxlY3RlZERlcGFydG1lbnRzLFxuICBzZXRTZWxlY3RlZExhbmd1YWdlczogc3RhdGUuc2V0U2VsZWN0ZWRMYW5ndWFnZXMsXG4gIHNldFNlbGVjdGVkU3RhdGVzOiBzdGF0ZS5zZXRTZWxlY3RlZFN0YXRlcyxcbiAgc2V0U2VsZWN0ZWRTZXJ2aWNlczogc3RhdGUuc2V0U2VsZWN0ZWRTZXJ2aWNlc1xufSkpXG5cbi8vIFZpZXcgc2VsZWN0b3JzXG5leHBvcnQgY29uc3QgdXNlVmlld1ByZWZlcmVuY2VzID0gKCkgPT4gdXNlQXBwU3RvcmUoc3RhdGUgPT4gKHtcbiAgbWFwVmlldzogc3Rh
25114dGUubWFwVmlldyxcbiAgY29udGFjdExheW91dDogc3RhdGUuY29udGFjdExheW91dCxcbiAgYWN0aXZlVGFiOiBzdGF0ZS5hY3RpdmVUYWIsXG4gIHNldE1hcFZpZXc6IHN0YXRlLnNldE1hcFZpZXcsXG4gIHNldENvbnRhY3RMYXlvdXQ6IHN0YXRlLnNldENvbnRhY3RMYXlvdXQsXG4gIHNldEFjdGl2ZVRhYjogc3RhdGUuc2V0QWN0aXZlVGFiXG59KSlcblxuLy8gTG9hZGluZyBzZWxlY3RvcnNcbmV4cG9ydCBjb25zdCB1c2VMb2FkaW5nU3RhdGUgPSAoKSA9PiB1c2VBcHBTdG9yZShzdGF0ZSA9PiAoe1xuICBpc0xvYWRpbmc6IHN0YXRlLmlzTG9hZGluZyxcbiAgZXJyb3I6IHN0YXRlLmVycm9yLFxuICBzZXRMb2FkaW5nOiBzdGF0ZS5zZXRMb2FkaW5nLFxuICBzZXRFcnJvcjogc3RhdGUuc2V0RXJyb3Jcbn0pKVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3RvcmUgc3Vic2NyaXB0aW9ucyAoZm9yIHNpZGUgZWZmZWN0cylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIFN1YnNjcmliZSB0byBsb2NhdGlvbiBjaGFuZ2VzIHRvIHVwZGF0ZSBVUkxcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICBsZXQgcHJldmlvdXNMb2NhdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuXG4gIHVzZUFwcFN0b3JlLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICBjb25zdCBjdXJyZW50TG9jYXRpb25JZCA9IHN0YXRlLnNlbGVjdGVkTG9jYXRpb25JZFxuICAgIGlmIChjdXJyZW50TG9jYXRpb25JZCAhPT0gcHJldmlvdXNMb2NhdGlvbklkKSB7XG4gICAgICBwcmV2aW91c0xvY2F0aW9uSWQgPSBjdXJyZW50TG9jYXRpb25JZFxuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgICAgIGlmIChjdXJyZW50TG9jYXRpb25JZCkge1xuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnbG9jYXRpb24nLCBjdXJyZW50TG9jYXRpb25JZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdsb2NhdGlvbicpXG4gICAgICB9XG4gICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCB1cmwudG9TdHJpbmcoKSlcbiAgICB9XG4gIH0pXG5cbiAgLy8gU3Vic2NyaWJlIHRvIGVycm9ycyBmb3IgbG9nZ2luZ1xuICBsZXQgcHJldmlvdXNFcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICB1c2VBcHBTdG9yZS5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgY29uc3QgY3VycmVudEVycm9yID0gc3RhdGUuZXJyb3JcbiAgICBpZiAoY3VycmVudEVycm9yICE9PSBwcmV2aW91c0Vycm9yKSB7XG4gICAgICBwcmV2aW91c0Vycm9yID0gY3VycmVudEVycm9yXG4gICAgICBpZiAoY3VycmVudEVycm9yICYmIGltcG9ydC5tZXRhLmVudi5QUk9EKSB7XG4gICAgICAgIC8vIFNlbmQgdG8gZXJyb3IgcmVwb3J0aW5nIHNlcnZpY2VcbiAgICAgICAgY29uc29sZS5lcnJvcignTUVDIFBvcnRmb2xpbyBFcnJvcjonLCBjdXJyZW50RXJyb3IpXG4gICAgICAgIC8vIFRPRE86IFNlbmQgdG8gU2VudHJ5IG9yIHNpbWlsYXJcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTdG9yZSB1dGlsaXRpZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIFJlc2V0IHN0b3JlIHRvIGluaXRpYWwgc3RhdGVcbmV4cG9ydCBjb25zdCByZXNldEFwcFN0b3JlID0gKCkgPT4ge1xuICB1c2VBcHBTdG9yZS5zZXRTdGF0ZShpbml0aWFsU3RhdGUpXG59XG5cbi8vIEdldCBjdXJyZW50IHN0YXRlIChmb3IgdXNlIG91dHNpZGUgUmVhY3QgY29tcG9uZW50cylcbmV4cG9ydCBjb25zdCBnZXRBcHBTdGF0ZSA9ICgpID0+IHVzZUFwcFN0b3JlLmdldFN0YXRlKClcblxuLy8gU3Vic2NyaWJlIHRvIHN0b3JlIGNoYW5nZXMgKGZvciB1c2Ugb3V0c2lkZSBSZWFjdCBjb21wb25lbnRzKVxuZXhwb3J0IGNvbnN0IHN1YnNjcmliZVRvU3RvcmUgPSB1c2VBcHBTdG9yZS5zdWJzY3JpYmVcbiIsImltcG9ydCB0eXBlIHsgTG9jYXRpb24sIENvbnRhY3QsIEFwaVJlc3BvbnNlLCBQYWdpbmF0ZWRSZXNwb25zZSB9IGZyb20gJy4uL3R5cGVzL2luZGV4J1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQVBJIENvbmZpZ3VyYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9IGltcG9ydC5tZXRhLmVudi5WSVRFX0FQSV9VUkwgfHwgJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMSdcbmNvbnN0IEFQSV9WRVJTSU9OID0gJ3YxJ1xuY29uc3QgQVBJX1VSTCA9IGAke0FQSV9CQVNFX1VSTH0vYXBpLyR7QVBJX1ZFUlNJT059YFxuXG4vLyBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG5jb25zdCBSRVFVRVNUX1RJTUVPVVQgPSAxMDAwMFxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSFRUUCBDbGllbnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNsYXNzIEFwaUNsaWVudCB7XG4gIHByaXZhdGUgYmFzZVVSTDogc3RyaW5nXG4gIHByaXZhdGUgdGltZW91dDogbnVtYmVyXG5cbiAgY29uc3RydWN0b3IoYmFzZVVSTDogc3RyaW5nLCB0aW1lb3V0OiBudW1iZXIgPSBSRVFVRVNUX1RJTUVPVVQpIHtcbiAgICB0aGlzLmJhc2VVUkwgPSBiYXNlVVJMXG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dFxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXF1
25114ZXN0PFQ+KFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmJhc2VVUkx9JHtlbmRwb2ludH1gXG4gICAgXG4gICAgLy8gQ3JlYXRlIGFib3J0IGNvbnRyb2xsZXIgZm9yIHRpbWVvdXRcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRoaXMudGltZW91dClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKVxuICAgICAgICB0aHJvdyBuZXcgQXBpRXJyb3IoXG4gICAgICAgICAgZXJyb3JEYXRhLm1lc3NhZ2UgfHwgYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCxcbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgZXJyb3JEYXRhXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBcGlFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEFwaUVycm9yKCdSZXF1ZXN0IHRpbWVvdXQnLCA0MDgpXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEFwaUVycm9yKGVycm9yLm1lc3NhZ2UsIDApXG4gICAgICB9XG4gICAgICBcbiAgICAgIHRocm93IG5ldyBBcGlFcnJvcignVW5rbm93biBlcnJvciBvY2N1cnJlZCcsIDApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0PFQ+KGVuZHBvaW50OiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFQ+KGVuZHBvaW50LCB7IG1ldGhvZDogJ0dFVCcgfSlcbiAgfVxuXG4gIGFzeW5jIHBvc3Q8VD4oZW5kcG9pbnQ6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oZW5kcG9pbnQsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogZGF0YSA/IEpTT04uc3RyaW5naWZ5KGRhdGEpIDogdW5kZWZpbmVkLFxuICAgIH0pXG4gIH1cblxuICBhc3luYyBwdXQ8VD4oZW5kcG9pbnQ6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oZW5kcG9pbnQsIHtcbiAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICBib2R5OiBkYXRhID8gSlNPTi5zdHJpbmdpZnkoZGF0YSkgOiB1bmRlZmluZWQsXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZTxUPihlbmRwb2ludDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihlbmRwb2ludCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pXG4gIH1cbn1cblxuLy8gQ3VzdG9tIGVycm9yIGNsYXNzXG5jbGFzcyBBcGlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHN0YXR1czogbnVtYmVyXG4gIHB1YmxpYyBkYXRhPzogYW55XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciA9IDAsIGRhdGE/OiBhbnkpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdBcGlFcnJvcidcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1c1xuICAgIHRoaXMuZGF0YSA9IGRhdGFcbiAgfVxufVxuXG4vLyBDcmVhdGUgQVBJIGNsaWVudCBpbnN0YW5jZVxuY29uc3QgYXBpQ2xpZW50ID0gbmV3IEFwaUNsaWVudChBUElfVVJMKVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQVBJIEZ1bmN0aW9uc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gTG9jYXRpb25zIEFQSVxuZXhwb3J0IGNvbnN0IGxvY2F0aW9uc0FwaSA9IHtcbiAgLy8gR2V0IGFsbCBsb2NhdGlvbnNcbiAgZ2V0QWxsOiAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTxMb2NhdGlvbltdPj4gPT5cbiAgICBhcGlDbGllbnQuZ2V0KCcvbG9jYXRpb25zP2xpbWl0PTEwMCcpLFxuXG4gIC8vIEdldCBsb2NhdGlvbiBieSBJRFxuICBnZXRCeUlkOiAoaWQ6IHN0cmluZyk6IFByb21pc2U8QXBpUmVzcG9uc2U8TG9jYXRpb24+PiA9PlxuICAgIGFwaUNsaWVudC5nZXQoYC9sb2NhdGlvbnMvJHtpZH1gKSxcblxuICAvLyBTZWFyY2ggbG9jYXRpb25zXG4gIHNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPExvY2F0aW9uW10+PiA9PlxuICAgIGFwaUNsaWVudC5nZXQoYC9sb2NhdGlvbnMvc2VhcmNoP3E9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApLFxuXG4gIC8vIEdldCBzZXJ2aWNlcyBmb3IgZmlsdGVyaW5nXG4gIGdldFNlcnZpY2VzOiAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTxBcnJheTx7IHNlcnZpY2U6IHN0cmluZzsgY291bnQ6IG51bWJlciB9Pj4+ID0+XG4gICAgYXBpQ2xpZW50LmdldCgnL2xvY2F0aW9ucy9zZXJ2aWNlcycpLFxuXG4gIC8vIEdldCBzdGF0ZXMvcmVnaW9ucyBmb3IgZmlsdGVyaW5nXG4gIGdldFN0YXRlczogKCk6IFByb21pc2U8QXBpUmVzcG9uc2U8QXJyYXk8ey
25114BzdGF0ZTogc3RyaW5nOyBjb3VudDogbnVtYmVyIH0+Pj4gPT5cbiAgICBhcGlDbGllbnQuZ2V0KCcvbG9jYXRpb25zL3N0YXRlcycpLFxuXG4gIC8vIEdldCBvcGVuaW5nIHllYXJzIGZvciBmaWx0ZXJpbmdcbiAgZ2V0T3BlbmluZ1llYXJzOiAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTx7IHllYXJzOiBBcnJheTx7IHllYXI6IG51bWJlcjsgY291bnQ6IG51bWJlciB9PjsgZGVjYWRlczogQXJyYXk8eyBkZWNhZGU6IHN0cmluZzsgY291bnQ6IG51bWJlcjsgeWVhcnM6IEFycmF5PHsgeWVhcjogbnVtYmVyOyBjb3VudDogbnVtYmVyIH0+IH0+IH0+PiA9PlxuICAgIGFwaUNsaWVudC5nZXQoJy9sb2NhdGlvbnMvb3BlbmluZy15ZWFycycpLFxufVxuXG4vLyBDb250YWN0cyBBUElcbmV4cG9ydCBjb25zdCBjb250YWN0c0FwaSA9IHtcbiAgLy8gR2V0IGFsbCBjb250YWN0c1xuICBnZXRBbGw6IChwYXJhbXM/OiB7XG4gICAgcGFnZT86IG51bWJlclxuICAgIGxpbWl0PzogbnVtYmVyXG4gICAgbG9jYXRpb25JZD86IHN0cmluZ1xuICAgIGRlcGFydG1lbnQ/OiBzdHJpbmdcbiAgICBzZWFyY2g/OiBzdHJpbmdcbiAgfSk6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8Q29udGFjdD4+ID0+IHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICBcbiAgICBpZiAocGFyYW1zPy5wYWdlKSBzZWFyY2hQYXJhbXMuc2V0KCdwYWdlJywgcGFyYW1zLnBhZ2UudG9TdHJpbmcoKSlcbiAgICBpZiAocGFyYW1zPy5saW1pdCkgc2VhcmNoUGFyYW1zLnNldCgnbGltaXQnLCBwYXJhbXMubGltaXQudG9TdHJpbmcoKSlcbiAgICBpZiAocGFyYW1zPy5sb2NhdGlvbklkKSBzZWFyY2hQYXJhbXMuc2V0KCdsb2NhdGlvbklkJywgcGFyYW1zLmxvY2F0aW9uSWQpXG4gICAgaWYgKHBhcmFtcz8uZGVwYXJ0bWVudCkgc2VhcmNoUGFyYW1zLnNldCgnZGVwYXJ0bWVudCcsIHBhcmFtcy5kZXBhcnRtZW50KVxuICAgIGlmIChwYXJhbXM/LnNlYXJjaCkgc2VhcmNoUGFyYW1zLnNldCgnc2VhcmNoJywgcGFyYW1zLnNlYXJjaClcblxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gc2VhcmNoUGFyYW1zLnRvU3RyaW5nKClcbiAgICByZXR1cm4gYXBpQ2xpZW50LmdldChgL2NvbnRhY3RzJHtxdWVyeVN0cmluZyA/IGA/JHtxdWVyeVN0cmluZ31gIDogJyd9YClcbiAgfSxcblxuICAvLyBHZXQgY29udGFjdCBieSBJRFxuICBnZXRCeUlkOiAoaWQ6IHN0cmluZyk6IFByb21pc2U8QXBpUmVzcG9uc2U8Q29udGFjdD4+ID0+XG4gICAgYXBpQ2xpZW50LmdldChgL2NvbnRhY3RzLyR7aWR9YCksXG5cbiAgLy8gR2V0IGFsbCBsb2NhdGlvbnMgZm9yIGEgY29udGFjdFxuICBnZXRDb250YWN0TG9jYXRpb25zOiAoY29udGFjdElkOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPExvY2F0aW9uW10+PiA9PlxuICAgIGFwaUNsaWVudC5nZXQoYC9jb250YWN0cy8ke2NvbnRhY3RJZH0vbG9jYXRpb25zYCksXG5cbiAgLy8gR2V0IGNvbnRhY3RzIGJ5IGxvY2F0aW9uXG4gIGdldEJ5TG9jYXRpb246IChsb2NhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPENvbnRhY3RbXT4+ID0+XG4gICAgYXBpQ2xpZW50LmdldChgL2NvbnRhY3RzL2xvY2F0aW9uLyR7bG9jYXRpb25JZH1gKSxcblxuICAvLyBTZWFyY2ggY29udGFjdHNcbiAgc2VhcmNoOiAocXVlcnk6IHN0cmluZywgbG9jYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8QXBpUmVzcG9uc2U8Q29udGFjdFtdPj4gPT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBxOiBxdWVyeSB9KVxuICAgIGlmIChsb2NhdGlvbklkKSBwYXJhbXMuc2V0KCdsb2NhdGlvbklkJywgbG9jYXRpb25JZClcbiAgICByZXR1cm4gYXBpQ2xpZW50LmdldChgL2NvbnRhY3RzL3NlYXJjaD8ke3BhcmFtcy50b1N0cmluZygpfWApXG4gIH0sXG5cbiAgLy8gR2V0IGRlcGFydG1lbnRzXG4gIGdldERlcGFydG1lbnRzOiAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTxBcnJheTx7IGRlcGFydG1lbnQ6IHN0cmluZzsgY291bnQ6IG51bWJlciB9Pj4+ID0+XG4gICAgYXBpQ2xpZW50LmdldCgnL2NvbnRhY3RzL2RlcGFydG1lbnRzJyksXG5cbiAgLy8gR2V0IGxhbmd1YWdlc1xuICBnZXRMYW5ndWFnZXM6ICgpOiBQcm9taXNlPEFwaVJlc3BvbnNlPEFycmF5PHsgbGFuZ3VhZ2U6IHN0cmluZzsgY291bnQ6IG51bWJlciB9Pj4+ID0+XG4gICAgYXBpQ2xpZW50LmdldCgnL2NvbnRhY3RzL2xhbmd1YWdlcycpLFxuXG4gIC8vIEdldCBwb3NpdGlvbnNcbiAgZ2V0UG9zaXRpb25zOiAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTxBcnJheTx7IHBvc2l0aW9uOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfT4+PiA9PlxuICAgIGFwaUNsaWVudC5nZXQoJy9jb250YWN0cy9wb3NpdGlvbnMnKSxcblxuICAvLyBHZXQgYXZhaWxhYmlsaXR5IHR5cGVzXG4gIGdldEF2YWlsYWJpbGl0eVR5cGVzOiAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTxBcnJheTx7IHR5cGU6IHN0cmluZzsgY291bnQ6IG51bWJlciB9Pj4+ID0+XG4gICAgYXBpQ2xpZW50LmdldCgnL2NvbnRhY3RzL2F2YWlsYWJpbGl0eS10eXBlcycpLFxufVxuXG4vLyBIZWFsdGggY2hlY2sgQVBJXG5leHBvcnQgY29uc3QgaGVhbHRoQXBpID0ge1xuICBjaGVjazogKCk6IFByb21pc2U8QXBpUmVzcG9uc2U8eyBzdGF0dXM6IHN0cmluZzsgdGltZXN0YW1wOiBzdHJpbmcgfT4+ID0+XG4gICAgYXBpQ2xpZW50LmdldCgnL2hlYWx0aCcpLFxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVXRpbGl0eSBGdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIENoZWNrIGlmIGVycm9yIGlzIGFuIEFQSSBlcnJvclxuZXhwb3J0IGNvbnN0IGlzQXBpRXJyb3IgPSAoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBBcGlFcnJvciA9PiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEFwaUVycm9yXG59XG5cbi8vIEdldCBlcnJvciBtZXNzYWdlIGZyb20gYW55IGVycm9yIHR5cGVcbmV4cG9ydCBjb25zdCBnZXRFcnJvck1lc3NhZ2UgPSAoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAoaXNBcGlFcnJvcihlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZVxuICB9XG4gIFxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybi
25114BlcnJvci5tZXNzYWdlXG4gIH1cbiAgXG4gIHJldHVybiAnQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCdcbn1cblxuLy8gUmV0cnkgZnVuY3Rpb24gZm9yIGZhaWxlZCByZXF1ZXN0c1xuZXhwb3J0IGNvbnN0IHJldHJ5UmVxdWVzdCA9IGFzeW5jIDxUPihcbiAgcmVxdWVzdEZuOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBtYXhSZXRyaWVzOiBudW1iZXIgPSAzLFxuICBkZWxheTogbnVtYmVyID0gMTAwMFxuKTogUHJvbWlzZTxUPiA9PiB7XG4gIGxldCBsYXN0RXJyb3I6IHVua25vd25cblxuICBmb3IgKGxldCBpID0gMDsgaSA8PSBtYXhSZXRyaWVzOyBpKyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RGbigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxhc3RFcnJvciA9IGVycm9yXG4gICAgICBcbiAgICAgIC8vIERvbid0IHJldHJ5IG9uIGNsaWVudCBlcnJvcnMgKDR4eClcbiAgICAgIGlmIChpc0FwaUVycm9yKGVycm9yKSAmJiBlcnJvci5zdGF0dXMgPj0gNDAwICYmIGVycm9yLnN0YXR1cyA8IDUwMCkge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEb24ndCByZXRyeSBvbiBsYXN0IGF0dGVtcHRcbiAgICAgIGlmIChpID09PSBtYXhSZXRyaWVzKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFdhaXQgYmVmb3JlIHJldHJ5aW5nXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkgKiBNYXRoLnBvdygyLCBpKSkpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbGFzdEVycm9yXG59XG5cbi8vIEV4cG9ydCB0aGUgQVBJIGNsaWVudCBmb3IgYWR2YW5jZWQgdXNhZ2VcbmV4cG9ydCB7IGFwaUNsaWVudCwgQXBpRXJyb3IgfVxuIiwiaW1wb3J0IHsgdXNlUXVlcnksIHVzZU11dGF0aW9uLCB1c2VRdWVyeUNsaWVudCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSdcbmltcG9ydCB7IGxvY2F0aW9uc0FwaSwgaXNBcGlFcnJvciwgZ2V0RXJyb3JNZXNzYWdlIH0gZnJvbSAnQHNlcnZpY2VzL2FwaSdcbmltcG9ydCB7IHVzZUFwcFN0b3JlIH0gZnJvbSAnQHN0b3Jlcy91c2VBcHBTdG9yZSdcbmltcG9ydCB0eXBlIHsgTG9jYXRpb24sIFF1ZXJ5T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2luZGV4J1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUXVlcnkgS2V5c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IGxvY2F0aW9uS2V5cyA9IHtcbiAgYWxsOiBbJ2xvY2F0aW9ucyddIGFzIGNvbnN0LFxuICBsaXN0czogKCkgPT4gWy4uLmxvY2F0aW9uS2V5cy5hbGwsICdsaXN0J10gYXMgY29uc3QsXG4gIGxpc3Q6IChmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBbLi4ubG9jYXRpb25LZXlzLmxpc3RzKCksIGZpbHRlcnNdIGFzIGNvbnN0LFxuICBkZXRhaWxzOiAoKSA9PiBbLi4ubG9jYXRpb25LZXlzLmFsbCwgJ2RldGFpbCddIGFzIGNvbnN0LFxuICBkZXRhaWw6IChpZDogc3RyaW5nKSA9PiBbLi4ubG9jYXRpb25LZXlzLmRldGFpbHMoKSwgaWRdIGFzIGNvbnN0LFxuICBzZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiBbLi4ubG9jYXRpb25LZXlzLmFsbCwgJ3NlYXJjaCcsIHF1ZXJ5XSBhcyBjb25zdCxcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhvb2tzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEhvb2sgdG8gZmV0Y2ggYWxsIGxvY2F0aW9uc1xuICovXG5leHBvcnQgY29uc3QgdXNlTG9jYXRpb25zID0gKG9wdGlvbnM/OiBRdWVyeU9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBzZXRFcnJvciB9ID0gdXNlQXBwU3RvcmUoKVxuXG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IGxvY2F0aW9uS2V5cy5saXN0cygpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbG9jYXRpb25zQXBpLmdldEFsbCgpXG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2UoZXJyb3IpXG4gICAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9LFxuICAgIHN0YWxlVGltZTogMTAgKiA2MCAqIDEwMDAsIC8vIDEwIG1pbnV0ZXNcbiAgICBnY1RpbWU6IDMwICogNjAgKiAxMDAwLCAvLyAzMCBtaW51dGVzXG4gICAgcmV0cnk6IChmYWlsdXJlQ291bnQsIGVycm9yKSA9PiB7XG4gICAgICAvLyBEb24ndCByZXRyeSBvbiBjbGllbnQgZXJyb3JzXG4gICAgICBpZiAoaXNBcGlFcnJvcihlcnJvcikgJiYgZXJyb3Iuc3RhdHVzID49IDQwMCAmJiBlcnJvci5zdGF0dXMgPCA1MDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFpbHVy
25114ZUNvdW50IDwgM1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSlcbn1cblxuLyoqXG4gKiBIb29rIHRvIGZldGNoIGEgc2luZ2xlIGxvY2F0aW9uIGJ5IElEXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VMb2NhdGlvbiA9IChpZDogc3RyaW5nIHwgbnVsbCwgb3B0aW9ucz86IFF1ZXJ5T3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogbG9jYXRpb25LZXlzLmRldGFpbChpZCB8fCAnJyksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKCdMb2NhdGlvbiBJRCBpcyByZXF1aXJlZCcpXG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbG9jYXRpb25zQXBpLmdldEJ5SWQoaWQpXG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2UoZXJyb3IpXG4gICAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9LFxuICAgIGVuYWJsZWQ6ICEhaWQsXG4gICAgc3RhbGVUaW1lOiAxNSAqIDYwICogMTAwMCwgLy8gMTUgbWludXRlc1xuICAgIGdjVGltZTogMzAgKiA2MCAqIDEwMDAsIC8vIDMwIG1pbnV0ZXNcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuXG4vKipcbiAqIEhvb2sgdG8gc2VhcmNoIGxvY2F0aW9uc1xuICovXG5leHBvcnQgY29uc3QgdXNlTG9jYXRpb25TZWFyY2ggPSAocXVlcnk6IHN0cmluZywgb3B0aW9ucz86IFF1ZXJ5T3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogbG9jYXRpb25LZXlzLnNlYXJjaChxdWVyeSksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFxdWVyeS50cmltKCkpIHJldHVybiBbXVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGxvY2F0aW9uc0FwaS5zZWFyY2gocXVlcnkpXG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2UoZXJyb3IpXG4gICAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9LFxuICAgIGVuYWJsZWQ6IHF1ZXJ5LnRyaW0oKS5sZW5ndGggPiAwLFxuICAgIHN0YWxlVGltZTogNSAqIDYwICogMTAwMCwgLy8gNSBtaW51dGVzXG4gICAgZ2NUaW1lOiAxMCAqIDYwICogMTAwMCwgLy8gMTAgbWludXRlc1xuICAgIC4uLm9wdGlvbnMsXG4gIH0pXG59XG5cbi8qKlxuICogSG9vayB0byBnZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsb2NhdGlvblxuICovXG5leHBvcnQgY29uc3QgdXNlU2VsZWN0ZWRMb2NhdGlvbiA9ICgpID0+IHtcbiAgY29uc3Qgc2VsZWN0ZWRMb2NhdGlvbklkID0gdXNlQXBwU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2VsZWN0ZWRMb2NhdGlvbklkKVxuICBjb25zdCBsb2NhdGlvblF1ZXJ5ID0gdXNlTG9jYXRpb24oc2VsZWN0ZWRMb2NhdGlvbklkKVxuXG4gIHJldHVybiB7XG4gICAgbG9jYXRpb246IGxvY2F0aW9uUXVlcnkuZGF0YSxcbiAgICBpc0xvYWRpbmc6IGxvY2F0aW9uUXVlcnkuaXNMb2FkaW5nLFxuICAgIGVycm9yOiBsb2NhdGlvblF1ZXJ5LmVycm9yLFxuICAgIHJlZmV0Y2g6IGxvY2F0aW9uUXVlcnkucmVmZXRjaCxcbiAgfVxufVxuXG4vKipcbiAqIEhvb2sgdG8gcHJlZmV0Y2ggbG9jYXRpb24gZGF0YVxuICovXG5leHBvcnQgY29uc3QgdXNlUHJlZmV0Y2hMb2NhdGlvbiA9ICgpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpXG5cbiAgcmV0dXJuIChpZDogc3RyaW5nKSA9PiB7XG4gICAgcXVlcnlDbGllbnQucHJlZmV0Y2hRdWVyeSh7XG4gICAgICBxdWVyeUtleTogbG9jYXRpb25LZXlzLmRldGFpbChpZCksXG4gICAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbG9jYXRpb25zQXBpLmdldEJ5SWQoaWQpXG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhXG4gICAgICB9LFxuICAgICAgc3RhbGVUaW1lOiAxNSAqIDYwICogMTAwMCxcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogSG9vayBmb3IgbG9jYXRpb24tcmVsYXRlZCBtdXRhdGlvbnMgKGlmIG5lZWRlZCBpbiB0aGUgZnV0dXJlKVxuICovXG5leHBvcnQgY29uc3QgdXNlTG9jYXRpb25NdXRhdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgLy8gRXhhbXBsZTogVXBkYXRlIGxvY2F0aW9uIChmb3IgZnV0dXJlIHVzZSlcbiAgY29uc3QgdXBkYXRlTG9jYXRpb24gPSB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKHsgaWQsIGRhdGEgfTogeyBpZDogc3RyaW5nOyBkYXRhOiBQYXJ0aWFsPExvY2F0aW9uPiB9KSA9PiB7XG4gICAgICAvLyBUaGlzIHdvdWxkIGJlIGltcGxlbWVudGVkIHdoZW4gd2UgaGF2ZSB1cGRhdGUgZnVuY3Rpb25hbGl0eVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGRhdGUgZnVuY3Rpb25hbGl0eSBub3QgaW1wbGVtZW50ZWQgeWV0JylcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKGRhdGEsIHZhcmlhYmxlcykgPT4ge1xuICAgICAgLy8gSW52YWxpZGF0ZSBhbmQgcmVmZXRjaCBsb2NhdGlvbiBxdWVyaWVzXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBsb2NhdGlvbktleXMuZGV0YWlsKHZhcmlhYmxlcy5pZCkgfSlcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGxvY2F0aW9uS2V5cy5saXN0cygpIH0pXG4gICAgfSxcbiAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdldEVycm9yTWVzc2FnZShlcnJvcilcbiAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICB9LFxuICB9KVxuXG4gIHJldHVybi
25114B7XG4gICAgdXBkYXRlTG9jYXRpb24sXG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFV0aWxpdHkgRnVuY3Rpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBsb2NhdGlvbiBmcm9tIGNhY2hlIHdpdGhvdXQgdHJpZ2dlcmluZyBhIHJlcXVlc3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldExvY2F0aW9uRnJvbUNhY2hlID0gKGlkOiBzdHJpbmcpOiBMb2NhdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICByZXR1cm4gcXVlcnlDbGllbnQuZ2V0UXVlcnlEYXRhKGxvY2F0aW9uS2V5cy5kZXRhaWwoaWQpKVxufVxuXG4vKipcbiAqIFNldCBsb2NhdGlvbiBkYXRhIGluIGNhY2hlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRMb2NhdGlvbkluQ2FjaGUgPSAobG9jYXRpb246IExvY2F0aW9uKTogdm9pZCA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICBxdWVyeUNsaWVudC5zZXRRdWVyeURhdGEobG9jYXRpb25LZXlzLmRldGFpbChsb2NhdGlvbi5pZCksIGxvY2F0aW9uKVxufVxuXG4vKipcbiAqIEludmFsaWRhdGUgYWxsIGxvY2F0aW9uIHF1ZXJpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGludmFsaWRhdGVMb2NhdGlvblF1ZXJpZXMgPSAoKTogdm9pZCA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBsb2NhdGlvbktleXMuYWxsIH0pXG59XG5cbi8qKlxuICogUHJlZmV0Y2ggYWxsIGxvY2F0aW9ucyAodXNlZnVsIGZvciBpbml0aWFsIGxvYWQpXG4gKi9cbmV4cG9ydCBjb25zdCBwcmVmZXRjaExvY2F0aW9ucyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpXG4gIGF3YWl0IHF1ZXJ5Q2xpZW50LnByZWZldGNoUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBsb2NhdGlvbktleXMubGlzdHMoKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGxvY2F0aW9uc0FwaS5nZXRBbGwoKVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGFcbiAgICB9LFxuICAgIHN0YWxlVGltZTogMTAgKiA2MCAqIDEwMDAsXG4gIH0pXG59XG4iLCJpbXBvcnQgeyB1c2VRdWVyeSwgdXNlTXV0YXRpb24sIHVzZVF1ZXJ5Q2xpZW50IH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5J1xuaW1wb3J0IHsgY29udGFjdHNBcGksIGlzQXBpRXJyb3IsIGdldEVycm9yTWVzc2FnZSB9IGZyb20gJ0BzZXJ2aWNlcy9hcGknXG5pbXBvcnQgeyB1c2VBcHBTdG9yZSB9IGZyb20gJ0BzdG9yZXMvdXNlQXBwU3RvcmUnXG5pbXBvcnQgdHlwZSB7IENvbnRhY3QsIFF1ZXJ5T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2luZGV4J1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUXVlcnkgS2V5c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IGNvbnRhY3RLZXlzID0ge1xuICBhbGw6IFsnY29udGFjdHMnXSBhcyBjb25zdCxcbiAgbGlzdHM6ICgpID0+IFsuLi5jb250YWN0S2V5cy5hbGwsICdsaXN0J10gYXMgY29uc3QsXG4gIGxpc3Q6IChmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBbLi4uY29udGFjdEtleXMubGlzdHMoKSwgZmlsdGVyc10gYXMgY29uc3QsXG4gIGRldGFpbHM6ICgpID0+IFsuLi5jb250YWN0S2V5cy5hbGwsICdkZXRhaWwnXSBhcyBjb25zdCxcbiAgZGV0YWlsOiAoaWQ6IHN0cmluZykgPT4gWy4uLmNvbnRhY3RLZXlzLmRldGFpbHMoKSwgaWRdIGFzIGNvbnN0LFxuICBieUxvY2F0aW9uOiAobG9jYXRpb25JZDogc3RyaW5nKSA9PiBbLi4uY29udGFjdEtleXMuYWxsLCAnbG9jYXRpb24nLCBsb2NhdGlvbklkXSBhcyBjb25zdCxcbiAgY29udGFjdExvY2F0aW9uczogKGNvbnRhY3RJZDogc3RyaW5nKSA9PiBbLi4uY29udGFjdEtleXMuYWxsLCAnY29udGFjdC1sb2NhdGlvbnMnLCBjb250YWN0SWRdIGFzIGNvbnN0LFxuICBzZWFyY2g6IChxdWVyeTogc3RyaW5nLCBsb2NhdGlvbklkPzogc3RyaW5nKSA9PiBbLi4uY29udGFjdEtleXMuYWxsLCAnc2VhcmNoJywgcXVlcnksIGxvY2F0aW9uSWRdIGFzIGNvbnN0LFxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSG9va3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogSG9vayB0byBmZXRjaCBhbGwgY29udGFjdHMgd2l0aCBvcHRpb25hbCBmaWx0ZXJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZUNvbnRhY3RzID0gKHBhcmFtcz86IHtcbiAgcGFnZT86IG51bWJlclxuICBsaW1pdD86IG51bWJlclxuICBsb2NhdGlvbklkPzogc3RyaW5nXG4gIGRlcGFydG1lbnQ/OiBzdHJpbmdcbiAgc2VhcmNoPzogc3RyaW5nXG59LCBvcHRpb25zPzogUXVlcnlPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHsgc2V0RXJyb3IgfSA9IHVzZUFwcFN0b3JlKClcblxuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBjb250YWN0S2V5cy5saXN0KHBhcmFtcyB8fCB7fSksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250YWN0c0FwaS5nZXRBbGwocGFyYW1zKVxuXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBjb250YWN0IGRhdGEgdG8gZW5zdXJlIGNvbnNpc3RlbnQgZmllbGQgbmFtZXNcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZS5kYXRhKSkge1xuICAgICAgICAgI
25114HJlc3BvbnNlLmRhdGEgPSByZXNwb25zZS5kYXRhLm1hcCgoY29udGFjdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgLi4uY29udGFjdCxcbiAgICAgICAgICAgIGZ1bGxOYW1lOiAoY29udGFjdCBhcyBhbnkpLmZ1bGxuYW1lIHx8IGAkeyhjb250YWN0IGFzIGFueSkuZmlyc3RuYW1lIHx8IGNvbnRhY3QuZmlyc3ROYW1lIHx8ICcnfSAkeyhjb250YWN0IGFzIGFueSkubGFzdG5hbWUgfHwgY29udGFjdC5sYXN0TmFtZSB8fCAnJ31gLnRyaW0oKSB8fCBjb250YWN0LmZ1bGxOYW1lLFxuICAgICAgICAgICAgZmlyc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmZpcnN0bmFtZSB8fCBjb250YWN0LmZpcnN0TmFtZSxcbiAgICAgICAgICAgIGxhc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmxhc3RuYW1lIHx8IGNvbnRhY3QubGFzdE5hbWUsXG4gICAgICAgICAgICBsb2NhdGlvbklkOiAoY29udGFjdCBhcyBhbnkpLmxvY2F0aW9uaWQgfHwgY29udGFjdC5sb2NhdGlvbklkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiAoY29udGFjdCBhcyBhbnkpLmNyZWF0ZWRhdCB8fCBjb250YWN0LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogKGNvbnRhY3QgYXMgYW55KS51cGRhdGVkYXQgfHwgY29udGFjdC51cGRhdGVkQXQsXG4gICAgICAgICAgICBpc0FjdGl2ZTogKGNvbnRhY3QgYXMgYW55KS5pc19hY3RpdmUgIT09IGZhbHNlLFxuICAgICAgICAgICAgc29jaWFsTGlua3M6IGNvbnRhY3Quc29jaWFsTGlua3MgfHwgW11cbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZ2V0RXJyb3JNZXNzYWdlKGVycm9yKVxuICAgICAgICBzZXRFcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSxcbiAgICBzdGFsZVRpbWU6IDUgKiA2MCAqIDEwMDAsIC8vIDUgbWludXRlc1xuICAgIGdjVGltZTogMTUgKiA2MCAqIDEwMDAsIC8vIDE1IG1pbnV0ZXNcbiAgICByZXRyeTogKGZhaWx1cmVDb3VudCwgZXJyb3IpID0+IHtcbiAgICAgIGlmIChpc0FwaUVycm9yKGVycm9yKSAmJiBlcnJvci5zdGF0dXMgPj0gNDAwICYmIGVycm9yLnN0YXR1cyA8IDUwMCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWlsdXJlQ291bnQgPCAzXG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuXG4vKipcbiAqIEhvb2sgdG8gZmV0Y2ggYSBzaW5nbGUgY29udGFjdCBieSBJRFxuICovXG5leHBvcnQgY29uc3QgdXNlQ29udGFjdCA9IChpZDogc3RyaW5nIHwgbnVsbCwgb3B0aW9ucz86IFF1ZXJ5T3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogY29udGFjdEtleXMuZGV0YWlsKGlkIHx8ICcnKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIWlkKSB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRhY3QgSUQgaXMgcmVxdWlyZWQnKVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbnRhY3RzQXBpLmdldEJ5SWQoaWQpXG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2UoZXJyb3IpXG4gICAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9LFxuICAgIGVuYWJsZWQ6ICEhaWQsXG4gICAgc3RhbGVUaW1lOiAxMCAqIDYwICogMTAwMCwgLy8gMTAgbWludXRlc1xuICAgIGdjVGltZTogMzAgKiA2MCAqIDEwMDAsIC8vIDMwIG1pbnV0ZXNcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuXG4vKipcbiAqIEhvb2sgdG8gZmV0Y2ggYWxsIGxvY2F0aW9ucyBmb3IgYSBjb250YWN0XG4gKi9cbmV4cG9ydCBjb25zdCB1c2VDb250YWN0TG9jYXRpb25zID0gKGNvbnRhY3RJZDogc3RyaW5nIHwgbnVsbCwgb3B0aW9ucz86IFF1ZXJ5T3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogY29udGFjdEtleXMuY29udGFjdExvY2F0aW9ucyhjb250YWN0SWQgfHwgJycpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghY29udGFjdElkKSByZXR1cm4gW11cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250YWN0c0FwaS5nZXRDb250YWN0TG9jYXRpb25zKGNvbnRhY3RJZClcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEgfHwgW11cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdldEVycm9yTWVzc2FnZShlcnJvcilcbiAgICAgICAgc2V0RXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjb250YWN0IGxvY2F0aW9uczonLCBlcnJvcilcbiAgICAgICAgcmV0dXJuIFtdIC8vIFJldHVybiBlbXB0eSBhcnJheSBvbiBlcnJvciBpbnN0ZWFkIG9mIHRocm93aW5nXG4gICAgICB9XG4gICAgfSxcbiAgICBlbmFibGVkOiAhIWNvbnRhY3RJZCxcbiAgICBzdGFsZVRpbWU6IDEwICogNjAgKiAxMDAwLCAvLyAxMCBtaW51dGVzXG4gICAgZ2NUaW1lOiAzMCAqIDYwICogMTAwMCwgLy8gMzAgbWludXRlc1xuICAgIC4uLm9wdGlvbnMsXG4gIH0pXG59XG5cbi8qKlxuICogSG9vayB0byBmZXRjaCBjb250YWN0cyBieSBsb2NhdGlvbiAoaW5jbHVkZXMgbWFuYWdlbWVudCBjb250YWN0cylcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZUNvbnRhY3RzQnlMb2NhdGlvbiA9IChsb2NhdGlvbklkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzogUXVlcnlPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHsgc2V0RXJyb3IgfSA9IHVzZUFwcFN0b3JlKClcblxuICAvLyBOb3JtYWxpemUgbG9jYXRpb25JZCB0byBlbnN1cmUgd3AtIHByZWZpeFxuICBjb25zdCBub3JtYWxpem
25114VkTG9jYXRpb25JZCA9IGxvY2F0aW9uSWRcbiAgICA/IChsb2NhdGlvbklkLnN0YXJ0c1dpdGgoJ3dwLScpID8gbG9jYXRpb25JZCA6IGB3cC0ke2xvY2F0aW9uSWR9YClcbiAgICA6IG51bGxcblxuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBjb250YWN0S2V5cy5ieUxvY2F0aW9uKG5vcm1hbGl6ZWRMb2NhdGlvbklkIHx8ICcnKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIW5vcm1hbGl6ZWRMb2NhdGlvbklkKSByZXR1cm4gW11cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250YWN0c0FwaS5nZXRCeUxvY2F0aW9uKG5vcm1hbGl6ZWRMb2NhdGlvbklkKVxuXG4gICAgICAgIC8vIEhhbmRsZSBib3RoIG9sZCBhbmQgbmV3IEFQSSByZXNwb25zZSBzdHJ1Y3R1cmVzXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICAgICAgLy8gT2xkIEFQSSBzdHJ1Y3R1cmU6IHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogQ29udGFjdFtdLCBicmVha2Rvd24/OiB7Li4ufSB9XG4gICAgICAgICAgLy8gTWFwIGJhY2tlbmQgZmllbGQgbmFtZXMgdG8gZnJvbnRlbmQgZXhwZWN0ZWQgbmFtZXNcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkQ29udGFjdHMgPSByZXNwb25zZS5kYXRhLm1hcCgoY29udGFjdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgLi4uY29udGFjdCxcbiAgICAgICAgICAgIGZ1bGxOYW1lOiAoY29udGFjdCBhcyBhbnkpLmZ1bGxuYW1lIHx8IGAkeyhjb250YWN0IGFzIGFueSkuZmlyc3RuYW1lIHx8IGNvbnRhY3QuZmlyc3ROYW1lIHx8ICcnfSAkeyhjb250YWN0IGFzIGFueSkubGFzdG5hbWUgfHwgY29udGFjdC5sYXN0TmFtZSB8fCAnJ31gLnRyaW0oKSB8fCBjb250YWN0LmZ1bGxOYW1lLFxuICAgICAgICAgICAgZmlyc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmZpcnN0bmFtZSB8fCBjb250YWN0LmZpcnN0TmFtZSxcbiAgICAgICAgICAgIGxhc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmxhc3RuYW1lIHx8IGNvbnRhY3QubGFzdE5hbWUsXG4gICAgICAgICAgICBsb2NhdGlvbklkOiAoY29udGFjdCBhcyBhbnkpLmxvY2F0aW9uaWQgfHwgY29udGFjdC5sb2NhdGlvbklkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiAoY29udGFjdCBhcyBhbnkpLmNyZWF0ZWRhdCB8fCBjb250YWN0LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogKGNvbnRhY3QgYXMgYW55KS51cGRhdGVkYXQgfHwgY29udGFjdC51cGRhdGVkQXQsXG4gICAgICAgICAgICBpc0FjdGl2ZTogKGNvbnRhY3QgYXMgYW55KS5pc19hY3RpdmUgIT09IGZhbHNlLCAvLyBEZWZhdWx0IHRvIHRydWVcbiAgICAgICAgICAgIHNvY2lhbExpbmtzOiBjb250YWN0LnNvY2lhbExpbmtzIHx8IFtdLCAvLyBBbHJlYWR5IHRyYW5zZm9ybWVkIGJ5IGJhY2tlbmRcbiAgICAgICAgICAgIC8vIExvY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gYmFja2VuZCBqb2luc1xuICAgICAgICAgICAgbG9jYXRpb25OYW1lOiAoY29udGFjdCBhcyBhbnkpLmxvY2F0aW9ubmFtZSB8fCBjb250YWN0LmxvY2F0aW9uTmFtZSxcbiAgICAgICAgICAgIGxvY2F0aW9uQ2l0eTogKGNvbnRhY3QgYXMgYW55KS5sb2NhdGlvbmNpdHkgfHwgY29udGFjdC5sb2NhdGlvbkNpdHksXG4gICAgICAgICAgICBsb2NhdGlvbkFkZHJlc3M6IChjb250YWN0IGFzIGFueSkubG9jYXRpb25hZGRyZXNzIHx8IGNvbnRhY3QubG9jYXRpb25BZGRyZXNzXG4gICAgICAgICAgfSkpXG5cbiAgICAgICAgICAvLyBGb3IgbG9jYXRpb24tc3BlY2lmaWMgcXVlcmllcywgd2Ugd2FudCB0byBzaG93IGFsbCBjb250YWN0cyBhc3NpZ25lZCB0byB0aGlzIGxvY2F0aW9uXG4gICAgICAgICAgLy8gTm8gZGVkdXBsaWNhdGlvbiBuZWVkZWQgaGVyZSBzaW5jZSB3ZSdyZSBzaG93aW5nIGNvbnRhY3RzIEZPUiB0aGlzIHNwZWNpZmljIGxvY2F0aW9uXG4gICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRDb250YWN0c1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmRhdGEgJiYgdHlwZW9mIHJlc3BvbnNlLmRhdGEgPT09ICdvYmplY3QnICYmICdsb2NhdGlvbkNvbnRhY3RzJyBpbiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgLy8gTkVXIEFQSSBzdHJ1Y3R1cmU6IHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogeyBsb2NhdGlvbkNvbnRhY3RzOiBDb250YWN0W10sIG1hbmFnZW1lbnRDb250YWN0czogQ29udGFjdFtdIH0gfVxuICAgICAgICAgIGNvbnN0IGFwaURhdGEgPSByZXNwb25zZS5kYXRhIGFzIGFueVxuICAgICAgICAgIGNvbnN0IGFsbENvbnRhY3RzID0gW1xuICAgICAgICAgICAgLi4uKGFwaURhdGEubG9jYXRpb25Db250YWN0cyB8fCBbXSksXG4gICAgICAgICAgICAuLi4oYXBpRGF0YS5tYW5hZ2VtZW50Q29udGFjdHMgfHwgW10pXG4gICAgICAgICAgXVxuXG4gICAgICAgICAgcmV0dXJuIGFsbENvbnRhY3RzLm1hcCgoY29udGFjdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgLi4uY29udGFjdCxcbiAgICAgICAgICAgIGZ1bGxOYW1lOiAoY29udGFjdCBhcyBhbnkpLmZ1bGxuYW1lIHx8IGNvbnRhY3QuZnVsbE5hbWUgfHwgYCR7KGNvbnRhY3QgYXMgYW55KS5maXJzdG5hbWUgfHwgY29udGFjdC5maXJzdE5hbWUgfHwgJyd9ICR7KGNvbnRhY3QgYXMgYW55KS5sYXN0bmFtZSB8fCBjb250YWN0Lmxhc3ROYW1lIHx8ICcnfWAudHJpbSgpLFxuICAgICAgICAgICAgZmlyc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmZpcnN0bmFtZSB8fCBjb250YWN0LmZpcnN0TmFtZSxcbiAgICAgICAgICAgIGxhc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmxhc3RuYW1lIHx8IGNvbnRhY3QubGFzdE5hbWUsXG4gICAgICAgICAgICBsb2NhdGlvbklkOiAoY29udGFjdCBhcyBhbnkpLmxvY2F0aW9uaWQgfHwgY29udGFjdC5sb2NhdGlvbklkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiAoY29udGFjdCBhcyBhbnkpLmNyZWF0ZWRhdCB8fCBjb250YWN0LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogKGNvbnRhY3QgYXMgYW55KS51cGRhdGVkYXQgfHwgY29udGFjdC51cGRhdGVkQXQsXG4gICAgICAgICAgICBpc0FjdGl2ZTogKGNvbnRhY3QgYXMgYW55KS5pc19hY3RpdmUgIT09IGZhbHNlLCAvLyBEZWZhdWx0IHRvIHRydWVcbiAgICAgICAgICAgI
25114HNvY2lhbExpbmtzOiBjb250YWN0LnNvY2lhbExpbmtzIHx8IFtdLCAvLyBBbHJlYWR5IHRyYW5zZm9ybWVkIGJ5IGJhY2tlbmRcbiAgICAgICAgICAgIC8vIExvY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gYmFja2VuZCBqb2luc1xuICAgICAgICAgICAgbG9jYXRpb25OYW1lOiAoY29udGFjdCBhcyBhbnkpLmxvY2F0aW9ubmFtZSB8fCBjb250YWN0LmxvY2F0aW9uTmFtZSxcbiAgICAgICAgICAgIGxvY2F0aW9uQ2l0eTogKGNvbnRhY3QgYXMgYW55KS5sb2NhdGlvbmNpdHkgfHwgY29udGFjdC5sb2NhdGlvbkNpdHksXG4gICAgICAgICAgICBsb2NhdGlvbkFkZHJlc3M6IChjb250YWN0IGFzIGFueSkubG9jYXRpb25hZGRyZXNzIHx8IGNvbnRhY3QubG9jYXRpb25BZGRyZXNzXG4gICAgICAgICAgfSkpXG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZGF0YSAmJiAocmVzcG9uc2UuZGF0YSBhcyBhbnkpLmRhdGEgJiYgQXJyYXkuaXNBcnJheSgocmVzcG9uc2UuZGF0YSBhcyBhbnkpLmRhdGEpKSB7XG4gICAgICAgICAgLy8gT2xkIEFQSSBzdHJ1Y3R1cmU6IHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogeyBkYXRhOiBDb250YWN0W10sIHBhZ2luYXRpb246IHsuLi59IH0gfVxuICAgICAgICAgIHJldHVybiAocmVzcG9uc2UuZGF0YSBhcyBhbnkpLmRhdGEubWFwKChjb250YWN0OiBhbnkpID0+ICh7XG4gICAgICAgICAgICAuLi5jb250YWN0LFxuICAgICAgICAgICAgZnVsbE5hbWU6IChjb250YWN0IGFzIGFueSkuZnVsbG5hbWUgfHwgY29udGFjdC5mdWxsTmFtZSB8fCBgJHsoY29udGFjdCBhcyBhbnkpLmZpcnN0bmFtZSB8fCBjb250YWN0LmZpcnN0TmFtZSB8fCAnJ30gJHsoY29udGFjdCBhcyBhbnkpLmxhc3RuYW1lIHx8IGNvbnRhY3QubGFzdE5hbWUgfHwgJyd9YC50cmltKCksXG4gICAgICAgICAgICBmaXJzdE5hbWU6IChjb250YWN0IGFzIGFueSkuZmlyc3RuYW1lIHx8IGNvbnRhY3QuZmlyc3ROYW1lLFxuICAgICAgICAgICAgbGFzdE5hbWU6IChjb250YWN0IGFzIGFueSkubGFzdG5hbWUgfHwgY29udGFjdC5sYXN0TmFtZSxcbiAgICAgICAgICAgIGxvY2F0aW9uSWQ6IChjb250YWN0IGFzIGFueSkubG9jYXRpb25pZCB8fCBjb250YWN0LmxvY2F0aW9uSWQsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IChjb250YWN0IGFzIGFueSkuY3JlYXRlZGF0IHx8IGNvbnRhY3QuY3JlYXRlZEF0LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiAoY29udGFjdCBhcyBhbnkpLnVwZGF0ZWRhdCB8fCBjb250YWN0LnVwZGF0ZWRBdCxcbiAgICAgICAgICAgIGlzQWN0aXZlOiAoY29udGFjdCBhcyBhbnkpLmlzX2FjdGl2ZSAhPT0gZmFsc2UsXG4gICAgICAgICAgICBzb2NpYWxMaW5rczogY29udGFjdC5zb2NpYWxMaW5rcyB8fCBbXSxcbiAgICAgICAgICAgIC8vIExvY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gYmFja2VuZCBqb2luc1xuICAgICAgICAgICAgbG9jYXRpb25OYW1lOiAoY29udGFjdCBhcyBhbnkpLmxvY2F0aW9ubmFtZSB8fCBjb250YWN0LmxvY2F0aW9uTmFtZSxcbiAgICAgICAgICAgIGxvY2F0aW9uQ2l0eTogKGNvbnRhY3QgYXMgYW55KS5sb2NhdGlvbmNpdHkgfHwgY29udGFjdC5sb2NhdGlvbkNpdHksXG4gICAgICAgICAgICBsb2NhdGlvbkFkZHJlc3M6IChjb250YWN0IGFzIGFueSkubG9jYXRpb25hZGRyZXNzIHx8IGNvbnRhY3QubG9jYXRpb25BZGRyZXNzXG4gICAgICAgICAgfSkpXG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZGF0YSAmJiAocmVzcG9uc2UuZGF0YSBhcyBhbnkpLnBhZ2luYXRpb24gJiYgKHJlc3BvbnNlLmRhdGEgYXMgYW55KS5wYWdpbmF0aW9uLnRvdGFsID09PSAwKSB7XG4gICAgICAgICAgLy8gRW1wdHkgcmVzcG9uc2UgZnJvbSBvbGQgQVBJIHN0cnVjdHVyZVxuICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIC0gdHJ5IHRvIGV4dHJhY3QgZGF0YVxuICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhIHx8IFtdXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdldEVycm9yTWVzc2FnZShlcnJvcilcbiAgICAgICAgc2V0RXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH0sXG4gICAgZW5hYmxlZDogISFsb2NhdGlvbklkLFxuICAgIHN0YWxlVGltZTogNSAqIDYwICogMTAwMCwgLy8gNSBtaW51dGVzXG4gICAgZ2NUaW1lOiAxNSAqIDYwICogMTAwMCwgLy8gMTUgbWludXRlc1xuICAgIC4uLm9wdGlvbnMsXG4gIH0pXG59XG5cbi8qKlxuICogSG9vayB0byBzZWFyY2ggY29udGFjdHNcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZUNvbnRhY3RTZWFyY2ggPSAocXVlcnk6IHN0cmluZywgbG9jYXRpb25JZD86IHN0cmluZywgb3B0aW9ucz86IFF1ZXJ5T3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogY29udGFjdEtleXMuc2VhcmNoKHF1ZXJ5LCBsb2NhdGlvbklkKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXF1ZXJ5LnRyaW0oKSkgcmV0dXJuIFtdXG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29udGFjdHNBcGkuc2VhcmNoKHF1ZXJ5LCBsb2NhdGlvbklkKVxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZ2V0RXJyb3JNZXNzYWdlKGVycm9yKVxuICAgICAgICBzZXRFcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSxcbiAgICBlbmFibGVkOiBxdWVyeS50cmltKCkubGVuZ3RoID4gMCxcbiAgICBzdGFsZVRpbWU6IDMgKiA2MCAqIDEwMDAsIC8vIDMgbWludXRlc1xuICAgIGdjVGltZTogMTAgKiA2MCAqIDEwMDAsIC8vIDEwIG1pbnV0ZXNcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuXG4vKipcbiAqIEhvb2sgdG8gZ2V0IGZpbHRlcmVkIGNvbnRhY3RzIGJhc2VkIG9uIGN1cnJlbnQgYXBwIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VGaWx0ZXJlZENvbnRhY3RzID0gKGxvY2F0aW9uSWQ/OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgeyBzZWFyY2hRdWVyeSwgc2VsZWN0ZWREZXBhcnRtZW50cywgc2VsZWN0ZWRMYW5ndWFnZXMgfSA9IHVzZUFwcFN0b3JlKClcblxuICAvLyBOb3JtYWxpemUgbG9jYXRpb25JZCB0byBlbnN1cmUgd3AtIHByZWZpeFxuICBjb25zdCBub3JtYWxpem
25114VkTG9jYXRpb25JZCA9IGxvY2F0aW9uSWRcbiAgICA/IChsb2NhdGlvbklkLnN0YXJ0c1dpdGgoJ3dwLScpID8gbG9jYXRpb25JZCA6IGB3cC0ke2xvY2F0aW9uSWR9YClcbiAgICA6IHVuZGVmaW5lZFxuXG4gIC8vIElmIGxvY2F0aW9uSWQgaXMgcHJvdmlkZWQsIHVzZSB1c2VDb250YWN0c0J5TG9jYXRpb24gdG8gZ2V0IG1hbmFnZW1lbnQgY29udGFjdHMgdG9vXG4gIC8vIE90aGVyd2lzZSB1c2UgdXNlQ29udGFjdHMgZm9yIGdlbmVyYWwgZmlsdGVyaW5nXG4gIGNvbnN0IGNvbnRhY3RzQnlMb2NhdGlvblF1ZXJ5ID0gdXNlQ29udGFjdHNCeUxvY2F0aW9uKG5vcm1hbGl6ZWRMb2NhdGlvbklkIHx8IG51bGwpXG5cbiAgLy8gQnVpbGQgZmlsdGVyIHBhcmFtZXRlcnMgZm9yIGdlbmVyYWwgY29udGFjdHMgcXVlcnlcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIGxvY2F0aW9uSWQ6IG5vcm1hbGl6ZWRMb2NhdGlvbklkLFxuICAgIHNlYXJjaDogc2VhcmNoUXVlcnkgfHwgdW5kZWZpbmVkLFxuICAgIGRlcGFydG1lbnQ6IHNlbGVjdGVkRGVwYXJ0bWVudHMubGVuZ3RoID4gMCA/IHNlbGVjdGVkRGVwYXJ0bWVudHNbMF0gOiB1bmRlZmluZWQsIC8vIFNpbXBsaWZpZWQgZm9yIG5vd1xuICAgIGxpbWl0OiAxMDAwLCAvLyBIaWdoIGxpbWl0IHRvIGdldCBhbGwgY29udGFjdHMgKG5vIHBhZ2luYXRpb24pXG4gIH1cblxuICBjb25zdCBjb250YWN0c1F1ZXJ5ID0gdXNlQ29udGFjdHMocGFyYW1zKVxuXG4gIC8vIFVzZSB0aGUgYXBwcm9wcmlhdGUgcXVlcnkgYmFzZWQgb24gd2hldGhlciBsb2NhdGlvbklkIGlzIHByb3ZpZGVkXG4gIGNvbnN0IGFjdGl2ZVF1ZXJ5ID0gbm9ybWFsaXplZExvY2F0aW9uSWQgPyBjb250YWN0c0J5TG9jYXRpb25RdWVyeSA6IGNvbnRhY3RzUXVlcnlcblxuICAvLyBBZGRpdGlvbmFsIGNsaWVudC1zaWRlIGZpbHRlcmluZyBmb3IgbGFuZ3VhZ2VzIChpZiBuZWVkZWQpIGFuZCBuYW1lIG5vcm1hbGl6YXRpb25cbiAgLy8gRm9yIGxvY2F0aW9uSWQgcXVlcmllcywgYWN0aXZlUXVlcnkuZGF0YSBpcyBhbHJlYWR5IGFuIGFycmF5XG4gIC8vIEZvciBnZW5lcmFsIHF1ZXJpZXMsIGFjdGl2ZVF1ZXJ5LmRhdGEuZGF0YSBpcyB0aGUgYXJyYXlcbiAgY29uc3QgcmF3Q29udGFjdHMgPSBub3JtYWxpemVkTG9jYXRpb25JZFxuICAgID8gKGFjdGl2ZVF1ZXJ5LmRhdGEgfHwgW10pXG4gICAgOiAoY29udGFjdHNRdWVyeS5kYXRhPy5kYXRhIHx8IFtdKVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRDb250YWN0cyA9IHJhd0NvbnRhY3RzLm1hcChjb250YWN0ID0+ICh7XG4gICAgLi4uY29udGFjdCxcbiAgICAvLyBOb3JtYWxpemUgZnVsbE5hbWUgZmllbGQgbGlrZSBpbiB1c2VDb250YWN0c0J5TG9jYXRpb25cbiAgICBmdWxsTmFtZTogKGNvbnRhY3QgYXMgYW55KS5mdWxsbmFtZSB8fCBgJHsoY29udGFjdCBhcyBhbnkpLmZpcnN0bmFtZSB8fCBjb250YWN0LmZpcnN0TmFtZSB8fCAnJ30gJHsoY29udGFjdCBhcyBhbnkpLmxhc3RuYW1lIHx8IGNvbnRhY3QubGFzdE5hbWUgfHwgJyd9YC50cmltKCkgfHwgY29udGFjdC5mdWxsTmFtZSxcbiAgICBmaXJzdE5hbWU6IChjb250YWN0IGFzIGFueSkuZmlyc3RuYW1lIHx8IGNvbnRhY3QuZmlyc3ROYW1lLFxuICAgIGxhc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmxhc3RuYW1lIHx8IGNvbnRhY3QubGFzdE5hbWUsXG4gICAgbG9jYXRpb25JZDogKGNvbnRhY3QgYXMgYW55KS5sb2NhdGlvbmlkIHx8IGNvbnRhY3QubG9jYXRpb25JZCxcbiAgICBjcmVhdGVkQXQ6IChjb250YWN0IGFzIGFueSkuY3JlYXRlZGF0IHx8IGNvbnRhY3QuY3JlYXRlZEF0LFxuICAgIHVwZGF0ZWRBdDogKGNvbnRhY3QgYXMgYW55KS51cGRhdGVkYXQgfHwgY29udGFjdC51cGRhdGVkQXQsXG4gICAgaXNBY3RpdmU6IChjb250YWN0IGFzIGFueSkuaXNfYWN0aXZlICE9PSBmYWxzZSxcbiAgICBzb2NpYWxMaW5rczogY29udGFjdC5zb2NpYWxMaW5rcyB8fCBbXVxuICB9KSlcblxuICAvLyBEZWR1cGxpY2F0ZSBjb250YWN0cyBieSB3cF9pZCAoc2FtZSBwZXJzb24sIG11bHRpcGxlIGxvY2F0aW9ucylcbiAgLy8gQUxXQVlTIGRlZHVwbGljYXRlIC0gYSBwZXJzb24gc2hvdWxkIG9ubHkgYXBwZWFyIG9uY2VcbiAgY29uc3QgZGVkdXBsaWNhdGVkQ29udGFjdHMgPSAoKCkgPT4ge1xuICAgIGNvbnN0IHNlZW5XcElkcyA9IG5ldyBTZXQ8bnVtYmVyPigpXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRDb250YWN0cy5maWx0ZXIoY29udGFjdCA9PiB7XG4gICAgICBsZXQgd3BJZCA9IChjb250YWN0IGFzIGFueSkud3BfaWRcblxuICAgICAgLy8gRmFsbGJhY2s6IEV4dHJhY3Qgd3BfaWQgZnJvbSBjb250YWN0IElEIGlmIHdwX2lkIGlzIG51bGwvdW5kZWZpbmVkXG4gICAgICAvLyBJRCBmb3JtYXQ6IFwid3AtNTQ4OC00MTdcIiAtPiB3cF9pZCA9IDU0ODhcbiAgICAgIGlmICghd3BJZCAmJiBjb250YWN0LmlkLnN0YXJ0c1dpdGgoJ3dwLScpKSB7XG4gICAgICAgIGNvbnN0IGlkUGFydHMgPSBjb250YWN0LmlkLnNwbGl0KCctJylcbiAgICAgICAgaWYgKGlkUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICB3cElkID0gcGFyc2VJbnQoaWRQYXJ0c1sxXSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDwn5SNIERFQlVHOiBMb2cgZGVkdXBsaWNhdGlvbiBwcm9jZXNzXG4gICAgICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogRGVkdXBsaWNhdGlvbiAtIGNvbnRhY3Q6JywgY29udGFjdC5pZCwgJ3dwX2lkOicsIHdwSWQsICdmdWxsTmFtZTonLCBjb250YWN0LmZ1bGxOYW1lKVxuXG4gICAgICAvLyBJZiBubyB3cF9pZCwga2VlcCB0aGUgY29udGFjdCAoZmFsbGJhY2sgZm9yIG9sZCBkYXRhKVxuICAgICAgaWYgKCF3cElkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiBLZWVwaW5nIGNvbnRhY3Qgd2l0aG91dCB3cF9pZDonLCBjb250YWN0LmlkKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSd2ZSBzZWVuIHRoaXMgd3BfaWQgYmVmb3JlLCBza2lwIGl0XG4gICAgICBpZiAoc2VlbldwSWRzLmhhcyh3cElkKSkge1xuICAgICAgICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogU2tpcHBpbmcgZHVwbGljYXRlIHdwX2lkOicsIHdwSWQsICdmb3IgY29udGFjdDonLCBjb250YWN0LmlkKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gRmlyc3QgdGltZSBzZWVpbmcgdGhpcyB3cF9pZCwga2VlcCBpdFxuICAgICAgc2VlbldwSWRzLmFkZCh3cElkKVxuICAgICAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IEtlZXBpbmcgZmlyc3Qgb2NjdXJyZW5jZSBvZiB3cF9pZDonLCB3cElkLCAnZm9yIGNvbnRhY3Q6JywgY29udGFjdC5pZClcbiAgICAgIHJldHVybi
25114B0cnVlXG4gICAgfSlcbiAgfSkoKVxuXG4gIC8vIEFwcGx5IGxhbmd1YWdlIGZpbHRlcmluZyBhZnRlciBkZWR1cGxpY2F0aW9uXG4gIGNvbnN0IGZpbHRlcmVkQ29udGFjdHMgPSBkZWR1cGxpY2F0ZWRDb250YWN0cy5maWx0ZXIoY29udGFjdCA9PiB7XG4gICAgaWYgKHNlbGVjdGVkTGFuZ3VhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gY29udGFjdC5sYW5ndWFnZXM/LnNvbWUobGFuZyA9PiBzZWxlY3RlZExhbmd1YWdlcy5pbmNsdWRlcyhsYW5nKSlcbiAgfSlcblxuICAvLyBTZXBhcmF0ZSBsb2NhdGlvbi1zcGVjaWZpYyBjb250YWN0cyBmcm9tIG1hbmFnZW1lbnQgY29udGFjdHNcbiAgLy8gTG9jYXRpb24tc3BlY2lmaWM6IGhhdmUgbG9jYXRpb25JZCBtYXRjaGluZyB0aGUgcmVxdWVzdGVkIGxvY2F0aW9uXG4gIC8vIE1hbmFnZW1lbnQ6IGhhdmUgbG9jYXRpb25JZCA9IG51bGxcbiAgY29uc3QgbG9jYXRpb25TcGVjaWZpY0NvbnRhY3RzID0gbm9ybWFsaXplZExvY2F0aW9uSWRcbiAgICA/IGZpbHRlcmVkQ29udGFjdHMuZmlsdGVyKGNvbnRhY3QgPT4ge1xuICAgICAgICBjb25zdCBjb250YWN0TG9jYXRpb25JZCA9IChjb250YWN0IGFzIGFueSkubG9jYXRpb25pZCB8fCBjb250YWN0LmxvY2F0aW9uSWRcbiAgICAgICAgcmV0dXJuIGNvbnRhY3RMb2NhdGlvbklkID09PSBub3JtYWxpemVkTG9jYXRpb25JZFxuICAgICAgfSlcbiAgICA6IFtdXG5cbiAgLy8g8J+UjSBERUJVRzogTG9nIGNvbnRhY3QgcHJvY2Vzc2luZ1xuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogdXNlRmlsdGVyZWRDb250YWN0cyAtIFJhdyBBUEkgZGF0YTonLCByYXdDb250YWN0cylcbiAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IHVzZUZpbHRlcmVkQ29udGFjdHMgLSBGaXJzdCByYXcgY29udGFjdDonLCByYXdDb250YWN0cz8uWzBdKVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogdXNlRmlsdGVyZWRDb250YWN0cyAtIE5vcm1hbGl6ZWQgY29udGFjdHM6Jywgbm9ybWFsaXplZENvbnRhY3RzPy5sZW5ndGggfHwgMClcbiAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IHVzZUZpbHRlcmVkQ29udGFjdHMgLSBGaXJzdCBub3JtYWxpemVkIGNvbnRhY3Q6Jywgbm9ybWFsaXplZENvbnRhY3RzPy5bMF0pXG4gIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiB1c2VGaWx0ZXJlZENvbnRhY3RzIC0gRGVkdXBsaWNhdGVkIGNvbnRhY3RzOicsIGRlZHVwbGljYXRlZENvbnRhY3RzPy5sZW5ndGggfHwgMClcbiAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IHVzZUZpbHRlcmVkQ29udGFjdHMgLSBGaW5hbCBmaWx0ZXJlZCBjb250YWN0czonLCBmaWx0ZXJlZENvbnRhY3RzPy5sZW5ndGggfHwgMClcbiAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IHVzZUZpbHRlcmVkQ29udGFjdHMgLSBMb2NhdGlvbi1zcGVjaWZpYyBjb250YWN0czonLCBsb2NhdGlvblNwZWNpZmljQ29udGFjdHM/Lmxlbmd0aCB8fCAwKVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogdXNlRmlsdGVyZWRDb250YWN0cyAtIG9yaWdpbmFsIGxvY2F0aW9uSWQ6JywgbG9jYXRpb25JZClcbiAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IHVzZUZpbHRlcmVkQ29udGFjdHMgLSBub3JtYWxpemVkIGxvY2F0aW9uSWQ6Jywgbm9ybWFsaXplZExvY2F0aW9uSWQpXG4gIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiB1c2VGaWx0ZXJlZENvbnRhY3RzIC0gc2VhcmNoUXVlcnk6Jywgc2VhcmNoUXVlcnkpXG4gIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiB1c2VGaWx0ZXJlZENvbnRhY3RzIC0gc2VsZWN0ZWRMYW5ndWFnZXM6Jywgc2VsZWN0ZWRMYW5ndWFnZXMpXG5cbiAgcmV0dXJuIHtcbiAgICBjb250YWN0czogZmlsdGVyZWRDb250YWN0cyxcbiAgICBsb2NhdGlvblNwZWNpZmljQ29udGFjdHM6IGxvY2F0aW9uU3BlY2lmaWNDb250YWN0cywgLy8gTkVXOiBPbmx5IGxvY2F0aW9uLXNwZWNpZmljIGNvbnRhY3RzXG4gICAgbG9jYXRpb25TcGVjaWZpY0NvdW50OiBsb2NhdGlvblNwZWNpZmljQ29udGFjdHMubGVuZ3RoLCAvLyBORVc6IENvdW50IG9mIGxvY2F0aW9uLXNwZWNpZmljIGNvbnRhY3RzIG9ubHlcbiAgICBwYWdpbmF0aW9uOiBub3JtYWxpemVkTG9jYXRpb25JZCA/IHVuZGVmaW5lZCA6IGNvbnRhY3RzUXVlcnkuZGF0YT8ucGFnaW5hdGlvbixcbiAgICBpc0xvYWRpbmc6IGFjdGl2ZVF1ZXJ5LmlzTG9hZGluZyxcbiAgICBlcnJvcjogYWN0aXZlUXVlcnkuZXJyb3IsXG4gICAgcmVmZXRjaDogYWN0aXZlUXVlcnkucmVmZXRjaCxcbiAgfVxufVxuXG4vKipcbiAqIEhvb2sgdG8gZ2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29udGFjdFxuICovXG5leHBvcnQgY29uc3QgdXNlU2VsZWN0ZWRDb250YWN0ID0gKCkgPT4ge1xuICBjb25zdCBzZWxlY3RlZENvbnRhY3QgPSB1c2VBcHBTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZWxlY3RlZENvbnRhY3QpXG4gIFxuICAvLyBJZiB3ZSBoYXZlIGEgc2VsZWN0ZWQgY29udGFjdCBidXQgb25seSBwYXJ0aWFsIGRhdGEsIGZldGNoIGZ1bGwgZGV0YWlsc1xuICBjb25zdCBjb250YWN0UXVlcnkgPSB1c2VDb250YWN0KFxuICAgIHNlbGVjdGVkQ29udGFjdD8uaWQgfHwgbnVsbCxcbiAgICB7IGVuYWJsZWQ6ICEhc2VsZWN0ZWRDb250YWN0Py5pZCB9XG4gIClcblxuICByZXR1cm4ge1xuICAgIGNvbnRhY3Q6IGNvbnRhY3RRdWVyeS5kYXRhIHx8IHNlbGVjdGVkQ29udGFjdCxcbiAgICBpc0xvYWRpbmc6IGNvbnRhY3RRdWVyeS5pc0xvYWRpbmcsXG4gICAgZXJyb3I6IGNvbnRhY3RRdWVyeS5lcnJvcixcbiAgICByZWZldGNoOiBjb250YWN0UXVlcnkucmVmZXRjaCxcbiAgfVxufVxuXG4vKipcbiAqIEhvb2sgdG8gcHJlZmV0Y2ggY29udGFjdCBkYXRhXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VQcmVmZXRjaENvbnRhY3QgPSAoKSA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuXG4gIHJldHVybiAoaWQ6IHN0cmluZykgPT4ge1xuICAgIHF1ZXJ5Q2xpZW50LnByZWZldGNoUXVlcnkoe1xuICAgICAgcXVlcnlLZXk6IGNvbnRhY3RLZXlzLmRldGFpbChpZCksXG4gICAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29udGFjdHNBcGkuZ2V0QnlJZChpZClcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGFcbiAgICAgIH0sXG4gICAgICBzdGFsZVRpbWU6IDEwICogNjAgKiAxMDAwLFxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBIb29rIGZvciBjb250YWN0LXJlbGF0ZWQgbXV0YXRpb25zIChpZiBuZWVkZWQgaW4gdGhlIGZ1dHVyZSlcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZUNvbnRhY3RNdXRhdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgLy8gRXhhbXBsZTogVXBkYXRlIGNvbnRhY3QgKGZvciBmdXR1cmUgdXNlKVxuICBjb25zdCB1cGRhdGVDb250YWN0ID0gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jICh7IGlkLCBkYXRhIH06IHsgaWQ6IHN0cmluZzsgZGF0YTogUGFydGlhbDxDb250YWN0PiB9KSA9PiB7XG4gICAgICAvLyBUaGlzIHdvdWxkIGJlIGltcGxlbWVudGVkIHdoZW4gd2UgaGF2ZSB1cGRhdGUgZnVuY3Rpb25hbGl0eVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGRhdGUgZnVuY3Rpb25hbGl0eSBub3QgaW1wbGVtZW50ZWQgeWV0JylcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKGRhdGE6IGFueSwgdmFyaWFibGVzOiBhbnkpID0+IHtcbiAgICAgIC8vIEludmFsaWRhdGUgYW5kIHJlZmV0Y2ggY29udGFjdCBxdWVyaWVzXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBjb250YWN0S2V5cy5kZXRhaWwodmFyaWFibGVzLmlkKSB9KVxuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogY29udGFjdEtleXMubGlzdHMoKSB9KVxuICAgICAgaWYgKGRhdGE/LmxvY2F0aW9uSWQpIHtcbiAgICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogY29udGFjdEtleXMuYnlMb2NhdGlvbihkYXRhLmxvY2F0aW9uSWQpIH0pXG4gICAgICB9XG4gICAgfSxcbiAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdldEVycm9yTWVzc2FnZShlcnJvcilcbiAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICB9LFxuICB9KVxuXG4gIHJldHVybi
25114B7XG4gICAgdXBkYXRlQ29udGFjdCxcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVXRpbGl0eSBGdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IGNvbnRhY3QgZnJvbSBjYWNoZSB3aXRob3V0IHRyaWdnZXJpbmcgYSByZXF1ZXN0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb250YWN0RnJvbUNhY2hlID0gKGlkOiBzdHJpbmcpOiBDb250YWN0IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpXG4gIHJldHVybiBxdWVyeUNsaWVudC5nZXRRdWVyeURhdGEoY29udGFjdEtleXMuZGV0YWlsKGlkKSlcbn1cblxuLyoqXG4gKiBTZXQgY29udGFjdCBkYXRhIGluIGNhY2hlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDb250YWN0SW5DYWNoZSA9IChjb250YWN0OiBDb250YWN0KTogdm9pZCA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICBxdWVyeUNsaWVudC5zZXRRdWVyeURhdGEoY29udGFjdEtleXMuZGV0YWlsKGNvbnRhY3QuaWQpLCBjb250YWN0KVxufVxuXG4vKipcbiAqIEludmFsaWRhdGUgYWxsIGNvbnRhY3QgcXVlcmllc1xuICovXG5leHBvcnQgY29uc3QgaW52YWxpZGF0ZUNvbnRhY3RRdWVyaWVzID0gKCk6IHZvaWQgPT4ge1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KClcbiAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogY29udGFjdEtleXMuYWxsIH0pXG59XG5cbi8qKlxuICogUHJlZmV0Y2ggY29udGFjdHMgZm9yIGEgbG9jYXRpb24gKHVzZWZ1bCBmb3IgaG92ZXIgc3RhdGVzKVxuICovXG5leHBvcnQgY29uc3QgcHJlZmV0Y2hDb250YWN0c0J5TG9jYXRpb24gPSBhc3luYyAobG9jYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICBhd2FpdCBxdWVyeUNsaWVudC5wcmVmZXRjaFF1ZXJ5KHtcbiAgICBxdWVyeUtleTogY29udGFjdEtleXMuYnlMb2NhdGlvbihsb2NhdGlvbklkKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbnRhY3RzQXBpLmdldEJ5TG9jYXRpb24obG9jYXRpb25JZClcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhXG4gICAgfSxcbiAgICBzdGFsZVRpbWU6IDUgKiA2MCAqIDEwMDAsXG4gIH0pXG59XG4iLCJmdW5jdGlvbiByKGUpe3ZhciB0LGYsbj1cIlwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlfHxcIm51bWJlclwiPT10eXBlb2YgZSluKz1lO2Vsc2UgaWYoXCJvYmplY3RcIj09dHlwZW9mIGUpaWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIG89ZS5sZW5ndGg7Zm9yKHQ9MDt0PG87dCsrKWVbdF0mJihmPXIoZVt0XSkpJiYobiYmKG4rPVwiIFwiKSxuKz1mKX1lbHNlIGZvcihmIGluIGUpZVtmXSYmKG4mJihuKz1cIiBcIiksbis9Zik7cmV0dXJuIG59ZXhwb3J0IGZ1bmN0aW9uIGNsc3goKXtmb3IodmFyIGUsdCxmPTAsbj1cIlwiLG89YXJndW1lbnRzLmxlbmd0aDtmPG87ZisrKShlPWFyZ3VtZW50c1tmXSkmJih0PXIoZSkpJiYobiYmKG4rPVwiIFwiKSxuKz10KTtyZXR1cm4gbn1leHBvcnQgZGVmYXVsdCBjbHN4OyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNsc3ggfSBmcm9tICdjbHN4J1xuXG5pbnRlcmZhY2UgTG9hZGluZ1NwaW5uZXJQcm9wcyB7XG4gIHNpemU/OiAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnXG4gIGNvbG9yPzogJ3ByaW1hcnknIHwgJ3NlY29uZGFyeScgfCAnd2hpdGUnXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBsYWJlbD86IHN0cmluZ1xufVxuXG5jb25zdCBzaXplQ2xhc3NlcyA9IHtcbiAgc206ICd3LTQgaC00IGJvcmRlci0yJyxcbiAgbWQ6ICd3LTYgaC02IGJvcmRlci0yJyxcbiAgbGc6ICd3LTggaC04IGJvcmRlci0zJyxcbiAgeGw6ICd3LTEyIGgtMTIgYm9yZGVyLTQnXG59XG5cbmNvbnN0IGNvbG9yQ2xhc3NlcyA9IHtcbiAgcHJpbWFyeTogJ2JvcmRlci1tZWMtcHJpbWFyeS8yMCBib3JkZXItdC1tZWMtcHJpbWFyeScsXG4gIHNlY29uZGFyeTogJ2JvcmRlci10ZXh0LW11dGVkLzIwIGJvcmRlci10LXRleHQtbXV0ZWQnLFxuICB3aGl0ZTogJ2JvcmRlci13aGl0ZS8yMCBib3JkZXItdC13aGl0ZSdcbn1cblxuZXhwb3J0IGNvbnN0IExvYWRpbmdTcGlubmVyOiBSZWFjdC5GQzxMb2FkaW5nU3Bpbm5lclByb3BzPiA9ICh7XG4gIHNpemUgPSAnbWQnLFxuICBjb2xvciA9ICdwcmltYXJ5JyxcbiAgY2xhc3NOYW1lLFxuICBsYWJlbCA9ICdMw6RkdC4uLidcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IFxuICAgICAgY2xhc3NOYW1lPXtjbHN4KCdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTInLCBjbGFzc05hbWUpfVxuICAgICAgcm9sZT1cInN0YXR1c1wiXG4gICAgICBhcmlhLWxhYmVsPXtsYWJlbH1cbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAnYW5pbWF0ZS1zcGluIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgc2l6ZUNsYXNzZXNbc2l6ZV0sXG4gICAgICAgICAgY29sb3JDbGFzc2VzW2NvbG9yXVxuICAgICAgICApfVxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgLz5cbiAgICAgIHtsYWJlbCAmJiAoXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNyLW9ubHlcIj5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gIClcbn1cblxuLy8gU2tlbGV0b24gbG9hZGluZyBjb21wb25lbnQgZm9yIGNvbnRlbnQgcGxhY2Vob2xkZXJzXG5pbnRlcmZhY2UgU2tlbGV0b25Qcm9wcyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICB2YXJpYW50PzogJ3RleHQnIHwgJ3JlY3Rhbmd1bGFyJyB8ICdjaXJjdWxhcidcbiAgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXJcbiAgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyXG4gIGxpbmVzPzogbnVtYmVyXG59XG5cbmV4cG9ydCBjb25zdCBTa2VsZXRvbjogUmVhY3QuRkM8U2tlbGV0b25Qcm9wcz4gPSAoe1xuICBjbGFzc05hbWUsXG4gIHZhcmlhbnQgPSAndGV4dCcsXG4gIHdpZHRoLFxuICBoZWlnaHQsXG4gIGxpbmVzID0gMVxufSkgPT4ge1xuICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdsb2FkaW5nLXNrZWxldG9uJ1xuICBcbiAgY29uc3QgdmFyaWFudENsYXNzZXMgPSB7XG4gICAgdGV4dDogJ2gtNCByb3VuZGVkJyxcbiAgICByZWN0YW5ndWxhcjogJ3JvdW5kZWQtbWVjJyxcbiAgICBjaXJj
25114dWxhcjogJ3JvdW5kZWQtZnVsbCdcbiAgfVxuXG4gIGNvbnN0IHN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge31cbiAgaWYgKHdpZHRoKSBzdHlsZS53aWR0aCA9IHR5cGVvZiB3aWR0aCA9PT0gJ251bWJlcicgPyBgJHt3aWR0aH1weGAgOiB3aWR0aFxuICBpZiAoaGVpZ2h0KSBzdHlsZS5oZWlnaHQgPSB0eXBlb2YgaGVpZ2h0ID09PSAnbnVtYmVyJyA/IGAke2hlaWdodH1weGAgOiBoZWlnaHRcblxuICBpZiAodmFyaWFudCA9PT0gJ3RleHQnICYmIGxpbmVzID4gMSkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xzeCgnc3BhY2UteS0yJywgY2xhc3NOYW1lKX0+XG4gICAgICAgIHtBcnJheS5mcm9tKHsgbGVuZ3RoOiBsaW5lcyB9KS5tYXAoKF8sIGluZGV4KSA9PiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChiYXNlQ2xhc3NlcywgdmFyaWFudENsYXNzZXNbdmFyaWFudF0pfVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICAgIHdpZHRoOiBpbmRleCA9PT0gbGluZXMgLSAxID8gJzc1JScgOiAnMTAwJSdcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y2xzeChiYXNlQ2xhc3NlcywgdmFyaWFudENsYXNzZXNbdmFyaWFudF0sIGNsYXNzTmFtZSl9XG4gICAgICBzdHlsZT17c3R5bGV9XG4gICAgLz5cbiAgKVxufVxuXG4vLyBMb2FkaW5nIG92ZXJsYXkgY29tcG9uZW50XG5pbnRlcmZhY2UgTG9hZGluZ092ZXJsYXlQcm9wcyB7XG4gIGlzVmlzaWJsZTogYm9vbGVhblxuICBtZXNzYWdlPzogc3RyaW5nXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgTG9hZGluZ092ZXJsYXk6IFJlYWN0LkZDPExvYWRpbmdPdmVybGF5UHJvcHM+ID0gKHtcbiAgaXNWaXNpYmxlLFxuICBtZXNzYWdlID0gJ0zDpGR0Li4uJyxcbiAgY2xhc3NOYW1lXG59KSA9PiB7XG4gIGlmICghaXNWaXNpYmxlKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAnYWJzb2x1dGUgaW5zZXQtMCBiZy13aGl0ZS84MCBiYWNrZHJvcC1ibHVyLXNtJyxcbiAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHotNTAnLFxuICAgICAgICAnYW5pbWF0ZS1pbiBmYWRlLWluIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyXCI+XG4gICAgICAgIDxMb2FkaW5nU3Bpbm5lciBzaXplPVwibGdcIiAvPlxuICAgICAgICB7bWVzc2FnZSAmJiAoXG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMyB0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgIHttZXNzYWdlfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG5cbi8vIExvYWRpbmcgY2FyZCBjb21wb25lbnQgZm9yIGdyaWQgbGF5b3V0c1xuaW50ZXJmYWNlIExvYWRpbmdDYXJkUHJvcHMge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgc2hvd0ltYWdlPzogYm9vbGVhblxuICBzaG93VGl0bGU/OiBib29sZWFuXG4gIHNob3dEZXNjcmlwdGlvbj86IGJvb2xlYW5cbiAgbGluZXM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGNvbnN0IExvYWRpbmdDYXJkOiBSZWFjdC5GQzxMb2FkaW5nQ2FyZFByb3BzPiA9ICh7XG4gIGNsYXNzTmFtZSxcbiAgc2hvd0ltYWdlID0gdHJ1ZSxcbiAgc2hvd1RpdGxlID0gdHJ1ZSxcbiAgc2hvd0Rlc2NyaXB0aW9uID0gdHJ1ZSxcbiAgbGluZXMgPSAyXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ2NhcmQgcC00IHNwYWNlLXktMycsIGNsYXNzTmFtZSl9PlxuICAgICAge3Nob3dJbWFnZSAmJiAoXG4gICAgICAgIDxTa2VsZXRvbiB2YXJpYW50PVwicmVjdGFuZ3VsYXJcIiBoZWlnaHQ9ezEyMH0gLz5cbiAgICAgICl9XG4gICAgICBcbiAgICAgIHtzaG93VGl0bGUgJiYgKFxuICAgICAgICA8U2tlbGV0b24gdmFyaWFudD1cInRleHRcIiB3aWR0aD1cIjc1JVwiIC8+XG4gICAgICApfVxuICAgICAgXG4gICAgICB7c2hvd0Rlc2NyaXB0aW9uICYmIChcbiAgICAgICAgPFNrZWxldG9uIHZhcmlhbnQ9XCJ0ZXh0XCIgbGluZXM9e2xpbmVzfSAvPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4vLyBMb2FkaW5nIGxpc3QgY29tcG9uZW50XG5pbnRlcmZhY2UgTG9hZGluZ0xpc3RQcm9wcyB7XG4gIGl0ZW1zPzogbnVtYmVyXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgTG9hZGluZ0xpc3Q6IFJlYWN0LkZDPExvYWRpbmdMaXN0UHJvcHM+ID0gKHtcbiAgaXRlbXMgPSAzLFxuICBjbGFzc05hbWVcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xzeCgnc3BhY2UteS0zJywgY2xhc3NOYW1lKX0+XG4gICAgICB7QXJyYXkuZnJvbSh7IGxlbmd0aDogaXRlbXMgfSkubWFwKChfLCBpbmRleCkgPT4gKFxuICAgICAgICA8ZGl2IGtleT17aW5kZXh9IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMyBwLTMgYm9yZGVyIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5IHJvdW5kZWQtbWVjXCI+XG4gICAgICAgICAgPFNrZWxldG9uIHZhcmlhbnQ9XCJjaXJjdWxhclwiIHdpZHRoPXs0MH0gaGVpZ2h0PXs0MH0gLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBzcGFjZS15LTJcIj5cbiAgICAgICAgICAgIDxTa2VsZXRvbiB2YXJpYW50PVwidGV4dFwiIHdpZHRoPVwiNjAlXCIgLz5cbiAgICAgICAgICAgIDxTa2VsZXRvbiB2YXJpYW50PVwidGV4dFwiIHdpZHRoPVwiNDAlXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBkZWZhdWx0QXR0cmlidXRlcyA9IHtcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgd2lkdGg6IDI0LFxuICBoZWlnaHQ6IDI0LFxuICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxuICBmaWxsOiBcIm5vbmVcIixcbiAgc3Ryb2tlOiBcImN1cnJlbnRDb2xvclwiLFxuICBzdHJva2VXaWR0aDogMixcbiAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiXG59O1xuXG5leHBvcnQgeyBkZWZhdWx0QXR0cmlidXRlcyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWZhdWx0QXR0cmlidXRlcy5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgeyBmb3J3YXJkUmVmLCBjcmVhdGVFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGRlZmF1bHRBdHRyaWJ1dGVzIGZyb20gJy4vZGVmYXVsdEF0dHJpYnV0ZXMuanMnO1xuXG5jb25zdCB0b0tlYmFiQ2FzZSA9IChzdHJpbmcpID0+IHN0cmluZy5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCBcIiQxLSQyXCIpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuY29uc3QgY3JlYXRlTHVjaWRlSWNvbiA9IChpY29uTmFtZSwgaWNvbk5vZGUpID0+IHtcbiAgY29uc3QgQ29tcG9uZW50ID0gZm9yd2FyZFJlZihcbiAgICAoeyBjb2xvciA9IFwiY3VycmVudENvbG9yXCIsIHNpemUgPSAyNCwgc3Ryb2tlV2lkdGggPSAyLCBhYnNvbHV0ZVN0cm9rZVdpZHRoLCBjbGFzc05hbWUgPSBcIlwiLCBjaGlsZHJlbiwgLi4ucmVzdCB9
25114LCByZWYpID0+IGNyZWF0ZUVsZW1lbnQoXG4gICAgICBcInN2Z1wiLFxuICAgICAge1xuICAgICAgICByZWYsXG4gICAgICAgIC4uLmRlZmF1bHRBdHRyaWJ1dGVzLFxuICAgICAgICB3aWR0aDogc2l6ZSxcbiAgICAgICAgaGVpZ2h0OiBzaXplLFxuICAgICAgICBzdHJva2U6IGNvbG9yLFxuICAgICAgICBzdHJva2VXaWR0aDogYWJzb2x1dGVTdHJva2VXaWR0aCA/IE51bWJlcihzdHJva2VXaWR0aCkgKiAyNCAvIE51bWJlcihzaXplKSA6IHN0cm9rZVdpZHRoLFxuICAgICAgICBjbGFzc05hbWU6IFtcImx1Y2lkZVwiLCBgbHVjaWRlLSR7dG9LZWJhYkNhc2UoaWNvbk5hbWUpfWAsIGNsYXNzTmFtZV0uam9pbihcIiBcIiksXG4gICAgICAgIC4uLnJlc3RcbiAgICAgIH0sXG4gICAgICBbXG4gICAgICAgIC4uLmljb25Ob2RlLm1hcCgoW3RhZywgYXR0cnNdKSA9PiBjcmVhdGVFbGVtZW50KHRhZywgYXR0cnMpKSxcbiAgICAgICAgLi4uQXJyYXkuaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbiA6IFtjaGlsZHJlbl1cbiAgICAgIF1cbiAgICApXG4gICk7XG4gIENvbXBvbmVudC5kaXNwbGF5TmFtZSA9IGAke2ljb25OYW1lfWA7XG4gIHJldHVybiBDb21wb25lbnQ7XG59O1xuXG5leHBvcnQgeyBjcmVhdGVMdWNpZGVJY29uIGFzIGRlZmF1bHQsIHRvS2ViYWJDYXNlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jcmVhdGVMdWNpZGVJY29uLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBBbGVydENpcmNsZSA9IGNyZWF0ZUx1Y2lkZUljb24oXCJBbGVydENpcmNsZVwiLCBbXG4gIFtcImNpcmNsZVwiLCB7IGN4OiBcIjEyXCIsIGN5OiBcIjEyXCIsIHI6IFwiMTBcIiwga2V5OiBcIjFtZ2xheVwiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiMTJcIiwgeDI6IFwiMTJcIiwgeTE6IFwiOFwiLCB5MjogXCIxMlwiLCBrZXk6IFwiMXBrZXVoXCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCIxMlwiLCB4MjogXCIxMi4wMVwiLCB5MTogXCIxNlwiLCB5MjogXCIxNlwiLCBrZXk6IFwiNGRmcTkwXCIgfV1cbl0pO1xuXG5leHBvcnQgeyBBbGVydENpcmNsZSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbGVydC1jaXJjbGUuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IEFsZXJ0VHJpYW5nbGUgPSBjcmVhdGVMdWNpZGVJY29uKFwiQWxlcnRUcmlhbmdsZVwiLCBbXG4gIFtcbiAgICBcInBhdGhcIixcbiAgICB7XG4gICAgICBkOiBcIm0yMS43MyAxOC04LTE0YTIgMiAwIDAgMC0zLjQ4IDBsLTggMTRBMiAyIDAgMCAwIDQgMjFoMTZhMiAyIDAgMCAwIDEuNzMtM1pcIixcbiAgICAgIGtleTogXCJjM3NraTRcIlxuICAgIH1cbiAgXSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTEyIDl2NFwiLCBrZXk6IFwianV6cHU3XCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0xMiAxN2guMDFcIiwga2V5OiBcInAzMnAwNVwiIH1dXG5dKTtcblxuZXhwb3J0IHsgQWxlcnRUcmlhbmdsZSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbGVydC10cmlhbmdsZS5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgQXJyb3dSaWdodCA9IGNyZWF0ZUx1Y2lkZUljb24oXCJBcnJvd1JpZ2h0XCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTUgMTJoMTRcIiwga2V5OiBcIjFheXMwaFwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJtMTIgNSA3IDctNyA3XCIsIGtleTogXCJ4cXV6NGNcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IEFycm93UmlnaHQgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyb3ctcmlnaHQuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IEJ1aWxkaW5nMiA9IGNyZWF0ZUx1Y2lkZUljb24oXCJCdWlsZGluZzJcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJNNiAyMlY0YTIgMiAwIDAgMSAyLTJoOGEyIDIgMCAwIDEgMiAydjE4WlwiLCBrZXk6IFwiMWI0cW1mXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk02IDEySDRhMiAyIDAgMCAwLTIgMnY2YTIgMiAwIDAgMCAyIDJoMlwiLCBrZXk6IFwiaTcxcHpkXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0xOCA5aDJhMiAyIDAgMCAxIDIgMnY5YTIgMiAwIDAgMS0yIDJoLTJcIiwga2V5OiBcIjEwamVmc1wiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMTAgNmg0XCIsIGtleTogXCIxaXR1bmtcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTEwIDEwaDRcIiwga2V5OiBcInRjZHZyZlwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMTAgMTRoNFwiLCBrZXk6IFwia2VscHhyXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0xMCAxOGg0XCIsIGtleTogXCIxdWxxNjhcIiB9XVxuXSk7XG5cbmV4cG9ydCB7
25114IEJ1aWxkaW5nMiBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idWlsZGluZy0yLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBDaGVja0NpcmNsZSA9IGNyZWF0ZUx1Y2lkZUljb24oXCJDaGVja0NpcmNsZVwiLCBbXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0yMiAxMS4wOFYxMmExMCAxMCAwIDEgMS01LjkzLTkuMTRcIiwga2V5OiBcImc3NzR2cVwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJtOSAxMSAzIDNMMjIgNFwiLCBrZXk6IFwiMXBmbHpsXCIgfV1cbl0pO1xuXG5leHBvcnQgeyBDaGVja0NpcmNsZSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGVjay1jaXJjbGUuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IENoZXZyb25Eb3duID0gY3JlYXRlTHVjaWRlSWNvbihcIkNoZXZyb25Eb3duXCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwibTYgOSA2IDYgNi02XCIsIGtleTogXCJxcnVuc2xcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IENoZXZyb25Eb3duIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNoZXZyb24tZG93bi5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgQ2hldnJvbkxlZnQgPSBjcmVhdGVMdWNpZGVJY29uKFwiQ2hldnJvbkxlZnRcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJtMTUgMTgtNi02IDYtNlwiLCBrZXk6IFwiMXduZmczXCIgfV1cbl0pO1xuXG5leHBvcnQgeyBDaGV2cm9uTGVmdCBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGV2cm9uLWxlZnQuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IENoZXZyb25SaWdodCA9IGNyZWF0ZUx1Y2lkZUljb24oXCJDaGV2cm9uUmlnaHRcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJtOSAxOCA2LTYtNi02XCIsIGtleTogXCJtdGhod3FcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IENoZXZyb25SaWdodCBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGV2cm9uLXJpZ2h0LmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBDaGV2cm9uVXAgPSBjcmVhdGVMdWNpZGVJY29uKFwiQ2hldnJvblVwXCIsIFtbXCJwYXRoXCIsIHsgZDogXCJtMTggMTUtNi02LTYgNlwiLCBrZXk6IFwiMTUzdWR6XCIgfV1dKTtcblxuZXhwb3J0IHsgQ2hldnJvblVwIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNoZXZyb24tdXAuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IENsb2NrID0gY3JlYXRlTHVjaWRlSWNvbihcIkNsb2NrXCIsIFtcbiAgW1wiY2lyY2xlXCIsIHsgY3g6IFwiMTJcIiwgY3k6IFwiMTJcIiwgcjogXCIxMFwiLCBrZXk6IFwiMW1nbGF5XCIgfV0sXG4gIFtcInBvbHlsaW5lXCIsIHsgcG9pbnRzOiBcIjEyIDYgMTIgMTIgMTYgMTRcIiwga2V5OiBcIjY4ZXNndlwiIH1dXG5dKTtcblxuZXhwb3J0IHsgQ2xvY2sgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xvY2suanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IENyb3NzaGFpciA9IGNyZWF0ZUx1Y2lkZUljb24oXCJDcm9zc2hhaXJcIiwgW1xuICBbXCJjaXJjbGVcIiwgeyBjeDogXCIxMlwiLCBjeTogXCIxMlwiLCByOiBcIjEwXCIsIGtleTogXCIxbWdsYXlcIiB9XSxcbiAgW1wibGluZVwiLCB7IHgxOiBcIjIyXCIsIHgyOiBcIjE4XCIsIHkxOiBcIjEyXCIsIHkyOiBcIjEyXCIsIGtleTogXCJsOWJjc2lcIiB9XSxcbiAgW1wibGluZVwiLCB7IHgxOiBcIjZcIiwgeDI6IFwiMlwiLCB5MTogXCIxMlwiLCB5MjogXCIxMlwiLCBrZXk6IFwiMTNoaGt4XCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCIxMlwiLCB4MjogXCIxMlwiLCB5MTogXCI2XCIsIHkyOiBcIjJcIiwga2V5OiBcIjEwdzNmM1wiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiMTJcIiwgeDI6IFwiMTJcIiwgeTE6IFwiMjJcIiwgeTI6IFwiMThcIiwga2V5OiBcIjE1ZzlrcVwiIH1dXG5dKTtcblxuZXhwb3J0IHsgQ3Jvc3NoYWlyIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNyb3NzaGFpci5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgRGF0YWJhc2UgPSBjcmVhdGVMdWNpZGVJY29uKFwiRGF0YWJhc2VcIiwgW1xuICBbXCJlbGxpcHNlXCIsIHsgY3g6IFwiMTJcIiwgY3k6IFwiNVwiLCByeDogXCI5XCIsIHJ5OiBcIjNcIiwga2V5OiBcIm1zc2x3elwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMyA1VjE5QTkgMyAwIDAgMCAyMSAxOVY1XCIsIGtleTogXCIxd2xlbDdcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTMgMTJBOSAzIDAgMCAwIDIxIDEyXCIsIGtleTogXCJtdjdrZTRcIiB9XVxuXSk7XG5cbmV4cG9ydCB7
25114IERhdGFiYXNlIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGFiYXNlLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBFeHRlcm5hbExpbmsgPSBjcmVhdGVMdWNpZGVJY29uKFwiRXh0ZXJuYWxMaW5rXCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDZcIiwga2V5OiBcImE2eHFxcFwiIH1dLFxuICBbXCJwb2x5bGluZVwiLCB7IHBvaW50czogXCIxNSAzIDIxIDMgMjEgOVwiLCBrZXk6IFwibXpueWFkXCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCIxMFwiLCB4MjogXCIyMVwiLCB5MTogXCIxNFwiLCB5MjogXCIzXCIsIGtleTogXCIxOGMzczRcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IEV4dGVybmFsTGluayBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leHRlcm5hbC1saW5rLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBHbG9iZSA9IGNyZWF0ZUx1Y2lkZUljb24oXCJHbG9iZVwiLCBbXG4gIFtcImNpcmNsZVwiLCB7IGN4OiBcIjEyXCIsIGN5OiBcIjEyXCIsIHI6IFwiMTBcIiwga2V5OiBcIjFtZ2xheVwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMTIgMmExNC41IDE0LjUgMCAwIDAgMCAyMCAxNC41IDE0LjUgMCAwIDAgMC0yMFwiLCBrZXk6IFwiMTNvMXpsXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0yIDEyaDIwXCIsIGtleTogXCI5aTRwdTRcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IEdsb2JlIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdsb2JlLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBHcmlkM3gzID0gY3JlYXRlTHVjaWRlSWNvbihcIkdyaWQzeDNcIiwgW1xuICBbXCJyZWN0XCIsIHsgd2lkdGg6IFwiMThcIiwgaGVpZ2h0OiBcIjE4XCIsIHg6IFwiM1wiLCB5OiBcIjNcIiwgcng6IFwiMlwiLCBrZXk6IFwiYWZpdHY3XCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0zIDloMThcIiwga2V5OiBcIjFwdWRjdFwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMyAxNWgxOFwiLCBrZXk6IFwiNXhzaHVwXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk05IDN2MThcIiwga2V5OiBcImZoM2hxYVwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMTUgM3YxOFwiLCBrZXk6IFwiMTRudnAwXCIgfV1cbl0pO1xuXG5leHBvcnQgeyBHcmlkM3gzIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyaWQtM3gzLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBIb21lID0gY3JlYXRlTHVjaWRlSWNvbihcIkhvbWVcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJtMyA5IDktNyA5IDd2MTFhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ6XCIsIGtleTogXCJ5NWRrYTRcIiB9XSxcbiAgW1wicG9seWxpbmVcIiwgeyBwb2ludHM6IFwiOSAyMiA5IDEyIDE1IDEyIDE1IDIyXCIsIGtleTogXCJlMnVzMDhcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IEhvbWUgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aG9tZS5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgTGF5ZXJzID0gY3JlYXRlTHVjaWRlSWNvbihcIkxheWVyc1wiLCBbXG4gIFtcbiAgICBcInBhdGhcIixcbiAgICB7XG4gICAgICBkOiBcIm0xMi44MyAyLjE4YTIgMiAwIDAgMC0xLjY2IDBMMi42IDYuMDhhMSAxIDAgMCAwIDAgMS44M2w4LjU4IDMuOTFhMiAyIDAgMCAwIDEuNjYgMGw4LjU4LTMuOWExIDEgMCAwIDAgMC0xLjgzWlwiLFxuICAgICAga2V5OiBcIjhiOTd4d1wiXG4gICAgfVxuICBdLFxuICBbXCJwYXRoXCIsIHsgZDogXCJtMjIgMTcuNjUtOS4xNyA0LjE2YTIgMiAwIDAgMS0xLjY2IDBMMiAxNy42NVwiLCBrZXk6IFwiZGQ2enNxXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIm0yMiAxMi42NS05LjE3IDQuMTZhMiAyIDAgMCAxLTEuNjYgMEwyIDEyLjY1XCIsIGtleTogXCJlcDlmcnVcIiB9XVxuXSk7XG5cbmV4cG9ydCB7
25114IExheWVycyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYXllcnMuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IExpc3QgPSBjcmVhdGVMdWNpZGVJY29uKFwiTGlzdFwiLCBbXG4gIFtcImxpbmVcIiwgeyB4MTogXCI4XCIsIHgyOiBcIjIxXCIsIHkxOiBcIjZcIiwgeTI6IFwiNlwiLCBrZXk6IFwiN2V5OHBjXCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCI4XCIsIHgyOiBcIjIxXCIsIHkxOiBcIjEyXCIsIHkyOiBcIjEyXCIsIGtleTogXCJyamZibGNcIiB9XSxcbiAgW1wibGluZVwiLCB7IHgxOiBcIjhcIiwgeDI6IFwiMjFcIiwgeTE6IFwiMThcIiwgeTI6IFwiMThcIiwga2V5OiBcImMzYjFtOFwiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiM1wiLCB4MjogXCIzLjAxXCIsIHkxOiBcIjZcIiwgeTI6IFwiNlwiLCBrZXk6IFwiMWc3Z3EzXCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCIzXCIsIHgyOiBcIjMuMDFcIiwgeTE6IFwiMTJcIiwgeTI6IFwiMTJcIiwga2V5OiBcIjFwamx2a1wiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiM1wiLCB4MjogXCIzLjAxXCIsIHkxOiBcIjE4XCIsIHkyOiBcIjE4XCIsIGtleTogXCIyOHQybWNcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IExpc3QgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGlzdC5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgTG9hZGVyMiA9IGNyZWF0ZUx1Y2lkZUljb24oXCJMb2FkZXIyXCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTIxIDEyYTkgOSAwIDEgMS02LjIxOS04LjU2XCIsIGtleTogXCIxM3phbGRcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IExvYWRlcjIgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9hZGVyLTIuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IE1haWwgPSBjcmVhdGVMdWNpZGVJY29uKFwiTWFpbFwiLCBbXG4gIFtcInJlY3RcIiwgeyB3aWR0aDogXCIyMFwiLCBoZWlnaHQ6IFwiMTZcIiwgeDogXCIyXCIsIHk6IFwiNFwiLCByeDogXCIyXCIsIGtleTogXCIxOG4zazFcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwibTIyIDctOC45NyA1LjdhMS45NCAxLjk0IDAgMCAxLTIuMDYgMEwyIDdcIiwga2V5OiBcIjFvY3JnM1wiIH1dXG5dKTtcblxuZXhwb3J0IHsgTWFpbCBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYWlsLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBNYXBQaW4gPSBjcmVhdGVMdWNpZGVJY29uKFwiTWFwUGluXCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTIwIDEwYzAgNi04IDEyLTggMTJzLTgtNi04LTEyYTggOCAwIDAgMSAxNiAwWlwiLCBrZXk6IFwiMm9lOWZ1XCIgfV0sXG4gIFtcImNpcmNsZVwiLCB7IGN4OiBcIjEyXCIsIGN5OiBcIjEwXCIsIHI6IFwiM1wiLCBrZXk6IFwiaWxxaHI3XCIgfV1cbl0pO1xuXG5leHBvcnQgeyBNYXBQaW4gYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFwLXBpbi5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgTWFwID0gY3JlYXRlTHVjaWRlSWNvbihcIk1hcFwiLCBbXG4gIFtcInBvbHlnb25cIiwgeyBwb2ludHM6IFwiMyA2IDkgMyAxNSA2IDIxIDMgMjEgMTggMTUgMjEgOSAxOCAzIDIxXCIsIGtleTogXCJvazJpZThcIiB9XSxcbiAgW1wibGluZVwiLCB7IHgxOiBcIjlcIiwgeDI6IFwiOVwiLCB5MTogXCIzXCIsIHkyOiBcIjE4XCIsIGtleTogXCJ3MzRxejVcIiB9XSxcbiAgW1wibGluZVwiLCB7IHgxOiBcIjE1XCIsIHgyOiBcIjE1XCIsIHkxOiBcIjZcIiwgeTI6IFwiMjFcIiwga2V5OiBcInZvbHY5YVwiIH1dXG5dKTtcblxuZXhwb3J0IHsgTWFwIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcC5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgUGhvbmUgPSBjcmVhdGVMdWNpZGVJY29uKFwiUGhvbmVcIiwgW1xuICBbXG4gICAgXCJwYXRoXCIsXG4gICAge1xuICAgICAgZDogXCJNMjIgMTYuOTJ2M2EyIDIgMCAwIDEtMi4xOCA
25114yIDE5Ljc5IDE5Ljc5IDAgMCAxLTguNjMtMy4wNyAxOS41IDE5LjUgMCAwIDEtNi02IDE5Ljc5IDE5Ljc5IDAgMCAxLTMuMDctOC42N0EyIDIgMCAwIDEgNC4xMSAyaDNhMiAyIDAgMCAxIDIgMS43MiAxMi44NCAxMi44NCAwIDAgMCAuNyAyLjgxIDIgMiAwIDAgMS0uNDUgMi4xMUw4LjA5IDkuOTFhMTYgMTYgMCAwIDAgNiA2bDEuMjctMS4yN2EyIDIgMCAwIDEgMi4xMS0uNDUgMTIuODQgMTIuODQgMCAwIDAgMi44MS43QTIgMiAwIDAgMSAyMiAxNi45MnpcIixcbiAgICAgIGtleTogXCJmb2lxcjVcIlxuICAgIH1cbiAgXVxuXSk7XG5cbmV4cG9ydCB7IFBob25lIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBob25lLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBSZWZyZXNoQ3cgPSBjcmVhdGVMdWNpZGVJY29uKFwiUmVmcmVzaEN3XCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTMgMTJhOSA5IDAgMCAxIDktOSA5Ljc1IDkuNzUgMCAwIDEgNi43NCAyLjc0TDIxIDhcIiwga2V5OiBcInY5aDV2Y1wiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMjEgM3Y1aC01XCIsIGtleTogXCIxcTd0bzBcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTIxIDEyYTkgOSAwIDAgMS05IDkgOS43NSA5Ljc1IDAgMCAxLTYuNzQtMi43NEwzIDE2XCIsIGtleTogXCIzdWlmbDNcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTggMTZIM3Y1XCIsIGtleTogXCIxY3Y2NzhcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IFJlZnJlc2hDdyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWZyZXNoLWN3LmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBSb3RhdGVDY3cgPSBjcmVhdGVMdWNpZGVJY29uKFwiUm90YXRlQ2N3XCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTMgMTJhOSA5IDAgMSAwIDktOSA5Ljc1IDkuNzUgMCAwIDAtNi43NCAyLjc0TDMgOFwiLCBrZXk6IFwiMTM1N2UzXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0zIDN2NWg1XCIsIGtleTogXCIxeGhxOGFcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IFJvdGF0ZUNjdyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yb3RhdGUtY2N3LmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBTZWFyY2ggPSBjcmVhdGVMdWNpZGVJY29uKFwiU2VhcmNoXCIsIFtcbiAgW1wiY2lyY2xlXCIsIHsgY3g6IFwiMTFcIiwgY3k6IFwiMTFcIiwgcjogXCI4XCIsIGtleTogXCI0ZWo5N3VcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwibTIxIDIxLTQuMy00LjNcIiwga2V5OiBcIjFxaWUzcVwiIH1dXG5dKTtcblxuZXhwb3J0IHsgU2VhcmNoIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlYXJjaC5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgU2V0dGluZ3MgPSBjcmVhdGVMdWNpZGVJY29uKFwiU2V0dGluZ3NcIiwgW1xuICBbXG4gICAgXCJwYXRoXCIsXG4gICAge1xuICAgICAgZDogXCJNMTIuMjIgMmgtLjQ0YTIgMiAwIDAgMC0yIDJ2LjE4YTIgMiAwIDAgMS0xIDEuNzNsLS40My4yNWEyIDIgMCAwIDEtMiAwbC0uMTUtLjA4YTIgMiAwIDAgMC0yLjczLjczbC0uMjIuMzhhMiAyIDAgMCAwIC43MyAyLjczbC4xNS4xYTIgMiAwIDAgMSAxIDEuNzJ2LjUxYTIgMiAwIDAgMS0xIDEuNzRsLS4xNS4wOWEyIDIgMCAwIDAtLjczIDIuNzNsLjIyLjM4YTIgMiAwIDAgMCAyLjczLjczbC4xNS0uMDhhMiAyIDAgMCAxIDIgMGwuNDMuMjVhMiAyIDAgMCAxIDEgMS43M1YyMGEyIDIgMCAwIDAgMiAyaC40NGEyIDIgMCAwIDAgMi0ydi0uMThhMiAyIDAgMCAxIDEtMS43M2wuNDMtLjI1YTIgMiAwIDAgMSAyIDBsLjE1LjA4YTIgMiAwIDAgMCAyLjczLS43M2wuMjItLjM5YTIgMiAwIDAgMC0uNzMtMi43M2wtLjE1LS4wOGEyIDIgMCAwIDEtMS0xLjc0di0uNWEyIDIgMCAwIDEgMS0xLjc0bC4xNS0uMDlhMiAyIDAgMCAwIC43My0yLjczbC0uMjItLjM4YTIgMiAwIDAgMC0yLjczLS43M2wtLjE1LjA4YTIgMiAwIDAgMS0yIDBsLS40My0uMjVhMiAyIDAgMCAxLTEtMS43M1Y0YTIgMiAwIDAgMC0yLTJ6XCIsXG4gICAgICBrZXk6IFwiMXFtZTJmXCJcbiAgICB9XG4gIF0sXG4gIFtcImNpcmNsZVwiLCB7IGN4OiBcIjEyXCIsIGN5OiBcIjEyXCIsIHI6IFwiM1wiLCBrZXk6IFwiMXY3enJkXCIgfV1cbl0pO1xuXG5leHBvcnQgeyBTZXR0aW5ncyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXR0aW5ncy5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgU2hvcHBpbmdCYWcgPSBjcmVhdGVMdWNpZGVJY29uKFwiU2hvcHBpbmdCYWdcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJNNiAyIDMgNnYxNGEyIDIgMCAwIDAgMiAyaDE0YTIgMiA
25114wIDAgMCAyLTJWNmwtMy00WlwiLCBrZXk6IFwiaG91OXAwXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0zIDZoMThcIiwga2V5OiBcImQwd20walwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMTYgMTBhNCA0IDAgMCAxLTggMFwiLCBrZXk6IFwiMWx0dml3XCIgfV1cbl0pO1xuXG5leHBvcnQgeyBTaG9wcGluZ0JhZyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaG9wcGluZy1iYWcuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IFVzZXIgPSBjcmVhdGVMdWNpZGVJY29uKFwiVXNlclwiLCBbXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0xOSAyMXYtMmE0IDQgMCAwIDAtNC00SDlhNCA0IDAgMCAwLTQgNHYyXCIsIGtleTogXCI5NzVrZWxcIiB9XSxcbiAgW1wiY2lyY2xlXCIsIHsgY3g6IFwiMTJcIiwgY3k6IFwiN1wiLCByOiBcIjRcIiwga2V5OiBcIjE3eXMwZFwiIH1dXG5dKTtcblxuZXhwb3J0IHsgVXNlciBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VyLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBVc2VycyA9IGNyZWF0ZUx1Y2lkZUljb24oXCJVc2Vyc1wiLCBbXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0xNiAyMXYtMmE0IDQgMCAwIDAtNC00SDZhNCA0IDAgMCAwLTQgNHYyXCIsIGtleTogXCIxeXlpdHFcIiB9XSxcbiAgW1wiY2lyY2xlXCIsIHsgY3g6IFwiOVwiLCBjeTogXCI3XCIsIHI6IFwiNFwiLCBrZXk6IFwibnVmazhcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTIyIDIxdi0yYTQgNCAwIDAgMC0zLTMuODdcIiwga2V5OiBcImtzaGVnZFwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMTYgMy4xM2E0IDQgMCAwIDEgMCA3Ljc1XCIsIGtleTogXCIxZGE5Y2VcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IFVzZXJzIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZXJzLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBXaWZpT2ZmID0gY3JlYXRlTHVjaWRlSWNvbihcIldpZmlPZmZcIiwgW1xuICBbXCJsaW5lXCIsIHsgeDE6IFwiMlwiLCB4MjogXCIyMlwiLCB5MTogXCIyXCIsIHkyOiBcIjIyXCIsIGtleTogXCJhNnA2dWpcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTguNSAxNi41YTUgNSAwIDAgMSA3IDBcIiwga2V5OiBcInNlajUyN1wiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMiA4LjgyYTE1IDE1IDAgMCAxIDQuMTctMi42NVwiLCBrZXk6IFwiMTF1dHExXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0xMC42NiA1YzQuMDEtLjM2IDguMTQuOSAxMS4zNCAzLjc2XCIsIGtleTogXCJoeGVmZHVcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTE2Ljg1IDExLjI1YTEwIDEwIDAgMCAxIDIuMjIgMS42OFwiLCBrZXk6IFwicTczNGtuXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk01IDEzYTEwIDEwIDAgMCAxIDUuMjQtMi43NlwiLCBrZXk6IFwicGlxNHlsXCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCIxMlwiLCB4MjogXCIxMi4wMVwiLCB5MTogXCIyMFwiLCB5MjogXCIyMFwiLCBrZXk6IFwib2Y0YmM0XCIgfV1cbl0pO1xuXG5leHBvcnQgeyBXaWZpT2ZmIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdpZmktb2ZmLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBXaWZpID0gY3JlYXRlTHVjaWRlSWNvbihcIldpZmlcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJNNSAxM2ExMCAxMCAwIDAgMSAxNCAwXCIsIGtleTogXCI2djhqNTFcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTguNSAxNi41YTUgNSAwIDAgMSA3IDBcIiwga2V5OiBcInNlajUyN1wiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMiA4LjgyYTE1IDE1IDAgMCAxIDIwIDBcIiwga2V5OiBcImRucHIyelwiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiMTJcIiwgeDI6IFwiMTIuMDFcIiwgeTE6IFwiMjBcIiwgeTI6IFwiMjBcIiwga2V5OiBcIm9mNGJjNFwiIH1dXG5dKTtcblxuZXhwb3J0IHsgV2lmaSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD13aWZpLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBYID0gY3JlYXRlTHVjaWRlSWNvbihcIlhcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJNMTggNiA2IDE4XCIsIGtleTogXCIxYmw1ZjhcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwibTYgNiAxMiAxMlwiLCBrZXk6IFwiZDhiazZ2XCIgfV1cbl0pO1xuXG5leHBvcnQgeyBYIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXguanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIH
25114RoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IFpvb21JbiA9IGNyZWF0ZUx1Y2lkZUljb24oXCJab29tSW5cIiwgW1xuICBbXCJjaXJjbGVcIiwgeyBjeDogXCIxMVwiLCBjeTogXCIxMVwiLCByOiBcIjhcIiwga2V5OiBcIjRlajk3dVwiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiMjFcIiwgeDI6IFwiMTYuNjVcIiwgeTE6IFwiMjFcIiwgeTI6IFwiMTYuNjVcIiwga2V5OiBcIjEzZ2o3Y1wiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiMTFcIiwgeDI6IFwiMTFcIiwgeTE6IFwiOFwiLCB5MjogXCIxNFwiLCBrZXk6IFwiMXZtc2twXCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCI4XCIsIHgyOiBcIjE0XCIsIHkxOiBcIjExXCIsIHkyOiBcIjExXCIsIGtleTogXCJkdXJ5bXVcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IFpvb21JbiBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD16b29tLWluLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBab29tT3V0ID0gY3JlYXRlTHVjaWRlSWNvbihcIlpvb21PdXRcIiwgW1xuICBbXCJjaXJjbGVcIiwgeyBjeDogXCIxMVwiLCBjeTogXCIxMVwiLCByOiBcIjhcIiwga2V5OiBcIjRlajk3dVwiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiMjFcIiwgeDI6IFwiMTYuNjVcIiwgeTE6IFwiMjFcIiwgeTI6IFwiMTYuNjVcIiwga2V5OiBcIjEzZ2o3Y1wiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiOFwiLCB4MjogXCIxNFwiLCB5MTogXCIxMVwiLCB5MjogXCIxMVwiLCBrZXk6IFwiZHVyeW11XCIgfV1cbl0pO1xuXG5leHBvcnQgeyBab29tT3V0IGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXpvb20tb3V0LmpzLm1hcFxuIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBBbGVydFRyaWFuZ2xlLCBSZWZyZXNoQ3cgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmludGVyZmFjZSBFcnJvckJvdW5kYXJ5UHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlXG4gIGZhbGxiYWNrPzogUmVhY3ROb2RlXG4gIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCBlcnJvckluZm86IFJlYWN0LkVycm9ySW5mbykgPT4gdm9pZFxuICBzaG93RGV0YWlscz86IGJvb2xlYW5cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBFcnJvckJvdW5kYXJ5U3RhdGUge1xuICBoYXNFcnJvcjogYm9vbGVhblxuICBlcnJvcj86IEVycm9yXG4gIGVycm9ySW5mbz86IFJlYWN0LkVycm9ySW5mb1xufVxuXG5leHBvcnQgY2xhc3MgRXJyb3JCb3VuZGFyeSBleHRlbmRzIENvbXBvbmVudDxFcnJvckJvdW5kYXJ5UHJvcHMsIEVycm9yQm91bmRhcnlTdGF0ZT4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogRXJyb3JCb3VuZGFyeVByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgdGhpcy5zdGF0ZSA9IHsgaGFzRXJyb3I6IGZhbHNlIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3I6IEVycm9yKTogRXJyb3JCb3VuZGFyeVN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzRXJyb3I6IHRydWUsXG4gICAgICBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZENhdGNoKGVycm9yOiBFcnJvciwgZXJyb3JJbmZvOiBSZWFjdC5FcnJvckluZm8pIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGVycm9yLFxuICAgICAgZXJyb3JJbmZvXG4gICAgfSlcblxuICAgIC8vIExvZyBlcnJvclxuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yQm91bmRhcnkgY2F1Z2h0IGFuIGVycm9yOicsIGVycm9yLCBlcnJvckluZm8pXG5cbiAgICAvLyBDYWxsIGN1c3RvbSBlcnJvciBoYW5kbGVyXG4gICAgdGhpcy5wcm9wcy5vbkVycm9yPy4oZXJyb3IsIGVycm9ySW5mbylcblxuICAgIC8vIEluIHByb2R1Y3Rpb24sIHNlbmQgdG8gZXJyb3IgcmVwb3J0aW5nIHNlcnZpY2VcbiAgICBpZiAoaW1wb3J0Lm1ldGEuZW52LlBST0QpIHtcbiAgICAgIC8vIFRPRE86IFNlbmQgdG8gU2VudHJ5IG9yIHNpbWlsYXJcbiAgICAgIC8vIFNlbnRyeS5jYXB0dXJlRXhjZXB0aW9uKGVycm9yLCB7IGNvbnRleHRzOiB7IHJlYWN0OiBlcnJvckluZm8gfSB9KVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVJldHJ5ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBoYXNFcnJvcjogZmFsc2UsIGVycm9yOiB1bmRlZmluZWQsIGVycm9ySW5mbzogdW5kZWZpbmVkIH0pXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaGFzRXJyb3IpIHtcbiAgICAgIC8vIEN1c3RvbSBmYWxsYmFjayBVSVxuICAgICAgaWYgKHRoaXMucHJvcHMuZmFsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuZmFsbGJhY2tcbiAgICAgIH1cblxuICAgICAgLy8gRGVmYXVsdCBlcnJvciBVSVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BwLTYgdGV4dC1jZW50ZXIgYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1tZWMgYm9yZGVyIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5ICR7dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgJyd9YH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBzcGFjZS15LTRcIj5cbiAgICAgICAgICAgIDxBbGVydFRyaWFuZ2xlIGNsYXNzTmFtZT1cInctMTIgaC0xMiB0ZXh0LXJlZC01MDBcIiAvPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IG1iLTJcIj5cbiAgICAgICAgICAgICAgICBPb3BzISBFdHdhcyBpc3Qgc2NoaWVmZ2VsYXVmZW5cbiAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgIERpZXNlIEtvbXBvbmVudGUga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAge3RoaXMucHJvcHMuc2hvd0RldGFpbHMgJiYgdGhpcy5zdGF0ZS5lcnJvciAmJiAoXG4gICAgICAgICAgICAgIDxkZXRhaWxzIGNsYXNzTmFtZT1cInctZnVsbCBtYXgtdy1tZFwiPlxuICAgICAgICAgICAgICAgIDxzdW1tYXJ5IGNsYXNzTmFtZT1cImN1cnNvci1wb2ludGVyIHRleHQtc20gdGV4dC10ZXh0LW11dGVkIGhvdmVyOnRleHQtdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgIFRlY2huaXNjaGUgRGV0YWlscyBhbnplaWdlblxuICAgICAgICAgICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTIgcC0zIGJnLXJlZC01MCByb3VuZGVkIGJvcmRlciB0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1tb25vIHRleHQtcmVkLTgwMCBicmVhay1hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMuc3RhdGUuZXJyb3IubWVzc2FnZX1cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgI
25114Ht0aGlzLnN0YXRlLmVycm9ySW5mbz8uY29tcG9uZW50U3RhY2sgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzTmFtZT1cIm10LTIgdGV4dC14cyB0ZXh0LXJlZC03MDAgb3ZlcmZsb3ctYXV0byBtYXgtaC0zMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLmVycm9ySW5mby5jb21wb25lbnRTdGFja31cbiAgICAgICAgICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlUmV0cnl9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5IGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxSZWZyZXNoQ3cgY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgICAgIEVybmV1dCB2ZXJzdWNoZW5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlblxuICB9XG59XG5cbi8vIEZ1bmN0aW9uYWwgZXJyb3IgYm91bmRhcnkgaG9vayAoZm9yIHVzZSB3aXRoIFJlYWN0IDE4KyBlcnJvciBib3VuZGFyaWVzKVxuZXhwb3J0IGNvbnN0IHVzZUVycm9ySGFuZGxlciA9ICgpID0+IHtcbiAgcmV0dXJuIChlcnJvcjogRXJyb3IsIGVycm9ySW5mbz86IFJlYWN0LkVycm9ySW5mbykgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNhdWdodCBieSBlcnJvciBoYW5kbGVyOicsIGVycm9yLCBlcnJvckluZm8pXG4gICAgXG4gICAgaWYgKGltcG9ydC5tZXRhLmVudi5QUk9EKSB7XG4gICAgICAvLyBUT0RPOiBTZW5kIHRvIGVycm9yIHJlcG9ydGluZyBzZXJ2aWNlXG4gICAgfVxuICB9XG59XG5cbi8vIFNpbXBsZSBlcnJvciBmYWxsYmFjayBjb21wb25lbnRzXG5leHBvcnQgY29uc3QgU2ltcGxlRXJyb3JGYWxsYmFjazogUmVhY3QuRkM8eyBcbiAgZXJyb3I/OiBFcnJvclxuICBvblJldHJ5PzogKCkgPT4gdm9pZCBcbiAgbWVzc2FnZT86IHN0cmluZ1xufT4gPSAoeyBcbiAgZXJyb3IsIFxuICBvblJldHJ5LCBcbiAgbWVzc2FnZSA9ICdFdHdhcyBpc3Qgc2NoaWVmZ2VsYXVmZW4nIFxufSkgPT4gKFxuICA8ZGl2IGNsYXNzTmFtZT1cInAtNCB0ZXh0LWNlbnRlciBiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSBib3JkZXIgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnkgcm91bmRlZC1tZWNcIj5cbiAgICA8QWxlcnRUcmlhbmdsZSBjbGFzc05hbWU9XCJ3LTggaC04IHRleHQtcmVkLTUwMCBteC1hdXRvIG1iLTJcIiAvPlxuICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1yZWQtODAwIG1iLTNcIj57bWVzc2FnZX08L3A+XG4gICAge2Vycm9yICYmIChcbiAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1yZWQtNjAwIG1iLTMgZm9udC1tb25vXCI+XG4gICAgICAgIHtlcnJvci5tZXNzYWdlfVxuICAgICAgPC9wPlxuICAgICl9XG4gICAge29uUmV0cnkgJiYgKFxuICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtvblJldHJ5fSBjbGFzc05hbWU9XCJidG4tc2Vjb25kYXJ5IHRleHQteHNcIj5cbiAgICAgICAgRXJuZXV0IHZlcnN1Y2hlblxuICAgICAgPC9idXR0b24+XG4gICAgKX1cbiAgPC9kaXY+XG4pXG5cbmV4cG9ydCBjb25zdCBNaW5pbWFsRXJyb3JGYWxsYmFjazogUmVhY3QuRkM8eyBtZXNzYWdlPzogc3RyaW5nIH0+ID0gKHsgXG4gIG1lc3NhZ2UgPSAnRmVobGVyIGJlaW0gTGFkZW4nIFxufSkgPT4gKFxuICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHAtNCB0ZXh0LXRleHQtbXV0ZWRcIj5cbiAgICA8QWxlcnRUcmlhbmdsZSBjbGFzc05hbWU9XCJ3LTQgaC00IG1yLTJcIiAvPlxuICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc21cIj57bWVzc2FnZX08L3NwYW4+XG4gIDwvZGl2PlxuKVxuIiwiaW1wb3J0IHR5cGUgeyBMb2NhdGlvbiwgQ29udGFjdCB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuXG5pbnRlcmZhY2UgVG9vbHRpcERhdGEge1xuICBsb2NhdGlvbk5hbWU6IHN0cmluZ1xuICBjb250YWN0TmFtZT86IHN0cmluZ1xuICBjb250YWN0Um9sZT86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgVG9vbHRpcFBvc2l0aW9uIHtcbiAgeDogbnVtYmVyXG4gIHk6IG51bWJlclxufVxuXG5leHBvcnQgY2xhc3MgTWFwVG9vbHRpcEhhbmRsZXIge1xuICBwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnRcbiAgcHJpdmF0ZSBsb2NhdGlvbnM6IExvY2F0aW9uW11cbiAgcHJpdmF0ZSBjb250YWN0czogQ29udGFjdFtdID0gW11cbiAgcHJpdmF0ZSB0b29sdGlwRWxlbWVudDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIGN1cnJlbnRMb2NhdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIHNob3dUaW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgaGlkZVRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBpc1RvdWNoOiBib29sZWFuID0gZmFsc2VcblxuICBjb25zdHJ1Y3Rvcihjb250YWluZXI6IEhUTUxFbGVtZW50LCBsb2NhdGlvbnM6IExvY2F0aW9uW10sIGNvbnRhY3RzOiBDb250YWN0W10gPSBbXSkge1xuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyXG4gICAgdGhpcy5sb2NhdGlvbnMgPSBsb2NhdGlvbnNcbiAgICB0aGlzLmNvbnRhY3RzID0gY29udGFjdHNcbiAgICB0aGlzLmNyZWF0ZVRvb2x0aXBFbGVtZW50KClcbiAgICB0aGlzLmJpbmRFdmVudHMoKVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUb29sdGlwRWxlbWVudCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvb2x0aXBFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IGBcbiAgICAgIGZpeGVkIHotNTAgcHgtMyBweS0yIHRleHQtc20gdGV4dC13aGl0ZSBiZy1ncmF5LTkwMCByb3VuZGVkLWxnIHNoYWRvdy1sZ1xuICAgICAgcG9pbnRlci1ldmVud
25114HMtbm9uZSBvcGFjaXR5LTAgdHJhbnNpdGlvbi1vcGFjaXR5IGR1cmF0aW9uLTIwMFxuICAgICAgbWF4LXctWzI4MHB4XVxuICAgIGAudHJpbSgpXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXBFbGVtZW50KVxuICB9XG5cbiAgcHJpdmF0ZSBiaW5kRXZlbnRzKCk6IHZvaWQge1xuICAgIC8vIERldGVjdCB0b3VjaCBkZXZpY2VcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgKCkgPT4ge1xuICAgICAgdGhpcy5pc1RvdWNoID0gdHJ1ZVxuICAgIH0sIHsgb25jZTogdHJ1ZSwgcGFzc2l2ZTogdHJ1ZSB9KVxuXG4gICAgLy8gTW91c2UgZXZlbnRzIGZvciBkZXNrdG9wXG4gICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5oYW5kbGVNb3VzZU92ZXIuYmluZCh0aGlzKSlcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMuaGFuZGxlTW91c2VPdXQuYmluZCh0aGlzKSlcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZS5iaW5kKHRoaXMpKVxuXG4gICAgLy8gQ2xlYW51cCBvbiB3aW5kb3cgcmVzaXplXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuaGlkZVRvb2x0aXAuYmluZCh0aGlzKSlcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTW91c2VPdmVyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gU2tpcCBvbiB0b3VjaCBkZXZpY2VzXG4gICAgaWYgKHRoaXMuaXNUb3VjaCkgcmV0dXJuXG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgRWxlbWVudFxuICAgIGNvbnN0IGxvY2F0aW9uRWxlbWVudCA9IHRhcmdldC5jbG9zZXN0KCdbZGF0YS1sb2NhdGlvbi1pZF0nKVxuICAgIFxuICAgIGlmIChsb2NhdGlvbkVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGxvY2F0aW9uSWQgPSBsb2NhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxvY2F0aW9uLWlkJylcbiAgICAgIGlmIChsb2NhdGlvbklkICYmIGxvY2F0aW9uSWQgIT09IHRoaXMuY3VycmVudExvY2F0aW9uSWQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50TG9jYXRpb25JZCA9IGxvY2F0aW9uSWRcbiAgICAgICAgdGhpcy5zaG93VG9vbHRpcChsb2NhdGlvbklkLCBldmVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1vdXNlT3V0KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNUb3VjaCkgcmV0dXJuXG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgRWxlbWVudFxuICAgIGNvbnN0IGxvY2F0aW9uRWxlbWVudCA9IHRhcmdldC5jbG9zZXN0KCdbZGF0YS1sb2NhdGlvbi1pZF0nKVxuICAgIFxuICAgIGlmICghbG9jYXRpb25FbGVtZW50KSB7XG4gICAgICB0aGlzLnNjaGVkdWxlSGlkZVRvb2x0aXAoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNUb3VjaCB8fCAhdGhpcy50b29sdGlwRWxlbWVudCB8fCAhdGhpcy5jdXJyZW50TG9jYXRpb25JZCkgcmV0dXJuXG5cbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93VG9vbHRpcChsb2NhdGlvbklkOiBzdHJpbmcsIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRvb2x0aXBFbGVtZW50KSByZXR1cm5cblxuICAgIC8vIENsZWFyIGFueSBwZW5kaW5nIGhpZGVcbiAgICBpZiAodGhpcy5oaWRlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVRpbWVvdXQpXG4gICAgICB0aGlzLmhpZGVUaW1lb3V0ID0gbnVsbFxuICAgIH1cblxuICAgIC8vIEdldCBsb2NhdGlvbiBkYXRhXG4gICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmxvY2F0aW9ucy5maW5kKGxvYyA9PiBsb2MuaWQgPT09IGxvY2F0aW9uSWQpXG4gICAgaWYgKCFsb2NhdGlvbikgcmV0dXJuXG5cbiAgICAvLyBHZXQgZmlyc3QgYWN0aXZlIGNvbnRhY3QgZm9yIHRoaXMgbG9jYXRpb25cbiAgICBjb25zdCBwcmltYXJ5Q29udGFjdCA9IHRoaXMuY29udGFjdHMuZmluZChjb250YWN0ID0+XG4gICAgICBjb250YWN0LmxvY2F0aW9uSWQgPT09IGxvY2F0aW9uSWQgJiYgY29udGFjdC5pc0FjdGl2ZVxuICAgIClcblxuICAgIC8vIENyZWF0ZSB0b29sdGlwIGNvbnRlbnRcbiAgICBjb25zdCB0b29sdGlwRGF0YTogVG9vbHRpcERhdGEgPSB7XG4gICAgICBsb2NhdGlvbk5hbWU6IGxvY2F0aW9uLm5hbWUsXG4gICAgICBjb250YWN0TmFtZTogcHJpbWFyeUNvbnRhY3Q/LmZ1bGxOYW1lLFxuICAgICAgY29udGFjdFJvbGU6IHByaW1hcnlDb250YWN0Py5wb3NpdGlvblxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVG9vbHRpcENvbnRlbnQodG9vbHRpcERhdGEpXG5cbiAgICAvLyBTaG93IHdpdGggZGVsYXlcbiAgICB0aGlzLnNob3dUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50b29sdGlwRWxlbWVudCkge1xuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSdcbiAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSlcbiAgICAgIH1cbiAgICB9LCAzMDApIC8vIDMwMG1zIGRlbGF5XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlSGlkZVRvb2x0aXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd1RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNob3dUaW1lb3V0KVxuICAgICAgdGhpcy5zaG93VGltZW91dCA9IG51bGxcbiAgICB9XG5cbiAgICB0aGlzLmhpZGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmhpZGVUb29sdGlwKClcbiAgICB9LCAxMDApIC8vIFNtYWxsIGRlbGF5IHRvIHByZXZlbnQgZmxpY2tlcmluZ1xuICB9XG5cbiAgcHJpdmF0ZSBoaWRlVG9vbHRpcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50b29sdGlwRWxlbWVudCkge1xuICAgICAgdGhpcy50b29sdGlwRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnXG4gICAgfVxuICAgIHRoaXMuY3VycmVudExvY2F0aW9uSWQgPSBudWxsXG5cbiAgICBpZiAodGhpcy5zaG93VGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2hvd1RpbWVvdXQpXG4gICAgICB0aGlzLnNob3dUaW1lb3V0ID0gbnVsbFxuICAgIH1cbiAgICBpZiAodGhpcy5oaWRlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVRpbWVvdXQpXG4gICAgICB0aGlzLmhpZGVUaW1lb3V0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcENvbnRlbnQoZGF0YTogVG9vbHRpcERhdGEpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudG9vbHRpcEVsZW1lbnQpIHJldHVyblxuXG4gICAgbGV0IGNvbnRlbnQgPSBgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCI+YFxuICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQtd2hpdGUgbWItMVwiPiR7ZGF0YS5sb2NhdGlvbk5hbWV9PC9kaXY+YFxuXG4gICAgaWYgKGRhdGEuY29udGFjdE5hbWUpIHtcbiAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9XCJ0ZXh0LWdyYXktMzAwIHRleHQteHNcIj
251145gXG4gICAgICBjb250ZW50ICs9IGA8ZGl2PiR7ZGF0YS5jb250YWN0TmFtZX08L2Rpdj5gXG4gICAgICBpZiAoZGF0YS5jb250YWN0Um9sZSkge1xuICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPVwidGV4dC1ncmF5LTQwMFwiPiR7ZGF0YS5jb250YWN0Um9sZX08L2Rpdj5gXG4gICAgICB9XG4gICAgICBjb250ZW50ICs9IGA8L2Rpdj5gXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9XCJ0ZXh0LWdyYXktNDAwIHRleHQteHNcIj5LZWluIEFuc3ByZWNocGFydG5lciB6dWdld2llc2VuPC9kaXY+YFxuICAgIH1cbiAgICBjb250ZW50ICs9IGA8L2Rpdj5gXG5cbiAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnRcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcFBvc2l0aW9uKG1vdXNlWDogbnVtYmVyLCBtb3VzZVk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy50b29sdGlwRWxlbWVudCkgcmV0dXJuXG5cbiAgICBjb25zdCB0b29sdGlwID0gdGhpcy50b29sdGlwRWxlbWVudFxuICAgIGNvbnN0IHJlY3QgPSB0b29sdGlwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3Qgdmlld3BvcnQgPSB7XG4gICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodFxuICAgIH1cblxuICAgIGNvbnN0IHNwYWNpbmcgPSAxMlxuICAgIGxldCB4ID0gbW91c2VYICsgc3BhY2luZ1xuICAgIGxldCB5ID0gbW91c2VZIC0gcmVjdC5oZWlnaHQgLSBzcGFjaW5nXG5cbiAgICAvLyBLZWVwIHRvb2x0aXAgd2l0aGluIHZpZXdwb3J0XG4gICAgaWYgKHggKyByZWN0LndpZHRoID4gdmlld3BvcnQud2lkdGgpIHtcbiAgICAgIHggPSBtb3VzZVggLSByZWN0LndpZHRoIC0gc3BhY2luZ1xuICAgIH1cbiAgICBpZiAoeSA8IDApIHtcbiAgICAgIHkgPSBtb3VzZVkgKyBzcGFjaW5nXG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIG1pbmltdW0gZGlzdGFuY2UgZnJvbSBlZGdlc1xuICAgIHggPSBNYXRoLm1heChzcGFjaW5nLCBNYXRoLm1pbih4LCB2aWV3cG9ydC53aWR0aCAtIHJlY3Qud2lkdGggLSBzcGFjaW5nKSlcbiAgICB5ID0gTWF0aC5tYXgoc3BhY2luZywgTWF0aC5taW4oeSwgdmlld3BvcnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQgLSBzcGFjaW5nKSlcblxuICAgIHRvb2x0aXAuc3R5bGUubGVmdCA9IGAke3h9cHhgXG4gICAgdG9vbHRpcC5zdHlsZS50b3AgPSBgJHt5fXB4YFxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUxvY2F0aW9ucyhsb2NhdGlvbnM6IExvY2F0aW9uW10pOiB2b2lkIHtcbiAgICB0aGlzLmxvY2F0aW9ucyA9IGxvY2F0aW9uc1xuICAgIC8vIEhpZGUgY3VycmVudCB0b29sdGlwIGlmIGxvY2F0aW9uIG5vIGxvbmdlciBleGlzdHNcbiAgICBpZiAodGhpcy5jdXJyZW50TG9jYXRpb25JZCAmJiAhbG9jYXRpb25zLmZpbmQobG9jID0+IGxvYy5pZCA9PT0gdGhpcy5jdXJyZW50TG9jYXRpb25JZCkpIHtcbiAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3dUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zaG93VGltZW91dClcbiAgICB9XG4gICAgaWYgKHRoaXMuaGlkZVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhpZGVUaW1lb3V0KVxuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy50b29sdGlwRWxlbWVudCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLnRvb2x0aXBFbGVtZW50KVxuICAgICAgdGhpcy50b29sdGlwRWxlbWVudCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5oYW5kbGVNb3VzZU92ZXIuYmluZCh0aGlzKSlcbiAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMuaGFuZGxlTW91c2VPdXQuYmluZCh0aGlzKSlcbiAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZS5iaW5kKHRoaXMpKVxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmhpZGVUb29sdGlwLmJpbmQodGhpcykpXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTG9jYXRpb24sIENvbnRhY3QgfSBmcm9tICcuLi8uLi90eXBlcy9pbmRleCdcbmltcG9ydCB7IE1hcFRvb2x0aXBIYW5kbGVyIH0gZnJvbSAnLi9NYXBUb29sdGlwSGFuZGxlcidcblxuaW50ZXJmYWNlIE1hcEhhbmRsZXJPcHRpb25zIHtcbiAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuICBsb2NhdGlvbnM6IExvY2F0aW9uW11cbiAgY29udGFjdHM/OiBDb250YWN0W11cbiAgc2VsZWN0ZWRMb2NhdGlvbklkPzogc3RyaW5nIHwgbnVsbFxuICBvbkxvY2F0aW9uU2VsZWN0OiAobG9jYXRpb25JZDogc3RyaW5nKSA9PiB2b2lkXG4gIGVuYWJsZVpvb20/OiBib29sZWFuXG4gIGVuYWJsZVBhbj86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIFBhblpvb21JbnN0YW5jZSB7XG4gIHpvb206IChzY2FsZTogbnVtYmVyKSA9PiB2b2lkXG4gIHpvb21CeTogKHNjYWxlOiBudW1iZXIpID0+IHZvaWRcbiAgem9vbUluOiAoKSA9PiB2b2lkXG4gIHpvb21PdXQ6ICgpID0+IHZvaWRcbiAgcGFuOiAocG9pbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkgPT4gdm9pZFxuICBmaXQ6ICgpID0+IHZvaWRcbiAgY2VudGVyOiAoKSA9PiB2b2lkXG4gIHJlc2V0OiAoKSA9PiB2b2lkXG4gIGRlc3Ryb3k6ICgpID0+IHZvaWRcbiAgZ2V0Wm9vbTogKCkgPT4gbnVtYmVyXG4gIGdldFBhbjogKCkgPT4geyB4OiBudW1iZXI7IHk6IG51bWJlciB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgc3ZnUGFuWm9vbT86IChlbGVtZW50OiBTVkdFbGVtZW50LCBvcHRpb25zPzogYW55KSA9PiBQYW5ab29tSW5zdGFuY2VcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFwSGFuZGxlciB7XG4gIHByaXZhdGUgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuICBwcml2YXRlIGxvY2F0aW9uczogTG9jYXRpb25bXVxuICBwcml2YXRlIGNvbnRhY3RzOiBDb250YWN0W11cbiAgcHJpdmF0ZSBzZWxlY3RlZExvY2F0aW9uSWQ6IHN0cmluZyB8IG51bGxcbiAgcHJpdmF0ZSBvbkxvY2F0aW9uU2VsZWN0OiAobG9jYXRpb25JZDogc3RyaW5nKSA9PiB2b2lkXG4gIHByaXZhdGUgZW5hYmxlWm9vbTogYm9vbGVhblxuICBwcml2YXRlIGVuYWJsZVBhbjogYm9vbGVhblxuICBwcml2YXRlIHBhblpvb21JbnN0YW5jZTogUGFuWm9vbUluc3RhbmNlIHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBzdmdFbGVtZW50OiBTVkdFbGVtZW50IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBsb2NhdGlvbkVsZW1lbnRzOiBNYXA8c3RyaW5nLCBTVkdFbGVtZW50PiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIHRvb2x0aXBIYW5kbGVyOiBNYXBUb29sdGlwSGFuZGxlciB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgaXNJbml0aWFsaXplZCA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTWFwSGFuZGxlck9wdGlvbnMpIHtcbiAgICB0aGlzLmNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyXG4gICAgdGhpcy5sb2NhdGlvbnMgPSBvcHRpb25zLmxvY2F0aW9uc1xuICAgIHRoaXMuY29udGFjdHMgPSBvcHRpb25zLmNvbn
25114RhY3RzIHx8IFtdXG4gICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uSWQgPSBvcHRpb25zLnNlbGVjdGVkTG9jYXRpb25JZCB8fCBudWxsXG4gICAgdGhpcy5vbkxvY2F0aW9uU2VsZWN0ID0gb3B0aW9ucy5vbkxvY2F0aW9uU2VsZWN0XG4gICAgdGhpcy5lbmFibGVab29tID0gb3B0aW9ucy5lbmFibGVab29tID8/IHRydWVcbiAgICB0aGlzLmVuYWJsZVBhbiA9IG9wdGlvbnMuZW5hYmxlUGFuID8/IHRydWVcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZpbmQgU1ZHIGVsZW1lbnRcbiAgICAgIHRoaXMuc3ZnRWxlbWVudCA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpXG4gICAgICBpZiAoIXRoaXMuc3ZnRWxlbWVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNWRyBlbGVtZW50IGZvdW5kIGluIGNvbnRhaW5lcicpXG4gICAgICB9XG5cbiAgICAgIC8vIFNldHVwIFNWRyB2aWV3cG9ydFxuICAgICAgdGhpcy5zZXR1cFNWR1ZpZXdwb3J0KClcblxuICAgICAgLy8gTG9hZCBzdmctcGFuLXpvb20gbGlicmFyeSBpZiBub3QgYWxyZWFkeSBsb2FkZWRcbiAgICAgIGF3YWl0IHRoaXMubG9hZFN2Z1Bhblpvb20oKVxuXG4gICAgICAvLyBTZXR1cCBwYW4vem9vbSAtIGFsd2F5cyBzZXR1cCBmb3IgZml0L2NlbnRlciwgYnV0IGRpc2FibGUgaW50ZXJhY3Rpb25zXG4gICAgICB0aGlzLnNldHVwUGFuWm9vbSgpXG5cbiAgICAgIC8vIFNldHVwIGxvY2F0aW9uIGludGVyYWN0aW9uc1xuICAgICAgdGhpcy5zZXR1cExvY2F0aW9uRWxlbWVudHMoKVxuICAgICAgdGhpcy5iaW5kRXZlbnRzKClcblxuICAgICAgLy8gU2V0dXAgdG9vbHRpcCBzeXN0ZW1cbiAgICAgIHRoaXMuc2V0dXBUb29sdGlwcygpXG5cbiAgICAgIC8vIFNldCBpbml0aWFsIHNlbGVjdGVkIGxvY2F0aW9uXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZExvY2F0aW9uSWQpIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRMb2NhdGlvbih0aGlzLnNlbGVjdGVkTG9jYXRpb25JZClcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBtYXAgaGFuZGxlcjonLCBlcnJvcilcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNWR1ZpZXdwb3J0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmdFbGVtZW50KSByZXR1cm5cblxuICAgIC8vIEVuc3VyZSBTVkcgc2NhbGVzIHByb3Blcmx5XG4gICAgdGhpcy5zdmdFbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnXG4gICAgdGhpcy5zdmdFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJ1xuICAgIHRoaXMuc3ZnRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xuXG4gICAgLy8gUHJlc2VydmUgYXNwZWN0IHJhdGlvIGJ1dCBmaXQgdG8gY29udGFpbmVyXG4gICAgdGhpcy5zdmdFbGVtZW50LnNldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0JylcblxuICAgIC8vIElmIG5vIHZpZXdCb3ggaXMgc2V0LCBjcmVhdGUgb25lIGZyb20gdGhlIFNWRyBkaW1lbnNpb25zXG4gICAgaWYgKCF0aGlzLnN2Z0VsZW1lbnQuZ2V0QXR0cmlidXRlKCd2aWV3Qm94JykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJib3ggPSAodGhpcy5zdmdFbGVtZW50IGFzIGFueSkuZ2V0QkJveCgpXG4gICAgICAgIHRoaXMuc3ZnRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCBgJHtiYm94Lnh9ICR7YmJveC55fSAke2Jib3gud2lkdGh9ICR7YmJveC5oZWlnaHR9YClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGlmIGdldEJCb3ggZmFpbHNcbiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZ2V0IFNWRyBib3VuZGluZyBib3gsIHVzaW5nIGRlZmF1bHQgdmlld0JveCcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkU3ZnUGFuWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBzdmctcGFuLXpvb20gaXMgYWxyZWFkeSBsb2FkZWRcbiAgICBpZiAod2luZG93LnN2Z1Bhblpvb20pIHtcbiAgICAgIHJldHVyblxuICAgI
25114H1cblxuICAgIC8vIExvYWQgc3ZnLXBhbi16b29tIGxpYnJhcnlcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICAgIHNjcmlwdC5zcmMgPSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9zdmctcGFuLXpvb21AMy42LjEvZGlzdC9zdmctcGFuLXpvb20ubWluLmpzJ1xuICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHJlc29sdmUoKVxuICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBzdmctcGFuLXpvb20gbGlicmFyeScpKVxuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBQYW5ab29tKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmdFbGVtZW50IHx8ICF3aW5kb3cuc3ZnUGFuWm9vbSkgcmV0dXJuXG5cbiAgICB0aGlzLnBhblpvb21JbnN0YW5jZSA9IHdpbmRvdy5zdmdQYW5ab29tKHRoaXMuc3ZnRWxlbWVudCwge1xuICAgICAgem9vbUVuYWJsZWQ6IHRoaXMuZW5hYmxlWm9vbSxcbiAgICAgIHBhbkVuYWJsZWQ6IHRoaXMuZW5hYmxlUGFuLFxuICAgICAgY29udHJvbEljb25zRW5hYmxlZDogZmFsc2UsIC8vIFdlJ2xsIHVzZSBjdXN0b20gY29udHJvbHNcbiAgICAgIGZpdDogdHJ1ZSxcbiAgICAgIGNlbnRlcjogdHJ1ZSxcbiAgICAgIG1pblpvb206IDAuOCxcbiAgICAgIG1heFpvb206IDgsXG4gICAgICB6b29tU2NhbGVTZW5zaXRpdml0eTogMC4xNSwgLy8gU21vb3RoZXIgem9vbSBzdGVwc1xuICAgICAgZGJsQ2xpY2tab29tRW5hYmxlZDogdGhpcy5lbmFibGVab29tLFxuICAgICAgbW91c2VXaGVlbFpvb21FbmFibGVkOiB0aGlzLmVuYWJsZVpvb20sXG4gICAgICBwcmV2ZW50TW91c2VFdmVudHNEZWZhdWx0OiB0cnVlLFxuICAgICAgLy8gU21vb3RoIGFuaW1hdGlvbnNcbiAgICAgIGFuaW1hdGlvblRpbWU6IDMwMCxcbiAgICAgIGVhc2luZzogJ2Vhc2VJbk91dEN1YmljJyxcbiAgICAgIGJlZm9yZVpvb206ICgpID0+IHtcbiAgICAgICAgLy8gQWRkIHpvb20gY2xhc3MgZm9yIENTUyB0cmFuc2l0aW9uc1xuICAgICAgICB0aGlzLnN2Z0VsZW1lbnQ/LmNsYXNzTGlzdC5hZGQoJ3pvb21pbmcnKVxuICAgICAgfSxcbiAgICAgIG9uWm9vbTogKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgem9vbSBjbGFzcyBhZnRlciB0cmFuc2l0aW9uXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3ZnRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSgnem9vbWluZycpXG4gICAgICAgIH0sIDM1MClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExvY2F0aW9uRWxlbWVudHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2Z0VsZW1lbnQpIHJldHVyblxuXG4gICAgdGhpcy5sb2NhdGlvbkVsZW1lbnRzLmNsZWFyKClcblxuICAgIC8vIEZpbmQgbG9jYXRpb24gZWxlbWVudHMgYnkgZGF0YS1sb2NhdGlvbi1pZCBhdHRyaWJ1dGUgT1IgYnkgSUQgcGF0dGVybiAoaW5jbHVkaW5nIGhvdmVyIGFyZWFzKVxuICAgIGNvbnN0IGxvY2F0aW9uRWxlbWVudHMgPSB0aGlzLnN2Z0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbG9jYXRpb24taWRdLCBbaWRePVwibG9jYXRpb24tXCJdLCBbaWRePVwiaG92ZXItbG9jYXRpb24tXCJdJylcblxuICAgIGNvbnNvbGUubG9nKCfwn5e677iPIEZvdW5kJywgbG9jYXRpb25FbGVtZW50cy5sZW5ndGgsICdsb2NhdGlvbiBlbGVtZW50cyBpbiBTVkcnKVxuXG4gICAgbG9jYXRpb25FbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBsZXQgbG9jYXRpb25JZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxvY2F0aW9uLWlkJylcblxuICAgICAgLy8gSWYgbm8gZGF0YS1sb2NhdGlvbi1pZCwgdHJ5IHRvIGV4dHJhY3QgZnJvbSBJRCAoZS5nLiwgXCJsb2NhdGlvbi0xMjNcIiBvciBcImhvdmVyLWxvY2F0aW9uLTEyM1wiIC0+IFwiMTIzXCIpXG4gICAgICBpZiAoIWxvY2F0aW9uSWQgJiYgZWxlbWVudC5pZCkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGVsZW1lbnQuaWQubWF0Y2goL14oPzpob3Zlci0pP2xvY2F0aW9uLShcXGQrKSQvKVxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsb2NhdGlvbklkID0gbWF0Y2hbMV1cbiAgICAgICAgICAvLyBBZGQgZGF0YS1sb2NhdGlvbi1pZCBhdHRyaWJ1dGUgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbG9jYXRpb24taWQnLCBsb2NhdGlvbklkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChsb2NhdGlvbklkICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgICAgIC8vIE1hcCBXb3JkUHJlc3MgUG9zdCBJRCB0byBvdXIgaW50ZXJuYWwgbG9jYXRpb24gSUQgZm9ybWF0XG4gICAgICAgIGNvbnN0IGludGVybmFsTG9jYXRpb25JZCA9IGB3cC0ke2xvY2F0aW9uSWR9YFxuICAgICAgICB0aGlzLmxvY2F0aW9uRWxlbWVudHMuc2V0KGludGVybmFsTG9jYXRpb25JZCwgZWxlbWVudClcblxuICAgICAgICAvLyBBZGQgQ1NTIGNsYXNzZXMgZm9yIHN0eWxpbmdcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXAtbG9jYXRpb24nKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zb2xlLmxvZyhgRm91bmQgJHt0aGlzLmxvY2F0aW9uRWxlbWVudHMuc2l6ZX0gbG9jYXRpb24gZWxlbWVudHMgb24gbWFwYClcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBUb29sdGlwcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSByZXR1cm5cblxuICAgIC8vIEluaXRpYWxpemUgdG9vbHRpcCBoYW5kbGVyIHdpdGggY29udGFjdHNcbiAgICB0aGlzLnRvb2x0aXBIYW5kbGVyID0gbmV3IE1hcFRvb2x0aXBIYW5kbGVyKHRoaXMuY29udGFpbmVyLCB0aGlzLmxvY2F0aW9ucywgdGhpcy5jb250YWN0cylcbiAgfVxuXG4gIHByaXZhdGUgdG91Y2hTdGFydFRpbWUgPSAwXG4gIHByaXZhdGUgdG91Y2hTdGFydFBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH1cbiAgcHJpdmF0ZSB0b3VjaE1vdmVkID0gZmFsc2VcbiAgcHJpdmF0ZSByZWFkb25seSBUT1VDSF9
25114ERUxBWV9NUyA9IDUwIC8vIE1pbmltdW0gdG91Y2ggZHVyYXRpb24gdG8gcHJldmVudCBhY2NpZGVudGFsIHRhcHNcbiAgcHJpdmF0ZSByZWFkb25seSBUT1VDSF9NT1ZFX1RIUkVTSE9MRCA9IDE1IC8vIE1heCBwaXhlbHMgbW92ZWQgdG8gc3RpbGwgY291bnQgYXMgdGFwXG5cbiAgcHJpdmF0ZSBiaW5kRXZlbnRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250YWluZXIpIHJldHVyblxuXG4gICAgLy8gU2VwYXJhdGUgaGFuZGxpbmcgZm9yIHRvdWNoIGFuZCBtb3VzZSBldmVudHNcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlVG91Y2hNb3ZlLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pXG4gICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSlcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hTdGFydChldmVudDogVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIC8vIE1hcmsgYXMgdG91Y2ggaW50ZXJhY3Rpb25cbiAgICB0aGlzLmNvbnRhaW5lci5kYXRhc2V0LnRvdWNoQWN0aXZlID0gJ3RydWUnXG5cbiAgICAvLyBSZWNvcmQgdG91Y2ggc3RhcnQgdGltZSBhbmQgcG9zaXRpb25cbiAgICB0aGlzLnRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIHRoaXMudG91Y2hNb3ZlZCA9IGZhbHNlXG5cbiAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0b3VjaCA9IGV2ZW50LnRvdWNoZXNbMF1cbiAgICAgIHRoaXMudG91Y2hTdGFydFBvc2l0aW9uID0geyB4OiB0b3VjaC5jbGllbnRYLCB5OiB0b3VjaC5jbGllbnRZIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoTW92ZShldmVudDogVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHRvdWNoID0gZXZlbnQudG91Y2hlc1swXVxuICAgICAgY29uc3QgZGVsdGFYID0gTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydFBvc2l0aW9uLngpXG4gICAgICBjb25zdCBkZWx0YVkgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0UG9zaXRpb24ueSlcblxuICAgICAgLy8gTWFyayBhcyBtb3ZlZCBpZiB1c2VyIG1vdmVkIGZpbmdlciBtb3JlIHRoYW4gdGhyZXNob2xkXG4gICAgICBpZiAoZGVsdGFYID4gdGhpcy5UT1VDSF9NT1ZFX1RIUkVTSE9MRCB8fCBkZWx0YVkgPiB0aGlzLlRPVUNIX01PVkVfVEhSRVNIT0xEKSB7XG4gICAgICAgIHRoaXMudG91Y2hNb3ZlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoRW5kKGV2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgLy8gUHJldmVudCBjbGljayBldmVudCBmcm9tIGZpcmluZyBhZnRlciB0b3VjaFxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgIGNvbnN0IHRvdWNoRHVyYXRpb24gPSBEYXRlLm5vdygpIC0gdGhpcy50b3VjaFN0YXJ0VGltZVxuICAgIGNvbnNvbGUubG9nKCfwn5GGIFRvdWNoIGVuZCAtIGR1cmF0aW9uOicsIHRvdWNoRHVyYXRpb24sICdtb3ZlZDonLCB0aGlzLnRvdWNoTW92ZWQpXG5cbiAgICAvLyBPbmx5IHRyaWdnZXIgbG9jYXRpb24gc2VsZWN0aW9uIGlmOlxuICAgIC8vIDEuIFRvdWNoIHdhcyBoZWxkIGxvbmcgZW5vdWdoIChwcmV2ZW50cyBhY2NpZGVudGFsIHRhcHMgZHVyaW5nIHNjcm9sbClcbiAgICAvLyAyLiBVc2VyIGRpZG4ndCBtb3ZlIGZpbmdlciBtdWNoIChwcmV2ZW50cyB0cmlnZ2VyaW5nIGR1cmluZyBzY3JvbGwpXG4gICAgaWYgKHRvdWNoRHVyYXRpb24gPj0gdGhpcy5UT1VDSF9ERUxBWV9NUyAmJiAhdGhpcy50b3VjaE1vdmVkKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgRWxlbWVudFxuICAgICAgY29uc3QgbG9jYXRpb25FbGVtZW50ID0gdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLWxvY2F0aW9uLWlkXScpXG5cbiAgICAgIGNvbnNvbGUubG9nKCfwn46vIFRvdWNoIGxvY2F0aW9uIGVsZW1lbnQgZm91bmQ6JywgbG9jYXRpb25FbGVtZW50KVxuXG4gICAgICBpZiAobG9jYXRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uSWQgPSBsb2NhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxvY2F0aW9uLWlkJylcbiAgICAgICAgY29uc29sZS5sb2coJ/Cfk40gVG91Y2ggbG9jYXRpb24gSUQ6JywgbG9jYXRpb25JZClcbiAgICAgICAgaWYgKGxvY2F0aW9uSWQpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUxvY2F0aW9uVG91Y2gobG9jYXRpb25JZCwgbG9jYXRpb25FbGVtZW50IGFzIFNWR0VsZW1lbnQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfinYwgTm8gbG9jYXRpb24gZWxlbWVudCBmb3VuZCBmb3IgdG91Y2gnKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygn4o+t77iPIFRvdWNoIGlnbm9yZWQgLSB0b28gc2hvcnQgb3IgbW92ZWQgdG9vIG11Y2gnKVxuICAgIH1cblxuICAgIC8vIENsZWFyIHRvdWNoIGZsYWcgYWZ0ZXIgYSBkZWxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZGVsZXRlIHRoaXMuY29udGFpbmVyLmRhdGFzZXQudG91Y2hBY3RpdmVcbiAgICB9LCAzMDApXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ/CflrHvuI8gQ2xpY2sgZXZlbnQ6JywgZXZlbnQudGFyZ2V0KVxuXG4gICAgLy8gU2tpcCBpZiB0aGlzIHdhcyBhIHRvdWNoIGludGVyYWN0aW9uXG4gICAgaWYgKHRoaXMuY29udGFpbmVyLmRhdGFzZXQudG91Y2hBY3RpdmUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfij63vuI8gU2tpcHBpbmcgY2xpY2sgLSB0b3VjaCBhY3RpdmUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnRcbiAgICBjb25zdCBsb2NhdGlvbkVsZW1lbnQgPSB0YXJnZXQuY2xvc2VzdCgnW2RhdGEtbG9jYXRpb24taWRdJylcblxuICAgIGNvbnNvbGUubG9nKCfwn46vIExvY2F0aW9uIGVsZW1lbnQgZm91bmQ6JywgbG9jYXRpb25FbGVtZW50KVxuXG4gICAgaWYgKGxvY2F0aW9uRWxlbWVudCkge1xuICAgICAgY29uc3QgbG9jYXRpb25JZCA9IGxvY2F0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbG9jYXRpb24taWQnKVxuICAgICAgY29uc29sZS5sb2coJ/Cfk40gTG9jYXRpb24gSUQ6JywgbG9jYXRpb25JZClcbiAgICAgIGlmIChsb2NhdGlvbklkKSB7XG4gICAgICAgI
25114HRoaXMuaGFuZGxlTG9jYXRpb25DbGljayhsb2NhdGlvbklkLCBsb2NhdGlvbkVsZW1lbnQgYXMgU1ZHRWxlbWVudClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ+KdjCBObyBsb2NhdGlvbiBlbGVtZW50IGZvdW5kIGZvciBjbGljaycpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVMb2NhdGlvblRvdWNoKGxvY2F0aW9uSWQ6IHN0cmluZywgZWxlbWVudDogU1ZHRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIEltbWVkaWF0ZSBmZWVkYmFjayBmb3IgdG91Y2hcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21hcC1sb2NhdGlvbi1hY3RpdmUnKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdtYXAtbG9jYXRpb24tYWN0aXZlJylcbiAgICB9LCAxNTApXG5cbiAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIGFuZCBvcGVuIG1vZGFsIGltbWVkaWF0ZWx5IG9uIG1vYmlsZVxuICAgIHRoaXMuc2V0U2VsZWN0ZWRMb2NhdGlvbihsb2NhdGlvbklkKVxuICAgIHRoaXMub25Mb2NhdGlvblNlbGVjdChsb2NhdGlvbklkKVxuXG4gICAgLy8gTm8gem9vbSBvbiB0b3VjaCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBwaW5jaC16b29tXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUxvY2F0aW9uQ2xpY2sobG9jYXRpb25JZDogc3RyaW5nLCBlbGVtZW50OiBTVkdFbGVtZW50KTogdm9pZCB7XG4gICAgLy8gU3VidGxlIGZlZWRiYWNrIGZvciBkZXNrdG9wIGNsaWNrc1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWFwLWxvY2F0aW9uLWFjdGl2ZScpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ21hcC1sb2NhdGlvbi1hY3RpdmUnKVxuICAgIH0sIDIwMClcblxuICAgIC8vIFVwZGF0ZSBzZWxlY3Rpb25cbiAgICB0aGlzLnNldFNlbGVjdGVkTG9jYXRpb24obG9jYXRpb25JZClcblxuICAgIC8vIE5vdGlmeSBwYXJlbnQgY29tcG9uZW50XG4gICAgdGhpcy5vbkxvY2F0aW9uU2VsZWN0KGxvY2F0aW9uSWQpXG5cbiAgICAvLyBab29tIHRvIGxvY2F0aW9uIG9uIGRlc2t0b3AgKHNtb290aGVyIGV4cGVyaWVuY2UpXG4gICAgaWYgKHRoaXMuZW5hYmxlWm9vbSAmJiB0aGlzLnBhblpvb21JbnN0YW5jZSkge1xuICAgICAgdGhpcy56b29tVG9Mb2NhdGlvbihsb2NhdGlvbklkKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGlnaGxpZ2h0TG9jYXRpb24obG9jYXRpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIHByZXZpb3VzIGhpZ2hsaWdodHNcbiAgICB0aGlzLmxvY2F0aW9uRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaWQpID0+IHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbWFwLWxvY2F0aW9uLXNlbGVjdGVkJylcbiAgICB9KVxuXG4gICAgLy8gQWRkIGhpZ2hsaWdodCB0byBzZWxlY3RlZCBsb2NhdGlvblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmxvY2F0aW9uRWxlbWVudHMuZ2V0KGxvY2F0aW9uSWQpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWFwLWxvY2F0aW9uLXNlbGVjdGVkJylcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHpvb21Ub0xvY2F0aW9uKGxvY2F0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmxvY2F0aW9uRWxlbWVudHMuZ2V0KGxvY2F0aW9uSWQpXG4gICAgaWYgKCFlbGVtZW50IHx8ICF0aGlzLnBhblpvb21JbnN0YW5jZSB8fCAhdGhpcy5zdmdFbGVtZW50KSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgZWxlbWVudCBib3VuZHNcbiAgICAgIGNvbnN0IGJib3ggPSAoZWxlbWVudCBhcyBTVkdHcmFwaGljc0VsZW1lbnQpLmdldEJCb3goKVxuICAgICAgY29uc3Qgc3ZnUmVjdCA9IHRoaXMuc3ZnRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgXG4gICAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgICBjb25zdCBjZW50ZXJYID0gYmJveC54ICsgYmJveC53aWR0aCAvIDJcbiAgICAgIGNvbnN0IGNlbnRlclkgPSBiYm94LnkgKyBiYm94LmhlaWdodCAvIDJcbiAgICAgIFxuICAgICAgLy8gQ2FsY3VsYXRlIHpvb20gbGV2ZWwgKGZpdCBlbGVtZW50IHdpdGggc29tZSBwYWRkaW5nKVxuICAgICAgY29uc3QgcGFkZGluZyA9IDUwXG4gICAgICBjb25zdCBzY2FsZVggPSAoc3ZnUmVjdC53aWR0aCAtIHBhZGRpbmcgKiAyKSAvIGJib3gud2lkdGhcbiAgICAgIGNvbnN0IHNjYWxlWSA9IChzdmdSZWN0LmhlaWdodCAtIHBhZGRpbmcgKiAyKSAvIGJib3guaGVpZ2h0XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKHNjYWxlWCwgc2NhbGVZLCAzKSAvLyBNYXggem9vbSBvZiAzeFxuICAgICAgXG4gICAgICAvLyBQYW4gdG8gY2VudGVyIGFuZCB6b29tXG4gICAgICB0aGlzLnBhblpvb21JbnN0YW5jZS56b29tKHNjYWxlKVxuICAgICAgdGhpcy5wYW5ab29tSW5zdGFuY2UucGFuKHtcbiAgICAgICAgeDogc3ZnUmVjdC53aWR0aCAvIDIgLSBjZW50ZXJYICogc2NhbGUsXG4gICAgICAgIHk6IHN2Z1JlY3QuaGVpZ2h0IC8gMiAtIGNlbnRlclkgKiBzY2FsZVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gem9vbSB0byBsb2NhdGlvbjonLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICAvLyBQdWJsaWMgbWV0aG9kc1xuICB1cGRhdGVMb2NhdGlvbnMobG9jYXRpb25zOiBMb2NhdGlvbltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhdGlvbnMgPSBsb2NhdGlvbnNcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLnNldHVwTG9jYXRpb25FbGVtZW50cygpXG4gICAgfVxuICAgIGlmICh0aGlzLnRvb2x0aXBIYW5kbGVyKSB7XG4gICAgICB0aGlzLnRvb2x0aXBIYW5kbGVyLnVwZGF0ZUxvY2F0aW9ucyhsb2NhdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgc2V0U2VsZWN0ZWRMb2NhdGlvbihsb2NhdGlvbklkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uSWQgPSBsb2NhdGlvbklkXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCAmJiBsb2NhdGlvbklkKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodExvY2F0aW9uKGxvY2F0aW9uSWQpXG4gICAgfVxuICB9XG5cbiAgLy8gUGFuL1pvb20gY29udHJvbHNcbiAgem9vbUluKCk6IHZvaWQge1xuICAgIHRoaXMucGFuWm9vbUluc3RhbmNlPy56b29tSW4oKVxuICB9XG5cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhblpvb21JbnN0YW5jZT8uem9vbU91dCgpXG4gIH1cblxuICByZXNldFZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5wYW5ab29tSW5zdGFuY2U/LnJlc2V0KClcbiAgfVxuXG4gIGZpdFRvVmlldygpOiB2b2lkIHtcbiAgICB0aGlzLnBhblpvb21JbnN0YW5jZT8uZml0KClcbiAgfVxuXG4gIGNlbnRlclZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5wYW5ab29tSW5zdGFuY2U/LmNlbnRlcigpXG4gIH1cblxuICBnZXRab29tTGV2ZWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYW5ab29tSW5zdGFuY2U/LmdldFpvb20oKSB8fCAxXG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhblpvb21JbnN0YW5jZSkge1xuICAgICAgdGhpcy5wYW5ab29tSW5zdGFuY2UuZGVzdHJveSgpXG4gICAgICB0aGlzLnBhblpvb21JbnN0YW5jZSA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy50b29sdGlwSGFuZGxlcikge1xuICAgICAgdGhpcy50b29sdGlwSGFuZGxlci5kZXN0cm95KClcbiAgICAgIHRoaXMudG9vbHRpcEhhbmRsZXIgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpcy5sb2NhdGlvbkVsZW1lbnRzLmNsZWFyKClcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZVxuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgWm9vbUluLCBab29tT3V0LCBSb3RhdGVDY3csIENyb3NzaGFpciB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB0eXBlIHsgTWFwSGFuZGxlciB9IGZyb20gJy4vTWFwSGFuZGxlcidcbmltcG9ydCB7
25114IGNsc3ggfSBmcm9tICdjbHN4J1xuXG5pbnRlcmZhY2UgTWFwQ29udHJvbHNQcm9wcyB7XG4gIG1hcEhhbmRsZXI6IE1hcEhhbmRsZXJcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnY29tcGFjdCdcbn1cblxuZXhwb3J0IGNvbnN0IE1hcENvbnRyb2xzOiBSZWFjdC5GQzxNYXBDb250cm9sc1Byb3BzPiA9ICh7XG4gIG1hcEhhbmRsZXIsXG4gIGNsYXNzTmFtZSxcbiAgdmFyaWFudCA9ICdkZWZhdWx0J1xufSkgPT4ge1xuICBjb25zdCBbem9vbUxldmVsLCBzZXRab29tTGV2ZWxdID0gdXNlU3RhdGUoMSlcblxuICAvLyBVcGRhdGUgem9vbSBsZXZlbCBkaXNwbGF5XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlWm9vbUxldmVsID0gKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFpvb20gPSBtYXBIYW5kbGVyLmdldFpvb21MZXZlbCgpXG4gICAgICBzZXRab29tTGV2ZWwoTWF0aC5yb3VuZChjdXJyZW50Wm9vbSAqIDEwMCkgLyAxMDApXG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGluaXRpYWxseVxuICAgIHVwZGF0ZVpvb21MZXZlbCgpXG5cbiAgICAvLyBVcGRhdGUgb24gem9vbSBjaGFuZ2VzICh3ZSBjb3VsZCBhZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gTWFwSGFuZGxlcilcbiAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKHVwZGF0ZVpvb21MZXZlbCwgNTAwKVxuICAgIHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKGludGVydmFsKVxuICB9LCBbbWFwSGFuZGxlcl0pXG5cbiAgY29uc3QgY29udHJvbEJ1dHRvbkNsYXNzID0gY2xzeChcbiAgICAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy0xMCBoLTEwIGJnLXdoaXRlIGJvcmRlciBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeSByb3VuZGVkLW1lYyBzaGFkb3ctc20nLFxuICAgICdob3ZlcjpiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSBob3Zlcjpib3JkZXItbWVjLXByaW1hcnkvMjAgaG92ZXI6c2hhZG93LW1kJyxcbiAgICAnYWN0aXZlOnNjYWxlLTk1IHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTE1MCcsXG4gICAgJ3RleHQtdGV4dC1zZWNvbmRhcnkgaG92ZXI6dGV4dC1tZWMtcHJpbWFyeScsXG4gICAgJ3RvdWNoLW1hbmlwdWxhdGlvbiB0YXAtaGlnaGxpZ2h0LW5vbmUnXG4gIClcblxuICBjb25zdCBjb21wYWN0QnV0dG9uQ2xhc3MgPSBjbHN4KFxuICAgICdmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LTggaC04IGJnLXdoaXRlLzkwIGJhY2tkcm9wLWJsdXItc20gcm91bmRlZCBib3JkZXIgYm9yZGVyLXdoaXRlLzIwJyxcbiAgICAnaG92ZXI6Ymctd2hpdGUgaG92ZXI6Ym9yZGVyLW1lYy1wcmltYXJ5LzIwJyxcbiAgICAnYWN0aXZlOnNjYWxlLTk1IHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTE1MCcsXG4gICAgJ3RleHQtdGV4dC1zZWNvbmRhcnkgaG92ZXI6dGV4dC1tZWMtcHJpbWFyeScsXG4gICAgJ3RvdWNoLW1hbmlwdWxhdGlvbiB0YXAtaGlnaGxpZ2h0LW5vbmUnXG4gIClcblxuICBjb25zdCBidXR0b25DbGFzcyA9IHZhcmlhbnQgPT09ICdjb21wYWN0JyA/IGNvbXBhY3RCdXR0b25DbGFzcyA6IGNvbnRyb2xCdXR0b25DbGFzc1xuICBjb25zdCBpY29uU2l6ZSA9IHZhcmlhbnQgPT09ICdjb21wYWN0JyA/ICd3LTMgaC0zJyA6ICd3LTQgaC00J1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ2ZsZXggZmxleC1jb2wgc3BhY2UteS0yJywgY2xhc3NOYW1lKX0+XG4gICAgICB7LyogWm9vbSBDb250cm9scyAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBzcGFjZS15LTFcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG1hcEhhbmRsZXIuem9vbUluKCl9XG4gICAgICAgICAgY2xhc3NOYW1lPXtidXR0b25DbGFzc31cbiAgICAgICAgICB0aXRsZT1cIlZlcmdyw7bDn2VyblwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkthcnRlIHZlcmdyw7bDn2VyblwiXG4gICAgICAgID5cbiAgICAgICAgICA8Wm9vbUluIGNsYXNzTmFtZT17aWNvblNpemV9IC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICBcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG1hcEhhbmRsZXIuem9vbU91dCgpfVxuICAgICAgICAgIGNsYXNzTmFtZT17YnV0dG9uQ2xhc3N9XG4gICAgICAgICAgdGl0bGU9XCJWZXJrbGVpbmVyblwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkthcnRlIHZlcmtsZWluZXJuXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxab29tT3V0IGNsYXNzTmFtZT17aWNvblNpemV9IC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBab29tIExldmVsIEluZGljYXRvciAqL31cbiAgICAgIHt2YXJpYW50ID09PSAnZGVmYXVsdCcgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlLzkwIGJhY2tkcm9wLWJsdXItc20gYm9yZGVyIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5IHJvdW5kZWQtbWVjIHB4LTIgcHktMSBzaGFkb3ctc21cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtdGV4dC1zZWNvbmRhcnkgZm9udC1tb25vXCI+XG4gICAgICAgICAgICB7TWF0aC5yb3VuZCh6b29tTGV2ZWwgKiAxMDApfSVcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgey8qIFZpZXcgQ29udHJvbHMgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgc3BhY2UteS0xXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBtYXBIYW5kbGVyLmNlbnRlclZpZXcoKX1cbiAgICAgICAgICBjbGFzc05hbWU9e2J1dHRvbkNsYXNzfVxuICAgICAgICAgIHRpdGxlPVwiWmVudHJpZXJlblwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkthcnRlIHplbnRyaWVyZW5cIlxuICAgICAgICA+XG4gICAgICAgICAgPENyb3NzaGFpciBjbGFzc05hbWU9e2ljb25TaXplfSAvPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gbWFwSGFuZGxlci5yZXNldFZpZXcoKX1cbiAgICAgICAgICBjbGFzc05hbWU9e2J1dHRvbkNsYXNzfVxuICAgICAgICAgI
25114HRpdGxlPVwiWnVyw7xja3NldHplblwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkFuc2ljaHQgenVyw7xja3NldHplblwiXG4gICAgICAgID5cbiAgICAgICAgICA8Um90YXRlQ2N3IGNsYXNzTmFtZT17aWNvblNpemV9IC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuLy8gRmxvYXRpbmcgY29udHJvbHMgZm9yIG1vYmlsZVxuZXhwb3J0IGNvbnN0IEZsb2F0aW5nTWFwQ29udHJvbHM6IFJlYWN0LkZDPHtcbiAgbWFwSGFuZGxlcjogTWFwSGFuZGxlclxuICBjbGFzc05hbWU/OiBzdHJpbmdcbn0+ID0gKHsgbWFwSGFuZGxlciwgY2xhc3NOYW1lIH0pID0+IHtcbiAgY29uc3QgW2lzRXhwYW5kZWQsIHNldElzRXhwYW5kZWRdID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xzeCgnZml4ZWQgYm90dG9tLTQgcmlnaHQtNCB6LTQwJywgY2xhc3NOYW1lKX0+XG4gICAgICB7LyogTWFpbiBDb250cm9sIEJ1dHRvbiAtIE9wdGltaXplZCBmb3IgdG91Y2ggKi99XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRXhwYW5kZWQoIWlzRXhwYW5kZWQpfVxuICAgICAgICBjbGFzc05hbWU9XCJ3LTE0IGgtMTQgYmctbWVjLXByaW1hcnkgdGV4dC13aGl0ZSByb3VuZGVkLWZ1bGwgc2hhZG93LWxnIGFjdGl2ZTpzY2FsZS05NSB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdG91Y2gtbWFuaXB1bGF0aW9uXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkthcnRlbnN0ZXVlcnVuZ1wiXG4gICAgICAgIHN0eWxlPXt7IG1pbkhlaWdodDogJzQ0cHgnLCBtaW5XaWR0aDogJzQ0cHgnIH19XG4gICAgICA+XG4gICAgICAgIDxab29tSW4gY2xhc3NOYW1lPVwidy02IGgtNlwiIC8+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgey8qIEV4cGFuZGVkIENvbnRyb2xzICovfVxuICAgICAge2lzRXhwYW5kZWQgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGJvdHRvbS0xNCByaWdodC0wIGZsZXggZmxleC1jb2wgc3BhY2UteS0yIGFuaW1hdGUtaW4gc2xpZGUtdXAgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICBtYXBIYW5kbGVyLnpvb21JbigpXG4gICAgICAgICAgICAgIHNldElzRXhwYW5kZWQoZmFsc2UpXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy0xMiBoLTEyIGJnLXdoaXRlIHRleHQtdGV4dC1zZWNvbmRhcnkgcm91bmRlZC1mdWxsIHNoYWRvdy1tZCBhY3RpdmU6c2NhbGUtOTUgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMTUwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRvdWNoLW1hbmlwdWxhdGlvblwiXG4gICAgICAgICAgICBzdHlsZT17eyBtaW5IZWlnaHQ6ICc0NHB4JywgbWluV2lkdGg6ICc0NHB4JyB9fVxuICAgICAgICAgICAgdGl0bGU9XCJWZXJncsO2w59lcm5cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxab29tSW4gY2xhc3NOYW1lPVwidy01IGgtNVwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICBtYXBIYW5kbGVyLnpvb21PdXQoKVxuICAgICAgICAgICAgICBzZXRJc0V4cGFuZGVkKGZhbHNlKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctMTIgaC0xMiBiZy13aGl0ZSB0ZXh0LXRleHQtc2Vjb25kYXJ5IHJvdW5kZWQtZnVsbCBzaGFkb3ctbWQgYWN0aXZlOnNjYWxlLTk1IHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTE1MCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0b3VjaC1tYW5pcHVsYXRpb25cIlxuICAgICAgICAgICAgc3R5bGU9e3sgbWluSGVpZ2h0OiAnNDRweCcsIG1pbldpZHRoOiAnNDRweCcgfX1cbiAgICAgICAgICAgIHRpdGxlPVwiVmVya2xlaW5lcm5cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxab29tT3V0IGNsYXNzTmFtZT1cInctNSBoLTVcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgbWFwSGFuZGxlci5yZXNldFZpZXcoKVxuICAgICAgICAgICAgICBzZXRJc0V4cGFuZGVkKGZhbHNlKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctMTIgaC0xMiBiZy13aGl0ZSB0ZXh0LXRleHQtc2Vjb25kYXJ5IHJvdW5kZWQtZnVsbCBzaGFkb3ctbWQgYWN0aXZlOnNjYWxlLTk1IHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTE1MCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0b3VjaC1tYW5pcHVsYXRpb25cIlxuICAgICAgICAgICAgc3R5bGU9e3sgbWluSGVpZ2h0OiAnNDRweCcsIG1pbldpZHRoOiAnNDRweCcgfX1cbiAgICAgICAgICAgIHRpdGxlPVwiWnVyw7xja3NldHplblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFJvdGF0ZUNjdyBjbGFzc05hbWU9XCJ3LTQgaC00XCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICB7LyogQmFja2Ryb3AgKi99XG4gICAgICB7aXNFeHBhbmRlZCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJmaXhlZCBpbnNldC0wIC16LTEwXCJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRJc0V4cGFuZGVkKGZhbHNlKX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsImV4cG9ydCBkZWZhdWx0IFwiX19WSVRFX0FTU0VUX19EQmlYJHpMdl9fXCIiLCJpbXBvcnQgUmVhY3QsIHsgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VBcHBTdG9yZSB9IGZyb20gJ0BzdG9yZXMvdXNlQXBwU3RvcmUnXG5pbXBvcnQgeyBNYXBIYW5kbGVyIH0gZnJvbSAnLi9NYXBIYW5kbGVyJ1xuaW1wb3J0IHsgTWFwQ29udHJvbHMgfSBmcm9tICcuL01hcENvbnRyb2xzJ1xuaW1wb3J0IHsgTG9hZGluZ1NwaW5uZXIgfSBmcm9tICdAY29tcG9uZW50cy9VSS9Mb2FkaW5nU3Bpbm5lcidcbmltcG9ydCB0eXBlIHsgTG9jYXRpb24sIENvbnRhY3QsIE1hcFByb3BzIH0gZnJvbSAnLi4vLi4vdHlwZXMvaW5kZXgnXG5pbXBvcnQgeyBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCBtYXBTdmcgZnJvbSAnLi4vLi4vYXNzZXRzL21hcC5zdmcnXG5cbmludGVyZmFjZSBNYXBDb250YWluZXJQcm9wcyBleHRlbmRzIE9taXQ8TWFwUHJvcHMsICdvbkxvY2F0aW9uU2VsZWN0Jz4ge1xuICBjb250YWN0cz86IENvbnRhY3RbXVxuICBzdmdVcmw/OiBzdHJpbmdcbiAgc2hvd0NvbnRyb2xzPzogYm9vbGVhblxuICBzaG93TG9hZGluZ0J1dHRvbj86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IE1hcENvbnRhaW5lcjogUmVhY3QuRkM8TWFwQ29udGFpbmVyUHJvcHM+ID0gKHtcbiAgbG9jYXRpb25zLFxuICBjb250YWN0cyA9IFtdLFxuICBzZWxlY3RlZExvY2F0aW9uSWQsXG4gIGNsYXNzTmFtZSxcbiAgaGVpZ2h0ID0gNTAwLFxuICBlbmFibGVab29tID0gdHJ1ZSwgLy8gRW5hYmxlIHpvb20gZm9yIGJldHRlciBwaW4gdGFyZ2V0aW5nXG4gIGVuYWJsZVBhbiA9IHRydWUsIC8vIEVuYWJsZSBwYW4gZm9yIG5hdmlnYXRpb25cbiAgc3ZnVXJsID0gbWFwU3ZnLCAvLyBVc2UgaW1wb3J0ZWQgU1ZHXG4gIHNob3dDb250cm9scyA9IHRydWUsIC8vIFNob3cgem9vbSBjb250cm9sc1xuICBzaG93TG9hZGluZ0J1dHRvbiA9IGZ
25114hbHNlXG59KSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lclJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3Qgc3ZnQ29udGFpbmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICBjb25zdCBtYXBIYW5kbGVyUmVmID0gdXNlUmVmPE1hcEhhbmRsZXIgfCBudWxsPihudWxsKVxuICBcbiAgY29uc3QgeyBzZXRTZWxlY3RlZExvY2F0aW9uLCBvcGVuTG9jYXRpb25Nb2RhbCB9ID0gdXNlQXBwU3RvcmUoKVxuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc01hcExvYWRlZCwgc2V0SXNNYXBMb2FkZWRdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICAvLyBIYW5kbGUgbG9jYXRpb24gc2VsZWN0aW9uXG4gIGNvbnN0IGhhbmRsZUxvY2F0aW9uU2VsZWN0ID0gKGxvY2F0aW9uSWQ6IHN0cmluZykgPT4ge1xuICAgIHNldFNlbGVjdGVkTG9jYXRpb24obG9jYXRpb25JZClcbiAgICBvcGVuTG9jYXRpb25Nb2RhbChsb2NhdGlvbklkKVxuICB9XG5cbiAgLy8gTG9hZCBTVkcgbWFwXG4gIGNvbnN0IGxvYWRNYXAgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzdmdDb250YWluZXJSZWYuY3VycmVudCB8fCBpc01hcExvYWRlZCkgcmV0dXJuXG5cbiAgICBzZXRJc0xvYWRpbmcodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZldGNoIFNWRyBjb250ZW50XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHN2Z1VybClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBtYXA6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdmdDb250ZW50ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICBcbiAgICAgIC8vIEluc2VydCBTVkcgaW50byBjb250YWluZXJcbiAgICAgIGlmIChzdmdDb250YWluZXJSZWYuY3VycmVudCkge1xuICAgICAgICBzdmdDb250YWluZXJSZWYuY3VycmVudC5pbm5lckhUTUwgPSBzdmdDb250ZW50XG4gICAgICAgIFxuICAgICAgICAvLyBJbml0aWFsaXplIG1hcCBoYW5kbGVyXG4gICAgICAgIGlmIChtYXBIYW5kbGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBtYXBIYW5kbGVyUmVmLmN1cnJlbnQuZGVzdHJveSgpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIG1hcEhhbmRsZXJSZWYuY3VycmVudCA9IG5ldyBNYXBIYW5kbGVyKHtcbiAgICAgICAgICBjb250YWluZXI6IHN2Z0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgICAgIGxvY2F0aW9ucyxcbiAgICAgICAgICBjb250YWN0cyxcbiAgICAgICAgICBzZWxlY3RlZExvY2F0aW9uSWQsXG4gICAgICAgICAgb25Mb2NhdGlvblNlbGVjdDogaGFuZGxlTG9jYXRpb25TZWxlY3QsXG4gICAgICAgICAgZW5hYmxlWm9vbSxcbiAgICAgICAgICBlbmFibGVQYW5cbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBtYXBIYW5kbGVyUmVmLmN1cnJlbnQuaW5pdGlhbGl6ZSgpXG4gICAgICAgIHNldElzTWFwTG9hZGVkKHRydWUpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBsb2FkIG1hcCdcbiAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ01hcCBsb2FkaW5nIGVycm9yOicsIGVycilcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIC8vIFVwZGF0ZSBtYXAgd2hlbiBsb2NhdGlvbnMgY2hhbmdlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG1hcEhhbmRsZXJSZWYuY3VycmVudCAmJiBpc01hcExvYWRlZCkge1xuICAgICAgbWFwSGFuZGxlclJlZi5jdXJyZW50LnVwZGF0ZUxvY2F0aW9ucyhsb2NhdGlvbnMpXG4gICAgfVxuICB9LCBbbG9jYXRpb25zLCBpc01hcExvYWRlZF0pXG5cbiAgLy8gVXBkYXRlIHNlbGVjdGVkIGxvY2F0aW9uXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG1hcEhhbmRsZXJSZWYuY3VycmVudCAmJiBpc01hcExvYWRlZCkge1xuICAgICAgbWFwSGFuZGxlclJlZi5jdXJyZW50LnNldFNlbGVjdGVkTG9jYXRpb24oc2VsZWN0ZWRMb2NhdGlvbklkIHx8IG51bGwpXG4gICAgfVxuICB9LCBbc2VsZWN0ZWRMb2NhdGlvbklkLCBpc01hcExvYWRlZF0pXG5cbiAgLy8gQ2xlYW51cCBvbiB1bm1vdW50XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChtYXBIYW5kbGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgbWFwSGFuZGxlclJlZi5jdXJyZW50LmRlc3Ryb3koKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW10pXG5cbiAgLy8gQXV0by1sb2FkIG1hcCBpbW1lZGlhdGVseVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNNYXBMb2FkZWQgJiYgIWlzTG9hZGluZyAmJiAhZXJyb3IpIHtcbiAgICAgIGxvYWRNYXAoKVxuICAgIH1cbiAgfSwgW2lzTWFwTG9hZGVkLCBpc0xvYWRpbmcsIGVycm9yXSlcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17Y29udGFpbmVyUmVmfVxuICAgICAgY2xhc3NOYW1lPXtjbHN4KCdyZWxhdGl2ZSBiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeScsIGNsYXNzTmFtZSl9XG4gICAgICBzdHlsZT17e1xuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHRvdWNoQWN0aW9uOiAnbWFuaXB1bGF0aW9uJywgLy8gQWxsb3cgem9vbSBhbmQgcGFuIGdlc3R1cmVzXG4gICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyAvLyBQcmV2ZW50IHRleHQgc2VsZWN0aW9uIG9uIHRvdWNoXG4gICAgICB9fVxuICAgID5cbiAgICAgIHsvKiBMb2FkaW5nIFN0YXRlICovfVxuICAgICAgeyFpc01hcExvYWRlZCAmJiAhZXJyb3IgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LTAgZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICB7aXNMb2FkaW5nID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8TG9hZGluZ1NwaW5uZXIgc2l6ZT1cImxnXCIgLz5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtNCB0ZXh0LXRleHQtc2Vjb25kYXJ5XCI+S2FydGUgd2lyZCBnZWxhZGVuLi4uPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IHNob3dMb2FkaW5nQnV0dG9uID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTYgaC0xNiBiZy1tZWMtcHJpbWFyeS8xMCByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbXgtYXV0byBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzTmFtZT1cInctOCBoLTggdGV4dC1tZWMtcHJpbWFyeVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2VMaW5lY2FwPVwicm91bmRcIiBzdHJva2VMaW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlV2lkdGg9ezJ9IGQ9XCJNOSAyMGwtNS40NDctMi43MjRBMSAxIDAgMDEzIDE2LjM4MlY1LjYxOGExIDEgMCAwMTEuNDQ3LS44OTRMOSA3bTAgMTNsNi0zbS02IDNWN202IDEwbDQuNTUzIDIuMjc2QTEgMSAwIDAwMjEgMTguMzgyVjcuNjE4YTEgMSAwIDAwLTEuNDQ3LS44OTRMMTUgNG0wIDEzVjRtLTYgM2w2LTNcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICBJbnRlcmFrdGl2ZSBLYXJ0ZVxuICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeSBtYi00XCI+XG4gICAgICAgICAgICAgICAgICBLbGlja2VuIFNpZSBhdWYgXCJLYXJ0ZSBsYWRlblwiIHVtIGRpZSBpbnRlcmFrdGl2ZSBTdGFuZG9ydGthcnRlIGFuenV6ZWlnZW5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17bG9hZE1hcH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzTG9hZGluZ31cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEthcnRlIGxhZGVuXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPExvYWRpbmdTcGlubmVyIHNpemU9XCJsZ1wiIC8+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTQgdGV4dC10ZXh0LXNlY29uZGFyeVwiPkthcnRlIHdpcmQgYXV0b21hdGlzY2ggZ2VsYWRlbi4uLjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgey8qIEVycm9yIFN0YXRlICovfVxuICAgICAge2Vycm9yICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC0wIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciBwLTZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy0xNiBoLTE2IGJnLXJlZC0xMDAgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG14LWF1dG8gbWItM1wiPlxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzTmFtZT1cInctOCBoLTggdGV4dC1yZWQtNTAwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlTGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZVdpZHRoP
25114XsyfSBkPVwiTTEyIDl2Mm0wIDRoLjAxbS02LjkzOCA0aDEzLjg1NmMxLjU0IDAgMi41MDItMS42NjcgMS43MzItMi41TDEzLjczMiA0Yy0uNzctLjgzMy0xLjk2NC0uODMzLTIuNzMyIDBMMy43MzIgMTYuNWMtLjc3LjgzMy4xOTIgMi41IDEuNzMyIDIuNXpcIiAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0yXCI+XG4gICAgICAgICAgICAgIEthcnRlIGtvbm50ZSBuaWNodCBnZWxhZGVuIHdlcmRlblxuICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnkgbWItNCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgIHtlcnJvcn1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgb25DbGljaz17bG9hZE1hcH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLXNlY29uZGFyeVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEVybmV1dCB2ZXJzdWNoZW5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG5cbiAgICAgIHsvKiBTVkcgQ29udGFpbmVyICovfVxuICAgICAgPGRpdlxuICAgICAgICByZWY9e3N2Z0NvbnRhaW5lclJlZn1cbiAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICd3LWZ1bGwgaC1mdWxsIG92ZXJmbG93LWhpZGRlbicsXG4gICAgICAgICAgIWlzTWFwTG9hZGVkICYmICdvcGFjaXR5LTAnXG4gICAgICAgICl9XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgdHJhbnNpdGlvbjogJ29wYWNpdHkgMC4zcyBlYXNlLWluLW91dCcsXG4gICAgICAgICAgdG91Y2hBY3Rpb246ICdtYW5pcHVsYXRpb24nLCAvLyBBbGxvdyB6b29tIGFuZCBwYW4gZ2VzdHVyZXNcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyAvLyBTaG93IHBvaW50ZXIgY3Vyc29yIGZvciBjbGlja2FibGUgbG9jYXRpb25zXG4gICAgICAgIH19XG4gICAgICAvPlxuXG4gICAgICB7LyogTWFwIENvbnRyb2xzICovfVxuICAgICAge3Nob3dDb250cm9scyAmJiBpc01hcExvYWRlZCAmJiBtYXBIYW5kbGVyUmVmLmN1cnJlbnQgJiYgKFxuICAgICAgICA8TWFwQ29udHJvbHNcbiAgICAgICAgICBtYXBIYW5kbGVyPXttYXBIYW5kbGVyUmVmLmN1cnJlbnR9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTQgcmlnaHQtNFwiXG4gICAgICAgIC8+XG4gICAgICApfVxuXG5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTWFpbCwgUGhvbmUsIE1hcFBpbiwgVXNlciB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IGNsc3ggfSBmcm9tICdjbHN4J1xuaW1wb3J0IHR5cGUgeyBDb250YWN0IH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIENPTlRBQ1QgQ0FSRCAtIFNpbmdsZSBTb3VyY2Ugb2YgVHJ1dGhcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmludGVyZmFjZSBVbmlmaWVkQ29udGFjdENhcmRQcm9wcyB7XG4gIGNvbnRhY3Q6IENvbnRhY3RcbiAgdmFyaWFudD86ICdjb21wYWN0JyB8ICdkZWZhdWx0JyB8ICdkZXRhaWxlZCdcbiAgb25DbGljaz86IChjb250YWN0OiBDb250YWN0KSA9PiB2b2lkXG4gIHNob3dMb2NhdGlvbj86IGJvb2xlYW5cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBVbmlmaWVkQ29udGFjdENhcmQ6IFJlYWN0LkZDPFVuaWZpZWRDb250YWN0Q2FyZFByb3BzPiA9ICh7XG4gIGNvbnRhY3QsXG4gIHZhcmlhbnQgPSAnZGVmYXVsdCcsXG4gIG9uQ2xpY2ssXG4gIHNob3dMb2NhdGlvbiA9IGZhbHNlLFxuICBjbGFzc05hbWVcbn0pID0+IHtcbiAgLy8g8J+UjSBERUJVRzogTG9nIGNvbnRhY3QgZGF0YVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogRnVsbCBjb250YWN0IG9iamVjdDonLCBjb250YWN0KVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogQ29udGFjdCBmaWVsZHM6Jywge1xuICAgIGlkOiBjb250YWN0LmlkLFxuICAgIGZ1bGxOYW1lOiBjb250YWN0LmZ1bGxOYW1lLFxuICAgIHBvc2l0aW9uOiBjb250YWN0LnBvc2l0aW9uLFxuICAgIGRlcGFydG1lbnQ6IGNvbnRhY3QuZGVwYXJ0bWVudCxcbiAgICBlbWFpbDogY29udGFjdC5lbWFpbCxcbiAgICBwaG9uZTogY29udGFjdC5waG9uZSxcbiAgICBtb2JpbGU6IGNvbnRhY3QubW9iaWxlLFxuICAgIGltYWdlOiBjb250YWN0LmltYWdlLFxuICAgIGxvY2F0aW9uTmFtZTogY29udGFjdC5sb2NhdGlvbk5hbWUsXG4gICAgbG9jYXRpb25DaXR5OiBjb250YWN0LmxvY2F0aW9uQ2l0eSxcbiAgICBzcGVjaWFsdGllczogY29udGFjdC5zcGVjaWFsdGllcyxcbiAgICBzb2NpYWxMaW5rczogY29udGFjdC5zb2NpYWxMaW5rc1xuICB9KVxuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gKCkgPT4ge1xuICAgIG9uQ2xpY2s/Lihjb250YWN0KVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRW1haWxDbGljayA9IChlOiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYG1haWx0bzoke2NvbnRhY3QuZW1haWx9YFxuICB9XG5cbiAgY29uc3QgaGFuZGxlUGhvbmVDbGljayA9IChlOiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIGlmIChjb250YWN0LnBob25lKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGB0ZWw6JHtjb250YWN0LnBob25lfWBcbiAgICB9XG4gIH1cblxuICAvLyBDT01QQUNUIFZBUklBTlQgLSBGb3IgbGlzdHMgYW5kIHNtYWxsIHNwYWNlc1xuICBpZiAodmFyaWFudCA9PT0gJ2NvbXBhY3QnKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICdmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTMgcC0zIGJnLXdoaXRlIGJvcmRlciBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeSByb3VuZGVkLW1lYycsXG4gICAgICAgICAgJ2hvdmVyOmJvcmRlci1tZWMtcHJpbWFyeS8yMCBob3ZlcjpzaGFkb3ctY2FyZCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAnLFxuICAgICAgICAgICd0b3VjaC10YXJnZXQtbGcnLFxuICAgICAgICAgIG9uQ2xpY2sgJiYgJ2N1cnNvci1wb2ludGVyJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XG4gICAgICA+XG4gICAgICAgI
25114HsvKiBBdmF0YXIgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIHtjb250YWN0LmltYWdlID8gKFxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBzcmM9e2NvbnRhY3QuaW1hZ2V9XG4gICAgICAgICAgICAgIGFsdD17Y29udGFjdC5mdWxsTmFtZX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy0xMCBoLTEwIHJvdW5kZWQtZnVsbCBvYmplY3QtY292ZXIgb2JqZWN0LWNlbnRlclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTAgaC0xMCBiZy1tZWMtcHJpbWFyeS8xMCByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPFVzZXIgY2xhc3NOYW1lPVwidy01IGgtNSB0ZXh0LW1lYy1wcmltYXJ5XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBJbmZvICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIHRleHQtdGV4dC1wcmltYXJ5IHRydW5jYXRlXCI+e2NvbnRhY3QuZnVsbE5hbWV9PC9oMz5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgdHJ1bmNhdGVcIj57Y29udGFjdC5wb3NpdGlvbn08L3A+XG4gICAgICAgICAgXG4gICAgICAgICAgey8qIERlcGFydG1lbnQvU3BlY2lhbHRpZXMgKi99XG4gICAgICAgICAge2NvbnRhY3Quc3BlY2lhbHRpZXMgJiYgY29udGFjdC5zcGVjaWFsdGllcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC10ZXh0LW11dGVkIHRydW5jYXRlXCI+XG4gICAgICAgICAgICAgIHtjb250YWN0LnNwZWNpYWx0aWVzLnNsaWNlKDAsIDIpLmpvaW4oJywgJyl9XG4gICAgICAgICAgICAgIHtjb250YWN0LnNwZWNpYWx0aWVzLmxlbmd0aCA+IDIgJiYgYCArJHtjb250YWN0LnNwZWNpYWx0aWVzLmxlbmd0aCAtIDJ9YH1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApfVxuICAgICAgICAgIFxuICAgICAgICAgIHtzaG93TG9jYXRpb24gJiYgY29udGFjdC5sb2NhdGlvbk5hbWUgJiYgKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXRleHQtbXV0ZWQgdHJ1bmNhdGUgZmxleCBpdGVtcy1jZW50ZXIgbXQtMVwiPlxuICAgICAgICAgICAgICA8TWFwUGluIGNsYXNzTmFtZT1cInctMyBoLTMgbXItMVwiIC8+XG4gICAgICAgICAgICAgIHtjb250YWN0LmxvY2F0aW9uTmFtZX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogUXVpY2sgQWN0aW9ucyAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIHtjb250YWN0LmVtYWlsICYmIChcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlRW1haWxDbGlja31cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicC0xLjUgdGV4dC10ZXh0LW11dGVkIGhvdmVyOnRleHQtbWVjLXByaW1hcnkgaG92ZXI6YmctbWVjLXByaW1hcnkvMTAgcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgIHRpdGxlPVwiRS1NYWlsIHNlbmRlblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxNYWlsIGNsYXNzTmFtZT1cInctNCBoLTRcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7Y29udGFjdC5waG9uZSAmJiAoXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVBob25lQ2xpY2t9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInAtMS41IHRleHQtdGV4dC1tdXRlZCBob3Zlcjp0ZXh0LW1lYy1wcmltYXJ5IGhvdmVyOmJnLW1lYy1wcmltYXJ5LzEwIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkFucnVmZW5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8UGhvbmUgY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIC8vIERFVEFJTEVEIFZBUklBTlQgLSBGb3IgZ3JpZHMgd2l0aCBtb3JlIHNwYWNlXG4gIGlmICh2YXJpYW50ID09PSAnZGV0YWlsZWQnKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICdiZy13aGl0ZSByb3VuZGVkLW1lYy1sZyBib3JkZXIgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnkgcC02IGN1cnNvci1wb2ludGVyJyxcbiAgICAgICAgICAnaG92ZXI6Ym9yZGVyLW1lYy1wcmltYXJ5LzIwIGhvdmVyOnNoYWRvdy1jYXJkIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgICAgJ3RvdWNoLXRhcmdldC1sZycsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrfVxuICAgICAgPlxuICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQgc3BhY2UteC00IG1iLTRcIj5cbiAgICAgICAgICB7LyogQXZhdGFyICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAge2NvbnRhY3QuaW1hZ2UgPyAoXG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBzcmM9e2NvbnRhY3QuaW1hZ2V9XG4gICAgICAgICAgICAgICAgYWx0PXtjb250YWN0LmZ1bGxOYW1lfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctMTYgaC0xNiByb3VuZGVkLWZ1bGwgb2JqZWN0LWNvdmVyIG9iamVjdC1jZW50ZXJcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LTE2IGgtMTYgYmctbWVjLXByaW1hcnkvMTAgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPFVzZXIgY2xhc3NOYW1lPVwidy04IGgtOCB0ZXh0LW1lYy1wcmltYXJ5XCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIEJhc2ljIEluZm8gKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0xXCI+XG4gICAgICAgICAgICAgI
25114Htjb250YWN0LmZ1bGxOYW1lfVxuICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnkgbWItMVwiPlxuICAgICAgICAgICAgICB7Y29udGFjdC5wb3NpdGlvbn1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIHtjb250YWN0LmRlcGFydG1lbnQgJiYgKFxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgIHtjb250YWN0LmRlcGFydG1lbnR9XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7c2hvd0xvY2F0aW9uICYmIGNvbnRhY3QubG9jYXRpb25OYW1lICYmIChcbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXRleHQtbXV0ZWQgZmxleCBpdGVtcy1jZW50ZXIgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy00IGgtNCBtci0xXCIgLz5cbiAgICAgICAgICAgICAgICB7Y29udGFjdC5sb2NhdGlvbk5hbWV9LCB7Y29udGFjdC5sb2NhdGlvbkNpdHl9XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBTcGVjaWFsdGllcyAqL31cbiAgICAgICAge2NvbnRhY3Quc3BlY2lhbHRpZXMgJiYgY29udGFjdC5zcGVjaWFsdGllcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTJcIj5cbiAgICAgICAgICAgICAge2NvbnRhY3Quc3BlY2lhbHRpZXMuc2xpY2UoMCwgNCkubWFwKChzcGVjaWFsdHksIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJweC0yIHB5LTEgYmctbWVjLXByaW1hcnkvMTAgdGV4dC1tZWMtcHJpbWFyeSB0ZXh0LXhzIHJvdW5kZWQtZnVsbFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3NwZWNpYWx0eX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICB7Y29udGFjdC5zcGVjaWFsdGllcy5sZW5ndGggPiA0ICYmIChcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJweC0yIHB5LTEgYmctYmFja2dyb3VuZC10ZXJ0aWFyeSB0ZXh0LXRleHQtbXV0ZWQgdGV4dC14cyByb3VuZGVkLWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICt7Y29udGFjdC5zcGVjaWFsdGllcy5sZW5ndGggLSA0fSB3ZWl0ZXJlXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAgey8qIExhbmd1YWdlcyAqL31cbiAgICAgICAge2NvbnRhY3QubGFuZ3VhZ2VzICYmIGNvbnRhY3QubGFuZ3VhZ2VzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbWItMlwiPlNwcmFjaGVuOjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMVwiPlxuICAgICAgICAgICAgICB7Y29udGFjdC5sYW5ndWFnZXMuc2xpY2UoMCwgMykubWFwKChsYW5ndWFnZSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTIgcHktMSBiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSB0ZXh0LXRleHQtcHJpbWFyeSB0ZXh0LXhzIHJvdW5kZWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtsYW5ndWFnZX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICB7Y29udGFjdC5sYW5ndWFnZXMubGVuZ3RoID4gMyAmJiAoXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwicHgtMiBweS0xIGJnLWJhY2tncm91bmQtdGVydGlhcnkgdGV4dC10ZXh0LW11dGVkIHRleHQteHMgcm91bmRlZFwiPlxuICAgICAgICAgICAgICAgICAgK3tjb250YWN0Lmxhbmd1YWdlcy5sZW5ndGggLSAzfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHsvKiBCaW8gKi99XG4gICAgICAgIHtjb250YWN0LmJpbyAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi00XCI+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbGluZS1jbGFtcC0zXCI+XG4gICAgICAgICAgICAgIHtjb250YWN0LmJpb31cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7LyogQ29udGFjdCBBY3Rpb25zICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMyBwdC00IGJvcmRlci10IGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5XCI+XG4gICAgICAgICAge2NvbnRhY3QuZW1haWwgJiYgKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVFbWFpbENsaWNrfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tcHJpbWFyeSB0ZXh0LXNtIGZsZXgtMSBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8TWFpbCBjbGFzc05hbWU9XCJ3LTQgaC00IG1yLTJcIiAvPlxuICAgICAgICAgICAgICBFLU1haWxcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICl9XG4gICAgICAgICAge2NvbnRhY3QucGhvbmUgJiYgKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVQaG9uZUNsaWNrfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tc2Vjb25kYXJ5IHRleHQtc20gZmxleC0xIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxQaG9uZSBjbGFzc05hbWU9XCJ3LTQgaC00IG1yLTJcIiAvPlxuICAgICAgICAgICAgICB
25114BbnJ1ZmVuXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIC8vIERFRkFVTFQgVkFSSUFOVCAtIE1FQyBEZXNpZ24gd2l0aCByZWQgc3RyaXBlLCBzcGVjaWZpYyBjb2xvcnNcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICdiZy13aGl0ZSByb3VuZGVkLWxnIG92ZXJmbG93LWhpZGRlbiBjdXJzb3ItcG9pbnRlciBzaGFkb3ctc20nLFxuICAgICAgICAnaG92ZXI6c2hhZG93LW1kIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgICdoLWZ1bGwgZmxleCBmbGV4LWNvbCcsIC8vIEZ1bGwgaGVpZ2h0ICsgZmxleCBjb2x1bW4gZm9yIGVxdWFsIGhlaWdodCBjYXJkc1xuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICAgIHN0eWxlPXt7IGZvbnRGYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZSwgQXJpYWwsIHNhbnMtc2VyaWYnIH19XG4gICAgPlxuICAgICAgey8qIFJlZCBTdHJpcGUgLSA1cHggKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBoLVs1cHhdXCIgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAnI2QyMDAyOCcgfX0+PC9kaXY+XG5cbiAgICAgIHsvKiBMYXJnZSBJbWFnZSAtIFJlc3BvbnNpdmUgSGVpZ2h0ICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSB3LWZ1bGwgaC1bMjRyZW1dIHNtOmgtWzI2cmVtXSBtZDpoLVsyOHJlbV0gZmxleC1zaHJpbmstMFwiPlxuICAgICAgICB7Y29udGFjdC5pbWFnZSA/IChcbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICBzcmM9e2NvbnRhY3QuaW1hZ2V9XG4gICAgICAgICAgICBhbHQ9e2NvbnRhY3QuZnVsbE5hbWV9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlciBvYmplY3QtY2VudGVyXCJcbiAgICAgICAgICAvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbCBiZy1ncmF5LTIwMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgPFVzZXIgY2xhc3NOYW1lPVwidy0xNiBoLTE2IHRleHQtZ3JheS00MDBcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBDb250YWN0IEluZm9ybWF0aW9uIEJveCAtICNFMEU2RUIgQmFja2dyb3VuZCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC02IGZsZXgtMSBmbGV4IGZsZXgtY29sXCIgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAnI0UwRTZFQicgfX0+XG4gICAgICAgIHsvKiBQb3NpdGlvbiAqL31cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSBtYi0yXCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT5cbiAgICAgICAgICB7Y29udGFjdC5wb3NpdGlvbn1cbiAgICAgICAgICB7Y29udGFjdC5kZXBhcnRtZW50ICYmIGAg4oCiICR7Y29udGFjdC5kZXBhcnRtZW50fWB9XG4gICAgICAgIDwvcD5cblxuICAgICAgICB7LyogTmFtZSAqL31cbiAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQteGwgZm9udC1zZW1pYm9sZCBtYi00XCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT5cbiAgICAgICAgICB7Y29udGFjdC5mdWxsTmFtZX1cbiAgICAgICAgPC9oMz5cblxuICAgICAgICB7LyogQ29udGFjdCBJbmZvICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgIHtjb250YWN0LnBob25lICYmIChcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlUGhvbmVDbGlja31cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0zIHctZnVsbCB0ZXh0LWxlZnQgcC0zIHJvdW5kZWQtbGcgaG92ZXI6Ymctd2hpdGUvNTAgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyknIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxQaG9uZSBjbGFzc05hbWU9XCJ3LTUgaC01IGZsZXgtc2hyaW5rLTBcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW1cIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19Pntjb250YWN0LnBob25lfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7Y29udGFjdC5lbWFpbCAmJiAoXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUVtYWlsQ2xpY2t9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMyB3LWZ1bGwgdGV4dC1sZWZ0IHAtMyByb3VuZGVkLWxnIGhvdmVyOmJnLXdoaXRlLzUwIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpJyB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8TWFpbCBjbGFzc05hbWU9XCJ3LTUgaC01IGZsZXgtc2hyaW5rLTBcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW0gYnJlYWstYWxsXCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT57Y29udGFjdC5lbWFpbH08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogTG9jYXRpb24gKi99XG4gICAgICAgIHtzaG93TG9jYXRpb24gJiYgY29udGFjdC5sb2NhdGlvbk5hbWUgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBwdC00IGJvcmRlci10XCIgc3R5bGU9e3sgYm9yZGVyQ29sb3I6ICcjYTNiMmMyJyB9fT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIHRleHQtc21cIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PlxuICAgICAgICAgICAgICA8TWFwUGluIGNsYXNzTmFtZT1cInctNCBoLTRcIiAvPlxuICAgICAgICAgICAgICA8c3Bhbj57Y29udGFjdC5sb2NhdGlvbk5hbWV9LCB7Y29udGFjdC5sb2NhdGlvbkNpdHl9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAgey8qIFNwZWNpYWx0aWVzICovfVxuICAgICAgICB7Y29udGFjdC5zcGVjaWFsdGllcyAmJiBjb250YWN0LnNwZWNpYWx0aWVzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBwdC00IGJvcmRlci10XCIgc3R5bGU9e3sgYm9yZGVyQ29sb3I6ICcjYTNiMmMyJyB9fT5cbiAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIG1iLTJcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PkZhY2hiZXJlaWNoZTwvaDQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGdhcC0yXCI+XG4gICAgICAgICAgICAgI
25114Htjb250YWN0LnNwZWNpYWx0aWVzLnNsaWNlKDAsIDMpLm1hcCgoc3BlY2lhbHR5LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicHgtMiBweS0xIHRleHQteHMgcm91bmRlZC1sZ1wiXG4gICAgICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICcjZDIwMDI4JywgY29sb3I6ICd3aGl0ZScgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7c3BlY2lhbHR5fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIHtjb250YWN0LnNwZWNpYWx0aWVzLmxlbmd0aCA+IDMgJiYgKFxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJweC0yIHB5LTEgdGV4dC14cyByb3VuZGVkLWxnXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJyNhM2IyYzInLCBjb2xvcjogJ3doaXRlJyB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICt7Y29udGFjdC5zcGVjaWFsdGllcy5sZW5ndGggLSAzfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBTb2NpYWwgTGlua3MgQmFyIC0gI0VGRjNGNSBCYWNrZ3JvdW5kICovfVxuICAgICAge2NvbnRhY3Quc29jaWFsTGlua3MgJiYgY29udGFjdC5zb2NpYWxMaW5rcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC02IHB5LTRcIiBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICcjRUZGM0Y1JyB9fT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtNFwiPlxuICAgICAgICAgICAge2NvbnRhY3Quc29jaWFsTGlua3MubWFwKChsaW5rLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpc1hpbmcgPSBsaW5rLnBsYXRmb3JtPy50b0xvd2VyQ2FzZSgpID09PSAneGluZycgfHwgbGluay51cmw/LmluY2x1ZGVzKCd4aW5nLmNvbScpXG4gICAgICAgICAgICAgIGNvbnN0IGlzTGlua2VkSW4gPSBsaW5rLnBsYXRmb3JtPy50b0xvd2VyQ2FzZSgpID09PSAnbGlua2VkaW4nIHx8IGxpbmsudXJsPy5pbmNsdWRlcygnbGlua2VkaW4uY29tJylcblxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgaHJlZj17bGluay51cmx9XG4gICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImhvdmVyOm9wYWNpdHktNzAgdHJhbnNpdGlvbi1vcGFjaXR5XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAnI2EzYjJjMicgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7aXNYaW5nICYmIChcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzc05hbWU9XCJ3LTUgaC01XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMzg0IDUxMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTYyLjcgMjEwYy0xLjggMy4zLTI1LjIgNDQuNC03MC4xIDEyMy41LTQuOSA4LjMtMTAuOCAxMi41LTE3LjcgMTIuNUg5LjhjLTcuNyAwLTEyLjEtNy41LTguNS0xNC40bDY5LTEyMS4zYy4yIDAgLjItLjEgMC0uM2wtNDMuOS03NS42Yy00LjMtNy44LjMtMTQuMSA4LjUtMTQuMUgxMDBjNy4zIDAgMTMuMyA0LjEgMTggMTIuMmw0NC43IDc3LjV6TTM4Mi42IDQ2LjFsLTE0NCAyNTN2LjNMMzMwLjIgNDY2YzMuOSA3LjEuMiAxNC4xLTguNSAxNC4xaC02NS4yYy03LjYgMC0xMy42LTQtMTgtMTIuMmwtOTIuNC0xNjguNWMzLjMtNS44IDUxLjUtOTAuOCAxNDQuOC0yNTUuMiA0LjYtOC4xIDEwLjQtMTIuMiAxNy41LTEyLjJoNjUuN2M4IDAgMTIuMyA2LjcgOC41IDE0LjF6XCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICB7aXNMaW5rZWRJbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3NOYW1lPVwidy01IGgtNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwMC4yOCA0NDhINy40VjE0OC45aDkyLjg4ek01My43OSAxMDguMUMyNC4wOSAxMDguMSAwIDgzLjUgMCA1My44YTUzLjc5IDUzLjc5IDAgMCAxIDEwNy41OCAwYzAgMjkuNy0yNC4xIDU0LjMtNTMuNzkgNTQuM3pNNDQ3LjkgNDQ4aC05Mi42OFYzMDIuNGMwLTM0LjctLjctNzkuMi00OC4yOS03OS4yLTQ4LjI5IDAtNTUuNjkgMzcuNy01NS42OSA3Ni43VjQ0OGgtOTIuNzhWMTQ4LjloODkuMDh2NDAuOGgxLjNjMTIuNC0yMy41IDQyLjY5LTQ4LjMgODcuODgtNDguMyA5NCAwIDExMS4yOCA2MS45IDExMS4yOCAxNDIuM1Y0NDh6XCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApXG59XG4iLCIvLyBERVBSRUNBVEVEOiBVc2UgVW5pZmllZENvbnRhY3RDYXJkIGluc3RlYWRcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFVuaWZpZWRDb250YWN0Q2FyZCB9IGZyb20gJy4uL1VJL1VuaWZpZWRDb250YWN0Q2FyZCdcbmltcG9ydCB0eXBlIHsgQ29udGFjdCwgQ29udGFjdENhcmRQcm9wcyB9IGZyb20gJy4uLy4uL3R5cGVzL2luZGV4J1xuXG5leHBvcnQgY29uc3QgQ29udGFjdENhcmQ6IFJlYWN0LkZDPENvbnRhY3RDYXJkUHJvcHM+ID0gKHtcbiAgY29udGFjdCxcbiAgb25DbGljayxcbiAgdmFyaWFudCA9ICdkZWZhdWx0JyxcbiAgc2hvd0xvY2F0aW9uID0gZmFsc2UsXG4gIGNsYXNzTmFtZVxufSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxVbmlmaWVkQ29udGFjdENhcmRcbiAgICAgIGNvbnRhY3Q9e2NvbnRhY3R9XG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgdmFyaWFudD17dmFyaWFudH1cbiAgICAgIHNob3dMb2NhdGlvbj17c2hvd0xvY2F0aW9ufVxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgLz5cbiAgKVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7
25114IENvbnRhY3RDYXJkIH0gZnJvbSAnLi9Db250YWN0Q2FyZCdcbmltcG9ydCB7IExvYWRpbmdDYXJkLCBMb2FkaW5nTGlzdCB9IGZyb20gJ0Bjb21wb25lbnRzL1VJL0xvYWRpbmdTcGlubmVyJ1xuaW1wb3J0IHsgdXNlRmlsdGVyZWRDb250YWN0cyB9IGZyb20gJ0Bob29rcy91c2VDb250YWN0cydcbmltcG9ydCB7IHVzZVZpZXdQcmVmZXJlbmNlcywgdXNlQ29udGFjdE1vZGFsIH0gZnJvbSAnQHN0b3Jlcy91c2VBcHBTdG9yZSdcbmltcG9ydCB7IFVzZXJzLCBTZWFyY2ggfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5pbXBvcnQgeyBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCB0eXBlIHsgQ29udGFjdEdyaWRQcm9wcyB9IGZyb20gJy4uLy4uL3R5cGVzL2luZGV4J1xuXG5leHBvcnQgY29uc3QgQ29udGFjdEdyaWQ6IFJlYWN0LkZDPENvbnRhY3RHcmlkUHJvcHM+ID0gKHtcbiAgY29udGFjdHM6IHByb3ZpZGVkQ29udGFjdHMsXG4gIGxvYWRpbmc6IHByb3ZpZGVkTG9hZGluZyxcbiAgb25Db250YWN0Q2xpY2ssXG4gIGxheW91dDogcHJvdmlkZWRMYXlvdXQsXG4gIGNvbHVtbnMgPSAzLFxuICBjbGFzc05hbWUsXG4gIGxvY2F0aW9uSWRcbn0pID0+IHtcbiAgY29uc3QgeyBjb250YWN0TGF5b3V0IH0gPSB1c2VWaWV3UHJlZmVyZW5jZXMoKVxuICBjb25zdCB7IG9wZW46IG9wZW5Db250YWN0TW9kYWwgfSA9IHVzZUNvbnRhY3RNb2RhbCgpXG4gIFxuICAvLyBVc2UgcHJvdmlkZWQgY29udGFjdHMgb3IgZmV0Y2ggZmlsdGVyZWQgY29udGFjdHNcbiAgY29uc3Qge1xuICAgIGNvbnRhY3RzOiBmZXRjaGVkQ29udGFjdHMsXG4gICAgbG9jYXRpb25TcGVjaWZpY0NvbnRhY3RzOiBmZXRjaGVkTG9jYXRpb25TcGVjaWZpY0NvbnRhY3RzLFxuICAgIGlzTG9hZGluZzogZmV0Y2hlZExvYWRpbmcsXG4gICAgZXJyb3JcbiAgfSA9IHVzZUZpbHRlcmVkQ29udGFjdHMobG9jYXRpb25JZClcblxuICAvLyBJZiBsb2NhdGlvbklkIGlzIHByb3ZpZGVkLCB1c2Ugb25seSBsb2NhdGlvbi1zcGVjaWZpYyBjb250YWN0cyAoZm9yIExvY2F0aW9uTW9kYWwpXG4gIC8vIE90aGVyd2lzZSB1c2UgYWxsIGNvbnRhY3RzIChmb3IgbWFpbiBncmlkIHZpZXcpXG4gIGNvbnN0IGNvbnRhY3RzID0gcHJvdmlkZWRDb250YWN0cyB8fCAobG9jYXRpb25JZCA/IGZldGNoZWRMb2NhdGlvblNwZWNpZmljQ29udGFjdHMgOiBmZXRjaGVkQ29udGFjdHMpXG4gIGNvbnN0IGlzTG9hZGluZyA9IHByb3ZpZGVkTG9hZGluZyB8fCBmZXRjaGVkTG9hZGluZ1xuICBjb25zdCBsYXlvdXQgPSBwcm92aWRlZExheW91dCB8fCBjb250YWN0TGF5b3V0XG5cbiAgLy8g8J+UjSBERUJVRzogTG9nIGNvbnRhY3QgZGF0YVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogQ29udGFjdEdyaWQgLSBjb250YWN0cyBhcnJheTonLCBjb250YWN0cylcbiAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IENvbnRhY3RHcmlkIC0gY29udGFjdHMgY291bnQ6JywgY29udGFjdHM/Lmxlbmd0aCB8fCAwKVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogQ29udGFjdEdyaWQgLSBsb2NhdGlvbklkOicsIGxvY2F0aW9uSWQpXG4gIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiBDb250YWN0R3JpZCAtIGxheW91dDonLCBsYXlvdXQpXG4gIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiBDb250YWN0R3JpZCAtIGlzTG9hZGluZzonLCBpc0xvYWRpbmcpXG5cbiAgLy8gSGFuZGxlIGNvbnRhY3QgY2xpY2tcbiAgY29uc3QgaGFuZGxlQ29udGFjdENsaWNrID0gKGNvbnRhY3Q6IGFueSkgPT4ge1xuICAgIGlmIChvbkNvbnRhY3RDbGljaykge1xuICAgICAgb25Db250YWN0Q2xpY2soY29udGFjdClcbiAgICB9IGVsc2Uge1xuICAgICAgb3BlbkNvbnRhY3RNb2RhbChjb250YWN0KVxuICAgIH1cbiAgfVxuXG4gIC8vIExvYWRpbmcgc3RhdGVcbiAgaWYgKGlzTG9hZGluZykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT5cbiAgICAgICAge2xheW91dCA9PT0gJ2dyaWQnID8gKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgJ2dyaWQgZ2FwLTQnLFxuICAgICAgICAgICAgY29sdW1ucyA9PT0gMSAmJiAnZ3JpZC1jb2xzLTEnLFxuICAgICAgICAgICAgY29sdW1ucyA9PT0gMiAmJiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTInLFxuICAgICAgICAgICAgY29sdW1ucyA9PT0gMyAmJiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMnLFxuICAgICAgICAgICAgY29sdW1ucyA9PT0gNCAmJiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMgeGw6Z3JpZC1jb2xzLTQnXG4gICAgICAgICAgKX0+XG4gICAgICAgICAgICB7QXJyYXkuZnJvbSh7IGxlbmd0aDogNiB9KS5tYXAoKF8sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDxMb2FkaW5nQ2FyZCBrZXk9e2luZGV4fSAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPExvYWRpbmdMaXN0IGl0ZW1zPXs2fSAvPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgLy8gRXJyb3Igc3RhdGVcbiAgaWYgKGVycm9yKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KCd0ZXh0LWNlbnRlciBweS04JywgY2xhc3NOYW1lKX0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy0xNiBoLTE2IGJnLXJlZC0xMDAgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG14LWF1dG8gbWItNFwiPlxuICAgICAgICAgIDxVc2VycyBjbGFzc05hbWU9XCJ3LTggaC04IHRleHQtcmVkLTUwMFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IG1iLTJcIj5cbiAgICAgICAgICBGZWhsZXIgYmVpbSBMYWRlbiBkZXIgS29udGFrdGVcbiAgICAgICAgPC9oMz5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgIERpZSBBbnNwcmVjaHBhcnRuZXIga29ubnRlbiBuaWNodCBnZWxhZGVuIHdlcmRlbi5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgLy8gRW1wdHkgc3RhdGVcbiAgaWYgKCFjb250YWN0cyB8fCBjb250YWN0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ3RleHQtY2VudGVyIHB5LTgnLCBjbGFzc05hbWUpfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LTE2IGgtMTYgYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG14LWF1dG8gbWItNFwiPlxuICAgICAgICAgIDxTZWFyY2ggY2xhc3NOYW1lPVwidy04IGgtOCB0ZXh0LXRleHQtbXV0ZWRcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0yXCI+XG4gICAgICAgICAgS2VpbmUgQW5zcHJlY2hwYXJ0bmVyIGdlZnVuZGVuXG4gICAgICAgIDwvaDM+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICB7bG9jYXRpb25JZCBcbiAgICAgICAgICAgID8gJ0bDvHIgZGllc2VuIFN0YW5kb3J0IHNpbmQga2VpbmUgQW5zcHJlY2hwYXJ0bmVyIHZlcmbDvGdiYXIuJ1xuICAgICAgICAgICAgOiAnVmVyc3VjaGVuIFNpZSBhbmRlcmUgU3VjaGtyaXRlcmllbiBvZGVyIEZpbHRlci4nXG4gICAgICAgICAgfVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICAvLyBHcmlkIGxheW91dFxuICBpZiAobGF5b3V0ID09PSAnZ3JpZCcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICdncmlkIGdhcC00IGl0ZW
251141zLXN0cmV0Y2gnLFxuICAgICAgICAgIGNvbHVtbnMgPT09IDEgJiYgJ2dyaWQtY29scy0xJyxcbiAgICAgICAgICBjb2x1bW5zID09PSAyICYmICdncmlkLWNvbHMtMSBzbTpncmlkLWNvbHMtMicsXG4gICAgICAgICAgY29sdW1ucyA9PT0gMyAmJiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMnLCAvLyAzIEthY2hlbG4gYXVmIERlc2t0b3BcbiAgICAgICAgICBjb2x1bW5zID09PSA0ICYmICdncmlkLWNvbHMtMSBzbTpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtMyB4bDpncmlkLWNvbHMtNCdcbiAgICAgICAgKX0+XG4gICAgICAgICAge2NvbnRhY3RzLm1hcCgoY29udGFjdCkgPT4gKFxuICAgICAgICAgICAgPENvbnRhY3RDYXJkXG4gICAgICAgICAgICAgIGtleT17Y29udGFjdC5pZH1cbiAgICAgICAgICAgICAgY29udGFjdD17Y29udGFjdH1cbiAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlQ29udGFjdENsaWNrfVxuICAgICAgICAgICAgICB2YXJpYW50PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgIHNob3dMb2NhdGlvbj17IWxvY2F0aW9uSWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIHsvKiBSZXN1bHRzIGNvdW50ICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LXRleHQtbXV0ZWRcIj5cbiAgICAgICAgICB7Y29udGFjdHMubGVuZ3RofSBBbnNwcmVjaHBhcnRuZXJ7Y29udGFjdHMubGVuZ3RoICE9PSAxID8gJycgOiAnJ31cbiAgICAgICAgICB7bG9jYXRpb25JZCAmJiAnIGFuIGRpZXNlbSBTdGFuZG9ydCd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgLy8gTGlzdCBsYXlvdXRcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0zXCI+XG4gICAgICAgIHtjb250YWN0cy5tYXAoKGNvbnRhY3QpID0+IChcbiAgICAgICAgICA8Q29udGFjdENhcmRcbiAgICAgICAgICAgIGtleT17Y29udGFjdC5pZH1cbiAgICAgICAgICAgIGNvbnRhY3Q9e2NvbnRhY3R9XG4gICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDb250YWN0Q2xpY2t9XG4gICAgICAgICAgICB2Y
25114XJpYW50PVwiY29tcGFjdFwiXG4gICAgICAgICAgICBzaG93TG9jYXRpb249eyFsb2NhdGlvbklkfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIHsvKiBSZXN1bHRzIGNvdW50ICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC00IHRleHQtY2VudGVyIHRleHQtc20gdGV4dC10ZXh0LW11dGVkXCI+XG4gICAgICAgIHtjb250YWN0cy5sZW5ndGh9IEFuc3ByZWNocGFydG5lcntjb250YWN0cy5sZW5ndGggIT09IDEgPyAnJyA6ICcnfVxuICAgICAgICB7bG9jYXRpb25JZCAmJiAnIGFuIGRpZXNlbSBTdGFuZG9ydCd9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4vLyBTcGVjaWFsaXplZCBjb21wb25lbnRzXG5leHBvcnQgY29uc3QgTG9jYXRpb25Db250YWN0R3JpZDogUmVhY3QuRkM8e1xuICBsb2NhdGlvbklkOiBzdHJpbmdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIG1heEl0ZW1zPzogbnVtYmVyXG59PiA9ICh7IGxvY2F0aW9uSWQsIGNsYXNzTmFtZSwgbWF4SXRlbXMgfSkgPT4ge1xuICBjb25zdCB7IGNvbnRhY3RzLCBpc0xvYWRpbmcsIGVycm9yIH0gPSB1c2VGaWx0ZXJlZENvbnRhY3RzKGxvY2F0aW9uSWQpXG4gIFxuICBjb25zdCBkaXNwbGF5Q29udGFjdHMgPSBtYXhJdGVtcyA/IGNvbnRhY3RzLnNsaWNlKDAsIG1heEl0ZW1zKSA6IGNvbnRhY3RzXG4gIGNvbnN0IGhhc01vcmUgPSBtYXhJdGVtcyAmJiBjb250YWN0cy5sZW5ndGggPiBtYXhJdGVtc1xuXG4gIGlmIChpc0xvYWRpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICAgIDxMb2FkaW5nTGlzdCBpdGVtcz17M30gLz5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIGlmIChlcnJvciB8fCAhY29udGFjdHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KCd0ZXh0LWNlbnRlciBweS00JywgY2xhc3NOYW1lKX0+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC10ZXh0LW11dGVkXCI+XG4gICAgICAgICAgS2VpbmUgQW5zcHJlY2hwYXJ0bmVyIHZlcmbDvGdiYXJcbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMSBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtMyBnYXAtNiBpdGVtcy1zdHJldGNoXCI+XG4gICAgICAgIHtkaXNwbGF5Q29udGFjdHMubWFwKChjb250YWN0KSA9PiAoXG4gICAgICAgICAgPENvbnRhY3RDYXJkXG4gICAgICAgICAgICBrZXk9e2NvbnRhY3QuaWR9XG4gICAgICAgICAgICBjb250YWN0PXtjb250YWN0fVxuICAgICAgICAgICAgdmFyaWFudD1cImRlZmF1bHRcIlxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtoYXNNb3JlICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC02IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtbWVjLXByaW1hcnkgaG92ZXI6dW5kZXJsaW5lXCI+XG4gICAgICAgICAgICB7Y29udGFjdHMubGVuZ3RoIC0gbWF4SXRlbXMhfSB3ZWl0ZXJlIGFuemVpZ2VuXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5leHBvcnQgY29uc3QgRmVhdHVyZWRDb250YWN0R3JpZDogUmVhY3QuRkM8e1xuICBjb250YWN0czogYW55W11cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59PiA9ICh7IGNvbnRhY3RzLCBjbGFzc05hbWUgfSkgPT4ge1xuICBjb25zdCB7IG9wZW46IG9wZW5Db250YWN0TW9kYWwgfSA9IHVzZUNvbnRhY3RNb2RhbCgpXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMSBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtMyBnYXAtNiBpdGVtcy1zdHJldGNoXCI+XG4gICAgICAgIHtjb250YWN0cy5tYXAoKGNvbnRhY3QpID0+IChcbiAgICAgICAgICA8Q29udGFjdENhcmRcbiAgICAgICAgICAgIGtleT17Y29udGFjdC5pZH1cbiAgICAgICAgICAgIGNvbnRhY3Q9e2NvbnRhY3R9XG4gICAgICAgICAgICBvbkNsaWNrPXtvcGVuQ29udGFjdE1vZGFsfVxuICAgICAgICAgICAgdmFyaWFudD1cImRldGFpbGVkXCJcbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBNYXBQaW4sIEJ1aWxkaW5nMiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5pbXBvcnQgeyBjbHN4IH0gZnJvbSAnY2xzeCdcblxuaW50ZXJmYWNlIExvY2F0aW9uTWluaUdyaWRDYXJkUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb25cbiAgb25DbGljaz86IChsb2NhdGlvbklkOiBzdHJpbmcpID0+IHZvaWRcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBMb2NhdGlvbk1pbmlHcmlkQ2FyZDogUmVhY3QuRkM8TG9jYXRpb25NaW5pR3JpZENhcmRQcm9wcz4gPSAoe1xuICBsb2NhdGlvbixcbiAgb25DbGljayxcbiAgY2xhc3NOYW1lXG59KSA9PiB7XG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gKCkgPT4ge1xuICAgIG9uQ2xpY2s/Lihsb2NhdGlvbi5pZClcbiAgfVxuXG4gIGNvbnN0IGdldEltYWdlVXJsID0gKCkgPT4ge1xuICAgIHJldHVybiBsb2NhdGlvbi5pbWFnZSB8fCBsb2NhdGlvbi5sb2dvIHx8ICcvYXNzZXRzL3BsYWNlaG9sZG
25114VyLWxvY2F0aW9uLmpwZydcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XG4gICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICdiZy13aGl0ZSByb3VuZGVkLWxnIG92ZXJmbG93LWhpZGRlbiBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICdob3ZlcjpzaGFkb3ctbWQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgJ2JvcmRlciBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeSBob3Zlcjpib3JkZXItbWVjLXByaW1hcnkvMzAnLFxuICAgICAgICAnaC1mdWxsIGZsZXggZmxleC1jb2wgdG91Y2gtdGFyZ2V0LWxnJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgID5cbiAgICAgIHsvKiBJbWFnZSAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgdy1mdWxsIGgtMzIgZmxleC1zaHJpbmstMCBiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeVwiPlxuICAgICAgICA8aW1nXG4gICAgICAgICAgc3JjPXtnZXRJbWFnZVVybCgpfVxuICAgICAgICAgIGFsdD17bG9jYXRpb24ubmFtZX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAvPlxuICAgICAgICBcbiAgICAgICAgey8qIExvZ28gT3ZlcmxheSAtIEltcHJvdmVkIFNpemUgYW5kIFZpc2liaWxpdHkgKi99XG4gICAgICAgIHtsb2NhdGlvbi5sb2dvICYmIChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0zIHJpZ2h0LTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2h
25114pdGUvOTUgYmFja2Ryb3AtYmx1ci1zbSByb3VuZGVkLWxnIHAtMiBzaGFkb3ctc20gYm9yZGVyIGJvcmRlci13aGl0ZS8yMFwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgc3JjPXtsb2NhdGlvbi5sb2dvfVxuICAgICAgICAgICAgICAgIGFsdD17YCR7bG9jYXRpb24ubmFtZX0gTG9nb2B9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04IHctYXV0byBvYmplY3QtY29udGFpbiBtYXgtdy1bNjBweF1cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIENvbnRlbnQgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtMyBmbGV4LTEgZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICB7LyogTmFtZSAqL31cbiAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0xIGxpbmUtY2xhbXAtMVwiPlxuICAgICAgICAgIHtsb2NhdGlvbi5uYW1lfVxuICAgICAgICA8L2gzPlxuXG4gICAgICAgIHsvKiBDaXR5IHdpdGggUG9zdGFsIENvZGUgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC14cyB0ZXh0LXRleHQtc2Vjb25kYXJ5IG1iLTJcIj5cbiAgICAgICAgICA8TWFwUGluIGNsYXNzTmFtZT1cInctMyBoLTMgbXItMSBmbGV4LXNocmluay0wXCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0cnVuY2F0ZVwiPlxuICAgICAgICAgICAge2xvY2F0aW9uLnBvc3RhbENvZGUgJiYgYCR7bG9jYXRpb24ucG9zdGFsQ29kZX0gYH17bG9jYXRpb24uY2l0eX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBBZGRyZXNzICovfVxuICAgICAgICB7bG9jYXRpb24uYWRkcmVzcyAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IHRleHQteHMgdGV4dC10ZXh0LW11dGVkIG10LWF1dG9cIj5cbiAgICAgICAgICAgIDxCdWlsZGluZzIgY2xhc3NOYW1lPVwidy0zIGgtMyBtci0xIGZsZXgtc2hyaW5rLTAgbXQtMC41XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImxpbmUtY2xhbXAtMiBsZWFkaW5nLXRpZ2h0XCI+e2xvY2F0aW9uLmFkZHJlc3N9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY2xzeCB9IGZyb20gJ2Nsc3gnXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIFRBQlMgLSBTaW5nbGUgU291cmNlIG9mI
25114FRydXRoXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5pbnRlcmZhY2UgVGFiIHtcbiAgaWQ6IHN0cmluZ1xuICBsYWJlbDogc3RyaW5nXG4gIGNvdW50PzogbnVtYmVyXG4gIGRpc2FibGVkPzogYm9vbGVhblxuICBpY29uPzogUmVhY3QuUmVhY3ROb2RlXG59XG5cbmludGVyZmFjZSBVbmlmaWVkVGFic1Byb3BzIHtcbiAgdGFiczogVGFiW11cbiAgYWN0aXZlVGFiOiBzdHJpbmdcbiAgb25UYWJDaGFuZ2U6ICh0YWJJZDogc3RyaW5nKSA9PiB2b2lkXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAncGlsbHMnIHwgJ3VuZGVybGluZSdcbiAgc2l6ZT86ICdzbScgfCAnbWQnIHwgJ2xnJ1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgZnVsbFdpZHRoPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgVW5pZmllZFRhYnM6IFJlYWN0LkZDPFVuaWZpZWRUYWJzUHJvcHM+ID0gKHtcbiAgdGFicyxcbiAgYWN0aXZlVGFiLFxuICBvblRhYkNoYW5nZSxcbiAgdmFyaWFudCA9ICdkZWZhdWx0JyxcbiAgc2l6ZSA9ICdtZCcsXG4gIGNsYXNzTmFtZSxcbiAgZnVsbFdpZHRoID0gZmFsc2Vcbn0pID0+IHtcbiAgY29uc3QgaGFuZGxlVGFiQ2xpY2sgPSAodGFiSWQ6IHN0cmluZywgZGlzYWJsZWQ/OiBib29sZWFuKSA9PiB7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgb25UYWJDaGFuZ2UodGFiSWQpXG4gICAgfVxuICB9XG5cbiAgLy8gQmFzZSBzdHlsZXMgZm9yIGRpZmZlcmVudCB2YXJpYW50c1xuICBjb25zdCBnZXRWYXJpYW50U3R5bGVzID0gKCkgPT4ge1xuICAgIHN3aXRjaCAodmFyaWFudCkge1xuICAgICAgY2FzZSAncGlsbHMnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRhaW5lcjogJ2JnLWJhY2tncm91bmQtc2Vjb25kYXJ5IHJvdW5kZWQtbWVjIHAtMScsXG4gICAgICAgICAgdGFiOiAncm91bmRlZC1tZWMtc20gdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgICBhY3RpdmU6ICdiZy13aGl0ZSBzaGFkb3ctc20gdGV4dC10ZXh0LXByaW1hcnknLFxuICAgICAgICAgIGluYWN0aXZlOiAndGV4dC10ZXh0LXNlY29uZGFyeSBob3Zlcjp0ZXh0LXRleHQtcHJpbWFyeSBob3ZlcjpiZy13aGl0ZS81MCdcbiAgICAgICAgfVxuICAgICAgY2FzZSAndW5kZXJsaW5lJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250YWluZXI6ICdib3JkZXItYiBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeScsXG4gICAgICAgICAgdGFiOiAnYm9yZGVyLWItMiBib3JkZXItdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIC1tYi1weCcsXG4gICAgICAgICAgYWN0aXZlOiAnYm9yZGVyLW1lYy1wcmltYXJ5IHRleHQtbWVjLXByaW1hcnknLFxuICAgICAgICAgIGluYWN0aXZlOiAndGV4dC10ZXh0LXNlY29uZGFyeSBob3Zlcjp0ZXh0LXRleHQtcHJpbWFyeSBob3Zlcjpib3JkZXItdGV4dC1tdXRlZCdcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250YWluZXI6ICdiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSByb3VuZGVkLW1lYy1sZyBwLTEnLFxuICAgICAgICAgIHRhYjogJ3JvdW5kZWQtbWVjIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgICAgYWN0aXZlOiAnYmctd2hpdGUgc2hhZG93LWNhcmQgdGV4dC10ZXh0LXByaW1hcnknLFxuICAgICAgICAgIGluYWN0aXZlOiAndGV4dC10ZXh0LXNlY29uZGFyeSBob3Zlcjp0ZXh0LXRleHQtcHJpbWFyeSBob3ZlcjpiZy13aGl0ZS81MCdcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNpemUgc3R5bGVzXG4gIGNvbnN0IGdldFNpemVTdHlsZXMgPSAoKSA9PiB7XG4gICAgc3dpdGNoIChzaXplKSB7XG4gICAgICBjYXNlICdzbSc6XG4gICAgICAgIHJldHVybiAncHgtMyBweS0xLjUgdGV4dC1zbSdcbiAgICAgIGNhc2UgJ2xnJzpcbiAgICAgICAgcmV0dXJuICdweC02IHB5LTMgdGV4dC1sZydcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAncHgtNCBweS0yIHRleHQtYmFzZSdcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdHlsZXMgPSBnZXRWYXJpYW50U3R5bGVzKClcbiAgY29uc3Qgc2l6ZVN0eWxlcyA9IGdldFNpemVTdHlsZXMoKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goc3R5bGVzLmNvbnRhaW5lciwgY2xhc3NOYW1lKX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgLy8gTW9iaWxlOiBTdGFjayB2ZXJ0aWNhbGx5IGlmIHRhYnMgZG9uJ3QgZml0LCBEZXNrdG9wOiBIb3Jpem9udGFsXG4gICAgICAgICdmbGV4IGZsZXgtd3JhcCBzbTpmbGV4LW5vd3JhcCcsXG4gICAgICAgIGZ1bGxXaWR0aCA/ICd3LWZ1bGwnIDogJ2lubGluZS1mbGV4JyxcbiAgICAgICAgdmFyaWFudCA9PT0gJ3VuZGVybGluZScgPyAnZ2FwLTIgc206Z2FwLTgnIDogJ2dhcC0xJ1xuICAgICAgKX0+XG4gICAgICAgIHt0YWJzLm1hcCgodGFiKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVUYWIgPT09IHRhYi5pZFxuICAgICAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0YWIuZGlzYWJsZWRcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGtleT17dGFiLmlkfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVUYWJDbGljayh0YWIuaWQsIGlzRGlzYWJsZWQpfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgICAgICdmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgc206Z2FwLTInLFxuICAgICAgICAgICAgICAgIHN0eWxlcy50YWIsXG4gICAgICAgICAgICAgICAgc2l6ZVN0eWxlcyxcbiAgICAgICAgICAgICAgICAvLyBNb2JpbGU6IEZ1bGwgd2lkdGggb24gc21hbGwgc2NyZWVucywgRGVza3RvcDogRmxleC0xIGlmIGZ1bGxXaWR0aFxuICAgICAgICAgICAgICAgIGZ1bGxXaWR0aCAmJiAndy1mdWxsIHNtOmZsZXgtMSBqdXN0aWZ5LWNlbnRlcicsXG4gICAgICAgICAgICAgICAgLy8gTW9iaWxlOiBFbmhhbmNlZCB0b3VjaCB0YXJnZXRcbiAgICAgICAgICAgICAgICAndG91Y2gtdGFyZ2V0LWxnIG1pbi13LTAnLFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlID8gc3R5bGVzLmFjdGl2ZSA6IHN0eWxlcy5pbmFjdGl2ZSxcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkICYmICdvcGFjaXR5LTUwIGN1cnNvci1ub3QtYWxsb3dlZCdcbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgey8qIEljb24gKi99XG4gICAgICAgICAgICAgI
25114Ht0YWIuaWNvbiAmJiAoXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAgICAgICAge3RhYi5pY29ufVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICB7LyogTGFiZWwgKi99XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAgICAgICAndHJ1bmNhdGUgdGV4dC14cyBzbTp0ZXh0LXNtJyxcbiAgICAgICAgICAgICAgICBmdWxsV2lkdGggPyAndGV4dC1jZW50ZXInIDogJ3RleHQtbGVmdCdcbiAgICAgICAgICAgICAgKX0+XG4gICAgICAgICAgICAgICAge3RhYi5sYWJlbH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgIHsvKiBDb3VudCBCYWRnZSAtIEhJRERFTiAobm90IGRlbGV0ZWQsIGp1c3QgaGlkZGVuIHdpdGggQ1NTKSAqL31cbiAgICAgICAgICAgICAge3RhYi5jb3VudCAhPT0gdW5kZWZpbmVkICYmIChcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICAgICAgICAgICAnaGlkZGVuJywgLy8gSGlkZGVuIHZpYSBDU1MgLSBjYW4gYmUgcmUtZW5hYmxlZCBieSByZW1vdmluZyB0aGlzIGNsYXNzXG4gICAgICAgICAgICAgICAgICAnaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1pbi13LVsxLjI1cmVtXSBoLTUgcHgtMS41IHJvdW5kZWQtZnVsbCB0ZXh0LXhzIGZvbnQtbWVkaXVtIGZsZXgtc2hyaW5rLTAnLFxuICAgICAgICAgICAgICAgICAgaXNBY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgPyAnYmctbWVjLXByaW1hcnkgdGV4dC13aGl0ZSdcbiAgICAgICAgICAgICAgICAgICAgOiAnYmctYmFja2dyb3VuZC10ZXJ0aWFyeSB0ZXh0LXRleHQtbXV0ZWQnXG4gICAgICAgICAgICAgICAgKX0+XG4gICAgICAgICAgICAgICAgICB7dGFiLmNvdW50fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIClcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ09OVkVOSUVOQ0UgQ09NUE9ORU5UU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gUGlsbHMgdmFyaWFudFxuZXhwb3J0IGNvbnN0IFBpbGxUYWJzOiBSZWFjdC5GQzxPbWl0PFVuaWZpZWRUYWJzUHJvcHMsICd2YXJpYW50Jz4+ID0gKHByb3BzKSA9PiAoXG4gIDxVbmlmaWVkVGFicyB7Li4ucHJvcHN9IHZhcmlhbnQ9XCJwaWxsc1wiIC8+XG4pXG5cbi8vIFVuZGVybGluZSB2YXJpYW50XG5leHBvcnQgY29uc3QgVW5kZXJsaW5lVGFiczogUmVhY3QuRkM8T21pdDxVbmlmaWVkVGFic1Byb3BzLCAndmFyaWFudCc+PiA9IChwcm9wcykgPT4gKFxuICA8VW5pZmllZFRhYnMgey4uLnByb3BzfSB2YXJpYW50PVwidW5kZXJsaW5lXCIgLz5cbilcblxuLy8gRnVsbCB3aWR0aCB0YWJzXG5leHBvcnQgY29uc3QgRnVsbFdpZHRoVGFiczogUmVhY3QuRkM8T21pdDxVbmlmaWVkVGFic1Byb3BzLCAnZnVsbFdpZHRoJz4+ID0gKHByb3BzKSA9PiAoXG4gIDxVbmlmaWVkVGFicyB7Li4ucHJvcHN9IGZ1bGxXaWR0aD17dHJ1ZX0gLz5cbilcbiIsImltcG9ydCB7IHVzZVF1ZXJ5IH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5J1xuaW1wb3J0IHsgY29udGFjdHNBcGksIGxvY2F0aW9uc0FwaSB9IGZyb20gJ0BzZXJ2aWNlcy9hcGknXG5cbi8vIEhvb2sgZm9yIGRlcGFydG1lbnRzXG5leHBvcnQgY29uc3QgdXNlRGVwYXJ0bWVudHMgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IFsnZGVwYXJ0bWVudHMnXSxcbiAgICBxdWVyeUZuOiAoKSA9PiBjb250YWN0c0FwaS5nZXREZXBhcnRtZW50cygpLFxuICAgIHNlbGVjdDogKGRhdGEpID0+IGRhdGEuZGF0YSB8fCBbXSxcbiAgICBzdGFsZVRpbWU6IDUgKiA2MCAqIDEwMDAsIC8vIDUgbWludXRlc1xuICAgIGdjVGltZTogMTAgKiA2MCAqIDEwMDAsIC8vIDEwIG1pbnV0ZXMgKHJlbmFtZWQgZnJvbSBjYWNoZVRpbWUgaW4gbmV3ZXIgdmVyc2lvbnMpXG4gIH0pXG59XG5cbi8vIEhvb2sgZm9yIGxhbmd1YWdlc1xuZXhwb3J0IGNvbnN0IHVzZUxhbmd1YWdlcyA9ICgpID0+IHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogWydsYW5ndWFnZXMnXSxcbiAgICBxdWVyeUZuOiAoKSA9PiBjb250YWN0c0FwaS5nZXRMYW5ndWFnZXMoKSxcbiAgICBzZWxlY3Q6IChkYXRhKSA9PiBkYXRhLmRhdGEgfHwgW10sXG4gICAgc3RhbGVUaW1lOiA1ICogNjAgKiAxMDAwLCAvLyA1IG1pbnV0ZXNcbiAgICBnY1RpbWU6IDEwICogNjAgKiAxMDAwLCAvLyAxMCBtaW51dGVzIChyZW5hbWVkIGZyb20gY2FjaGVUaW1lIGluIG5ld2VyIHZlcnNpb25zKVxuICB9KVxufVxuXG4vLyBBZGRpdGlvbmFsIGZpbHRlciBob29rcyBmb3IgY29udGFjdHNcbmV4cG9ydCBjb25zdCB1c2VQb3NpdGlvbnMgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IFsncG9zaXRpb25zJ10sXG4gICAgcXVlcnlGbjogKCkgPT4gY29udGFjdHNBcGkuZ2V0UG9zaXRpb25zKCksXG4gICAgc2VsZWN0OiAoZGF0YSkgPT4gZGF0YS5kYXRhIHx8IFtdLFxuICAgIHN0YWxlVGltZTogNSAqIDYwICogMTAwMCxcbiAgICBnY1RpbWU6IDEwICogNjAgKiAxMDAwLFxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgdXNlQXZhaWxhYmlsaXR5VHlwZXMgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IFsnYXZhaWxhYmlsaXR5LXR5cGVzJ10sXG4gICAgcXVlcnlGbjogKCkgPT4gY29udGFjdHNBcGkuZ2V0QXZhaWxhYmlsaXR5VHlwZXMoKSxcbiAgICBzZWxlY3Q6IChkYXRhKSA9PiBkYXRhLmRhdGEgfHwgW10sXG4gICAgc3RhbGVUaW
251141lOiA1ICogNjAgKiAxMDAwLFxuICAgIGdjVGltZTogMTAgKiA2MCAqIDEwMDAsXG4gIH0pXG59XG5cbi8vIExvY2F0aW9uIGZpbHRlciBob29rc1xuZXhwb3J0IGNvbnN0IHVzZVNlcnZpY2VzID0gKCkgPT4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBbJ3NlcnZpY2VzJ10sXG4gICAgcXVlcnlGbjogKCkgPT4gbG9jYXRpb25zQXBpLmdldFNlcnZpY2VzKCksXG4gICAgc2VsZWN0OiAoZGF0YSkgPT4gZGF0YS5kYXRhIHx8IFtdLFxuICAgIHN0YWxlVGltZTogNSAqIDYwICogMTAwMCxcbiAgICBnY1RpbWU6IDEwICogNjAgKiAxMDAwLFxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgdXNlU3RhdGVzID0gKCkgPT4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBbJ3N0YXRlcyddLFxuICAgIHF1ZXJ5Rm46ICgpID0+IGxvY2F0aW9uc0FwaS5nZXRTdGF0ZXMoKSxcbiAgICBzZWxlY3Q6IChkYXRhKSA9PiBkYXRhLmRhdGEgfHwgW10sXG4gICAgc3RhbGVUaW1lOiA1ICogNjAgKiAxMDAwLFxuICAgIGdjVGltZTogMTAgKiA2MCAqIDEwMDAsXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCB1c2VPcGVuaW5nWWVhcnMgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IFsnb3BlbmluZy15ZWFycyddLFxuICAgIHF1ZXJ5Rm46ICgpID0+IGxvY2F0aW9uc0FwaS5nZXRPcGVuaW5nWWVhcnMoKSxcbiAgICBzZWxlY3Q6IChkYXRhKSA9PiBkYXRhLmRhdGEgfHwgeyB5ZWFyczogW10sIGRlY2FkZXM6IFtdIH0sXG4gICAgc3RhbGVUaW1lOiA1ICogNjAgKiAxMDAwLFxuICAgIGdjVGltZTogMTAgKiA2MCAqIDEwMDAsXG4gIH0pXG59XG5cbi8vIENvbWJpbmVkIGhvb2sgZm9yIGFsbCBmaWx0ZXIgZGF0YVxuZXhwb3J0IGNvbnN0IHVzZUZpbHRlckRhdGEgPSAoKSA9PiB7XG4gIGNvbnN0IGRlcGFydG1lbnRzID0gdXNlRGVwYXJ0bWVudHMoKVxuICBjb25zdCBsYW5ndWFnZXMgPSB1c2VMYW5ndWFnZXMoKVxuXG4gIHJldHVybiB7XG4gICAgZGVwYXJ0bWVudHM6IHtcbiAgICAgIGRhdGE6IGRlcGFydG1lbnRzLmRhdGEsXG4gICAgICBpc0xvYWRpbmc6IGRlcGFydG1lbnRzLmlzTG9hZGluZyxcbiAgICAgIGVycm9yOiBkZXBhcnRtZW50cy5lcnJvcixcbiAgICB9LFxuICAgIGxhbmd1YWdlczoge1xuICAgICAgZGF0YTogbGFuZ3VhZ2VzLmRhdGEsXG4gICAgICBpc0xvYWRpbmc6IGxhbmd1YWdlcy5pc0xvYWRpbmcsXG4gICAgICBlcnJvcjogbGFuZ3VhZ2VzLmVycm9yLFxuICAgIH0sXG4gICAgaXNMb2FkaW5nOiBkZXBhcnRtZW50cy5pc0xvYWRpbmcgfHwgbGFuZ3VhZ2VzLmlzTG9hZGluZyxcbiAgICBlcnJvcjogZGVwYXJ0bWVudHMuZXJyb3IgfHwgbGFuZ3VhZ2VzLmVycm9yLFxuICB9XG59XG5cbi8vIEV4dGVuZGVkIGhvb2sgZm9yIGxvY2F0aW9uLXNwZWNpZmljIGZpbHRlcnNcbmV4cG9ydCBjb25zdCB1c2VMb2NhdGlvbkZpbHRlckRhdGEgPSAoKSA9PiB7XG4gIGNvbnN0IHNlcnZpY2VzID0gdXNlU2VydmljZXMoKVxuICBjb25zdCBzdGF0ZXMgPSB1c2VTdGF0ZXMoKVxuICBjb25zdCBvcGVuaW5nWWVhcnMgPSB1c2VPcGVuaW5nWWVhcnMoKVxuXG4gIHJldHVybiB7XG4gICAgc2VydmljZXM6IHtcbiAgICAgIGRhdGE6IHNlcnZpY2VzLmRhdGEsXG4gICAgICBpc0xvYWRpbmc6IHNlcnZpY2VzLmlzTG9hZGluZyxcbiAgICAgIGVycm9yOiBzZXJ2aWNlcy5lcnJvcixcbiAgICB9LFxuICAgIHN0YXRlczoge1xuICAgICAgZGF0YTogc3RhdGVzLmRhdGEsXG4gICAgICBpc0xvYWRpbmc6IHN0YXRlcy5pc0xvYWRpbmcsXG4gICAgICBlcnJvcjogc3RhdGVzLmVycm9yLFxuICAgIH0sXG4gICAgb3BlbmluZ1llYXJzOiB7XG4gICAgICBkYXRhOiBvcGVuaW5nWWVhcnMuZGF0YSxcbiAgICAgIGlzTG9hZGluZzogb3BlbmluZ1llYXJzLmlzTG9hZGluZyxcbiAgICAgIGVycm9yOiBvcGVuaW5nWWVhcnMuZXJyb3IsXG4gICAgfSxcbiAgICBpc0xvYWRpbmc6IHNlcnZpY2VzLmlzTG9hZGluZyB8fCBzdGF0ZXMuaXNMb2FkaW5nIHx8IG9wZW5pbmdZZWFycy5pc0xvYWRpbmcsXG4gICAgZXJyb3I6IHNlcnZpY2VzLmVycm9yIHx8IHN0YXRlcy5lcnJvciB8fCBvcGVuaW5nWWVhcnMuZXJyb3IsXG4gIH1cbn1cblxuLy8gRXh0ZW5kZWQgaG9vayBmb3IgY29udGFjdC1zcGVjaWZpYyBmaWx0ZXJzXG5leHBvcnQgY29uc3QgdXNlQ29udGFjdEZpbHRlckRhdGEgPSAoKSA9PiB7XG4gIGNvbnN0IGRlcGFydG1lbnRzID0gdXNlRGVwYXJ0bWVudHMoKVxuICBjb25zdCBsYW5ndWFnZXMgPSB1c2VMYW5ndWFnZXMoKVxuICBjb25zdCBwb3NpdGlvbnMgPSB1c2VQb3NpdGlvbnMoKVxuICBjb25zdCBhdmFpbGFiaWxpdHlUeXBlcyA9IHVzZUF2YWlsYWJpbGl0eVR5cGVzKClcblxuICByZXR1cm4ge1xuICAgIGRlcGFydG1lbnRzOiB7XG4gICAgICBkYXRhOiBkZXBhcnRtZW50cy5kYXRhLFxuICAgICAgaXNMb2FkaW5nOiBkZXBhcnRtZW50cy5pc0xvYWRpbmcsXG4gICAgICBlcnJvcjogZGVwYXJ0bWVudHMuZXJyb3IsXG4gICAgfSxcbiAgICBsYW5ndWFnZXM6IHtcbiAgICAgIGRhdGE6IGxhbmd1YWdlcy5kYXRhLFxuICAgICAgaXNMb2FkaW5nOiBsYW5ndWFnZXMuaXNMb2FkaW5nLFxuICAgICAgZXJyb3I6IGxhbmd1YWdlcy5lcnJvcixcbiAgICB9LFxuICAgIHBvc2l0aW9uczoge1xuICAgICAgZGF0YTogcG9zaXRpb25zLmRhdGEsXG4gICAgICBpc0xvYWRpbmc6IHBvc2l0aW9ucy5pc0xvYWRpbmcsXG4gICAgICBlcnJvcjogcG9zaXRpb25zLmVycm9yLFxuICAgIH0sXG4gICAgYXZhaWxhYmlsaXR5VHlwZXM6IHtcbiAgICAgIGRhdGE6IGF2YWlsYWJpbGl0eVR5cGVzLmRhdGEsXG4gICAgICBpc0xvYWRpbmc6IGF2YWlsYWJpbGl0eVR5cGVzLmlzTG9hZGluZyxcbiAgICAgIGVycm9yOiBhdmFpbGFiaWxpdHlUeXBlcy5lcnJvcixcbiAgICB9LFxuICAgIGlzTG9hZGluZzogZGVwYXJ0bWVudHMuaXNMb2FkaW5nIHx8IGxhbmd1YWdlcy5pc0xvYWRpbmcgfHwgcG9zaXRpb25zLmlzTG9hZGluZyB8fCBhdmFpbGFiaWxpdHlUeXBlcy5pc0xvYWRpbmcsXG4gICAgZXJyb3I6IGRlcGFydG1lbnRzLmVycm9yIHx8IGxhbmd1YWdlcy5lcnJvciB8fCBwb3NpdGlvbnMuZXJyb3IgfHwgYXZhaWxhYmlsaXR5VHlwZXMuZXJyb3IsXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7
25114IE1hcCwgTGlzdCwgR3JpZDNYMyB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IHVzZVZpZXdQcmVmZXJlbmNlcyB9IGZyb20gJ0BzdG9yZXMvdXNlQXBwU3RvcmUnXG5pbXBvcnQgeyBjbHN4IH0gZnJvbSAnY2xzeCdcblxuaW50ZXJmYWNlIFZpZXdUb2dnbGVQcm9wcyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBzaXplPzogJ3NtJyB8ICdtZCcgfCAnbGcnXG59XG5cbmV4cG9ydCBjb25zdCBWaWV3VG9nZ2xlOiBSZWFjdC5GQzxWaWV3VG9nZ2xlUHJvcHM+ID0gKHtcbiAgY2xhc3NOYW1lLFxuICBzaXplID0gJ21kJ1xufSkgPT4ge1xuICBjb25zdCB7IG1hcFZpZXcsIGNvbnRhY3RMYXlvdXQsIHNldE1hcFZpZXcsIHNldENvbnRhY3RMYXlvdXQgfSA9IHVzZVZpZXdQcmVmZXJlbmNlcygpXG5cbiAgY29uc3Qgc2l6ZUNsYXNzZXMgPSB7XG4gICAgc206ICd0ZXh0LXhzIHB4LTIgcHktMScsXG4gICAgbWQ6ICd0ZXh0LXNtIHB4LTMgcHktMicsXG4gICAgbGc6ICd0ZXh0LWJhc2UgcHgtNCBweS0zJ1xuICB9XG5cbiAgY29uc3QgaWNvblNpemVzID0ge1xuICAgIHNtOiAndy0zIGgtMycsXG4gICAgbWQ6ICd3LTQgaC00JyxcbiAgICBsZzogJ3ctNSBoLTUnXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KCdmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTInLCBjbGFzc05hbWUpfT5cbiAgICAgIHsvKiBNYXAgVmlldyBUb2dnbGUgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1tZWMgcC0xXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRNYXBWaWV3KCdpbnRlcmFjdGl2ZScpfVxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAgICdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIHJvdW5kZWQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgICAgIHNpemVDbGFzc2VzW3NpemVdLFxuICAgICAgICAgICAgbWFwVmlldyA9PT0gJ2ludGVyYWN0aXZlJ1xuICAgICAgICAgICAgICA/ICdiZy13aGl0ZSB0ZXh0LW1lYy1wcmltYXJ5IHNoYWRvdy1zbSdcbiAgICAgICAgICAgICAgOiAndGV4dC10ZXh0LXNlY29uZGFyeSBob3Zlcjp0ZXh0LXRleHQtcHJpbWFyeSBob3ZlcjpiZy13aGl0ZS81MCdcbiAgICAgICAgICApfVxuICAgICAgICAgIHRpdGxlPVwiSW50ZXJha3RpdmUgS2FydGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPE1hcCBjbGFzc05hbWU9e2ljb25TaXplc1tzaXplXX0gLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gc206aW5saW5lXCI+S2FydGU8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRNYXBWaWV3KCdsaXN0Jyl9XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgJ2lubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgcm91bmRlZCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAnLFxuICAgICAgICAgICAgc2l6ZUNsYXNzZXNbc2l6ZV0sXG4gICAgICAgICAgICBtYXBWaWV3ID09PSAnbGlzdCdcbiAgICAgICAgICAgICAgPyAnYmctd2hpdGUgdGV4dC1tZWMtcHJpbWFyeSBzaGFkb3ctc20nXG4gICAgICAgICAgICAgIDogJ3RleHQtdGV4dC1zZWNvbmRhcnkgaG92ZXI6dGV4dC10ZXh0LXByaW1hcnkgaG92ZXI6Ymctd2hpdGUvNTAnXG4gICAgICAgICAgKX1cbiAgICAgICAgICB0aXRsZT1cIkxpc3RlbmFuc2ljaHRcIlxuICAgICAgICA+XG4gICAgICAgICAgPExpc3QgY2xhc3NOYW1lPXtpY29uU2l6ZXNbc2l6ZV19IC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIHNtOmlubGluZVwiPkxpc3RlPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogQ29udGFjdCBMYXlvdXQgVG9nZ2xlIC0gQWx3YXlzIHZpc2libGUsIGJ1dCBvbmx5IGZ1bmN0aW9uYWwgaW4gbGlzdCB2aWV3ICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LXB4IGgtNiBiZy1iYWNrZ3JvdW5kLXRlcnRpYXJ5XCIgLz5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGJnLWJhY2tncm91bmQtc2Vjb25kYXJ5IHJvdW5kZWQtbWVjIHAtMVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Q29udGFjdExheW91dCgnZ3JpZCcpfVxuICAgICAgICAgIGRpc2FibGVkPXttYXBWaWV3ICE9PSAnbGlzdCd9XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgJ2lubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgcm91bmRlZCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAnLFxuICAgICAgICAgICAgc2l6ZUNsYXNzZXNbc2l6ZV0sXG4gICAgICAgICAgICBtYXBWaWV3ICE9PSAnbGlzdCdcbiAgICAgICAgICAgICAgPyAndGV4dC10ZXh0LW11dGVkIGN1cnNvci1ub3QtYWxsb3dlZCBvcGFjaXR5LTUwJ1xuICAgICAgICAgICAgICA6IGNvbnRhY3RMYXlvdXQgPT09ICdncmlkJ1xuICAgICAgICAgICAgICAgID8gJ2JnLXdoaXRlIHRleHQtbWVjLXByaW1hcnkgc2hhZG93LXNtJ1xuICAgICAgICAgICAgICAgIDogJ3RleHQtdGV4dC1zZWNvbmRhcnkgaG92ZXI6dGV4dC10ZXh0LXByaW1hcnkgaG92ZXI6Ymctd2hpdGUvNTAnXG4gICAgICAgICAgKX1cbiAgICAgICAgICB0aXRsZT17bWFwVmlldyAhPT0gJ2xpc3QnID8gJ051ciBpbiBMaXN0ZW5hbnNpY2h0IHZlcmbDvGdiYXInIDogJ1Jhc3Rlci1MYXlvdXQnfVxuICAgICAgICA+XG4gICAgICAgICAgPEdyaWQzWDMgY2xhc3NOYW1lPXtpY29uU2l6ZXNbc2l6ZV19IC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmlubGluZVwiPlJhc3Rlcjwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldENvbnRhY3RMYXlvdXQoJ2xpc3QnKX1cbiAgICAgICAgICBkaXNhYmxlZD17bWFwVmlldyAhPT0gJ2xpc3QnfVxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAgICdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIHJvdW5kZWQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgICAgI
25114HNpemVDbGFzc2VzW3NpemVdLFxuICAgICAgICAgICAgbWFwVmlldyAhPT0gJ2xpc3QnXG4gICAgICAgICAgICAgID8gJ3RleHQtdGV4dC1tdXRlZCBjdXJzb3Itbm90LWFsbG93ZWQgb3BhY2l0eS01MCdcbiAgICAgICAgICAgICAgOiBjb250YWN0TGF5b3V0ID09PSAnbGlzdCdcbiAgICAgICAgICAgICAgICA/ICdiZy13aGl0ZSB0ZXh0LW1lYy1wcmltYXJ5IHNoYWRvdy1zbSdcbiAgICAgICAgICAgICAgICA6ICd0ZXh0LXRleHQtc2Vjb25kYXJ5IGhvdmVyOnRleHQtdGV4dC1wcmltYXJ5IGhvdmVyOmJnLXdoaXRlLzUwJ1xuICAgICAgICAgICl9XG4gICAgICAgICAgdGl0bGU9e21hcFZpZXcgIT09ICdsaXN0JyA/ICdOdXIgaW4gTGlzdGVuYW5zaWNodCB2ZXJmw7xnYmFyJyA6ICdMaXN0ZW4tTGF5b3V0J31cbiAgICAgICAgPlxuICAgICAgICAgIDxMaXN0IGNsYXNzTmFtZT17aWNvblNpemVzW3NpemVdfSAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBtZDppbmxpbmVcIj5MaXN0ZTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4vLyBDb21wYWN0IHZlcnNpb24gZm9yIG1vYmlsZVxuZXhwb3J0IGNvbnN0IENvbXBhY3RWaWV3VG9nZ2xlOiBSZWFjdC5GQzx7IGNsYXNzTmFtZT86IHN0cmluZyB9PiA9ICh7IGNsYXNzTmFtZSB9KSA9PiB7XG4gIGNvbnN0IHsgbWFwVmlldywgc2V0TWFwVmlldyB9ID0gdXNlVmlld1ByZWZlcmVuY2VzKClcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KCdmbGV4JywgY2xhc3NOYW1lKX0+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldE1hcFZpZXcobWFwVmlldyA9PT0gJ2ludGVyYWN0aXZlJyA/ICdsaXN0JyA6ICdpbnRlcmFjdGl2ZScpfVxuICAgICAgICBjbGFzc05hbWU9XCJidG4tc2Vjb25kYXJ5IGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTJcIlxuICAgICAgPlxuICAgICAgICB7bWFwVmlldyA9PT0gJ2ludGVyYWN0aXZlJyA/IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPExpc3QgY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5adXIgTGlzdGU8L3NwYW4+XG4gICAgICAgICAgPC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIDxNYXAgY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5adXIgS2FydGU8L3NwYW4+XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQ2hldnJvbkRvd24sIFgsIE1hcFBpbiwgU2VhcmNoIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgdXNlRmlsdGVycywgdXNlVmlld1ByZWZlcmVuY2VzIH0gZnJvbSAnQHN0b3Jlcy91c2VBcHBTdG9yZSdcbmltcG9ydCB7IHVzZUZpbHRlckRhdGEsIHVzZUxvY2F0aW9uRmlsdGVyRGF0YSB9IGZyb20gJ0Bob29rcy91c2VGaWx0ZXJEYXRhJ1xuaW1wb3J0IHsgVmlld1RvZ2dsZSB9IGZyb20gJy4vVmlld1RvZ2dsZSdcbmltcG9ydCB7IGNsc3ggfSBmcm9tICdjbHN4J1xuXG5pbnRlcmZhY2UgRmlsdGVyQmFyUHJvcHMge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgc2VhcmNoUXVlcnk6IHN0cmluZ1xuICBvblNlYXJjaENoYW5nZTogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWRcbn1cblxuaW50ZXJmYWNlIERyb3Bkb3duUHJvcHMge1xuICBsYWJlbDogc3RyaW5nXG4gIGljb246IFJlYWN0LlJlYWN0Tm9kZVxuICBvcHRpb25zOiBzdHJpbmdbXVxuICBzZWxlY3RlZFZhbHVlczogc3RyaW5nW11cbiAgb25TZWxlY3Rpb25DaGFuZ2U6ICh2YWx1ZXM6IHN0cmluZ1tdKSA9PiB2b2lkXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nXG4gIGxvYWRpbmc/OiBib29sZWFuXG59XG5cbmNvbnN0IEN1c3RvbURyb3Bkb3duOiBSZWFjdC5GQzxEcm9wZG93blByb3BzPiA9ICh7XG4gIGxhYmVsLFxuICBpY29uLFxuICBvcHRpb25zLFxuICBzZWxlY3RlZFZhbHVlcyxcbiAgb25TZWxlY3Rpb25DaGFuZ2UsXG4gIHBsYWNlaG9sZGVyID0gXCJBbGxlXCIsXG4gIGxvYWRpbmcgPSBmYWxzZVxufSkgPT4ge1xuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IGRyb3Bkb3duUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlQ2xpY2tPdXRzaWRlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoZHJvcGRvd25SZWYuY3VycmVudCAmJiAhZHJvcGRvd25SZWYuY3VycmVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgc2V0SXNPcGVuKGZhbHNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSlcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgaGFuZGxlQ2xpY2tPdXRzaWRlKVxuICB9LCBbXSlcblxuICBjb25zdCB0b2dnbGVPcHRpb24gPSAob3B0aW9uOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZXMuaW5jbHVkZXMob3B0aW9uKSkge1xuICAgICAgb25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0ZWRWYWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gb3B0aW9uKSlcbiAgICB9IGVsc2Uge1xuICAgICAgb25TZWxlY3Rpb25DaGFuZ2UoWy4uLnNlbGVjdGVkVmFsdWVzLCBvcHRpb25dKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNsZWFyQWxsID0gKCkgPT4ge1xuICAgIG9uU2VsZWN0aW9uQ2hhbmdlKFtdKVxuICB9XG5cbiAgY29uc3QgZGlzcGxheVRleHQgPSBzZWxlY3RlZFZhbHVlcy5sZW5ndGggPT09IDAgXG4gICAgPyBwbGFjZWhvbGRlciBcbiAgICA6IHNlbGVjdGVkVmFsdWVzLmxlbmd0aCA9PT0gMSBcbiAgICAgID8gc2VsZWN0ZWRWYWx1ZXNbMF1cbiAgICAgIDogYCR7c2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSBhdXNnZXfDpGhsdGBcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIiByZWY9e2Ryb3Bkb3duUmVmfT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNPcGVuKCFpc09wZW4pfVxuICAgICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTQgcHktMi41IGJnLXdoaXRlIGJvcmRlciByb3VuZGVkLWxnIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgICAgJ2hvdmVyOmJvcmRlci1tZWMtcHJpbWFyeSB
25114ob3ZlcjpzaGFkb3ctc20gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLW1lYy1wcmltYXJ5LzIwJyxcbiAgICAgICAgICAndy1mdWxsIHNtOnctYXV0byBtaW4tdy1bMTQwcHhdJyxcbiAgICAgICAgICBpc09wZW4gPyAnYm9yZGVyLW1lYy1wcmltYXJ5IHNoYWRvdy1zbScgOiAnYm9yZGVyLWdyYXktMzAwJyxcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwICYmICdib3JkZXItbWVjLXByaW1hcnkgYmctbWVjLXByaW1hcnkvNSdcbiAgICAgICAgKX1cbiAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XG4gICAgICA+XG4gICAgICAgIHtpY29ufVxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWluLXctMCB0cnVuY2F0ZVwiPlxuICAgICAgICAgIHtsb2FkaW5nID8gJ0zDpGR0Li4uJyA6IGRpc3BsYXlUZXh0fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIHtzZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJiZy1tZWMtcHJpbWFyeSB0ZXh0LXdoaXRlIHRleHQteHMgcHgtMiBweS0wLjUgcm91bmRlZC1mdWxsXCI+XG4gICAgICAgICAgICB7c2VsZWN0ZWRWYWx1ZXMubGVuZ3RofVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgKX1cbiAgICAgICAgPENoZXZyb25Eb3duIFxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAgICd3LTQgaC00IHRleHQtZ3JheS01MDAgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMjAwIGZsZXgtc2hyaW5rLTAnLFxuICAgICAgICAgICAgaXNPcGVuICYmICdyb3RhdGUtMTgwJ1xuICAgICAgICAgICl9IFxuICAgICAgICAvPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIHtpc09wZW4gJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC1mdWxsIGxlZnQtMCByaWdodC0wIG10LTEgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkLWxnIHNoYWRvdy1sZyB6LTUwIG1pbi13LVsyMDBweF1cIj5cbiAgICAgICAgICB7LyogSGVhZGVyIHdpdGggY2xlYXIgYnV0dG9uICovfVxuICAgICAgICAgIHtzZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTMgcHktMiBib3JkZXItYiBib3JkZXItZ3JheS0xMDBcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICAgICAge3NlbGVjdGVkVmFsdWVzLmxlbmd0aH0gYXVzZ2V3w6RobHRcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17Y2xlYXJBbGx9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LW1lYy1wcmltYXJ5IGhvdmVyOnRleHQtbWVjLXByaW1hcnkvODAgZm9udC1tZWRpdW1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQWxsZSBlbnRmZXJuZW5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIFxuICAgICAgICAgIHsvKiBPcHRpb25zICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWF4LWgtNjAgb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgICB7b3B0aW9ucy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtMyBweS0yIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgIEtlaW5lIE9wdGlvbmVuIHZlcmbDvGdiYXJcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICBvcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICBrZXk9e29wdGlvbn1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIHB4LTMgcHktMiBob3ZlcjpiZy1ncmF5LTUwIGN1cnNvci1wb2ludGVyIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWRWYWx1ZXMuaW5jbHVkZXMob3B0aW9uKX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eygpID0+IHRvZ2dsZU9wdGlvbihvcHRpb24pfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00IHRleHQtbWVjLXByaW1hcnkgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQgZm9jdXM6cmluZy1tZWMtcHJpbWFyeS8yMFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNzAwIGZsZXgtMSBtaW4tdy0wIHRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIHtvcHRpb259XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5leHBvcnQgY29uc3QgRmlsdGVyQmFyOiBSZWFjdC5GQzxGaWx0ZXJCYXJQcm9wcz4gPSAoe1xuICBjbGFzc05hbWUsXG4gIHNlYXJjaFF1ZXJ5LFxuICBvblNlYXJjaENoYW5nZVxufSkgPT4ge1xuICBjb25zdCB7IGFjdGl2ZVRhYiB9ID0gdXNlVmlld1ByZWZlcmVuY2VzKClcblxuICBjb25zdCB7XG4gICAgc2VsZWN0ZWRTdGF0ZXMsXG4gICAgc2V0U2VsZWN0ZWRTdGF0ZXNcbiAgfSA9IHVzZUZpbHRlcnMoKVxuXG4gIC8vIExvY2F0aW9uIGZpbHRlcnNcbiAgY29uc3QgeyBzdGF0ZXMsIGlzTG9hZGluZzogbG9jYXRpb25GaWx0ZXJzTG9hZGluZyB9ID0gdXNlTG9jYXRpb25GaWx0ZXJEYXRhKClcblxuICAvLyBFeHRyYWN0IGFycmF5cyBmcm9tIHRoZSBkYXRhIHN0cnVjdHVyZVxuICBjb25zdCBzdGF0ZXNBcnJheSA9IHN0YXRlcy5kYXRhPy5tYXAoaXRlbSA9PiBpdGVtLnN0YXRlKSB8fCBbXVxuXG4gIC8vIE9ubHkgc2hvdyBmaWx0ZXJzIGZvciBsb2NhdGlvbnMgdGFiXG4gIGNvbnN0IHNob3dGaWx0ZXJzID0gYWN0aXZlVGFiID09PSAnbG9jYXRpb25zJ1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ2JnLXdoaXRlIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBwLTMgc206cC00JywgY2xhc3NOYW1lKX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTMgc206Z2FwLTQgbGc6ZmxleC1yb3cgbGc6aXRlbXMtY2VudGVyXCI+XG4gICAgICAgI
25114HsvKiBTZWFyY2ggSW5wdXQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICA8U2VhcmNoIGNsYXNzTmFtZT1cImFic29sdXRlIGxlZnQtMyB0b3AtMS8yIHRyYW5zZm9ybSAtdHJhbnNsYXRlLXktMS8yIHctNCBoLTQgdGV4dC1ncmF5LTQwMFwiIC8+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj17YWN0aXZlVGFiID09PSAnbG9jYXRpb25zJyA/ICdTdGFuZG9ydGUgZHVyY2hzdWNoZW4uLi4nIDogJ0Fuc3ByZWNocGFydG5lciBkdXJjaHN1Y2hlbi4uLid9XG4gICAgICAgICAgICB2YWx1ZT17c2VhcmNoUXVlcnl9XG4gICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IG9uU2VhcmNoQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBwbC0xMCBwci00IHB5LTIuNSBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbGcgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctbWVjLXByaW1hcnkvMjAgZm9jdXM6Ym9yZGVyLW1lYy1wcmltYXJ5IHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogRmlsdGVyIERyb3Bkb3ducyAtIE9ubHkgZm9yIGxvY2F0aW9ucyAqL31cbiAgICAgICAge3Nob3dGaWx0ZXJzICYmIChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgc206ZmxleC1yb3cgZmxleC13cmFwIGdhcC0zIHctZnVsbCBzbTp3LWF1dG9cIj5cbiAgICAgICAgICAgIDxDdXN0b21Ecm9wZG93blxuICAgICAgICAgICAgICBsYWJlbD1cIlJlZ2lvblwiXG4gICAgICAgICAgICAgIGljb249ezxNYXBQaW4gY2xhc3NOYW1lPVwidy00IGgtNCB0ZXh0LWdyYXktNTAwXCIgLz59XG4gICAgICAgICAgICAgIG9wdGlvbnM9e3N0YXRlc0FycmF5fVxuICAgICAgICAgICAgICBzZWxlY3RlZFZhbHVlcz17c2VsZWN0ZWRTdGF0ZXN9XG4gICAgICAgICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlPXtzZXRTZWxlY3RlZFN0YXRlc31cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJBbGxlIFJlZ2lvbmVuXCJcbiAgICAgICAgICAgICAgbG9hZGluZz17bG9jYXRpb25GaWx0ZXJzTG9hZGluZ31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAgey8qIFZpZXcgVG9nZ2xlICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPFZpZXdUb2dnbGUgc2l6ZT1cInNtXCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIEFjdGl2ZSBGaWx0ZXJzIENvdW50ICovfVxuICAgICAgICB7c2hvd0ZpbHRlcnMgJiYgc2VsZWN0ZWRTdGF0ZXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICAgIHtzZWxlY3RlZFN0YXRlcy5sZW5ndGh9IEZpbHRlciBha3RpdlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRTdGF0ZXMoW10pXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1tZWMtcHJpbWFyeSBob3Zlcjp0ZXh0LW1lYy1wcmltYXJ5LzgwIGZvbnQtbWVkaXVtXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgWnVyw7xja3NldHplblxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRmlsdGVyQmFyIH0gZnJvbSAnLi9GaWx0ZXJCYXInXG5cbmludGVyZmFjZSBTYWZlRmlsdGVyQmFyUHJvcHMge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgc2VhcmNoUXVlcnk6IHN0cmluZ1xuICBvblNlYXJjaENoYW5nZTogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWRcbiAgZmFsbGJhY2s
25114/OiBSZWFjdC5SZWFjdE5vZGVcbn1cblxuaW50ZXJmYWNlIFNhZmVGaWx0ZXJCYXJTdGF0ZSB7XG4gIGhhc0Vycm9yOiBib29sZWFuXG4gIGVycm9yPzogRXJyb3Jcbn1cblxuLyoqXG4gKiBFcnJvciBCb3VuZGFyeSB3cmFwcGVyIGZvciBGaWx0ZXJCYXIgdG8gaGFuZGxlIGlmcmFtZS9sb2NhbFN0b3JhZ2UgaXNzdWVzXG4gKi9cbmNsYXNzIFNhZmVGaWx0ZXJCYXJFcnJvckJvdW5kYXJ5IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PFxuICBTYWZlRmlsdGVyQmFyUHJvcHMsXG4gIFNhZmVGaWx0ZXJCYXJTdGF0ZVxuPiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTYWZlRmlsdGVyQmFyUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLnN0YXRlID0geyBoYXNFcnJvcjogZmFsc2UgfVxuICB9XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcjogRXJyb3IpOiBTYWZlRmlsdGVyQmFyU3RhdGUge1xuICAgIHJldHVybiB7IGhhc0Vycm9yOiB0cnVlLCBlcnJvciB9XG4gIH1cblxuICBjb21wb25lbnREaWRDYXRjaChlcnJvcjogRXJyb3IsIGVycm9ySW5mbzogUmVhY3QuRXJyb3JJbmZvKSB7XG4gICAgY29uc29sZS5lcnJvcignU2FmZUZpbHRlckJhcjogQ2F1Z2h0IGVycm9yIGluIEZpbHRlckJhcjonLCBlcnJvciwgZXJyb3JJbmZvKVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmhhc0Vycm9yKSB7XG4gICAgICAvLyBGYWxsYmFjayBVSSBmb3IgaWZyYW1lIG1vZGUgb3IgbG9jYWxTdG9yYWdlIGlzc3Vlc1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5wcm9wcy5mYWxsYmFjayB8fCAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcC0zIHNtOnAtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0zIHNtOmdhcC00IGxnOmZsZXgtcm93IGxnOml0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICB7LyogU2VhcmNoIElucHV0ICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTdGFuZG9ydGUgZHVyY2hzdWNoZW4uLi5cIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5wcm9wcy5zZWFyY2hRdWVyeSB8fCAnJ31cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB0aGlzLnByb3BzLm9uU2VhcmNoQ2hhbmdlPy4oZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcGwtMTAgcHItNCBweS0yLjUgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLWxnIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1tZWMtcHJpbWFyeS8yMCBmb2N1czpib3JkZXItbWVjLXByaW1hcnkgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCBsZWZ0LTAgcGwtMyBmbGV4IGl0ZW1zLWNlbnRlciBwb2ludGVyLWV2ZW50cy1ub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3NOYW1lPVwiaC01IHctNSB0ZXh0LWdyYXktNDAwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlTGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZVdpZHRoP
25114XsyfSBkPVwiTTIxIDIxbC02LTZtMi01YTcgNyAwIDExLTE0IDAgNyA3IDAgMDExNCAwelwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgey8qIFNpbXBsaWZpZWQgbWVzc2FnZSBmb3IgaWZyYW1lIG1vZGUgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgRmlsdGVyIGltIEVtYmVkLU1vZHVzIHZlcmVpbmZhY2h0XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gPEZpbHRlckJhciB7Li4udGhpcy5wcm9wc30gLz5cbiAgfVxufVxuXG4vKipcbiAqIFNhZmUgRmlsdGVyQmFyIGNvbXBvbmVudCB3aXRoIGVycm9yIGJvdW5kYXJ5XG4gKi9cbmV4cG9ydCBjb25zdCBTYWZlRmlsdGVyQmFyOiBSZWFjdC5GQzxTYWZlRmlsdGVyQmFyUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIHJldHVybiA8U2FmZUZpbHRlckJhckVycm9yQm91bmRhcnkgey4uLnByb3BzfSAvPlxufVxuXG5leHBvcnQgZGVmYXVsdCBTYWZlRmlsdGVyQmFyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCB7IHVzZUxvY2F0aW9ucyB9IGZyb20gJ0Bob29rcy91c2VMb2NhdGlvbnMnXG5pbXBvcnQgeyB1c2VGaWx0ZXJlZENvbnRhY3RzIH0gZnJvbSAnQGhvb2tzL3VzZUNvbnRhY3RzJ1xuaW1wb3J0IHsgdXNlVmlld1ByZWZlcmVuY2VzLCB1c2VMb2NhdGlvbk1vZGFsLCB1c2VDb250YWN0TW9kYWwsIHVzZUZpbHRlcnMgfSBmcm9tICdAc3RvcmVzL3VzZUFwcFN0b3JlJ1xuaW1wb3J0IHsgTG9jYXRpb25NaW5pR3JpZENhcmQgfSBmcm9tICdAY29tcG9uZW50cy9Mb2NhdGlvbi9Mb2NhdGlvbk1pbmlHcmlkQ2FyZCdcbmltcG9ydCB7IFVuaWZpZWRDb250YWN0Q2FyZCB9IGZyb20gJy4vVW5pZmllZENvbnRhY3RDYXJkJ1xuaW1wb3J0IHsgVW5pZmllZFRhYnMgfSBmcm9tICcuL1VuaWZpZWRUYWJzJ1xuaW1wb3J0IHsgU2FmZUZpbHRlckJhciB9IGZyb20gJy4vU2FmZUZpbHRlckJhcidcbmltcG9ydCB7IExvYWRpbmdTcGlubmVyIH0gZnJvbSAnQGNvbXBvbmVudHMvVUkvTG9hZGluZ1NwaW5uZXInXG5pbXBvcnQgeyBCdWlsZGluZzIsIFVzZXJzIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHR5cGUgeyBDb250YWN0IH0gZnJvbSAnLi4vLi4vdHlwZXMvaW5kZXgnXG5cbmludGVyZmFjZSBVbmlmaWVkTGlzdFZpZXdQcm9wcyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgVW5pZmllZExpc3RWaWV3OiBSZWFjdC5GQzxVbmlmaWVkTGlzdFZpZXdQcm9wcz4gPSAoeyBjbGFzc05hbWUgfSkgPT4ge1xuICBjb25zdCB7IGNvbnRhY3RMYXlvdXQsIGFjdGl2ZVRhYiwgc2V0QWN0aXZlVGFiIH0gPSB1c2VWaWV3UHJlZmVyZW5jZXMoKVxuICBjb25zdCB7IG9wZW46IG9wZW5Mb2NhdGlvbk1vZGFsIH0gPSB1c2VMb2NhdGlvbk1vZGFsKClcbiAgY29uc3QgeyBvcGVuOiBvcGVuQ29udGFjdE1vZGFsIH0gPSB1c2VDb250YWN0TW9kYWwoKVxuXG4gIC8vIEdldCBhbGwgZmlsdGVyIHN0YXRlIGF0IG9uY2UgKG11c3QgYmUgYmVmb3JlIGNvbmRpdGlvbmFsIHJldHVybnMpXG4gIGNvbnN0IHsgXG4gICAgc2VhcmNoUXVlcnksIFxuICAgIHNldFNlYXJjaFF1ZXJ5LCBcbiAgICBzZWxlY3RlZFN0YXRlcywgXG4gICAgc2VsZWN0ZWRTZXJ2aWNlcyBcbiAgfSA9IHVzZUZpbHRlcnMoKVxuXG4gIC8vIEZldGNoIGRhdGFcbiAgY29uc3QgeyBkYXRhOiBsb2NhdGlvbnMsIGlzTG9hZGluZzogbG9jYXRpb25zTG9hZGluZywgZXJyb3I6IGxvY2F0aW9uc0Vycm9yIH0gPSB1c2VMb2NhdGlvbnMoKVxuICBjb25zdCB7IGNvbnRhY3RzLCBpc0xvYWRpbmc6IGNvbnRhY3RzTG9hZGluZywgZXJyb3I6IGNvbnRhY3RzRXJyb3IgfSA9IHVzZUZpbHRlcmVkQ29udGFjdHMoKVxuXG4gIGNvbnN0IGlzTG9hZGluZyA9IGxvY2F0aW9uc0xvYWRpbmcgfHwgY29udGFjdHNMb2FkaW5nXG4gIGNvbnN0IGhhc0Vycm9yID0gbG9jYXRpb25zRXJyb3IgfHwgY29udGFjdHNFcnJvclxuXG4gIC8vIEhhbmRsZSBjbGlja3NcbiAgY29uc3QgaGFuZGxlTG9jYXRpb25DbGljayA9IChsb2NhdGlvbklkOiBzdHJpbmcpID0+IHtcbiAgICBvcGVuTG9jYXRpb25Nb2RhbChsb2NhdGlvbklkKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ29udGFjdENsaWNrID0gKGNvbnRhY3Q6IENvbnRhY3QpID0+IHtcbiAgICBvcGVuQ29udGFjdE1vZGFsKGNvbnRhY3QpXG4gIH1cblxuICAvLyBMb2FkaW5nIHN0YXRlXG4gIGlmIChpc0xvYWRpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ3NwYWNlLXktNicsIGNsYXNzTmFtZSl9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlIHJvdW5kZWQtbWVjLWxnIHNoYWRvdy1jYXJkIHAtNlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgPExvYWRpbmdTcGlubmVyIHNpemU9XCJsZ1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgLy8gRXJyb3Igc3RhdGVcbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KCdzcGFjZS15LTYnLCBjbGFzc05hbWUpfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLW1lYy1sZyBzaGFkb3ctY2FyZCBwLTZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgRmVobGVyIGJlaW0gTGFkZW4gZGVyIERhdGVuLiBCaXR0ZSB2ZXJzdWNoZW4gU2llIGVzIHNww6R0ZXIgZXJuZXV0LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIC8vIHVzZUxvY2F0aW9ucyByZXR1cm5zIHJlc3BvbnNlLmRhdGEgZGlyZWN0bHksIHVzZUZpbHRlcmVkQ29udGFjdHMgcmV0dXJucyBjb250YWN0cyBhcnJheSBkaXJlY3RseVxuICBjb25zdCBhY3RpdmVMb2NhdGlvbnMgPSBsb2NhdGlvbnMgfHwgW11cbiAgY29uc3QgYWN0aXZlQ29udGFjdHMgPSBjb250YWN0cyB8fCBbXVxuXG4gIC8vIPCflI0gREVCVUc6IExvZyBjb250YWN0c1xuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogVW5pZmllZExpc3RWaWV3IC0gYWN0aXZlQ29udGFjdHM6JywgYWN0aXZlQ29udGFjdHMubGVuZ3RoKVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogVW5pZmllZExpc3RWaWV3IC0gc2VhcmNoUXVlcnk6Jywgc2VhcmNoUXVlcnkpXG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIG1hcCBwb3N0YWwgY29kZSB0byBzdGF0ZS9yZWdpb25cbiAgY29uc3QgZ2V0U3RhdGVGcm9tUG9zdGFsQ29kZSA9IChwb3N0YWxDb2RlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGlmICghcG9zdGFsQ29kZSkgcmV0dXJuICdTb25zdGlnZSdcbiAgICBjb25zdCBmaXJzdENoYXIgPSBwb3N0YWxDb2RlLmNoYXJBdCgwKVxuICAgIHN3aXRjaCAo
25114Zmlyc3RDaGFyKSB7XG4gICAgICBjYXNlICcwJzpcbiAgICAgIGNhc2UgJzEnOlxuICAgICAgICByZXR1cm4gJ0Jlcmxpbi9CcmFuZGVuYnVyZy9TYWNoc2VuJ1xuICAgICAgY2FzZSAnMic6XG4gICAgICAgIHJldHVybiAnSGFtYnVyZy9TY2hsZXN3aWctSG9sc3RlaW4vTmllZGVyc2FjaHNlbidcbiAgICAgIGNhc2UgJzMnOlxuICAgICAgICByZXR1cm4gJ05pZWRlcnNhY2hzZW4vU2FjaHNlbi1BbmhhbHQvVGjDvHJpbmdlbidcbiAgICAgIGNhc2UgJzQnOlxuICAgICAgICByZXR1cm4gJ05vcmRyaGVpbi1XZXN0ZmFsZW4nXG4gICAgICBjYXNlICc1JzpcbiAgICAgICAgcmV0dXJuICdOb3JkcmhlaW4tV2VzdGZhbGVuL1JoZWlubGFuZC1QZmFseidcbiAgICAgIGNhc2UgJzYnOlxuICAgICAgICByZXR1cm4gJ0hlc3Nlbi9SaGVpbmxhbmQtUGZhbHovU2FhcmxhbmQnXG4gICAgICBjYXNlICc3JzpcbiAgICAgICAgcmV0dXJuICdCYWRlbi1Xw7xydHRlbWJlcmcnXG4gICAgICBjYXNlICc4JzpcbiAgICAgICAgcmV0dXJuICdCYXllcm4nXG4gICAgICBjYXNlICc5JzpcbiAgICAgICAgcmV0dXJuICdCYXllcm4vVGjDvHJpbmdlbi9TYWNoc2VuJ1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdTb25zdGlnZSdcbiAgICB9XG4gIH1cblxuICAvLyBGaWx0ZXIgZGF0YSBiYXNlZCBvbiBzZWFyY2ggcXVlcnkgYW5kIGZpbHRlcnNcbiAgY29uc3QgZmlsdGVyZWRMb2NhdGlvbnMgPSBhY3RpdmVMb2NhdGlvbnMuZmlsdGVyKGxvY2F0aW9uID0+IHtcbiAgICAvLyBTZWFyY2ggZmlsdGVyXG4gICAgY29uc3QgbWF0Y2hlc1NlYXJjaCA9ICFzZWFyY2hRdWVyeSB8fFxuICAgICAgKGxvY2F0aW9uLm5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoUXVlcnkudG9Mb3dlckNhc2UoKSkgfHxcbiAgICAgIChsb2NhdGlvbi5jaXR5IHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFF1ZXJ5LnRvTG93ZXJDYXNlKCkpIHx8XG4gICAgICAobG9jYXRpb24uYWRkcmVzcyB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hRdWVyeS50b0xvd2VyQ2FzZSgpKVxuXG4gICAgLy8gU3RhdGUgZmlsdGVyIChiYXNlZCBvbiBwb3N0YWwgY29kZSlcbiAgICBjb25zdCBtYXRjaGVzU3RhdGUgPSBzZWxlY3RlZFN0YXRlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIHNlbGVjdGVkU3RhdGVzLmluY2x1ZGVzKGdldFN0YXRlRnJvbVBvc3RhbENvZGUobG9jYXRpb24ucG9zdGFsQ29kZSB8fCAnJykpXG5cbiAgICAvLyBTZXJ2aWNlcyBmaWx0ZXIgKGNoZWNrIGlmIGxvY2F0aW9uIGhhcyBhbnkgb2YgdGhlIHNlbGVjdGVkIHNlcnZpY2VzKVxuICAgIGNvbnN0IG1hdGNoZXNTZXJ2aWNlcyA9IHNlbGVjdGVkU2VydmljZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAobG9jYXRpb24uc2VydmljZXMgJiYgQXJyYXkuaXNBcnJheShsb2NhdGlvbi5zZXJ2aWNlcykgJiZcbiAgICAgICBzZWxlY3RlZFNlcnZpY2VzLnNvbWUoc2VydmljZSA9PiBsb2NhdGlvbi5zZXJ2aWNlcyEuaW5jbHVkZXMoc2VydmljZSkpKVxuXG4gICAgcmV0dXJuIG1hdGNoZXNTZWFyY2ggJiYgbWF0Y2hlc1N0YXRlICYmIG1hdGNoZXNTZXJ2aWNlc1xuICB9KVxuXG4gIGNvbnN0IGZpbHRlcmVkQ29udGFjdHMgPSBhY3RpdmVDb250YWN0cy5maWx0ZXIoY29udGFjdCA9PlxuICAgIChjb250YWN0LmZ1bGxOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFF1ZXJ5LnRvTG93ZXJDYXNlKCkpIHx8XG4gICAgKGNvbnRhY3QucG9zaXRpb24gfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoUXVlcnkudG9Mb3dlckNhc2UoKSkgfHxcbiAgICAoY29udGFjdC5lbWFpbCB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hRdWVyeS50b0xvd2VyQ2FzZSgpKSB8fFxuICAgIChjb250YWN0LnNwZWNpYWx0aWVzICYmIGNvbnRhY3Quc3BlY2lhbHRpZXMuc29tZSgoc3BlY2lhbHR5OiBzdHJpbmcpID0+XG4gICAgICAoc3BlY2lhbHR5IHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFF1ZXJ5LnRvTG93ZXJDYXNlKCkpXG4gICAgKSlcbiAgKVxuXG4gIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiBVbmlmaWVkTGlzdFZpZXcgLSBmaWx0ZXJlZENvbnRhY3RzOicsIGZpbHRlcmVkQ29udGFjdHMubGVuZ3RoKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ3NwYWNlLXktNiBzY3JvbGwtY29udGFpbmVyJywgY2xhc3NOYW1lKX0+XG4gICAgICB7LyogVGFiIE5hdmlnYXRpb24gLSBNb2JpbGUtb3B0aW1pemVkIGxhYmVscyAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2h
25114pdGUgcm91bmRlZC1tZWMtbGcgc2hhZG93LWNhcmRcIj5cbiAgICAgICAgPFVuaWZpZWRUYWJzXG4gICAgICAgICAgdGFicz17W1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ2xvY2F0aW9ucycsXG4gICAgICAgICAgICAgIGxhYmVsOiAnU3RhbmRvcnRlJyxcbiAgICAgICAgICAgICAgY291bnQ6IGZpbHRlcmVkTG9jYXRpb25zLmxlbmd0aCxcbiAgICAgICAgICAgICAgaWNvbjogPEJ1aWxkaW5nMiBjbGFzc05hbWU9XCJ3LTQgaC00IHNtOnctNSBzbTpoLTVcIiAvPlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6ICdjb250YWN0cycsXG4gICAgICAgICAgICAgIGxhYmVsOiAnS29udGFrdGUnLFxuICAgICAgICAgICAgICBjb3VudDogZmlsdGVyZWRDb250YWN0cy5sZW5ndGgsXG4gICAgICAgICAgICAgIGljb246IDxVc2VycyBjbGFzc05hbWU9XCJ3LTQgaC00IHNtOnctNSBzbTpoLTVcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF19XG4gICAgICAgICAgYWN0aXZlVGFiPXthY3RpdmVUYWJ9XG4gICAgICAgICAgb25UYWJDaGFuZ2U9eyh0YWJJZCkgPT4gc2V0QWN0aXZlVGFiKHRhYklkIGFzICdsb2NhdGlvbnMnIHwgJ2NvbnRhY3RzJyl9XG4gICAgICAgICAgdmFyaWFudD1cInVuZGVybGluZVwiXG4gICAgICAgICAgZnVsbFdpZHRoPXt0cnVlfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBGaWx0ZXIgQmFyICovfVxuICAgICAgPFNhZmVGaWx0ZXJCYXJcbiAgICAgICAgc2VhcmNoUXVlcnk9e3NlYXJjaFF1ZXJ5fVxuICAgICAgICBvblNlYXJjaENoYW5nZT17c2V0U2VhcmNoUXVlcnl9XG4gICAgICAgIGNsYXNzTmFtZT1cInNoYWRvdy1jYXJkXCJcbiAgICAgIC8+XG5cbiAgICAgIHsvKiBUYWIgQ29udGVudCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2h
25114pdGUgcm91bmRlZC1tZWMtbGcgc2hhZG93LWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTYgc2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIHthY3RpdmVUYWIgPT09ICdsb2NhdGlvbnMnID8gKFxuICAgICAgICAgICAgLy8gTG9jYXRpb25zIFRhYlxuICAgICAgICAgICAgZmlsdGVyZWRMb2NhdGlvbnMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyIHB5LTggdGV4dC10ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAge3NlYXJjaFF1ZXJ5ID8gJ0tlaW5lIEhhbmRlbHNpbW1vYmlsaWVuIGdlZnVuZGVuJyA6ICdLZWluZSBIYW5kZWxzaW1tb2JpbGllbiB2ZXJmw7xnYmFyJ31cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAgICAgICBjb250YWN0TGF5b3V0ID09PSAnZ3JpZCdcbiAgICAgICAgICAgICAgICAgID8gJ2dyaWQgZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMgeGw6Z3JpZC1jb2xzLTQgZ2FwLTQgaXRlbXMtc3RyZXRjaCcgLy8gNCBLYWNoZWxuIGF1ZiBEZXNrdG9wXG4gICAgICAgICAgICAgICAgICA6ICdzcGFjZS15LTInXG4gICAgICAgICAgICAgICl9PlxuICAgICAgICAgICAgICAgIHtmaWx0ZXJlZExvY2F0aW9ucy5tYXAoKGxvY2F0aW9uKSA9PiAoXG4gICAgICAgICAgICAgICAgICA8TG9jYXRpb25NaW5pR3JpZENhcmRcbiAgICAgICAgICAgICAgICAgICAga2V5PXtsb2NhdGlvbi5pZH1cbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249e2xvY2F0aW9ufVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVMb2NhdGlvbkNsaWNrfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIC8vIENvbnRhY3RzIFRhYlxuICAgICAgICAgICAgZmlsdGVyZWRDb250YWN0cy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgcHktOCB0ZXh0LXRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICB7c2VhcmNoUXVlcnkgPyAnS2VpbmUgQW5zcHJlY2hwYXJ0bmVyIGdlZnVuZGVuJyA6ICdLZWluZSBBbnNwcmVjaHBhcnRuZXIgdmVyZsO8Z2Jhcid9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICAgICAgICAgY29udGFjdExheW91dCA9PT0gJ2dyaWQnXG4gICAgICAgICAgICAgICAgICA/ICdncmlkIGdyaWQtY29scy0xIHNtOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zIGdhcC00IGl0ZW1zLXN0cmV0Y2gnIC8vIDMgS2FjaGVsbiBhdWYgRGVza3RvcFxuICAgICAgICAgICAgICAgICAgOiAnc3BhY2UteS0yJ1xuICAgICAgICAgICAgICApfT5cbiAgICAgICAgICAgICAgICB7ZmlsdGVyZWRDb250YWN0cy5tYXAoKGNvbnRhY3QpID0+IChcbiAgICAgICAgICAgICAgICAgIDxVbmlmaWVkQ29udGFjdENhcmRcbiAgICAgICAgICAgICAgICAgICAga2V5PXtjb250YWN0LmlkfVxuICAgICAgICAgICAgICAgICAgICBjb250YWN0PXtjb250YWN0fVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDb250YWN0Q2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9e2NvbnRhY3RMYXlvdXQgPT09ICdncmlkJyA/ICdkZWZhdWx0JyA6ICdjb21wYWN0J31cbiAgICAgICAgICAgICAgICAgICAgc2hvd0xvY2F0aW9uPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKVxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY3JlYXRlUG9ydGFsIH0gZnJvbSAncmVhY3QtZG9tJ1xuaW1wb3J0IHsgWCB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IGNsc3ggfSBmcm9tICdjbHN4J1xuXG5pbnRlcmZhY2UgTW9kYWxQcm9wcyB7XG4gIGlzT3BlbjogYm9vbGVhblxuICBvbkNsb3NlOiAoKSA9PiB2b2lkXG4gIHRpdGxlPzogc3RyaW5nXG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVcbiAgc2l6ZT86ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcgfCAnZnVsbCdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIGNsb3NlT25PdmVybGF5Q2xpY2s/OiBib29sZWFuXG4gIGNsb3NlT25Fc2NhcGU/OiBib29sZWFuXG4gIHNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IE1vZGFsOiBSZWFjdC5GQzxNb2RhbFByb3BzPiA9ICh7XG4gIGlzT3BlbixcbiAgb25DbG9zZSxcbiAgdGl0bGUsXG4gIGNoaWxkcmVuLFxuICBzaXplID0gJ21kJyxcbiAgY2xhc3NOYW1lLFxuICBjbG9zZU9uT3ZlcmxheUNsaWNrID0gdHJ1ZSxcbiAgY2xvc2VPbkVzY2FwZSA9IHRydWUsXG4gIHNob3dDbG9zZUJ1dHRvbiA9IHRydWVcbn0pID0+IHtcbiAgY29uc3QgbW9kYWxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IHByZXZpb3VzQWN0aXZlRWxlbWVudCA9IHVzZVJlZjxIVE1MRWxlbWVudCB8IG51bGw+KG51bGwpXG5cbiAgLy8gSGFuZGxlIGVzY2FwZSBrZXlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNsb3NlT25Fc2NhcGUpIHJldHVyblxuXG4gICAgY29uc3QgaGFuZGxlRXNjYXBlID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgaXNPcGVuKSB7XG4gICAgICAgIG9uQ2xvc2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVFc2NhcGUpXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVFc2NhcGUpXG4gIH0sIFtpc09wZW4sIG9uQ2xvc2UsIGNsb3NlT25Fc2NhcGVdKVxuXG4gIC8vIEhhbmRsZSBmb2N1cyBtYW5hZ2VtZW50XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzT3Blbikge1xuICAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgIHByZXZpb3VzQWN0aXZlRWxlbWVudC5jdXJyZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudFxuICAgICAgXG4gICAgICAvLyBGb2N1cyB0aGUgbW9kYWxcbiAgICAgIG1vZGFsUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgICAgIFxuICAgICAgLy8gUHJldmVudCBib2R5IHNjcm9sbFxuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc3RvcmUgZm9jdXNcbiAgICAgIGlmIChwcmV2aW91c0FjdGl2ZUVsZW1lbnQuY3VycmVudCkge1xuICAgICAgICBwcmV2aW91c0FjdGl2ZUVsZW1lbnQuY3VycmVudC5mb2N1cygpXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJlc3RvcmUgYm9keSBzY3JvbGxcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJ1xuICAgIH1cblxuICAgI
25114HJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJydcbiAgICB9XG4gIH0sIFtpc09wZW5dKVxuXG4gIC8vIEhhbmRsZSBvdmVybGF5IGNsaWNrXG4gIGNvbnN0IGhhbmRsZU92ZXJsYXlDbGljayA9IChlOiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKGNsb3NlT25PdmVybGF5Q2xpY2sgJiYgZS50YXJnZXQgPT09IGUuY3VycmVudFRhcmdldCkge1xuICAgICAgb25DbG9zZSgpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc09wZW4pIHJldHVybiBudWxsXG5cbiAgY29uc3Qgc2l6ZUNsYXNzZXMgPSB7XG4gICAgc206ICdtYXgtdy1tZCcsXG4gICAgbWQ6ICdtYXgtdy1sZycsXG4gICAgbGc6ICdtYXgtdy0yeGwnLFxuICAgIHhsOiAnbWF4LXctNHhsJyxcbiAgICBmdWxsOiAnbWF4LXctZnVsbCdcbiAgfVxuXG4gIGNvbnN0IG1vZGFsQ29udGVudCA9IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgIFwiZml4ZWQgaW5zZXQtMCB6LTUwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCIsXG4gICAgICAgIC8vIE1vYmlsZTogRnVsbHNjcmVlbiwgRGVza3RvcDogQ2VudGVyZWQgd2l0aCBwYWRkaW5nXG4gICAgICAgIFwicC0wIHNtOnAtNCBtZDpwLTZcIlxuICAgICAgKX1cbiAgICAgIG9uQ2xpY2s9e2hhbmRsZU92ZXJsYXlDbGlja31cbiAgICA+XG4gICAgICB7LyogQmFja2Ryb3AgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LTAgYmctYmxhY2svNTAgYmFja2Ryb3AtYmx1ci1zbSBhbmltYXRlLWluIGZhZGUtaW4gZHVyYXRpb24tMjAwXCIgLz5cblxuICAgICAgey8qIE1vZGFsICovfVxuICAgICAgPGRpdlxuICAgICAgICByZWY9e21vZGFsUmVmfVxuICAgICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICAgJ3JlbGF0aXZlIGJnLXdoaXRlIHNoYWRvdy1tb2RhbCBmbGV4IGZsZXgtY29sJyxcbiAgICAgICAgICAnYW5pbWF0ZS1pbiB6b29tLWluLTk1IHNsaWRlLWluLWZyb20tYm90dG9tLTIgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgICAvLyBGdWxsIHNpemU6IEFsd2F5cyBmdWxsc2NyZWVuLCBPdGhlcnM6IE1vYmlsZSBmdWxsc2NyZWVuLCBEZXNrdG9wIHJvdW5kZWQgd2l0aCBtYXgtaGVpZ2h0XG4gICAgICAgICAgc2l6ZSA9PT0gJ2Z1bGwnXG4gICAgICAgICAgICA/ICdoLWZ1bGwgdy1mdWxsJ1xuICAgICAgICAgICAgOiAnaC1mdWxsIHctZnVsbCBzbTpoLWF1dG8gc206bWF4LWgtW2NhbGMoMTAwdmgtM3JlbSldIHNtOnJvdW5kZWQtbWVjLWxnIG1kOm1heC1oLVtjYWxjKDEwMHZoLTRyZW0pXScsXG4gICAgICAgICAgc2l6ZUNsYXNzZXNbc2l6ZV0sXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIHRhYkluZGV4PXstMX1cbiAgICAgICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PXt0aXRsZSA/ICdtb2RhbC10aXRsZScgOiB1bmRlZmluZWR9XG4gICAgICA+XG4gICAgICAgIHsvKiBIZWFkZXIgLSBGaXhlZCBhdCB0b3AgKi99XG4gICAgICAgIHsodGl0bGUgfHwgc2hvd0Nsb3NlQnV0dG9uKSAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LXNocmluay0wIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBwLTQgc206cC02IGJvcmRlci1iIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5IGJnLXdoaXRlIHotMTBcIj5cbiAgICAgICAgICAgIHt0aXRsZSAmJiAoXG4gICAgICAgICAgICAgIDxoMiBpZD1cIm1vZGFsLXRpdGxlXCIgY2xhc3NOYW1lPVwidGV4dC1sZyBzbTp0ZXh0LXhsIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICB7dGl0bGV9XG4gICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7c2hvd0Nsb3NlQnV0dG9uICYmIChcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xvc2V9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicC0yIC1tci0yIHRleHQtdGV4dC1tdXRlZCBob3Zlcjp0ZXh0LXRleHQtcHJpbWFyeSBob3ZlcjpiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSByb3VuZGVkLW1lYyB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk1vZGFsIHNjaGxpZcOfZW5cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPFggY2xhc3NOYW1lPVwidy01IGgtNVwiIC8+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7LyogQ29udGVudCAtIFNjcm9sbGFibGUgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LXktYXV0byBvdmVyZmxvdy14LWhpZGRlblwiPlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxuXG4gIC8vIFJlbmRlciBpbiBwb3J0YWxcbiAgcmV0dXJuIGNyZWF0ZVBvcnRhbChtb2RhbENvbnRlbnQsIGRvY3VtZW50LmJvZHkpXG59XG5cbi8vIFNwZWNpYWxpemVkIG1vZGFsIHZhcmlhbnRzXG5leHBvcnQgY29uc3QgQ29uZmlybU1vZGFsOiBSZWFjdC5GQzx7XG4gIGlzT3BlbjogYm9vbGVhblxuICBvbkNsb3NlOiAoKSA9PiB2b2lkXG4gIG9uQ29uZmlybTogKCkgPT4gdm9pZFxuICB0aXRsZTogc3RyaW5nXG4gIG1lc3NhZ2U6IHN0cmluZ1xuICBjb25maXJtVGV4dD86IHN0cmluZ1xuICBjYW5jZWxUZXh0Pzogc3RyaW5nXG4gIHZhcmlhbnQ/OiAnZGFuZ2VyJyB8ICd3YXJuaW5nJyB8ICdpbmZvJ1xufT4gPSAoe1xuICBpc09wZW4sXG4gIG9uQ2xvc2UsXG4gIG9uQ29uZmlybSxcbiAgdGl0bGUsXG4gIG1lc3NhZ2UsXG4gIGNvbmZpcm1UZXh0ID0gJ0Jlc3TDpHRpZ2VuJyxcbiAgY2FuY2VsVGV4dCA9ICdBYmJyZWNoZW4nLFxuICB2YXJpYW50ID0gJ2luZm8nXG59KSA9PiB7XG4gIGNvbnN0IGhhbmRsZUNvbmZpcm0gPSAoKSA9PiB7XG4gICAgb25Db25maXJtKClcbiAgICBvbkNsb3NlKClcbiAgfVxuXG4gIGNvbnN0IHZhcmlhbnRDbGFzc2VzID0ge1xuICAgIGRhbmdlcjogJ2J0bi1kYW5nZXInLFxuICAgIHdhcm5pbmc6ICdidG4td2FybmluZycsXG4gICAgaW5mbzogJ2J0bi1wcmltYXJ5J1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8TW9kYWxcbiAgICAgIGlzT3Blbj17aXNPcGVufVxuICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgIHRpdGxlPXt0aXRsZX1cbiAgICAgIHNpemU9XCJzbVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTYgc3BhY2UteS00XCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnlcIj57bWVzc2FnZX08L3A+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHNwYWNlLXgtMyBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xvc2V9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tZ2hvc3RcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgI
25114HtjYW5jZWxUZXh0fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNvbmZpcm19XG4gICAgICAgICAgICBjbGFzc05hbWU9e3ZhcmlhbnRDbGFzc2VzW3ZhcmlhbnRdfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtjb25maXJtVGV4dH1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L01vZGFsPlxuICApXG59XG5cbmV4cG9ydCBjb25zdCBJbWFnZU1vZGFsOiBSZWFjdC5GQzx7XG4gIGlzT3BlbjogYm9vbGVhblxuICBvbkNsb3NlOiAoKSA9PiB2b2lkXG4gIHNyYzogc3RyaW5nXG4gIGFsdDogc3RyaW5nXG4gIHRpdGxlPzogc3RyaW5nXG59PiA9ICh7IGlzT3Blbiwgb25DbG9zZSwgc3JjLCBhbHQsIHRpdGxlIH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8TW9kYWxcbiAgICAgIGlzT3Blbj17aXNPcGVufVxuICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgIHRpdGxlPXt0aXRsZX1cbiAgICAgIHNpemU9XCJ4bFwiXG4gICAgICBjbGFzc05hbWU9XCJiZy1ibGFjayBwLTBcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaC1mdWxsIHAtNFwiPlxuICAgICAgICA8aW1nXG4gICAgICAgICAgc3JjPXtzcmN9XG4gICAgICAgICAgYWx0PXthbHR9XG4gICAgICAgICAgY2xhc3NOYW1lPVwibWF4LXctZnVsbCBtYXgtaC1mdWxsIG9iamVjdC1jb250YWluXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvTW9kYWw+XG4gIClcbn1cbiIsIi8qKlxuICogQUNGL1JFU1QgbGllZmVydCBkaWUgdmVybWlldGJhcmUgRmzDpGNoZSBvZnQgbWl0IGVuZ2xpc2NoZW0gRGV6aW1hbHB1bmt0XG4gKiAoMTkuMiBzdGF0dCAxOS4yMDApLiBXZXJ0ZSB1bnRlciAxMDAwIHdlcmRlbiBhbHMgdmVycnV0c2NodGVyIFRhdXNlbmRlclxuICoga29ycmlnaWVydC4gVm9sbGUgbcKyICh6LiBCLiAxNzQ0MykgYmxlaWJlbiB1bnZlcsOkbmRlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1pZXRmbGFlY2hlKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykgcmV0dXJuIG51bGxcblxuICBsZXQgbnVtOiBudW1iZXJcblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzL2csICcnKVxuICAgIGlmICghdHJpbW1lZCkgcmV0dXJuIG51bGxcblxuICAgIGlmICgvXlxcZHsxLDN9KFxcLlxcZHszfSkrKCxcXGQrKT8kLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICBudW0gPSBOdW1iZXIucGFyc2VGbG9hdCh0cmltbWVkLnJlcGxhY2UoL1xcLi9nLCAnJykucmVwbGFjZSgnLCcsICcuJykpXG4gICAgfSBlbHNlIGlmICh0cmltbWVkLmluY2x1ZGVzKCcsJykgJiYgIXRyaW1tZWQuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgbnVtID0gTnVtYmVyLnBhcnNlRmxvYXQodHJpbW1lZC5yZXBsYWNlKCcsJywgJy4nKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbnVtID0gTnVtYmVyLnBhcnNlRmxvYXQodHJpbW1lZClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbnVtID0gTnVtYmVyKHZhbHVlKVxuICB9XG5cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobnVtKSB8fCBudW0gPD0gMCkgcmV0dXJuIG51bGxcbiAgaWYgKG51bSA8IDEwMDApIHJldHVybiBNYXRoLnJvdW5kKG51bSAqIDEwMDApXG4gIHJldHVybiBNYXRoLnJvdW5kKG51bSlcbn1cblxuLyoqIERldXRzY2hlIFNjaHJlaWJ3ZWlzZSBvaG5lIEVpbmhlaXQsIHouIEIuIFwiMTkuMjAwXCIgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRNaWV0ZmxhZWNoZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IHNxbSA9IHBhcnNlTWlldGZsYWVjaGUodmFsdWUpXG4gIGlmIChzcW0gPT0gbnVsbCkgcmV0dXJuICcnXG4gIHJldHVybiBzcW0udG9Mb2NhbGVTdHJpbmcoJ2RlLURFJywgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDAgfSlcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJ1aWxkaW5nMiwgU2hvcHBpbmdCYWcsIExheWVycywgRXh0ZXJuYWxMaW5rIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICcuLi8uLi90eXBlcydcbmltcG9ydCB7IGZvcm1hdE1pZXRmbGFlY2hlIH0gZnJvbSAnQHV0aWxzL2Zvcm1hdEFyZWEnXG5cbmludGVyZmFjZSBMb2NhdGlvbk1vZGFsSGVyb1Byb3BzIHtcbiAgbG9jYXRpb246IExvY2F0aW9uXG4gIGNlbnRlckRhdGE6IHtcbiAgICB2ZXJtaWV0YmFyZUZsYWVjaGU/OiBudW1iZXIgfCBzdHJpbmdcbiAgICBhbnphaGxTaG9wcz86IG51bWJlciB8IHN0cmluZyAgXG4gICAgdmVya2F1ZnNlYmVuZW4/OiBudW1iZXIgfCBzdHJpbmdcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgTG9jYXRpb25Nb2RhbEhlcm86IFJlYWN0LkZDPExvY2F0aW9uTW9kYWxIZXJvUHJvcHM+ID0gKHtcbiAgbG9jYXRpb24sXG4gIGNlbnRlckRhdGFcbn0pID0+IHtcbiAgY29uc3QgaGFuZGxlQ2VudGVyTGlua0NsaWNrID0gKCkgPT4ge1xuICAgIGNvbnN0IGNlbnRlckxpbmsgPSAobG9jYXRpb24gYXMgYW55KS5jZW50ZXJsaW5rIHx8IGxvY2F0aW9uLmNlbnRlckxpbmtcbiAgICBpZiAoY2VudGVyTGluaykge1xuICAgICAgd2luZG93Lm9wZW4oY2VudGVyTGluaywgJ19ibGFuaycsICdub29wZW5lcixub3JlZmVycmVyJylcbiAgICB9XG4gIH1cblxuICBjb25zdCBnZXRJbWFnZVVybCA9ICgpID0+IHtcbiAgICByZXR1cm4gKGxvY2F0aW9uIGFzIGFueSkuaGVyb2ltYWdlIHx8IGxvY2F0aW9uLmhlcm9JbWFnZSB8fCBsb2NhdGlvbi5pbWFnZSB8fCBsb2NhdGlvbi5sb2dvIHx8ICcvYXNzZXRzL3BsYWNlaG9sZG
25114VyLWxvY2F0aW9uLmpwZydcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBoLWZ1bGwgZmxleCBmbGV4LWNvbCBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgIHsvKiBIZXJvIEltYWdlIC0gU21hbGxlciBvbiBNb2JpbGUgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIHctZnVsbCBoLVsyNXZoXSBtZDpoLVs0NXZoXSBtaW4taC1bMjAwcHhdIG1kOm1pbi1oLVszMDBweF0gZmxleC1zaHJpbmstMFwiPlxuICAgICAgICA8aW1nXG4gICAgICAgICAgc3JjPXtnZXRJbWFnZVVybCgpfVxuICAgICAgICAgIGFsdD17bG9jYXRpb24ubmFtZX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgey8qIExvZ28gaW4gdG9wIHJpZ2h0IC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAge2xvY2F0aW9uLmxvZ28gJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTQgcmlnaHQtNCBtZDp0b3AtNiBtZDpyaWdodC02XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlLzkwIGJhY2tkcm9wLWJsdXItc20gcm91bmRlZC1sZyBwLTIgbWQ6cC0zXCI+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBzcmM9e2xvY2F0aW9uLmxvZ299XG4gICAgICAgICAgICAgICAgYWx0PXtgJHtsb2NhdGlvbi5uYW1lfSBMb2dvYH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggbWQ6aC0xMiB3LWF1dG8gb2JqZWN0LWNvbnRhaW5cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIFRpdGxlICsgRmFjdHMgU2VjdGlvbiAtIERhcmsgQmx1ZSBCYWNrZ3JvdW5kICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgcC00IG1kOnAtNiBsZzpwLTggZmxleCBmbGV4LWNvbCBiZy1tZWMtc2Vjb25kYXJ5IG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICB7LyogTG9jYXRpb24gTmFtZSAmIENpdHkgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBtZDptYi02IGxnOm1iLThcIj5cbiAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgbWQ6dGV4dC0zeGwgbGc6dGV4dC00eGwgZm9udC1ib2xkIG1iLTEgbWQ6bWItMiBsZWFkaW5nLXRpZ2h0IHRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgIHtsb2NhdGlvbi5uYW1lfVxuICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1sZyBtZDp0ZXh0LXhsIGxnOnRleHQtMnhsIHRleHQtd2hpdGUvOTBcIj5cbiAgICAgICAgICAgIHtsb2NhdGlvbi5jaXR5fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIFN0YXRzIEdyaWQgLSBNb2JpbGUgT3B0aW1pemVkLCBEZXNrdG9wIDMtQ29sdW1uICovfVxuICAgICAgICB7KGNlbnRlckRhdGEudmVybWlldGJhcmVGbGFlY2hlIHx8IGNlbnRlckRhdGEuYW56YWhsU2hvcHMgfHwgY2VudGVyRGF0YS52ZXJrYXVmc2ViZW5lbikgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBtZDptYi02IGxnOm1iLThcIj5cbiAgICAgICAgICAgIHsvKiBNb2JpbGUgTGF5b3V0OiBWZXJtaWV0YmFyZSBGbMOkY2hlIGZ1bGwgd2lkdGgsIG90aGVycyBzaWRlIGJ5IHNpZGUgKi99XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJsb2NrIG1kOmhpZGRlbiBzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgey8qIFZlcm1pZXRiYXJlIEZsw6RjaGUgLSBGdWxsIFdpZHRoIG9uIE1vYmlsZSAqL31cbiAgICAgICAgICAgICAge2NlbnRlckRhdGEudmVybWlldGJhcmVGbGFlY2hlICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlLzEwIGJhY2tkcm9wLWJsdXItc20gcm91bmRlZC1sZyBwLTQgdGV4dC1jZW50ZXIgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPEJ1aWxkaW5nMiBjbGFzc05hbWU9XCJ3LTYgaC02IHRleHQtd2hpdGUgbXgtYXV0byBtYi0yXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LWJvbGQgdGV4dC13aGl0ZSBtYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgIHtmb3JtYXRNaWV0ZmxhZWNoZShjZW50ZXJEYXRhLnZlcm1pZXRiYXJlRmxhZWNoZSl9bcKyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXdoaXRlLzgwIGxlYWRpbmctdGlnaHRcIj5WZXJtaWV0YmFyZSBGbMOkY2hlPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgey8qIE1pZXRmbMOkY2hlbiAmIFZlcmthdWZzZWJlbmVuIC0gU2lkZSBieSBTaWRlIG9uIE1vYmlsZSAqL31cbiAgICAgICAgICAgICAgeyhjZW50ZXJEYXRhLmFuemFobFNob3BzIHx8IGNlbnRlckRhdGEudmVya2F1ZnNlYmVuZW4pICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgIHtjZW50ZXJEYXRhLmFuemFobFNob3BzICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZS8xMCBiYWNrZHJvcC1ibHVyLXNtIHJvdW5kZWQtbGcgcC00IHRleHQtY2VudGVyIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2hvcHBpbmdCYWcgY2xhc3NOYW1lPVwidy02IGgtNiB0ZXh0LXdoaXRlIG14LWF1dG8gbWItMlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIG1iLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjZW50ZXJEYXRhLmFuemFobFNob3BzfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXdoaXRlLzgwXCI+TWlldGZsw6RjaGVuPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgICAge2NlbnRlckRhdGEudmVya2F1ZnNlYmVuZW4gJiYgKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlLzEwIGJhY2tkcm9wLWJsdXItc20gcm91bmRlZC1sZyBwLTQgdGV4dC1jZW50ZXIgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxMYXllcnMgY2xhc3NOYW1lPVwidy02IGgtNiB0ZXh0LXdoaXRlIG14LWF1dG8gbWItMlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIG1iLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgI
25114HtjZW50ZXJEYXRhLnZlcmthdWZzZWJlbmVufVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXdoaXRlLzgwXCI+VmVya2F1ZnNlYmVuZW48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBEZXNrdG9wIExheW91dDogQWxsIDMgaW4gb25lIHJvdyAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLTMgbWQ6Z2FwLTQgbGc6Z2FwLTYgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICAgIHtjZW50ZXJEYXRhLnZlcm1pZXRiYXJlRmxhZWNoZSAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZS8xMCBiYWNrZHJvcC1ibHVyLXNtIHJvdW5kZWQtbGcgcC01IGxnOnAtNiB0ZXh0LWNlbnRlciBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxCdWlsZGluZzIgY2xhc3NOYW1lPVwidy04IGgtOCBsZzp3LTEwIGxnOmgtMTAgdGV4dC13aGl0ZSBteC1hdXRvIG1iLTMgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtMnhsIGxnOnRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIG1iLTEgYnJlYWstd29yZHNcIj5cbiAgICAgICAgICAgICAgICAgICAge2Zvcm1hdE1pZXRmbGFlY2hlKGNlbnRlckRhdGEudmVybWlldGJhcmVGbGFlY2hlKX1twrJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGxnOnRleHQtYmFzZSB0ZXh0LXdoaXRlLzgwIGxlYWRpbmctdGlnaHRcIj5WZXJtaWV0YmFyZSBGbMOkY2hlPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAge2NlbnRlckRhdGEuYW56YWhsU2hvcHMgJiYgKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2h
25114pdGUvMTAgYmFja2Ryb3AtYmx1ci1zbSByb3VuZGVkLWxnIHAtNSBsZzpwLTYgdGV4dC1jZW50ZXIgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICA8U2hvcHBpbmdCYWcgY2xhc3NOYW1lPVwidy04IGgtOCBsZzp3LTEwIGxnOmgtMTAgdGV4dC13aGl0ZSBteC1hdXRvIG1iLTMgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtMnhsIGxnOnRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIG1iLTEgYnJlYWstd29yZHNcIj5cbiAgICAgICAgICAgICAgICAgICAge2NlbnRlckRhdGEuYW56YWhsU2hvcHN9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBsZzp0ZXh0LWJhc2UgdGV4dC13aGl0ZS84MFwiPk1pZXRmbMOkY2hlbjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgIHtjZW50ZXJEYXRhLnZlcmthdWZzZWJlbmVuICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlLzEwIGJhY2tkcm9wLWJsdXItc20gcm91bmRlZC1sZyBwLTUgbGc6cC02IHRleHQtY2VudGVyIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPExheWVycyBjbGFzc05hbWU9XCJ3LTggaC04IGxnOnctMTAgbGc6aC0xMCB0ZXh0LXdoaXRlIG14LWF1dG8gbWItMyBmbGV4LXNocmluay0wXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC0yeGwgbGc6dGV4dC0zeGwgZm9udC1ib2xkIHRleHQtd2hpdGUgbWItMSBicmVhay13b3Jkc1wiPlxuICAgICAgICAgICAgICAgICAgICB7Y2VudGVyRGF0YS52ZXJrYXVmc2ViZW5lbn1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGxnOnRleHQtYmFzZSB0ZXh0LXdoaXRlLzgwXCI+VmVya2F1ZnNlYmVuZW48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHsvKiBDZW50ZXIgTGluayBCdXR0b24gLSBNb2JpbGUgT3B0aW1pemVkICovfVxuICAgICAgICB7KChsb2NhdGlvbiBhcyBhbnkpLmNlbnRlcmxpbmsgfHwgbG9jYXRpb24uY2VudGVyTGluaykgJiYgKFxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNlbnRlckxpbmtDbGlja31cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgbWQ6dy1hdXRvIHB4LTYgcHktMy41IG1kOnB5LTMgYmctbWVjLXByaW1hcnkgaG92ZXI6YmctbWVjLXByaW1hcnktZGFyayBhY3RpdmU6YmctbWVjLXByaW1hcnktZGFyayB0ZXh0LXdoaXRlIGZvbnQtc2VtaWJvbGQgcm91bmRlZC1sZyB0cmFuc2l0aW9uLWNvbG9ycyBkdXJhdGlvbi0yMDAgbWluLWgtWzQ4cHhdIHRleHQtYmFzZSBtZDp0ZXh0LWJhc2VcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuPlp1bSBDZW50ZXI8L3NwYW4+XG4gICAgICAgICAgICA8RXh0ZXJuYWxMaW5rIGNsYXNzTmFtZT1cInctNSBoLTUgbWQ6dy00IG1kOmgtNCBtbC0yXCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IE1hcFBpbiwgTWFpbCwgUGhvbmUsIEdsb2JlLCBDaGV2cm9uRG93biwgQ2hldnJvblVwIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICcuLi8uLi90eXBlcydcblxuaW50ZXJmYWNlIExvY2F0aW9uTW9kYWxJbmZvUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb25cbn1cblxuZXhwb3J0IGNvbnN0IExvY2F0aW9uTW9kYWxJbmZvOiBSZWFjdC5GQzxMb2NhdGlvbk1vZGFsSW5mb1Byb3BzPiA9ICh7XG4gIGxvY2F0aW9uXG59KSA9PiB7XG4gIGNvbnN0IFtzaG93RnVsbERlc2NyaXB0aW9uLCBzZXRTaG93RnVsbERlc2NyaXB0aW9uXSA9IHVzZVN0YXRlKGZhbHNlKVxuXG4gIGNvbnN0IGhhbmRsZUVtYWlsQ2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKGxvY2F0aW9uLmVtYWlsKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGBtYWlsdG86JHtsb2NhdGlvbi5lbWFpbH1gXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUGhvbmVDbGljayA9ICgpID0+IHtcbiAgICBpZiAobG9jYXRpb24ucGhvbmUpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYHRlbDoke2xvY2F0aW9uLnBob25lfWBcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVXZWJzaXRlQ2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKGxvY2F0aW9uLndlYnNpdGUpIHtcbiAgICAgIHdpbmRvdy5vcGVuKGxvY2F0aW9uLndlYnNpdGUsICdfYmxhbmsnLCAnbm9vcGVuZXIsbm9yZWZlcnJlcicpXG4gICAgfVxuICB9XG5cbiAgLy8gRGVzY3JpcHRpb24gaGFuZGxpbmdcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBsb2NhdGlvbi5kZXNjcmlwdGlvbiB8fCAnJ1xuICBjb25zdCBzaG91bGRUcnVuY2F0ZSA9IGRlc2NyaXB0aW9uLmxlbmd0aCA+IDIwMFxuICBjb25zdCBkaXNwbGF5RGVzY3JpcHRpb24gPSBzaG91bGRUcnVuY2F0ZSAmJiAhc2hvd0Z1bGxEZXNjcmlwdGlvbiBcbiAgICA/IGRlc2NyaXB0aW9uLnN1YnN0cmluZygwLCAyMDApICsgJy4uLicgXG4gICAgOiBkZXNjcmlwdGlvblxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJoLWZ1bGwgZmxleCBmbGV4LWNvbFwiPlxuICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMCBwLTYgYm9yZGVyLWIgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnlcIj5cbiAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LXRleHQtcHJpbWFyeVwiPlxuICAgICAgICAgI
25114Htsb2NhdGlvbi5uYW1lfVxuICAgICAgICA8L2gyPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWxnIHRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMVwiPlxuICAgICAgICAgIHtsb2NhdGlvbi5jaXR5fVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIFNjcm9sbGFibGUgQ29udGVudCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LXktYXV0byBwLTYgc3BhY2UteS04XCI+XG4gICAgICAgIHsvKiBBZGRyZXNzIFNlY3Rpb24gKi99XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi00IGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8TWFwUGluIGNsYXNzTmFtZT1cInctNSBoLTUgbXItMiB0ZXh0LW1lYy1wcmltYXJ5XCIgLz5cbiAgICAgICAgICAgIEFkcmVzc2VcbiAgICAgICAgICA8L2gzPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1sZyBwLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0xXCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIHRleHQtdGV4dC1wcmltYXJ5XCI+e2xvY2F0aW9uLm5hbWV9PC9wPlxuICAgICAgICAgICAgICB7bG9jYXRpb24uYWRkcmVzcyAmJiAoXG4gICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeVwiPntsb2NhdGlvbi5hZGRyZXNzfTwvcD5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgIHsoKGxvY2F0aW9uIGFzIGFueSkucG9zdGFsY29kZSB8fCBsb2NhdGlvbi5wb3N0YWxDb2RlKSAmJiBgJHsobG9jYXRpb24gYXMgYW55KS5wb3N0YWxjb2RlIHx8IGxvY2F0aW9uLnBvc3RhbENvZGV9IGB9XG4gICAgICAgICAgICAgICAge2xvY2F0aW9uLmNpdHl9XG4gICAgICAgICAgICAgICAge2xvY2F0aW9uLmNvdW50cnkgJiYgbG9jYXRpb24uY291bnRyeSAhPT0gJ0RldXRzY2hsYW5kJyAmJiBgLCAke2xvY2F0aW9uLmNvdW50cnl9YH1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBDb250YWN0IEluZm9ybWF0aW9uICovfVxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgbWItNFwiPlxuICAgICAgICAgICAgS29udGFrdFxuICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTNcIj5cbiAgICAgICAgICAgIHsvKiBFbWFpbCAtIE1vYmlsZSBPcHRpbWl6ZWQgKi99XG4gICAgICAgICAgICB7bG9jYXRpb24uZW1haWwgJiYgKFxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlRW1haWxDbGlja31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTMgdy1mdWxsIHRleHQtbGVmdCBwLTMgcm91bmRlZC1sZyBob3ZlcjpiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSBhY3RpdmU6YmctYmFja2dyb3VuZC10ZXJ0aWFyeSB0cmFuc2l0aW9uLWNvbG9ycyBtaW4taC1bNjBweF1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LTEyIGgtMTIgYmctbWVjLXByaW1hcnkvMTAgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgICAgICAgIDxNYWlsIGNsYXNzTmFtZT1cInctNiBoLTYgdGV4dC1tZWMtcHJpbWFyeVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXRleHQtbXV0ZWQgbWItMC41XCI+RS1NYWlsPC9wPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1tZWMtcHJpbWFyeSBmb250LW1lZGl1bSB0cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7bG9jYXRpb24uZW1haWx9XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgey8qIFBob25lIC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAgICAgIHtsb2NhdGlvbi5waG9uZSAmJiAoXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVQaG9uZUNsaWNrfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMyB3LWZ1bGwgdGV4dC1sZWZ0IHAtMyByb3VuZGVkLWxnIGhvdmVyOmJnLWJhY2tncm91bmQtc2Vjb25kYXJ5IGFjdGl2ZTpiZy1iYWNrZ3JvdW5kLXRlcnRpYXJ5IHRyYW5zaXRpb24tY29sb3JzIG1pbi1oLVs2MHB4XVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTIgaC0xMiBiZy1tZWMtcHJpbWFyeS8xMCByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAgICAgICAgPFBob25lIGNsYXNzTmFtZT1cInctNiBoLTYgdGV4dC1tZWMtcHJpbWFyeVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXRleHQtbXV0ZWQgbWItMC41XCI+VGVsZWZvbjwvcD5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtbWVjLXByaW1hcnkgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgICAge2xvY2F0aW9uLnBob25lfVxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgI
25114HsvKiBXZWJzaXRlIC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAgICAgIHtsb2NhdGlvbi53ZWJzaXRlICYmIChcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVdlYnNpdGVDbGlja31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTMgdy1mdWxsIHRleHQtbGVmdCBwLTMgcm91bmRlZC1sZyBob3ZlcjpiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSBhY3RpdmU6YmctYmFja2dyb3VuZC10ZXJ0aWFyeSB0cmFuc2l0aW9uLWNvbG9ycyBtaW4taC1bNjBweF1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LTEyIGgtMTIgYmctbWVjLXByaW1hcnkvMTAgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgICAgICAgIDxHbG9iZSBjbGFzc05hbWU9XCJ3LTYgaC02IHRleHQtbWVjLXByaW1hcnlcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC10ZXh0LW11dGVkIG1iLTAuNVwiPldlYnNpdGU8L3A+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LW1lYy1wcmltYXJ5IGZvbnQtbWVkaXVtIHRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIHtsb2NhdGlvbi53ZWJzaXRlLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgJycpfVxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBEZXNjcmlwdGlvbiAqL31cbiAgICAgICAge2Rlc2NyaXB0aW9uICYmIChcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi00XCI+XG4gICAgICAgICAgICAgIEJlc2NocmVpYnVuZ1xuICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1sZyBwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXRleHQtc2Vjb25kYXJ5IGxlYWRpbmctcmVsYXhlZFwiXG4gICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiBkaXNwbGF5RGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIHtzaG91bGRUcnVuY2F0ZSAmJiAoXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2hvd0Z1bGxEZXNjcmlwdGlvbighc2hvd0Z1bGxEZXNjcmlwdGlvbil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtdC0zIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LW1lYy1wcmltYXJ5IGhvdmVyOnRleHQtbWVjLXByaW1hcnktZGFyayBmb250LW1lZGl1bSB0ZXh0LXNtIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7c2hvd0Z1bGxEZXNjcmlwdGlvbiA/IChcbiAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5XZW5pZ2VyIGFuemVpZ2VuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxDaGV2cm9uVXAgY2xhc3NOYW1lPVwidy00IGgtNCBtbC0xXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk1laHIgYW56ZWlnZW48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPENoZXZyb25Eb3duIGNsYXNzTmFtZT1cInctNCBoLTQgbWwtMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHsvKiBBZGRpdGlvbmFsIEluZm8gKi99XG4gICAgICAgIHsoKGxvY2F0aW9uIGFzIGFueSkub3BlbmluZ2RhdGUgfHwgbG9jYXRpb24ub3BlbmluZ0RhdGUgfHwgKGxvY2F0aW9uIGFzIGFueSkucGFya2luZ3NwYWNlcyB8fCBsb2NhdGlvbi5wYXJraW5nU3BhY2VzKSAmJiAoXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgbWItNFwiPlxuICAgICAgICAgICAgICBXZWl0ZXJlIEluZm9ybWF0aW9uZW5cbiAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWJhY2tncm91bmQtc2Vjb25kYXJ5IHJvdW5kZWQtbGcgcC00IHNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICB7KChsb2NhdGlvbiBhcyBhbnkpLm9wZW5pbmdkYXRlIHx8IGxvY2F0aW9uLm9wZW5pbmdEYXRlKSAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC10ZXh0LW11dGVkXCI+RXLDtmZmbnVuZzwvcD5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIHRleHQtdGV4dC1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIHtuZXcgRGF0ZSgobG9jYXRpb24gYXMgYW55KS5vcGVuaW5nZGF0ZSB8fCBsb2NhdGlvbi5vcGVuaW5nRGF0ZSkuZ2V0RnVsbFllYXIoKX1cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICB7KChsb2NhdGlvbiBhcyBhbnkpLnBhcmtpbmdzcGFjZXMgfHwgbG9jYXRpb24ucGFya2luZ1NwYWNlcykgJiYgKFxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1tdXRlZFwiPlBhcmtwbMOkdHplPC9wPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwiZm9udC1tZWRpdW0gdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgeyhsb2NhdGlvbiBhcyBhbnkpLnBhcmtpbmdzcGFjZXMgfHwgbG9jYXRpb24ucGFya2luZ1NwYWNlc31cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7
25114IE1hcFBpbiwgVXNlcnMgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5pbXBvcnQgeyBMb2NhdGlvbiwgQ29udGFjdCB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuaW1wb3J0IHsgQ29udGFjdENhcmQgfSBmcm9tICcuLi9Db250YWN0L0NvbnRhY3RDYXJkJ1xuaW1wb3J0IHsgdXNlQ29udGFjdE1vZGFsIH0gZnJvbSAnQHN0b3Jlcy91c2VBcHBTdG9yZSdcblxuaW50ZXJmYWNlIExvY2F0aW9uTW9kYWxDb250YWN0c1Byb3BzIHtcbiAgbG9jYXRpb246IExvY2F0aW9uXG4gIGNvbnRhY3RzOiBDb250YWN0W11cbiAgaXNMb2FkaW5nOiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCBMb2NhdGlvbk1vZGFsQ29udGFjdHM6IFJlYWN0LkZDPExvY2F0aW9uTW9kYWxDb250YWN0c1Byb3BzPiA9ICh7XG4gIGxvY2F0aW9uLFxuICBjb250YWN0cyxcbiAgaXNMb2FkaW5nXG59KSA9PiB7XG4gIGNvbnN0IHsgb3Blbjogb3BlbkNvbnRhY3RNb2RhbCB9ID0gdXNlQ29udGFjdE1vZGFsKClcbiAgLy8gU2hvdyBBTEwgbG9jYXRpb24tc3BlY2lmaWMgY29udGFjdHMgKGluY2x1ZGluZyBtYW5hZ2VtZW50KVxuICBjb25zdCBsb2NhdGlvbkNvbnRhY3RzID0gY29udGFjdHMuZmlsdGVyKGNvbnRhY3QgPT4ge1xuICAgIGNvbnN0IGhhc0xvY2F0aW9uSWQgPSBjb250YWN0LmxvY2F0aW9uSWQgPT09IGxvY2F0aW9uLmlkXG4gICAgcmV0dXJuIGhhc0xvY2F0aW9uSWRcbiAgfSlcblxuICBpZiAoaXNMb2FkaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1mdWxsIGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LXNocmluay0wIHAtNiBib3JkZXItYiBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeVwiPlxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgIEFuc3ByZWNocGFydG5lclxuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1sZyB0ZXh0LXRleHQtc2Vjb25kYXJ5IG10LTFcIj5cbiAgICAgICAgICAgIHtsb2NhdGlvbi5uYW1lfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIExvYWRpbmcgU3RhdGUgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhbmltYXRlLXNwaW4gcm91bmRlZC1mdWxsIGgtMTIgdy0xMiBib3JkZXItYi0yIGJvcmRlci1tZWMtcHJpbWFyeSBteC1hdXRvIG1iLTRcIj48L2Rpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1tdXRlZFwiPkxhZGUgQW5zcHJlY2hwYXJ0bmVyLi4uPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJoLWZ1bGwgZmxleCBmbGV4LWNvbFwiPlxuICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMCBwLTYgYm9yZGVyLWIgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnlcIj5cbiAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LXRleHQtcHJpbWFyeVwiPlxuICAgICAgICAgIEtvbnRha3RlICh7bG9jYXRpb25Db250YWN0cy5sZW5ndGh9KVxuICAgICAgICA8L2gyPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWxnIHRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMVwiPlxuICAgICAgICAgIHtsb2NhdGlvbi5uYW1lfVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIENvbnRlbnQgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAge2xvY2F0aW9uQ29udGFjdHMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNCBtZDpwLTZcIj5cbiAgICAgICAgICAgIHsvKiBTZWN0aW9uIEhlYWRlciAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBtZDptYi02XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgbWItMiBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy01IGgtNSBtci0yIHRleHQtbWVjLXByaW1hcnlcIiAvPlxuICAgICAgICAgICAgICAgIElociBBbnNwcmVjaHBhcnRuZXJcbiAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICB7bG9jYXRpb25Db250YWN0cy5sZW5ndGh9IEFuc3ByZWNocGFydG5lciBhbiBkaWVzZW0gU3RhbmRvcnRcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBDb250YWN0cyBHcmlkIC0gTW9iaWxlLUZpcnN0ICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zIGdhcC0zIG1kOmdhcC00IGl0ZW1zLXN0cmV0Y2hcIj5cbiAgICAgICAgICAgICAge2xvY2F0aW9uQ29udGFjdHMubWFwKChjb250YWN0KSA9PiAoXG4gICAgICAgICAgICAgICAgPENvbnRhY3RDYXJkXG4gICAgICAgICAgICAgICAgICBrZXk9e2NvbnRhY3QuaWR9XG4gICAgICAgICAgICAgICAgICBjb250YWN0PXtjb250YWN0fVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17b3BlbkNvbnRhY3RNb2RhbH1cbiAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJkZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbFwiXG4gICAgICAgICAgICAgICAgICBzaG93TG9jYXRpb249e2ZhbHNlfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgLyogRW1wdHkgU3RhdGUgKi9cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBwLTZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgbWF4LXctbWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LTE2IGgtMTYgYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG14LWF1dG8gbWItNFwiPlxuICAgICAgICAgICAgICAgIDxVc2VycyBjbGFzc05hbWU9XCJ3LTggaC04IHRleHQtdGV4dC1tdXRlZFwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IG1iLTJcIj5cbiAgICAgICAgICAgICAgICBLZWluZSBBbnNwcmVjaHBhcnRuZXIgdmVyZsO8Z2JhclxuICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXRleHQtbXV0ZWQgdGV4dC1zbSBsZWFkaW5nLXJlbGF4ZWRcIj5cbiAgICAgICAgICAgICAgICBGw7xyIGRpZXNlbiBTdGFuZG9ydCBzaW5kIGFrdHVlbGwga2VpbmUgZGlyZWt0ZW4gQW5zcHJlY2hwYXJ0bmVyIGhpbnRlcmxlZ3QuIFxuICAgICAgICAgICAgICAgIE51dHplbiBTaWUgZGllIGFsbGdlbWVpbmVuIEtvbnRha3RkYXRlbiBkZXMgU3RhbmRvcnRzLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBXaWZpT2ZmLCBSZWZyZXNoQ3cgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmludGVyZmFjZSBPZmZsaW5lRmFsbGJhY2tQcm9wcyB7XG4gIG1lc3NhZ2U/OiBzdHJpbmdcbiAgb25SZXRyeT86ICgpID0+IHZvaWRcbn1cblxuLyoqXG4gKiBPZmZsaW5lIEZhbGxiYWNrIENvbXBvbmVudFxuICogU2hvd3Mgd2hlbiBkYXRhIGlzIG5vdCBhdmFpbGFibGUgb2ZmbGluZVxuICovXG5leHBvcnQgY29uc3QgT2ZmbGluZUZhbGxiYWNrOiBSZWFjdC5GQzxPZmZsaW5lRmFsbGJhY2tQcm9wcz4gPSAoe1xuICBtZXNzYWdlID0gJ0RpZXNlIERhdGVuIHNpbmQgb2ZmbGluZSBuaWNodCB2ZXJmw7xnYmFyJyxcbiAgb25SZXRyeVxufSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcC04IHRleHQtY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTYgaC0xNiBiZy15ZWxsb3ctMTAwIHJvdW5kZWQtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtYi00XCI+XG4gICAgICAgIDxXaWZpT2ZmIGNsYXNzTmFtZT1cInctOCBoLTggdGV4dC15ZWxsb3ctNjAwXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IG1iLTJcIj5cbiAgICAgICAgT2ZmbGluZS1Nb2R1c1xuICAgICAgPC9oMz5cbiAgICAgIFxuICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeSBtYi00IG1heC13LW1kXCI+XG4gICAgICAgI
25114HttZXNzYWdlfVxuICAgICAgPC9wPlxuXG4gICAgICB7b25SZXRyeSAmJiAoXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBvbkNsaWNrPXtvblJldHJ5fVxuICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMiBweC00IHB5LTIgYmctbWVjLXByaW1hcnkgdGV4dC13aGl0ZSByb3VuZGVkLWxnIGhvdmVyOmJnLW1lYy1wcmltYXJ5LWRhcmsgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICA+XG4gICAgICAgICAgPFJlZnJlc2hDdyBjbGFzc05hbWU9XCJ3LTQgaC00XCIgLz5cbiAgICAgICAgICA8c3Bhbj5Fcm5ldXQgdmVyc3VjaGVuPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICl9XG5cbiAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC10ZXh0LW11dGVkIG10LTRcIj5cbiAgICAgICAgw5ZmZm5lbiBTaWUgZGllc2UgU2VpdGUgb25saW5lLCB1bSBkaWUgRGF0ZW4genUgbGFkZW5cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4vKipcbiAqIENvbXBhY3QgT2ZmbGluZSBNZXNzYWdlXG4gKiBGb3IgaW5saW5lIHVzZSBpbiBsaXN0c1xuICovXG5leHBvcnQgY29uc3QgT2ZmbGluZU1lc3NhZ2U6IFJlYWN0LkZDPHsgbWVzc2FnZT86IHN0cmluZyB9PiA9ICh7IFxuICBtZXNzYWdlID0gJ09mZmxpbmUgbmljaHQgdmVyZsO8Z2JhcicgXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgcC0zIGJnLXllbGxvdy01MCBib3JkZXIgYm9yZGVyLXllbGxvdy0yMDAgcm91bmRlZC1sZyB0ZXh0LXNtXCI+XG4gICAgICA8V2lmaU9mZiBjbGFzc05hbWU9XCJ3LTQgaC00IHRleHQteWVsbG93LTYwMCBmbGV4LXNocmluay0wXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteWVsbG93LTgwMFwiPnttZXNzYWdlfTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgWCwgQnVpbGRpbmcyLCBVc2VycywgSG9tZSwgQ2hldnJvbkxlZnQgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5pbXBvcnQgeyBNb2RhbCB9IGZyb20gJy4uL1VJL01vZGFsJ1xuaW1wb3J0IHsgdXNlTG9jYXRpb24gfSBmcm9tICcuLi8uLi9ob29rcy91c2VMb2NhdGlvbnMnXG5pbXBvcnQgeyB1c2VGaWx0ZXJlZENvbnRhY3RzIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlQ29udGFjdHMnXG5pbXBvcnQgeyB1c2VMb2NhdGlvbk1vZGFsIH0gZnJvbSAnLi4vLi4vc3RvcmVzL3VzZUFwcFN0b3JlJ1xuaW1wb3J0IHsgTG9jYXRpb25Nb2RhbEhlcm8gfSBmcm9tICcuL0xvY2F0aW9uTW9kYWxIZXJvJ1xuaW1wb3J0IHsgTG9jYXRpb25Nb2RhbEluZm8gfSBmcm9tICcuL0xvY2F0aW9uTW9kYWxJbmZvJ1xuaW1wb3J0IHsgTG9jYXRpb25Nb2RhbENvbnRhY3RzIH0gZnJvbSAnLi9Mb2NhdGlvbk1vZGFsQ29udGFjdHMnXG5pbXBvcnQgeyBPZmZsaW5lRmFsbGJhY2sgfSBmcm9tICcuLi9VSS9PZmZsaW5lRmFsbGJhY2snXG5cbnR5cGUgVmlld1R5cGUgPSAnaGVybycgfCAnaW5mbycgfCAnY29udGFjdHMnXG5cbmV4cG9ydCBjb25zdCBMb2NhdGlvbkNvbnRhY3RNb2RhbDogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIGNvbnN0IHsgaXNPcGVuLCBsb2NhdGlvbklkLCBjbG9zZSB9ID0gdXNlTG9jYXRpb25Nb2RhbCgpXG4gIGNvbnN0IFthY3RpdmVWaWV3LCBzZXRBY3RpdmVWaWV3XSA9IHVzZVN0YXRlPFZpZXdUeXBlPignaGVybycpXG5cbiAgLy8gUmVzZXQgdmlldyB0byAnaGVybycgd2hlbiBsb2NhdGlvbklkIGNoYW5nZXMgKG5ldyBtb2RhbCBvcGVucylcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobG9jYXRpb25JZCkge1xuICAgICAgc2V0QWN0aXZlVmlldygnaGVybycpXG4gICAgfVxuICB9LCBbbG9jYXRpb25JZF0pXG5cbiAgY29uc3Qgb25DbG9zZSA9IGNsb3NlXG4gIGNvbnN0IHsgZGF0YTogbG9jYXRpb24sIGlzTG9hZGluZzogbG9jYXRpb25Mb2FkaW5nLCBlcnJvcjogbG9jYXRpb25FcnJvciB9ID0gdXNlTG9jYXRpb24obG9jYXRpb25JZClcbiAgY29uc3QgeyBjb250YWN0cywgbG9jYXRpb25TcGVjaWZpY0NvdW50LCBpc0xvYWRpbmc6IGNvbnRhY3RzTG9hZGluZyB9ID0gdXNlRmlsdGVyZWRDb250YWN0cyhsb2NhdGlvbklkIHx8IHVuZGVmaW5lZClcblxuICBpZiAoIWlzT3BlbiB8fCAhbG9jYXRpb25JZCkgcmV0dXJuIG51bGxcblxuICBjb25zdCBpc0xvYWRpbmcgPSBsb2NhdGlvbkxvYWRpbmcgfHwgY29udGFjdHNMb2FkaW5nXG4gIGNvbnN0IGhhc0Vycm9yID0gbG9jYXRpb25FcnJvciB8fCAhbG9jYXRpb25cblxuICBpZiAoaXNMb2FkaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxNb2RhbFxuICAgICAgICBpc09wZW49e2lzT3Blbn1cbiAgICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgICAgdGl0bGU9XCJMYWRlIFN0YW5kb3J0Li4uXCJcbiAgICAgICAgc2l6ZT1cImZ1bGxcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtOTZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFuaW1hdGUtc3BpbiByb3VuZGVkLWZ1bGwgaC0xMiB3LTEyIGJvcmRlci1iLTIgYm9yZGVyLW1lYy1wcmltYXJ5XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Nb2RhbD5cbiAgICApXG4gIH1cblxuICBpZiAoaGFzRXJyb3IpIHtcbiAgICAvLyBDaGVjayBpZiBpdCdzIGFuIG9mZmxpbmUgZXJyb3JcbiAgICBjb25zdCBpc09mZmxpbmVFcnJvciA9ICFuYXZpZ2F0b3Iub25MaW5lIHx8IChsb2NhdGlvbkVycm9yIGFzIGFueSk/LnN0YXR1cyA9PT0gNTAzXG5cbiAgICByZXR1cm4gKFxuICAgICAgPE1vZGFsXG4gICAgICAgIGlzT3Blbj17aXNPcGVufVxuICAgICAgICBvbkNsb3NlPXtvbkNsb3NlfVxuICAgICAgICB0aXRsZT17aXNPZmZsaW5lRXJyb3IgPyBcIk9mZmxpbmUtTW9kdXNcIiA6IFwiRmVobGVyXCJ9XG4gICAgICAgIHNpemU9XCJmdWxsXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBoLTk2XCI+XG4gICAgICAgICAge2lzT2ZmbGluZUVycm9yID8gKFxuICAgICAgICAgICAgPE9mZmxpbmVGYWxsYmFja1xuICAgICAgICAgICAgICBtZXNzYWdlPVwiRGllc2VyIFN0YW5kb3J0IHd1cmRlIG5vY2ggbmljaHQgb2ZmbGluZSBnZXNwZWljaGVydC4gw5ZmZm5lbiBTaWUgaWhuIG9ubGluZSwgdW0gZGllIERhdGVuIHp1IGNhY2hlbi5cIlxuICAgICAgICAgICAgICBvblJldHJ5PXsoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1tdXRlZCBtYi00XCI+U3RhbmRvcnQga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuLjwvcD5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xvc2V9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgU2NobGllw59lblxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Nb2RhbD5cbiAgICApXG4gIH1cblxuICAvLyBHZXQgY2VudGVyIGRhdGEgZm9yIHN0YXRzXG4gIGNvbnN0IGdldENlbnRlckRhdGEgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IEZ1bGwgbG9jYXRpb24gb2JqZWN0OicsIGxvY2F0aW9uKVxuICAgIFxuICAgIC8vIEZpcnN0IHRyeSBkYXRhYmFzZSBmaWVsZHMgKEFQSSByZXR1cm5zIGNhbWVsQ2FzZSBmaWVsZCBuYW1lcylcbiAgICBjb25zdCByZW50YWJsZUFyZWEgPSAobG9jYXRpb24gYXMgYW55KS5yZW50YWJsZUFyZWEgfHwgKGxvY2F0aW9uIGFzIGFueSkucmVudGFibGVhcmVhXG4gICAgY29uc3Qgc2hvcENvdW50ID0gKGxvY2F0aW9uIGFzIGFueSkuc2hvcENvdW50IHx8IChsb2NhdGlvbiBhcyBhbnkpLnNob3Bjb3VudFxuICAgIGNvbnN0IHNhbGVzTGV2ZWxzID0gKGxvY2F0aW9uIGFzIGFueSkuc2FsZXNMZXZlbHMgfHwgKGxvY2F0aW9uIGFzIGFueSkuc2FsZXNsZXZlbHNcbiAgICBcbiAgICBpZiAocmVudGFibGVBcmVhIHx8IHNob3BDb3VudCB8fCBzYWxlc0xldmVscykge1xuICAgICAgY29uc29sZS5sb2coJ+KchSBVc2luZyBkYXRhYmFzZSBmaWVsZHM6Jywge1xuICAgICAgICByZW50YWJsZUFyZWEsXG4gICAgICAgI
25114HNob3BDb3VudCxcbiAgICAgICAgc2FsZXNMZXZlbHNcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2ZXJtaWV0YmFyZUZsYWVjaGU6IHJlbnRhYmxlQXJlYSxcbiAgICAgICAgYW56YWhsU2hvcHM6IHNob3BDb3VudCxcbiAgICAgICAgdmVya2F1ZnNlYmVuZW46IHNhbGVzTGV2ZWxzXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gV29yZFByZXNzIEFDRiBmaWVsZHNcbiAgICBjb25zdCB3cERhdGEgPSAobG9jYXRpb24gYXMgYW55KS53cERhdGFcbiAgICBpZiAod3BEYXRhICYmIHdwRGF0YS5hY2YpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiB3cERhdGE6Jywgd3BEYXRhKVxuICAgICAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IEFDRiBmaWVsZHM6Jywgd3BEYXRhLmFjZilcbiAgICAgIFxuICAgICAgY29uc3QgYWNmID0gd3BEYXRhLmFjZlxuICAgICAgY29uc3QgY2VudGVyRGF0YSA9IHtcbiAgICAgICAgdmVybWlldGJhcmVGbGFlY2hlOiBhY2ZbJ2NlbnRlci1ncnVuZGRhdGVuLXZlcm1pZXRiYXJlLWZsYWVjaGUnXSxcbiAgICAgICAgYW56YWhsU2hvcHM6IGFjZlsnY2VudGVyLWdydW5kZGF0ZW4tYW56YWhsLXNob3BzJ10sXG4gICAgICAgIHZlcmthdWZzZWJlbmVuOiBhY2ZbJ2NlbnRlci1ncnVuZGRhdGVuLXZlcmthdWZzZWJlbmVuJ11cbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IEV4dHJhY3RlZCBjZW50ZXIgZGF0YTonLCBjZW50ZXJEYXRhKVxuICAgICAgcmV0dXJuIGNlbnRlckRhdGFcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygn4p2MIE5vIHdwRGF0YSBhbmQgbm8gZGF0YWJhc2UgZmllbGRzIGZvdW5kJylcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIGNvbnN0IGNlbnRlckRhdGEgPSBnZXRDZW50ZXJEYXRhKCkgYXMge1xuICAgIHZlcm1pZXRiYXJlRmxhZWNoZT86IG51bWJlciB8IHN0cmluZ1xuICAgIGFuemFobFNob3BzPzogbnVtYmVyIHwgc3RyaW5nICBcbiAgICB2ZXJrYXVmc2ViZW5lbj86IG51bWJlciB8IHN0cmluZ1xuICB9XG5cbiAgLy8gdXNlRmlsdGVyZWRDb250YWN0cyByZXR1cm5zIGNvbnRhY3RzIGFycmF5IGRpcmVjdGx5XG4gIGNvbnN0IGxvY2F0aW9uQ29udGFjdHMgPSBjb250YWN0cyB8fCBbXVxuXG4gIC8vIE5hdmlnYXRpb24gaXRlbXMgLSBNb2JpbGUtb3B0aW1pemVkIGxhYmVsc1xuICAvLyBTaG93IE9OTFkgbG9jYXRpb24tc3BlY2lmaWMgY29udGFjdHMgY291bnQgKG5vdCBtYW5hZ2VtZW50KVxuICBjb25zdCBuYXZpZ2F0aW9uSXRlbXMgPSBbXG4gICAge1xuICAgICAgaWQ6ICdoZXJvJyBhcyBWaWV3VHlwZSxcbiAgICAgIGxhYmVsOiAnw5xiZXJzaWNodCcsXG4gICAgICBpY29uOiBIb21lLFxuICAgICAgZGVzY3JpcHRpb246ICdIZXJvLUFuc2ljaHQgbWl0IFN0YXRzJ1xuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdpbmZvJyBhcyBWaWV3VHlwZSxcbiAgICAgIGxhYmVsOiAnSW5mbycsXG4gICAgICBpY29uOiBCdWlsZGluZzIsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FkcmVzc2UgdW5kIERldGFpbHMnXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2NvbnRhY3RzJyBhcyBWaWV3VHlwZSxcbiAgICAgIGxhYmVsOiAnS29udGFrdGUnLFxuICAgICAgaWNvbjogVXNlcnMsXG4gICAgICBjb3VudDogbG9jYXRpb25TcGVjaWZpY0NvdW50LCAvLyBVc2UgbG9jYXRpb24tc3BlY2lmaWMgY291bnQgaW5zdGVhZCBvZiB0b3RhbFxuICAgICAgZGVzY3JpcHRpb246ICdMb2thbGUgS29udGFrdGUnXG4gICAgfVxuICBdXG5cbiAgY29uc3QgY3VycmVudE5hdkl0ZW0gPSBuYXZpZ2F0aW9uSXRlbXMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGFjdGl2ZVZpZXcpXG5cbiAgcmV0dXJuIChcbiAgICA8TW9kYWxcbiAgICAgIGlzT3Blbj17aXNPcGVufVxuICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgIHRpdGxlPVwiXCJcbiAgICAgIHNpemU9XCJmdWxsXCJcbiAgICAgIGNsYXNzTmFtZT1cInAtMFwiXG4gICAgICBzaG93Q2xvc2VCdXR0b249e2ZhbHNlfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1mdWxsIGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgey8qIEN1c3RvbSBIZWFkZXIgd2l0aCBOYXZpZ2F0aW9uIC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LXNocmluay0wIGJnLXdoaXRlIGJvcmRlci1iIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5IHJlbGF0aXZlIHotMjBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBwLTQgbWluLWgtWzYwcHhdXCI+XG4gICAgICAgICAgICB7LyogQmFjayBCdXR0b24gKG9ubHkgc2hvdyB3aGVuIG5vdCBvbiBoZXJvKSAtIExhcmdlciB0b3VjaCB0YXJnZXQgKi99XG4gICAgICAgICAgICB7YWN0aXZlVmlldyAhPT0gJ2hlcm8nICYmIChcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEFjdGl2ZVZpZXcoJ2hlcm8nKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LW1lYy1wcmltYXJ5IGhvdmVyOnRleHQtbWVjLXByaW1hcnktZGFyayB0cmFuc2l0aW9uLWNvbG9ycyBwLTIgLW1sLTIgbWluLXctWzQ0cHhdIG1pbi1oLVs0NHB4XVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Q2hldnJvbkxlZnQgY2xhc3NOYW1lPVwidy02IGgtNiBtci0xXCIgLz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1lZGl1bSB0ZXh0LWJhc2VcIj5adXLDvGNrPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHsvKiBUaXRsZSAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIHRleHQtY2VudGVyIHB4LTJcIj5cbiAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtbGcgbWQ6dGV4dC14bCBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAge2N1cnJlbnROYXZJdGVtPy5sYWJlbH1cbiAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgICAge2N1cnJlbnROYXZJdGVtPy5jb3VudCAhPT0gdW5kZWZpbmVkICYmIChcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgKHtjdXJyZW50TmF2SXRlbS5jb3VudH0pXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgI
25114HsvKiBDbG9zZSBCdXR0b24gLSBMYXJnZXIgdG91Y2ggdGFyZ2V0ICovfVxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXtvbkNsb3NlfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJwLTIgaG92ZXI6YmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1mdWxsIHRyYW5zaXRpb24tY29sb3JzIG1pbi13LVs0NHB4XSBtaW4taC1bNDRweF0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2NobGllw59lblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxYIGNsYXNzTmFtZT1cInctNiBoLTZcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7LyogTmF2aWdhdGlvbiBUYWJzIChvbmx5IHNob3cgb24gaGVybyB2aWV3KSAtIE1vYmlsZSBPcHRpbWl6ZWQgKi99XG4gICAgICAgICAge2FjdGl2ZVZpZXcgPT09ICdoZXJvJyAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LTMgcGItMyBtZDpweC00IG1kOnBiLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIG1kOmdhcC0zXCI+XG4gICAgICAgICAgICAgICAge25hdmlnYXRpb25JdGVtcy5tYXAoKGl0ZW0pID0+IChcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAga2V5PXtpdGVtLmlkfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRBY3RpdmVWaWV3KGl0ZW0uaWQpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BcbiAgICAgICAgICAgICAgICAgICAgICBwLTMgbWQ6cC0zIHJvdW5kZWQtbGcgdGV4dC1jZW50ZXIgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwXG4gICAgICAgICAgICAgICAgICAgICAgbWluLWgtWzY4cHhdIG1kOm1pbi1oLVthdXRvXVxuICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZTpzY2FsZS05NSB0b3VjaC1tYW5pcHVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAke2l0ZW0uaWQgPT09IGFjdGl2ZVZpZXdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JnLW1lYy1wcmltYXJ5IHRleHQtd2hpdGUgc2hhZG93LW1kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgaG92ZXI6YmctYmFja2dyb3VuZC10ZXJ0aWFyeSB0ZXh0LXRleHQtc2Vjb25kYXJ5IGhvdmVyOnRleHQtdGV4dC1wcmltYXJ5J1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYH1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGl0ZW0uaWNvbiBjbGFzc05hbWU9XCJ3LTUgaC01IG1kOnctNSBtZDpoLTUgbXgtYXV0byBtYi0xXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gZm9udC1tZWRpdW0gbGVhZGluZy10aWdodCBweC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAge2l0ZW0ubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAge2l0ZW0uY291bnQgIT09IHVuZGVmaW5lZCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXhzIG10LTAuNVwiPih7aXRlbS5jb3VudH0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIENvbnRlbnQgQXJlYSAtIEZ1bGwgSGVpZ2h0ICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4taC0wIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgIHthY3RpdmVWaWV3ID09PSAnaGVybycgJiYgKFxuICAgICAgICAgICAgPExvY2F0aW9uTW9kYWxIZXJvXG4gICAgICAgICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgICAgICAgY2VudGVyRGF0YT17Y2VudGVyRGF0YX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHthY3RpdmVWaWV3ID09PSAnaW5mbycgJiYgKFxuICAgICAgICAgICAgPExvY2F0aW9uTW9kYWxJbmZvXG4gICAgICAgICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHthY3RpdmVWaWV3ID09PSAnY29udGFjdHMnICYmIChcbiAgICAgICAgICAgIDxMb2NhdGlvbk1vZGFsQ29udGFjdHNcbiAgICAgICAgICAgICAgbG9jYXRpb249e2xvY2F0aW9ufVxuICAgICAgICAgICAgICBjb250YWN0cz17bG9jYXRpb25Db250YWN0c31cbiAgICAgICAgICAgICAgaXNMb2FkaW5nPXtjb250YWN0c0xvYWRpbmd9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9Nb2RhbD5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTWFwUGluLCBDaGV2cm9uUmlnaHQgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmludGVyZmFjZSBMb2NhdGlvbk1pbmlDYXJkUHJvcHMge1xuICBsb2NhdGlvbjoge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBjaXR5OiBzdHJpbmdcbiAgICBhZGRyZXNzPzogc3RyaW5nXG4gICAgbG9nbz86IHN0cmluZ1xuICAgIGhlcm9JbWFnZT86IHN0cmluZ1xuICB9XG4gIG9uQ2xpY2s6ICgpID0+IHZvaWRcbn1cblxuLyoqXG4gKiBNaW5pIExvY2F0aW9uIENhcmQgZm9yIENvbnRhY3QgTW9kYWxcbiAqIE1vYmlsZS1GaXJzdCBEZXNpZ24gd2l0aCA0NHB4IG1pbmltdW0gdG91Y2ggdGFyZ2V0XG4gKi9cbmV4cG9ydCBjb25zdCBMb2NhdGlvbk1pbmlDYXJkOiBSZWFjdC5GQzxMb2NhdGlvbk1pbmlDYXJkUHJvcHM+ID0gKHsgbG9jYXRpb24sIG9uQ2xpY2sgfSkgPT4ge1xuICBjb25zdCBoYW5kbGVDbGljayA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZygn8J+PoiBMb2NhdGlvbk1pbmlDYXJkIC0gY2xpY2tlZDonLCBsb2NhdGlvbi5uYW1lLCBsb2NhdGlvbi5pZClcbiAgICBvbkNsaWNrKClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XG4gICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQgcC00IHJvdW5kZWQtbGcgdHJhbnNpdGlvbi1hbGwgaG92ZXI6Ymctd2h
25114pdGUvNzAgYWN0aXZlOmJnLXdoaXRlLzkwIG1pbi1oLVs2MHB4XVwiXG4gICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSknIH19XG4gICAgPlxuICAgICAgey8qIExvY2F0aW9uIEltYWdlL0xvZ28gLSBJbXByb3ZlZCBTaXplIGFuZCBEaXNwbGF5ICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LXNocmluay0wIHctMTYgaC0xNiBtZDp3LTIwIG1kOmgtMjAgcm91bmRlZC1sZyBvdmVyZmxvdy1oaWRkZW4gYmctd2hpdGUgc2hhZG93LXNtIGJvcmRlciBib3JkZXItZ3JheS0xMDBcIj5cbiAgICAgICAge2xvY2F0aW9uLmxvZ28gfHwgbG9jYXRpb24uaGVyb0ltYWdlID8gKFxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIHNyYz17bG9jYXRpb24ubG9nbyB8fCBsb2NhdGlvbi5oZXJvSW1hZ2V9XG4gICAgICAgICAgICBhbHQ9e2xvY2F0aW9uLm5hbWV9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb250YWluIHAtMlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIiBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICcjRTBFNkVCJyB9fT5cbiAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy04IGgtOCBtZDp3LTEwIG1kOmgtMTBcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIExvY2F0aW9uIEluZm8gLSBCZXR0ZXIgVHlwb2dyYXBoeSAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTAgdGV4dC1sZWZ0XCI+XG4gICAgICAgIDxoNCBjbGFzc05hbWU9XCJmb250LXNlbWlib2xkIHRleHQtYmFzZSBtZDp0ZXh0LWxnIHRydW5jYXRlIG1iLTFcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PlxuICAgICAgICAgIHtsb2NhdGlvbi5uYW1lfVxuICAgICAgICA8L2g0PlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtYmFzZSB0cnVuY2F0ZVwiIHN0eWxlPXt7IGNvbG9yOiAnIzZiNzI4MCcgfX0+XG4gICAgICAgICAge2xvY2F0aW9uLmNpdHl9XG4gICAgICAgICAge2xvY2F0aW9uLmFkZHJlc3MgJiYgYCDigKIgJHtsb2NhdGlvbi5hZGRyZXNzfWB9XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogQXJyb3cgSWNvbiAqL31cbiAgICAgIDxDaGV2cm9uUmlnaHQgY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMCB3LTUgaC01IG1kOnctNiBtZDpoLTZcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgPC9idXR0b24+XG4gIClcbn1cblxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTWFpbCwgUGhvbmUsIE1hcFBpbiwgVXNlciB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IHVzZUNvbnRhY3RNb2RhbCwgdXNlTG9jYXRpb25Nb2RhbCB9IGZyb20gJ0BzdG9yZXMvdXNlQXBwU3RvcmUnXG5pbXBvcnQgeyBNb2RhbCB9IGZyb20gJ0Bjb21wb25lbnRzL1VJL01vZGFsJ1xuaW1wb3J0IHsgdXNlQ29udGFjdExvY2F0aW9ucyB9IGZyb20gJ0Bob29rcy91c2VDb250YWN0cydcbmltcG9ydCB7IExvY2F0aW9uTWluaUNhcmQgfSBmcm9tICdAY29tcG9uZW50cy9Mb2NhdGlvbi9Mb2NhdGlvbk1pbmlDYXJkJ1xuXG5cbmV4cG9ydCBjb25zdCBDb250YWN0TW9kYWw6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCB7IGlzT3BlbiwgY29udGFjdCwgY2xvc2UgfSA9IHVzZUNvbnRhY3RNb2RhbCgpXG4gIGNvbnN0IHsgb3Blbjogb3BlbkxvY2F0aW9uTW9kYWwgfSA9IHVzZUxvY2F0aW9uTW9kYWwoKVxuXG4gIC8vIEZldGNoIGFsbCBsb2NhdGlvbnMgZm9yIHRoaXMgY29udGFjdFxuICBjb25zdCB7IGRhdGE6IGNvbnRhY3RMb2NhdGlvbnMsIGlzTG9hZGluZzogbG9jYXRpb25zTG9hZGluZywgZXJyb3I6IGxvY2F0aW9uc0Vycm9yIH0gPSB1c2VDb250YWN0TG9jYXRpb25zKGNvbnRhY3Q/LmlkIHx8IG51bGwpXG5cbiAgLy8gRGVidWcgbG9nZ2luZ1xuICBjb25zb2xlLmxvZygn8J+UjSBDb250YWN0TW9kYWwgLSBjb250YWN0OicsIGNvbnRhY3QpXG4gIGNvbnNvbGUubG9nKCfwn5SNIENvbnRhY3RNb2RhbCAtIGNvbnRhY3RMb2NhdGlvbnM6JywgY29udGFjdExvY2F0aW9ucylcbiAgY29uc29sZS5sb2coJ/CflI0gQ29udGFjdE1vZGFsIC0gbG9jYXRpb25zTG9hZGluZzonLCBsb2NhdGlvbnNMb2FkaW5nKVxuICBjb25zb2xlLmxvZygn8J+UjSBDb250YWN0TW9kYWwgLSBsb2NhdGlvbnNFcnJvcjonLCBsb2NhdGlvbnNFcnJvcilcblxuICBpZiAoIWNvbnRhY3QpIHJldHVybiBudWxsXG5cbiAgY29uc3QgaGFuZGxlRW1haWxDbGljayA9IChlPzogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgbWFpbHRvOiR7Y29udGFjdC5lbWFpbH1gXG4gIH1cblxuICBjb25zdCBoYW5kbGVQaG9uZUNsaWNrID0gKGU/OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKClcbiAgICBpZiAoY29udGFjdC5waG9uZSkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgdGVsOiR7Y29udGFjdC5waG9uZX1gXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlTG9jYXRpb25DbGljayA9IChsb2NhdGlvbklkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zb2xlLmxvZygn8J+OryBDb250YWN0TW9kYWwgLSBoYW5kbGVMb2NhdGlvbkNsaWNrIGNhbGxlZCB3aXRoOicsIGxvY2F0aW9uSWQpXG4gICAgY29uc29sZS5sb2coJ/CflIQgQ29udGFjdE1vZGFsIC0gY2xvc2luZyBjb250YWN0IG1vZGFsLi4uJylcbiAgICBjbG9zZSgpIC8vIENsb3NlIGNvbnRhY3QgbW9kYWwgZmlyc3RcbiAgICBjb25zb2xlLmxvZygn8J+agCBDb250YWN0TW9kYWwgLSBvcGVuaW5nIGxvY2F0aW9uIG1vZGFsLi4uJylcbiAgICBvcGVuTG9jYXRpb25Nb2RhbChsb2NhdGlvbklkKSAvLyBPcGVuIGxvY2F0aW9uIG1vZGFsXG4gIH1cblxuICAvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHNob3cgbXVsdGlwbGUgbG9jYXRpb25zIG9yIHNpbmdsZSBsb2NhdGlvblxuICBjb25zdCBoYXNNdWx0aXBsZUxvY2F0aW9ucyA9IGNvbnRhY3RMb2NhdGlvbnMgJiYgY29udGFjdExvY2F0aW9ucy5sZW5ndGggPiAxXG4gIGNvbnN0IGhhc1NpbmdsZUxvY2F0aW9uID0gY29udGFjdExvY2F0aW9ucyAmJiBjb250YWN0TG9jYXRpb25zLmxlbmd0aCA9PT0gMVxuXG4gIHJldHVybiAoXG4gICAgPE1vZGFsXG4gICAgICBpc09wZW49e2lzT3Blbn1cbiAgICAgIG9uQ2xvc2U9e2Nsb3NlfVxuICAgICAgdGl0bGU9XCJcIlxuICAgICAgc2l6ZT1cImxnXCJcbiAgICAgIGNsYXNzTmFtZT1cInAtMFwiXG4gICAgICBzaG93Q2xvc2VCdXR0b249e3RydWV9XG4gICAgPlxuICAgICAgey8qIE1FQyBEZXNpZ24gTGF5b3V0IC0gQ29udGVudCBpcyBub3cgc2Nyb2xsYWJsZSB2aWEgTW9kYWwgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlXCIgc3R5bGU9e3sgZm9udEZhbWlseTogJ0hlbHZldGljYSBOZXVlLCBBcmlhbCwgc2Fucy1zZXJpZicgfX0+XG4gICAgICAgI
25114HsvKiBSZWQgU3RyaXBlIC0gNXB4ICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBoLVs1cHhdXCIgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAnI2QyMDAyOCcgfX0+PC9kaXY+XG5cbiAgICAgICAgey8qIExhcmdlIEltYWdlIC0gUmVzcG9uc2l2ZSBIZWlnaHQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgdy1mdWxsIGgtWzI0cmVtXSBzbTpoLVsyNnJlbV0gbWQ6aC1bMjhyZW1dXCI+XG4gICAgICAgICAge2NvbnRhY3QuaW1hZ2UgPyAoXG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIHNyYz17Y29udGFjdC5pbWFnZX1cbiAgICAgICAgICAgICAgYWx0PXtjb250YWN0LmZ1bGxOYW1lfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgYmctZ3JheS0yMDAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPFVzZXIgY2xhc3NOYW1lPVwidy0xMiBoLTEyIG1kOnctMTYgbWQ6aC0xNiB0ZXh0LWdyYXktNDAwXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBDb250YWN0IEluZm9ybWF0aW9uIEJveCAtICNFMEU2RUIgQmFja2dyb3VuZCAtIE1vYmlsZSBPcHRpbWl6ZWQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC00IG1kOnAtNiBsZzpwLThcIiBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICcjRTBFNkVCJyB9fT5cbiAgICAgICAgICB7LyogUG9zaXRpb24gLSBNb2JpbGUgT3B0aW1pemVkICovfVxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gbWQ6dGV4dC1iYXNlIG1iLTJcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PlxuICAgICAgICAgICAge2NvbnRhY3QucG9zaXRpb259XG4gICAgICAgICAgICB7Y29udGFjdC5kZXBhcnRtZW50ICYmIGAg4oCiICR7Y29udGFjdC5kZXBhcnRtZW50fWB9XG4gICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgey8qIE5hbWUgLSBNb2JpbGUgT3B0aW1pemVkICovfVxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBtZDp0ZXh0LTN4bCBsZzp0ZXh0LTR4bCBmb250LXNlbWlib2xkIG1iLTQgbWQ6bWItNlwiIHN0eWxlPXt7IGNvbG9yOiAnIzI4MzIzYycgfX0+XG4gICAgICAgICAgICB7Y29udGFjdC5mdWxsTmFtZX1cbiAgICAgICAgICA8L2gyPlxuXG4gICAgICAgICAgey8qIFp1Z2V3aWVzZW5lIEhhbmRlbHNpbW1vYmlsaWUobikgLSBNb2JpbGUgT3B0aW1pemVkICovfVxuICAgICAgICAgIHtsb2NhdGlvbnNMb2FkaW5nID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi02IHAtNCBtZDpwLTUgcm91bmRlZC1sZ1wiIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC41KScgfX0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhbmltYXRlLXNwaW4gcm91bmRlZC1mdWxsIGgtNSB3LTUgYm9yZGVyLWItMlwiIHN0eWxlPXt7IGJvcmRlckNvbG9yOiAnI2QyMDAyOCcgfX0+PC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbVwiIHN0eWxlPXt7IGNvbG9yOiAnIzZiNzI4MCcgfX0+TGFkZSBTdGFuZG9ydGUuLi48L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IGxvY2F0aW9uc0Vycm9yID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi02IHAtNCBtZDpwLTUgcm91bmRlZC1sZ1wiIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAwLCAwLCAwLjEpJyB9fT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbVwiIHN0eWxlPXt7IGNvbG9yOiAnI2QyMDAyOCcgfX0+XG4gICAgICAgICAgICAgICAgRmVobGVyIGJlaW0gTGFkZW4gZGVyIFN0YW5kb3J0ZVxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogaGFzTXVsdGlwbGVMb2NhdGlvbnMgPyAoXG4gICAgICAgICAgICAvKiBNdWx0aXBsZSBMb2NhdGlvbnMgLSBTaG93IGFzIE1pbmkgQ2FyZHMgKi9cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgPE1hcFBpbiBjbGFzc05hbWU9XCJ3LTUgaC01IG1kOnctNiBtZDpoLTZcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZvbnQtc2VtaWJvbGQgdGV4dC1iYXNlIG1kOnRleHQtbGdcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PlxuICAgICAgICAgICAgICAgICAgWnVnZXdpZXNlbmUgU3RhbmRvcnRlICh7Y29udGFjdExvY2F0aW9ucy5sZW5ndGh9KVxuICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIHtjb250YWN0TG9jYXRpb25zLm1hcCgobG9jYXRpb24pID0+IChcbiAgICAgICAgICAgICAgICAgIDxMb2NhdGlvbk1pbmlDYXJkXG4gICAgICAgICAgICAgICAgICAgIGtleT17bG9jYXRpb24uaWR9XG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlTG9jYXRpb25DbGljayhsb2NhdGlvbi5pZCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiBoYXNTaW5nbGVMb2NhdGlvbiA/IChcbiAgICAgICAgICAgIC8qIFNpbmdsZSBMb2NhdGlvbiAtIFNob3cgYXMgYmVmb3JlICovXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTYgcC00IG1kOnAtNSByb3VuZGVkLWxnXCIgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpJyB9fT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IHNwYWNlLXgtM1wiPlxuICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy01IGgtNSBtZDp3LTYgbWQ6aC02IGZsZXgtc2hyaW5rLTAgbXQtMVwiIHN0eWxlPXt7IGNvbG9yOiAnI2QyMDAyOCcgfX0gLz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gbWItMS41IG1kOm1iLTJcIiBzdHlsZT17eyBjb2xvcjogJyM2YjcyODAnIH19PlxuICAgICAgICAgICAgICAgICAgICBadWdld2llc2VuZXIgU3RhbmRvcnRcbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJmb250LXNlbWlib2xkIG1iLTEgdGV4dC1iYXNlIG1kOnRleHQtbGdcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PlxuICAgICAgICAgICAgICAgICAgICB7Y29udGFjdExvY2F0aW9uc1swXS5uYW1lfVxuICAgICAgICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gbWQ6dGV4dC1iYXNlIG1iLTFcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PlxuICAgICAgICAgICAgICAgICAgICB7Y29udGFjdExvY2F0aW9uc1swXS5jaXR5fVxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAge2NvbnRhY3RMb2NhdGlvbnNbMF0uYWRkcmVzcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgbWQ6dGV4dC1zbVwiIHN0eWxlPXt7IGNvbG9yOiAnIzZiNzI4MCcgfX0+XG4gICAgICAgICAgICAgICAgICAgICAge2NvbnRhY3RMb2NhdGlvbnNbMF0uYWRkcmVzc31cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlTG9jYXRpb25DbGljayhjb250YWN0TG9jYXRpb25zWzBdLmlkKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMyBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBtZDp0ZXh0LWJhc2UgZm9udC1tZWRpdW0gaG92ZXI6dW5kZXJsaW5lIGFjdGl2ZTpvcGFjaXR5LTcwIG1pbi1oLVs0NHB4XSBtZDptaW4taC0wIHB5LTIgbWQ6cHktMFwiXG4gICAgICAgICAgICAgICAgICAgI
25114HN0eWxlPXt7IGNvbG9yOiAnI2QyMDAyOCcgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhbmRvcnQgYW56ZWlnZW48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy00IGgtNCBtbC0xXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiBudWxsfVxuXG4gICAgICAgICAgey8qIEZhY2hiZXJlaWNoZSAtIE1vYmlsZSBPcHRpbWl6ZWQgKi99XG4gICAgICAgICAge2NvbnRhY3Quc3BlY2lhbHRpZXMgJiYgY29udGFjdC5zcGVjaWFsdGllcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNSBtZDptYi02XCI+XG4gICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtYmFzZSBmb250LW1lZGl1bSBtYi0zXCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT5GYWNoYmVyZWljaGU8L2g0PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAge2NvbnRhY3Quc3BlY2lhbHRpZXMubWFwKChzcGVjaWFsdHksIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJweC0zIHB5LTIgdGV4dC1zbSBtZDp0ZXh0LWJhc2UgZm9udC1tZWRpdW0gcm91bmRlZC1sZ1wiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJyNkMjAwMjgnLCBjb2xvcjogJ3doaXRlJyB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7c3BlY2lhbHR5fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7LyogU3ByYWNoZW4gLSBNb2JpbGUgT3B0aW1pemVkICovfVxuICAgICAgICAgIHtjb250YWN0Lmxhbmd1YWdlcyAmJiBjb250YWN0Lmxhbmd1YWdlcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNSBtZDptYi02XCI+XG4gICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtYmFzZSBmb250LW1lZGl1bSBtYi0zXCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT5TcHJhY2hlbjwvaDQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICB7Y29udGFjdC5sYW5ndWFnZXMubWFwKChsYW5ndWFnZSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTMgcHktMiB0ZXh0LXNtIG1kOnRleHQtYmFzZSByb3VuZGVkLWxnXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAnI2EzYjJjMicsIGNvbG9yOiAnd2hpdGUnIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtsYW5ndWFnZX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAgey8qIEJpbyBTZWN0aW9uIC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAgICB7Y29udGFjdC5iaW8gJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi01IG1kOm1iLTZcIj5cbiAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cInRleHQtc20gbWQ6dGV4dC1iYXNlIGZvbnQtbWVkaXVtIG1iLTNcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PsOcYmVyIG1pY2g8L2g0PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1zbSBtZDp0ZXh0LWJhc2UgbGVhZGluZy1yZWxheGVkIHByb3NlIHByb3NlLXNtIG1heC13LW5vbmVcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAnIzI4MzIzYycgfX1cbiAgICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17eyBfX2h0bWw6IGNvbnRhY3QuYmlvIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAgey8qIEtvbnRha3RpbmZvcm1hdGlvbmVuIC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMiBtZDpzcGFjZS15LTNcIj5cbiAgICAgICAgICAgIHsvKiBUZWxlZm9uIC0gTGFyZ2VyIHRvdWNoIHRhcmdldCAqL31cbiAgICAgICAgICAgIHtjb250YWN0LnBob25lICYmIChcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVBob25lQ2xpY2t9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0zIHctZnVsbCB0ZXh0LWxlZnQgcC00IG1kOnAtNCByb3VuZGVkLWxnIGhvdmVyOmJnLXdoaXRlLzcwIGFjdGl2ZTpiZy13aGl0ZS84MCB0cmFuc2l0aW9uLWNvbG9ycyBtaW4taC1bNjRweF0gbWQ6bWluLWgtWzYwcHhdXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCknIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8UGhvbmUgY2xhc3NOYW1lPVwidy02IGgtNiBtZDp3LTUgbWQ6aC01IGZsZXgtc2hyaW5rLTBcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBtZDp0ZXh0LXhzIG1iLTFcIiBzdHlsZT17eyBjb2xvcjogJyM2YjcyODAnIH19PlRlbGVmb248L3A+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1lZGl1bSB0ZXh0LWJhc2UgbWQ6dGV4dC1iYXNlXCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT57Y29udGFjdC5waG9uZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgey8qIE1vYmlsIC0gTGFyZ2VyIHRvdWNoIHRhcmdldCAqL31cbiAgICAgICAgICAgI
25114Htjb250YWN0Lm1vYmlsZSAmJiAoXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgdGVsOiR7Y29udGFjdC5tb2JpbGV9YFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0zIHctZnVsbCB0ZXh0LWxlZnQgcC00IG1kOnAtNCByb3VuZGVkLWxnIGhvdmVyOmJnLXdoaXRlLzcwIGFjdGl2ZTpiZy13aGl0ZS84MCB0cmFuc2l0aW9uLWNvbG9ycyBtaW4taC1bNjRweF0gbWQ6bWluLWgtWzYwcHhdXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCknIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8UGhvbmUgY2xhc3NOYW1lPVwidy02IGgtNiBtZDp3LTUgbWQ6aC01IGZsZXgtc2hyaW5rLTBcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBtZDp0ZXh0LXhzIG1iLTFcIiBzdHlsZT17eyBjb2xvcjogJyM2YjcyODAnIH19Pk1vYmlsPC9wPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW0gdGV4dC1iYXNlIG1kOnRleHQtYmFzZVwiIHN0eWxlPXt7IGNvbG9yOiAnIzI4MzIzYycgfX0+e2NvbnRhY3QubW9iaWxlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7LyogRS1NYWlsIC0gTGFyZ2VyIHRvdWNoIHRhcmdldCAqL31cbiAgICAgICAgICAgIHtjb250YWN0LmVtYWlsICYmIChcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUVtYWlsQ2xpY2t9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0zIHctZnVsbCB0ZXh0LWxlZnQgcC00IG1kOnAtNCByb3VuZGVkLWxnIGhvdmVyOmJnLXdoaXRlLzcwIGFjdGl2ZTpiZy13aGl0ZS84MCB0cmFuc2l0aW9uLWNvbG9ycyBtaW4taC1bNjRweF0gbWQ6bWluLWgtWzYwcHhdXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCknIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8TWFpbCBjbGFzc05hbWU9XCJ3LTYgaC02IG1kOnctNSBtZDpoLTUgZmxleC1zaHJpbmstMFwiIHN0eWxlPXt7IGNvbG9yOiAnI2QyMDAyOCcgfX0gLz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQteHMgbWItMVwiIHN0eWxlPXt7IGNvbG9yOiAnIzZiNzI4MCcgfX0+RS1NYWlsPC9wPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW0gdGV4dC1iYXNlIG1kOnRleHQtYmFzZSB0cnVuY2F0ZSBibG9ja1wiIHN0eWxlPXt7IGNvbG9yOiAnIzI4MzIzYycgfX0+e2NvbnRhY3QuZW1haWx9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG5cblxuXG4gICAgICAgIHsvKiBTb2NpYWwgTGlua3MgQmFyIC0gI0VGRjNGNSBCYWNrZ3JvdW5kIC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAge2NvbnRhY3Quc29jaWFsTGlua3MgJiYgY29udGFjdC5zb2NpYWxMaW5rcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LTQgcHktNSBtZDpweC04IG1kOnB5LTZcIiBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICcjRUZGM0Y1JyB9fT5cbiAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtYmFzZSBmb250LW1lZGl1bSBtYi00XCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT5Tb2NpYWwgTWVkaWE8L2g0PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgZ2FwLTQgbWQ6Z2FwLTZcIj5cbiAgICAgICAgICAgICAge2NvbnRhY3Quc29jaWFsTGlua3MubWFwKChsaW5rLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzWGluZyA9IGxpbmsucGxhdGZvcm0/LnRvTG93ZXJDYXNlKCkgPT09ICd4aW5nJyB8fCBsaW5rLnVybD8uaW5jbHVkZXMoJ3hpbmcuY29tJylcbiAgICAgICAgICAgICAgICBjb25zdCBpc0xpbmtlZEluID0gbGluay5wbGF0Zm9ybT8udG9Mb3dlckNhc2UoKSA9PT0gJ2xpbmtlZGluJyB8fCBsaW5rLnVybD8uaW5jbHVkZXMoJ2xpbmtlZGluLmNvbScpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgICAgaHJlZj17bGluay51cmx9XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIGhvdmVyOm9wYWNpdHktNzAgYWN0aXZlOm9wYWNpdHktNTAgdHJhbnNpdGlvbi1vcGFjaXR5IG1pbi1oLVs0NHB4XSBweS0yXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICcjYTNiMmMyJyB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7aXNYaW5nICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzc05hbWU9XCJ3LTcgaC03IG1kOnctNiBtZDpoLTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAzODQgNTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTYyLjcgMjEwYy0xLjggMy4zLTI1LjIgNDQuNC03MC4xIDEyMy41LTQuOSA4LjMtMTAuOCAxMi41LTE3LjcgMTIuNUg5LjhjLTcuNyAwLTEyLjEtNy41LTguNS0xNC40bDY5LTEyMS4zYy4yIDAgLjItLjEgMC0uM2wtNDMuOS03NS42Yy00LjMtNy44LjMtMTQuMSA4LjUtMTQuMUgxMDBjNy4zIDAgMTMuMyA0LjEgMTggMTIuMmw0NC43IDc3LjV6TTM4Mi42IDQ2LjFsLTE0NCAyNTN2LjNMMzMwLjIgNDY2YzMuOSA3LjEuMiAxNC4xLTguNSAxNC4xaC02NS4yYy03LjYgMC0xMy42LTQtMTgtMTIuMmwtOTIuNC0xNjguNWMzLjMtNS44IDUxLjUtOTAuOCAxNDQuOC0yNTUuMiA0LjYtOC4xIDEwLjQtMTIuMiAxNy41LTEyLjJoNjUuN2M4IDAgMTIuMyA2LjcgOC41IDE0LjF6XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtc20gZm9udC1tZWRpdW1cIj5YaW5nPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICB7aXNMaW5rZWRJbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3NOYW1lPVwidy03IGgtNyBtZDp3LTYgbWQ6aC02XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgNDQ4IDUxMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwMC4yOCA0NDhINy40VjE0OC45aDkyLjg4ek01My43OSAxMDguMUMyNC4wOSAxMDguMSAwIDgzLjUgMCA1My44YTUzLjc5IDUzLjc5IDAgMCAxIDEwNy41OCAwYzAgMjkuNy0yNC4xIDU0LjMtNTMuNzkgNTQuM3pNNDQ3LjkgNDQ4aC05Mi42OFYzMDIuNGMwLTM0LjctLjctNzkuMi00OC4yOS03OS4yLTQ4LjI5IDAtNTUuNjkgMzcuNy01NS42OSA3Ni43VjQ0OGgtOTIuNzhWMTQ4LjloODkuMDh2NDAuOGgxLjNjMTIuNC0yMy41IDQyLjY5LTQ4LjMgODcuODgtNDguMyA5NCAwIDExMS4yOCA2MS45IDExMS4yOCAxNDIuM1Y0NDh6XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtc20gZm9udC1tZWRpdW1cIj5MaW5rZWRJbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgI
25114H0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAgey8qIFByb21pbmVudCBBY3Rpb24gQnV0dG9ucyAtIE1vYmlsZSBPcHRpbWl6ZWQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtNCBweS01IG1kOnB4LTggbWQ6cHktNiBiZy13aGl0ZSBib3JkZXItdFwiIHN0eWxlPXt7IGJvcmRlckNvbG9yOiAnI0UwRTZFQicgfX0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIHNtOmdyaWQtY29scy0yIGdhcC0zIG1kOmdhcC00XCI+XG4gICAgICAgICAgICB7LyogRS1NYWlsIEJ1dHRvbiAtIExhcmdlciB0b3VjaCB0YXJnZXQgKi99XG4gICAgICAgICAgICB7Y29udGFjdC5lbWFpbCAmJiAoXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVFbWFpbENsaWNrfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHNwYWNlLXgtMyBweC02IHB5LTQgbWQ6cHktNCByb3VuZGVkLWxnIGZvbnQtc2VtaWJvbGQgdGV4dC13aGl0ZSB0cmFuc2l0aW9uLWFsbCBob3ZlcjpvcGFjaXR5LTkwIGFjdGl2ZTpvcGFjaXR5LTgwIHNoYWRvdy1tZCBtaW4taC1bNTZweF0gdGV4dC1iYXNlIG1kOnRleHQtYmFzZVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAnI2QyMDAyOCcgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxNYWlsIGNsYXNzTmFtZT1cInctNSBoLTUgbWQ6dy01IG1kOmgtNVwiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+RS1NYWlsIHNlbmRlbjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7LyogQW5ydWZlbiBCdXR0b24gLSBMYXJnZXIgdG91Y2ggdGFyZ2V0ICovfVxuICAgICAgICAgICAge2NvbnRhY3QucGhvbmUgJiYgKFxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlUGhvbmVDbGlja31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzcGFjZS14LTMgcHgtNiBweS00IG1kOnB5LTQgcm91bmRlZC1sZyBmb250LXNlbWlib2xkIHRyYW5zaXRpb24tYWxsIGhvdmVyOmJnLWdyYXktMTAwIGFjdGl2ZTpiZy1ncmF5LTIwMCBzaGFkb3ctbWQgbWluLWgtWzU2cHhdIHRleHQtYmFzZSBtZDp0ZXh0LWJhc2VcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJyNFMEU2RUInLCBjb2xvcjogJyMyODMyM2MnIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8UGhvbmUgY2xhc3NOYW1lPVwidy01IGgtNSBtZDp3LTUgbWQ6aC01XCIgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj5BbnJ1ZmVuPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9Nb2RhbD5cbiAgKVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNjc3ZnJTIweG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUyMHdpZHRoPScxODAnJTIwaGVpZ2h0PSc2NS4wMzMnJTIwdmlld0JveD0nMCUyMDAlMjAxODAlMjA2NS4wMzMnJTNlJTNjZyUyMGlkPSdNRUNfTG9nbyclMjBkYXRhLW5hbWU9J01FQyUyMExvZ28nJTIwdHJhbnNmb3JtPSd0cmFuc2xhdGUoMCUyMDApJyUzZSUzY2clMjBpZD0nTUVDX0xvZ28tMiclMjBkYXRhLW5hbWU9J01FQyUyMExvZ28nJTIwdHJhbnNmb3JtPSd0cmFuc2xhdGUoMCUyMDApJyUzZSUzY3BhdGglMjBpZD0nRmlsbF8xJyUyMGRhdGEtbmFtZT0nRmlsbCUyMDEnJTIwZD0nTTAsNC45OTQsOC41NDIsOS45NTZWMFonJTIwdHJhbnNmb3JtPSd0cmFuc2xhdGUoMjQuODk1KSclMjBmaWxsPSclMjNiMzAwMjInJTNlJTNjL3BhdGglM2UlM2NwYXRoJTIwaWQ9J0ZpbGxfMiclMjBkYXRhLW5hbWU9J0ZpbGwlMjAyJyUyMGQ9J00wLDBWOS45NTZsOC4wMjMsNC42NjFWNDEuOGw5Ljg4OCw1Ljc0NFYxMC40MDZaJyUyMHRyYW5zZm9ybT0ndHJhbnNsYXRlKDMzLjQzOCknJTIwZmlsbD0nJTIzZDIwMDI4JyUzZSUzYy9wYXRoJTNlJTNjcGF0aCUyMGlkPSdGaWxsXzMnJTIwZGF0YS1uYW1lPSdGaWxsJTIwMyclMjBkPSdNMCw1LjU5Mmw5LjU3Myw1LjU1OVYwWiclMjB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgxMC42NjUlMjA3LjcxOSknJTIwZmlsbD0nJTIzYjMwMDIyJyUzZSUzYy9wYXRoJTNlJTNjcGF0aCUyMGlkPSdGaWxsXzQnJTIwZGF0YS1uYW1lPSdGaWxsJTIwNCclMjBkPSdNMTYuNTcsOS42MjIsMCwwVjExLjE1Mkw4LjY1LDE2LjE3NFY0Mi4xNjFsNy45MTgsNC42WiclMjB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgyMC4yMzYlMjA3LjcxOCknJTIwZmlsbD0nJTIzZDIwMDI4JyUzZSUzYy9wYXRoJTNlJTNjcGF0aCUyMGlkPSdGaWxsXzUnJTIwZGF0YS1uYW1lPSdGaWxsJTIwNSclMjBkPSdNMCwzNy4xMzUsMjMuOTU0LDUxLjA0VjEzLjkxMUwwLDBaJyUyMHRyYW5zZm9ybT0ndHJhbnNsYXRlKDAlMjAxMi44NzIpJyUyMGZpbGw9JyUyM2QyMDAyOCclM2UlM2MvcGF0aCUzZSUzY3BhdGglMjBpZD0nRmlsbF82JyUyMGRhdGEtbmFtZT0nRmlsbCUyMDYnJTIwZD0nTTExLjQ0LDBsOC42NDEsMjUuNTYzaC4xMDZMMjguMzYzLDBIMzkuOFYzNy4xNzRIMzIuMTkzVjEwLjgzaC0uMUwyMy4wMzMsMzcuMTc0SDE2Ljc3TDcuNzEyLDExLjA5aC0uMVYzNy4xNzRIMFYwWiclMjB0cmFuc2Zvcm09J3RyYW5zbGF0ZSg2NS44NTclMjAxMC4zNTkpJyUyMGZpbGw9JyUyMzI4MzIzYyclM2UlM2MvcGF0aCUzZSUzY3BhdGglMjBpZD0nRmlsbF83JyUyMGRhdGEtbmFtZT0nRmlsbCUyMDcnJTIwZD0nTTI3LjYzOSwwVjYuODcxSDguMTI3djcuOTY2SDI2LjAzNFYyMS4xOUg4LjEyN1YzMC4zSDI4LjA1MnY2Ljg3NEgwVjBaJyUyMHRyYW5zZm9ybT0ndHJhbnNsYXRlKDExMi44MDIlMjAxMC4zNTkpJyUyMGZpbGw9JyUyMzI4MzIzYyclM2UlM2MvcGF0aCUzZSUzY3BhdGglMjBpZD0nRmlsbF84JyUyMGRhdGEtbmFtZT0nRmlsbCUyMDgnJTIwZD0nTTI1LjMwOSwxMC44QTguMjYxLDguMjYxLDAsMCwwLDIzLjUsOC43NDZhOC40NDMsOC40NDMsMCwwLDAtNS4zMzEtMS44NzMsOS40NCw5LjQ0LDAsMCwwLTQuNjU4LDEuMDY2QTguODQ2LDguODQ2LDAsMCwwLDEwLjQsMTAuOGExMi41NzgsMTIuNTc4LDAsMCwwLTEuNzMzLDQuMDg3LDIwLjUzMywyMC41MzMsMCwwLDAtLjU0Miw0LjczOCwxOS4wNzksMTkuMDc5LDAsMCwwLC41NDIsNC41NTZBMTIuMzA2LDEyLjMwNiwwLDAsMCwxMC40LDI4LjE2NSw4LjkwNyw4LjkwNywwLDAsMCwxMy41MDcsMzFhOS40MTUsOS40MTUsMCwwLDAsNC42NTgsMS4wNjgsNy40OTIsNy40OTIsMCwwLDAsNS44Mi0yLjI5MSwxMC42MDYsMTAuNjA2LDAsMCwwLDIuNTYzLTYuMDM5aDcuODdhMTkuMTUxLDE5LjE1MSwwLDAsMS0xLjYsNi4zQTE1LjEyOSwxNS4xMjksMCwwLDEsMjkuNCwzNC44MjlhMTQuNDc4LDE0LjQ3OCwwLDAsMS00Ljk2OCwzLjAyMSwxOC4xLDE4LjEsMCwwLDEtNi4yNjMsMS4wNDEsMTguODc1LDE4Ljg3NSwwLDAsMS03LjYzNS0xLjQ4MiwxNi4zNzQsMTYuMzc0LDAsMCwxLTUuNzE3LTQuMDg4QTE4LjEsMTguMSwwLDAsMSwxLjI0LDI3LjIsMjIuNiwyMi42LDAsMCwxLDAsMTkuNjI3LDIzLjM5MSwyMy4zOTEsMCwwLDEsMS4yNCwxMS45LDE4LjU4OSwxOC41ODksMCwwLDEsNC44MTIsNS42NzQsMTYuMzQzLDE2LjM0MywwLDAsMSwxMC41MjksMS41MSwxOC41OTIsMTguNTkyLDAsMCwxLDE4LjE2NSwwYTE4LjU1LDE4LjU1LDAsMCwxLDUuNzcyLjg4NEExNS42MDgsMTUuNjA4LDAsMCwxLDI4LjgsMy40NjJhMTMuOTEzLDEzLjkxMywwLDAsMSwzLjU0Nyw0LjE5MSwxNS4xLDE1LjEsMCwwLDEsMS43NTksNS43MjZIMjYuMjM5YTYuNzYsNi43NiwwLDAsMC0uOTMtMi41NzcnJTIwdHJhbnNmb3JtPSd0cmFuc2xhdGUoMTQ0LjczOSUyMDkuNDc1KSclMjBmaWxsPSclMjMyODMyM2MnJTNlJTNjL3BhdGglM2UlM2MvZyUzZSUzYy9nJTNlJTNjL3N2ZyUzZVwiIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTWFwUGluIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IE1FQ0xvZ28gZnJvbSAnLi4vLi4vYXNzZXRzL01FQy1Mb2dvLnN2ZydcblxuaW50ZXJmYWNlIEhlYWRlclByb3BzIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBIZWFkZXI6IFJlYWN0LkZDPEhlYWRlclByb3BzPiA9ICh7IGNsYXNzTmFtZSB9KSA9PiB7XG4gIGNvbnN0IGhhbmRsZUxvZ29DbGljayA9ICgpID0+IHtcbiAgICAvLyBTY3JvbGwgdG8gdG9wIGFuZCByZXNldCB2aWV3XG4gICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSlcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHdlJ3JlIGluIGVtYmVkIG1vZGVcbiAgY29uc3QgaXNFbWJlZE1vZGUgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnZW1iZWQnKSA9PT0gJ3RydWUnXG5cbiAgcmV0dXJuIChcbiAgICA8aGVhZGVyIGNsYXNzTmFtZT17YGJnLXdoaXRlIGJvcmRlci1iIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5ICR7Y2xhc3NOYW1lIHx8ICcnfWB9PlxuICAgICAgPGRpdiBjbGFzc05hbWU9e2lzRW1iZWRNb2RlID8gJ3B4LTMgc206cHgtNCBweS0zIHNtOnB5LTQnIDogJ2Nvbn
25114RhaW5lciBteC1hdXRvIHB4LTMgc206cHgtNCBweS0zIHNtOnB5LTQnfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTJcIj5cbiAgICAgICAgICB7LyogTUVDIExvZ28gJiBUaXRsZSAtIE1vYmlsZSBPcHRpbWl6ZWQgLSBDbGlja2FibGUgKi99XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgb25DbGljaz17aGFuZGxlTG9nb0NsaWNrfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIHNtOnNwYWNlLXgtNCBtaW4tdy0wIGZsZXgtMSBob3ZlcjpvcGFjaXR5LTgwIHRyYW5zaXRpb24tb3BhY2l0eSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBzcmM9e01FQ0xvZ299XG4gICAgICAgICAgICAgIGFsdD1cIk1FQyBMb2dvXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC0xMCBzbTpoLTEyIHctYXV0byBvYmplY3QtY29udGFpbiBmbGV4LXNocmluay0wXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgZm9udEZhbWlseTogJ0hlbHZldGljYSBOZXVlLCBBcmlhbCwgc2Fucy1zZXJpZicgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTAgdGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LWJhc2Ugc206dGV4dC14bCBmb250LXNlbWlib2xkIHRydW5jYXRlXCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJywgZm9udEZhbWlseTogJ0hlbHZldGljYSBOZXVlLCBBcmlhbCwgc2Fucy1zZXJpZicgfX0+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIHNtOmlubGluZVwiPlBvcnRmb2xpbyBMZWFzaW5nIE1hbmFnZW1lbnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic206aGlkZGVuXCI+UG9ydGZvbGlvIExlYXNpbmc8L3NwYW4+XG4gICAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbSB0cnVuY2F0ZVwiIHN0eWxlPXt7IGNvbG9yOiAnIzI4MzIzYycsIGZvbnRGYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZSwgQXJpYWwsIHNhbnMtc2VyaWYnIH19PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBzbTppbmxpbmVcIj5GaW5kZW4gU2llIElocmVuIEFuc3ByZWNocGFydG5lcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzbTpoaWRkZW5cIj5BbnNwcmVjaHBhcnRuZXI8L3NwYW4+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRXh0ZXJuYWxMaW5rLCBNYWlsLCBQaG9uZSwgTWFwUGluIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5leHBvcnQgY29uc3QgRm9vdGVyOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKClcblxuICByZXR1cm4gKFxuICAgIDxmb290ZXIgY2xhc3NOYW1lPVwiYmctc2xhdGUtODAwIHRleHQtd2hpdGUgbXQtOFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXIgbXgtYXV0byBweC00IHB5LTQgbWQ6cHktNlwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTEgbWQ6Z3JpZC1jb2xzLTMgZ2FwLTQgbWQ6Z2FwLTZcIj5cbiAgICAgICAgICB7LyogQ29tcGFueSBJbmZvICYgQWRkcmVzcyAqL31cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgbWQ6dGV4dC14bCBmb250LWJvbGQgbWItMiBtZDptYi0zXCI+TUVDIE1FVFJPLUVDRSBDZW50ZXJtYW5hZ2VtZW50PC9oMz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbGF0ZS0zMDAgdGV4dC1zbSBzcGFjZS15LTFcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IHNwYWNlLXgtMlwiPlxuICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy00IGgtNCBtdC0wLjUgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+RnJpdHotVm9tZmVsZGUtU3RyYcOfZSAxODwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj40MDU0NyBEw7xzc2VsZG9yZjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIFF1aWNrIExpbmtzICovfVxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwidGV4dC1iYXNlIG1kOnRleHQtbGcgZm9udC1zZW1pYm9sZCBtYi0yIG1kOm1iLTNcIj5RdWljayBMaW5rczwvaDQ+XG4gICAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwic3BhY2UteS0xIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9tZWMtY20uY29tXCJcbiAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtc2xhdGUtMzAwIGhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBNRUMgV2Vic2l0ZVxuICAgICAgICAgICAgICAgICAgPEV4dGVybmFsTGluayBjbGFzc05hbWU9XCJ3LTMgaC0zIG1sLTFcIiAvPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9tZWMtY20uY29tL2hhbmRlbHNpbW1vYmlsaWVuLW92ZXJ2aWV3L1wiXG4gICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXNsYXRlLTMwMCBob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgSGFuZGVsc2ltbW9iaWxpZW5cbiAgICAgICAgICAgICAgICAgIDxFeHRlcm5hbExpbmsgY2xhc3NOYW1lPVwidy0zIGgtMyBtbC0xXCIgLz5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vbWVjLWNtLmNvbS91bnRlcm5laG1lbi9tYW5hZ2VtZW50LXRlYW0vXCJcbiAgICAgICAgICAgICAgICAgI
25114HRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtc2xhdGUtMzAwIGhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBNYW5hZ2VtZW50LVRlYW1cbiAgICAgICAgICAgICAgICAgIDxFeHRlcm5hbExpbmsgY2xhc3NOYW1lPVwidy0zIGgtMyBtbC0xXCIgLz5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIENvbnRhY3QgSW5mbyAqL31cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cInRleHQtYmFzZSBtZDp0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgbWItMiBtZDptYi0zXCI+S29udGFrdDwvaDQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMSB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIHRleHQtc2xhdGUtMzAwXCI+XG4gICAgICAgICAgICAgICAgPFBob25lIGNsYXNzTmFtZT1cInctNCBoLTQgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgIGhyZWY9XCJ0ZWw6KzQ5MjExMzAxNTMtMFwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICArNDkgKDApMjExIDMwMTUzLTBcbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMiB0ZXh0LXNsYXRlLTMwMFwiPlxuICAgICAgICAgICAgICAgIDxNYWlsIGNsYXNzTmFtZT1cInctNCBoLTQgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgIGhyZWY9XCJtYWlsdG86aW5mb0BtZWMtY20uY29tXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIGluZm9AbWVjLWNtLmNvbVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIEJvdHRvbSBCYXIgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9yZGVyLXQgYm9yZGVyLXNsYXRlLTcwMCBtdC00IG1kOm10LTYgcHQtMyBtZDpwdC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIG1kOmZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgdGV4dC14cyBtZDp0ZXh0LXNtXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc2xhdGUtNDAwXCI+XG4gICAgICAgICAgICAgIMKpIHtjdXJyZW50WWVhcn0gTUVDIE1FVFJPLUVDRSBDZW50ZXJtYW5hZ2VtZW50LiBBbGxlIFJlY2h0ZSB2b3JiZWhhbHRlbi5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHNwYWNlLXgtNCBtZDpzcGFjZS14LTYgbXQtMiBtZDptdC0wXCI+XG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vbWVjLWNtLmNvbS9kYXRlbnNjaHV0emVya2xhZXJ1bmdcIlxuICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1zbGF0ZS00MDAgaG92ZXI6dGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBEYXRlbnNjaHV0emVya2zDpHJ1bmdcbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIGhyZWY9XCJodHRwczovL21lYy1jbS5jb20vaW1wcmVzc3VtXCJcbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtc2xhdGUtNDAwIGhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgSW1wcmVzc3VtXG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9vdGVyPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IEZvb3RlclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY2xzeCB9IGZyb20gJ2Nsc3gnXG5cbmludGVyZmFjZSBDb250YWluZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVcbiAgc2l6ZT86ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcgfCAnZnVsbCdcbiAgcGFkZGluZz86ICdub25lJyB8ICdzbScgfCAnbWQnIHwgJ2xnJ1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIFNlY3Rpb25Qcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVcbiAgc3BhY2luZz86ICdub25lJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBGbGV4UHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG4gIGRpcmVjdGlvbj86ICdyb3cnIHwgJ2NvbCdcbiAgYWxpZ24/OiAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJyB8ICdzdHJldGNoJ1xuICBqdXN0aWZ5PzogJ3N0YXJ0JyB8ICdjZW50ZXInIHwgJ2VuZCcgfCAnYmV0d2VlbicgfCAnYXJvdW5kJyB8ICdldmVubHknXG4gIHdyYXA/OiBib29sZWFuXG4gIGdhcD86ICdub25lJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBHcmlkUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG4gIGNvbHM/OiAxIHwgMiB8IDMgfCA0IHwgNSB8IDZcbiAgZ2FwPzogJ25vbmUnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJ1xuICByZXNwb25zaXZlPzogYm9vbGVhblxuICBjbGFzc05hbWU/OiBzdHJpbmdcbn1cblxuLy8gUmV1c2FibGUgQ29udGFpbmVyIENvbXBvbmVudFxuZXhwb3J0IGNvbnN0IENvbnRhaW5lcjogUmVhY3QuRkM8Q29udGFpbmVyUHJvcHM+ID0gKHtcbiAgY2hpbGRyZW4sXG4gIHNpemUgPSAnbGcnLFxuICBwYWRkaW5nID0gJ21kJyxcbiAgY2xhc3NOYW1lXG59KSA9PiB7XG4gIGNvbnN0IHNpemVDbGFzc2VzID0ge1xuICAgIHNtOiAnbWF4LXctc20nLFxuICAgIG1kOiAnbWF4LXctMnhsJyxcbiAgICBsZzogJ21heC13LTR4bCcsXG4gICAgeGw6ICdtYXgtdy02eGwnLFxuICAgIGZ1bGw6ICdtYXgtdy1mdWxsJ1xuICB9XG5cbiAgY29uc3QgcGFkZGluZ0NsYXNzZXMgPSB7XG4gICAgbm9uZTogJycsXG4gICAgc206ICdweC0yJyxcbiAgICBtZDogJ3B4LTQnLFxuICAgIGxnOiAncHgtNidcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAnbXgtYXV0bycsXG4gICAgICBzaXplQ2xhc3Nlc1tzaXplXSxcbiAgICAgIHBhZGRpbmdDbGFzc2VzW3BhZGRpbmddLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gIClcbn1cblxuLy8gU2VjdGlvbiB3aXRoIGNvbnNpc3RlbnQgc3BhY2luZ1xuZXhwb3J0IGNvbnN0IFNlY3Rpb246IFJlYWN0LkZDPFNlY3Rpb25Qcm9wcz4gPSAoe1xuICBjaGlsZHJlbixcbiAgc3BhY2luZyA9ICdtZCcsXG4gIGNsYXNzTmFtZVxufSkgPT4ge1xuICBjb25zdCBzcGFjaW5nQ2xhc3NlcyA9IHtcbiAgICBub25lOiAnJyxcbiAgICBzbTogJ3NwYWNlLXktMicsXG4gICAgbWQ6ICdzcGFjZS15LTQnLFxuICAgIGxnOiAnc3BhY2UteS02JyxcbiAgICB4bDogJ3NwYWNlLXktOCdcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goc3BhY2luZ0NsYXNzZXNbc3BhY2luZ10sIGNsYXNzTmFtZSl9PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvZGl2PlxuICApXG59XG5cbi8vIEZsZXhpYmxlIEZsZXggQ29udGFpbmVyXG5leHBvcnQgY29uc3QgRmxleDogUmVhY3QuRkM8RmxleFByb3BzPiA9ICh7XG4gIGNoaWxkcmVuLFxuICBkaXJlY3Rpb24gPSAncm93JyxcbiAgYWxpZ24gPSAnc3RhcnQnLFxuICBqdXN0aWZ5ID0gJ3N0YXJ0JyxcbiAgd3JhcCA9IGZhbHNlLFxuICBnYXAgPSAnbWQnLFxuICBjbGFzc05hbWVcbn0pID0+IHtcbiAgY29uc3QgZGlyZWN0aW9uQ2xhc3NlcyA9IHtcbiAgICByb3c6ICdmbGV4LXJvdycsXG4gICAgY29sOiAnZmxleC1jb2wnXG4gIH1cblxuICBjb25zdCBhbGlnbkNsYXNzZXMgPSB7XG4gICAgc3RhcnQ6ICdpdGVtcy1zdGFydCcsXG4gICAgY2VudGVyOiAnaXRlbXMtY2VudGVyJyxcbiAgICBlbmQ6ICdpdGVtcy1lbmQnLFxuICAgIHN0cmV0Y2g6ICdpdGVtcy1zdHJldGNoJ1xuICB9XG5cbiAgY29uc3QganVzdGlmeUNsYXNzZXMgPSB7XG4gICAgc3RhcnQ6ICdqdXN0aWZ5LXN0YXJ0JyxcbiAgICBjZW50ZXI6ICdqdXN0aWZ5LWNlbnRlcicsXG4gICAgZW5kOiAnanVzdGlmeS1lbmQnLFxuICAgIGJldHdlZW46ICdqdXN0aWZ5LWJldHdlZW4nLFxuICAgIGFyb3VuZDogJ2p1c3RpZnktYXJvdW5kJyxcbiAgICBldmVubHk6ICdqdXN0aWZ5LWV2ZW5seSdcbiAgfVxuXG4gIGNvbnN0IGdhcENsYXNzZXMgPSB7XG4gICAgbm9uZTogJycsXG4gICAgc206ICdnYXAtMicsXG4gICAgbWQ6ICdnYXAtNCcsXG4gICAgbGc6ICdnYXAtNicsXG4gICAgeGw6ICdnYXAtOCdcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAnZmxleCcsXG4gICAgICBkaXJlY3Rpb25DbGFzc2VzW2RpcmVjdGlvbl0sXG4gICAgICBhbGlnbkNsYXNzZXNbYWxpZ25dLFxuICAgICAganVzdGlmeUNsYXNzZXNbanVzdGlmeV0sXG4gICAgICB3cmFwICYmICdmbGV4LXdyYXAnLFxuICAgICAgZ2FwQ2xhc3Nlc1tnYXBdLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gIClcbn1cblxuLy8gUmVzcG9uc2l2ZSBHcmlkIENvbnRhaW5lclxuZXhwb3J0IGNvbnN0IEdyaWQ6IFJlYWN0LkZDPEdyaWRQcm9wcz4gPSAoe1xuICBjaGlsZHJlbixcbiAgY29scyA9IDEsXG4gIGdhcCA9ICdtZCcsXG4gIHJlc3BvbnNpdmUgPSB0cnVlLFxuICBjbGFzc05hbWVcbn0pID0+IHtcbiAgY29uc3QgZ2FwQ2xhc3NlcyA9IHtcbiAgICBub25lOiAnJyxcbiAgICBzbTogJ2dhcC0yJyxcbiAgICBtZDogJ2dhcC00JyxcbiAgICBsZzogJ2dhcC02JyxcbiAgICB4bDogJ2dhcC04J1xuICB9XG5cbiAgY29uc3QgZ2V0R3JpZENvbHMgPSAoKSA9PiB7XG4gICAgaWYgKCFyZXNwb25zaXZlKSB7XG4gICAgICByZXR1cm4gYGdyaWQtY29scy0ke2NvbHN9YFxuICAgIH1cblxuICAgIC8vIFJlc3BvbnNpdmUgZ3JpZCBjbGFzc2VzXG4gICAgc3dpdGNoIChjb2xzKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgI
25114HJldHVybiAnZ3JpZC1jb2xzLTEnXG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTInXG4gICAgICBjYXNlIDM6XG4gICAgICAgIHJldHVybiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMnXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMgeGw6Z3JpZC1jb2xzLTQnXG4gICAgICBjYXNlIDU6XG4gICAgICAgIHJldHVybiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMgeGw6Z3JpZC1jb2xzLTUnXG4gICAgICBjYXNlIDY6XG4gICAgICAgIHJldHVybiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMgeGw6Z3JpZC1jb2xzLTYnXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2dyaWQtY29scy0xJ1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAnZ3JpZCcsXG4gICAgICBnZXRHcmlkQ29scygpLFxuICAgICAgZ2FwQ2xhc3Nlc1tnYXBdLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gIClcbn1cblxuLy8gQ2FyZCBDb250YWluZXIgd2l0aCBjb25zaXN0ZW50IHN0eWxpbmdcbmludGVyZmFjZSBDYXJkQ29udGFpbmVyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnZWxldmF0ZWQnIHwgJ291dGxpbmVkJ1xuICBwYWRkaW5nPzogJ25vbmUnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBvbkNsaWNrPzogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgQ2FyZENvbnRhaW5lcjogUmVhY3QuRkM8Q2FyZENvbnRhaW5lclByb3BzPiA9ICh7XG4gIGNoaWxkcmVuLFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICBwYWRkaW5nID0gJ21kJyxcbiAgY2xhc3NOYW1lLFxuICBvbkNsaWNrXG59KSA9PiB7XG4gIGNvbnN0IHZhcmlhbnRDbGFzc2VzID0ge1xuICAgIGRlZmF1bHQ6ICdiZy13aGl0ZSByb3VuZGVkLW1lYy1sZyBzaGFkb3ctY2FyZCBib3JkZXIgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnknLFxuICAgIGVsZXZhdGVkOiAnYmctd2hpdGUgcm91bmRlZC1tZWMtbGcgc2hhZG93LWNhcmQtaG92ZXInLFxuICAgIG91dGxpbmVkOiAnYmctd2hpdGUgcm91bmRlZC1tZWMtbGcgYm9yZGVyLTIgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnknXG4gIH1cblxuICBjb25zdCBwYWRkaW5nQ2xhc3NlcyA9IHtcbiAgICBub25lOiAnJyxcbiAgICBzbTogJ3AtMycsXG4gICAgbWQ6ICdwLTQnLFxuICAgIGxnOiAncC02J1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgIHZhcmlhbnRDbGFzc2VzW3ZhcmlhbnRdLFxuICAgICAgICBwYWRkaW5nQ2xhc3Nlc1twYWRkaW5nXSxcbiAgICAgICAgb25DbGljayAmJiAnY3Vyc29yLXBvaW50ZXIgaG92ZXI6c2hhZG93LWNhcmQtaG92ZXIgdHJhbnNpdGlvbi1zaGFkb3cgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgJ292ZXJmbG93LWhpZGRlbicsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvZGl2PlxuICApXG59XG5cbi8vIFBhZ2UgTGF5b3V0IHdpdGggY29uc2lzdGVudCBzdHJ1Y3R1cmVcbmludGVyZmFjZSBQYWdlTGF5b3V0UHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG4gIHRpdGxlPzogc3RyaW5nXG4gIHN1YnRpdGxlPzogc3RyaW5nXG4gIGFjdGlvbnM/OiBSZWFjdC5SZWFjdE5vZGVcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBQYWdlTGF5b3V0OiBSZWFjdC5GQzxQYWdlTGF5b3V0UHJvcHM+ID0gKHtcbiAgY2hpbGRyZW4sXG4gIHRpdGxlLFxuICBzdWJ0aXRsZSxcbiAgYWN0aW9ucyxcbiAgY2xhc3NOYW1lXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ3NwYWNlLXktNicsIGNsYXNzTmFtZSl9PlxuICAgICAgeyh0aXRsZSB8fCBzdWJ0aXRsZSB8fCBhY3Rpb25zKSAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBzbTpmbGV4LXJvdyBnYXAtNCBpdGVtcy1zdGFydCBzbTppdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIHt0aXRsZSAmJiAoXG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtzdWJ0aXRsZSAmJiAoXG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMVwiPlxuICAgICAgICAgICAgICAgIHtzdWJ0aXRsZX1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7YWN0aW9ucyAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSB3LWZ1bGwgc206ZmxleC1zaHJpbmstMCBzbTp3LWF1dG9cIj5cbiAgICAgICAgICAgICAge2FjdGlvbnN9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBXaWZpT2ZmLCBXaWZpIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgY2xzeCB9IGZyb20gJ2Nsc3gnXG5cbi8qKlxuICogT2ZmbGluZSBJbmRpY2F0b3IgQ29tcG9uZW50XG4gKiBTaG93cyBhIGJhbm5lciB3aGVuIHRoZSBhcHAgaXMgb2ZmbGluZSBhbmQgdXNpbmcgY2FjaGVkIGRhdGFcbiAqL1xuZXhwb3J0IGNvbnN0IE9mZmxpbmVJbmRpY2F0b3I6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCBbaXNPbmxpbmUsIHNldElzT25saW5lXSA9IHVzZVN0YXRlKG5hdmlnYXRvci5vbkxpbmUpXG4gIGNvbnN0IFtzaG93QmFubmVyLCBzZXRTaG93QmFubmVyXSA9IHVzZVN0YXRlKCFuYXZpZ2F0b3Iub25MaW5lKVxuICBjb25zdCBbanVzdENhbWVPbmxpbmUsIHNldEp1c3RDYW1lT25saW5lXSA9IHVzZVN0YXRlKGZhbHNlKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlT25saW5lID0gKCkgPT4ge1xuICAgICAgc2V0SXNPbmxpbmUodHJ1ZSlcbiAgICAgIHNldEp1c3RDYW1lT25saW5lKHRydWUpXG4gICAgICBzZXRTaG93QmFubmVyKH
25114RydWUpXG4gICAgICBcbiAgICAgIC8vIEhpZGUgdGhlIFwiYmFjayBvbmxpbmVcIiBiYW5uZXIgYWZ0ZXIgMyBzZWNvbmRzXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgc2V0U2hvd0Jhbm5lcihmYWxzZSlcbiAgICAgICAgc2V0SnVzdENhbWVPbmxpbmUoZmFsc2UpXG4gICAgICB9LCAzMDAwKVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZU9mZmxpbmUgPSAoKSA9PiB7XG4gICAgICBzZXRJc09ubGluZShmYWxzZSlcbiAgICAgIHNldFNob3dCYW5uZXIodHJ1ZSlcbiAgICAgIHNldEp1c3RDYW1lT25saW5lKGZhbHNlKVxuICAgIH1cblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvbmxpbmUnLCBoYW5kbGVPbmxpbmUpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCBoYW5kbGVPZmZsaW5lKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbmxpbmUnLCBoYW5kbGVPbmxpbmUpXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb2ZmbGluZScsIGhhbmRsZU9mZmxpbmUpXG4gICAgfVxuICB9LCBbXSlcblxuICAvLyBEb24ndCBzaG93IGFueXRoaW5nIGlmIG9ubGluZSBhbmQgbm90IGp1c3QgY2FtZSBvbmxpbmVcbiAgaWYgKGlzT25saW5lICYmICFqdXN0Q2FtZU9ubGluZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBEb24ndCBzaG93IGlmIGJhbm5lciBpcyBoaWRkZW5cbiAgaWYgKCFzaG93QmFubmVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAnZml4ZWQgdG9wLTAgbGVmdC0wIHJpZ2h0LTAgei01MCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAnLFxuICAgICAgICAnc2hhZG93LWxnJ1xuICAgICAgKX1cbiAgICA+XG4gICAgICB7LyogT2ZmbGluZSBCYW5uZXIgKi99XG4gICAgICB7IWlzT25saW5lICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy15ZWxsb3ctNTAwIHRleHQtd2hpdGUgcHgtNCBweS0zXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXIgbXgtYXV0byBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzcGFjZS14LTNcIj5cbiAgICAgICAgICAgIDxXaWZpT2ZmIGNsYXNzTmFtZT1cInctNSBoLTUgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJmb250LW1lZGl1bSB0ZXh0LXNtIG1kOnRleHQtYmFzZVwiPlxuICAgICAgICAgICAgICAgIE9mZmxpbmUtTW9kdXNcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gb3BhY2l0eS05MFwiPlxuICAgICAgICAgICAgICAgIFNpZSB2ZXJ3ZW5kZW4gZ2VzcGVpY2hlcnRlIERhdGVuLiBFaW5pZ2UgRnVua3Rpb25lbiBzaW5kIG3DtmdsaWNoZXJ3ZWlzZSBlaW5nZXNjaHLDpG5rdC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgey8qIEJhY2sgT25saW5lIEJhbm5lciAqL31cbiAgICAgIHtpc09ubGluZSAmJiBqdXN0Q2FtZU9ubGluZSAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctZ3JlZW4tNTAwIHRleHQtd2hpdGUgcHgtNCBweS0zXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXIgbXgtYXV0byBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzcGFjZS14LTNcIj5cbiAgICAgICAgICAgIDxXaWZpIGNsYXNzTmFtZT1cInctNSBoLTUgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJmb250LW1lZGl1bSB0ZXh0LXNtIG1kOnRleHQtYmFzZVwiPlxuICAgICAgICAgICAgICAgIFZlcmJpbmR1bmcgd2llZGVyaGVyZ2VzdGVsbHRcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gb3BhY2l0eS05MFwiPlxuICAgICAgICAgICAgICAgIERhdGVuIHdlcmRlbiBha3R1YWxpc2llcnQuLi5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4vKipcbiAqIENvbXBhY3QgT2ZmbGluZSBCYWRnZVxuICogU2hvd3MgYSBzbWFsbCBiYWRnZSBpbiB0aGUgY29ybmVyIHdoZW4gb2ZmbGluZVxuICovXG5leHBvcnQgY29uc3QgT2ZmbGluZUJhZGdlOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgW2lzT25saW5lLCBzZXRJc09ubGluZV0gPSB1c2VTdGF0ZShuYXZpZ2F0b3Iub25MaW5lKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlT25saW5lID0gKCkgPT4gc2V0SXNPbmxpbmUodHJ1ZSlcbiAgICBjb25zdCBoYW5kbGVPZmZsaW5lID0gKCkgPT4gc2V0SXNPbmxpbmUoZmFsc2UpXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb25saW5lJywgaGFuZGxlT25saW5lKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvZmZsaW5lJywgaGFuZGxlT2ZmbGluZSlcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb25saW5lJywgaGFuZGxlT25saW5lKVxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCBoYW5kbGVPZmZsaW5lKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgaWYgKGlzT25saW5lKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCBib3R0b20tNCByaWdodC00IHotNDBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmcteWVsbG93LTUwMCB0ZXh0LXdoaXRlIHB4LTMgcHktMiByb3VuZGVkLWZ1bGwgc2hhZG93LWxnIGZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMlwiPlxuICAgICAgICA8V2lmaU9mZiBjbGFzc05hbWU9XCJ3LTQgaC00XCIgLz5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bVwiPk9mZmxpbmU8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VBcHBTdG9yZSB9IGZyb20gJ0BzdG9yZXMvdXNlQXBwU3RvcmUnXG5pbXBvcnQgeyB1c2VMb2NhdGlvbnMgfSBmcm9tICdAaG9va3MvdXNlTG9jYXRpb25zJ1xuaW1wb3J0IHsgdXNlQ29udGFjdHMgfSBmcm9tICdAaG9va3MvdXNlQ29udGFjdHMnXG5pbXBvcnQgeyBMb2FkaW5nU3Bpbm5lciB9IGZyb20gJ0Bjb21wb25lbnRzL1VJL0xvYWRpbmdTcGlubmVyJ1xuaW1wb3J0IHsgRXJyb3JCb3VuZGFyeSB9IGZyb20gJ0Bjb21wb25lbnRzL1VJL0Vycm9yQm91bmRhcnknXG5pbXBvcnQgeyBNYXBDb250YWluZXIgfSBmcm9tICdAY29tcG9uZW50cy9NYXAvTWFwQ29udGFpbmVyJ1xuaW1wb3J0IHsgQ29udGFjdEdyaWQgfSBmcm9tICdAY29tcG9uZW50cy9Db250YWN0L0NvbnRhY3RHcmlkJ1xuaW1wb3J0IHsgVW5pZmllZExpc3RWaWV3IH0gZnJvbSAnQGNvbXBvbmVudHMvVUkvVW5pZmllZExpc3RWaWV3J1xuaW1wb3J0IHsgTG9jYXRpb25Db250YWN0TW9kYWwgfSBmcm9tICdAY29tcG9uZW50cy9Mb2NhdGlvbi9Mb2NhdGlvbkNvbnRhY3RNb2RhbCdcbmltcG9ydCB7
25114IENvbnRhY3RNb2RhbCB9IGZyb20gJ0Bjb21wb25lbnRzL0NvbnRhY3QvQ29udGFjdE1vZGFsJ1xuaW1wb3J0IHsgSGVhZGVyIH0gZnJvbSAnQGNvbXBvbmVudHMvTGF5b3V0L0hlYWRlcidcbmltcG9ydCB7IEZvb3RlciB9IGZyb20gJ0Bjb21wb25lbnRzL0xheW91dC9Gb290ZXInXG5pbXBvcnQgeyBWaWV3VG9nZ2xlIH0gZnJvbSAnQGNvbXBvbmVudHMvVUkvVmlld1RvZ2dsZSdcblxuaW1wb3J0IHsgQ29udGFpbmVyLCBTZWN0aW9uLCBDYXJkQ29udGFpbmVyLCBQYWdlTGF5b3V0IH0gZnJvbSAnQGNvbXBvbmVudHMvTGF5b3V0L0NvbnRhaW5lcidcblxuaW1wb3J0IHsgT2ZmbGluZUluZGljYXRvciB9IGZyb20gJ0Bjb21wb25lbnRzL1VJL09mZmxpbmVJbmRpY2F0b3InXG5cbmZ1bmN0aW9uIEFwcCgpIHtcbiAgY29uc3Qge1xuICAgIG1hcFZpZXcsXG4gICAgc2VsZWN0ZWRMb2NhdGlvbklkLFxuICAgIG9wZW5Mb2NhdGlvbk1vZGFsLFxuICAgIGlzQ29udGFjdE1vZGFsT3BlblxuICB9ID0gdXNlQXBwU3RvcmUoKVxuXG5cblxuICBjb25zdCB7IGRhdGE6IGxvY2F0aW9ucywgaXNMb2FkaW5nLCBlcnJvciB9ID0gdXNlTG9jYXRpb25zKClcbiAgY29uc3QgeyBkYXRhOiBjb250YWN0cyB9ID0gdXNlQ29udGFjdHMoKVxuXG4gIC8vIENoZWNrIGVtYmVkIG1vZGUgYW5kIGluZGl2aWR1YWwgY29tcG9uZW50IHZpc2liaWxpdHlcbiAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKVxuICBjb25zdCBlbWJlZFBhcmFtID0gdXJsUGFyYW1zLmdldCgnZW1iZWQnKVxuICBjb25zdCBoaWRlSGVhZGVyUGFyYW0gPSB1cmxQYXJhbXMuZ2V0KCdoaWRlSGVhZGVyJylcbiAgY29uc3QgaGlkZUZvb3RlclBhcmFtID0gdXJsUGFyYW1zLmdldCgnaGlkZUZvb3RlcicpXG5cbiAgLy8gRGV0ZXJtaW5lIHZpc2liaWxpdHkgZm9yIGhlYWRlciBhbmQgZm9vdGVyXG4gIGNvbnN0IGlzRW1iZWRNb2RlID0gZW1iZWRQYXJhbSA9PT0gJ3RydWUnXG5cbiAgLy8gSGVhZGVyIHZpc2liaWxpdHkgbG9naWM6XG4gIC8vIC0gSWYgaGlkZUhlYWRlcj10cnVlOiBhbHdheXMgaGlkZVxuICAvLyAtIElmIGVtYmVkPXRydWU6IGhpZGVcbiAgLy8gLSBPdGhlcndpc2U6IHNob3cgKGV2ZW4gaW4gaWZyYW1lKVxuICBjb25zdCBzaG93SGVhZGVyID0gaGlkZUhlYWRlclBhcmFtID09PSAndHJ1ZScgPyBmYWxzZSA6IGVtYmVkUGFyYW0gIT09ICd0cnVlJ1xuXG4gIC8vIEZvb3RlciB2aXNpYmlsaXR5IGxvZ2ljOlxuICAvLyAtIElmIGhpZGVGb290ZXI9dHJ1ZTogYWx3YXlzIGhpZGVcbiAgLy8gLSBJZiBlbWJlZD10cnVlOiBoaWRlXG4gIC8vIC0gT3RoZXJ3aXNlOiBzaG93IChldmVuIGluIGlmcmFtZSlcbiAgY29uc3Qgc2hvd0Zvb3RlciA9IGhpZGVGb290ZXJQYXJhbSA9PT0gJ3RydWUnID8gZmFsc2UgOiBlbWJlZFBhcmFtICE9PSAndHJ1ZSdcblxuICAvLyBJbml0aWFsaXplIGFwcCBmcm9tIFVSTCBwYXJhbWV0ZXJzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbSA9IHVybFBhcmFtcy5nZXQoJ2xvY2F0aW9uJylcblxuICAgIGlmIChsb2NhdGlvblBhcmFtICYmICFzZWxlY3RlZExvY2F0aW9uSWQpIHtcbiAgICAgIC8vIENvbnZlcnQgdG8gd3AtcHJlZml4ZWQgZm9ybWF0IGlmIG5lZWRlZFxuICAgICAgY29uc3QgbG9jYXRpb25JZCA9IGxvY2F0aW9uUGFyYW0uc3RhcnRzV2l0aCgnd3AtJykgPyBsb2NhdGlvblBhcmFtIDogYHdwLSR7bG9jYXRpb25QYXJhbX1gXG4gICAgICBvcGVuTG9jYXRpb25Nb2RhbChsb2NhdGlvbklkKVxuICAgIH1cbiAgfSwgW3NlbGVjdGVkTG9jYXRpb25JZCwgb3BlbkxvY2F0aW9uTW9kYWxdKVxuXG4gIC8vIEhhbmRsZSBsb2FkaW5nIHN0YXRlXG4gIGlmIChpc0xvYWRpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctYmFja2dyb3VuZC1zZWNvbmRhcnlcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxMb2FkaW5nU3Bpbm5lciBzaXplPVwibGdcIiAvPlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTQgdGV4dC10ZXh0LXNlY29uZGFyeVwiPkxhZGUgUG9ydGZvbGlvLURhdGVuLi4uPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIC8vIEhhbmRsZSBlcnJvciBzdGF0ZVxuICBpZiAoZXJyb3IpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctYmFja2dyb3VuZC1zZWNvbmRhcnlcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciBwLThcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtNnhsIG1iLTRcIj7imqDvuI88L2Rpdj5cbiAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0yXCI+XG4gICAgICAgICAgICBGZWhsZXIgYmVpbSBMYWRlblxuICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeSBtYi00XCI+XG4gICAgICAgICAgICBEaWUgUG9ydGZvbGlvLURhdGVuIGtvbm50ZW4gbmljaHQgZ2VsYWRlbiB3ZXJkZW4uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBFcm5ldXQgdmVyc3VjaGVuXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17YG1pbi1oLXNjcmVlbiBiZy1iYWNrZ3JvdW5kLXByaW1hcnkgc2Nyb2xsLXNtb290aCAke2lzRW1iZWRNb2RlID8gJ2VtYmVkLW1vZGUnIDogJyd9YH0+XG4gICAgICB7LyogT2ZmbGluZSBJbmRpY2F0b3IgKi99XG4gICAgICA8T2ZmbGluZUluZGljYXRvciAvPlxuXG4gICAgICB7LyogSGVhZGVyIC0gQ29uZGl0aW9uYWwgdmlzaWJpbGl0eSAqL31cbiAgICAgIHtzaG93SGVhZGVyICYmIDxIZWFkZXIgLz59XG5cbiAgICAgIHsvKiBNYWluIENvbnRlbnQgKi99XG4gICAgICA8bWFpbiBjbGFzc05hbWU9e2lzRW1iZWRNb2RlID8gJ3B5LTInIDogJ3B5LTYnfT5cbiAgICAgICAgPENvbnRhaW5lciBzaXplPXtpc0VtYmVkTW9kZSA/ICdmdWxsJyA6ICd4bCd9IHBhZGRpbmc9e2lzRW1iZWRNb2RlID8gJ25vbmUnIDogJ21kJ30+XG4gICAgICAgICAgPFBhZ2VMYXlvdXQ+XG5cbiAgICAgICAgICAgI
25114HsvKiBDb250ZW50IGJhc2VkIG9uIHZpZXcgbW9kZSAqL31cbiAgICAgICAgICAgIDxTZWN0aW9uIHNwYWNpbmc9XCJsZ1wiPlxuICAgICAgICAgIHttYXBWaWV3ID09PSAnaW50ZXJhY3RpdmUnID8gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgey8qIEludGVyYWN0aXZlIE1hcCBWaWV3ICovfVxuICAgICAgICAgICAgICA8Q2FyZENvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNCBib3JkZXItYiBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICBGaW5kZW4gU2llIElocmVuIEFuc3ByZWNocGFydG5lclxuICAgICAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgIEtsaWNrZW4gU2llIGF1ZiBlaW5lbiBTdGFuZG9ydCBhdWYgZGVyIEthcnRlXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgey8qIFZpZXcgVG9nZ2xlIGluIE1hcCBWaWV3ICovfVxuICAgICAgICAgICAgICAgICAgPFZpZXdUb2dnbGUgc2l6ZT1cInNtXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxFcnJvckJvdW5kYXJ5IGZhbGxiYWNrPXtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC04IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICBLYXJ0ZSBrb25udGUgbmljaHQgZ2VsYWRlbiB3ZXJkZW5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICAgICAgIDxNYXBDb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25zPXtsb2NhdGlvbnMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhY3RzPXtjb250YWN0cz8uZGF0YSB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXs1MDB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvRXJyb3JCb3VuZGFyeT5cbiAgICAgICAgICAgICAgPC9DYXJkQ29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIHsvKiBTZWxlY3RlZCBMb2NhdGlvbiBDb250YWN0cyAqL31cbiAgICAgICAgICAgICAge3NlbGVjdGVkTG9jYXRpb25JZCAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLW1lYy1sZyBzaGFkb3ctY2FyZCBwLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgbWItNFwiPlxuICAgICAgICAgICAgICAgICAgICBBbnNwcmVjaHBhcnRuZXIgYW0gYXVzZ2V3w6RobHRlbiBTdGFuZG9ydFxuICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgIDxDb250YWN0R3JpZCBsb2NhdGlvbklkPXtzZWxlY3RlZExvY2F0aW9uSWR9IC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgey8qIExpc3QgVmlldyAtIFNob3dzIGJvdGggTG9jYXRpb25zIGFuZCBDb250YWN0cyAqL31cbiAgICAgICAgICAgICAgPFVuaWZpZWRMaXN0VmlldyAvPlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICA8L1BhZ2VMYXlvdXQ+XG4gICAgICAgIDwvQ29udGFpbmVyPlxuICAgICAgPC9tYWluPlxuXG4gICAgICB7LyogTW9kYWxzICovfVxuICAgICAgPExvY2F0aW9uQ29udGFjdE1vZGFsIC8+XG4gICAgICBcbiAgICAgIHtpc0NvbnRhY3RNb2RhbE9wZW4gJiYgKFxuICAgICAgICA8Q29udGFjdE1vZGFsIC8+XG4gICAgICApfVxuXG4gICAgICB7LyogRm9vdGVyIC0gQ29uZGl0aW9uYWwgdmlzaWJpbGl0eSAqL31cbiAgICAgIHtzaG93Rm9vdGVyICYmIDxGb290ZXIgLz59XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgQXBwXG4iLCJjb25zdCBDTEFTU19QQVJUX1NFUEFSQVRPUiA9ICctJztcbmNvbnN0IGNyZWF0ZUNsYXNzR3JvdXBVdGlscyA9IGNvbmZpZyA9PiB7XG4gIGNvbnN0IGNsYXNzTWFwID0gY3JlYXRlQ2xhc3NNYXAoY29uZmlnKTtcbiAgY29uc3Qge1xuICAgIGNvbmZsaWN0aW5nQ2xhc3NHcm91cHMsXG4gICAgY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzXG4gI
25114H0gPSBjb25maWc7XG4gIGNvbnN0IGdldENsYXNzR3JvdXBJZCA9IGNsYXNzTmFtZSA9PiB7XG4gICAgY29uc3QgY2xhc3NQYXJ0cyA9IGNsYXNzTmFtZS5zcGxpdChDTEFTU19QQVJUX1NFUEFSQVRPUik7XG4gICAgLy8gQ2xhc3NlcyBsaWtlIGAtaW5zZXQtMWAgcHJvZHVjZSBhbiBlbXB0eSBzdHJpbmcgYXMgZmlyc3QgY2xhc3NQYXJ0LiBXZSBhc3N1bWUgdGhhdCBjbGFzc2VzIGZvciBuZWdhdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgY29ycmVjdGx5IGFuZCByZW1vdmUgaXQgZnJvbSBjbGFzc1BhcnRzLlxuICAgIGlmIChjbGFzc1BhcnRzWzBdID09PSAnJyAmJiBjbGFzc1BhcnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgY2xhc3NQYXJ0cy5zaGlmdCgpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0R3JvdXBSZWN1cnNpdmUoY2xhc3NQYXJ0cywgY2xhc3NNYXApIHx8IGdldEdyb3VwSWRGb3JBcmJpdHJhcnlQcm9wZXJ0eShjbGFzc05hbWUpO1xuICB9O1xuICBjb25zdCBnZXRDb25mbGljdGluZ0NsYXNzR3JvdXBJZHMgPSAoY2xhc3NHcm91cElkLCBoYXNQb3N0Zml4TW9kaWZpZXIpID0+IHtcbiAgICBjb25zdCBjb25mbGljdHMgPSBjb25mbGljdGluZ0NsYXNzR3JvdXBzW2NsYXNzR3JvdXBJZF0gfHwgW107XG4gICAgaWYgKGhhc1Bvc3RmaXhNb2RpZmllciAmJiBjb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnNbY2xhc3NHcm91cElkXSkge1xuICAgICAgcmV0dXJuIFsuLi5jb25mbGljdHMsIC4uLmNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyc1tjbGFzc0dyb3VwSWRdXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZsaWN0cztcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBnZXRDbGFzc0dyb3VwSWQsXG4gICAgZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzXG4gIH07XG59O1xuY29uc3QgZ2V0R3JvdXBSZWN1cnNpdmUgPSAoY2xhc3NQYXJ0cywgY2xhc3NQYXJ0T2JqZWN0KSA9PiB7XG4gIGlmIChjbGFzc1BhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBjbGFzc1BhcnRPYmplY3QuY2xhc3NHcm91cElkO1xuICB9XG4gIGNvbnN0IGN1cnJlbnRDbGFzc1BhcnQgPSBjbGFzc1BhcnRzWzBdO1xuICBjb25zdCBuZXh0Q2xhc3NQYXJ0T2JqZWN0ID0gY2xhc3NQYXJ0T2JqZWN0Lm5leHRQYXJ0LmdldChjdXJyZW50Q2xhc3NQYXJ0KTtcbiAgY29uc3QgY2xhc3NHcm91cEZyb21OZXh0Q2xhc3NQYXJ0ID0gbmV4dENsYXNzUGFydE9iamVjdCA/IGdldEdyb3VwUmVjdXJzaXZlKGNsYXNzUGFydHMuc2xpY2UoMSksIG5leHRDbGFzc1BhcnRPYmplY3QpIDogdW5kZWZpbmVkO1xuICBpZiAoY2xhc3NHcm91cEZyb21OZXh0Q2xhc3NQYXJ0KSB7XG4gICAgcmV0dXJuIGNsYXNzR3JvdXBGcm9tTmV4dENsYXNzUGFydDtcbiAgfVxuICBpZiAoY2xhc3NQYXJ0T2JqZWN0LnZhbGlkYXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBjbGFzc1Jlc3QgPSBjbGFzc1BhcnRzLmpvaW4oQ0xBU1NfUEFSVF9TRVBBUkFUT1IpO1xuICByZXR1cm4gY2xhc3NQYXJ0T2JqZWN0LnZhbGlkYXRvcnMuZmluZCgoe1xuICAgIHZhbGlkYXRvclxuICB9KSA9PiB2YWxpZGF0b3IoY2xhc3NSZXN0KSk/LmNsYXNzR3JvdXBJZDtcbn07XG5jb25zdCBhcmJpdHJhcnlQcm9wZXJ0eVJlZ2V4ID0gL15cXFsoLispXFxdJC87XG5jb25zdCBnZXRHcm91cElkRm9yQXJiaXRyYXJ5UHJvcGVydHkgPSBjbGFzc05hbWUgPT4ge1xuICBpZiAoYXJiaXRyYXJ5UHJvcGVydHlSZWdleC50ZXN0KGNsYXNzTmFtZSkpIHtcbiAgICBjb25zdCBhcmJpdHJhcnlQcm9wZXJ0eUNsYXNzTmFtZSA9IGFyYml0cmFyeVByb3BlcnR5UmVnZXguZXhlYyhjbGFzc05hbWUpWzFdO1xuICAgIGNvbnN0IHByb3BlcnR5ID0gYXJiaXRyYXJ5UHJvcGVydHlDbGFzc05hbWU/LnN1YnN0cmluZygwLCBhcmJpdHJhcnlQcm9wZXJ0eUNsYXNzTmFtZS5pbmRleE9mKCc6JykpO1xuICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgLy8gSSB1c2UgdHdvIGRvdHMgaGVyZSBiZWNhdXNlIG9uZSBkb3QgaXMgdXNlZCBhcyBwcmVmaXggZm9yIGNsYXNzIGdyb3VwcyBpbiBwbHVnaW5zXG4gICAgICByZXR1cm4gJ2FyYml0cmFyeS4uJyArIHByb3BlcnR5O1xuICAgIH1cbiAgfVxufTtcbi8qKlxuICogRXhwb3J0ZWQgZm9yIHRlc3Rpbmcgb25seVxuICovXG5jb25zdCBjcmVhdGVDbGFzc01hcCA9IGNvbmZpZyA9PiB7XG4gIGNvbnN0IHtcbiAgICB0aGVtZSxcbiAgICBjbGFzc0dyb3Vwc1xuICB9ID0gY29uZmlnO1xuICBjb25zdCBjbGFzc01hcCA9IHtcbiAgICBuZXh0UGFydDogbmV3IE1hcCgpLFxuICAgIHZhbGlkYXRvcnM6IFtdXG4gIH07XG4gIGZvciAoY29uc3QgY2xhc3NHcm91cElkIGluIGNsYXNzR3JvdXBzKSB7XG4gICAgcHJvY2Vzc0NsYXNzZXNSZWN1cnNpdmVseShjbGFzc0dyb3Vwc1tjbGFzc0dyb3VwSWRdLCBjbGFzc01hcCwgY2xhc3NHcm91cElkLCB0aGVtZSk7XG4gIH1cbiAgcmV0dXJuIGNsYXNzTWFwO1xufTtcbmNvbnN0IHByb2Nlc3NDbGFzc2VzUmVjdXJzaXZlbHkgPSAoY2xhc3NHcm91cCwgY2xhc3NQYXJ0T2JqZWN0LCBjbGFzc0dyb3VwSWQsIHRoZW1lKSA9PiB7XG4gIGNsYXNzR3JvdXAuZm9yRWFjaChjbGFzc0RlZmluaXRpb24gPT4ge1xuICAgIGlmICh0eXBlb2YgY2xhc3NEZWZpbml0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgY2xhc3NQYXJ0T2JqZWN0VG9FZGl0ID0gY2xhc3NEZWZpbml0aW9uID09PSAnJyA/IGNsYXNzUGFydE9iamVjdCA6IGdldFBhcnQoY2xhc3NQYXJ0T2JqZWN0LCBjbGFzc0RlZmluaXRpb24pO1xuICAgICAgY2xhc3NQYXJ0T2JqZWN0VG9FZGl0LmNsYXNzR3JvdXBJZCA9IGNsYXNzR3JvdXBJZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjbGFzc0RlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChpc1RoZW1lR2V0dGVyKGNsYXNzRGVmaW5pdGlvbikpIHtcbiAgICAgICAgcHJvY2Vzc0NsYXNzZXNSZWN1cnNpdmVseShjbGFzc0RlZmluaXRpb24odGhlbWUpLCBjbGFzc1BhcnRPYmplY3QsIGNsYXNzR3JvdXBJZCwgdGhlbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjbGFzc1BhcnRPYmplY3QudmFsaWRhdG9ycy5wdXNoKHtcbiAgICAgICAgdmFsaWRhdG9yOiBjbGFzc0RlZmluaXRpb24sXG4gICAgICAgIGNsYXNzR3JvdXBJZFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC5lbnRyaWVzKGNsYXNzRGVmaW5pdGlvbikuZm9yRWFjaCgoW2tleSwgY2xhc3NHcm91cF0pID0+IHtcbiAgICAgIHByb2Nlc3NDbGFzc2VzUmVjdXJzaXZlbHkoY2xhc3NHcm91cCwgZ2V0UGFydChjbGFzc1BhcnRPYmplY3QsIGtleSksIGNsYXNzR3JvdXBJZCwgdGhlbWUpO1xuICAgIH0pO1xuICB9KTtcbn07XG5jb25zdCBnZXRQYXJ0ID0gKGNsYXNzUGFydE9iamVjdCwgcGF0aCkgPT4ge1xuICBsZXQgY3VycmVudENsYXNzUGFydE9iamVjdCA9IGNsYXNzUGFydE9iamVjdDtcbiAgcGF0aC5zcGxpdChDTEFTU19QQVJUX1NFUEFSQVRPUikuZm9yRWFjaChwYXRoUGFydCA9PiB7XG4gICAgaWYgKCFjdXJyZW50Q2xhc3NQYXJ0T2JqZWN0Lm5leHRQYXJ0LmhhcyhwYXRoUGFydCkpIHtcbiAgICAgIGN1cnJlbnRDbGFzc1BhcnRPYmplY3QubmV4dFBhcnQuc2
25114V0KHBhdGhQYXJ0LCB7XG4gICAgICAgIG5leHRQYXJ0OiBuZXcgTWFwKCksXG4gICAgICAgIHZhbGlkYXRvcnM6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gICAgY3VycmVudENsYXNzUGFydE9iamVjdCA9IGN1cnJlbnRDbGFzc1BhcnRPYmplY3QubmV4dFBhcnQuZ2V0KHBhdGhQYXJ0KTtcbiAgfSk7XG4gIHJldHVybiBjdXJyZW50Q2xhc3NQYXJ0T2JqZWN0O1xufTtcbmNvbnN0IGlzVGhlbWVHZXR0ZXIgPSBmdW5jID0+IGZ1bmMuaXNUaGVtZUdldHRlcjtcblxuLy8gTFJVIGNhY2hlIGluc3BpcmVkIGZyb20gaGFzaGxydSAoaHR0cHM6Ly9naXRodWIuY29tL2RvbWluaWN0YXJyL2hhc2hscnUvYmxvYi92MS4wLjQvaW5kZXguanMpIGJ1dCBvYmplY3QgcmVwbGFjZWQgd2l0aCBNYXAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZVxuY29uc3QgY3JlYXRlTHJ1Q2FjaGUgPSBtYXhDYWNoZVNpemUgPT4ge1xuICBpZiAobWF4Q2FjaGVTaXplIDwgMSkge1xuICAgIHJldHVybiB7XG4gICAgICBnZXQ6ICgpID0+IHVuZGVmaW5lZCxcbiAgICAgIHNldDogKCkgPT4ge31cbiAgICB9O1xuICB9XG4gIGxldCBjYWNoZVNpemUgPSAwO1xuICBsZXQgY2FjaGUgPSBuZXcgTWFwKCk7XG4gIGxldCBwcmV2aW91c0NhY2hlID0gbmV3IE1hcCgpO1xuICBjb25zdCB1cGRhdGUgPSAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgIGNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICBjYWNoZVNpemUrKztcbiAgICBpZiAoY2FjaGVTaXplID4gbWF4Q2FjaGVTaXplKSB7XG4gICAgICBjYWNoZVNpemUgPSAwO1xuICAgICAgcHJldmlvdXNDYWNoZSA9IGNhY2hlO1xuICAgICAgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIGxldCB2YWx1ZSA9IGNhY2hlLmdldChrZXkpO1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKCh2YWx1ZSA9IHByZXZpb3VzQ2FjaGUuZ2V0KGtleSkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBkYXRlKGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgIGNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwZGF0ZShrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuY29uc3QgSU1QT1JUQU5UX01PRElGSUVSID0gJyEnO1xuY29uc3QgTU9ESUZJRVJfU0VQQVJBVE9SID0gJzonO1xuY29uc3QgTU9ESUZJRVJfU0VQQVJBVE9SX0xFTkdUSCA9IE1PRElGSUVSX1NFUEFSQVRPUi5sZW5ndGg7XG5jb25zdCBjcmVhdGVQYXJzZUNsYXNzTmFtZSA9IGNvbmZpZyA9PiB7XG4gIGNvbnN0IHtcbiAgICBwcmVmaXgsXG4gICAgZXhwZXJpbWVudGFsUGFyc2VDbGFzc05hbWVcbiAgfSA9IGNvbmZpZztcbiAgLyoqXG4gICAqIFBhcnNlIGNsYXNzIG5hbWUgaW50byBwYXJ0cy5cbiAgICpcbiAgICogSW5zcGlyZWQgYnkgYHNwbGl0QXRUb3BMZXZlbE9ubHlgIHVzZWQgaW4gVGFpbHdpbmQgQ1NTXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy9ibG9iL3YzLjIuMi9zcmMvdXRpbC9zcGxpdEF0VG9wTGV2ZWxPbmx5LmpzXG4gICAqL1xuICBsZXQgcGFyc2VDbGFzc05hbWUgPSBjbGFzc05hbWUgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVycyA9IFtdO1xuICAgIGxldCBicmFja2V0RGVwdGggPSAwO1xuICAgIGxldCBwYXJlbkRlcHRoID0gMDtcbiAgICBsZXQgbW9kaWZpZXJTdGFydCA9IDA7XG4gICAgbGV0IHBvc3RmaXhNb2RpZmllclBvc2l0aW9uO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjbGFzc05hbWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBsZXQgY3VycmVudENoYXJhY3RlciA9IGNsYXNzTmFtZVtpbmRleF07XG4gICAgICBpZiAoYnJhY2tldERlcHRoID09PSAwICYmIHBhcmVuRGVwdGggPT09IDApIHtcbiAgICAgICAgaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT09IE1PRElGSUVSX1NFUEFSQVRPUikge1xuICAgICAgICAgIG1vZGlmaWVycy5wdXNoKGNsYXNzTmFtZS5zbGljZShtb2RpZmllclN0YXJ0LCBpbmRleCkpO1xuICAgICAgICAgIG1vZGlmaWVyU3RhcnQgPSBpbmRleCArIE1PRElGSUVSX1NFUEFSQVRPUl9MRU5HVEg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT09ICcvJykge1xuICAgICAgICAgIHBvc3RmaXhNb2RpZmllclBvc2l0aW9uID0gaW5kZXg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50Q2hhcmFjdGVyID09PSAnWycpIHtcbiAgICAgICAgYnJhY2tldERlcHRoKys7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT09ICddJykge1xuICAgICAgICBicmFja2V0RGVwdGgtLTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudENoYXJhY3RlciA9PT0gJygnKSB7XG4gICAgICAgIHBhcmVuRGVwdGgrKztcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudENoYXJhY3RlciA9PT0gJyknKSB7XG4gICAgICAgIHBhcmVuRGVwdGgtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYmFzZUNsYXNzTmFtZVdpdGhJbXBvcnRhbnRNb2RpZmllciA9IG1vZGlmaWVycy5sZW5ndGggPT09IDAgPyBjbGFzc05hbWUgOiBjbGFzc05hbWUuc3Vic3RyaW5nKG1vZGlmaWVyU3RhcnQpO1xuICAgIGNvbnN0IGJhc2VDbGFzc05hbWUgPSBzdHJpcEltcG9ydGFudE1vZGlmaWVyKGJhc2VDbGFzc05hbWVXaXRoSW1wb3J0YW50TW9kaWZpZXIpO1xuICAgIGNvbnN0IGhhc0ltcG9ydGFudE1vZGlmaWVyID0gYmFzZUNsYXNzTmFtZSAhPT0gYmFzZUNsYXNzTmFtZVdpdGhJbXBvcnRhbnRNb2RpZmllcjtcbiAgICBjb25zdCBtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uID0gcG9zdGZpeE1vZGlmaWVyUG9zaXRpb24gJiYgcG9zdGZpeE1vZGlmaWVyUG9zaXRpb24gPiBtb2RpZmllclN0YXJ0ID8gcG9zdGZpeE1vZGlmaWVyUG9zaXRpb24gLSBtb2RpZmllclN0YXJ0IDogdW5kZWZpbmVkO1xuICAgIHJldHVybi
25114B7XG4gICAgICBtb2RpZmllcnMsXG4gICAgICBoYXNJbXBvcnRhbnRNb2RpZmllcixcbiAgICAgIGJhc2VDbGFzc05hbWUsXG4gICAgICBtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uXG4gICAgfTtcbiAgfTtcbiAgaWYgKHByZWZpeCkge1xuICAgIGNvbnN0IGZ1bGxQcmVmaXggPSBwcmVmaXggKyBNT0RJRklFUl9TRVBBUkFUT1I7XG4gICAgY29uc3QgcGFyc2VDbGFzc05hbWVPcmlnaW5hbCA9IHBhcnNlQ2xhc3NOYW1lO1xuICAgIHBhcnNlQ2xhc3NOYW1lID0gY2xhc3NOYW1lID0+IGNsYXNzTmFtZS5zdGFydHNXaXRoKGZ1bGxQcmVmaXgpID8gcGFyc2VDbGFzc05hbWVPcmlnaW5hbChjbGFzc05hbWUuc3Vic3RyaW5nKGZ1bGxQcmVmaXgubGVuZ3RoKSkgOiB7XG4gICAgICBpc0V4dGVybmFsOiB0cnVlLFxuICAgICAgbW9kaWZpZXJzOiBbXSxcbiAgICAgIGhhc0ltcG9ydGFudE1vZGlmaWVyOiBmYWxzZSxcbiAgICAgIGJhc2VDbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgIG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb246IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cbiAgaWYgKGV4cGVyaW1lbnRhbFBhcnNlQ2xhc3NOYW1lKSB7XG4gICAgY29uc3QgcGFyc2VDbGFzc05hbWVPcmlnaW5hbCA9IHBhcnNlQ2xhc3NOYW1lO1xuICAgIHBhcnNlQ2xhc3NOYW1lID0gY2xhc3NOYW1lID0+IGV4cGVyaW1lbnRhbFBhcnNlQ2xhc3NOYW1lKHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHBhcnNlQ2xhc3NOYW1lOiBwYXJzZUNsYXNzTmFtZU9yaWdpbmFsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlQ2xhc3NOYW1lO1xufTtcbmNvbnN0IHN0cmlwSW1wb3J0YW50TW9kaWZpZXIgPSBiYXNlQ2xhc3NOYW1lID0+IHtcbiAgaWYgKGJhc2VDbGFzc05hbWUuZW5kc1dpdGgoSU1QT1JUQU5UX01PRElGSUVSKSkge1xuICAgIHJldHVybiBiYXNlQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBiYXNlQ2xhc3NOYW1lLmxlbmd0aCAtIDEpO1xuICB9XG4gIC8qKlxuICAgKiBJbiBUYWlsd2luZCBDU1MgdjMgdGhlIGltcG9ydGFudCBtb2RpZmllciB3YXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBiYXNlIGNsYXNzIG5hbWUuIFRoaXMgaXMgc3RpbGwgc3VwcG9ydGVkIGZvciBsZWdhY3kgcmVhc29ucy5cbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZGNhc3RpbC90YWlsd2luZC1tZXJnZS9pc3N1ZXMvNTEzI2lzc3VlY29tbWVudC0yNjE0MDI5ODY0XG4gICAqL1xuICBpZiAoYmFzZUNsYXNzTmFtZS5zdGFydHNXaXRoKElNUE9SVEFOVF9NT0RJRklFUikpIHtcbiAgICByZXR1cm4gYmFzZUNsYXNzTmFtZS5zdWJzdHJpbmcoMSk7XG4gIH1cbiAgcmV0dXJuIGJhc2VDbGFzc05hbWU7XG59O1xuXG4vKipcbiAqIFNvcnRzIG1vZGlmaWVycyBhY2NvcmRpbmcgdG8gZm9sbG93aW5nIHNjaGVtYTpcbiAqIC0gUHJlZGVmaW5lZCBtb2RpZmllcnMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseVxuICogLSBXaGVuIGFuIGFyYml0cmFyeSB2YXJpYW50IGFwcGVhcnMsIGl0IG11c3QgYmUgcHJlc2VydmVkIHdoaWNoIG1vZGlmaWVycyBhcmUgYmVmb3JlIGFuZCBhZnRlciBpdFxuICovXG5jb25zdCBjcmVhdGVTb3J0TW9kaWZpZXJzID0gY29uZmlnID0+IHtcbiAgY29uc3Qgb3JkZXJTZW5zaXRpdmVNb2RpZmllcnMgPSBPYmplY3QuZnJvbUVudHJpZXMoY29uZmlnLm9yZGVyU2Vuc2l0aXZlTW9kaWZpZXJzLm1hcChtb2RpZmllciA9PiBbbW9kaWZpZXIsIHRydWVdKSk7XG4gIGNvbnN0IHNvcnRNb2RpZmllcnMgPSBtb2RpZmllcnMgPT4ge1xuICAgIGlmIChtb2RpZmllcnMubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHJldHVybiBtb2RpZmllcnM7XG4gICAgfVxuICAgIGNvbnN0IHNvcnRlZE1vZGlmaWVycyA9IFtdO1xuICAgIGxldCB1bnNvcnRlZE1vZGlmaWVycyA9IFtdO1xuICAgIG1vZGlmaWVycy5mb3JFYWNoKG1vZGlmaWVyID0+IHtcbiAgICAgIGNvbnN0IGlzUG9zaXRpb25TZW5zaXRpdmUgPSBtb2RpZmllclswXSA9PT0gJ1snIHx8IG9yZGVyU2Vuc2l0aXZlTW9kaWZpZXJzW21vZGlmaWVyXTtcbiAgICAgIGlmIChpc1Bvc2l0aW9uU2Vuc2l0aXZlKSB7XG4gICAgICAgIHNvcnRlZE1vZGlmaWVycy5wdXNoKC4uLnVuc29ydGVkTW9kaWZpZXJzLnNvcnQoKSwgbW9kaWZpZXIpO1xuICAgICAgICB1bnNvcnRlZE1vZGlmaWVycyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5zb3J0ZWRNb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc29ydGVkTW9kaWZpZXJzLnB1c2goLi4udW5zb3J0ZWRNb2RpZmllcnMuc29ydCgpKTtcbiAgICByZXR1cm4gc29ydGVkTW9kaWZpZXJzO1xuICB9O1xuICByZXR1cm4gc29ydE1vZGlmaWVycztcbn07XG5jb25zdCBjcmVhdGVDb25maWdVdGlscyA9IGNvbmZpZyA9PiAoe1xuICBjYWNoZTogY3JlYXRlTHJ1Q2FjaGUoY29uZmlnLmNhY2hlU2l6ZSksXG4gIHBhcnNlQ2xhc3NOYW1lOiBjcmVhdGVQYXJzZUNsYXNzTmFtZShjb25maWcpLFxuICBzb3J0TW9kaWZpZXJzOiBjcmVhdGVTb3J0TW9kaWZpZXJzKGNvbmZpZyksXG4gIC4uLmNyZWF0ZUNsYXNzR3JvdXBVdGlscyhjb25maWcpXG59KTtcbmNvbnN0IFNQTElUX0NMQVNTRVNfUkVHRVggPSAvXFxzKy87XG5jb25zdCBtZXJnZUNsYXNzTGlzdCA9IChjbGFzc0xpc3QsIGNvbmZpZ1V0aWxzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBwYXJzZUNsYXNzTmFtZSxcbiAgICBnZXRDbGFzc0dyb3VwSWQsXG4gICAgZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzLFxuICAgIHNvcnRNb2RpZmllcnNcbiAgfSA9IGNvbmZpZ1V0aWxzO1xuICAvKipcbiAgICogU2V0IG9mIGNsYXNzR3JvdXBJZHMgaW4gZm9sbG93aW5nIGZvcm1hdDpcbiAgICogYHtpbXBvcnRhbnRNb2RpZmllcn17dmFyaWFudE1vZGlmaWVyc317Y2xhc3NHcm91cElkfWBcbiAgICogQGV4YW1wbGUgJ2Zsb2F0J1xuICAgKiBAZXhhbXBsZSAnaG92ZXI6Zm9jdXM6YmctY29sb3InXG4gICAqIEBleGFtcGxlICdtZDohcHInXG4gICAqL1xuICBjb25zdCBjbGFzc0dyb3Vwc0luQ29uZmxpY3QgPSBbXTtcbiAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzTGlzdC50cmltKCkuc3BsaXQoU1BMSVRfQ0xBU1NFU19SRUdFWCk7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgZm9yIChsZXQgaW5kZXggPSBjbGFzc05hbWVzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4IC09IDEpIHtcbiAgICBjb25zdCBvcmlnaW5hbENsYXNzTmFtZSA9IGNsYXNzTmFtZXNbaW5kZXhdO1xuICAgIGNvbnN0IHtcbiAgICAgIGlzRXh0ZXJuYWwsXG4gICAgICBtb2RpZmllcnMsXG4gICAgICBoYXNJbXBvcnRhbnRNb2RpZmllcixcbiAgICAgIGJhc2VDbGFzc05hbWUsXG4gICAgICBtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uXG4gICAgfSA9IHBhcnNlQ2xhc3NOYW1lKG9yaWdpbmFsQ2xhc3NOYW1lKTtcbiAgICBpZiAoaXNFeHRlcm5hbCkge1xuICAgICAgcmVzdWx0ID0gb3JpZ2luYWxDbGFzc05hbWUgKyAocmVzdWx0Lmxlbmd0aCA+IDAgPyAnICcgKyByZXN1bHQgOiByZXN1bHQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxldCBoYXNQb3N0Zml4TW9kaWZpZXIgPSAhIW1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb247XG4gICAgbGV0IGNsYXNzR3JvdXBJZCA9IGdldENsYXNzR3JvdXBJZChoYXNQb3N0Zml4TW9kaWZpZXIgPyBiYXNlQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uKSA6IGJhc2VDbGFzc05hbWUpO1xuICAgIGlmICghY2xhc3NHcm91cElkKSB7XG4gICAgICBpZiAoIWhhc1Bvc3RmaXhNb2RpZmllcikge1xuICAgICAgICAvLyBOb3QgYSBUYWlsd2luZCBjbGFzc1xuICAgICAgICByZXN1bHQgPSBvcmlnaW5hbENsYXNzTmFtZSArIChyZXN1bHQubGVuZ3RoID4gMCA/ICcgJyArIHJlc3VsdCA6IHJlc3VsdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2xhc3NHcm91cElkID0gZ2V0Q2xhc3NHcm91cElkKGJhc2VDbGFzc05hbWUpO1xuICAgICAgaWYgKCFjbGFzc0dyb3VwSWQpIHtcbiAgICAgICAgLy8gTm90IGEgVGFpbHdpbmQgY2xhc3NcbiAgICAgICAgcmVzdWx0ID0gb3JpZ2luYWxDbGFzc05hbWUgKyAocmVzdWx0Lmxlbmd0aCA+IDAgPyAnICcgKyByZXN1bHQgOiByZXN1bHQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGhhc1Bvc3RmaXhNb2RpZmllciA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2YXJpYW50TW9kaWZpZXIgPSBzb3J0TW9kaWZpZXJzKG1vZGlmaWVycykuam9pbignOicpO1xuICAgIGNvbnN0IG1vZGlmaWVySWQgPSBoYXNJbXBvcnRhbnRNb2RpZmllciA/IHZhcmlhbnRNb2RpZmllciArIElNUE9SVEFOVF9NT0RJRklFUiA6IHZhcmlhbnRNb2RpZmllcjtcbiAgICBjb25zdCBjbGFzc0lkID0gbW9kaWZpZXJJZCArIGNsYXNzR3JvdXBJZDtcbiAgICBpZiAoY2xhc3NHcm91cHNJbkNvbmZsaWN0LmluY2x1ZGVzKGNsYXNzSWQpKSB7XG4gICAgICAvLyBUYWlsd2luZCBjbGFzcyBvbWl0dGVkIGR1ZSB0byBjb25mbGljdFxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNsYXNzR3JvdXBzSW5Db25mbGljdC5wdXNoKGNsYXNzSWQpO1xuICAgIGNvbnN0IGNvbmZsaWN0R3JvdXBzID0gZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzKGNsYXNzR3JvdXBJZCwgaGFzUG9zdGZpeE1vZGlmaWVyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmZsaWN0R3JvdXBzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBncm91cCA9IGNvbmZsaWN0R3JvdXBzW2ldO1xuICAgICAgY2xhc3NHcm91cHNJbkNvbmZsaWN0LnB1c2gobW9kaWZpZXJJZCArIGdyb3VwKTtcbiAgICB9XG4gICAgLy8gVGFpbHdpbmQgY2xhc3Mgbm90IGluIGNvbmZsaWN0XG4gICAgcmVzdWx0ID0gb3JpZ2luYWxDbGFzc05hbWUgKyAocmVzdWx0Lmxlbmd0aCA+IDAgPyAnICcgKyByZXN1bHQgOiByZXN1bHQpO1xuICB9XG4gI
25114HJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFRoZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBjb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbHVrZWVkL2Nsc3ggYW5kIG1vZGlmaWVkIHRvIHN1aXQgdGhlIG5lZWRzIG9mIHRhaWx3aW5kLW1lcmdlIGJldHRlci5cbiAqXG4gKiBTcGVjaWZpY2FsbHk6XG4gKiAtIFJ1bnRpbWUgY29kZSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQvY2xzeC9ibG9iL3YxLjIuMS9zcmMvaW5kZXguanNcbiAqIC0gVHlwZVNjcmlwdCB0eXBlcyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQvY2xzeC9ibG9iL3YxLjIuMS9jbHN4LmQudHNcbiAqXG4gKiBPcmlnaW5hbCBjb2RlIGhhcyBNSVQgbGljZW5zZTogQ29weXJpZ2h0IChjKSBMdWtlIEVkd2FyZHMgPGx1a2UuZWR3YXJkczA1QGdtYWlsLmNvbT4gKGx1a2VlZC5jb20pXG4gKi9cbmZ1bmN0aW9uIHR3Sm9pbigpIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IGFyZ3VtZW50O1xuICBsZXQgcmVzb2x2ZWRWYWx1ZTtcbiAgbGV0IHN0cmluZyA9ICcnO1xuICB3aGlsZSAoaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgaWYgKGFyZ3VtZW50ID0gYXJndW1lbnRzW2luZGV4KytdKSB7XG4gICAgICBpZiAocmVzb2x2ZWRWYWx1ZSA9IHRvVmFsdWUoYXJndW1lbnQpKSB7XG4gICAgICAgIHN0cmluZyAmJiAoc3RyaW5nICs9ICcgJyk7XG4gICAgICAgIHN0cmluZyArPSByZXNvbHZlZFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyaW5nO1xufVxuY29uc3QgdG9WYWx1ZSA9IG1peCA9PiB7XG4gIGlmICh0eXBlb2YgbWl4ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBtaXg7XG4gIH1cbiAgbGV0IHJlc29sdmVkVmFsdWU7XG4gIGxldCBzdHJpbmcgPSAnJztcbiAgZm9yIChsZXQgayA9IDA7IGsgPCBtaXgubGVuZ3RoOyBrKyspIHtcbiAgICBpZiAobWl4W2tdKSB7XG4gICAgICBpZiAocmVzb2x2ZWRWYWx1ZSA9IHRvVmFsdWUobWl4W2tdKSkge1xuICAgICAgICBzdHJpbmcgJiYgKHN0cmluZyArPSAnICcpO1xuICAgICAgICBzdHJpbmcgKz0gcmVzb2x2ZWRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cmluZztcbn07XG5mdW5jdGlvbiBjcmVhdGVUYWlsd2luZE1lcmdlKGNyZWF0ZUNvbmZpZ0ZpcnN0LCAuLi5jcmVhdGVDb25maWdSZXN0KSB7XG4gIGxldCBjb25maWdVdGlscztcbiAgbGV0IGNhY2hlR2V0O1xuICBsZXQgY2FjaGVTZXQ7XG4gIGxldCBmdW5jdGlvblRvQ2FsbCA9IGluaXRUYWlsd2luZE1lcmdlO1xuICBmdW5jdGlvbiBpbml0VGFpbHdpbmRNZXJnZShjbGFzc0xpc3QpIHtcbiAgICBjb25zdCBjb25maWcgPSBjcmVhdGVDb25maWdSZXN0LnJlZHVjZSgocHJldmlvdXNDb25maWcsIGNyZWF0ZUNvbmZpZ0N1cnJlbnQpID0+IGNyZWF0ZUNvbmZpZ0N1cnJlbnQocHJldmlvdXNDb25maWcpLCBjcmVhdGVDb25maWdGaXJzdCgpKTtcbiAgICBjb25maWdVdGlscyA9IGNyZWF0ZUNvbmZpZ1V0aWxzKGNvbmZpZyk7XG4gICAgY2FjaGVHZXQgPSBjb25maWdVdGlscy5jYWNoZS5nZXQ7XG4gICAgY2FjaGVTZXQgPSBjb25maWdVdGlscy5jYWNoZS5zZXQ7XG4gICAgZnVuY3Rpb25Ub0NhbGwgPSB0YWlsd2luZE1lcmdlO1xuICAgIHJldHVybiB0YWlsd2luZE1lcmdlKGNsYXNzTGlzdCk7XG4gIH1cbiAgZnVuY3Rpb24gdGFpbHdpbmRNZXJnZShjbGFzc0xpc3QpIHtcbiAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBjYWNoZUdldChjbGFzc0xpc3QpO1xuICAgIGlmIChjYWNoZWRSZXN1bHQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IG1lcmdlQ2xhc3NMaXN0KGNsYXNzTGlzdCwgY29uZmlnVXRpbHMpO1xuICAgIGNhY2hlU2V0KGNsYXNzTGlzdCwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBjYWxsVGFpbHdpbmRNZXJnZSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub0NhbGwodHdKb2luLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuY29uc3QgZnJvbVRoZW1lID0ga2V5ID0+IHtcbiAgY29uc3QgdGhlbWVHZXR0ZXIgPSB0aGVtZSA9PiB0aGVtZVtrZXldIHx8IFtdO1xuICB0aGVtZUdldHRlci5pc1RoZW1lR2V0dGVyID0gdHJ1ZTtcbiAgcmV0dXJuIHRoZW1lR2V0dGVyO1xufTtcbmNvbnN0IGFyYml0cmFyeVZhbHVlUmVnZXggPSAvXlxcWyg/OihcXHdbXFx3LV0qKTopPyguKylcXF0kL2k7XG5jb25zdCBhcmJpdHJhcnlWYXJpYWJsZVJlZ2V4ID0gL15cXCgoPzooXFx3W1xcdy1dKik6KT8oLispXFwpJC9pO1xuY29uc3QgZnJhY3Rpb25SZWdleCA9IC9eXFxkK1xcL1xcZCskLztcbmNvbnN0IHRzaGlydFVuaXRSZWdleCA9IC9eKFxcZCsoXFwuXFxkKyk/KT8oeHN8c218bWR8bGd8eGwpJC87XG5jb25zdCBsZW5ndGhVbml0UmVnZXggPSAvXFxkKyglfHB4fHI/ZW18W3NkbF0/dihbaHdpYl18bWlufG1heCl8cHR8cGN8aW58Y218bW18Y2FwfGNofGV4fHI/bGh8Y3Eod3xofGl8YnxtaW58bWF4KSl8XFxiKGNhbGN8bWlufG1heHxjbGFtcClcXCguK1xcKXxeMCQvO1xuY29uc3QgY29sb3JGdW5jdGlvblJlZ2V4ID0gL14ocmdiYT98aHNsYT98aHdifChvayk/KGxhYnxsY2gpfGNvbG9yLW1peClcXCguK1xcKSQvO1xuLy8gU2hhZG93IGFsd2F5cyBiZWdpbnMgd2l0aCB4IGFuZCB5IG9mZnNldCBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZSBvcHRpb25hbGx5IHByZXBlbmRlZCBieSBpbnNldFxuY29uc3Qgc2hhZG93UmVnZXggPSAvXihpbnNldF8pPy0/KChcXGQrKT9cXC4/KFxcZCspW2Etel0rfDApXy0/KChcXGQrKT9cXC4/KFxcZCspW2Etel0rfDApLztcbmNvbnN0IGltYWdlUmVnZXggPSAvXih1cmx8aW1hZ2V8aW1hZ2Utc2V0fGNyb3NzLWZhZGV8ZWxlbWVudHwocmVwZWF0aW5nLSk/KGxpbmVhcnxyYWRpYWx8Y29uaWMpLWdyYWRpZW50KVxcKC4rXFwpJC87XG5jb25zdCBpc0ZyYWN0aW9uID0gdmFsdWUgPT4gZnJhY3Rpb25SZWdleC50ZXN0KHZhbHVlKTtcbmNvbnN0IGlzTnVtYmVyID0gdmFsdWUgPT4gISF2YWx1ZSAmJiAhTnVtYmVyLmlzTmFOKE51bWJlcih2YWx1ZSkpO1xuY29uc3QgaXNJbnRlZ2VyID0gdmFsdWUgPT4gISF2YWx1ZSAmJiBOdW1iZXIuaXNJbnRlZ2VyKE51bWJlcih2YWx1ZSkpO1xuY29uc3QgaXNQZXJjZW50ID0gdmFsdWUgPT4gdmFsdWUuZW5kc1dpdGgoJyUnKSAmJiBpc051bWJlcih2YWx1ZS
251145zbGljZSgwLCAtMSkpO1xuY29uc3QgaXNUc2hpcnRTaXplID0gdmFsdWUgPT4gdHNoaXJ0VW5pdFJlZ2V4LnRlc3QodmFsdWUpO1xuY29uc3QgaXNBbnkgPSAoKSA9PiB0cnVlO1xuY29uc3QgaXNMZW5ndGhPbmx5ID0gdmFsdWUgPT5cbi8vIGBjb2xvckZ1bmN0aW9uUmVnZXhgIGNoZWNrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGNvbG9yIGZ1bmN0aW9ucyBjYW4gaGF2ZSBwZXJjZW50YWdlcyBpbiB0aGVtIHdoaWNoIHdoaWNoIHdvdWxkIGJlIGluY29ycmVjdGx5IGNsYXNzaWZpZWQgYXMgbGVuZ3Rocy5cbi8vIEZvciBleGFtcGxlLCBgaHNsKDAgMCUgMCUpYCB3b3VsZCBiZSBjbGFzc2lmaWVkIGFzIGEgbGVuZ3RoIHdpdGhvdXQgdGhpcyBjaGVjay5cbi8vIEkgY291bGQgYWxzbyB1c2UgbG9va2JlaGluZCBhc3NlcnRpb24gaW4gYGxlbmd0aFVuaXRSZWdleGAgYnV0IHRoYXQgaXNuJ3Qgc3VwcG9ydGVkIHdpZGVseSBlbm91Z2guXG5sZW5ndGhVbml0UmVnZXgudGVzdCh2YWx1ZSkgJiYgIWNvbG9yRnVuY3Rpb25SZWdleC50ZXN0KHZhbHVlKTtcbmNvbnN0IGlzTmV2ZXIgPSAoKSA9PiBmYWxzZTtcbmNvbnN0IGlzU2hhZG93ID0gdmFsdWUgPT4gc2hhZG93UmVnZXgudGVzdCh2YWx1ZSk7XG5jb25zdCBpc0ltYWdlID0gdmFsdWUgPT4gaW1hZ2VSZWdleC50ZXN0KHZhbHVlKTtcbmNvbnN0IGlzQW55Tm9uQXJiaXRyYXJ5ID0gdmFsdWUgPT4gIWlzQXJiaXRyYXJ5VmFsdWUodmFsdWUpICYmICFpc0FyYml0cmFyeVZhcmlhYmxlKHZhbHVlKTtcbmNvbnN0IGlzQXJiaXRyYXJ5U2l6ZSA9IHZhbHVlID0+IGdldElzQXJiaXRyYXJ5VmFsdWUodmFsdWUsIGlzTGFiZWxTaXplLCBpc05ldmVyKTtcbmNvbnN0IGlzQXJiaXRyYXJ5VmFsdWUgPSB2YWx1ZSA9PiBhcmJpdHJhcnlWYWx1ZVJlZ2V4LnRlc3QodmFsdWUpO1xuY29uc3QgaXNBcmJpdHJhcnlMZW5ndGggPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhbHVlKHZhbHVlLCBpc0xhYmVsTGVuZ3RoLCBpc0xlbmd0aE9ubHkpO1xuY29uc3QgaXNBcmJpdHJhcnlOdW1iZXIgPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhbHVlKHZhbHVlLCBpc0xhYmVsTnVtYmVyLCBpc051bWJlcik7XG5jb25zdCBpc0FyYml0cmFyeVBvc2l0aW9uID0gdmFsdWUgPT4gZ2V0SXNBcmJpdHJhcnlWYWx1ZSh2YWx1ZSwgaXNMYWJlbFBvc2l0aW9uLCBpc05ldmVyKTtcbmNvbnN0IGlzQXJiaXRyYXJ5SW1hZ2UgPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhbHVlKHZhbHVlLCBpc0xhYmVsSW1hZ2UsIGlzSW1hZ2UpO1xuY29uc3QgaXNBcmJpdHJhcnlTaGFkb3cgPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhbHVlKHZhbHVlLCBpc0xhYmVsU2hhZG93LCBpc1NoYWRvdyk7XG5jb25zdCBpc0FyYml0cmFyeVZhcmlhYmxlID0gdmFsdWUgPT4gYXJiaXRyYXJ5VmFyaWFibGVSZWdleC50ZXN0KHZhbHVlKTtcbmNvbnN0IGlzQXJiaXRyYXJ5VmFyaWFibGVMZW5ndGggPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhcmlhYmxlKHZhbHVlLCBpc0xhYmVsTGVuZ3RoKTtcbmNvbnN0IGlzQXJiaXRyYXJ5VmFyaWFibGVGYW1pbHlOYW1lID0gdmFsdWUgPT4gZ2V0SXNBcmJpdHJhcnlWYXJpYWJsZSh2YWx1ZSwgaXNMYWJlbEZhbWlseU5hbWUpO1xuY29uc3QgaXNBcmJpdHJhcnlWYXJpYWJsZVBvc2l0aW9uID0gdmFsdWUgPT4gZ2V0SXNBcmJpdHJhcnlWYXJpYWJsZSh2YWx1ZSwgaXNMYWJlbFBvc2l0aW9uKTtcbmNvbnN0IGlzQXJiaXRyYXJ5VmFyaWFibGVTaXplID0gdmFsdWUgPT4gZ2V0SXNBcmJpdHJhcnlWYXJpYWJsZSh2YWx1ZSwgaXNMYWJlbFNpemUpO1xuY29uc3QgaXNBcmJpdHJhcnlWYXJpYWJsZUltYWdlID0gdmFsdWUgPT4gZ2V0SXNBcmJpdHJhcnlWYXJpYWJsZSh2YWx1ZSwgaXNMYWJlbEltYWdlKTtcbmNvbnN0IGlzQXJiaXRyYXJ5VmFyaWFibGVTaGFkb3cgPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhcmlhYmxlKHZhbHVlLCBpc0xhYmVsU2hhZG93LCB0cnVlKTtcbi8vIEhlbHBlcnNcbmNvbnN0IGdldElzQXJiaXRyYXJ5VmFsdWUgPSAodmFsdWUsIHRlc3RMYWJlbCwgdGVzdFZhbHVlKSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGFyYml0cmFyeVZhbHVlUmVnZXguZXhlYyh2YWx1ZSk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBpZiAocmVzdWx0WzFdKSB7XG4gICAgICByZXR1cm4gdGVzdExhYmVsKHJlc3VsdFsxXSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXN0VmFsdWUocmVzdWx0WzJdKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuY29uc3QgZ2V0SXNBcmJpdHJhcnlWYXJpYWJsZSA9ICh2YWx1ZSwgdGVzdExhYmVsLCBzaG91bGRNYXRjaE5vTGFiZWwgPSBmYWxzZSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBhcmJpdHJhcnlWYXJpYWJsZVJlZ2V4LmV4ZWModmFsdWUpO1xuICBpZiAocmVzdWx0KSB7XG4gICAgaWYgKHJlc3VsdFsxXSkge1xuICAgICAgcmV0dXJuIHRlc3RMYWJlbChyZXN1bHRbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gc2hvdWxkTWF0Y2hOb0xhYmVsO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG4vLyBMYWJlbHNcbmNvbnN0IGlzTGFiZWxQb3NpdGlvbiA9IGxhYmVsID0+IGxhYmVsID09PSAncG9zaXRpb24nIHx8IGxhYmVsID09PSAncGVyY2VudGFnZSc7XG5jb25zdCBpc0xhYmVsSW1hZ2UgPSBsYWJlbCA9PiBsYWJlbCA9PT0gJ2ltYWdlJyB8fCBsYWJlbCA9PT0gJ3VybCc7XG5jb25zdCBpc0xhYmVsU2l6ZSA9IGxhYmVsID0+IGxhYmVsID09PSAnbGVuZ3RoJyB8fCBsYWJlbCA9PT0gJ3NpemUnIHx8IGxhYmVsID09PSAnYmctc2l6ZSc7XG5jb25zdCBpc0xhYmVsTGVuZ3RoID0gbGFiZWwgPT4gbGFiZWwgPT09ICdsZW5ndGgnO1xuY29uc3QgaXNMYWJlbE51bWJlciA9IGxhYmVsID0+IGxhYmVsID09PSAnbnVtYmVyJztcbmNvbnN0IGlzTGFiZWxGYW1pbHlOYW1lID0gbGFiZWwgPT4gbGFiZWwgPT09ICdmYW1pbHktbmFtZSc7XG5jb25zdCBpc0xhYmVsU2hhZG93ID0gbGFiZWwgPT4gbGFiZWwgPT09ICdzaGFkb3cnO1xuY29uc3QgdmFsaWRhdG9ycyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIGlzQW55LFxuICBpc0FueU5vbkFyYml0cmFyeSxcbiAgaXNBcmJpdHJhcnlJbWFnZSxcbiAgaXNBcmJpdHJhcnlMZW5ndGgsXG4gIGlzQXJiaXRyYXJ5TnVtYmVyLFxuICBpc0FyYml0cmFyeVBvc2l0aW9uLFxuICBpc0FyYml0cmFyeVNoYWRvdyxcbiAgaXNBcmJpdHJhcnlTaXplLFxuICBpc0FyYml0cmFyeVZhbHVlLFxuICBpc0FyYml0cmFyeVZhcmlhYmxlLFxuICBpc0FyYml0cmFyeVZhcmlhYmxlRmFtaWx5TmFtZSxcbiAgaXNBcmJpdHJhcnlWYXJpYWJsZUltYWdlLFxuICBpc0FyYml0cmFyeVZhcmlhYmxlTGVuZ3RoLFxuICBpc0FyYml0cmFyeVZhcmlhYmxlUG9zaXRpb24sXG4gIGlzQXJiaXRyYXJ5VmFyaWFibGVTaGFkb3csXG4gIGlzQXJiaXRyYXJ5VmFyaWFibGVTaXplLFxuICBpc0ZyYWN0aW9uLFxuICBpc0ludGVnZXIsXG4gIGlzTnVtYmVyLFxuICBpc1BlcmNlbnQsXG4gIGlzVHNoaXJ0U2l6ZVxufSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gIHZhbHVlOiAnTW9kdWxlJ
251141xufSk7XG5jb25zdCBnZXREZWZhdWx0Q29uZmlnID0gKCkgPT4ge1xuICAvKipcbiAgICogVGhlbWUgZ2V0dGVycyBmb3IgdGhlbWUgdmFyaWFibGUgbmFtZXNwYWNlc1xuICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGhlbWUjdGhlbWUtdmFyaWFibGUtbmFtZXNwYWNlc1xuICAgKi9cbiAgLyoqKi9cbiAgY29uc3QgdGhlbWVDb2xvciA9IGZyb21UaGVtZSgnY29sb3InKTtcbiAgY29uc3QgdGhlbWVGb250ID0gZnJvbVRoZW1lKCdmb250Jyk7XG4gIGNvbnN0IHRoZW1lVGV4dCA9IGZyb21UaGVtZSgndGV4dCcpO1xuICBjb25zdCB0aGVtZUZvbnRXZWlnaHQgPSBmcm9tVGhlbWUoJ2ZvbnQtd2VpZ2h0Jyk7XG4gIGNvbnN0IHRoZW1lVHJhY2tpbmcgPSBmcm9tVGhlbWUoJ3RyYWNraW5nJyk7XG4gIGNvbnN0IHRoZW1lTGVhZGluZyA9IGZyb21UaGVtZSgnbGVhZGluZycpO1xuICBjb25zdCB0aGVtZUJyZWFrcG9pbnQgPSBmcm9tVGhlbWUoJ2JyZWFrcG9pbnQnKTtcbiAgY29uc3QgdGhlbWVDb250YWluZXIgPSBmcm9tVGhlbWUoJ2NvbnRhaW5lcicpO1xuICBjb25zdCB0aGVtZVNwYWNpbmcgPSBmcm9tVGhlbWUoJ3NwYWNpbmcnKTtcbiAgY29uc3QgdGhlbWVSYWRpdXMgPSBmcm9tVGhlbWUoJ3JhZGl1cycpO1xuICBjb25zdCB0aGVtZVNoYWRvdyA9IGZyb21UaGVtZSgnc2hhZG93Jyk7XG4gIGNvbnN0IHRoZW1lSW5zZXRTaGFkb3cgPSBmcm9tVGhlbWUoJ2luc2V0LXNoYWRvdycpO1xuICBjb25zdCB0aGVtZVRleHRTaGFkb3cgPSBmcm9tVGhlbWUoJ3RleHQtc2hhZG93Jyk7XG4gIGNvbnN0IHRoZW1lRHJvcFNoYWRvdyA9IGZyb21UaGVtZSgnZHJvcC1zaGFkb3cnKTtcbiAgY29uc3QgdGhlbWVCbHVyID0gZnJvbVRoZW1lKCdibHVyJyk7XG4gIGNvbnN0IHRoZW1lUGVyc3BlY3RpdmUgPSBmcm9tVGhlbWUoJ3BlcnNwZWN0aXZlJyk7XG4gIGNvbnN0IHRoZW1lQXNwZWN0ID0gZnJvbVRoZW1lKCdhc3BlY3QnKTtcbiAgY29uc3QgdGhlbWVFYXNlID0gZnJvbVRoZW1lKCdlYXNlJyk7XG4gIGNvbnN0IHRoZW1lQW5pbWF0ZSA9IGZyb21UaGVtZSgnYW5pbWF0ZScpO1xuICAvKipcbiAgICogSGVscGVycyB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHNhbWUgc2NhbGVzXG4gICAqXG4gICAqIFdlIHVzZSBmdW5jdGlvbnMgdGhhdCBjcmVhdGUgYSBuZXcgYXJyYXkgZXZlcnkgdGltZSB0aGV5J3JlIGNhbGxlZCBpbnN0ZWFkIG9mIHN0YXRpYyBhcnJheXMuXG4gICAqIFRoaXMgZW5zdXJlcyB0aGF0IHVzZXJzIHdobyBtb2RpZnkgYW55IHNjYWxlIGJ5IG11dGF0aW5nIHRoZSBhcnJheSAoZS5nLiB3aXRoIGBhcnJheS5wdXNoKGVsZW1lbnQpYCkgZG9uJ3QgYWNjaWRlbnRhbGx5IG11dGF0ZSBhcnJheXMgaW4gb3RoZXIgcGFydHMgb2YgdGhlIGNvbmZpZy5cbiAgICovXG4gIC8qKiovXG4gIGNvbnN0IHNjYWxlQnJlYWsgPSAoKSA9PiBbJ2F1dG8nLCAnYXZvaWQnLCAnYWxsJywgJ2F2b2lkLXBhZ2UnLCAncGFnZScsICdsZWZ0JywgJ3JpZ2h0JywgJ2NvbHVtbiddO1xuICBjb25zdCBzY2FsZVBvc2l0aW9uID0gKCkgPT4gWydjZW50ZXInLCAndG9wJywgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0JywgJ3RvcC1sZWZ0JyxcbiAgLy8gRGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjQuMS4wLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy9wdWxsLzE3Mzc4XG4gICdsZWZ0LXRvcCcsICd0b3AtcmlnaHQnLFxuICAvLyBEZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2NC4xLjAsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGFpbHdpbmRsYWJzL3RhaWx3aW5kY3NzL3B1bGwvMTczNzhcbiAgJ3JpZ2h0LXRvcCcsICdib3R0b20tcmlnaHQnLFxuICAvLyBEZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2NC4xLjAsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGFpbHdpbmRsYWJzL3RhaWx3aW5kY3NzL3B1bGwvMTczNzhcbiAgJ3JpZ2h0LWJvdHRvbScsICdib3R0b20tbGVmdCcsXG4gIC8vIERlcHJlY2F0ZWQgc2luY2UgVGFpbHdpbmQgQ1NTIHY0LjEuMCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90YWlsd2luZGxhYnMvdGFpbHdpbmRjc3MvcHVsbC8xNzM3OFxuICAnbGVmdC1ib3R0b20nXTtcbiAgY29uc3Qgc2NhbGVQb3NpdGlvbldpdGhBcmJpdHJhcnkgPSAoKSA9PiBbLi4uc2NhbGVQb3NpdGlvbigpLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXTtcbiAgY29uc3Qgc2NhbGVPdmVyZmxvdyA9ICgpID0+IFsnYXV0bycsICdoaWRkZW4nLCAnY2xpcCcsICd2aXNpYmxlJywgJ3Njcm9sbCddO1xuICBjb25zdCBzY2FsZU92ZXJzY3JvbGwgPSAoKSA9PiBbJ2F1dG8nLCAnY29udGFpbicsICdub25lJ107XG4gIGNvbnN0IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nID0gKCkgPT4gW2lzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWUsIHRoZW1lU3BhY2luZ107XG4gIGNvbnN0IHNjYWxlSW5zZXQgPSAoKSA9PiBbaXNGcmFjdGlvbiwgJ2Z1bGwnLCAnYXV0bycsIC4uLnNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKCldO1xuICBjb25zdCBzY2FsZUdyaWRUZW1wbGF0ZUNvbHNSb3dzID0gKCkgPT4gW2lzSW50ZWdlciwgJ25vbmUnLCAnc3ViZ3JpZCcsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBzY2FsZUdyaWRDb2xSb3dTdGFydEFuZEVuZCA9ICgpID0+IFsnYXV0bycsIHtcbiAgICBzcGFuOiBbJ2Z1bGwnLCBpc0ludGVnZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gIH0sIGlzSW50ZWdlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV07XG4gIGNvbnN0IHNjYWxlR3JpZENvbFJvd1N0YXJ0T3JFbmQgPSAoKSA9PiBbaXNJbnRlZ2VyLCAnYXV0bycsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBzY2FsZUdyaWRBdXRvQ29sc1Jvd3MgPSAoKSA9PiBbJ2F1dG8nLCAnbWluJywgJ21heCcsICdmcicsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBzY2FsZUFsaWduUHJpbWFyeUF4aXMgPSAoKSA9PiBbJ3N0YXJ0JywgJ2VuZCcsICdjZW50ZXInLCAnYmV0d2VlbicsICdhcm91bmQnLCAnZXZlbmx5JywgJ3N0cmV0Y2gnLCAnYmFzZWxpbmUnLCAnY2VudGVyLXNhZmUnLCAnZW5kLXNhZmUnXTtcbiAgY29uc3Qgc2NhbGVBbGlnblNlY29uZGFyeUF4aXMgPSAoKSA9PiBbJ3N0YXJ0JywgJ2VuZCcsICdjZW50ZXInLCAnc3RyZXRjaCcsICdjZW50ZXItc2FmZScsICdlbmQtc2FmZSddO1xuICBjb25zdCBzY2FsZU1hcmdpbiA9ICgpID0+IFsnYXV0bycsIC4uLnNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKCldO1xuICBjb25zdCBzY2FsZVNpemluZyA9ICgpID0+IFtpc0ZyYWN0aW9uLCAnYXV0bycsICdmdWxsJywgJ2R2dycsICdkdmgnLCA
25114nbHZ3JywgJ2x2aCcsICdzdncnLCAnc3ZoJywgJ21pbicsICdtYXgnLCAnZml0JywgLi4uc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKV07XG4gIGNvbnN0IHNjYWxlQ29sb3IgPSAoKSA9PiBbdGhlbWVDb2xvciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV07XG4gIGNvbnN0IHNjYWxlQmdQb3NpdGlvbiA9ICgpID0+IFsuLi5zY2FsZVBvc2l0aW9uKCksIGlzQXJiaXRyYXJ5VmFyaWFibGVQb3NpdGlvbiwgaXNBcmJpdHJhcnlQb3NpdGlvbiwge1xuICAgIHBvc2l0aW9uOiBbaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgfV07XG4gIGNvbnN0IHNjYWxlQmdSZXBlYXQgPSAoKSA9PiBbJ25vLXJlcGVhdCcsIHtcbiAgICByZXBlYXQ6IFsnJywgJ3gnLCAneScsICdzcGFjZScsICdyb3VuZCddXG4gIH1dO1xuICBjb25zdCBzY2FsZUJnU2l6ZSA9ICgpID0+IFsnYXV0bycsICdjb3ZlcicsICdjb250YWluJywgaXNBcmJpdHJhcnlWYXJpYWJsZVNpemUsIGlzQXJiaXRyYXJ5U2l6ZSwge1xuICAgIHNpemU6IFtpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICB9XTtcbiAgY29uc3Qgc2NhbGVHcmFkaWVudFN0b3BQb3NpdGlvbiA9ICgpID0+IFtpc1BlcmNlbnQsIGlzQXJiaXRyYXJ5VmFyaWFibGVMZW5ndGgsIGlzQXJiaXRyYXJ5TGVuZ3RoXTtcbiAgY29uc3Qgc2NhbGVSYWRpdXMgPSAoKSA9PiBbXG4gIC8vIERlcHJlY2F0ZWQgc2luY2UgVGFpbHdpbmQgQ1NTIHY0LjAuMFxuICAnJywgJ25vbmUnLCAnZnVsbCcsIHRoZW1lUmFkaXVzLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXTtcbiAgY29uc3Qgc2NhbGVCb3JkZXJXaWR0aCA9ICgpID0+IFsnJywgaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGVMZW5ndGgsIGlzQXJiaXRyYXJ5TGVuZ3RoXTtcbiAgY29uc3Qgc2NhbGVMaW5lU3R5bGUgPSAoKSA9PiBbJ3NvbGlkJywgJ2Rhc2hlZCcsICdkb3R0ZWQnLCAnZG91YmxlJ107XG4gIGNvbnN0IHNjYWxlQmxlbmRNb2RlID0gKCkgPT4gWydub3JtYWwnLCAnbXVsdGlwbHknLCAnc2NyZWVuJywgJ292ZXJsYXknLCAnZGFya2VuJywgJ2xpZ2h0ZW4nLCAnY29sb3ItZG9kZ2UnLCAnY29sb3ItYnVybicsICdoYXJkLWxpZ2h0JywgJ3NvZnQtbGlnaHQnLCAnZGlmZmVyZW5jZScsICdleGNsdXNpb24nLCAnaHVlJywgJ3NhdHVyYXRpb24nLCAnY29sb3InLCAnbHVtaW5vc2l0eSddO1xuICBjb25zdCBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uID0gKCkgPT4gW2lzTnVtYmVyLCBpc1BlcmNlbnQsIGlzQXJiaXRyYXJ5VmFyaWFibGVQb3NpdGlvbiwgaXNBcmJpdHJhcnlQb3NpdGlvbl07XG4gIGNvbnN0IHNjYWxlQmx1ciA9ICgpID0+IFtcbiAgLy8gRGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjQuMC4wXG4gICcnLCAnbm9uZScsIHRoZW1lQmx1ciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV07XG4gIGNvbnN0IHNjYWxlUm90YXRlID0gKCkgPT4gWydub25lJywgaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBzY2FsZVNjYWxlID0gKCkgPT4gWydub25lJywgaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBzY2FsZVNrZXcgPSAoKSA9PiBbaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBzY2FsZVRyYW5zbGF0ZSA9ICgpID0+IFtpc0ZyYWN0aW9uLCAnZnVsbCcsIC4uLnNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKCldO1xuICByZXR1cm4ge1xuICAgIGNhY2hlU2l6ZTogNTAwLFxuICAgIHRoZW1lOiB7XG4gICAgICBhbmltYXRlOiBbJ3NwaW4nLCAncGluZycsICdwdWxzZScsICdib3VuY2UnXSxcbiAgICAgIGFzcGVjdDogWyd2aWRlbyddLFxuICAgICAgYmx1cjogW2lzVHNoaXJ0U2l6ZV0sXG4gICAgICBicmVha3BvaW50OiBbaXNUc2hpcnRTaXplXSxcbiAgICAgIGNvbG9yOiBbaXNBbnldLFxuICAgICAgY29udGFpbmVyOiBbaXNUc2hpcnRTaXplXSxcbiAgICAgICdkcm9wLXNoYWRvdyc6IFtpc1RzaGlydFNpemVdLFxuICAgICAgZWFzZTogWydpbicsICdvdXQnLCAnaW4tb3V0J10sXG4gICAgICBmb250OiBbaXNBbnlOb25BcmJpdHJhcnldLFxuICAgICAgJ2ZvbnQtd2VpZ2h0JzogWyd0aGluJywgJ2V4dHJhbGlnaHQnLCAnbGlnaHQnLCAnbm9ybWFsJywgJ21lZGl1bScsICdzZW1pYm9sZCcsICdib2xkJywgJ2V4dHJhYm9sZCcsICdibGFjayddLFxuICAgICAgJ2luc2V0LXNoYWRvdyc6IFtpc1RzaGlydFNpemVdLFxuICAgICAgbGVhZGluZzogWydub25lJywgJ3RpZ2h0JywgJ3NudWcnLCAnbm9ybWFsJywgJ3JlbGF4ZWQnLCAnbG9vc2UnXSxcbiAgICAgIHBlcnNwZWN0aXZlOiBbJ2RyYW1hdGljJywgJ25lYXInLCAnbm9ybWFsJywgJ21pZHJhbmdlJywgJ2Rpc3RhbnQnLCAnbm9uZSddLFxuICAgICAgcmFkaXVzOiBbaXNUc2hpcnRTaXplXSxcbiAgICAgIHNoYWRvdzogW2lzVHNoaXJ0U2l6ZV0sXG4gICAgICBzcGFjaW5nOiBbJ3B4JywgaXNOdW1iZXJdLFxuICAgICAgdGV4dDogW2lzVHNoaXJ0U2l6ZV0sXG4gICAgICAndGV4dC1zaGFkb3cnOiBbaXNUc2hpcnRTaXplXSxcbiAgICAgIHRyYWNraW5nOiBbJ3RpZ2h0ZXInLCAndGlnaHQnLCAnbm9ybWFsJywgJ3dpZGUnLCAnd2lkZXInLCAnd2lkZXN0J11cbiAgICB9LFxuICAgIGNsYXNzR3JvdXBzOiB7XG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLVxuICAgICAgLy8gLS0tIExheW91dCAtLS1cbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tXG4gICAgICAvKipcbiAgICAgICAqIEFzcGVjdCBSYXRpb1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2FzcGVjdC1yYXRpb1xuICAgICAgICovXG4gICAgICBhc3BlY3Q6IFt7XG4gICAgICAgIGFzcGVjdDogWydhdXRvJywgJ3NxdWFyZScsIGlzRnJhY3Rpb24sIGlzQXJiaXRyYXJ5VmFsdWUsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIHRoZW1lQXNwZWN0XVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIENvbnRhaW5lclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2NvbnRhaW5lclxuICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgVGFpbHdpbmQgQ1NTIHY0LjAuMFxuICAgICAgICovXG4gICAgICBjb250YWluZXI6IFsnY29udGFpbmVyJ10sXG4gICAgICAvKipcbiAgICAgICAqIENvbHVtbnNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9jb2x1bW5zXG4gICAgICAgKi9cbiAgICAgIGNvbHVtbnM6IFt7XG4gICAgICAgIGNvbHVtbnM6IFtpc051bWJlciwgaXNBcmJpdHJhcnlWYWx1ZSwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgdGhlbWVDb250YWluZXJdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQnJlYWsgQWZ0ZXJcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9icmVhay1hZnRlclxuICAgICAgICovXG4gICAgICAnYnJlYWstYWZ0ZXInOiBbe1xuICAgICAgICAnYnJlYWstYWZ0ZXInOiBzY2FsZUJyZWFrKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCcmVhayBCZWZvcmVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9icmVhay1iZWZvcmVcbiAgICAgICAqL1xuICAgICAgJ2JyZWFrLWJlZm9yZSc6IFt7XG4gICAgICAgICdicmVhay1iZWZvcmUnOiBzY2FsZUJyZWFrKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCcmVhayBJbnNpZGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9icmVhay1pbnNpZGVcbiAgICAgICAqL1xuICAgICAgJ2JyZWFrLWluc2lkZSc6IFt7XG4gICAgICAgICdicmVhay1pbnNpZGUnOiBbJ2F1dG8nLCAnYXZvaWQnLCAnYXZvaWQtcGFnZScsICdhdm9pZC1jb2x1bW4nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJveCBEZWNvcmF0aW9uIEJyZWFrXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm94LWRlY29yYXRpb24tYnJlYWtcbiAgICAgICAqL1xuICAgICAgJ2JveC1kZWNvcmF0aW9uJzogW3tcbiAgICAgICAgJ2JveC1kZWNvcmF0aW9uJzogWydzbGljZScsICdjbG9uZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm94IFNpemluZ1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JveC1zaXppbmdcbiAgICAgICAqL1xuICAgICAgYm94OiBbe1xuICAgICAgICBib3g6IFsnYm9yZGVyJywgJ2NvbnRlbnQnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIERpc3BsYXlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9kaXNwbGF5XG4gICAgICAgKi9cbiAgICAgIGRpc3BsYXk6IFsnYmxvY2snLCAnaW5saW5lLWJsb2NrJywgJ2lubGluZScsICdmbGV4JywgJ2lubGluZS1mbGV4JywgJ3RhYmxlJywgJ2lubGluZS10YWJsZScsICd0YWJsZS1jYXB0aW9uJywgJ3RhYmxlLWNlbGwnLCAndGFibGUtY29sdW1uJywgJ3RhYmxlLWNvbHVtbi1ncm91cCcsICd0YWJsZS1mb290ZXItZ3JvdXAnLCAndGFibGUtaGVhZGVyLWdyb3VwJywgJ3RhYmxlLXJvdy1ncm91cCcsICd0YWJsZS1yb3cnLCAnZmxvdy1yb290JywgJ2dyaWQnLCAnaW5saW5lLWdyaWQnLCAnY29udGVudHMnLCAnbGlzdC1pdGVtJywgJ2hpZGRlbiddLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JlZW4gUmVhZGVyIE9ubHlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9kaXNwbGF5I3
25114NjcmVlbi1yZWFkZXItb25seVxuICAgICAgICovXG4gICAgICBzcjogWydzci1vbmx5JywgJ25vdC1zci1vbmx5J10sXG4gICAgICAvKipcbiAgICAgICAqIEZsb2F0c1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2Zsb2F0XG4gICAgICAgKi9cbiAgICAgIGZsb2F0OiBbe1xuICAgICAgICBmbG9hdDogWydyaWdodCcsICdsZWZ0JywgJ25vbmUnLCAnc3RhcnQnLCAnZW5kJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2NsZWFyXG4gICAgICAgKi9cbiAgICAgIGNsZWFyOiBbe1xuICAgICAgICBjbGVhcjogWydsZWZ0JywgJ3JpZ2h0JywgJ2JvdGgnLCAnbm9uZScsICdzdGFydCcsICdlbmQnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIElzb2xhdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2lzb2xhdGlvblxuICAgICAgICovXG4gICAgICBpc29sYXRpb246IFsnaXNvbGF0ZScsICdpc29sYXRpb24tYXV0byddLFxuICAgICAgLyoqXG4gICAgICAgKiBPYmplY3QgRml0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb2JqZWN0LWZpdFxuICAgICAgICovXG4gICAgICAnb2JqZWN0LWZpdCc6IFt7XG4gICAgICAgIG9iamVjdDogWydjb250YWluJywgJ2NvdmVyJywgJ2ZpbGwnLCAnbm9uZScsICdzY2FsZS1kb3duJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPYmplY3QgUG9zaXRpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vYmplY3QtcG9zaXRpb25cbiAgICAgICAqL1xuICAgICAgJ29iamVjdC1wb3NpdGlvbic6IFt7XG4gICAgICAgIG9iamVjdDogc2NhbGVQb3NpdGlvbldpdGhBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE92ZXJmbG93XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3ZlcmZsb3dcbiAgICAgICAqL1xuICAgICAgb3ZlcmZsb3c6IFt7XG4gICAgICAgIG92ZXJmbG93OiBzY2FsZU92ZXJmbG93KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdmVyZmxvdyBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3ZlcmZsb3dcbiAgICAgICAqL1xuICAgICAgJ292ZXJmbG93LXgnOiBbe1xuICAgICAgICAnb3ZlcmZsb3cteCc6IHNjYWxlT3ZlcmZsb3coKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE92ZXJmbG93IFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vdmVyZmxvd1xuICAgICAgICovXG4gICAgICAnb3ZlcmZsb3cteSc6IFt7XG4gICAgICAgICdvdmVyZmxvdy15Jzogc2NhbGVPdmVyZmxvdygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogT3ZlcnNjcm9sbCBCZWhhdmlvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL292ZXJzY3JvbGwtYmVoYXZpb3JcbiAgICAgICAqL1xuICAgICAgb3ZlcnNjcm9sbDogW3tcbiAgICAgICAgb3ZlcnNjcm9sbDogc2NhbGVPdmVyc2Nyb2xsKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdmVyc2Nyb2xsIEJlaGF2aW9yIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vdmVyc2Nyb2xsLWJlaGF2aW9yXG4gICAgICAgKi9cbiAgICAgICdvdmVyc2Nyb2xsLXgnOiBbe1xuICAgICAgICAnb3ZlcnNjcm9sbC14Jzogc2NhbGVPdmVyc2Nyb2xsKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdmVyc2Nyb2xsIEJlaGF2aW9yIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vdmVyc2Nyb2xsLWJlaGF2aW9yXG4gICAgICAgKi9cbiAgICAgICdvdmVyc2Nyb2xsLXknOiBbe1xuICAgICAgICAnb3ZlcnNjcm9sbC15Jzogc2NhbGVPdmVyc2Nyb2xsKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQb3NpdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Bvc2l0aW9uXG4gICAgICAgKi9cbiAgICAgIHBvc2l0aW9uOiBbJ3N0YXRpYycsICdmaXhlZCcsICdhYnNvbHV0ZScsICdyZWxhdGl2ZScsICdzdGlja3knXSxcbiAgICAgIC8qKlxuICAgICAgICogVG9wIC8gUmlnaHQgLyBCb3R0b20gLyBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIGluc2V0OiBbe1xuICAgICAgICBpbnNldDogc2NhbGVJbnNldCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUmlnaHQgLyBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgICdpbnNldC14JzogW3tcbiAgICAgICAgJ2luc2V0LXgnOiBzY2FsZUluc2V0KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUb3AgLyBCb3R0b21cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90b3AtcmlnaHQtYm90dG9tLWxlZnRcbiAgICAgICAqL1xuICAgICAgJ2luc2V0LXknOiBbe1xuICAgICAgICAnaW5zZXQteSc6IHNjYWxlSW5zZXQoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFN0YXJ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIHN0YXJ0OiBbe1xuICAgICAgICBzdGFydDogc2NhbGVJbnNldCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIGVuZDogW3tcbiAgICAgICAgZW5kOiBzY2FsZUluc2V0KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUb3BcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90b3AtcmlnaHQtYm90dG9tLWxlZnRcbiAgICAgICAqL1xuICAgICAgdG9wOiBbe1xuICAgICAgICB0b3A6IHNjYWxlSW5zZXQoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIHJpZ2h0OiBbe1xuICAgICAgICByaWdodDogc2NhbGVJbnNldCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIGJvdHRvbTogW3tcbiAgICAgICAgYm90dG9tOiBzY2FsZUluc2V0KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIGxlZnQ6IFt7XG4gICAgICAgIGxlZnQ6IHNjYWxlSW5zZXQoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFZpc2liaWxpdHlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy92aXNpYmlsaXR5XG4gICAgICAgKi9cbiAgICAgIHZpc2liaWxpdHk6IFsndmlzaWJsZScsICdpbnZpc2libGUnLCAnY29sbGFwc2UnXSxcbiAgICAgIC8qKlxuICAgICAgICogWi1JbmRleFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3otaW5kZXhcbiAgICAgICAqL1xuICAgICAgejogW3tcbiAgICAgICAgejogW2lzSW50ZWdlciwgJ2F1dG8nLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIC0tLSBGbGV4Ym94IGFuZCBHcmlkIC0tLVxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvKipcbiAgICAgICAqIEZsZXggQmFzaXNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mbGV4LWJhc2lzXG4gICAgICAgKi9cbiAgICAgIGJhc2lzOiBbe1xuICAgICAgICBiYXNpczogW2lzRnJhY3Rpb24sICdmdWxsJywgJ2F1dG8nLCB0aGVtZUNvbnRhaW5lciwgLi4uc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBGbGV4IERpcmVjdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZsZXgtZGlyZWN0aW9uXG4gICAgICAgKi9cbiAgICAgICdmbGV4LWRpcmVjdGlvbic6IFt7XG4gICAgICAgIGZsZXg6IFsncm93JywgJ3Jvdy1yZXZlcnNlJywgJ2NvbCcsICdjb2wtcmV2ZXJzZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRmxleCBXcmFwXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZmxleC13cmFwXG4gICAgICAgKi9cbiAgICAgICdmbGV4LXdyYXAnOiBbe1xuICAgICAgICBmbGV4OiBbJ25vd3JhcCcsICd3cmFwJywgJ3dyYXAtcmV2ZXJzZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRmxleFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZsZXhcbiAgICAgICAqL1xuICAgICAgZmxleDogW3tcbiAgICAgICAgZmxleDogW2lzTnVtYmVyLCBpc0ZyYWN0aW9uLCAnYXV0bycsICdpbml0aWFsJywgJ25vbmUnLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEZsZXggR3Jvd1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZsZXgtZ3Jvd1xuICAgICAgICovXG4gICAgICBncm93OiBbe1xuICAgICAgICBncm93OiBbJycsIGlzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEZsZXggU2hyaW5rXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZmxleC1zaHJpbmtcbiAgICAgICAqL1xuICAgICAgc2hyaW5rOiBbe1xuICAgICAgICBzaHJpbms6IFsnJywgaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogT3JkZXJcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vcmRlclxuICAgICAgICovXG4gICAgICBvcmRlcjogW3tcbiAgICAgICAgb3JkZXI6IFtpc0ludGVnZXIsICdmaXJzdCcsICdsYXN0JywgJ25vbmUnLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgVGVtcGxhdGUgQ29sdW1uc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyaWQtdGVtcGxhdGUtY29sdW1uc1xuICAgICAgICovXG4gICAgICAnZ3JpZC1jb2xzJzogW3tcbiAgICAgICAgJ2dyaWQtY29scyc6IHNjYWxlR3JpZFRlbXBsYXRlQ29sc1Jvd3MoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgQ29sdW1uIFN0YXJ0IC8gRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1jb2x1bW5cbiAgICAgICAqL1xuICAgICAgJ2NvbC1zdGFydC1lbmQnOiBbe1xuICAgICAgICBjb2w6IHNjYWxlR3JpZENvbFJvd1N0YXJ0QW5kRW5kKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmlkIENvbHVtbiBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyaWQtY29sdW1uXG4gICAgICAgKi9cbiAgICAgICdjb2wtc3RhcnQnOiBbe1xuICAgICAgICAnY29sLXN0YXJ0Jzogc2NhbGVHcmlkQ29sUm93U3RhcnRPckVuZCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JpZCBDb2x1bW4gRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1jb2x1bW5cbiAgICAgICAqL1xuICAgICAgJ2NvbC1lbmQnOiBbe1xuICAgICAgICAnY29sLWVuZCc6IHNjYWxlR3JpZENvbFJvd1N0YXJ0T3JFbmQoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgVGVtcGxhdGUgUm93c1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyaWQtdGVtcGxhdGUtcm93c1xuICAgICAgICovXG4gICAgICAnZ3JpZC1yb3dzJzogW3tcbiAgICAgICAgJ2dyaWQtcm93cyc6IHNjYWxlR3JpZFRlbXBsYXRlQ29sc1Jvd3MoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgUm93IFN0YXJ0IC8gRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1yb3dcbiAgICAgICAqL1xuICAgICAgJ3Jvdy1zdGFydC1lbmQnOiBbe1xuICAgICAgICByb3c6IHNjYWxlR3JpZENvbFJvd1N0YXJ0QW5kRW5kKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmlkIFJvdyBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyaWQtcm93XG4gICAgICAgKi9cbiAgICAgICdyb3ctc3RhcnQnOiBbe1xuICAgICAgICAncm93LXN0YXJ0Jzogc2NhbGVHcmlkQ29sUm93U3RhcnRPckVuZCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JpZCBSb3cgRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1yb3dcbiAgICAgICAqL1xuICAgICAgJ3Jvdy1lbmQnOiBbe1xuICAgICAgICAncm93LWVuZCc6IHNjYWxlR3JpZENvbFJvd1N0YXJ0T3JFbmQoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgQXV0byBGbG93XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1hdXRvLWZsb3dcbiAgICAgICAqL1xuICAgICAgJ2dyaWQtZmxvdyc6IFt7XG4gICAgICAgICdncmlkLWZsb3cnOiBbJ3JvdycsICdjb2wnLCAnZGVuc2UnLCAncm93LWRlbnNlJywgJ2NvbC1kZW5zZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JpZCBBdXRvIENvbHVtbnNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmlkLWF1dG8tY29sdW1uc1xuICAgICAgICovXG4gICAgICAnYXV0by1jb2xzJzogW3tcbiAgICAgICAgJ2F1dG8tY29scyc6IHNjYWxlR3JpZEF1dG9Db2xzUm93cygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JpZCBBdXRvIFJvd3NcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmlkLWF1dG8tcm93c1xuICAgICAgICovXG4gICAgICAnYXV0by1yb3dzJzogW3tcbiAgICAgICAgJ2F1dG8tcm93cyc6IHNjYWxlR3JpZEF1dG9Db2xzUm93cygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR2FwXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ2FwXG4gICAgICAgKi9cbiAgICAgIGdhcDogW3tcbiAgICAgICAgZ2FwOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR2FwIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9nYXBcbiAgICAgICAqL1xuICAgICAgJ2dhcC14JzogW3tcbiAgICAgICAgJ2dhcC14Jzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdhcCBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ2FwXG4gICAgICAgKi9cbiAgICAgICdnYXAteSc6IFt7XG4gICAgICAgICdnYXAteSc6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBKdXN0aWZ5IENvbnRlbnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9qdXN0aWZ5LWNvbnRlbn
25114RcbiAgICAgICAqL1xuICAgICAgJ2p1c3RpZnktY29udGVudCc6IFt7XG4gICAgICAgIGp1c3RpZnk6IFsuLi5zY2FsZUFsaWduUHJpbWFyeUF4aXMoKSwgJ25vcm1hbCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogSnVzdGlmeSBJdGVtc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2p1c3RpZnktaXRlbXNcbiAgICAgICAqL1xuICAgICAgJ2p1c3RpZnktaXRlbXMnOiBbe1xuICAgICAgICAnanVzdGlmeS1pdGVtcyc6IFsuLi5zY2FsZUFsaWduU2Vjb25kYXJ5QXhpcygpLCAnbm9ybWFsJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBKdXN0aWZ5IFNlbGZcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9qdXN0aWZ5LXNlbGZcbiAgICAgICAqL1xuICAgICAgJ2p1c3RpZnktc2VsZic6IFt7XG4gICAgICAgICdqdXN0aWZ5LXNlbGYnOiBbJ2F1dG8nLCAuLi5zY2FsZUFsaWduU2Vjb25kYXJ5QXhpcygpXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEFsaWduIENvbnRlbnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9hbGlnbi1jb250ZW50XG4gICAgICAgKi9cbiAgICAgICdhbGlnbi1jb250ZW50JzogW3tcbiAgICAgICAgY29udGVudDogWydub3JtYWwnLCAuLi5zY2FsZUFsaWduUHJpbWFyeUF4aXMoKV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGlnbiBJdGVtc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2FsaWduLWl0ZW1zXG4gICAgICAgKi9cbiAgICAgICdhbGlnbi1pdGVtcyc6IFt7XG4gICAgICAgIGl0ZW1zOiBbLi4uc2NhbGVBbGlnblNlY29uZGFyeUF4aXMoKSwge1xuICAgICAgICAgIGJhc2VsaW5lOiBbJycsICdsYXN0J11cbiAgICAgICAgfV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGlnbiBTZWxmXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYWxpZ24tc2VsZlxuICAgICAgICovXG4gICAgICAnYWxpZ24tc2VsZic6IFt7XG4gICAgICAgIHNlbGY6IFsnYXV0bycsIC4uLnNjYWxlQWxpZ25TZWNvbmRhcnlBeGlzKCksIHtcbiAgICAgICAgICBiYXNlbGluZTogWycnLCAnbGFzdCddXG4gICAgICAgIH1dXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGxhY2UgQ29udGVudFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BsYWNlLWNvbnRlbnRcbiAgICAgICAqL1xuICAgICAgJ3BsYWNlLWNvbnRlbnQnOiBbe1xuICAgICAgICAncGxhY2UtY29udGVudCc6IHNjYWxlQWxpZ25QcmltYXJ5QXhpcygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGxhY2UgSXRlbXNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wbGFjZS1pdGVtc1xuICAgICAgICovXG4gICAgICAncGxhY2UtaXRlbXMnOiBbe1xuICAgICAgICAncGxhY2UtaXRlbXMnOiBbLi4uc2NhbGVBbGlnblNlY29uZGFyeUF4aXMoKSwgJ2Jhc2VsaW5lJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQbGFjZSBTZWxmXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcGxhY2Utc2VsZlxuICAgICAgICovXG4gICAgICAncGxhY2Utc2VsZic6IFt7XG4gICAgICAgICdwbGFjZS1zZWxmJzogWydhdXRvJywgLi4uc2NhbGVBbGlnblNlY29uZGFyeUF4aXMoKV1cbiAgICAgIH1dLFxuICAgICAgLy8gU3BhY2luZ1xuICAgICAgLyoqXG4gICAgICAgKiBQYWRkaW5nXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcGFkZGluZ1xuICAgICAgICovXG4gICAgICBwOiBbe1xuICAgICAgICBwOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGFkZGluZyBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcGFkZGluZ1xuICAgICAgICovXG4gICAgICBweDogW3tcbiAgICAgICAgcHg6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQYWRkaW5nIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgIHB5OiBbe1xuICAgICAgICBweTogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBhZGRpbmcgU3RhcnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgIHBzOiBbe1xuICAgICAgICBwczogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBhZGRpbmcgRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcGFkZGluZ1xuICAgICAgICovXG4gICAgICBwZTogW3tcbiAgICAgICAgcGU6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQYWRkaW5nIFRvcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BhZGRpbmdcbiAgICAgICAqL1xuICAgICAgcHQ6IFt7XG4gICAgICAgIHB0OiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGFkZGluZyBSaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BhZGRpbmdcbiAgICAgICAqL1xuICAgICAgcHI6IFt7XG4gICAgICAgIHByOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGFkZGluZyBCb3R0b21cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgIHBiOiBbe1xuICAgICAgICBwYjogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBhZGRpbmcgTGVmdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BhZGRpbmdcbiAgICAgICAqL1xuICAgICAgcGw6IFt7XG4gICAgICAgI
25114HBsOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFyZ2luXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFyZ2luXG4gICAgICAgKi9cbiAgICAgIG06IFt7XG4gICAgICAgIG06IHNjYWxlTWFyZ2luKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBteDogW3tcbiAgICAgICAgbXg6IHNjYWxlTWFyZ2luKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBteTogW3tcbiAgICAgICAgbXk6IHNjYWxlTWFyZ2luKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gU3RhcnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXJnaW5cbiAgICAgICAqL1xuICAgICAgbXM6IFt7XG4gICAgICAgIG1zOiBzY2FsZU1hcmdpbigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFyZ2luIEVuZFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBtZTogW3tcbiAgICAgICAgbWU6IHNjYWxlTWFyZ2luKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gVG9wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFyZ2luXG4gICAgICAgKi9cbiAgICAgIG10OiBbe1xuICAgICAgICBtdDogc2NhbGVNYXJnaW4oKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1hcmdpbiBSaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBtcjogW3tcbiAgICAgICAgbXI6IHNjYWxlTWFyZ2luKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFyZ2luXG4gICAgICAgKi9cbiAgICAgIG1iOiBbe1xuICAgICAgICBtYjogc2NhbGVNYXJnaW4oKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1hcmdpbiBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFyZ2luXG4gICAgICAgKi9cbiAgICAgIG1sOiBbe1xuICAgICAgICBtbDogc2NhbGVNYXJnaW4oKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNwYWNlIEJldHdlZW4gWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpbiNhZGRpbmctc3BhY2UtYmV0d2Vlbi1jaGlsZHJlblxuICAgICAgICovXG4gICAgICAnc3BhY2UteCc6IFt7XG4gICAgICAgICdzcGFjZS14Jzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNwYWNlIEJldHdlZW4gWCBSZXZlcnNlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFyZ2luI2FkZGluZy1zcGFjZS1iZXR3ZWVuLWNoaWxkcmVuXG4gICAgICAgKi9cbiAgICAgICdzcGFjZS14LXJldmVyc2UnOiBbJ3NwYWNlLXgtcmV2ZXJzZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBTcGFjZSBCZXR3ZWVuIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXJnaW4jYWRkaW5nLXNwYWNlLWJldHdlZW4tY2hpbGRyZW5cbiAgICAgICAqL1xuICAgICAgJ3NwYWNlLXknOiBbe1xuICAgICAgICAnc3BhY2UteSc6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTcGFjZSBCZXR3ZWVuIFkgUmV2ZXJzZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpbiNhZGRpbmctc3BhY2UtYmV0d2Vlbi1jaGlsZHJlblxuICAgICAgICovXG4gICAgICAnc3BhY2UteS1yZXZlcnNlJzogWydzcGFjZS15LXJldmVyc2UnXSxcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gU2l6aW5nIC0tLVxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8qKlxuICAgICAgICogU2l6ZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3dpZHRoI3NldHRpbmctYm90aC13aWR0aC1hbmQtaGVpZ2h0XG4gICAgICAgKi9cbiAgICAgIHNpemU6IFt7XG4gICAgICAgIHNpemU6IHNjYWxlU2l6aW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBXaWR0aFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3dpZHRoXG4gICAgICAgKi9cbiAgICAgIHc6IFt7XG4gICAgICAgIHc6IFt0aGVtZUNvbnRhaW5lciwgJ3NjcmVlbicsIC4uLnNjYWxlU2l6aW5nKCldXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWluLVdpZHRoXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWluLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdtaW4tdyc6IFt7XG4gICAgICAgICdtaW4tdyc6IFt0aGVtZUNvbnRhaW5lciwgJ3NjcmVlbicsIC8qKiBEZXByZWNhdGVkLiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90YWlsd2luZGxhYnMvdGFpbHdpbmRjc3MuY29tL2lzc3Vlcy8yMDI3I2lzc3VlY29tbWVudC0yNjIwMTUyNzU3ICovXG4gICAgICAgICdub25lJywgLi4uc2NhbGVTaXppbmcoKV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXgtV2lkdGhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXgtd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ21heC13JzogW3tcbiAgICAgICAgJ21heC13JzogW3RoZW1lQ29udGFpbmVyLCAnc2NyZWVuJywgJ25vbmUnLCAvKiogRGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjQuMC4wLiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90YWlsd2luZGxhYnMvdGFpbHdpbmRjc3MuY29tL2lzc3Vlcy8yMDI3I2lzc3VlY29tbWVudC0yNjIwMTUyNzU3ICovXG4gICAgICAgICdwcm9zZScsIC8qKiBEZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2NC4wLjAuIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy5jb20vaXNzdWVzLzIwMjcjaXNzdWVjb21tZW50LTI2MjAxNTI3NTcgKi9cbiAgICAgICAge1xuICAgICAgICAgI
25114HNjcmVlbjogW3RoZW1lQnJlYWtwb2ludF1cbiAgICAgICAgfSwgLi4uc2NhbGVTaXppbmcoKV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBIZWlnaHRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9oZWlnaHRcbiAgICAgICAqL1xuICAgICAgaDogW3tcbiAgICAgICAgaDogWydzY3JlZW4nLCAnbGgnLCAuLi5zY2FsZVNpemluZygpXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1pbi1IZWlnaHRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9taW4taGVpZ2h0XG4gICAgICAgKi9cbiAgICAgICdtaW4taCc6IFt7XG4gICAgICAgICdtaW4taCc6IFsnc2NyZWVuJywgJ2xoJywgJ25vbmUnLCAuLi5zY2FsZVNpemluZygpXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1heC1IZWlnaHRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXgtaGVpZ2h0XG4gICAgICAgKi9cbiAgICAgICdtYXgtaCc6IFt7XG4gICAgICAgICdtYXgtaCc6IFsnc2NyZWVuJywgJ2xoJywgLi4uc2NhbGVTaXppbmcoKV1cbiAgICAgIH1dLFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gVHlwb2dyYXBoeSAtLS1cbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFNpemVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LXNpemVcbiAgICAgICAqL1xuICAgICAgJ2ZvbnQtc2l6ZSc6IFt7XG4gICAgICAgIHRleHQ6IFsnYmFzZScsIHRoZW1lVGV4dCwgaXNBcmJpdHJhcnlWYXJpYWJsZUxlbmd0aCwgaXNBcmJpdHJhcnlMZW5ndGhdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRm9udCBTbW9vdGhpbmdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LXNtb290aGluZ1xuICAgICAgICovXG4gICAgICAnZm9udC1zbW9vdGhpbmcnOiBbJ2FudGlhbGlhc2VkJywgJ3N1YnBpeGVsLWFudGlhbGlhc2VkJ10sXG4gICAgICAvKipcbiAgICAgICAqIEZvbnQgU3R5bGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LXN0eWxlXG4gICAgICAgKi9cbiAgICAgICdmb250LXN0eWxlJzogWydpdGFsaWMnLCAnbm90LWl0YWxpYyddLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFdlaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtd2VpZ2h0XG4gICAgICAgKi9cbiAgICAgICdmb250LXdlaWdodCc6IFt7XG4gICAgICAgIGZvbnQ6IFt0aGVtZUZvbnRXZWlnaHQsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5TnVtYmVyXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEZvbnQgU3RyZXRjaFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtc3RyZXRjaFxuICAgICAgICovXG4gICAgICAnZm9udC1zdHJldGNoJzogW3tcbiAgICAgICAgJ2ZvbnQtc3RyZXRjaCc6IFsndWx0cmEtY29uZGVuc2VkJywgJ2V4dHJhLWNvbmRlbnNlZCcsICdjb25kZW5zZWQnLCAnc2VtaS1jb25kZW5zZWQnLCAnbm9ybWFsJywgJ3NlbWktZXhwYW5kZWQnLCAnZXhwYW5kZWQnLCAnZXh0cmEtZXhwYW5kZWQnLCAndWx0cmEtZXhwYW5kZWQnLCBpc1BlcmNlbnQsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRm9udCBGYW1pbHlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LWZhbWlseVxuICAgICAgICovXG4gICAgICAnZm9udC1mYW1pbHknOiBbe1xuICAgICAgICBmb250OiBbaXNBcmJpdHJhcnlWYXJpYWJsZUZhbWlseU5hbWUsIGlzQXJiaXRyYXJ5VmFsdWUsIHRoZW1lRm9udF1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFZhcmlhbnQgTnVtZXJpY1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtdmFyaWFudC1udW1lcmljXG4gICAgICAgKi9cbiAgICAgICdmdm4tbm9ybWFsJzogWydub3JtYWwtbnVtcyddLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFZhcmlhbnQgTnVtZXJpY1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtdmFyaWFudC1udW1lcmljXG4gICAgICAgKi9cbiAgICAgICdmdm4tb3JkaW5hbCc6IFsnb3JkaW5hbCddLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFZhcmlhbnQgTnVtZXJpY1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtdmFyaWFudC1udW1lcmljXG4gICAgICAgKi9cbiAgICAgICdmdm4tc2xhc2hlZC16ZXJvJzogWydzbGFzaGVkLXplcm8nXSxcbiAgICAgIC8qKlxuICAgICAgICogRm9udCBWYXJpYW50IE51bWVyaWNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LXZhcmlhbnQtbnVtZXJpY1xuICAgICAgICovXG4gICAgICAnZnZuLWZpZ3VyZSc6IFsnbGluaW5nLW51bXMnLCAnb2xkc3R5bGUtbnVtcyddLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFZhcmlhbnQgTnVtZXJpY1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtdmFyaWFudC1udW1lcmljXG4gICAgICAgKi9cbiAgICAgICdmdm4tc3BhY2luZyc6IFsncHJvcG9ydGlvbmFsLW51bXMnLCAndGFidWxhci1udW1zJ10sXG4gICAgICAvKipcbiAgICAgICAqIEZvbnQgVmFyaWFudCBOdW1lcmljXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZm9udC12YXJpYW50LW51bWVyaWNcbiAgICAgICAqL1xuICAgICAgJ2Z2bi1mcmFjdGlvbic6IFsnZGlhZ29uYWwtZnJhY3Rpb25zJywgJ3N0YWNrZWQtZnJhY3Rpb25zJ10sXG4gICAgICAvKipcbiAgICAgICAqIExldHRlciBTcGFjaW5nXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbGV0dGVyLXNwYWNpbmdcbiAgICAgICAqL1xuICAgICAgdHJhY2tpbmc6IFt7XG4gICAgICAgI
25114HRyYWNraW5nOiBbdGhlbWVUcmFja2luZywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBMaW5lIENsYW1wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbGluZS1jbGFtcFxuICAgICAgICovXG4gICAgICAnbGluZS1jbGFtcCc6IFt7XG4gICAgICAgICdsaW5lLWNsYW1wJzogW2lzTnVtYmVyLCAnbm9uZScsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5TnVtYmVyXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIExpbmUgSGVpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbGluZS1oZWlnaHRcbiAgICAgICAqL1xuICAgICAgbGVhZGluZzogW3tcbiAgICAgICAgbGVhZGluZzogWy8qKiBEZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2NC4wLjAuIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy5jb20vaXNzdWVzLzIwMjcjaXNzdWVjb21tZW50LTI2MjAxNTI3NTcgKi9cbiAgICAgICAgdGhlbWVMZWFkaW5nLCAuLi5zY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIExpc3QgU3R5bGUgSW1hZ2VcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9saXN0LXN0eWxlLWltYWdlXG4gICAgICAgKi9cbiAgICAgICdsaXN0LWltYWdlJzogW3tcbiAgICAgICAgJ2xpc3QtaW1hZ2UnOiBbJ25vbmUnLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIExpc3QgU3R5bGUgUG9zaXRpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9saXN0LXN0eWxlLXBvc2l0aW9uXG4gICAgICAgKi9cbiAgICAgICdsaXN0LXN0eWxlLXBvc2l0aW9uJzogW3tcbiAgICAgICAgbGlzdDogWydpbnNpZGUnLCAnb3V0c2lkZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTGlzdCBTd
25114HlsZSBUeXBlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbGlzdC1zdHlsZS10eXBlXG4gICAgICAgKi9cbiAgICAgICdsaXN0LXN0eWxlLXR5cGUnOiBbe1xuICAgICAgICBsaXN0OiBbJ2Rpc2MnLCAnZGVjaW1hbCcsICdub25lJywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IEFsaWdubWVudFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtYWxpZ25cbiAgICAgICAqL1xuICAgICAgJ3RleHQtYWxpZ25tZW50JzogW3tcbiAgICAgICAgdGV4dDogWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCcsICdqdXN0aWZ5JywgJ3N0YXJ0JywgJ2VuZCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGxhY2Vob2xkZXIgQ29sb3JcbiAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2My4wLjBcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly92My50YWlsd2luZGNzcy5jb20vZG9jcy9wbGFjZWhvbGRlci1jb2xvclxuICAgICAgICovXG4gICAgICAncGxhY2Vob2xkZXItY29sb3InOiBbe1xuICAgICAgICBwbGFjZWhvbGRlcjogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtY29sb3JcbiAgICAgICAqL1xuICAgICAgJ3RleHQtY29sb3InOiBbe1xuICAgICAgICB0ZXh0OiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IERlY29yYXRpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LWRlY29yYXRpb25cbiAgICAgICAqL1xuICAgICAgJ3RleHQtZGVjb3JhdGlvbic6IFsndW5kZXJsaW5lJywgJ292ZXJsaW5lJywgJ2xpbmUtdGhyb3VnaCcsICduby11bmRlcmxpbmUnXSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBEZWNvcmF0aW9uIFN0eWxlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGV4dC1kZWNvcmF0aW9uLXN0eWxlXG4gICAgICAgKi9cbiAgICAgICd0ZXh0LWRlY29yYXRpb24tc3R5bGUnOiBbe1xuICAgICAgICBkZWNvcmF0aW9uOiBbLi4uc2NhbGVMaW5lU3R5bGUoKSwgJ3dhdnknXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRleHQgRGVjb3JhdGlvbiBUaGlja25lc3NcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzXG4gICAgICAgKi9cbiAgICAgICd0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzJzogW3tcbiAgICAgICAgZGVjb3JhdGlvbjogW2lzTnVtYmVyLCAnZnJvbS1mb250JywgJ2F1dG8nLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeUxlbmd0aF1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IERlY29yYXRpb24gQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LWRlY29yYXRpb24tY29sb3JcbiAgICAgICAqL1xuICAgICAgJ3RleHQtZGVjb3JhdGlvbi1jb2xvcic6IFt7XG4gICAgICAgIGRlY29yYXRpb246IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRleHQgVW5kZXJsaW5lIE9mZnNldFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtdW5kZXJsaW5lLW9mZnNldFxuICAgICAgICovXG4gICAgICAndW5kZXJsaW5lLW9mZnNldCc6IFt7XG4gICAgICAgICd1bmRlcmxpbmUtb2Zmc2V0JzogW2lzTnVtYmVyLCAnYXV0bycsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBUcmFuc2Zvcm1cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LXRyYW5zZm9ybVxuICAgICAgICovXG4gICAgICAndGV4dC10cmFuc2Zvcm0nOiBbJ3VwcGVyY2FzZScsICdsb3dlcmNhc2UnLCAnY2FwaXRhbGl6ZScsICdub3JtYWwtY2FzZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IE92ZXJmbG93XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGV4dC1vdmVyZmxvd1xuICAgICAgICovXG4gICAgICAndGV4dC1vdmVyZmxvdyc6IFsndHJ1bmNhdGUnLCAndGV4dC1lbGxpcHNpcycsICd0ZXh0LWNsaXAnXSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBXcmFwXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGV4dC13cmFwXG4gICAgICAgKi9cbiAgICAgICd0ZXh0LXdyYXAnOiBbe1xuICAgICAgICB0ZXh0OiBbJ3dyYXAnLCAnbm93cmFwJywgJ2JhbGFuY2UnLCAncHJldHR5J11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IEluZGVudFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtaW5kZW50XG4gICAgICAgKi9cbiAgICAgIGluZGVudDogW3tcbiAgICAgICAgaW5kZW50OiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVmVydGljYWwgQWxpZ25tZW50XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdmVydGljYWwtYWxpZ25cbiAgICAgICAqL1xuICAgICAgJ3ZlcnRpY2FsLWFsaWduJzogW3tcbiAgICAgICAgYWxpZ246IFsnYmFzZWxpbmUnLCAndG9wJywgJ21pZGRsZScsICdib3R0b20nLCAndGV4dC10b3AnLCAndGV4dC1ib3R0b20nLCAnc3ViJywgJ3N1cGVyJywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGl0ZXNwYWNlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvd2hpdGVzcGFjZVxuICAgICAgICovXG4gICAgICB3aGl0ZXNwYWNlOiBbe1xuICAgICAgICB3aGl0ZXNwYWNlOiBbJ25vcm1hbCcsICdub3dyYXAnLCAncHJlJywgJ3ByZS1saW5lJywgJ3ByZS13cmFwJywgJ2JyZWFrLXNwYWNlcyddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogV29yZCBCcmVha1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3dvcmQtYnJlYWtcbiAgICAgICAqL1xuICAgICAgYnJlYWs6IFt7XG4gICAgICAgIGJyZWFrOiBbJ25vcm1hbCcsICd3b3JkcycsICdhbGwnLCAna2VlcCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogT3ZlcmZsb3cgV3JhcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL292ZXJmbG93LXdyYXBcbiAgICAgICAqL1xuICAgICAgd3JhcDogW3tcbiAgICAgICAgd3JhcDogWydicmVhay13b3JkJywgJ2FueXdoZXJlJywgJ25vcm1hbCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogSHlwaGVuc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2h5cGhlbnNcbiAgICAgICAqL1xuICAgICAgaHlwaGVuczogW3tcbiAgICAgICAgaHlwaGVuczogWydub25lJywgJ21hbnVhbCcsICdhdXRvJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBDb250ZW50XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvY29udGVudFxuICAgICAgICovXG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICBjb250ZW50OiBbJ25vbmUnLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gQmFja2dyb3VuZHMgLS0tXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tncm91bmQgQXR0YWNobWVudFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tncm91bmQtYXR0YWNobWVudFxuICAgICAgICovXG4gICAgICAnYmctYXR0YWNobWVudCc6IFt7XG4gICAgICAgIGJnOiBbJ2ZpeGVkJywgJ2xvY2FsJywgJ3Njcm9sbCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBDbGlwXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2dyb3VuZC1jbGlwXG4gICAgICAgKi9cbiAgICAgICdiZy1jbGlwJzogW3tcbiAgICAgICAgJ2JnLWNsaXAnOiBbJ2JvcmRlcicsICdwYWRkaW5nJywgJ2NvbnRlbnQnLCAndGV4dCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBPcmlnaW5cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLW9yaWdpblxuICAgICAgICovXG4gICAgICAnYmctb3Jp
25114Z2luJzogW3tcbiAgICAgICAgJ2JnLW9yaWdpbic6IFsnYm9yZGVyJywgJ3BhZGRpbmcnLCAnY29udGVudCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBQb3NpdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tncm91bmQtcG9zaXRpb25cbiAgICAgICAqL1xuICAgICAgJ2JnLXBvc2l0aW9uJzogW3tcbiAgICAgICAgYmc6IHNjYWxlQmdQb3NpdGlvbigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBSZXBlYXRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLXJlcGVhdFxuICAgICAgICovXG4gICAgICAnYmctcmVwZWF0JzogW3tcbiAgICAgICAgYmc6IHNjYWxlQmdSZXBlYXQoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tncm91bmQgU2l6ZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tncm91bmQtc2l6ZVxuICAgICAgICovXG4gICAgICAnYmctc2l6ZSc6IFt7XG4gICAgICAgIGJnOiBzY2FsZUJnU2l6ZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBJbWFnZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tncm91bmQtaW1hZ2VcbiAgICAgICAqL1xuICAgICAgJ2JnLWltYWdlJzogW3tcbiAgICAgICAgYmc6IFsnbm9uZScsIHtcbiAgICAgICAgICBsaW5lYXI6IFt7XG4gICAgICAgICAgICB0bzogWyd0JywgJ3RyJywgJ3InLCAnYnInLCAnYicsICdibCcsICdsJywgJ3RsJ11cbiAgICAgICAgICB9LCBpc0ludGVnZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdLFxuICAgICAgICAgIHJhZGlhbDogWycnLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXSxcbiAgICAgICAgICBjb25pYzogW2lzSW50ZWdlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgICAgfSwgaXNBcmJpdHJhcnlWYXJpYWJsZUltYWdlLCBpc0FyYml0cmFyeUltYWdlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tncm91bmQgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdiZy1jb2xvcic6IFt7XG4gICAgICAgIGJnOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmFkaWVudCBDb2xvciBTdG9wcyBGcm9tIFBvc2l0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JhZGllbnQtY29sb3Itc3RvcHNcbiAgICAgICAqL1xuICAgICAgJ2dyYWRpZW50LWZyb20tcG9zJzogW3tcbiAgICAgICAgZnJvbTogc2NhbGVHcmFkaWVudFN0b3BQb3NpdGlvbigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JhZGllbnQgQ29sb3IgU3RvcHMgVmlhIFBvc2l0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JhZGllbnQtY29sb3Itc3RvcHNcbiAgICAgICAqL1xuICAgICAgJ2dyYWRpZW50LXZpYS1wb3MnOiBbe1xuICAgICAgICB2aWE6IHNjYWxlR3JhZGllbnRTdG9wUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyYWRpZW50IENvbG9yIFN0b3BzIFRvIFBvc2l0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JhZGllbnQtY29sb3Itc3RvcHNcbiAgICAgICAqL1xuICAgICAgJ2dyYWRpZW50LXRvLXBvcyc6IFt7XG4gICAgICAgIHRvOiBzY2FsZUdyYWRpZW50U3RvcFBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmFkaWVudCBDb2xvciBTdG9wcyBGcm9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JhZGllbnQtY29sb3Itc3RvcHNcbiAgICAgICAqL1xuICAgICAgJ2dyYWRpZW50LWZyb20nOiBbe1xuICAgICAgICBmcm9tOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmFkaWVudCBDb2xvciBTdG9wcyBWaWFcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmFkaWVudC1jb2xvci1zdG9wc1xuICAgICAgICovXG4gICAgICAnZ3JhZGllbnQtdmlhJzogW3tcbiAgICAgICAgdmlhOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmFkaWVudCBDb2xvciBTdG9wcyBUb1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyYWRpZW50LWNvbG9yLXN0b3BzXG4gICAgICAgKi9cbiAgICAgICdncmFkaWVudC10byc6IFt7XG4gICAgICAgIHRvOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gQm9yZGVycyAtLS1cbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICByb3VuZGVkOiBbe1xuICAgICAgICByb3VuZGVkOiBzY2FsZVJhZGl1cygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFJhZGl1cyBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1yYWRpdXNcbiAgICAgICAqL1xuICAgICAgJ3JvdW5kZWQtcyc6IFt7XG4gICAgICAgICdyb3VuZGVkLXMnOiBzY2FsZVJhZGl1cygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFJhZGl1cyBFbmRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItcmFkaXVzXG4gICAgICAgKi9cbiAgICAgICdyb3VuZGVkLWUnOiBbe1xuICAgICAgICAncm91bmRlZC1lJzogc2NhbGVSYWRpdXMoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgVG9wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC10JzogW3tcbiAgICAgICAgJ3JvdW5kZWQtdCc6IHNjYWxlUmFkaXVzKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1yJzogW3tcbiAgICAgICAgJ3JvdW5kZWQtcic6IHNjYWxlUmFkaXVzKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIEJvdHRvbVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1yYWRpdXNcbiAgICAgICAqL1xuICAgICAgJ3JvdW5kZWQtYic6IFt7XG4gICAgICAgICdyb3VuZGVkLWInOiBzY2FsZVJhZGl1cygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFJhZGl1cyBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1sJzogW3tcbiAgICAgICAgJ3JvdW5kZWQtbCc6IHNjYWxlUmFkaXVzKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIFN0YXJ0IFN0YXJ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1zcyc6IFt7XG4gICAgICAgICdyb3VuZGVkLXNzJzogc2NhbGVSYWRpdXMoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgU3RhcnQgRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1zZSc6IFt7XG4gICAgICAgICdyb3VuZGVkLXNlJzogc2NhbGVSYWRpdXMoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgRW5kIEVuZFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1yYWRpdXNcbiAgICAgICAqL1xuICAgICAgJ3JvdW5kZWQtZWUnOiBbe1xuICAgICAgICAncm91bmRlZC1lZSc6IHNjYWxlUmFkaXVzKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIEVuZCBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1yYWRpdXNcbiAgICAgICAqL1xuICAgICAgJ3JvdW5kZWQtZXMnOiBbe1xuICAgICAgICAncm91bmRlZC1lcyc6IHNjYWxlUmFkaXVzKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIFRvcCBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC10bCc6IFt7XG4gICAgICAgICdyb3VuZGVkLXRsJzogc2NhbGVSYWRpdXMoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgVG9wIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC10cic6IFt7XG4gICAgICAgICdyb3VuZGVkLXRyJzogc2NhbGVSYWRpdXMoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgQm90dG9tIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1icic6IFt7XG4gICAgICAgICdyb3VuZGVkLWJyJzogc2NhbGVSYWRpdXMoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgQm90dG9tIExlZnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItcmFkaXVzXG4gICAgICAgKi9cbiAgICAgICdyb3VuZGVkLWJsJzogW3tcbiAgICAgICAgJ3JvdW5kZWQtYmwnOiBzY2FsZVJhZGl1cygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItdyc6IFt7XG4gICAgICAgIGJvcmRlcjogc2NhbGVCb3JkZXJXaWR0aCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci13LXgnOiBbe1xuICAgICAgICAnYm9yZGVyLXgnOiBzY2FsZUJvcmRlcldpZHRoKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgV2lkdGggWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci13aWR0aFxuICAgICAgICovXG4gICAgICAnYm9yZGVyLXcteSc6IFt7XG4gICAgICAgICdib3JkZXIteSc6IHNjYWxlQm9yZGVyV2lkdGgoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBXaWR0aCBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci13aWR0aFxuICAgICAgICovXG4gICAgICAnYm9yZGVyLXctcyc6IFt7XG4gICAgICAgICdib3JkZXItcyc6IHNjYWxlQm9yZGVyV2lkdGgoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBXaWR0aCBFbmRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci13LWUnOiBbe1xuICAgICAgICAnYm9yZGVyLWUnOiBzY2FsZUJvcmRlcldpZHRoKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgV2lkdGggVG9wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItdy10JzogW3tcbiAgICAgICAgJ2JvcmRlci10Jzogc2NhbGVCb3JkZXJXaWR0aCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItdy1yJzogW3tcbiAgICAgICAgJ2JvcmRlci1yJzogc2NhbGVCb3JkZXJXaWR0aCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoIEJvdHRvbVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci13aWR0aFxuICAgICAgICovXG4gICAgICAnYm9yZGVyLXctYic6IFt7XG4gICAgICAgICdib3JkZXItYic6IHNjYWxlQm9yZGVyV2lkdGgoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBXaWR0aCBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItdy1sJzogW3tcbiAgICAgICAgJ2JvcmRlci1sJzogc2NhbGVCb3JkZXJXaWR0aCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRGl2aWRlIFdpZHRoIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGgjYmV0d2Vlbi1jaGlsZHJlblxuICAgICAgICovXG4gICAgICAnZGl2aWRlLXgnOiBbe1xuICAgICAgICAnZGl2aWRlLXgnOiBzY2FsZUJvcmRlcldpZHRoKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBEaXZpZGUgV2lkdGggWCBSZXZlcnNlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoI2JldHdlZW4tY2hpbGRyZW5cbiAgICAgICAqL1xuICAgICAgJ2RpdmlkZS14LXJldmVyc2UnOiBbJ2RpdmlkZS14LXJldmVyc2UnXSxcbiAgICAgIC8qKlxuICAgICAgICogRGl2aWRlIFdpZHRoIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGgjYmV0d2Vlbi1jaGlsZHJlblxuICAgICAgICovXG4gICAgICAnZGl2aWRlLXknOiBbe1xuICAgICAgICAnZGl2aWRlLXknOiBzY2FsZUJvcmRlcldpZHRoKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBEaXZpZGUgV2lkdGggWSBSZXZlcnNlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoI2JldHdlZW4tY2hpbGRyZW5cbiAgICAgICAqL1xuICAgICAgJ2RpdmlkZS15LXJldmVyc2UnOiBbJ2RpdmlkZS15LXJldmVyc2UnXSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFN0eWxlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXN0eWxlXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItc3R5bGUnOiBbe1xuICAgICAgICBib3JkZXI6IFsuLi5zY2FsZUxpbmVTdHlsZSgpLCAnaGlkZGVuJywgJ25vbmUnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIERpdmlkZSBTdHlsZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1zdHlsZSNzZXR0aW5nLXRoZS1kaXZpZG
25114VyLXN0eWxlXG4gICAgICAgKi9cbiAgICAgICdkaXZpZGUtc3R5bGUnOiBbe1xuICAgICAgICBkaXZpZGU6IFsuLi5zY2FsZUxpbmVTdHlsZSgpLCAnaGlkZGVuJywgJ25vbmUnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yJzogW3tcbiAgICAgICAgYm9yZGVyOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yLXgnOiBbe1xuICAgICAgICAnYm9yZGVyLXgnOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yLXknOiBbe1xuICAgICAgICAnYm9yZGVyLXknOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgU1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yLXMnOiBbe1xuICAgICAgICAnYm9yZGVyLXMnOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgRVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yLWUnOiBbe1xuICAgICAgICAnYm9yZGVyLWUnOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgVG9wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItY29sb3ItdCc6IFt7XG4gICAgICAgICdib3JkZXItdCc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBDb2xvciBSaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yLXInOiBbe1xuICAgICAgICAnYm9yZGVyLXInOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItY29sb3ItYic6IFt7XG4gICAgICAgICdib3JkZXItYic6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBDb2xvciBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItY29sb3ItbCc6IFt7XG4gICAgICAgICdib3JkZXItbCc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIERpdmlkZSBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2RpdmlkZS1jb2xvclxuICAgICAgICovXG4gICAgICAnZGl2aWRlLWNvbG9yJzogW3tcbiAgICAgICAgZGl2aWRlOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdXRsaW5lIFN0eWxlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3V0bGluZS1zdHlsZVxuICAgICAgICovXG4gICAgICAnb3V0bGluZS1zdHlsZSc6IFt7XG4gICAgICAgIG91dGxpbmU6IFsuLi5zY2FsZUxpbmVTdHlsZSgpLCAnbm9uZScsICdoaWRkZW4nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE91dGxpbmUgT2Zmc2V0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3V0bGluZS1vZmZzZXRcbiAgICAgICAqL1xuICAgICAgJ291dGxpbmUtb2Zmc2V0JzogW3tcbiAgICAgICAgJ291dGxpbmUtb2Zmc2V0JzogW2lzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE91dGxpbmUgV2lkdGhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vdXRsaW5lLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdvdXRsaW5lLXcnOiBbe1xuICAgICAgICBvdXRsaW5lOiBbJycsIGlzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlTGVuZ3RoLCBpc0FyYml0cmFyeUxlbmd0aF1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdXRsaW5lIENvbG9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3V0bGluZS1jb2xvclxuICAgICAgICovXG4gICAgICAnb3V0bGluZS1jb2xvcic6IFt7XG4gICAgICAgIG91dGxpbmU6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIC0tLSBFZmZlY3RzIC0tLVxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvKipcbiAgICAgICAqIEJveCBTaGFkb3dcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3gtc2hhZG93XG4gICAgICAgKi9cbiAgICAgIHNoYWRvdzogW3tcbiAgICAgICAgc2hhZG93OiBbXG4gICAgICAgIC8vIERlcHJlY2F0ZWQgc2luY2UgVGFpbHdpbmQgQ1NTIHY0LjAuMFxuICAgICAgICAnJywgJ25vbmUnLCB0aGVtZVNoYWRvdywgaXNBcmJpdHJhcnlWYXJpYWJsZVNoYWRvdywgaXNBcmJpdHJhcnlTaGFkb3ddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm94IFNoYWRvdyBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JveC1zaGFkb3cjc2V0dGluZy10aGUtc2hhZG93LWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdzaGFkb3ctY29sb3InOiBbe1xuICAgICAgICBzaGFkb3c6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEluc2V0IEJveCBTaGFkb3dcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3gtc2hhZG93I2FkZGluZy1hbi1pbnNldC1zaGFkb3dcbiAgICAgICAqL1xuICAgICAgJ2luc2V0LXNoYWRvdyc6IFt7XG4gICAgICAgICdpbnNldC1zaGFkb3cnOiBbJ25vbmUnLCB0aGVtZUluc2V0U2hhZG93LCBpc0FyYml0cmFyeVZhcmlhYmxlU2hhZG93LCBpc0FyYml0cmFyeVNoYWRvd11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBJbnNldCBCb3ggU2hhZG93IENvbG9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm94LXNoYWRvdyNzZXR0aW5nLXRoZS1pbnNldC1zaGFkb3ctY29sb3JcbiAgICAgICAqL1xuICAgICAgJ2luc2V0LXNoYWRvdy1jb2xvcic6IFt7XG4gICAgICAgICdpbnNldC1zaGFkb3cnOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBSaW5nIFdpZHRoXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm94LXNoYWRvdyNhZGRpbmctYS1yaW5nXG4gICAgICAgKi9cbiAgICAgICdyaW5nLXcnOiBbe1xuICAgICAgICByaW5nOiBzY2FsZUJvcmRlcldpZHRoKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBSaW5nIFdpZHRoIEluc2V0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdjMudGFpbHdpbmRjc3MuY29tL2RvY3MvcmluZy13aWR0aCNpbnNldC1yaW5nc1xuICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgVGFpbHdpbmQgQ1NTIHY0LjAuMFxuICAgICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGFpbHdpbmRsYWJzL3RhaWx3aW5kY3NzL2Jsb2IvdjQuMC4wL3BhY2thZ2VzL3RhaWx3aW5kY3NzL3NyYy91dGlsaXRpZXMudHMjTDQxNThcbiAgICAgICAqL1xuICAgICAgJ3Jpbmctdy1pbnNldCc6IFsncmluZy1pbnNldCddLFxuICAgICAgLyoqXG4gICAgICAgKiBSaW5nIENvbG9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm94LXNoYWRvdyNzZXR0aW5nLXRoZS1yaW5nLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdyaW5nLWNvbG9yJzogW3tcbiAgICAgICAgcmluZzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUmluZyBPZmZzZXQgV2lkdGhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly92My50YWlsd2luZGNzcy5jb20vZG9jcy9yaW5nLW9mZnNldC13aWR0aFxuICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgVGFpbHdpbmQgQ1NTIHY0LjAuMFxuICAgICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGFpbHdpbmRsYWJzL3RhaWx3aW5kY3NzL2Jsb2IvdjQuMC4wL3BhY2thZ2VzL3RhaWx3aW5kY3NzL3NyYy91dGlsaXRpZXMudHMjTDQxNThcbiAgICAgICAqL1xuICAgICAgJ3Jpbmctb2Zmc2V0LXcnOiBbe1xuICAgICAgICAncmluZy1vZmZzZXQnOiBbaXNOdW1iZXIsIGlzQXJiaXRyYXJ5TGVuZ3RoXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJpbmcgT2Zmc2V0IENvbG9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdjMudGFpbHdpbmRjc3MuY29tL2RvY3MvcmluZy1vZmZzZXQtY29sb3JcbiAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2NC4wLjBcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy9ibG9iL3Y0LjAuMC9wYWNrYWdlcy90YWlsd2luZGNzcy9zcmMvdXRpbGl0aWVzLnRzI0w0MT
25114U4XG4gICAgICAgKi9cbiAgICAgICdyaW5nLW9mZnNldC1jb2xvcic6IFt7XG4gICAgICAgICdyaW5nLW9mZnNldCc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEluc2V0IFJpbmcgV2lkdGhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3gtc2hhZG93I2FkZGluZy1hbi1pbnNldC1yaW5nXG4gICAgICAgKi9cbiAgICAgICdpbnNldC1yaW5nLXcnOiBbe1xuICAgICAgICAnaW5zZXQtcmluZyc6IHNjYWxlQm9yZGVyV2lkdGgoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEluc2V0IFJpbmcgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3gtc2hhZG93I3NldHRpbmctdGhlLWluc2V0LXJpbmctY29sb3JcbiAgICAgICAqL1xuICAgICAgJ2luc2V0LXJpbmctY29sb3InOiBbe1xuICAgICAgICAnaW5zZXQtcmluZyc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRleHQgU2hhZG93XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGV4dC1zaGFkb3dcbiAgICAgICAqL1xuICAgICAgJ3RleHQtc2hhZG93JzogW3tcbiAgICAgICAgJ3RleHQtc2hhZG93JzogWydub25lJywgdGhlbWVUZXh0U2hhZG93LCBpc0FyYml0cmFyeVZhcmlhYmxlU2hhZG93LCBpc0FyYml0cmFyeVNoYWRvd11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IFNoYWRvdyBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtc2hhZG93I3NldHRpbmctdGhlLXNoYWRvdy1jb2xvclxuICAgICAgICovXG4gICAgICAndGV4dC1zaGFkb3ctY29sb3InOiBbe1xuICAgICAgICAndGV4dC1zaGFkb3cnOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPcGFjaXR5XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3BhY2l0eVxuICAgICAgICovXG4gICAgICBvcGFjaXR5OiBbe1xuICAgICAgICBvcGFjaXR5OiBbaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWl4IEJsZW5kIE1vZGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9taXgtYmxlbmQtbW9kZVxuICAgICAgICovXG4gICAgICAnbWl4LWJsZW5kJzogW3tcbiAgICAgICAgJ21peC1ibGVuZCc6IFsuLi5zY2FsZUJsZW5kTW9kZSgpLCAncGx1cy1kYXJrZXInLCAncGx1cy1saWdodGVyJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZ3JvdW5kIEJsZW5kIE1vZGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLWJsZW5kLW1vZGVcbiAgICAgICAqL1xuICAgICAgJ2JnLWJsZW5kJzogW3tcbiAgICAgICAgJ2JnLWJsZW5kJzogc2NhbGVCbGVuZE1vZGUoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1hc2sgQ2xpcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hc2stY2xpcFxuICAgICAgICovXG4gICAgICAnbWFzay1jbGlwJzogW3tcbiAgICAgICAgJ21hc2stY2xpcCc6IFsnYm9yZGVyJywgJ3BhZGRpbmcnLCAnY29udGVudCcsICdmaWxsJywgJ3N0cm9rZScsICd2aWV3J11cbiAgICAgIH0sICdtYXNrLW5vLWNsaXAnXSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBDb21wb3NpdGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXNrLWNvbXBvc2l0ZVxuICAgICAgICovXG4gICAgICAnbWFzay1jb21wb3NpdGUnOiBbe1xuICAgICAgICBtYXNrOiBbJ2FkZCcsICdzdWJ0cmFjdCcsICdpbnRlcnNlY3QnLCAnZXhjbHVkZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBJbWFnZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hc2staW1hZ2VcbiAgICAgICAqL1xuICAgICAgJ21hc2staW1hZ2UtbGluZWFyLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLWxpbmVhcic6IFtpc051bWJlcl1cbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtbGluZWFyLWZyb20tcG9zJzogW3tcbiAgICAgICAgJ21hc2stbGluZWFyLWZyb20nOiBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtbGluZWFyLXRvLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLWxpbmVhci10byc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1saW5lYXItZnJvbS1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLWxpbmVhci1mcm9tJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLWxpbmVhci10by1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLWxpbmVhci10byc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS10LWZyb20tcG9zJzogW3tcbiAgICAgICAgJ21hc2stdC1mcm9tJzogc2NhbGVNYXNrSW1hZ2VQb3NpdGlvbigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXQtdG8tcG9zJzogW3tcbiAgICAgICAgJ21hc2stdC10byc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS10LWZyb20tY29sb3InOiBbe1xuICAgICAgICAnbWFzay10LWZyb20nOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtdC10by1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLXQtdG8nOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2Utci1mcm9tLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLXItZnJvbSc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1yLXRvLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLXItdG8nOiBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2Utci1mcm9tLWNvbG9yJzogW3tcbiAgICAgICAgJ21hc2stci1mcm9tJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXItdG8tY29sb3InOiBbe1xuICAgICAgICAnbWFzay1yLXRvJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLWItZnJvbS1wb3MnOiBbe1xuICAgICAgICAnbWFzay1iLWZyb20nOiBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtYi10by1wb3MnOiBbe1xuICAgICAgICAnbWFzay1iLXRvJzogc2NhbGVNYXNrSW1hZ2VQb3NpdGlvbigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLWItZnJvbS1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLWItZnJvbSc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1iLXRvLWNvbG9yJzogW3tcbiAgICAgICAgJ21hc2stYi10byc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1sLWZyb20tcG9zJzogW3tcbiAgICAgICAgJ21hc2stbC1mcm9tJzogc2NhbGVNYXNrSW1hZ2VQb3NpdGlvbigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLWwtdG8tcG9zJzogW3tcbiAgICAgICAgJ21hc2stbC10byc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1sLWZyb20tY29sb3InOiBbe1xuICAgICAgICAnbWFzay1sLWZyb20nOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtbC10by1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLWwtdG8nOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UteC1mcm9tLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLXgtZnJvbSc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS14LXRvLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLXgtdG8nOiBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UteC1mcm9tLWNvbG9yJzogW3tcbiAgICAgICAgJ21hc2steC1mcm9tJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXgtdG8tY29sb3InOiBbe1xuICAgICAgICAnbWFzay14LXRvJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXktZnJvbS1wb3MnOiBbe1xuICAgICAgICAnbWFzay15LWZyb20nOiBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UteS10by1wb3MnOiBbe1xuICAgICAgICAnbWFzay15LXRvJzogc2NhbGVNYXNrSW1hZ2VQb3NpdGlvbigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXktZnJvbS1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLXktZnJvbSc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS15LXRvLWNvbG9yJzogW3tcbiAgICAgICAgJ21hc2steS10byc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1yYWRpYWwnOiBbe1xuICAgICAgICAnbWFzay1yYWRpYWwnOiBbaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtcmFkaWFsLWZyb20tcG9zJzogW3tcbiAgICAgICAgJ21hc2stcmFkaWFsLWZyb20nOiBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtcmFkaWFsLXRvLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLXJhZGlhbC10byc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1yYWRpYWwtZnJvbS1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLXJhZGlhbC1mcm9tJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXJhZGlhbC10by1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLXJhZGlhbC10byc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1yYWRpYWwtc2hhcGUnOiBbe1xuICAgICAgICAnbWFzay1yYWRpYWwnOiBbJ2NpcmNsZScsICdlbGxpcHNlJ11cbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtcmFkaWFsLXNpemUnOiBbe1xuICAgICAgICAnbWFzay1yYWRpYWwnOiBbe1xuICAgICAgICAgIGNsb3Nlc3Q6IFsnc2lkZScsICdjb3JuZXInXSxcbiAgICAgICAgICBmYXJ0aGVzdDogWydzaWRlJywgJ2Nvcm5lciddXG4gICAgICAgI
25114H1dXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXJhZGlhbC1wb3MnOiBbe1xuICAgICAgICAnbWFzay1yYWRpYWwtYXQnOiBzY2FsZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtY29uaWMtcG9zJzogW3tcbiAgICAgICAgJ21hc2stY29uaWMnOiBbaXNOdW1iZXJdXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLWNvbmljLWZyb20tcG9zJzogW3tcbiAgICAgICAgJ21hc2stY29uaWMtZnJvbSc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1jb25pYy10by1wb3MnOiBbe1xuICAgICAgICAnbWFzay1jb25pYy10byc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1jb25pYy1mcm9tLWNvbG9yJzogW3tcbiAgICAgICAgJ21hc2stY29uaWMtZnJvbSc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1jb25pYy10by1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLWNvbmljLXRvJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBNb2RlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFzay1tb2RlXG4gICAgICAgKi9cbiAgICAgICdtYXNrLW1vZGUnOiBbe1xuICAgICAgICBtYXNrOiBbJ2FscGhhJywgJ2x1bWluYW5jZScsICdtYXRjaCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBPcmlnaW5cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXNrLW9yaWdpblxuICAgICAgICovXG4gICAgICAnbWFzay1vcmlnaW4nOiBbe1xuICAgICAgICAnbWFzay1vcmlnaW4nOiBbJ2JvcmRlcicsICdwYWRkaW5nJywgJ2NvbnRlbnQnLCAnZmlsbCcsICdzdHJva2UnLCAndmlldyddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBQb3NpdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hc2stcG9zaXRpb25cbiAgICAgICAqL1xuICAgICAgJ21hc2stcG9zaXRpb24nOiBbe1xuICAgICAgICBtYXNrOiBzY2FsZUJnUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1hc2sgUmVwZWF0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFzay1yZXBlYXRcbiAgICAgICAqL1xuICAgICAgJ21hc2stcmVwZWF0JzogW3tcbiAgICAgICAgbWFzazogc2NhbGVCZ1JlcGVhdCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBTaXplXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFzay1zaXplXG4gICAgICAgKi9cbiAgICAgICdtYXNrLXNpemUnOiBbe1xuICAgICAgICBtYXNrOiBzY2FsZUJnU2l6ZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBUeXBlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFzay10eXBlXG4gICAgICAgKi9cbiAgICAgICdtYXNrLXR5cGUnOiBbe1xuICAgICAgICAnbWFzay10eXBlJzogWydhbHBoYScsICdsdW1pbmFuY2UnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1hc2sgSW1hZ2VcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXNrLWltYWdlXG4gICAgICAgKi9cbiAgICAgICdtYXNrLWltYWdlJzogW3tcbiAgICAgICAgbWFzazogWydub25lJywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gRmlsdGVycyAtLS1cbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBGaWx0ZXJcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9maWx0ZXJcbiAgICAgICAqL1xuICAgICAgZmlsdGVyOiBbe1xuICAgICAgICBmaWx0ZXI6IFtcbiAgICAgICAgLy8gRGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjMuMC4wXG4gICAgICAgICcnLCAnbm9uZScsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmx1clxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JsdXJcbiAgICAgICAqL1xuICAgICAgYmx1cjogW3tcbiAgICAgICAgYmx1cjogc2NhbGVCbHVyKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCcmlnaHRuZXNzXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYnJpZ2h0bmVzc1xuICAgICAgICovXG4gICAgICBicmlnaHRuZXNzOiBbe1xuICAgICAgICBicmlnaHRuZXNzOiBbaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQ29udHJhc3RcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9jb250cmFzdFxuICAgICAgICovXG4gICAgICBjb250cmFzdDogW3tcbiAgICAgICAgY29udHJhc3Q6IFtpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBEcm9wIFNoYWRvd1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2Ryb3Atc2hhZG93XG4gICAgICAgKi9cbiAgICAgICdkcm9wLXNoYWRvdyc6IFt7XG4gICAgICAgICdkcm9wLXNoYWRvdyc6IFtcbiAgICAgICAgLy8gRGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjQuMC4wXG4gICAgICAgICcnLCAnbm9uZScsIHRoZW1lRHJvcFNoYWRvdywgaXNBcmJpdHJhcnlWYXJpYWJsZVNoYWRvdywgaXNBcmJpdHJhcnlTaGFkb3ddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRHJvcCBTaGFkb3cgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9maWx0ZXItZHJvcC1zaGFkb3cjc2V0dGluZy10aGUtc2hhZG93LWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdkcm9wLXNoYWRvdy1jb2xvcic6IFt7XG4gICAgICAgICdkcm9wLXNoYWRvdyc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyYXlzY2FsZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyYXlzY2FsZVxuICAgICAgICovXG4gICAgICBncmF5c2NhbGU6IFt7XG4gICAgICAgIGdyYXlzY2FsZTogWycnLCBpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBIdWUgUm90YXRlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvaHVlLXJvdGF0ZVxuICAgICAgICovXG4gICAgICAnaHVlLXJvdGF0ZSc6IFt7XG4gICAgICAgICdodWUtcm90YXRlJzogW2lzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEludmVydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ludmVydFxuICAgICAgICovXG4gICAgICBpbnZlcnQ6IFt7XG4gICAgICAgIGludmVydDogWycnLCBpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTYXR1cmF0ZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3NhdHVyYXRlXG4gICAgICAgKi9cbiAgICAgIHNhdHVyYXRlOiBbe1xuICAgICAgICBzYXR1cmF0ZTogW2lzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNlcGlhXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2VwaWFcbiAgICAgICAqL1xuICAgICAgc2VwaWE6IFt7XG4gICAgICAgI
25114HNlcGlhOiBbJycsIGlzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tkcm9wIEZpbHRlclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tkcm9wLWZpbHRlclxuICAgICAgICovXG4gICAgICAnYmFja2Ryb3AtZmlsdGVyJzogW3tcbiAgICAgICAgJ2JhY2tkcm9wLWZpbHRlcic6IFtcbiAgICAgICAgLy8gRGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjMuMC4wXG4gICAgICAgICcnLCAnbm9uZScsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2Ryb3AgQmx1clxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tkcm9wLWJsdXJcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLWJsdXInOiBbe1xuICAgICAgICAnYmFja2Ryb3AtYmx1cic6IHNjYWxlQmx1cigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2Ryb3AgQnJpZ2h0bmVzc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tkcm9wLWJyaWdodG5lc3NcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLWJyaWdodG5lc3MnOiBbe1xuICAgICAgICAnYmFja2Ryb3AtYnJpZ2h0bmVzcyc6IFtpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZHJvcCBDb250cmFzdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tkcm9wLWNvbnRyYXN0XG4gICAgICAgKi9cbiAgICAgICdiYWNrZHJvcC1jb250cmFzdCc6IFt7XG4gICAgICAgICdiYWNrZHJvcC1jb250cmFzdCc6IFtpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZHJvcCBHcmF5c2NhbGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZHJvcC1ncmF5c2NhbGVcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLWdyYXlzY2FsZSc6IFt7XG4gICAgICAgICdiYWNrZHJvcC1ncmF5c2NhbGUnOiBbJycsIGlzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tkcm9wIEh1ZSBSb3RhdGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZHJvcC1odWUtcm90YXRlXG4gICAgICAgKi9cbiAgICAgICdiYWNrZHJvcC1odWUtcm90YXRlJzogW3tcbiAgICAgICAgJ2JhY2tkcm9wLWh1ZS1yb3RhdGUnOiBbaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2Ryb3AgSW52ZXJ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2Ryb3AtaW52ZXJ0XG4gICAgICAgKi9cbiAgICAgICdiYWNrZHJvcC1pbnZlcnQnOiBbe1xuICAgICAgICAnYmFja2Ryb3AtaW52ZXJ0JzogWycnLCBpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZHJvcCBPcGFjaXR5XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2Ryb3Atb3BhY2l0eVxuICAgICAgICovXG4gICAgICAnYmFja2Ryb3Atb3BhY2l0eSc6IFt7XG4gICAgICAgICdiYWNrZHJvcC1vcGFjaXR5JzogW2lzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tkcm9wIFNhdHVyYXRlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2Ryb3Atc2F0dXJhdGVcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLXNhdHVyYXRlJzogW3tcbiAgICAgICAgJ2JhY2tkcm9wLXNhdHVyYXRlJzogW2lzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tkcm9wIFNlcGlhXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2Ryb3Atc2VwaWFcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLXNlcGlhJzogW3tcbiAgICAgICAgJ2JhY2tkcm9wLXNlcGlhJzogWycnLCBpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIC0tLSBUYWJsZXMgLS0tXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sbGFwc2VcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItY29sbGFwc2VcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci1jb2xsYXBzZSc6IFt7XG4gICAgICAgIGJvcmRlcjogWydjb2xsYXBzZScsICdzZXBhcmF0ZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFNwYWNpbmdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItc3BhY2luZ1xuICAgICAgICovXG4gICAgICAnYm9yZGVyLXNwYWNpbmcnOiBbe1xuICAgICAgICAnYm9yZGVyLXNwYWNpbmcnOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFNwYWNpbmcgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1zcGFjaW5nXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItc3BhY2luZy14JzogW3tcbiAgICAgICAgJ2JvcmRlci1zcGFjaW5nLXgnOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFNwYWNpbmcgWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1zcGFjaW5nXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItc3BhY2luZy15JzogW3tcbiAgICAgICAgJ2JvcmRlci1zcGFjaW5nLXknOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVGFibGUgTGF5b3V0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGFibGUtbGF5b3V0XG4gICAgICAgKi9cbiAgICAgICd0YWJsZS1sYXlvdXQnOiBbe1xuICAgICAgICB0YWJsZTogWydhdXRvJywgJ2ZpeGVkJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBDYXB0aW9uIFNpZGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9jYXB0aW9uLXNpZGVcbiAgICAgICAqL1xuICAgICAgY2FwdGlvbjogW3tcbiAgICAgICAgY2FwdGlvbjogWyd0b3AnLCAnYm90dG9tJ11cbiAgICAgIH1dLFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gVHJhbnNpdGlvbnMgYW5kIEFuaW1hdGlvbiAtLS1cbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBUcmFuc2l0aW9uIFByb3BlcnR5XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNpdGlvbi1wcm9wZXJ0eVxuICAgICAgICovXG4gICAgICB0cmFuc2l0aW9uOiBbe1xuICAgICAgICB0cmFuc2l0aW9uOiBbJycsICdhbGwnLCAnY29sb3JzJywgJ29wYWNpdHknLCAnc2hhZG93JywgJ3RyYW5zZm9ybScsICdub25lJywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUcmFuc2l0aW9uIEJlaGF2aW9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNpdGlvbi1iZWhhdmlvclxuICAgICAgICovXG4gICAgICAndHJhbnNpdGlvbi1iZWhhdmlvcic6IFt7XG4gICAgICAgI
25114HRyYW5zaXRpb246IFsnbm9ybWFsJywgJ2Rpc2NyZXRlJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUcmFuc2l0aW9uIER1cmF0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNpdGlvbi1kdXJhdGlvblxuICAgICAgICovXG4gICAgICBkdXJhdGlvbjogW3tcbiAgICAgICAgZHVyYXRpb246IFtpc051bWJlciwgJ2luaXRpYWwnLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRyYW5zaXRpb24gVGltaW5nIEZ1bmN0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb25cbiAgICAgICAqL1xuICAgICAgZWFzZTogW3tcbiAgICAgICAgZWFzZTogWydsaW5lYXInLCAnaW5pdGlhbCcsIHRoZW1lRWFzZSwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUcmFuc2l0aW9uIERlbGF5XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNpdGlvbi1kZWxheVxuICAgICAgICovXG4gICAgICBkZWxheTogW3tcbiAgICAgICAgZGVsYXk6IFtpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBBbmltYXRpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9hbmltYXRpb25cbiAgICAgICAqL1xuICAgICAgYW5pbWF0ZTogW3tcbiAgICAgICAgYW5pbWF0ZTogWydub25lJywgdGhlbWVBbmltYXRlLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIC0tLSBUcmFuc2Zvcm1zIC0tLVxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tmYWNlIFZpc2liaWxpdHlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZmFjZS12aXNpYmlsaXR5XG4gICAgICAgKi9cbiAgICAgIGJhY2tmYWNlOiBbe1xuICAgICAgICBiYWNrZmFjZTogWydoaWRkZW4nLCAndmlzaWJsZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGVyc3BlY3RpdmVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wZXJzcGVjdGl2ZVxuICAgICAgICovXG4gICAgICBwZXJzcGVjdGl2ZTogW3tcbiAgICAgICAgcGVyc3BlY3RpdmU6IFt0aGVtZVBlcnNwZWN0aXZlLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBlcnNwZWN0aXZlIE9yaWdpblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BlcnNwZWN0aXZlLW9yaWdpblxuICAgICAgICovXG4gICAgICAncGVyc3BlY3RpdmUtb3JpZ2luJzogW3tcbiAgICAgICAgJ3BlcnNwZWN0aXZlLW9yaWdpbic6IHNjYWxlUG9zaXRpb25XaXRoQXJiaXRyYXJ5KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBSb3RhdGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9yb3RhdGVcbiAgICAgICAqL1xuICAgICAgcm90YXRlOiBbe1xuICAgICAgICByb3RhdGU6IHNjYWxlUm90YXRlKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBSb3RhdGUgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3JvdGF0ZVxuICAgICAgICovXG4gICAgICAncm90YXRlLXgnOiBbe1xuICAgICAgICAncm90YXRlLXgnOiBzY2FsZVJvdGF0ZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUm90YXRlIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9yb3RhdGVcbiAgICAgICAqL1xuICAgICAgJ3JvdGF0ZS15JzogW3tcbiAgICAgICAgJ3JvdGF0ZS15Jzogc2NhbGVSb3RhdGUoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJvdGF0ZSBaXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvcm90YXRlXG4gICAgICAgKi9cbiAgICAgICdyb3RhdGUteic6IFt7XG4gICAgICAgICdyb3RhdGUteic6IHNjYWxlUm90YXRlKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY2FsZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3NjYWxlXG4gICAgICAgKi9cbiAgICAgIHNjYWxlOiBbe1xuICAgICAgICBzY2FsZTogc2NhbGVTY2FsZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2NhbGUgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3NjYWxlXG4gICAgICAgKi9cbiAgICAgICdzY2FsZS14JzogW3tcbiAgICAgICAgJ3NjYWxlLXgnOiBzY2FsZVNjYWxlKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY2FsZSBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2NhbGVcbiAgICAgICAqL1xuICAgICAgJ3NjYWxlLXknOiBbe1xuICAgICAgICAnc2NhbGUteSc6IHNjYWxlU2NhbGUoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjYWxlIFpcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY2FsZVxuICAgICAgICovXG4gICAgICAnc2NhbGUteic6IFt7XG4gICAgICAgICdzY2FsZS16Jzogc2NhbGVTY2FsZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2NhbGUgM0RcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY2FsZVxuICAgICAgICovXG4gICAgICAnc2NhbGUtM2QnOiBbJ3NjYWxlLTNkJ10sXG4gICAgICAvKipcbiAgICAgICAqIFNrZXdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9za2V3XG4gICAgICAgKi9cbiAgICAgIHNrZXc6IFt7XG4gICAgICAgI
25114HNrZXc6IHNjYWxlU2tldygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2tldyBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2tld1xuICAgICAgICovXG4gICAgICAnc2tldy14JzogW3tcbiAgICAgICAgJ3NrZXcteCc6IHNjYWxlU2tldygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2tldyBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2tld1xuICAgICAgICovXG4gICAgICAnc2tldy15JzogW3tcbiAgICAgICAgJ3NrZXcteSc6IHNjYWxlU2tldygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNmb3JtXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNmb3JtXG4gICAgICAgKi9cbiAgICAgIHRyYW5zZm9ybTogW3tcbiAgICAgICAgdHJhbnNmb3JtOiBbaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZSwgJycsICdub25lJywgJ2dwdScsICdjcHUnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRyYW5zZm9ybSBPcmlnaW5cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90cmFuc2Zvcm0tb3JpZ2luXG4gICAgICAgKi9cbiAgICAgICd0cmFuc2Zvcm0tb3JpZ2luJzogW3tcbiAgICAgICAgb3JpZ2luOiBzY2FsZVBvc2l0aW9uV2l0aEFyYml0cmFyeSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNmb3JtIFN0eWxlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNmb3JtLXN0eWxlXG4gICAgICAgKi9cbiAgICAgICd0cmFuc2Zvcm0tc3R5bGUnOiBbe1xuICAgICAgICB0cmFuc2Zvcm06IFsnM2QnLCAnZmxhdCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNsYXRlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNsYXRlXG4gICAgICAgKi9cbiAgICAgIHRyYW5zbGF0ZTogW3tcbiAgICAgICAgdHJhbnNsYXRlOiBzY2FsZVRyYW5zbGF0ZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNsYXRlIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90cmFuc2xhdGVcbiAgICAgICAqL1xuICAgICAgJ3RyYW5zbGF0ZS14JzogW3tcbiAgICAgICAgJ3RyYW5zbGF0ZS14Jzogc2NhbGVUcmFuc2xhdGUoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRyYW5zbGF0ZSBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNsYXRlXG4gICAgICAgKi9cbiAgICAgICd0cmFuc2xhdGUteSc6IFt7XG4gICAgICAgICd0cmFuc2xhdGUteSc6IHNjYWxlVHJhbnNsYXRlKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUcmFuc2xhdGUgWlxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RyYW5zbGF0ZVxuICAgICAgICovXG4gICAgICAndHJhbnNsYXRlLXonOiBbe1xuICAgICAgICAndHJhbnNsYXRlLXonOiBzY2FsZVRyYW5zbGF0ZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNsYXRlIE5vbmVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90cmFuc2xhdGVcbiAgICAgICAqL1xuICAgICAgJ3RyYW5zbGF0ZS1ub25lJzogWyd0cmFuc2xhdGUtbm9uZSddLFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gSW50ZXJhY3Rpdml0eSAtLS1cbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBBY2NlbnQgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9hY2NlbnQtY29sb3JcbiAgICAgICAqL1xuICAgICAgYWNjZW50OiBbe1xuICAgICAgICBhY2NlbnQ6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEFwcGVhcmFuY2VcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9hcHBlYXJhbmNlXG4gICAgICAgKi9cbiAgICAgIGFwcGVhcmFuY2U6IFt7XG4gICAgICAgIGFwcGVhcmFuY2U6IFsnbm9uZScsICdhdXRvJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBDYXJldCBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2p1c3QtaW4tdGltZS1tb2RlI2NhcmV0LWNvbG9yLXV0aWxpdGllc1xuICAgICAgICovXG4gICAgICAnY2FyZXQtY29sb3InOiBbe1xuICAgICAgICBjYXJldDogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQ29sb3IgU2NoZW1lXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvY29sb3Itc2NoZW1lXG4gICAgICAgKi9cbiAgICAgICdjb2xvci1zY2hlbWUnOiBbe1xuICAgICAgICBzY2hlbWU6IFsnbm9ybWFsJywgJ2RhcmsnLCAnbGlnaHQnLCAnbGlnaHQtZGFyaycsICdvbmx5LWRhcmsnLCAnb25seS1saWdodCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQ3Vyc29yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvY3Vyc29yXG4gICAgICAgKi9cbiAgICAgIGN1cnNvcjogW3tcbiAgICAgICAgY3Vyc29yOiBbJ2F1dG8nLCAnZGVmYXVsdCcsICdwb2ludGVyJywgJ3dhaXQnLCAndGV4dCcsICdtb3ZlJywgJ2hlbHAnLCAnbm90LWFsbG93ZWQnLCAnbm9uZScsICdjb250ZXh0LW1lbnUnLCAncHJvZ3Jlc3MnLCAnY2VsbCcsICdjcm9zc2hhaXInLCAndmVydGljYWwtdGV4dCcsICdhbGlhcycsICdjb3B5JywgJ25vLWRyb3AnLCAnZ3JhYicsICdncmFiYmluZycsICdhbGwtc2Nyb2xsJywgJ2NvbC1yZXNpemUnLCAncm93LXJlc2l6ZScsICduLXJlc2l6ZScsICdlLXJlc2l6ZScsICdzLXJlc2l6ZScsICd3LXJlc2l6ZScsICduZS1yZXNpemUnLCAnbnctcmVzaXplJywgJ3NlLXJlc2l6ZScsICdzdy1yZXNpemUnLCAnZXctcmVzaXplJywgJ25zLXJlc2l6ZScsICduZXN3LXJlc2l6ZScsICdud3NlLXJlc2l6ZScsICd6b29tLWluJywgJ3pvb20tb3V0JywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBGaWVsZCBTaXppbmdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9maWVsZC1zaXppbmdcbiAgICAgICAqL1xuICAgICAgJ2ZpZWxkLXNpemluZyc6IFt7XG4gICAgICAgICdmaWVsZC1zaXppbmcnOiBbJ2ZpeGVkJywgJ2NvbnRlbnQnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBvaW50ZXIgRXZlbnRzXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcG9pbnRlci1ldmVud
25114HNcbiAgICAgICAqL1xuICAgICAgJ3BvaW50ZXItZXZlbnRzJzogW3tcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzJzogWydhdXRvJywgJ25vbmUnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJlc2l6ZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Jlc2l6ZVxuICAgICAgICovXG4gICAgICByZXNpemU6IFt7XG4gICAgICAgIHJlc2l6ZTogWydub25lJywgJycsICd5JywgJ3gnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBCZWhhdmlvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1iZWhhdmlvclxuICAgICAgICovXG4gICAgICAnc2Nyb2xsLWJlaGF2aW9yJzogW3tcbiAgICAgICAgc2Nyb2xsOiBbJ2F1dG8nLCAnc21vb3RoJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgTWFyZ2luXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLW1hcmdpblxuICAgICAgICovXG4gICAgICAnc2Nyb2xsLW0nOiBbe1xuICAgICAgICAnc2Nyb2xsLW0nOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIE1hcmdpbiBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLW1hcmdpblxuICAgICAgICovXG4gICAgICAnc2Nyb2xsLW14JzogW3tcbiAgICAgICAgJ3Njcm9sbC1teCc6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgTWFyZ2luIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtbWFyZ2luXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtbXknOiBbe1xuICAgICAgICAnc2Nyb2xsLW15Jzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBNYXJnaW4gU3RhcnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtbWFyZ2luXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtbXMnOiBbe1xuICAgICAgICAnc2Nyb2xsLW1zJzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBNYXJnaW4gRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLW1hcmdpblxuICAgICAgICovXG4gICAgICAnc2Nyb2xsLW1lJzogW3tcbiAgICAgICAgJ3Njcm9sbC1tZSc6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgTWFyZ2luIFRvcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1tYXJnaW5cbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1tdCc6IFt7XG4gICAgICAgICdzY3JvbGwtbXQnOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIE1hcmdpbiBSaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1tYXJnaW5cbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1tcic6IFt7XG4gICAgICAgICdzY3JvbGwtbXInOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIE1hcmdpbiBCb3R0b21cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtbWFyZ2luXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtbWInOiBbe1xuICAgICAgICAnc2Nyb2xsLW1iJzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBNYXJnaW4gTGVmdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1tYXJnaW5cbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1tbCc6IFt7XG4gICAgICAgICdzY3JvbGwtbWwnOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFBhZGRpbmdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtcGFkZGluZ1xuICAgICAgICovXG4gICAgICAnc2Nyb2xsLXAnOiBbe1xuICAgICAgICAnc2Nyb2xsLXAnOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFBhZGRpbmcgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtcHgnOiBbe1xuICAgICAgICAnc2Nyb2xsLXB4Jzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBQYWRkaW5nIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtcGFkZGluZ1xuICAgICAgICovXG4gICAgICAnc2Nyb2xsLXB5JzogW3tcbiAgICAgICAgJ3Njcm9sbC1weSc6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgUGFkZGluZyBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtcHMnOiBbe1xuICAgICAgICAnc2Nyb2xsLXBzJzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBQYWRkaW5nIEVuZFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtcGUnOiBbe1xuICAgICAgICAnc2Nyb2xsLXBlJzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBQYWRkaW5nIFRvcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtcHQnOiBbe1xuICAgICAgICAnc2Nyb2xsLXB0Jzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBQYWRkaW5nIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLXBhZGRpbmdcbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1wcic6IFt7XG4gICAgICAgICdzY3JvbGwtcHInOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFBhZGRpbmcgQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLXBhZGRpbmdcbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1wYic6IFt7XG4gICAgICAgICdzY3JvbGwtcGInOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFBhZGRpbmcgTGVmdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtcGwnOiBbe1xuICAgICAgICAnc2Nyb2xsLXBsJzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBTbmFwIEFsaWduXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLXNuYXAtYWxpZ25cbiAgICAgICAqL1xuICAgICAgJ3NuYXAtYWxpZ24nOiBbe1xuICAgICAgICBzbmFwOiBbJ3N0YXJ0JywgJ2VuZCcsICdjZW50ZXInLCAnYWxpZ24tbm9uZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFNuYXAgU3RvcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1zbmFwLXN0b3BcbiAgICAgICAqL1xuICAgICAgJ3NuYXAtc3RvcCc6IFt7XG4gICAgICAgI
25114HNuYXA6IFsnbm9ybWFsJywgJ2Fsd2F5cyddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFNuYXAgVHlwZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1zbmFwLXR5cGVcbiAgICAgICAqL1xuICAgICAgJ3NuYXAtdHlwZSc6IFt7XG4gICAgICAgIHNuYXA6IFsnbm9uZScsICd4JywgJ3knLCAnYm90aCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFNuYXAgVHlwZSBTdHJpY3RuZXNzXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLXNuYXAtdHlwZVxuICAgICAgICovXG4gICAgICAnc25hcC1zdHJpY3RuZXNzJzogW3tcbiAgICAgICAgc25hcDogWydtYW5kYXRvcnknLCAncHJveGltaXR5J11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUb3VjaCBBY3Rpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90b3VjaC1hY3Rpb25cbiAgICAgICAqL1xuICAgICAgdG91Y2g6IFt7XG4gICAgICAgIHRvdWNoOiBbJ2F1dG8nLCAnbm9uZScsICdtYW5pcHVsYXRpb24nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRvdWNoIEFjdGlvbiBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG91Y2gtYWN0aW9uXG4gICAgICAgKi9cbiAgICAgICd0b3VjaC14JzogW3tcbiAgICAgICAgJ3RvdWNoLXBhbic6IFsneCcsICdsZWZ0JywgJ3JpZ2h0J11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUb3VjaCBBY3Rpb24gWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RvdWNoLWFjdGlvblxuICAgICAgICovXG4gICAgICAndG91Y2gteSc6IFt7XG4gICAgICAgICd0b3VjaC1wYW4nOiBbJ3knLCAndXAnLCAnZG93biddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVG91Y2ggQWN0aW9uIFBpbmNoIFpvb21cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90b3VjaC1hY3Rpb25cbiAgICAgICAqL1xuICAgICAgJ3RvdWNoLXB6JzogWyd0b3VjaC1waW5jaC16b29tJ10sXG4gICAgICAvKipcbiAgICAgICAqIFVzZXIgU2VsZWN0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdXNlci1zZWxlY3RcbiAgICAgICAqL1xuICAgICAgc2VsZWN0OiBbe1xuICAgICAgICBzZWxlY3Q6IFsnbm9uZScsICd0ZXh0JywgJ2FsbCcsICdhdXRvJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBXaWxsIENoYW5nZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3dpbGwtY2hhbmdlXG4gICAgICAgKi9cbiAgICAgICd3aWxsLWNoYW5nZSc6IFt7XG4gICAgICAgICd3aWxsLWNoYW5nZSc6IFsnYXV0bycsICdzY3JvbGwnLCAnY29udGVudHMnLCAndHJhbnNmb3JtJywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLy8gLS0tLS0tLS0tLS1cbiAgICAgIC8vIC0tLSBTVkcgLS0tXG4gICAgICAvLyAtLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBGaWxsXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZmlsbFxuICAgICAgICovXG4gICAgICBmaWxsOiBbe1xuICAgICAgICBmaWxsOiBbJ25vbmUnLCAuLi5zY2FsZUNvbG9yKCldXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU3Ryb2tlIFdpZHRoXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc3Ryb2tlLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdzdHJva2Utdyc6IFt7XG4gICAgICAgIHN0cm9rZTogW2lzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlTGVuZ3RoLCBpc0FyYml0cmFyeUxlbmd0aCwgaXNBcmJpdHJhcnlOdW1iZXJdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU3Ryb2tlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc3Ryb2tlXG4gICAgICAgKi9cbiAgICAgIHN0cm9rZTogW3tcbiAgICAgICAgc3Ryb2tlOiBbJ25vbmUnLCAuLi5zY2FsZUNvbG9yKCldXG4gICAgICB9XSxcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLy8gLS0tIEFjY2Vzc2liaWxpdHkgLS0tXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8qKlxuICAgICAgICogRm9yY2VkIENvbG9yIEFkanVzdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvcmNlZC1jb2xvci1hZGp1c3RcbiAgICAgICAqL1xuICAgICAgJ2ZvcmNlZC1jb2xvci1hZGp1c3QnOiBbe1xuICAgICAgICAnZm9yY2VkLWNvbG9yLWFkanVzdCc6IFsnYXV0bycsICdub25lJ11cbiAgICAgIH1dXG4gICAgfSxcbiAgICBjb25mbGljdGluZ0NsYXNzR3JvdXBzOiB7XG4gICAgICBvdmVyZmxvdzogWydvdmVyZmxvdy14JywgJ292ZXJmbG93LXknXSxcbiAgICAgIG92ZXJzY3JvbGw6IFsnb3ZlcnNjcm9sbC14JywgJ292ZXJzY3JvbGwteSddLFxuICAgICAgaW5zZXQ6IFsnaW5zZXQteCcsICdpbnNldC15JywgJ3N0YXJ0JywgJ2VuZCcsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXSxcbiAgICAgICdpbnNldC14JzogWydyaWdodCcsICdsZWZ0J10sXG4gICAgICAnaW5zZXQteSc6IFsndG9wJywgJ2JvdHRvbSddLFxuICAgICAgZmxleDogWydiYXNpcycsICdncm93JywgJ3NocmluayddLFxuICAgICAgZ2FwOiBbJ2dhcC14JywgJ2dhcC15J10sXG4gICAgICBwOiBbJ3B4JywgJ3B5JywgJ3BzJywgJ3BlJywgJ3B0JywgJ3ByJywgJ3BiJywgJ3BsJ10sXG4gICAgICBweDogWydwcicsICdwbCddLFxuICAgICAgcHk6IFsncHQnLCAncGInXSxcbiAgICAgIG06IFsnbXgnLCAnbXknLCAnbXMnLCAnbWUnLCAnbXQnLCAnbXInLCAnbWInLCAnbWwnXSxcbiAgICAgIG14OiBbJ21yJywgJ21sJ10sXG4gICAgICBteTogWydtdCcsICdtYiddLFxuICAgICAgc2l6ZTogWyd3JywgJ2gnXSxcbiAgICAgICdmb250LXNpemUnOiBbJ2xlYWRpbmcnXSxcbiAgICAgICdmdm4tbm9ybWFsJzogWydmdm4tb3JkaW5hbCcsICdmdm4tc2xhc2hlZC16ZXJvJywgJ2Z2bi1maWd1cmUnLCAnZnZuLXNwYWNpbmcnLCAnZnZuLWZyYWN0aW9uJ10sXG4gICAgICAnZnZuLW9yZGluYWwnOiBbJ2Z2bi1ub3JtYWwnXSxcbiAgICAgICdmdm4tc2xhc2hlZC16ZXJvJzogW
25114ydmdm4tbm9ybWFsJ10sXG4gICAgICAnZnZuLWZpZ3VyZSc6IFsnZnZuLW5vcm1hbCddLFxuICAgICAgJ2Z2bi1zcGFjaW5nJzogWydmdm4tbm9ybWFsJ10sXG4gICAgICAnZnZuLWZyYWN0aW9uJzogWydmdm4tbm9ybWFsJ10sXG4gICAgICAnbGluZS1jbGFtcCc6IFsnZGlzcGxheScsICdvdmVyZmxvdyddLFxuICAgICAgcm91bmRlZDogWydyb3VuZGVkLXMnLCAncm91bmRlZC1lJywgJ3JvdW5kZWQtdCcsICdyb3VuZGVkLXInLCAncm91bmRlZC1iJywgJ3JvdW5kZWQtbCcsICdyb3VuZGVkLXNzJywgJ3JvdW5kZWQtc2UnLCAncm91bmRlZC1lZScsICdyb3VuZGVkLWVzJywgJ3JvdW5kZWQtdGwnLCAncm91bmRlZC10cicsICdyb3VuZGVkLWJyJywgJ3JvdW5kZWQtYmwnXSxcbiAgICAgICdyb3VuZGVkLXMnOiBbJ3JvdW5kZWQtc3MnLCAncm91bmRlZC1lcyddLFxuICAgICAgJ3JvdW5kZWQtZSc6IFsncm91bmRlZC1zZScsICdyb3VuZGVkLWVlJ10sXG4gICAgICAncm91bmRlZC10JzogWydyb3VuZGVkLXRsJywgJ3JvdW5kZWQtdHInXSxcbiAgICAgICdyb3VuZGVkLXInOiBbJ3JvdW5kZWQtdHInLCAncm91bmRlZC1iciddLFxuICAgICAgJ3JvdW5kZWQtYic6IFsncm91bmRlZC1icicsICdyb3VuZGVkLWJsJ10sXG4gICAgICAncm91bmRlZC1sJzogWydyb3VuZGVkLXRsJywgJ3JvdW5kZWQtYmwnXSxcbiAgICAgICdib3JkZXItc3BhY2luZyc6IFsnYm9yZGVyLXNwYWNpbmcteCcsICdib3JkZXItc3BhY2luZy15J10sXG4gICAgICAnYm9yZGVyLXcnOiBbJ2JvcmRlci13LXgnLCAnYm9yZGVyLXcteScsICdib3JkZXItdy1zJywgJ2JvcmRlci13LWUnLCAnYm9yZGVyLXctdCcsICdib3JkZXItdy1yJywgJ2JvcmRlci13LWInLCAnYm9yZGVyLXctbCddLFxuICAgICAgJ2JvcmRlci13LXgnOiBbJ2JvcmRlci13LXInLCAnYm9yZGVyLXctbCddLFxuICAgICAgJ2JvcmRlci13LXknOiBbJ2JvcmRlci13LXQnLCAnYm9yZGVyLXctYiddLFxuICAgICAgJ2JvcmRlci1jb2xvcic6IFsnYm9yZGVyLWNvbG9yLXgnLCAnYm9yZGVyLWNvbG9yLXknLCAnYm9yZGVyLWNvbG9yLXMnLCAnYm9yZGVyLWNvbG9yLWUnLCAnYm9yZGVyLWNvbG9yLXQnLCAnYm9yZGVyLWNvbG9yLXInLCAnYm9yZGVyLWNvbG9yLWInLCAnYm9yZGVyLWNvbG9yLWwnXSxcbiAgICAgICdib3JkZXItY29sb3IteCc6IFsnYm9yZGVyLWNvbG9yLXInLCAnYm9yZGVyLWNvbG9yLWwnXSxcbiAgICAgICdib3JkZXItY29sb3IteSc6IFsnYm9yZGVyLWNvbG9yLXQnLCAnYm9yZGVyLWNvbG9yLWInXSxcbiAgICAgIHRyYW5zbGF0ZTogWyd0cmFuc2xhdGUteCcsICd0cmFuc2xhdGUteScsICd0cmFuc2xhdGUtbm9uZSddLFxuICAgICAgJ3RyYW5zbGF0ZS1ub25lJzogWyd0cmFuc2xhdGUnLCAndHJhbnNsYXRlLXgnLCAndHJhbnNsYXRlLXknLCAndHJhbnNsYXRlLXonXSxcbiAgICAgICdzY3JvbGwtbSc6IFsnc2Nyb2xsLW14JywgJ3Njcm9sbC1teScsICdzY3JvbGwtbXMnLCAnc2Nyb2xsLW1lJywgJ3Njcm9sbC1tdCcsICdzY3JvbGwtbXInLCAnc2Nyb2xsLW1iJywgJ3Njcm9sbC1tbCddLFxuICAgICAgJ3Njcm9sbC1teCc6IFsnc2Nyb2xsLW1yJywgJ3Njcm9sbC1tbCddLFxuICAgICAgJ3Njcm9sbC1teSc6IFsnc2Nyb2xsLW10JywgJ3Njcm9sbC1tYiddLFxuICAgICAgJ3Njcm9sbC1wJzogWydzY3JvbGwtcHgnLCAnc2Nyb2xsLXB5JywgJ3Njcm9sbC1wcycsICdzY3JvbGwtcGUnLCAnc2Nyb2xsLXB0JywgJ3Njcm9sbC1wcicsICdzY3JvbGwtcGInLCAnc2Nyb2xsLXBsJ10sXG4gICAgICAnc2Nyb2xsLXB4JzogWydzY3JvbGwtcHInLCAnc2Nyb2xsLXBsJ10sXG4gICAgICAnc2Nyb2xsLXB5JzogWydzY3JvbGwtcHQnLCAnc2Nyb2xsLXBiJ10sXG4gICAgICB0b3VjaDogWyd0b3VjaC14JywgJ3RvdWNoLXknLCAndG91Y2gtcHonXSxcbiAgICAgICd0b3VjaC14JzogWyd0b3VjaCddLFxuICAgICAgJ3RvdWNoLXknOiBbJ3RvdWNoJ10sXG4gICAgICAndG91Y2gtcHonOiBbJ3RvdWNoJ11cbiAgICB9LFxuICAgIGNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyczoge1xuICAgICAgJ2ZvbnQtc2l6ZSc6IFsnbGVhZGluZyddXG4gICAgfSxcbiAgICBvcmRlclNlbnNpdGl2ZU1vZGlmaWVyczogWycqJywgJyoqJywgJ2FmdGVyJywgJ2JhY2tkcm9wJywgJ2JlZm9yZScsICdkZXRhaWxzLWNvbnRlbnQnLCAnZmlsZScsICdmaXJzdC1sZXR0ZXInLCAnZmlyc3QtbGluZScsICdtYXJrZXInLCAncGxhY2Vob2xkZXInLCAnc2VsZWN0aW9uJ11cbiAgfTtcbn07XG5cbi8qKlxuICogQHBhcmFtIGJhc2VDb25maWcgQ29uZmlnIHdoZXJlIG90aGVyIGNvbmZpZyB3aWxsIGJlIG1lcmdlZCBpbnRvLiBUaGlzIG9iamVjdCB3aWxsIGJlIG11dGF0ZWQuXG4gKiBAcGFyYW0gY29uZmlnRXh0ZW5zaW9uIFBhcnRpYWwgY29uZmlnIHRvIG1lcmdlIGludG8gdGhlIGBiYXNlQ29uZmlnYC5cbiAqL1xuY29uc3QgbWVyZ2VDb25maWdzID0gKGJhc2VDb25maWcsIHtcbiAgY2FjaGVTaXplLFxuICBwcmVmaXgsXG4gIGV4cGVyaW1lbnRhbFBhcnNlQ2xhc3NOYW1lLFxuICBleHRlbmQgPSB7fSxcbiAgb3ZlcnJpZGUgPSB7fVxufSkgPT4ge1xuICBvdmVycmlkZVByb3BlcnR5KGJhc2VDb25maWcsICdjYWNoZVNpemUnLCBjYWNoZVNpemUpO1xuICBvdmVycmlkZVByb3BlcnR5KGJhc2VDb25maWcsICdwcmVmaXgnLCBwcmVmaXgpO1xuICBvdmVycmlkZVByb3BlcnR5KGJhc2VDb25maWcsICdleHBlcmltZW50YWxQYXJzZUNsYXNzTmFtZScsIGV4cGVyaW1lbnRhbFBhcnNlQ2xhc3NOYW1lKTtcbiAgb3ZlcnJpZGVDb25maWdQcm9wZXJ0aWVzKGJhc2VDb25maWcudGhlbWUsIG92ZXJyaWRlLnRoZW1lKTtcbiAgb3ZlcnJpZGVDb25maWdQcm9wZXJ0aWVzKGJhc2VDb25maWcuY2xhc3NHcm91cHMsIG92ZXJyaWRlLmNsYXNzR3JvdXBzKTtcbiAgb3ZlcnJpZGVDb25maWdQcm9wZXJ0aWVzKGJhc2VDb25maWcuY29uZmxpY3RpbmdDbGFzc0dyb3Vwcywgb3ZlcnJpZGUuY29uZmxpY3RpbmdDbGFzc0dyb3Vwcyk7XG4gIG92ZXJyaWRlQ29uZmlnUHJvcGVydGllcyhiYXNlQ29uZmlnLmNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVycywgb3ZlcnJpZGUuY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzKTtcbiAgb3ZlcnJpZGVQcm9wZXJ0eShiYXNlQ29uZmlnLCAnb3JkZXJTZW5zaXRpdmVNb2RpZmllcnMnLCBvdmVycmlkZS5vcmRlclNlbnNpdGl2ZU1vZGlmaWVycyk7XG4gIG1lcmdlQ29uZmlnUHJvcGVydGllcyhiYXNlQ29uZmlnLnRoZW1lLCBleHRlbmQudGhlbWUpO1xuICBtZXJnZUNvbmZpZ1Byb3BlcnRpZXMoYmFzZUNvbmZpZy5jbGFzc0dyb3VwcywgZXh0ZW5kLmNsYXNzR3JvdXBzKTtcbiAgbWVyZ2VDb25maWdQcm9wZXJ0aWVzKGJhc2VDb25maWcuY29uZmxpY3RpbmdDbGFzc0dyb3VwcywgZXh0ZW5kLmNvbmZsaWN0aW5nQ2xhc3NHcm91cHMpO1xuICBtZXJnZUNvbmZpZ1Byb3BlcnRpZXMoYmFzZUNvbmZpZy5jb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnMsIGV4dGVuZC5jb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnMpO1xuICBtZXJnZUFycmF5UHJvcGVydGllcyhiYXNlQ29uZmlnLCBleHRlbmQsICdvcmRlclNlbnNpdGl2ZU1vZGlmaWVycycpO1xuICByZXR1cm4gYmFzZUNvbmZpZztcbn07XG5jb25zdCBvdmVycmlkZVByb3BlcnR5ID0gKGJhc2VPYmplY3QsIG92ZXJyaWRlS2V5LCBvdmVycmlkZVZhbHVlKSA9PiB7XG4gIGlmIChvdmVycmlkZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBiYXNlT2JqZWN0W292ZXJyaWRlS2V5XSA9IG92ZXJyaWRlVmFsdWU7XG4gIH1cbn07XG5jb25zdCBvdmVycmlkZUNvbmZpZ1Byb3BlcnRpZXMgPSAoYmFzZU9iamVjdCwgb3ZlcnJpZGVPYmplY3QpID0+IHtcbiAgaWYgKG92ZXJyaWRlT2JqZWN0KSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3ZlcnJpZGVPYmplY3QpIHtcbiAgICAgIG92ZXJyaWRlUHJvcGVydHkoYmFzZU9iamVjdCwga2V5LCBvdmVycmlkZU9iamVjdFtrZXldKTtcbiAgICB9XG4gI
25114H1cbn07XG5jb25zdCBtZXJnZUNvbmZpZ1Byb3BlcnRpZXMgPSAoYmFzZU9iamVjdCwgbWVyZ2VPYmplY3QpID0+IHtcbiAgaWYgKG1lcmdlT2JqZWN0KSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWVyZ2VPYmplY3QpIHtcbiAgICAgIG1lcmdlQXJyYXlQcm9wZXJ0aWVzKGJhc2VPYmplY3QsIG1lcmdlT2JqZWN0LCBrZXkpO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IG1lcmdlQXJyYXlQcm9wZXJ0aWVzID0gKGJhc2VPYmplY3QsIG1lcmdlT2JqZWN0LCBrZXkpID0+IHtcbiAgY29uc3QgbWVyZ2VWYWx1ZSA9IG1lcmdlT2JqZWN0W2tleV07XG4gIGlmIChtZXJnZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBiYXNlT2JqZWN0W2tleV0gPSBiYXNlT2JqZWN0W2tleV0gPyBiYXNlT2JqZWN0W2tleV0uY29uY2F0KG1lcmdlVmFsdWUpIDogbWVyZ2VWYWx1ZTtcbiAgfVxufTtcbmNvbnN0IGV4dGVuZFRhaWx3aW5kTWVyZ2UgPSAoY29uZmlnRXh0ZW5zaW9uLCAuLi5jcmVhdGVDb25maWcpID0+IHR5cGVvZiBjb25maWdFeHRlbnNpb24gPT09ICdmdW5jdGlvbicgPyBjcmVhdGVUYWlsd2luZE1lcmdlKGdldERlZmF1bHRDb25maWcsIGNvbmZpZ0V4dGVuc2lvbiwgLi4uY3JlYXRlQ29uZmlnKSA6IGNyZWF0ZVRhaWx3aW5kTWVyZ2UoKCkgPT4gbWVyZ2VDb25maWdzKGdldERlZmF1bHRDb25maWcoKSwgY29uZmlnRXh0ZW5zaW9uKSwgLi4uY3JlYXRlQ29uZmlnKTtcbmNvbnN0IHR3TWVyZ2UgPSAvKiNfX1BVUkVfXyovY3JlYXRlVGFpbHdpbmRNZXJnZShnZXREZWZhdWx0Q29uZmlnKTtcbmV4cG9ydCB7IGNyZWF0ZVRhaWx3aW5kTWVyZ2UsIGV4dGVuZFRhaWx3aW5kTWVyZ2UsIGZyb21UaGVtZSwgZ2V0RGVmYXVsdENvbmZpZywgbWVyZ2VDb25maWdzLCB0d0pvaW4sIHR3TWVyZ2UsIHZhbGlkYXRvcnMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJ1bmRsZS1tanMubWpzLm1hcFxuIiwiaW1wb3J0IHsgdHlwZSBDbGFzc1ZhbHVlLCBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCB7IHR3TWVyZ2UgfSBmcm9tICd0YWlsd2luZC1tZXJnZSdcblxuZXhwb3J0IGZ1bmN0aW9uIGNuKC4uLmlucHV0czogQ2xhc3NWYWx1ZVtdKSB7XG4gIHJldHVybiB0d01lcmdlKGNsc3goaW5wdXRzKSlcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vdXRpbHMvY24nXG5cbmNvbnN0IENhcmQgPSBSZWFjdC5mb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCxcbiAgUmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+XG4+KCh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfSwgcmVmKSA9PiAoXG4gIDxkaXZcbiAgICByZWY9e3JlZn1cbiAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgJ3JvdW5kZWQtbGcgYm9yZGVyIGJnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQgc2hhZG93LXNtJyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICl9XG4gICAgey4uLnByb3BzfVxuICAvPlxuKSlcbkNhcmQuZGlzcGxheU5hbWUgPSAnQ2FyZCdcblxuY29uc3QgQ2FyZEhlYWRlciA9IFJlYWN0LmZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD5cbj4oKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9LCByZWYpID0+IChcbiAgPGRpdlxuICAgIHJlZj17cmVmfVxuICAgIGNsYXNzTmFtZT17Y24oJ2ZsZXggZmxleC1jb2wgc3BhY2UteS0xLjUgcC02JywgY2xhc3NOYW1lKX1cbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pKVxuQ2FyZEhlYWRlci5kaXNwbGF5TmFtZSA9ICdDYXJkSGVhZGVyJ1xuXG5jb25zdCBDYXJkVGl0bGUgPSBSZWFjdC5mb3J3YXJkUmVmPFxuICBIVE1MUGFyYWdyYXBoRWxlbWVudCxcbiAgUmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTEhlYWRpbmdFbGVtZW50PlxuPigoeyBjbGFzc05hbWUsIC4uLnByb3BzIH0sIHJlZikgPT4gKFxuICA8aDNcbiAgICByZWY9e3JlZn1cbiAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgJ3RleHQtMnhsIGZvbnQtc2VtaWJvbGQgbGVhZGluZy1ub25lIHRyYWNraW5nLXRpZ2h0JyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICl9XG4gICAgey4uLnByb3BzfVxuICAvPlxuKSlcbkNhcmRUaXRsZS5kaXNwbGF5TmFtZSA9ICdDYXJkVGl0bGUnXG5cbmNvbnN0IENhcmREZXNjcmlwdGlvbiA9IFJlYWN0LmZvcndhcmRSZWY8XG4gIEhUTUxQYXJhZ3JhcGhFbGVtZW50LFxuICBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MUGFyYWdyYXBoRWxlbWVudD5cbj4oKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9LCByZWYpID0+IChcbiAgPHBcbiAgICByZWY9e3JlZn1cbiAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsIGNsYXNzTmFtZSl9XG4gICAgey4uLnByb3BzfVxuICAvPlxuKSlcbkNhcmREZXNjcmlwdGlvbi5kaXNwbGF5TmFtZSA9ICdDYXJkRGVzY3JpcHRpb24nXG5cbmNvbnN0IENhcmRDb250ZW50ID0gUmVhY3QuZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIFJlYWN0LkhUTUxBdHRyaWJ1dGVzPEhUTUxEaXZFbGVtZW50PlxuPigoeyBjbGFzc05hbWUsIC4uLnByb3BzIH0sIHJlZikgPT4gKFxuICA8ZGl2IHJlZj17cmVmfSBjbGFzc05hbWU9e2NuKCdwLTYgcHQtMCcsIGNsYXNzTmFtZSl9IHsuLi5wcm9wc30gLz5cbikpXG5DYXJkQ29udGVudC5kaXNwbGF5TmFtZSA9ICdDYXJkQ29udGVudCdcblxuY29uc3QgQ2FyZEZvb3RlciA9IFJlYWN0LmZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD5cbj4oKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9LCByZWYpID0+IChcbiAgPGRpdlxuICAgIHJlZj17cmVmfVxuICAgIGNsYXNzTmFtZT17Y24oJ2ZsZXggaXRlbXMtY2VudGVyIHAtNiBwdC0wJywgY2xhc3NOYW1lKX1cbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pKVxuQ2FyZEZvb3Rlci5kaXNwbGF5TmFtZSA9ICdDYXJkRm9vdGVyJ1xuXG5leHBvcnQgeyBDYXJkLCBDYXJkSGVhZGVyLCBDYXJkRm9vdGVyLCBDYXJkVGl0bGUsIENhcmREZXNjcmlwdGlvbiwgQ2FyZENvbnRlbnQgfVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY2xzeCB9IGZyb20gJ2Nsc3gnXG5pbXBvcnQgeyBBcnJvd1JpZ2h0IH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1dHRvblByb3BzIGV4dGVuZHMgUmVhY3QuQnV0dG9uSFRNTEF0dHJpYnV0ZXM8SFRNTEJ1dHRvbkVsZW1lbnQ+IHtcbiAgdmFyaWFudD86ICdwcmltYXJ5JyB8ICdzZWNvbmRhcnknIHwgJ2FjY2VudCcgfCAnZ2hvc3QnXG4gIHNpemU/OiAnc20nIHwgJ21kJyB8ICdsZydcbiAgc2hvd0Fycm93PzogYm9vbGVhblxuICBmdWxsV2lkdGg/OiBib29sZWFuXG4gIGxvYWRpbmc/OiBib29sZWFuXG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVcbn1cblxuZXhwb3J0IGNvbnN0IEJ1dHRvbjogUmVhY3QuRkM8QnV0dG9uUHJvcHM+ID0gKHtcbiAgdmFyaWFudCA9ICdwcmltYXJ5JyxcbiAgc2l6ZSA9ICdtZCcsXG4gIHNob3dBcnJvdyA9IGZhbHNlLFxuICBmdWxsV2lkdGggPSBmYWxzZSxcbiAgbG9hZGluZyA9IGZhbHNlLFxuICBjbGFzc05hbWUsXG4gIGRpc2FibGVkLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn0pID0+IHtcbiAgY29uc3QgYmFzZUNsYXNzZXMgPSBbXG4gICAgLy8gQmFzZSBzdHlsZXNcbiAgICAnaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyJyxcbiAgICAnZm9udC1oZWx2ZXRpY2Etbm93IGZvbnQtYm9sZCcsXG4gICAgJ3RyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCcsXG4gICAgJ2ZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMicsXG4gICAgJ2Rpc2FibGVkOm9wYWNpdHktNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkJyxcbiAgICAndXBwZXJjYXNlIHRyYWNraW5nLXdpZGUnLFxuICAgIC8vIE5vIHJvdW5kZWQgY29ybmVycyBmb3IgTUVDXG4gICAgJ2JvcmRlci0wJ1xuICBdXG5cbiAgY29uc3QgdmFyaWFudENsYXNzZXMgPSB7XG4gICAgLy8gRGFyayBiYWNrZ3JvdW5kIChsaWtlIFwiQWxsZSBOYWNocmljaHRlblwiKVxuICAgIHByaW1hcnk6IFtcbiAgICAgICdiZy1tZWMtc2Vjb25kYXJ5IHRleHQtd2hpdGUnLFxuICAgICAgJ2hvdmVyOmJnLW1lYy1zZWNvbmRhcnkvOTAnLFxuICAgICAgJ2ZvY3VzOnJpbmctbWVjLXNlY29uZGFyeSdcbiAgICBdLFxuICAgIC8vIExpZ2h0IGJhY2tncm91bmQgKGxpa2UgXCJKZXR6dCBiZXdlcmJlblwiKVxuICAgIHNlY29uZGFyeTogW1xuICAgICAgJ2JnLWdyYXktNDAwIHRleHQtd2hpdGUnLFxuICAgICAgJ2hvdmVyOmJnLWdyYXktNTAwJyxcbiAgICAgICdmb2N1czpyaW5nLWdyYXktNDAwJ1xuICAgIF0sXG4gICAgLy8gUmVkIGJhY2tncm91bmQgKGxpa2UgXCJXZWl0ZXJlIEluZm9ybWF0aW9uZW5cIilcbiAgICBhY2NlbnQ6IFtcbiAgICAgICdiZy1tZWMtcHJpbWFyeSB0ZXh0LXdoaXRlJyxcbiAgICAgICdob3ZlcjpiZy1tZWMtcHJpbWFyeS85MCcsXG4gICAgICAnZm9jdXM6cmluZy1tZWMtcHJpbWFyeSdcbiAgICBdLFxuICAgIC8vIFRyYW5zcGFyZW50L0dob3N0IGJ1dHRvbnNcbiAgICBnaG9zdDogW1xuICAgICAgJ2JnLXRyYW5zcGFyZW50IGJvcmRlci0yJyxcbiAgICAgICd0ZXh0LW1lYy1zZWNvbmRhcnkgYm9yZGVyLW1lYy1zZWNvbmRhcnknLFxuICAgICAgJ2hvdmVyOmJnLW1lYy1zZWNvbmRhcnkgaG92ZXI6dGV4dC13aGl0ZScsXG4gICAgICAnZm9jdXM6cmluZy1tZWMtc2Vjb25kYXJ5J1xuICAgIF1cbiAgfVxuXG4gIGNvbnN0IHNpemVDbGFzc2VzID0ge1xuICAgIHNtOiAncHgtNCBweS0yIHRleHQtc20nLFxuICAgIG1kOiAncHgtNiBweS0zIHRleHQtYmFzZScsXG4gICAgbGc6ICdweC04IHB5LTQgdGV4dC1sZydcbiAgfVxuXG4gIGNvbnN0IHdpZHRoQ2xhc3NlcyA9IGZ1bGxXaWR0aCA/ICd3LWZ1bGwnIDogJydcblxuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgYmFzZUNsYXNzZXMsXG4gICAgICAgI
25114HZhcmlhbnRDbGFzc2VzW3ZhcmlhbnRdLFxuICAgICAgICBzaXplQ2xhc3Nlc1tzaXplXSxcbiAgICAgICAgd2lkdGhDbGFzc2VzLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgbG9hZGluZ31cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctNCBoLTQgYm9yZGVyLTIgYm9yZGVyLWN1cnJlbnQgYm9yZGVyLXQtdHJhbnNwYXJlbnQgYW5pbWF0ZS1zcGluIHJvdW5kZWQtZnVsbFwiIC8+XG4gICAgICAgICAgPHNwYW4+TGFkZW4uLi48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTJcIj5cbiAgICAgICAgICA8c3Bhbj57Y2hpbGRyZW59PC9zcGFuPlxuICAgICAgICAgIHtzaG93QXJyb3cgJiYgKFxuICAgICAgICAgICAgPEFycm93UmlnaHQgY2xhc3NOYW1lPVwidy01IGgtNSBtbC0yXCIgLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9idXR0b24+XG4gIClcbn1cblxuLy8gQ29udmVuaWVuY2UgY29tcG9uZW50cyBmb3Igc3BlY2lmaWMgTUVDIGJ1dHRvbiBzdHlsZXNcbmV4cG9ydCBjb25zdCBNRUNCdXR0b25QcmltYXJ5OiBSZWFjdC5GQzxPbWl0PEJ1dHRvblByb3BzLCAndmFyaWFudCc+PiA9IChwcm9wcykgPT4gKFxuICA8QnV0dG9uIHZhcmlhbnQ9XCJwcmltYXJ5XCIgc2hvd0Fycm93IHsuLi5wcm9wc30gLz5cbilcblxuZXhwb3J0IGNvbnN0IE1FQ0J1dHRvblNlY29uZGFyeTogUmVhY3QuRkM8T21pdDxCdXR0b25Qcm9wcywgJ3ZhcmlhbnQnPj4gPSAocHJvcHMpID0+IChcbiAgPEJ1dHRvbiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgc2hvd0Fycm93IHsuLi5wcm9wc30gLz5cbilcblxuZXhwb3J0IGNvbnN0IE1FQ0J1dHRvbkFjY2VudDogUmVhY3QuRkM8T21pdDxCdXR0b25Qcm9wcywgJ3ZhcmlhbnQnPj4gPSAocHJvcHMpID0+IChcbiAgPEJ1dHRvbiB2YXJpYW50PVwiYWNjZW50XCIgc2hvd0Fycm93IHsuLi5wcm9wc30gLz5cbilcblxuZXhwb3J0IGNvbnN0IE1FQ0J1dHRvbkdob3N0OiBSZWFjdC5GQzxPbWl0PEJ1dHRvblByb3BzLCAndmFyaWFudCc+PiA9IChwcm9wcykgPT4gKFxuICA8QnV0dG9uIHZhcmlhbnQ9XCJnaG9zdFwiIHNob3dBcnJvdyB7Li4ucHJvcHN9IC8+XG4pXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjbHN4IH0gZnJvbSAnY2xzeCdcblxuaW50ZXJmYWNlIEJhZGdlUHJvcHMgZXh0ZW5kcyBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD4ge1xuICB2YXJpYW50PzogJ2RlZmF1bHQnIHwgJ3NlY29uZGFyeScgfCAnZGVzdHJ1Y3RpdmUnIHwgJ291dGxpbmUnXG59XG5cbmNvbnN0IEJhZGdlOiBSZWFjdC5GQzxCYWRnZVByb3BzPiA9ICh7XG4gIGNsYXNzTmFtZSxcbiAgdmFyaWFudCA9ICdkZWZhdWx0JyxcbiAgLi4ucHJvcHNcbn0pID0+IHtcbiAgY29uc3QgYmFzZUNsYXNzZXMgPSBbXG4gICAgJ2lubGluZS1mbGV4IGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYm9yZGVyIHB4LTIuNSBweS0wLjUgdGV4dC14cyBmb250LXNlbWlib2xkIHRyYW5zaXRpb24tY29sb3JzJ1xuICBdXG5cbiAgY29uc3QgdmFyaWFudENsYXNzZXMgPSB7XG4gICAgZGVmYXVsdDogJ2JvcmRlci10cmFuc3BhcmVudCBiZy1tZWMtcHJpbWFyeSB0ZXh0LXdoaXRlJyxcbiAgICBzZWNvbmRhcnk6ICdib3JkZXItdHJhbnNwYXJlbnQgYmctZ3JheS0xMDAgdGV4dC1ncmF5LTgwMCcsXG4gICAgZGVzdHJ1Y3RpdmU6ICdib3JkZXItdHJhbnNwYXJlbnQgYmctcmVkLTUwMCB0ZXh0LXdoaXRlJyxcbiAgICBvdXRsaW5lOiAndGV4dC1ncmF5LTcwMCBib3JkZXItZ3JheS0zMDAnXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgYmFzZUNsYXNzZXMsXG4gICAgICAgIHZhcmlhbnRDbGFzc2VzW3ZhcmlhbnRdLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBCYWRnZSB9XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQ2FyZCwgQ2FyZENvbnRlbnQsIENhcmRIZWFkZXIsIENhcmRUaXRsZSB9IGZyb20gJy4uL1VJL0NhcmQnXG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuLi9VSS9CdXR0b24nXG5pbXBvcnQgeyBCYWRnZSB9IGZyb20gJy4uL1VJL0JhZGdlJ1xuaW1wb3J0IHsgTG9hZGVyMiwgUmVmcmVzaEN3LCBEYXRhYmFzZSwgQ2xvY2ssIENoZWNrQ2lyY2xlLCBBbGVydENpcmNsZSB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcblxuaW50ZXJmYWNlIFN5bmNTdGF0dXMge1xuICBzdWNjZXNzOiBib29sZWFuXG4gIGxhc3RTeW5jVGltZTogc3RyaW5nIHwgbnVsbFxuICBzdGF0aXN0aWNzOiB7XG4gICAgY29udGFjdHM/OiB7XG4gICAgICB0b3RhbFJlY29yZHM6IG51bWJlclxuICAgICAgbGFzdFVwZGF0ZWQ6IHN0cmluZ1xuICAgICAgZmlyc3RDcmVhdGVkOiBzdHJpbmdcbiAgICB9XG4gICAgbG9jYXRpb25zPzoge1xuICAgICAgdG90YWxSZWNvcmRzOiBudW1iZXJcbiAgICAgIGxhc3RVcGRhdGVkOiBzdHJpbmdcbiAgICAgIGZpcnN0Q3JlYXRlZDogc3RyaW5nXG4gICAgfVxuICB9XG4gIG5lZWRzSW5pdGlhbFN5bmM6IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIFN5bmNSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuXG4gIHN5bmNUeXBlOiAnaW5jcmVtZW50YWwnIHwgJ2Z1bGwnXG4gIHN0YXJ0VGltZTogc3RyaW5nXG4gIGVuZFRpbWU/OiBzdHJpbmdcbiAgZHVyYXRpb24/OiBudW1iZXJcbiAgbG9jYXRpb25zOiB7XG4gICAgY2hlY2tlZDogbnVtYmVyXG4gICAgbmV3OiBudW1iZXJcbiAgICB1cGRhdGVkOiBudW1iZXJcbiAgICBkZWxldGVkOiBudW1iZXJcbiAgICBlcnJvcnM6IHN0cmluZ1tdXG4gIH1cbiAgY29udGFjdHM6IHtcbiAgICBjaGVja2VkOiBudW1iZXJcbiAgICBuZXc6IG51bWJlclxuICAgIHVwZGF0ZWQ6IG51bWJlclxuICAgIGRlbGV0ZWQ6IG51bWJlclxuICAgIGVycm9yczogc3RyaW5nW11cbiAgfVxuICBtZWRpYToge1xuICAgIGRvd25sb2FkZWQ6IG51bWJlclxuICAgIGVycm9yczogc3RyaW5nW11cbiAgfVxufVxuXG5jb25zdCBTeW5jTWFuYWdlcjogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIGNvbnN0IFtzeW5jU3RhdHVzLCBzZXRTeW5jU3RhdHVzXSA9IHVzZVN0YXRlPFN5bmNTdGF0dXMgfCBudWxsPihudWxsKVxuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc1N5bmNpbmcsIHNldElzU3luY2luZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2xhc3RTeW5jUmVzdWx0LCBzZXRMYXN0U3luY1Jlc3VsdF0gPSB1c2VTdGF0ZTxTeW5jUmVzdWx0IHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuXG4gIC8vIExvYWQgc3luYyBzdGF0dXMgb24gY29tcG9uZW50IG1vdW50XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbG9hZFN5bmNTdGF0dXMoKVxuICB9LCBbXSlcblxuICBjb25zdCBsb2FkU3luY1N0YXR1cyA9IGFzeW5jICgpID0+IHtcbiAgICBzZXRJc0xvYWRpbmcodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbnRhY3RzL3N5bmMvc3RhdHVzJylcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIFxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzZXRTeW5jU3RhdHVzKGRhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRFcnJvcihkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBzeW5jIHN0YXR1cycpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzZXRFcnJvcignTmV0d29yayBlcnJvciBsb2FkaW5nIHN5bmMgc3RhdHVzJylcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgc3luYyBzdGF0dXM6JywgZXJyKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGVyZm9ybUluY3JlbWVudGFsU3luYyA9IGFzeW5jICgpID0+IHtcbiAgICBzZXRJc1N5bmNpbmcodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuICAgIHNldExhc3RTeW5jUmVzdWx0KG51bGwpXG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvY29udGFjdHMvc3luYy9pbmNyZW1lbnRhbCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgI
25114H1cbiAgICAgIH0pXG4gICAgICBcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIFxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzZXRMYXN0U3luY1Jlc3VsdChkYXRhKVxuICAgICAgICAvLyBSZWxvYWQgc3luYyBzdGF0dXMgdG8gZ2V0IHVwZGF0ZWQgaW5mb3JtYXRpb25cbiAgICAgICAgYXdhaXQgbG9hZFN5bmNTdGF0dXMoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0RXJyb3IoZGF0YS5lcnJvciB8fCAnU3luYyBmYWlsZWQnKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2V0RXJyb3IoJ05ldHdvcmsgZXJyb3IgZHVyaW5nIHN5bmMnKVxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHN5bmM6JywgZXJyKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc1N5bmNpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGVyZm9ybUZ1bGxTeW5jID0gYXN5bmMgKCkgPT4ge1xuICAgIHNldElzU3luY2luZyh0cnVlKVxuICAgIHNldEVycm9yKG51bGwpXG4gICAgc2V0TGFzdFN5bmNSZXN1bHQobnVsbClcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb250YWN0cy9kZWJ1Zy91bHRpbWF0ZS13b3JkcHJlc3Mtc3luYycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIFxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAvLyBDb252ZXJ0IHVsdGltYXRlIHN5bmMgcmVzcG9uc2UgdG8gb3VyIGZvcm1hdFxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRSZXN1bHQ6IFN5bmNSZXN1bHQgPSB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBzeW5jVHlwZTogJ2Z1bGwnLFxuICAgICAgICAgIHN0YXJ0VGltZTogZGF0YS50aW1lc3RhbXAsXG4gICAgICAgICAgZW5kVGltZTogZGF0YS50aW1lc3RhbXAsXG4gICAgICAgICAgbG9jYXRpb25zOiB7XG4gICAgICAgICAgICBjaGVja2VkOiBkYXRhLnN1bW1hcnk/LmxvY2F0aW9uc0NoZWNrZWQgfHwgMCxcbiAgICAgICAgICAgIG5ldzogZGF0YS5yZXN1bHRzPy5sb2NhdGlvbnM/LnN5bmNlZCB8fCAwLFxuICAgICAgICAgICAgdXBkYXRlZDogMCxcbiAgICAgICAgICAgIGRlbGV0ZWQ6IDAsXG4gICAgICAgICAgICBlcnJvcnM6IGRhdGEucmVzdWx0cz8ubG9jYXRpb25zPy5lcnJvcnMgfHwgW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbnRhY3RzOiB7XG4gICAgICAgICAgICBjaGVja2VkOiBkYXRhLnN1bW1hcnk/LmNvbnRhY3RzUHJvY2Vzc2VkIHx8IDAsXG4gICAgICAgICAgICBuZXc6IGRhdGEucmVzdWx0cz8uY29udGFjdHM/LnN5bmNlZCB8fCAwLFxuICAgICAgICAgICAgdXBkYXRlZDogMCxcbiAgICAgICAgICAgIGRlbGV0ZWQ6IDAsXG4gICAgICAgICAgICBlcnJvcnM6IGRhdGEucmVzdWx0cz8uY29udGFjdHM/LmVycm9ycyB8fCBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVkaWE6IHtcbiAgICAgICAgICAgIGRvd25sb2FkZWQ6IGRhdGEucmVzdWx0cz8ubWVkaWE/LmRvd25sb2FkZWQgfHwgMCxcbiAgICAgICAgICAgIGVycm9yczogZGF0YS5yZXN1bHRzPy5tZWRpYT8uZXJyb3JzIHx8IFtdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBzZXRMYXN0U3luY1Jlc3VsdChjb252ZXJ0ZWRSZXN1bHQpXG4gICAgICAgIC8vIFJlbG9hZCBzeW5jIHN0YXR1cyB0byBnZXQgdXBkYXRlZCBpbmZvcm1hdGlvblxuICAgICAgICBhd2FpdCBsb2FkU3luY1N0YXR1cygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRFcnJvcihkYXRhLmVycm9yIHx8IGRhdGEubWVzc2FnZSB8fCAnRnVsbCBzeW5jIGZhaWxlZCcpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzZXRFcnJvcignTmV0d29yayBlcnJvciBkdXJpbmcgZnVsbCBzeW5jJylcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBmdWxsIHN5bmM6JywgZXJyKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc1N5bmNpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZm9ybWF0RGF0ZSA9IChkYXRlU3RyaW5nOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgaWYgKCFkYXRlU3RyaW5nKSByZXR1cm4gJ05ldmVyJ1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlU3RyaW5nKS50b0xvY2FsZVN0cmluZygnZGUtREUnKVxuICB9XG5cbiAgY29uc3QgZm9ybWF0RHVyYXRpb24gPSAobXM6IG51bWJlcikgPT4ge1xuICAgIGlmIChtcyA8IDEwMDApIHJldHVybiBgJHttc31tc2BcbiAgICBpZiAobXMgPCA2MDAwMCkgcmV0dXJuIGAkeyhtcyAvIDEwMDApLnRvRml4ZWQoMSl9c2BcbiAgICByZXR1cm4gYCR7KG1zIC8gNjAwMDApLnRvRml4ZWQoMSl9bWluYFxuICB9XG5cbiAgaWYgKGlzTG9hZGluZykge1xuICAgIHJldHVybiAoXG4gICAgICA8Q2FyZD5cbiAgICAgICAgPENhcmRDb250ZW50IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHAtOFwiPlxuICAgICAgICAgIDxMb2FkZXIyIGNsYXNzTmFtZT1cImgtOCB3LTggYW5pbWF0ZS1zcGluXCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtbC0yXCI+TG9hZGluZyBzeW5jIHN0YXR1cy4uLjwvc3Bhbj5cbiAgICAgICAgPC9DYXJkQ29udGVudD5cbiAgICAgIDwvQ2FyZD5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02XCI+XG4gICAgICA8Q2FyZD5cbiAgICAgICAgPENhcmRIZWFkZXI+XG4gICAgICAgICAgPENhcmRUaXRsZSBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPERhdGFiYXNlIGNsYXNzTmFtZT1cImgtNSB3LTVcIiAvPlxuICAgICAgICAgICAgV29yZFByZXNzIFN5bmMgTWFuYWdlclxuICAgICAgICAgIDwvQ2FyZFRpdGxlPlxuICAgICAgICA8L0NhcmRIZWFkZXI+XG4gICAgICAgIDxDYXJkQ29udGVudCBjbGFzc05hbWU9XCJzcGFjZS15LTRcIj5cbiAgICAgICAgICB7ZXJyb3IgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy1yZWQtNTAgYm9yZGVyIGJvcmRlci1yZWQtMjAwIHJvdW5kZWQtbWQgcC00XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1yZWQtODAwXCI+XG4gICAgICAgICAgICAgICAgPEFsZXJ0Q2lyY2xlIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+RXJyb3I8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXJlZC03MDAgbXQtMVwiPntlcnJvcn08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge3N5bmNTdGF0dXMgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIG1kOmdyaWQtY29scy0yIGdhcC00XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8Q2xvY2sgY2xhc3NOYW1lPVwiaC00IHctNFwiIC8+XG4gICAgICAgICAgICAgICAgICBTeW5jIFN0YXR1c1xuICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTEgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5MYXN0IFN5bmM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm9cIj57Zm9ybWF0RGF0ZShzeW5jU3RhdHVzLmxhc3RTeW5jVGltZSl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXR1czo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgI
25114HtzeW5jU3RhdHVzLm5lZWRzSW5pdGlhbFN5bmMgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPEJhZGdlIHZhcmlhbnQ9XCJvdXRsaW5lXCIgY2xhc3NOYW1lPVwidGV4dC1vcmFuZ2UtNjAwIGJvcmRlci1vcmFuZ2UtMjAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBOZWVkcyBJbml0aWFsIFN5bmNcbiAgICAgICAgICAgICAgICAgICAgICA8L0JhZGdlPlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZSB2YXJpYW50PVwib3V0bGluZVwiIGNsYXNzTmFtZT1cInRleHQtZ3JlZW4tNjAwIGJvcmRlci1ncmVlbi0yMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxDaGVja0NpcmNsZSBjbGFzc05hbWU9XCJoLTMgdy0zIG1yLTFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgVXAgdG8gRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIDwvQmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5EYXRhIFN0YXRpc3RpY3M8L2gzPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0xIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q29udGFjdHM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm9cIj57c3luY1N0YXR1cy5zdGF0aXN0aWNzLmNvbnRhY3RzPy50b3RhbFJlY29yZHMgfHwgMH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+TG9jYXRpb25zOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tb25vXCI+e3N5bmNTdGF0dXMuc3RhdGlzdGljcy5sb2NhdGlvbnM/LnRvdGFsUmVjb3JkcyB8fCAwfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTMgcHQtNCBib3JkZXItdFwiPlxuICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXtwZXJmb3JtSW5jcmVtZW50YWxTeW5jfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17aXNTeW5jaW5nfVxuICAgICAgICAgICAgICB2Y
25114XJpYW50PVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2lzU3luY2luZyA/IChcbiAgICAgICAgICAgICAgICA8TG9hZGVyMiBjbGFzc05hbWU9XCJoLTQgdy00IGFuaW1hdGUtc3BpblwiIC8+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPFJlZnJlc2hDdyBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAge3N5bmNTdGF0dXM/Lm5lZWRzSW5pdGlhbFN5bmMgPyAnSW5pdGlhbCBTeW5jJyA6ICdJbmNyZW1lbnRhbCBTeW5jJ31cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3BlcmZvcm1GdWxsU3luY31cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzU3luY2luZ31cbiAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2lzU3luY2luZyA/IChcbiAgICAgICAgICAgICAgICA8TG9hZGVyMiBjbGFzc05hbWU9XCJoLTQgdy00IGFuaW1hdGUtc3BpblwiIC8+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPERhdGFiYXNlIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICBGdWxsIFN5bmNcbiAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2xvYWRTeW5jU3RhdHVzfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17aXNMb2FkaW5nIHx8IGlzU3luY2luZ31cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmVmcmVzaFxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgICA8L0NhcmQ+XG5cbiAgICAgIHtsYXN0U3luY1Jlc3VsdCAmJiAoXG4gICAgICAgIDxDYXJkPlxuICAgICAgICAgIDxDYXJkSGVhZGVyPlxuICAgICAgICAgICAgPENhcmRUaXRsZSBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICA8Q2hlY2tDaXJjbGUgY2xhc3NOYW1lPVwiaC01IHctNSB0ZXh0LWdyZWVuLTYwMFwiIC8+XG4gICAgICAgICAgICAgIExhc3QgU3luYyBSZXN1bHRcbiAgICAgICAgICAgIDwvQ2FyZFRpdGxlPlxuICAgICAgICAgIDwvQ2FyZEhlYWRlcj5cbiAgICAgICAgICA8Q2FyZENvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTEgbWQ6Z3JpZC1jb2xzLTMgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5Mb2NhdGlvbnM8L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0xIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2hlY2tlZDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbW9ub1wiPntsYXN0U3luY1Jlc3VsdC5sb2NhdGlvbnMuY2hlY2tlZH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+TmV3Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tb25vIHRleHQtZ3JlZW4tNjAwXCI+e2xhc3RTeW5jUmVzdWx0LmxvY2F0aW9ucy5uZXd9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlVwZGF0ZWQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm8gdGV4dC1ibHVlLTYwMFwiPntsYXN0U3luY1Jlc3VsdC5sb2NhdGlvbnMudXBkYXRlZH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIHtsYXN0U3luY1Jlc3VsdC5sb2NhdGlvbnMuZXJyb3JzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+RXJyb3JzOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm8gdGV4dC1yZWQtNjAwXCI+e2xhc3RTeW5jUmVzdWx0LmxvY2F0aW9ucy5lcnJvcnMubGVuZ3RofTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPkNvbnRhY3RzPC9oND5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMSB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNoZWNrZWQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm9cIj57bGFzdFN5bmNSZXN1bHQuY29udGFjdHMuY2hlY2tlZH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+TmV3Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tb25vIHRleHQtZ3JlZW4tNjAwXCI+e2xhc3RTeW5jUmVzdWx0LmNvbnRhY3RzLm5ld308L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+VXBkYXRlZDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbW9ubyB0ZXh0LWJsdWUtNjAwXCI+e2xhc3RTeW5jUmVzdWx0LmNvbnRhY3RzLnVwZGF0ZWR9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB7bGFzdFN5bmNSZXN1bHQuY29udGFjdHMuZXJyb3JzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+RXJyb3JzOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm8gdGV4dC1yZWQtNjAwXCI+e2xhc3RTeW5jUmVzdWx0LmNvbnRhY3RzLmVycm9ycy5sZW5ndGh9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+TWVkaWE8L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0xIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+RG93bmxvYWRlZDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbW9ubyB0ZXh0LWdyZWVuLTYwMFwiPntsYXN0U3luY1Jlc3VsdC5tZWRpYS5kb3dubG9hZGVkfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAge2xhc3RTeW5jUmVzdWx0Lm1lZGlhLmVycm9ycy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkVycm9yczo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tb25vIHRleHQtcmVkLTYwMFwiPntsYXN0U3luY1Jlc3VsdC5tZWRpYS5lcnJvcnMubGVuZ3RofTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAge2xhc3RTeW5jUmVzdWx0LmR1cmF0aW9uICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkR1cmF0aW9uOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm9cIj57Zm9ybWF0RHVyYXRpb24obGFzdFN
251145bmNSZXN1bHQuZHVyYXRpb24pfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICB7KGxhc3RTeW5jUmVzdWx0LmxvY2F0aW9ucy5lcnJvcnMubGVuZ3RoID4gMCB8fCBcbiAgICAgICAgICAgICAgbGFzdFN5bmNSZXN1bHQuY29udGFjdHMuZXJyb3JzLmxlbmd0aCA+IDAgfHwgXG4gICAgICAgICAgICAgIGxhc3RTeW5jUmVzdWx0Lm1lZGlhLmVycm9ycy5sZW5ndGggPiAwKSAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBwdC00IGJvcmRlci10XCI+XG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIHRleHQtcmVkLTYwMCBtYi0yXCI+RXJyb3JzPC9oND5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMSB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICB7Wy4uLmxhc3RTeW5jUmVzdWx0LmxvY2F0aW9ucy5lcnJvcnMsIC4uLmxhc3RTeW5jUmVzdWx0LmNvbnRhY3RzLmVycm9ycywgLi4ubGFzdFN5bmNSZXN1bHQubWVkaWEuZXJyb3JzXS5tYXAoKGVycm9yLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGtleT17aW5kZXh9IGNsYXNzTmFtZT1cInRleHQtcmVkLTYwMCBmb250LW1vbm8gdGV4dC14cyBiZy1yZWQtNTAgcC0yIHJvdW5kZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3J9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICA8L0NhcmQ+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFN5bmNNYW5hZ2VyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBDYXJkLCBDYXJkQ29udGVudCwgQ2FyZEhlYWRlciwgQ2FyZFRpdGxlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9VSS9DYXJkJ1xuaW1wb3J0IFN5bmNNYW5hZ2VyIGZyb20gJy4uL2NvbXBvbmVudHMvQWRtaW4vU3luY01hbmFnZXInXG5pbXBvcnQgeyBTZXR0aW5ncywgRGF0YWJhc2UsIFVzZXJzLCBNYXBQaW4gfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmNvbnN0IEFkbWluUGFnZTogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctZ3JheS01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXIgbXgtYXV0byBweC00IHB5LThcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi04XCI+XG4gICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LWdyYXktOTAwIG1iLTJcIj5BZG1pbiBEYXNoYm9hcmQ8L2gxPlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtZ3JheS02MDBcIj5NYW5hZ2UgeW91ciBNRUMgUG9ydGZvbGlvIGFwcGxpY2F0aW9uPC9wPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTEgbGc6Z3JpZC1jb2xzLTMgZ2FwLTYgbWItOFwiPlxuICAgICAgICAgIDxDYXJkPlxuICAgICAgICAgICAgPENhcmRIZWFkZXIgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHNwYWNlLXktMCBwYi0yXCI+XG4gICAgICAgICAgICAgIDxDYXJkVGl0bGUgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bVwiPlRvdGFsIENvbnRhY3RzPC9DYXJkVGl0bGU+XG4gICAgICAgICAgICAgIDxVc2VycyBjbGFzc05hbWU9XCJoLTQgdy00IHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiIC8+XG4gICAgICAgICAgICA8L0NhcmRIZWFkZXI+XG4gICAgICAgICAgICA8Q2FyZENvbnRlbnQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkXCI+TG9hZGluZy4uLjwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgICAgICAgIEFjdGl2ZSBjb250YWN0IGVudHJpZXNcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9DYXJkQ29udGVudD5cbiAgICAgICAgICA8L0NhcmQ+XG5cbiAgICAgICAgICA8Q2FyZD5cbiAgICAgICAgICAgIDxDYXJkSGVhZGVyIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBzcGFjZS15LTAgcGItMlwiPlxuICAgICAgICAgICAgICA8Q2FyZFRpdGxlIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW1cIj5Ub3RhbCBMb2NhdGlvbnM8L0NhcmRUaXRsZT5cbiAgICAgICAgICAgICAgPE1hcFBpbiBjbGFzc05hbWU9XCJoLTQgdy00IHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiIC8+XG4gICAgICAgICAgICA8L0NhcmRIZWFkZXI+XG4gICAgICAgICAgICA8Q2FyZENvbnRlbnQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkXCI+TG9hZGluZy4uLjwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgICAgICAgIEFjdGl2ZSBsb2NhdGlvbnNcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9DYXJkQ29udGVudD5cbiAgICAgICAgICA8L0NhcmQ+XG5cbiAgICAgICAgICA8Q2FyZD5cbiAgICAgICAgICAgIDxDYXJkSGVhZGVyIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBzcGFjZS15LTAgcGItMlwiPlxuICAgICAgICAgICAgICA8Q2FyZFRpdGxlIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW1cIj5TeW5jIFN0YXR1czwvQ2FyZFRpdGxlPlxuICAgICAgICAgICAgICA8RGF0YWJhc2UgY2xhc3NOYW1lPVwiaC00IHctNCB0ZXh0LW11dGVkLWZvcmVncm91bmRcIiAvPlxuICAgICAgICAgICAgPC9DYXJkSGVhZGVyPlxuICAgICAgICAgICAgPENhcmRDb250ZW50PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZFwiPkFjdGl2ZTwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgICAgICAgIFdvcmRQcmVzcyBpbnRlZ3JhdGlvblxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIHhsOmdyaWQtY29scy0yIGdhcC02XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTZcIj5cbiAgICAgICAgICAgIDxTeW5jTWFuYWdlciAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTZcIj5cbiAgICAgICAgICAgIDxDYXJkPlxuICAgICAgICAgICAgICA8Q2FyZEhlYWRlcj5cbiAgICAgICAgICAgICAgICA8Q2FyZFRpdGxlIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8U2V0dGluZ3MgY2xhc3NOYW1lPVwiaC01IHctNVwiIC8+XG4gICAgICAgICAgICAgICAgICBTeXN0ZW0gU2V0dGluZ3NcbiAgICAgICAgICAgICAgICA8L0NhcmRUaXRsZT5cbiAgICAgICAgICAgICAgPC9DYXJkSGVhZGVyPlxuICAgICAgICAgICAgICA8Q2FyZENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+QXV0byBTeW5jPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5BdXRvbWF0aWNhbGx5IHN5bmMgZGF0YSBldmVyeSAxNSBtaW51dGVzPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy1yZWQtMTAwIHRleHQtcmVkLTgwMCBweC0yIHB5LTEgcm91bmRlZCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5SYXRlIExpbWl0aW5nPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5QcmV2ZW50IFdvcmRQcmVzcyBBUEkgcmF0ZSBsaW1pdHM8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWdyZWVuLTEwMCB0ZXh0LWdyZWVuLTgwMCBweC0yIHB5LTEgcm91bmRlZCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQWN0aXZlXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+TWVkaWEgRG93bmxvYWRzPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5Eb3dubG9hZCBhbmQgY2FjaGUgY29udGFjdCBpbWFnZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWdyZWVuLTEwMCB0ZXh0LWdyZWVuLTgwMCBweC0yIHB5LTEgcm91bmRlZCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQWN0aXZlXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+SW5jcmVtZW50YWwgU3luYzwvaDQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+T25seSBzeW5jIGNoYW5nZWQgZGF0YTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctZ3JlZW4tMTAwIHRleHQtZ3JlZW4tODAwIHB4LTIgcHktMSByb3VuZGVkIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICB
25114BY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9DYXJkQ29udGVudD5cbiAgICAgICAgICAgIDwvQ2FyZD5cblxuICAgICAgICAgICAgPENhcmQ+XG4gICAgICAgICAgICAgIDxDYXJkSGVhZGVyPlxuICAgICAgICAgICAgICAgIDxDYXJkVGl0bGU+UXVpY2sgQWN0aW9uczwvQ2FyZFRpdGxlPlxuICAgICAgICAgICAgICA8L0NhcmRIZWFkZXI+XG4gICAgICAgICAgICAgIDxDYXJkQ29udGVudD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJ3LWZ1bGwgdGV4dC1sZWZ0IHAtMyByb3VuZGVkLWxnIGJvcmRlciBob3ZlcjpiZy1ncmF5LTUwIHRyYW5zaXRpb24tY29sb3JzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPlZpZXcgU3luYyBMb2dzPC9oND5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+Q2hlY2sgZGV0YWlsZWQgc3luYyBoaXN0b3J5IGFuZCBlcnJvcnM8L3A+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJ3LWZ1bGwgdGV4dC1sZWZ0IHAtMyByb3VuZGVkLWxnIGJvcmRlciBob3ZlcjpiZy1ncmF5LTUwIHRyYW5zaXRpb24tY29sb3JzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPkNsZWFyIENhY2hlPC9oND5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+Q2xlYXIgYWxsIGNhY2hlZCBtZWRpYSBmaWxlczwvcD5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cInctZnVsbCB0ZXh0LWxlZnQgcC0zIHJvdW5kZWQtbGcgYm9yZGVyIGhvdmVyOmJnLWdyYXktNTAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+RXhwb3J0IERhdGE8L2g0PlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5FeHBvcnQgY29udGFjdHMgYW5kIGxvY2F0aW9ucyBhcyBDU1Y8L3A+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJ3LWZ1bGwgdGV4dC1sZWZ0IHAtMyByb3VuZGVkLWxnIGJvcmRlciBob3ZlcjpiZy1ncmF5LTUwIHRyYW5zaXRpb24tY29sb3JzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPlN5c3RlbSBIZWFsdGg8L2g0PlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5DaGVjayBBUEkgc3RhdHVzIGFuZCBwZXJmb3JtYW5jZTwvcD5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICAgICAgPC9DYXJkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IEFkbWluUGFnZVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nXG5cbmV4cG9ydCBjb25zdCBUZXN0T3ZlcnZpZXc6IFJlYWN0LkZDID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWdyYXktNTAgcHktOFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXgtdy00eGwgbXgtYXV0byBweC00IHNtOnB4LTYgbGc6cHgtOFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLThcIj5cbiAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC00eGwgZm9udC1ib2xkIHRleHQtZ3JheS05MDAgbWItNFwiPlxuICAgICAgICAgICAgTUVDIFBvcnRmb2xpbyBNYW5hZ2VtZW50XG4gICAgICAgICAgPC9oMT5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhsIHRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgIFRlc3Qtw5xiZXJzaWNodCBmw7xyIGRpZSBuZXVlbiBDYXJkLURlc2lnbnNcbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMSBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtMyBnYXAtOFwiPlxuICAgICAgICAgIHsvKiBMb2NhdGlvbiBDYXJkcyAqL31cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlIHJvdW5kZWQtbGcgc2hhZG93LWxnIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLTQ4IGJnLWdyYWRpZW50LXRvLWJyIGZyb20tYmx1ZS01MDAgdG8tYmx1ZS02MDAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciB0ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LTZ4bCBtYi00XCI+8J+PojwvZGl2PlxuICAgICAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGRcIj5Mb2NhdGlvbiBDYXJkczwvaDI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNlwiPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktNjAwIG1iLTRcIj5cbiAgICAgICAgICAgICAgICBOZXVlIExvY2F0aW9uIENhcmRzIGltIERlc2lnbiBkZXIgVm9ybGFnZSBtaXQgSGVyby1JbWFnZXMsIFxuICAgICAgICAgICAgICAgIENlbnRlci1TdGF0aXN0aWtlbiB1bmQgXCJadW0gQ2VudGVyXCIgQnV0dG9uLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yIG1iLTZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidy0yIGgtMiBiZy1ncmVlbi01MDAgcm91bmRlZC1mdWxsIG1yLTJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICBIZXJvLUltYWdlIChvYmVyZSBIw6RsZnRlKVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ3LTIgaC0yIGJnLWdyZWVuLTUwMCByb3VuZGVkLWZ1bGwgbXItMlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIER1bmtsZXIgQ29udGVudC1CZXJlaWNoXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInctMiBoLTIgYmctZ3JlZW4tNTAwIHJvdW5kZWQtZnVsbCBtci0yXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgQ2VudGVyLVN0YXRpc3Rpa2VuIG1pdCBJY29uc1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ3LTIgaC0yIGJnLWdyZWVuLTUwMCByb3VuZGVkLWZ1bGwgbXItMlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIFJlc3BvbnNpdmUgR3JpZCBMYXlvdXRcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgdG89XCIvdGVzdC9sb2NhdGlvbi1jYXJkc1wiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHB4LTQgcHktMiBiZy1ibHVlLTYwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtbGcgaG92ZXI6YmctYmx1ZS03MDAgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgTG9jYXRpb24gQ2FyZHMgdGVzdGVuXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzc05hbWU9XCJ3LTQgaC00IG1sLTJcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZUxpbmVqb2luPVwicm91bmRcIiBzdHJva2VXaWR0aD17Mn0gZD1cIk0xNyA4bDQgNG0wIDBsLTQgNG00LTRIM1wiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIENvbnRhY3QgQ2FyZHMgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLWxnIHNoYWRvdy1sZyBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC00OCBiZy1ncmFkaWVudC10by1iciBmcm9tLXBpbmstNTAwIHRvLXBpbmstNjAwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgdGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC02eGwgbWItNFwiPvCfkaQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkXCI+Q29udGFjdCBDYXJkczwvaDI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNlwiPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktNjAwIG1iLTRcIj5cbiAgICAgICAgICAgICAgICBOZXVlIENvbnRhY3QgQ2FyZHMgaW0gRGVzaWduIGRlciBWb3JsYWdlIG1pdCBQb3J0cmFpdC1JbWFnZXMsIFxuICAgICAgICAgICAgICAgIEtvbnRha3RkYXRlbiB1bmQgU29jaWFsIE1lZGlhIExpbmtzLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yIG1iLTZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidy0yIGgtMiBiZy1ncmVlbi01MDAgcm91bmRlZC1mdWxsIG1yLTJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICBQb3J0cmFpdC1JbWFnZSAob2JlcmUgSMOkbGZ0ZSlcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidy0yIGgtMiBiZy1ncmVlbi01MDAgcm91bmRlZC1mdWxsIG1yLTJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICBIZWxsZXIgQ29udGVudC1CZXJlaWNoXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInctMiBoLTIgYmctZ3JlZW4tNTAwIHJvdW5kZWQtZnVsbCBtci0yXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgS29udGFrdGRhdGVuIG1pdCBJY29uc1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ3LTIgaC0yIGJnLWdyZWVuLTUwMCByb3VuZGVkLWZ1bGwgbXItMlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIFhJTkcgJiBMaW5rZWRJbiBMaW5rc1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICB0bz1cIi90ZXN0L2NvbnRhY3QtY2FyZHNcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBweC00IHB5LTIgYmctcGluay02MDAgdGV4dC13aGl0ZSByb3VuZGVkLWxnIGhvdmVyOmJnLXBpbmstNzAwIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENvbnRhY3QgQ2FyZHMgdGVzdGVuXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzc05hbWU9XCJ3LTQgaC00IG1sLTJcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZUxpbmVqb2luPVwicm91bmRcIiBzdHJva2VXaWR0aD17Mn0gZD1cIk0xNyA4bDQgNG0wIDBsLTQgNG00LTRIM1wiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIEJ1dHRvbiBTdHlsZXMgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLWxnIHNoYWRvdy1sZyBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC00OCBiZy1ncmFkaWVudC10by1iciBmcm9tLXJlZC01MDAgdG8tcmVkLTYwMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyIHRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtNnhsIG1iLTRcIj7wn5SYPC9kaXY+XG4gICAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZFwiPkJ1dHRvbiBTdHlsZXM8L2gyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTZcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTYwMCBtYi00XCI+XG4gICAgICAgICAgICAgICAgTUVDIEJ1dHRvbi1TdHlsZXMgbWl0IEhlbHZldGljYSBOb3cgRGlzcGxheSBTY2hyaWZ0YXJ0XG4gICAgICAgICAgICAgICAgdW5kIGRlbiBvcmlnaW5hbGVuIE1FQy1GYXJiZW4uXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTIgbWItNlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ3LTIgaC0yIGJnLWdyZWVuLTUwMCByb3VuZGVkLWZ1bGwgbXItMlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIEhlbHZldGljYSBOb3cgRGlzcGxheSBGb250XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInctMiBoLTIgYmctZ3JlZW4tNTAwIHJvdW5kZWQtZnVsbCBtci0yXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgTUVDIEZhcmJlbiAoI2QyMDAyOCwgIzI4MzIzQylcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidy0yIGgtMiBiZy1ncmVlbi01MDAgcm91bmRlZC1mdWxsIG1yLTJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICBLZWluZSBSdW5kdW5nZW4gKGVja2lnZXMgRGVzaWduKVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ3LTIgaC0yIGJnLWdyZWVuLTUwMCByb3VuZGVkLWZ1bGwgbXItMlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIFBmZWlsLUljb25zIHdpZSBpbSBPcmlnaW5hbFxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICB0bz1cIi90ZXN0L2J1dHRvbnNcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBweC00IHB5LTIgYmctcmVkLTYwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtbGcgaG92ZXI6YmctcmVkLTcwMCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBCdXR0b24gU3R5bGVzIHRlc3RlblxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3NOYW1lPVwidy00IGgtNCBtbC0yXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2VMaW5lY2FwPVwicm91bmRcIiBzdHJva2VMaW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlV2lkdGg9ezJ9IGQ9XCJNMTcgOGw0IDRtMCAwbC00IDRtNC00SDNcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgI
25114HsvKiBPcmlnaW5hbCBBcHAgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLWxnIHNoYWRvdy1sZyBvdmVyZmxvdy1oaWRkZW4gbGc6Y29sLXNwYW4tM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLTMyIGJnLWdyYWRpZW50LXRvLWJyIGZyb20tZ3JheS03MDAgdG8tZ3JheS04MDAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciB0ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LTR4bCBtYi0yXCI+8J+Xuu+4jzwvZGl2PlxuICAgICAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhsIGZvbnQtYm9sZFwiPk9yaWdpbmFsIFBvcnRmb2xpbyBBcHA8L2gyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTZcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTYwMCBtYi00XCI+XG4gICAgICAgICAgICAgICAgRGllIHVyc3Byw7xuZ2xpY2hlIFBvcnRmb2xpbyBNYW5hZ2VtZW50IEFwcCBtaXQgaW50ZXJha3RpdmVyIEthcnRlIFxuICAgICAgICAgICAgICAgIHVuZCBBbnNwcmVjaHBhcnRuZXItU3VjaGUuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICB0bz1cIi9hcHBcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBweC00IHB5LTIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSByb3VuZGVkLWxnIGhvdmVyOmJnLWdyYXktODAwIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIE9yaWdpbmFsIEFwcCDDtmZmbmVuXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzc05hbWU9XCJ3LTQgaC00IG1sLTJcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZUxpbmVqb2luPVwicm91bmRcIiBzdHJva2VXaWR0aD17Mn0gZD1cIk0xNyA4bDQgNG0wIDBsLTQgNG00LTRIM1wiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogRm9vdGVyICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEyIHRleHQtY2VudGVyIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtXCI+XG4gICAgICAgICAgICBNRUMgUG9ydGZvbGlvIE1hbmFnZW1lbnQgdntpbXBvcnQubWV0YS5lbnYuVklURV9BUFBfVkVSU0lPTiB8fCAnMS4wLjAnfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIG10LTFcIj5cbiAgICAgICAgICAgIFBvd2VyZWQgYnkgUmVhY3QgKyBUeXBlU2NyaXB0ICsgVGFpbHdpbmQgQ1NTXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBNYXBQaW4sIEV4dGVybmFsTGluayB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IGNsc3ggfSBmcm9tICdjbHN4J1xuaW1wb3J0IHR5cGUgeyBMb2NhdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuaW1wb3J0IHsgZm9ybWF0TWlldGZsYWVjaGUgfSBmcm9tICdAdXRpbHMvZm9ybWF0QXJlYSdcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgTE9DQVRJT04gQ0FSRCAtIFNpbmdsZSBTb3VyY2Ugb2YgVHJ1dGhcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmludGVyZmFjZSBVbmlmaWVkTG9jYXRpb25DYXJkUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb25cbiAgdmFyaWFudD86ICdjb21wYWN0JyB8ICdkZWZhdWx0JyB8ICdkZXRhaWxlZCdcbiAgb25TZWxlY3Q/OiAobG9jYXRpb246IExvY2F0aW9uKSA9PiB2b2lkXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgVW5pZmllZExvY2F0aW9uQ2FyZDogUmVhY3QuRkM8VW5pZmllZExvY2F0aW9uQ2FyZFByb3BzPiA9ICh7XG4gIGxvY2F0aW9uLFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICBvblNlbGVjdCxcbiAgY2xhc3NOYW1lXG59KSA9PiB7XG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9ICgpID0+IHtcbiAgICBvblNlbGVjdD8uKGxvY2F0aW9uKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ2VudGVyQ2xpY2sgPSAoZTogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBpZiAobG9jYXRpb24uY2VudGVyTGluaykge1xuICAgICAgd2luZG93Lm9wZW4obG9jYXRpb24uY2VudGVyTGluaywgJ19ibGFuaycsICdub29wZW5lcixub3JlZmVycmVyJylcbiAgICB9XG4gIH1cblxuICBjb25zdCBnZXRJbWFnZVVybCA9ICgpID0+IHtcbiAgICByZXR1cm4gbG9jYXRpb24uaGVyb0ltYWdlIHx8IGxvY2F0aW9uLmltYWdlIHx8IGxvY2F0aW9uLmxvZ28gfHwgJy9hc3NldHMvcGxhY2Vob2xkZXItbG9jYXRpb24uanBnJ1xuICB9XG5cbiAgLy8gQ09NUEFDVCBWQVJJQU5UIC0gRm9yIGxpc3RzIGFuZCBzbWFsbCBzcGFjZXNcbiAgaWYgKHZhcmlhbnQgPT09ICdjb21wYWN0Jykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IFxuICAgICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICAgJ2JnLXdoaXRlIHJvdW5kZWQtbWVjIGJvcmRlciBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeSBwLTQgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAgICdob3Zlcjpib3JkZXItbWVjLXByaW1hcnkvMjAgaG92ZXI6c2hhZG93LWNhcmQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgb25DbGljaz17aGFuZGxlU2VsZWN0fVxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtM1wiPlxuICAgICAgICAgI
25114Htsb2NhdGlvbi5sb2dvICYmIChcbiAgICAgICAgICAgIDxpbWcgXG4gICAgICAgICAgICAgIHNyYz17bG9jYXRpb24ubG9nb30gXG4gICAgICAgICAgICAgIGFsdD17YCR7bG9jYXRpb24ubmFtZX0gTG9nb2B9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctMTIgaC0xMiBvYmplY3QtY29udGFpbiByb3VuZGVkIGZsZXgtc2hyaW5rLTBcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IHRydW5jYXRlXCI+e2xvY2F0aW9uLm5hbWV9PC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC10ZXh0LXNlY29uZGFyeSB0cnVuY2F0ZVwiPntsb2NhdGlvbi5jaXR5fTwvcD5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgey8qIEtleSBTdGF0cyAtIEFMV0FZUyBTSE9XIEFWQUlMQUJMRSBEQVRBICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTMgbXQtMSB0ZXh0LXhzIHRleHQtdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICB7bG9jYXRpb24ucmVudGFibGVBcmVhICYmIChcbiAgICAgICAgICAgICAgICA8c3Bhbj57Zm9ybWF0TWlldGZsYWVjaGUobG9jYXRpb24ucmVudGFibGVBcmVhKX1twrI8L3NwYW4+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIHtsb2NhdGlvbi5zaG9wQ291bnQgJiYgKFxuICAgICAgICAgICAgICAgIDxzcGFuPntsb2NhdGlvbi5zaG9wQ291bnR9IFNob3BzPC9zcGFuPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICB7bG9jYXRpb24ucGFya2luZ1NwYWNlcyAmJiAoXG4gICAgICAgICAgICAgICAgPHNwYW4+e2xvY2F0aW9uLnBhcmtpbmdTcGFjZXN9IFBhcmtwbMOkdHplPC9zcGFuPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgXG4gICAgICAgICAge2xvY2F0aW9uLmNlbnRlckxpbmsgJiYgKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDZW50ZXJDbGlja31cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyBiZy1tZWMtcHJpbWFyeSB0ZXh0LXdoaXRlIHB4LTIgcHktMSByb3VuZGVkIGhvdmVyOmJnLW1lYy1wcmltYXJ5LzgwIHRyYW5zaXRpb24tY29sb3JzIGZsZXgtc2hyaW5rLTBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBadW0gQ2VudGVyXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIC8vIERFVEFJTEVEIFZBUklBTlQgLSBGb3IgZ3JpZHMgd2l0aCBtb3JlIHNwYWNlXG4gIGlmICh2YXJpYW50ID09PSAnZGV0YWlsZWQnKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgXG4gICAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAnYmctd2hpdGUgcm91bmRlZC1tZWMtbGcgc2hhZG93LWNhcmQgYm9yZGVyIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5IG92ZXJmbG93LWhpZGRlbiBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgJ2hvdmVyOnNoYWRvdy1jYXJkLWhvdmVyIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTMwMCcsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZVNlbGVjdH1cbiAgICAgID5cbiAgICAgICAgey8qIEhlcm8gSW1hZ2UgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgaC00OFwiPlxuICAgICAgICAgIDxpbWcgXG4gICAgICAgICAgICBzcmM9e2dldEltYWdlVXJsKCl9IFxuICAgICAgICAgICAgYWx0PXtsb2NhdGlvbi5uYW1lfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbCBvYmplY3QtY292ZXJcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAge2xvY2F0aW9uLmxvZ28gJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtNCBsZWZ0LTQgYmctd2hpdGUgcC0yIHJvdW5kZWQtbWVjIHNoYWRvdy1jYXJkXCI+XG4gICAgICAgICAgICAgIDxpbWcgXG4gICAgICAgICAgICAgICAgc3JjPXtsb2NhdGlvbi5sb2dvfSBcbiAgICAgICAgICAgICAgICBhbHQ9e2Ake2xvY2F0aW9uLm5hbWV9IExvZ29gfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctMTIgaC0xMiBvYmplY3QtY29udGFpblwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIHsvKiBDb250ZW50ICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtc3RhcnQgbWItNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQteGwgZm9udC1ib2xkIHRleHQtdGV4dC1wcmltYXJ5IG1iLTJcIj57bG9jYXRpb24ubmFtZX08L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnkgc3BhY2UteS0xXCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy00IGgtNCBtci0yXCIgLz5cbiAgICAgICAgICAgICAgICAgIHtsb2NhdGlvbi5hZGRyZXNzfVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtbC02XCI+e2xvY2F0aW9uLnBvc3RhbENvZGV9IHtsb2NhdGlvbi5jaXR5fTwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIHsvKiBLZXkgU3RhdGlzdGljcyAtIENPTVBSRUhFTlNJVkUgREFUQSBESVNQTEFZICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMiBnYXAtNCBtYi00XCI+XG4gICAgICAgICAgICB7bG9jYXRpb24ucmVudGFibGVBcmVhICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSByb3VuZGVkLW1lYyBwLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC10ZXh0LXNlY29uZGFyeVwiPlZlcm1pZXRiYXJlIEZsw6RjaGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgI
25114Htmb3JtYXRNaWV0ZmxhZWNoZShsb2NhdGlvbi5yZW50YWJsZUFyZWEpfW3CslxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7bG9jYXRpb24uc2hvcENvdW50ICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSByb3VuZGVkLW1lYyBwLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC10ZXh0LXNlY29uZGFyeVwiPkFuemFobCBTaG9wczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAge2xvY2F0aW9uLnNob3BDb3VudH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge2xvY2F0aW9uLnBhcmtpbmdTcGFjZXMgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWJhY2tncm91bmQtc2Vjb25kYXJ5IHJvdW5kZWQtbWVjIHAtM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXRleHQtc2Vjb25kYXJ5XCI+UGFya3Bsw6R0emU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgIHtsb2NhdGlvbi5wYXJraW5nU3BhY2VzfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7bG9jYXRpb24uc2FsZXNMZXZlbHMgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWJhY2tncm91bmQtc2Vjb25kYXJ5IHJvdW5kZWQtbWVjIHAtM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXRleHQtc2Vjb25kYXJ5XCI+VmVya2F1ZnNlYmVuZW48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgIHtsb2NhdGlvbi5zYWxlc0xldmVsc31cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAge2xvY2F0aW9uLmRlc2NyaXB0aW9uICYmIChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnkgdGV4dC1zbSBtYi00IGxpbmUtY2xhbXAtM1wiPlxuICAgICAgICAgICAgICB7bG9jYXRpb24uZGVzY3JpcHRpb24ucmVwbGFjZSgvPFtePl0qPi9nLCAnJyl9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHsvKiBBZGRpdGlvbmFsIEluZm8gKi99XG4gICAgICAgICAgeyhsb2NhdGlvbi5hbmNob3JUZW5hbnRzIHx8IGxvY2F0aW9uLmNhdGNobWVudEFyZWFQb3B1bGF0aW9uKSAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMiBtYi00IHRleHQtc21cIj5cbiAgICAgICAgICAgICAge2xvY2F0aW9uLmFuY2hvclRlbmFudHMgJiYgKFxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXRleHQtc2Vjb25kYXJ5XCI+QW5rZXJtaWV0ZXI6IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtdGV4dC1wcmltYXJ5XCI+e2xvY2F0aW9uLmFuY2hvclRlbmFudHN9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICB7bG9jYXRpb24uY2F0Y2htZW50QXJlYVBvcHVsYXRpb24gJiYgKFxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXRleHQtc2Vjb25kYXJ5XCI+RWluenVnc2dlYmlldDogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAge2xvY2F0aW9uLmNhdGNobWVudEFyZWFQb3B1bGF0aW9uLnRvTG9jYWxlU3RyaW5nKCl9IEVpbndvaG5lclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHsvKiBBY3Rpb25zICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB0LTQgYm9yZGVyLXQgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC00IHRleHQtc20gdGV4dC10ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgIHtsb2NhdGlvbi5vcGVuaW5nRGF0ZSAmJiAoXG4gICAgICAgICAgICAgICAgPHNwYW4+RXLDtmZmbmV0IHtuZXcgRGF0ZShsb2NhdGlvbi5vcGVuaW5nRGF0ZSkuZ2V0RnVsbFllYXIoKX08L3NwYW4+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIHtsb2NhdGlvbi50eXBlICYmIChcbiAgICAgICAgICAgICAgICA8c3Bhbj57bG9jYXRpb24udHlwZX08L3NwYW4+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAge2xvY2F0aW9uLmNlbnRlckxpbmsgJiYgKFxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlQ2VudGVyQ2xpY2t9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLXNlY29uZGFyeSB0ZXh0LXNtIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8RXh0ZXJuYWxMaW5rIGNsYXNzTmFtZT1cInctNCBoLTQgbXItMVwiIC8+XG4gICAgICAgICAgICAgICAgWnVtIENlbnRlclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgLy8gREVGQVVMVCBWQVJJQU5UIC0gRGVzaWduIG5hY2ggVm9ybGFnZSAoU2Nod2FiZW5HYWxlcmllLVN0eWxlKVxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgJ2JnLXdoaXRlIHJvdW5kZWQtbWVjLWxnIHNoYWRvdy1jYXJk
25114IG92ZXJmbG93LWhpZGRlbiBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICdob3ZlcjpzaGFkb3ctY2FyZC1ob3ZlciB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBvbkNsaWNrPXtoYW5kbGVTZWxlY3R9XG4gICAgPlxuICAgICAgey8qIEhlcm8gSW1hZ2UgLSBvYmVyZSBIw6RsZnRlICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBoLTgwXCI+XG4gICAgICAgIDxpbWdcbiAgICAgICAgICBzcmM9e2dldEltYWdlVXJsKCl9XG4gICAgICAgICAgYWx0PXtsb2NhdGlvbi5uYW1lfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgb2JqZWN0LWNvdmVyXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogQ29udGVudCBBcmVhIC0gdW50ZXJlIEjDpGxmdGUgbWl0IGR1bmtsZW0gSGludGVyZ3J1bmQgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXNsYXRlLTcwMCB0ZXh0LXdoaXRlIHAtNiBtaW4taC1bMjAwcHhdIGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgey8qIENlbnRlciBOYW1lICYgQ2l0eSAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCBtYi0yIGxlYWRpbmctdGlnaHRcIj57bG9jYXRpb24ubmFtZX08L2gzPlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteGwgdGV4dC1zbGF0ZS0zMDBcIj57bG9jYXRpb24uY2l0eX08L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBLZXkgU3RhdGlzdGljcyAtIENPTVBSRUhFTlNJVkUgRElTUExBWSAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0yIGdhcC00IG1iLTYgZmxleC0xXCI+XG4gICAgICAgICAge2xvY2F0aW9uLnJlbnRhYmxlQXJlYSAmJiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1zbGF0ZS00MDBcIj5WZXJtaWV0YmFyZSBGbMOkY2hlPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkXCI+XG4gICAgICAgICAgICAgICAge2Zvcm1hdE1pZXRmbGFlY2hlKGxvY2F0aW9uLnJlbnRhYmxlQXJlYSl9bcKyXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7bG9jYXRpb24uc2hvcENvdW50ICYmIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXNsYXRlLTQwMFwiPkFuemFobCBTaG9wczwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZFwiPntsb2NhdGlvbi5zaG9wQ291bnR9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtsb2NhdGlvbi5wYXJraW5nU3BhY2VzICYmIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXNsYXRlLTQwMFwiPlBhcmtwbMOkdHplPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkXCI+e2xvY2F0aW9uLnBhcmtpbmdTcGFjZXN9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtsb2NhdGlvbi5zYWxlc0xldmVscyAmJiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1zbGF0ZS00MDBcIj5WZXJrYXVmc2ViZW5lbjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZFwiPntsb2NhdGlvbi5zYWxlc0xldmVsc308L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAge2xvY2F0aW9uLmFuY2hvclRlbmFudHMgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc3Bhbi0yXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXNsYXRlLTQwMFwiPkFua2VybWlldGVyPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bSB0cnVuY2F0ZVwiPntsb2NhdGlvbi5hbmNob3JUZW5hbnRzfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIEFjdGlvbiBCdXR0b24gKi99XG4gICAgICAgIHtsb2NhdGlvbi5jZW50ZXJMaW5rICYmIChcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDZW50ZXJDbGlja31cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLXdoaXRlIHRleHQtc2xhdGUtNzAwIHB4LTQgcHktMiByb3VuZGVkLW1lYyBmb250LW1lZGl1bSBob3ZlcjpiZy1zbGF0ZS0xMDAgdHJhbnNpdGlvbi1jb2xvcnMgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RXh0ZXJuYWxMaW5rIGNsYXNzTmFtZT1cInctNCBoLTQgbXItMlwiIC8+XG4gICAgICAgICAgICBadW0gQ2VudGVyXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiLy8gREVQUkVDQVRFRDogVXNlIFVuaWZpZWRMb2NhdGlvbkNhcmQgaW5zdGVhZFxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgVW5pZmllZExvY2F0aW9uQ2FyZCB9IGZyb20gJy4uL1VJL1VuaWZpZWRMb2NhdGlvbkNhcmQnXG5pbXBvcnQgdHlwZSB7IExvY2F0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMvaW5kZXgnXG5cbmludGVyZmFjZSBMb2NhdGlvbkNhcmRQcm9wcyB7XG4gIGxvY2F0aW9uOiBMb2NhdGlvblxuICB2Y
25114XJpYW50PzogJ2RlZmF1bHQnIHwgJ2NvbXBhY3QnIHwgJ2RldGFpbGVkJ1xuICBvblNlbGVjdD86IChsb2NhdGlvbjogTG9jYXRpb24pID0+IHZvaWRcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBMb2NhdGlvbkNhcmQ6IFJlYWN0LkZDPExvY2F0aW9uQ2FyZFByb3BzPiA9ICh7XG4gIGxvY2F0aW9uLFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICBvblNlbGVjdCxcbiAgY2xhc3NOYW1lID0gJydcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8VW5pZmllZExvY2F0aW9uQ2FyZFxuICAgICAgbG9jYXRpb249e2xvY2F0aW9ufVxuICAgICAgb25TZWxlY3Q9e29uU2VsZWN0fVxuICAgICAgdmFyaWFudD17dmFyaWFudH1cbiAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9jYXRpb25DYXJkXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IExvY2F0aW9uQ2FyZCB9IGZyb20gJy4vTG9jYXRpb25DYXJkJ1xuaW1wb3J0IHR5cGUgeyBMb2NhdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL2luZGV4J1xuXG5pbnRlcmZhY2UgTG9jYXRpb25HcmlkUHJvcHMge1xuICBsb2NhdGlvbnM6IExvY2F0aW9uW11cbiAgb25Mb2NhdGlvblNlbGVjdD86IChsb2NhdGlvbjogTG9jYXRpb24pID0+IHZvaWRcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBMb2NhdGlvbkdyaWQ6IFJlYWN0LkZDPExvY2F0aW9uR3JpZFByb3BzPiA9ICh7XG4gIGxvY2F0aW9ucyxcbiAgb25Mb2NhdGlvblNlbGVjdCxcbiAgY2xhc3NOYW1lID0gJydcbn0pID0+IHtcbiAgY29uc3QgW3NlYXJjaFRlcm0sIHNldFNlYXJjaFRlcm1dID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IFtzZWxlY3RlZENpdHksIHNldFNlbGVjdGVkQ2l0eV0gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3QgW3NlbGVjdGVkVHlwZSwgc2V0U2VsZWN0ZWRUeXBlXSA9IHVzZVN0YXRlKCcnKVxuXG4gIC8vIEV4dHJhY3QgdW5pcXVlIGNpdGllcyBhbmQgdHlwZXMgZm9yIGZpbHRlcnNcbiAgY29uc3QgY2l0aWVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgY2l0eVNldCA9IG5ldyBTZXQobG9jYXRpb25zLm1hcChsb2MgPT4gbG9jLmNpdHkpLmZpbHRlcihCb29sZWFuKSlcbiAgICByZXR1cm4gQXJyYXkuZnJvbShjaXR5U2V0KS5zb3J0KClcbiAgfSwgW2xvY2F0aW9uc10pXG5cbiAgY29uc3QgdHlwZXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB0eXBlU2V0ID0gbmV3IFNldChsb2NhdGlvbnMubWFwKGxvYyA9PiBsb2MudHlwZSkuZmlsdGVyKEJvb2xlYW4pKVxuICAgIHJldHVybiBBcnJheS5mcm9tKHR5cGVTZXQpLnNvcnQoKVxuICB9LCBbbG9jYXRpb25zXSlcblxuICAvLyBGaWx0ZXIgbG9jYXRpb25zIGJhc2VkIG9uIHNlYXJjaCBhbmQgZmlsdGVyc1xuICBjb25zdCBmaWx0ZXJlZExvY2F0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBsb2NhdGlvbnMuZmlsdGVyKGxvY2F0aW9uID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZXNTZWFyY2ggPSAhc2VhcmNoVGVybSB8fCBcbiAgICAgICAgbG9jYXRpb24ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKSkgfHxcbiAgICAgICAgbG9jYXRpb24uY2l0eT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtLnRvTG93ZXJDYXNlKCkpIHx8XG4gICAgICAgIGxvY2F0aW9uLmFkZHJlc3M/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKVxuXG4gICAgICBjb25zdCBtYXRjaGVzQ2l0eSA9ICFzZWxlY3RlZENpdHkgfHwgbG9jYXRpb24uY2l0eSA9PT0gc2VsZWN0ZWRDaXR5XG4gICAgICBjb25zdCBtYXRjaGVzVHlwZSA9ICFzZWxlY3RlZFR5cGUgfHwgbG9jYXRpb24udHlwZSA9PT0gc2VsZWN0ZWRUeXBlXG5cbiAgICAgIHJldHVybiBtYXRjaGVzU2VhcmNoICYmIG1hdGNoZXNDaXR5ICYmIG1hdGNoZXNUeXBlXG4gICAgfSlcbiAgfSwgW2xvY2F0aW9ucywgc2VhcmNoVGVybSwgc2VsZWN0ZWRDaXR5LCBzZWxlY3RlZFR5cGVdKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2BzcGFjZS15LTYgJHtjbGFzc05hbWV9YH0+XG4gICAgICB7LyogU2VhcmNoIGFuZCBGaWx0ZXIgQmFyICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIHNtOmZsZXgtcm93IGdhcC00IGl0ZW1zLXN0YXJ0IHNtOml0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWF4LXctbWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlN0YW5kb3J0ZSBkdXJjaHN1Y2hlbi4uLlwiXG4gICAgICAgICAgICAgIHZhbHVlPXtzZWFyY2hUZXJtfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNlYXJjaFRlcm0oZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcGwtMTAgcHItNCBweS0yIGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1sZyBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1tZWMtYmx1ZSBmb2N1czpib3JkZXItdHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteS0wIGxlZnQtMCBwbC0zIGZsZXggaXRlbXMtY2VudGVyIHBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICAgICAgPHN2ZyBjbGFzc05hbWU9XCJoLTUgdy01IHRleHQtZ3JheS00MDBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2VMaW5lY2FwPVwicm91bmRcIiBzdHJva2VMaW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlV2lkdGg9ezJ9IGQ9XCJNMjEgMjFsLTYtNm0yLTVhNyA3IDAgMTEtMTQgMCA3IDcgMCAwMTE0IDB6XCIgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTJcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICB2YWx1ZT17c2VsZWN0ZWRDaXR5fVxuICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRTZWxlY3RlZENpdHkoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwicHgtMyBweS0yIGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1sZyBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1tZWMtYmx1ZSBmb2N1czpib3JkZXItdHJhbnNwYXJlbnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGxlIFN0w6RkdGU8L29wdGlvbj5cbiAgICAgICAgICAgI
25114HtjaXRpZXMubWFwKGNpdHkgPT4gKFxuICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Y2l0eX0gdmFsdWU9e2NpdHl9PntjaXR5fTwvb3B0aW9uPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgXG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgdmFsdWU9e3NlbGVjdGVkVHlwZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U2VsZWN0ZWRUeXBlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTMgcHktMiBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbGcgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctbWVjLWJsdWUgZm9jdXM6Ym9yZGVyLXRyYW5zcGFyZW50XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsZSBUeXBlbjwvb3B0aW9uPlxuICAgICAgICAgICAge3R5cGVzLm1hcCh0eXBlID0+IChcbiAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e3R5cGV9IHZhbHVlPXt0eXBlfT57dHlwZX08L29wdGlvbj5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogUmVzdWx0cyBDb3VudCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgIHtmaWx0ZXJlZExvY2F0aW9ucy5sZW5ndGh9IHZvbiB7bG9jYXRpb25zLmxlbmd0aH0gU3RhbmRvcnRlblxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBMb2NhdGlvbiBHcmlkIC0gNCBLYWNoZWxuIGF1ZiBEZXNrdG9wICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIHNtOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zIHhsOmdyaWQtY29scy00IGdhcC04XCI+XG4gICAgICAgIHtmaWx0ZXJlZExvY2F0aW9ucy5tYXAoKGxvY2F0aW9uKSA9PiAoXG4gICAgICAgICAgPExvY2F0aW9uQ2FyZFxuICAgICAgICAgICAga2V5PXtsb2NhdGlvbi5pZH1cbiAgICAgICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgICAgIG9uU2VsZWN0PXtvbkxvY2F0aW9uU2VsZWN0fVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC1mdWxsXCJcbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogRW1wdHkgU3RhdGUgKi99XG4gICAgICB7ZmlsdGVyZWRMb2NhdGlvbnMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciBweS0xMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTQwMCBtYi00XCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzTmFtZT1cIm14LWF1dG8gaC0xMiB3LTEyXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgIDxwYXRoIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZUxpbmVqb2luPVwicm91bmRcIiBzdHJva2VXaWR0aD17Mn0gZD1cIk0xOSAyMVY1YTIgMiAwIDAwLTItMkg3YTIgMiAwIDAwLTIgMnYxNm0xNCAwaDJtLTIgMGgtNW0tOSAwSDNtMiAwaDVNOSA3aDFtLTEgNGgxbTQtNGgxbS0xIDRoMW0tNSAxMHYtNWExIDEgMCAwMTEtMWgyYTEgMSAwIDAxMSAxdjVtLTQgMGg0XCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDAgbWItMlwiPktlaW5lIFN0YW5kb3J0ZSBnZWZ1bmRlbjwvaDM+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTUwMFwiPlZlcnN1Y2hlbiBTaWUgYW5kZXJlIFN1Y2hiZWdyaWZmZSBvZGVyIEZpbHRlci48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTG9jYXRpb25HcmlkIH0gZnJvbSAnQGNvbXBvbmVudHMvTG9jYXRpb24nXG5pbXBvcnQgdHlwZSB7IExvY2F0aW9uIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnXG5cbi8vIFRlc3QtRGF0ZW4gYmFzaWVyZW5kIGF1ZiBkZW0gU2llYmVuIFNlZW4gQ2VudGVyIEJlaXNwaWVsXG5jb25zdCB0ZXN0TG9jYXRpb25zOiBMb2NhdGlvbltdID0gW1xuICB7XG4gICAgaWQ6ICcxJyxcbiAgICBuYW1lOiAnU2llYmVuIFNlZW4gQ2VudGVyJyxcbiAgICBjaXR5OiAnU2Nod2VyaW4nLFxuICAgIGFkZHJlc3M6ICdQbGF0eiBkZXIgRnJlaWhlaXQgMScsXG4gICAgcG9zdGFsQ29kZTogJzE5MDUzJyxcbiAgICBjb3VudHJ5OiAnRGV1dHNjaGxhbmQnLFxuICAgIGNvb3JkaW5hdGVzOiB7IGxhdDogNTMuNjM1NSwgbG5nOiAxMS40MDEwIH0sXG4gICAgaGVyb0ltYWdlOiAnaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDE5ODYzMDA5MTctNjQ2NzRiZDYwMGQ4P3c9ODAwJmg9NDAwJmZpdD1jcm9wJyxcbiAgICBjZW50ZXJMaW5rOiAnaHR0cHM6Ly9zaWViZW4tc2Vlbi1jZW50ZXIuZGUnLFxuICAgIHR5cGU6ICdTaG9wcGluZyBDZW50ZXInLFxuICAgIHdwRGF0YToge1xuICAgICAgaWQ6IDEsXG4gICAgICBzbHVnOiAnc2llYmVuLXNlZW4tY2VudGVyJyxcbiAgICAgIGFjZjoge1xuICAgICAgICAnY2VudGVyLWdydW5kZGF0ZW4tdmVybWlldGJhcmUtZmxhZWNoZSc6IDI2NDk2LFxuICAgICAgICAnY2VudGVyLWdydW5kZGF0ZW4tYW56YWhsLXNob3BzLWZhY2htYWVya3RlJzogNTQsXG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi12ZXJrYXVmc2ViZW5lbic6IDFcbiAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICB1cGRhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWidcbiAgfSxcbiAge1xuICAgIGlkOiAnMicsXG4gICAgbmFtZTogJ0FsbGVlLUNlbnRlcicsXG4gICAgY2l0eTogJ01hZ2RlYnVyZycsXG4gICAgYWRkcmVzczogJ0pvaGFubmVzLUfDtmRlcml0ei1TdHJhw59lIDEwMycsXG4gICAgcG9zdGFsQ29kZTogJzM5MTA4JyxcbiAgICBjb3VudHJ5OiAnRGV1dHNjaGxhbmQnLFxuICAgIGNvb3JkaW5hdGVzOiB7IGxhdDogNTIuMTIwNSwgbG5nOiAxMS42Mjc2IH0sXG4gICAgaGVyb0ltYWdlOiAnaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1NTU1Mjk2NjktZTY5ZTdhYTBiYTlhP3c9ODAwJmg9NDAwJmZp
25114dD1jcm9wJyxcbiAgICBjZW50ZXJMaW5rOiAnaHR0cHM6Ly9hbGxlZS1jZW50ZXItbWFnZGVidXJnLmRlJyxcbiAgICB0eXBlOiAnU2hvcHBpbmcgQ2VudGVyJyxcbiAgICB3cERhdGE6IHtcbiAgICAgIGlkOiAyLFxuICAgICAgc2x1ZzogJ2FsbGVlLWNlbnRlci1tYWdkZWJ1cmcnLFxuICAgICAgYWNmOiB7XG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi12ZXJtaWV0YmFyZS1mbGFlY2hlJzogNDUwMDAsXG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi1hbnphaGwtc2hvcHMtZmFjaG1hZXJrdGUnOiAxMjAsXG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi12ZXJrYXVmc2ViZW5lbic6IDJcbiAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICB1cGRhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWidcbiAgfSxcbiAge1xuICAgIGlkOiAnMycsXG4gICAgbmFtZTogJ0VsYmUgUGFyaycsXG4gICAgY2l0eTogJ0RyZXNkZW4nLFxuICAgIGFkZHJlc3M6ICdCdWRhcGVzdGVyIFN0cmHDn2UgMjVhJyxcbiAgICBwb3N0YWxDb2RlOiAnMDEwNjknLFxuICAgIGNvdW50cnk6ICdEZXV0c2NobGFuZCcsXG4gICAgY29vcmRpbmF0ZXM6IHsgbGF0OiA1MS4wNTA0LCBsbmc6IDEzLjczNzMgfSxcbiAgICBoZXJvSW1hZ2U6ICdodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUxOTU2NzI0MTA0Ni03ZjU3MGVlZTNjZTY/dz04MDAmaD00MDAmZml0PWNyb3AnLFxuICAgIGNlbnRlckxpbms6ICdodHRwczovL2VsYmVwYXJrLWRyZXNkZW4uZGUnLFxuICAgIHR5cGU6ICdTaG9wcGluZyBDZW50ZXInLFxuICAgIHdwRGF0YToge1xuICAgICAgaWQ6IDMsXG4gICAgICBzbHVnOiAnZWxiZS1wYXJrLWRyZXNkZW4nLFxuICAgICAgYWNmOiB7XG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi12ZXJtaWV0YmFyZS1mbGFlY2hlJzogNjUwMDAsXG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi1hbnphaGwtc2hvcHMtZmFjaG1hZXJrdGUnOiAxODAsXG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi12ZXJrYXVmc2ViZW5lbic6IDNcbiAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICB1cGRhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWidcbiAgfSxcbiAge1xuICAgIGlkOiAnNCcsXG4gICAgbmFtZTogJ0ZhY2htYXJrdHplbnRydW0gTm9yZCcsXG4gICAgY2l0eTogJ0hhbWJ1cmcnLFxuICAgIGFkZHJlc3M6ICdMYW5nZW5ob3JuZXIgQ2hhdXNzZWUgMjAwJyxcbiAgICBwb3N0YWxDb2RlOiAnMjI0MTUnLFxuICAgIGNvdW50cnk6ICdEZXV0c2NobGFuZCcsXG4gICAgY29vcmRpbmF0ZXM6IHsgbGF0OiA1My42MzU1LCBsbmc6IDEwLjAwMTAgfSxcbiAgICBoZXJvSW1hZ2U6ICdodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ4NjQwNjE0NjkyNi1jNjI3YTkyYWQxYWI/dz04MDAmaD00MDAmZml0PWNyb3AnLFxuICAgIGNlbnRlckxpbms6ICdodHRwczovL2ZhY2htYXJrdHplbnRydW0tbm9yZC5kZScsXG4gICAgdHlwZTogJ0ZhY2htYXJrdHplbnRydW0nLFxuICAgIHdwRGF0YToge1xuICAgICAgaWQ6IDQsXG4gICAgICBzbHVnOiAnZmFjaG1hcmt0emVudHJ1bS1ub3JkJyxcbiAgICAgIGFjZjoge1xuICAgICAgICAnY2VudGVyLWdydW5kZGF0ZW4tdmVybWlldGJhcmUtZmxhZWNoZSc6IDE4NTAwLFxuICAgICAgICAnY2VudGVyLWdydW5kZGF0ZW4tYW56YWhsLXNob3BzLWZhY2htYWVya3RlJzogMTIsXG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi12ZXJrYXVmc2ViZW5lbic6IDFcbiAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICB1cGRhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWidcbiAgfVxuXVxuXG5leHBvcnQgY29uc3QgTG9jYXRpb25DYXJkc1Rlc3Q6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCBoYW5kbGVMb2NhdGlvblNlbGVjdCA9IChsb2NhdGlvbjogTG9jYXRpb24pID0+IHtcbiAgICBjb25zb2xlLmxvZygnU2VsZWN0ZWQgbG9jYXRpb246JywgbG9jYXRpb24pXG4gICAgYWxlcnQoYExvY2F0aW9uIHNlbGVjdGVkOiAke2xvY2F0aW9uLm5hbWV9IGluICR7bG9jYXRpb24uY2l0eX1gKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ncmF5LTUwIHB5LThcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWF4LXctN3hsIG14LWF1dG8gcHgtNCBzbTpweC02IGxnOnB4LThcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi04XCI+XG4gICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LWdyYXktOTAwIG1iLTJcIj5cbiAgICAgICAgICAgIExvY2F0aW9uIENhcmRzIFRlc3RcbiAgICAgICAgICA8L2gxPlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgIFRlc3QgZGVyIG5ldWVuIExvY2F0aW9uIENhcmRzIGltIERlc2lnbiBkZXIgVm9ybGFnZVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPExvY2F0aW9uR3JpZCBcbiAgICAgICAgICBsb2NhdGlvbnM9e3Rlc3RMb2NhdGlvbnN9XG4gICAgICAgICAgb25Mb2NhdGlvblNlbGVjdD17aGFuZGxlTG9jYXRpb25TZWxlY3R9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQ29udGFjdENhcmQgfSBmcm9tICdAY29tcG9uZW50cy9Db250YWN0J1xuaW1wb3J0IHR5cGUgeyBDb250YWN0IH0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnXG5cbi8vIFRlc3QtRGF0ZW4gYmFzaWVyZW5kIGF1ZiBkZW0gVHljaG8gSm9oYW5uc2VuIEJlaXNwaWVsXG5jb25zdCB0ZXN0Q29udGFjdHM6IENvbnRhY3RbXSA9IFtcbiAge1xuICAgIGlkOiAnMScsXG4gICAgbG9jYXRpb25JZDogJzEnLFxuICAgIGZpcnN0TmFtZTogJ1R5Y2hvJyxcbiAgICBsYXN0TmFtZTogJ0pvaGFubnNlbicsXG4gICAgZnVsbE5hbWU6ICdUeWNobyBKb2hhbm5zZW4nLFxuICAgIHBvc2l0aW9uOiAnSGVhZCBvZiBDZW50ZXIgTWFuYWdlbWVudCBSZWdpb24gTm9ydGgnLFxuICAgIGRlcGFydG1lbnQ6ICcnLFxuICAgIGVtYWlsOiAndHljaG8uam9oYW5uc2VuQG1lYy5kZScsXG4gICAgcGhvbmU6ICcrNDkgKDApIDQzMjEgNTU3NyA2MCcsXG4gICAgaW1hZ2U6ICdodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwNzAwMzIxMTE2OS0wYTFkZDcyMjhmMmQ/dz00MDAmaD01MDAmZml0PWNyb3AmY3JvcD1mYWNlJyxcbiAgICBiaW86ICdFcmZhaHJlbmVyIENlbnRlciBNYW5hZ2VyIG1pdCDDvGJlciAxNSBKYWhyZW4gRXhwZXJ0aXNlIGltIEVpbnplbGhhbmRlbHNpbW1vYmlsaWVubWFuYWdlbWVudC4nLFxuICAgIHNwZWNpYWx0aWVzOiBbJ0NlbnRlciBNYW5hZ2VtZW50JywgJ1Zlcm1pZXR1bmcnLCAnS3VuZGVuYmV0cmV1dW5nJ10sXG4gICAgbGFuZ3VhZ2VzOiBbJ0RldXRzY2gnLCAnRW5nbGlzY2gnLCA
25114nRMOkbmlzY2gnXSxcbiAgICBzb2NpYWxMaW5rczogW1xuICAgICAge1xuICAgICAgICBwbGF0Zm9ybTogJ3hpbmcnLFxuICAgICAgICB1cmw6ICdodHRwczovL3d3dy54aW5nLmNvbS9wcm9maWxlL1R5Y2hvX0pvaGFubnNlbicsXG4gICAgICAgIGxhYmVsOiAnWElORyBQcm9maWwnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwbGF0Zm9ybTogJ2xpbmtlZGluJyxcbiAgICAgICAgdXJsOiAnaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL3R5Y2hvLWpvaGFubnNlbicsXG4gICAgICAgIGxhYmVsOiAnTGlua2VkSW4gUHJvZmlsJ1xuICAgICAgfVxuICAgIF0sXG4gICAgaXNBY3RpdmU6IHRydWUsXG4gICAgY3JlYXRlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonLFxuICAgIHVwZGF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJ1xuICB9LFxuICB7XG4gICAgaWQ6ICcyJyxcbiAgICBsb2NhdGlvbklkOiAnMicsXG4gICAgZmlyc3ROYW1lOiAnU2FyYWgnLFxuICAgIGxhc3ROYW1lOiAnTcO8bGxlcicsXG4gICAgZnVsbE5hbWU6ICdTYXJhaCBNw7xsbGVyJyxcbiAgICBwb3NpdGlvbjogJ0NlbnRlciBNYW5hZ2VyaW4nLFxuICAgIGRlcGFydG1lbnQ6ICdBbGxlZS1DZW50ZXIgTWFnZGVidXJnJyxcbiAgICBlbWFpbDogJ3NhcmFoLm11ZWxsZXJAbWVjLmRlJyxcbiAgICBwaG9uZTogJys0OSAoMCkgMzkxIDEyMyA0NTYnLFxuICAgIGltYWdlOiAnaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0OTQ3OTAxMDg3NTUtMjYxNmI2MTJiNzg2P3c9NDAwJmg9NTAwJmZpdD1jcm9wJmNyb3A9ZmFjZScsXG4gICAgYmlvOiAnU3BlemlhbGlzdGluIGbDvHIgS3VuZGVuYmV0cmV1dW5nIHVuZCBWZXJtaWV0dW5nc21hbmFnZW1lbnQgbWl0IEZva3VzIGF1ZiBuYWNoaGFsdGlnZSBDZW50ZXJsw7ZzdW5nZW4uJyxcbiAgICBzcGVjaWFsdGllczogWydWZXJtaWV0dW5nJywgJ01hcmtldGluZycsICdOYWNoaGFsdGlna2VpdCddLFxuICAgIGxhbmd1YWdlczogWydEZXV0c2NoJywgJ0VuZ2xpc2NoJ10sXG4gICAgc29jaWFsTGlua3M6IFtcbiAgICAgIHtcbiAgICAgICAgcGxhdGZvcm06ICdsaW5rZWRpbicsXG4gICAgICAgIHVybDogJ2h0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9zYXJhaC1tdWVsbGVyJyxcbiAgICAgICAgbGFiZWw6ICdMaW5rZWRJbiBQcm9maWwnXG4gICAgICB9XG4gICAgXSxcbiAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICBjcmVhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWicsXG4gICAgdXBkYXRlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonXG4gIH0sXG4gIHtcbiAgICBpZDogJzMnLFxuICAgIGxvY2F0aW9uSWQ6ICczJyxcbiAgICBmaXJzdE5hbWU6ICdNaWNoYWVsJyxcbiAgICBsYXN0TmFtZTogJ1NjaG1pZHQnLFxuICAgIGZ1bGxOYW1lOiAnTWljaGFlbCBTY2htaWR0JyxcbiAgICBwb3NpdGlvbjogJ0xlaXRlciBUZWNobmlzY2hlcyBNYW5hZ2VtZW50JyxcbiAgICBkZXBhcnRtZW50OiAnRWxiZSBQYXJrIERyZXNkZW4nLFxuICAgIGVtYWlsOiAnbWljaGFlbC5zY2htaWR0QG1lYy5kZScsXG4gICAgcGhvbmU6ICcrNDkgKDApIDM1MSA3ODkgMDEyJyxcbiAgICBpbWFnZTogJ2h0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDcyMDk5NjQ1Nzg1LTU2NThhYmY0ZmY0ZT93PTQwMCZoPTUwMCZmaXQ9Y3JvcCZjcm9wPWZhY2UnLFxuICAgIGJpbzogJ0V4cGVydGUgZsO8ciB0ZWNobmlzY2hlIEluZnJhc3RydWt0dXIgdW5kIEZhY2lsaXR5IE1hbmFnZW1lbnQgaW4gU2hvcHBpbmcgQ2VudGVybi4nLFxuICAgIHNwZWNpYWx0aWVzOiBbJ1RlY2huaXNjaGVzIE1hbmFnZW1lbnQnLCAnRmFjaWxpdHkgTWFuYWdlbWVudCcsICdFbmVyZ2llZWZmaXppZW56J10sXG4gICAgbGFuZ3VhZ2VzOiBbJ0RldXRzY2gnLCAnRW5nbGlzY2gnLCAnVHNjaGVjaGlzY2gnXSxcbiAgICBzb2NpYWxMaW5rczogW1xuICAgICAge1xuICAgICAgICBwbGF0Zm9ybTogJ3hpbmcnLFxuICAgICAgICB1cmw6ICdodHRwczovL3d3dy54aW5nLmNvbS9wcm9maWxlL01pY2hhZWxfU2NobWlkdCcsXG4gICAgICAgIGxhYmVsOiAnWElORyBQcm9maWwnXG4gICAgICB9XG4gICAgXSxcbiAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICBjcmVhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWicsXG4gICAgdXBkYXRlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonXG4gIH0sXG4gIHtcbiAgICBpZDogJzQnLFxuICAgIGxvY2F0aW9uSWQ6ICc0JyxcbiAgICBmaXJzdE5hbWU6ICdBbm5hJyxcbiAgICBsYXN0TmFtZTogJ1dlYmVyJyxcbiAgICBmdWxsTmFtZTogJ0FubmEgV2ViZXInLFxuICAgIHBvc2l0aW9uOiAnTWFya2V0aW5nICYgRXZlbnRzIE1hbmFnZXJpbicsXG4gICAgZGVwYXJ0bWVudDogJ0ZhY2htYXJrdHplbnRydW0gTm9yZCcsXG4gICAgZW1haWw6ICdhbm5hLndlYmVyQG1lYy5kZScsXG4gICAgcGhvbmU6ICcrNDkgKDApIDQwIDU2NyA4OTAnLFxuICAgIGltYWdlOiAnaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0Mzg3NjE2ODEwMzMtNjQ2MWZmYWQ4ZDgwP3c9NDAwJmg9NTAwJmZpdD1jcm9wJmNyb3A9ZmFjZScsXG4gICAgYmlvOiAnS3JlYXRpdmUgTWFya2V0aW5nZXhwZXJ0aW4gbWl0IExlaWRlbnNjaGFmdCBmw7xyIGlubm92YXRpdmUgS3VuZGVuZXJsZWJuaXNzZSB1bmQgRXZlbnRzLicsXG4gICAgc3BlY2lhbHRpZXM6IFsnTWFya2V0aW5nJywgJ0V2ZW50IE1hbmFnZW1lbnQnLCAnU29jaWFsIE1lZGlhJ10sXG4gICAgbGFuZ3VhZ2VzOiBbJ0RldXRzY2gnLCAnRW5nbGlzY2gnLCAnRnJhbnrDtnNpc2NoJ10sXG4gICAgc29jaWFsTGlua3M6IFtcbiAgICAgIHtcbiAgICAgICAgcGxhdGZvcm06ICdsaW5rZWRpbicsXG4gICAgICAgIHVybDogJ2h0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9hbm5hLXdlYmVyJyxcbiAgICAgICAgbGFiZWw6ICdMaW5rZWRJbiBQcm9maWwnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwbGF0Zm9ybTogJ3hpbmcnLFxuICAgICAgICB1cmw6ICdodHRwczovL3d3dy54aW5nLmNvbS9wcm9maWxlL0FubmFfV2ViZXInLFxuICAgICAgICBsYWJlbDogJ1hJTkcgUHJvZmlsJ1xuICAgICAgfVxuICAgIF0sXG4gICAgaXNBY3RpdmU6IHRydWUsXG4gICAgY3JlYXRlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonLFxuICAgIHVwZGF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJ1xuICB9XG5dXG5cbmV4cG9ydCBjb25zdCBDb250YWN0Q2FyZHNUZXN0OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgaGFuZGxlQ29udGFjdFNlbGVjdCA9IChjb250YWN0OiBDb250YWN0KSA9PiB7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIGNvbnRhY3Q6JywgY29udGFjdClcbiAgICBhbGVydChgQ29udGFjdCBzZWxlY3RlZDogJHtjb250YWN0LmZ1bGxOYW1lfSAtICR7Y29udGFjdC5wb3NpdGlvbn1gKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ncmF5LTUwIHB5LThcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWF4LXctN3hsIG14LWF1dG8gcHgtNCBzbTpweC02IGxnOnB4LThcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi04XCI+XG4gICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LWdyYXktOTAwIG1iLTJcIj5cbiAgICAgICAgICAgIENvbnRhY3QgQ2FyZHMgVGVzdFxuICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTYwMFwiPlxuICAgICAgICAgICAgVGVzdCBkZXIgbmV1ZW4gQ29udGFjdCBDYXJkcyBpbSBEZXNpZ24gZGVyIFZvcmxhZ2VcbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgI
25114HsvKiBDb250YWN0IEdyaWQgLSBBbmdlcGFzc3QgZsO8ciBncsO2w59lcmUgQ2FyZHMgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMSBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtMyB4bDpncmlkLWNvbHMtNCBnYXAtOFwiPlxuICAgICAgICAgIHt0ZXN0Q29udGFjdHMubWFwKChjb250YWN0KSA9PiAoXG4gICAgICAgICAgICA8Q29udGFjdENhcmRcbiAgICAgICAgICAgICAga2V5PXtjb250YWN0LmlkfVxuICAgICAgICAgICAgICBjb250YWN0PXtjb250YWN0fVxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDb250YWN0U2VsZWN0fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLWZ1bGxcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQnV0dG9uLCBNRUNCdXR0b25QcmltYXJ5LCBNRUNCdXR0b25TZWNvbmRhcnksIE1FQ0J1dHRvbkFjY2VudCwgTUVDQnV0dG9uR2hvc3QgfSBmcm9tICdAY29tcG9uZW50cy9VSS9CdXR0b24nXG5cbmV4cG9ydCBjb25zdCBCdXR0b25UZXN0OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1iYWNrZ3JvdW5kLXByaW1hcnkgcC04XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LTR4bCBteC1hdXRvIHNwYWNlLXktMTJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTR4bCBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgbWItNCBmb250LWhlbHZldGljYS1ub3dcIj5cbiAgICAgICAgICAgIE1FQyBCdXR0b24gU3R5bGVzIFRlc3RcbiAgICAgICAgICA8L2gxPlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgIEJhc2llcmVuZCBhdWYgZGVuIE1FQy1EZXNpZ25zIG1pdCBIZWx2ZXRpY2EgTm93IERpc3BsYXkgU2NocmlmdGFydFxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIE1FQyBCdXR0b24gVmFyaWFudHMgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInNwYWNlLXktOFwiPlxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgZm9udC1oZWx2ZXRpY2Etbm93XCI+XG4gICAgICAgICAgICBNRUMgQnV0dG9uIFZhcmlhbnRlblxuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy00IGdhcC02XCI+XG4gICAgICAgICAgICB7LyogUHJpbWFyeSAtIERhcmsgQmFja2dyb3VuZCAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS00XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5QcmltYXJ5IChEYXJrKTwvaDM+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0zXCI+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvblByaW1hcnkgc2l6ZT1cInNtXCI+QWxsZSBOYWNocmljaHRlbjwvTUVDQnV0dG9uUHJpbWFyeT5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uUHJpbWFyeSBzaXplPVwibWRcIj5BbGxlIE5hY2hyaWNodGVuPC9NRUNCdXR0b25QcmltYXJ5PlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25QcmltYXJ5IHNpemU9XCJsZ1wiPkFsbGUgTmFjaHJpY2h0ZW48L01FQ0J1dHRvblByaW1hcnk+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBTZWNvbmRhcnkgLSBMaWdodCBCYWNrZ3JvdW5kICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTRcIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeVwiPlNlY29uZGFyeSAoTGlnaHQpPC9oMz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uU2Vjb25kYXJ5IHNpemU9XCJzbVwiPkpldHp0IGJld2VyYmVuPC9NRUNCdXR0b25TZWNvbmRhcnk+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvblNlY29uZGFyeSBzaXplPVwibWRcIj5KZXR6dCBiZXdlcmJlbjwvTUVDQnV0dG9uU2Vjb25kYXJ5PlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25TZWNvbmRhcnkgc2l6ZT1cImxnXCI+SmV0enQgYmV3ZXJiZW48L01FQ0J1dHRvblNlY29uZGFyeT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgey8qIEFjY2VudCAtIFJlZCBCYWNrZ3JvdW5kICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTRcIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeVwiPkFjY2VudCAoUmVkKTwvaDM+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0zXCI+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvbkFjY2VudCBzaXplPVwic21cIj5XZWl0ZXJlIEluZm9ybWF0aW9uZW48L01FQ0J1dHRvbkFjY2VudD5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uQWNjZW50IHNpemU9XCJtZFwiPldlaXRlcmUgSW5mb3JtYXRpb25lbjwvTUVDQnV0dG9uQWNjZW50PlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25BY2NlbnQgc2l6ZT1cImxnXCI+V2VpdGVyZSBJbmZvcm1hdGlvbmVuPC9NRUNCdXR0b25BY2NlbnQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBHaG9zdCAtIFRyYW5zcGFyZW50ICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTRcIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeVwiPkdob3N0IChUcmFuc3B
25114hcmVudCk8L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25HaG9zdCBzaXplPVwic21cIj5NZWhyIGVyZmFocmVuPC9NRUNCdXR0b25HaG9zdD5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uR2hvc3Qgc2l6ZT1cIm1kXCI+TWVociBlcmZhaHJlbjwvTUVDQnV0dG9uR2hvc3Q+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvbkdob3N0IHNpemU9XCJsZ1wiPk1laHIgZXJmYWhyZW48L01FQ0J1dHRvbkdob3N0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgey8qIEJ1dHRvbiBTdGF0ZXMgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInNwYWNlLXktOFwiPlxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgZm9udC1oZWx2ZXRpY2Etbm93XCI+XG4gICAgICAgICAgICBCdXR0b24gU3RhdGVzXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTEgbWQ6Z3JpZC1jb2xzLTMgZ2FwLTZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS00XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5Ob3JtYWw8L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25QcmltYXJ5PkFsbGUgTmFjaHJpY2h0ZW48L01FQ0J1dHRvblByaW1hcnk+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvbkFjY2VudD5XZWl0ZXJlIEluZm9ybWF0aW9uZW48L01FQ0J1dHRvbkFjY2VudD5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uR2hvc3Q+TWVociBlcmZhaHJlbjwvTUVDQnV0dG9uR2hvc3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS00XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5Mb2FkaW5nPC9oMz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uUHJpbWFyeSBsb2FkaW5nPkFsbGUgTmFjaHJpY2h0ZW48L01FQ0J1dHRvblByaW1hcnk+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvbkFjY2VudCBsb2FkaW5nPldlaXRlcmUgSW5mb3JtYXRpb25lbjwvTUVDQnV0dG9uQWNjZW50PlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25HaG9zdCBsb2FkaW5nPk1laHIgZXJmYWhyZW48L01FQ0J1dHRvbkdob3N0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNFwiPlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5XCI+RGlzYWJsZWQ8L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25QcmltYXJ5IGRpc2FibGVkPkFsbGUgTmFjaHJpY2h0ZW48L01FQ0J1dHRvblByaW1hcnk+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvbkFjY2VudCBkaXNhYmxlZD5XZWl0ZXJlIEluZm9ybWF0aW9uZW48L01FQ0J1dHRvbkFjY2VudD5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uR2hvc3QgZGlzYWJsZWQ+TWVociBlcmZhaHJlbjwvTUVDQnV0dG9uR2hvc3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICB7LyogRnVsbCBXaWR0aCBCdXR0b25zICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJzcGFjZS15LThcIj5cbiAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkIHRleHQtdGV4dC1wcmltYXJ5IGZvbnQtaGVsdmV0aWNhLW5vd1wiPlxuICAgICAgICAgICAgRnVsbCBXaWR0aCBCdXR0b25zXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNCBtYXgtdy1tZFwiPlxuICAgICAgICAgICAgPE1FQ0J1dHRvblByaW1hcnkgZnVsbFdpZHRoPkFsbGUgTmFjaHJpY2h0ZW48L01FQ0J1dHRvblByaW1hcnk+XG4gICAgICAgICAgICA8TUVDQnV0dG9uU2Vjb25kYXJ5IGZ1bGxXaWR0aD5KZXR6dCBiZXdlcmJlbjwvTUVDQnV0dG9uU2Vjb25kYXJ5PlxuICAgICAgICAgICAgPE1FQ0J1dHRvbkFjY2VudCBmdWxsV2lkdGg+V2VpdGVyZSBJbmZvcm1hdGlvbmVuPC9NRUNCdXR0b25BY2NlbnQ+XG4gICAgICAgICAgICA8TUVDQnV0dG9uR2hvc3QgZnVsbFdpZHRoPk1laHIgZXJmYWhyZW48L01FQ0J1dHRvbkdob3N0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgey8qIFR5cG9ncmFwaHkgVGVzdCAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwic3BhY2UteS04XCI+XG4gICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBmb250LWhlbHZldGljYS1ub3dcIj5cbiAgICAgICAgICAgIEhlbHZldGljYSBOb3cgRGlzcGxheSBUeXBvZ3JhcGh5XG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb250LWhlbHZldGljYS1ub3cgZm9udC1ub3JtYWwgdGV4dC1sZyB0ZXh0LXRleHQtcHJpbWFyeVwiPlxuICAgICAgICAgICAgICBSZWd1bGFyOiBEaWVzIGlzdCBlaW4gVGVzdCBkZXIgSGVsdmV0aWNhIE5vdyBEaXNwbGF5IFJlZ3VsYXIgU2NocmlmdGFydC5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb250LWhlbHZldGljYS1ub3cgZm9udC1ib2xkIHRleHQtbGcgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgQm9sZDogRGllcyBpc3QgZWluIFRlc3QgZGVyIEhlbHZldGljYSBOb3cgRGlzcGxheSBCb2xkIFNjaHJpZnRhcnQuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9udC1oZWx2ZXRpY2Etbm93IGZvbnQtYm9sZCB0ZXh0LTN4bCB0ZXh0LW1lYy1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgIEdyb8OfZSDDnGJlcnNjaHJpZnQgaW4gTUVDIFJvdFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtaGVsdmV0aWNhLW5vdyBmb250LWJvbGQgdGV4dC0yeGwgdGV4dC1tZWMtc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgIE1pdHRsZXJlIMOcYmVyc2NocmlmdCBpbiBNRUMgR3JhdVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjcmVhdGVCcm93c2VyUm91dGVyLCBSb3V0ZXJQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nXG5pbXBvcnQgQXBwIGZyb20gJy4uL0FwcCdcbmltcG9ydCBBZG1pblBhZ2UgZnJvbSAnLi4vcGFnZXMvQWRtaW5QYWdlJ1xuaW1wb3J0IHsgVGVzdE92ZXJ2aWV3IH0gZnJvbSAnLi4vcGFnZXMvVGVzdE92ZXJ2aWV3J1xuaW1wb3J0IHsgTG9jYXRpb25DYXJkc1Rlc3QgfSBmcm9tICcuLi9wYWdlcy9Mb2NhdGlvbkNhcmRzVGVzdCdcbmltcG9ydCB7
25114IENvbnRhY3RDYXJkc1Rlc3QgfSBmcm9tICcuLi9wYWdlcy9Db250YWN0Q2FyZHNUZXN0J1xuaW1wb3J0IHsgQnV0dG9uVGVzdCB9IGZyb20gJy4uL3BhZ2VzL0J1dHRvblRlc3QnXG5cbmNvbnN0IHJvdXRlciA9IGNyZWF0ZUJyb3dzZXJSb3V0ZXIoW1xuICB7XG4gICAgcGF0aDogJy8nLFxuICAgIGVsZW1lbnQ6IDxBcHAgLz5cbiAgfSxcbiAge1xuICAgIHBhdGg6ICcvYWRtaW4nLFxuICAgIGVsZW1lbnQ6IDxBZG1pblBhZ2UgLz5cbiAgfSxcbiAge1xuICAgIHBhdGg6ICcvdGVzdCcsXG4gICAgZWxlbWVudDogPFRlc3RPdmVydmlldyAvPlxuICB9LFxuICB7XG4gICAgcGF0aDogJy90ZXN0L2xvY2F0aW9uLWNhcmRzJyxcbiAgICBlbGVtZW50OiA8TG9jYXRpb25DYXJkc1Rlc3QgLz5cbiAgfSxcbiAge1xuICAgIHBhdGg6ICcvdGVzdC9jb250YWN0LWNhcmRzJyxcbiAgICBlbGVtZW50OiA8Q29udGFjdENhcmRzVGVzdCAvPlxuICB9LFxuICB7XG4gICAgcGF0aDogJy90ZXN0L2J1dHRvbnMnLFxuICAgIGVsZW1lbnQ6IDxCdXR0b25UZXN0IC8+XG4gIH1cbl0pXG5cbmV4cG9ydCBjb25zdCBBcHBSb3V0ZXI6IFJlYWN0LkZDID0gKCkgPT4ge1xuICByZXR1cm4gPFJvdXRlclByb3ZpZGVyIHJvdXRlcj17cm91dGVyfSAvPlxufVxuIiwiLy8gc3JjL3BlcnNpc3QudHNcbmltcG9ydCB7IGRlaHlkcmF0ZSwgaHlkcmF0ZSB9IGZyb20gXCJAdGFuc3RhY2svcXVlcnktY29yZVwiO1xudmFyIGNhY2hlRXZlbnRUeXBlcyA9IFtcImFkZGVkXCIsIFwicmVtb3ZlZFwiLCBcInVwZGF0ZWRcIl07XG5mdW5jdGlvbiBpc0NhY2hlRXZlbnRUeXBlKGV2ZW50VHlwZSkge1xuICByZXR1cm4gY2FjaGVFdmVudFR5cGVzLmluY2x1ZGVzKGV2ZW50VHlwZSk7XG59XG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0UXVlcnlDbGllbnRSZXN0b3JlKHtcbiAgcXVlcnlDbGllbnQsXG4gIHBlcnNpc3RlcixcbiAgbWF4QWdlID0gMWUzICogNjAgKiA2MCAqIDI0LFxuICBidXN0ZXIgPSBcIlwiLFxuICBoeWRyYXRlT3B0aW9uc1xufSkge1xuICB0cnkge1xuICAgIGNvbnN0IHBlcnNpc3RlZENsaWVudCA9IGF3YWl0IHBlcnNpc3Rlci5yZXN0b3JlQ2xpZW50KCk7XG4gICAgaWYgKHBlcnNpc3RlZENsaWVudCkge1xuICAgICAgaWYgKHBlcnNpc3RlZENsaWVudC50aW1lc3RhbXApIHtcbiAgICAgICAgY29uc3QgZXhwaXJlZCA9IERhdGUubm93KCkgLSBwZXJzaXN0ZWRDbGllbnQudGltZXN0YW1wID4gbWF4QWdlO1xuICAgICAgICBjb25zdCBidXN0ZWQgPSBwZXJzaXN0ZWRDbGllbnQuYnVzdGVyICE9PSBidXN0ZXI7XG4gICAgICAgIGlmIChleHBpcmVkIHx8IGJ1c3RlZCkge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZXIucmVtb3ZlQ2xpZW50KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHlkcmF0ZShxdWVyeUNsaWVudCwgcGVyc2lzdGVkQ2xpZW50LmNsaWVudFN0YXRlLCBoeWRyYXRlT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwZXJzaXN0ZXIucmVtb3ZlQ2xpZW50KCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiRW5jb3VudGVyZWQgYW4gZXJyb3IgYXR0ZW1wdGluZyB0byByZXN0b3JlIGNsaWVudCBjYWNoZSBmcm9tIHBlcnNpc3RlZCBsb2NhdGlvbi4gQXMgYSBwcmVjYXV0aW9uLCB0aGUgcGVyc2lzdGVkIGNhY2hlIHdpbGwgYmUgZGlzY2FyZGVkLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBwZXJzaXN0ZXIucmVtb3ZlQ2xpZW50KCk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0UXVlcnlDbGllbnRTYXZlKHtcbiAgcXVlcnlDbGllbnQsXG4gIHBlcnNpc3RlcixcbiAgYnVzdGVyID0gXCJcIixcbiAgZGVoeWRyYXRlT3B0aW9uc1xufSkge1xuICBjb25zdCBwZXJzaXN0Q2xpZW50ID0ge1xuICAgIGJ1c3RlcixcbiAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgY2xpZW50U3RhdGU6IGRlaHlkcmF0ZShxdWVyeUNsaWVudCwgZGVoeWRyYXRlT3B0aW9ucylcbiAgfTtcbiAgYXdhaXQgcGVyc2lzdGVyLnBlcnNpc3RDbGllbnQocGVyc2lzdENsaWVudCk7XG59XG5mdW5jdGlvbiBwZXJzaXN0UXVlcnlDbGllbnRTdWJzY3JpYmUocHJvcHMpIHtcbiAgY29uc3QgdW5zdWJzY3JpYmVRdWVyeUNhY2hlID0gcHJvcHMucXVlcnlDbGllbnQuZ2V0UXVlcnlDYWNoZSgpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICBpZiAoaXNDYWNoZUV2ZW50VHlwZShldmVudC50eXBlKSkge1xuICAgICAgcGVyc2lzdFF1ZXJ5Q2xpZW50U2F2ZShwcm9wcyk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgdW5zdWJzY3JpYmVNdXRhdGlvbkNhY2hlID0gcHJvcHMucXVlcnlDbGllbnQuZ2V0TXV0YXRpb25DYWNoZSgpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICBpZiAoaXNDYWNoZUV2ZW50VHlwZShldmVudC50eXBlKSkge1xuICAgICAgcGVyc2lzdFF1ZXJ5Q2xpZW50U2F2ZShwcm9wcyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICB1bnN1YnNjcmliZVF1ZXJ5Q2FjaGUoKTtcbiAgICB1bnN1YnNjcmliZU11dGF0aW9uQ2FjaGUoKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHBlcnNpc3RRdWVyeUNsaWVudChwcm9wcykge1xuICBsZXQgaGFzVW5zdWJzY3JpYmVkID0gZmFsc2U7XG4gIGxldCBwZXJzaXN0UXVlcnlDbGllbnRVbnN1YnNjcmliZTtcbiAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgaGFzVW5zdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBwZXJzaXN0UXVlcnlDbGllbnRVbnN1YnNjcmliZT8uKCk7XG4gIH07XG4gIGNvbnN0IHJlc3RvcmVQcm9taXNlID0gcGVyc2lzdFF1ZXJ5Q2xpZW50UmVzdG9yZShwcm9wcykudGhlbigoKSA9PiB7XG4gICAgaWYgKCFoYXNVbnN1YnNjcmliZWQpIHtcbiAgICAgIHBlcnNpc3RRdWVyeUNsaWVudFVuc3Vic2NyaWJlID0gcGVyc2lzdFF1ZXJ5Q2xpZW50U3Vic2NyaWJlKHByb3BzKTtcbiAgICB9XG4gI
25114H0pO1xuICByZXR1cm4gW3Vuc3Vic2NyaWJlLCByZXN0b3JlUHJvbWlzZV07XG59XG5leHBvcnQge1xuICBwZXJzaXN0UXVlcnlDbGllbnQsXG4gIHBlcnNpc3RRdWVyeUNsaWVudFJlc3RvcmUsXG4gIHBlcnNpc3RRdWVyeUNsaWVudFNhdmUsXG4gIHBlcnNpc3RRdWVyeUNsaWVudFN1YnNjcmliZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBlcnNpc3QuanMubWFwIiwiLy8gc3JjL3V0aWxzLnRzXG5mdW5jdGlvbiBub29wKCkge1xufVxuZXhwb3J0IHtcbiAgbm9vcFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIi8vIHNyYy9pbmRleC50c1xuaW1wb3J0IHsgdGltZW91dE1hbmFnZXIgfSBmcm9tIFwiQHRhbnN0YWNrL3F1ZXJ5LWNvcmVcIjtcbmltcG9ydCB7IG5vb3AgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuZnVuY3Rpb24gY3JlYXRlU3luY1N0b3JhZ2VQZXJzaXN0ZXIoe1xuICBzdG9yYWdlLFxuICBrZXkgPSBgUkVBQ1RfUVVFUllfT0ZGTElORV9DQUNIRWAsXG4gIHRocm90dGxlVGltZSA9IDFlMyxcbiAgc2VyaWFsaXplID0gSlNPTi5zdHJpbmdpZnksXG4gIGRlc2VyaWFsaXplID0gSlNPTi5wYXJzZSxcbiAgcmV0cnlcbn0pIHtcbiAgaWYgKHN0b3JhZ2UpIHtcbiAgICBjb25zdCB0cnlTYXZlID0gKHBlcnNpc3RlZENsaWVudCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgc2VyaWFsaXplKHBlcnNpc3RlZENsaWVudCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgcGVyc2lzdENsaWVudDogdGhyb3R0bGUoKHBlcnNpc3RlZENsaWVudCkgPT4ge1xuICAgICAgICBsZXQgY2xpZW50ID0gcGVyc2lzdGVkQ2xpZW50O1xuICAgICAgICBsZXQgZXJyb3IgPSB0cnlTYXZlKGNsaWVudCk7XG4gICAgICAgIGxldCBlcnJvckNvdW50ID0gMDtcbiAgICAgICAgd2hpbGUgKGVycm9yICYmIGNsaWVudCkge1xuICAgICAgICAgIGVycm9yQ291bnQrKztcbiAgICAgICAgICBjbGllbnQgPSByZXRyeT8uKHtcbiAgICAgICAgICAgIHBlcnNpc3RlZENsaWVudDogY2xpZW50LFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICBlcnJvckNvdW50XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICAgICAgZXJyb3IgPSB0cnlTYXZlKGNsaWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB0aHJvdHRsZVRpbWUpLFxuICAgICAgcmVzdG9yZUNsaWVudDogKCkgPT4ge1xuICAgICAgICBjb25zdCBjYWNoZVN0cmluZyA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICBpZiAoIWNhY2hlU3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZShjYWNoZVN0cmluZyk7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlQ2xpZW50OiAoKSA9PiB7XG4gICAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwZXJzaXN0Q2xpZW50OiBub29wLFxuICAgIHJlc3RvcmVDbGllbnQ6IG5vb3AsXG4gICAgcmVtb3ZlQ2xpZW50OiBub29wXG4gIH07XG59XG5mdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0ID0gMTAwKSB7XG4gIGxldCB0aW1lciA9IG51bGw7XG4gIGxldCBwYXJhbXM7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgcGFyYW1zID0gYXJncztcbiAgICBpZiAodGltZXIgPT09IG51bGwpIHtcbiAgICAgIHRpbWVyID0gdGltZW91dE1hbmFnZXIuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZ1bmMoLi4ucGFyYW1zKTtcbiAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgfSwgd2FpdCk7XG4gICAgfVxuICB9O1xufVxuZXhwb3J0IHtcbiAgY3JlYXRlU3luY1N0b3JhZ2VQZXJzaXN0ZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBRdWVyeUNsaWVudCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSdcbmltcG9ydCB7IHBlcnNpc3RRdWVyeUNsaWVudCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeS1wZXJzaXN0LWNsaWVudCdcbmltcG9ydCB7IGNyZWF0ZVN5bmNTdG9yYWdlUGVyc2lzdGVyIH0gZnJvbSAnQHRhbnN0YWNrL3F1ZXJ5LXN5bmMtc3RvcmFnZS1wZXJzaXN0ZXInXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBDTElFTlQgV0lUSCBPRkZMSU5FIFBFUlNJU1RFTkNFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBsb2NhbFN0b3JhZ2UgaXMgYXZhaWxhYmxlIChmb3IgaWZyYW1lIGNvbXBhdGliaWxpdHkpXG4gKi9cbmNvbnN0IGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlID0gKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHRlc3QgPSAnX19sb2NhbFN0b3JhZ2VfdGVzdF9fJ1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcGVyc2lzdGVyIHRoYXQgc3RvcmVzIGRhdGEgaW4gbG9jYWxTdG9yYWdlXG4gKiBUaGlzIGFsbG93cyB0aGUgYXBwIHRvIHdvcmsgb2ZmbGluZSB3aXRoIHByZXZpb3VzbHkgbG9hZGVkIGRhdGFcbiAqIE9ubHkgZW5hYmxlZCBpZiBsb2NhbFN0b3JhZ2UgaXMgYXZhaWxhYmxlIChpZnJhbWUgY29tcGF0aWJpbGl0eSlcbiAqL1xuY29uc3QgbG9jYWxTdG9yYWdlUGVyc2lzdGVyID0gaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSA/IGNyZWF0ZVN5bmNTdG9yYWdlUGVyc2lzdGVyKHtcbiAgc3RvcmFnZTogd2luZG93LmxvY2FsU3RvcmFnZSxcbiAga2V5OiAnTUVDX1BPUlRGT0xJT19DQUNIRScsXG4gIC8vIFNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSB0byBoYW5kbGUgY29tcGxleCBkYXRhIHN0cnVjdHVyZXNcbiAgc2VyaWFsaXplOiBKU09OLnN0cmluZ2lmeSxcbiAgZGVzZXJpYWxpemU6IEpTT04ucGFyc2UsXG59KSA6IG51bGxcblxuLyoqXG4gKiBRdWVyeSBDbGllbnQgQ29uZmlndXJhdGlvbiB3aXRoIE9mZmxpbmUgU3VwcG9ydFxuICovXG5leHBvcnQgY29uc3QgcXVlcnlDbGllbnQgPSBuZXcgUXVlcnlDbGllbnQoe1xuICBkZWZhdWx0T3B0aW9uczoge1xuICAgIHF1ZXJpZXM6IHtcbiAgICAgIC8vIFN0YWxlIHRpbWU6IDUgbWludXRlcyAoZGF0YSBpcyBjb25zaWRlcmVkIGZyZXNoIGZvciA1
25114IG1pbnV0ZXMpXG4gICAgICBzdGFsZVRpbWU6IDUgKiA2MCAqIDEwMDAsXG4gICAgICBcbiAgICAgIC8vIENhY2hlIHRpbWU6IDI0IGhvdXJzIChkYXRhIHN0YXlzIGluIGNhY2hlIGZvciAyNCBob3VycylcbiAgICAgIGdjVGltZTogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICAgIFxuICAgICAgLy8gUmV0cnkgZmFpbGVkIHJlcXVlc3RzXG4gICAgICByZXRyeTogKGZhaWx1cmVDb3VudCwgZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAvLyBEb24ndCByZXRyeSBvbiA0eHggZXJyb3JzIChjbGllbnQgZXJyb3JzKVxuICAgICAgICBpZiAoZXJyb3I/LnN0YXR1cyA+PSA0MDAgJiYgZXJyb3I/LnN0YXR1cyA8IDUwMCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIC8vIERvbid0IHJldHJ5IGlmIG9mZmxpbmUgYW5kIG5vIGNhY2hlZCBkYXRhXG4gICAgICAgIGlmIChlcnJvcj8uc3RhdHVzID09PSA1MDMgJiYgIW5hdmlnYXRvci5vbkxpbmUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXRyeSB1cCB0byAzIHRpbWVzIGZvciBuZXR3b3JrIGVycm9yc1xuICAgICAgICByZXR1cm4gZmFpbHVyZUNvdW50IDwgM1xuICAgICAgfSxcbiAgICAgIFxuICAgICAgLy8gRG9uJ3QgcmVmZXRjaCBvbiB3aW5kb3cgZm9jdXMgKHRvIHNhdmUgYmFuZHdpZHRoKVxuICAgICAgcmVmZXRjaE9uV2luZG93Rm9jdXM6IGZhbHNlLFxuICAgICAgXG4gICAgICAvLyBSZWZldGNoIG9uIHJlY29ubmVjdCAod2hlbiBpbnRlcm5ldCBjb21lcyBiYWNrKVxuICAgICAgcmVmZXRjaE9uUmVjb25uZWN0OiB0cnVlLFxuICAgICAgXG4gICAgICAvLyBOZXR3b3JrIG1vZGU6IG9mZmxpbmVGaXJzdFxuICAgICAgLy8gVGhpcyBhbGxvd3MgcXVlcmllcyB0byBzdWNjZWVkIHdpdGggY2FjaGVkIGRhdGEgZXZlbiB3aGVuIG9mZmxpbmVcbiAgICAgIG5ldHdvcmtNb2RlOiAnb2ZmbGluZUZpcnN0JyxcbiAgICB9LFxuICAgIG11dGF0aW9uczoge1xuICAgICAgLy8gUmV0cnkgbXV0YXRpb25zIG9uY2VcbiAgICAgIHJldHJ5OiAxLFxuICAgICAgLy8gTmV0d29yayBtb2RlIGZvciBtdXRhdGlvbnNcbiAgICAgIG5ldHdvcmtNb2RlOiAnb2ZmbGluZUZpcnN0JyxcbiAgICB9XG4gIH1cbn0pXG5cbi8qKlxuICogU2V0dXAgcGVyc2lzdGVuY2UgZm9yIHRoZSBxdWVyeSBjbGllbnRcbiAqIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IHNhdmUgYW5kIHJlc3RvcmUgcXVlcnkgY2FjaGUgdG8vZnJvbSBsb2NhbFN0b3JhZ2VcbiAqIE9ubHkgZW5hYmxlZCBpZiBsb2NhbFN0b3JhZ2UgaXMgYXZhaWxhYmxlIChpZnJhbWUgY29tcGF0aWJpbGl0eSlcbiAqL1xuaWYgKGxvY2FsU3RvcmFnZVBlcnNpc3Rlcikge1xuICBwZXJzaXN0UXVlcnlDbGllbnQoe1xuICAgIHF1ZXJ5Q2xpZW50LFxuICAgIHBlcnNpc3RlcjogbG9jYWxTdG9yYWdlUGVyc2lzdGVyLFxuICAgIC8vIE1heGltdW0gYWdlIG9mIGNhY2hlZCBkYXRhOiAyNCBob3Vyc1xuICAgIG1heEFnZTogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICAvLyBEZWh5ZHJhdGUgb3B0aW9ucyAtIHdoYXQgdG8gcGVyc2lzdFxuICAgIGRlaHlkcmF0ZU9wdGlvbnM6IHtcbiAgICAgIC8vIERvbid0IHBlcnNpc3QgcXVlcmllcyB0aGF0IGhhdmUgZXJyb3JzXG4gICAgICBzaG91bGREZWh5ZHJhdGVRdWVyeTogKHF1ZXJ5KSA9PiB7XG4gICAgICAgIHJldHVybiBxdWVyeS5zdGF0ZS5zdGF0dXMgPT09ICdzdWNjZXNzJ1xuICAgICAgfSxcbiAgICB9LFxuICB9KVxufSBlbHNlIHtcbiAgY29uc29sZS5sb2coJ+KaoO+4jyBsb2NhbFN0b3JhZ2Ugbm90IGF2YWlsYWJsZSAtIHBlcnNpc3RlbmNlIGRpc2FibGVkIChpZnJhbWUgbW9kZSknKVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT0ZGTElORSBERVRFQ1RJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGFwcCBpcyBjdXJyZW50bHkgb25saW5lXG4gKi9cbmV4cG9ydCBjb25zdCBpc09ubGluZSA9ICgpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIG5hdmlnYXRvci5vbkxpbmVcbn1cblxuLyoqXG4gKiBTZXR1cCBvbmxpbmUvb2ZmbGluZSBldmVudCBsaXN0ZW5lcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldHVwT25saW5lRGV0ZWN0aW9uID0gKFxuICBvbk9ubGluZT86ICgpID0+IHZvaWQsXG4gIG9uT2ZmbGluZT86ICgpID0+IHZvaWRcbikgPT4ge1xuICBjb25zdCBoYW5kbGVPbmxpbmUgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ/Cfn6IgQXBwIGlzIG9ubGluZSAtIHJlZmV0Y2hpbmcgZGF0YScpXG4gICAgLy8gUmVmZXRjaCBhbGwgcXVlcmllcyB3aGVuIGNvbWluZyBiYWNrIG9ubGluZVxuICAgIHF1ZXJ5Q2xpZW50LnJlZmV0Y2hRdWVyaWVzKClcbiAgICBvbk9ubGluZT8uKClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZU9mZmxpbmUgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ/CflLQgQXBwIGlzIG9mZmxpbmUgLSB1c2luZyBjYWNoZWQgZGF0YScpXG4gICAgb25PZmZsaW5lPy4oKVxuICB9XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsIGhhbmRsZU9ubGluZSlcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCBoYW5kbGVPZmZsaW5lKVxuXG4gIC8vIFJldHVybiBjbGVhbnVwIGZ1bmN0aW9uXG4gIHJldHVybiAoKSA9PiB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29ubGluZScsIGhhbmRsZU9ubGluZSlcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb2ZmbGluZScsIGhhbmRsZU9mZmxpbmUpXG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENBQ0hFIE1BTkFHRU1FTlRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2xlYXIgYWxsIGNhY2hlZCBkYXRhXG4gKi9cbmV4cG9ydCBjb25zdCBjbGVhckNhY2hlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBxdWVyeUNsaWVudC5jbGVhcigpXG4gIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdNRUNfUE9SVEZPTElPX0NBQ0hFJylcbiAgY29uc29sZS5sb2coJ/Cfl5HvuI8gQ2FjaGUgY2xlYXJlZCcpXG59XG5cbi8qKlxuICogR2V0IGNhY2hlIHNpemUgKGFwcHJveGltYXRlKVxuICovXG5leHBvcnQgY29uc3QgZ2V0Q2FjaGVTaXplID0gKCk6IG51bWJlciA9PiB7XG4gIGNvbnN0IGNhY2hlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ01FQ19QT1JURk9MSU9fQ0FDSEUnKVxuICBpZiAoIWNhY2hlKSByZXR1cm4gMFxuICAvLyBSZXR1cm4gc2l6ZSBpbiBLQlxuICByZXR1cm4gbmV3IEJsb2IoW2NhY2hlXSkuc2l6ZSAvIDEwMjRcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBjYWNoZSBleGlzdHNcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0NhY2hlZERhdGEgPSAoKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybi
25114Bsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnTUVDX1BPUlRGT0xJT19DQUNIRScpICE9PSBudWxsXG59XG5cbiIsIi8qKlxuICogU2VydmljZSBXb3JrZXIgUmVnaXN0cmF0aW9uXG4gKiBIYW5kbGVzIFBXQSBmdW5jdGlvbmFsaXR5IGFuZCBvZmZsaW5lIHN1cHBvcnRcbiAqL1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJTZXJ2aWNlV29ya2VyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAvLyBPbmx5IHJlZ2lzdGVyIGluIHByb2R1Y3Rpb25cbiAgaWYgKGltcG9ydC5tZXRhLmVudi5ERVYpIHtcbiAgICBjb25zb2xlLmxvZygnW1NXXSBTZXJ2aWNlIFdvcmtlciBkaXNhYmxlZCBpbiBkZXZlbG9wbWVudCcpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBDaGVjayBpZiBzZXJ2aWNlIHdvcmtlcnMgYXJlIHN1cHBvcnRlZFxuICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkge1xuICAgIGNvbnNvbGUubG9nKCdbU1ddIFNlcnZpY2UgV29ya2VycyBub3Qgc3VwcG9ydGVkJylcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gUmVnaXN0ZXIgdGhlIHNlcnZpY2Ugd29ya2VyXG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVnaXN0ZXIoJy9zdy5qcycsIHtcbiAgICAgIHNjb3BlOiAnLycsXG4gICAgfSlcblxuICAgIGNvbnNvbGUubG9nKCdbU1ddIFNlcnZpY2UgV29ya2VyIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5OicsIHJlZ2lzdHJhdGlvbi5zY29wZSlcblxuICAgIC8vIENoZWNrIGZvciB1cGRhdGVzIHBlcmlvZGljYWxseVxuICAgIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHJlZ2lzdHJhdGlvbi51cGRhdGUoKVxuICAgIH0sIDYwICogNjAgKiAxMDAwKSAvLyBDaGVjayBldmVyeSBob3VyXG5cbiAgICAvLyBIYW5kbGUgdXBkYXRlc1xuICAgIHJlZ2lzdHJhdGlvbi5hZGRFdmVudExpc3RlbmVyKCd1cGRhdGVmb3VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG5ld1dvcmtlciA9IHJlZ2lzdHJhdGlvbi5pbnN0YWxsaW5nXG4gICAgICBcbiAgICAgIGlmICghbmV3V29ya2VyKSByZXR1cm5cblxuICAgICAgbmV3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXRlY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICBpZiAobmV3V29ya2VyLnN0YXRlID09PSAnaW5zdGFsbGVkJyAmJiBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5jb250cm9sbGVyKSB7XG4gICAgICAgICAgLy8gTmV3IHNlcnZpY2Ugd29ya2VyIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU1ddIE5ldyB2ZXJzaW9uIGF2YWlsYWJsZScpXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTm90aWZ5IHVzZXIgYWJvdXQgdXBkYXRlXG4gICAgICAgICAgaWYgKGNvbmZpcm0oJ0VpbmUgbmV1ZSBWZXJzaW9uIGlzdCB2ZXJmw7xnYmFyLiBKZXR6dCBha3R1YWxpc2llcmVuPycpKSB7XG4gICAgICAgICAgICBuZXdXb3JrZXIucG9zdE1lc3NhZ2UoeyB0eXBlOiAnU0tJUF9XQUlUSU5HJyB9KVxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAvLyBIYW5kbGUgY29udHJvbGxlciBjaGFuZ2VcbiAgICBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdjb250cm9sbGVyY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1tTV10gQ29udHJvbGxlciBjaGFuZ2VkLCByZWxvYWRpbmcgcGFnZScpXG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICB9KVxuXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignW1NXXSBTZXJ2aWNlIFdvcmtlciByZWdpc3RyYXRpb24gZmFpbGVkOicsIGVycm9yKVxuICB9XG59XG5cbi8qKlxuICogVW5yZWdpc3RlciBzZXJ2aWNlIHdvcmtlciAoZm9yIGRldmVsb3BtZW50L3Rlc3RpbmcpXG4gKi9cbmV4cG9ydCBjb25zdCB1bnJlZ2lzdGVyU2VydmljZVdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgaWYgKCEoJ3NlcnZpY2VXb3JrZXInIGluIG5hdmlnYXRvcikpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVhZHlcbiAgICBhd2FpdCByZWdpc3RyYXRpb24udW5yZWdpc3RlcigpXG4gICAgY29uc29sZS5sb2coJ1tTV10gU2VydmljZSBXb3JrZXIgdW5yZWdpc3RlcmVkJylcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbU1ddIFNlcnZpY2UgV29ya2VyIHVucmVnaXN0cmF0aW9uIGZhaWxlZDonLCBlcnJvcilcbiAgfVxufVxuXG4vKipcbiAqIENsZWFyIGFsbCBjYWNoZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGNsZWFyU2VydmljZVdvcmtlckNhY2hlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhd2FpdCBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWFkeVxuICAgIGlmIChyZWdpc3RyYXRpb24uYWN0aXZlKSB7XG4gICAgICByZWdpc3RyYXRpb24uYWN0aXZlLnBvc3RNZXNzYWdlKHsgdHlwZTogJ0NMRUFSX0NBQ0hFJyB9KVxuICAgICAgY29uc29sZS5sb2coJ1tTV10gQ2FjaGUgY2xlYXJlZCcpXG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1tTV10gRmFpbGVkIHRvIGNsZWFyIGNhY2hlOicsIGVycm9yKVxuICB9XG59XG5cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20vY2xpZW50J1xuaW1wb3J0IHsgUXVlcnlDbGllbnRQcm92aWRlciB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSdcbmltcG9ydCB7IFJlYWN0UXVlcnlEZXZ0b29scyB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeS1kZXZ0b29scydcbmltcG9ydCB7IEFwcFJvdXRlciB9IGZyb20gJy4vcm91dGVyJ1xuaW1wb3J0IHsgcXVlcnlDbGllbnQsIHNldHVwT25saW5lRGV0ZWN0aW9uIH0gZnJvbSAnLi9saWIvcXVlcnlDbGllbnQnXG5pbXBvcnQgeyByZWdpc3RlclNlcnZpY2VXb3JrZXIgfSBmcm9tICcuL2xpYi9zZXJ2aWNlV29ya2VyJ1xuaW1wb3J0ICcuL3N0eWxlcy9pbmRleC5jc3MnXG5pbXBvcnQgJy4vc3R5bGVzL2ZvbnRzLmNzcydcblxuLy8gU2V0dXAgb25saW5lL29mZmxpbmUgZGV0ZWN0aW9uXG5zZXR1cE9ubGluZURldGVjdGlvbihcbiAgKCkgPT4ge1xuICAgIC8vIFdoZW4gY29taW5nIGJhY2sgb25saW5lXG4gICAgY29uc29sZS5sb2coJ+KchSBWZXJiaW5kdW5nIHdpZWRlcmhlcmdlc3RlbGx0JylcbiAgfSxcbiAgKCkgPT4ge1xuICAgIC8vIFdoZW4gZ29pbmcgb2ZmbGluZVxuICAgIGNvbnNvbGUubG9nKCfimqDvuI8gT2ZmbGluZS1Nb2R1cyAtIFZlcndlbmRlIGdlc3BlaWNoZXJ0ZSBEYXRlbicpXG4gIH1cbilcblxuLy8gUmVnaXN0ZXIgc2VydmljZSB3b3JrZXIgZm9yIFBXQSBmdW5jdGlvbmFsaXR5XG5yZWdpc3RlclNlcnZpY2VXb3JrZXIoKVxuXG4vLyBFcnJvciBib3VuZGFyeSBmb3IgdGhlIGVudGlyZSBhcHBcbmNsYXNzIEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8XG4gIHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9LFxuICB7IGhhc0Vycm9yOiBib29sZWFuOyBlcnJvcj86IEVycm9yIH1cbj4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogeyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0pIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLnN0YXRlID0geyBoYXNFcnJvcjogZmFsc2UgfVxuICB9XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcjogRXJyb3IpIHtcbiAgICByZXR1cm4geyBoYXNFcnJvcjogdHJ1ZSwgZXJyb3IgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkQ2F0Y2goZXJyb3I6IEVycm9yLCBlcnJvckluZm86IFJlYWN0LkVycm9ySW5mbykge1xuICAgIGNvbnNvbGUuZXJyb3IoJ01FQyBQb3J0Zm9saW8gRXJyb3I6JywgZXJyb3IsIGVycm9ySW5mbylcbiAgICBcbiAgICAvLyBJbiBwcm9kdWN0aW9uLCBzZW5kIHRvIGVycm9yIHJlcG9ydGluZyBzZXJ2aWNlXG4gICAgaWYgKGltcG9ydC5tZXRhLmVudi5QUk9EKSB7XG4gICAgICAvLyBUT0RPOiBTZW5kIHRvIFNlbnRyeSBvciBzaW1pbGFyXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmhhc0Vycm9yKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgcC04XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtNnhsIG1iLTRcIj7wn5i1PC9kaXY+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0yXCI+XG4gICAgICAgICAgICAgIE9vcHMhIEV0d2FzIGlzdCBzY2hpZWZnZWxhdWZlblxuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnkgbWItNFwiPlxuICAgICAgICAgICAgICBEaWUgQW53ZW5kdW5nIGtvbm50ZSBuaWNodCBnZWxhZGVuIHdlcmRlbi5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJiZy1tZWMtcHJpbWFyeSB0ZXh0LXdoaXRlIHB4LTQgcHktMiByb3VuZGVkLW1lYyBob3ZlcjpiZy1tZWMtcHJpbWFyeS1kYXJrIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgU2VpdGUgbmV1IGxhZGVuXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW5cbiAgfVxufVxuXG4vLyBNb3VudCB0aGUgYXBwXG5SZWFjdERPTS5jcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290JykhKS5yZW5kZXIoXG4gIDxSZWFjdC5TdHJpY3RNb2RlPlxuICAgIDxFcnJvckJvdW5kYXJ5PlxuICAgICAgPFF1ZXJ5Q2xpZW50UHJvdmlkZXIgY2xpZW50PXtxdWVyeUNsaWVudH0+XG4gICAgICAgIDxBcHBSb3V0ZXIgLz5cbiAgICAgICAgey8qIERldiB0b29scyBvbmx5IGluIGRldmVsb3BtZW50ICovfVxuICAgICAgICB7aW1wb3J0Lm1ldGEuZW52LkRFViAmJiA8UmVhY3RRdWVyeURldnRvb2xzIGluaXRpYWxJc09wZW49e2ZhbHNlfSAvPn1cbiAgICAgIDwvUXVlcnlDbGllbnRQcm92aWRlcj
251145cbiAgICA8L0Vycm9yQm91bmRhcnk+XG4gIDwvUmVhY3QuU3RyaWN0TW9kZT5cbilcbiJdLCJuYW1lcyI6WyJsIiwibiIsInAiLCJxIiwiciIsInYiLCJ6IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJHIiwiSCIsIkkiLCJLIiwiTCIsIk0iLCJrIiwiZiIsIm0iLCJOIiwiTyIsImEiLCJQIiwiUSIsIlIiLCJTIiwiVCIsImIiLCJVIiwiViIsIlciLCJYIiwicmVhY3RNb2R1bGUiLCJyZXF1aXJlJCQwIiwianN4UnVudGltZU1vZHVsZSIsInciLCJ4IiwidCIsInUiLCJ5IiwiRiIsIkoiLCJzY2hlZHVsZXJNb2R1bGUiLCJyZXF1aXJlJCQxIiwiZCIsImUiLCJnIiwiaCIsImMiLCJyZWFjdERvbU1vZHVsZSIsIm5vb3AiLCJfYSIsImNsaWVudCIsIl9jbGVhbnVwIiwiX3NldHVwIiwiZ2V0RGVmYXVsdFN0YXRlIiwiX2NsaWVudCIsIl9yZXRyeWVyIiwiZGlzcGF0Y2hfZm4iLCJfbXV0YXRpb25DYWNoZSIsIl9kZWZhdWx0T3B0aW9ucyIsIl9iIiwiUmVhY3QuY3JlYXRlQ29udGV4dCIsInF1ZXJ5Q2xpZW50IiwiUmVhY3QudXNlQ29udGV4dCIsIlJlYWN0LnVzZUVmZmVjdCIsImpzeCIsIlJlYWN0LnVzZVN0YXRlIiwiUmVhY3QudXNlU3luY0V4dGVybmFsU3RvcmUiLCJSZWFjdC51c2VDYWxsYmFjayIsIl9fdHlwZUVycm9yIiwiX19hY2Nlc3NDaGVjayIsIl9fcHJpdmF0ZUdldCIsIl9fcHJpdmF0ZUFkZCIsImlkIiwicm91dGVyIiwicmYiLCJjYiIsIm5hdmlnYXRvciIsIlJlYWN0Mi51c2VDb250ZXh0IiwidXNlTG9jYXRpb24iLCJSZWFjdDIudXNlTGF5b3V0RWZmZWN0IiwiUmVhY3QyLnVzZVJlZiIsIlJlYWN0Mi51c2VDYWxsYmFjayIsIlJlYWN0Mi5jcmVhdGVDb250ZXh0IiwiUmVhY3QyLnVzZU1lbW8iLCJSZWFjdDIuRnJhZ21lbnQiLCJSZWFjdDIuY3JlYXRlRWxlbWVudCIsIlJlYWN0Mi5Db21wb25lbnQiLCJSZWFjdDMuY3JlYXRlRWxlbWVudCIsIlJlYWN0My51c2VTdGF0ZSIsIlJlYWN0My51c2VSZWYiLCJSZWFjdDMudXNlQ2FsbGJhY2siLCJSZWFjdDMuc3RhcnRUcmFuc2l0aW9uIiwiUmVhY3QzLnVzZUxheW91dEVmZmVjdCIsIlJlYWN0My51c2VFZmZlY3QiLCJSZWFjdDMudXNlTWVtbyIsIlJlYWN0My5GcmFnbWVudCIsIlJlYWN0My5tZW1vIiwiUmVhY3Q4LnVzZUNvbnRleHQiLCJSZWFjdDguY3JlYXRlQ29udGV4dCIsIlJlYWN0OC51c2VTdGF0ZSIsIlJlYWN0OC51c2VSZWYiLCJSZWFjdDgudXNlRWZmZWN0IiwiUmVhY3Q4LnVzZU1lbW8iLCJSZWFjdDguY3JlYXRlRWxlbWVudCIsIm0yIiwiUmVhY3Q4LkZyYWdtZW50IiwiUmVhY3QxMC5mb3J3YXJkUmVmIiwiUmVhY3QxMC51c2VDb250ZXh0IiwiUmVhY3QxMC5jcmVhdGVFbGVtZW50IiwiUmVhY3QxMC5GcmFnbWVudCIsIlJlYWN0MTAudXNlQ2FsbGJhY2siLCJSZWFjdC5jcmVhdGVFbGVtZW50IiwiUmVhY3RET00uZmx1c2hTeW5jIiwiaW5pdGlhbFN0YXRlIiwiX192aXRlX2ltcG9ydF9tZXRhX2Vudl9fIiwiY3JlYXRlU3RvcmUiLCJSZWFjdCIsImlzIiwib2JqZWN0SXMiLCJ1c2VFZmZlY3QiLCJ1c2VEZWJ1Z1ZhbHVlIiwic2hpbSIsInNoaW1Nb2R1bGUiLCJ3aXRoU2VsZWN0b3JNb2R1bGUiLCJSZWFjdEV4cG9ydHMiLCJzdG9yZSIsIl9lIiwic3RvcmUyIiwiaHlkcmF0ZSIsIl9hMiIsImlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlIiwiZXJyb3IiLCJqc3hzIiwiZm9yd2FyZFJlZiIsImNyZWF0ZUVsZW1lbnQiLCJNYXAiLCJDb21wb25lbnQiLCJlbGVtZW50IiwidXNlU3RhdGUiLCJ1c2VSZWYiLCJzaXplQ2xhc3NlcyIsIkdyaWQzWDMiLCJjcmVhdGVQb3J0YWwiLCJGcmFnbWVudCIsImNlbnRlckRhdGEiLCJFcnJvckJvdW5kYXJ5IiwiY2xhc3NHcm91cCIsInVzZU1lbW8iLCJSb3V0ZXJQcm92aWRlciIsIlJlYWN0RE9NIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU2EsSUFBSUEsTUFBRSxPQUFPLElBQUksZUFBZSxHQUFFQyxNQUFFLE9BQU8sSUFBSSxjQUFjLEdBQUVDLE1BQUUsT0FBTyxJQUFJLGdCQUFnQixHQUFFQyxNQUFFLE9BQU8sSUFBSSxtQkFBbUIsR0FBRUMsTUFBRSxPQUFPLElBQUksZ0JBQWdCLEdBQUUsSUFBRSxPQUFPLElBQUksZ0JBQWdCLEdBQUUsSUFBRSxPQUFPLElBQUksZUFBZSxHQUFFQyxNQUFFLE9BQU8sSUFBSSxtQkFBbUIsR0FBRSxJQUFFLE9BQU8sSUFBSSxnQkFBZ0IsR0FBRSxJQUFFLE9BQU8sSUFBSSxZQUFZLEdBQUUsSUFBRSxPQUFPLElBQUksWUFBWSxHQUFFQyxNQUFFLE9BQU87QUFBUyxTQUFTQyxJQUFFLEdBQUU7QUFBQyxNQUFHLFNBQU8sS0FBRyxhQUFXLE9BQU8sRUFBRSxRQUFPO0FBQUssTUFBRUQsT0FBRyxFQUFFQSxHQUFDLEtBQUcsRUFBRSxZQUFZO0FBQUUsU0FBTSxlQUFhLE9BQU8sSUFBRSxJQUFFO0FBQUk7QUFDMWUsSUFBSUUsTUFBRSxFQUFDLFdBQVUsV0FBVTtBQUFDLFNBQU07QUFBRSxHQUFFLG9CQUFtQixXQUFVO0FBQUEsR0FBRyxxQkFBb0IsV0FBVTtBQUFBLEdBQUcsaUJBQWdCLFdBQVU7QUFBQSxFQUFFLEdBQUVDLE1BQUUsT0FBTyxRQUFPQyxNQUFFO0FBQUcsU0FBU0MsSUFBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLE9BQUssUUFBTTtBQUFFLE9BQUssVUFBUTtBQUFFLE9BQUssT0FBS0Q7QUFBRSxPQUFLLFVBQVEsS0FBR0Y7QUFBQztBQUFDRyxJQUFFLFVBQVUsbUJBQWlCLENBQUE7QUFDblFBLElBQUUsVUFBV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SxJQUFNLEtBQUs7QUFBQSxJQUFNLEtBQUs7QUFBQSxJQUFNLEtBQUs7QUFBQSxJQUFPLEtBQUs7QUFBQSxJQUFPLEtBQUs7QUFBQSxJQUFPLEtBQUs7QUFBQSxJQUFRLEtBQUs7QUFBUSxhQUFPLElBQUU7QUFBQSxJQUFRLEtBQUs7QUFBQSxJQUFRLEtBQUs7QUFBQSxJQUFRLEtBQUs7QUFBQSxJQUFTLEtBQUs7QUFBQSxJQUFTLEtBQUs7QUFBUyxhQUFPLElBQUU7QUFBQSxJQUFVLEtBQUs7QUFBVSxhQUFPO0FBQUEsSUFBVSxLQUFLO0FBQVUsYUFBTztBQUFBLElBQVUsS0FBSztBQUFVLGFBQU87QUFBQSxJQUFVLEtBQUs7QUFBVyxhQUFPO0FBQUEsSUFDemdCO0FBQVEsYUFBTztBQUFBLEVBQUM7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFhLE1BQUcsTUFBSSxFQUFFLFFBQU87QUFBRSxNQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsZ0JBQWVBLEtBQUUsRUFBRSxhQUFZLElBQUUsSUFBRTtBQUFVLE1BQUcsTUFBSSxHQUFFO0FBQUMsUUFBSSxJQUFFLElBQUUsQ0FBQztBQUFFLFVBQUksSUFBRSxJQUFFLEdBQUcsQ0FBQyxLQUFHQSxNQUFHLEdBQUUsTUFBSUEsT0FBSSxJQUFFLEdBQUdBLEVBQUM7QUFBQSxFQUFHLE1BQU0sS0FBRSxJQUFFLENBQUMsR0FBRSxNQUFJLElBQUUsSUFBRSxHQUFHLENBQUMsSUFBRSxNQUFJQSxPQUFJLElBQUUsR0FBR0EsRUFBQztBQUFHLE1BQUcsTUFBSSxFQUFFLFFBQU87QUFBRSxNQUFHLE1BQUksS0FBRyxNQUFJLEtBQUcsT0FBSyxJQUFFLE9BQUssSUFBRSxJQUFFLENBQUMsR0FBRUEsS0FBRSxJQUFFLENBQUMsR0FBRSxLQUFHQSxNQUFHLE9BQUssS0FBRyxPQUFLQSxLQUFFLFVBQVUsUUFBTztBQUFFLFNBQUssSUFBRSxPQUFLLEtBQUcsSUFBRTtBQUFJLE1BQUUsRUFBRTtBQUFlLE1BQUcsTUFBSSxFQ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FHLENBQUMsR0FBRSxTQUFPLEVBQUUsS0FBRTtBQUFBLFdBQWEsSUFBRSxFQUFFLEtBQUksT0FBSyxHQUFFO0FBQUMsUUFBRSxHQUFHLENBQUM7QUFBRSxRQUFHLFNBQU8sRUFBRSxRQUFPO0FBQUUsUUFBRTtBQUFBLEVBQUksV0FBUyxNQUFJLEdBQUU7QUFBQyxRQUFHLEVBQUUsVUFBVSxRQUFRLGNBQWMsYUFBYSxRQUFPLE1BQUksRUFBRSxNQUFJLEVBQUUsVUFBVSxnQkFBYztBQUFLLFFBQUU7QUFBQSxFQUFJLE1BQU0sT0FBSSxNQUFJLElBQUU7QUFBTSxPQUFHO0FBQUUsU0FBTztBQUFJO0FBQzdTLFNBQVMsR0FBRyxHQUFFO0FBQUMsVUFBTyxHQUFDO0FBQUEsSUFBRSxLQUFLO0FBQUEsSUFBUyxLQUFLO0FBQUEsSUFBUSxLQUFLO0FBQUEsSUFBUSxLQUFLO0FBQUEsSUFBYyxLQUFLO0FBQUEsSUFBTyxLQUFLO0FBQUEsSUFBTSxLQUFLO0FBQUEsSUFBVyxLQUFLO0FBQUEsSUFBVyxLQUFLO0FBQUEsSUFBVSxLQUFLO0FBQUEsSUFBWSxLQUFLO0FBQUEsSUFBTyxLQUFLO0FBQUEsSUFBVSxLQUFLO0FBQUEsSUFBVyxLQUFLO0FBQUEsSUFBUSxLQUFLO0FBQUEsSUFBVSxLQUFLO0FBQUEsSUFBVSxLQUFLO0FBQUEsSUFBVyxLQUFLO0FBQUEsSUFBUSxLQUFLO0FBQUEsSUFBWSxLQUFLO0FBQUEsSUFBVSxLQUFLO0FBQUEsSUFBUSxLQUFLO0FBQUEsSUFBUSxLQUFLO0FBQUEsSUFBTyxLQUFLO0FBQUEsSUFBZ0IsS0FBSztBQUFBLElBQWMsS0FBSztBQUFBLElBQVksS0FBSztBQUFBLElBQWEsS0FBSztBQUFBLElBQVEsS0FBSztBQUFBLElBQVMsS0FBSztBQUFBLElBQVMsS0FBSztBQUFBLElBQVMsS0FBSztBQUFBLElBQWMsS0FBSztBQUFBLElBQVcsS0FBSztBQUFBLElBQWEsS0FBSztBQUFBLElBQWUsS0FBSztBQUFBLElBQVMsS0FBSztBQUFBLElBQWtCLEtBQUs7QUFBQSxJQUFZLEtBQU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UFFLEdBQUUsS0FBRyxFQUFFLENBQUEsR0FBRyxJQUFHLEVBQUMsTUFBSyxFQUFDLENBQUMsR0FBRSxLQUFHLEdBQUcsRUFBRSxHQUFFLEtBQUc7QUFBQSxFQUFDLEtBQUk7QUFBQSxFQUN4ZixVQUFTO0FBQUEsRUFBSSxNQUFLO0FBQUEsRUFBWSxJQUFHO0FBQUEsRUFBVSxPQUFNO0FBQUEsRUFBYSxNQUFLO0FBQUEsRUFBWSxLQUFJO0FBQUEsRUFBUyxLQUFJO0FBQUEsRUFBSyxNQUFLO0FBQUEsRUFBYyxNQUFLO0FBQUEsRUFBYyxRQUFPO0FBQUEsRUFBYSxpQkFBZ0I7QUFBYyxHQUFFLEtBQUc7QUFBQSxFQUFDLEdBQUU7QUFBQSxFQUFZLEdBQUU7QUFBQSxFQUFNLElBQUc7QUFBQSxFQUFRLElBQUc7QUFBQSxFQUFRLElBQUc7QUFBQSxFQUFRLElBQUc7QUFBQSxFQUFVLElBQUc7QUFBQSxFQUFNLElBQUc7QUFBQSxFQUFRLElBQUc7QUFBQSxFQUFXLElBQUc7QUFBQSxFQUFTLElBQUc7QUFBQSxFQUFJLElBQUc7QUFBQSxFQUFTLElBQUc7QUFBQSxFQUFXLElBQUc7QUFBQSxFQUFNLElBQUc7QUFBQSxFQUFPLElBQUc7QUFBQSxFQUFZLElBQUc7QUFBQSxFQUFVLElBQUc7QUFBQSxFQUFhLElBQUc7QUFBQSxFQUFZLElBQUc7QUFBQSxFQUFTLElBQUc7QUFBQSxFQUFTLEtBQUk7QUFBQSxFQUFLLEtBQUk7QUFBQSxFQUFLLEtBQUk7QUFBQSxFQUFLLEtBQUk7QUFBQSxFQUFLLEtBQUk7QUFBQSxFQUFLLEtBQUk7QUFBQSxFQUFLLEtBQUk7QUFBQSxFQUN0ZixLQUFJO0FBQUEsRUFBSyxLQUFJO0FBQUEsRUFBSyxLQUFJO0FBQUEsRUFBTSxLQUFJO0FBQUEsRUFBTSxLQUFJO0FBQUEsRUFBTSxLQUFJO0FBQUEsRUFBVSxLQUFJO0FBQUEsRUFBYSxLQUFJO0FBQU0sR0FBRSxLQUFHLEVBQUMsS0FBSSxVQUFTLFNBQVEsV0FBVSxNQUFLLFdBQVUsT0FBTSxXQUFVO0FBQUUsU0FBUyxHQUFHLEdBQ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UM7QUFBQyxhQUFPO0FBQUEsSUFBSyxLQUFLO0FBQWlCLGFBQU8sTUFBSSxTQUFPLEVBQUUsU0FBTyxPQUFLLEVBQUU7QUFBQSxJQUFLO0FBQVEsYUFBTztBQUFBLEVBQUk7QUFBQztBQUN2WSxJQUFJLEtBQUcsRUFBQyxPQUFNLE1BQUcsTUFBSyxNQUFHLFVBQVMsTUFBRyxrQkFBaUIsTUFBRyxPQUFNLE1BQUcsT0FBTSxNQUFHLFFBQU8sTUFBRyxVQUFTLE1BQUcsT0FBTSxNQUFHLFFBQU8sTUFBRyxLQUFJLE1BQUcsTUFBSyxNQUFHLE1BQUssTUFBRyxLQUFJLE1BQUcsTUFBSyxLQUFFO0FBQUUsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFJLElBQUUsS0FBRyxFQUFFLFlBQVUsRUFBRSxTQUFTLFlBQVc7QUFBRyxTQUFNLFlBQVUsSUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksSUFBRSxlQUFhLElBQUUsT0FBRztBQUFFO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxLQUFHLENBQUM7QUFBRSxNQUFFLEdBQUcsR0FBRSxVQUFVO0FBQUUsTUFBRSxFQUFFLFdBQVMsSUFBRSxJQUFJLEdBQUcsWUFBVyxVQUFTLE1BQUssR0FBRSxDQUFDLEdBQUUsRUFBRSxLQUFLLEVBQUMsT0FBTSxHQUFFLFdBQVUsRUFBQyxDQUFDO0FBQUU7QUFBQyxJQUFJLEtBQUcsTUFBSyxLQUFHO0FBQUssU0FBUyxHQUFHLEdBQUU7QUFBQyxLQUFHLEdBQUUsQ0FBQztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFJLElBQUUsR0FBRyxDQUFDO0FBQUUsTUFBRyxHQUFHLENBQUMsRUFBRSxRQUFPO0FBQUM7QUFDcGUsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUcsYUFBVyxFQUFFLFFBQU87QUFBQztBQUFDLElBQUksS0FBRztBQUFHLElBQUcsSUFBRztBQUFDLE1BQUk7QUFBRyxNQUFHLElBQUc7QUFBQyxRQUFJLEtBQUcsYUFBWTtBQUFTLFFBQUcsQ0FBQyxJQUFHO0FBQ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UFBRyxLQUFHQSxJQUFFO0FBQUMsUUFBSSxJQUFFLElBQUUsSUFBRTtBQUFFLElBQUFBLE1BQUcsS0FBRyxLQUFHLEtBQUcsR0FBRyxTQUFTLEVBQUU7QUFBRSxVQUFJO0FBQUUsU0FBRztBQUFFLFNBQUcsS0FBRyxLQUFHLEdBQUcsQ0FBQyxJQUFFLElBQUUsS0FBRyxJQUFFO0FBQUUsU0FBR0EsS0FBRTtBQUFBLEVBQUMsTUFBTSxNQUFHLEtBQUdBLEtBQUUsS0FBRyxJQUFFLEdBQUUsS0FBRztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxXQUFPLEVBQUUsV0FBUyxHQUFHLEdBQUUsQ0FBQyxHQUFFLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBRTtBQUFDLFNBQVMsR0FBRyxHQUFFO0FBQUMsU0FBSyxNQUFJLEtBQUksTUFBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxJQUFFLE1BQUssS0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxJQUFFO0FBQUssU0FBSyxNQUFJLEtBQUksTUFBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxJQUFFLE1BQUssS0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxJQUFFLE1BQUssS0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxJQUFFO0FBQUk7QUFBQyxJQUFJLEtBQUcsTUFBSyxLQUFHLE1BQUssSUFBRSxPQUFHLEtBQUc7QUFDamUsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUksSUFBRSxHQUFHLEdBQUUsTUFBSyxNQUFLLENBQUM7QUFBRSxJQUFFLGNBQVk7QUFBVSxJQUFFLFlBQVU7QUFBRSxJQUFFLFNBQU87QUFBRSxNQUFFLEVBQUU7QUFBVSxXQUFPLEtBQUcsRUFBRSxZQUFVLENBQUMsQ0FBQyxHQUFFLEVBQUUsU0FBTyxNQUFJLEVBQUUsS0FBSyxDQUFDO0FBQUM7QUFDeEosU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLFVBQU8sRUFBRTtJQUFLLEtBQUs7QUFBRSxVQUFJLElBQUUsRUFBRTtBQUFLLFVBQUUsTUFBSSxFQUFFLFlBQVUsRUFBRSxZQUFXLE1BQUssRUFBRSxTQUFTLFlBQVcsSUFBRyxPQUFLO0FBQUUsYUFBTyxTQUFPLEtBQUcsRUFBRSxZQUFVLEdBQUUsS0FBRyxHQUFFLEtBQUcsR0FBRyxFQUFFLFVBQVUsR0FBRSxRQUFJO0FBQUEsSUFBRyxLQUFLO0FBQUUsYUFBTyxJQUFFLE9BQUssRUFBRSxnQkFBYyxNQUFJLEVBQUUsV0FBUyxPQUFLLEdBQUUsU0FBTyxLQUFHLEVBQUUsWUFBVSxHQUFFLEtBQUcsR0FBRSxLQUFHLE1BQUssUUFBSTtBQUFBLElBQUcsS0FBSztBQUFHLGFBQU8sSUFBRSxNQUFJLEVBQUUsV0FBUyxPQUFLLEdBQUUsU0FBTyxLQUFHLElBQUUsU0FBTyxLQUFHLEVBQUMsSUFBRyxJQUFHLFVBQVMsR0FBRSxJQUFFLE1BQUssRUFBRSxnQkFBYyxFQUFDLFlBQVcsR0FBRSxhQUFZLEdBQUUsV0FBVSxXQUFVLEdBQUUsSUFBRSxHQUFHLElBQUcsTUFBSyxNQUFLLENBQUMsR0FBRSxFQUFFLFlBQVUsR0FBRSxFQUFFLFNBQU8sR0FBRSxFQUFFLFFBQU0sR0FBRSxLQUFHLEdBQUUsS0FDbGYsTUFBSyxRQUFJO0FBQUEsSUFBRztBQUFRLGFBQU07QUFBQSxFQUFFO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRTtBQUFDLFNBQU8sT0FBSyxFQUFFLE9BQUssTUFBSSxPQUFLLEVBQUUsUUFBTTtBQUFJO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFHLEdBQUU7QUFBQyxRQUFJLElBQUU7QUFBRyxRQUFHLEdBQUU7QUFBQyxVQUFJLElBQUU7QUFBRSxVQUFHLENBQUMsR0FBRyxHQUFFLENBQUMsR0FBRTtBQUFDLFlBQUcsR0FBRyxDQUFDLEVBQUUsT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUUsWUFBRSxHQUFHLEVBQUUsV0FBVztBQUFFLFlBQUksSUFBRTtBQUFHLGFBQUcsR0FBRyxHQUFFLENBQUMsSUFBRSxHQUFHLEdBQUUsQ0FBQyxLQ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NBQVMsS0FBSTtBQUFDLElBQUUsRUFBRTtBQUFFLElBQUUsRUFBRTtBQUFFLElBQUUsRUFBRTtBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxLQUFHLEdBQUcsT0FBTztBQUFFLE1BQUksSUFBRSxHQUFHLEdBQUcsT0FBTztBQUFFLE1BQUksSUFBRSxHQUFHLEdBQUUsRUFBRSxJQUFJO0FBQUUsUUFBSSxNQUFJLEVBQUUsSUFBRyxDQUFDLEdBQUUsRUFBRSxJQUFHLENBQUM7QUFBRTtBQUFDLFNBQVMsR0FBRyxHQUFFO0FBQUMsS0FBRyxZQUFVLE1BQUksRUFBRSxFQUFFLEdBQUUsRUFBRSxFQUFFO0FBQUU7QUFBQyxJQUFJLElBQUUsR0FBRyxDQUFDO0FBQ3paLFNBQVMsR0FBRyxHQUFFO0FBQUMsV0FBUSxJQUFFLEdBQUUsU0FBTyxLQUFHO0FBQUMsUUFBRyxPQUFLLEVBQUUsS0FBSTtBQUFDLFVBQUksSUFBRSxFQUFFO0FBQWMsVUFBRyxTQUFPLE1BQUksSUFBRSxFQUFFLFlBQVcsU0FBTyxLQUFHLFNBQU8sRUFBRSxRQUFNLFNBQU8sRUFBRSxNQUFNLFFBQU87QUFBQSxJQUFDLFdBQVMsT0FBSyxFQUFFLE9BQUssV0FBUyxFQUFFLGNBQWMsYUFBWTtBQUFDLFVBQUcsT0FBSyxFQUFFLFFBQU0sS0FBSyxRQUFPO0FBQUEsSUFBQyxXQUFTLFNBQU8sRUFBRSxPQUFNO0FBQUMsUUFBRSxNQUFNLFNBQU87QUFBRSxVQUFFLEVBQUU7QUFBTTtBQUFBLElBQVE7QUFBQyxRQUFHLE1BQUksRUFBRTtBQUFNLFdBQUssU0FBTyxFQUFFLFdBQVM7QUFBQyxVQUFHLFNBQU8sRUFBRSxVQUFRLEVBQUUsV0FBUyxFQUFFLFFBQU87QUFBSyxVQUFFLEVBQUU7QUFBQSxJQUFNO0FBQUMsTUFBRSxRQUFRLFNBQU8sRUFBRTtBQUFPLFFBQUUsRUFBRTtBQUFBLEVBQU87QUFBQyxTQUFPO0FBQUk7QUFBQyxJQUFJLEtBQUcsQ0FBQTtBQUNyYyxTQUFTLEtBQUk7QUFBQyxXQUFRLElBQUUsR0FBRSxJQUFFLEdBQU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yxXQUFHLEdBQUcsQ0FBQyxHQUFFLElBQUUsRUFBRTtBQUFBLFdBQWE7QUFBRyxRQUFJLElBQUU7QUFBQSxFQUFDLFNBQU9BLElBQUU7QUFBQyxRQUFFLCtCQUE2QkEsR0FBRSxVQUFRLE9BQUtBLEdBQUU7QUFBQSxFQUFLO0FBQUMsU0FBTSxFQUFDLE9BQU0sR0FBRSxRQUFPLEdBQUUsT0FBTSxHQUFFLFFBQU8sS0FBSTtBQUFDO0FBQzFkLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLFNBQU0sRUFBQyxPQUFNLEdBQUUsUUFBTyxNQUFLLE9BQU0sUUFBTSxJQUFFLElBQUUsTUFBSyxRQUFPLFFBQU0sSUFBRSxJQUFFLEtBQUk7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFHO0FBQUMsWUFBUSxNQUFNLEVBQUUsS0FBSztBQUFBLEVBQUMsU0FBTyxHQUFFO0FBQUMsZUFBVyxXQUFVO0FBQUMsWUFBTTtBQUFBLElBQUUsQ0FBQztBQUFBLEVBQUM7QUFBQztBQUFDLElBQUksS0FBRyxlQUFhLE9BQU8sVUFBUSxVQUFRO0FBQUksU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRSxHQUFHLElBQUcsQ0FBQztBQUFFLElBQUUsTUFBSTtBQUFFLElBQUUsVUFBUSxFQUFDLFNBQVEsS0FBSTtBQUFFLE1BQUksSUFBRSxFQUFFO0FBQU0sSUFBRSxXQUFTLFdBQVU7QUFBQyxXQUFLLEtBQUcsTUFBRyxLQUFHO0FBQUcsT0FBRyxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQUUsU0FBTztBQUFDO0FBQ3JXLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUUsR0FBRyxJQUFHLENBQUM7QUFBRSxJQUFFLE1BQUk7QUFBRSxNQUFJLElBQUUsRUFBRSxLQUFLO0FBQXlCLE1BQUcsZUFBYSxPQUFPLEdBQUU7QUFBQyxRQUFJLElBQUUsRUFBRTtBQUFNLE1BQUUsVUFBUSxXQUFVO0FBQUMsYUFBTyxFQUFFLENBQUM7QUFBQSxJQUFDO0FBQUUsTUFBRSxXQUFTLFdBQVU7QUFBQyxTQUFHLEdBQUUsQ0FBQztBQUFBLElBQUM7QUFBQSxFQUFDO0FBQUMsTUFBSUEsS0FBRSxFQUFFO0FBQVUsV0FBT0EsTUFBRyxlQUFhLE9BQU9BLEdBQUUsc0JBQW9CLEVBQUUsV0FBUyxXQUFVO0FBQUMsT0FBRyxHQUFFLENBQUM7QUFBRSxtQkFBYSxPQUFPLE1BQUksU0FBTyxLQUFHLEtBQUcsb0JBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFFLEdBQUcsSUFBSSxJQUFJO0FBQUcsUUFBSStCLEtBQUUsRUFBRTtBQUFNLFNBQUssa0JBQWtCLEVBQUUsT0FBTSxFQUFDLGdCQUFlLFNBQU9BLEtBQUVBLEtBQUUsR0FBRSxDQUFDO0FBQUEsRUFBQztBQUFHLFNBQU87QUFBQztBQUNuYixTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFVLE1BQUcsU0FBTyxHQUFFO0FBQUMsUUFBRSxFQUFFLFlBQVUsSUFBSTtBQUFHLFFBQUksSUFBRSxvQkFBSTtBQUFJLE1BQUUsSUFBSSxHQUFFLENBQUM7QUFBQSxFQUFDLE1BQU0sS0FBRSxFQUFFLElBQUksQ0FBQyxHQUFFLFdBQVMsTUFBSSxJQUFFLG9CQUFJLE9BQUksRUFBRSxJQUFJLEdBQUUsQ0FBQztBQUFHLElBQUUsSUFBSSxDQUFDLE1BQUksRUFBRSxJQUFJLENBQUMsR0FBRSxJQUFFLEdBQUcsS0FBSyxNQUFLLEdBQUUsR0FBRSxDQUFDLEdBQUUsRUFBRSxLQUFLLEdBQUUsQ0FBQztBQUFFO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxLQUFFO0FBQUMsUUFBSTtBQUFFLFFBQUcsSUFBRSxPQUFLLEVBQUUsSUFBSSxLQUFFLEVBQUUsZUFBYyxJQUFFLFNBQU8sSUFBRSxTQUFPLEVBQUUsYUFBVyxPQUFHLFFBQUc7QUFBRyxRQUFHLEVBQUUsUUFBTztBQUFFLFFBQUUsRUFBRTtBQUFBLEVBQU0sU0FBTyxTQUFPO0FBQUcsU0FBTztBQUFJO0FBQ2hXLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFHLE9BQUssRUFBRSxPQUFLLEdBQUcsUUFBTyxNQUFJLElBQUUsRUFBRSxTQUFPLFNBQU8sRUFBRSxTQUFPLEtBQUksRUFBRSxTQUFPLFFBQU8sRUFBRSxTQUFPLFFBQU8sTUFBSSxFQUFFLFFBQU0sU0FBTyxFQUFFLFlBQVUsRUFBRSxNQUFJLE1BQUksSUFBRSxHQUFHLElBQUcsQ0FBQyxHQUFFLEVBQUUsTUFBSSxHQUFFLEdBQUcsR0FBRSxHQUFFLENBQUMsS0FBSSxFQUFFLFNBQU8sSUFBRztBQUFFLElBQUUsU0FBTztBQUFNLElBQUUsUUFBTTtBQUFFLFNBQU87QUFBQztBQUFDLElBQUksS0FBRyxHQUFHLG1CQUFrQixLQUFHO0FBQUcsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxJQUFFLFFBQU0sU0FBTyxJQUFFLEdBQUcsR0FBRSxNQUFLLEdBQUUsQ0FBQyxJQUFFLEdBQUcsR0FBRSxFQUFFLE9BQU0sR0FBRSxDQUFDO0FBQUM7QUFDblYsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQU
25114FFLEdBQUUsR0FBRTtBQUFDLE1BQUUsRUFBRTtBQUFPLE1BQUkvQixLQUFFLEVBQUU7QUFBSSxLQUFHLEdBQUUsQ0FBQztBQUFFLE1BQUUsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFQSxJQUFFLENBQUM7QUFBRSxNQUFFLEdBQUU7QUFBRyxNQUFHLFNBQU8sS0FBRyxDQUFDLEdBQUcsUUFBTyxFQUFFLGNBQVksRUFBRSxhQUFZLEVBQUUsU0FBTyxPQUFNLEVBQUUsU0FBTyxDQUFDLEdBQUUsR0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFLE9BQUcsS0FBRyxHQUFHLENBQUM7QUFBRSxJQUFFLFNBQU87QUFBRSxLQUFHLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxTQUFPLEVBQUU7QUFBSztBQUN6TixTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRyxTQUFPLEdBQUU7QUFBQyxRQUFJQSxLQUFFLEVBQUU7QUFBSyxRQUFHLGVBQWEsT0FBT0EsTUFBRyxDQUFDLEdBQUdBLEVBQUMsS0FBRyxXQUFTQSxHQUFFLGdCQUFjLFNBQU8sRUFBRSxXQUFTLFdBQVMsRUFBRSxhQUFhLFFBQU8sRUFBRSxNQUFJLElBQUcsRUFBRSxPQUFLQSxJQUFFLEdBQUcsR0FBRSxHQUFFQSxJQUFFLEdBQUUsQ0FBQztBQUFFLFFBQUUsR0FBRyxFQUFFLE1BQUssTUFBSyxHQUFFLEdBQUUsRUFBRSxNQUFLLENBQUM7QUFBRSxNQUFFLE1BQUksRUFBRTtBQUFJLE1BQUUsU0FBTztBQUFFLFdBQU8sRUFBRSxRQUFNO0FBQUEsRUFBQztBQUFDLEVBQUFBLEtBQUUsRUFBRTtBQUFNLE1BQUcsT0FBSyxFQUFFLFFBQU0sSUFBRztBQUFDLFFBQUksSUFBRUEsR0FBRTtBQUFjLFFBQUUsRUFBRTtBQUFRLFFBQUUsU0FBTyxJQUFFLElBQUU7QUFBRyxRQUFHLEVBQUUsR0FBRSxDQUFDLEtBQUcsRUFBRSxRQUFNLEVBQUUsSUFBSSxRQUFPLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQUMsSUFBRSxTQUFPO0FBQUUsTUFBRSxHQUFHQSxJQUFFLENBQUM7QUFBRSxJQUFFLE1BQUksRUFBRTtBQUFJLElBQUUsU0FBTztBQUFFLFNBQU8sRUFBRSxRQUFNO0FBQUM7QUFDMWIsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUcsU0FBTyxHQUFFO0FBQUMsUUFBSUEsS0FBRSxFQUFFO0FBQWMsUUFBRyxHQUFHQSxJQUFFLENBQUMsS0FBRyxFQUFFLFFBQU0sRUFBRSxJQUFJLEtBQUcsS0FBRyxPQUFHLEVBQUUsZUFBYSxJQUFFQSxJQUFFLE9BQUssRUFBRSxRQUFNLEdBQUcsUUFBSyxFQUFFLFFBQU0sWUFBVSxLQUFHO0FBQUEsUUFBUyxRQUFPLEVBQUUsUUFBTSxFQUFFLE9BQU0sR0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFBLEVBQUM7QUFBQyxTQUFPLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUM7QUFDeE4sU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFLEVBQUUsY0FBYSxJQUFFLEVBQUUsVUFBU0EsS0FBRSxTQUFPLElBQUUsRUFBRSxnQkFBYztBQUFLLE1BQUcsYUFBVyxFQUFFLEtBQUssS0FBRyxPQUFLLEVBQUUsT0FBSyxHQUFHLEdBQUUsZ0JBQWMsRUFBQyxXQUFVLEdBQUUsV0FBVSxNQUFLLGFBQVksS0FBSSxHQUFFLEVBQUUsSUFBRyxFQUFFLEdBQUUsTUFBSTtBQUFBLE9BQU07QUFBQyxRQUFHLE9BQUssSUFBRSxZQUFZLFFBQU8sSUFBRSxTQUFPQSxLQUFFQSxHQUFFLFlBQVUsSUFBRSxHQUFFLEVBQUUsUUFBTSxFQUFFLGFBQVcsWUFBVyxFQUFFLGdCQUFjLEVBQUMsV0FBVSxHQUFFLFdBQVUsTUFBSyxhQUFZLEtBQUksR0FBRSxFQUFFLGNBQVksTUFBSyxFQUFFLElBQUcsRUFBRSxHQUFFLE1BQUksR0FBRTtBQUFLLE1BQUUsZ0JBQWMsRUFBQyxXQUFVLEdBQUUsV0FBVSxNQUFLLGFBQVksS0FBSTtBQUFFLFFBQUUsU0FBT0EsS0FBRUEsR0FBRSxZQUFVO0FBQUUsTUFBRSxJQUFHLEVBQUU7QUFBRSxVQUFJO0FBQUEsRUFBQztBQUFBLE1BQU0sVUFDdGZBLE1BQUcsSUFBRUEsR0FBRSxZQUFVLEdBQUUsRUFBRSxnQkFBYyxRQUFNLElBQUUsR0FBRSxFQUFFLElBQUcsRUFBRSxHQUFFLE1BQUk7QUFBRSxLQUFHLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxTQUFPLEVBQUU7QUFBSztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFJLE1BQUcsU0FBTyxLQUFHLFNBQU8sS0FBRyxTQUFPLEtBQUcsRUFBRSxRQUFNLEVBQUUsR0FBRSxTQUFPLEtBQUksRUFBRSxTQUFPO0FBQU87QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBSUEsS0FBRSxHQUFHLENBQUMsSUFBRSxLQUFHLEVBQUU7QUFBUSxFQUFBQSxLQUFFLEdBQUcsR0FBRUEsRUFBQztBQUFFLEtBQUcsR0FBRSxDQUFDO0FBQUUsTUFBRSxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUVBLElBQUUsQ0FBQztBQUFFLE1BQUUsR0FBRTtBQUFHLE1BQUcsU0FBTyxLQUFHLENBQUMsR0FBRyxRQUFPLEVBQUUsY0FBWSxFQUFFLGFBQVksRUFBRSxTQUFPLE9BQU0sRUFBRSxTQUFPLENBQUMsR0FBRSxHQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUUsT0FBRyxLQUFHLEdBQUcsQ0FBQztBQUFFLElBQUUsU0FBTztBQUFFLEtBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLFNBQU8sRUFBRTtBQUFLO0FBQ2xhLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFHLEdBQUcsQ0FBQyxHQUFFO0FBQUMsUUFBSUEsS0FBRTtBQUFHLE9BQUcsQ0FBQztBQUFBLEVBQUMsTUFBTSxDQUFBQSxLQUFFO0FBQUcsS0FBRyxHQUFFLENBQUM7QUFBRSxNQUFHLFNBQU8sRUFBRSxVQUFVL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UFRLE1BQUcsT0FBSyxJQUFFLEdBQUcsS0FBRSxJQUFFLElBQUUsR0FBRSxFQUFFLFNBQU87QUFBQSxPQUFRO0FBQUMsUUFBRyxTQUFPLEtBQUcsT0FBSyxFQUFFLFFBQU0sS0FBSyxHQUFFLE1BQUksSUFBRSxFQUFFLE9BQU0sU0FBTyxLQUFHO0FBQUMsVUFBRyxPQUFLLEVBQUUsSUFBSSxVQUFPLEVBQUUsaUJBQWUsR0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFBLGVBQVUsT0FBSyxFQUFFLElBQUksSUFBRyxHQUFFLEdBQUUsQ0FBQztBQUFBLGVBQVUsU0FBTyxFQUFFLE9BQU07QUFBQyxVQUFFLE1BQU0sU0FBTztBQUFFLFlBQUUsRUFBRTtBQUFNO0FBQUEsTUFBUTtBQUFDLFVBQUcsTUFBSSxFQUFFLE9BQU07QUFBRSxhQUFLLFNBQU8sRUFBRSxXQUFTO0FBQUMsWUFBRyxTQUFPLEVBQUUsVUFBUSxFQUFFLFdBQVMsRUFBRSxPQUFNO0FBQUUsWUFBRSxFQUFFO0FBQUEsTUFBTTtBQUFDLFFBQUUsUUFBUSxTQUFPLEVBQUU7QUFBTyxVQUFFLEVBQUU7QUFBQSxJQUFPO0FBQUMsU0FBRztBQUFBLEVBQUM7QUFBQyxJQUFFLEdBQUUsQ0FBQztBQUFFLE1BQUcsT0FBSyxFQUFFLE9BQUssR0FBRyxHQUFFLGdCQUMvZTtBQUFBLE1BQVUsU0FBTztJQUFHLEtBQUs7QUFBVyxVQUFFLEVBQUU7QUFBTSxXQUFJLElBQUUsTUFBSyxTQUFPLElBQUcsS0FBRSxFQUFFLFdBQVUsU0FBTyxLQUFHLFNBQU8sR0FBRyxDQUFDLE1BQUksSUFBRSxJQUFHLElBQUUsRUFBRTtBQUFRLFVBQUU7QUFBRSxlQUFPLEtBQUcsSUFBRSxFQUFFLE9BQU0sRUFBRSxRQUFNLFNBQU8sSUFBRSxFQUFFLFNBQVEsRUFBRSxVQUFRO0FBQU0sU0FBRyxHQUFFLE9BQUcsR0FBRSxHQUFFQSxFQUFDO0FBQUU7QUFBQSxJQUFNLEtBQUs7QUFBWSxVQUFFO0FBQUssVUFBRSxFQUFFO0FBQU0sV0FBSSxFQUFFLFFBQU0sTUFBSyxTQUFPLEtBQUc7QUFBQyxZQUFFLEVBQUU7QUFBVSxZQUFHLFNBQU8sS0FBRyxTQUFPLEdBQUcsQ0FBQyxHQUFFO0FBQUMsWUFBRSxRQUFNO0FBQUU7QUFBQSxRQUFLO0FBQUMsWUFBRSxFQUFFO0FBQVEsVUFBRSxVQUFRO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBQSxNQUFDO0FBQUMsU0FBRyxHQUFFLE1BQUcsR0FBRSxNQUFLQSxFQUFDO0FBQUU7QUFBQSxJQUFNLEtBQUs7QUFBVyxTQUFHLEdBQUUsT0FBRyxNQUFLLE1BQUssTUFBTTtBQUFFO0FBQUEsSUFBTTtBQUFRLFFBQUUsZ0JBQWM7QUFBQSxFQUFJO0FBQUMsU0FBTyxFQUFFO0FBQUs7QUFDN2QsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLFNBQUssRUFBRSxPQUFLLE1BQUksU0FBTyxNQUFJLEVBQUUsWUFBVSxNQUFLLEVBQUUsWUFBVSxNQUFLLEVBQUUsU0FBTztBQUFFO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsV0FBTyxNQUFJLEVBQUUsZUFBYSxFQUFFO0FBQWMsUUFBSSxFQUFFO0FBQU0sTUFBRyxPQUFLLElBQUUsRUFBRSxZQUFZLFFBQU87QUFBSyxNQUFHLFNBQU8sS0FBRyxFQUFFLFVBQVEsRUFBRSxNQUFNLE9BQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFFLE1BQUcsU0FBTyxFQUFFLE9BQU07QUFBQyxRQUFFLEVBQUU7QUFBTSxRQUFFLEdBQUcsR0FBRSxFQUFFLFlBQVk7QUFBRSxNQUFFLFFBQU07QUFBRSxTQUFJLEVBQUUsU0FBTyxHQUFFLFNBQU8sRUFBRSxVQUFTLEtBQUUsRUFBRSxTQUFRLElBQUUsRUFBRSxVQUFRLEdBQUcsR0FBRSxFQUFFLFlBQVksR0FBRSxFQUFFLFNBQU87QUFBRSxNQUFFLFVBQVE7QUFBQSxFQUFJO0FBQUMsU0FBTyxFQUFFO0FBQUs7QUFDOWEsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBTyxFQUFFLEtBQUc7QUFBQSxJQUFFLEtBQUs7QUFBRSxTQUFHLENBQUM7QUFBR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SxFQUFFLENBQUMsR0FBRSxHQUFFLEdBQUcsSUFBRSxFQUFFLE9BQU0sT0FBSyxJQUFFLFVBQVEsT0FBSyxJQUFFLFFBQU0sRUFBRSxRQUFNLElBQUUsU0FBTyxLQUFJLEtBQUc7QUFBQSxJQUFLLEtBQUs7QUFBRSxhQUFPLEdBQUcsQ0FBQyxHQUFFO0FBQUEsSUFBSyxLQUFLO0FBQUcsUUFBRSxDQUFDO0FBQUUsVUFBRSxFQUFFO0FBQWMsVUFBRyxTQUFPLEtBQUcsU0FBTyxFQUFFLFlBQVc7QUFBQyxZQUFHLFNBQU8sRUFBRSxVQUFVLE9BQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFFLFdBQUU7QUFBQSxNQUFFO0FBQUMsVUFBRSxFQUFFO0FBQU0sYUFBTyxJQUFFLFNBQU8sRUFBRSxRQUFNLElBQUUsU0FBTyxLQUFJLEtBQUc7QUFBQSxJQUFLLEtBQUs7QUFBRyxhQUFPLEVBQUUsQ0FBQyxHQUFFO0FBQUEsSUFBSyxLQUFLO0FBQUUsYUFBTyxHQUFFLEdBQUc7QUFBQSxJQUFLLEtBQUs7QUFBRyxhQUFPLEdBQUcsRUFBRSxLQUFLLFFBQVEsR0FBRTtBQUFBLElBQUssS0FBSztBQUFBLElBQUcsS0FBSztBQUFHLGFBQU8sR0FBRSxHQUM1Z0I7QUFBQSxJQUFLLEtBQUs7QUFBRyxhQUFPO0FBQUEsSUFBSztBQUFRLGFBQU87QUFBQSxFQUFJO0FBQUM7QUFBQyxJQUFJLEtBQUcsT0FBRyxJQUFFLE9BQUcsS0FBRyxlQUFhLE9BQU8sVUFBUSxVQUFRLEtBQUksSUFBRTtBQUFLLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFJLE1BQUcsU0FBTyxFQUFFLEtBQUcsZUFBYSxPQUFPLEVBQUUsS0FBRztBQUFDLE1BQUUsSUFBSTtBQUFBLEVBQUMsU0FBTyxHQUFFO0FBQUMsTUFBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLEVBQUM7QUFBQSxNQUFNLEdBQUUsVUFBUTtBQUFJO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRztBQUFDLE1BQUM7QUFBQSxFQ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UcsT0FBRTtBQUFHLE9BQUcsVUFBUUE7QUFBRSxRQUFFO0FBQUUsYUFBTyxJQUFFLElBQUUsS0FBRyxJQUFFLE1BQUssSUFBRSxHQUFFLElBQUU7QUFBQSxFQUFFO0FBQUMsTUFBRyxNQUFJLEdBQUU7QUFBQyxVQUFJLE1BQUksSUFBRSxHQUFHLENBQUMsR0FBRSxNQUFJLE1BQUksSUFBRSxHQUFFLElBQUUsR0FBRyxHQUFFLENBQUM7QUFBSSxRQUFHLE1BQUksRUFBRSxPQUFNLElBQUUsSUFBRyxHQUFHLEdBQUUsQ0FBQyxHQUFFLEdBQUcsR0FBRSxDQUFDLEdBQUUsR0FBRyxHQUFFLEVBQUMsQ0FBRSxHQUFFO0FBQUUsUUFBRyxNQUFJLEVBQUUsSUFBRyxHQUFFLENBQUM7QUFBQSxTQUNqZjtBQUFDLFVBQUUsRUFBRSxRQUFRO0FBQVUsVUFBRyxPQUFLLElBQUUsT0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFJLElBQUUsR0FBRyxHQUFFLENBQUMsR0FBRSxNQUFJLE1BQUlBLEtBQUUsR0FBRyxDQUFDLEdBQUUsTUFBSUEsT0FBSSxJQUFFQSxJQUFFLElBQUUsR0FBRyxHQUFFQSxFQUFDLEtBQUksTUFBSSxHQUFHLE9BQU0sSUFBRSxJQUFHLEdBQUcsR0FBRSxDQUFDLEdBQUUsR0FBRyxHQUFFLENBQUMsR0FBRSxHQUFHLEdBQUUsRUFBQyxDQUFFLEdBQUU7QUFBRSxRQUFFLGVBQWE7QUFBRSxRQUFFLGdCQUFjO0FBQUUsY0FBTyxHQUFDO0FBQUEsUUFBRSxLQUFLO0FBQUEsUUFBRSxLQUFLO0FBQUUsZ0JBQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFBLFFBQUUsS0FBSztBQUFFLGFBQUcsR0FBRSxJQUFHLEVBQUU7QUFBRTtBQUFBLFFBQU0sS0FBSztBQUFFLGFBQUcsR0FBRSxDQUFDO0FBQUUsZUFBSSxJQUFFLGVBQWEsTUFBSSxJQUFFLEtBQUcsTUFBSSxFQUFDLEdBQUcsS0FBRyxJQUFHO0FBQUMsZ0JBQUcsTUFBSSxHQUFHLEdBQUUsQ0FBQyxFQUFFO0FBQU0sZ0JBQUUsRUFBRTtBQUFlLGlCQ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ztBQUFFLGtCQUFNO0FBQUEsVUFBQztBQUFDLGFBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLFFBQUM7QUFBQyxZQUFFLEVBQUU7QUFBQSxNQUFLO0FBQUMsYUFBTztBQUFBLElBQUUsS0FBSztBQUFFLGFBQU8sR0FBRyxDQUFDLEdBQUUsU0FBTyxLQUFHLEdBQUcsQ0FBQyxHQUFFLElBQUUsRUFBRSxNQUFLLElBQUUsRUFBRSxjQUFhQSxLQUFFLFNBQU8sSUFBRSxFQUFFLGdCQUFjLE1BQUssSUFBRSxFQUFFLFVBQVMsR0FBRyxHQUFFLENBQUMsSUFBRSxJQUFFLE9BQUssU0FBT0EsTUFBRyxHQUFHLEdBQUVBLEVBQUMsTUFBSSxFQUFFLFNBQU8sS0FDbmYsR0FBRyxHQUFFLENBQUMsR0FBRSxHQUFHLEdBQUUsR0FBRSxHQUFFLENBQUMsR0FBRSxFQUFFO0FBQUEsSUFBTSxLQUFLO0FBQUUsYUFBTyxTQUFPLEtBQUcsR0FBRyxDQUFDLEdBQUU7QUFBQSxJQUFLLEtBQUs7QUFBRyxhQUFPLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBQSxJQUFFLEtBQUs7QUFBRSxhQUFPLEdBQUcsR0FBRSxFQUFFLFVBQVUsYUFBYSxHQUFFLElBQUUsRUFBRSxjQUFhLFNBQU8sSUFBRSxFQUFFLFFBQU0sR0FBRyxHQUFFLE1BQUssR0FBRSxDQUFDLElBQUUsR0FBRyxHQUFFLEdBQUUsR0FBRSxDQUFDLEdBQUUsRUFBRTtBQUFBLElBQU0sS0FBSztBQUFHLGFBQU8sSUFBRSxFQUFFLE1BQUssSUFBRSxFQUFFLGNBQWEsSUFBRSxFQUFFLGdCQUFjLElBQUUsSUFBRSxHQUFHLEdBQUUsQ0FBQyxHQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsSUFBRSxLQUFLO0FBQUUsYUFBTyxHQUFHLEdBQUUsR0FBRSxFQUFFLGNBQWEsQ0FBQyxHQUFFLEVBQUU7QUFBQSxJQUFNLEtBQUs7QUFBRSxhQUFPLEdBQUcsR0FBRSxHQUFFLEVBQUUsYUFBYSxVQUFTLENBQUMsR0FBRSxFQUFFO0FBQUEsSUFBTSxLQUFLO0FBQUcsYUFBTyxHQUFHLEdBQUUsR0FBRSxFQUFFLGFBQWEsVUFBUyxDQUFDLEdBQUUsRUFBRTtBQUFBLElBQU0sS0FBSztBQUFHLFNBQUU7QUFBQyxZQUFFLEVBQUUsS0FBSztBQUFTLFlBQUUsRUFBRTtBQUFhLFFBQUFBLEtBQUUsRUFBRTtBQUNsZixZQUFFLEVBQUU7QUFBTSxVQUFFLElBQUcsRUFBRSxhQUFhO0FBQUUsVUFBRSxnQkFBYztBQUFFLFlBQUcsU0FBT0EsR0FBRSxLQUFHLEdBQUdBLEdBQUUsT0FBTSxDQUFDLEdBQUU7QUFBQyxjQUFHQSxHQUFFLGFBQVcsRUFBRSxZQUFVLENBQUMsR0FBRyxTQUFRO0FBQUMsZ0JBQUUsR0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFLGtCQUFNO0FBQUEsVUFBQztBQUFBLFFBQUMsTUFBTSxNQUFJQSxLQUFFLEVBQUUsT0FBTSxTQUFPQSxPQUFJQSxHQUFFLFNBQU8sSUFBRyxTQUFPQSxNQUFHO0FBQUMsY0FBSSxJQUFFQSxHQUFFO0FBQWEsY0FBRyxTQUFPLEdBQUU7QUFBQyxnQkFBRUEsR0FBRTtBQUFNLHFCQUFRRCxLQUFFLEVBQUUsY0FBYSxTQUFPQSxNQUFHO0FBQUMsa0JBQUdBLEdBQUUsWUFBVSxHQUFFO0FBQUMsb0JBQUcsTUFBSUMsR0FBRSxLQUFJO0FBQUMsa0JBQUFELEtBQUUsR0FBRyxJQUFHLElBQUUsQ0FBQyxDQUFDO0FBQUUsa0JBQUFBLEdBQUUsTUFBSTtBQUFFLHNCQUFJbEIsS0FBRW1CLEdBQUU7QUFBWSxzQkFBRyxTQUFPbkIsSUFBRTtBQUFDLG9CQUFBQSxLQUFFQSxHQUFFO0FBQU8sd0JBQUlvQixLQUFFcEIsR0FBRTtBQUFRLDZCQUFPb0IsS0FBRUYsR0FBRSxPQUFLQSxNQUFHQSxHQUFFLE9BQUtFLEdBQUUsTUFBS0EsR0FBRSxPQUFLRjtBQUFHLG9CQUFBbEIsR0FBRSxVQUFRa0I7QUFBQSxrQkFBQztBQUFBLGdCQUFDO0FBQUMsZ0JBQUFDLEdBQUUsU0FBTztBQUFFLGdCQUFBRCxLQUFFQyxHQUFFO0FBQVUseUJBQU9ELE9BQUlBLEdBQUUsU0FBTztBQUFHO0FBQUEsa0JBQUdDLEdBQUU7QUFBQSxrQkFDbGY7QUFBQSxrQkFBRTtBQUFBLGdCQUFDO0FBQUUsa0JBQUUsU0FBTztBQUFFO0FBQUEsY0FBSztBQUFDLGNBQUFELEtBQUVBLEdBQUU7QUFBQSxZQUFJO0FBQUEsVUFBQyxXQUFTLE9BQUtDLEdBQUUsSUFBSSxLQUFFQSxHQUFFLFNBQU8sRUFBRSxPQUFLLE9BQUtBLEdBQUU7QUFBQSxtQkFBYyxPQUFLQSxHQUFFLEtBQUk7QUFBQyxnQkFBRUEsR0FBRTtBQUFPLGdCQUFHLFNBQU8sRUFBRSxPQUFNLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFBRSxjQUFFLFNBQU87QUFBRSxnQkFBRSxFQUFFO0FBQVUscUJBQU8sTUFBSSxFQUFFLFNBQU87QUFBRyxlQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUUsZ0JBQUVBLEdBQUU7QUFBQSxVQUFPLE1BQU0sS0FBRUEsR0FBRTtBQUFNLGNBQUcsU0FBTyxFQUFFLEdBQUUsU0FBT0E7QUFBQSxjQUFPLE1BQUksSUFBRUEsSUFBRSxTQUFPLEtBQUc7QUFBQyxnQkFBRyxNQUFJLEdBQUU7QUFBQyxrQkFBRTtBQUFLO0FBQUEsWUFBSztBQUFDLFlBQUFBLEtBQUUsRUFBRTtBQUFRLGdCQUFHLFNBQU9BLElBQUU7QUFBQyxjQUFBQSxHQUFFLFNBQU8sRUFBRTtBQUFPLGtCQUFFQTtBQUFFO0FBQUEsWUFBSztBQUFDLGdCQUFFLEVBQUU7QUFBQSxVQUFNO0FBQUMsVUFBQUEsS0FBRTtBQUFBLFFBQUM7QUFBQyxXQUFHLEdBQUUsR0FBRSxFQUFFLFVBQVMsQ0FBQztBQUFFLFlBQUUsRUFBRTtBQUFBLE1BQUs7QUFBQyxhQUFPO0FBQUEsSUFBRSxLQUFLO0FBQUUsYUFBTyxJQUFFLEVBQUUsTUFBSyxJQUFFLEVBQUUsYUFBYSxVQUFTLEdBQUcsR0FBRSxDQUFDLEdBQUUsSUFBRSxHQU
25114FHLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsU0FBTyxHQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQyxHQUNyZixFQUFFO0FBQUEsSUFBTSxLQUFLO0FBQUcsYUFBTyxJQUFFLEVBQUUsTUFBSyxJQUFFLEdBQUcsR0FBRSxFQUFFLFlBQVksR0FBRSxJQUFFLEdBQUcsRUFBRSxNQUFLLENBQUMsR0FBRSxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLElBQUUsS0FBSztBQUFHLGFBQU8sR0FBRyxHQUFFLEdBQUUsRUFBRSxNQUFLLEVBQUUsY0FBYSxDQUFDO0FBQUEsSUFBRSxLQUFLO0FBQUcsYUFBTyxJQUFFLEVBQUUsTUFBSyxJQUFFLEVBQUUsY0FBYSxJQUFFLEVBQUUsZ0JBQWMsSUFBRSxJQUFFLEdBQUcsR0FBRSxDQUFDLEdBQUUsR0FBRyxHQUFFLENBQUMsR0FBRSxFQUFFLE1BQUksR0FBRSxHQUFHLENBQUMsS0FBRyxJQUFFLE1BQUcsR0FBRyxDQUFDLEtBQUcsSUFBRSxPQUFHLEdBQUcsR0FBRSxDQUFDLEdBQUUsR0FBRyxHQUFFLEdBQUUsQ0FBQyxHQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQyxHQUFFLEdBQUcsTUFBSyxHQUFFLEdBQUUsTUFBRyxHQUFFLENBQUM7QUFBQSxJQUFFLEtBQUs7QUFBRyxhQUFPLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBQSxJQUFFLEtBQUs7QUFBRyxhQUFPLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQUMsUUFBTSxNQUFNLEVBQUUsS0FBSSxFQUFFLEdBQUcsQ0FBQztBQUFFO0FBQUUsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLFNBQU8sR0FBRyxHQUFFLENBQUM7QUFBQztBQUNqWixTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLE9BQUssTUFBSTtBQUFFLE9BQUssTUFBSTtBQUFFLE9BQUssVUFBUSxLQUFLLFFBQU0sS0FBSyxTQUFPLEtBQUssWUFBVSxLQUFLLE9BQUssS0FBSyxjQUFZO0FBQUssT0FBSyxRQUFNO0FBQUUsT0FBSyxNQUFJO0FBQUssT0FBSyxlQUFhO0FBQUUsT0FBSyxlQUFhLEtBQUssZ0JBQWMsS0FBSyxjQUFZLEtBQUssZ0JBQWM7QUFBSyxPQUFLLE9BQUs7QUFBRSxPQUFLLGVBQWEsS0FBSyxRQUFNO0FBQUUsT0FBSyxZQUFVO0FBQUssT0FBSyxhQUFXLEtBQUssUUFBTTtBQUFFLE9BQUssWUFBVTtBQUFJO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxTQUFPLElBQUksR0FBRyxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUUsRUFBRTtBQUFVLFNBQU0sRUFBRSxDQUFDLEtBQUcsQ0FBQyxFQUFFO0FBQWlCO0FBQ3BkLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBRyxlQUFhLE9BQU8sRUFBRSxRQUFPLEdBQUcsQ0FBQyxJQUFFLElBQUU7QUFBRSxNQUFHLFdBQVMsS0FBRyxTQUFPLEdBQUU7QUFBQyxRQUFFLEVBQUU7QUFBUyxRQUFHLE1BQUksR0FBRyxRQUFPO0FBQUcsUUFBRyxNQUFJLEdBQUcsUUFBTztBQUFBLEVBQUU7QUFBQyxTQUFPO0FBQUM7QUFDL0ksU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUksSUFBRSxFQUFFO0FBQVUsV0FBTyxLQUFHLElBQUUsR0FBRyxFQUFFLEtBQUksR0FBRSxFQUFFLEtBQUksRUFBRSxJQUFJLEdBQUUsRUFBRSxjQUFZLEVBQUUsYUFBWSxFQUFFLE9BQUssRUFBRSxNQUFLLEVBQUUsWUFBVSxFQUFFLFdBQVUsRUFBRSxZQUFVLEdBQUUsRUFBRSxZQUFVLE1BQUksRUFBRSxlQUFhLEdBQUUsRUFBRSxPQUFLLEVBQUUsTUFBSyxFQUFFLFFBQU0sR0FBRSxFQUFFLGVBQWEsR0FBRSxFQUFFLFlBQVU7QUFBTSxJQUFFLFFBQU0sRUFBRSxRQUFNO0FBQVMsSUFBRSxhQUFXLEVBQUU7QUFBVyxJQUFFLFFBQU0sRUFBRTtBQUFNLElBQUUsUUFBTSxFQUFFO0FBQU0sSUFBRSxnQkFBYyxFQUFFO0FBQWMsSUFBRSxnQkFBYyxFQUFFO0FBQWMsSUFBRSxjQUFZLEVBQUU7QUFBWSxNQUFFLEVBQUU7QUFBYSxJQUFFLGVBQWEsU0FBTyxJQUFFLE9BQUssRUFBQyxPQUFNLEVBQUUsT0FBTSxjQUFhLEVBQUUsYUFBWTtBQUMzZixJQUFFLFVBQVEsRUFBRTtBQUFRLElBQUUsUUFBTSxFQUFFO0FBQU0sSUFBRSxNQUFJLEVBQUU7QUFBSSxTQUFPO0FBQUM7QUFDeEQsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRUEsSUFBRTtBQUFDLE1BQUksSUFBRTtBQUFFLE1BQUU7QUFBRSxNQUFHLGVBQWEsT0FBTyxFQUFFLElBQUcsQ0FBQyxNQUFJLElBQUU7QUFBQSxXQUFXLGFBQVcsT0FBTyxFQUFFLEtBQUU7QUFBQSxNQUFPLEdBQUUsU0FBTyxHQUFDO0FBQUEsSUFBRSxLQUFLO0FBQUcsYUFBTyxHQUFHLEVBQUUsVUFBUyxHQUFFQSxJQUFFLENBQUM7QUFBQSxJQUFFLEtBQUs7QUFBRyxVQUFFO0FBQUUsV0FBRztBQUFFO0FBQUEsSUFBTSxLQUFLO0FBQUcsYUFBTyxJQUFFLEdBQUcsSUFBRyxHQUFFLEdBQUUsSUFBRSxDQUFDLEdBQUUsRUFBRSxjQUFZLElBQUcsRUFBRSxRQUFNQSxJQUFFO0FBQUEsSUFBRSxLQUFLO0FBQUcsYUFBTyxJQUFFLEdBQUcsSUFBRyxHQUFFLEdBQUUsQ0FBQyxHQUFFLEVBQUUsY0FBWSxJQUFHLEVBQUUsUUFBTUEsSUFBRTtBQUFBLElBQUUsS0FBSztBQUFHLGFBQU8sSUFBRSxHQUFHLElBQUcsR0FBRSxHQUFFLENBQUMsR0FBRSxFQUFFLGNBQVksSUFBRyxFQUFFLFFBQU1BLElBQUU7QUFBQSxJQUFFLEtBQUs7QUFBRyxhQUFPLEdBQUcsR0FBRSxHQUFFQSxJQUFFLENBQUM7QUFBQSxJQUFFO0FBQVEsVUFBRyxhQUFXLE9BQU8sS0FBRyxTQUFPLEVBQUUsU0FBTyxFQUFFLFVBQVE7QUFBQSxRQUFFLEtBQUs7QUFBRyxjQUFFO0FBQUcsZ0JBQU07QUFBQSxRQUFFLEtBQUs7QUFBRyxjQUFFO0FBQUUsZ0JBQU07QUFBQSxRQUFFLEtBQUs7QUFBRyxjQUFFO0FBQ3BmLGdCQUFNO0FBQUEsUUFBRSxLQUFLO0FBQUcsY0FBRTtBQUFHLGdCQUFNO0FBQUEsUUFBRSxLQUFLO0FBQUcsY0FBRTtBQUFHLGNBQUU7QUFBSyxnQkFBTTtBQUFBLE1BQUM7QUFBQyxZQUFNLE1BQU0sRUFBRSxLQUFJLFFBQU0sSUFBRSxJQUFFLE9BQU8sR0FBRSxFQUFFLENBQUM7QUFBQSxFQUFFO0FBQUMsTUFBRSxHQUFHLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxJQUFFLGNBQVk7QUFBRSxJQUFFLE9BQUs7QUFBRSxJQUFFLFFBQU1BO0FBQUUsU0FBTztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQU
25114FFLEdBQUU7QUFBQyxNQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLElBQUUsUUFBTTtBQUFFLFNBQU87QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRSxHQUFHLElBQUcsR0FBRSxHQUFFLENBQUM7QUFBRSxJQUFFLGNBQVk7QUFBRyxJQUFFLFFBQU07QUFBRSxJQUFFLFlBQVUsRUFBQyxVQUFTLE1BQUU7QUFBRSxTQUFPO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFFLEdBQUcsR0FBRSxHQUFFLE1BQUssQ0FBQztBQUFFLElBQUUsUUFBTTtBQUFFLFNBQU87QUFBQztBQUM1VyxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFFLEdBQUcsR0FBRSxTQUFPLEVBQUUsV0FBUyxFQUFFLFdBQVMsQ0FBQSxHQUFHLEVBQUUsS0FBSSxDQUFDO0FBQUUsSUFBRSxRQUFNO0FBQUUsSUFBRSxZQUFVLEVBQUMsZUFBYyxFQUFFLGVBQWMsaUJBQWdCLE1BQUssZ0JBQWUsRUFBRSxlQUFjO0FBQUUsU0FBTztBQUFDO0FBQ3RMLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxPQUFLLE1BQUk7QUFBRSxPQUFLLGdCQUFjO0FBQUUsT0FBSyxlQUFhLEtBQUssWUFBVSxLQUFLLFVBQVEsS0FBSyxrQkFBZ0I7QUFBSyxPQUFLLGdCQUFjO0FBQUcsT0FBSyxlQUFhLEtBQUssaUJBQWUsS0FBSyxVQUFRO0FBQUssT0FBSyxtQkFBaUI7QUFBRSxPQUFLLGFBQVcsR0FBRyxDQUFDO0FBQUUsT0FBSyxrQkFBZ0IsR0FBRyxFQUFFO0FBQUUsT0FBSyxpQkFBZSxLQUFLLGdCQUFjLEtBQUssbUJBQWlCLEtBQUssZUFBYSxLQUFLLGNBQVksS0FBSyxpQkFBZSxLQUFLLGVBQWE7QUFBRSxPQUFLLGdCQUFjLEdBQUcsQ0FBQztBQUFFLE9BQUssbUJBQWlCO0FBQUUsT0FBSyxxQkFBbUI7QUFBRSxPQUFLLGtDQUMvZTtBQUFJO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRUEsSUFBRSxHQUFFLEdBQUVELElBQUU7QUFBQyxNQUFFLElBQUksR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFQSxFQUFDO0FBQUUsUUFBSSxLQUFHLElBQUUsR0FBRSxTQUFLQyxPQUFJLEtBQUcsTUFBSSxJQUFFO0FBQUUsRUFBQUEsS0FBRSxHQUFHLEdBQUUsTUFBSyxNQUFLLENBQUM7QUFBRSxJQUFFLFVBQVFBO0FBQUUsRUFBQUEsR0FBRSxZQUFVO0FBQUUsRUFBQUEsR0FBRSxnQkFBYyxFQUFDLFNBQVEsR0FBRSxjQUFhLEdBQUUsT0FBTSxNQUFLLGFBQVksTUFBSywyQkFBMEIsS0FBSTtBQUFFLEtBQUdBLEVBQUM7QUFBRSxTQUFPO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsSUFBRSxVQUFVLFVBQVEsV0FBUyxVQUFVLENBQUMsSUFBRSxVQUFVLENBQUMsSUFBRTtBQUFLLFNBQU0sRUFBQyxVQUFTLElBQUcsS0FBSSxRQUFNLElBQUUsT0FBSyxLQUFHLEdBQUUsVUFBUyxHQUFFLGVBQWMsR0FBRSxnQkFBZSxFQUFDO0FBQUM7QUFDcGEsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFHLENBQUMsRUFBRSxRQUFPO0FBQUcsTUFBRSxFQUFFO0FBQWdCLEtBQUU7QUFBQyxRQUFHLEdBQUcsQ0FBQyxNQUFJLEtBQUcsTUFBSSxFQUFFLElBQUksT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUUsUUFBSSxJQUFFO0FBQUUsT0FBRTtBQUFDLGNBQU8sRUFBRSxLQUFHO0FBQUEsUUFBRSxLQUFLO0FBQUUsY0FBRSxFQUFFLFVBQVU7QUFBUSxnQkFBTTtBQUFBLFFBQUUsS0FBSztBQUFFLGNBQUcsR0FBRyxFQUFFLElBQUksR0FBRTtBQUFDLGdCQUFFLEVBQUUsVUFBVTtBQUEwQyxrQkFBTTtBQUFBLFVBQUM7QUFBQSxNQUFDO0FBQUMsVUFBRSxFQUFFO0FBQUEsSUFBTSxTQUFPLFNBQU87QUFBRyxVQUFNLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFBQSxFQUFFO0FBQUMsTUFBRyxNQUFJLEVBQUUsS0FBSTtBQUFDLFFBQUksSUFBRSxFQUFFO0FBQUssUUFBRyxHQUFHLENBQUMsRUFBRSxRQUFPLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQUMsU0FBTztBQUFDO0FBQ3BXLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUVBLElBQUUsR0FBRSxHQUFFRCxJQUFFO0FBQUMsTUFBRSxHQUFHLEdBQUUsR0FBRSxNQUFHLEdBQUUsR0FBRUMsSUFBRSxHQUFFLEdBQUVELEVBQUM7QUFBRSxJQUFFLFVBQVEsR0FBRyxJQUFJO0FBQUUsTUFBRSxFQUFFO0FBQVEsTUFBRTtBQUFJLE1BQUUsR0FBRyxDQUFDO0FBQUUsRUFBQUMsS0FBRSxHQUFHLEdBQUUsQ0FBQztBQUFFLEVBQUFBLEdBQUUsV0FBUyxXQUFTLEtBQUcsU0FBTyxJQUFFLElBQUU7QUFBSyxLQUFHLEdBQUVBLElBQUUsQ0FBQztBQUFFLElBQUUsUUFBUSxRQUFNO0FBQUUsS0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFLEtBQUcsR0FBRSxDQUFDO0FBQUUsU0FBTztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRSxTQUFRQSxLQUFFLEVBQUMsR0FBRyxJQUFFLEdBQUcsQ0FBQztBQUFFLE1BQUUsR0FBRyxDQUFDO0FBQUUsV0FBTyxFQUFFLFVBQVEsRUFBRSxVQUFRLElBQUUsRUFBRSxpQkFBZTtBQUFFLE1BQUUsR0FBR0EsSUFBRSxDQUFDO0FBQUUsSUFBRSxVQUFRLEVBQUMsU0FBUSxFQUFDO0FBQUUsTUFBRSxXQUFTLElBQUUsT0FBSztBQUFFLFdBQU8sTUFBSSxFQUFFLFdBQVM7QUFBRyxNQUFFLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBRSxXQUFPLE1BQUksR0FBRyxHQUFFLEdBQUUsR0FBRUEsRUFBQyxHQUFFLEdBQUcsR0FBRSxHQ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ENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsWUFBWSxDQUFDO0FBQUEsUUFDWCxZQUFZLHdCQUF1QjtBQUFBLE1BQzNDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsWUFBWSxDQUFDO0FBQUEsUUFDWCxZQUFZLHdCQUF1QjtBQUFBLE1BQzNDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsY0FBYyxDQUFDO0FBQUEsUUFDYixNQUFNLENBQUMsU0FBUyxPQUFPLFVBQVUsWUFBWTtBQUFBLE1BQ3JELENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixNQUFNLENBQUMsVUFBVSxRQUFRO0FBQUEsTUFDakMsQ0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFLRCxhQUFhLENBQUM7QUFBQSxRQUNaLE1BQU0sQ0FBQyxRQUFRLEtBQUssS0FBSyxNQUFNO0FBQUEsTUFDdkMsQ0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFLRCxtQkFBbUIsQ0FBQztBQUFBLFFBQ2xCLE1BQU0sQ0FBQyxhQUFhLFdBQVc7QUFBQSxNQUN2QyxDQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUtELE9BQU8sQ0FBQztBQUFBLFFBQ04sT0FBTyxDQUFDLFFBQVEsUUFBUSxjQUFjO0FBQUEsTUFDOUMsQ0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFLRCxXQUFXLENBQUM7QUFBQSxRQUNWLGFBQWEsQ0FBQyxLQUFLLFFBQVEsT0FBTztBQUFBLE1BQzFDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsV0FBVyxDQUFDO0FBQUEsUUFDVixhQUFhLENBQUMsS0FBSyxNQUFNLE1BQU07QUFBQSxNQUN2QyxDQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUtELFlBQVksQ0FBQyxrQkFBa0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BSy9CLFFBQVEsQ0FBQztBQUFBLFFBQ1AsUUFBUSxDQUFDLFFBQVEsUUFBUSxPQUFPLE1BQU07QUFBQSxNQUM5QyxDQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUtELGVBQWUsQ0FBQztBQUFBLFFBQ2QsZUFBZSxDQUFDLFFBQVEsVUFBVSxZQU
25114FZLGFBQWEscUJBQXFCLGdCQUFnQjtBQUFBLE1BQ3hHLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BUUQsTUFBTSxDQUFDO0FBQUEsUUFDTCxNQUFNLENBQUMsUUFBUSxHQUFHLFdBQVUsQ0FBRTtBQUFBLE1BQ3RDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsWUFBWSxDQUFDO0FBQUEsUUFDWCxRQUFRLENBQUMsVUFBVSwyQkFBMkIsbUJBQW1CLGlCQUFpQjtBQUFBLE1BQzFGLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsUUFBUSxDQUFDO0FBQUEsUUFDUCxRQUFRLENBQUMsUUFBUSxHQUFHLFdBQVUsQ0FBRTtBQUFBLE1BQ3hDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BUUQsdUJBQXVCLENBQUM7QUFBQSxRQUN0Qix1QkFBdUIsQ0FBQyxRQUFRLE1BQU07QUFBQSxNQUM5QyxDQUFPO0FBQUEsSUFDUDtBQUFBLElBQ0ksd0JBQXdCO0FBQUEsTUFDdEIsVUFBVSxDQUFDLGNBQWMsWUFBWTtBQUFBLE1BQ3JDLFlBQVksQ0FBQyxnQkFBZ0IsY0FBYztBQUFBLE1BQzNDLE9BQU8sQ0FBQyxXQUFXLFdBQVcsU0FBUyxPQUFPLE9BQU8sU0FBUyxVQUFVLE1BQU07QUFBQSxNQUM5RSxXQUFXLENBQUMsU0FBUyxNQUFNO0FBQUEsTUFDM0IsV0FBVyxDQUFDLE9BQU8sUUFBUTtBQUFBLE1BQzNCLE1BQU0sQ0FBQyxTQUFTLFFBQVEsUUFBUTtBQUFBLE1BQ2hDLEtBQUssQ0FBQyxTQUFTLE9BQU87QUFBQSxNQUN0QixHQUFHLENBQUMsTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxJQUFJO0FBQUEsTUFDbEQsSUFBSSxDQUFDLE1BQU0sSUFBSTtBQUFBLE1BQ2YsSUFBSSxDQUFDLE1BQU0sSUFBSTtBQUFBLE1BQ2YsR0FBRyxDQUFDLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sSUFBSTtBQUFBLE1BQ2xELElBQUksQ0FBQyxNQUFNLElBQUk7QUFBQSxNQUNmLElBQUksQ0FBQyxNQUFNLElBQUk7QUFBQSxNQUNmLE1BQU0sQ0FBQyxLQUFLLEdBQUc7QUFBQSxNQUNmLGFBQWEsQ0FBQyxTQUFTO0FBQUEsTUFDdkIsY0FBYyxDQUFDLGVBQWUsb0JBQW9CLGNBQWMsZUFBZSxjQUFjO0FBQUEsTUFDN0YsZUFBZSxDQUFDLFlBQVk7QUFBQSxNQUM1QixvQkFBb0IsQ0FBQyxZQUFZO0FBQUEsTUFDakMsY0FBYyxDQUFDLFlBQVk7QUFBQSxNQUMzQixlQUFlLENBQUMsWUFBWTtBQUFBLE1BQzVCLGdCQUFnQixDQUFDLFlBQVk7QUFBQSxNQUM3QixjQUFjLENBQUMsV0FBVyxVQUFVO0FBQUEsTUFDcEMsU0FBUyxDQUFDLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsWUFBWTtBQUFBLE1BQ3RNLGFBQWEsQ0FBQyxjQUFjLFlBQVk7QUFBQSxNQUN4QyxhQUFhLENBQUMsY0FBYyxZQUFZO0FBQUEsTUFDeEMsYUFBYSxDQUFDLGNBQWMsWUFBWTtBQUFBLE1BQ3hDLGFBQWEsQ0FBQyxjQUFjLFlBQVk7QUFBQSxNQUN4QyxhQUFhLENBQUMsY0FBYyxZQUFZO0FBQUEsTUFDeEMsYUFBYSxDQUFDLGNBQWMsWUFBWTtBQUFBLE1BQ3hDLGtCQUFrQixDQUFDLG9CQUFvQixrQkFBa0I7QUFBQSxNQUN6RCxZQUFZLENBQUMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxZQUFZO0FBQUEsTUFDM0gsY0FBYyxDQUFDLGNBQWMsWUFBWTtBQUFBLE1BQ3pDLGNBQWMsQ0FBQyxjQUFjLFlBQVk7QUFBQSxNQUN6QyxnQkFBZ0IsQ0FBQyxrQkFBa0Isa0JBQWtCLGtCQUFrQixrQkFBa0Isa0JBQWtCLGtCQUFrQixrQkFBa0IsZ0JBQWdCO0FBQUEsTUFDL0osa0JBQWtCLENBQUMsa0JBQWtCLGdCQUFnQjtBQUFBLE1BQ3JELGtCQUFrQixDQUFDLGtCQUFrQixnQkFBZ0I7QUFBQSxNQUNyRCxXQUFXLENBQUMsZUFBZSxlQUFlLGdCQUFnQjtBQUFBLE1BQzFELGtCQUFrQixDQUFDLGFBQWEsZUFBZSxlQUFlLGFBQWE7QUFBQSxNQUMzRSxZQUFZLENBQUMsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxXQUFXO0FBQUEsTUFDbkgsYUFBYSxDQUFDLGFBQWEsV0FBVztBQUFBLE1BQ3RDLGFBQWEsQ0FBQyxhQUFhLFdBQVc7QUFBQSxNQUN0QyxZQUFZLENBQUMsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxXQUFXO0FBQUEsTUFDbkgsYUFBYSxDQUFDLGFBQWEsV0FBVztBQUFBLE1BQ3RDLGFBQWEsQ0FBQyxhQUFhLFdBQVc7QUFBQSxNQUN0QyxPQUFPLENBQUMsV0FBVyxXQUFXLFVBQVU7QUFBQSxNQUN4QyxXQUFXLENBQUMsT0FBTztBQUFBLE1BQ25CLFdBQVcsQ0FBQyxPQUFPO0FBQUEsTUFDbkIsWUFBWSxDQUFDLE9BQU87QUFBQSxJQUMxQjtBQUFBLElBQ0ksZ0NBQWdDO0FBQUEsTUFDOUIsYUFBYSxDQUFDLFNBQVM7QUFBQSxJQUM3QjtBQUFBLElBQ0kseUJBQXlCLENBQUMsS0FBSyxNQUFNLFNBQVMsWUFBWSxVQUFVLG1CQUFtQixRQUFRLGdCQUFnQixjQUFjLFVBQVUsZUFBZSxXQUFXO0FBQUEsRUFDcks7QUFDQTtBQXNEQSxNQUFNLFVBQXVCLG9DQUFvQixnQkFBZ0I7QUNyOUYxRCxTQUFTLE1BQU0sUUFBc0I7QUFDMUMsU0FBTyxRQUFRLEtBQUssTUFBTSxDQUFDO0FBQzdCO0FDRkEsTUFBTSxPQUFPc0csUUFBTSxXQUdqQixDQUFDLEVBQUUsV0FBVyxHQUFHLE1BQUEsR0FBUyxRQUMxQnBELGtDQUFBQTtBQUFBQSxFQUFDO0FBQUEsRUFBQTtBQUFBLElBQ0M7QUFBQSxJQUNBLFdBQVc7QUFBQSxNQUNUO0FBQUEsTUFDQTtBQUFBLElBQUE7QUFBQSxJQUVELEdBQUc7QUFBQSxFQUFBO0FBQ04sQ0FDRDtBQUNELEtBQUssY0FBYztBQUVuQixNQUFNLGFBQWFvRCxRQUFNLFdBR3ZCLENBQUMsRUFBRSxXQUFXLEdBQUcsTUFBQSxHQUFTLFFBQzFCcEQsa0NBQUFBO0FBQUFBLEVBQUM7QUFBQSxFQUFBO0FBQUEsSUFDQztBQUFBLElBQ0EsV0FBVyxHQUFHLGlDQUFpQyxTQUFTO0FBQUEsSUFDdkQsR0FBRztBQUFBLEVBQUE7QUFDTixDQUNEO0FBQ0QsV0FBVyxjQUFjO0FBRXpCLE1BQU0sWUFBWW9ELFFBQU0sV0FHdEIsQ0FBQyxFQUFFLFdBQVcsR0FBRyxNQUFBLEdBQVMsUUFDMUJwRCxrQ0FBQUE7QUFBQUEsRUFBQztBQUFBLEVBQUE7QUFBQSxJQUNDO0FBQUEsSUFDQSxXQUFXO0FBQUEsTUFDVDtBQUFBLE1BQ0E7QUFBQSxJQUFBO0FBQUEsSUFFRCxHQUFHO0FBQUEsRUFBQTtBQUNOLENBQ0Q7QUFDRCxVQUFVLGNBQWM7QUFFeEIsTUFBTSxrQkFBa0JvRCxRQUFNLFdBRzVCLENBQUMsRUFBRSxXQUFXLEdBQUcsTUFBQSxHQUFTLFFBQzFCcEQsa0NBQUFBO0FBQUFBLEVBQUM7QUFBQSxFQUFBO0FBQUEsSUFDQztBQUFBLElBQ0EsV0FBVyxHQUFHLGlDQUFpQyxTQUFTO0FBQUEsSUFDdkQsR0FBRztBQUFBLEVBQUE7QUFDTixDQUNEO0FBQ0QsZ0JBQWdCLGNBQWM7QUFFOUIsTUFBTSxjQUFjb0QsUUFBTSxXQUd4QixDQUFDLEVBQUUsV0FBVyxHQUFHLFNBQVMsOENBQ3pCLE9BQUEsRUFBSSxLQUFVLFdBQVcsR0FBRyxZQUFZLFNBQVMsR0FBSSxHQUFHLE9BQU8sQ0FDakU7QUFDRCxZQUFZLGNBQWM7QUFFMUIsTUFBTSxhQUFhQSxRQUFNLFdBR3ZCLENBQUMsRUFBRSxXQUFXLEdBQUcsTUFBQSxHQUFTLFFBQzFCcEQsa0NBQUFBO0FBQUFBLEVBQUM7QUFBQSxFQUFBO0FBQUEsSUFDQztBQUFBLElBQ0EsV0FBVyxHQUFHLDhCQUE4QixTQUFTO0FBQUEsSUFDcEQsR0FBRztBQUFBLEVBQUE7QUFDTixDQUNEO0FBQ0QsV0FBVyxjQUFjO0FDOURsQixNQUFNLFNBQWdDLENBQUM7QUFBQSxFQUM1QyxVQUFVO0FBQUEsRUFDVixPQUFPO0FBQUEsRUFDUCxZQUFZO0FBQUEsRUFDWixZQUFZO0FBQUEsRUFDWixVQUFVO0FBQUEsRUFDVjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxHQUFHO0FBQ0wsTUFBTTtBQUNKLFFBQU0sY0FBYztBQUFBO0FBQUEsSUFFbEI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsSUFFQTtBQUFBLEVBQUE7QUFHRixRQUFNLGlCQUFpQjtBQUFBO0FBQUEsSUFFckIsU0FBUztBQUFBLE1BQ1A7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQUE7QUFBQTtBQUFBLElBR0YsV0FBVztBQUFBLE1BQ1Q7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQUE7QUFBQTtBQUFBLElBR0YsUUFBUTtBQUFBLE1BQ047QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQUE7QUFBQTtBQUFBLElBR0YsT0FBTztBQUFBLE1BQ0w7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUFBO0FBQUEsRUFDRjtBQUdGLFFBQU00RSxlQUFjO0FBQUEsSUFDbEIsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLEVBQUE7QUFHTixRQUFNLGVBQWUsWUFBWSxXQUFXO0FBRTVDLFNBQ0U1RSxrQ0FBQUE7QUFBQUEsSUFBQztBQUFBLElBQUE7QUFBQSxNQUNDLFdBQVc7QUFBQSxRQUNUO0FBQUEsUUFDQSxlQUFlLE9BQU87QUFBQSxRQUN0QjRFLGFBQVksSUFBSTtBQUFBLFFBQ2hCO0FBQUEsUUFDQTtBQUFBLE1BQUE7QUFBQSxNQUVGLFVBQVUsWUFBWTtBQUFBLE1BQ3JCLEdBQUc7QUFBQSxNQUVILFVBQUEsVUFDQ1IsdUNBQUMsT0FBQSxFQUFJLFdBQVUsK0JBQ2IsVUFBQTtBQUFBLFFBQUFwRSxrQ0FBQUEsSUFBQyxPQUFBLEVBQUksV0FBVSxpRkFBQSxDQUFpRjtBQUFBLFFBQ2hHQSxrQ0FBQUEsSUFBQyxVQUFLLFVBQUEsV0FBQSxDQUFRO0FBQUEsTUFBQSxFQUFBLENBQ2hCLElBRUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSwrQkFDYixVQUFBO0FBQUEsUUFBQXBFLHNDQUFDLFVBQU0sVUFBUztBQUFBLFFBQ2YsYUFDQ0Esa0NBQUFBLElBQUMsWUFBQSxFQUFXLFdBQVUsZUFBQSxDQUFlO0FBQUEsTUFBQSxFQUFBLENBRXpDO0FBQUEsSUFBQTtBQUFBLEVBQUE7QUFJUjtBQUdPLE1BQU0sbUJBQTJELENBQUMsVUFDdkVBLGtDQUFBQSxJQUFDLFFBQUEsRUFBTyxTQUFRLFdBQVUsV0FBUyxNQUFFLEdBQUcsTUFBQSxDQUFPO0FBRzFDLE1BQU0scUJBQTZELENBQUMsVUFDekVBLGtDQUFBQSxJQUFDLFFBQUEsRUFBTyxTQUFRLGFBQVksV0FBUyxNQUFFLEdBQUcsTUFBQSxDQUFPO0FBRzVDLE1BQU0sa0JBQTBELENBQUMsVUFDdEVBLGtDQUFBQSxJQUFDLFFBQUEsRUFBTyxTQUFRLFVBQVMsV0FBUyxNQUFFLEdBQUcsTUFBQSxDQUFPO0FBR3pDLE1BQU0saUJBQXlELENBQUMsVUFDckVBLGtDQUFBQSxJQUFDLFFBQUEsRUFBTyxTQUFRLFNBQVEsV0FBUyxNQUFFLEdBQUcsTUFBQSxDQUFPO0FDNUcvQyxNQUFNLFFBQThCLENBQUM7QUFBQSxFQUNuQztBQUFBLEVBQ0EsVUFBVTtBQUFBLEVBQ1YsR0FBRztBQUNMLE1BQU07QUFDSixRQUFNLGNBQWM7QUFBQSxJQUNsQjtBQUFBLEVBQUE7QUFHRixRQUFNLGlCQUFpQjtBQUFBLElBQ3JCLFNBQVM7QU
25114FBQSxJQUNULFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLFNBQVM7QUFBQSxFQUFBO0FBR1gsU0FDRUEsa0NBQUFBO0FBQUFBLElBQUM7QUFBQSxJQUFBO0FBQUEsTUFDQyxXQUFXO0FBQUEsUUFDVDtBQUFBLFFBQ0EsZUFBZSxPQUFPO0FBQUEsUUFDdEI7QUFBQSxNQUFBO0FBQUEsTUFFRCxHQUFHO0FBQUEsSUFBQTtBQUFBLEVBQUE7QUFHVjtBQ2lCQSxNQUFNLGNBQXdCLE1BQU07QUFDbEMsUUFBTSxDQUFDLFlBQVksYUFBYSxJQUFJMEUsYUFBQUEsU0FBNEIsSUFBSTtBQUNwRSxRQUFNLENBQUMsV0FBVyxZQUFZLElBQUlBLGFBQUFBLFNBQVMsS0FBSztBQUNoRCxRQUFNLENBQUMsV0FBVyxZQUFZLElBQUlBLGFBQUFBLFNBQVMsS0FBSztBQUNoRCxRQUFNLENBQUMsZ0JBQWdCLGlCQUFpQixJQUFJQSxhQUFBQSxTQUE0QixJQUFJO0FBQzVFLFFBQU0sQ0FBQyxPQUFPLFFBQVEsSUFBSUEsYUFBQUEsU0FBd0IsSUFBSTtBQUd0RG5CLGVBQUFBLFVBQVUsTUFBTTtBQUNkLG1CQUFBO0FBQUEsRUFDRixHQUFHLENBQUEsQ0FBRTtBQUVMLFFBQU0saUJBQWlCLFlBQVk7QUFDakMsaUJBQWEsSUFBSTtBQUNqQixhQUFTLElBQUk7QUFFYixRQUFJO0FBQ0YsWUFBTSxXQUFXLE1BQU0sTUFBTSw4QkFBOEI7QUFDM0QsWUFBTSxPQUFPLE1BQU0sU0FBUyxLQUFBO0FBRTVCLFVBQUksS0FBSyxTQUFTO0FBQ2hCLHNCQUFjLElBQUk7QUFBQSxNQUNwQixPQUFPO0FBQ0wsaUJBQVMsS0FBSyxTQUFTLDRCQUE0QjtBQUFBLE1BQ3JEO0FBQUEsSUFDRixTQUFTLEtBQUs7QUFDWixlQUFTLG1DQUFtQztBQUM1QyxjQUFRLE1BQU0sOEJBQThCLEdBQUc7QUFBQSxJQUNqRCxVQUFBO0FBQ0UsbUJBQWEsS0FBSztBQUFBLElBQ3BCO0FBQUEsRUFDRjtBQUVBLFFBQU0seUJBQXlCLFlBQVk7QUFDekMsaUJBQWEsSUFBSTtBQUNqQixhQUFTLElBQUk7QUFDYixzQkFBa0IsSUFBSTtBQUV0QixRQUFJO0FBQ0YsWUFBTSxXQUFXLE1BQU0sTUFBTSxxQ0FBcUM7QUFBQSxRQUNoRSxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxRQUFBO0FBQUEsTUFDbEIsQ0FDRDtBQUVELFlBQU0sT0FBTyxNQUFNLFNBQVMsS0FBQTtBQUU1QixVQUFJLEtBQUssU0FBUztBQUNoQiwwQkFBa0IsSUFBSTtBQUV0QixjQUFNLGVBQUE7QUFBQSxNQUNSLE9BQU87QUFDTCxpQkFBUyxLQUFLLFNBQVMsYUFBYTtBQUFBLE1BQ3RDO0FBQUEsSUFDRixTQUFTLEtBQUs7QUFDWixlQUFTLDJCQUEyQjtBQUNwQyxjQUFRLE1BQU0sc0JBQXNCLEdBQUc7QUFBQSxJQUN6QyxVQUFBO0FBQ0UsbUJBQWEsS0FBSztBQUFBLElBQ3BCO0FBQUEsRUFDRjtBQUVBLFFBQU0sa0JBQWtCLFlBQVk7QUFDbEMsaUJBQWEsSUFBSTtBQUNqQixhQUFTLElBQUk7QUFDYixzQkFBa0IsSUFBSTtBQUV0QixRQUFJO0FBQ0YsWUFBTSxXQUFXLE1BQU0sTUFBTSxrREFBa0Q7QUFBQSxRQUM3RSxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxRQUFBO0FBQUEsTUFDbEIsQ0FDRDtBQUVELFlBQU0sT0FBTyxNQUFNLFNBQVMsS0FBQTtBQUU1QixVQUFJLEtBQUssU0FBUztBQUVoQixjQUFNLGtCQUE4QjtBQUFBLFVBQ2xDLFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLFdBQVcsS0FBSztBQUFBLFVBQ2hCLFNBQVMsS0FBSztBQUFBLFVBQ2QsV0FBVztBQUFBLFlBQ1QsU0FBUyxLQUFLLFNBQVMsb0JBQW9CO0FBQUEsWUFDM0MsS0FBSyxLQUFLLFNBQVMsV0FBVyxVQUFVO0FBQUEsWUFDeEMsU0FBUztBQUFBLFlBQ1QsU0FBUztBQUFBLFlBQ1QsUUFBUSxLQUFLLFNBQVMsV0FBVyxVQUFVLENBQUE7QUFBQSxVQUFDO0FBQUEsVUFFOUMsVUFBVTtBQUFBLFlBQ1IsU0FBUyxLQUFLLFNBQVMscUJBQXFCO0FBQUEsWUFDNUMsS0FBSyxLQUFLLFNBQVMsVUFBVSxVQUFVO0FBQUEsWUFDdkMsU0FBUztBQUFBLFlBQ1QsU0FBUztBQUFBLFlBQ1QsUUFBUSxLQUFLLFNBQVMsVUFBVSxVQUFVLENBQUE7QUFBQSxVQUFDO0FBQUEsVUFFN0MsT0FBTztBQUFBLFlBQ0wsWUFBWSxLQUFLLFNBQVMsT0FBTyxjQUFjO0FBQUEsWUFDL0MsUUFBUSxLQUFLLFNBQVMsT0FBTyxVQUFVLENBQUE7QUFBQSxVQUFDO0FBQUEsUUFDMUM7QUFHRiwwQkFBa0IsZUFBZTtBQUVqQyxjQUFNLGVBQUE7QUFBQSxNQUNSLE9BQU87QUFDTCxpQkFBUyxLQUFLLFNBQVMsS0FBSyxXQUFXLGtCQUFrQjtBQUFBLE1BQzNEO0FBQUEsSUFDRixTQUFTLEtBQUs7QUFDWixlQUFTLGdDQUFnQztBQUN6QyxjQUFRLE1BQU0sMkJBQTJCLEdBQUc7QUFBQSxJQUM5QyxVQUFBO0FBQ0UsbUJBQWEsS0FBSztBQUFBLElBQ3BCO0FBQUEsRUFDRjtBQUVBLFFBQU0sYUFBYSxDQUFDLGVBQThCO0FBQ2hELFFBQUksQ0FBQyxXQUFZLFFBQU87QUFDeEIsV0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFLGVBQWUsT0FBTztBQUFBLEVBQ3BEO0FBRUEsUUFBTSxpQkFBaUIsQ0FBQyxPQUFlO0FBQ3JDLFFBQUksS0FBSyxJQUFNLFFBQU8sR0FBRyxFQUFFO0FBQzNCLFFBQUksS0FBSyxJQUFPLFFBQU8sSUFBSSxLQUFLLEtBQU0sUUFBUSxDQUFDLENBQUM7QUFDaEQsV0FBTyxJQUFJLEtBQUssS0FBTyxRQUFRLENBQUMsQ0FBQztBQUFBLEVBQ25DO0FBRUEsTUFBSSxXQUFXO0FBQ2IsV0FDRXZELGtDQUFBQSxJQUFDLE1BQUEsRUFDQyxVQUFBb0Usa0NBQUFBLEtBQUMsYUFBQSxFQUFZLFdBQVUsd0NBQ3JCLFVBQUE7QUFBQSxNQUFBcEUsa0NBQUFBLElBQUMsU0FBQSxFQUFRLFdBQVUsdUJBQUEsQ0FBdUI7QUFBQSxNQUMxQ0Esa0NBQUFBLElBQUMsUUFBQSxFQUFLLFdBQVUsUUFBTyxVQUFBLHlCQUFBLENBQXNCO0FBQUEsSUFBQSxFQUFBLENBQy9DLEVBQUEsQ0FDRjtBQUFBLEVBRUo7QUFFQSxTQUNFb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsYUFDYixVQUFBO0FBQUEsSUFBQUEsdUNBQUMsTUFBQSxFQUNDLFVBQUE7QUFBQSxNQUFBcEUsc0NBQUMsWUFBQSxFQUNDLFVBQUFvRSxrQ0FBQUEsS0FBQyxXQUFBLEVBQVUsV0FBVSwyQkFDbkIsVUFBQTtBQUFBLFFBQUFwRSxrQ0FBQUEsSUFBQyxVQUFBLEVBQVMsV0FBVSxVQUFBLENBQVU7QUFBQSxRQUFFO0FBQUEsTUFBQSxFQUFBLENBRWxDLEVBQUEsQ0FDRjtBQUFBLE1BQ0FvRSxrQ0FBQUEsS0FBQyxhQUFBLEVBQVksV0FBVSxhQUNwQixVQUFBO0FBQUEsUUFBQSxTQUNDQSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxrREFDYixVQUFBO0FBQUEsVUFBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsd0NBQ2IsVUFBQTtBQUFBLFlBQUFwRSxrQ0FBQUEsSUFBQyxhQUFBLEVBQVksV0FBVSxVQUFBLENBQVU7QUFBQSxZQUNqQ0Esa0NBQUFBLElBQUMsUUFBQSxFQUFLLFdBQVUsZUFBYyxVQUFBLFFBQUEsQ0FBSztBQUFBLFVBQUEsR0FDckM7QUFBQSxVQUNBQSxrQ0FBQUEsSUFBQyxLQUFBLEVBQUUsV0FBVSxxQkFBcUIsVUFBQSxNQUFBLENBQU07QUFBQSxRQUFBLEdBQzFDO0FBQUEsUUFHRCxjQUNDb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUseUNBQ2IsVUFBQTtBQUFBLFVBQUFBLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGFBQ2IsVUFBQTtBQUFBLFlBQUFBLGtDQUFBQSxLQUFDLE1BQUEsRUFBRyxXQUFVLHVDQUNaLFVBQUE7QUFBQSxjQUFBcEUsa0NBQUFBLElBQUMsT0FBQSxFQUFNLFdBQVUsVUFBQSxDQUFVO0FBQUEsY0FBRTtBQUFBLFlBQUEsR0FFL0I7QUFBQSxZQUNBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUscUJBQ2IsVUFBQTtBQUFBLGNBQUFBLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLHdCQUNiLFVBQUE7QUFBQSxnQkFBQXBFLGtDQUFBQSxJQUFDLFVBQUssVUFBQSxhQUFBLENBQVU7QUFBQSxzREFDZixRQUFBLEVBQUssV0FBVSxhQU
25114FhLFVBQUEsV0FBVyxXQUFXLFlBQVksRUFBQSxDQUFFO0FBQUEsY0FBQSxHQUNuRTtBQUFBLGNBQ0FvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSx3QkFDYixVQUFBO0FBQUEsZ0JBQUFwRSxrQ0FBQUEsSUFBQyxVQUFLLFVBQUEsVUFBQSxDQUFPO0FBQUEsZ0JBQ1osV0FBVyxtQkFDVkEsa0NBQUFBLElBQUMsT0FBQSxFQUFNLFNBQVEsV0FBVSxXQUFVLHFDQUFvQyxVQUFBLHNCQUV2RSxJQUVBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFNLFNBQVEsV0FBVSxXQUFVLG1DQUNqQyxVQUFBO0FBQUEsa0JBQUFwRSxrQ0FBQUEsSUFBQyxhQUFBLEVBQVksV0FBVSxlQUFBLENBQWU7QUFBQSxrQkFBRTtBQUFBLGdCQUFBLEVBQUEsQ0FFMUM7QUFBQSxjQUFBLEVBQUEsQ0FFSjtBQUFBLFlBQUEsRUFBQSxDQUNGO0FBQUEsVUFBQSxHQUNGO0FBQUEsVUFFQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGFBQ2IsVUFBQTtBQUFBLFlBQUFwRSxrQ0FBQUEsSUFBQyxNQUFBLEVBQUcsV0FBVSxlQUFjLFVBQUEsbUJBQWU7QUFBQSxZQUMzQ29FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLHFCQUNiLFVBQUE7QUFBQSxjQUFBQSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSx3QkFDYixVQUFBO0FBQUEsZ0JBQUFwRSxrQ0FBQUEsSUFBQyxVQUFLLFVBQUEsWUFBQSxDQUFTO0FBQUEsZ0JBQ2ZBLGtDQUFBQSxJQUFDLFVBQUssV0FBVSxhQUFhLHFCQUFXLFdBQVcsVUFBVSxnQkFBZ0IsRUFBQSxDQUFFO0FBQUEsY0FBQSxHQUNqRjtBQUFBLGNBQ0FvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSx3QkFDYixVQUFBO0FBQUEsZ0JBQUFwRSxrQ0FBQUEsSUFBQyxVQUFLLFVBQUEsYUFBQSxDQUFVO0FBQUEsZ0JBQ2hCQSxrQ0FBQUEsSUFBQyxVQUFLLFdBQVUsYUFBYSxxQkFBVyxXQUFXLFdBQVcsZ0JBQWdCLEVBQUEsQ0FBRTtBQUFBLGNBQUEsRUFBQSxDQUNsRjtBQUFBLFlBQUEsRUFBQSxDQUNGO0FBQUEsVUFBQSxFQUFBLENBQ0Y7QUFBQSxRQUFBLEdBQ0Y7QUFBQSxRQUdGb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsNEJBQ2IsVUFBQTtBQUFBLFVBQUFBLGtDQUFBQTtBQUFBQSxZQUFDO0FBQUEsWUFBQTtBQUFBLGNBQ0MsU0FBUztBQUFBLGNBQ1QsVUFBVTtBQUFBLGNBQ1YsU0FBUTtBQUFBLGNBQ1IsV0FBVTtBQUFBLGNBRVQsVUFBQTtBQUFBLGdCQUFBLFlBQ0NwRSxrQ0FBQUEsSUFBQyxXQUFRLFdBQVUsdUJBQUEsQ0FBdUIsSUFFMUNBLGtDQUFBQSxJQUFDLFdBQUEsRUFBVSxXQUFVLFVBQUEsQ0FBVTtBQUFBLGdCQUVoQyxZQUFZLG1CQUFtQixpQkFBaUI7QUFBQSxjQUFBO0FBQUEsWUFBQTtBQUFBLFVBQUE7QUFBQSxVQUduRG9FLGtDQUFBQTtBQUFBQSxZQUFDO0FBQUEsWUFBQTtBQUFBLGNBQ0MsU0FBUztBQUFBLGNBQ1QsVUFBVTtBQUFBLGNBQ1YsU0FBUTtBQUFBLGNBQ1IsV0FBVTtBQUFBLGNBRVQsVUFBQTtBQUFBLGdCQUFBLFlBQ0NwRSxrQ0FBQUEsSUFBQyxXQUFRLFdBQVUsdUJBQUEsQ0FBdUIsSUFFMUNBLGtDQUFBQSxJQUFDLFVBQUEsRUFBUyxXQUFVLFVBQUEsQ0FBVTtBQUFBLGdCQUM5QjtBQUFBLGNBQUE7QUFBQSxZQUFBO0FBQUEsVUFBQTtBQUFBLFVBSUpBLGtDQUFBQTtBQUFBQSxZQUFDO0FBQUEsWUFBQTtBQUFBLGNBQ0MsU0FBUztBQUFBLGNBQ1QsVUFBVSxhQUFhO0FBQUEsY0FDdkIsU0FBUTtBQUFBLGNBQ1IsTUFBSztBQUFBLGNBQ04sVUFBQTtBQUFBLFlBQUE7QUFBQSxVQUFBO0FBQUEsUUFFRCxFQUFBLENBQ0Y7QUFBQSxNQUFBLEVBQUEsQ0FDRjtBQUFBLElBQUEsR0FDRjtBQUFBLElBRUMseURBQ0UsTUFBQSxFQUNDLFVBQUE7QUFBQSxNQUFBQSxzQ0FBQyxZQUFBLEVBQ0MsVUFBQW9FLGtDQUFBQSxLQUFDLFdBQUEsRUFBVSxXQUFVLDJCQUNuQixVQUFBO0FBQUEsUUFBQXBFLGtDQUFBQSxJQUFDLGFBQUEsRUFBWSxXQUFVLHlCQUFBLENBQXlCO0FBQUEsUUFBRTtBQUFBLE1BQUEsRUFBQSxDQUVwRCxFQUFBLENBQ0Y7QUFBQSw2Q0FDQyxhQUFBLEVBQ0MsVUFBQTtBQUFBLFFBQUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSx5Q0FDYixVQUFBO0FBQUEsVUFBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsYUFDYixVQUFBO0FBQUEsWUFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLGVBQWMsVUFBQSxhQUFTO0FBQUEsWUFDckNvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxxQkFDYixVQUFBO0FBQUEsY0FBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsd0JBQ2IsVUFBQTtBQUFBLGdCQUFBcEUsa0NBQUFBLElBQUMsVUFBSyxVQUFBLFdBQUEsQ0FBUTtBQUFBLHNEQUNiLFFBQUEsRUFBSyxXQUFVLGFBQWEsVUFBQSxlQUFlLFVBQVUsUUFBQSxDQUFRO0FBQUEsY0FBQSxHQUNoRTtBQUFBLGNBQ0FvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSx3QkFDYixVQUFBO0FBQUEsZ0JBQUFwRSxrQ0FBQUEsSUFBQyxVQUFLLFVBQUEsT0FBQSxDQUFJO0FBQUEsc0RBQ1QsUUFBQSxFQUFLLFdBQVUsNEJBQTRCLFVBQUEsZUFBZSxVQUFVLElBQUEsQ0FBSTtBQUFBLGNBQUEsR0FDM0U7QUFBQSxjQUNBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsd0JBQ2IsVUFBQTtBQUFBLGdCQUFBcEUsa0NBQUFBLElBQUMsVUFBSyxVQUFBLFdBQUEsQ0FBUTtBQUFBLHNEQUNiLFFBQUEsRUFBSyxXQUFVLDJCQUEyQixVQUFBLGVBQWUsVUFBVSxRQUFBLENBQVE7QUFBQSxjQUFBLEdBQzlFO0FBQUEsY0FDQyxlQUFlLFVBQVUsT0FBTyxTQUFTLEtBQ3hDb0UsdUNBQUMsT0FBQSxFQUFJLFdBQVUsd0JBQ2IsVUFBQTtBQUFBLGdCQUFBcEUsa0NBQUFBLElBQUMsVUFBSyxVQUFBLFVBQUEsQ0FBTztBQUFBLHNEQUNaLFFBQUEsRUFBSyxXQUFVLDBCQUEwQixVQUFBLGVBQWUsVUFBVSxPQUFPLE9BQUEsQ0FBTztBQUFBLGNBQUEsRUFBQSxDQUNuRjtBQUFBLFlBQUEsRUFBQSxDQUVKO0FBQUEsVUFBQSxHQUNGO0FBQUEsVUFFQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGFBQ2IsVUFBQTtBQUFBLFlBQUFwRSxrQ0FBQUEsSUFBQyxNQUFBLEVBQUcsV0FBVSxlQUFjLFVBQUEsWUFBUTtBQUFBLFlBQ3BDb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUscUJBQ2IsVUFBQTtBQUFBLGNBQUFBLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLHdCQUNiLFVBQUE7QUFBQSxnQkFBQXBFLGtDQUFBQSxJQUFDLFVBQUssVUFBQSxXQUFBLENBQVE7QUFBQSxzREFDYixRQUFBLEVBQUssV0FBVSxhQU
25114FhLFVBQUEsZUFBZSxTQUFTLFFBQUEsQ0FBUTtBQUFBLGNBQUEsR0FDL0Q7QUFBQSxjQUNBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsd0JBQ2IsVUFBQTtBQUFBLGdCQUFBcEUsa0NBQUFBLElBQUMsVUFBSyxVQUFBLE9BQUEsQ0FBSTtBQUFBLHNEQUNULFFBQUEsRUFBSyxXQUFVLDRCQUE0QixVQUFBLGVBQWUsU0FBUyxJQUFBLENBQUk7QUFBQSxjQUFBLEdBQzFFO0FBQUEsY0FDQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLHdCQUNiLFVBQUE7QUFBQSxnQkFBQXBFLGtDQUFBQSxJQUFDLFVBQUssVUFBQSxXQUFBLENBQVE7QUFBQSxzREFDYixRQUFBLEVBQUssV0FBVSwyQkFBMkIsVUFBQSxlQUFlLFNBQVMsUUFBQSxDQUFRO0FBQUEsY0FBQSxHQUM3RTtBQUFBLGNBQ0MsZUFBZSxTQUFTLE9BQU8sU0FBUyxLQUN2Q29FLHVDQUFDLE9BQUEsRUFBSSxXQUFVLHdCQUNiLFVBQUE7QUFBQSxnQkFBQXBFLGtDQUFBQSxJQUFDLFVBQUssVUFBQSxVQUFBLENBQU87QUFBQSxzREFDWixRQUFBLEVBQUssV0FBVSwwQkFBMEIsVUFBQSxlQUFlLFNBQVMsT0FBTyxPQUFBLENBQU87QUFBQSxjQUFBLEVBQUEsQ0FDbEY7QUFBQSxZQUFBLEVBQUEsQ0FFSjtBQUFBLFVBQUEsR0FDRjtBQUFBLFVBRUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxhQUNiLFVBQUE7QUFBQSxZQUFBcEUsa0NBQUFBLElBQUMsTUFBQSxFQUFHLFdBQVUsZUFBYyxVQUFBLFNBQUs7QUFBQSxZQUNqQ29FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLHFCQUNiLFVBQUE7QUFBQSxjQUFBQSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSx3QkFDYixVQUFBO0FBQUEsZ0JBQUFwRSxrQ0FBQUEsSUFBQyxVQUFLLFVBQUEsY0FBQSxDQUFXO0FBQUEsc0RBQ2hCLFFBQUEsRUFBSyxXQUFVLDRCQUE0QixVQUFBLGVBQWUsTUFBTSxXQUFBLENBQVc7QUFBQSxjQUFBLEdBQzlFO0FBQUEsY0FDQyxlQUFlLE1BQU0sT0FBTyxTQUFTLEtBQ3BDb0UsdUNBQUMsT0FBQSxFQUFJLFdBQVUsd0JBQ2IsVUFBQTtBQUFBLGdCQUFBcEUsa0NBQUFBLElBQUMsVUFBSyxVQUFBLFVBQUEsQ0FBTztBQUFBLHNEQUNaLFFBQUEsRUFBSyxXQUFVLDBCQUEwQixVQUFBLGVBQWUsTUFBTSxPQUFPLE9BQUEsQ0FBTztBQUFBLGNBQUEsR0FDL0U7QUFBQSxjQUVELGVBQWUsWUFDZG9FLHVDQUFDLE9BQUEsRUFBSSxXQUFVLHdCQUNiLFVBQUE7QUFBQSxnQkFBQXBFLGtDQUFBQSxJQUFDLFVBQUssVUFBQSxZQUFBLENBQVM7QUFBQSxzREFDZCxRQUFBLEVBQUssV0FBVSxhQUFhLFVBQUEsZUFBZSxlQUFlLFFBQVEsRUFBQSxDQUFFO0FBQUEsY0FBQSxFQUFBLENBQ3ZFO0FBQUEsWUFBQSxFQUFBLENBRUo7QUFBQSxVQUFBLEVBQUEsQ0FDRjtBQUFBLFFBQUEsR0FDRjtBQUFBLFNBRUUsZUFBZSxVQUFVLE9BQU8sU0FBUyxLQUN6QyxlQUFlLFNBQVMsT0FBTyxTQUFTLEtBQ3hDLGVBQWUsTUFBTSxPQUFPLFNBQVMsTUFDckNvRSx1Q0FBQyxPQUFBLEVBQUksV0FBVSxzQkFDYixVQUFBO0FBQUEsVUFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLGlDQUFnQyxVQUFBLFVBQU07QUFBQSxVQUNwREEsa0NBQUFBLElBQUMsT0FBQSxFQUFJLFdBQVUscUJBQ1osVUFBQSxDQUFDLEdBQUcsZUFBZSxVQUFVLFFBQVEsR0FBRyxlQUFlLFNBQVMsUUFBUSxHQUFHLGVBQWUsTUFBTSxNQUFNLEVBQUUsSUFBSSxDQUFDbUUsUUFBTyxVQUNuSG5FLGtDQUFBQSxJQUFDLE9BQUEsRUFBZ0IsV0FBVSx3REFDeEIsVUFBQW1FLE9BQUFBLEdBRE8sS0FFVixDQUNELEVBQUEsQ0FDSDtBQUFBLFFBQUEsRUFBQSxDQUNGO0FBQUEsTUFBQSxFQUFBLENBRUo7QUFBQSxJQUFBLEVBQUEsQ0FDRjtBQUFBLEVBQUEsR0FFSjtBQUVKO0FDdllBLE1BQU0sWUFBc0IsTUFBTTtBQUNoQywrQ0FDRyxPQUFBLEVBQUksV0FBVSwyQkFDYixVQUFBQyxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSwrQkFDYixVQUFBO0FBQUEsSUFBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsUUFDYixVQUFBO0FBQUEsTUFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLHlDQUF3QyxVQUFBLG1CQUFlO0FBQUEsTUFDckVBLGtDQUFBQSxJQUFDLEtBQUEsRUFBRSxXQUFVLGlCQUFnQixVQUFBLHdDQUFBLENBQXFDO0FBQUEsSUFBQSxHQUNwRTtBQUFBLElBRUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSw4Q0FDYixVQUFBO0FBQUEsTUFBQUEsdUNBQUMsTUFBQSxFQUNDLFVBQUE7QUFBQSxRQUFBQSxrQ0FBQUEsS0FBQyxZQUFBLEVBQVcsV0FBVSw2REFDcEIsVUFBQTtBQUFBLFVBQUFwRSxrQ0FBQUEsSUFBQyxXQUFBLEVBQVUsV0FBVSx1QkFBc0IsVUFBQSxrQkFBYztBQUFBLFVBQ3pEQSxrQ0FBQUEsSUFBQyxPQUFBLEVBQU0sV0FBVSxnQ0FBQSxDQUFnQztBQUFBLFFBQUEsR0FDbkQ7QUFBQSwrQ0FDQyxhQUFBLEVBQ0MsVUFBQTtBQUFBLFVBQUFBLGtDQUFBQSxJQUFDLE9BQUEsRUFBSSxXQUFVLHNCQUFxQixVQUFBLGNBQVU7QUFBQSxVQUM5Q0Esa0NBQUFBLElBQUMsS0FBQSxFQUFFLFdBQVUsaUNBQWdDLFVBQUEseUJBQUEsQ0FFN0M7QUFBQSxRQUFBLEVBQUEsQ0FDRjtBQUFBLE1BQUEsR0FDRjtBQUFBLDZDQUVDLE1BQUEsRUFDQyxVQUFBO0FBQUEsUUFBQW9FLGtDQUFBQSxLQUFDLFlBQUEsRUFBVyxXQUFVLDZEQUNwQixVQUFBO0FBQUEsVUFBQXBFLGtDQUFBQSxJQUFDLFdBQUEsRUFBVSxXQUFVLHVCQUFzQixVQUFBLG1CQUFlO0FBQUEsVUFDMURBLGtDQUFBQSxJQUFDLFFBQUEsRUFBTyxXQUFVLGdDQUFBLENBQWdDO0FBQUEsUUFBQSxHQUNwRDtBQUFBLCtDQUNDLGFBQUEsRUFDQyxVQUFBO0FBQUEsVUFBQUEsa0NBQUFBLElBQUMsT0FBQSxFQUFJLFdBQVUsc0JBQXFCLFVBQUEsY0FBVTtBQUFBLFVBQzlDQSxrQ0FBQUEsSUFBQyxLQUFBLEVBQUUsV0FBVSxpQ0FBZ0MsVUFBQSxtQkFBQSxDQUU3QztBQUFBLFFBQUEsRUFBQSxDQUNGO0FBQUEsTUFBQSxHQUNGO0FBQUEsNkNBRUMsTUFBQSxFQUNDLFVBQUE7QUFBQSxRQUFBb0Usa0NBQUFBLEtBQUMsWUFBQSxFQUFXLFdBQVUsNkRBQ3BCLFVBQUE7QUFBQSxVQUFBcEUsa0NBQUFBLElBQUMsV0FBQSxFQUFVLFdBQVUsdUJBQXNCLFVBQUEsZUFBVztBQUFBLFVBQ3REQSxrQ0FBQUEsSUFBQyxVQUFBLEVBQVMsV0FBVSxnQ0FBQSxDQUFnQztBQUFBLFFBQUEsR0FDdEQ7QUFBQSwrQ0FDQyxhQUFBLEVBQ0MsVUFBQTtBQUFBLFVBQUFBLGtDQUFBQSxJQUFDLE9BQUEsRUFBSSxXQUFVLHNCQUFxQixVQUFBLFVBQU07QUFBQSxVQUMxQ0Esa0NBQUFBLElBQUMsS0FBQSxFQUFFLFdBQVUsaUNBQWdDLFVBQUEsd0JBQUEsQ0FFN0M7QUFBQSxRQUFBLEVBQUEsQ0FDRjtBQUFBLE1BQUEsRUFBQSxDQUNGO0FBQUEsSUFBQSxHQUNGO0FBQUEsSUFFQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLHlDQUNiLFVBQUE7QUFBQSxNQUFBcEUsc0NBQUMsT0FBQSxFQUFJLFdBQVUsYUFDYixVQUFBQSxzQ0FBQyxlQUFZLEdBQ2Y7QUFBQSxNQUVBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsYUFDYixVQUFBO0FBQUEsUUFBQUEsdUNBQUMsTUFBQSxFQUNDLFVBQUE7QUFBQSxVQUFBcEUsc0NBQUMsWUFBQSxFQUNDLFVBQUFvRSxrQ0FBQUEsS0FBQyxXQUFBLEVBQVUsV0FBVSwyQkFDbkIsVUFBQTtBQUFBLFlBQUFwRSxrQ0FBQUEsSUFBQyxVQUFBLEVBQVMsV0FBVSxVQUFBLENBQVU7QUFBQSxZQUFFO0FBQUEsVUFBQSxFQUFBLENBRWxDLEVBQUEsQ0FDRjtBQUFBLFVBQ0FBLHNDQU
25114FDLGFBQUEsRUFDQyxVQUFBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsYUFDYixVQUFBO0FBQUEsWUFBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUscUNBQ2IsVUFBQTtBQUFBLGNBQUFBLHVDQUFDLE9BQUEsRUFDQyxVQUFBO0FBQUEsZ0JBQUFwRSxrQ0FBQUEsSUFBQyxNQUFBLEVBQUcsV0FBVSxlQUFjLFVBQUEsYUFBUztBQUFBLGdCQUNyQ0Esa0NBQUFBLElBQUMsS0FBQSxFQUFFLFdBQVUseUJBQXdCLFVBQUEsMkNBQUEsQ0FBd0M7QUFBQSxjQUFBLEdBQy9FO0FBQUEsY0FDQUEsa0NBQUFBLElBQUMsT0FBQSxFQUFJLFdBQVUscURBQW9ELFVBQUEsV0FBQSxDQUVuRTtBQUFBLFlBQUEsR0FDRjtBQUFBLFlBRUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxxQ0FDYixVQUFBO0FBQUEsY0FBQUEsdUNBQUMsT0FBQSxFQUNDLFVBQUE7QUFBQSxnQkFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLGVBQWMsVUFBQSxpQkFBYTtBQUFBLGdCQUN6Q0Esa0NBQUFBLElBQUMsS0FBQSxFQUFFLFdBQVUseUJBQXdCLFVBQUEsb0NBQUEsQ0FBaUM7QUFBQSxjQUFBLEdBQ3hFO0FBQUEsY0FDQUEsa0NBQUFBLElBQUMsT0FBQSxFQUFJLFdBQVUseURBQXdELFVBQUEsU0FBQSxDQUV2RTtBQUFBLFlBQUEsR0FDRjtBQUFBLFlBRUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxxQ0FDYixVQUFBO0FBQUEsY0FBQUEsdUNBQUMsT0FBQSxFQUNDLFVBQUE7QUFBQSxnQkFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLGVBQWMsVUFBQSxtQkFBZTtBQUFBLGdCQUMzQ0Esa0NBQUFBLElBQUMsS0FBQSxFQUFFLFdBQVUseUJBQXdCLFVBQUEsb0NBQUEsQ0FBaUM7QUFBQSxjQUFBLEdBQ3hFO0FBQUEsY0FDQUEsa0NBQUFBLElBQUMsT0FBQSxFQUFJLFdBQVUseURBQXdELFVBQUEsU0FBQSxDQUV2RTtBQUFBLFlBQUEsR0FDRjtBQUFBLFlBRUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxxQ0FDYixVQUFBO0FBQUEsY0FBQUEsdUNBQUMsT0FBQSxFQUNDLFVBQUE7QUFBQSxnQkFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLGVBQWMsVUFBQSxvQkFBZ0I7QUFBQSxnQkFDNUNBLGtDQUFBQSxJQUFDLEtBQUEsRUFBRSxXQUFVLHlCQUF3QixVQUFBLHlCQUFBLENBQXNCO0FBQUEsY0FBQSxHQUM3RDtBQUFBLGNBQ0FBLGtDQUFBQSxJQUFDLE9BQUEsRUFBSSxXQUFVLHlEQUF3RCxVQUFBLFNBQUEsQ0FFdkU7QUFBQSxZQUFBLEVBQUEsQ0FDRjtBQUFBLFVBQUEsRUFBQSxDQUNGLEVBQUEsQ0FDRjtBQUFBLFFBQUEsR0FDRjtBQUFBLCtDQUVDLE1BQUEsRUFDQyxVQUFBO0FBQUEsVUFBQUEsc0NBQUMsWUFBQSxFQUNDLFVBQUFBLGtDQUFBQSxJQUFDLFdBQUEsRUFBVSxVQUFBLGdCQUFBLENBQWEsR0FDMUI7QUFBQSxVQUNBQSxzQ0FBQyxhQUFBLEVBQ0MsVUFBQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGFBQ2IsVUFBQTtBQUFBLFlBQUFBLGtDQUFBQSxLQUFDLFVBQUEsRUFBTyxXQUFVLDZFQUNoQixVQUFBO0FBQUEsY0FBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLGVBQWMsVUFBQSxrQkFBYztBQUFBLGNBQzFDQSxrQ0FBQUEsSUFBQyxLQUFBLEVBQUUsV0FBVSx5QkFBd0IsVUFBQSx5Q0FBQSxDQUFzQztBQUFBLFlBQUEsR0FDN0U7QUFBQSxZQUVBb0Usa0NBQUFBLEtBQUMsVUFBQSxFQUFPLFdBQVUsNkVBQ2hCLFVBQUE7QUFBQSxjQUFBcEUsa0NBQUFBLElBQUMsTUFBQSxFQUFHLFdBQVUsZUFBYyxVQUFBLGVBQVc7QUFBQSxjQUN2Q0Esa0NBQUFBLElBQUMsS0FBQSxFQUFFLFdBQVUseUJBQXdCLFVBQUEsK0JBQUEsQ0FBNEI7QUFBQSxZQUFBLEdBQ25FO0FBQUEsWUFFQW9FLGtDQUFBQSxLQUFDLFVBQUEsRUFBTyxXQUFVLDZFQUNoQixVQUFBO0FBQUEsY0FBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLGVBQWMsVUFBQSxlQUFXO0FBQUEsY0FDdkNBLGtDQUFBQSxJQUFDLEtBQUEsRUFBRSxXQUFVLHlCQUF3QixVQUFBLHVDQUFBLENBQW9DO0FBQUEsWUFBQSxHQUMzRTtBQUFBLFlBRUFvRSxrQ0FBQUEsS0FBQyxVQUFBLEVBQU8sV0FBVSw2RUFDaEIsVUFBQTtBQUFBLGNBQUFwRSxrQ0FBQUEsSUFBQyxNQUFBLEVBQUcsV0FBVSxlQUFjLFVBQUEsaUJBQWE7QUFBQSxjQUN6Q0Esa0NBQUFBLElBQUMsS0FBQSxFQUFFLFdBQVUseUJBQXdCLFVBQUEsbUNBQUEsQ0FBZ0M7QUFBQSxZQUFBLEVBQUEsQ0FDdkU7QUFBQSxVQUFBLEVBQUEsQ0FDRixFQUFBLENBQ0Y7QUFBQSxRQUFBLEVBQUEsQ0FDRjtBQUFBLE1BQUEsRUFBQSxDQUNGO0FBQUEsSUFBQSxFQUFBLENBQ0Y7QUFBQSxFQUFBLEVBQUEsQ0FDRixFQUFBLENBQ0Y7QUFFSjtBQy9JTyxNQUFNLGVBQXlCLE1BQU07QUFDMUMsK0NBQ0csT0FBQSxFQUFJLFdBQVUsZ0NBQ2IsVUFBQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLDBDQUNiLFVBQUE7QUFBQSxJQUFBQSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxRQUNiLFVBQUE7QUFBQSw0Q0FBQyxNQUFBLEVBQUcsV0FBVSx5Q0FBd0MsVUFBQSw0QkFFdEQ7QUFBQSw0Q0FDQyxLQUFBLEVBQUUsV0FBVSx5QkFBd0IsVUFBQSw2Q0FFckM7QUFBQSxJQUFBLEdBQ0Y7QUFBQSxJQUVBQSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSx3REFFYixVQUFBO0FBQUEsTUFBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsaURBQ2IsVUFBQTtBQUFBLFFBQUFwRSxrQ0FBQUEsSUFBQyxTQUFJLFdBQVUscUZBQ2IsVUFBQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLDBCQUNiLFVBQUE7QUFBQSxnREFBQyxPQUFBLEVBQUksV0FBVSxpQkFBZ0IsVUFBQSxNQUFFO0FBQUEsZ0RBQ2hDLE1BQUEsRUFBRyxXQUFVLHNCQUFxQixVQUFBLGtCQUFjO0FBQUEsUUFBQSxFQUFBLENBQ25ELEVBQUEsQ0FDRjtBQUFBLFFBQ0FBLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLE9BQ2IsVUFBQTtBQUFBLGdEQUFDLEtBQUEsRUFBRSxXQUFVLHNCQUFxQixVQUFBLDBHQUdsQztBQUFBLFVBQ0FBLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGtCQUNiLFVBQUE7QUFBQSxZQUFBQSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSwyQ0FDYixVQUFBO0FBQUEsY0FBQXBFLGtDQUFBQSxJQUFDLFFBQUEsRUFBSyxXQUFVLDBDQUF5QztBQUFBLGNBQU87QUFBQSxZQUFBLEdBRWxFO0FBQUEsWUFDQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLDJDQUNiLFVBQUE7QUFBQSxjQUFBcEUsa0NBQUFBLElBQUMsUUFBQSxFQUFLLFdBQVUsMENBQXlDO0FBQUEsY0FBTztBQUFBLFlBQUEsR0FFbEU7QUFBQSxZQUNBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsMkNBQ2IsVUFBQTtBQUFBLGNBQUFwRSxrQ0FBQUEsSUFBQyxRQUFBLEVBQUssV0FBVSwwQ0FBeUM7QUFBQSxjQUFPO0FBQUEsWUFBQSxHQUVsRTtBQUFBLFlBQ0FvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSwyQ0FDYixVQUFBO0FBQUEsY0FBQXBFLGtDQUFBQSxJQUFDLFFBQUEsRUFBSyxXQUFVLDBDQUF5QztBQUFBLGNBQU87QUFBQSxZQUFBLEdBRWxFO0FBQUEsVUFBQSxHQUNGO0FBQUEsVUFDQW9FLGtDQUFBQTtBQUFBQSxZQUFDO0FBQUEsWUFBQTtBQUFBLGNBQ0MsSUFBRztBQUFBLGNBQ0gsV0FBVTtBQUFBLGNBQ1gsVUFBQTtBQUFBLGdCQUFBO0FBQUEsZ0JBRUNwRSxrQ0FBQUEsSUFBQyxTQUFJLFdBQVUsZ0JBQWUsTUFBSyxRQUFPLFFBQU8sZ0JBQWUsU0FBUSxhQUN0RSxnREFBQyxRQUFBLEVBQUssZUFBYyxTQUFRLGdCQUFlLFNBQVEsYUFBYSxHQUFHLEdBQUUsMkJBQUEsQ0FBMkIsRU
25114FBQSxDQUNsRztBQUFBLGNBQUE7QUFBQSxZQUFBO0FBQUEsVUFBQTtBQUFBLFFBQ0YsR0FDRjtBQUFBLE1BQUEsR0FDRjtBQUFBLE1BR0FvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxpREFDYixVQUFBO0FBQUEsUUFBQXBFLGtDQUFBQSxJQUFDLFNBQUksV0FBVSxxRkFDYixVQUFBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsMEJBQ2IsVUFBQTtBQUFBLGdEQUFDLE9BQUEsRUFBSSxXQUFVLGlCQUFnQixVQUFBLE1BQUU7QUFBQSxnREFDaEMsTUFBQSxFQUFHLFdBQVUsc0JBQXFCLFVBQUEsaUJBQWE7QUFBQSxRQUFBLEVBQUEsQ0FDbEQsRUFBQSxDQUNGO0FBQUEsUUFDQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsT0FDYixVQUFBO0FBQUEsZ0RBQUMsS0FBQSxFQUFFLFdBQVUsc0JBQXFCLFVBQUEsc0dBR2xDO0FBQUEsVUFDQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsa0JBQ2IsVUFBQTtBQUFBLFlBQUFBLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLDJDQUNiLFVBQUE7QUFBQSxjQUFBcEUsa0NBQUFBLElBQUMsUUFBQSxFQUFLLFdBQVUsMENBQXlDO0FBQUEsY0FBTztBQUFBLFlBQUEsR0FFbEU7QUFBQSxZQUNBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsMkNBQ2IsVUFBQTtBQUFBLGNBQUFwRSxrQ0FBQUEsSUFBQyxRQUFBLEVBQUssV0FBVSwwQ0FBeUM7QUFBQSxjQUFPO0FBQUEsWUFBQSxHQUVsRTtBQUFBLFlBQ0FvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSwyQ0FDYixVQUFBO0FBQUEsY0FBQXBFLGtDQUFBQSxJQUFDLFFBQUEsRUFBSyxXQUFVLDBDQUF5QztBQUFBLGNBQU87QUFBQSxZQUFBLEdBRWxFO0FBQUEsWUFDQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLDJDQUNiLFVBQUE7QUFBQSxjQUFBcEUsa0NBQUFBLElBQUMsUUFBQSxFQUFLLFdBQVUsMENBQXlDO0FBQUEsY0FBTztBQUFBLFlBQUEsR0FFbEU7QUFBQSxVQUFBLEdBQ0Y7QUFBQSxVQUNBb0Usa0NBQUFBO0FBQUFBLFlBQUM7QUFBQSxZQUFBO0FBQUEsY0FDQyxJQUFHO0FBQUEsY0FDSCxXQUFVO0FBQUEsY0FDWCxVQUFBO0FBQUEsZ0JBQUE7QUFBQSxnQkFFQ3BFLGtDQUFBQSxJQUFDLFNBQUksV0FBVSxnQkFBZSxNQUFLLFFBQU8sUUFBTyxn
25114QkFBZSxTQUFRLGFBQ3RFLGdEQUFDLFFBQUEsRUFBSyxlQUFjLFNBQVEsZ0JBQWUsU0FBUSxhQUFhLEdBQUcsR0FBRSwyQkFBQSxDQUEyQixFQUFBLENBQ2xHO0FBQUEsY0FBQTtBQUFBLFlBQUE7QUFBQSxVQUFBO0FBQUEsUUFDRixHQUNGO0FBQUEsTUFBQSxHQUNGO0FBQUEsTUFHQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGlEQUNiLFVBQUE7QUFBQSxRQUFBcEUsa0NBQUFBLElBQUMsU0FBSSxXQUFVLG1GQUNiLFVBQUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSwwQkFDYixVQUFBO0FBQUEsZ0RBQUMsT0FBQSxFQUFJLFdBQVUsaUJBQWdCLFVBQUEsTUFBRTtBQUFBLGdEQUNoQyxNQUFBLEVBQUcsV0FBVSxzQkFBcUIsVUFBQSxpQkFBYTtBQUFBLFFBQUEsRUFBQSxDQUNsRCxFQUFBLENBQ0Y7QUFBQSxRQUNBQSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxPQUNiLFVBQUE7QUFBQSxnREFBQyxLQUFBLEVBQUUsV0FBVSxzQkFBcUIsVUFBQSx5RkFHbEM7QUFBQSxVQUNBQSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxrQkFDYixVQUFBO0FBQUEsWUFBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsMkNBQ2IsVUFBQTtBQUFBLGNBQUFwRSxrQ0FBQUEsSUFBQyxRQUFBLEVBQUssV0FBVSwwQ0FBeUM7QUFBQSxjQUFPO0FBQUEsWUFBQSxHQUVsRTtBQUFBLFlBQ0FvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSwyQ0FDYixVQUFBO0FBQUEsY0FBQXBFLGtDQUFBQSxJQUFDLFFBQUEsRUFBSyxXQUFVLDBDQUF5QztBQUFBLGNBQU87QUFBQSxZQUFBLEdBRWxFO0FBQUEsWUFDQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLDJDQUNiLFVBQUE7QUFBQSxjQUFBcEUsa0NBQUFBLElBQUMsUUFBQSxFQUFLLFdBQVUsMENBQXlDO0FBQUEsY0FBTztBQUFBLFlBQUEsR0FFbEU7QUFBQSxZQUNBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsMkNBQ2IsVUFBQTtBQUFBLGNBQUFwRSxrQ0FBQUEsSUFBQyxRQUFBLEVBQUssV0FBVSwwQ0FBeUM7QUFBQSxjQUFPO0FBQUEsWUFBQSxHQUVsRTtBQUFBLFVBQUEsR0FDRjtBQUFBLFVBQ0FvRSxrQ0FBQUE7QUFBQUEsWUFBQztBQUFBLFlBQUE7QUFBQSxjQUNDLElBQUc7QUFBQSxjQUNILFdBQVU7QUFBQSxjQUNYLFVBQUE7QUFBQSxnQkFBQTtBQUFBLGdCQUVDcEUsa0NBQUFBLElBQUMsU0FBSSxXQUFVLGdCQUFlLE1BQUssUUFBTyxRQUFPLGdCQUFlLFNBQVEsYUFDdEUsZ0RBQUMsUUFBQSxFQUFLLGVBQWMsU0FBUSxnQkFBZSxTQUFRLGFBQWEsR0FBRyxHQUFFLDJCQUFBLENBQTJCLEVBQUEsQ0FDbEc7QUFBQSxjQUFBO0FBQUEsWUFBQTtBQUFBLFVBQUE7QUFBQSxRQUNGLEdBQ0Y7QUFBQSxNQUFBLEdBQ0Y7QUFBQSxNQUdBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsK0RBQ2IsVUFBQTtBQUFBLFFBQUFwRSxrQ0FBQUEsSUFBQyxTQUFJLFdBQVUscUZBQ2IsVUFBQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLDBCQUNiLFVBQUE7QUFBQSxnREFBQyxPQUFBLEVBQUksV0FBVSxpQkFBZ0IsVUFBQSxPQUFHO0FBQUEsZ0RBQ2pDLE1BQUEsRUFBRyxXQUFVLHFCQUFvQixVQUFBLDBCQUFzQjtBQUFBLFFBQUEsRUFBQSxDQUMxRCxFQUFBLENBQ0Y7QUFBQSxRQUNBQSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxPQUNiLFVBQUE7QUFBQSxnREFBQyxLQUFBLEVBQUUsV0FBVSxzQkFBcUIsVUFBQSxnR0FHbEM7QUFBQSxVQUNBQSxrQ0FBQUE7QUFBQUEsWUFBQztBQUFBLFlBQUE7QUFBQSxjQUNDLElBQUc7QUFBQSxjQUNILFdBQVU7QUFBQSxjQUNYLFVBQUE7QUFBQSxnQkFBQTtBQUFBLGdCQUVDcEUsa0NBQUFBLElBQUMsU0FBSSxXQUFVLGdCQUFlLE1BQUssUUFBTyxRQUFPLGdCQUFlLFNBQVEsYUFDdEUsZ0RBQUMsUUFBQSxFQUFLLGVBQWMsU0FBUSxnQkFBZSxTQUFRLGFBQWEsR0FBRyxHQUFFLDJCQUFBLENBQTJCLEVBQUEsQ0FDbEc7QUFBQSxjQUFBO0FBQUEsWUFBQTtBQUFBLFVBQUE7QUFBQSxRQUNGLEdBQ0Y7QUFBQSxNQUFBLEdBQ0Y7QUFBQSxJQUFBLEdBQ0Y7QUFBQSxJQUdBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsbUNBQ2IsVUFBQTtBQUFBLE1BQUFBLGtDQUFBQSxLQUFDLEtBQUEsRUFBRSxXQUFVLFdBQVUsVUFBQTtBQUFBLFFBQUE7QUFBQSxRQUMwQztBQUFBLE1BQUEsR0FDakU7QUFBQSw0Q0FDQyxLQUFBLEVBQUUsV0FBVSxnQkFBZSxVQUFBLGdEQUU1QjtBQUFBLElBQUEsR0FDRjtBQUFBLEVBQUEsRUFBQSxDQUNGLEVBQUEsQ0FDRjtBQUVKO0FDdktPLE1BQU0sc0JBQTBELENBQUM7QUFBQSxFQUN0RTtBQUFBLEVBQ0EsVUFBVTtBQUFBLEVBQ1Y7QUFBQSxFQUNBO0FBQ0YsTUFBTTtBQUNKLFFBQU0sZUFBZSxNQUFNO0FBQ3pCLGVBQVcsUUFBUTtBQUFBLEVBQ3JCO0FBRUEsUUFBTSxvQkFBb0IsQ0FBQyxNQUF3QjtBQUNqRCxNQUFFLGdCQUFBO0FBQ0YsUUFBSSxTQUFTLFlBQVk7QUFDdkIsYUFBTyxLQUFLLFNBQVMsWUFBWSxVQUFVLHFCQUFxQjtBQUFBLElBQ2xFO0FBQUEsRUFDRjtBQUVBLFFBQU0sY0FBYyxNQUFNO0FBQ3hCLFdBQU8sU0FBUyxhQUFhLFNBQVMsU0FBUyxTQUFTLFFBQVE7QUFBQSxFQUNsRTtBQUdBLE1BQUksWUFBWSxXQUFXO0FBQ3pCLFdBQ0VwRSxrQ0FBQUE7QUFBQUEsTUFBQztBQUFBLE1BQUE7QUFBQSxRQUNDLFdBQVc7QUFBQSxVQUNUO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxRQUFBO0FBQUEsUUFFRixTQUFTO0FBQUEsUUFFVCxVQUFBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsK0JBQ1osVUFBQTtBQUFBLFVBQUEsU0FBUyxRQUNScEUsa0NBQUFBO0FBQUFBLFlBQUM7QUFBQSxZQUFBO0FBQUEsY0FDQyxLQUFLLFNBQVM7QUFBQSxjQUNkLEtBQUssR0FBRyxTQUFTLElBQUk7QUFBQSxjQUNyQixXQUFVO0FBQUEsWUFBQTtBQUFBLFVBQUE7QUFBQSxVQUdkb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsa0JBQ2IsVUFBQTtBQUFBLFlBQUFwRSxrQ0FBQUEsSUFBQyxNQUFBLEVBQUcsV0FBVSw0Q0FBNEMsVUFBQSxTQUFTLE1BQUs7QUFBQSxZQUN4RUEsa0NBQUFBLElBQUMsS0FBQSxFQUFFLFdBQVUsd0NBQXdDLG1CQUFTLE1BQUs7QUFBQSxZQUduRW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLDREQUNaLFVBQUE7QUFBQSxjQUFBLFNBQVMsdURBQ1AsUUFBQSxFQUFNLFVBQUE7QUFBQSxnQkFBQSxrQkFBa0IsU0FBUyxZQUFZO0FBQUEsZ0JBQUU7QUFBQSxjQUFBLEdBQUU7QUFBQSxjQUVuRCxTQUFTLGFBQ1JBLGtDQUFBQSxLQUFDLFFBQUEsRUFBTSxVQUFBO0FBQUEsZ0JBQUEsU0FBUztBQUFBLGdCQUFVO0FBQUEsY0FBQSxHQUFNO0FBQUEsY0FFakMsU0FBUyxpQkFDUkEsa0NBQUFBLEtBQUMsUUFBQSxFQUFNLFVBQUE7QUFBQSxnQkFBQSxTQUFTO0FBQUEsZ0JBQWM7QUFBQSxjQUFBLEVBQUEsQ0FBVztBQUFBLFlBQUEsRUFBQSxDQUU3QztBQUFBLFVBQUEsR0FDRjtBQUFBLFVBRUMsU0FBUyxjQUNScEUsa0NBQUFBO0FBQUFBLFlBQUM7QUFBQSxZQUFBO0FBQUEsY0FDQyxTQUFTO0FBQUEsY0FDVCxXQUFVO0FBQUEsY0FDWCxVQUFBO0FBQUEsWUFBQTtBQUFBLFVBQUE7QUFBQSxRQUVELEVBQUEsQ0FFSjtB
25114QUFBLE1BQUE7QUFBQSxJQUFBO0FBQUEsRUFHTjtBQUdBLE1BQUksWUFBWSxZQUFZO0FBQzFCLFdBQ0VvRSxrQ0FBQUE7QUFBQUEsTUFBQztBQUFBLE1BQUE7QUFBQSxRQUNDLFdBQVc7QUFBQSxVQUNUO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxRQUFBO0FBQUEsUUFFRixTQUFTO0FBQUEsUUFHVCxVQUFBO0FBQUEsVUFBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsaUJBQ2IsVUFBQTtBQUFBLFlBQUFwRSxrQ0FBQUE7QUFBQUEsY0FBQztBQUFBLGNBQUE7QUFBQSxnQkFDQyxLQUFLLFlBQUE7QUFBQSxnQkFDTCxLQUFLLFNBQVM7QUFBQSxnQkFDZCxXQUFVO0FBQUEsY0FBQTtBQUFBLFlBQUE7QUFBQSxZQUVYLFNBQVMsUUFDUkEsc0NBQUMsT0FBQSxFQUFJLFdBQVUsOERBQ2IsVUFBQUEsa0NBQUFBO0FBQUFBLGNBQUM7QUFBQSxjQUFBO0FBQUEsZ0JBQ0MsS0FBSyxTQUFTO0FBQUEsZ0JBQ2QsS0FBSyxHQUFHLFNBQVMsSUFBSTtBQUFBLGdCQUNyQixXQUFVO0FBQUEsY0FBQTtBQUFBLFlBQUEsRUFDWixDQUNGO0FBQUEsVUFBQSxHQUVKO0FBQUEsVUFHQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLE9BQ2IsVUFBQTtBQUFBLFlBQUFwRSxrQ0FBQUEsSUFBQyxTQUFJLFdBQVUseUNBQ2IsVUFBQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLFVBQ2IsVUFBQTtBQUFBLGNBQUFwRSxrQ0FBQUEsSUFBQyxNQUFBLEVBQUcsV0FBVSw0Q0FBNEMsVUFBQSxTQUFTLE1BQUs7QUFBQSxjQUN4RW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGlDQUNiLFVBQUE7QUFBQSxnQkFBQUEsa0NBQUFBLEtBQUMsS0FBQSxFQUFFLFdBQVUscUJBQ1gsVUFBQTtBQUFBLGtCQUFBcEUsa0NBQUFBLElBQUMsUUFBQSxFQUFPLFdBQVUsZUFBQSxDQUFlO0FBQUEsa0JBQ2hDLFNBQVM7QUFBQSxnQkFBQSxHQUNaO0FBQUEsZ0JBQ0FvRSxrQ0FBQUEsS0FBQyxLQUFBLEVBQUUsV0FBVSxRQUFRLFVBQUE7QUFBQSxrQkFBQSxTQUFTO0FBQUEsa0JBQVc7QUFBQSxrQkFBRSxTQUFTO0FBQUEsZ0JBQUEsRUFBQSxDQUFLO0FBQUEsY0FBQSxFQUFBLENBQzNEO0FBQUEsWUFBQSxFQUFBLENBQ0YsRUFBQSxDQUNGO0FBQUEsWUFHQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsK0JBQ1osVUFBQTtBQUFBLGNBQUEsU0FBUyxnQkFDUkEsdUNBQUMsT0FBQSxFQUFJLFdBQVUsMkNBQ2IsVUFBQTtBQUFBLGdCQUFBcEUsa0NBQUFBLElBQUMsT0FBQSxFQUFJLFdBQVUsK0JBQThCLFVBQUEsc0JBQWtCO0FBQUEsZ0JBQy9Eb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsbUNBQ1osVUFBQTtBQUFBLGtCQUFBLGtCQUFrQixTQUFTLFlBQVk7QUFBQSxrQkFBRTtBQUFBLGdCQUFBLEVBQUEsQ0FDNUM7QUFBQSxjQUFBLEdBQ0Y7QUFBQSxjQUVELFNBQVMsYUFDUkEsdUNBQUMsT0FBQSxFQUFJLFdBQVUsMkNBQ2IsVUFBQTtBQUFBLGdCQUFBcEUsa0NBQUFBLElBQUMsT0FBQSxFQUFJLFdBQVUsK0JBQThCLFVBQUEsZ0JBQVk7QUFBQSxnQkFDekRBLGtDQUFBQSxJQUFDLE9BQUEsRUFBSSxXQUFVLG1DQUNaLG1CQUFTLFVBQUEsQ0FDWjtBQUFBLGNBQUEsR0FDRjtBQUFBLGNBRUQsU0FBUyxpQkFDUm9FLHVDQUFDLE9BQUEsRUFBSSxXQUFVLDJDQUNiLFVBQUE7QUFBQSxnQkFBQXBFLGtDQUFBQSxJQUFDLE9BQUEsRUFBSSxXQUFVLCtCQUE4QixVQUFBLGNBQVU7QUFBQSxnQkFDdkRBLGtDQUFBQSxJQUFDLE9BQUEsRUFBSSxXQUFVLG1DQUNaLG1CQUFTLGNBQUEsQ0FDWjtBQUFBLGNBQUEsR0FDRjtBQUFBLGNBRUQsU0FBUyxlQUNSb0UsdUNBQUMsT0FBQSxFQUFJLFdBQVUsMkNBQ2IsVUFBQTtBQUFBLGdCQUFBcEUsa0NBQUFBLElBQUMsT0FBQSxFQUFJLFdBQVUsK0JBQThCLFVBQUEsa0JBQWM7QUFBQSxnQkFDM0RBLGtDQUFBQSxJQUFDLE9BQUEsRUFBSSxXQUFVLG1DQUNaLG1CQUFTLFlBQUEsQ0FDWjtBQUFBLGNBQUEsRUFBQSxDQUNGO0FBQUEsWUFBQSxHQUVKO0FBQUEsWUFFQyxTQUFTLGVBQ1JBLGtDQUFBQSxJQUFDLEtBQUEsRUFBRSxXQUFVLGlEQUNWLFVBQUEsU0FBUyxZQUFZLFFBQVEsWUFBWSxFQUFFLEVBQUEsQ0FDOUM7QUFBQSxhQUlBLFNBQVMsaUJBQWlCLFNBQVMsNEJBQ25Db0UsdUNBQUMsT0FBQSxFQUFJLFdBQVUsMEJBQ1osVUFBQTtBQUFBLGNBQUEsU0FBUyx3REFDUCxPQUFBLEVBQ0MsVUFBQTtBQUFBLGdCQUFBcEUsa0NBQUFBLElBQUMsUUFBQSxFQUFLLFdBQVUsdUJBQXNCLFVBQUEsaUJBQWE7QUFBQSxnQkFDbkRBLGtDQUFBQSxJQUFDLFFBQUEsRUFBSyxXQUFVLHFCQUFxQixtQkFBUyxjQUFBLENBQWM7QUFBQSxjQUFBLEdBQzlEO0FBQUEsY0FFRCxTQUFTLDJCQUNSb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUNDLFVBQUE7QUFBQSxnQkFBQXBFLGtDQUFBQSxJQUFDLFFBQUEsRUFBSyxXQUFVLHVCQUFzQixVQUFBLG1CQUFlO0FBQUEsZ0JBQ3JEb0Usa0NBQUFBLEtBQUMsUUFBQSxFQUFLLFdBQVUscUJBQ2IsVUFBQTtBQUFBLGtCQUFBLFNBQVMsd0JBQXdCLGVBQUE7QUFBQSxrQkFBaUI7QUFBQSxnQkFBQSxFQUFBLENBQ3JEO0FBQUEsY0FBQSxFQUFBLENBQ0Y7QUFBQSxZQUFBLEdBRUo7QUFBQSxZQUlGQSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSw4RUFDYixVQUFBO0FBQUEsY0FBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsdURBQ1osVUFBQTtBQUFBLGdCQUFBLFNBQVMsc0RBQ1AsUUFBQSxFQUFLLFVBQUE7QUFBQSxrQkFBQTtBQUFBLGtCQUFVLElBQUksS0FBSyxTQUFTLFdBQVcsRUFBRSxZQUFBO0FBQUEsZ0JBQVksR0FBRTtBQUFBLGdCQUU5RCxTQUFTLFFBQ1JwRSxzQ0FBQyxRQUFBLEVBQU0sbUJBQVMsS0FBQSxDQUFLO0FBQUEsY0FBQSxHQUV6QjtBQUFBLGNBRUMsU0FBUyxjQUNSb0Usa0NBQUFBO0FBQUFBLGdCQUFDO0FBQUEsZ0JBQUE7QUFBQSxrQkFDQyxTQUFTO0FBQUEsa0JBQ1QsV0FBVTtBQUFBLGtCQUVWLFVBQUE7QUFBQSxvQkFBQXBFLGtDQUFBQSxJQUFDLGNBQUEsRUFBYSxXQUFVLGVBQUEsQ0FBZTtBQUFBLG9CQUFFO0FBQUEsa0JBQUE7QUFBQSxnQkFBQTtBQUFBLGNBQUE7QUFBQSxZQUUzQyxFQUFBLENBRUo7QUFBQSxVQUFBLEVBQUEsQ0FDRjtBQUFBLFFBQUE7QUFBQSxNQUFBO0FBQUEsSUFBQTtBQUFBLEVBR047QUFHQSxTQUNFb0Usa0NBQUFBO0FBQUFBLElBQUM7QUFBQSxJQUFBO0FBQUEsTUFDQyxXQUFXO0FBQUEsUUFDVDtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFBQTtBQUFBLE1BRUYsU0FBUztBQUFBLE1BR1QsVUFBQTtBQUFBLFFBQUFwRSxrQ0FBQUEsSUFBQyxPQUFBLEVBQUksV0FBVSxpQkFDYixVQUFBQSxrQ0FBQUE7QUFBQUEsVUFBQztBQUFBLFVBQUE7QUFBQSxZQUNDLEtBQUssWUFBQTtBQUFBLFlBQ0wsS0FBSyxTQUFTO0FBQUEsWUFDZCxXQUFVO0FBQUEsVUFBQTtBQUFBLFFBQUEsR0FFZDtBQUFBLFFBR0FvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSwyREFFYixVQUFBO0FBQUEsVUFBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsUUFDYixVQUFBO0FBQUEsWUFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLHlDQUF5QyxVQUFBLFNBQVMsTUFBSztBQUFBLFlBQ3JFQSxrQ0FBQUEsSUFBQyxLQUFBLEVBQUUsV0FBVSwwQkFBMEIsbUJBQVMsS0FBQSxDQUFLO0FBQUEsVUFBQSxHQUN2RDtBQUFBLFVBR0FvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxzQ0FDWixVQUFBO0FBQUEsWUFBQSxTQUFTLHVEQUNQLE9BQUEsRUFDQyxVQUFBO0FBQUEsY0FBQXBFLGtDQUFBQSxJQUFDLE9BQUEsRUFBSSxXQUFVLDBCQUF5QixVQUFBLHNCQUFrQjtBQUFBLGNBQzFEb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUseUJBQ1osVUFBQTtBQUFBLGdCQUFBLGtCQUFrQixTQUFTLFlBQVk7QUFBQSxnQkFBRTtBQUFBLGNBQUEsRUFBQSxDQUM1QztBQUFBLFlBQUEsR0FDRjtBQUFBLFlBRUQsU0FBUyxhQUNSQSxrQ0FBQUEsS0FBQyxPQUFBLEVBQ0MsVUFBQTtBQUFBLGNBQUFwRSxrQ0FBQUEsSUFBQyxPQUFBLEVBQUksV0FBVSwwQkFBeUIsVUFBQSxnQkFBWTtBQUFBLGNBQ3BEQSxrQ0FBQUEsSUFBQyxPQUFBLEVBQUksV0FBVSx5QkFBeUIsbUJBQVMsVUFBQSxDQUFVO0FBQUEsWUFBQSxHQUM3RDtBQUFBLFlBRUQsU0FBUyxpQkFDUm9FLGtDQUFBQSxLQUFDLE9BQUEsRUFDQyxVQUFBO0FBQUEsY0FBQXBFLGtDQUFBQSxJQUFDLE9BQUEsRUFBSSxXQUFVLDBCQUF5QixVQUFBLGNBQVU7QUFBQSxjQUNsREEsa0NBQUFBLElBQUMsT0FBQSxFQUFJLFdBQVUseUJBQXlCLG1CQUFTLGNBQUEsQ0FBYztBQUFBLFlBQUEsR0FDakU7QUFBQSxZQUVELFNBQVMsZUFDUm9FLGtDQUFBQSxLQUFDLE9BQUEsRUFDQyxVQUFBO0FBQUEsY0FBQXBFLGtDQUFBQSxJQUFDLE9BQUEsRUFBSSxXQUFVLDBCQUF5QixVQUFBLGtCQUFjO0FBQUEsY0FDdERBLGtDQUFBQSxJQUFDLE9BQUEsRUFBSSxXQUFVLHlCQUF5QixtQkFBUyxZQUFBLENBQVk7QUFBQSxZQUFBLEdBQy9EO0FBQUEsWUFFRCxTQUFTLGlCQUNSb0UsdUNBQUMsT0FBQSxFQUFJLFdBQVUsY0FDYixVQUFBO0FBQUEsY0FBQXBFLGtDQUFBQSxJQUFDLE9BQUEsRUFBSSxXQUFVLDBCQUF5QixVQUFBLGVBQVc7QUFBQSxjQUNuREEsa0NBQUFBLElBQUMsT0FBQSxFQUFJLFdBQVUsZ0NBQWdDLG1CQUFTLGNBQUEsQ0FBYztBQUFBLFlBQUEsRUFBQSxDQUN4RTtBQUFBLFVBQUEsR0FFSjtB
25114QUFBLFVBR0MsU0FBUyxjQUNSb0Usa0NBQUFBO0FBQUFBLFlBQUM7QUFBQSxZQUFBO0FBQUEsY0FDQyxTQUFTO0FBQUEsY0FDVCxXQUFVO0FBQUEsY0FFVixVQUFBO0FBQUEsZ0JBQUFwRSxrQ0FBQUEsSUFBQyxjQUFBLEVBQWEsV0FBVSxlQUFBLENBQWU7QUFBQSxnQkFBRTtBQUFBLGNBQUE7QUFBQSxZQUFBO0FBQUEsVUFBQTtBQUFBLFFBRTNDLEVBQUEsQ0FFSjtBQUFBLE1BQUE7QUFBQSxJQUFBO0FBQUEsRUFBQTtBQUdOO0FDNVJPLE1BQU0sZUFBNEMsQ0FBQztBQUFBLEVBQ3hEO0FBQUEsRUFDQSxVQUFVO0FBQUEsRUFDVjtBQUFBLEVBQ0EsWUFBWTtBQUNkLE1BQU07QUFDSixTQUNFQSxrQ0FBQUE7QUFBQUEsSUFBQztBQUFBLElBQUE7QUFBQSxNQUNDO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFBQTtBQUFBLEVBQUE7QUFHTjtBQ2hCTyxNQUFNLGVBQTRDLENBQUM7QUFBQSxFQUN4RDtBQUFBLEVBQ0E7QUFBQSxFQUNBLFlBQVk7QUFDZCxNQUFNO0FBQ0osUUFBTSxDQUFDLFlBQVksYUFBYSxJQUFJMEUsYUFBQUEsU0FBUyxFQUFFO0FBQy9DLFFBQU0sQ0FBQyxjQUFjLGVBQWUsSUFBSUEsYUFBQUEsU0FBUyxFQUFFO0FBQ25ELFFBQU0sQ0FBQyxjQUFjLGVBQWUsSUFBSUEsYUFBQUEsU0FBUyxFQUFFO0FBR25ELFFBQU0sU0FBU1MsYUFBQUEsUUFBUSxNQUFNO0FBQzNCLFVBQU0sVUFBVSxJQUFJLElBQUksVUFBVSxJQUFJLENBQUEsUUFBTyxJQUFJLElBQUksRUFBRSxPQUFPLE9BQU8sQ0FBQztBQUN0RSxXQUFPLE1BQU0sS0FBSyxPQUFPLEVBQUUsS0FBQTtBQUFBLEVBQzdCLEdBQUcsQ0FBQyxTQUFTLENBQUM7QUFFZCxRQUFNLFFBQVFBLGFBQUFBLFFBQVEsTUFBTTtBQUMxQixVQUFNLFVBQVUsSUFBSSxJQUFJLFVBQVUsSUFBSSxDQUFBLFFBQU8sSUFBSSxJQUFJLEVBQUUsT0FBTyxPQUFPLENBQUM7QUFDdEUsV0FBTyxNQUFNLEtBQUssT0FBTyxFQUFFLEtBQUE7QUFBQSxFQUM3QixHQUFHLENBQUMsU0FBUyxDQUFDO0FBR2QsUUFBTSxvQkFBb0JBLGFBQUFBLFFBQVEsTUFBTTtBQUN0QyxXQUFPLFVBQVUsT0FBTyxDQUFBLGFBQVk7QUFDbEMsWUFBTSxnQkFBZ0IsQ0FBQyxjQUNyQixTQUFTLEtBQUssY0FBYyxTQUFTLFdBQVcsWUFBQSxDQUFhLEtBQzdELFNBQVMsTUFBTSxZQUFBLEVBQWMsU0FBUyxXQUFXLFlBQUEsQ0FBYSxLQUM5RCxTQUFTLFNBQVMsWUFBQSxFQUFjLFNBQVMsV0FBVyxZQUFBLENBQWE7QUFFbkUsWUFBTSxjQUFjLENBQUMsZ0JBQWdCLFNBQVMsU0FBUztBQUN2RCxZQUFNLGNBQWMsQ0FBQyxnQkFBZ0IsU0FBUyxTQUFTO0FBRXZELGFBQU8saUJBQWlCLGVBQWU7QUFBQSxJQUN6QyxDQUFDO0FBQUEsRUFDSCxHQUFHLENBQUMsV0FBVyxZQUFZLGNBQWMsWUFBWSxDQUFDO0FBRXRELFNBQ0VmLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFXLGFBQWEsU0FBUyxJQUVwQyxVQUFBO0FBQUEsSUFBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsK0VBQ2IsVUFBQTtBQUFBLE1BQUFwRSxrQ0FBQUEsSUFBQyxTQUFJLFdBQVUsbUJBQ2IsVUFBQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLFlBQ2IsVUFBQTtBQUFBLFFBQUFwRSxrQ0FBQUE7QUFBQUEsVUFBQztBQUFBLFVBQUE7QUFBQSxZQUNDLE1BQUs7QUFBQSxZQUNMLGFBQVk7QUFBQSxZQUNaLE9BQU87QUFBQSxZQUNQLFVBQVUsQ0FBQyxNQUFNLGNBQWMsRUFBRSxPQUFPLEtBQUs7QUFBQSxZQUM3QyxXQUFVO0FBQUEsVUFBQTtBQUFBLFFBQUE7QUFBQSxRQUVaQSxrQ0FBQUEsSUFBQyxPQUFBLEVBQUksV0FBVSx3RUFDYixVQUFBQSxrQ0FBQUEsSUFBQyxTQUFJLFdBQVUseUJBQXdCLE1BQUssUUFBTyxRQUFPLGdCQUFlLFNBQVEsYUFDL0UsVUFBQUEsa0NBQUFBLElBQUMsUUFBQSxFQUFLLGVBQWMsU0FBUSxnQkFBZSxTQUFRLGFBQWEsR0FBRyxHQUFFLDhDQUFBLENBQThDLEVBQUEsQ0FDckgsRUFBQSxDQUNGO0FBQUEsTUFBQSxFQUFBLENBQ0YsRUFBQSxDQUNGO0FBQUEsTUFFQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGNBQ2IsVUFBQTtBQUFBLFFBQUFBLGtDQUFBQTtBQUFBQSxVQUFDO0FBQUEsVUFBQTtBQUFBLFlBQ0MsT0FBTztBQUFBLFlBQ1AsVUFBVSxDQUFDLE1BQU0sZ0JBQWdCLEVBQUUsT0FBTyxLQUFLO0FBQUEsWUFDL0MsV0FBVTtBQUFBLFlBRVYsVUFBQTtBQUFBLGNBQUFwRSxrQ0FBQUEsSUFBQyxVQUFBLEVBQU8sT0FBTSxJQUFHLFVBQUEsZUFBVztBQUFBLGNBQzNCLE9BQU8sSUFBSSxDQUFBLFNBQ1ZBLGtDQUFBQSxJQUFDLFlBQWtCLE9BQU8sTUFBTyxVQUFBLEtBQUEsR0FBcEIsSUFBeUIsQ0FDdkM7QUFBQSxZQUFBO0FBQUEsVUFBQTtBQUFBLFFBQUE7QUFBQSxRQUdIb0Usa0NBQUFBO0FBQUFBLFVBQUM7QUFBQSxVQUFBO0FBQUEsWUFDQyxPQUFPO0FBQUEsWUFDUCxVQUFVLENBQUMsTUFBTSxnQkFBZ0IsRUFBRSxPQUFPLEtBQUs7QUFBQSxZQUMvQyxXQUFVO0FBQUEsWUFFVixVQUFBO0FBQUEsY0FBQXBFLGtDQUFBQSxJQUFDLFVBQUEsRUFBTyxPQUFNLElBQUcsVUFBQSxjQUFVO0FBQUEsY0FDMUIsTUFBTSxJQUFJLENBQUEsU0FDVEEsa0NBQUFBLElBQUMsWUFBa0IsT0FBTyxNQUFPLFVBQUEsS0FBQSxHQUFwQixJQUF5QixDQUN2QztBQUFBLFlBQUE7QUFBQSxVQUFBO0FBQUEsUUFBQTtBQUFBLE1BQ0gsRUFBQSxDQUNGO0FBQUEsSUFBQSxHQUNGO0FBQUEsSUFHQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLHlCQUNaLFVBQUE7QUFBQSxNQUFBLGtCQUFrQjtBQUFBLE1BQU87QUFBQSxNQUFNLFVBQVU7QUFBQSxNQUFPO0FBQUEsSUFBQSxHQUNuRDtBQUFBLDBDQUdDLE9BQUEsRUFBSSxXQUFVLHVFQUNaLFVBQUEsa0JBQWtCLElBQUksQ0FBQyxhQUN0QnBFLGtDQUFBQTtBQUFBQSxNQUFDO0FBQUEsTUFBQTtBQUFBLFFBRUM7QUFBQSxRQUNBLFVBQVU7QUFBQSxRQUNWLFdBQVU7QUFBQSxNQUFBO0FBQUEsTUFITCxTQUFTO0FBQUEsSUFBQSxDQUtqQixHQUNIO0FBQUEsSUFHQyxrQkFBa0IsV0FBVyxLQUM1Qm9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLHFCQUNiLFVBQUE7QUFBQSxNQUFBcEUsa0NBQUFBLElBQUMsT0FBQSxFQUFJLFdBQVUsc0JBQ2IsVUFBQUEsa0NBQUFBLElBQUMsT0FBQSxFQUFJLFdBQVUscUJBQW9CLE1BQUssUUFBTyxRQUFPLGdCQUFlLFNBQVEsYUFDM0UsVUFBQUEsa0NBQUFBLElBQUMsUUFBQSxFQUFLLGVBQWMsU0FBUSxnQkFBZSxTQUFRLGFBQWEsR0FBRyxHQU
25114FFLDRJQUFBLENBQTRJLEVBQUEsQ0FDbk4sRUFBQSxDQUNGO0FBQUEsTUFDQUEsa0NBQUFBLElBQUMsTUFBQSxFQUFHLFdBQVUsMENBQXlDLFVBQUEsNEJBQXdCO0FBQUEsTUFDL0VBLGtDQUFBQSxJQUFDLEtBQUEsRUFBRSxXQUFVLGlCQUFnQixVQUFBLGlEQUFBLENBQThDO0FBQUEsSUFBQSxFQUFBLENBQzdFO0FBQUEsRUFBQSxHQUVKO0FBRUo7QUNySEEsTUFBTSxnQkFBNEI7QUFBQSxFQUNoQztBQUFBLElBQ0UsSUFBSTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsWUFBWTtBQUFBLElBQ1osU0FBUztBQUFBLElBQ1QsYUFBYSxFQUFFLEtBQUssU0FBUyxLQUFLLE9BQUE7QUFBQSxJQUNsQyxXQUFXO0FBQUEsSUFDWCxZQUFZO0FBQUEsSUFDWixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsTUFDTixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixLQUFLO0FBQUEsUUFDSCx5Q0FBeUM7QUFBQSxRQUN6Qyw4Q0FBOEM7QUFBQSxRQUM5QyxvQ0FBb0M7QUFBQSxNQUFBO0FBQUEsSUFDdEM7QUFBQSxJQUVGLFdBQVc7QUFBQSxJQUNYLFdBQVc7QUFBQSxFQUFBO0FBQUEsRUFFYjtBQUFBLElBQ0UsSUFBSTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsWUFBWTtBQUFBLElBQ1osU0FBUztBQUFBLElBQ1QsYUFBYSxFQUFFLEtBQUssU0FBUyxLQUFLLFFBQUE7QUFBQSxJQUNsQyxXQUFXO0FBQUEsSUFDWCxZQUFZO0FBQUEsSUFDWixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsTUFDTixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixLQUFLO0FBQUEsUUFDSCx5Q0FBeUM7QUFBQSxRQUN6Qyw4Q0FBOEM7QUFBQSxRQUM5QyxvQ0FBb0M7QUFBQSxNQUFBO0FBQUEsSUFDdEM7QUFBQSxJQUVGLFdBQVc7QUFBQSxJQUNYLFdBQVc7QUFBQSxFQUFBO0FBQUEsRUFFYjtBQUFBLElBQ0UsSUFBSTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsWUFBWTtBQUFBLElBQ1osU0FBUztBQUFBLElBQ1QsYUFBYSxFQUFFLEtBQUssU0FBUyxLQUFLLFFBQUE7QUFBQSxJQUNsQyxXQUFXO0FBQUEsSUFDWCxZQUFZO0FBQUEsSUFDWixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsTUFDTixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixLQUFLO0FBQUEsUUFDSCx5Q0FBeUM7QUFBQSxRQUN6Qyw4Q0FBOEM7QUFBQSxRQUM5QyxvQ0FBb0M7QUFBQSxNQUFBO0FBQUEsSUFDdEM7QUFBQSxJQUVGLFdBQVc7QUFBQSxJQUNYLFdBQVc7QUFBQSxFQUFBO0FBQUEsRUFFYjtBQUFBLElBQ0UsSUFBSTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsWUFBWTtBQUFBLElBQ1osU0FBUztBQUFBLElBQ1QsYUFBYSxFQUFFLEtBQUssU0FBUyxLQUFLLE9BQUE7QUFBQSxJQUNsQyxXQUFXO0FBQUEsSUFDWCxZQUFZO0FBQUEsSUFDWixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsTUFDTixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixLQUFLO0FBQUEsUUFDSCx5Q0FBeUM7QUFBQSxRQUN6Qyw4Q0FBOEM7QUFBQSxRQUM5QyxvQ0FBb0M7QUFBQSxNQUFBO0FBQUEsSUFDdEM7QUFBQSxJQUVGLFdBQVc7QUFBQSxJQUNYLFdBQVc7QUFBQSxFQUFBO0FBRWY7QUFFTyxNQUFNLG9CQUE4QixNQUFNO0FBQy9DLFFBQU0sdUJBQXVCLENBQUMsYUFBdUI7QUFDbkQsWUFBUSxJQUFJLHNCQUFzQixRQUFRO0FBQzFDLFVBQU0sc0JBQXNCLFNBQVMsSUFBSSxPQUFPLFNBQVMsSUFBSSxFQUFFO0FBQUEsRUFDakU7QUFFQSwrQ0FDRyxPQUFBLEVBQUksV0FBVSxnQ0FDYixVQUFBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsMENBQ2IsVUFBQTtBQUFBLElBQUFBLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLFFBQ2IsVUFBQTtBQUFBLE1BQUFwRSxrQ0FBQUEsSUFBQyxNQUFBLEVBQUcsV0FBVSx5Q0FBd0MsVUFBQSx1QkFFdEQ7QUFBQSxNQUNBQSxrQ0FBQUEsSUFBQyxLQUFBLEVBQUUsV0FBVSxpQkFBZ0IsVUFBQSxzREFBQSxDQUU3QjtBQUFBLElBQUEsR0FDRjtBQUFBLElBRUFBLGtDQUFBQTtBQUFBQSxNQUFDO0FBQUEsTUFBQTtBQUFBLFFBQ0MsV0FBVztBQUFBLFFBQ1gsa0JBQWtCO0FBQUEsTUFBQTtBQUFBLElBQUE7QUFBQSxFQUNwQixFQUFBLENBQ0YsRUFBQSxDQUNGO0FBRUo7QUN4SEEsTUFBTSxlQUEwQjtBQUFBLEVBQzlCO0FBQUEsSUFDRSxJQUFJO0FBQUEsSUFDSixZQUFZO0FBQUEsSUFDWixXQUFXO0FBQUEsSUFDWCxVQUFVO0FBQUEsSUFDVixVQUFVO0FBQUEsSUFDVixVQUFVO0FBQUEsSUFDVixZQUFZO0FBQUEsSUFDWixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxLQUFLO0FBQUEsSUFDTCxhQUFhLENBQUMscUJBQXFCLGNBQWMsaUJBQWlCO0FBQUEsSUFDbEUsV0FBVyxDQUFDLFdBQVcsWUFBWSxTQUFTO0FBQUEsSUFDNUMsYUFBYTtBQUFBLE1BQ1g7QUFBQSxRQUNFLFVBQVU7QUFBQSxRQUNWLEtBQUs7QUFBQSxRQUNMLE9BQU87QUFBQSxNQUFBO0FBQUEsTUFFVDtBQUFBLFFBQ0UsVUFBVTtBQUFBLFFBQ1YsS0FBSztBQUFBLFFBQ0wsT0FBTztBQUFBLE1BQUE7QUFBQSxJQUNUO0FBQUEsSUFFRixVQUFVO0FBQUEsSUFDVixXQUFXO0FBQUEsSUFDWCxXQUFXO0FBQUEsRUFBQTtBQUFBLEVBRWI7QUFBQSxJQUNFLElBQUk7QUFBQSxJQUNKLFlBQVk7QUFBQSxJQUNaLFdBQVc7QUFBQSxJQUNYLFVBQVU7QUFBQSxJQUNWLFVBQVU7QUFBQSxJQUNWLFVBQVU7QUFBQSxJQUNWLFlBQVk7QUFBQSxJQUNaLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEtBQUs7QUFBQSxJQUNMLGFBQWEsQ0FBQyxjQUFjLGFBQWEsZ0JBQWdCO0FBQUEsSUFDekQsV0FBVyxDQUFDLFdBQVcsVUFBVTtBQUFBLElBQ2pDLGFBQWE7QUFBQSxNQUNYO0FBQUEsUUFDRSxVQUFVO0FBQUEsUUFDVixLQUFLO0FBQUEsUUFDTCxPQUFPO0FBQUEsTUFBQTtBQUFBLElBQ1Q7QUFBQSxJQUVGLFVBQVU7QUFBQSxJQUNWLFdBQVc7QUFBQSxJQUNYLFdBQVc7QUFBQSxFQUFBO0FBQUEsRUFFYjtBQUFBLElBQ0UsSUFBSTtBQUFBLElBQ0osWUFBWTtBQUFBLElBQ1osV0FBVztBQUFBLElBQ1gsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLElBQ1YsWUFBWTtBQUFBLElBQ1osT0FBTztBQUFBLElBQ1AsT0FBTztBQUFBLElBQ1AsT0FBTztBQUFBLElBQ1AsS0FBSztBQUFBLElBQ0wsYUFBYSxDQUFDLDBCQUEwQix1QkFBdUIsa0JBQWtCO0FBQUEsSUFDakYsV0FBVyxDQUFDLFdBQVcsWUFBWSxhQUFhO0FBQUEsSUFDaEQsYUFBYTtBQUFBLE1BQ1g7QUFBQSxRQUNFLFVBQVU7QUFBQSxRQUNWLEtBQUs7QUFBQSxRQUNMLE9BQU87QUFBQSxNQUFBO0FBQUEsSUFDVDtBQUFBLElBRUYsVUFBVTtBQUFBLElBQ1YsV0FBVztBQUFBLElBQ1gsV0FBVztBQUFBLEVBQUE7QUFBQSxFQUViO0FBQUEsSUFDRSxJQUFJO0FBQUEsSUFDSixZQU
25114FZO0FBQUEsSUFDWixXQUFXO0FBQUEsSUFDWCxVQUFVO0FBQUEsSUFDVixVQUFVO0FBQUEsSUFDVixVQUFVO0FBQUEsSUFDVixZQUFZO0FBQUEsSUFDWixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxLQUFLO0FBQUEsSUFDTCxhQUFhLENBQUMsYUFBYSxvQkFBb0IsY0FBYztBQUFBLElBQzdELFdBQVcsQ0FBQyxXQUFXLFlBQVksYUFBYTtBQUFBLElBQ2hELGFBQWE7QUFBQSxNQUNYO0FBQUEsUUFDRSxVQUFVO0FBQUEsUUFDVixLQUFLO0FBQUEsUUFDTCxPQUFPO0FBQUEsTUFBQTtBQUFBLE1BRVQ7QUFBQSxRQUNFLFVBQVU7QUFBQSxRQUNWLEtBQUs7QUFBQSxRQUNMLE9BQU87QUFBQSxNQUFBO0FBQUEsSUFDVDtBQUFBLElBRUYsVUFBVTtBQUFBLElBQ1YsV0FBVztBQUFBLElBQ1gsV0FBVztBQUFBLEVBQUE7QUFFZjtBQUVPLE1BQU0sbUJBQTZCLE1BQU07QUFDOUMsUUFBTSxzQkFBc0IsQ0FBQyxZQUFxQjtBQUNoRCxZQUFRLElBQUkscUJBQXFCLE9BQU87QUFDeEMsVUFBTSxxQkFBcUIsUUFBUSxRQUFRLE1BQU0sUUFBUSxRQUFRLEVBQUU7QUFBQSxFQUNyRTtBQUVBLCtDQUNHLE9BQUEsRUFBSSxXQUFVLGdDQUNiLFVBQUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSwwQ0FDYixVQUFBO0FBQUEsSUFBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsUUFDYixVQUFBO0FBQUEsTUFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLHlDQUF3QyxVQUFBLHNCQUV0RDtBQUFBLE1BQ0FBLGtDQUFBQSxJQUFDLEtBQUEsRUFBRSxXQUFVLGlCQUFnQixVQUFBLHFEQUFBLENBRTdCO0FBQUEsSUFBQSxHQUNGO0FBQUEsMENBR0MsT0FBQSxFQUFJLFdBQVUsdUVBQ1osVUFBQSxhQUFhLElBQUksQ0FBQyxZQUNqQkEsa0NBQUFBO0FBQUFBLE1BQUM7QUFBQSxNQUFBO0FBQUEsUUFFQztBQUFBLFFBQ0EsU0FBUztBQUFBLFFBQ1QsV0FBVTtBQUFBLE1BQUE7QUFBQSxNQUhMLFFBQVE7QUFBQSxJQUFBLENBS2hCLEVBQUEsQ0FDSDtBQUFBLEVBQUEsRUFBQSxDQUNGLEVBQUEsQ0FDRjtBQUVKO0FDbkpPLE1BQU0sYUFBdUIsTUFBTTtBQUN4QywrQ0FDRyxPQUFBLEVBQUksV0FBVSwwQ0FDYixVQUFBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsZ0NBQ2IsVUFBQTtBQUFBLElBQUFBLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGVBQ2IsVUFBQTtBQUFBLE1BQUFwRSxrQ0FBQUEsSUFBQyxNQUFBLEVBQUcsV0FBVSxnRUFBK0QsVUFBQSwwQkFFN0U7QUFBQSxNQUNBQSxrQ0FBQUEsSUFBQyxLQUFBLEVBQUUsV0FBVSx1QkFBc0IsVUFBQSxxRUFBQSxDQUVuQztBQUFBLElBQUEsR0FDRjtBQUFBLElBR0FvRSxrQ0FBQUEsS0FBQyxXQUFBLEVBQVEsV0FBVSxhQUNqQixVQUFBO0FBQUEsTUFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLDJEQUEwRCxVQUFBLHdCQUV4RTtBQUFBLE1BRUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSx3REFFYixVQUFBO0FBQUEsUUFBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsYUFDYixVQUFBO0FBQUEsVUFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLDJDQUEwQyxVQUFBLGtCQUFjO0FBQUEsVUFDdEVvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxhQUNiLFVBQUE7QUFBQSxZQUFBcEUsa0NBQUFBLElBQUMsa0JBQUEsRUFBaUIsTUFBSyxNQUFLLFVBQUEsb0JBQWdCO0FBQUEsWUFDNUNBLGtDQUFBQSxJQUFDLGtCQUFBLEVBQWlCLE1BQUssTUFBSyxVQUFBLG9CQUFnQjtBQUFBLFlBQzVDQSxrQ0FBQUEsSUFBQyxrQkFBQSxFQUFpQixNQUFLLE1BQUssVUFBQSxtQkFBQSxDQUFnQjtBQUFBLFVBQUEsRUFBQSxDQUM5QztBQUFBLFFBQUEsR0FDRjtBQUFBLFFBR0FvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxhQUNiLFVBQUE7QUFBQSxVQUFBcEUsa0NBQUFBLElBQUMsTUFBQSxFQUFHLFdBQVUsMkNBQTBDLFVBQUEscUJBQWlCO0FBQUEsVUFDekVvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxhQUNiLFVBQUE7QUFBQSxZQUFBcEUsa0NBQUFBLElBQUMsb0JBQUEsRUFBbUIsTUFBSyxNQUFLLFVBQUEsa0JBQWM7QUFBQSxZQUM1Q0Esa0NBQUFBLElBQUMsb0JBQUEsRUFBbUIsTUFBSyxNQUFLLFVBQUEsa0JBQWM7QUFBQSxZQUM1Q0Esa0NBQUFBLElBQUMsb0JBQUEsRUFBbUIsTUFBSyxNQUFLLFVBQUEsaUJBQUEsQ0FBYztBQUFBLFVBQUEsRUFBQSxDQUM5QztBQUFBLFFBQUEsR0FDRjtBQUFBLFFBR0FvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxhQUNiLFVBQUE7QUFBQSxVQUFBcEUsa0NBQUFBLElBQUMsTUFBQSxFQUFHLFdBQVUsMkNBQTBDLFVBQUEsZ0JBQVk7QUFBQSxVQUNwRW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGFBQ2IsVUFBQTtBQUFBLFlBQUFwRSxrQ0FBQUEsSUFBQyxpQkFBQSxFQUFnQixNQUFLLE1BQUssVUFBQSx5QkFBcUI7QUFBQSxZQUNoREEsa0NBQUFBLElBQUMsaUJBQUEsRUFBZ0IsTUFBSyxNQUFLLFVBQUEseUJBQXFCO0FBQUEsWUFDaERBLGtDQUFBQSxJQUFDLGlCQUFBLEVBQWdCLE1BQUssTUFBSyxVQUFBLHdCQUFBLENBQXFCO0FBQUEsVUFBQSxFQUFBLENBQ2xEO0FBQUEsUUFBQSxHQUNGO0FBQUEsUUFHQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGFBQ2IsVUFBQTtBQUFBLFVBQUFwRSxrQ0FBQUEsSUFBQyxNQUFBLEVBQUcsV0FBVSwyQ0FBMEMsVUFBQSx1QkFBbUI7QUFBQSxVQUMzRW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGFBQ2IsVUFBQTtBQUFBLFlBQUFwRSxrQ0FBQUEsSUFBQyxnQkFBQSxFQUFlLE1BQUssTUFBSyxVQUFBLGlCQUFhO0FBQUEsWUFDdkNBLGtDQUFBQSxJQUFDLGdCQUFBLEVBQWUsTUFBSyxNQUFLLFVBQUEsaUJBQWE7QUFBQSxZQUN2Q0Esa0NBQUFBLElBQUMsZ0JBQUEsRUFBZSxNQUFLLE1BQUssVUFBQSxnQkFBQSxDQUFhO0FBQUEsVUFBQSxFQUFBLENBQ3pDO0FBQUEsUUFBQSxFQUFBLENBQ0Y7QUFBQSxNQUFBLEVBQUEsQ0FDRjtBQUFBLElBQUEsR0FDRjtBQUFBLElBR0FvRSxrQ0FBQUEsS0FBQyxXQUFBLEVBQVEsV0FBVSxhQUNqQixVQUFBO0FBQUEsTUFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLDJEQUEwRCxVQUFBLGlCQUV4RTtBQUFBLE1BRUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSx5Q0FDYixVQUFBO0FBQUEsUUFBQUEsa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsYUFDYixVQUFBO0FBQUEsVUFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLDJDQUEwQyxVQUFBLFVBQU07QUFBQSxVQUM5RG9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGFBQ2IsVUFBQTtBQUFBLFlBQUFwRSxrQ0FBQUEsSUFBQyxvQkFBaUIsVUFBQSxtQk
25114FBQSxDQUFnQjtBQUFBLFlBQ2xDQSxrQ0FBQUEsSUFBQyxtQkFBZ0IsVUFBQSx3QkFBQSxDQUFxQjtBQUFBLFlBQ3RDQSxrQ0FBQUEsSUFBQyxrQkFBZSxVQUFBLGdCQUFBLENBQWE7QUFBQSxVQUFBLEVBQUEsQ0FDL0I7QUFBQSxRQUFBLEdBQ0Y7QUFBQSxRQUVBb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsYUFDYixVQUFBO0FBQUEsVUFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLDJDQUEwQyxVQUFBLFdBQU87QUFBQSxVQUMvRG9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGFBQ2IsVUFBQTtBQUFBLFlBQUFwRSxrQ0FBQUEsSUFBQyxrQkFBQSxFQUFpQixTQUFPLE1BQUMsVUFBQSxvQkFBZ0I7QUFBQSxZQUMxQ0Esa0NBQUFBLElBQUMsaUJBQUEsRUFBZ0IsU0FBTyxNQUFDLFVBQUEseUJBQXFCO0FBQUEsWUFDOUNBLGtDQUFBQSxJQUFDLGdCQUFBLEVBQWUsU0FBTyxNQUFDLFVBQUEsZ0JBQUEsQ0FBYTtBQUFBLFVBQUEsRUFBQSxDQUN2QztBQUFBLFFBQUEsR0FDRjtBQUFBLFFBRUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxhQUNiLFVBQUE7QUFBQSxVQUFBcEUsa0NBQUFBLElBQUMsTUFBQSxFQUFHLFdBQVUsMkNBQTBDLFVBQUEsWUFBUTtBQUFBLFVBQ2hFb0Usa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsYUFDYixVQUFBO0FBQUEsWUFBQXBFLGtDQUFBQSxJQUFDLGtCQUFBLEVBQWlCLFVBQVEsTUFBQyxVQUFBLG9CQUFnQjtBQUFBLFlBQzNDQSxrQ0FBQUEsSUFBQyxpQkFBQSxFQUFnQixVQUFRLE1BQUMsVUFBQSx5QkFBcUI7QUFBQSxZQUMvQ0Esa0NBQUFBLElBQUMsZ0JBQUEsRUFBZSxVQUFRLE1BQUMsVUFBQSxnQkFBQSxDQUFhO0FBQUEsVUFBQSxFQUFBLENBQ3hDO0FBQUEsUUFBQSxFQUFBLENBQ0Y7QUFBQSxNQUFBLEVBQUEsQ0FDRjtBQUFBLElBQUEsR0FDRjtBQUFBLElBR0FvRSxrQ0FBQUEsS0FBQyxXQUFBLEVBQVEsV0FBVSxhQUNqQixVQUFBO0FBQUEsTUFBQXBFLGtDQUFBQSxJQUFDLE1BQUEsRUFBRyxXQUFVLDJEQUEwRCxVQUFBLHNCQUV4RTtBQUFBLE1BRUFvRSxrQ0FBQUEsS0FBQyxPQUFBLEVBQUksV0FBVSxzQkFDYixVQUFBO0FBQUEsUUFBQXBFLGtDQUFBQSxJQUFDLGtCQUFBLEVBQWlCLFdBQVMsTUFBQyxVQUFBLG9CQUFnQjtBQUFBLFFBQzVDQSxrQ0FBQUEsSUFBQyxvQkFBQSxFQUFtQixXQUFTLE1BQUMsVUFBQSxrQkFBYztBQUFBLFFBQzVDQSxrQ0FBQUEsSUFBQyxpQkFBQSxFQUFnQixXQUFTLE1BQUMsVUFBQSx5QkFBcUI7QUFBQSxRQUNoREEsa0NBQUFBLElBQUMsZ0JBQUEsRUFBZSxXQUFTLE1BQUMsVUFBQSxnQkFBQSxDQUFhO0FBQUEsTUFBQSxFQUFBLENBQ3pDO0FBQUEsSUFBQSxHQUNGO0FBQUEsSUFHQW9FLGtDQUFBQSxLQUFDLFdBQUEsRUFBUSxXQUFVLGFBQ2pCLFVBQUE7QUFBQSxNQUFBcEUsa0NBQUFBLElBQUMsTUFBQSxFQUFHLFdBQVUsMkRBQTBELFVBQUEsb0NBRXhFO0FBQUEsTUFFQW9FLGtDQUFBQSxLQUFDLE9BQUEsRUFBSSxXQUFVLGFBQ2IsVUFBQTtBQUFBLFFBQUFwRSxrQ0FBQUEsSUFBQyxPQUFBLEVBQUksV0FBVSw0REFBMkQsVUFBQSw0RUFFMUU7QUFBQSxRQUNBQSxrQ0FBQUEsSUFBQyxPQUFBLEVBQUksV0FBVSwwREFBeUQsVUFBQSxzRUFFeEU7QUFBQSxRQUNBQSxrQ0FBQUEsSUFBQyxPQUFBLEVBQUksV0FBVSwwREFBeUQsVUFBQSxnQ0FFeEU7QUFBQSxRQUNBQSxrQ0FBQUEsSUFBQyxPQUFBLEVBQUksV0FBVSw0REFBMkQsVUFBQSxtQ0FBQSxDQUUxRTtBQUFBLE1BQUEsRUFBQSxDQUNGO0FBQUEsSUFBQSxFQUFBLENBQ0Y7QUFBQSxFQUFBLEVBQUEsQ0FDRixFQUFBLENBQ0Y7QUFFSjtBQ2xJQSxNQUFNLFNBQVMsb0JBQW9CO0FBQUEsRUFDakM7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLCtDQUFVLEtBQUEsQ0FBQSxDQUFJO0FBQUEsRUFBQTtBQUFBLEVBRWhCO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTiwrQ0FBVSxXQUFBLENBQUEsQ0FBVTtBQUFBLEVBQUE7QUFBQSxFQUV0QjtBQUFBLElBQ0UsTUFBTTtBQUFBLElBQ04sK0NBQVUsY0FBQSxDQUFBLENBQWE7QUFBQSxFQUFBO0FBQUEsRUFFekI7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLCtDQUFVLG1CQUFBLENBQUEsQ0FBa0I7QUFBQSxFQUFBO0FBQUEsRUFFOUI7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLCtDQUFVLGtCQUFBLENBQUEsQ0FBaUI7QUFBQSxFQUFBO0FBQUEsRUFFN0I7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLCtDQUFVLFlBQUEsQ0FBQSxDQUFXO0FBQUEsRUFBQTtBQUV6QixDQUFDO0FBRU0sTUFBTSxZQUFzQixNQUFNO0FBQ3ZDLFNBQU9BLHNDQUFDb0YsbUJBQWUsUUFBZ0I7QUFDekM7QUNwQ0EsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLFdBQVcsU0FBUztBQUNwRCxTQUFTLGlCQUFpQixXQUFXO0FBQ25DLFNBQU8sZ0JBQWdCLFNBQVMsU0FBUztBQUMzQztBQUNBLGVBQWUsMEJBQTBCO0FBQUEsRUFDdkMsYUFBQXZGO0FBQUEsRUFDQTtBQUFBLEVBQ0EsU0FBUyxNQUFNLEtBQUssS0FBSztBQUFBLEVBQ3pCLFNBQVM7QUFBQSxFQUNUO0FBQ0YsR0FBRztBQUNELE1BQUk7QUFDRixVQUFNLGtCQUFrQixNQUFNLFVBQVUsY0FBQTtBQUN4QyxRQUFJLGlCQUFpQjtBQUNuQixVQUFJLGdCQUFnQixXQUFXO0FBQzdCLGNBQU0sVUFBVSxLQUFLLElBQUEsSUFBUSxnQkFBZ0IsWUFBWTtBQUN6RCxjQUFNLFNBQVMsZ0JBQWdCLFdBQVc7QUFDMUMsWUFBSSxXQUFXLFFBQVE7QUFDckIsaUJBQU8sVUFBVSxhQUFBO0FBQUEsUUFDbkIsT0FBTztBQUNMLGtCQUFRQSxjQUFhLGdCQUFnQixhQUFhLGNBQWM7QUFBQSxRQUNsRTtBQUFBLE1BQ0YsT0FBTztBQUNMLGVBQU8sVUFBVSxhQUFBO0FBQUEsTUFDbkI7QUFBQSxJQUNGO0FBQUEsRUFDRixTQUFTLEtBQUs7QUFPWixVQUFNLFVBQVUsYUFBQTtBQUNoQixVQUFNO0FBQUEsRUFDUjtBQUNGO0FBQ0EsZUFBZSx1QkFBdUI7QUFBQSxFQUNwQyxhQUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLFNBQVM7QUFBQSxFQUNUO0FBQ0YsR0FBRztBQUNELFFBQU0sZ0JBQWdCO0FBQUEsSUFDcEI7QUFBQSxJQUNBLFdBQVcsS0FBSyxJQUFBO0FBQUEsSUFDaEIsYUFBYSxVQUFVQSxjQUFhLGdCQUFnQjtBQUFBLEVBQUE7QUFFdEQsUUFBTSxVQUFVLGNBQWMsYUFBYTtBQUM3QztBQUNBLFNBQVMsNEJBQTRCLE9BQU87QUFDMUMsUUFBTSx3QkFBd0IsTUFBTSxZQUFZLGdCQUFnQixVQUFVLENBQUMsVUFBVTtBQUNuRixRQUFJLGlCQUFpQixN
25114QUFNLElBQUksR0FBRztBQUNoQyw2QkFBdUIsS0FBSztBQUFBLElBQzlCO0FBQUEsRUFDRixDQUFDO0FBQ0QsUUFBTSwyQkFBMkIsTUFBTSxZQUFZLG1CQUFtQixVQUFVLENBQUMsVUFBVTtBQUN6RixRQUFJLGlCQUFpQixNQUFNLElBQUksR0FBRztBQUNoQyw2QkFBdUIsS0FBSztBQUFBLElBQzlCO0FBQUEsRUFDRixDQUFDO0FBQ0QsU0FBTyxNQUFNO0FBQ1gsMEJBQUE7QUFDQSw2QkFBQTtBQUFBLEVBQ0Y7QUFDRjtBQUNBLFNBQVMsbUJBQW1CLE9BQU87QUFDakMsTUFBSSxrQkFBa0I7QUFDdEIsTUFBSTtBQUNKLFFBQU0sY0FBYyxNQUFNO0FBQ3hCLHNCQUFrQjtBQUNsQixvQ0FBQTtBQUFBLEVBQ0Y7QUFDQSxRQUFNLGlCQUFpQiwwQkFBMEIsS0FBSyxFQUFFLEtBQUssTUFBTTtBQUNqRSxRQUFJLENBQUMsaUJBQWlCO0FBQ3BCLHNDQUFnQyw0QkFBNEIsS0FBSztBQUFBLElBQ25FO0FBQUEsRUFDRixDQUFDO0FBQ0QsU0FBTyxDQUFDLGFBQWEsY0FBYztBQUNyQztBQ2hGQSxTQUFTLE9BQU87QUFDaEI7QUNDQSxTQUFTLDJCQUEyQjtBQUFBLEVBQ2xDO0FBQUEsRUFDQSxNQUFNO0FBQUEsRUFDTixlQUFlO0FBQUEsRUFDZixZQUFZLEtBQUs7QUFBQSxFQUNqQixjQUFjLEtBQUs7QUFBQSxFQUNuQjtBQUNGLEdBQUc7QUFDRCxNQUFJLFNBQVM7QUFDWCxVQUFNLFVBQVUsQ0FBQyxvQkFBb0I7QUFDbkMsVUFBSTtBQUNGLGdCQUFRLFFBQVEsS0FBSyxVQUFVLGVBQWUsQ0FBQztBQUMvQztBQUFBLE1BQ0YsU0FBUyxPQUFPO0FBQ2QsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLE1BQ0wsZUFBZSxTQUFTLENBQUMsb0JBQW9CO0FBQzNDLFlBQUlYLFVBQVM7QUFDYixZQUFJLFFBQVEsUUFBUUEsT0FBTTtBQUMxQixZQUFJLGFBQWE7QUFDakIsZUFBTyxTQUFTQSxTQUFRO0FBQ3RCO0FBQ0EsVUFBQUEsVUFBUyxRQUFRO0FBQUEsWUFDZixpQkFBaUJBO0FBQUEsWUFDakI7QU
25114FBQSxZQUNBO0FBQUEsVUFDWixDQUFXO0FBQ0QsY0FBSUEsU0FBUTtBQUNWLG9CQUFRLFFBQVFBLE9BQU07QUFBQSxVQUN4QjtBQUFBLFFBQ0Y7QUFBQSxNQUNGLEdBQUcsWUFBWTtBQUFBLE1BQ2YsZUFBZSxNQUFNO0FBQ25CLGNBQU0sY0FBYyxRQUFRLFFBQVEsR0FBRztBQUN2QyxZQUFJLENBQUMsYUFBYTtBQUNoQjtBQUFBLFFBQ0Y7QUFDQSxlQUFPLFlBQVksV0FBVztBQUFBLE1BQ2hDO0FBQUEsTUFDQSxjQUFjLE1BQU07QUFDbEIsZ0JBQVEsV0FBVyxHQUFHO0FBQUEsTUFDeEI7QUFBQSxJQUNOO0FBQUEsRUFDRTtBQUNBLFNBQU87QUFBQSxJQUNMLGVBQWU7QUFBQSxJQUNmLGVBQWU7QUFBQSxJQUNmLGNBQWM7QUFBQSxFQUNsQjtBQUNBO0FBQ0EsU0FBUyxTQUFTLE1BQU0sT0FBTyxLQUFLO0FBQ2xDLE1BQUksUUFBUTtBQUNaLE1BQUk7QUFDSixTQUFPLFlBQVksTUFBTTtBQUN2QixhQUFTO0FBQ1QsUUFBSSxVQUFVLE1BQU07QUFDbEIsY0FBUSxlQUFlLFdBQVcsTUFBTTtBQUN0QyxhQUFLLEdBQUcsTUFBTTtBQUNkLGdCQUFRO0FBQUEsTUFDVixHQUFHLElBQUk7QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUNGO0FDeERBLE1BQU0sMEJBQTBCLE1BQU07QUFDcEMsTUFBSTtBQUNGLFVBQU0sT0FBTztBQUNiLFdBQU8sYUFBYSxRQUFRLE1BQU0sSUFBSTtBQUN0QyxXQUFPLGFBQWEsV0FBVyxJQUFJO0FBQ25DLFdBQU87QUFBQSxFQUNULFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBT0EsTUFBTSx3QkFBd0Isd0JBQUEsSUFBNEIsMkJBQTJCO0FBQUEsRUFDbkYsU0FBUyxPQUFPO0FBQUEsRUFDaEIsS0FBSztBQUFBO0FBQUEsRUFFTCxXQUFXLEtBQUs7QUFBQSxFQUNoQixhQUFhLEtBQUs7QUFDcEIsQ0FBQyxJQUFJO0FBS0UsTUFBTSxjQUFjLElBQUksWUFBWTtBQUFBLEVBQ3pDLGdCQUFnQjtBQUFBLElBQ2QsU0FBUztBQUFBO0FBQUEsTUFFUCxXQUFXLElBQUksS0FBSztBQUFBO0FBQUEsTUFHcEIsUUFBUSxLQUFLLEtBQUssS0FBSztBQUFBO0FBQUEsTUFHdkIsT0FBTyxDQUFDLGNBQWMsVUFBZTtBQUVuQyxZQUFJLE9BQU8sVUFBVSxPQUFPLE9BQU8sU0FBUyxLQUFLO0FBQy9DLGlCQUFPO0FBQUEsUUFDVDtBQUVBLFlBQUksT0FBTyxXQUFXLE9BQU8sQ0FBQyxVQUFVLFFBQVE7QUFDOUMsaUJBQU87QUFBQSxRQUNUO0FBRUEsZUFBTyxlQUFlO0FBQUEsTUFDeEI7QUFBQTtBQUFBLE1BR0Esc0JBQXNCO0FBQUE7QUFBQSxNQUd0QixvQkFBb0I7QUFBQTtBQUFBO0FBQUEsTUFJcEIsYUFBYTtBQUFBLElBQUE7QUFBQSxJQUVmLFdBQVc7QUFBQTtBQUFBLE1BRVQsT0FBTztBQUFBO0FBQUEsTUFFUCxhQUFhO0FBQUEsSUFBQTtBQUFBLEVBQ2Y7QUFFSixDQUFDO0FBT0QsSUFBSSx1QkFBdUI7QUFDekIscUJBQW1CO0FBQUEsSUFDakI7QUFBQSxJQUNBLFdBQVc7QUFBQTtBQUFBLElBRVgsUUFBUSxLQUFLLEtBQUssS0FBSztBQUFBO0FBQUEsSUFFdkIsa0JBQWtCO0FBQUE7QUFBQSxNQUVoQixzQkFBc0IsQ0FBQyxVQUFVO0FBQy9CLGVBQU8sTUFBTSxNQUFNLFdBQVc7QUFBQSxNQUNoQztBQUFBLElBQUE7QUFBQSxFQUNGLENBQ0Q7QUFDSCxPQUFPO0FBQ0wsVUFBUSxJQUFJLG9FQUFvRTtBQUNsRjtBQWdCTyxNQUFNLHVCQUF1QixDQUNsQyxVQUNBLGNBQ0c7QUFDSCxRQUFNLGVBQWUsTUFBTTtBQUN6QixZQUFRLElBQUksb0NBQW9DO0FBRWhELGdCQUFZLGVBQUE7QUFDWixlQUFBO0FBQUEsRUFDRjtBQUVBLFFBQU0sZ0JBQWdCLE1BQU07QUFDMUIsWUFBUSxJQUFJLHVDQUF1QztBQUNuRCxnQkFBQTtBQUFBLEVBQ0Y7QUFFQSxTQUFPLGlCQUFpQixVQUFVLFlBQVk7QUFDOUMsU0FBTyxpQkFBaUIsV0FBVyxhQUFhO0FBR2hELFNBQU8sTUFBTTtBQUNYLFdBQU8sb0JBQW9CLFVBQVUsWUFBWTtBQUNqRCxXQUFPLG9CQUFvQixXQUFXLGFBQWE7QUFBQSxFQUNyRDtBQUNGO0FDeElPLE1BQU0sd0JBQXdCLFlBQTJCO0FBUTlELE1BQUksRUFBRSxtQkFBbUIsWUFBWTtBQUNuQyxZQUFRLElBQUksb0NBQW9DO0FBQ2hEO0FBQUEsRUFDRjtBQUVBLE1BQUk7QUFFRixVQUFNLGVBQWUsTUFBTSxVQUFVLGNBQWMsU0FBUyxVQUFVO0FBQUEsTUFDcEUsT0FBTztBQUFBLElBQUEsQ0FDUjtBQUVELFlBQVEsSUFBSSxnREFBZ0QsYUFBYSxLQUFLO0FBRzlFLGdCQUFZLE1BQU07QUFDaEIsbUJBQWEsT0FBQTtBQUFBLElBQ2YsR0FBRyxLQUFLLEtBQUssR0FBSTtBQUdqQixpQkFBYSxpQkFBaUIsZUFBZSxNQUFNO0FBQ2pELFlBQU0sWUFBWSxhQUFhO0FBRS9CLFVBQUksQ0FBQyxVQUFXO0FBRWhCLGdCQUFVLGlCQUFpQixlQUFlLE1BQU07QUFDOUMsWUFBSSxVQUFVLFVBQVUsZUFBZSxVQUFVLGNBQWMsWUFBWTtBQUV6RSxrQkFBUSxJQUFJLDRCQUE0QjtBQUd4QyxjQUFJLFFBQVEsdURBQXVELEdBQUc7QUFDcEUsc0JBQVUsWUFBWSxFQUFFLE1BQU0sZUFBQSxDQUFnQjtBQUM5QyxtQkFBTyxTQUFTLE9BQUE7QUFBQSxVQUNsQjtBQUFBLFFBQ0Y7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNILENBQUM7QUFHRCxjQUFVLGNBQWMsaUJBQWlCLG9CQUFvQixNQUFNO0FBQ2pFLGNBQVEsSUFBSSx5Q0FBeUM7QUFDckQsYUFBTyxTQUFTLE9BQUE7QUFBQSxJQUNsQixDQUFDO0FBQUEsRUFFSCxTQUFTLE9BQU87QUFDZCxZQUFRLE1BQU0sNENBQTRDLEtBQUs7QUFBQSxFQUNqRTtBQUNGO0FDakRBO0FBQUEsRUFDRSxNQUFNO0FBRUosWUFBUSxJQUFJLGdDQUFnQztBQUFBLEVBQzlDO0FBQUEsRUFDQSxNQUFNO0FBRUosWUFBUSxJQUFJLGdEQUFnRDtBQUFBLEVBQzlEO0FBQ0Y7QUFHQSxzQkFBQTtBQUdBLE1BQU0rRix1QkFBc0I3QixRQUFNLFVBR2hDO0FBQUEsRUFDQSxZQUFZLE9BQXNDO0FBQ2hELFVBQU0sS0FBSztBQUNYLFNBQUssUUFBUSxFQUFFLFVBQVUsTUFBQTtBQUFBLEVBQzNCO0FBQUEsRUFFQSxPQUFPLHlCQUF5QixPQUFjO0FBQzVDLFdBQU8sRUFBRSxVQUFVLE1BQU0sTUFBQTtBQUFBLEVBQzNCO0FBQUEsRUFFQSxrQkFBa0IsT0FBYyxXQUE0QjtBQUMxRCxZQUFRLE1BQU0sd0JBQXdCLE9BQU8sU0FBUztBQUFBLEVBTXhEO0FBQUEsRUFFQSxTQUFTO0FBQ1AsUUFBSSxLQUFLLE1BQU0sVUFBVTtBQUN2QixtREFDRyxPQUFBLEVBQUksV0FBVSx5RUFDYixVQUFBZ0Isa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsbUJBQ2IsVUFBQTtBQUFBLDhDQUFDLE9BQUEsRUFBSSxXQUFVLGlCQUFnQixVQUFBLE1BQUU7QUFBQSw4Q0FDaEMsTUFBQSxFQUFHLFdBQVUsaURBQWdELFVBQUEsa0NBRTlEO0FBQUEsOENBQ0MsS0FBQSxFQUFFLFdBQVUsNEJBQTJCLFVBQUEsOENBRXhDO0FBQUEsUUFDQXBFLGtDQUFBQTtBQUFBQSxVQUFDO0FBQUEsVUFBQTtBQUFBLFlBQ0MsU0FBUyxNQUFNLE9BQU8sU0FBUyxPQUFBO0FBQUEsWUFDL0IsV0FBVTtBQUFBLFlBQ1gsVUFBQTtBQUFBLFVBQUE7QUFBQSxRQUFBO0FBQUEsTUFFRCxFQUFBLENBQ0YsRUFBQSxDQUNGO0FBQUEsSUFFSjtB
25114QUVBLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFDcEI7QUFDRjtBQUdBcUYsT0FBUyxXQUFXLFNBQVMsZUFBZSxNQUFNLENBQUUsRUFBRTtBQUFBLEVBQ3BEckYsa0NBQUFBLElBQUNvRCxRQUFNLFlBQU4sRUFDQyxnREFBQzZCLGdCQUFBLEVBQ0MsVUFBQWIsa0NBQUFBLEtBQUMscUJBQUEsRUFBb0IsUUFBUSxhQUMzQixVQUFBO0FBQUEsSUFBQXBFLGtDQUFBQSxJQUFDLFdBQUEsRUFBVTtBQUFBLElBRVY7QUFBQSxFQUFBLEVBQWlFLENBQ3BFLEVBQUEsQ0FDRixHQUNGO0FBQ0Y7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDYsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsMTE2LDEzMSwxMzIsMTMzXX0=

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.