var Js = Object.defineProperty; var Qs = (e, t, s) => t in e ? Js(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s; var Se = (e, t, s) => (Qs(e, typeof t != "symbol" ? t + "" : t, s), s); import { defineComponent as D, resolveDynamicComponent as oe, computed as h, openBlock as a, createBlock as A, normalizeClass as x, normalizeStyle as ae, withCtx as E, createCommentVNode as I, renderSlot as H, createTextVNode as F, createElementBlock as f, createElementVNode as v, createVNode as z, Transition as Vt, unref as u, toDisplayString as P, toRefs as Be, Fragment as J, renderList as te, ref as j, onMounted as ce, onBeforeUnmount as ht, mergeProps as Te, watch as re, withDirectives as Q, isRef as vt, withModifiers as ge, vModelText as Ke, useSlots as bt, vModelDynamic as Ys, Teleport as zt, nextTick as en, mergeModels as Ce, useModel as ke, onUnmounted as tn, withMemo as sn, toHandlers as Ot, resolveDirective as Qe, vShow as gs, getCurrentInstance as nn, inject as ln, withKeys as Ue, defineAsyncComponent as on } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { CircleCheck as an, CircleX as rn, AlertCircle as un, Info as dn, X as ys, Minus as cn } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29"; import { CheckIcon as Et, CheckCircleIcon as fn, XMarkIcon as Ge, ExclamationCircleIcon as Rt, ChevronUpIcon as xs, ChevronDownIcon as ws, MagnifyingGlassIcon as ks } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_20_solid.js?v=e4f18c29"; import { wait as pn, isNullOrUndefined as mn, SourceApps as hn, getClientOperatingSystem as vn, OperatingSystem as Mt, md5 as bn } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { buildManualPromise as Jp } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { useField as De } from "/_nuxt/node_modules/.cache/vite/client/deps/vee-validate.js?v=e4f18c29"; import { nanoid as dt } from "/_nuxt/node_modules/.cache/vite/client/deps/nanoid.js?v=e4f18c29"; import { InformationCircleIcon as ft, ClipboardDocumentCheckIcon as gn, ClipboardDocumentIcon as yn, ChevronLeftIcon as xn, XMarkIcon as wn, ChevronDownIcon as kn, ArrowLongLeftIcon as Cn, ArrowLongRightIcon as $n, ExclamationTriangleIcon as In, ChevronRightIcon as Bn, ArrowUpRightIcon as Sn, CheckCircleIcon as Pn, XCircleIcon as Tn, ExclamationCircleIcon as On } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_outline.js?v=e4f18c29"; import { directive as Ae } from "/_nuxt/node_modules/.cache/vite/client/deps/vue-tippy.js?v=e4f18c29"; import { useResizeObserver as Ft, useMutationObserver as Mn, useMounted as Dt, isClient as Ve, useElementBounding as _t, useIntersectionObserver as Cs, onClickOutside as jn, useClipboard as An, useMagicKeys as Ln, whenever as Vn, useElementSize as $s, useEventListener as Yt, computedAsync as zn, useFocus as En, useDropZone as Rn } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/node_modules/@vueuse/core/index.mjs?v=e4f18c29"; import { Listbox as Fn, ListboxLabel as Dn, ListboxButton as _n, ListboxOptions as Hn, ListboxOption as Un, Switch as Wn, TransitionRoot as Is, Dialog as Nn, TransitionChild as es, DialogPanel as qn, Disclosure as Kn, DisclosureButton as Gn, DisclosurePanel as Xn, Menu as Zn, MenuButton as Jn, MenuItems as Qn, MenuItem as Yn, Combobox as el, ComboboxOptions as tl, ComboboxOption as sl } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/node_modules/@headlessui/vue/dist/headlessui.esm.js?v=e4f18c29"; import { XMarkIcon as nl, ChevronUpIcon as ll, Bars3Icon as ol, Squares2X2Icon as al, UserCircleIcon as rl } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_solid.js?v=e4f18c29"; import il from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/node_modules/v3-infinite-loading/lib/v3-infinite-loading.mjs?v=e4f18c29"; import { setInterval } from "/_nuxt/node_modules/nuxt/dist/app/compat/interval.js?v=e4f18c29"; import { ToastNotificationType } from "/_nuxt/utils/globals.ts"; var ul = typeof global == "object" && global && global.Object === Object && global; const Bs = ul; var dl = typeof self == "object" && self && self.Object === Object && self, cl = Bs || dl || Function("return this")(); const Ye = cl; var fl = Ye.Symbol; const Xe = fl; var Ss = Object.prototype, pl = Ss.hasOwnProperty, ml = Ss.toString, lt = Xe ? Xe.toStringTag : void 0; function hl(e) { var t = pl.call(e, lt), s = e[lt]; try { e[lt] = void 0; var l = !0; } catch { } var r = ml.call(e); return l && (t ? e[lt] = s : delete e[lt]), r; } var vl = Object.prototype, bl = vl.toString; function gl(e) { return bl.call(e); } var yl = "[object Null]", xl = "[object Undefined]", ts = Xe ? Xe.toStringTag : void 0; function _e(e) { return e == null ? e === void 0 ? xl : yl : ts && ts in Object(e) ? hl(e) : gl(e); } function ye(e) { return e != null && typeof e == "object"; } var wl = "[object Symbol]"; function kl(e) { return typeof e == "symbol" || ye(e) && _e(e) == wl; } function gt(e, t) { for (var s = -1, l = e == null ? 0 : e.length, r = Array(l); ++s < l; ) r[s] = t(e[s], s, e); return r; } var Cl = Array.isArray; const se = Cl; var $l = /\s/; function Il(e) { for (var t = e.length; t-- && $l.test(e.charAt(t)); ) ; return t; } var Bl = /^\s+/; function Sl(e) { return e && e.slice(0, Il(e) + 1).replace(Bl, ""); } function Ze(e) { var t = typeof e; return e != null && (t == "object" || t == "function"); } var ss = 0 / 0, Pl = /^[-+]0x[0-9a-f]+$/i, Tl = /^0b[01]+$/i, Ol = /^0o[0-7]+$/i, Ml = parseInt; function qe(e) { if (typeof e == "number") return e; if (kl(e)) return ss; if (Ze(e)) { var t = typeof e.valueOf == "function" ? e.valueOf() : e; e = Ze(t) ? t + "" : t; } if (typeof e != "string") return e === 0 ? e : +e; e = Sl(e); var s = Tl.test(e); return s || Ol.test(e) ? Ml(e.slice(2), s ? 2 : 8) : Pl.test(e) ? ss : +e; } var ns = 1 / 0, jl = 17976931348623157e292; function Al(e) { if (!e) return e === 0 ? e : 0; if (e = qe(e), e === ns || e === -ns) { var t = e < 0 ? -1 : 1; return t * jl; } return e === e ? e : 0; } function Ll(e) { var t = Al(e), s = t % 1; return t === t ? s ? t - s : t : 0; } function Ps(e) { return e; } var Vl = "[object AsyncFunction]", zl = "[object Function]", El = "[object GeneratorFunction]", Rl = "[object Proxy]"; function Ts(e) { if (!Ze(e)) return !1; var t = _e(e); return t == zl || t == El || t == Vl || t == Rl; } var Fl = Ye["__core-js_shared__"]; const Bt = Fl; var ls = function() { var e = /[^.]+$/.exec(Bt && Bt.keys && Bt.keys.IE_PROTO || ""); return e ? "Symbol(src)_1." + e : ""; }(); function Dl(e) { return !!ls && ls in e; } var _l = Function.prototype, Hl = _l.toString; function Ul(e) { if (e != null) { try { return Hl.call(e); } catch { } try { return e + ""; } catch { } } return ""; } var Wl = /[\\^$.*+?()[\]{}|]/g, Nl = /^\[object .+?Constructor\]$/, ql = Function.prototype, Kl = Object.prototype, Gl = ql.toString, Xl = Kl.hasOwnProperty, Zl = RegExp( "^" + Gl.call(Xl).replace(Wl, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$" ); function Jl(e) { if (!Ze(e) || Dl(e)) return !1; var t = Ts(e) ? Zl : Nl; return t.test(Ul(e)); } function Ql(e, t) { return e == null ? void 0 : e[t]; } function yt(e, t) { var s = Ql(e, t); return Jl(s) ? s : void 0; } function Yl(e, t, s) { switch (s.length) { case 0: return e.call(t); case 1: return e.call(t, s[0]); case 2: return e.call(t, s[0], s[1]); case 3: return e.call(t, s[0], s[1], s[2]); } return e.apply(t, s); } function Ht() { } var eo = 800, to = 16, so = Date.now; function no(e) { var t = 0, s = 0; return function() { var l = so(), r = to - (l - s); if (s = l, r > 0) { if (++t >= eo) return arguments[0]; } else t = 0; return e.apply(void 0, arguments); }; } function lo(e) { return function() { return e; }; } var oo = function() { try { var e = yt(Object, "defineProperty"); return e({}, "", {}), e; } catch { } }(); const os = oo; var ao = os ? function(e, t) { return os(e, "toString", { configurable: !0, enumerable: !1, value: lo(t), writable: !0 }); } : Ps; const ro = ao; var io = no(ro); const uo = io; function co(e, t, s, l) { for (var r = e.length, n = s + (l ? 1 : -1); l ? n-- : ++n < r; ) if (t(e[n], n, e)) return n; return -1; } function fo(e) { return e !== e; } function po(e, t, s) { for (var l = s - 1, r = e.length; ++l < r; ) if (e[l] === t) return l; return -1; } function Os(e, t, s) { return t === t ? po(e, t, s) : co(e, fo, s); } function Ut(e, t) { var s = e == null ? 0 : e.length; return !!s && Os(e, t, 0) > -1; } var mo = 9007199254740991, ho = /^(?:0|[1-9]\d*)$/; function vo(e, t) { var s = typeof e; return t = t ?? mo, !!t && (s == "number" || s != "symbol" && ho.test(e)) && e > -1 && e % 1 == 0 && e < t; } function bo(e, t) { return e === t || e !== e && t !== t; } var as = Math.max; function go(e, t, s) { return t = as(t === void 0 ? e.length - 1 : t, 0), function() { for (var l = arguments, r = -1, n = as(l.length - t, 0), i = Array(n); ++r < n; ) i[r] = l[t + r]; r = -1; for (var c = Array(t + 1); ++r < t; ) c[r] = l[r]; return c[t] = s(i), Yl(e, this, c); }; } function Ms(e, t) { return uo(go(e, t, Ps), e + ""); } var yo = 9007199254740991; function js(e) { return typeof e == "number" && e > -1 && e % 1 == 0 && e <= yo; } function Wt(e) { return e != null && js(e.length) && !Ts(e); } var xo = Object.prototype; function wo(e) { var t = e && e.constructor, s = typeof t == "function" && t.prototype || xo; return e === s; } function ko(e, t) { for (var s = -1, l = Array(e); ++s < e; ) l[s] = t(s); return l; } var Co = "[object Arguments]"; function rs(e) { return ye(e) && _e(e) == Co; } var As = Object.prototype, $o = As.hasOwnProperty, Io = As.propertyIsEnumerable, Bo = rs(function() { return arguments; }()) ? rs : function(e) { return ye(e) && $o.call(e, "callee") && !Io.call(e, "callee"); }; const Ls = Bo; function So() { return !1; } var Vs = typeof exports == "object" && exports && !exports.nodeType && exports, is = Vs && typeof module == "object" && module && !module.nodeType && module, Po = is && is.exports === Vs, us = Po ? Ye.Buffer : void 0, To = us ? us.isBuffer : void 0, Oo = To || So; const Mo = Oo; var jo = "[object Arguments]", Ao = "[object Array]", Lo = "[object Boolean]", Vo = "[object Date]", zo = "[object Error]", Eo = "[object Function]", Ro = "[object Map]", Fo = "[object Number]", Do = "[object Object]", _o = "[object RegExp]", Ho = "[object Set]", Uo = "[object String]", Wo = "[object WeakMap]", No = "[object ArrayBuffer]", qo = "[object DataView]", Ko = "[object Float32Array]", Go = "[object Float64Array]", Xo = "[object Int8Array]", Zo = "[object Int16Array]", Jo = "[object Int32Array]", Qo = "[object Uint8Array]", Yo = "[object Uint8ClampedArray]", ea = "[object Uint16Array]", ta = "[object Uint32Array]", ee = {}; ee[Ko] = ee[Go] = ee[Xo] = ee[Zo] = ee[Jo] = ee[Qo] = ee[Yo] = ee[ea] = ee[ta] = !0; ee[jo] = ee[Ao] = ee[No] = ee[Lo] = ee[qo] = ee[Vo] = ee[zo] = ee[Eo] = ee[Ro] = ee[Fo] = ee[Do] = ee[_o] = ee[Ho] = ee[Uo] = ee[Wo] = !1; function sa(e) { return ye(e) && js(e.length) && !!ee[_e(e)]; } function Nt(e) { return function(t) { return e(t); }; } var zs = typeof exports == "object" && exports && !exports.nodeType && exports, at = zs && typeof module == "object" && module && !module.nodeType && module, na = at && at.exports === zs, St = na && Bs.process, la = function() { try { var e = at && at.require && at.require("util").types; return e || St && St.binding && St.binding("util"); } catch { } }(); const ds = la; var cs = ds && ds.isTypedArray, oa = cs ? Nt(cs) : sa; const aa = oa; var ra = Object.prototype, ia = ra.hasOwnProperty; function ua(e, t) { var s = se(e), l = !s && Ls(e), r = !s && !l && Mo(e), n = !s && !l && !r && aa(e), i = s || l || r || n, c = i ? ko(e.length, String) : [], d = c.length; for (var p in e) (t || ia.call(e, p)) && !(i && // Safari 9 has enumerable `arguments.length` in strict mode. (p == "length" || // Node.js 0.10 has enumerable non-index properties on buffers. r && (p == "offset" || p == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays. n && (p == "buffer" || p == "byteLength" || p == "byteOffset") || // Skip index properties. vo(p, d))) && c.push(p); return c; } function da(e, t) { return function(s) { return e(t(s)); }; } var ca = da(Object.keys, Object); const fa = ca; var pa = Object.prototype, ma = pa.hasOwnProperty; function ha(e) { if (!wo(e)) return fa(e); var t = []; for (var s in Object(e)) ma.call(e, s) && s != "constructor" && t.push(s); return t; } function va(e) { return Wt(e) ? ua(e) : ha(e); } var ba = yt(Object, "create"); const it = ba; function ga() { this.__data__ = it ? it(null) : {}, this.size = 0; } function ya(e) { var t = this.has(e) && delete this.__data__[e]; return this.size -= t ? 1 : 0, t; } var xa = "__lodash_hash_undefined__", wa = Object.prototype, ka = wa.hasOwnProperty; function Ca(e) { var t = this.__data__; if (it) { var s = t[e]; return s === xa ? void 0 : s; } return ka.call(t, e) ? t[e] : void 0; } var $a = Object.prototype, Ia = $a.hasOwnProperty; function Ba(e) { var t = this.__data__; return it ? t[e] !== void 0 : Ia.call(t, e); } var Sa = "__lodash_hash_undefined__"; function Pa(e, t) { var s = this.__data__; return this.size += this.has(e) ? 0 : 1, s[e] = it && t === void 0 ? Sa : t, this; } function Fe(e) { var t = -1, s = e == null ? 0 : e.length; for (this.clear(); ++t < s; ) { var l = e[t]; this.set(l[0], l[1]); } } Fe.prototype.clear = ga; Fe.prototype.delete = ya; Fe.prototype.get = Ca; Fe.prototype.has = Ba; Fe.prototype.set = Pa; function Ta() { this.__data__ = [], this.size = 0; } function xt(e, t) { for (var s = e.length; s--; ) if (bo(e[s][0], t)) return s; return -1; } var Oa = Array.prototype, Ma = Oa.splice; function ja(e) { var t = this.__data__, s = xt(t, e); if (s < 0) return !1; var l = t.length - 1; return s == l ? t.pop() : Ma.call(t, s, 1), --this.size, !0; } function Aa(e) { var t = this.__data__, s = xt(t, e); return s < 0 ? void 0 : t[s][1]; } function La(e) { return xt(this.__data__, e) > -1; } function Va(e, t) { var s = this.__data__, l = xt(s, e); return l < 0 ? (++this.size, s.push([e, t])) : s[l][1] = t, this; } function et(e) { var t = -1, s = e == null ? 0 : e.length; for (this.clear(); ++t < s; ) { var l = e[t]; this.set(l[0], l[1]); } } et.prototype.clear = Ta; et.prototype.delete = ja; et.prototype.get = Aa; et.prototype.has = La; et.prototype.set = Va; var za = yt(Ye, "Map"); const Ea = za; function Ra() { this.size = 0, this.__data__ = { hash: new Fe(), map: new (Ea || et)(), string: new Fe() }; } function Fa(e) { var t = typeof e; return t == "string" || t == "number" || t == "symbol" || t == "boolean" ? e !== "__proto__" : e === null; } function wt(e, t) { var s = e.__data__; return Fa(t) ? s[typeof t == "string" ? "string" : "hash"] : s.map; } function Da(e) { var t = wt(this, e).delete(e); return this.size -= t ? 1 : 0, t; } function _a(e) { return wt(this, e).get(e); } function Ha(e) { return wt(this, e).has(e); } function Ua(e, t) { var s = wt(this, e), l = s.size; return s.set(e, t), this.size += s.size == l ? 0 : 1, this; } function tt(e) { var t = -1, s = e == null ? 0 : e.length; for (this.clear(); ++t < s; ) { var l = e[t]; this.set(l[0], l[1]); } } tt.prototype.clear = Ra; tt.prototype.delete = Da; tt.prototype.get = _a; tt.prototype.has = Ha; tt.prototype.set = Ua; function Wa(e, t) { for (var s = -1, l = t.length, r = e.length; ++s < l; ) e[r + s] = t[s]; return e; } var fs = Xe ? Xe.isConcatSpreadable : void 0; function Na(e) { return se(e) || Ls(e) || !!(fs && e && e[fs]); } function Es(e, t, s, l, r) { var n = -1, i = e.length; for (s || (s = Na), r || (r = []); ++n < i; ) { var c = e[n]; t > 0 && s(c) ? t > 1 ? Es(c, t - 1, s, l, r) : Wa(r, c) : l || (r[r.length] = c); } return r; } function qa(e, t, s) { return e === e && (s !== void 0 && (e = e <= s ? e : s), t !== void 0 && (e = e >= t ? e : t)), e; } function ps(e, t, s) { return s === void 0 && (s = t, t = void 0), s !== void 0 && (s = qe(s), s = s === s ? s : 0), t !== void 0 && (t = qe(t), t = t === t ? t : 0), qa(qe(e), t, s); } var Ka = yt(Ye, "Set"); const Pt = Ka; var Ga = "__lodash_hash_undefined__"; function Xa(e) { return this.__data__.set(e, Ga), this; } function Za(e) { return this.__data__.has(e); } function Je(e) { var t = -1, s = e == null ? 0 : e.length; for (this.__data__ = new tt(); ++t < s; ) this.add(e[t]); } Je.prototype.add = Je.prototype.push = Xa; Je.prototype.has = Za; function pt(e, t) { return e.has(t); } function Rs(e) { var t = -1, s = Array(e.size); return e.forEach(function(l) { s[++t] = l; }), s; } var Ja = function() { return Ye.Date.now(); }; const Tt = Ja; var Qa = "Expected a function", Ya = Math.max, er = Math.min; function st(e, t, s) { var l, r, n, i, c, d, p = 0, m = !1, b = !1, o = !0; if (typeof e != "function") throw new TypeError(Qa); t = qe(t) || 0, Ze(s) && (m = !!s.leading, b = "maxWait" in s, n = b ? Ya(qe(s.maxWait) || 0, t) : n, o = "trailing" in s ? !!s.trailing : o); function g($) { var k = l, M = r; return l = r = void 0, p = $, i = e.apply(M, k), i; } function y($) { return p = $, c = setTimeout(C, t), m ? g($) : i; } function S($) { var k = $ - d, M = $ - p, B = t - k; return b ? er(B, n - M) : B; } function w($) { var k = $ - d, M = $ - p; return d === void 0 || k >= t || k < 0 || b && M >= n; } function C() { var $ = Tt(); if (w($)) return L($); c = setTimeout(C, S($)); } function L($) { return c = void 0, o && l ? g($) : (l = r = void 0, i); } function N() { c !== void 0 && clearTimeout(c), p = 0, l = d = r = c = void 0; } function Y() { return c === void 0 ? i : L(Tt()); } function R() { var $ = Tt(), k = w($); if (l = arguments, r = this, d = $, k) { if (c === void 0) return y(d); if (b) return clearTimeout(c), c = setTimeout(C, t), g(d); } return c === void 0 && (c = setTimeout(C, t)), i; } return R.cancel = N, R.flush = Y, R; } function jt(e) { return ye(e) && Wt(e); } function qt(e, t, s) { for (var l = -1, r = e == null ? 0 : e.length; ++l < r; ) if (s(t, e[l])) return !0; return !1; } var tr = 200; function sr(e, t, s, l) { var r = -1, n = Ut, i = !0, c = e.length, d = [], p = t.length; if (!c) return d; s && (t = gt(t, Nt(s))), l ? (n = qt, i = !1) : t.length >= tr && (n = pt, i = !1, t = new Je(t)); e: for (; ++r < c; ) { var m = e[r], b = s == null ? m : s(m); if (m = l || m !== 0 ? m : 0, i && b === b) { for (var o = p; o--; ) if (t[o] === b) continue e; d.push(m); } else n(t, b, l) || d.push(m); } return d; } var nr = Ms(function(e, t) { return jt(e) ? sr(e, Es(t, 1, jt, !0)) : []; }); const lr = nr; var or = "[object String]"; function Le(e) { return typeof e == "string" || !se(e) && ye(e) && _e(e) == or; } function ar(e, t) { return gt(t, function(s) { return e[s]; }); } function rr(e) { return e == null ? [] : ar(e, va(e)); } var ir = Math.max; function ur(e, t, s, l) { e = Wt(e) ? e : rr(e), s = s && !l ? Ll(s) : 0; var r = e.length; return s < 0 && (s = ir(r + s, 0)), Le(e) ? s <= r && e.indexOf(t, s) > -1 : !!r && Os(e, t, s) > -1; } var dr = Math.min; function cr(e, t, s) { for (var l = s ? qt : Ut, r = e[0].length, n = e.length, i = n, c = Array(n), d = 1 / 0, p = []; i--; ) { var m = e[i]; i && t && (m = gt(m, Nt(t))), d = dr(m.length, d), c[i] = !s && (t || r >= 120 && m.length >= 120) ? new Je(i && m) : void 0; } m = e[0]; var b = -1, o = c[0]; e: for (; ++b < r && p.length < d; ) { var g = m[b], y = t ? t(g) : g; if (g = s || g !== 0 ? g : 0, !(o ? pt(o, y) : l(p, y, s))) { for (i = n; --i; ) { var S = c[i]; if (!(S ? pt(S, y) : l(e[i], y, s))) continue e; } o && o.push(y), p.push(g); } } return p; } function fr(e) { return jt(e) ? e : []; } var pr = Ms(function(e) { var t = gt(e, fr); return t.length && t[0] === e[0] ? cr(t) : []; }); const mr = pr; var hr = "[object Boolean]"; function vr(e) { return e === !0 || e === !1 || ye(e) && _e(e) == hr; } var br = "[object Number]"; function gr(e) { return typeof e == "number" || ye(e) && _e(e) == br; } function Pe(e) { return e === void 0; } var yr = "Expected a function"; function mt(e, t, s) { var l = !0, r = !0; if (typeof e != "function") throw new TypeError(yr); return Ze(s) && (l = "leading" in s ? !!s.leading : l, r = "trailing" in s ? !!s.trailing : r), st(e, t, { leading: l, maxWait: t, trailing: r }); } var xr = 1 / 0, wr = Pt && 1 / Rs(new Pt([, -0]))[1] == xr ? function(e) { return new Pt(e); } : Ht; const kr = wr; var Cr = 200; function $r(e, t, s) { var l = -1, r = Ut, n = e.length, i = !0, c = [], d = c; if (s) i = !1, r = qt; else if (n >= Cr) { var p = t ? null : kr(e); if (p) return Rs(p); i = !1, r = pt, d = new Je(); } else d = t ? [] : c; e: for (; ++l < n; ) { var m = e[l], b = t ? t(m) : m; if (m = s || m !== 0 ? m : 0, i && b === b) { for (var o = d.length; o--; ) if (d[o] === b) continue e; t && d.push(b), c.push(m); } else r(d, b, s) || (d !== c && d.push(b), c.push(m)); } return c; } function Ir(e) { return e && e.length ? $r(e) : []; } const pe = /* @__PURE__ */ D({ __name: "Button", props: { to: {}, size: {}, fullWidth: { type: Boolean }, text: { type: Boolean }, link: { type: Boolean }, color: {}, rounded: { type: Boolean }, external: { type: Boolean }, disabled: { type: Boolean }, submit: { type: Boolean }, iconLeft: {}, iconRight: {}, hideText: { type: Boolean }, linkComponent: {}, loading: { type: Boolean } }, emits: ["click"], setup(e, { emit: t }) { const s = t, l = e, r = oe("NuxtLink"), n = oe("RouterLink"), i = h(() => l.linkComponent ? l.linkComponent : l.external ? "a" : ye(r) ? r : ye(n) ? n : "a"), c = h(() => { if (!l.to) return l.submit ? "submit" : "button"; }), d = h(() => l.disabled || l.loading), p = h( () => l.loading ? ct : l.iconLeft ), m = h(() => { const C = [], L = { subtle: [ "bg-transparent border-transparent text-foreground font-medium", "hover:bg-primary-muted disabled:hover:bg-transparent focus-visible:border-foundation" ], outline: [ "bg-foundation border-outline-2 text-foreground font-medium", "hover:bg-primary-muted disabled:hover:bg-foundation focus-visible:border-foundation" ], danger: [ "bg-danger border-danger-darker text-foundation font-medium", "hover:bg-danger-darker disabled:hover:bg-danger focus-visible:border-foundation" ], primary: [ "bg-primary border-outline-1 text-foreground-on-primary font-semibold", "hover:bg-primary-focus disabled:hover:bg-primary focus-visible:border-foundation" ] }; if (l.rounded && C.push("!rounded-full"), l.text || l.link) switch (l.color) { case "subtle": C.push("text-foreground"); break; case "outline": C.push("text-foreground"); break; case "danger": C.push("text-danger"); break; case "primary": default: C.push("text-primary"); break; } else switch (l.color) { case "subtle": C.push(...L.subtle); break; case "outline": C.push(...L.outline); break; case "danger": C.push(...L.danger); break; case "primary": default: C.push(...L.primary); break; } return C.join(" "); }), b = h(() => { switch (l.size) { case "sm": return "h-6 text-body-2xs"; case "lg": return "h-10 text-body-sm"; default: case "base": return "h-8 text-body-xs"; } }), o = h(() => { if (l.text || l.link) return "p-0"; const C = !!l.iconLeft, L = !!l.iconRight, N = l.hideText; switch (l.size) { case "sm": return N ? "w-6" : C ? "py-1 pr-2 pl-1" : L ? "py-1 pl-2 pr-1" : "px-2 py-1"; case "lg": return N ? "w-10" : C ? "py-2 pr-6 pl-4" : L ? "py-2 pl-6 pr-4" : "px-6 py-2"; case "base": default: return N ? "w-8" : C ? "py-0 pr-4 pl-2" : L ? "py-0 pl-4 pr-2" : "px-4 py-0"; } }), g = h(() => { const C = [ "inline-flex justify-center items-center", "text-center select-none whitespace-nowrap", "outline outline-2 outline-transparent", "transition duration-200 ease-in-out focus-visible:outline-outline-4" ], L = []; return !l.text && !l.link && L.push("rounded-md border"), l.fullWidth ? L.push("w-full") : l.hideText || L.push("max-w-max"), d.value && L.push("cursor-not-allowed opacity-60"), [...C, ...L].join(" "); }), y = h(() => [ g.value, b.value, m.value, o.value ].join(" ")), S = h(() => { const C = ["shrink-0"]; switch (l.size) { case "sm": l.hideText ? C.push("h-4 w-4") : C.push("h-4 w-4 p-0.5"); break; case "lg": C.push("h-6 w-6 p-1"); break; case "base": default: C.push("h-6 w-6 p-1"); break; } return C.join(" "); }), w = (C) => { if (d.value) { C.preventDefault(), C.stopPropagation(), C.stopImmediatePropagation(); return; } s("click", C); }; return (C, L) => (a(), A(oe(C.to ? i.value : "button"), { href: C.to, to: C.to, type: c.value, external: C.external, class: x(y.value), disabled: d.value, role: "button", style: ae( C.color !== "subtle" && !C.text ? "box-shadow: -1px 1px 4px 0px #0000000a inset; box-shadow: 0px 2px 2px 0px #0000000d;" : "" ), onClick: w }, { default: E(() => [ p.value ? (a(), A(oe(p.value), { key: 0, class: x(S.value) }, null, 8, ["class"])) : I("", !0), C.hideText ? I("", !0) : H(C.$slots, "default", { key: 1 }, () => [ L[0] || (L[0] = F("Button", -1)) ]), C.iconRight || !C.loading ? (a(), A(oe(C.iconRight), { key: 2, class: x(S.value) }, null, 8, ["class"])) : I("", !0) ]), _: 3 }, 8, ["href", "to", "type", "external", "class", "disabled", "style"])); } }), Br = /* @__PURE__ */ D({ __name: "Link", props: { to: { type: String, required: !1, default: void 0 }, external: { type: Boolean, required: !1, default: void 0 }, disabled: { type: Boolean, required: !1, default: void 0 }, size: { type: String, default: "base" }, foregroundLink: { type: Boolean, default: !1 }, /** * Add icon to the left from the text */ iconLeft: { type: [Object, Function], default: null }, /** * Add icon to the right from the text */ iconRight: { type: [Object, Function], default: null }, /** * Hide default slot (when you want to show icons only) */ hideText: { type: Boolean, default: !1 }, underline: { type: Boolean, default: !1 } }, emits: ["click"], setup(e, { emit: t }) { const s = t, l = e, r = (n) => { if (l.disabled) { n.preventDefault(), n.stopPropagation(), n.stopImmediatePropagation(); return; } s("click", n); }; return (n, i) => (a(), A(pe, { link: e.underline, text: !e.underline, to: e.to, external: e.external, disabled: e.disabled, size: e.size, "foreground-link": e.foregroundLink, "icon-left": e.iconLeft, "icon-right": e.iconRight, "hide-text": e.hideText, role: "link", onClickCapture: r }, { default: E(() => [ H(n.$slots, "default", {}, () => [ i[0] || (i[0] = F("Link", -1)) ]) ]), _: 3 }, 8, ["link", "text", "to", "external", "disabled", "size", "foreground-link", "icon-left", "icon-right", "hide-text"])); } }); var We = /* @__PURE__ */ ((e) => (e[e.Success = 0] = "Success", e[e.Warning = 1] = "Warning", e[e.Danger = 2] = "Danger", e[e.Info = 3] = "Info", e[e.Loading = 4] = "Loading", e))(We || {}); const Sr = { "aria-live": "assertive", class: "pointer-events-none fixed top-0 right-0 left-0 bottom-0 flex items-end px-4 py-6 mt-10 sm:items-start sm:p-6 z-[60]" }, Pr = { class: "flex w-full flex-col items-center space-y-4 sm:items-end" }, Tr = { key: 0, class: "flex pointer-events-auto w-full max-w-[20rem] overflow-hidden rounded bg-foundation text-foreground shadow-lg border border-outline-2 p-2 pl-3" }, Or = { class: "flex gap-2 items-center w-full" }, Mr = { class: "w-full min-w-[10rem]" }, jr = { key: 0, class: "text-foreground text-body-xs font-medium" }, Ar = { key: 1, class: "text-foreground-2 text-body-2xs leading-snug" }, Lr = { key: 2 }, lp = /* @__PURE__ */ D({ __name: "ToastRenderer", props: { notification: {} }, emits: ["update:notification"], setup(e, { emit: t }) { const s = t, l = e, r = () => { s("update:notification", null); }, n = (i) => { var c, d, p; (p = (d = (c = l.notification) == null ? void 0 : c.cta) == null ? void 0 : d.onClick) == null || p.call(d, i), r(); }; return (i, c) => (a(), f("div", Sr, [ v("div", Pr, [ z(Vt, { "enter-active-class": "transform ease-out duration-300 transition", "enter-from-class": "translate-y-2 opacity-0 sm:translate-y-0 sm:translate-x-2", "enter-to-class": "translate-y-0 opacity-100 sm:translate-x-0", "leave-active-class": "transition ease-in duration-100", "leave-from-class": "opacity-100", "leave-to-class": "opacity-0" }, { default: E(() => [ i.notification ? (a(), f("div", Tr, [ v("div", Or, [ v("div", { class: x(["shrink-0", { "self-start mt-0.5": i.notification.description || i.notification.cta }]) }, [ i.notification.type === u(We).Success ? (a(), A(u(an), { key: 0, class: "text-success h-4 w-4", "aria-hidden": "true" })) : i.notification.type === u(We).Danger ? (a(), A(u(rn), { key: 1, class: "text-danger h-4 w-4", "aria-hidden": "true" })) : i.notification.type === u(We).Warning ? (a(), A(u(un), { key: 2, class: "text-foreground-2 h-4 w-4", "aria-hidden": "true" })) : i.notification.type === u(We).Info ? (a(), A(u(dn), { key: 3, class: "text-foreground-2 h-4 w-4", "aria-hidden": "true" })) : i.notification.type === u(We).Loading ? (a(), A(u(ct), { key: 4, class: "h-4 w-4 opacity-80" })) : I("", !0) ], 2), v("div", Mr, [ i.notification.title ? (a(), f("p", jr, P(i.notification.title), 1)) : I("", !0), i.notification.description ? (a(), f("p", Ar, P(i.notification.description), 1)) : I("", !0), i.notification.cta ? (a(), f("div", Lr, [ z(Br, { to: i.notification.cta.url, size: "sm", onClick: n }, { default: E(() => [ F(P(i.notification.cta.title), 1) ]), _: 1 }, 8, ["to"]) ])) : I("", !0) ]), z(u(pe), { "icon-left": u(ys), color: "subtle", size: "sm", "hide-text": "", class: x(["shrink-0 ml-auto", { "self-start -mt-0.5 -mr-0.5": i.notification.description || i.notification.cta }]), onClick: r }, { default: E(() => [...c[0] || (c[0] = [ F(" Close ", -1) ])]), _: 1 }, 8, ["icon-left", "class"]) ]) ])) : I("", !0) ]), _: 1 }) ]) ])); } }), Vr = "Enter"; function Fs(e) { return (t) => { t.code === Vr && e(t); }; } const zr = { class: "whitespace-nowrap" }, nt = /* @__PURE__ */ D({ __name: "Badge", props: { size: { default: "base" }, color: { default: "primary" }, colorClasses: {}, dot: { type: Boolean }, dotIconColorClasses: {}, iconLeft: {}, rounded: { type: Boolean }, clickableIcon: { type: Boolean } }, emits: ["click-icon"], setup(e, { emit: t }) { const s = t, l = e, r = h(() => l.colorClasses ? l.colorClasses : l.color === "secondary" ? "bg-highlight-3 text-foreground-2" : "bg-info-lighter text-primary-focus dark:text-foreground"), n = h( () => l.dotIconColorClasses || "text-blue-400" ), i = h(() => { const m = [ "inline-flex items-center select-none", r.value, l.size === "lg" ? "px-3 py-0.5 text-body-2xs" : "p-1 text-body-3xs text-body-3xs font-medium" ]; return l.rounded ? (m.push("rounded"), m.push( l.size === "lg" ? "px-2 py-0.5 text-body-2xs" : "px-1.1 py-0.5 text-body-3xs font-medium" )) : (m.push("rounded-full"), m.push( l.size === "lg" ? "px-2.5 py-0.5 text-body-2xs" : "px-2.5 py-0.5 text-body-3xs font-medium" )), m.join(" "); }), c = h(() => { const m = [ "mt-0.5 ml-0.5 inline-flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-full focus:outline-none" ]; return l.clickableIcon ? m.push("cursor-pointer") : m.push("cursor-default"), m.join(" "); }), d = h(() => [ "-ml-0.5 mr-1.5 h-2 w-2", n.value ].join(" ")), p = (m) => { if (!l.clickableIcon) { m.stopPropagation(), m.stopImmediatePropagation(), m.preventDefault(); return; } s("click-icon", m); }; return (m, b) => (a(), f("span", { class: x(i.value) }, [ m.dot ? (a(), f("svg", { key: 0, class: x(d.value), fill: "currentColor", viewBox: "0 0 8 8" }, [...b[1] || (b[1] = [ v("circle", { cx: "4", cy: "4", r: "3" }, null, -1) ])], 2)) : I("", !0), v("span", zr, [ H(m.$slots, "default", {}, () => [ b[2] || (b[2] = F("Badge", -1)) ]) ]), m.iconLeft ? (a(), f("button", { key: 1, class: x(c.value), onClick: b[0] || (b[0] = (o) => p(o)) }, [ (a(), A(oe(m.iconLeft), { class: x(["h-4 w-4", n.value]) }, null, 8, ["class"])) ], 2)) : I("", !0) ], 2)); } }); let ms = []; function Er(e) { ms = ms ? e : e.slice(); } var ot = /* @__PURE__ */ ((e) => (e[e.sm = 640] = "sm", e[e.md = 768] = "md", e[e.lg = 1024] = "lg", e[e.xl = 1280] = "xl", e[e["2xl"] = 1536] = "2xl", e))(ot || {}); function Ds(e) { const { props: { modelValue: t, steps: s, orientation: l, goVerticalBelow: r, nonInteractive: n, stepsPadding: i }, emit: c } = e, d = h( () => (l == null ? void 0 : l.value) === "vertical" ? "vertical" : "horizontal" ), p = h({ get: () => ps((t == null ? void 0 : t.value) || 0, -1, s.value.length), set: (w) => c("update:modelValue", ps(w, 0, s.value.length)) }), m = (w) => `${w + 1}`, b = (w) => w === p.value, o = (w) => w < p.value, g = (w, C) => { var N; if (n != null && n.value) { C == null || C.preventDefault(), C == null || C.stopPropagation(), C == null || C.stopImmediatePropagation(); return; } p.value = w; const L = s.value[p.value]; (N = L == null ? void 0 : L.onClick) == null || N.call(L); }, y = h(() => { const w = ["flex"]; let C, L; return (i == null ? void 0 : i.value) === "xs" ? (C = "space-x-2", L = "space-y-1") : (i == null ? void 0 : i.value) === "sm" ? (C = "space-x-4", L = "space-y-1") : (C = "space-x-6", L = "space-y-4"), w.push("flex"), d.value === "vertical" || r != null && r.value ? (w.push(`flex-col ${L} justify-center`), (r == null ? void 0 : r.value) === ot.sm ? w.push( `sm:flex-row sm:space-y-0 sm:justify-start sm:${C} sm:items-center` ) : (r == null ? void 0 : r.value) === ot.md ? w.push( `md:flex-row md:space-y-0 md:justify-start md:${C} md:items-center` ) : (r == null ? void 0 : r.value) === ot.lg ? w.push( `lg:flex-row lg:space-y-0 lg:justify-start lg:${C} lg:items-center` ) : (r == null ? void 0 : r.value) === ot.xl && w.push( `xl:flex-row xl:space-y-0 xl:justify-start xl:${C} xl:items-center` )) : w.push(`flex-row ${C} items-center`), w.join(" "); }), S = h(() => { const w = ["flex items-center"]; return n != null && n.value || w.push("cursor-pointer"), w.join(" "); }); return { value: p, isCurrentStep: b, isFinishedStep: o, switchStep: g, getStepDisplayValue: m, listClasses: y, linkClasses: S, orientation: d }; } Er([ "sm:space-x-6", "md:space-x-6", "lg:space-x-6", "xl:space-x-6", "sm:space-x-2", "md:space-x-2", "lg:space-x-2", "xl:space-x-2", "sm:space-x-4", "md:space-x-4", "lg:space-x-4", "xl:space-x-4" ]); const Rr = ["aria-label"], Fr = ["href", "onClick"], Dr = { class: "flex space-x-2 items-center" }, _r = { class: "shrink-0 h-7 w-7 rounded-full border border-primary text-white bg-primary inline-flex items-center justify-center select-none" }, Hr = { class: "flex flex-col" }, Ur = { class: "text-body-xs font-medium text-primary" }, Wr = { key: 0, class: "text-body-2xs text-foreground-2" }, Nr = ["href", "onClick"], qr = { class: "flex space-x-2 items-center" }, Kr = { class: "shrink-0 h-7 w-7 text-body-xs rounded-full border border-primary inline-flex items-center justify-center select-none text-primary" }, Gr = { class: "flex flex-col" }, Xr = { class: "text-body-xs font-medium text-primary" }, Zr = { key: 0, class: "text-body-2xs text-foreground-2" }, Jr = ["href", "onClick"], Qr = { class: "flex space-x-2 items-center" }, Yr = { class: "shrink-0 h-7 w-7 rounded-full border border-foreground-3 inline-flex items-center justify-center select-none text-foreground-3" }, ei = { class: "flex flex-col" }, ti = { class: "text-body-xs font-medium text-foreground-2" }, si = { key: 0, class: "text-body-2xs text-foreground-2" }, op = /* @__PURE__ */ D({ __name: "Number", props: { ariaLabel: {}, orientation: {}, steps: {}, modelValue: {}, goVerticalBelow: {}, nonInteractive: { type: Boolean }, stepsPadding: {} }, emits: ["update:modelValue"], setup(e, { emit: t }) { const s = t, l = e, { isCurrentStep: r, isFinishedStep: n, switchStep: i, getStepDisplayValue: c, listClasses: d, linkClasses: p } = Ds({ props: Be(l), emit: s }); return (m, b) => (a(), f("nav", { class: "flex justify-center", "aria-label": m.ariaLabel || "Progress steps" }, [ v("ol", { class: x(u(d)) }, [ (a(!0), f(J, null, te(m.steps, (o, g) => (a(), f("li", { key: o.name }, [ u(n)(g) ? (a(), f("a", { key: 0, href: o.href, class: x(u(p)), onClick: (y) => u(i)(g, y) }, [ v("div", Dr, [ v("div", _r, [ z(u(Et), { class: "w-4 h-4" }) ]), v("div", Hr, [ v("div", Ur, P(o.name), 1), o.description ? (a(), f("div", Wr, P(o.description), 1)) : I("", !0) ]) ]) ], 10, Fr)) : u(r)(g) ? (a(), f("a", { key: 1, href: o.href, class: x(u(p)), "aria-current": "step", onClick: (y) => u(i)(g, y) }, [ v("div", qr, [ v("div", Kr, P(u(c)(g)), 1), v("div", Gr, [ v("div", Xr, P(o.name), 1), o.description ? (a(), f("div", Zr, P(o.description), 1)) : I("", !0) ]) ]) ], 10, Nr)) : (a(), f("a", { key: 2, href: o.href, class: x(u(p)), onClick: (y) => u(i)(g, y) }, [ v("div", Qr, [ v("div", Yr, P(u(c)(g)), 1), v("div", ei, [ v("div", ti, P(o.name), 1), o.description ? (a(), f("div", si, P(o.description), 1)) : I("", !0) ]) ]) ], 10, Jr)) ]))), 128)) ], 2) ], 8, Rr)); } }), ni = ["aria-label"], li = ["href", "onClick"], oi = { class: "relative flex h-5 w-5 flex-shrink-0 items-center justify-center" }, ai = { key: 0, class: "h-3 w-3 rounded-full bg-foreground-2" }, ri = ["href", "onClick"], ii = { class: "relative flex h-5 w-5 flex-shrink-0 items-center justify-center", "aria-hidden": "true" }, ui = { key: 0, class: "h-3 w-3 rounded-full bg-foreground" }, di = ["href", "onClick"], ci = { class: "relative flex h-5 w-5 flex-shrink-0 items-center justify-center", "aria-hidden": "true" }, fi = { key: 0, class: "h-3 w-3 rounded-full bg-foreground-2" }, pi = { key: 1, class: "h-4 w-4 rounded-full bg-foreground-disabled" }, ap = /* @__PURE__ */ D({ __name: "Bullet", props: { ariaLabel: {}, basic: { type: Boolean }, orientation: {}, steps: {}, modelValue: {}, goVerticalBelow: {}, nonInteractive: { type: Boolean }, stepsPadding: {} }, emits: ["update:modelValue"], setup(e, { emit: t }) { const s = t, l = e, { isCurrentStep: r, isFinishedStep: n, switchStep: i, listClasses: c, linkClasses: d } = Ds({ props: Be(l), emit: s }), p = h(() => { const b = ["h6 font-medium leading-7"]; let o; return l.stepsPadding === "xs" ? o = "ml-1" : l.stepsPadding === "sm" ? o = "ml-2" : o = "ml-3", b.push(o), l.basic && b.push("sr-only"), b.join(" "); }), m = h(() => { const b = []; return l.basic && b.push("basic"), b.join(" "); }); return (b, o) => (a(), f("nav", { class: "flex justify-center", "aria-label": b.ariaLabel || "Progress steps" }, [ v("ol", { class: x([u(c), m.value]) }, [ (a(!0), f(J, null, te(b.steps, (g, y) => (a(), f("li", { key: g.name }, [ u(n)(y) ? (a(), f("a", { key: 0, href: g.href, class: x(u(d)), onClick: (S) => u(i)(y, S) }, [ v("span", oi, [ b.basic ? (a(), f("span", ai)) : (a(), A(u(fn), { key: 1, class: "h-full w-full text-primary", "aria-hidden": "true" })) ]), v("span", { class: x(["text-foreground", p.value]) }, P(g.name), 3) ], 10, li)) : u(r)(y) ? (a(), f("a", { key: 1, href: g.href, class: x(u(d)), "aria-current": "step", onClick: (S) => u(i)(y, S) }, [ v("span", ii, [ b.basic ? (a(), f("span", ui)) : (a(), f(J, { key: 1 }, [ o[0] || (o[0] = v("span", { class: "absolute h-4 w-4 rounded-full bg-outline-2" }, null, -1)), o[1] || (o[1] = v("span", { class: "relative block h-2 w-2 rounded-full bg-primary-focus" }, null, -1)) ], 64)) ]), v("span", { class: x(["text-primary-focus", p.value]) }, P(g.name), 3) ], 10, ri)) : (a(), f("a", { key: 2, href: g.href, class: x(u(d)), onClick: (S) => u(i)(y, S) }, [ v("div", ci, [ b.basic ? (a(), f("span", fi)) : (a(), f("div", pi)) ]), v("p", { class: x(["text-foreground-disabled", p.value]) }, P(g.name), 3) ], 10, di)) ]))), 128)) ], 2) ], 8, ni)); } }), me = (e, t) => { const s = e.__vccOpts || e; for (const [l, r] of t) s[l] = r; return s; }, mi = {}, hi = { xmlns: "http://www.w3.org/2000/svg", class: "icon icon-tabler icon-tabler-pointer", width: "44", height: "44", viewBox: "0 0 24 24", "stroke-width": "1.5", stroke: "currentColor", fill: "rgba(255,255,255,0.8)", "stroke-linecap": "round", "stroke-linejoin": "round" }; function vi(e, t) { return a(), f("svg", hi, [...t[0] || (t[0] = [ v("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }, null, -1), v("path", { d: "M7.904 17.563a1.2 1.2 0 0 0 2.228 .308l2.09 -3.093l4.907 4.907a1.067 1.067 0 0 0 1.509 0l1.047 -1.047a1.067 1.067 0 0 0 0 -1.509l-4.907 -4.907l3.113 -2.09a1.2 1.2 0 0 0 -.309 -2.228l-13.582 -3.904l3.904 13.563z" }, null, -1) ])]); } const bi = /* @__PURE__ */ me(mi, [["render", vi]]), gi = {}, yi = { viewBox: "0 0 18 17", fill: "none", xmlns: "http://www.w3.org/2000/svg" }; function xi(e, t) { return a(), f("svg", yi, [...t[0] || (t[0] = [ v("path", { d: "M9 1.25V3.5M14.834 3.666L13.243 5.257M17.25 9.5H15M4.757 13.743L3.167 15.333M3 9.5H0.75M4.757 5.257L3.167 3.667", stroke: "currentColor", "stroke-width": "1", "stroke-linecap": "round", "stroke-linejoin": "round" }, null, -1) ])]); } const wi = /* @__PURE__ */ me(gi, [["render", xi]]), ki = { class: "relative aspect-square w-full h-full max-w-[250px] mx-auto mb-8 border-t border-r border-outline-3 select-none" }, Ci = { class: "w-full h-full overflow-hidden" }, rp = /* @__PURE__ */ D({ __name: "Instructional", props: { actions: Array, initialPosition: { type: Object }, slotsConfig: Array }, setup(e) { const t = e, s = j(!0), l = j({ ...t.initialPosition }), r = j(!1), n = j(500), i = j(!0), c = j(t.slotsConfig || []); async function d(b) { await pn(b.duration); } function p(b) { const o = c.value.find((g) => g.name === b.slot); o && (o.visible = !o.visible); } function m(b) { switch (b.type) { case "animation": l.value = { top: b.top, left: b.left }, n.value = b.duration; break; case "click": r.value = !0, setTimeout(() => r.value = !1, 500); break; case "delay": return d(b); case "slot": p(b); break; } } return ce(() => { (async () => { for (; s.value; ) { await d({ type: "delay", duration: 800 }), i.value = !0; for (const o of t.actions || []) await m(o); i.value = !1, l.value = { ...t.initialPosition }, await d({ type: "delay", duration: 200 }); } })(); }), ht(() => { s.value = !1; }), (b, o) => (a(), f("div", ki, [ v("div", { class: "absolute z-50 text-foreground dark:text-foundation", style: ae({ transitionProperty: "all", top: l.value.top + "%", left: l.value.left + "%", transitionDuration: n.value + "ms" }) }, [ z(wi, { class: x(["absolute -top-5 -left-4 h-12 w-12 -rotate-12 text-foreground", [{ hidden: !r.value }]]) }, null, 8, ["class"]), z(bi, { class: "absolute top-0 left-0 right-0 bottom-0 h-11 w-11" }) ], 4), v("div", Ci, [ H(b.$slots, "background"), (a(!0), f(J, null, te(c.value, (g) => (a(), f(J, { key: g.name }, [ g.visible ? H(b.$slots, g.name, { key: 0 }) : I("", !0) ], 64))), 128)) ]) ])); } }), $i = {}, Ii = { width: "24", height: "26", viewBox: "0 0 24 26", fill: "none", xmlns: "http://www.w3.org/2000/svg" }; function Bi(e, t) { return a(), f("svg", Ii, [...t[0] || (t[0] = [ v("path", { d: "M22.5 11.268C23.8333 12.0378 23.8333 13.9622 22.5 14.732L3.75 25.5574C2.41667 26.3272 0.750004 25.3649 0.750005 23.8253L0.750005 2.17468C0.750006 0.635079 2.41667 -0.327169 3.75001 0.442631L22.5 11.268Z", fill: "currentColor" }, null, -1) ])]); } const Si = /* @__PURE__ */ me($i, [["render", Bi]]), Pi = { class: "relative aspect-video w-full" }, Ti = ["title", "src"], Oi = { class: "absolute top-0 left-0 w-full h-full bg-foundation pointer-events-none" }, Mi = ["src", "alt"], ji = ["src", "alt"], Ai = { class: "relative z-10 bg-primary group-hover:bg-primary-focus h-28 w-28 rounded-full border-[4px] border-white flex items-center justify-center shadow-md" }, ip = /* @__PURE__ */ D({ __name: "VimeoEmbed", props: { vimeoId: {}, title: {}, autoplay: { type: Boolean }, muted: { type: Boolean }, controls: { type: Boolean }, darkPlaceholder: {}, lightPlaceholder: {}, placeholderAlt: {} }, emits: ["onPlay"], setup(e, { expose: t, emit: s }) { const l = s, n = j(e.autoplay || !1), i = () => { n.value = !0, l("onPlay"); }; return t({ play: i }), (c, d) => (a(), f("div", Pi, [ v("iframe", { title: c.title, src: `https://player.vimeo.com/video/${c.vimeoId}?badge=0&autopause=0&player_id=0&app_id=58479&autoplay=${n.value ? "1" : "0"}&muted=${c.muted ? "1" : "0"}&controls=${c.controls ? "1" : "0"}`, frameborder: "0", allow: "autoplay; fullscreen; accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture", allowfullscreen: "", class: "w-full h-full" }, null, 8, Ti), !n.value && (c.darkPlaceholder || c.lightPlaceholder) ? (a(), f("button", { key: 0, class: "group absolute top-0 left-0 w-full h-full flex items-center justify-center", onClick: i }, [ v("div", Oi, [ c.darkPlaceholder ? (a(), f("img", { key: 0, src: c.darkPlaceholder, class: "hidden dark:block w-full h-full object-cover", alt: c.placeholderAlt || "Play video" }, null, 8, Mi)) : I("", !0), c.lightPlaceholder ? (a(), f("img", { key: 1, src: c.lightPlaceholder, class: "dark:hidden w-full h-full object-cover", alt: c.placeholderAlt || "Play video" }, null, 8, ji)) : I("", !0) ]), v("div", Ai, [ z(Si, { class: "h-10 w-10 ml-2 text-white" }) ]) ])) : I("", !0) ])); } }), Li = ["disabled"], up = /* @__PURE__ */ D({ __name: "CardButton", props: { disabled: { type: Boolean }, modelValue: { type: Boolean } }, emits: ["update:modelValue", "click"], setup(e, { emit: t }) { const s = t, l = e, r = h(() => { const i = [ "h-20 bg-foundation-2 inline-flex justify-center items-center outline-none", "normal px-16 py-5 shadow rounded transition active:scale-95" ]; return l.disabled ? i.push("bg-foundation-disabled text-foreground-2 cursor-not-allowed") : (i.push( l.modelValue ? "bg-primary-focus text-foreground-on-primary" : "bg-foundation text-foreground" ), i.push("ring-outline-2 hover:ring-4")), i.join(" "); }), n = (i) => { if (l.disabled) { i.preventDefault(), i.stopPropagation(), i.stopImmediatePropagation(); return; } s("update:modelValue", !l.modelValue), s("click", i); }; return (i, c) => (a(), f("button", { class: x(r.value), disabled: i.disabled, onClick: n }, [ H(i.$slots, "default", {}, () => [ c[0] || (c[0] = F("Text", -1)) ]) ], 10, Li)); } }), Vi = { class: "relative flex h-full w-full" }, zi = ["id", "checked", "aria-describedby", "name", "disabled", "value"], Ei = { key: 0, class: "absolute w-full h-full top-0 left-0 flex items-center justify-center pointer-events-none" }, Ri = ["for"], Fi = { key: 0, class: "text-danger ml-1" }, Di = ["id"], _i = /* @__PURE__ */ D({ inheritAttrs: !1, __name: "Checkbox", props: { /** * Input name/id. In a checkbox group, all checkboxes must have the same name and different values. */ name: { type: String, required: !0 }, /** * Whether the input is disabled */ disabled: { type: Boolean, default: !1 }, /** * Set label text */ label: { type: String, default: void 0 }, /** * Set label classes */ labelClasses: { type: String, default: void 0 }, /** * Help text */ description: { type: String, default: void 0 }, /** * Whether to inline the help description */ inlineDescription: { type: Boolean, default: !1 }, /** * vee-validate validation rules */ rules: { type: [String, Object, Function, Array], default: void 0 }, /** * vee-validate validation() on component mount */ validateOnMount: { type: Boolean, default: !1 }, /** * Whether to show the red "required" asterisk */ showRequired: { type: Boolean, default: !1 }, /** * Checkbox group's value */ modelValue: { type: [String, Boolean], default: void 0 }, /** * Checkbox's own value. If it is checked, modelValue will include this value (amongst any other checked values from the same group). * If not set will default to 'name' value. */ value: { type: [String, Boolean], default: !0 }, /** * HTML ID to use, must be globally unique. If not specified, a random ID will be generated. One is necessary to properly associate the label and checkbox. */ id: { type: String, default: void 0 }, hideLabel: { type: Boolean, default: !1 }, labelPosition: { type: String, default: "top" }, indeterminate: { type: Boolean, default: !1 } }, emits: ["update:modelValue"], setup(e) { const t = e, s = (w) => `${w}-${dt()}`, l = h(() => t.value || t.name), { checked: r, errorMessage: n, handleChange: i, value: c } = De(t.name, t.rules, { validateOnMount: t.validateOnMount, type: "checkbox", checkedValue: l, initialValue: t.modelValue || void 0 }), d = h(() => t.label || t.name), p = h(() => t.description || n.value), m = h(() => `${t.name}-description`), b = h(() => { const w = ["text-body-2xs"]; return t.inlineDescription ? w.push("inline ml-2") : w.push("block"), n.value ? w.push("text-danger") : w.push("text-foreground-2"), w.join(" "); }), o = j(s("checkbox")), g = h(() => t.id || o.value), y = h(() => { const w = [ "h-3.5 w-3.5 rounded", "border bg-foundation text-primary", "hover:border-foreground-2 focus:ring-1 focus:ring-outline-4 focus:ring-offset-1", "disabled:cursor-not-allowed disabled:opacity-60" ]; return n.value ? w.push("border-danger-lighter") : w.push("border-outline-5"), w.join(" "); }), S = (w) => { t.disabled || i(w); }; return ce(() => { const w = t.modelValue, C = c.value, L = Array.isArray(w) ? w.includes(t.value) : w === t.value, N = Array.isArray(C) ? C.includes(t.value) : C === t.value; L !== N && i(w); }), (w, C) => (a(), f("div", { class: x(["relative flex items-center", [ e.labelPosition === "left" && "flex-row-reverse items-center", e.labelPosition === "top" && "items-start", e.labelPosition === "right" && "items-center" ]]) }, [ v("div", { class: x(["flex items-center h-3.5 w-3.5", e.labelPosition === "left" ? "w-1/2 justify-end mr-2" : ""]) }, [ v("div", Vi, [ v("input", Te({ id: g.value, checked: u(r), "aria-describedby": m.value, name: e.name, disabled: e.disabled, value: l.value, type: "checkbox", class: y.value }, w.$attrs, { onChange: S }), null, 16, zi), e.indeterminate ? (a(), f("div", Ei, [ z(u(cn), { class: "w-3 h-3 text-foreground" }) ])) : I("", !0) ]) ], 2), v("div", { class: x(["text-sm", e.labelPosition === "left" ? "w-1/2" : "ml-2"]) }, [ v("label", { for: g.value, class: x({ "sr-only": e.hideLabel }) }, [ v("span", { class: x(["text-body-xs text-foreground font-medium", e.labelClasses]) }, P(d.value), 3), e.showRequired ? (a(), f("span", Fi, "*")) : I("", !0), p.value ? (a(), f("p", { key: 1, id: m.value, class: x(b.value) }, P(p.value), 11, Di)) : I("", !0) ], 10, Ri) ], 2) ], 2)); } }), Hi = ["id", "checked", "aria-describedby", "name", "disabled", "value"], Ui = ["for"], Wi = { key: 0 }, Ni = { class: "flex flex-col" }, qi = ["id"], Ki = { key: 1, class: "text-danger ml-1" }, Gi = ["id"], dp = /* @__PURE__ */ D({ inheritAttrs: !1, __name: "Radio", props: { /** * Input name/id. In a radio group, all radios must have the same name and different values. */ name: { type: String, required: !0 }, /** * Whether the input is disabled */ disabled: { type: Boolean, default: !1 }, /** * Set label text */ label: { type: String, default: void 0 }, /** * Set label text classes */ labelClasses: { type: String, default: void 0 }, /** * Help text */ description: { type: String, default: void 0 }, /** * Whether to inline the help description */ inlineDescription: { type: Boolean, default: !1 }, /** * Optional Icon */ icon: { type: Object, default: void 0 }, /** * vee-validate validation rules */ rules: { type: [String, Object, Function, Array], default: void 0 }, /** * vee-validate validation() on component mount */ validateOnMount: { type: Boolean, default: !1 }, /** * Whether to show the red "required" asterisk */ showRequired: { type: Boolean, default: !1 }, /** * Radio group's value */ modelValue: { type: [String, Boolean], default: void 0 }, /** * Radio's own value. If it is checked, modelValue will include this value (amongst any other checked values from the same group). * If not set will default to 'name' value. */ value: { type: [String, Boolean], default: !0 }, /** * HTML ID to use, must be globally unique. If not specified, a random ID will be generated. One is necessary to properly associate the label and radio. */ id: { type: String, default: void 0 }, hideLabel: { type: Boolean, default: !1 }, size: { type: String, default: "base" } }, emits: ["update:modelValue"], setup(e) { const t = e, s = (w) => `${w}-${dt()}`, l = h(() => t.value || t.name), { checked: r, errorMessage: n, handleChange: i, value: c } = De(t.name, t.rules, { validateOnMount: t.validateOnMount, type: "radio", checkedValue: l, initialValue: t.modelValue || void 0 }), d = h(() => t.label || t.name), p = h(() => n.value ? "border-danger-lighter" : "border-foreground-4 "), m = h(() => t.description || n.value), b = h(() => `${t.name}-description`), o = h(() => { const w = ["text-body-3xs"]; return n.value ? w.push("text-danger") : w.push("text-foreground-2"), w.join(" "); }), g = j(s("radio")), y = h(() => t.id || g.value), S = (w) => { t.disabled || i(w); }; return ce(() => { const w = t.modelValue, C = c.value, L = Array.isArray(w) ? w.includes(t.value) : w === t.value, N = Array.isArray(C) ? C.includes(t.value) : C === t.value; L !== N && i(w); }), (w, C) => (a(), f("div", { class: x(["relative flex space-x-2 mb-2 last:mb-0", e.description && e.inlineDescription ? "items-start" : "items-center"]) }, [ v("div", { class: x(["flex items-center", e.size === "sm" ? "h-4" : "h-6"]) }, [ v("input", Te({ id: y.value, checked: u(r), "aria-describedby": b.value, name: e.name, disabled: e.disabled, value: l.value, type: "radio", class: ["h-4 w-4 rounded-full text-primary focus:ring-primary bg-foundation disabled:cursor-not-allowed disabled:bg-disabled disabled:text-disabled-2", p.value] }, w.$attrs, { onChange: S }), null, 16, Hi) ], 2), v("div", { class: x([ e.inlineDescription ? "flex space-x-2 items-center" : "", e.size === "sm" ? "text-body-2xs" : "text-body-xs" ]) }, [ v("label", { for: y.value, class: x(["text-foreground flex space-x-2 items-center cursor-pointer", { "sr-only": e.hideLabel, "!cursor-not-allowed opacity-70": e.disabled }]) }, [ e.icon ? (a(), f("div", Wi, [ (a(), A(oe(e.icon), { class: x([ e.size === "sm" ? "h-6 sm:h-8 w-6 sm:w-8" : "h-8 w-8 sm:h-10 sm:w-10" ]) }, null, 8, ["class"])) ])) : I("", !0), v("div", Ni, [ v("span", { class: x(e.labelClasses ? e.labelClasses : "") }, P(d.value), 3), m.value && !e.inlineDescription ? (a(), f("p", { key: 0, id: b.value, class: x(o.value) }, P(m.value), 11, qi)) : I("", !0) ]), e.showRequired ? (a(), f("span", Ki, "*")) : I("", !0) ], 10, Ui), m.value && e.inlineDescription ? (a(), f("p", { key: 0, id: b.value, class: x(o.value) }, P(m.value), 11, Gi)) : I("", !0) ], 2) ], 2)); } }), Xi = { class: "w-full" }, Zi = ["disabled", "onClick"], Ji = { class: "flex flex-1 items-center text-left gap-x-2" }, Qi = { class: "flex flex-col" }, Yi = { key: 0, class: "text-foreground-3 text-body-xs" }, eu = { class: "h-5 w-5 rounded-full flex items-center justify-center border-[1.5px] border-outline-5" }, tu = { key: 0, class: "h-2.5 w-2.5 rounded-full bg-primary flex" }, su = { key: 0, class: "text-body-2xs text-foreground-2 select-none text-left pr-8" }, nu = { key: 0, class: "sm:hidden text-xs flex space-x-0.5 mt-2 text-foreground" }, lu = { key: 0, class: "hidden sm:flex space-x-3 w-full" }, ou = { key: 0, class: "text-xs flex space-x-0.5 mt-2 text-foreground select-none" }, au = { key: 1, class: "text-danger text-body-2xs mt-2" }, cp = /* @__PURE__ */ D({ __name: "RadioGroup", props: { name: { default: "formRadioGroup" }, modelValue: {}, options: {}, disabled: { type: Boolean }, isStacked: { type: Boolean }, size: { default: "base" }, rules: {} }, emits: ["update:modelValue"], setup(e) { const t = e, { value: s, errorMessage: l } = De(t.name, t.rules, { initialValue: t.modelValue }), r = h({ get: () => s.value, set: (i) => s.value = i }), n = (i) => { r.value = i; }; return (i, c) => (a(), f("div", Xi, [ v("div", { class: x([ "flex items-stretch w-full", i.isStacked ? "flex-col space-y-3 " : "flex-col sm:flex-row space-y-3 sm:space-y-0 sm:space-x-3" ]) }, [ (a(!0), f(J, null, te(i.options, (d) => (a(), f("div", { key: d.value, class: "w-full flex flex-col" }, [ v("button", { class: x(["bg-foundation relative w-full h-full select-none rounded-md border shadow", [ r.value === d.value ? "border-outline-4" : "border-outline-2", i.disabled || d.disabled ? "opacity-60 cursor-not-allowed" : "hover:border-outline-1" ]]), disabled: i.disabled || d.disabled, type: "button", onClick: (p) => n(d.value) }, [ v("div", { class: x(["flex flex-col space-y-2 h-full", t.size === "sm" ? "p-3" : "p-4 "]) }, [ v("div", { class: x(["flex justify-between gap-x-3", d.icon ? "items-start" : "items-center"]) }, [ v("div", Ji, [ d.icon ? (a(), A(oe(d.icon), { key: 0, class: "text-foreground h-5 w-5" })) : I("", !0), v("div", Qi, [ v("h4", { class: x(["text-foreground", t.size === "sm" ? "text-heading-sm" : "text-heading"]) }, P(d.title), 3), d.subtitle ? (a(), f("h5", Yi, P(d.subtitle), 1)) : I("", !0) ]) ]), v("div", eu, [ r.value === d.value ? (a(), f("div", tu)) : I("", !0) ]) ], 2), d.introduction ? (a(), f("div", su, P(d.introduction), 1)) : I("", !0), H(i.$slots, d.value) ], 2) ], 10, Zi), d.help ? (a(), f("div", nu, [ z(u(ft), { class: "h-4 w-4" }), F(" " + P(d.help), 1) ])) : I("", !0) ]))), 128)) ], 2), i.isStacked ? I("", !0) : (a(), f("div", lu, [ (a(!0), f(J, null, te(i.options, (d) => (a(), f("div", { key: d.value, class: "w-full" }, [ d.help ? (a(), f("div", ou, [ z(u(ft), { class: "h-4 w-4" }), F(" " + P(d.help), 1) ])) : I("", !0) ]))), 128)) ])), u(l) ? (a(), f("div", au, P(u(l)), 1)) : I("", !0) ])); } }); function Kt(e) { const { props: t, inputEl: s, emit: l, options: r } = e, { value: n, errorMessage: i } = De( t.name, t.rules, { validateOnMount: u(t.validateOnMount), validateOnValueUpdate: u(t.validateOnValueUpdate), initialValue: u(t.modelValue) || void 0 } ), c = h(() => { const k = [ "flex text-body-xs font-medium gap-1 items-center", u(t.color) === "foundation" ? "text-foreground" : "text-foreground-2", u(t.labelPosition) !== "left" ? "pb-1" : null ]; return u(t.showLabel) || k.push("sr-only"), k.join(" "); }), d = h(() => [ "focus:outline-none disabled:cursor-not-allowed disabled:bg-foundation-disabled", "disabled:text-disabled-muted placeholder:text-foreground-2", "rounded-md" ].join(" ")), p = h(() => { const k = u(t.color), M = ["block w-full text-foreground", d.value]; return k !== "fully-transparent" ? M.push("py-2 px-3") : M.push("p-0"), g.value ? M.push("!border-danger") : (M.push("border-0"), k !== "fully-transparent" ? M.push("transition-all focus:ring-2 focus:ring-outline-2") : M.push("focus:ring-0")), k === "foundation" ? M.push( "bg-foundation !border border-outline-2 hover:border-outline-5 focus-visible:border-outline-4 !ring-0 focus-visible:!outline-0" ) : ur(["transparent", "fully-transparent"], k) ? M.push("bg-transparent") : M.push("bg-foundation-page"), M.join(" "); }), m = j(dt()), b = h(() => u(t.label) || u(t.name)), o = h(() => { if (u(t.customErrorMessage)) return u(t.customErrorMessage); const k = i.value; return !k || !u(t.useLabelInErrors) ? k : k.replace("Value", b.value); }), g = h(() => !!o.value), y = h( () => o.value && u(t.hideErrorMessage) ), S = h(() => o.value || u(t.help)), w = h(() => !!S.value), C = h(() => u(t.customHelpClass)), L = h( () => w.value ? `${u(t.name)}-${m.value}` : void 0 ), N = h(() => { const k = ["text-body-2xs break-words"]; return k.push(g.value ? "text-danger" : "text-foreground-2"), C.value && k.push(C.value), k.join(" "); }), Y = h(() => { var k; return u(t.showClear) ? (((k = n.value) == null ? void 0 : k.length) || 0) > 0 : !1; }), R = () => { var k; (k = s.value) == null || k.focus(); }, $ = () => { var k; n.value = se(n.value) ? [] : "", (k = r == null ? void 0 : r.customClear) == null || k.call(r), l("change", { value: n.value }), l("clear"); }; return ce(() => { u(t.autoFocus) && R(); }), { coreInputClasses: d, coreClasses: p, title: b, value: n, helpTipId: L, helpTipClasses: N, helpTip: S, hideHelpTip: y, errorMessage: o, clear: $, focus: R, labelClasses: c, shouldShowClear: Y, hasError: g }; } function ru(e) { const { debouncedBy: t = 1e3, isBasicHtmlInput: s = !1, submitOnEnter: l, disableDebouncedInput: r, onWrite: n } = e || {}, i = e != null && e.debug ? vr(e.debug) ? console.debug : e.debug : Ht, c = (e == null ? void 0 : e.model) || j(""), d = j(c.value), p = (w) => { if (Le(w)) return w; if ("value" in w) return w.value; const C = w.target; return (C == null ? void 0 : C.value) || ""; }, m = (w) => { c.value = w, i("Value updated: " + w), n == null || n(w); }, b = r ? void 0 : st((w) => { m(w); }, t), o = s ? "input" : "update:modelValue", g = { [o]: (w) => { const C = p(w); d.value = C, b == null || b(C), i(`Input event [${o}] triggered: ${C}`); }, clear: () => { b == null || b.cancel(), d.value = "", m(""), i("Clear event"); }, change: (w) => { const C = p(w); b == null || b.cancel(), m(C), d.value = C, i("Change event: " + C); }, keydown: (w) => { if (!s || Pe(l) || !(w.key === "Enter")) return; w.target instanceof HTMLTextAreaElement ? l && (i("Triggering submit on enter"), w.preventDefault(), w.stopPropagation(), g.change(w)) : l || (i("Preventing submit on enter"), w.preventDefault(), w.stopPropagation()); } }, y = h(() => ({ modelValue: d.value || "" })); return re(c, (w, C) => { C === w && !C && !w || d.value !== c.value && (d.value = c.value); }), { on: g, bind: y, value: c, /** * Force sync internal state from the source of truth */ syncFromValue: () => { b == null || b.cancel(), d.value = c.value; } }; } const iu = ["for"], uu = { key: 0, class: "text-body-2xs font-normal" }, du = ["id"], cu = ["id", "name", "placeholder", "disabled", "aria-invalid", "aria-describedby"], fu = ["id"], fp = /* @__PURE__ */ D({ __name: "TextArea", props: { name: {}, showLabel: { type: Boolean }, help: {}, placeholder: {}, label: {}, disabled: { type: Boolean }, rules: {}, validateOnMount: { type: Boolean }, validateOnValueUpdate: { type: Boolean }, useLabelInErrors: { type: Boolean, default: !0 }, autoFocus: { type: Boolean }, modelValue: { default: "" }, showClear: { type: Boolean }, fullWidth: { type: Boolean }, showRequired: { type: Boolean }, showOptional: { type: Boolean }, color: { default: "page" }, textareaClasses: {}, size: {}, labelPosition: { default: "top" }, wrapperClasses: { default: "" } }, emits: ["update:modelValue", "change", "input", "clear"], setup(e, { expose: t, emit: s }) { const l = s, r = e, n = j(null), { coreClasses: i, title: c, value: d, helpTipClasses: p, helpTip: m, errorMessage: b, labelClasses: o, clear: g, focus: y, shouldShowClear: S } = Kt({ props: Be(r), emit: l, inputEl: n }), w = h(() => `${r.name}-help-top`), C = h(() => `${r.name}-help-left`), L = h(() => { const R = ["pl-2"]; return S.value && b.value ? R.push("pr-12") : (S.value || b.value) && R.push("pr-8"), R.join(" "); }), N = h(() => { switch (r.size) { case "sm": return "text-body sm:text-body-2xs"; case "lg": return "text-body sm:text-sm"; case "xl": return "text-body sm:text-base"; case "base": default: return "text-body sm:text-body-xs"; } }), Y = h(() => { const R = ["flex", r.wrapperClasses]; return r.fullWidth && R.push("w-full"), r.labelPosition === "top" && R.push("flex-col"), r.labelPosition === "left" && R.push( "w-full space-y-1 sm:space-y-0 sm:space-x-8 flex-col sm:flex-row items-start" ), R.join(" "); }); return t({ focus: y }), (R, $) => (a(), f("div", { class: x(Y.value) }, [ v("div", { class: x( R.labelPosition === "left" ? "w-full md:w-6/12 flex flex-col justify-center" : "w-full" ) }, [ v("label", { for: R.name, class: x(u(o)) }, [ v("span", null, P(u(c)), 1), R.showRequired ? I("", !0) : (a(), f("div", uu, "(optional)")) ], 10, iu), R.labelPosition === "left" && C.value ? (a(), f("span", { key: 0, id: C.value, class: x(u(p)) }, P(u(m)), 11, du)) : I("", !0) ], 2), v("div", { class: x(["relative", R.labelPosition === "left" ? "w-full md:w-6/12" : "w-full"]) }, [ Q(v("textarea", Te({ id: R.name, ref_key: "inputElement", ref: n, "onUpdate:modelValue": $[0] || ($[0] = (k) => vt(d) ? d.value = k : null), name: R.name, class: [ u(i), L.value, N.value, R.textareaClasses || "", "min-h-[6rem] sm:min-h-[3rem] simple-scrollbar" ], placeholder: R.placeholder, disabled: R.disabled, "aria-invalid": u(b) ? "true" : "false", "aria-describedby": R.labelPosition === "left" ? C.value : w.value }, R.$attrs, { onChange: $[1] || ($[1] = (k) => R.$emit("change", { event: k, value: u(d) })), onInput: $[2] || ($[2] = (k) => R.$emit("input", { event: k, value: u(d) })), onKeydown: $[3] || ($[3] = ge(() => { }, ["stop"])) }), null, 16, cu), [ [Ke, u(d)] ]), u(S) ? (a(), f("a", { key: 0, title: "Clear input", class: "absolute top-2 right-0 flex items-center pr-2 cursor-pointer", onClick: $[4] || ($[4] = //@ts-ignore (...k) => u(g) && u(g)(...k)), onKeydown: $[5] || ($[5] = //@ts-ignore (...k) => u(g) && u(g)(...k)) }, [ $[6] || ($[6] = v("span", { class: "text-xs sr-only" }, "Clear input", -1)), z(u(Ge), { class: "h-5 w-5 text-foreground", "aria-hidden": "true" }) ], 32)) : I("", !0) ], 2), R.labelPosition === "top" && w.value ? (a(), f("p", { key: 0, id: w.value, class: x(["mt-1.5", u(p)]) }, P(u(m)), 11, fu)) : I("", !0) ], 2)); } }), pu = ["for"], mu = { key: 0, class: "text-danger text-body-xs opacity-80" }, hu = { key: 1, class: "text-body-2xs font-normal" }, vu = ["id"], bu = { key: 0, class: "pointer-events-none absolute top-0 bottom-0 left-0 flex items-center pl-2" }, gu = { key: 1, class: "absolute top-0 h-full right-0 flex items-center pr-2 text-foreground-3" }, yu = ["id", "type", "name", "placeholder", "disabled", "aria-invalid", "aria-describedby", "readonly"], xu = ["title"], wu = { class: "text-body-xs sr-only" }, ku = ["id"], Gt = /* @__PURE__ */ D({ inheritAttrs: !1, __name: "TextInput", props: { /** * Input "type" value (changes behaviour & look) */ type: { type: String, default: "text" }, /** * Unique ID for the input (must be unique page-wide) */ name: { type: String, required: !0 }, /** * Whether to show label (label will always be shown to screen readers) */ showLabel: { type: Boolean, required: !1 }, /** * Optional help text */ help: { type: String, default: void 0 }, /** * Placeholder text */ placeholder: { type: String, default: void 0 }, /** * Set label text explicitly */ label: { type: String, default: void 0 }, /** * Whether to show the red "required" asterisk */ showRequired: { type: Boolean, default: !1 }, /** * Whether to show the "optional" text */ showOptional: { type: Boolean, default: !1 }, /** * Whether to disable the component, blocking it from user input */ disabled: { type: Boolean, default: !1 }, /** * Whether to disable editing the component, making it read only */ readOnly: { type: Boolean, default: !1 }, /** * vee-validate validation rules */ rules: { type: [String, Object, Function, Array], default: void 0 }, /** * vee-validate validation() on component mount */ validateOnMount: { type: Boolean, default: !1 }, /** * Whether to trigger validation whenever the value changes */ validateOnValueUpdate: { type: Boolean, default: !1 }, /** * Will replace the generic "Value" text with the name of the input in error messages */ useLabelInErrors: { type: Boolean, default: !0 }, /** * Set a custom icon to use inside the input */ customIcon: { type: [Object, Function], default: void 0 }, iconClasses: { type: String, default: null }, /** * Whether to focus on the input when component is mounted */ autoFocus: { type: Boolean, default: !1 }, modelValue: { type: String, default: "" }, size: { type: String, default: "base" }, showClear: { type: Boolean, default: !1 }, inputClasses: { type: String, default: null }, fullWidth: { type: Boolean, default: !1 }, loading: { type: Boolean, default: !1 }, hideErrorMessage: { type: Boolean, default: !1 }, customErrorMessage: { type: String, default: null }, wrapperClasses: { type: String, default: () => "" }, color: { type: String, default: "page" }, labelPosition: { type: String, default: "top" }, rightIcon: { type: [Object, Function], default: void 0 }, rightIconTitle: { type: String, default: void 0 }, tooltipText: { type: String, default: void 0 }, customHelpClass: { type: String, default: void 0 } }, emits: ["update:modelValue", "change", "input", "clear", "focus", "blur", "rightIconClick"], setup(e, { expose: t, emit: s }) { const l = e, r = s, n = bt(), i = j(null), { coreClasses: c, title: d, value: p, helpTipId: m, helpTipClasses: b, helpTip: o, hideHelpTip: g, errorMessage: y, clear: S, focus: w, labelClasses: C, shouldShowClear: L } = Kt({ props: Be(l), emit: r, inputEl: i }), N = h(() => l.color !== "fully-transparent" ? {} : { fontSize: "inherit" }), Y = h(() => { const B = ["h-4 w-4"]; return l.iconClasses && B.push(l.iconClasses), y.value ? B.push("text-danger") : B.push("text-foreground-2"), B.join(" "); }), R = h(() => { const B = []; return l.customIcon && B.push("pl-8"), n["input-right"] || (l.rightIcon || y.value || L.value) && B.push("pr-8"), B.join(" "); }), $ = h(() => { const B = (V) => l.color === "fully-transparent" ? "" : V; switch (l.size) { case "sm": return `h-6 ${B("text-body sm:text-body-sm")}`; case "lg": return `h-10 ${B("text-body sm:text-[13px]")}`; case "xl": return `h-14 ${B("text-body sm:text-sm")}`; case "base": default: return `h-8 ${B("text-body sm:text-body-sm")}`; } }), k = h(() => { const B = ["flex", l.wrapperClasses]; return l.fullWidth && B.push("w-full"), l.labelPosition === "top" && B.push("flex-col"), l.labelPosition === "left" && B.push("w-full space-y-1 sm:space-y-0 sm:space-x-8 flex-col sm:flex-row"), B.join(" "); }), M = () => { r("rightIconClick"); }; return t({ focus: w }), (B, V) => (a(), f("div", { class: x(k.value) }, [ v("div", { class: x( e.labelPosition === "left" ? "w-full md:w-6/12 flex flex-col justify-center" : "w-full" ) }, [ v("label", { for: e.name, class: x(u(C)) }, [ v("span", null, P(u(d)), 1), e.showRequired ? (a(), f("div", mu, "*")) : e.showOptional ? (a(), f("div", hu, "(optional)")) : I("", !0) ], 10, pu), e.labelPosition === "left" && u(m) && !u(g) ? (a(), f("p", { key: 0, id: u(m), class: x(u(b)) }, P(u(o)), 11, vu)) : I("", !0) ], 2), v("div", { class: x(["group relative", e.labelPosition === "left" ? "w-full md:w-6/12" : "w-full"]) }, [ e.customIcon ? (a(), f("div", bu, [ e.customIcon ? (a(), A(oe(e.customIcon), { key: 0, class: x(Y.value), "aria-hidden": "true" }, null, 8, ["class"])) : I("", !0) ])) : I("", !0), e.loading ? (a(), f("div", gu, [ z(u(ct)) ])) : I("", !0), Q((a(), f("div", null, [ Q(v("input", Te({ id: e.name, ref_key: "inputElement", ref: i, "onUpdate:modelValue": V[0] || (V[0] = (U) => vt(p) ? p.value = U : null), type: e.type, name: e.name, class: [u(c), R.value, $.value, e.inputClasses || ""], placeholder: e.placeholder, disabled: e.disabled, "aria-invalid": u(y) ? "true" : "false", "aria-describedby": u(m), readonly: e.readOnly, role: "textbox" }, B.$attrs, { style: N.value, onChange: V[1] || (V[1] = (U) => B.$emit("change", { event: U, value: u(p) })), onInput: V[2] || (V[2] = (U) => B.$emit("input", { event: U, value: u(p) })), onFocus: V[3] || (V[3] = (U) => B.$emit("focus")), onBlur: V[4] || (V[4] = (U) => B.$emit("blur")), onKeydown: V[5] || (V[5] = ge(() => { }, ["stop"])) }), null, 16, yu), [ [Ys, u(p)] ]) ])), [ [u(Ae), e.tooltipText] ]), H(B.$slots, "input-right", {}, () => [ e.rightIcon ? (a(), f("a", { key: 0, title: e.rightIconTitle, class: x([[ $.value, e.readOnly ? "w-full cursor-text border border-transparent group-hover:border-outline-5 rounded-md" : "cursor-pointer" ], "absolute top-0 right-0 hidden group-hover:flex items-center justify-end pr-1 text-foreground-2"]), onClick: M, onKeydown: M }, [ v("span", wu, P(e.rightIconTitle), 1), (a(), A(oe(e.rightIcon), { class: "h-6 w-6 text-foreground", "aria-hidden": "true" })) ], 42, xu)) : u(L) ? (a(), f("a", { key: 1, title: "Clear input", class: "absolute top-0 bottom-0 right-0 flex items-center pr-2 cursor-pointer", onClick: V[6] || (V[6] = //@ts-ignore (...U) => u(S) && u(S)(...U)), onKeydown: V[7] || (V[7] = //@ts-ignore (...U) => u(S) && u(S)(...U)) }, [ V[8] || (V[8] = v("span", { class: "text-body-xs sr-only" }, "Clear input", -1)), z(u(Ge), { class: "h-5 w-5 text-foreground", "aria-hidden": "true" }) ], 32)) : !e.showLabel && e.showRequired && !u(y) ? (a(), f("div", { key: 2, class: x(["pointer-events-none absolute top-0 bottom-0 mt-2 text-body right-0 flex items-center text-danger pr-2.5", [u(L) ? "pr-8" : "pr-2"]]) }, " * ", 2)) : I("", !0) ]) ], 2), e.labelPosition === "top" && u(m) && !u(g) ? (a(), f("p", { key: 0, id: u(m), class: x(["mt-1.5", u(b)]) }, P(u(o)), 11, ku)) : I("", !0) ], 2)); } }), _s = /^https?:\/\//, kt = /^[^\s@]+@[^\s@]+\.[^\s@]+$/, Cu = (e) => (e || "").match(kt) ? !0 : "Value should be a valid e-mail address", $u = (e) => (e || "").match(kt) || !e ? !0 : "Value should be a valid e-mail address", Iu = (e) => (e || "").split(",").map((l) => l.trim()).every((l) => l.match(kt)) || "Value should be one or multiple comma-delimited e-mail addresses", Bu = (e) => (Le(e) && (e = e.trim()), e ? !0 : "Value is required"), Su = (e, t) => (s, l) => s === l.form[e] ? !0 : `Value must be the same as in field '${t || e}'`, Pu = (e) => (t) => { const { minLength: s, maxLength: l } = e; return t = mn(t) ? "" : t, Le(t) ? !Pe(s) && t.length < s ? `Value needs to be at least ${s} characters long` : !Pe(l) && t.length > l ? `Value can't be longer than ${l} characters` : !0 : "Value should be a text string"; }, Tu = (e) => (t) => { const { match: s, message: l } = e; return Le(t) ? s ? Le(s) ? t.includes(s) ? !0 : l : s.test(t) ? !0 : l : !0 : "Value should be a text string"; }, Ou = (e) => _s.test(e) ? !0 : "Value is not a valid URL", Mu = (e) => Array.isArray(e) && e.length > 0 ? !0 : "Value should have at least a single item selected", ju = (e) => Array.isArray(e) && e.length > 0 ? !0 : "Value should have at least a single item selected", pp = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, VALID_EMAIL: kt, VALID_HTTP_URL: _s, isEmail: Cu, isEmailOrEmpty: $u, isItemSelected: Mu, isMultiItemSelected: ju, isOneOrMultipleEmails: Iu, isRequired: Bu, isSameAs: Su, isStringOfLength: Pu, isUrl: Ou, stringContains: Tu }, Symbol.toStringTag, { value: "Module" })); function Hs(e) { const { skipCalculation: t, elementToWatchForChanges: s, itemContainer: l, trackResize: r = !1, trackMutations: n = !0 } = e || {}, i = j(0), c = () => { const d = l.value; if (t != null && t.value || !d) return; const p = d.children; let m = 0, b = 0, o; for (const g of p) { const y = g.offsetTop; Pe(o) ? (o = y, m += 1) : y === o && (m += 1), b += 1; } i.value = b - m; }; return r && Ft(s, c), n && Mn(s, c, { childList: !0, subtree: !0 }), { hiddenItemCount: i }; } function Us(e) { const { props: t, emit: s, dynamicVisibility: l } = e; let r; if (l) { const { elementToWatchForChanges: p, itemContainer: m } = l; r = Hs({ skipCalculation: h(() => { var o; return !((o = t.multiple) != null && o.value); }), elementToWatchForChanges: p, itemContainer: m }).hiddenItemCount; } else r = j(0); const n = h({ get: () => { var m, b; const p = (m = t.modelValue) == null ? void 0 : m.value; return (b = t.multiple) != null && b.value ? se(p) ? p : [] : se(p) ? void 0 : p; }, set: (p) => { var m, b, o; if ((m = t.multiple) != null && m.value && !se(p)) { console.warn("Attempting to set non-array value in selector w/ multiple=true"); return; } else if (!((b = t.multiple) != null && b.value) && se(p)) { console.warn("Attempting to set array value in selector w/ multiple=false"); return; } s("update:modelValue", (o = t.multiple) != null && o.value ? p || [] : p); } }), i = (p) => se(p); return { selectedValue: n, hiddenSelectedItemCount: r, isArrayValue: i, isMultiItemArrayValue: (p) => se(p) && p.length > 1, firstItem: (p) => i(p) ? p[0] : p }; } const Au = /* @__PURE__ */ D({ __name: "Bar", props: { loading: { type: Boolean }, clientOnly: { type: Boolean } }, setup(e) { const t = e, s = Dt(), l = h(() => (s.value || !t.clientOnly) && t.loading); return (r, n) => (a(), f("div", { class: x([ "relative w-full h-1 bg-blue-500/30 text-xs text-foreground-on-primary overflow-hidden rounded-xl", l.value ? "opacity-100" : "opacity-0" ]) }, [...n[0] || (n[0] = [ v("div", { class: "swoosher relative top-0 bg-blue-500/50" }, null, -1) ])], 2)); } }); const Ct = /* @__PURE__ */ me(Au, [["__scopeId", "data-v-bdcf2251"]]); var Lu = /* @__PURE__ */ ((e) => (e[e.Throttle = 0] = "Throttle", e[e.Debounce = 1] = "Debounce", e))(Lu || {}), ut = /* @__PURE__ */ ((e) => (e[e.Left = 0] = "Left", e[e.Right = 1] = "Right", e))(ut || {}); function Vu(e, t) { if (!Ve) return; const { wait: s = 100, throttleOrDebounce: l = 0 /* Throttle */ } = t || {}, r = s ? l === 0 ? mt(e, s) : st(e, s) : e; ce(() => window.addEventListener("resize", r)), ht(() => window.removeEventListener("resize", r)); } function mp(e) { ce(() => { window.addEventListener("beforeunload", e); }), ht(() => { window.removeEventListener("beforeunload", e); }); } function zu(e) { const { el: t, defaultDirection: s } = e, l = j( Pe(s) ? 1 : s /* Right */ ), r = h(() => { const i = u(e.stopUpdatesBelowWidth); if (!Pe(i)) return i; const c = u(t); return c != null && c.offsetWidth ? c.offsetWidth * 2 : void 0; }), n = () => { if (!Ve) return; const i = u(t); if (!i) return; const c = i.getBoundingClientRect(), d = c.x + c.width > window.innerWidth, p = c.x < 0; d && p || !Pe(r.value) && window.innerWidth < r.value || (d ? l.value = 0 : p && (l.value = 1)); }; return Vu(() => n()), re( () => u(t), (i) => { i && n(); } ), { direction: h(() => l.value), recalculateDirection: n }; } const Ws = (e) => ({ menuStyle: h(() => { const s = {}; if (!Ve) return s; const l = u(e.menuOpenDirection) === ut.Left, r = e.buttonBoundingBox.top.value, n = e.buttonBoundingBox.left.value, i = e.buttonBoundingBox.width.value, c = e.buttonBoundingBox.height.value, d = 4; let p = i, m = n, b = r + c + d; const o = u(e.menuWidth), g = u(e == null ? void 0 : e.menuHeight), y = window.innerWidth, S = window.innerHeight, w = y - d * 2, C = S - d * 2; return Pe(o) || (o > w ? (p = w, m = d) : (p = o, l ? (m = n + i - o, m < d && (m = d)) : n + o > w && (m = Math.max(n + i - o, d)))), Pe(g) || (g > C ? b = d : r + c + g > C && (b = r - g - d)), s.left = `${m}px`, s.width = `${p}px`, s.top = `${b}px`, s; }) }), Eu = { key: 0, class: "text-danger text-xs opacity-80" }, Ru = { key: 1, class: "text-body-2xs font-normal" }, Fu = ["id"], Du = { class: "pointer-events-none shrink-0 ml-1 flex items-center space-x-2" }, _u = { key: 1, class: "text-4xl text-danger opacity-50 h-4 w-4 leading-6" }, Hu = ["disabled"], Uu = { key: 0, class: "flex flex-col mx-1 mb-1" }, Wu = { class: "relative" }, Nu = { class: "pointer-events-none absolute top-0 bottom-0 left-0 flex items-center pl-2" }, qu = ["placeholder"], Ku = { key: 0, class: "px-1" }, Gu = { key: 1 }, Xu = { class: "text-foreground-2 text-center" }, Zu = { key: 0, class: /* @__PURE__ */ x([ "absolute top-0 bottom-0 right-0 text-foreground flex items-center pr-4" ]) }, Ju = ["id"], Ns = /* @__PURE__ */ D({ __name: "Base", props: { size: { type: String, default: void 0 }, multiple: { type: Boolean, default: !1 }, items: { type: Array, default: () => [] }, modelValue: { type: [Object, Array, String], default: void 0 }, /** * Whether to enable the search bar. You must also set one of the following: * * filterPredicate - to allow filtering passed in `items` based on search bar * * getSearchResults - to allow asynchronously loading items from server (props.items no longer required in this case, * but can be used to prefill initial values) */ search: { type: Boolean, default: !1 }, /** * If search=true and this is set, you can use this to filter passed in items based on whatever * the user enters in the search bar */ filterPredicate: { type: Function, default: void 0 }, /** * Set this to disable certain items in the list */ disabledItemPredicate: { type: Function, default: void 0 }, /** * If search=true and this is set, you can use this to load data asynchronously depending * on the search query */ getSearchResults: { type: Function, default: void 0 }, searchPlaceholder: { type: String, default: "Search" }, /** * Label is required at the very least for screen-readers */ label: { type: String, required: !0 }, /** * Optional text that replaces the label as the placeholder when set. */ placeholder: { type: String }, /** * Whether to show the label visually */ showLabel: { type: Boolean, default: !1 }, name: { type: String, required: !0 }, /** * Objects will be compared by the values in the specified prop */ by: { type: String, required: !1 }, disabled: { type: Boolean, default: !1 }, buttonStyle: { type: String, default: "base" }, hideCheckmarks: { type: Boolean, default: !1 }, allowUnset: { type: Boolean, default: !0 }, clearable: { type: Boolean, default: !1 }, /** * Validation stuff */ rules: { type: [String, Object, Function, Array], default: void 0 }, /** * vee-validate validation() on component mount */ validateOnMount: { type: Boolean, default: !1 }, /** * Whether to trigger validation whenever the value changes */ validateOnValueUpdate: { type: Boolean, default: !1 }, /** * Will replace the generic "Value" text with the name of the input in error messages */ useLabelInErrors: { type: Boolean, default: !0 }, /** * Optional help text */ help: { type: String, default: void 0 }, /** * @deprecated Use size attribute instead */ fixedHeight: { type: Boolean, default: !1 }, /** * By default component holds its own internal value state so that even if you don't have it tied up to a real `modelValue` ref somewhere * it knows its internal state and can report it on form submits. * * If you set this to true, its only going to rely on `modelValue` as its primary source of truth so that you can reject updates etc. */ fullyControlValue: { type: Boolean, default: !1 }, /** * Whether to show the red "required" asterisk */ showRequired: { type: Boolean, default: !1 }, /** * Whether to show the optional text */ showOptional: { type: Boolean, default: !1 }, /** * Whether to mount the menu on the body instead of inside the component. Useful when select box is mounted within * dialog windows and the menu causes unnecessary overflow. */ mountMenuOnBody: { type: Boolean, default: !1 }, labelId: { type: String, default: void 0 }, buttonId: { type: String, default: void 0 }, /** * Tooltip shown on disabled items */ disabledItemTooltip: { required: !1, type: String }, labelPosition: { type: String, default: "top" }, tooltipText: { type: String, default: void 0 }, /** * Optionally make the menu width wider/narrower than the button width by specifying the max width in pixels. * Only supported when `mountMenuOnBody` is true. */ menuMaxWidth: { type: Number, default: void 0 }, /** * If menuMaxWidth is set and menu is wider than the button, this will determine the direction of the menu opening. * Default: 'left' (opens to the left of the button) */ menuOpenDirection: { type: String, default: "left" }, /** * Custom max height classes for the dropdown menu. If not provided, defaults to 'max-h-[50vh] xl:max-h-80' */ menuMaxHeightClasses: { type: String, default: void 0 } }, emits: ["update:modelValue"], setup(e, { expose: t, emit: s }) { const l = (T) => ye(T), r = s, n = e, { value: i, errorMessage: c } = De(n.name, n.rules, { validateOnMount: n.validateOnMount, validateOnValueUpdate: n.validateOnValueUpdate, // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion initialValue: n.modelValue }), d = Dt(), p = j(null), m = j(null), b = j(null), o = j(""), g = j([]), y = j(!1), S = j(1), w = j(dt()), C = j(!1), L = _t( h(() => { var T; return (T = b.value) == null ? void 0 : T.el; }), { windowResize: !0, windowScroll: !0, immediate: !0 } ); Cs( h(() => { var T; return (T = m.value) == null ? void 0 : T.el; }), ([{ isIntersecting: T }]) => { T && n.mountMenuOnBody && L.update(); } ); const { menuStyle: N } = Ws({ menuOpenDirection: h( () => n.menuOpenDirection === "left" ? ut.Left : ut.Right ), menuWidth: h(() => n.menuMaxWidth), buttonBoundingBox: L }), Y = h(() => u(n.label) || u(n.name)), R = h(() => { const T = c.value; return !T || !u(n.useLabelInErrors) ? T : T.replace("Value", Y.value); }), $ = h(() => R.value || u(n.help)), k = h(() => !!$.value), M = h( () => k.value ? `${u(n.name)}-${w.value}` : void 0 ), B = h( () => c.value ? "text-danger" : "text-foreground-2" ), V = h(() => n.labelPosition === "left"), U = h( () => n.buttonStyle !== "simple" && n.clearable && !n.disabled ), xe = h(() => { if (!n.size) return ""; switch (n.size) { case "sm": return "h-6 text-body-sm"; case "lg": return "h-10 text-[13px]"; case "xl": return "h-14 text-sm"; case "base": default: return "h-8 text-body-sm"; } }), he = h(() => { var X; const T = ["relative flex group"]; return c.value ? (T.push("hover:shadow rounded-md"), T.push("text-danger-darker focus:border-danger"), n.buttonStyle !== "simple" && T.push("border border-danger")) : n.buttonStyle !== "simple" && (T.push("rounded-md border"), C.value ? T.push("border-outline-4") : T.push("border-outline-2 hover:border-outline-5 focus:outline-0")), n.fixedHeight ? T.push("h-8") : (X = xe.value) != null && X.length && T.push(xe.value), V.value && T.push("md:basis-1/2"), T.join(" "); }), $e = h(() => { const T = []; return n.buttonStyle !== "simple" && T.push( ne.value ? "bg-foundation-disabled text-foreground-disabled" : "" ), ne.value && T.push("cursor-not-allowed"), T.join(" "); }), Oe = h(() => { const T = [ "relative z-[1]", "flex items-center justify-center text-center shrink-0", "rounded-r-md overflow-hidden transition-all", "text-foreground", _.value ? `w-6 ${$e.value}` : "w-0" ]; return ne.value || (T.push( "hover:bg-primary hover:text-foreground-on-primary dark:text-foreground-on-primary" ), n.buttonStyle === "tinted" ? T.push("bg-outline-3") : T.push("bg-primary-muted")), T.join(" "); }), Ee = h(() => { const T = [ "relative z-[2]", "normal rounded-md cursor-pointer transition truncate flex-1", "flex items-center focus:outline-outline-4 focus:outline-1", $e.value ]; return n.buttonStyle !== "simple" && (T.push("p-2"), ne.value || (n.buttonStyle, T.push("bg-foundation text-foreground"))), U.value && _.value && T.push("rounded-r-none"), T.join(" "); }), ie = h( () => !!(n.search && (n.filterPredicate || n.getSearchResults)) ), ue = h(() => ie.value && n.getSearchResults), ne = h( () => n.disabled || !n.items.length && !ue.value ), le = h({ get: () => { const T = i.value; return n.multiple ? se(T) ? T : [] : se(T) ? void 0 : T; }, set: (T) => { if (n.multiple && !se(T)) { console.warn("Attempting to set non-array value in selector w/ multiple=true"); return; } else if (!n.multiple && se(T)) { console.warn("Attempting to set array value in selector w/ multiple=false"); return; } let X; if (n.multiple) X = T || []; else { const Z = i.value; X = n.allowUnset && Z && T && we(Z) === we(T) ? void 0 : T; } n.fullyControlValue ? r("update:modelValue", X) : i.value = X, S.value += 1; } }), _ = h(() => n.multiple && se(le.value) ? le.value.length !== 0 : !!le.value), W = () => { n.multiple ? le.value = [] : le.value = void 0; }, q = h(() => { const T = o.value; return !ie.value || !(T != null && T.length) ? g.value : n.filterPredicate ? g.value.filter( (X) => { var Z; return ((Z = n.filterPredicate) == null ? void 0 : Z.call(n, X, T)) || !1; } ) : g.value; }), fe = h(() => { const T = [ "rounded-md bg-foundation py-1 label label--light border border-outline-3 shadow-md" ]; return n.mountMenuOnBody ? T.push("fixed z-50") : T.push("absolute top-[100%] w-full z-40 mt-1"), T.join(" "); }), ve = h(() => { let T = {}; return !Ve || !n.mountMenuOnBody || (T = { ...T, ...N.value }), T; }), de = (T) => JSON.stringify(T), we = (T) => l(T) ? T[n.by || "id"] : T, Re = async () => { if (!(!ue.value || !n.getSearchResults)) { y.value = !0; try { g.value = await n.getSearchResults(o.value); } finally { y.value = !1; } } }, $t = st(Re, 1e3), It = (T) => { const { disabled: X } = T || {}, Z = ["relative transition select-none py-1 px-2"]; return X ? Z.push("opacity-50 cursor-not-allowed") : Z.push("text-foreground cursor-pointer"), Z.join(" "); }; return re( () => n.items, (T) => { g.value = T.slice(); }, { immediate: !0 } ), re(o, () => { ue.value && $t(); }), re(C, (T, X) => { T && !X && L.update(); }), ce(() => { ue.value && !n.items.length && Re(); }), t({ triggerSearch: Re }), (T, X) => (a(), f("div", null, [ (a(), A(u(Fn), { key: S.value, modelValue: le.value, "onUpdate:modelValue": X[4] || (X[4] = (Z) => le.value = Z), name: e.name, multiple: e.multiple, by: e.by, disabled: ne.value, as: "div", class: x({ "md:flex md:items-center md:space-x-2 md:justify-between": V.value }) }, { default: E(() => [ v("div", { class: x(["flex flex-col", { "pb-1": e.showLabel && !V.value }]) }, [ z(u(Dn), { id: e.labelId, class: x(["flex text-body-xs text-foreground font-medium", [{ "sr-only": !e.showLabel }, { "items-center gap-1": e.showOptional }]]), for: e.buttonId }, { default: E(() => [ F(P(e.label) + " ", 1), e.showRequired ? (a(), f("div", Eu, "*")) : e.showOptional ? (a(), f("div", Ru, " (optional) ")) : I("", !0) ]), _: 1 }, 8, ["id", "class", "for"]), M.value && V.value ? (a(), f("p", { key: 0, id: M.value, class: x(["text-xs", B.value]) }, P($.value), 11, Fu)) : I("", !0) ], 2), Q((a(), f("div", null, [ v("div", { class: x(he.value) }, [ z(u(_n), { id: e.buttonId, ref_key: "listboxButton", ref: b, class: x(Ee.value) }, { default: E(({ open: Z }) => [ v("div", { class: x(["flex items-center w-full", e.buttonStyle === "simple" ? "justify-start" : "justify-between"]) }, [ v("div", { class: x(["block truncate text-left text-xs sm:text-[13px]", [ _.value ? "text-foreground" : "text-foreground-2", e.buttonStyle === "simple" ? "" : "grow" ]]) }, [ !le.value || u(se)(le.value) && !le.value.length ? H(T.$slots, "nothing-selected", { key: 0 }, () => [ F(P(e.placeholder ? e.placeholder : e.label), 1) ]) : H(T.$slots, "something-selected", { key: 1, value: le.value }, () => [ F(P(de(le.value)), 1) ]) ], 2), v("div", Du, [ R.value ? (a(), A(u(Rt), { key: 0, class: "h-4 w-4 text-danger", "aria-hidden": "true" })) : !e.showLabel && e.showRequired ? (a(), f("div", _u, " * ")) : I("", !0), Z ? (a(), A(u(xs), { key: 2, class: "h-4 w-4 text-foreground", "aria-hidden": "true" })) : (a(), A(u(ws), { key: 3, class: "h-4 w-4 text-foreground", "aria-hidden": "true" })) ]) ], 2), (C.value = Z) ? (a(), f(J, { key: 0 }, [], 64)) : I("", !0) ]), _: 3 }, 8, ["id", "class"]), U.value ? (a(), f("button", { key: 0, class: x(Oe.value), disabled: e.disabled, onClick: X[0] || (X[0] = (Z) => W()) }, [ z(u(Ge), { class: "w-3 h-3" }) ], 10, Hu)) : I("", !0), u(d) ? (a(), A(Vt, { key: 1, "leave-active-class": "transition ease-in duration-100", "leave-from-class": "opacity-100", "leave-to-class": "opacity-0" }, { default: E(() => [ (a(), A(zt, { to: "body", disabled: !e.mountMenuOnBody }, [ z(u(Hn), { ref_key: "menuEl", ref: m, class: x(fe.value), style: ae(ve.value), onFocus: X[3] || (X[3] = (Z) => { var Me; return (Me = p.value) == null ? void 0 : Me.focus(); }) }, { default: E(() => [ ie.value ? (a(), f("label", Uu, [ X[5] || (X[5] = v("span", { class: "sr-only label text-foreground" }, "Search", -1)), v("div", Wu, [ v("div", Nu, [ z(u(ks), { class: "h-4 w-4 text-foreground-2" }) ]), Q(v("input", { ref_key: "searchInput", ref: p, "onUpdate:modelValue": X[1] || (X[1] = (Z) => o.value = Z), type: "text", class: "py-1 pl-7 w-full bg-foundation placeholder:font-normal normal placeholder:text-foreground-2 text-[13px] focus-visible:[box-shadow:none] rounded-md hover:border-outline-5 focus-visible:border-outline-4", placeholder: e.searchPlaceholder, onKeydown: X[2] || (X[2] = ge(() => { }, ["stop"])) }, null, 40, qu), [ [Ke, o.value] ]) ]) ])) : I("", !0), v("div", { class: x(["overflow-auto simple-scrollbar", n.menuMaxHeightClasses || "max-h-[50vh] xl:max-h-80"]) }, [ ue.value && y.value ? (a(), f("div", Ku, [ z(Ct, { loading: !0 }) ])) : ue.value && !g.value.length ? (a(), f("div", Gu, [ v("div", Xu, [ H(T.$slots, "nothing-found", {}, () => [ X[6] || (X[6] = F("Nothing found", -1)) ]) ]) ])) : I("", !0), !ue.value || !y.value ? (a(!0), f(J, { key: 2 }, te(q.value, (Z) => { var Me; return a(), A(u(Un), { key: we(Z), value: Z, disabled: ((Me = e.disabledItemPredicate) == null ? void 0 : Me.call(e, Z)) || !1 }, { default: E(({ active: O, selected: G }) => { var K, be, Ie, je; return [ Q((a(), f("li", { class: x( It({ active: O, disabled: ((K = e.disabledItemPredicate) == null ? void 0 : K.call(e, Z)) || !1 }) ) }, [ v("span", { class: x(["block px-2 py-1.5 rounded-md", [ G ? "bg-highlight-3" : "", e.hideCheckmarks ? "pr-2" : "pr-8", !((be = e.disabledItemPredicate) != null && be.call(e, Z)) && !G ? "hover:bg-highlight-1" : "" ]]) }, [ H(T.$slots, "option", { class: "truncate", item: Z, active: O, selected: G, disabled: ((Ie = e.disabledItemPredicate) == null ? void 0 : Ie.call(e, Z)) || !1 }, () => [ F(P(de(Z)), 1) ]), !e.hideCheckmarks && G ? (a(), f("span", Zu, [ z(u(Et), { class: "h-4 w-4", "aria-hidden": "true" }) ])) : I("", !0) ], 2) ], 2)), [ [ u(Ae), (je = e.disabledItemPredicate) != null && je.call(e, Z) ? e.disabledItemTooltip : void 0 ] ]) ]; }), _: 2 }, 1032, ["value", "disabled"]); }), 128)) : I("", !0) ], 2) ]), _: 3 }, 8, ["class", "style"]) ], 8, ["disabled"])) ]), _: 3 })) : I("", !0) ], 2) ])), [ [u(Ae), e.tooltipText] ]) ]), _: 3 }, 8, ["modelValue", "name", "multiple", "by", "disabled", "class"])), M.value && !V.value ? (a(), f("p", { key: 0, id: M.value, class: x(["mt-2 text-xs", B.value]) }, P($.value), 11, Ju)) : I("", !0) ])); } }), Qu = /* @__PURE__ */ D({ __name: "SourceAppBadge", props: { sourceApp: {} }, setup(e) { return (t, s) => (a(), A(nt, { "color-classes": "text-foreground-on-primary", rounded: "", style: ae({ backgroundColor: t.sourceApp.bgColor }) }, { default: E(() => [ F(P(t.sourceApp.short), 1) ]), _: 1 }, 8, ["style"])); } }), Yu = { key: 0, class: "text-foreground-2 normal" }, ed = { key: 1, class: "flex items-center" }, td = { class: "truncate" }, sd = { class: "flex items-center" }, nd = { class: "truncate" }, hp = /* @__PURE__ */ D({ __name: "SourceApps", props: { /** * Whether to allow selecting multiple source apps */ multiple: { type: Boolean, default: !1 }, modelValue: { type: [Object, Array], default: void 0 }, /** * Whether to allow filtering source apps through a search box */ search: { type: Boolean, default: !1 }, /** * Search placeholder text */ searchPlaceholder: { type: String, default: "Search apps" }, selectorPlaceholder: { type: String, default: void 0 }, /** * Label is required at the very least for screen-readers */ label: { type: String, required: !0 }, /** * Whether to show the label visually */ showLabel: { type: Boolean, default: !1 }, name: { type: String, default: void 0 }, /** * Control source apps to show. If left undefined, will show all available options. */ items: { type: Array, default: void 0 }, clearable: { type: Boolean }, help: { type: String }, labelId: { type: String }, buttonId: { type: String } }, emits: ["update:modelValue"], setup(e, { emit: t }) { const s = t, l = e, r = j(null), n = j(null), { selectedValue: i, hiddenSelectedItemCount: c, isMultiItemArrayValue: d, firstItem: p } = Us({ props: Be(l), emit: s, dynamicVisibility: { elementToWatchForChanges: r, itemContainer: n } }), m = (b, o) => b.name.toLocaleLowerCase().includes(o.toLocaleLowerCase()); return (b, o) => (a(), A(Ns, { modelValue: u(i), "onUpdate:modelValue": o[0] || (o[0] = (g) => vt(i) ? i.value = g : null), multiple: e.multiple, items: e.items ?? u(hn), search: e.search, "search-placeholder": e.searchPlaceholder, label: e.label, "show-label": e.showLabel, name: e.name || "sourceApps", "filter-predicate": m, clearable: e.clearable, help: e.help, "label-id": e.labelId, "button-id": e.buttonId, by: "name" }, { "nothing-selected": E(() => [ e.selectorPlaceholder ? (a(), f(J, { key: 0 }, [ F(P(e.selectorPlaceholder), 1) ], 64)) : (a(), f(J, { key: 1 }, [ F(P(e.multiple ? "Select apps" : "Select an app"), 1) ], 64)) ]), "something-selected": E(({ value: g }) => [ u(d)(g) ? (a(), f("div", { key: 0, ref_key: "elementToWatchForChanges", ref: r, class: "flex items-center space-x-0.5 h-5" }, [ v("div", { ref_key: "itemContainer", ref: n, class: "flex flex-wrap overflow-hidden space-x-0.5 h-5" }, [ (a(!0), f(J, null, te(g, (y) => (a(), A(Qu, { key: y.name, "source-app": y }, null, 8, ["source-app"]))), 128)) ], 512), u(c) > 0 ? (a(), f("div", Yu, " +" + P(u(c)), 1)) : I("", !0) ], 512)) : (a(), f("div", ed, [ v("div", { class: "h-2 w-2 rounded-full mr-2", style: ae({ backgroundColor: u(p)(g).bgColor }) }, null, 4), v("span", td, P(u(p)(g).name), 1) ])) ]), option: E(({ item: g }) => [ v("div", sd, [ v("div", { class: "h-2 w-2 rounded-full mr-2", style: ae({ backgroundColor: g.bgColor }) }, null, 4), v("span", nd, P(g.name), 1) ]) ]), _: 1 }, 8, ["modelValue", "multiple", "items", "search", "search-placeholder", "label", "show-label", "name", "clearable", "help", "label-id", "button-id"])); } }), ld = { class: "flex flex-wrap gap-1.5" }, vp = /* @__PURE__ */ D({ __name: "Badges", props: { items: {}, label: {}, name: {}, help: {}, modelValue: {}, multiple: { type: Boolean }, rules: {}, by: {}, labelId: {}, buttonId: {} }, emits: ["update:modelValue"], setup(e, { emit: t }) { const s = t, l = e, { selectedValue: r, isArrayValue: n } = Us({ props: Be(l), emit: s }), i = (c) => { n(r.value) ? r.value = r.value.filter((d) => d.id !== c.id) : r.value = void 0; }; return (c, d) => (a(), A(Ns, { modelValue: u(r), "onUpdate:modelValue": d[0] || (d[0] = (p) => vt(r) ? r.value = p : null), multiple: c.multiple, items: c.items, label: c.label, name: c.name, help: c.help, rules: c.rules, by: c.by, "label-id": c.labelId, "button-id": c.buttonId }, { "something-selected": E(({ value: p }) => [ v("ul", ld, [ (a(!0), f(J, null, te(u(n)(p) ? p : [p], (m) => (a(), f("li", { key: m[c.by] }, [ z(nt, { size: "lg", "color-classes": "border border-outline-2 bg-foundation-page", "dot-icon-color-classes": "text-foreground", rounded: "", "clickable-icon": !0, "icon-left": u(nl), onClickIcon: ge((b) => i(m), ["stop"]) }, { default: E(() => [ F(P(m.text), 1) ]), _: 2 }, 1032, ["icon-left", "onClickIcon"]) ]))), 128)) ]) ]), option: E(({ item: p }) => [ F(P(p.text), 1) ]), _: 1 }, 8, ["modelValue", "multiple", "items", "label", "name", "help", "rules", "by", "label-id", "button-id"])); } }), od = ["id", "for"], ad = { key: 0, class: "text-danger text-xs opacity-80" }, rd = { key: 1, class: "text-body-2xs font-normal" }, id = ["id"], ud = ["id", "aria-expanded"], dd = { class: "flex items-center justify-between w-full" }, cd = { class: "pointer-events-none shrink-0 ml-1 flex items-center space-x-2" }, fd = { key: 1, class: "text-4xl text-danger opacity-50 h-4 w-4 leading-6" }, pd = ["disabled"], md = ["aria-labelledby"], hd = { key: 0, class: "flex flex-col mx-1 mb-1" }, vd = { class: "relative" }, bd = { class: "pointer-events-none absolute top-0 bottom-0 left-0 flex items-center pl-2" }, gd = ["placeholder"], yd = { key: 0, class: "px-1" }, xd = { key: 1 }, wd = { class: "text-foreground-2 text-center" }, kd = ["aria-selected", "disabled", "onClick"], Cd = ["id"], bp = /* @__PURE__ */ D({ __name: "Multi", props: { size: { type: String, default: void 0 }, items: { type: Array, default: () => [] }, modelValue: { type: [Array, Object, String, Number], default: void 0 }, /** * Whether to enable the search bar. You must also set one of the following: * * filterPredicate - to allow filtering passed in `items` based on search bar * * getSearchResults - to allow asynchronously loading items from server (props.items no longer required in this case, * but can be used to prefill initial values) */ search: { type: Boolean, default: !1 }, /** * If search=true and this is set, you can use this to filter passed in items based on whatever * the user enters in the search bar */ filterPredicate: { type: Function, default: void 0 }, /** * Set this to disable certain items in the list */ disabledItemPredicate: { type: Function, default: void 0 }, /** * If search=true and this is set, you can use this to load data asynchronously depending * on the search query */ getSearchResults: { type: Function, default: void 0 }, searchPlaceholder: { type: String, default: "Search" }, /** * Label is required at the very least for screen-readers */ label: { type: String, required: !0 }, /** * Optional text that replaces the label as the placeholder when set. */ placeholder: { type: String }, /** * Whether to show the label visually */ showLabel: { type: Boolean, default: !1 }, name: { type: String, required: !0 }, /** * Objects will be compared by the values in the specified prop */ by: { type: String, required: !1 }, disabled: { type: Boolean, default: !1 }, buttonStyle: { type: String, default: "base" }, hideCheckmarks: { type: Boolean, default: !1 }, allowUnset: { type: Boolean, default: !0 }, clearable: { type: Boolean, default: !1 }, /** * Validation stuff */ rules: { type: [String, Object, Function, Array], default: void 0 }, /** * vee-validate validation() on component mount */ validateOnMount: { type: Boolean, default: !1 }, /** * Whether to trigger validation whenever the value changes */ validateOnValueUpdate: { type: Boolean, default: !1 }, /** * Will replace the generic "Value" text with the name of the input in error messages */ useLabelInErrors: { type: Boolean, default: !0 }, /** * Optional help text */ help: { type: String, default: void 0 }, /** * @deprecated Use size attribute instead */ fixedHeight: { type: Boolean, default: !1 }, /** * By default component holds its own internal value state so that even if you don't have it tied up to a real `modelValue` ref somewhere * it knows its internal state and can report it on form submits. * * If you set this to true, its only going to rely on `modelValue` as its primary source of truth so that you can reject updates etc. */ fullyControlValue: { type: Boolean, default: !1 }, /** * Whether to show the red "required" asterisk */ showRequired: { type: Boolean, default: !1 }, /** * Whether to show the optional text */ showOptional: { type: Boolean, default: !1 }, /** * Whether to mount the menu on the body instead of inside the component. Useful when select box is mounted within * dialog windows and the menu causes unnecessary overflow. */ mountMenuOnBody: { type: Boolean, default: !1 }, labelId: { type: String, default: void 0 }, buttonId: { type: String, default: void 0 }, /** * Tooltip shown on disabled items */ disabledItemTooltip: { required: !1, type: String }, labelPosition: { type: String, default: "top" }, tooltipText: { type: String, default: void 0 } }, emits: ["update:modelValue"], setup(e, { expose: t, emit: s }) { const l = (O) => ye(O), r = s, n = e, { value: i, errorMessage: c } = De(n.name, n.rules, { validateOnMount: n.validateOnMount, validateOnValueUpdate: n.validateOnValueUpdate, initialValue: se(n.modelValue) ? n.modelValue : [] }), d = Dt(), p = j(null), m = j(null), b = j(null), o = j(""), g = j([]), y = j(!1), S = j(1), w = j(dt()), C = j(!1), L = _t(b, { windowResize: !0, windowScroll: !0, immediate: !0 }); Cs( h(() => m.value), ([{ isIntersecting: O }]) => { O && n.mountMenuOnBody && L.update(); } ); const N = h(() => u(n.label) || u(n.name)), Y = h(() => { const O = c.value; return !O || !u(n.useLabelInErrors) ? O : O.replace("Value", N.value); }), R = h(() => Y.value || u(n.help)), $ = h(() => !!R.value), k = h( () => $.value ? `${u(n.name)}-${w.value}` : void 0 ), M = h( () => c.value ? "text-danger" : "text-foreground-2" ), B = h(() => n.labelPosition === "left"), V = h( () => n.buttonStyle !== "simple" && n.clearable && !n.disabled ), U = h(() => { if (!n.size) return ""; switch (n.size) { case "sm": return "h-6 text-body-sm"; case "lg": return "h-10 text-[13px]"; case "xl": return "h-14 text-sm"; case "base": default: return "h-8 text-body-sm"; } }), xe = h(() => { var G; const O = ["relative flex group"]; return c.value ? (O.push("hover:shadow rounded-md"), O.push("text-danger-darker focus:border-danger"), n.buttonStyle !== "simple" && O.push("border border-danger")) : n.buttonStyle !== "simple" && (O.push("rounded-md border"), C.value ? O.push("border-outline-4") : O.push("border-outline-2 hover:border-outline-5 focus:outline-0")), n.fixedHeight ? O.push("h-8") : (G = U.value) != null && G.length && O.push(U.value), B.value && O.push("md:basis-1/2"), O.join(" "); }), he = h(() => { const O = []; return n.buttonStyle !== "simple" && O.push( ue.value ? "bg-foundation-disabled text-foreground-disabled" : "" ), ue.value && O.push("cursor-not-allowed"), O.join(" "); }), $e = h(() => { const O = [ "relative z-[1]", "flex items-center justify-center text-center shrink-0", "rounded-r-md overflow-hidden transition-all", "text-foreground", le.value ? `w-6 ${he.value}` : "w-0" ]; return ue.value || (O.push( "hover:bg-primary hover:text-foreground-on-primary dark:text-foreground-on-primary" ), n.buttonStyle === "tinted" ? O.push("bg-outline-3") : O.push("bg-primary-muted")), O.join(" "); }), Oe = h(() => { const O = [ "relative z-[2]", "normal rounded-md cursor-pointer transition truncate flex-1", "flex items-center focus:outline-outline-4 focus:outline-1", he.value ]; return n.buttonStyle !== "simple" && (O.push("p-2"), ue.value || (n.buttonStyle, O.push("bg-foundation text-foreground"))), V.value && le.value && O.push("rounded-r-none"), O.join(" "); }), Ee = h( () => !!(n.search && (n.filterPredicate || n.getSearchResults)) ), ie = h(() => Ee.value && n.getSearchResults), ue = h( () => n.disabled || !n.items.length && !ie.value ), ne = h({ get: () => { const O = i.value; return se(O) ? O : []; }, set: (O) => { if (!se(O)) { console.warn("Attempting to set non-array value in selector"); return; } n.fullyControlValue ? r("update:modelValue", O) : i.value = O, S.value += 1; } }), le = h(() => se(ne.value) ? ne.value.length !== 0 : !!ne.value), _ = () => { ne.value = []; }, W = h(() => { const O = o.value; return !Ee.value || !(O != null && O.length) ? g.value : n.filterPredicate ? g.value.filter( (G) => { var K; return ((K = n.filterPredicate) == null ? void 0 : K.call(n, G, O)) || !1; } ) : g.value; }), q = h(() => { const O = [ "rounded-md bg-foundation py-1 label label--light border border-outline-3 shadow-md mt-1 " ]; return n.mountMenuOnBody ? O.push("fixed z-50") : O.push("absolute top-[100%] w-full z-40"), O.join(" "); }), fe = h(() => { const O = {}; if (n.mountMenuOnBody) { const G = L.top.value, K = L.left.value, be = L.width.value, Ie = L.height.value; O.top = `${G + Ie}px`, O.left = `${K}px`, O.width = `${be}px`; } return O; }), ve = (O) => JSON.stringify(O), de = (O) => l(O) ? O[n.by || "id"] : O, we = async () => { if (!(!ie.value || !n.getSearchResults)) { y.value = !0; try { g.value = await n.getSearchResults(o.value); } finally { y.value = !1; } } }, Re = st(we, 1e3), $t = (O) => { const { disabled: G } = O, K = ["relative transition select-none px-2"]; return G ? K.push("opacity-50 cursor-not-allowed") : K.push("text-foreground cursor-pointer"), K.join(" "); }; re( () => n.items, (O) => { g.value = O.slice(); }, { immediate: !0 } ), re(o, () => { ie.value && Re(); }), ce(() => { ie.value && !n.items.length && we(); }); const It = () => { ue.value || (C.value = !C.value); }, T = (O) => ne.value.some((G) => de(G) === de(O)), X = j(null), Z = j(0), Me = (O, G) => { var Ie, je; if ((Ie = n.disabledItemPredicate) != null && Ie.call(n, O)) return; G == null || G.stopPropagation(), Z.value = ((je = X.value) == null ? void 0 : je.scrollTop) || 0; const K = ne.value, be = K.some((He) => de(He) === de(O)); ne.value = be ? K.filter((He) => de(He) !== de(O)) : [...K, O], en(() => { X.value && (X.value.scrollTop = Z.value); }); }; return jn( m, () => { C.value && (C.value = !1); }, { ignore: [b] } ), t({ triggerSearch: we }), (O, G) => (a(), f("div", null, [ (a(), f("div", { key: S.value, class: x({ "md:flex md:items-center md:space-x-2 md:justify-between": B.value }) }, [ v("div", { class: x(["flex flex-col", { "pb-1": e.showLabel && !B.value }]) }, [ v("label", { id: e.labelId, class: x(["flex text-body-xs text-foreground font-medium pointer-events-none", [{ "sr-only": !e.showLabel }, { "items-center gap-1": e.showOptional }]]), for: e.buttonId }, [ F(P(e.label) + " ", 1), e.showRequired ? (a(), f("div", ad, "*")) : e.showOptional ? (a(), f("div", rd, " (optional) ")) : I("", !0) ], 10, od), k.value && B.value ? (a(), f("p", { key: 0, id: k.value, class: x(["text-xs", M.value]) }, P(R.value), 11, id)) : I("", !0) ], 2), Q((a(), f("div", null, [ v("div", { class: x(xe.value) }, [ v("button", { id: e.buttonId, ref_key: "listboxButton", ref: b, type: "button", class: x(Oe.value), "aria-expanded": C.value, "aria-haspopup": !0, onClick: It }, [ v("div", dd, [ v("div", { class: x(["block truncate grow text-left text-xs sm:text-[13px]", [le.value ? "text-foreground" : "text-foreground-2"]]) }, [ !ne.value || u(se)(ne.value) && !ne.value.length ? H(O.$slots, "nothing-selected", { key: 0 }, () => [ F(P(e.placeholder ? e.placeholder : e.label), 1) ]) : H(O.$slots, "something-selected", { key: 1, value: ne.value }, () => [ F(P(ve(ne.value)), 1) ]) ], 2), v("div", cd, [ Y.value ? (a(), A(u(Rt), { key: 0, class: "h-4 w-4 text-danger", "aria-hidden": "true" })) : !e.showLabel && e.showRequired ? (a(), f("div", fd, " * ")) : I("", !0), C.value ? (a(), A(u(xs), { key: 2, class: "h-4 w-4 text-foreground", "aria-hidden": "true" })) : (a(), A(u(ws), { key: 3, class: "h-4 w-4 text-foreground", "aria-hidden": "true" })) ]) ]) ], 10, ud), V.value ? (a(), f("button", { key: 0, class: x($e.value), disabled: e.disabled, onClick: G[0] || (G[0] = (K) => _()) }, [ z(u(Ge), { class: "w-3 h-3" }) ], 10, pd)) : I("", !0), u(d) ? (a(), A(Vt, { key: 1, "leave-active-class": "transition ease-in duration-100", "leave-from-class": "opacity-100", "leave-to-class": "opacity-0" }, { default: E(() => [ (a(), A(zt, { to: "body", disabled: !e.mountMenuOnBody }, [ C.value ? (a(), f("div", { key: 0, ref_key: "menuEl", ref: m, class: x(q.value), style: ae(fe.value), role: "listbox", "aria-labelledby": e.labelId, onFocus: G[4] || (G[4] = (K) => { var be; return (be = p.value) == null ? void 0 : be.focus(); }) }, [ Ee.value ? (a(), f("label", hd, [ G[5] || (G[5] = v("span", { class: "sr-only label text-foreground" }, "Search", -1)), v("div", vd, [ v("div", bd, [ z(u(ks), { class: "h-4 w-4 text-foreground-2" }) ]), Q(v("input", { ref_key: "searchInput", ref: p, "onUpdate:modelValue": G[1] || (G[1] = (K) => o.value = K), type: "text", class: "py-1 pl-7 w-full bg-foundation placeholder:font-normal normal placeholder:text-foreground-2 text-[13px] focus-visible:[box-shadow:none] rounded-md hover:border-outline-5 focus-visible:border-outline-4", placeholder: e.searchPlaceholder, onKeydown: G[2] || (G[2] = ge(() => { }, ["stop"])) }, null, 40, gd), [ [Ke, o.value] ]) ]) ])) : I("", !0), v("div", { ref_key: "optionsContainer", ref: X, class: "overflow-auto simple-scrollbar max-h-60 xl:max-h-80 gap-1 flex flex-col" }, [ ie.value && y.value ? (a(), f("div", yd, [ z(Ct, { loading: !0 }) ])) : ie.value && !g.value.length ? (a(), f("div", xd, [ v("div", wd, [ H(O.$slots, "nothing-found", {}, () => [ G[6] || (G[6] = F("Nothing found", -1)) ]) ]) ])) : I("", !0), !ie.value || !y.value ? (a(!0), f(J, { key: 2 }, te(W.value, (K) => { var be, Ie, je, He, Jt, Qt; return Q((a(), f("button", { key: de(K), type: "button", role: "option", "aria-selected": T(K), disabled: ((be = e.disabledItemPredicate) == null ? void 0 : be.call(e, K)) || !1, class: x( $t({ disabled: ((Ie = e.disabledItemPredicate) == null ? void 0 : Ie.call(e, K)) || !1 }) ), onClick: (Zs) => Me(K, Zs) }, [ v("div", { class: x(["block w-full px-2 py-1.5 rounded-md text-left flex items-center gap-1", [ e.hideCheckmarks ? "pr-2" : "pr-8", !((je = e.disabledItemPredicate) != null && je.call(e, K)) && !T(K) ? "hover:bg-highlight-1" : "" ]]) }, [ z(_i, { name: `select-${de(K)}`, checked: T(K), disabled: (He = e.disabledItemPredicate) == null ? void 0 : He.call(e, K), "hide-label": !0, onChange: G[3] || (G[3] = ge(() => { }, ["stop"])) }, null, 8, ["name", "checked", "disabled"]), H(O.$slots, "option", { class: "truncate", item: K, selected: T(K), disabled: ((Jt = e.disabledItemPredicate) == null ? void 0 : Jt.call(e, K)) || !1 }, () => [ F(P(ve(K)), 1) ]) ], 2) ], 10, kd)), [ [ u(Ae), (Qt = e.disabledItemPredicate) != null && Qt.call(e, K) ? e.disabledItemTooltip : void 0 ] ]); }), 128)) : I("", !0) ], 512) ], 46, md)) : I("", !0) ], 8, ["disabled"])) ]), _: 3 })) : I("", !0) ], 2) ])), [ [u(Ae), e.tooltipText] ]) ], 2)), k.value && !B.value ? (a(), f("p", { key: 0, id: k.value, class: x(["mt-2 text-xs", M.value]) }, P(R.value), 11, Cd)) : I("", !0) ])); } }), $d = { class: "flex items-center space-x-2" }, Id = ["for"], gp = /* @__PURE__ */ D({ __name: "Switch", props: /* @__PURE__ */ Ce({ showLabel: { type: Boolean, default: !0 }, name: {}, label: {}, disabled: { type: Boolean }, id: {} }, { modelValue: { type: Boolean }, modelModifiers: {} }), emits: ["update:modelValue"], setup(e) { const t = e, s = ke(e, "modelValue"), l = h(() => t.label || t.name), r = h(() => { const c = ["block label-light"]; return t.showLabel || c.push("sr-only"), c.join(" "); }), n = h(() => { const c = [ "relative inline-flex flex-shrink-0 h-[18px] w-[30px] rounded-full", "transition-colors ease-in-out duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-primary", "cursor-pointer disabled:cursor-not-allowed disabled:opacity-40" ]; return s.value ? c.push("bg-primary") : c.push("bg-foreground-3"), c.join(" "); }), i = h(() => { const c = [ "pointer-events-none inline-block h-3 w-3 rounded-full mt-[3px] ml-[3px]", "ring-0 transition ease-in-out duration-200 bg-foreground-on-primary" ]; return s.value ? c.push("translate-x-[12px]") : c.push("translate-x-0"), c.join(" "); }); return (c, d) => (a(), f("div", $d, [ z(u(Wn), { id: c.id || c.name, modelValue: s.value, "onUpdate:modelValue": d[0] || (d[0] = (p) => s.value = p), class: x(n.value), name: c.name, disabled: c.disabled }, { default: E(() => [ v("span", { class: x(i.value) }, null, 2) ]), _: 1 }, 8, ["id", "modelValue", "class", "name", "disabled"]), v("label", { for: c.id || c.name, class: x(r.value) }, [ v("span", null, P(l.value), 1) ], 10, Id) ])); } }), Bd = { class: "relative group bg-foundation border border-outline-2 p-2 rounded-lg pr-20" }, Sd = { class: "absolute top-3 right-2 flex justify-end items-center" }, yp = /* @__PURE__ */ D({ __name: "ClipboardInput", props: { value: {}, isMultiline: { type: Boolean, default: !1 }, isIconButton: { type: Boolean }, rows: {}, ctaColor: { default: "outline" }, ctaText: { default: "Copy" } }, emits: ["copy"], setup(e, { emit: t }) { const s = e, l = t, { copy: r } = An({ legacy: !0 }), n = j(!1), i = async () => { s.value && (await r(s.value), n.value = !0, l("copy", s.value), setTimeout(() => { n.value = !1; }, 2e3)); }, c = (d) => { const p = d.target, m = window.getSelection(); if (m) { const b = document.createRange(); b.selectNodeContents(p), m.removeAllRanges(), m.addRange(b); } }; return (d, p) => (a(), f("div", Bd, [ d.isMultiline ? (a(), f("div", { key: 0, class: "relative z-10 text-body-2xs select-all text-foreground font-mono break-all p-2 pl-3 max-h-[4.8rem] simple-scrollbar overflow-y-auto", onKeypress: p[0] || (p[0] = (m) => u(Fs)(c)) }, P(d.value), 33)) : (a(), A(u(Gt), { key: 1, color: "transparent", name: "contentInput", readonly: "", "model-value": d.value, class: "relative z-10 !text-body-2xs sm:!text-body-xs text-foreground font-mono select-all truncate" }, null, 8, ["model-value"])), v("div", Sd, [ z(u(pe), { color: d.ctaColor, size: "sm", "icon-left": d.isIconButton ? n.value ? u(gn) : u(yn) : void 0, "hide-text": d.isIconButton, onClick: i }, { default: E(() => [ F(P(n.value ? "Copied" : d.ctaText), 1) ]), _: 1 }, 8, ["color", "icon-left", "hide-text"]) ]) ])); } }), Pd = { class: "flex flex-col items-center" }, Td = { class: "flex gap-2" }, xp = /* @__PURE__ */ D({ __name: "CodeInput", props: { modelValue: {}, digitCount: { default: 6 }, disabled: { type: Boolean }, error: { type: Boolean }, clearErrorOnEdit: { type: Boolean, default: !0 } }, emits: ["update:modelValue", "complete"], setup(e, { emit: t }) { const s = e, l = t, r = j([]), n = j(new Array(s.digitCount).fill("")), i = j(s.error), c = (m) => { var b; s.clearErrorOnEdit && (i.value = !1), n.value[m] = n.value[m].replace(/[^0-9]/g, ""), n.value[m] && m < s.digitCount - 1 && ((b = r.value[m + 1]) == null || b.focus()); }, d = (m, b) => { var o, g, y; b.key === "Backspace" && !n.value[m] && m > 0 ? (s.clearErrorOnEdit && (i.value = !1), n.value[m - 1] = "", (o = r.value[m - 1]) == null || o.focus()) : b.key === "ArrowLeft" && m > 0 ? (g = r.value[m - 1]) == null || g.focus() : b.key === "ArrowRight" && m < s.digitCount - 1 && ((y = r.value[m + 1]) == null || y.focus()); }, p = (m) => { var y, S, w; s.clearErrorOnEdit && (i.value = !1), m.preventDefault(); const b = (y = m.clipboardData) == null ? void 0 : y.getData("text"); if (!b) return; const o = b.replace(/[^0-9]/g, "").split(""); n.value = [ ...o.slice(0, s.digitCount), ...Array(Math.max(0, s.digitCount - o.length)).fill("") ]; const g = n.value.findIndex((C) => !C); g !== -1 ? (S = r.value[g]) == null || S.focus() : (w = r.value[s.digitCount - 1]) == null || w.focus(); }; return ce(() => { r.value[0] && r.value[0].focus(); }), re( () => s.error, (m) => { i.value = m; } ), re( () => s.modelValue, (m) => { if (m) { const b = m.split(""); n.value = [ ...b, ...Array(s.digitCount - b.length).fill("") ]; } else n.value = Array(s.digitCount).fill(""); }, { immediate: !0 } ), re( n, (m) => { const b = m.join(""); l("update:modelValue", b), b.length === s.digitCount && l("complete", b); }, { deep: !0 } ), (m, b) => (a(), f("div", Pd, [ v("div", Td, [ (a(!0), f(J, null, te(m.digitCount, (o, g) => (a(), f("div", { key: g, class: "w-10" }, [ z(u(Gt), { ref_for: !0, ref_key: "inputRefs", ref: r, modelValue: n.value[g], "onUpdate:modelValue": (y) => n.value[g] = y, class: "text-center !text-[14px] py-6 !px-2 font-semibold", color: "foundation", name: `code-${g}`, type: "text", inputmode: "numeric", disabled: m.disabled, error: i.value, "custom-error-message": i.value ? " " : void 0, maxlength: "1", size: "lg", onInput: (y) => c(g), onKeydown: (y) => d(g, y), onPaste: p }, null, 8, ["modelValue", "onUpdate:modelValue", "name", "disabled", "error", "custom-error-message", "onInput", "onKeydown"]) ]))), 128)) ]) ])); } }); var rt = /* @__PURE__ */ ((e) => (e.CtrlOrCmd = "cmd-or-ctrl", e.AltOrOpt = "alt-or-opt", e.Shift = "shift", e))(rt || {}); const At = vn(), Od = { "cmd-or-ctrl": At === Mt.Mac ? "⌘" : "⌃", "alt-or-opt": At === Mt.Mac ? "⌥" : "Alt", shift: "⇧" }; function wp(e) { const t = (s) => Object.values(rt).includes(s); return e.map((s) => t(s) ? Od[s] : s).join(""); } function kp(e, t, s) { const l = Ln(), n = `${e.map((i) => { switch (i) { case rt.CtrlOrCmd: return At === Mt.Mac ? "Meta" : "Control"; case rt.AltOrOpt: return "Alt"; case rt.Shift: return "Shift"; default: return ""; } }).join("+")}+${t}`; Vn(l[n], s); } function Cp(e) { const t = (e == null ? void 0 : e.model) || j(), s = h({ get: () => !!t.value, set: (l) => t.value = l ? !0 : void 0 }); return { model: t, isChecked: s }; } const Md = { class: "fixed top-0 left-0 z-10 h-screen !h-[100dvh] w-screen" }, jd = { class: "flex items-center justify-start rounded-t-lg shrink-0 min-h-[2rem] sm:min-h-[3rem] px-6 py-4 truncate text-heading-sm" }, Ad = { class: "flex items-center pr-12" }, Ld = { class: "w-full truncate" }, $p = /* @__PURE__ */ D({ __name: "Dialog", props: { open: { type: Boolean }, maxWidth: {}, fullscreen: { default: "mobile" }, hideCloser: { type: Boolean }, showBackButton: { type: Boolean }, preventCloseOnClickOutside: { type: Boolean }, title: {}, buttons: {}, buttonsWrapperClasses: {}, onSubmit: {}, isTransparent: { type: Boolean }, closerClasses: {}, hideTitle: { type: Boolean }, hideButtons: { type: Boolean } }, emits: ["update:open", "fully-closed", "back"], setup(e, { emit: t }) { const s = t, l = e, r = bt(), n = j(!1), i = j(Math.random()), c = j(!1), d = j(!0), p = j(null); Ft( p, mt(() => { $({ target: p.value }); }, 60) ); const m = h(() => !!l.onSubmit), b = h( () => (l.buttons || r.buttons) && !l.hideButtons ), o = h(() => !l.hideTitle && (!!l.title || !!r.header)), g = h({ get: () => l.open, set: (k) => s("update:open", k) }), y = h(() => { switch (l.maxWidth) { case "xs": return 0; case "sm": return 1; case "md": return 2; case "lg": return 3; case "xl": return 4; default: return 1e4; } }), S = h(() => { const k = ["w-full", "sm:w-full"]; return w.value || (y.value === 0 && k.push("md:max-w-sm"), y.value >= 1 && k.push("md:max-w-lg"), y.value >= 2 && k.push("md:max-w-2xl"), y.value >= 3 && k.push("lg:max-w-3xl"), y.value >= 4 ? k.push("xl:max-w-6xl") : k.push("md:max-w-2xl")), k.join(" "); }), w = h( () => l.fullscreen === "desktop" || l.fullscreen === "all" ), C = h(() => { const k = [ "transform md:rounded-xl text-foreground overflow-hidden transition-all text-left flex flex-col md:h-auto" ]; return l.isTransparent || k.push("bg-foundation-page shadow-xl border border-outline-2"), w.value ? k.push("md:h-full") : k.push("md:max-h-[90vh]"), (l.fullscreen === "mobile" || l.fullscreen === "all") && k.push("max-md:h-[98vh] max-md:!h-[98dvh]"), l.fullscreen === "none" || l.fullscreen === "desktop" ? k.push("rounded-lg max-h-[90vh]") : k.push("rounded-t-lg"), k.push(S.value), k.join(" "); }), L = h(() => { const k = ["flex-1 simple-scrollbar overflow-y-auto text-body-xs"]; return l.isTransparent || (o.value ? (k.push("px-6 py-4"), w.value && k.push("md:p-0")) : w.value || k.push("px-6 py-4")), k.join(" "); }), N = () => { l.preventCloseOnClickOutside || (g.value = !1); }, Y = () => { s("fully-closed"), n.value = !1; }, R = (k) => { var M; (M = l.onSubmit) == null || M.call(l, k); }, $ = mt((k) => { if (!k.target) return; const M = k.target, { scrollTop: B, offsetHeight: V, scrollHeight: U } = M; c.value = B > 0, d.value = B + V >= U; }, 60); return re( g, (k, M) => { if (Ve) { const B = document.documentElement; k ? B.classList.add("dialog-open") : B.classList.remove("dialog-open"); } !k && M && (n.value = !0); }, { flush: "sync" } ), tn(() => { document.documentElement.classList.remove("dialog-open"); }), (k, M) => (a(), A(u(Is), { as: "template", show: g.value }, { default: E(() => [ z(u(Nn), { as: "div", class: "relative z-50", open: "", onClose: N }, { default: E(() => [ z(u(es), { as: "template", enter: "ease-out duration-300", "enter-from": "opacity-0", "enter-to": "opacity-100", leave: "ease-in duration-400", "leave-from": "opacity-100", "leave-to": "opacity-0" }, { default: E(() => [...M[4] || (M[4] = [ v("div", { class: "fixed top-0 left-0 w-full h-full backdrop-blur-xs bg-black/60 dark:bg-neutral-900/60 transition-opacity" }, null, -1) ])]), _: 1 }), v("div", Md, [ v("div", { class: x(["flex md:justify-center h-full w-full md:p-6", [ k.fullscreen === "none" || k.fullscreen === "desktop" ? "p-4 items-center" : "items-end md:items-center" ]]) }, [ z(u(es), { as: "template", enter: "ease-out duration-5000", "enter-from": `md:opacity-0 ${k.fullscreen === "mobile" || k.fullscreen === "all" ? "translate-y-[100%]" : "translate-y-4"} md:translate-y-4`, "enter-to": "md:opacity-100 translate-y-0", leave: "ease-in duration-5000", "leave-from": "md:opacity-100 translate-y-0", "leave-to": `md:opacity-0 ${k.fullscreen === "mobile" || k.fullscreen === "all" ? "translate-y-[100%]" : "translate-y-4"} md:translate-y-4`, onAfterLeave: Y }, { default: E(() => [ z(u(qn), { class: x(C.value), "dialog-panel-classes": "", as: m.value ? "form" : "div", onSubmit: ge(R, ["prevent"]) }, { default: E(() => [ o.value ? (a(), f("div", { key: 0, class: x(["border-b border-outline-3", c.value && "relative z-20 shadow-lg"]) }, [ v("div", jd, [ v("div", Ad, [ k.showBackButton ? (a(), A(u(xn), { key: 0, class: "w-5 h-5 -ml-1 mr-3", onClick: M[0] || (M[0] = (B) => k.$emit("back")) })) : I("", !0), v("div", Ld, [ F(P(k.title) + " ", 1), H(k.$slots, "header") ]) ]) ]) ], 2)) : I("", !0), M[6] || (M[6] = v("button", { class: "hidden", type: "button" }, null, -1)), k.hideCloser ? I("", !0) : (a(), A(u(pe), { key: 1, color: "subtle", size: "sm", class: x(["absolute z-20 top-4 right-5 shrink-0 !w-6 !h-6 !p-0 text-foreground-2", k.closerClasses]), onClick: M[1] || (M[1] = (B) => g.value = !1) }, { default: E(() => [ z(u(wn), { class: "h-6 w-6" }) ]), _: 1 }, 8, ["class"])), sn(n.value ? [i.value] : [i.value = Math.random()], () => (a(), f("div", { ref_key: "slotContainer", ref: p, class: x(L.value), onScroll: M[2] || (M[2] = //@ts-ignore (...B) => u($) && u($)(...B)) }, [ H(k.$slots, "default", {}, () => [ M[5] || (M[5] = F("Put your content here!", -1)) ]) ], 34)), M, 3), b.value ? (a(), f("div", { key: 2, class: x(["relative z-50 flex justify-end px-6 pb-6 space-x-2 shrink-0 bg-foundation-page", { "shadow-t pt-6": !d.value, [k.buttonsWrapperClasses || ""]: !0 }]) }, [ k.buttons ? (a(!0), f(J, { key: 0 }, te(k.buttons, (B, V) => { var U, xe, he; return Q((a(), f("div", { key: B.id || V }, [ z(u(pe), Te({ ref_for: !0 }, B.props || {}, { disabled: ((U = B.props) == null ? void 0 : U.disabled) || B.disabled, submit: ((xe = B.props) == null ? void 0 : xe.submit) || B.submit, onClick: ($e) => { var Oe; return (Oe = B.onClick) == null ? void 0 : Oe.call(B, $e); } }), { default: E(() => [ F(P(B.text), 1) ]), _: 2 }, 1040, ["disabled", "submit", "onClick"]) ])), [ [ u(Ae), (he = B.props) != null && he.disabled || B.disabled ? B.disabledMessage : void 0 ] ]); }), 128)) : H(k.$slots, "buttons", { key: 1 }) ], 2)) : I("", !0) ]), _: 3 }, 8, ["class", "as"]) ]), _: 3 }, 8, ["enter-from", "leave-to"]) ], 2) ]) ]), _: 3 }) ]), _: 3 }, 8, ["show"])); } }); const Vd = { key: 0, class: "h-4 w-4 empty:h-0 empty:w-0" }, Ip = /* @__PURE__ */ D({ __name: "DialogSection", props: /* @__PURE__ */ Ce({ title: String, borderT: Boolean, borderB: Boolean, allowOverflow: Boolean, titleColor: { type: String, default: "default" }, button: Object, alwaysOpen: Boolean, lazyLoad: { type: Boolean, default: !1 }, icon: { type: [Function, Object], default: void 0 } }, { open: { type: Boolean, required: !1 }, openModifiers: {} }), emits: ["update:open"], setup(e) { const t = e, s = j(null), { height: l } = $s(s), r = h(() => (l.value || 0) + 64), n = ke(e, "open"), i = h(() => { const p = []; return !t.button && !t.alwaysOpen && p.push("cursor-pointer", "hover:bg-foundation-page-2"), p; }), c = h(() => { switch (t.titleColor) { case "danger": return "text-danger"; case "warning": return "text-warning"; case "success": return "text-success"; case "secondary": return "text-secondary"; case "info": return "text-info"; default: return "text-foreground"; } }), d = () => { n.value = !n.value; }; return (p, m) => { var b, o; return a(), f("div", { class: x(["flex flex-col border-primary-muted", { "border-t": e.borderT, "border-b": e.borderB, "relative z-10": n.value }]) }, [ v("div", Te({ class: ["flex justify-between items-center space-x-4 sm:space-x-8 py-2.5 px-2", i.value], tabindex: "0" }, Ot( !e.button && !e.alwaysOpen ? { click: d, keypress: u(Fs)(d) } : {}, !0 )), [ v("div", { class: x(["text-heading-sm flex items-center space-x-1 sm:space-x-2 select-none", c.value]) }, [ p.$slots.icon || e.icon ? (a(), f("div", Vd, [ p.$slots.icon ? H(p.$slots, "icon", { key: 0 }) : I("", !0), e.icon ? (a(), A(oe(e.icon), { key: 1, class: "w-full h-full" })) : I("", !0) ])) : I("", !0), v("span", null, P(e.title), 1) ], 2), v("div", null, [ !e.button && !e.alwaysOpen ? (a(), A(u(kn), { key: 0, class: x(["w-4 h-4 transition-all duration-400", n.value && "rotate-180"]) }, null, 8, ["class"])) : I("", !0), e.button ? (a(), A(u(pe), Te({ key: 1, to: e.button.expandContent ? void 0 : e.button.to, color: e.button.expandContent && n.value ? "outline" : e.button.color, "icon-right": e.button.expandContent && n.value ? void 0 : e.button.iconRight, size: "sm", onClick: (b = e.button) == null ? void 0 : b.onClick }, Ot((o = e.button) != null && o.expandContent ? { click: d } : {})), { default: E(() => [ F(P(e.button.expandContent && n.value ? "Cancel" : e.button.text), 1) ]), _: 1 }, 16, ["to", "color", "icon-right", "onClick"])) : I("", !0) ]) ], 16), v("div", { class: x(["transition-all duration-300 overflow-hidden", [ e.allowOverflow && n.value ? "!overflow-visible" : "", n.value ? "mb-2 mt-1" : "", !e.button && !e.alwaysOpen ? "cursor-pointer hover:bg-foundation-page" : "" ]]), style: ae( e.alwaysOpen ? "max-height: none;" : `max-height: ${n.value ? r.value + "px" : "0px"}` ) }, [ t.lazyLoad ? (a(), f(J, { key: 0 }, [ n.value || t.alwaysOpen ? (a(), f("div", { key: 0, ref_key: "content", ref: s, class: "rounded-md text-sm pb-3 px-2 mt-1" }, [ H(p.$slots, "default", {}, () => [ m[0] || (m[0] = F("Panel contents", -1)) ]) ], 512)) : I("", !0) ], 64)) : (a(), f("div", { key: 1, ref_key: "content", ref: s, class: "rounded-md text-sm pb-3 px-2 mt-1" }, [ H(p.$slots, "default", {}, () => [ m[1] || (m[1] = F("Panel contents", -1)) ]) ], 512)) ], 6) ], 2); }; } }), zd = { class: "inline-flex items-center space-x-2 overflow-hidden pr-1 w-full" }, Ed = { key: 1, class: "text-left w-full truncate" }, Rd = { key: 0, class: "label-light" }, Bp = /* @__PURE__ */ D({ __name: "Disclosure", props: /* @__PURE__ */ Ce({ icon: {}, color: { default: "default" }, lazyLoad: { type: Boolean }, exitEditModeOnBlur: { type: Boolean, default: !0 } }, { editTitle: { type: Boolean }, editTitleModifiers: {}, title: {}, titleModifiers: {}, open: { type: Boolean, default: !1 }, openModifiers: {} }), emits: ["update:editTitle", "update:title", "update:open"], setup(e) { const t = e, s = ke(e, "editTitle"), l = ke(e, "title"), r = ke(e, "open"), { on: n, bind: i, syncFromValue: c } = ru({ disableDebouncedInput: !0, model: l }), d = h(() => { const y = ["font-medium"]; switch (t.color) { case "warning": y.push("text-warning"); break; case "success": y.push("text-success"); break; case "danger": y.push("text-danger"); break; case "subtle": y.push("text-foreground text-body-2xs"); break; case "default": default: y.push("text-primary"); break; } return y.join(" "); }), p = h(() => { let y = []; switch (y = [ "w-full", "flex", "items-center", "transition", "group/disclosure", d.value ], t.color === "subtle" ? y.push( "h-7", "justify-normal", "pl-1", "pr-0.5", "rounded-md", "hover:bg-highlight-1", "ring-none" ) : y.push( "pr-3", "h-10", "justify-between", "border-l-2", "px-2", "rounded", "ring-1" ), t.color) { case "warning": y.push("border-warning ring-warning-lighter hover:ring-warning"); break; case "success": y.push("border-success ring-success-lighter hover:ring-success"); break; case "danger": y.push("border-danger ring-danger-lighter hover:ring-danger"); break; case "subtle": y.push("border-none ring-none flex-row-reverse gap-x-1 justify-end"); break; case "default": default: y.push("border-primary ring-primary-muted hover:ring-primary"); break; } return y.join(" "); }), m = h(() => { const y = ["p-3 border-x border-b rounded-b-md"]; switch (t.color) { case "warning": y.push("border-warning-lighter"); break; case "success": y.push("border-success-lighter"); break; case "danger": y.push("border-danger-lighter"); break; case "subtle": y.push("border-none pl-0 pr-0 pb-0 pt-0 rounded-none"); break; case "default": default: y.push("border-primary-muted"); break; } return y.join(" "); }), b = h(() => { const y = "h-4 w-4 transition-transform shrink-0 duration-200 ease-in-out"; return t.color === "subtle" ? r.value ? `${y} rotate-180 transform` : `${y} rotate-90 transform` : r.value ? y : `${y} rotate-180 transform`; }), o = () => { r.value = !r.value; }, g = () => { t.exitEditModeOnBlur && (s.value = !1); }; return re(s, (y, S) => { y && !S && c(); }), (y, S) => (a(), f("div", null, [ z(u(Kn), null, { default: E(() => [ z(u(Gn), { class: x(p.value), onClick: o }, { default: E(() => [ v("div", zd, [ y.icon ? (a(), A(oe(y.icon), { key: 0, class: "h-5 w-5" })) : I("", !0), s.value ? (a(), A(u(Gt), Te({ key: 2 }, u(i), { name: "disclosureTitle", color: "fully-transparent", "input-classes": d.value, "auto-focus": !0, "wrapper-classes": "flex-1" }, Ot(u(n)), { onClick: S[0] || (S[0] = ge(() => { }, ["stop"])), onBlur: g }), null, 16, ["input-classes"])) : (a(), f("span", Ed, P(l.value), 1)), H(y.$slots, "title-actions") ]), z(u(ll), { class: x(b.value) }, null, 8, ["class"]) ]), _: 3 }, 8, ["class"]), r.value ? (a(), A(u(Xn), { key: 0, class: x(m.value), static: "" }, { default: E(() => [ !y.lazyLoad || r.value ? (a(), f("div", Rd, [ H(y.$slots, "default", {}, () => [ S[1] || (S[1] = F("Panel contents", -1)) ]) ])) : I("", !0) ]), _: 3 }, 8, ["class"])) : I("", !0) ]), _: 3 }) ])); } }); var Ne = /* @__PURE__ */ ((e) => (e.Grid = "grid", e.List = "list", e))(Ne || {}); const Fd = { class: "relative flex bg-primary-muted rounded-md" }, Dd = { class: "relative z-10 flex space-x-1 items-center p-1 rounded-l" }, _d = { class: "relative z-10 flex space-x-1 items-center p-1 rounded-r" }, Sp = /* @__PURE__ */ D({ __name: "GridListToggle", props: { modelValue: {} }, emits: ["click", "update:modelValue"], setup(e, { emit: t }) { const s = t, l = e, r = h({ get: () => l.modelValue || Ne.Grid, set: (i) => s("update:modelValue", i) }), n = (i) => { s("click", i); const c = r.value === Ne.Grid ? Ne.List : Ne.Grid; r.value = c; }; return (i, c) => { const d = Qe("tippy"); return a(), f("button", { class: "max-w-max transition flex justify-center items-center space-x-2 outline-none select-none h-8 text-foreground border-2 border-primary-muted dark:border-foundation bg-primary-muted rounded-md active:scale-[0.97] grow", onClick: n }, [ v("div", Fd, [ v("div", { class: x(["absolute transition", { "translate-x-7": r.value !== u(Ne).List }]) }, [...c[0] || (c[0] = [ v("div", { class: "w-7 h-7 bg-foundation dark:bg-foundation-2 transition rounded shadow" }, null, -1) ])], 2), Q((a(), f("div", Dd, [ z(u(ol), { class: "h-5 w-5" }) ])), [ [d, "List View"] ]), Q((a(), f("div", _d, [ z(u(al), { class: "h-5 w-5" }) ])), [ [d, "Grid View"] ]) ]) ]); }; } }), Hd = {}, Ud = { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg" }; function Wd(e, t) { return a(), f("svg", Ud, [...t[0] || (t[0] = [ v("path", { "fill-rule": "evenodd", "clip-rule": "evenodd", d: "M12.8849 5.91851L7.25614 11.74L3.99951 8.48337L4.93388 7.549L7.24028 9.8554L11.9349 5L12.8849 5.91851Z", fill: "currentColor" }, null, -1) ])]); } const hs = /* @__PURE__ */ me(Hd, [["render", Wd]]), Nd = ["disabled", "onClick"], qd = { key: 1, class: "w-5 shrink-0" }, Kd = { key: 2, class: "w-5 shrink-0" }, Pp = /* @__PURE__ */ D({ __name: "Menu", props: { open: { type: Boolean }, items: {}, size: {}, menuId: {}, menuPosition: {}, mountMenuOnBody: { type: Boolean }, customMenuItemsClasses: {}, showTicks: { type: [Boolean, String] } }, emits: ["update:open", "chosen"], setup(e, { emit: t }) { const s = t, l = e, r = j(null), n = j(null), i = j(null), c = j(!1), d = j(!1), p = h({ get: () => l.open || !1, set: ($) => s("update:open", $) }), m = _t(i, { windowResize: !0, windowScroll: !0, immediate: !0 }), b = $s(h(() => { var $; return (($ = r.value) == null ? void 0 : $.el) || null; })), { direction: o } = zu({ el: h(() => { var $; return (($ = r.value) == null ? void 0 : $.el) || null; }), defaultDirection: l.menuPosition, stopUpdatesBelowWidth: 300 }), g = h(() => l.menuPosition || o.value), { menuStyle: y } = Ws({ menuOpenDirection: g, buttonBoundingBox: m, menuWidth: h(() => { if (gr(l.size)) return l.size; switch (l.size) { case "lg": return 208; case "base": default: return 176; } }), menuHeight: h(() => b.height.value) }), S = h(() => l.mountMenuOnBody ? m.width.value ? { position: "fixed", zIndex: 50, ...y.value } : {} : {}), w = h(() => { const $ = [ "w-44 origin-top-right divide-y divide-outline-3 rounded-md bg-foundation shadow-lg border border-outline-2 z-50" ]; return l.customMenuItemsClasses && $.push(...l.customMenuItemsClasses), l.mountMenuOnBody ? $.push("fixed") : ($.push("absolute mt-1"), g.value === ut.Left && $.push("right-0")), l.size === "lg" ? $.push("w-52") : $.push("w-44"), $.join(" "); }), C = ($) => { const { active: k, disabled: M, color: B } = $, V = [ "group flex space-x-2 w-full items-center rounded-md px-2 py-1 text-body-xs text-left" ]; return k && !B ? V.push("bg-primary-muted text-foreground") : M ? V.push("opacity-40") : B === "danger" && k ? V.push("text-foreground-on-primary bg-danger") : B === "danger" && !k ? V.push("text-danger") : B === "info" && k ? V.push("text-foreground-on-primary bg-info") : B === "info" && !k ? V.push("text-info") : V.push("text-foreground"), V.join(" "); }, L = ($, k) => { s("chosen", { item: $, event: k }), Y(!1); }, N = () => { var $; ($ = n.value) == null || $.el.click(), l.mountMenuOnBody && m.update(); }, Y = ($) => { c.value !== $ && N(); }, R = ($) => { const k = !!$; return c.value = k, k; }; return re(c, ($, k) => { $ !== k && (p.value = $); }), re(p, ($) => { ($ && !c.value || !$ && c.value) && N(); }), ce(() => { d.value = !0; }), Yt(window, "resize", () => { m.update(); }), Yt(window, "scroll", () => { m.update(); }), ($, k) => (a(), A(u(Zn), { as: "div", class: "relative inline-block" }, { default: E(({ open: M }) => [ v("div", null, [ z(u(Jn), { id: $.menuId, ref_key: "menuButton", ref: n, class: "hidden", onClick: k[0] || (k[0] = ge(() => { }, ["stop", "prevent"])) }, null, 8, ["id"]), v("div", { ref_key: "menuButtonWrapper", ref: i, class: x(M ? "pointer-events-none" : "") }, [ H($.$slots, "default", { toggle: N, open: R(M) }) ], 2) ]), (a(), A(zt, { to: "body", disabled: !$.mountMenuOnBody }, [ M ? (a(), A(u(Qn), { key: 0, ref_key: "menuItems", ref: r, class: x(w.value), style: ae(S.value) }, { default: E(() => [ (a(!0), f(J, null, te($.items, (B, V) => (a(), f("div", { key: V, class: "p-1" }, [ (a(!0), f(J, null, te(B, (U) => (a(), A(u(Yn), { key: U.id, disabled: U.disabled || void 0, color: U.color }, { default: E(({ active: xe, disabled: he }) => [ Q((a(), f("span", null, [ v("button", { class: x(C({ active: xe, disabled: he, color: U.color })), disabled: he, onClick: ($e) => L(U, $e) }, [ U.icon ? (a(), A(oe(U.icon), { key: 0, class: "h-4 w-4" })) : I("", !0), $.showTicks === !0 ? (a(), f("div", qd, [ U.active ? (a(), A(hs, { key: 0, class: "h-4 w-4 text-foreground-2" })) : I("", !0) ])) : I("", !0), H($.$slots, "item", { item: U }, () => [ v("div", { class: x({ grow: !!$.showTicks }) }, P(U.title), 3) ]), $.showTicks === "right" && U.active ? (a(), f("div", Kd, [ U.active ? (a(), A(hs, { key: 0, class: "h-4 w-4 text-foreground-2" })) : I("", !0) ])) : I("", !0) ], 10, Nd) ])), [ [u(Ae), U.disabled && U.disabledTooltip] ]) ]), _: 2 }, 1032, ["disabled", "color"]))), 128)) ]))), 128)) ]), _: 3 }, 8, ["class", "style"])) : I("", !0) ], 8, ["disabled"])) ]), _: 3 })); } }), Gd = { class: "relative z-10 flex flex-col !mt-0" }, Xd = { class: "absolute left-[-2px] top-[-2px] z-20 pr-8 bg-gradient-to-r from-foundation-page to-transparent" }, Zd = ["data-tab-id", "disabled", "onClick"], Jd = { class: "flex space-x-2 items-center" }, Qd = { class: "min-w-6" }, Yd = { key: 0 }, ec = { key: 1 }, tc = { class: "absolute right-[-2px] top-[-2px] z-20 pl-8 bg-gradient-to-l from-foundation-page to-transparent" }, sc = { class: "pt-4" }, Tp = /* @__PURE__ */ D({ __name: "Horizontal", props: /* @__PURE__ */ Ce({ items: {} }, { activeItem: { required: !0 }, activeItemModifiers: {} }), emits: ["update:activeItem"], setup(e) { const t = e, s = ke(e, "activeItem"), l = j(null), r = j(null), n = j(!1), i = j(!1), c = j(!0), d = j("0px"), p = j("0px"), m = h(() => ($) => { var B; const k = ((B = s.value) == null ? void 0 : B.id) === $.id, M = [ "relative", "z-10", "flex", "items-center", "disabled:opacity-60 disabled:hover:border-transparent disabled:cursor-not-allowed disabled:hover:bg-transparent", "text-body-xs", "hover:sm:border-outline-2", "pb-2", "border-b-[2px]", "border-transparent", "max-w-max", "last:mr-6", "whitespace-nowrap" ]; return k ? M.push("text-primary", "hover:text-primary") : M.push("text-foreground"), M; }), b = h(() => { var B; const $ = (B = s.value) == null ? void 0 : B.id; if (!$) return null; const k = l.value; return k && [...k.getElementsByClassName("tab-button")].find((V) => V.dataset.tabId === $) || null; }), o = h(() => ({ left: d.value, width: p.value })), g = () => { const $ = b.value; $ && (d.value = `${$.offsetLeft}px`, p.value = `${$.clientWidth}px`); }, y = ($) => { s.value = $, c.value = !1; }, S = ($) => { var k; return ((k = s.value) == null ? void 0 : k.id) === $.id; }, w = () => { const $ = r.value; if (!$) return; const k = $.scrollWidth, M = $.clientWidth, B = $.scrollLeft, V = 1; n.value = B > V, i.value = B < k - M - V; }, C = () => { var $; ($ = r.value) == null || $.scrollBy({ left: -100, behavior: "smooth" }), w(); }, L = () => { var $; ($ = r.value) == null || $.scrollBy({ left: 100, behavior: "smooth" }), w(); }, N = mt(() => { w(); }, 250), Y = () => { const $ = b.value; $ && r.value && $.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "center" }); }; ce(() => { Ve && (t.items.length && !s.value && y(t.items[0]), w(), Y()); }), re( () => [t.items, s.value], ([$]) => { Array.isArray($) && $.length && !s.value && y($[0]), w(); } ); const { stop: R } = Ft( b, () => g() ); return ht(() => { N.cancel(), R(); }), ($, k) => { const M = Qe("tippy"); return a(), f("div", Gd, [ v("div", Xd, [ n.value ? (a(), f("button", { key: 0, class: "bg-foundation p-1 rounded-full border border-outline-4 shadow", onClick: C }, [ z(u(Cn), { class: "h-4 w-4" }) ])) : I("", !0) ]), k[1] || (k[1] = v("div", { class: "absolute left-0 z-10 w-full h-[1px] mt-px bg-outline-3 top-7" }, null, -1)), v("div", { ref_key: "scrollContainer", ref: r, class: "relative overflow-x-auto hide-scrollbar w-full", onScroll: k[0] || (k[0] = //@ts-ignore (...B) => u(N) && u(N)(...B)) }, [ v("div", { style: ae(o.value), class: x(["h-[2px] absolute bottom-0 z-20 transition-[left,width] duration-300", c.value ? "bg-transparent" : "bg-primary"]) }, null, 6), v("div", { ref_key: "buttonContainer", ref: l, class: "flex w-full space-x-4" }, [ (a(!0), f(J, null, te($.items, (B) => { var V; return a(), f("button", { key: B.id, "data-tab-id": B.id, class: x([[ m.value(B), { "!border-primary": S(B) && c.value } ], "tab-button"]), disabled: B.disabled, onClick: (U) => y(B) }, [ v("div", Jd, [ B.icon ? (a(), A(oe(B.icon), { key: 0, class: "shrink-0 h-4 w-4 stroke-[2px]" })) : I("", !0), v("div", Qd, [ B.disabled && B.disabledMessage ? Q((a(), f("span", Yd, [ F(P(B.title), 1) ])), [ [M, B.disabledMessage] ]) : (a(), f("span", ec, P(B.title), 1)) ]), B.count ? (a(), f("div", { key: 1, class: x([ "rounded-full px-2 text-body-3xs transition-all min-w-6", ((V = s.value) == null ? void 0 : V.id) === B.id ? "text-primary bg-info-lighter dark:text-foreground" : "text-foreground-2 bg-highlight-3" ]) }, [ v("span", null, P(B.count), 1) ], 2)) : I("", !0), B.tag ? (a(), A(nt, { key: 2 }, { default: E(() => [ F(P(B.tag), 1) ]), _: 2 }, 1024)) : I("", !0) ]) ], 10, Zd); }), 128)) ], 512) ], 544), v("div", tc, [ i.value ? (a(), f("button", { key: 0, class: "bg-foundation p-1 rounded-full border border-outline-3 shadow", onClick: L }, [ z(u($n), { class: "h-4 w-4" }) ])) : I("", !0) ]), v("div", sc, [ H($.$slots, "default", { activeItem: s.value }) ]) ]); }; } }); const nc = { class: "flex space-y-8 lg:space-y-0 lg:space-x-8 flex-col lg:flex-row" }, lc = { class: "lg:w-2/12" }, oc = { class: "flex w-full flex-col space-y-1" }, ac = ["data-tab-id", "disabled", "onClick"], rc = { class: "absolute top-0 right-0 left-0 bottom-0" }, ic = { class: "flex space-x-2 items-center px-2" }, uc = { class: "min-w-6" }, dc = { key: 2, class: "text-body-3xs font-medium py-0.5 px-1.5 text-foreground-2 bg-foundation-2 uppercase text-outline-4 rounded" }, cc = { class: "lg:w-10/12" }, Op = /* @__PURE__ */ D({ __name: "Vertical", props: /* @__PURE__ */ Ce({ items: {} }, { activeItem: { required: !0 }, activeItemModifiers: {} }), emits: ["update:activeItem"], setup(e) { const t = e, s = ke(e, "activeItem"), l = h(() => (n) => { var d; const i = ((d = s.value) == null ? void 0 : d.id) === n.id, c = [ "relative", "flex items-center space-x-1.5", "hover:bg-highlight-2", "disabled:opacity-60 disabled:hover:border-transparent disabled:cursor-not-allowed disabled:hover:bg-transparent rounded-md", "text-body-xs font-medium", "py-1" ]; return i ? c.push("bg-primary-muted") : c.push("border-transparent text-foreground"), c; }), r = (n) => { s.value = n; }; return ce(() => { Ve && t.items.length && !s.value && r(t.items[0]); }), re( () => [t.items, s.value], ([n]) => { Array.isArray(n) && n.length && !s.value && r(n[0]); } ), (n, i) => { const c = Qe("tippy"); return a(), f("div", nc, [ v("div", lc, [ v("div", oc, [ (a(!0), f(J, null, te(n.items, (d) => { var p; return a(), f("button", { key: d.id, "data-tab-id": d.id, class: x([l.value(d)]), disabled: d.disabled, onClick: (m) => r(d) }, [ Q(v("div", rc, null, 512), [ [ c, d.disabled && d.disabledMessage ? d.disabledMessage : void 0 ] ]), v("div", ic, [ d.icon ? (a(), A(oe(d.icon), { key: 0, class: "shrink-0 h-4 w-4 stroke-[2px]" })) : I("", !0), v("span", uc, P(d.title), 1), d.count ? (a(), f("div", { key: 1, class: x([ "rounded-full px-2 text-body-3xs transition-all min-w-6", ((p = s.value) == null ? void 0 : p.id) === d.id ? "text-primary bg-info-lighter dark:text-foreground" : "text-foreground-2 bg-foundation-2" ]) }, [ v("span", null, P(d.count), 1) ], 2)) : I("", !0), d.tag ? (a(), f("div", dc, P(d.tag), 1)) : I("", !0) ]) ], 10, ac); }), 128)) ]) ]), v("div", cc, [ H(n.$slots, "default", { activeItem: s.value }) ]) ]); }; } }), fc = { key: 0, class: "flex items-center justify-center py-3", tabindex: "0" }, pc = ["onClick", "onKeypress"], mc = { key: 0, class: "absolute right-1.5 space-x-1 flex items-center p-0 h-full" }, hc = { class: "w-full text-center label-light text-foreground-2 italic" }, Mp = /* @__PURE__ */ D({ __name: "Table", props: { items: {}, buttons: {}, columns: {}, overflowCells: { type: Boolean }, onRowClick: {}, rowItemsAlign: { default: "center" }, emptyMessage: { default: "No data found" }, loading: { type: Boolean } }, setup(e) { const t = e, s = h(() => [ "w-full text-foreground text-sm border border-outline-3 rounded-lg", "overflow-x-auto simple-scrollbar", "h-full flex flex-col" ].join(" ")), l = h(() => ["w-full min-w-[750px]"].join(" ")), r = h(() => { const o = [ "divide-y divide-outline-3 overflow-y-auto overflow-x-hidden simple-scrollbar", l.value ]; return t.overflowCells && o.push("pb-32"), o.join(" "); }), n = h(() => (t.buttons || []).length), i = h(() => { let o = 16; return n.value > 0 && (o = 48 + (n.value - 1) * 42), `${o}px`; }), c = h(() => { var g; const o = [ "relative grid grid-cols-12 items-center space-x-6 px-4 py-0.5 min-w-[750px] text-body-xs" ]; switch (t.onRowClick && ((g = t.items) != null && g.length) && o.push("cursor-pointer hover:bg-highlight-1"), t.rowItemsAlign) { case "center": o.push("items-center"); break; case "stretch": o.push("items-stretch"); break; } return o.join(" "); }), d = (o, g, y) => { var C; const w = [(o ? (C = t.columns.find((L) => L.id === o)) == null ? void 0 : C.classes : "") || ""]; return y != null && y.noPadding || (g === 0 ? w.push("px-1") : w.push("lg:p-0 px-1")), w.join(" "); }, p = (o, g, y) => { const S = [d(o, g, y)]; return g === 0 ? S.push(`bg-transparent py-2 ${o ? "pr-5" : "col-span-full"}`) : S.push("my-2"), S.join(" "); }, m = (o) => { var g; (g = t.onRowClick) == null || g.call(t, o); }, b = h(() => [ "z-10 grid grid-cols-12 items-center", "space-x-6", "px-4 py-3", "bg-foundation-2 rounded-t-lg", "font-medium text-body-2xs text-foreground-2", "border-b border-outline-3", l.value ]); return (o, g) => { var y; return a(), f("div", { class: x(s.value) }, [ v("div", { class: x(b.value), style: ae({ paddingRight: i.value }) }, [ (a(!0), f(J, null, te(o.columns, (S, w) => (a(), f("div", { key: S.id, class: x(d(S.id, w)) }, P(S.header), 3))), 128)) ], 6), v("div", { class: x(r.value) }, [ o.loading || !o.items ? (a(), f("div", fc, [ z(u(ct)) ])) : (y = o.items) != null && y.length ? (a(!0), f(J, { key: 1 }, te(o.items, (S) => (a(), f("div", { key: S.id, style: ae({ paddingRight: i.value }), class: x(c.value), tabindex: "0", onClick: (w) => m(S), onKeypress: (w) => m(S) }, [ (a(!0), f(J, null, te(o.columns, (w, C) => (a(), f("div", { key: w.id, class: x(p(w.id, C)), tabindex: "0" }, [ H(o.$slots, w.id, { item: S }, () => [ g[0] || (g[0] = v("div", { class: "text-foreground-2 font-medium order-1" }, "Placeholder", -1)) ]) ], 2))), 128)), o.buttons ? (a(), f("div", mc, [ (a(!0), f(J, null, te(o.buttons, (w) => (a(), f("div", { key: w.label }, [ Q(z(u(pe), { "icon-left": w.icon, size: "sm", color: "outline", "hide-text": "", disabled: w.disabled, class: x(w.class), to: u(Le)(w.action) ? w.action : void 0, onClick: ge((C) => u(Le)(w.action) ? u(Ht) : w.action(S), ["stop"]) }, null, 8, ["icon-left", "disabled", "class", "to", "onClick"]), [ [u(Ae), w.tooltip] ]) ]))), 128)) ])) : I("", !0) ], 46, pc))), 128)) : (a(), f("div", { key: 2, tabindex: "0", style: ae({ paddingRight: i.value }), class: x(c.value) }, [ v("div", { class: x(p(void 0, 0)), tabindex: "0" }, [ H(o.$slots, "empty", {}, () => [ v("div", hc, P(o.emptyMessage), 1) ]) ], 2) ], 6)), H(o.$slots, "loader") ], 2) ], 2); }; } }), vc = { class: "w-full flex flex-col items-center my-2 space-y-2 mt-4" }, bc = { class: "inline-flex items-center space-x-1" }, jp = /* @__PURE__ */ D({ __name: "InfiniteLoading", props: { settings: {}, allowRetry: { type: Boolean }, hideWhenComplete: { type: Boolean } }, emits: ["infinite"], setup(e) { const t = j(null), s = j(!1); return Ve && ce(() => { const l = setInterval(() => { var r; (r = t.value) != null && r.isConnected && (s.value = !0, clearInterval(l)); }, 200); }), (l, r) => (a(), f("div", { ref_key: "wrapper", ref: t }, [ s.value ? (a(), A(u(il), Te({ key: 0 }, l.$props.settings || {}, { onInfinite: r[0] || (r[0] = (n) => l.$emit("infinite", n)) }), { spinner: E(() => [ z(Ct, { loading: !0, class: "my-2" }) ]), complete: E(() => [ v("div", { class: x({ "h-8": !l.hideWhenComplete }) }, null, 2) ]), error: E(({ retry: n }) => [ v("div", vc, [ v("div", bc, [ z(u(In), { class: "w-5 h-5 text-danger" }), r[1] || (r[1] = v("span", { class: "text-foreground-2" }, "An error occurred while loading", -1)) ]), l.allowRetry ? (a(), A(pe, { key: 0, onClick: n }, { default: E(() => [...r[2] || (r[2] = [ F("Retry", -1) ])]), _: 2 }, 1032, ["onClick"])) : I("", !0) ]) ]), _: 1 }, 16)) : I("", !0) ], 512)); } }), gc = { class: "relative group" }, yc = { key: 0, class: "absolute -top-1 -left-1 -right-1 -bottom-1 bg-blue-300 dark:bg-blue-500 opacity-5 dark:opacity-0 rounded-md blur-sm group-hover:opacity-60 dark:group-hover:opacity-30 transition duration-500" }, Ap = /* @__PURE__ */ D({ __name: "Panel", props: { /** * Use a `
` element as a wrapper that will emit 'submit' events out from the component when they occur */ form: { type: Boolean, default: !1 }, /** * Add a ring outline on hover */ ring: { type: Boolean, default: !1 }, /** * Add a primary-colored glow on hover */ fancyGlow: { type: Boolean, default: !1 }, customPadding: { type: Boolean, default: !1 }, noShadow: { type: Boolean, default: !1 }, panelClasses: { type: String } }, emits: ["submit"], setup(e, { emit: t }) { const s = t, l = e, r = h( () => l.customPadding ? "" : "px-4 py-4 sm:px-6" ), n = h( () => l.customPadding ? "" : "px-4 py-4 sm:p-6" ), i = h(() => { const c = ["rounded-lg"]; return l.noShadow || c.push("shadow"), l.ring && c.push("ring-outline-1 hover:ring-1"), l.panelClasses && c.push(l.panelClasses), c.join(" "); }); return (c, d) => (a(), f("div", gc, [ e.fancyGlow ? (a(), f("div", yc)) : I("", !0), (a(), A(oe(e.form ? "form" : "div"), { class: x([ "relative divide-outline-3 bg-foundation text-foreground flex flex-col divide-y overflow-hidden", i.value ]), onSubmit: d[0] || (d[0] = (p) => s("submit", p)) }, { default: E(() => [ c.$slots.header ? (a(), f("div", { key: 0, class: x(r.value) }, [ H(c.$slots, "header") ], 2)) : I("", !0), v("div", { class: x(["grow", n.value]) }, [ H(c.$slots, "default") ], 2), c.$slots.footer ? (a(), f("div", { key: 1, class: x(r.value) }, [ H(c.$slots, "footer") ], 2)) : I("", !0) ]), _: 3 }, 40, ["class"])) ])); } }), xc = {}, wc = { key: 0, class: "shrink-0 pt-2" }; function kc(e, t) { return a(), f("aside", { class: x(["flex flex-col justify-between h-full w-full", e.$slots.promo ? "" : "overflow-y-auto overflow-x-hidden simple-scrollbar"]) }, [ v("div", { class: x(["flex flex-col h-full w-full", e.$slots.promo ? "overflow-y-auto overflow-x-hidden simple-scrollbar" : ""]) }, [ H(e.$slots, "default") ], 2), e.$slots.promo ? (a(), f("div", wc, [ H(e.$slots, "promo") ])) : I("", !0) ], 2); } const Lp = /* @__PURE__ */ me(xc, [["render", kc]]), Cc = { class: "flex flex-col gap-y-1 sm:gap-y-2 border border-outline-3 rounded-lg py-2 px-3 sm:p-4 select-none" }, $c = { key: 0, class: "text-body-xs sm:text-heading-sm font-medium text-foreground" }, Ic = { key: 1, class: "text-body-2xs sm:text-body-xs text-foreground-2 !leading-5" }, Vp = /* @__PURE__ */ D({ __name: "Promo", props: { title: {}, text: {}, to: {}, buttonText: {} }, emits: ["onClick"], setup(e) { return (t, s) => (a(), f("div", Cc, [ t.title ? (a(), f("h6", $c, P(t.title), 1)) : I("", !0), t.text ? (a(), f("p", Ic, P(t.text), 1)) : I("", !0), t.buttonText ? (a(), A(pe, { key: 2, size: "sm", class: "mt-1", to: t.to, target: t.to ? "_blank" : void 0, onClick: s[0] || (s[0] = (l) => t.$emit("onClick")) }, { default: E(() => [ F(P(t.buttonText), 1) ]), _: 1 }, 8, ["to", "target"])) : I("", !0) ])); } }), Bc = {}, Sc = { class: "flex flex-col" }; function Pc(e, t) { return a(), f("nav", Sc, [ H(e.$slots, "default") ]); } const zp = /* @__PURE__ */ me(Bc, [["render", Pc]]), Tc = {}, Oc = { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg" }; function Mc(e, t) { return a(), f("svg", Oc, [...t[0] || (t[0] = [ v("path", { d: "M8 3V13M3 8H13", stroke: "currentColor", "stroke-width": "1.5" }, null, -1) ])]); } const jc = /* @__PURE__ */ me(Tc, [["render", Mc]]), Ac = {}, Lc = { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" }; function Vc(e, t) { return a(), f("svg", Lc, [...t[0] || (t[0] = [ v("path", { d: "M3.66748 3.66687H3.00081C2.64719 3.66687 2.30805 3.80735 2.058 4.05739C1.80796 4.30744 1.66748 4.64658 1.66748 5.0002V11.0002C1.66748 11.3538 1.80796 11.693 2.058 11.943C2.30805 12.1931 2.64719 12.3335 3.00081 12.3335H9.00081C9.35443 12.3335 9.69357 12.1931 9.94362 11.943C10.1937 11.693 10.3341 11.3538 10.3341 11.0002V10.3335", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round" }, null, -1), v("path", { d: "M12.59 3.39007C12.8526 3.12751 13.0001 2.77139 13.0001 2.40007C13.0001 2.02875 12.8526 1.67264 12.59 1.41007C12.3274 1.14751 11.9713 1 11.6 1C11.2287 1 10.8726 1.14751 10.61 1.41007L5 7.00007V9.00007H7L12.59 3.39007Z", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round" }, null, -1), v("path", { d: "M9.66748 2.33313L11.6675 4.33313", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round" }, null, -1) ])]); } const zc = /* @__PURE__ */ me(Ac, [["render", Vc]]), Ec = {}, Rc = { width: "16", height: "32", viewBox: "0 0 16 32", fill: "none", xmlns: "http://www.w3.org/2000/svg" }; function Fc(e, t) { return a(), f("svg", Rc, [...t[0] || (t[0] = [ v("path", { d: "M7.64645 17.7498C7.84171 17.9451 8.15829 17.9451 8.35355 17.7498L11.1464 14.9569C11.4614 14.642 11.2383 14.1034 10.7929 14.1034H5.20711C4.76165 14.1034 4.53857 14.642 4.85355 14.9569L7.64645 17.7498Z", fill: "currentColor" }, null, -1) ])]); } const qs = /* @__PURE__ */ me(Ec, [["render", Fc]]), Dc = { class: "flex flex-col group" }, _c = { class: "flex flex-1 items-center truncate justify-between" }, Hc = ["disabled"], Uc = { class: "flex flex-col" }, Ep = /* @__PURE__ */ D({ __name: "Group", props: /* @__PURE__ */ Ce({ tag: {}, title: {}, collapsible: { type: Boolean }, collapsed: { type: Boolean }, icon: {}, iconText: {}, iconClick: { type: Function }, iconDisabled: { type: Boolean }, noHover: { type: Boolean }, nested: { type: Boolean }, alwaysShowIcon: { type: Boolean } }, { collapsed: { type: Boolean }, collapsedModifiers: {} }), emits: ["update:collapsed"], setup(e) { const t = ke(e, "collapsed"); return (s, l) => { const r = Qe("tippy"); return a(), f("div", Dc, [ s.title ? (a(), f("div", { key: 0, class: x(["h-8 flex items-center justify-between select-none rounded-md", [s.collapsible && !s.noHover && "hover:bg-highlight-1"]]) }, [ (a(), A(oe(s.collapsible ? "button" : "div"), { class: x(["flex items-center w-full", [ s.collapsible ? "group rounded-md gap-x-1" : "space-x-1 p-1 text-foreground-2", s.collapsible && !s.noHover ? "py-0.5 px-2" : "pl-2" ]]), onClick: l[0] || (l[0] = (n) => s.collapsible ? t.value = !t.value : void 0) }, { default: E(() => [ s.collapsible ? (a(), A(qs, { key: 0, class: x([[t.value ? "-rotate-90" : "", s.noHover ? "-ml-1" : ""], "text-foreground-2 shrink-0"]) }, null, 8, ["class"])) : I("", !0), s.$slots["title-icon"] ? (a(), f("div", { key: 1, class: x(["flex items-center justify-center", [s.collapsible ? "ml-1 mr-2" : ""]]) }, [ H(s.$slots, "title-icon") ], 2)) : I("", !0), v("div", _c, [ v("h6", { class: x(["truncate text-body-2xs pr-2", [s.nested ? "text-foreground" : "font-semibold text-foreground-2"]]) }, P(s.title), 3), s.tag ? (a(), A(nt, { key: 0, rounded: "" }, { default: E(() => [ F(P(s.tag), 1) ]), _: 1 })) : I("", !0) ]) ]), _: 3 }, 8, ["class"])), s.iconClick ? Q((a(), f("button", { key: 0, disabled: s.iconDisabled, class: x(["group-hover:flex p-1 shrink-0 hover:bg-primary-muted rounded text-foreground-2", [ s.noHover ? "" : "mr-2", s.alwaysShowIcon ? "flex" : "hidden", s.iconDisabled ? "opacity-50 cursor-not-allowed" : "" ]]), onClick: l[1] || (l[1] = //@ts-ignore (...n) => s.iconClick && s.iconClick(...n)) }, [ s.icon === "edit" ? (a(), A(zc, { key: 0, class: "h-4 w-4" })) : s.icon === "view" ? (a(), A(u(Bn), { key: 1, class: "h-4 w-4" })) : (a(), A(jc, { key: 2, class: "h-4 w-4" })) ], 10, Hc)), [ [r, s.iconText ? s.iconText : void 0] ]) : I("", !0) ], 2)) : I("", !0), Q(v("div", Uc, [ H(s.$slots, "default") ], 512), [ [gs, !t.value] ]) ]); }; } }), Wc = ["to"], Nc = { key: 0, class: "h-6 w-6 flex items-center justify-center" }, qc = { class: "truncate" }, Kc = { key: 1, class: "flex flex-col" }, Gc = { class: "text-heading-sm flex items-center space-x-1.5" }, Xc = { class: "pl-4" }, Rp = /* @__PURE__ */ D({ __name: "Item", props: { label: {}, to: {}, tag: {}, external: { type: Boolean }, disabled: { type: Boolean }, active: { type: Boolean }, tooltipText: {}, extraPadding: { type: Boolean }, colorClasses: {} }, setup(e) { const t = e, s = j(!0), r = !!bt().default, n = () => { t.disabled || (s.value = !s.value); }; return (i, c) => { const d = Qe("tippy"); return r ? (a(), f("div", Kc, [ Q((a(), f("button", { class: x(["flex space-x-1.5 items-center w-full rounded-md p-0.5", [ !i.disabled && "cursor-pointer text-foreground-2 hover:text-foreground", i.disabled && "opacity-60" ]]), onClick: n }, [ z(qs, { class: x(["h-1 w-2 shrink-0", [s.value ? "" : "-rotate-90"]]) }, null, 8, ["class"]), v("h6", Gc, P(i.label), 1) ], 2)), [ [d, i.tooltipText] ]), Q(v("div", Xc, [ H(i.$slots, "default") ], 512), [ [gs, s.value] ]) ])) : Q((a(), f("div", { key: 0, to: i.to, class: x(["group/item flex items-center justify-between space-x-2 shrink-0 text-body-xs text-foreground select-none rounded-md w-full py-1", [ !i.disabled && "cursor-pointer hover:bg-highlight-1", i.disabled && "cursor-not-allowed", i.active && "bg-highlight-3 hover:!bg-highlight-3", i.$slots.icon ? "pl-1 pr-2" : "pr-2 pl-7", i.extraPadding && "!pl-14" ]]) }, [ v("div", { class: x(["flex items-center space-x-2 truncate", [i.disabled && "opacity-60"]]) }, [ i.$slots.icon ? (a(), f("div", Nc, [ H(i.$slots, "icon") ])) : I("", !0), v("span", qc, P(i.label), 1), i.external ? (a(), A(u(Sn), { key: 1, class: "h-2.5 w-2.5 !stroke-[3px] -ml-1 -mt-1.5 opacity-0 group-hover/item:opacity-100 shrink-0" })) : I("", !0) ], 2), i.tag ? (a(), A(nt, { key: 0, rounded: "", "color-classes": i.colorClasses ?? (i.disabled ? "text-foreground-2 bg-primary-muted" : void 0) }, { default: E(() => [ F(P(i.tag), 1) ]), _: 1 }, 8, ["color-classes"])) : I("", !0) ], 10, Wc)), [ [d, i.tooltipText] ]); }; } }), Zc = { key: 0 }, Jc = { class: "flex-1" }, Qc = { class: "flex gap-x-2" }, Fp = /* @__PURE__ */ D({ __name: "Alert", props: { color: { default: "success" }, withDismiss: { type: Boolean }, actions: {}, customIcon: {}, hideIcon: { type: Boolean }, size: { default: "default" } }, emits: ["dismiss"], setup(e) { const t = e, s = bt(), l = h(() => !!s.description), r = h(() => !!s.title), n = h(() => { if (t.customIcon) return t.customIcon; switch (t.color) { case "info": return ft; case "warning": return On; case "danger": return Tn; case "success": return Pn; default: return ft; } }), i = h(() => { const o = ["rounded-lg text-foreground border"]; switch (t.size) { case "2xs": case "xs": o.push("p-2"); break; case "default": default: o.push(l.value ? "p-3 sm:p-4" : "p-2"); break; } switch (t.color) { case "success": o.push("bg-success-lightest border-outline-2"); break; case "info": o.push("bg-foundation-2 border-outline-3"); break; case "danger": o.push("bg-danger-lightest border-outline-2"); break; case "warning": o.push("bg-warning-lightest border-outline-2"); break; case "neutral": o.push("bg-foundation border-outline-2"); break; } return o.join(" "); }), c = h(() => { const o = ["flex items-center w-full"]; switch (t.size) { case "2xs": case "xs": o.push("gap-x-1.5"); break; case "default": default: o.push("gap-x-3"); break; } return o.join(" "); }), d = h(() => { const o = []; switch (t.size) { case "2xs": o.push("h-4 w-4"); break; case "xs": o.push("h-5 w-5"); break; case "default": default: o.push("h-6 w-6"); break; } switch (t.color) { case "success": o.push("text-success-darker"); break; case "info": o.push("text-info-darker dark:text-primary"); break; case "danger": o.push("text-danger-darker"); break; case "warning": o.push("text-warning-darker"); break; case "neutral": o.push("text-foreground-2"); break; } return o.join(" "); }), p = h(() => { const o = ["font-medium"]; switch (t.size) { case "2xs": o.push("text-body-2xs"); break; case "default": default: o.push("text-body-xs"); break; } return o.join(" "); }), m = h(() => { const o = ["whitespace-normal"]; switch (t.size) { case "2xs": o.push("text-body-2xs pt-0.5"); break; case "default": default: o.push("text-body-xs"); break; } return o.join(" "); }); function b(o) { o.onClick && o.onClick(); } return (o, g) => (a(), f("div", { class: x(i.value) }, [ v("div", { class: x(c.value) }, [ o.hideIcon ? I("", !0) : (a(), f("div", Zc, [ (a(), A(oe(n.value), { class: x(d.value), "aria-hidden": "true" }, null, 8, ["class"])) ])), v("div", Jc, [ r.value ? (a(), f("h3", { key: 0, class: x(p.value) }, [ H(o.$slots, "title", {}, () => [ g[1] || (g[1] = F("Title", -1)) ]) ], 2)) : I("", !0), l.value ? (a(), f("div", { key: 1, class: x(m.value) }, [ H(o.$slots, "description", {}, () => [ g[2] || (g[2] = F(" Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquid pariatur, ipsum similique veniam. ", -1)) ]) ], 2)) : I("", !0) ]), v("div", Qc, [ (a(!0), f(J, null, te(o.actions || [], (y, S) => (a(), A(pe, { key: S, color: "outline", size: "sm", to: y.url, external: y.externalUrl || !1, disabled: y.disabled || !1, onClick: (w) => b(y) }, { default: E(() => [ F(P(y.title), 1) ]), _: 2 }, 1032, ["to", "external", "disabled", "onClick"]))), 128)) ]), o.withDismiss ? (a(), f("div", { key: 1, class: x(["flex", [l.value ? "items-start" : "items-center"]]) }, [ z(pe, { type: "button", color: "subtle", size: "sm", onClick: g[0] || (g[0] = (y) => o.$emit("dismiss")) }, { default: E(() => [...g[3] || (g[3] = [ F(" Dismiss ", -1) ])]), _: 1 }) ], 2)) : I("", !0) ], 2) ], 2)); } }); function Dp(e) { var y, S; const { get: t, initialState: s, readOptions: l, set: r, asyncRead: n = !0, debugging: i } = e, c = i == null ? void 0 : i.log, d = () => (new Error("Trace:").stack || "").substring(7), p = ((S = (y = e.debugging) == null ? void 0 : y.log) == null ? void 0 : S.logger) || console.debug, m = c && !c.writesOnly ? () => { const w = t(); return p(`debugging: '${c.name}' read`, w, d()), w; } : t, b = c && !c.readsOnly ? (w) => (p(`debugging: '${c.name}' written to`, w, d()), r(w)) : r, o = n ? zn(m, s, l) : h(m), g = h(() => o.value); return g.update = b, g; } const Yc = /* @__PURE__ */ D({ __name: "ContextManager", setup(e, { expose: t }) { const l = nn().provides, r = Object.getOwnPropertySymbols(l).find( (o) => o.description === "ComboboxContext" ); r || console.error("FormTagsContextManager ctx key not found!"); const n = ln(r || "__undefined"); return n || console.error("FormTagsContextManager ctx not found!"), t({ goUp: () => { n == null || n.goToOption(1); }, goDown: () => { n == null || n.goToOption(2); }, open: () => { n && n.openCombobox(); }, close: () => { n == null || n.closeCombobox(); }, selectActive: () => { n == null || n.selectActiveOption(); }, isOpen: () => (n == null ? void 0 : n.comboboxState.value) === 0 }), (o, g) => H(o.$slots, "default"); } }), ef = ["for"], tf = ["disabled", "placeholder"], sf = { key: 3, class: "text-body-2xs font-normal" }, nf = { key: 1 }, lf = ["id"], _p = /* @__PURE__ */ D({ __name: "Tags", props: { name: {}, help: {}, label: {}, showLabel: { type: Boolean }, rules: {}, validateOnMount: { type: Boolean }, validateOnValueUpdate: { type: Boolean }, autoFocus: { type: Boolean }, showClear: { type: Boolean }, showRequired: { type: Boolean }, showOptional: { type: Boolean }, color: { default: "page" }, wrapperClasses: {}, size: { default: "base" }, placeholder: {}, disabled: { type: Boolean }, useLabelInErrors: { type: Boolean, default: !0 }, getAutocompleteItems: {}, modelValue: {} }, emits: ["update:modelValue", "change", "clear"], setup(e, { expose: t, emit: s }) { const l = (_) => _.type === "input", r = s, n = e, i = j(null), { focused: c } = En(i), d = j( null ), { coreInputClasses: p, coreClasses: m, labelClasses: b, title: o, helpTip: g, helpTipId: y, hideHelpTip: S, helpTipClasses: w, errorMessage: C, clear: L, value: N } = Kt({ props: Be(n), emit: r, inputEl: i // options: { // customClear: () => (selectedItems.value = []) // } }), Y = j([]), R = j(!1), $ = j(!1), k = j(""), M = h({ get: () => N.value || [], set: (_) => { N.value = Ir(_).filter((W) => !!W.length); } }), B = h(() => { switch (n.size) { case "sm": return "h-6"; case "lg": return "h-10"; case "xl": return "h-14"; case "base": default: return "h-8"; } }), V = h(() => n.showClear && !!M.value.length), U = h(() => { const _ = [ m.value, n.disabled ? "cursor-not-allowed !bg-foundation-disabled !text-disabled-muted" : "" ]; return V.value && (C.value || n.showRequired) ? _.push("pr-14") : (V.value || C.value || n.showRequired) && _.push("pr-8"), C.value ? (_.push("border-2 border-danger text-danger-darker"), c.value && _.push("ring-1 ring-danger")) : (_.push("border border-outline-3"), c.value && _.push("ring-1 ring-outline-3")), _.join(" "); }), xe = (_) => { if (n.disabled) return; const W = M.value.indexOf(_); if (W !== -1) { const q = M.value.slice(); q.splice(W, 1), M.value = q; } }, he = () => { var _; (_ = i.value) == null || _.blur(), $.value = !1; }, $e = (_) => { if (_.key !== "Backspace" || k.value.length) return; const W = M.value.slice(); W.pop(), M.value = W, $.value = !1; }, Oe = () => { var _, W, q; (_ = d.value) != null && _.isOpen() ? (W = d.value) == null || W.goUp() : (q = d.value) == null || q.open(); }, Ee = () => { var _, W, q; (_ = d.value) != null && _.isOpen() ? (W = d.value) == null || W.goDown() : (q = d.value) == null || q.open(); }, ie = async () => { n.getAutocompleteItems && (R.value = !0, Y.value = await Promise.resolve( n.getAutocompleteItems(k.value) ), R.value = !1); }, ue = st(ie, 1e3), ne = async () => { R.value = !0, await ue(); }, le = (_, W) => { var fe, ve; if (l(_) ? _.data === " " || _.data === "," || _.data === ";" : !0) { let de = !1; if ((fe = d.value) != null && fe.isOpen() && Y.value.length && !W) (ve = d.value) == null || ve.selectActive(), de = !0; else { const we = k.value.trim().substring(0, k.value.length - (l(_) ? 1 : 0)), Re = M.value.includes(we); we.length > 0 && !Re && (M.value = [...M.value, we], de = !0); } de && (k.value = "", $.value = !1); } else $.value = !!k.value.length; }; return re($, (_, W) => { var q, fe; _ && !W ? n.getAutocompleteItems && ((q = d.value) == null || q.open()) : !_ && W && ((fe = d.value) == null || fe.close()); }), re(k, () => { ne(); }), ce(() => { ie(); }), t({ resolveAutocompleteItems: ie }), (_, W) => (a(), A(u(el), { modelValue: M.value, "onUpdate:modelValue": W[5] || (W[5] = (q) => M.value = q), as: "div", multiple: "", clearable: "", class: x([_.wrapperClasses]) }, { default: E(() => [ z(Yc, { ref_key: "ctxManager", ref: d }, { default: E(() => [ v("label", { for: _.name, class: x(u(b)) }, [ v("span", null, P(u(o)), 1) ], 10, ef), v("div", { class: x(["relative flex flex-wrap items-center space-x-1 px-2 py-1", U.value]) }, [ (a(!0), f(J, null, te(M.value, (q) => (a(), A(nt, { key: q, "icon-left": _.disabled ? void 0 : u(Ge), "clickable-icon": "", size: "lg", onClickIcon: () => xe(q) }, { default: E(() => [ F(P(q), 1) ]), _: 2 }, 1032, ["icon-left", "onClickIcon"]))), 128)), Q(v("input", { ref_key: "inputEl", ref: i, "onUpdate:modelValue": W[0] || (W[0] = (q) => k.value = q), disabled: _.disabled, class: x(["bg-transparent grow shrink border-0 focus:ring-0 p-0", [u(p), B.value]]), style: { "flex-basis": "70px", "min-width": "70px" }, placeholder: M.value.length ? void 0 : _.placeholder, onInput: le, onKeydown: [ Ue(he, ["escape"]), W[1] || (W[1] = Ue(ge((q) => le(q, !0), ["stop", "prevent"]), ["enter"])), Ue(le, ["tab"]), Ue($e, ["backspace"]), Ue(Oe, ["arrow-up"]), Ue(Ee, ["arrow-down"]) ], onBlur: W[2] || (W[2] = (q) => $.value = !1) }, null, 42, tf), [ [Ke, k.value] ]), V.value ? (a(), f("a", { key: 0, title: "Clear input", class: "absolute top-2 right-0 flex items-center pr-2 cursor-pointer", onClick: W[3] || (W[3] = //@ts-ignore (...q) => u(L) && u(L)(...q)), onKeydown: W[4] || (W[4] = //@ts-ignore (...q) => u(L) && u(L)(...q)) }, [ W[6] || (W[6] = v("span", { class: "text-xs sr-only" }, "Clear input", -1)), z(u(Ge), { class: "h-5 w-5 text-foreground", "aria-hidden": "true" }) ], 32)) : I("", !0), u(C) ? (a(), f("div", { key: 1, class: x([ "pointer-events-none absolute top-[10px] right-0 flex items-center", V.value ? "pr-8" : "pr-2" ]) }, [ z(u(Rt), { class: "h-4 w-4 text-danger", "aria-hidden": "true" }) ], 2)) : _.showRequired ? (a(), f("div", { key: 2, class: x(["pointer-events-none absolute top-[2px] text-4xl right-0 flex items-center text-danger opacity-50", V.value ? "pr-8" : "pr-2"]) }, " * ", 2)) : _.showOptional ? (a(), f("div", sf, "(optional)")) : I("", !0) ], 2), z(u(Is), { leave: "transition ease-in duration-100", "leave-from": "opacity-100", "leave-to": "opacity-0", class: "relative px-0.5" }, { default: E(() => [ z(u(tl), { class: "absolute top-1 max-h-60 w-full overflow-auto simple-scrollbar rounded-md bg-foundation py-1 shadow label label--light outline outline-2 outline-primary-muted focus:outline-none" }, { default: E(() => [ R.value ? (a(), f("div", { key: 0, class: x(["px-1", Y.value.length ? "mb-1" : ""]) }, [ z(Ct, { loading: !0 }) ], 2)) : I("", !0), !Y.value.length && !R.value ? (a(), f("div", nf, [...W[7] || (W[7] = [ v("div", { class: "text-foreground-2 text-center" }, [ F(" Press "), v("strong", null, "Enter"), F(" to create tag âš¡ ") ], -1) ])])) : I("", !0), Y.value.length ? (a(!0), f(J, { key: 2 }, te(Y.value, (q) => (a(), A(u(sl), { key: q, as: "template", value: q }, { default: E(({ selected: fe, active: ve }) => [ v("li", { class: x(["relative cursor-pointer select-none py-1.5 pl-3", { "text-primary": ve, "text-foreground": !ve }]) }, [ v("span", { class: x(["block truncate", { "font-medium": fe, "font-normal": !fe }]) }, P(q), 3), fe ? (a(), f("span", { key: 0, class: x(["absolute top-0 bottom-0 right-0 flex items-center pr-4", { "text-primary": ve, "text-foreground": !ve }]) }, [ z(u(Et), { class: "h-5 w-5", "aria-hidden": "true" }) ], 2)) : I("", !0) ], 2) ]), _: 2 }, 1032, ["value"]))), 128)) : I("", !0) ]), _: 1 }) ]), _: 1 }), u(y) && !u(S) ? (a(), f("p", { key: 0, id: u(y), class: x(["mt-2", u(w)]) }, P(u(g)), 11, lf)) : I("", !0) ]), _: 1 }, 512) ]), _: 1 }, 8, ["modelValue", "class"])); } }); function Xt(e) { const { props: t } = e, s = h(() => { var d; switch ((d = t.size) == null ? void 0 : d.value) { case "2xs": return "h-4"; case "xs": return "h-5"; case "sm": return "h-6"; case "lg": return "h-10"; case "xl": return "h-14"; case "xxl": return "h-24"; case "3xl": return "h-32"; case "editable": return "h-60"; case "base": default: return "h-8"; } }), l = h(() => { var d; switch ((d = t.size) == null ? void 0 : d.value) { case "2xs": return "w-4"; case "xs": return "w-5"; case "sm": return "w-6"; case "lg": return "w-10"; case "xl": return "w-14"; case "xxl": return "w-24"; case "3xl": return "w-32"; case "editable": return "w-60"; case "base": default: return "w-8"; } }), r = h(() => { var d; switch ((d = t.size) == null ? void 0 : d.value) { case "2xs": case "xs": return "text-tiny"; case "sm": return "text-xs"; case "lg": return "text-md"; case "xl": return "text-2xl"; case "xxl": return "text-2xl"; case "3xl": return "text-3xl"; case "editable": return "h1"; case "base": default: return "text-body-2xs"; } }), n = h(() => { var d; switch ((d = t.size) == null ? void 0 : d.value) { case "2xs": case "xs": return "w-3 h-3"; case "sm": return "w-3 h-3"; case "lg": return "w-5 h-5"; case "xl": return "w-8 h-8"; case "xxl": return "w-10 h-10"; case "editable": return "w-20 h-20"; case "base": default: return "w-4 h-4"; } }), i = h( () => `${l.value} ${s.value} ${r.value}` ); return { heightClasses: s, widthClasses: l, sizeClasses: i, iconClasses: n }; } const of = { key: 2 }, Lt = /* @__PURE__ */ D({ __name: "Avatar", props: { user: { default: null }, size: { default: "base" }, hoverEffect: { type: Boolean, default: !1 }, active: { type: Boolean }, noBorder: { type: Boolean }, noBg: { type: Boolean }, hideTooltip: { type: Boolean }, rounded: { type: Boolean, default: !0 }, lightStyle: { type: Boolean, default: !1 } }, setup(e) { const t = e, { sizeClasses: s, iconClasses: l } = Xt({ props: Be(t) }), r = h(() => { var g, y, S, w; if (!((y = (g = t.user) == null ? void 0 : g.name) != null && y.length)) return; const m = t.user.name.split(" "), b = ((S = m[0]) == null ? void 0 : S[0]) || "", o = ((w = m[1]) == null ? void 0 : w[0]) || ""; return t.size === "sm" || t.size === "xs" ? b : b + o; }), n = h(() => t.noBorder ? "" : t.lightStyle ? "border border-outline-2" : "border border-foundation"), i = h(() => t.noBg ? "" : t.lightStyle ? "bg-foundation-2" : "bg-info-darker"), c = h(() => t.hoverEffect ? "hover:border-primary focus:border-primary active:scale-95" : ""), d = h(() => t.active ? "border-primary" : ""), p = h(() => t.lightStyle ? "text-foreground-3" : ""); return (m, b) => { const o = Qe("tippy"); return a(), f("div", { class: x([ "text-foreground-on-primary flex shrink-0 items-center justify-center overflow-hidden uppercase transition", m.rounded ? "rounded-full" : "rounded-md", u(s), i.value, n.value, c.value, d.value ]) }, [ H(m.$slots, "default", {}, () => { var g, y, S; return [ (g = m.user) != null && g.avatar ? Q((a(), f("div", { key: 0, class: "h-full w-full bg-cover bg-center bg-no-repeat", style: ae({ backgroundImage: `url('${m.user.avatar}')` }) }, null, 4)), [ [o, m.hideTooltip || (y = t.user) == null ? void 0 : y.name] ]) : r.value ? Q((a(), f("div", { key: 1, class: x([p.value, "flex h-full w-full select-none items-center justify-center"]) }, [ F(P(r.value), 1) ], 2)), [ [o, m.hideTooltip || (S = t.user) == null ? void 0 : S.name] ]) : (a(), f("div", of, [ z(u(rl), { class: x(u(l)) }, null, 8, ["class"]) ])) ]; }), H(m.$slots, "absolute-anchor") ], 2); }; } }), Hp = /* @__PURE__ */ D({ __name: "AvatarGroup", props: { users: { default: () => [] }, overlap: { type: Boolean, default: !0 }, size: { default: "base" }, maxCount: { default: void 0 }, hideTooltips: { type: Boolean, default: !1 }, maxAvatars: { default: void 0 }, onHiddenCountClick: { type: Function, default: void 0 } }, setup(e) { const t = e, s = j(null), l = j(null), { hiddenItemCount: r } = Hs({ elementToWatchForChanges: s, itemContainer: l, trackResize: !0, trackMutations: !0 }), { heightClasses: n } = Xt({ props: Be(t) }), i = h(() => t.maxCount ? Math.max(t.users.length - t.maxCount, 0) : 0), c = h(() => { const m = t.users, b = Math.min(t.maxCount ?? 1 / 0, t.maxAvatars ?? 1 / 0); return m.slice(0, b); }), d = h(() => t.maxAvatars ? Math.max(t.users.length - t.maxAvatars, 0) : 0), p = h( () => r.value + i.value + d.value ); return (m, b) => (a(), f("div", { ref_key: "elementToWatchForChanges", ref: s, class: x(`flex ${m.overlap ? "-space-x-2" : ""}`) }, [ v("div", { ref_key: "itemContainer", ref: l, class: x(`flex flex-wrap overflow-hidden ${m.overlap ? "-space-x-2 " : ""} ${u(n)}`) }, [ (a(!0), f(J, null, te(c.value, (o, g) => (a(), A(Lt, { key: o.id || g, user: o, size: m.size, "hide-tooltip": m.hideTooltips }, null, 8, ["user", "size", "hide-tooltip"]))), 128)) ], 2), p.value ? (a(), A(Lt, { key: 0, size: m.size, class: x(["select-none", { "cursor-pointer": !!m.onHiddenCountClick }]), onClick: b[0] || (b[0] = (o) => m.onHiddenCountClick && m.onHiddenCountClick()) }, { default: E(() => [ F(" +" + P(p.value), 1) ]), _: 1 }, 8, ["size", "class"])) : I("", !0) ], 2)); } }), af = /* @__PURE__ */ D({ __name: "Icon", props: { loading: { type: Boolean, default: !0 }, size: { default: "base" } }, setup(e) { const t = e, s = h(() => { const l = [""]; switch (l.push(t.loading ? "opacity-100" : "opacity-0"), t.size) { case "base": l.push("h-5 w-5"); break; case "sm": l.push("h-4 w-4"); break; case "lg": l.push("h-8 w-8"); break; } return l.join(" "); }); return (l, r) => (a(), f("svg", { class: x(["spinner", s.value]), width: "32px", height: "40px", viewBox: "0 0 66 66", xmlns: "http://www.w3.org/2000/svg" }, [...r[0] || (r[0] = [ v("circle", { class: "path", fill: "none", stroke: "currentColor", "stroke-width": "6", "stroke-linecap": "round", cx: "33", cy: "33", r: "30" }, null, -1) ])], 2)); } }); const ct = /* @__PURE__ */ me(af, [["__scopeId", "data-v-d0434356"]]), rf = { class: "flex flex-col items-center space-y-2" }, uf = { key: 1, class: "relative group" }, df = ["src", "alt"], cf = { class: "opacity-0 transition-all absolute group-hover:opacity-100 top-0 right-0 left-0 bottom-0 flex items-end justify-center bottom-4" }, ff = { key: 2, class: "w-full text-center text-danger text-sm" }, Up = /* @__PURE__ */ D({ __name: "AvatarEditable", props: /* @__PURE__ */ Ce({ modelValue: {}, placeholder: {}, name: {}, rules: {}, validateOnMount: { type: Boolean }, validateOnValueUpdate: { type: Boolean }, disabled: { type: Boolean }, size: {}, defaultImg: {}, rounded: { type: Boolean, default: !0 }, lightStyle: { type: Boolean, default: !1 } }, { editMode: { type: Boolean }, editModeModifiers: {} }), emits: /* @__PURE__ */ Ce(["save", "update:modelValue"], ["update:editMode"]), setup(e, { expose: t, emit: s }) { const l = on({ loader: () => import("/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/AvatarEditor-b3722ced.js"), loadingComponent: ct, delay: 100 }), r = s, n = e, { value: i, errorMessage: c } = De(n.name, n.rules, { validateOnMount: n.validateOnMount, validateOnValueUpdate: n.validateOnValueUpdate, initialValue: n.modelValue || void 0 }), { sizeClasses: d } = Xt({ props: Be(n) }), p = ke(e, "editMode"), m = h( () => ({ avatar: i.value, name: n.placeholder }) ), b = (y) => { i.value = y, r("save", y); }; return t({ open: () => p.value = !0, close: () => p.value = !1 }), (y, S) => (a(), f("div", rf, [ p.value ? (a(), A(u(l), { key: 0, user: m.value, disabled: y.disabled, size: y.size, rounded: y.rounded, onCancel: S[0] || (S[0] = (w) => p.value = !1), onSave: b }, null, 8, ["user", "disabled", "size", "rounded"])) : (a(), f("div", uf, [ !m.value.avatar && y.defaultImg ? (a(), f("img", { key: 0, src: y.defaultImg, alt: m.value.name, class: x(u(d)) }, null, 10, df)) : (a(), A(Lt, { key: 1, "hide-tooltip": "", user: m.value, size: y.size, "light-style": y.lightStyle, rounded: y.rounded }, null, 8, ["user", "size", "light-style", "rounded"])), v("div", cf, [ z(pe, { size: "sm", disabled: y.disabled, color: "outline", onClick: S[1] || (S[1] = (w) => p.value = !0) }, { default: E(() => [...S[2] || (S[2] = [ F(" Change ", -1) ])]), _: 1 }, 8, ["disabled"]) ]) ])), u(c) ? (a(), f("div", ff, P(u(c)), 1)) : I("", !0) ])); } }); class ze extends Error { constructor(t, s) { t || (t = new.target.defaultMessage), super(t, s); } } /** * Default message if none is passed */ Se(ze, "defaultMessage", "Unexpected error occurred"); class pf extends ze { } Se(pf, "defaultMessage", "An unexpected logic error occurred!"); class mf extends ze { } Se(mf, "defaultMessage", "Attempting to access an uninitialized resource"); class hf extends ze { } Se(hf, "defaultMessage", "getCurrentInstance() returned null. Method must be called at the top of a setup function"); class vf extends ze { } Se(vf, "defaultMessage", "Operation not supported in current (server or client) environment"); var Zt = /* @__PURE__ */ ((e) => (e.AnyAudio = "audio/*", e.AnyVideo = "video/*", e.AnyImage = "image/*", e))(Zt || {}); function bf(e, t) { const s = mr( Object.values(Zt), t ); for (const n of s) switch (n) { case "audio/*": if (e.type.startsWith("audio")) return !0; break; case "image/*": if (e.type.startsWith("image")) return !0; break; case "video/*": if (e.type.startsWith("video")) return !0; break; } const l = lr(t, s), r = gf(e.name); if (!r) return new Ks(); for (const n of l) if (n.toLowerCase() === r.toLowerCase()) return !0; return new Gs(); } function gf(e) { const t = e.split("."); if (t.length < 2) return null; const s = t.pop() || null; return s ? `.${s}` : null; } function yf(e) { return e.startsWith(".") || Object.values(Zt).includes(e); } function vs(e) { const t = (n) => parseFloat(n.toFixed(2)).toString(); if (e < 1024) return `${e}bytes`; const s = e / 1024; if (s < 1024) return `${t(s)}KB`; const l = s / 1024; if (l < 1024) return `${t(l)}MB`; const r = l / 1024; return `${t(r)}GB`; } function xf(e) { const t = { name: e.name, lastModified: e.lastModified, size: e.size, type: e.type }; return bn(JSON.stringify(t)); } class Ks extends ze { } Se(Ks, "defaultMessage", "The selected file has a missing extension"); class Gs extends ze { } Se(Gs, "defaultMessage", "The selected file type is forbidden"); function wf(e) { if (!e) return; const t = e.split(",").map((s) => yf(s) ? s : null).filter((s) => s !== null); return t.length ? t : void 0; } function kf(e) { const { disabled: t, accept: s, multiple: l, sizeLimit: r, countLimit: n } = e, i = h(() => wf(u(s))), c = (d) => { const p = [], m = i.value; for (const b of d) { const o = xf(b), g = u(l) ? u(n) : 1; if (!p.find((y) => y.id === o)) { if (g && p.length >= g) break; if (m) { const y = bf(b, m); if (y instanceof Error) { p.push({ file: b, id: o, error: y }); continue; } } if (b.size > u(r)) { p.push({ file: b, id: o, error: new Xs( `The selected file's size (${vs( b.size )}) is too big (over ${vs(u(r))})` ) }); continue; } p.push({ file: b, id: o, error: null }); } } return p; }; return { /** * Validate incoming files and build UploadableFileItem structs out of them */ buildUploadableFiles: (d) => { if (!u(t || !1)) return c(d); } }; } class Xs extends ze { } Se(Xs, "defaultMessage", "The selected file's size is too large"); const Cf = ["accept", "multiple"], Wp = /* @__PURE__ */ D({ __name: "Zone", props: { accept: {}, multiple: { type: Boolean }, sizeLimit: { default: 1024 * 1024 * 100 }, countLimit: {}, disabled: { type: Boolean } }, emits: ["files-selected"], setup(e, { expose: t, emit: s }) { const l = s, r = e, n = j(null), i = j(null), { buildUploadableFiles: c } = kf({ sizeLimit: h(() => r.sizeLimit), countLimit: h(() => r.countLimit), accept: h(() => r.accept), multiple: h(() => r.multiple), disabled: h(() => r.disabled) }), d = (o) => { const g = c(o); g != null && g.length && l("files-selected", { files: g }); }, { isOverDropZone: p } = Rn(n, (o) => { o != null && o.length && d(o); }), m = () => { const o = i.value; if (!o) return; const g = [...o.files || []]; o.value = "", g.length && d(g); }, b = () => { var o; (o = i.value) == null || o.click(); }; return t({ triggerPicker: b }), (o, g) => (a(), f("div", { ref_key: "fileUploadZone", ref: n, class: "file-upload-zone" }, [ H(o.$slots, "default", { isDraggingFiles: u(p), openFilePicker: b, activatorOn: { click: b } }), v("input", { ref_key: "fileInput", ref: i, type: "file", class: "hidden", accept: o.accept, multiple: o.multiple, onClick: g[0] || (g[0] = ge(() => { }, ["stop"])), onChange: m }, null, 40, Cf) ], 512)); } }), bs = (e) => { var t; e.code === "Enter" && ((t = e.target) == null || t.click()); }, $f = { created(e) { e.setAttribute("tabindex", "0"), e.addEventListener("keypress", bs); }, unmounted(e) { e.removeEventListener("keypress", bs); } }, If = { class: "relative w-full bg-outline-3 rounded h-1.5 overflow-hidden" }, Np = /* @__PURE__ */ D({ __name: "ProgressBar", props: { currentValue: {}, maxValue: {} }, setup(e) { const t = e, s = h(() => t.currentValue / t.maxValue * 100), l = h(() => s.value >= 100 ? "bg-danger" : s.value >= 80 ? "bg-warning" : "bg-success"); return (r, n) => (a(), f("div", If, [ v("div", { class: x(["aboslute left-0 top-0 rounded h-1.5", l.value]), style: ae({ width: `${s.value <= 100 ? s.value : 100}%` }) }, null, 6) ])); } }), Bf = { class: "bg-foundation-page shadow-sm flex flex-col gap-y-1 sm:gap-y-2 border border-outline-3 rounded-lg py-2 px-3 sm:p-4 select-none" }, Sf = { class: "flex justify-between items-center" }, Pf = { key: 0, class: "text-body-xs sm:text-heading-sm font-medium text-foreground" }, Tf = { key: 0, class: "text-body-2xs sm:text-body-xs text-foreground-2 !leading-5" }, Of = { class: "flex justify-end" }, qp = /* @__PURE__ */ D({ __name: "PromoAlert", props: { title: {}, text: {}, button: {}, showCloser: { type: Boolean } }, emits: ["click", "close"], setup(e) { return (t, s) => (a(), f("div", Bf, [ v("div", Sf, [ t.title ? (a(), f("h6", Pf, P(t.title), 1)) : I("", !0), t.showCloser ? Q((a(), A(u(ys), { key: 1, class: "h-4 w-4 cursor-pointer focus:outline-none", onClick: s[0] || (s[0] = (l) => t.$emit("close", l)) }, null, 512)), [ [u($f)] ]) : I("", !0) ]), t.text ? (a(), f("p", Tf, P(t.text), 1)) : I("", !0), v("div", Of, [ t.button ? (a(), A(pe, { key: 0, size: "sm", class: "mt-1", to: t.button.to, target: t.button.to ? "_blank" : void 0, onClick: s[1] || (s[1] = (l) => t.$emit("click", l)) }, { default: E(() => [ F(P(t.button.title), 1) ]), _: 1 }, 8, ["to", "target"])) : I("", !0) ]) ])); } }), Mf = { key: 0, class: "flex items-center justify-between" }, jf = ["for"], Af = ["min", "max", "step", "value", "disabled", "aria-label"], Lf = ["id", "name", "min", "max", "step", "value", "disabled", "aria-label", "aria-valuemin", "aria-valuemax", "aria-valuenow"], Vf = ["min", "max", "step", "value", "disabled", "aria-label"], zf = /* @__PURE__ */ D({ __name: "Range", props: /* @__PURE__ */ Ce({ min: {}, max: {}, step: {}, name: {}, label: {}, disabled: { type: Boolean }, hideHeader: { type: Boolean }, inputBelowSlider: { type: Boolean }, style: {} }, { modelValue: { type: Number, default: 0 }, modelModifiers: {} }), emits: /* @__PURE__ */ Ce(["update:modelValue"], ["update:modelValue"]), setup(e, { emit: t }) { const s = e, l = t, r = ke(e, "modelValue"), n = (p) => Math.max(s.min, Math.min(s.max, p)), i = (p) => { const m = p.target, b = Number(m.value), o = n(b); r.value = o, l("update:modelValue", o); }, c = (p) => { const m = p.target, b = Number(m.value); r.value = b, l("update:modelValue", b); }, d = (p) => { const m = p.target, b = Number(m.value), o = n(b); b !== o && (m.value = o.toString()), r.value = o, l("update:modelValue", o); }; return (p, m) => (a(), f("div", { class: "w-full flex flex-col gap-1.5", style: ae(s.style) }, [ p.hideHeader ? I("", !0) : (a(), f("div", Mf, [ v("label", { for: p.name, class: x(["block text-body-2xs", p.disabled ? "text-foreground-2" : "text-foreground"]) }, P(p.label || p.name), 11, jf), v("input", { type: "number", min: p.min, max: p.max, step: p.step, value: r.value, disabled: p.disabled, "aria-label": `${p.label} current value`, class: "w-8 text-body-2xs text-foreground-2 bg-transparent border-0 focus:outline-none hover:ring-1 hover:ring-outline-2 focus:ring-1 focus:ring-outline-4 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:ring-0 rounded !p-0.5 text-right", onInput: c, onBlur: d }, null, 40, Af) ])), v("input", { id: p.name, name: p.name, type: "range", min: p.min, max: p.max, step: p.step, value: r.value, disabled: p.disabled, class: x(["mt-1.5 w-full h-4 outline-none slider slider-gradient", { "disabled:opacity-50 disabled:cursor-not-allowed": p.disabled, "!mt-0": p.inputBelowSlider }]), "aria-label": p.label, "aria-valuemin": p.min, "aria-valuemax": p.max, "aria-valuenow": r.value, onInput: i }, null, 42, Lf), p.inputBelowSlider ? (a(), f("input", { key: 1, type: "number", min: p.min, max: p.max, step: p.step, value: r.value, disabled: p.disabled, "aria-label": `${p.label} current value`, class: "w-16 text-body-2xs text-foreground-2 bg-transparent border-0 focus:outline-none hover:ring-1 hover:ring-outline-2 focus:ring-1 focus:ring-outline-4 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:ring-0 rounded !p-1", onInput: c, onBlur: d }, null, 40, Vf)) : I("", !0) ], 4)); } }); const Kp = /* @__PURE__ */ me(zf, [["__scopeId", "data-v-0d310a20"]]), Ef = { class: "relative" }, Rf = ["id", "name", "min", "max", "step", "value", "disabled", "aria-label", "aria-valuemin", "aria-valuemax", "aria-valuenow"], Ff = ["id", "name", "min", "max", "step", "value", "disabled", "aria-label", "aria-valuemin", "aria-valuemax", "aria-valuenow"], Df = { class: "absolute top-0.5 h-3 w-full pointer-events-none z-0 overflow-hidden", style: { background: "transparent" } }, _f = { key: 0, class: "flex justify-between gap-2 mt-0.5" }, Hf = ["min", "max", "step", "disabled", "aria-label"], Uf = ["min", "max", "step", "disabled", "aria-label"], Wf = /* @__PURE__ */ D({ __name: "DualRange", props: /* @__PURE__ */ Ce({ min: {}, max: {}, step: {}, name: {}, disabled: { type: Boolean }, showFields: { type: Boolean }, style: {} }, { modelValue: { default: () => ({ min: 0, max: 100 }) }, modelModifiers: {} }), emits: ["update:modelValue"], setup(e) { const t = e, s = ke(e, "modelValue"), l = (o) => Math.max(t.min, Math.min(t.max, o)), r = h({ get: () => s.value.min.toString(), set: (o) => { const g = Number(o); if (!isNaN(g)) { const y = l(g), S = Math.min(y, s.value.max); s.value = { ...s.value, min: S }; } } }), n = h({ get: () => s.value.max.toString(), set: (o) => { const g = Number(o); if (!isNaN(g)) { const y = l(g), S = Math.max(y, s.value.min); s.value = { ...s.value, max: S }; } } }), i = h(() => { const o = (s.value.min - t.min) / (t.max - t.min) * 100; return Math.max(0, o - 0.5); }), c = h(() => { const o = (s.value.max - t.min) / (t.max - t.min) * 100; return Math.min(100, o + 0.5); }), d = h(() => { const o = i.value; return o < 25 ? `${o + 2.5}%` : o > 75 ? `${o - 2.5}%` : `${o}%`; }), p = h(() => { const o = 100 - c.value; return o < 25 ? `${o + 2.5}%` : o > 75 ? `${o - 2.5}%` : `${o}%`; }), m = (o) => { const g = o.target, y = l(Number(g.value)); s.value = { ...s.value, min: Math.min(y, s.value.max) }; }, b = (o) => { const g = o.target, y = l(Number(g.value)); s.value = { ...s.value, max: Math.max(y, s.value.min) }; }; return (o, g) => (a(), f("div", null, [ v("div", { class: "w-full h-5 max-w-96", style: ae(t.style) }, [ v("div", Ef, [ v("input", { id: `${o.name}-min`, name: `${o.name}-min`, type: "range", min: o.min, max: o.max, step: o.step, value: s.value.min, disabled: o.disabled, class: x(["absolute w-full h-4 outline-none slider slider-min", { "disabled:opacity-50 disabled:cursor-not-allowed": o.disabled }]), style: { "-webkit-appearance": "none", appearance: "none", "pointer-events": "none" }, "aria-label": `${o.name} minimum`, "aria-valuemin": o.min, "aria-valuemax": o.max, "aria-valuenow": s.value.min, onInput: m }, null, 42, Rf), v("input", { id: `${o.name}-max`, name: `${o.name}-max`, type: "range", min: o.min, max: o.max, step: o.step, value: s.value.max, disabled: o.disabled, class: x(["absolute w-full h-4 outline-none slider slider-max px-0.5", { "disabled:opacity-50 disabled:cursor-not-allowed": o.disabled }]), style: { "-webkit-appearance": "none", appearance: "none", "pointer-events": "none" }, "aria-label": `${o.name} maximum`, "aria-valuemin": o.min, "aria-valuemax": o.max, "aria-valuenow": s.value.max, onInput: b }, null, 42, Ff), v("div", Df, [ v("div", { class: "absolute inset-0 bg-gray-300/60 dark:bg-gray-200/40", style: ae({ left: d.value, right: p.value }) }, null, 4) ]) ]) ], 4), o.showFields ? (a(), f("div", _f, [ Q(v("input", { "onUpdate:modelValue": g[0] || (g[0] = (y) => r.value = y), type: "number", min: o.min, max: o.max, step: o.step, disabled: o.disabled, "aria-label": `${o.name}-min`, placeholder: "Min", class: "mt-0 w-16 text-body-2xs text-foreground-2 bg-transparent border-0 focus:outline-none hover:ring-1 hover:ring-outline-2 focus:ring-1 focus:ring-outline-4 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:ring-0 rounded !p-1" }, null, 8, Hf), [ [Ke, r.value] ]), Q(v("input", { "onUpdate:modelValue": g[1] || (g[1] = (y) => n.value = y), type: "number", min: o.min, max: o.max, step: o.step, disabled: o.disabled, "aria-label": `${o.name}-max`, placeholder: "Max", class: "mt-0 w-16 text-body-2xs text-foreground-2 bg-transparent border-0 focus:outline-none hover:ring-1 hover:ring-outline-2 focus:ring-1 focus:ring-outline-4 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:ring-0 rounded !p-1 text-right" }, null, 8, Uf), [ [Ke, n.value] ]) ])) : I("", !0) ])); } }); const Gp = /* @__PURE__ */ me(Wf, [["__scopeId", "data-v-c6f0cbc2"]]); export { ze as BaseError, Fp as CommonAlert, rp as CommonAnimationInstructional, nt as CommonBadge, Ct as CommonLoadingBar, ct as CommonLoadingIcon, Np as CommonProgressBar, qp as CommonPromoAlert, ap as CommonStepsBullet, op as CommonStepsNumber, Br as CommonTextLink, ip as CommonVimeoEmbed, hf as ComposableInvokedOutOfScopeError, Xs as FileTooLargeError, Gs as ForbiddenFileTypeError, pe as FormButton, up as FormCardButton, _i as FormCheckbox, yp as FormClipboardInput, xp as FormCodeInput, Gp as FormDualRange, Wp as FormFileUploadZone, dp as FormRadio, cp as FormRadioGroup, Kp as FormRange, vp as FormSelectBadges, Ns as FormSelectBase, bp as FormSelectMulti, hp as FormSelectSourceApps, gp as FormSwitch, _p as FormTags, fp as FormTextArea, Gt as FormTextInput, lp as GlobalToastRenderer, Ne as GridListToggleValue, ut as HorizontalDirection, jp as InfiniteLoading, $p as LayoutDialog, Ip as LayoutDialogSection, Bp as LayoutDisclosure, Sp as LayoutGridListToggle, Pp as LayoutMenu, Ap as LayoutPanel, Lp as LayoutSidebar, zp as LayoutSidebarMenu, Ep as LayoutSidebarMenuGroup, Rp as LayoutSidebarMenuGroupItem, Vp as LayoutSidebarPromo, Mp as LayoutTable, Tp as LayoutTabsHorizontal, Op as LayoutTabsVertical, pf as LogicError, Ks as MissingFileExtensionError, rt as ModifierKeys, Qu as SourceAppBadge, ot as TailwindBreakpoints, Lu as ThrottleOrDebounce, We as ToastNotificationType, mf as UninitializedResourceAccessError, Zt as UniqueFileTypeSpecifier, vf as UnsupportedEnvironmentError, Lt as UserAvatar, Up as UserAvatarEditable, Hp as UserAvatarGroup, pp as ValidationHelpers, Jp as buildManualPromise, At as clientOs, xf as generateFileId, wp as getKeyboardShortcutTitle, Fs as keyboardClick, kp as onKeyboardShortcut, vs as prettyFileSize, gf as resolveFileExtension, Xt as useAvatarSizeClasses, ru as useDebouncedTextInput, Cp as useFormCheckboxModel, Us as useFormSelectChildInternals, mp as useOnBeforeWindowUnload, zu as useResponsiveHorizontalDirectionCalculation, Vu as useWindowResizeHandler, Hs as useWrappingContainerHiddenCount, $f as vKeyboardClickable, Dp as writableAsyncComputed }; //# sourceMappingURL=data:application/json;base64,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QTFzQjtBQUFBLFVBQ3ZCLE1BQUs7QUFBQSxVQUNKLEtBQUtxc0IsRUFBRztBQUFBLFVBQ1IsS0FBS0MsRUFBRztBQUFBLFVBQ1IsTUFBTXRyQixFQUFJO0FBQUEsVUFDVixVQUFVZ0UsRUFBUTtBQUFBLFVBQ2xCLGlCQUFlc0UsRUFBSTtBQUFBLFVBQ3BCLGFBQVk7QUFBQSxVQUNaLE9BQU07QUFBQTtlQVJHb2pCLEVBQWM7QUFBQSIsIm5hbWVzIjpbImZyZWVHbG9iYWwiLCJmcmVlR2xvYmFsJDEiLCJmcmVlU2VsZiIsInJvb3QiLCJyb290JDEiLCJTeW1ib2wiLCJTeW1ib2wkMiIsIm9iamVjdFByb3RvIiwiaGFzT3duUHJvcGVydHkiLCJuYXRpdmVPYmplY3RUb1N0cmluZyIsInN5bVRvU3RyaW5nVGFnIiwiZ2V0UmF3VGFnIiwidmFsdWUiLCJpc093biIsInRhZyIsInVubWFza2VkIiwicmVzdWx0Iiwib2JqZWN0VG9TdHJpbmciLCJudWxsVGFnIiwidW5kZWZpbmVkVGFnIiwiYmFzZUdldFRhZyIsImlzT2JqZWN0TGlrZSIsInN5bWJvbFRhZyIsImlzU3ltYm9sIiwiYXJyYXlNYXAiLCJhcnJheSIsIml0ZXJhdGVlIiwiaW5kZXgiLCJsZW5ndGgiLCJpc0FycmF5IiwiaXNBcnJheSQxIiwicmVXaGl0ZXNwYWNlIiwidHJpbW1lZEVuZEluZGV4Iiwic3RyaW5nIiwicmVUcmltU3RhcnQiLCJiYXNlVHJpbSIsImlzT2JqZWN0IiwidHlwZSIsIk5BTiIsInJlSXNCYWRIZXgiLCJyZUlzQmluYXJ5IiwicmVJc09jdGFsIiwiZnJlZVBhcnNlSW50IiwidG9OdW1iZXIiLCJvdGhlciIsImlzQmluYXJ5IiwiSU5GSU5JVFkiLCJNQVhfSU5URUdFUiIsInRvRmluaXRlIiwic2lnbiIsInRvSW50ZWdlciIsInJlbWFpbmRlciIsImlkZW50aXR5IiwiYXN5bmNUYWciLCJmdW5jVGFnIiwiZ2VuVGFnIiwicHJveHlUYWciLCJpc0Z1bmN0aW9uIiwiY29yZUpzRGF0YSIsImNvcmVKc0RhdGEkMSIsIm1hc2tTcmNLZXkiLCJ1aWQiLCJpc01hc2tlZCIsImZ1bmMiLCJmdW5jUHJvdG8iLCJmdW5jVG9TdHJpbmciLCJ0b1NvdXJjZSIsInJlUmVnRXhwQ2hhciIsInJlSXNIb3N0Q3RvciIsInJlSXNOYXRpdmUiLCJiYXNlSXNOYXRpdmUiLCJwYXR0ZXJuIiwiZ2V0VmFsdWUiLCJvYmplY3QiLCJrZXkiLCJnZXROYXRpdmUiLCJhcHBseSIsInRoaXNBcmciLCJhcmdzIiwibm9vcCIsIkhPVF9DT1VOVCIsIkhPVF9TUEFOIiwibmF0aXZlTm93Iiwic2hvcnRPdXQiLCJjb3VudCIsImxhc3RDYWxsZWQiLCJzdGFtcCIsInJlbWFpbmluZyIsImNvbnN0YW50IiwiZGVmaW5lUHJvcGVydHkiLCJkZWZpbmVQcm9wZXJ0eSQxIiwiYmFzZVNldFRvU3RyaW5nIiwiYmFzZVNldFRvU3RyaW5nJDEiLCJzZXRUb1N0cmluZyIsInNldFRvU3RyaW5nJDEiLCJiYXNlRmluZEluZGV4IiwicHJlZGljYXRlIiwiZnJvbUluZGV4IiwiZnJvbVJpZ2h0IiwiYmFzZUlzTmFOIiwic3RyaWN0SW5kZXhPZiIsImJhc2VJbmRleE9mIiwiYXJyYXlJbmNsdWRlcyIsIk1BWF9TQUZFX0lOVEVHRVIiLCJyZUlzVWludCIsImlzSW5kZXgiLCJlcSIsIm5hdGl2ZU1heCIsIm92ZXJSZXN0Iiwic3RhcnQiLCJ0cmFuc2Zvcm0iLCJvdGhlckFyZ3MiLCJiYXNlUmVzdCIsImlzTGVuZ3RoIiwiaXNBcnJheUxpa2UiLCJpc1Byb3RvdHlwZSIsIkN0b3IiLCJwcm90byIsImJhc2VUaW1lcyIsIm4iLCJhcmdzVGFnIiwiYmFzZUlzQXJndW1lbnRzIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJpc0FyZ3VtZW50cyIsImlzQXJndW1lbnRzJDEiLCJzdHViRmFsc2UiLCJmcmVlRXhwb3J0cyIsImZyZWVNb2R1bGUiLCJtb2R1bGVFeHBvcnRzIiwiQnVmZmVyIiwibmF0aXZlSXNCdWZmZXIiLCJpc0J1ZmZlciIsImlzQnVmZmVyJDEiLCJhcnJheVRhZyIsImJvb2xUYWciLCJkYXRlVGFnIiwiZXJyb3JUYWciLCJtYXBUYWciLCJudW1iZXJUYWciLCJvYmplY3RUYWciLCJyZWdleHBUYWciLCJzZXRUYWciLCJzdHJpbmdUYWciLCJ3ZWFrTWFwVGFnIiwiYXJyYXlCdWZmZXJUYWciLCJkYXRhVmlld1RhZyIsImZsb2F0MzJUYWciLCJmbG9hdDY0VGFnIiwiaW50OFRhZyIsImludDE2VGFnIiwiaW50MzJUYWciLCJ1aW50OFRhZyIsInVpbnQ4Q2xhbXBlZFRhZyIsInVpbnQxNlRhZyIsInVpbnQzMlRhZyIsInR5cGVkQXJyYXlUYWdzIiwiYmFzZUlzVHlwZWRBcnJheSIsImJhc2VVbmFyeSIsImZyZWVQcm9jZXNzIiwibm9kZVV0aWwiLCJ0eXBlcyIsIm5vZGVVdGlsJDEiLCJub2RlSXNUeXBlZEFycmF5IiwiaXNUeXBlZEFycmF5IiwiaXNUeXBlZEFycmF5JDEiLCJhcnJheUxpa2VLZXlzIiwiaW5oZXJpdGVkIiwiaXNBcnIiLCJpc0FyZyIsImlzQnVmZiIsImlzVHlwZSIsInNraXBJbmRleGVzIiwib3ZlckFyZyIsImFyZyIsIm5hdGl2ZUtleXMiLCJuYXRpdmVLZXlzJDEiLCJiYXNlS2V5cyIsImtleXMiLCJuYXRpdmVDcmVhdGUiLCJuYXRpdmVDcmVhdGUkMSIsImhhc2hDbGVhciIsImhhc2hEZWxldGUiLCJIQVNIX1VOREVGSU5FRCIsImhhc2hHZXQiLCJkYXRhIiwiaGFzaEhhcyIsImhhc2hTZXQiLCJIYXNoIiwiZW50cmllcyIsImVudHJ5IiwibGlzdENhY2hlQ2xlYXIiLCJhc3NvY0luZGV4T2YiLCJhcnJheVByb3RvIiwic3BsaWNlIiwibGlzdENhY2hlRGVsZXRlIiwibGFzdEluZGV4IiwibGlzdENhY2hlR2V0IiwibGlzdENhY2hlSGFzIiwibGlzdENhY2hlU2V0IiwiTGlzdENhY2hlIiwiTWFwIiwiTWFwJDEiLCJtYXBDYWNoZUNsZWFyIiwiaXNLZXlhYmxlIiwiZ2V0TWFwRGF0YSIsIm1hcCIsIm1hcENhY2hlRGVsZXRlIiwibWFwQ2FjaGVHZXQiLCJtYXBDYWNoZUhhcyIsIm1hcENhY2hlU2V0Iiwic2l6ZSIsIk1hcENhY2hlIiwiYXJyYXlQdXNoIiwidmFsdWVzIiwib2Zmc2V0Iiwic3ByZWFkYWJsZVN5bWJvbCIsImlzRmxhdHRlbmFibGUiLCJiYXNlRmxhdHRlbiIsImRlcHRoIiwiaXNTdHJpY3QiLCJiYXNlQ2xhbXAiLCJudW1iZXIiLCJsb3dlciIsInVwcGVyIiwiY2xhbXAiLCJTZXQiLCJTZXQkMSIsInNldENhY2hlQWRkIiwic2V0Q2FjaGVIYXMiLCJTZXRDYWNoZSIsImNhY2hlSGFzIiwiY2FjaGUiLCJzZXRUb0FycmF5Iiwic2V0Iiwibm93Iiwibm93JDEiLCJGVU5DX0VSUk9SX1RFWFQiLCJuYXRpdmVNaW4iLCJkZWJvdW5jZSIsIndhaXQiLCJvcHRpb25zIiwibGFzdEFyZ3MiLCJsYXN0VGhpcyIsIm1heFdhaXQiLCJ0aW1lcklkIiwibGFzdENhbGxUaW1lIiwibGFzdEludm9rZVRpbWUiLCJsZWFkaW5nIiwibWF4aW5nIiwidHJhaWxpbmciLCJpbnZva2VGdW5jIiwidGltZSIsImxlYWRpbmdFZGdlIiwidGltZXJFeHBpcmVkIiwicmVtYWluaW5nV2FpdCIsInRpbWVTaW5jZUxhc3RDYWxsIiwidGltZVNpbmNlTGFzdEludm9rZSIsInRpbWVXYWl0aW5nIiwic2hvdWxkSW52b2tlIiwidHJhaWxpbmdFZGdlIiwiY2FuY2VsIiwiZmx1c2giLCJkZWJvdW5jZWQiLCJpc0ludm9raW5nIiwiaXNBcnJheUxpa2VPYmplY3QiLCJhcnJheUluY2x1ZGVzV2l0aCIsImNvbXBhcmF0b3IiLCJMQVJHRV9BUlJBWV9TSVpFIiwiYmFzZURpZmZlcmVuY2UiLCJpbmNsdWRlcyIsImlzQ29tbW9uIiwidmFsdWVzTGVuZ3RoIiwib3V0ZXIiLCJjb21wdXRlZCIsInZhbHVlc0luZGV4IiwiZGlmZmVyZW5jZSIsImRpZmZlcmVuY2UkMSIsImlzU3RyaW5nIiwiYmFzZVZhbHVlcyIsInByb3BzIiwiY29sbGVjdGlvbiIsImd1YXJkIiwiYmFzZUludGVyc2VjdGlvbiIsImFycmF5cyIsIm90aExlbmd0aCIsIm90aEluZGV4IiwiY2FjaGVzIiwibWF4TGVuZ3RoIiwic2VlbiIsImNhc3RBcnJheUxpa2VPYmplY3QiLCJpbnRlcnNlY3Rpb24iLCJtYXBwZWQiLCJpbnRlcnNlY3Rpb24kMSIsImlzQm9vbGVhbiIsImlzTnVtYmVyIiwiaXNVbmRlZmluZWQiLCJ0aHJvdHRsZSIsImNyZWF0ZVNldCIsImNyZWF0ZVNldCQxIiwiYmFzZVVuaXEiLCJzZWVuSW5kZXgiLCJ1bmlxIiwiZW1pdCIsIl9fZW1pdCIsIl9fcHJvcHMiLCJOdXh0TGluayIsInJlc29sdmVEeW5hbWljQ29tcG9uZW50IiwiUm91dGVyTGluayIsImxpbmtDb21wb25lbnQiLCJidXR0b25UeXBlIiwiaXNEaXNhYmxlZCIsImZpbmFsTGVmdEljb24iLCJDb21tb25Mb2FkaW5nSWNvbiIsImJnQW5kQm9yZGVyQ2xhc3NlcyIsImNsYXNzUGFydHMiLCJjb2xvcnNCZ0JvcmRlciIsInNpemVDbGFzc2VzIiwicGFkZGluZ0NsYXNzZXMiLCJoYXNJY29uTGVmdCIsImhhc0ljb25SaWdodCIsImhpZGVUZXh0IiwiZ2VuZXJhbENsYXNzZXMiLCJiYXNlQ2xhc3NlcyIsImFkZGl0aW9uYWxDbGFzc2VzIiwiYnV0dG9uQ2xhc3NlcyIsImljb25DbGFzc2VzIiwib25DbGljayIsImUiLCJfY3JlYXRlQmxvY2siLCJfcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQiLCJ0byIsImV4dGVybmFsIiwiX25vcm1hbGl6ZVN0eWxlIiwiY29sb3IiLCJ0ZXh0IiwiX29wZW5CbG9jayIsIl9yZW5kZXJTbG90IiwiX2N0eCIsImljb25SaWdodCIsImxvYWRpbmciLCJGb3JtQnV0dG9uIiwiVG9hc3ROb3RpZmljYXRpb25UeXBlIiwiVG9hc3ROb3RpZmljYXRpb25UeXBlMiIsImRpc21pc3MiLCJvbkN0YUNsaWNrIiwiX2MiLCJfYiIsIl9hIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9ob2lzdGVkXzEiLCJfY3JlYXRlRWxlbWVudFZOb2RlIiwiX2hvaXN0ZWRfMiIsIl9jcmVhdGVWTm9kZSIsIl9UcmFuc2l0aW9uIiwibm90aWZpY2F0aW9uIiwiX2hvaXN0ZWRfMyIsIl9ob2lzdGVkXzQiLCJfdW5yZWYiLCJDaXJjbGVDaGVjayIsIkNpcmNsZVgiLCJBbGVydENpcmNsZSIsIkluZm8iLCJfaG9pc3RlZF81IiwiX2hvaXN0ZWRfNiIsIl9ob2lzdGVkXzciLCJfaG9pc3RlZF84IiwiVGV4dExpbmsiLCJYIiwiX2NhY2hlIiwiS0VZQk9BUkRfQ0xJQ0tfQ0hBUiIsImtleWJvYXJkQ2xpY2siLCJjYiIsImJhZGdlQ29sb3JDbGFzc2VzIiwiYmFkZ2VEb3RJY29uQ29sb3JDbGFzc2VzIiwiYmFkZ2VDbGFzc2VzIiwiZG90Q2xhc3NlcyIsIm9uSWNvbkNsaWNrIiwiZG90IiwiaWNvbkxlZnQiLCIkZXZlbnQiLCJqdW5rVmFyaWFibGUiLCJtYXJrQ2xhc3Nlc1VzZWQiLCJjbGFzc2VzIiwiVGFpbHdpbmRCcmVha3BvaW50cyIsInVzZVN0ZXBzSW50ZXJuYWxzIiwicGFyYW1zIiwibW9kZWxWYWx1ZSIsInN0ZXBzIiwib3JpZW50YXRpb24iLCJnb1ZlcnRpY2FsQmVsb3ciLCJub25JbnRlcmFjdGl2ZSIsInN0ZXBzUGFkZGluZyIsImZpbmFsT3JpZW50YXRpb24iLCJuZXdWYWwiLCJnZXRTdGVwRGlzcGxheVZhbHVlIiwic3RlcCIsImlzQ3VycmVudFN0ZXAiLCJpc0ZpbmlzaGVkU3RlcCIsInN3aXRjaFN0ZXAiLCJuZXdTdGVwIiwic3RlcE9iaiIsImxpc3RDbGFzc2VzIiwicGFkZGluZ0hvcml6b250YWwiLCJwYWRkaW5nVmVydGljYWwiLCJsaW5rQ2xhc3NlcyIsInRvUmVmcyIsImFyaWFMYWJlbCIsIl9GcmFnbWVudCIsImkiLCJDaGVja0ljb24iLCJfdG9EaXNwbGF5U3RyaW5nIiwiX2hvaXN0ZWRfOSIsIl9ob2lzdGVkXzEwIiwiX2hvaXN0ZWRfMTEiLCJfaG9pc3RlZF8xMiIsIl9ob2lzdGVkXzEzIiwiX2hvaXN0ZWRfMTUiLCJfaG9pc3RlZF8xNiIsIl9ob2lzdGVkXzE3IiwiX2hvaXN0ZWRfMTgiLCJfaG9pc3RlZF8xOSIsImxhYmVsQ2xhc3NlcyIsImxlZnRNYXJnaW4iLCJleHRyYUxpc3RDbGFzc2VzIiwiX25vcm1hbGl6ZUNsYXNzIiwiYmFzaWMiLCJDaGVja0NpcmNsZUljb24iLCJfc2ZjX3JlbmRlciIsImlzQW5pbWF0aW5nIiwicmVmIiwibW91c2VQb3NpdGlvbiIsImlzQ2xpY2tlZCIsImFuaW1hdGlvbkR1cmF0aW9uIiwiaXNNb3VzZVZpc2libGUiLCJkeW5hbWljU2xvdHMiLCJkZWxheSIsImFjdGlvbiIsInRvZ2dsZVNsb3RWaXNpYmlsaXR5Iiwic2xvdFRvVG9nZ2xlIiwic2xvdCIsImhhbmRsZUFjdGlvbiIsIm9uTW91bnRlZCIsIm9uQmVmb3JlVW5tb3VudCIsIkNsaWNrSWNvbiIsIk1vdXNlSWNvbiIsIl9yZW5kZXJMaXN0Iiwic2xvdE9iamVjdCIsImlzUGxheWluZyIsInBsYXkiLCJfX2V4cG9zZSIsInRpdGxlIiwidmltZW9JZCIsIm11dGVkIiwiY29udHJvbHMiLCJkYXJrUGxhY2Vob2xkZXIiLCJsaWdodFBsYWNlaG9sZGVyIiwicGxhY2Vob2xkZXJBbHQiLCJJY29uUGxheSIsImNvbXB1dGVkQ2xhc3NlcyIsImRpc2FibGVkIiwiZ2VuZXJhdGVSYW5kb21JZCIsInByZWZpeCIsIm5hbm9pZCIsImNoZWNrYm94VmFsdWUiLCJjb3JlQ2hlY2tlZCIsImVycm9yTWVzc2FnZSIsImhhbmRsZUNoYW5nZSIsImNvcmVWYWx1ZSIsInVzZUZpZWxkIiwiZGVzY3JpcHRpb25UZXh0IiwiZGVzY3JpcHRpb25JZCIsImRlc2NyaXB0aW9uQ2xhc3NlcyIsImltcGxpY2l0SWQiLCJmaW5hbElkIiwiY2hlY2tib3hDbGFzc2VzIiwib25DaGFuZ2UiLCJuZXdNb2RlbFZhbHVlIiwibmV3Q29yZVZhbHVlIiwic2hvdWxkQmVDaGVja2VkIiwiaXNDb3JlQ2hlY2tlZCIsIl9tZXJnZVByb3BzIiwiJGF0dHJzIiwiTWludXMiLCJyYWRpb1ZhbHVlIiwic2VsZWN0ZWQiLCJzZWxlY3RJdGVtIiwiaXNTdGFja2VkIiwib3B0aW9uIiwiSW5mb3JtYXRpb25DaXJjbGVJY29uIiwidXNlVGV4dElucHV0Q29yZSIsImlucHV0RWwiLCJ2ZWVFcnJvck1lc3NhZ2UiLCJ1bnJlZiIsImNvcmVJbnB1dENsYXNzZXMiLCJjb3JlQ2xhc3NlcyIsImhhc0Vycm9yIiwiaW50ZXJuYWxIZWxwVGlwSWQiLCJiYXNlIiwiaGlkZUhlbHBUaXAiLCJoZWxwVGlwIiwiaGFzSGVscFRpcCIsImN1c3RvbUhlbHBUaXBDbGFzcyIsImhlbHBUaXBJZCIsImhlbHBUaXBDbGFzc2VzIiwic2hvdWxkU2hvd0NsZWFyIiwiZm9jdXMiLCJjbGVhciIsInVzZURlYm91bmNlZFRleHRJbnB1dCIsImRlYm91bmNlZEJ5IiwiaXNCYXNpY0h0bWxJbnB1dCIsInN1Ym1pdE9uRW50ZXIiLCJkaXNhYmxlRGVib3VuY2VkSW5wdXQiLCJvbldyaXRlIiwibG9nIiwibW9kZWwiLCJ2YWwiLCJ0YXJnZXQiLCJwZXJzaXN0VmFsdWUiLCJkZWJvdW5jZWRWYWx1ZVVwZGF0ZSIsImlucHV0RXZlbnROYW1lIiwib24iLCJiaW5kIiwid2F0Y2giLCJvbGRWYWwiLCJpbnB1dEVsZW1lbnQiLCJoZWxwVGlwSWRUb3AiLCJoZWxwVGlwSWRMZWZ0IiwiY29tcHV0ZWRXcmFwcGVyQ2xhc3NlcyIsImxhYmVsUG9zaXRpb24iLCJuYW1lIiwic2hvd1JlcXVpcmVkIiwiX3dpdGhEaXJlY3RpdmVzIiwidGV4dGFyZWFDbGFzc2VzIiwicGxhY2Vob2xkZXIiLCIkZW1pdCIsIlhNYXJrSWNvbiIsInNsb3RzIiwidXNlU2xvdHMiLCJpbnB1dFN0eWxlIiwibGVhZGluZ0ljb25DbGFzc2VzIiwiaWZOb3RGdWxseVRyYW5zcGFyZW50Iiwib25SaWdodEljb25DbGljayIsIlZBTElEX0hUVFBfVVJMIiwiVkFMSURfRU1BSUwiLCJpc0VtYWlsIiwiaXNFbWFpbE9yRW1wdHkiLCJpc09uZU9yTXVsdGlwbGVFbWFpbHMiLCJpc1JlcXVpcmVkIiwiaXNTYW1lQXMiLCJvdGhlckZpZWxkTmFtZSIsIm90aGVyRmllbGREaXNwbGF5TmFtZSIsIm1ldGEiLCJpc1N0cmluZ09mTGVuZ3RoIiwibWluTGVuZ3RoIiwiaXNOdWxsT3JVbmRlZmluZWQiLCJzdHJpbmdDb250YWlucyIsIm1hdGNoIiwibWVzc2FnZSIsImlzVXJsIiwiaXNJdGVtU2VsZWN0ZWQiLCJpc011bHRpSXRlbVNlbGVjdGVkIiwidXNlV3JhcHBpbmdDb250YWluZXJIaWRkZW5Db3VudCIsInNraXBDYWxjdWxhdGlvbiIsImVsZW1lbnRUb1dhdGNoRm9yQ2hhbmdlcyIsIml0ZW1Db250YWluZXIiLCJ0cmFja1Jlc2l6ZSIsInRyYWNrTXV0YXRpb25zIiwiaGlkZGVuSXRlbUNvdW50IiwicmVjYWxjdWxhdGUiLCJhdmF0YXJFbGVtZW50cyIsInZpc2libGVDb3VudCIsInRvdGFsQ291bnQiLCJmaXJzdEVsT2Zmc2V0VG9wIiwiYXZhdGFyRWwiLCJvZmZzZXRUb3AiLCJ1c2VSZXNpemVPYnNlcnZlciIsInVzZU11dGF0aW9uT2JzZXJ2ZXIiLCJ1c2VGb3JtU2VsZWN0Q2hpbGRJbnRlcm5hbHMiLCJkeW5hbWljVmlzaWJpbGl0eSIsInNlbGVjdGVkVmFsdWUiLCJjdXJyZW50VmFsdWUiLCJpc0FycmF5VmFsdWUiLCJ2IiwibW91bnRlZCIsInVzZU1vdW50ZWQiLCJzaG93QmFyIiwiVGhyb3R0bGVPckRlYm91bmNlIiwiVGhyb3R0bGVPckRlYm91bmNlMiIsIkhvcml6b250YWxEaXJlY3Rpb24iLCJIb3Jpem9udGFsRGlyZWN0aW9uMiIsInVzZVdpbmRvd1Jlc2l6ZUhhbmRsZXIiLCJoYW5kbGVyIiwiaXNDbGllbnQiLCJ0aHJvdHRsZU9yRGVib3VuY2UiLCJmaW5hbEhhbmRsZXIiLCJ1c2VPbkJlZm9yZVdpbmRvd1VubG9hZCIsInVzZVJlc3BvbnNpdmVIb3Jpem9udGFsRGlyZWN0aW9uQ2FsY3VsYXRpb24iLCJlbCIsImRlZmF1bHREaXJlY3Rpb24iLCJkaXJlY3Rpb24iLCJzdG9wVXBkYXRlc0JlbG93V2lkdGgiLCJlbGVtZW50IiwicmVjYWxjdWxhdGVEaXJlY3Rpb24iLCJyZWN0Iiwic2hvd09uTGVmdFNpZGUiLCJzaG93T25SaWdodFNpZGUiLCJ1c2VCb2R5TW91bnRlZE1lbnVQb3NpdGlvbmluZyIsInN0eWxlIiwib3BlblRvTGVmdCIsInRvcCIsImxlZnQiLCJ3aWR0aCIsImhlaWdodCIsIm1hcmdpbiIsImZpbmFsV2lkdGgiLCJmaW5hbExlZnQiLCJmaW5hbFRvcCIsIm1lbnVXaWR0aCIsIm1lbnVIZWlnaHQiLCJ2aWV3cG9ydFdpZHRoIiwidmlld3BvcnRIZWlnaHQiLCJ2aWV3cG9ydFdpZHRoV2l0aG91dE1hcmdpbnMiLCJ2aWV3cG9ydEhlaWdodFdpdGhvdXRNYXJnaW5zIiwiaXNPYmplY3RMaWtlVHlwZSIsImVycm9yIiwiaXNNb3VudGVkIiwic2VhcmNoSW5wdXQiLCJtZW51RWwiLCJsaXN0Ym94QnV0dG9uIiwic2VhcmNoVmFsdWUiLCJjdXJyZW50SXRlbXMiLCJpc0FzeW5jTG9hZGluZyIsImZvcmNlVXBkYXRlS2V5IiwiaXNPcGVuIiwibGlzdGJveEJ1dHRvbkJvdW5kaW5nIiwidXNlRWxlbWVudEJvdW5kaW5nIiwidXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCJpc0ludGVyc2VjdGluZyIsIm1lbnVTdHlsZSIsImlzTGVmdExhYmVsUG9zaXRpb24iLCJyZW5kZXJDbGVhckJ1dHRvbiIsImJ1dHRvbnNXcmFwcGVyQ2xhc3NlcyIsImNvbW1vbkJ1dHRvbkNsYXNzZXMiLCJjbGVhckJ1dHRvbkNsYXNzZXMiLCJoYXNWYWx1ZVNlbGVjdGVkIiwiaGFzU2VhcmNoIiwiaXNBc3luY1NlYXJjaE1vZGUiLCJ3cmFwcGVkVmFsdWUiLCJmaW5hbFZhbHVlIiwiY3VycmVudFZhbCIsIml0ZW1LZXkiLCJjbGVhclZhbHVlIiwiZmluYWxJdGVtcyIsInNlYXJjaFZhbCIsImxpc3Rib3hPcHRpb25zQ2xhc3NlcyIsImxpc3Rib3hPcHRpb25zU3R5bGUiLCJzaW1wbGVEaXNwbGF5VGV4dCIsInRyaWdnZXJTZWFyY2giLCJkZWJvdW5jZWRTZWFyY2giLCJsaXN0Ym94T3B0aW9uQ2xhc3NlcyIsIm5ld0l0ZW1zIiwiTGlzdGJveCIsIkxpc3Rib3hMYWJlbCIsIl9jcmVhdGVUZXh0Vk5vZGUiLCJMaXN0Ym94QnV0dG9uIiwiX3dpdGhDdHgiLCJvcGVuIiwiRXhjbGFtYXRpb25DaXJjbGVJY29uIiwiQ2hldnJvblVwSWNvbiIsIkNoZXZyb25Eb3duSWNvbiIsIl9UZWxlcG9ydCIsIkxpc3Rib3hPcHRpb25zIiwiTWFnbmlmeWluZ0dsYXNzSWNvbiIsIkNvbW1vbkxvYWRpbmdCYXIiLCJpdGVtIiwiTGlzdGJveE9wdGlvbiIsImFjdGl2ZSIsIl9ob2lzdGVkXzE0IiwiX2QiLCJDb21tb25CYWRnZSIsInNvdXJjZUFwcCIsImhpZGRlblNlbGVjdGVkSXRlbUNvdW50IiwiaXNNdWx0aUl0ZW1BcnJheVZhbHVlIiwiZmlyc3RJdGVtIiwic2VhcmNoRmlsdGVyUHJlZGljYXRlIiwic2VhcmNoIiwiRm9ybVNlbGVjdEJhc2UiLCJTb3VyY2VBcHBzIiwiU291cmNlQXBwQmFkZ2UiLCJkZXNlbGVjdEl0ZW0iLCJtdWx0aXBsZSIsIml0ZW1zIiwibGFiZWwiLCJoZWxwIiwicnVsZXMiLCJieSIsImxhYmVsSWQiLCJidXR0b25JZCIsIl93aXRoTW9kaWZpZXJzIiwidG9nZ2xlRHJvcGRvd24iLCJpc1NlbGVjdGVkIiwib3B0aW9uc0NvbnRhaW5lciIsInNjcm9sbFBvc2l0aW9uIiwiZXZlbnQiLCJpdGVtRXhpc3RzIiwibmV4dFRpY2siLCJvbkNsaWNrT3V0c2lkZSIsIkZvcm1DaGVja2JveCIsIl9lIiwiX2YiLCJlbmFibGVkIiwiX3VzZU1vZGVsIiwic3dpdGNoQ2xhc3NlcyIsInNsaWRlckNsYXNzZXMiLCJIZWFkbGVzc1N3aXRjaCIsImlkIiwiY29weSIsInVzZUNsaXBib2FyZCIsImNvcGllZCIsImhhbmRsZUNvcHkiLCJzZWxlY3RBbGxUZXh0IiwidGV4dEVsZW1lbnQiLCJzZWxlY3Rpb24iLCJyYW5nZSIsImlzTXVsdGlsaW5lIiwiRm9ybVRleHRJbnB1dCIsImN0YUNvbG9yIiwiaXNJY29uQnV0dG9uIiwiQ2xpcGJvYXJkRG9jdW1lbnRDaGVja0ljb24iLCJDbGlwYm9hcmREb2N1bWVudEljb24iLCJjdGFUZXh0IiwiaW5wdXRSZWZzIiwiZGlnaXRzIiwiaW50ZXJuYWxFcnJvciIsIm9uSW5wdXQiLCJvbktleURvd24iLCJvblBhc3RlIiwicGFzdGVkRGF0YSIsIm51bWJlcnMiLCJuZXh0RW1wdHlJbmRleCIsImQiLCJuZXdWYWx1ZSIsIm5ld0RpZ2l0cyIsImRpZ2l0Q291bnQiLCJfIiwiTW9kaWZpZXJLZXlzIiwiY2xpZW50T3MiLCJnZXRDbGllbnRPcGVyYXRpbmdTeXN0ZW0iLCJNb2RpZmllcktleVRpdGxlcyIsIk9wZXJhdGluZ1N5c3RlbSIsImdldEtleWJvYXJkU2hvcnRjdXRUaXRsZSIsImlzTW9kaWZpZXJLZXkiLCJrIiwib25LZXlib2FyZFNob3J0Y3V0IiwibW9kaWZpZXJzIiwiY2FsbGJhY2siLCJ1c2VNYWdpY0tleXMiLCJrZXlDb21iaW5hdGlvbiIsIm1vZGlmaWVyIiwid2hlbmV2ZXIiLCJ1c2VGb3JtQ2hlY2tib3hNb2RlbCIsImlzQ2hlY2tlZCIsImlzQ2xvc2luZyIsIm1lbW9LZXkiLCJzY3JvbGxlZEZyb21Ub3AiLCJzY3JvbGxlZFRvQm90dG9tIiwic2xvdENvbnRhaW5lciIsIm9uU2Nyb2xsIiwiaXNGb3JtIiwiaGFzQnV0dG9ucyIsImhhc1RpdGxlIiwibWF4V2lkdGhXZWlnaHQiLCJ3aWR0aENsYXNzZXMiLCJpc0Z1bGxzY3JlZW5EZXNrdG9wIiwiZGlhbG9nUGFuZWxDbGFzc2VzIiwic2xvdENvbnRhaW5lckNsYXNzZXMiLCJvbkNsb3NlIiwib25GdWxseUNsb3NlZCIsIm9uRm9ybVN1Ym1pdCIsInNjcm9sbFRvcCIsIm9mZnNldEhlaWdodCIsInNjcm9sbEhlaWdodCIsIm9sZFZhbHVlIiwiaHRtbCIsIm9uVW5tb3VudGVkIiwiVHJhbnNpdGlvblJvb3QiLCJEaWFsb2ciLCJUcmFuc2l0aW9uQ2hpbGQiLCJmdWxsc2NyZWVuIiwiRGlhbG9nUGFuZWwiLCJzaG93QmFja0J1dHRvbiIsIkNoZXZyb25MZWZ0SWNvbiIsImhpZGVDbG9zZXIiLCJjbG9zZXJDbGFzc2VzIiwiYnV0dG9ucyIsImJ1dHRvbiIsImNvbnRlbnQiLCJ1c2VFbGVtZW50U2l6ZSIsImNvbnRlbnRIZWlnaHQiLCJpc0V4cGFuZGVkIiwiYmFja2dyb3VuZENsYXNzIiwidGl0bGVDbGFzc2VzIiwidG9nZ2xlRXhwYW5zaW9uIiwiX3RvSGFuZGxlcnMiLCIkc2xvdHMiLCJlZGl0VGl0bGUiLCJzeW5jRnJvbVZhbHVlIiwiYnV0dG9uVGV4dENsYXNzZXMiLCJwYW5lbENsYXNzZXMiLCJjaGV2cm9uQ2xhc3NlcyIsInRvZ2dsZSIsIm9uVGl0bGVJbnB1dEJsdXIiLCJIZWFkbGVzc0Rpc2Nsb3N1cmUiLCJEaXNjbG9zdXJlQnV0dG9uIiwiaWNvbiIsIkRpc2Nsb3N1cmVQYW5lbCIsImxhenlMb2FkIiwiR3JpZExpc3RUb2dnbGVWYWx1ZSIsIkJhcnMzSWNvbiIsIlNxdWFyZXMyWDJJY29uIiwibWVudUl0ZW1zIiwibWVudUJ1dHRvbiIsIm1lbnVCdXR0b25XcmFwcGVyIiwiaXNPcGVuSW50ZXJuYWxseSIsImZpbmFsT3BlbiIsIm1lbnVCdXR0b25Cb3VuZGluZyIsIm1lbnVJdGVtc1NpemUiLCJjYWxjdWxhdGVkRGlyZWN0aW9uIiwibWVudURpcmVjdGlvbiIsIm1lbnVJdGVtc1N0eWxlcyIsIm1lbnVJdGVtc0NsYXNzZXMiLCJidWlsZEJ1dHRvbkNsYXNzc2VzIiwiY2hvb3NlSXRlbSIsInNldE9wZW4iLCJwcm9jZXNzT3BlbiIsInNob3VsZEJlT3BlbiIsInVzZUV2ZW50TGlzdGVuZXIiLCJIZWFkbGVzc01lbnUiLCJpc01lbnVPcGVuIiwiTWVudUJ1dHRvbiIsIm1lbnVJZCIsIm1vdW50TWVudU9uQm9keSIsIk1lbnVJdGVtcyIsImdyb3VwIiwiTWVudUl0ZW0iLCJzaG93VGlja3MiLCJJY29uQ2hlY2siLCJ2VGlwcHkiLCJhY3RpdmVJdGVtIiwiYnV0dG9uQ29udGFpbmVyIiwic2Nyb2xsQ29udGFpbmVyIiwic2hvd0xlZnRBcnJvdyIsInNob3dSaWdodEFycm93IiwiaXNJbml0aWFsU2V0dXAiLCJ1bmRlcmxpbmVMZWZ0IiwidW5kZXJsaW5lV2lkdGgiLCJidXR0b25DbGFzcyIsImlzQWN0aXZlIiwiYWN0aXZlSXRlbVJlZiIsInBhcmVudCIsImIiLCJib3JkZXJTdHlsZSIsInVwZGF0ZVVuZGVybGluZSIsInNldEFjdGl2ZUl0ZW0iLCJpc0FjdGl2ZUl0ZW0iLCJjaGVja0Fycm93c1Zpc2liaWxpdHkiLCJjb250YWluZXIiLCJzY3JvbGxXaWR0aCIsImNsaWVudFdpZHRoIiwic2Nyb2xsTGVmdCIsImJ1ZmZlciIsInNjcm9sbFJpZ2h0IiwiaGFuZGxlU2Nyb2xsIiwiZW5zdXJlQWN0aXZlSXRlbVZpc2libGUiLCJhY3RpdmVCdXR0b24iLCJzdG9wUmVzaXplT2JzZXJ2ZXIiLCJBcnJvd0xvbmdMZWZ0SWNvbiIsIl9kaXJlY3RpdmVfdGlwcHkiLCJBcnJvd0xvbmdSaWdodEljb24iLCJ0YWJsZUNsYXNzZXMiLCJzaGFyZWRDb250YWluZXJDbGFzc2VzIiwicmVzdWx0Q29udGFpbmVyQ2xhc3NlcyIsImJ1dHRvbkNvdW50IiwicGFkZGluZ1JpZ2h0U3R5bGUiLCJwYWRkaW5nIiwicm93c1dyYXBwZXJDbGFzc2VzIiwiZ2V0SGVhZGVyQ2xhc3NlcyIsImNvbHVtbiIsImNvbEluZGV4IiwiYyIsImdldENsYXNzZXMiLCJoYW5kbGVSb3dDbGljayIsImhlYWRlclJvd0NsYXNzZXMiLCJjb2x1bW5zIiwiZW1wdHlNZXNzYWdlIiwid3JhcHBlciIsImluaXRpYWxpemVMb2FkZXIiLCJpbnQiLCJJbnRlcm5hbEluZmluaXRlTG9hZGluZyIsIiRwcm9wcyIsImhpZGVXaGVuQ29tcGxldGUiLCJyZXRyeSIsIkV4Y2xhbWF0aW9uVHJpYW5nbGVJY29uIiwiYWxsb3dSZXRyeSIsInNlY29uZGFyeVNsb3RQYWRkaW5nQ2xhc3NlcyIsImRlZmF1bHRTbG90UGFkZGluZ0NsYXNzZXMiLCJidXR0b25UZXh0IiwiaXNDb2xsYXBzZWQiLCJjb2xsYXBzaWJsZSIsIm5vSG92ZXIiLCJBcnJvd0ZpbGxlZCIsIm5lc3RlZCIsImljb25DbGljayIsImljb25EaXNhYmxlZCIsImFsd2F5c1Nob3dJY29uIiwiRWRpdCIsIkNoZXZyb25SaWdodEljb24iLCJQbHVzIiwiaWNvblRleHQiLCJoYXNDaGlsZHJlbiIsInRvZ2dsZU9wZW4iLCJ0b29sdGlwVGV4dCIsImV4dHJhUGFkZGluZyIsIkFycm93VXBSaWdodEljb24iLCJjb2xvckNsYXNzZXMiLCJoYXNEZXNjcmlwdGlvbiIsIlhDaXJjbGVJY29uIiwiY29udGFpbmVyQ2xhc3NlcyIsInN1YmNvbnRhaW5lckNsYXNzZXMiLCJoYW5kbGVBY3Rpb25DbGljayIsImhpZGVJY29uIiwiYWN0aW9ucyIsIndpdGhEaXNtaXNzIiwid3JpdGFibGVBc3luY0NvbXB1dGVkIiwiZ2V0IiwiaW5pdGlhbFN0YXRlIiwicmVhZE9wdGlvbnMiLCJhc3luY1JlYWQiLCJkZWJ1Z2dpbmciLCJsb2dTZXR0aW5ncyIsImdldFRyYWNlIiwibG9nZ2VyIiwiZmluYWxHZXQiLCJyZXMiLCJmaW5hbFNldCIsInJlYWRWYWx1ZSIsImNvbXB1dGVkQXN5bmMiLCJnZXR0ZXIiLCJwcm92aWRlcyIsImdldEN1cnJlbnRJbnN0YW5jZSIsImN0eEtleSIsInMiLCJzdGF0ZSIsImluamVjdCIsImlzSW5wdXRFdmVudCIsImlzSW5wdXRGb2N1c2VkIiwidXNlRm9jdXMiLCJjdHhNYW5hZ2VyIiwiYXV0b2NvbXBsZXRlSXRlbXMiLCJpc0F1dG9jb21wbGV0ZUxvYWRpbmciLCJpc0F1dG9jb21wbGV0ZU9wZW4iLCJxdWVyeSIsInNlbGVjdGVkSXRlbXMiLCJ0IiwiaW5wdXRXcmFwcGVyQ2xhc3NlcyIsInJlbW92ZVRhZyIsImlkeCIsIm5ld1NlbGVjdGVkIiwib25RdWVyeUVzY2FwZSIsIm9uUXVlcnlCYWNrc3BhY2UiLCJuZXdUYWdzIiwib25RdWVyeUFycm93VXAiLCJvblF1ZXJ5QXJyb3dEb3duIiwicmVzb2x2ZUF1dG9jb21wbGV0ZUl0ZW1zIiwiZGVib3VuY2VkUmVzb2x2ZSIsImRlYm91bmNlZFJlc29sdmVBbmRNYXJrTG9hZGluZyIsIm9uUXVlcnlJbnB1dCIsImZvcmNlQ3JlYXRlRnJvbUlucHV0IiwibmV3VGFnIiwidGFnRXhpc3RzIiwibmV3SXNPcGVuIiwib2xkSXNPcGVuIiwiQ29tYm9ib3giLCJ3cmFwcGVyQ2xhc3NlcyIsIkZvcm1UYWdzQ29udGV4dE1hbmFnZXIiLCJfd2l0aEtleXMiLCJzaG93T3B0aW9uYWwiLCJDb21ib2JveE9wdGlvbnMiLCJDb21ib2JveE9wdGlvbiIsInVzZUF2YXRhclNpemVDbGFzc2VzIiwiaGVpZ2h0Q2xhc3NlcyIsInRleHRDbGFzc2VzIiwiaW5pdGlhbHMiLCJwYXJ0cyIsImZpcnN0TGV0dGVyIiwic2Vjb25kTGV0dGVyIiwiYm9yZGVyQ2xhc3NlcyIsImJnQ2xhc3NlcyIsImhvdmVyQ2xhc3NlcyIsImFjdGl2ZUNsYXNzZXMiLCJyb3VuZGVkIiwidXNlciIsImhpZGVUb29sdGlwIiwiVXNlckNpcmNsZUljb24iLCJtYXhDb3VudEhpZGRlbkl0ZW1Db3VudCIsInZpc2libGVVc2VycyIsImxpbWl0IiwibWF4QXZhdGFyc0hpZGRlbkNvdW50IiwidG90YWxIaWRkZW5Db3VudCIsIm92ZXJsYXAiLCJVc2VyQXZhdGFyIiwiaGlkZVRvb2x0aXBzIiwib25IaWRkZW5Db3VudENsaWNrIiwiTGF6eVVzZXJBdmF0YXJFZGl0b3IiLCJkZWZpbmVBc3luY0NvbXBvbmVudCIsImVkaXRNb2RlIiwibW9kZWxBc1VzZXIiLCJvblNhdmUiLCJuZXdVcmwiLCJkZWZhdWx0SW1nIiwibGlnaHRTdHlsZSIsIkJhc2VFcnJvciIsIl9fcHVibGljRmllbGQiLCJMb2dpY0Vycm9yIiwiVW5pbml0aWFsaXplZFJlc291cmNlQWNjZXNzRXJyb3IiLCJDb21wb3NhYmxlSW52b2tlZE91dE9mU2NvcGVFcnJvciIsIlVuc3VwcG9ydGVkRW52aXJvbm1lbnRFcnJvciIsIlVuaXF1ZUZpbGVUeXBlU3BlY2lmaWVyIiwidmFsaWRhdGVGaWxlVHlwZSIsImZpbGUiLCJhbGxvd2VkVHlwZXMiLCJhbGxvd2VkVW5pcXVlVHlwZXMiLCJhbGxvd2VkVW5pcXVlVHlwZSIsImFsbG93ZWRFeHRlbnNpb25zIiwiZmlsZUV4dCIsInJlc29sdmVGaWxlRXh0ZW5zaW9uIiwiTWlzc2luZ0ZpbGVFeHRlbnNpb25FcnJvciIsImFsbG93ZWRFeHRlbnNpb24iLCJGb3JiaWRkZW5GaWxlVHlwZUVycm9yIiwiZmlsZU5hbWUiLCJmaWxlTmFtZVBhcnRzIiwiZXh0IiwiaXNGaWxlVHlwZVNwZWNpZmllciIsInByZXR0eUZpbGVTaXplIiwic2l6ZUluQnl0ZXMiLCJyZW1vdmVUcmFpbGluZ1plcm9lcyIsImZpbGVTaXplIiwia2JTaXplIiwibWJTaXplIiwiZ2JTaXplIiwiZ2VuZXJhdGVGaWxlSWQiLCJpbXBvcnRhbnREYXRhIiwibWQ1IiwiYnVpbGRGaWxlVHlwZVNwZWNpZmllcnMiLCJhY2NlcHQiLCJzcGVjaWZpZXJzIiwidXNlUHJlcGFyZVVwbG9hZGFibGVGaWxlcyIsInNpemVMaW1pdCIsImNvdW50TGltaXQiLCJmaWxlVHlwZVNwZWNpZmllcnMiLCJoYW5kbGVGaWxlcyIsImZpbGVzIiwicmVzdWx0cyIsImZpbmFsQ291bnRMaW1pdCIsInIiLCJ2YWxpZGF0aW9uUmVzdWx0IiwiRmlsZVRvb0xhcmdlRXJyb3IiLCJmaWxlVXBsb2FkWm9uZSIsImZpbGVJbnB1dCIsImJ1aWxkVXBsb2FkYWJsZUZpbGVzIiwiaGFuZGxlSW5jb21pbmdGaWxlcyIsImZpbGVJdGVtcyIsImlzT3ZlckRyb3Bab25lIiwidXNlRHJvcFpvbmUiLCJvbklucHV0Q2hhbmdlIiwiaW5wdXQiLCJ0cmlnZ2VyUGlja2VyIiwia2V5Ym9hcmRDbGlja2FibGVLZXlwcmVzc0hhbmRsZXIiLCJ2S2V5Ym9hcmRDbGlja2FibGUiLCJwZXJjZW50YWdlIiwiY29sb3JDbGFzcyIsInNob3dDbG9zZXIiLCJjbGFtcFZhbHVlIiwiaGFuZGxlSW5wdXQiLCJjbGFtcGVkVmFsdWUiLCJoYW5kbGVOdW1iZXJJbnB1dCIsInZhbGlkYXRlQW5kQ2xhbXAiLCJoaWRlSGVhZGVyIiwibWluIiwibWF4IiwiaW5wdXRCZWxvd1NsaWRlciIsIm1pblZhbHVlU3RyaW5nIiwibnVtVmFsdWUiLCJtYXhWYWx1ZVN0cmluZyIsIm1pblBlcmNlbnRhZ2UiLCJiYXNlUGVyY2VudGFnZSIsIm1heFBlcmNlbnRhZ2UiLCJ0cmFja0xlZnQiLCJ0cmFja1JpZ2h0IiwiaGFuZGxlTWluSW5wdXQiLCJoYW5kbGVNYXhJbnB1dCIsInNob3dGaWVsZHMiXSwiaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTUsOTYsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMF0sInNvdXJjZXMiOlsiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZnJlZUdsb2JhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3Jvb3QuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19TeW1ib2wuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRSYXdUYWcuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19vYmplY3RUb1N0cmluZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VHZXRUYWcuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzT2JqZWN0TGlrZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNTeW1ib2wuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheU1hcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNBcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3RyaW1tZWRFbmRJbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VUcmltLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc09iamVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdG9OdW1iZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RvRmluaXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90b0ludGVnZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lkZW50aXR5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0Z1bmN0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY29yZUpzRGF0YS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzTWFza2VkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fdG9Tb3VyY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNOYXRpdmUuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRWYWx1ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldE5hdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FwcGx5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9ub29wLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc2hvcnRPdXQuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2NvbnN0YW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZGVmaW5lUHJvcGVydHkuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlU2V0VG9TdHJpbmcuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zZXRUb1N0cmluZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VGaW5kSW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNOYU4uanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdHJpY3RJbmRleE9mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUluZGV4T2YuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheUluY2x1ZGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faXNJbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZXEuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19vdmVyUmVzdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VSZXN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0xlbmd0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNBcnJheUxpa2UuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc1Byb3RvdHlwZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VUaW1lcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJc0FyZ3VtZW50cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNBcmd1bWVudHMuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3N0dWJGYWxzZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNCdWZmZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNUeXBlZEFycmF5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVVuYXJ5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbm9kZVV0aWwuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzVHlwZWRBcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5TGlrZUtleXMuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19vdmVyQXJnLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbmF0aXZlS2V5cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VLZXlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9rZXlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbmF0aXZlQ3JlYXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaENsZWFyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaERlbGV0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2hhc2hHZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19oYXNoSGFzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaFNldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX0hhc2guanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19saXN0Q2FjaGVDbGVhci5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Fzc29jSW5kZXhPZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZURlbGV0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZUdldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZUhhcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZVNldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX0xpc3RDYWNoZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX01hcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hcENhY2hlQ2xlYXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc0tleWFibGUuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRNYXBEYXRhLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVEZWxldGUuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19tYXBDYWNoZUdldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hcENhY2hlSGFzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVTZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19NYXBDYWNoZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5UHVzaC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzRmxhdHRlbmFibGUuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRmxhdHRlbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VDbGFtcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvY2xhbXAuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19TZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zZXRDYWNoZUFkZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NldENhY2hlSGFzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fU2V0Q2FjaGUuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jYWNoZUhhcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NldFRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL25vdy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZGVib3VuY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQXJyYXlMaWtlT2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlJbmNsdWRlc1dpdGguanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRGlmZmVyZW5jZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZGlmZmVyZW5jZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNTdHJpbmcuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVmFsdWVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy92YWx1ZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2luY2x1ZGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUludGVyc2VjdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Nhc3RBcnJheUxpa2VPYmplY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ludGVyc2VjdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNCb29sZWFuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc051bWJlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNVbmRlZmluZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3Rocm90dGxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlU2V0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVVuaXEuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3VuaXEuanMiLCIuLi9zcmMvY29tcG9uZW50cy9mb3JtL0J1dHRvbi52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vdGV4dC9MaW5rLnZ1ZSIsIi4uL3NyYy9oZWxwZXJzL2dsb2JhbC90b2FzdC50cyIsIi4uL3NyYy9jb21wb25lbnRzL2dsb2JhbC9Ub2FzdFJlbmRlcmVyLnZ1ZSIsIi4uL3NyYy9oZWxwZXJzL2dsb2JhbC9hY2Nlc3NpYmlsaXR5LnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvY29tbW9uL0JhZGdlLnZ1ZSIsIi4uL3NyYy9oZWxwZXJzL3RhaWx3aW5kLnRzIiwiLi4vc3JjL2NvbXBvc2FibGVzL2NvbW1vbi9zdGVwcy50cyIsIi4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9zdGVwcy9OdW1iZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY29tbW9uL3N0ZXBzL0J1bGxldC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vYW5pbWF0aW9uL01vdXNlSWNvbi52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vYW5pbWF0aW9uL0NsaWNrSWNvbi52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vYW5pbWF0aW9uL0luc3RydWN0aW9uYWwudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZ2xvYmFsL2ljb24vUGxheS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vVmltZW9FbWJlZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9mb3JtL0NhcmRCdXR0b24udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9DaGVja2JveC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9mb3JtL1JhZGlvLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vUmFkaW9Hcm91cC52dWUiLCIuLi9zcmMvY29tcG9zYWJsZXMvZm9ybS90ZXh0SW5wdXQudHMiLCIuLi9zcmMvY29tcG9uZW50cy9mb3JtL1RleHRBcmVhLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vVGV4dElucHV0LnZ1ZSIsIi4uL3NyYy9oZWxwZXJzL2NvbW1vbi92YWxpZGF0aW9uLnRzIiwiLi4vc3JjL2NvbXBvc2FibGVzL2xheW91dC9yZXNpemUudHMiLCIuLi9zcmMvY29tcG9zYWJsZXMvZm9ybS9zZWxlY3QudHMiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vbG9hZGluZy9CYXIudnVlIiwiLi4vc3JjL2NvbXBvc2FibGVzL2NvbW1vbi93aW5kb3cudHMiLCIuLi9zcmMvY29tcG9zYWJsZXMvbGF5b3V0L21lbnUudHMiLCIuLi9zcmMvY29tcG9uZW50cy9mb3JtL3NlbGVjdC9CYXNlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL1NvdXJjZUFwcEJhZGdlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vc2VsZWN0L1NvdXJjZUFwcHMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9zZWxlY3QvQmFkZ2VzLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vc2VsZWN0L011bHRpLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vU3dpdGNoLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vQ2xpcGJvYXJkSW5wdXQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9Db2RlSW5wdXQudnVlIiwiLi4vc3JjL2hlbHBlcnMvZm9ybS9pbnB1dC50cyIsIi4uL3NyYy9jb21wb3NhYmxlcy9mb3JtL2lucHV0LnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvbGF5b3V0L0RpYWxvZy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9sYXlvdXQvRGlhbG9nU2VjdGlvbi52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9sYXlvdXQvRGlzY2xvc3VyZS52dWUiLCIuLi9zcmMvaGVscGVycy9sYXlvdXQvY29tcG9uZW50cy50cyIsIi4uL3NyYy9jb21wb25lbnRzL2xheW91dC9HcmlkTGlzdFRvZ2dsZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9nbG9iYWwvaWNvbi9DaGVjay52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9sYXlvdXQvTWVudS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9sYXlvdXQvdGFicy9Ib3Jpem9udGFsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2xheW91dC90YWJzL1ZlcnRpY2FsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2xheW91dC9UYWJsZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9JbmZpbml0ZUxvYWRpbmcudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvbGF5b3V0L1BhbmVsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2xheW91dC9zaWRlYmFyL1NpZGViYXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvbGF5b3V0L3NpZGViYXIvUHJvbW8udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvbGF5b3V0L3NpZGViYXIvbWVudS9NZW51LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2dsb2JhbC9pY29uL1BsdXMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZ2xvYmFsL2ljb24vRWRpdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9nbG9iYWwvaWNvbi9BcnJvd0ZpbGxlZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9sYXlvdXQvc2lkZWJhci9tZW51L2dyb3VwL0dyb3VwLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2xheW91dC9zaWRlYmFyL21lbnUvZ3JvdXAvSXRlbS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vQWxlcnQudnVlIiwiLi4vc3JjL2NvbXBvc2FibGVzL2NvbW1vbi9hc3luYy50cyIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vdGFncy9Db250ZXh0TWFuYWdlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9mb3JtL1RhZ3MudnVlIiwiLi4vc3JjL2NvbXBvc2FibGVzL3VzZXIvYXZhdGFyLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvdXNlci9BdmF0YXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvdXNlci9BdmF0YXJHcm91cC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vbG9hZGluZy9JY29uLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3VzZXIvQXZhdGFyRWRpdGFibGUudnVlIiwiLi4vc3JjL2hlbHBlcnMvY29tbW9uL2Vycm9yLnRzIiwiLi4vc3JjL2hlbHBlcnMvZm9ybS9maWxlLnRzIiwiLi4vc3JjL2NvbXBvc2FibGVzL2Zvcm0vZmlsZVVwbG9hZC50cyIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmlsZS11cGxvYWQvWm9uZS52dWUiLCIuLi9zcmMvZGlyZWN0aXZlcy9hY2Nlc3NpYmlsaXR5LnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvY29tbW9uL1Byb2dyZXNzQmFyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9Qcm9tb0FsZXJ0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vUmFuZ2UudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9EdWFsUmFuZ2UudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbmV4cG9ydCBkZWZhdWx0IGZyZWVHbG9iYWw7XG4iLCJpbXBvcnQgZnJlZUdsb2JhbCBmcm9tICcuL19mcmVlR2xvYmFsLmpzJztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5leHBvcnQgZGVmYXVsdCByb290O1xuIiwiaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5leHBvcnQgZGVmYXVsdCBTeW1ib2w7XG4iLCJpbXBvcnQgU3ltYm9sIGZyb20gJy4vX1N5bWJvbC5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuXG4gIHRyeSB7XG4gICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgIHZhciB1bm1hc2tlZCA9IHRydWU7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICBpZiAodW5tYXNrZWQpIHtcbiAgICBpZiAoaXNPd24pIHtcbiAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0UmF3VGFnO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG9iamVjdFRvU3RyaW5nO1xuIiwiaW1wb3J0IFN5bWJvbCBmcm9tICcuL19TeW1ib2wuanMnO1xuaW1wb3J0IGdldFJhd1RhZyBmcm9tICcuL19nZXRSYXdUYWcuanMnO1xuaW1wb3J0IG9iamVjdFRvU3RyaW5nIGZyb20gJy4vX29iamVjdFRvU3RyaW5nLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VHZXRUYWc7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNPYmplY3RMaWtlO1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc1N5bWJvbDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5TWFwO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbmV4cG9ydCBkZWZhdWx0IGlzQXJyYXk7XG4iLCIvKiogVXNlZCB0byBtYXRjaCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gKi9cbnZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gKiBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICovXG5mdW5jdGlvbiB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSB7XG4gIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRyaW1tZWRFbmRJbmRleDtcbiIsImltcG9ydCB0cmltbWVkRW5kSW5kZXggZnJvbSAnLi9fdHJpbW1lZEVuZEluZGV4LmpzJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbVN0YXJ0ID0gL15cXHMrLztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50cmltYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmdcbiAgICA/IHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKVxuICAgIDogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlVHJpbTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc09iamVjdDtcbiIsImltcG9ydCBiYXNlVHJpbSBmcm9tICcuL19iYXNlVHJpbS5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5pbXBvcnQgaXNTeW1ib2wgZnJvbSAnLi9pc1N5bWJvbC5qcyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSBiYXNlVHJpbSh2YWx1ZSk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b051bWJlcjtcbiIsImltcG9ydCB0b051bWJlciBmcm9tICcuL3RvTnVtYmVyLmpzJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvRmluaXRlO1xuIiwiaW1wb3J0IHRvRmluaXRlIGZyb20gJy4vdG9GaW5pdGUuanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b0ludGVnZXI7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpZGVudGl0eTtcbiIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0Z1bmN0aW9uO1xuIiwiaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbnZhciBjb3JlSnNEYXRhID0gcm9vdFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbmV4cG9ydCBkZWZhdWx0IGNvcmVKc0RhdGE7XG4iLCJpbXBvcnQgY29yZUpzRGF0YSBmcm9tICcuL19jb3JlSnNEYXRhLmpzJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNNYXNrZWQ7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvU291cmNlO1xuIiwiaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pc0Z1bmN0aW9uLmpzJztcbmltcG9ydCBpc01hc2tlZCBmcm9tICcuL19pc01hc2tlZC5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5pbXBvcnQgdG9Tb3VyY2UgZnJvbSAnLi9fdG9Tb3VyY2UuanMnO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG52YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbik7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNOYXRpdmU7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0VmFsdWU7XG4iLCJpbXBvcnQgYmFzZUlzTmF0aXZlIGZyb20gJy4vX2Jhc2VJc05hdGl2ZS5qcyc7XG5pbXBvcnQgZ2V0VmFsdWUgZnJvbSAnLi9fZ2V0VmFsdWUuanMnO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXROYXRpdmU7XG4iLCIvKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFwcGx5O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi4zLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAqL1xuZnVuY3Rpb24gbm9vcCgpIHtcbiAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbn1cblxuZXhwb3J0IGRlZmF1bHQgbm9vcDtcbiIsIi8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbnZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgSE9UX1NQQU4gPSAxNjtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gKiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gIHZhciBjb3VudCA9IDAsXG4gICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YW1wID0gbmF0aXZlTm93KCksXG4gICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCA9IDA7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2hvcnRPdXQ7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbnN0YW50IGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5jb25zdGFudCh7ICdhJzogMSB9KSk7XG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gKiAvLyA9PiBbeyAnYSc6IDEgfSwgeyAnYSc6IDEgfV1cbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29uc3RhbnQ7XG4iLCJpbXBvcnQgZ2V0TmF0aXZlIGZyb20gJy4vX2dldE5hdGl2ZS5qcyc7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVQcm9wZXJ0eTtcbiIsImltcG9ydCBjb25zdGFudCBmcm9tICcuL2NvbnN0YW50LmpzJztcbmltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tICcuL19kZWZpbmVQcm9wZXJ0eS5qcyc7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICd3cml0YWJsZSc6IHRydWVcbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBiYXNlU2V0VG9TdHJpbmc7XG4iLCJpbXBvcnQgYmFzZVNldFRvU3RyaW5nIGZyb20gJy4vX2Jhc2VTZXRUb1N0cmluZy5qcyc7XG5pbXBvcnQgc2hvcnRPdXQgZnJvbSAnLi9fc2hvcnRPdXQuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgc2V0VG9TdHJpbmcgPSBzaG9ydE91dChiYXNlU2V0VG9TdHJpbmcpO1xuXG5leHBvcnQgZGVmYXVsdCBzZXRUb1N0cmluZztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZEluZGV4YCBhbmQgYF8uZmluZExhc3RJbmRleGAgd2l0aG91dFxuICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAxIDogLTEpO1xuXG4gIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlRmluZEluZGV4O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUlzTmFOO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHJpY3RJbmRleE9mO1xuIiwiaW1wb3J0IGJhc2VGaW5kSW5kZXggZnJvbSAnLi9fYmFzZUZpbmRJbmRleC5qcyc7XG5pbXBvcnQgYmFzZUlzTmFOIGZyb20gJy4vX2Jhc2VJc05hTi5qcyc7XG5pbXBvcnQgc3RyaWN0SW5kZXhPZiBmcm9tICcuL19zdHJpY3RJbmRleE9mLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgZnJvbUluZGV4KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUluZGV4T2Y7XG4iLCJpbXBvcnQgYmFzZUluZGV4T2YgZnJvbSAnLi9fYmFzZUluZGV4T2YuanMnO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBzcGVjaWZ5aW5nIGFuIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnJheUluY2x1ZGVzO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0luZGV4O1xuIiwiLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGVxO1xuIiwiaW1wb3J0IGFwcGx5IGZyb20gJy4vX2FwcGx5LmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSxcbiAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IGFyZ3Nbc3RhcnQgKyBpbmRleF07XG4gICAgfVxuICAgIGluZGV4ID0gLTE7XG4gICAgdmFyIG90aGVyQXJncyA9IEFycmF5KHN0YXJ0ICsgMSk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgIH1cbiAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgb3ZlclJlc3Q7XG4iLCJpbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgb3ZlclJlc3QgZnJvbSAnLi9fb3ZlclJlc3QuanMnO1xuaW1wb3J0IHNldFRvU3RyaW5nIGZyb20gJy4vX3NldFRvU3RyaW5nLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VSZXN0O1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0xlbmd0aDtcbiIsImltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJy4vaXNGdW5jdGlvbi5qcyc7XG5pbXBvcnQgaXNMZW5ndGggZnJvbSAnLi9pc0xlbmd0aC5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0FycmF5TGlrZTtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNQcm90b3R5cGU7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobik7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlVGltZXM7XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNBcmd1bWVudHM7XG4iLCJpbXBvcnQgYmFzZUlzQXJndW1lbnRzIGZyb20gJy4vX2Jhc2VJc0FyZ3VtZW50cy5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGlzQXJndW1lbnRzO1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHViRmFsc2U7XG4iLCJpbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcbmltcG9ydCBzdHViRmFsc2UgZnJvbSAnLi9zdHViRmFsc2UuanMnO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbmV4cG9ydCBkZWZhdWx0IGlzQnVmZmVyO1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNMZW5ndGggZnJvbSAnLi9pc0xlbmd0aC5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xudmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG50eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbnR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbnR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbnR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbnR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbnR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbnR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbnR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNUeXBlZEFycmF5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmFyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBzdG9yaW5nIG1ldGFkYXRhLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlVW5hcnk7XG4iLCJpbXBvcnQgZnJlZUdsb2JhbCBmcm9tICcuL19mcmVlR2xvYmFsLmpzJztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4vKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbnZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgIGlmICh0eXBlcykge1xuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxuZXhwb3J0IGRlZmF1bHQgbm9kZVV0aWw7XG4iLCJpbXBvcnQgYmFzZUlzVHlwZWRBcnJheSBmcm9tICcuL19iYXNlSXNUeXBlZEFycmF5LmpzJztcbmltcG9ydCBiYXNlVW5hcnkgZnJvbSAnLi9fYmFzZVVuYXJ5LmpzJztcbmltcG9ydCBub2RlVXRpbCBmcm9tICcuL19ub2RlVXRpbC5qcyc7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG5leHBvcnQgZGVmYXVsdCBpc1R5cGVkQXJyYXk7XG4iLCJpbXBvcnQgYmFzZVRpbWVzIGZyb20gJy4vX2Jhc2VUaW1lcy5qcyc7XG5pbXBvcnQgaXNBcmd1bWVudHMgZnJvbSAnLi9pc0FyZ3VtZW50cy5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzQnVmZmVyIGZyb20gJy4vaXNCdWZmZXIuanMnO1xuaW1wb3J0IGlzSW5kZXggZnJvbSAnLi9faXNJbmRleC5qcyc7XG5pbXBvcnQgaXNUeXBlZEFycmF5IGZyb20gJy4vaXNUeXBlZEFycmF5LmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnJheUxpa2VLZXlzO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IG92ZXJBcmc7XG4iLCJpbXBvcnQgb3ZlckFyZyBmcm9tICcuL19vdmVyQXJnLmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpO1xuXG5leHBvcnQgZGVmYXVsdCBuYXRpdmVLZXlzO1xuIiwiaW1wb3J0IGlzUHJvdG90eXBlIGZyb20gJy4vX2lzUHJvdG90eXBlLmpzJztcbmltcG9ydCBuYXRpdmVLZXlzIGZyb20gJy4vX25hdGl2ZUtleXMuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VLZXlzO1xuIiwiaW1wb3J0IGFycmF5TGlrZUtleXMgZnJvbSAnLi9fYXJyYXlMaWtlS2V5cy5qcyc7XG5pbXBvcnQgYmFzZUtleXMgZnJvbSAnLi9fYmFzZUtleXMuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXNBcnJheUxpa2UuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5cyhuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLmtleXMoJ2hpJyk7XG4gKiAvLyA9PiBbJzAnLCAnMSddXG4gKi9cbmZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQga2V5cztcbiIsImltcG9ydCBnZXROYXRpdmUgZnJvbSAnLi9fZ2V0TmF0aXZlLmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxuZXhwb3J0IGRlZmF1bHQgbmF0aXZlQ3JlYXRlO1xuIiwiaW1wb3J0IG5hdGl2ZUNyZWF0ZSBmcm9tICcuL19uYXRpdmVDcmVhdGUuanMnO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzaENsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzaERlbGV0ZTtcbiIsImltcG9ydCBuYXRpdmVDcmVhdGUgZnJvbSAnLi9fbmF0aXZlQ3JlYXRlLmpzJztcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNoR2V0O1xuIiwiaW1wb3J0IG5hdGl2ZUNyZWF0ZSBmcm9tICcuL19uYXRpdmVDcmVhdGUuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhhc2hIYXM7XG4iLCJpbXBvcnQgbmF0aXZlQ3JlYXRlIGZyb20gJy4vX25hdGl2ZUNyZWF0ZS5qcyc7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqXG4gKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNoU2V0O1xuIiwiaW1wb3J0IGhhc2hDbGVhciBmcm9tICcuL19oYXNoQ2xlYXIuanMnO1xuaW1wb3J0IGhhc2hEZWxldGUgZnJvbSAnLi9faGFzaERlbGV0ZS5qcyc7XG5pbXBvcnQgaGFzaEdldCBmcm9tICcuL19oYXNoR2V0LmpzJztcbmltcG9ydCBoYXNoSGFzIGZyb20gJy4vX2hhc2hIYXMuanMnO1xuaW1wb3J0IGhhc2hTZXQgZnJvbSAnLi9faGFzaFNldC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5leHBvcnQgZGVmYXVsdCBIYXNoO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBsaXN0Q2FjaGVDbGVhcjtcbiIsImltcG9ydCBlcSBmcm9tICcuL2VxLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXNzb2NJbmRleE9mO1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICBkYXRhLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgfVxuICAtLXRoaXMuc2l6ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxpc3RDYWNoZURlbGV0ZTtcbiIsImltcG9ydCBhc3NvY0luZGV4T2YgZnJvbSAnLi9fYXNzb2NJbmRleE9mLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdENhY2hlR2V0O1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdENhY2hlSGFzO1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgICsrdGhpcy5zaXplO1xuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9IGVsc2Uge1xuICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxpc3RDYWNoZVNldDtcbiIsImltcG9ydCBsaXN0Q2FjaGVDbGVhciBmcm9tICcuL19saXN0Q2FjaGVDbGVhci5qcyc7XG5pbXBvcnQgbGlzdENhY2hlRGVsZXRlIGZyb20gJy4vX2xpc3RDYWNoZURlbGV0ZS5qcyc7XG5pbXBvcnQgbGlzdENhY2hlR2V0IGZyb20gJy4vX2xpc3RDYWNoZUdldC5qcyc7XG5pbXBvcnQgbGlzdENhY2hlSGFzIGZyb20gJy4vX2xpc3RDYWNoZUhhcy5qcyc7XG5pbXBvcnQgbGlzdENhY2hlU2V0IGZyb20gJy4vX2xpc3RDYWNoZVNldC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxuZXhwb3J0IGRlZmF1bHQgTGlzdENhY2hlO1xuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5leHBvcnQgZGVmYXVsdCBNYXA7XG4iLCJpbXBvcnQgSGFzaCBmcm9tICcuL19IYXNoLmpzJztcbmltcG9ydCBMaXN0Q2FjaGUgZnJvbSAnLi9fTGlzdENhY2hlLmpzJztcbmltcG9ydCBNYXAgZnJvbSAnLi9fTWFwLmpzJztcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUNsZWFyO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0tleWFibGU7XG4iLCJpbXBvcnQgaXNLZXlhYmxlIGZyb20gJy4vX2lzS2V5YWJsZS5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0TWFwRGF0YTtcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFwQ2FjaGVEZWxldGU7XG4iLCJpbXBvcnQgZ2V0TWFwRGF0YSBmcm9tICcuL19nZXRNYXBEYXRhLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUdldDtcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUhhcztcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1hcENhY2hlU2V0O1xuIiwiaW1wb3J0IG1hcENhY2hlQ2xlYXIgZnJvbSAnLi9fbWFwQ2FjaGVDbGVhci5qcyc7XG5pbXBvcnQgbWFwQ2FjaGVEZWxldGUgZnJvbSAnLi9fbWFwQ2FjaGVEZWxldGUuanMnO1xuaW1wb3J0IG1hcENhY2hlR2V0IGZyb20gJy4vX21hcENhY2hlR2V0LmpzJztcbmltcG9ydCBtYXBDYWNoZUhhcyBmcm9tICcuL19tYXBDYWNoZUhhcy5qcyc7XG5pbXBvcnQgbWFwQ2FjaGVTZXQgZnJvbSAnLi9fbWFwQ2FjaGVTZXQuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbk1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxuZXhwb3J0IGRlZmF1bHQgTWFwQ2FjaGU7XG4iLCIvKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5UHVzaDtcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcbmltcG9ydCBpc0FyZ3VtZW50cyBmcm9tICcuL2lzQXJndW1lbnRzLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICEhKHNwcmVhZGFibGVTeW1ib2wgJiYgdmFsdWUgJiYgdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0ZsYXR0ZW5hYmxlO1xuIiwiaW1wb3J0IGFycmF5UHVzaCBmcm9tICcuL19hcnJheVB1c2guanMnO1xuaW1wb3J0IGlzRmxhdHRlbmFibGUgZnJvbSAnLi9faXNGbGF0dGVuYWJsZS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgcHJlZGljYXRlIHx8IChwcmVkaWNhdGUgPSBpc0ZsYXR0ZW5hYmxlKTtcbiAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlRmxhdHRlbjtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xhbXBgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICovXG5mdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgaWYgKG51bWJlciA9PT0gbnVtYmVyKSB7XG4gICAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyO1xuICAgIH1cbiAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBudW1iZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VDbGFtcDtcbiIsImltcG9ydCBiYXNlQ2xhbXAgZnJvbSAnLi9fYmFzZUNsYW1wLmpzJztcbmltcG9ydCB0b051bWJlciBmcm9tICcuL3RvTnVtYmVyLmpzJztcblxuLyoqXG4gKiBDbGFtcHMgYG51bWJlcmAgd2l0aGluIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE51bWJlclxuICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmNsYW1wKC0xMCwgLTUsIDUpO1xuICogLy8gPT4gLTVcbiAqXG4gKiBfLmNsYW1wKDEwLCAtNSwgNSk7XG4gKiAvLyA9PiA1XG4gKi9cbmZ1bmN0aW9uIGNsYW1wKG51bWJlciwgbG93ZXIsIHVwcGVyKSB7XG4gIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdXBwZXIgPSBsb3dlcjtcbiAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIHVwcGVyID0gdG9OdW1iZXIodXBwZXIpO1xuICAgIHVwcGVyID0gdXBwZXIgPT09IHVwcGVyID8gdXBwZXIgOiAwO1xuICB9XG4gIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbG93ZXIgPSB0b051bWJlcihsb3dlcik7XG4gICAgbG93ZXIgPSBsb3dlciA9PT0gbG93ZXIgPyBsb3dlciA6IDA7XG4gIH1cbiAgcmV0dXJuIGJhc2VDbGFtcCh0b051bWJlcihudW1iZXIpLCBsb3dlciwgdXBwZXIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFtcDtcbiIsImltcG9ydCBnZXROYXRpdmUgZnJvbSAnLi9fZ2V0TmF0aXZlLmpzJztcbmltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgU2V0ID0gZ2V0TmF0aXZlKHJvb3QsICdTZXQnKTtcblxuZXhwb3J0IGRlZmF1bHQgU2V0O1xuIiwiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldENhY2hlQWRkO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzZXRDYWNoZUhhcztcbiIsImltcG9ydCBNYXBDYWNoZSBmcm9tICcuL19NYXBDYWNoZS5qcyc7XG5pbXBvcnQgc2V0Q2FjaGVBZGQgZnJvbSAnLi9fc2V0Q2FjaGVBZGQuanMnO1xuaW1wb3J0IHNldENhY2hlSGFzIGZyb20gJy4vX3NldENhY2hlSGFzLmpzJztcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG5leHBvcnQgZGVmYXVsdCBTZXRDYWNoZTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjYWNoZUhhcztcbiIsIi8qKlxuICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldFRvQXJyYXk7XG4iLCJpbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbm93O1xuIiwiaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuaW1wb3J0IG5vdyBmcm9tICcuL25vdy5qcyc7XG5pbXBvcnQgdG9OdW1iZXIgZnJvbSAnLi90b051bWJlci5qcyc7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmdcbiAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgIDogdGltZVdhaXRpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkZWJvdW5jZTtcbiIsImltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzQXJyYXlMaWtlT2JqZWN0O1xuIiwiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlJbmNsdWRlc1dpdGg7XG4iLCJpbXBvcnQgU2V0Q2FjaGUgZnJvbSAnLi9fU2V0Q2FjaGUuanMnO1xuaW1wb3J0IGFycmF5SW5jbHVkZXMgZnJvbSAnLi9fYXJyYXlJbmNsdWRlcy5qcyc7XG5pbXBvcnQgYXJyYXlJbmNsdWRlc1dpdGggZnJvbSAnLi9fYXJyYXlJbmNsdWRlc1dpdGguanMnO1xuaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlVW5hcnkgZnJvbSAnLi9fYmFzZVVuYXJ5LmpzJztcbmltcG9ydCBjYWNoZUhhcyBmcm9tICcuL19jYWNoZUhhcy5qcyc7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRpZmZlcmVuY2VgIHdpdGhvdXQgc3VwcG9ydFxuICogZm9yIGV4Y2x1ZGluZyBtdWx0aXBsZSBhcnJheXMgb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgdmFsdWVzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aDtcblxuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgdmFsdWVzID0gYXJyYXlNYXAodmFsdWVzLCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgfVxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgfVxuICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgdmFsdWVzID0gbmV3IFNldENhY2hlKHZhbHVlcyk7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID09IG51bGwgPyB2YWx1ZSA6IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgIHZhciB2YWx1ZXNJbmRleCA9IHZhbHVlc0xlbmd0aDtcbiAgICAgIHdoaWxlICh2YWx1ZXNJbmRleC0tKSB7XG4gICAgICAgIGlmICh2YWx1ZXNbdmFsdWVzSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpbmNsdWRlcyh2YWx1ZXMsIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlRGlmZmVyZW5jZTtcbiIsImltcG9ydCBiYXNlRGlmZmVyZW5jZSBmcm9tICcuL19iYXNlRGlmZmVyZW5jZS5qcyc7XG5pbXBvcnQgYmFzZUZsYXR0ZW4gZnJvbSAnLi9fYmFzZUZsYXR0ZW4uanMnO1xuaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcbmltcG9ydCBpc0FycmF5TGlrZU9iamVjdCBmcm9tICcuL2lzQXJyYXlMaWtlT2JqZWN0LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIGBhcnJheWAgdmFsdWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgb3RoZXIgZ2l2ZW4gYXJyYXlzXG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICpcbiAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqIEBzZWUgXy53aXRob3V0LCBfLnhvclxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRpZmZlcmVuY2UoWzIsIDFdLCBbMiwgM10pO1xuICogLy8gPT4gWzFdXG4gKi9cbnZhciBkaWZmZXJlbmNlID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpXG4gICAgOiBbXTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBkaWZmZXJlbmNlO1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc1N0cmluZztcbiIsImltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlVmFsdWVzO1xuIiwiaW1wb3J0IGJhc2VWYWx1ZXMgZnJvbSAnLi9fYmFzZVZhbHVlcy5qcyc7XG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8udmFsdWVzKG5ldyBGb28pO1xuICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy52YWx1ZXMoJ2hpJyk7XG4gKiAvLyA9PiBbJ2gnLCAnaSddXG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdmFsdWVzO1xuIiwiaW1wb3J0IGJhc2VJbmRleE9mIGZyb20gJy4vX2Jhc2VJbmRleE9mLmpzJztcbmltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcbmltcG9ydCBpc1N0cmluZyBmcm9tICcuL2lzU3RyaW5nLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuaW1wb3J0IHZhbHVlcyBmcm9tICcuL3ZhbHVlcy5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICogY2hlY2tlZCBmb3IgYSBzdWJzdHJpbmcgb2YgYHZhbHVlYCwgb3RoZXJ3aXNlXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBjb2xsZWN0aW9uYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gIGZyb21JbmRleCA9IChmcm9tSW5kZXggJiYgIWd1YXJkKSA/IHRvSW50ZWdlcihmcm9tSW5kZXgpIDogMDtcblxuICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGZyb21JbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgPyAoZnJvbUluZGV4IDw9IGxlbmd0aCAmJiBjb2xsZWN0aW9uLmluZGV4T2YodmFsdWUsIGZyb21JbmRleCkgPiAtMSlcbiAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5jbHVkZXM7XG4iLCJpbXBvcnQgU2V0Q2FjaGUgZnJvbSAnLi9fU2V0Q2FjaGUuanMnO1xuaW1wb3J0IGFycmF5SW5jbHVkZXMgZnJvbSAnLi9fYXJyYXlJbmNsdWRlcy5qcyc7XG5pbXBvcnQgYXJyYXlJbmNsdWRlc1dpdGggZnJvbSAnLi9fYXJyYXlJbmNsdWRlc1dpdGguanMnO1xuaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlVW5hcnkgZnJvbSAnLi9fYmFzZVVuYXJ5LmpzJztcbmltcG9ydCBjYWNoZUhhcyBmcm9tICcuL19jYWNoZUhhcy5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCwgd2l0aG91dCBzdXBwb3J0XG4gKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgdGhhdCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyB0byBpbnNwZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheXMgVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2Ygc2hhcmVkIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUludGVyc2VjdGlvbihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmNsdWRlcyA9IGNvbXBhcmF0b3IgPyBhcnJheUluY2x1ZGVzV2l0aCA6IGFycmF5SW5jbHVkZXMsXG4gICAgICBsZW5ndGggPSBhcnJheXNbMF0ubGVuZ3RoLFxuICAgICAgb3RoTGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoLFxuICAgICAgY2FjaGVzID0gQXJyYXkob3RoTGVuZ3RoKSxcbiAgICAgIG1heExlbmd0aCA9IEluZmluaXR5LFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKG90aEluZGV4LS0pIHtcbiAgICB2YXIgYXJyYXkgPSBhcnJheXNbb3RoSW5kZXhdO1xuICAgIGlmIChvdGhJbmRleCAmJiBpdGVyYXRlZSkge1xuICAgICAgYXJyYXkgPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgfVxuICAgIG1heExlbmd0aCA9IG5hdGl2ZU1pbihhcnJheS5sZW5ndGgsIG1heExlbmd0aCk7XG4gICAgY2FjaGVzW290aEluZGV4XSA9ICFjb21wYXJhdG9yICYmIChpdGVyYXRlZSB8fCAobGVuZ3RoID49IDEyMCAmJiBhcnJheS5sZW5ndGggPj0gMTIwKSlcbiAgICAgID8gbmV3IFNldENhY2hlKG90aEluZGV4ICYmIGFycmF5KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbiAgYXJyYXkgPSBhcnJheXNbMF07XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBzZWVuID0gY2FjaGVzWzBdO1xuXG4gIG91dGVyOlxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiByZXN1bHQubGVuZ3RoIDwgbWF4TGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoIShzZWVuXG4gICAgICAgICAgPyBjYWNoZUhhcyhzZWVuLCBjb21wdXRlZClcbiAgICAgICAgICA6IGluY2x1ZGVzKHJlc3VsdCwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgICkpIHtcbiAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoO1xuICAgICAgd2hpbGUgKC0tb3RoSW5kZXgpIHtcbiAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzW290aEluZGV4XTtcbiAgICAgICAgaWYgKCEoY2FjaGVcbiAgICAgICAgICAgICAgPyBjYWNoZUhhcyhjYWNoZSwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgIDogaW5jbHVkZXMoYXJyYXlzW290aEluZGV4XSwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzZWVuKSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJbnRlcnNlY3Rpb247XG4iLCJpbXBvcnQgaXNBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9pc0FycmF5TGlrZU9iamVjdC5qcyc7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBhbiBlbXB0eSBhcnJheSBpZiBpdCdzIG5vdCBhbiBhcnJheSBsaWtlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgdGhlIGNhc3QgYXJyYXktbGlrZSBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGNhc3RBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSA/IHZhbHVlIDogW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhc3RBcnJheUxpa2VPYmplY3Q7XG4iLCJpbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9fYXJyYXlNYXAuanMnO1xuaW1wb3J0IGJhc2VJbnRlcnNlY3Rpb24gZnJvbSAnLi9fYmFzZUludGVyc2VjdGlvbi5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGNhc3RBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9fY2FzdEFycmF5TGlrZU9iamVjdC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIGFsbCBnaXZlbiBhcnJheXNcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmludGVyc2VjdGlvbihbMiwgMV0sIFsyLCAzXSk7XG4gKiAvLyA9PiBbMl1cbiAqL1xudmFyIGludGVyc2VjdGlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICB2YXIgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcbiAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQpXG4gICAgOiBbXTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBpbnRlcnNlY3Rpb247XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYm9vbGVhbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQm9vbGVhbihmYWxzZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGJvb2xUYWcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0Jvb2xlYW47XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogKipOb3RlOioqIFRvIGV4Y2x1ZGUgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCwgd2hpY2ggYXJlXG4gKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTnVtYmVyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcignMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzTnVtYmVyO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc1VuZGVmaW5lZDtcbiIsImltcG9ydCBkZWJvdW5jZSBmcm9tICcuL2RlYm91bmNlLmpzJztcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gKlxuICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG4gIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGhyb3R0bGU7XG4iLCJpbXBvcnQgU2V0IGZyb20gJy4vX1NldC5qcyc7XG5pbXBvcnQgbm9vcCBmcm9tICcuL25vb3AuanMnO1xuaW1wb3J0IHNldFRvQXJyYXkgZnJvbSAnLi9fc2V0VG9BcnJheS5qcyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAqL1xudmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVNldDtcbiIsImltcG9ydCBTZXRDYWNoZSBmcm9tICcuL19TZXRDYWNoZS5qcyc7XG5pbXBvcnQgYXJyYXlJbmNsdWRlcyBmcm9tICcuL19hcnJheUluY2x1ZGVzLmpzJztcbmltcG9ydCBhcnJheUluY2x1ZGVzV2l0aCBmcm9tICcuL19hcnJheUluY2x1ZGVzV2l0aC5qcyc7XG5pbXBvcnQgY2FjaGVIYXMgZnJvbSAnLi9fY2FjaGVIYXMuanMnO1xuaW1wb3J0IGNyZWF0ZVNldCBmcm9tICcuL19jcmVhdGVTZXQuanMnO1xuaW1wb3J0IHNldFRvQXJyYXkgZnJvbSAnLi9fc2V0VG9BcnJheS5qcyc7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5pcUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgfVxuICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgIGlmIChzZXQpIHtcbiAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgfVxuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICB9XG4gIGVsc2Uge1xuICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICB9XG4gIG91dGVyOlxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgIGlmIChzZWVuW3NlZW5JbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaW5jbHVkZXMoc2VlbiwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VVbmlxO1xuIiwiaW1wb3J0IGJhc2VVbmlxIGZyb20gJy4vX2Jhc2VVbmlxLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGluIHdoaWNoIG9ubHkgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaCBlbGVtZW50XG4gKiBpcyBrZXB0LiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyXG4gKiBpbiB0aGUgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXEoWzIsIDEsIDJdKTtcbiAqIC8vID0+IFsyLCAxXVxuICovXG5mdW5jdGlvbiB1bmlxKGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5KSA6IFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1bmlxO1xuIiwiPHRlbXBsYXRlPlxyXG4gIDxDb21wb25lbnRcclxuICAgIDppcz1cInRvID8gbGlua0NvbXBvbmVudCA6ICdidXR0b24nXCJcclxuICAgIDpocmVmPVwidG9cIlxyXG4gICAgOnRvPVwidG9cIlxyXG4gICAgOnR5cGU9XCJidXR0b25UeXBlXCJcclxuICAgIDpleHRlcm5hbD1cImV4dGVybmFsXCJcclxuICAgIDpjbGFzcz1cImJ1dHRvbkNsYXNzZXNcIlxyXG4gICAgOmRpc2FibGVkPVwiaXNEaXNhYmxlZFwiXHJcbiAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgIDpzdHlsZT1cIlxyXG4gICAgICBjb2xvciAhPT0gJ3N1YnRsZScgJiYgIXRleHRcclxuICAgICAgICA/IGBib3gtc2hhZG93OiAtMXB4IDFweCA0cHggMHB4ICMwMDAwMDAwYSBpbnNldDsgYm94LXNoYWRvdzogMHB4IDJweCAycHggMHB4ICMwMDAwMDAwZDtgXHJcbiAgICAgICAgOiAnJ1xyXG4gICAgXCJcclxuICAgIEBjbGljaz1cIm9uQ2xpY2tcIlxyXG4gID5cclxuICAgIDxDb21wb25lbnQgOmlzPVwiZmluYWxMZWZ0SWNvblwiIHYtaWY9XCJmaW5hbExlZnRJY29uXCIgOmNsYXNzPVwiaWNvbkNsYXNzZXNcIiAvPlxyXG4gICAgPHNsb3Qgdi1pZj1cIiFoaWRlVGV4dFwiPkJ1dHRvbjwvc2xvdD5cclxuICAgIDxDb21wb25lbnQgOmlzPVwiaWNvblJpZ2h0XCIgdi1pZj1cImljb25SaWdodCB8fCAhbG9hZGluZ1wiIDpjbGFzcz1cImljb25DbGFzc2VzXCIgLz5cclxuICA8L0NvbXBvbmVudD5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgaXNPYmplY3RMaWtlIH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHR5cGUgeyBQcm9wQW55Q29tcG9uZW50IH0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvY29tbW9uL2NvbXBvbmVudHMnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCByZXNvbHZlRHluYW1pY0NvbXBvbmVudCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHR5cGUgeyBGb3JtQnV0dG9uU3R5bGUsIEZvcm1CdXR0b25TaXplIH0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvZm9ybS9idXR0b24nXHJcbmltcG9ydCB7IENvbW1vbkxvYWRpbmdJY29uIH0gZnJvbSAnfn4vc3JjL2xpYidcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgLyoqXHJcbiAgICogRW1pdCBNb3VzZUV2ZW50IG9uIGNsaWNrXHJcbiAgICovXHJcbiAgKGU6ICdjbGljaycsIHZhbDogTW91c2VFdmVudCk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgLyoqXHJcbiAgICogVVJMIHRvIHdoaWNoIHRvIG5hdmlnYXRlIC0gY2FuIGJlIGEgcmVsYXRpdmUgKGFwcCkgcGF0aCBvciBhbiBhYnNvbHV0ZSBsaW5rIGZvciBhbiBleHRlcm5hbCBVUkxcclxuICAgKi9cclxuICB0bz86IHN0cmluZ1xyXG4gIC8qKlxyXG4gICAqIENob29zZSBmcm9tIG9uZSBvZiAzIGJ1dHRvbiBzaXplc1xyXG4gICAqL1xyXG4gIHNpemU/OiBGb3JtQnV0dG9uU2l6ZVxyXG4gIC8qKlxyXG4gICAqIElmIHNldCwgd2lsbCBtYWtlIHRoZSBidXR0b24gdGFrZSB1cCBhbGwgYXZhaWxhYmxlIHNwYWNlIGhvcml6b250YWxseVxyXG4gICAqL1xyXG4gIGZ1bGxXaWR0aD86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBTaW1pbGFyIHRvIFwibGlua1wiLCBidXQgd2l0aG91dCBhbiB1bmRlcmxpbmUgYW5kIHBvc3NpYmx5IGluIGRpZmZlcmVudCBjb2xvcnNcclxuICAgKi9cclxuICB0ZXh0PzogYm9vbGVhblxyXG4gIC8qKlxyXG4gICAqIFdpbGwgcmVtb3ZlIHBhZGRpbmdzIGFuZCBiYWNrZ3JvdW5kLiBVc2UgZm9yIGxpbmtzLlxyXG4gICAqL1xyXG4gIGxpbms/OiBib29sZWFuXHJcbiAgLyoqXHJcbiAgICogY29sb3I6XHJcbiAgICogcHJpbWFyeTogdGhlIGRlZmF1bHQgcHJpbWFyeSBibHVlLlxyXG4gICAqIG91dGxpbmU6IGZvdW5kYXRpb24gYmFja2dyb3VuZCBhbmQgb3V0bGluZVxyXG4gICAqIHN1YnRsZTogbm8gc3R5bGluZ1xyXG4gICAqL1xyXG4gIGNvbG9yPzogRm9ybUJ1dHRvblN0eWxlXHJcbiAgLyoqXHJcbiAgICogU2hvdWxkIHJvdW5kZWQtZnVsbCBiZSBhZGRlZD86XHJcbiAgICovXHJcbiAgcm91bmRlZD86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgbG9jYXRpb24gc2hvdWxkIGJlIGZvcmNlZnVsbHkgdHJlYXRlZCBhcyBhbiBleHRlcm5hbCBVUkxcclxuICAgKiAoZm9yIHJlbGF0aXZlIHBhdGhzIHRoaXMgd2lsbCBsaWtlbHkgY2F1c2UgYSByZWRpcmVjdClcclxuICAgKi9cclxuICBleHRlcm5hbD86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgdGhlIGJ1dHRvbiBzbyB0aGF0IGl0IGNhbid0IGJlIHByZXNzZWRcclxuICAgKi9cclxuICBkaXNhYmxlZD86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBJZiBzZXQsIHdpbGwgaGF2ZSB0eXBlIHNldCB0byBcInN1Ym1pdFwiIHRvIGVuYWJsZSBpdCB0byBzdWJtaXQgYW55IHBhcmVudCBmb3Jtc1xyXG4gICAqL1xyXG4gIHN1Ym1pdD86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBBZGQgaWNvbiB0byB0aGUgbGVmdCBmcm9tIHRoZSB0ZXh0XHJcbiAgICovXHJcbiAgaWNvbkxlZnQ/OiBOdWxsYWJsZTxQcm9wQW55Q29tcG9uZW50PlxyXG4gIC8qKlxyXG4gICAqIEFkZCBpY29uIHRvIHRoZSByaWdodCBmcm9tIHRoZSB0ZXh0XHJcbiAgICovXHJcbiAgaWNvblJpZ2h0PzogTnVsbGFibGU8UHJvcEFueUNvbXBvbmVudD5cclxuICAvKipcclxuICAgKiBIaWRlIGRlZmF1bHQgc2xvdCAod2hlbiB5b3Ugd2FudCB0byBzaG93IGljb25zIG9ubHkpXHJcbiAgICovXHJcbiAgaGlkZVRleHQ/OiBib29sZWFuXHJcbiAgLyoqXHJcbiAgICogQ3VzdG9taXplIGNvbXBvbmVudCB0byBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGxpbmtzLlxyXG4gICAqXHJcbiAgICogVGhlIGNvbXBvbmVudCB3aWxsIHRyeSB0byBkeW5hbWljYWxseSByZXNvbHZlIE51eHRMaW5rIGFuZCBSb3V0ZXJMaW5rIGFuZCB1c2UgdGhvc2UsIGlmIHRoaXMgaXMgc2V0IHRvIG51bGwuXHJcbiAgICovXHJcbiAgbGlua0NvbXBvbmVudD86IE51bGxhYmxlPFByb3BBbnlDb21wb25lbnQ+XHJcbiAgLyoqXHJcbiAgICogRGlzYWJsZXMgdGhlIGJ1dHRvbiBhbmQgc2hvd3MgYSBzcGlubmluZyBsb2FkZXJcclxuICAgKi9cclxuICBsb2FkaW5nPzogYm9vbGVhblxyXG59PigpXHJcblxyXG5jb25zdCBOdXh0TGluayA9IHJlc29sdmVEeW5hbWljQ29tcG9uZW50KCdOdXh0TGluaycpXHJcbmNvbnN0IFJvdXRlckxpbmsgPSByZXNvbHZlRHluYW1pY0NvbXBvbmVudCgnUm91dGVyTGluaycpXHJcblxyXG5jb25zdCBsaW5rQ29tcG9uZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9wcy5saW5rQ29tcG9uZW50KSByZXR1cm4gcHJvcHMubGlua0NvbXBvbmVudFxyXG4gIGlmIChwcm9wcy5leHRlcm5hbCkgcmV0dXJuICdhJ1xyXG4gIGlmIChpc09iamVjdExpa2UoTnV4dExpbmspKSByZXR1cm4gTnV4dExpbmtcclxuICBpZiAoaXNPYmplY3RMaWtlKFJvdXRlckxpbmspKSByZXR1cm4gUm91dGVyTGlua1xyXG4gIHJldHVybiAnYSdcclxufSlcclxuXHJcbmNvbnN0IGJ1dHRvblR5cGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKHByb3BzLnRvKSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgaWYgKHByb3BzLnN1Ym1pdCkgcmV0dXJuICdzdWJtaXQnXHJcbiAgcmV0dXJuICdidXR0b24nXHJcbn0pXHJcblxyXG5jb25zdCBpc0Rpc2FibGVkID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMubG9hZGluZylcclxuY29uc3QgZmluYWxMZWZ0SWNvbiA9IGNvbXB1dGVkKCgpID0+XHJcbiAgcHJvcHMubG9hZGluZyA/IENvbW1vbkxvYWRpbmdJY29uIDogcHJvcHMuaWNvbkxlZnRcclxuKVxyXG5cclxuY29uc3QgYmdBbmRCb3JkZXJDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gW11cclxuXHJcbiAgY29uc3QgY29sb3JzQmdCb3JkZXIgPSB7XHJcbiAgICBzdWJ0bGU6IFtcclxuICAgICAgJ2JnLXRyYW5zcGFyZW50IGJvcmRlci10cmFuc3BhcmVudCB0ZXh0LWZvcmVncm91bmQgZm9udC1tZWRpdW0nLFxyXG4gICAgICAnaG92ZXI6YmctcHJpbWFyeS1tdXRlZCBkaXNhYmxlZDpob3ZlcjpiZy10cmFuc3BhcmVudCBmb2N1cy12aXNpYmxlOmJvcmRlci1mb3VuZGF0aW9uJ1xyXG4gICAgXSxcclxuICAgIG91dGxpbmU6IFtcclxuICAgICAgJ2JnLWZvdW5kYXRpb24gYm9yZGVyLW91dGxpbmUtMiB0ZXh0LWZvcmVncm91bmQgZm9udC1tZWRpdW0nLFxyXG4gICAgICAnaG92ZXI6YmctcHJpbWFyeS1tdXRlZCBkaXNhYmxlZDpob3ZlcjpiZy1mb3VuZGF0aW9uIGZvY3VzLXZpc2libGU6Ym9yZGVyLWZvdW5kYXRpb24nXHJcbiAgICBdLFxyXG4gICAgZGFuZ2VyOiBbXHJcbiAgICAgICdiZy1kYW5nZXIgYm9yZGVyLWRhbmdlci1kYXJrZXIgdGV4dC1mb3VuZGF0aW9uIGZvbnQtbWVkaXVtJyxcclxuICAgICAgJ2hvdmVyOmJnLWRhbmdlci1kYXJrZXIgZGlzYWJsZWQ6aG92ZXI6YmctZGFuZ2VyIGZvY3VzLXZpc2libGU6Ym9yZGVyLWZvdW5kYXRpb24nXHJcbiAgICBdLFxyXG4gICAgcHJpbWFyeTogW1xyXG4gICAgICAnYmctcHJpbWFyeSBib3JkZXItb3V0bGluZS0xIHRleHQtZm9yZWdyb3VuZC1vbi1wcmltYXJ5IGZvbnQtc2VtaWJvbGQnLFxyXG4gICAgICAnaG92ZXI6YmctcHJpbWFyeS1mb2N1cyBkaXNhYmxlZDpob3ZlcjpiZy1wcmltYXJ5IGZvY3VzLXZpc2libGU6Ym9yZGVyLWZvdW5kYXRpb24nXHJcbiAgICBdXHJcbiAgfVxyXG5cclxuICBpZiAocHJvcHMucm91bmRlZCkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCchcm91bmRlZC1mdWxsJylcclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy50ZXh0IHx8IHByb3BzLmxpbmspIHtcclxuICAgIHN3aXRjaCAocHJvcHMuY29sb3IpIHtcclxuICAgICAgY2FzZSAnc3VidGxlJzpcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZm9yZWdyb3VuZCcpXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnb3V0bGluZSc6XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWZvcmVncm91bmQnKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWRhbmdlcicpXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAncHJpbWFyeSc6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LXByaW1hcnknKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHN3aXRjaCAocHJvcHMuY29sb3IpIHtcclxuICAgICAgY2FzZSAnc3VidGxlJzpcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goLi4uY29sb3JzQmdCb3JkZXIuc3VidGxlKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJ291dGxpbmUnOlxyXG4gICAgICAgIGNsYXNzUGFydHMucHVzaCguLi5jb2xvcnNCZ0JvcmRlci5vdXRsaW5lKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKC4uLmNvbG9yc0JnQm9yZGVyLmRhbmdlcilcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICdwcmltYXJ5JzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goLi4uY29sb3JzQmdCb3JkZXIucHJpbWFyeSlcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBzaXplQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBzd2l0Y2ggKHByb3BzLnNpemUpIHtcclxuICAgIGNhc2UgJ3NtJzpcclxuICAgICAgcmV0dXJuICdoLTYgdGV4dC1ib2R5LTJ4cydcclxuICAgIGNhc2UgJ2xnJzpcclxuICAgICAgcmV0dXJuICdoLTEwIHRleHQtYm9keS1zbSdcclxuICAgIGRlZmF1bHQ6XHJcbiAgICBjYXNlICdiYXNlJzpcclxuICAgICAgcmV0dXJuICdoLTggdGV4dC1ib2R5LXhzJ1xyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IHBhZGRpbmdDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9wcy50ZXh0IHx8IHByb3BzLmxpbmspIHtcclxuICAgIHJldHVybiAncC0wJ1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaGFzSWNvbkxlZnQgPSAhIXByb3BzLmljb25MZWZ0XHJcbiAgY29uc3QgaGFzSWNvblJpZ2h0ID0gISFwcm9wcy5pY29uUmlnaHRcclxuICBjb25zdCBoaWRlVGV4dCA9IHByb3BzLmhpZGVUZXh0XHJcblxyXG4gIHN3aXRjaCAocHJvcHMuc2l6ZSkge1xyXG4gICAgY2FzZSAnc20nOlxyXG4gICAgICBpZiAoaGlkZVRleHQpIHJldHVybiAndy02J1xyXG4gICAgICBpZiAoaGFzSWNvbkxlZnQpIHJldHVybiAncHktMSBwci0yIHBsLTEnXHJcbiAgICAgIGlmIChoYXNJY29uUmlnaHQpIHJldHVybiAncHktMSBwbC0yIHByLTEnXHJcbiAgICAgIHJldHVybiAncHgtMiBweS0xJ1xyXG4gICAgY2FzZSAnbGcnOlxyXG4gICAgICBpZiAoaGlkZVRleHQpIHJldHVybiAndy0xMCdcclxuICAgICAgaWYgKGhhc0ljb25MZWZ0KSByZXR1cm4gJ3B5LTIgcHItNiBwbC00J1xyXG4gICAgICBpZiAoaGFzSWNvblJpZ2h0KSByZXR1cm4gJ3B5LTIgcGwtNiBwci00J1xyXG4gICAgICByZXR1cm4gJ3B4LTYgcHktMidcclxuICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgaWYgKGhpZGVUZXh0KSByZXR1cm4gJ3ctOCdcclxuICAgICAgaWYgKGhhc0ljb25MZWZ0KSByZXR1cm4gJ3B5LTAgcHItNCBwbC0yJ1xyXG4gICAgICBpZiAoaGFzSWNvblJpZ2h0KSByZXR1cm4gJ3B5LTAgcGwtNCBwci0yJ1xyXG4gICAgICByZXR1cm4gJ3B4LTQgcHktMCdcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBnZW5lcmFsQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBiYXNlQ2xhc3NlcyA9IFtcclxuICAgICdpbmxpbmUtZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXInLFxyXG4gICAgJ3RleHQtY2VudGVyIHNlbGVjdC1ub25lIHdoaXRlc3BhY2Utbm93cmFwJyxcclxuICAgICdvdXRsaW5lIG91dGxpbmUtMiBvdXRsaW5lLXRyYW5zcGFyZW50JyxcclxuICAgICd0cmFuc2l0aW9uIGR1cmF0aW9uLTIwMCBlYXNlLWluLW91dCBmb2N1cy12aXNpYmxlOm91dGxpbmUtb3V0bGluZS00J1xyXG4gIF1cclxuXHJcbiAgY29uc3QgYWRkaXRpb25hbENsYXNzZXMgPSBbXVxyXG5cclxuICBpZiAoIXByb3BzLnRleHQgJiYgIXByb3BzLmxpbmspIHtcclxuICAgIGFkZGl0aW9uYWxDbGFzc2VzLnB1c2goJ3JvdW5kZWQtbWQgYm9yZGVyJylcclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy5mdWxsV2lkdGgpIHtcclxuICAgIGFkZGl0aW9uYWxDbGFzc2VzLnB1c2goJ3ctZnVsbCcpXHJcbiAgfSBlbHNlIGlmICghcHJvcHMuaGlkZVRleHQpIHtcclxuICAgIGFkZGl0aW9uYWxDbGFzc2VzLnB1c2goJ21heC13LW1heCcpXHJcbiAgfVxyXG4gIGlmIChpc0Rpc2FibGVkLnZhbHVlKSB7XHJcbiAgICBhZGRpdGlvbmFsQ2xhc3Nlcy5wdXNoKCdjdXJzb3Itbm90LWFsbG93ZWQgb3BhY2l0eS02MCcpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gWy4uLmJhc2VDbGFzc2VzLCAuLi5hZGRpdGlvbmFsQ2xhc3Nlc10uam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBidXR0b25DbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBbXHJcbiAgICBnZW5lcmFsQ2xhc3Nlcy52YWx1ZSxcclxuICAgIHNpemVDbGFzc2VzLnZhbHVlLFxyXG4gICAgYmdBbmRCb3JkZXJDbGFzc2VzLnZhbHVlLFxyXG4gICAgcGFkZGluZ0NsYXNzZXMudmFsdWVcclxuICBdLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgaWNvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbJ3Nocmluay0wJ11cclxuXHJcbiAgc3dpdGNoIChwcm9wcy5zaXplKSB7XHJcbiAgICBjYXNlICdzbSc6XHJcbiAgICAgIC8vIERvbnQgYWRkIHBhZGRpbmcgdG8gaWNvbiBpZiBoaWRlVGV4dCBpcyB0cnVlIG9uIHNtIHNpemVcclxuICAgICAgaWYgKHByb3BzLmhpZGVUZXh0KSB7XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdoLTQgdy00JylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goJ2gtNCB3LTQgcC0wLjUnKVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdsZyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnaC02IHctNiBwLTEnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnYmFzZSc6XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2gtNiB3LTYgcC0xJylcclxuICAgICAgYnJlYWtcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3Qgb25DbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgaWYgKGlzRGlzYWJsZWQudmFsdWUpIHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBlbWl0KCdjbGljaycsIGUpXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8Rm9ybUJ1dHRvblxyXG4gICAgOmxpbms9XCJ1bmRlcmxpbmVcIlxyXG4gICAgOnRleHQ9XCIhdW5kZXJsaW5lXCJcclxuICAgIDp0bz1cInRvXCJcclxuICAgIDpleHRlcm5hbD1cImV4dGVybmFsXCJcclxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgIDpzaXplPVwic2l6ZVwiXHJcbiAgICA6Zm9yZWdyb3VuZC1saW5rPVwiZm9yZWdyb3VuZExpbmtcIlxyXG4gICAgOmljb24tbGVmdD1cImljb25MZWZ0XCJcclxuICAgIDppY29uLXJpZ2h0PVwiaWNvblJpZ2h0XCJcclxuICAgIDpoaWRlLXRleHQ9XCJoaWRlVGV4dFwiXHJcbiAgICByb2xlPVwibGlua1wiXHJcbiAgICBAY2xpY2suY2FwdHVyZT1cIm9uQ2xpY2tcIlxyXG4gID5cclxuICAgIDxzbG90Pkxpbms8L3Nsb3Q+XHJcbiAgPC9Gb3JtQnV0dG9uPlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgRm9ybUJ1dHRvbiBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9mb3JtL0J1dHRvbi52dWUnXHJcbmltcG9ydCB0eXBlIHsgUHJvcFR5cGUgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IFByb3BBbnlDb21wb25lbnQgfSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vY29tcG9uZW50cydcclxuXHJcbnR5cGUgTGlua1NpemUgPSAnc20nIHwgJ2Jhc2UnIHwgJ2xnJ1xyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8eyAoZTogJ2NsaWNrJywgdmFsOiBNb3VzZUV2ZW50KTogdm9pZCB9PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICB0bzoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICBleHRlcm5hbDoge1xyXG4gICAgdHlwZTogQm9vbGVhbiBhcyBQcm9wVHlwZTxPcHRpb25hbDxib29sZWFuPj4sXHJcbiAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIGRpc2FibGVkOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuIGFzIFByb3BUeXBlPE9wdGlvbmFsPGJvb2xlYW4+PixcclxuICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgc2l6ZToge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPExpbmtTaXplPixcclxuICAgIGRlZmF1bHQ6ICdiYXNlJ1xyXG4gIH0sXHJcbiAgZm9yZWdyb3VuZExpbms6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQWRkIGljb24gdG8gdGhlIGxlZnQgZnJvbSB0aGUgdGV4dFxyXG4gICAqL1xyXG4gIGljb25MZWZ0OiB7XHJcbiAgICB0eXBlOiBbT2JqZWN0LCBGdW5jdGlvbl0gYXMgUHJvcFR5cGU8TnVsbGFibGU8UHJvcEFueUNvbXBvbmVudD4+LFxyXG4gICAgZGVmYXVsdDogbnVsbFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQWRkIGljb24gdG8gdGhlIHJpZ2h0IGZyb20gdGhlIHRleHRcclxuICAgKi9cclxuICBpY29uUmlnaHQ6IHtcclxuICAgIHR5cGU6IFtPYmplY3QsIEZ1bmN0aW9uXSBhcyBQcm9wVHlwZTxOdWxsYWJsZTxQcm9wQW55Q29tcG9uZW50Pj4sXHJcbiAgICBkZWZhdWx0OiBudWxsXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBIaWRlIGRlZmF1bHQgc2xvdCAod2hlbiB5b3Ugd2FudCB0byBzaG93IGljb25zIG9ubHkpXHJcbiAgICovXHJcbiAgaGlkZVRleHQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgdW5kZXJsaW5lOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBvbkNsaWNrID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcclxuICBpZiAocHJvcHMuZGlzYWJsZWQpIHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBlbWl0KCdjbGljaycsIGUpXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsImV4cG9ydCBlbnVtIFRvYXN0Tm90aWZpY2F0aW9uVHlwZSB7XHJcbiAgU3VjY2VzcyxcclxuICBXYXJuaW5nLFxyXG4gIERhbmdlcixcclxuICBJbmZvLFxyXG4gIExvYWRpbmdcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgVG9hc3ROb3RpZmljYXRpb24gPSB7XHJcbiAgdGl0bGU/OiBzdHJpbmdcclxuICAvKipcclxuICAgKiBPcHRpb25hbGx5IHByb3ZpZGUgZXh0cmEgdGV4dFxyXG4gICAqL1xyXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXHJcbiAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IGEgQ1RBIGxpbmsgb24gdGhlIHJpZ2h0XHJcbiAgICovXHJcbiAgY3RhPzoge1xyXG4gICAgdGl0bGU6IHN0cmluZ1xyXG4gICAgdXJsPzogc3RyaW5nXHJcbiAgICBvbkNsaWNrPzogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWRcclxuICB9XHJcbiAgLyoqXHJcbiAgICogV2hldGhlciBvciBub3QgdGhlIHRvYXN0IHNob3VsZCBkaXNhcHBlYXIgYXV0b21hdGljYWxseSBhZnRlciBhIHdoaWxlLlxyXG4gICAqIERlZmF1bHRzIHRvIHRydWVcclxuICAgKi9cclxuICBhdXRvQ2xvc2U/OiBib29sZWFuXHJcbiAgaWQ/OiBzdHJpbmdcclxufVxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdlxyXG4gICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCJcclxuICAgIGNsYXNzPVwicG9pbnRlci1ldmVudHMtbm9uZSBmaXhlZCB0b3AtMCByaWdodC0wIGxlZnQtMCBib3R0b20tMCBmbGV4IGl0ZW1zLWVuZCBweC00IHB5LTYgbXQtMTAgc206aXRlbXMtc3RhcnQgc206cC02IHotWzYwXVwiXHJcbiAgPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBzcGFjZS15LTQgc206aXRlbXMtZW5kXCI+XHJcbiAgICAgIDwhLS0gTm90aWZpY2F0aW9uIHBhbmVsLCBkeW5hbWljYWxseSBpbnNlcnQgdGhpcyBpbnRvIHRoZSBsaXZlIHJlZ2lvbiB3aGVuIGl0IG5lZWRzIHRvIGJlIGRpc3BsYXllZCAtLT5cclxuICAgICAgPFRyYW5zaXRpb25cclxuICAgICAgICBlbnRlci1hY3RpdmUtY2xhc3M9XCJ0cmFuc2Zvcm0gZWFzZS1vdXQgZHVyYXRpb24tMzAwIHRyYW5zaXRpb25cIlxyXG4gICAgICAgIGVudGVyLWZyb20tY2xhc3M9XCJ0cmFuc2xhdGUteS0yIG9wYWNpdHktMCBzbTp0cmFuc2xhdGUteS0wIHNtOnRyYW5zbGF0ZS14LTJcIlxyXG4gICAgICAgIGVudGVyLXRvLWNsYXNzPVwidHJhbnNsYXRlLXktMCBvcGFjaXR5LTEwMCBzbTp0cmFuc2xhdGUteC0wXCJcclxuICAgICAgICBsZWF2ZS1hY3RpdmUtY2xhc3M9XCJ0cmFuc2l0aW9uIGVhc2UtaW4gZHVyYXRpb24tMTAwXCJcclxuICAgICAgICBsZWF2ZS1mcm9tLWNsYXNzPVwib3BhY2l0eS0xMDBcIlxyXG4gICAgICAgIGxlYXZlLXRvLWNsYXNzPVwib3BhY2l0eS0wXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHYtaWY9XCJub3RpZmljYXRpb25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IHBvaW50ZXItZXZlbnRzLWF1dG8gdy1mdWxsIG1heC13LVsyMHJlbV0gb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQgYmctZm91bmRhdGlvbiB0ZXh0LWZvcmVncm91bmQgc2hhZG93LWxnIGJvcmRlciBib3JkZXItb3V0bGluZS0yIHAtMiBwbC0zXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBpdGVtcy1jZW50ZXIgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cInNocmluay0wXCJcclxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7XHJcbiAgICAgICAgICAgICAgICAnc2VsZi1zdGFydCBtdC0wLjUnOiBub3RpZmljYXRpb24uZGVzY3JpcHRpb24gfHwgbm90aWZpY2F0aW9uLmN0YVxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPENpcmNsZUNoZWNrXHJcbiAgICAgICAgICAgICAgICB2LWlmPVwibm90aWZpY2F0aW9uLnR5cGUgPT09IFRvYXN0Tm90aWZpY2F0aW9uVHlwZS5TdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zdWNjZXNzIGgtNCB3LTRcIlxyXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxDaXJjbGVYXHJcbiAgICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJub3RpZmljYXRpb24udHlwZSA9PT0gVG9hc3ROb3RpZmljYXRpb25UeXBlLkRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyIGgtNCB3LTRcIlxyXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxBbGVydENpcmNsZVxyXG4gICAgICAgICAgICAgICAgdi1lbHNlLWlmPVwibm90aWZpY2F0aW9uLnR5cGUgPT09IFRvYXN0Tm90aWZpY2F0aW9uVHlwZS5XYXJuaW5nXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1mb3JlZ3JvdW5kLTIgaC00IHctNFwiXHJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPEluZm9cclxuICAgICAgICAgICAgICAgIHYtZWxzZS1pZj1cIm5vdGlmaWNhdGlvbi50eXBlID09PSBUb2FzdE5vdGlmaWNhdGlvblR5cGUuSW5mb1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZm9yZWdyb3VuZC0yIGgtNCB3LTRcIlxyXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxDb21tb25Mb2FkaW5nSWNvblxyXG4gICAgICAgICAgICAgICAgdi1lbHNlLWlmPVwibm90aWZpY2F0aW9uLnR5cGUgPT09IFRvYXN0Tm90aWZpY2F0aW9uVHlwZS5Mb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCBvcGFjaXR5LTgwXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBtaW4tdy1bMTByZW1dXCI+XHJcbiAgICAgICAgICAgICAgPHBcclxuICAgICAgICAgICAgICAgIHYtaWY9XCJub3RpZmljYXRpb24udGl0bGVcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQgdGV4dC1ib2R5LXhzIGZvbnQtbWVkaXVtXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBub3RpZmljYXRpb24udGl0bGUgfX1cclxuICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgPHBcclxuICAgICAgICAgICAgICAgIHYtaWY9XCJub3RpZmljYXRpb24uZGVzY3JpcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQtMiB0ZXh0LWJvZHktMnhzIGxlYWRpbmctc251Z1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3sgbm90aWZpY2F0aW9uLmRlc2NyaXB0aW9uIH19XHJcbiAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgIDxkaXYgdi1pZj1cIm5vdGlmaWNhdGlvbi5jdGFcIj5cclxuICAgICAgICAgICAgICAgIDxUZXh0TGluayA6dG89XCJub3RpZmljYXRpb24uY3RhLnVybFwiIHNpemU9XCJzbVwiIEBjbGljaz1cIm9uQ3RhQ2xpY2tcIj5cclxuICAgICAgICAgICAgICAgICAge3sgbm90aWZpY2F0aW9uLmN0YS50aXRsZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9UZXh0TGluaz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgOmljb24tbGVmdD1cIlhcIlxyXG4gICAgICAgICAgICAgIGNvbG9yPVwic3VidGxlXCJcclxuICAgICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgIGhpZGUtdGV4dFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2hyaW5rLTAgbWwtYXV0b1wiXHJcbiAgICAgICAgICAgICAgOmNsYXNzPVwie1xyXG4gICAgICAgICAgICAgICAgJ3NlbGYtc3RhcnQgLW10LTAuNSAtbXItMC41JzpcclxuICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLmRlc2NyaXB0aW9uIHx8IG5vdGlmaWNhdGlvbi5jdGFcclxuICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICBAY2xpY2s9XCJkaXNtaXNzXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIENsb3NlXHJcbiAgICAgICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L1RyYW5zaXRpb24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IFRleHRMaW5rIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi90ZXh0L0xpbmsudnVlJ1xyXG5pbXBvcnQgdHlwZSB7IE1heWJlTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBUb2FzdE5vdGlmaWNhdGlvblR5cGUgfSBmcm9tICd+fi9zcmMvaGVscGVycy9nbG9iYWwvdG9hc3QnXHJcbmltcG9ydCB0eXBlIHsgVG9hc3ROb3RpZmljYXRpb24gfSBmcm9tICd+fi9zcmMvaGVscGVycy9nbG9iYWwvdG9hc3QnXHJcbmltcG9ydCB7IENvbW1vbkxvYWRpbmdJY29uLCBGb3JtQnV0dG9uIH0gZnJvbSAnfn4vc3JjL2xpYidcclxuaW1wb3J0IHsgWCwgQ2lyY2xlQ2hlY2ssIENpcmNsZVgsIEFsZXJ0Q2lyY2xlLCBJbmZvIH0gZnJvbSAnbHVjaWRlLXZ1ZS1uZXh0J1xyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTpub3RpZmljYXRpb24nLCB2YWw6IE1heWJlTnVsbE9yVW5kZWZpbmVkPFRvYXN0Tm90aWZpY2F0aW9uPik6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgbm90aWZpY2F0aW9uOiBNYXliZU51bGxPclVuZGVmaW5lZDxUb2FzdE5vdGlmaWNhdGlvbj5cclxufT4oKVxyXG5cclxuY29uc3QgZGlzbWlzcyA9ICgpID0+IHtcclxuICBlbWl0KCd1cGRhdGU6bm90aWZpY2F0aW9uJywgbnVsbClcclxufVxyXG5cclxuY29uc3Qgb25DdGFDbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgcHJvcHMubm90aWZpY2F0aW9uPy5jdGE/Lm9uQ2xpY2s/LihlKVxyXG4gIGRpc21pc3MoKVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iLCJjb25zdCBLRVlCT0FSRF9DTElDS19DSEFSID0gJ0VudGVyJ1xyXG5cclxuLyoqXHJcbiAqIFZpc2libGUsIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cyB3aXRoIGNsaWNrIGhhbmRsZXJzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUga2V5Ym9hcmQgbGlzdGVuZXIgZm9yIGFjY2Vzc2liaWxpdHkuXHJcbiAqIFlvdSBjYW4gd3JhcCB5b3VyIGNsaWNrIGhhbmRsZXIgd2l0aCB0aGlzIGluIEBrZXlwcmVzcywgdG8gcnVuIGl0IHdoZW4gZW50ZXIgaXMgcHJlc3NlZCBvbiB0aGUgc2VsZWN0ZWQgY29tcG9uZW50XHJcbiAqIEBkZXByZWNhdGVkIFVzZSB2S2V5Ym9hcmRDbGlja2FibGUgZGlyZWN0aXZlIGluc3RlYWRcclxuICogU2VlIG1vcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWUtYTExeS9lc2xpbnQtcGx1Z2luLXZ1ZWpzLWFjY2Vzc2liaWxpdHkvYmxvYi9tYWluL2RvY3MvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cy5tZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGtleWJvYXJkQ2xpY2soY2I6IChlOiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkKSB7XHJcbiAgcmV0dXJuIChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZS5jb2RlICE9PSBLRVlCT0FSRF9DTElDS19DSEFSKSByZXR1cm5cclxuICAgIGNiKGUpXHJcbiAgfVxyXG59XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3BhbiA6Y2xhc3M9XCJiYWRnZUNsYXNzZXNcIj5cclxuICAgIDxzdmcgdi1pZj1cImRvdFwiIDpjbGFzcz1cImRvdENsYXNzZXNcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCA4IDhcIj5cclxuICAgICAgPGNpcmNsZSBjeD1cIjRcIiBjeT1cIjRcIiByPVwiM1wiIC8+XHJcbiAgICA8L3N2Zz5cclxuICAgIDxzcGFuIGNsYXNzPVwid2hpdGVzcGFjZS1ub3dyYXBcIj5cclxuICAgICAgPHNsb3Q+QmFkZ2U8L3Nsb3Q+XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8YnV0dG9uIHYtaWY9XCJpY29uTGVmdFwiIDpjbGFzcz1cImljb25DbGFzc2VzXCIgQGNsaWNrPVwib25JY29uQ2xpY2soJGV2ZW50KVwiPlxyXG4gICAgICA8Q29tcG9uZW50IDppcz1cImljb25MZWZ0XCIgOmNsYXNzPVwiWydoLTQgdy00JywgYmFkZ2VEb3RJY29uQ29sb3JDbGFzc2VzXVwiIC8+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L3NwYW4+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7IFByb3BBbnlDb21wb25lbnQgfSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vY29tcG9uZW50cydcclxuXHJcbnR5cGUgQmFkZ2VTaXplID0gJ2Jhc2UnIHwgJ2xnJ1xyXG50eXBlIEJhZGdlQ29sb3JzID0gJ3ByaW1hcnknIHwgJ3NlY29uZGFyeSdcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICdjbGljay1pY29uJywgdjogTW91c2VFdmVudCk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgc2l6ZT86IEJhZGdlU2l6ZVxyXG4gICAgY29sb3I/OiBCYWRnZUNvbG9yc1xyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGV4dCAmIGJnIGNvbG9yLiBEZWZhdWx0cyB0byBwcmltYXJ5IHZhcmlhdGlvbi5cclxuICAgICAqL1xyXG4gICAgY29sb3JDbGFzc2VzPzogc3RyaW5nXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IGRvdCB0byB0aGUgcmlnaHRcclxuICAgICAqL1xyXG4gICAgZG90PzogYm9vbGVhblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGRvdC9pY29uIGJnIGNvbG9yLiBEZWZhdWx0cyB0byBwcmltYXJ5IHZhcmlhdGlvbi5cclxuICAgICAqL1xyXG4gICAgZG90SWNvbkNvbG9yQ2xhc3Nlcz86IHN0cmluZ1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3B0aW9uYWxseSBzaG93IGljb24gdG8gdGhlIGxlZnQgb2YgdGhlIHRleHRcclxuICAgICAqL1xyXG4gICAgaWNvbkxlZnQ/OiBQcm9wQW55Q29tcG9uZW50XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG1vcmUgc3F1YXJlLCBidXQgc3RpbGwgcm91bmRlZCBsb29rXHJcbiAgICAgKi9cclxuICAgIHJvdW5kZWQ/OiBib29sZWFuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFjayBpY29uIGNsaWNrc1xyXG4gICAgICovXHJcbiAgICBjbGlja2FibGVJY29uPzogYm9vbGVhblxyXG4gIH0+KCksXHJcbiAge1xyXG4gICAgc2l6ZTogJ2Jhc2UnLFxyXG4gICAgY29sb3I6ICdwcmltYXJ5J1xyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgYmFkZ2VDb2xvckNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKHByb3BzLmNvbG9yQ2xhc3Nlcykge1xyXG4gICAgcmV0dXJuIHByb3BzLmNvbG9yQ2xhc3Nlc1xyXG4gIH0gZWxzZSBpZiAocHJvcHMuY29sb3IgPT09ICdzZWNvbmRhcnknKSB7XHJcbiAgICByZXR1cm4gJ2JnLWhpZ2hsaWdodC0zIHRleHQtZm9yZWdyb3VuZC0yJ1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gJ2JnLWluZm8tbGlnaHRlciB0ZXh0LXByaW1hcnktZm9jdXMgZGFyazp0ZXh0LWZvcmVncm91bmQnXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgYmFkZ2VEb3RJY29uQ29sb3JDbGFzc2VzID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcHJvcHMuZG90SWNvbkNvbG9yQ2xhc3NlcyB8fCAndGV4dC1ibHVlLTQwMCdcclxuKVxyXG5cclxuY29uc3QgYmFkZ2VDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gW1xyXG4gICAgJ2lubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBzZWxlY3Qtbm9uZScsXHJcbiAgICBiYWRnZUNvbG9yQ2xhc3Nlcy52YWx1ZSxcclxuICAgIHByb3BzLnNpemUgPT09ICdsZydcclxuICAgICAgPyAncHgtMyBweS0wLjUgdGV4dC1ib2R5LTJ4cydcclxuICAgICAgOiAncC0xIHRleHQtYm9keS0zeHMgdGV4dC1ib2R5LTN4cyBmb250LW1lZGl1bSdcclxuICBdXHJcblxyXG4gIGlmIChwcm9wcy5yb3VuZGVkKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3JvdW5kZWQnKVxyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKFxyXG4gICAgICBwcm9wcy5zaXplID09PSAnbGcnXHJcbiAgICAgICAgPyAncHgtMiBweS0wLjUgdGV4dC1ib2R5LTJ4cydcclxuICAgICAgICA6ICdweC0xLjEgcHktMC41IHRleHQtYm9keS0zeHMgZm9udC1tZWRpdW0nXHJcbiAgICApXHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncm91bmRlZC1mdWxsJylcclxuICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgcHJvcHMuc2l6ZSA9PT0gJ2xnJ1xyXG4gICAgICAgID8gJ3B4LTIuNSBweS0wLjUgdGV4dC1ib2R5LTJ4cydcclxuICAgICAgICA6ICdweC0yLjUgcHktMC41IHRleHQtYm9keS0zeHMgZm9udC1tZWRpdW0nXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGljb25DbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gW1xyXG4gICAgJ210LTAuNSBtbC0wLjUgaW5saW5lLWZsZXggaC00IHctNCBmbGV4LXNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgZm9jdXM6b3V0bGluZS1ub25lJ1xyXG4gIF1cclxuXHJcbiAgaWYgKHByb3BzLmNsaWNrYWJsZUljb24pIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnY3Vyc29yLXBvaW50ZXInKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2N1cnNvci1kZWZhdWx0JylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgZG90Q2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFtcclxuICAgICctbWwtMC41IG1yLTEuNSBoLTIgdy0yJyxcclxuICAgIGJhZGdlRG90SWNvbkNvbG9yQ2xhc3Nlcy52YWx1ZVxyXG4gIF1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBvbkljb25DbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgaWYgKCFwcm9wcy5jbGlja2FibGVJY29uKSB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXHJcbiAgICBlLnByZXZlbnREZWZhdWx0KClcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgZW1pdCgnY2xpY2staWNvbicsIGUpXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsImxldCBqdW5rVmFyaWFibGU6IHN0cmluZ1tdID0gW11cclxuXHJcbi8qKlxyXG4gKiBJZiB5b3UgdXNlIGNvbmNhdGVuYXRpb24gb3IgdmFyaWFibGVzIHRvIGJ1aWxkIHRhaWx3aW5kIGNsYXNzZXMsIFB1cmdlQ1NTIHdvbid0IHBpY2sgdXAgb24gdGhlbVxyXG4gKiBkdXJpbmcgYnVpbGQgYW5kIHdpbGwgbm90IGFkZCB0aGVtIHRvIHRoZSBidWlsZC4gU28geW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBqdXN0IGFkZCBzdHJpbmdcclxuICogbGl0ZXJhbHMgb2YgdGFpbHdpbmQgY2xhc3NlcyBzbyBQdXJnZUNTUyBwaWNrcyB1cCBvbiB0aGVtLlxyXG4gKlxyXG4gKiBXaGlsZSB5b3UgY291bGQganVzdCBkZWZpbmUgYW4gdW51c2VkIGFycmF5IG9mIHRoZXNlIGNsYXNzZXMsIGVzbGludC9UUyB3aWxsIGJvdGhlciB5b3UgYWJvdXQgdGhlIHVudXNlZFxyXG4gKiB2YXJpYWJsZSBzbyBpdCdzIGJldHRlciB0byB1c2UgdGhpcyBpbnN0ZWFkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtDbGFzc2VzVXNlZChjbGFzc2VzOiBzdHJpbmdbXSkge1xyXG4gIC8vIHRoaXMgZG9lc24ndCBkbyBhbnl0aGluZywgZXhjZXB0IHRyaWNrIHRoZSBjb21waWxlciBpbnRvIHRoaW5raW5nIHRoaXMgaXNuJ3QgYSBwdXJlXHJcbiAgLy8gZnVuY3Rpb24gc28gdGhhdCB0aGUgaW52b2NhdGlvbnMgYXJlbid0IHRyZWUtc2hha2VuIG91dFxyXG4gIGp1bmtWYXJpYWJsZSA9IGp1bmtWYXJpYWJsZSA/IGNsYXNzZXMgOiBjbGFzc2VzLnNsaWNlKClcclxufVxyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgdGFpbHdpbmQgYnJlYWtwb2ludCBzZXQuIEVhY2ggdmFsdWUgaXMgdGhlIG1pbmltdW0gd2lkdGggKGluIHBpeGVscykgZXhwZWN0ZWQgZm9yIGVhY2ggYnJlYWtwb2ludC5cclxuICovXHJcbmV4cG9ydCBlbnVtIFRhaWx3aW5kQnJlYWtwb2ludHMge1xyXG4gIHNtID0gNjQwLFxyXG4gIG1kID0gNzY4LFxyXG4gIGxnID0gMTAyNCxcclxuICB4bCA9IDEyODAsXHJcbiAgJzJ4bCcgPSAxNTM2XHJcbn1cclxuIiwiaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgVG9SZWZzIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgSG9yaXpvbnRhbE9yVmVydGljYWwsXHJcbiAgU3RlcENvcmVUeXBlXHJcbn0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvY29tbW9uL2NvbXBvbmVudHMnXHJcbmltcG9ydCB7IGNsYW1wIH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHsgVGFpbHdpbmRCcmVha3BvaW50cywgbWFya0NsYXNzZXNVc2VkIH0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvdGFpbHdpbmQnXHJcblxyXG5leHBvcnQgdHlwZSBTdGVwc1BhZGRpbmcgPSAnYmFzZScgfCAneHMnIHwgJ3NtJ1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0ZXBzSW50ZXJuYWxzKHBhcmFtczoge1xyXG4gIHByb3BzOiBUb1JlZnM8e1xyXG4gICAgb3JpZW50YXRpb24/OiBIb3Jpem9udGFsT3JWZXJ0aWNhbFxyXG4gICAgc3RlcHM6IFN0ZXBDb3JlVHlwZVtdXHJcbiAgICBtb2RlbFZhbHVlPzogbnVtYmVyXHJcbiAgICBnb1ZlcnRpY2FsQmVsb3c/OiBUYWlsd2luZEJyZWFrcG9pbnRzXHJcbiAgICBub25JbnRlcmFjdGl2ZT86IGJvb2xlYW5cclxuICAgIHN0ZXBzUGFkZGluZz86IFN0ZXBzUGFkZGluZ1xyXG4gIH0+XHJcbiAgZW1pdDoge1xyXG4gICAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbDogbnVtYmVyKTogdm9pZFxyXG4gIH1cclxufSkge1xyXG4gIGNvbnN0IHtcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIG1vZGVsVmFsdWUsXHJcbiAgICAgIHN0ZXBzLFxyXG4gICAgICBvcmllbnRhdGlvbixcclxuICAgICAgZ29WZXJ0aWNhbEJlbG93LFxyXG4gICAgICBub25JbnRlcmFjdGl2ZSxcclxuICAgICAgc3RlcHNQYWRkaW5nXHJcbiAgICB9LFxyXG4gICAgZW1pdFxyXG4gIH0gPSBwYXJhbXNcclxuXHJcbiAgY29uc3QgZmluYWxPcmllbnRhdGlvbiA9IGNvbXB1dGVkKFxyXG4gICAgKCk6IEhvcml6b250YWxPclZlcnRpY2FsID0+XHJcbiAgICAgIG9yaWVudGF0aW9uPy52YWx1ZSA9PT0gJ3ZlcnRpY2FsJyA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCdcclxuICApXHJcblxyXG4gIGNvbnN0IHZhbHVlID0gY29tcHV0ZWQoe1xyXG4gICAgZ2V0OiAoKSA9PiBjbGFtcChtb2RlbFZhbHVlPy52YWx1ZSB8fCAwLCAtMSwgc3RlcHMudmFsdWUubGVuZ3RoKSxcclxuICAgIHNldDogKG5ld1ZhbCkgPT4gZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjbGFtcChuZXdWYWwsIDAsIHN0ZXBzLnZhbHVlLmxlbmd0aCkpXHJcbiAgfSlcclxuXHJcbiAgY29uc3QgZ2V0U3RlcERpc3BsYXlWYWx1ZSA9IChzdGVwOiBudW1iZXIpID0+IGAke3N0ZXAgKyAxfWBcclxuICBjb25zdCBpc0N1cnJlbnRTdGVwID0gKHN0ZXA6IG51bWJlcikgPT4gc3RlcCA9PT0gdmFsdWUudmFsdWVcclxuICBjb25zdCBpc0ZpbmlzaGVkU3RlcCA9IChzdGVwOiBudW1iZXIpID0+IHN0ZXAgPCB2YWx1ZS52YWx1ZVxyXG5cclxuICBjb25zdCBzd2l0Y2hTdGVwID0gKG5ld1N0ZXA6IG51bWJlciwgZT86IE1vdXNlRXZlbnQpID0+IHtcclxuICAgIGlmIChub25JbnRlcmFjdGl2ZT8udmFsdWUpIHtcclxuICAgICAgZT8ucHJldmVudERlZmF1bHQoKVxyXG4gICAgICBlPy5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgICBlPy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICB2YWx1ZS52YWx1ZSA9IG5ld1N0ZXBcclxuXHJcbiAgICBjb25zdCBzdGVwT2JqID0gc3RlcHMudmFsdWVbdmFsdWUudmFsdWVdXHJcbiAgICBzdGVwT2JqPy5vbkNsaWNrPy4oKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgbGlzdENsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsnZmxleCddXHJcblxyXG4gICAgbGV0IHBhZGRpbmdIb3Jpem9udGFsOiBzdHJpbmdcclxuICAgIGxldCBwYWRkaW5nVmVydGljYWw6IHN0cmluZ1xyXG4gICAgaWYgKHN0ZXBzUGFkZGluZz8udmFsdWUgPT09ICd4cycpIHtcclxuICAgICAgcGFkZGluZ0hvcml6b250YWwgPSAnc3BhY2UteC0yJ1xyXG4gICAgICBwYWRkaW5nVmVydGljYWwgPSAnc3BhY2UteS0xJ1xyXG4gICAgfSBlbHNlIGlmIChzdGVwc1BhZGRpbmc/LnZhbHVlID09PSAnc20nKSB7XHJcbiAgICAgIHBhZGRpbmdIb3Jpem9udGFsID0gJ3NwYWNlLXgtNCdcclxuICAgICAgcGFkZGluZ1ZlcnRpY2FsID0gJ3NwYWNlLXktMSdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhZGRpbmdIb3Jpem9udGFsID0gJ3NwYWNlLXgtNidcclxuICAgICAgcGFkZGluZ1ZlcnRpY2FsID0gJ3NwYWNlLXktNCdcclxuICAgIH1cclxuXHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2ZsZXgnKVxyXG4gICAgaWYgKGZpbmFsT3JpZW50YXRpb24udmFsdWUgPT09ICd2ZXJ0aWNhbCcgfHwgZ29WZXJ0aWNhbEJlbG93Py52YWx1ZSkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goYGZsZXgtY29sICR7cGFkZGluZ1ZlcnRpY2FsfSBqdXN0aWZ5LWNlbnRlcmApXHJcblxyXG4gICAgICBpZiAoZ29WZXJ0aWNhbEJlbG93Py52YWx1ZSA9PT0gVGFpbHdpbmRCcmVha3BvaW50cy5zbSkge1xyXG4gICAgICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgICAgIGBzbTpmbGV4LXJvdyBzbTpzcGFjZS15LTAgc206anVzdGlmeS1zdGFydCBzbToke3BhZGRpbmdIb3Jpem9udGFsfSBzbTppdGVtcy1jZW50ZXJgXHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2UgaWYgKGdvVmVydGljYWxCZWxvdz8udmFsdWUgPT09IFRhaWx3aW5kQnJlYWtwb2ludHMubWQpIHtcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goXHJcbiAgICAgICAgICBgbWQ6ZmxleC1yb3cgbWQ6c3BhY2UteS0wIG1kOmp1c3RpZnktc3RhcnQgbWQ6JHtwYWRkaW5nSG9yaXpvbnRhbH0gbWQ6aXRlbXMtY2VudGVyYFxyXG4gICAgICAgIClcclxuICAgICAgfSBlbHNlIGlmIChnb1ZlcnRpY2FsQmVsb3c/LnZhbHVlID09PSBUYWlsd2luZEJyZWFrcG9pbnRzLmxnKSB7XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKFxyXG4gICAgICAgICAgYGxnOmZsZXgtcm93IGxnOnNwYWNlLXktMCBsZzpqdXN0aWZ5LXN0YXJ0IGxnOiR7cGFkZGluZ0hvcml6b250YWx9IGxnOml0ZW1zLWNlbnRlcmBcclxuICAgICAgICApXHJcbiAgICAgIH0gZWxzZSBpZiAoZ29WZXJ0aWNhbEJlbG93Py52YWx1ZSA9PT0gVGFpbHdpbmRCcmVha3BvaW50cy54bCkge1xyXG4gICAgICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgICAgIGB4bDpmbGV4LXJvdyB4bDpzcGFjZS15LTAgeGw6anVzdGlmeS1zdGFydCB4bDoke3BhZGRpbmdIb3Jpem9udGFsfSB4bDppdGVtcy1jZW50ZXJgXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goYGZsZXgtcm93ICR7cGFkZGluZ0hvcml6b250YWx9IGl0ZW1zLWNlbnRlcmApXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbiAgfSlcclxuXHJcbiAgY29uc3QgbGlua0NsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsnZmxleCBpdGVtcy1jZW50ZXInXVxyXG5cclxuICAgIGlmICghbm9uSW50ZXJhY3RpdmU/LnZhbHVlKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnY3Vyc29yLXBvaW50ZXInKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB2YWx1ZSxcclxuICAgIGlzQ3VycmVudFN0ZXAsXHJcbiAgICBpc0ZpbmlzaGVkU3RlcCxcclxuICAgIHN3aXRjaFN0ZXAsXHJcbiAgICBnZXRTdGVwRGlzcGxheVZhbHVlLFxyXG4gICAgbGlzdENsYXNzZXMsXHJcbiAgICBsaW5rQ2xhc3NlcyxcclxuICAgIG9yaWVudGF0aW9uOiBmaW5hbE9yaWVudGF0aW9uXHJcbiAgfVxyXG59XHJcblxyXG4vLyB0byBhbGxvdyBmb3IgZHluYW1pYyBjbGFzcyBidWlsZGluZyBhYm92ZTpcclxubWFya0NsYXNzZXNVc2VkKFtcclxuICAnc206c3BhY2UteC02JyxcclxuICAnbWQ6c3BhY2UteC02JyxcclxuICAnbGc6c3BhY2UteC02JyxcclxuICAneGw6c3BhY2UteC02JyxcclxuICAnc206c3BhY2UteC0yJyxcclxuICAnbWQ6c3BhY2UteC0yJyxcclxuICAnbGc6c3BhY2UteC0yJyxcclxuICAneGw6c3BhY2UteC0yJyxcclxuICAnc206c3BhY2UteC00JyxcclxuICAnbWQ6c3BhY2UteC00JyxcclxuICAnbGc6c3BhY2UteC00JyxcclxuICAneGw6c3BhY2UteC00J1xyXG5dKVxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPG5hdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXJcIiA6YXJpYS1sYWJlbD1cImFyaWFMYWJlbCB8fCAnUHJvZ3Jlc3Mgc3RlcHMnXCI+XHJcbiAgICA8b2wgOmNsYXNzPVwibGlzdENsYXNzZXNcIj5cclxuICAgICAgPGxpIHYtZm9yPVwiKHN0ZXAsIGkpIGluIHN0ZXBzXCIgOmtleT1cInN0ZXAubmFtZVwiPlxyXG4gICAgICAgIDxhXHJcbiAgICAgICAgICB2LWlmPVwiaXNGaW5pc2hlZFN0ZXAoaSlcIlxyXG4gICAgICAgICAgOmhyZWY9XCJzdGVwLmhyZWZcIlxyXG4gICAgICAgICAgOmNsYXNzPVwibGlua0NsYXNzZXNcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiKGUpID0+IHN3aXRjaFN0ZXAoaSwgZSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMiBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2hyaW5rLTAgaC03IHctNyByb3VuZGVkLWZ1bGwgYm9yZGVyIGJvcmRlci1wcmltYXJ5IHRleHQtd2hpdGUgYmctcHJpbWFyeSBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgc2VsZWN0LW5vbmVcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPENoZWNrSWNvbiBjbGFzcz1cInctNCBoLTRcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ib2R5LXhzIGZvbnQtbWVkaXVtIHRleHQtcHJpbWFyeVwiPnt7IHN0ZXAubmFtZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgdi1pZj1cInN0ZXAuZGVzY3JpcHRpb25cIiBjbGFzcz1cInRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTJcIj5cclxuICAgICAgICAgICAgICAgIHt7IHN0ZXAuZGVzY3JpcHRpb24gfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2E+XHJcbiAgICAgICAgPGFcclxuICAgICAgICAgIHYtZWxzZS1pZj1cImlzQ3VycmVudFN0ZXAoaSlcIlxyXG4gICAgICAgICAgOmhyZWY9XCJzdGVwLmhyZWZcIlxyXG4gICAgICAgICAgOmNsYXNzPVwibGlua0NsYXNzZXNcIlxyXG4gICAgICAgICAgYXJpYS1jdXJyZW50PVwic3RlcFwiXHJcbiAgICAgICAgICBAY2xpY2s9XCIoZSkgPT4gc3dpdGNoU3RlcChpLCBlKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggc3BhY2UteC0yIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzaHJpbmstMCBoLTcgdy03IHRleHQtYm9keS14cyByb3VuZGVkLWZ1bGwgYm9yZGVyIGJvcmRlci1wcmltYXJ5IGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzZWxlY3Qtbm9uZSB0ZXh0LXByaW1hcnlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgZ2V0U3RlcERpc3BsYXlWYWx1ZShpKSB9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ib2R5LXhzIGZvbnQtbWVkaXVtIHRleHQtcHJpbWFyeVwiPnt7IHN0ZXAubmFtZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgdi1pZj1cInN0ZXAuZGVzY3JpcHRpb25cIiBjbGFzcz1cInRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTJcIj5cclxuICAgICAgICAgICAgICAgIHt7IHN0ZXAuZGVzY3JpcHRpb24gfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2E+XHJcbiAgICAgICAgPGFcclxuICAgICAgICAgIHYtZWxzZVxyXG4gICAgICAgICAgOmhyZWY9XCJzdGVwLmhyZWZcIlxyXG4gICAgICAgICAgOmNsYXNzPVwibGlua0NsYXNzZXNcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiKGUpID0+IHN3aXRjaFN0ZXAoaSwgZSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMiBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2hyaW5rLTAgaC03IHctNyByb3VuZGVkLWZ1bGwgYm9yZGVyIGJvcmRlci1mb3JlZ3JvdW5kLTMgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHNlbGVjdC1ub25lIHRleHQtZm9yZWdyb3VuZC0zXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGdldFN0ZXBEaXNwbGF5VmFsdWUoaSkgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYm9keS14cyBmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQtMlwiPlxyXG4gICAgICAgICAgICAgICAge3sgc3RlcC5uYW1lIH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiB2LWlmPVwic3RlcC5kZXNjcmlwdGlvblwiIGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0ZXh0LWZvcmVncm91bmQtMlwiPlxyXG4gICAgICAgICAgICAgICAge3sgc3RlcC5kZXNjcmlwdGlvbiB9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC9saT5cclxuICAgIDwvb2w+XHJcbiAgPC9uYXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IENoZWNrSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzIwL3NvbGlkJ1xyXG5pbXBvcnQgeyB0b1JlZnMgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB7IHVzZVN0ZXBzSW50ZXJuYWxzIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL2NvbW1vbi9zdGVwcydcclxuaW1wb3J0IHR5cGUgeyBTdGVwc1BhZGRpbmcgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvY29tbW9uL3N0ZXBzJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgSG9yaXpvbnRhbE9yVmVydGljYWwsXHJcbiAgTnVtYmVyU3RlcFR5cGVcclxufSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vY29tcG9uZW50cydcclxuaW1wb3J0IHsgVGFpbHdpbmRCcmVha3BvaW50cyB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL3RhaWx3aW5kJ1xyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsOiBudW1iZXIpOiB2b2lkXHJcbn0+KClcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIGFyaWFMYWJlbD86IHN0cmluZ1xyXG4gIG9yaWVudGF0aW9uPzogSG9yaXpvbnRhbE9yVmVydGljYWxcclxuICBzdGVwczogTnVtYmVyU3RlcFR5cGVbXVxyXG4gIG1vZGVsVmFsdWU/OiBudW1iZXJcclxuICBnb1ZlcnRpY2FsQmVsb3c/OiBUYWlsd2luZEJyZWFrcG9pbnRzXHJcbiAgbm9uSW50ZXJhY3RpdmU/OiBib29sZWFuXHJcbiAgc3RlcHNQYWRkaW5nPzogU3RlcHNQYWRkaW5nXHJcbn0+KClcclxuXHJcbmNvbnN0IHtcclxuICBpc0N1cnJlbnRTdGVwLFxyXG4gIGlzRmluaXNoZWRTdGVwLFxyXG4gIHN3aXRjaFN0ZXAsXHJcbiAgZ2V0U3RlcERpc3BsYXlWYWx1ZSxcclxuICBsaXN0Q2xhc3NlcyxcclxuICBsaW5rQ2xhc3Nlc1xyXG59ID0gdXNlU3RlcHNJbnRlcm5hbHMoe1xyXG4gIHByb3BzOiB0b1JlZnMocHJvcHMpLFxyXG4gIGVtaXRcclxufSlcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8bmF2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlclwiIDphcmlhLWxhYmVsPVwiYXJpYUxhYmVsIHx8ICdQcm9ncmVzcyBzdGVwcydcIj5cclxuICAgIDxvbCA6Y2xhc3M9XCJbbGlzdENsYXNzZXMsIGV4dHJhTGlzdENsYXNzZXNdXCI+XHJcbiAgICAgIDxsaSB2LWZvcj1cIihzdGVwLCBpKSBpbiBzdGVwc1wiIDprZXk9XCJzdGVwLm5hbWVcIj5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgdi1pZj1cImlzRmluaXNoZWRTdGVwKGkpXCJcclxuICAgICAgICAgIDpocmVmPVwic3RlcC5ocmVmXCJcclxuICAgICAgICAgIDpjbGFzcz1cImxpbmtDbGFzc2VzXCJcclxuICAgICAgICAgIEBjbGljaz1cIihlKSA9PiBzd2l0Y2hTdGVwKGksIGUpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlbGF0aXZlIGZsZXggaC01IHctNSBmbGV4LXNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8c3BhbiB2LWlmPVwiYmFzaWNcIiBjbGFzcz1cImgtMyB3LTMgcm91bmRlZC1mdWxsIGJnLWZvcmVncm91bmQtMlwiIC8+XHJcbiAgICAgICAgICAgIDxDaGVja0NpcmNsZUljb25cclxuICAgICAgICAgICAgICB2LWVsc2VcclxuICAgICAgICAgICAgICBjbGFzcz1cImgtZnVsbCB3LWZ1bGwgdGV4dC1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gOmNsYXNzPVwiWyd0ZXh0LWZvcmVncm91bmQnLCBsYWJlbENsYXNzZXNdXCI+XHJcbiAgICAgICAgICAgIHt7IHN0ZXAubmFtZSB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgdi1lbHNlLWlmPVwiaXNDdXJyZW50U3RlcChpKVwiXHJcbiAgICAgICAgICA6aHJlZj1cInN0ZXAuaHJlZlwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJsaW5rQ2xhc3Nlc1wiXHJcbiAgICAgICAgICBhcmlhLWN1cnJlbnQ9XCJzdGVwXCJcclxuICAgICAgICAgIEBjbGljaz1cIihlKSA9PiBzd2l0Y2hTdGVwKGksIGUpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggaC01IHctNSBmbGV4LXNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXHJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiYmFzaWNcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImgtMyB3LTMgcm91bmRlZC1mdWxsIGJnLWZvcmVncm91bmRcIiAvPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWJzb2x1dGUgaC00IHctNCByb3VuZGVkLWZ1bGwgYmctb3V0bGluZS0yXCIgLz5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlbGF0aXZlIGJsb2NrIGgtMiB3LTIgcm91bmRlZC1mdWxsIGJnLXByaW1hcnktZm9jdXNcIiAvPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gOmNsYXNzPVwiWyd0ZXh0LXByaW1hcnktZm9jdXMnLCBsYWJlbENsYXNzZXNdXCI+XHJcbiAgICAgICAgICAgIHt7IHN0ZXAubmFtZSB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgICA6aHJlZj1cInN0ZXAuaHJlZlwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJsaW5rQ2xhc3Nlc1wiXHJcbiAgICAgICAgICBAY2xpY2s9XCIoZSkgPT4gc3dpdGNoU3RlcChpLCBlKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggaC01IHctNSBmbGV4LXNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXHJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJiYXNpY1wiIGNsYXNzPVwiaC0zIHctMyByb3VuZGVkLWZ1bGwgYmctZm9yZWdyb3VuZC0yXCIgLz5cclxuICAgICAgICAgICAgPGRpdiB2LWVsc2UgY2xhc3M9XCJoLTQgdy00IHJvdW5kZWQtZnVsbCBiZy1mb3JlZ3JvdW5kLWRpc2FibGVkXCIgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHAgOmNsYXNzPVwiWyd0ZXh0LWZvcmVncm91bmQtZGlzYWJsZWQnLCBsYWJlbENsYXNzZXNdXCI+XHJcbiAgICAgICAgICAgIHt7IHN0ZXAubmFtZSB9fVxyXG4gICAgICAgICAgPC9wPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC9saT5cclxuICAgIDwvb2w+XHJcbiAgPC9uYXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IENoZWNrQ2lyY2xlSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzIwL3NvbGlkJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgdG9SZWZzIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyB1c2VTdGVwc0ludGVybmFscyB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9jb21tb24vc3RlcHMnXHJcbmltcG9ydCB0eXBlIHsgU3RlcHNQYWRkaW5nIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL2NvbW1vbi9zdGVwcydcclxuaW1wb3J0IHR5cGUge1xyXG4gIEJ1bGxldFN0ZXBUeXBlLFxyXG4gIEhvcml6b250YWxPclZlcnRpY2FsXHJcbn0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvY29tbW9uL2NvbXBvbmVudHMnXHJcbmltcG9ydCB7IFRhaWx3aW5kQnJlYWtwb2ludHMgfSBmcm9tICd+fi9zcmMvaGVscGVycy90YWlsd2luZCdcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbDogbnVtYmVyKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBhcmlhTGFiZWw/OiBzdHJpbmdcclxuICBiYXNpYz86IGJvb2xlYW5cclxuICBvcmllbnRhdGlvbj86IEhvcml6b250YWxPclZlcnRpY2FsXHJcbiAgc3RlcHM6IEJ1bGxldFN0ZXBUeXBlW11cclxuICBtb2RlbFZhbHVlPzogbnVtYmVyXHJcbiAgZ29WZXJ0aWNhbEJlbG93PzogVGFpbHdpbmRCcmVha3BvaW50c1xyXG4gIG5vbkludGVyYWN0aXZlPzogYm9vbGVhblxyXG4gIHN0ZXBzUGFkZGluZz86IFN0ZXBzUGFkZGluZ1xyXG59PigpXHJcblxyXG5jb25zdCB7IGlzQ3VycmVudFN0ZXAsIGlzRmluaXNoZWRTdGVwLCBzd2l0Y2hTdGVwLCBsaXN0Q2xhc3NlcywgbGlua0NsYXNzZXMgfSA9XHJcbiAgdXNlU3RlcHNJbnRlcm5hbHMoe1xyXG4gICAgcHJvcHM6IHRvUmVmcyhwcm9wcyksXHJcbiAgICBlbWl0XHJcbiAgfSlcclxuXHJcbmNvbnN0IGxhYmVsQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsnaDYgZm9udC1tZWRpdW0gbGVhZGluZy03J11cclxuXHJcbiAgbGV0IGxlZnRNYXJnaW46IHN0cmluZ1xyXG4gIGlmIChwcm9wcy5zdGVwc1BhZGRpbmcgPT09ICd4cycpIHtcclxuICAgIGxlZnRNYXJnaW4gPSAnbWwtMSdcclxuICB9IGVsc2UgaWYgKHByb3BzLnN0ZXBzUGFkZGluZyA9PT0gJ3NtJykge1xyXG4gICAgbGVmdE1hcmdpbiA9ICdtbC0yJ1xyXG4gIH0gZWxzZSB7XHJcbiAgICBsZWZ0TWFyZ2luID0gJ21sLTMnXHJcbiAgfVxyXG5cclxuICBjbGFzc1BhcnRzLnB1c2gobGVmdE1hcmdpbilcclxuXHJcbiAgaWYgKHByb3BzLmJhc2ljKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3NyLW9ubHknKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBleHRyYUxpc3RDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gW11cclxuXHJcbiAgaWYgKHByb3BzLmJhc2ljKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2Jhc2ljJylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxzdmdcclxuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgY2xhc3M9XCJpY29uIGljb24tdGFibGVyIGljb24tdGFibGVyLXBvaW50ZXJcIlxyXG4gICAgd2lkdGg9XCI0NFwiXHJcbiAgICBoZWlnaHQ9XCI0NFwiXHJcbiAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC44KVwiXHJcbiAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICA+XHJcbiAgICA8cGF0aCBzdHJva2U9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiIC8+XHJcbiAgICA8cGF0aFxyXG4gICAgICBkPVwiTTcuOTA0IDE3LjU2M2ExLjIgMS4yIDAgMCAwIDIuMjI4IC4zMDhsMi4wOSAtMy4wOTNsNC45MDcgNC45MDdhMS4wNjcgMS4wNjcgMCAwIDAgMS41MDkgMGwxLjA0NyAtMS4wNDdhMS4wNjcgMS4wNjcgMCAwIDAgMCAtMS41MDlsLTQuOTA3IC00LjkwN2wzLjExMyAtMi4wOWExLjIgMS4yIDAgMCAwIC0uMzA5IC0yLjIyOGwtMTMuNTgyIC0zLjkwNGwzLjkwNCAxMy41NjN6XCJcclxuICAgIC8+XHJcbiAgPC9zdmc+XHJcbjwvdGVtcGxhdGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTggMTdcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgIDxwYXRoXHJcbiAgICAgIGQ9XCJNOSAxLjI1VjMuNU0xNC44MzQgMy42NjZMMTMuMjQzIDUuMjU3TTE3LjI1IDkuNUgxNU00Ljc1NyAxMy43NDNMMy4xNjcgMTUuMzMzTTMgOS41SDAuNzVNNC43NTcgNS4yNTdMMy4xNjcgMy42NjdcIlxyXG4gICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICBzdHJva2Utd2lkdGg9XCIxXCJcclxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgIC8+XHJcbiAgPC9zdmc+XHJcbjwvdGVtcGxhdGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cInJlbGF0aXZlIGFzcGVjdC1zcXVhcmUgdy1mdWxsIGgtZnVsbCBtYXgtdy1bMjUwcHhdIG14LWF1dG8gbWItOCBib3JkZXItdCBib3JkZXItciBib3JkZXItb3V0bGluZS0zIHNlbGVjdC1ub25lXCJcclxuICA+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiYWJzb2x1dGUgei01MCB0ZXh0LWZvcmVncm91bmQgZGFyazp0ZXh0LWZvdW5kYXRpb25cIlxyXG4gICAgICA6c3R5bGU9XCJ7XHJcbiAgICAgICAgdHJhbnNpdGlvblByb3BlcnR5OiAnYWxsJyxcclxuICAgICAgICB0b3A6IG1vdXNlUG9zaXRpb24udG9wICsgJyUnLFxyXG4gICAgICAgIGxlZnQ6IG1vdXNlUG9zaXRpb24ubGVmdCArICclJyxcclxuICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb246IGFuaW1hdGlvbkR1cmF0aW9uICsgJ21zJ1xyXG4gICAgICB9XCJcclxuICAgID5cclxuICAgICAgPENsaWNrSWNvblxyXG4gICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgLXRvcC01IC1sZWZ0LTQgaC0xMiB3LTEyIC1yb3RhdGUtMTIgdGV4dC1mb3JlZ3JvdW5kXCJcclxuICAgICAgICA6Y2xhc3M9XCJbeyBoaWRkZW46ICFpc0NsaWNrZWQgfV1cIlxyXG4gICAgICAvPlxyXG4gICAgICA8TW91c2VJY29uIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTAgbGVmdC0wIHJpZ2h0LTAgYm90dG9tLTAgaC0xMSB3LTExXCIgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInctZnVsbCBoLWZ1bGwgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICAgIDxzbG90IG5hbWU9XCJiYWNrZ3JvdW5kXCI+PC9zbG90PlxyXG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCJzbG90T2JqZWN0IGluIGR5bmFtaWNTbG90c1wiIDprZXk9XCJzbG90T2JqZWN0Lm5hbWVcIj5cclxuICAgICAgICA8dGVtcGxhdGUgdi1pZj1cInNsb3RPYmplY3QudmlzaWJsZVwiPlxyXG4gICAgICAgICAgPHNsb3QgOm5hbWU9XCJzbG90T2JqZWN0Lm5hbWVcIj48L3Nsb3Q+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgcmVmLCBvbk1vdW50ZWQsIGRlZmluZVByb3BzLCB0eXBlIFByb3BUeXBlLCBvbkJlZm9yZVVubW91bnQgfSBmcm9tICd2dWUnXHJcbmltcG9ydCBNb3VzZUljb24gZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvY29tbW9uL2FuaW1hdGlvbi9Nb3VzZUljb24udnVlJ1xyXG5pbXBvcnQgQ2xpY2tJY29uIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9hbmltYXRpb24vQ2xpY2tJY29uLnZ1ZSdcclxuaW1wb3J0IHsgd2FpdCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuXHJcbnR5cGUgQW5pbWF0aW9uQWN0aW9uID0ge1xyXG4gIHR5cGU6ICdhbmltYXRpb24nXHJcbiAgdG9wOiBudW1iZXJcclxuICBsZWZ0OiBudW1iZXJcclxuICBkdXJhdGlvbjogbnVtYmVyXHJcbn1cclxuXHJcbnR5cGUgQ2xpY2tBY3Rpb24gPSB7XHJcbiAgdHlwZTogJ2NsaWNrJ1xyXG59XHJcblxyXG50eXBlIERlbGF5QWN0aW9uID0ge1xyXG4gIHR5cGU6ICdkZWxheSdcclxuICBkdXJhdGlvbjogbnVtYmVyXHJcbn1cclxuXHJcbnR5cGUgU2xvdEFjdGlvbiA9IHtcclxuICB0eXBlOiAnc2xvdCdcclxuICBzbG90OiBzdHJpbmdcclxufVxyXG5cclxudHlwZSBBY3Rpb24gPSBBbmltYXRpb25BY3Rpb24gfCBDbGlja0FjdGlvbiB8IFNsb3RBY3Rpb24gfCBEZWxheUFjdGlvblxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XHJcbiAgYWN0aW9uczogQXJyYXkgYXMgUHJvcFR5cGU8QWN0aW9uW10+LFxyXG4gIGluaXRpYWxQb3NpdGlvbjoge1xyXG4gICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPHsgdG9wOiBudW1iZXI7IGxlZnQ6IG51bWJlciB9PlxyXG4gIH0sXHJcbiAgc2xvdHNDb25maWc6IEFycmF5IGFzIFByb3BUeXBlPHsgbmFtZTogc3RyaW5nOyB2aXNpYmxlOiBib29sZWFuIH1bXT5cclxufSlcclxuXHJcbmNvbnN0IGlzQW5pbWF0aW5nID0gcmVmKHRydWUpXHJcbmNvbnN0IG1vdXNlUG9zaXRpb24gPSByZWYoeyAuLi5wcm9wcy5pbml0aWFsUG9zaXRpb24gfSlcclxuY29uc3QgaXNDbGlja2VkID0gcmVmKGZhbHNlKVxyXG5jb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHJlZig1MDApXHJcbmNvbnN0IGlzTW91c2VWaXNpYmxlID0gcmVmKHRydWUpXHJcbmNvbnN0IGR5bmFtaWNTbG90cyA9IHJlZihwcm9wcy5zbG90c0NvbmZpZyB8fCBbXSlcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGRlbGF5KGFjdGlvbjogRGVsYXlBY3Rpb24pIHtcclxuICBhd2FpdCB3YWl0KGFjdGlvbi5kdXJhdGlvbilcclxufVxyXG5cclxuZnVuY3Rpb24gdG9nZ2xlU2xvdFZpc2liaWxpdHkoYWN0aW9uOiBTbG90QWN0aW9uKSB7XHJcbiAgY29uc3Qgc2xvdFRvVG9nZ2xlID0gZHluYW1pY1Nsb3RzLnZhbHVlLmZpbmQoKHNsb3QpID0+IHNsb3QubmFtZSA9PT0gYWN0aW9uLnNsb3QpXHJcbiAgaWYgKHNsb3RUb1RvZ2dsZSkge1xyXG4gICAgc2xvdFRvVG9nZ2xlLnZpc2libGUgPSAhc2xvdFRvVG9nZ2xlLnZpc2libGVcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZUFjdGlvbihhY3Rpb246IEFjdGlvbikge1xyXG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcclxuICAgIGNhc2UgJ2FuaW1hdGlvbic6XHJcbiAgICAgIG1vdXNlUG9zaXRpb24udmFsdWUgPSB7IHRvcDogYWN0aW9uLnRvcCwgbGVmdDogYWN0aW9uLmxlZnQgfVxyXG4gICAgICBhbmltYXRpb25EdXJhdGlvbi52YWx1ZSA9IGFjdGlvbi5kdXJhdGlvblxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnY2xpY2snOlxyXG4gICAgICBpc0NsaWNrZWQudmFsdWUgPSB0cnVlXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gKGlzQ2xpY2tlZC52YWx1ZSA9IGZhbHNlKSwgNTAwKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnZGVsYXknOlxyXG4gICAgICByZXR1cm4gZGVsYXkoYWN0aW9uKVxyXG4gICAgY2FzZSAnc2xvdCc6XHJcbiAgICAgIHRvZ2dsZVNsb3RWaXNpYmlsaXR5KGFjdGlvbilcclxuICAgICAgYnJlYWtcclxuICB9XHJcbn1cclxuXHJcbm9uTW91bnRlZCgoKSA9PiB7XHJcbiAgY29uc3QgbG9vcEFjdGlvbnMgPSBhc3luYyAoKSA9PiB7XHJcbiAgICB3aGlsZSAoaXNBbmltYXRpbmcudmFsdWUpIHtcclxuICAgICAgYXdhaXQgZGVsYXkoeyB0eXBlOiAnZGVsYXknLCBkdXJhdGlvbjogODAwIH0pXHJcbiAgICAgIGlzTW91c2VWaXNpYmxlLnZhbHVlID0gdHJ1ZVxyXG4gICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBwcm9wcy5hY3Rpb25zIHx8IFtdKSB7XHJcbiAgICAgICAgYXdhaXQgaGFuZGxlQWN0aW9uKGFjdGlvbilcclxuICAgICAgfVxyXG4gICAgICBpc01vdXNlVmlzaWJsZS52YWx1ZSA9IGZhbHNlXHJcbiAgICAgIG1vdXNlUG9zaXRpb24udmFsdWUgPSB7IC4uLnByb3BzLmluaXRpYWxQb3NpdGlvbiB9XHJcbiAgICAgIGF3YWl0IGRlbGF5KHsgdHlwZTogJ2RlbGF5JywgZHVyYXRpb246IDIwMCB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdm9pZCBsb29wQWN0aW9ucygpXHJcbn0pXHJcblxyXG5vbkJlZm9yZVVubW91bnQoKCkgPT4ge1xyXG4gIGlzQW5pbWF0aW5nLnZhbHVlID0gZmFsc2VcclxufSlcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3ZnXHJcbiAgICB3aWR0aD1cIjI0XCJcclxuICAgIGhlaWdodD1cIjI2XCJcclxuICAgIHZpZXdCb3g9XCIwIDAgMjQgMjZcIlxyXG4gICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgPlxyXG4gICAgPHBhdGhcclxuICAgICAgZD1cIk0yMi41IDExLjI2OEMyMy44MzMzIDEyLjAzNzggMjMuODMzMyAxMy45NjIyIDIyLjUgMTQuNzMyTDMuNzUgMjUuNTU3NEMyLjQxNjY3IDI2LjMyNzIgMC43NTAwMDQgMjUuMzY0OSAwLjc1MDAwNSAyMy44MjUzTDAuNzUwMDA1IDIuMTc0NjhDMC43NTAwMDYgMC42MzUwNzkgMi40MTY2NyAtMC4zMjcxNjkgMy43NTAwMSAwLjQ0MjYzMUwyMi41IDExLjI2OFpcIlxyXG4gICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcclxuICAgIC8+XHJcbiAgPC9zdmc+XHJcbjwvdGVtcGxhdGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgYXNwZWN0LXZpZGVvIHctZnVsbFwiPlxyXG4gICAgPGlmcmFtZVxyXG4gICAgICA6dGl0bGU9XCJ0aXRsZVwiXHJcbiAgICAgIDpzcmM9XCJgaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLyR7dmltZW9JZH0/YmFkZ2U9MCZhdXRvcGF1c2U9MCZwbGF5ZXJfaWQ9MCZhcHBfaWQ9NTg0NzkmYXV0b3BsYXk9JHtcclxuICAgICAgICBpc1BsYXlpbmcgPyAnMScgOiAnMCdcclxuICAgICAgfSZtdXRlZD0ke211dGVkID8gJzEnIDogJzAnfSZjb250cm9scz0ke2NvbnRyb2xzID8gJzEnIDogJzAnfWBcIlxyXG4gICAgICBmcmFtZWJvcmRlcj1cIjBcIlxyXG4gICAgICBhbGxvdz1cImF1dG9wbGF5OyBmdWxsc2NyZWVuOyBhY2NlbGVyb21ldGVyOyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmVcIlxyXG4gICAgICBhbGxvd2Z1bGxzY3JlZW5cclxuICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsXCJcclxuICAgID48L2lmcmFtZT5cclxuXHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHYtaWY9XCIhaXNQbGF5aW5nICYmIChkYXJrUGxhY2Vob2xkZXIgfHwgbGlnaHRQbGFjZWhvbGRlcilcIlxyXG4gICAgICBjbGFzcz1cImdyb3VwIGFic29sdXRlIHRvcC0wIGxlZnQtMCB3LWZ1bGwgaC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCJcclxuICAgICAgQGNsaWNrPVwicGxheVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0wIGxlZnQtMCB3LWZ1bGwgaC1mdWxsIGJnLWZvdW5kYXRpb24gcG9pbnRlci1ldmVudHMtbm9uZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8aW1nXHJcbiAgICAgICAgICB2LWlmPVwiZGFya1BsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIDpzcmM9XCJkYXJrUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgY2xhc3M9XCJoaWRkZW4gZGFyazpibG9jayB3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiXHJcbiAgICAgICAgICA6YWx0PVwicGxhY2Vob2xkZXJBbHQgfHwgJ1BsYXkgdmlkZW8nXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxpbWdcclxuICAgICAgICAgIHYtaWY9XCJsaWdodFBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIDpzcmM9XCJsaWdodFBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIGNsYXNzPVwiZGFyazpoaWRkZW4gdy1mdWxsIGgtZnVsbCBvYmplY3QtY292ZXJcIlxyXG4gICAgICAgICAgOmFsdD1cInBsYWNlaG9sZGVyQWx0IHx8ICdQbGF5IHZpZGVvJ1wiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cInJlbGF0aXZlIHotMTAgYmctcHJpbWFyeSBncm91cC1ob3ZlcjpiZy1wcmltYXJ5LWZvY3VzIGgtMjggdy0yOCByb3VuZGVkLWZ1bGwgYm9yZGVyLVs0cHhdIGJvcmRlci13aGl0ZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzaGFkb3ctbWRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEljb25QbGF5IGNsYXNzPVwiaC0xMCB3LTEwIG1sLTIgdGV4dC13aGl0ZVwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyByZWYgfSBmcm9tICd2dWUnXHJcbmltcG9ydCBJY29uUGxheSBmcm9tICcuLi9nbG9iYWwvaWNvbi9QbGF5LnZ1ZSdcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICdvblBsYXknKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICB2aW1lb0lkOiBzdHJpbmdcclxuICB0aXRsZTogc3RyaW5nXHJcbiAgYXV0b3BsYXk/OiBib29sZWFuXHJcbiAgbXV0ZWQ/OiBib29sZWFuXHJcbiAgY29udHJvbHM/OiBib29sZWFuXHJcbiAgZGFya1BsYWNlaG9sZGVyPzogc3RyaW5nXHJcbiAgbGlnaHRQbGFjZWhvbGRlcj86IHN0cmluZ1xyXG4gIHBsYWNlaG9sZGVyQWx0Pzogc3RyaW5nXHJcbn0+KClcclxuXHJcbmNvbnN0IGlzUGxheWluZyA9IHJlZihwcm9wcy5hdXRvcGxheSB8fCBmYWxzZSlcclxuXHJcbmNvbnN0IHBsYXkgPSAoKSA9PiB7XHJcbiAgaXNQbGF5aW5nLnZhbHVlID0gdHJ1ZVxyXG4gIGVtaXQoJ29uUGxheScpXHJcbn1cclxuXHJcbmRlZmluZUV4cG9zZSh7XHJcbiAgcGxheVxyXG59KVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxidXR0b24gOmNsYXNzPVwiY29tcHV0ZWRDbGFzc2VzXCIgOmRpc2FibGVkPVwiZGlzYWJsZWRcIiBAY2xpY2s9XCJvbkNsaWNrXCI+XHJcbiAgICA8c2xvdD5UZXh0PC9zbG90PlxyXG4gIDwvYnV0dG9uPlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHY6IGJvb2xlYW4pOiB2b2lkXHJcbiAgKGU6ICdjbGljaycsIHY6IE1vdXNlRXZlbnQpOiB2b2lkXHJcbn0+KClcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIGRpc2FibGVkPzogYm9vbGVhblxyXG4gIG1vZGVsVmFsdWU/OiBib29sZWFuXHJcbn0+KClcclxuXHJcbmNvbnN0IGNvbXB1dGVkQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFtcclxuICAgICdoLTIwIGJnLWZvdW5kYXRpb24tMiBpbmxpbmUtZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgb3V0bGluZS1ub25lJyxcclxuICAgICdub3JtYWwgcHgtMTYgcHktNSBzaGFkb3cgcm91bmRlZCB0cmFuc2l0aW9uIGFjdGl2ZTpzY2FsZS05NSdcclxuICBdXHJcblxyXG4gIGlmIChwcm9wcy5kaXNhYmxlZCkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdiZy1mb3VuZGF0aW9uLWRpc2FibGVkIHRleHQtZm9yZWdyb3VuZC0yIGN1cnNvci1ub3QtYWxsb3dlZCcpXHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgcHJvcHMubW9kZWxWYWx1ZVxyXG4gICAgICAgID8gJ2JnLXByaW1hcnktZm9jdXMgdGV4dC1mb3JlZ3JvdW5kLW9uLXByaW1hcnknXHJcbiAgICAgICAgOiAnYmctZm91bmRhdGlvbiB0ZXh0LWZvcmVncm91bmQnXHJcbiAgICApXHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3Jpbmctb3V0bGluZS0yIGhvdmVyOnJpbmctNCcpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IG9uQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xyXG4gIGlmIChwcm9wcy5kaXNhYmxlZCkge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgIXByb3BzLm1vZGVsVmFsdWUpXHJcbiAgZW1pdCgnY2xpY2snLCBlKVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGl0ZW1zLWNlbnRlclwiXHJcbiAgICA6Y2xhc3M9XCJbXHJcbiAgICAgIGxhYmVsUG9zaXRpb24gPT09ICdsZWZ0JyAmJiAnZmxleC1yb3ctcmV2ZXJzZSBpdGVtcy1jZW50ZXInLFxyXG4gICAgICBsYWJlbFBvc2l0aW9uID09PSAndG9wJyAmJiAnaXRlbXMtc3RhcnQnLFxyXG4gICAgICBsYWJlbFBvc2l0aW9uID09PSAncmlnaHQnICYmICdpdGVtcy1jZW50ZXInXHJcbiAgICBdXCJcclxuICA+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgaC0zLjUgdy0zLjVcIlxyXG4gICAgICA6Y2xhc3M9XCJsYWJlbFBvc2l0aW9uID09PSAnbGVmdCcgPyAndy0xLzIganVzdGlmeS1lbmQgbXItMicgOiAnJ1wiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGgtZnVsbCB3LWZ1bGxcIj5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIDppZD1cImZpbmFsSWRcIlxyXG4gICAgICAgICAgOmNoZWNrZWQ9XCJjb3JlQ2hlY2tlZFwiXHJcbiAgICAgICAgICA6YXJpYS1kZXNjcmliZWRieT1cImRlc2NyaXB0aW9uSWRcIlxyXG4gICAgICAgICAgOm5hbWU9XCJuYW1lXCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgIDp2YWx1ZT1cImNoZWNrYm94VmFsdWVcIlxyXG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgIDpjbGFzcz1cImNoZWNrYm94Q2xhc3Nlc1wiXHJcbiAgICAgICAgICB2LWJpbmQ9XCIkYXR0cnNcIlxyXG4gICAgICAgICAgQGNoYW5nZT1cIm9uQ2hhbmdlXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDwhLS0gSW5kZXRlcm1pbmF0ZSBzdGF0ZSBvdmVybGF5IC0tPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHYtaWY9XCJpbmRldGVybWluYXRlXCJcclxuICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdy1mdWxsIGgtZnVsbCB0b3AtMCBsZWZ0LTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcG9pbnRlci1ldmVudHMtbm9uZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPE1pbnVzIGNsYXNzPVwidy0zIGgtMyB0ZXh0LWZvcmVncm91bmRcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInRleHQtc21cIiA6Y2xhc3M9XCJsYWJlbFBvc2l0aW9uID09PSAnbGVmdCcgPyAndy0xLzInIDogJ21sLTInXCI+XHJcbiAgICAgIDxsYWJlbCA6Zm9yPVwiZmluYWxJZFwiIDpjbGFzcz1cInsgJ3NyLW9ubHknOiBoaWRlTGFiZWwgfVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ib2R5LXhzIHRleHQtZm9yZWdyb3VuZCBmb250LW1lZGl1bVwiIDpjbGFzcz1cImxhYmVsQ2xhc3Nlc1wiPlxyXG4gICAgICAgICAge3sgdGl0bGUgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gdi1pZj1cInNob3dSZXF1aXJlZFwiIGNsYXNzPVwidGV4dC1kYW5nZXIgbWwtMVwiPio8L3NwYW4+XHJcbiAgICAgICAgPHAgdi1pZj1cImRlc2NyaXB0aW9uVGV4dFwiIDppZD1cImRlc2NyaXB0aW9uSWRcIiA6Y2xhc3M9XCJkZXNjcmlwdGlvbkNsYXNzZXNcIj5cclxuICAgICAgICAgIHt7IGRlc2NyaXB0aW9uVGV4dCB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cclxuaW1wb3J0IHsgdXNlRmllbGQgfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB0eXBlIHsgUnVsZUV4cHJlc3Npb24gfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCBvbk1vdW50ZWQsIHJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBQcm9wVHlwZSB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBPcHRpb25hbCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJ1xyXG5pbXBvcnQgdHlwZSB7IExhYmVsUG9zaXRpb24gfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS9pbnB1dCdcclxuaW1wb3J0IHsgTWludXMgfSBmcm9tICdsdWNpZGUtdnVlLW5leHQnXHJcblxyXG4vKipcclxuICogVHJvdWJsZXNob290aW5nOlxyXG4gKiAtIElmIGNsaWNraW5nIG9uIHRoZSBjaGVja2JveCBkb2Vzbid0IGRvIGFueXRoaW5nLCBjaGVjayBpZiBhbnkgb2YgaXRzIGFuY2VzdG9yIGVsZW1lbnRzXHJcbiAqIGhhdmUgYSBAY2xpY2sucHJldmVudCBvbiB0aGVtIGFueXdoZXJlLlxyXG4gKiAtIElmIHlvdSdyZSBub3QgdXNpbmcgdGhlIGNoZWNrYm94IGluIGEgZ3JvdXAsIGl0J3Mgc3VnZ2VzdGVkIHRoYXQgeW91IHNldCA6dmFsdWU9XCJ0cnVlXCIsXHJcbiAqIHNvIHRoYXQgYSB2LW1vZGVsIGF0dGFjaGVkIHRvIHRoZSBjaGVja2JveCB3aWxsIGJlIGVpdGhlciAndHJ1ZScgb3IgJ3VuZGVmaW5lZCcgZGVwZW5kaW5nIG9uIHRoZVxyXG4gKiBjaGVja2VkIHN0YXRlXHJcbiAqL1xyXG5cclxudHlwZSBWYWx1ZVR5cGUgPSBPcHRpb25hbDxzdHJpbmcgfCB0cnVlPiB8IHN0cmluZ1tdXHJcblxyXG5kZWZpbmVPcHRpb25zKHtcclxuICBpbmhlcml0QXR0cnM6IGZhbHNlXHJcbn0pXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICAvKipcclxuICAgKiBJbnB1dCBuYW1lL2lkLiBJbiBhIGNoZWNrYm94IGdyb3VwLCBhbGwgY2hlY2tib3hlcyBtdXN0IGhhdmUgdGhlIHNhbWUgbmFtZSBhbmQgZGlmZmVyZW50IHZhbHVlcy5cclxuICAgKi9cclxuICBuYW1lOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICByZXF1aXJlZDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgaW5wdXQgaXMgZGlzYWJsZWRcclxuICAgKi9cclxuICBkaXNhYmxlZDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBTZXQgbGFiZWwgdGV4dFxyXG4gICAqL1xyXG4gIGxhYmVsOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFNldCBsYWJlbCBjbGFzc2VzXHJcbiAgICovXHJcbiAgbGFiZWxDbGFzc2VzOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIEhlbHAgdGV4dFxyXG4gICAqL1xyXG4gIGRlc2NyaXB0aW9uOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gaW5saW5lIHRoZSBoZWxwIGRlc2NyaXB0aW9uXHJcbiAgICovXHJcbiAgaW5saW5lRGVzY3JpcHRpb246IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogdmVlLXZhbGlkYXRlIHZhbGlkYXRpb24gcnVsZXNcclxuICAgKi9cclxuICBydWxlczoge1xyXG4gICAgdHlwZTogW1N0cmluZywgT2JqZWN0LCBGdW5jdGlvbiwgQXJyYXldIGFzIFByb3BUeXBlPFJ1bGVFeHByZXNzaW9uPFZhbHVlVHlwZT4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiB2ZWUtdmFsaWRhdGUgdmFsaWRhdGlvbigpIG9uIGNvbXBvbmVudCBtb3VudFxyXG4gICAqL1xyXG4gIHZhbGlkYXRlT25Nb3VudDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHJlZCBcInJlcXVpcmVkXCIgYXN0ZXJpc2tcclxuICAgKi9cclxuICBzaG93UmVxdWlyZWQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tib3ggZ3JvdXAncyB2YWx1ZVxyXG4gICAqL1xyXG4gIG1vZGVsVmFsdWU6IHtcclxuICAgIHR5cGU6IFtTdHJpbmcsIEJvb2xlYW5dIGFzIFByb3BUeXBlPFZhbHVlVHlwZSB8IGZhbHNlPixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tib3gncyBvd24gdmFsdWUuIElmIGl0IGlzIGNoZWNrZWQsIG1vZGVsVmFsdWUgd2lsbCBpbmNsdWRlIHRoaXMgdmFsdWUgKGFtb25nc3QgYW55IG90aGVyIGNoZWNrZWQgdmFsdWVzIGZyb20gdGhlIHNhbWUgZ3JvdXApLlxyXG4gICAqIElmIG5vdCBzZXQgd2lsbCBkZWZhdWx0IHRvICduYW1lJyB2YWx1ZS5cclxuICAgKi9cclxuICB2YWx1ZToge1xyXG4gICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0gYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nIHwgdHJ1ZT4+LFxyXG4gICAgZGVmYXVsdDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogSFRNTCBJRCB0byB1c2UsIG11c3QgYmUgZ2xvYmFsbHkgdW5pcXVlLiBJZiBub3Qgc3BlY2lmaWVkLCBhIHJhbmRvbSBJRCB3aWxsIGJlIGdlbmVyYXRlZC4gT25lIGlzIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBhc3NvY2lhdGUgdGhlIGxhYmVsIGFuZCBjaGVja2JveC5cclxuICAgKi9cclxuICBpZDoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICBoaWRlTGFiZWw6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgbGFiZWxQb3NpdGlvbjoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPExhYmVsUG9zaXRpb24+LFxyXG4gICAgZGVmYXVsdDogJ3RvcCdcclxuICB9LFxyXG4gIGluZGV0ZXJtaW5hdGU6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGdlbmVyYXRlUmFuZG9tSWQgPSAocHJlZml4OiBzdHJpbmcpID0+IGAke3ByZWZpeH0tJHtuYW5vaWQoKX1gXHJcblxyXG5kZWZpbmVFbWl0czx7XHJcbiAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbDogVmFsdWVUeXBlKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBjaGVja2JveFZhbHVlID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMudmFsdWUgfHwgcHJvcHMubmFtZSlcclxuXHJcbmNvbnN0IHtcclxuICBjaGVja2VkOiBjb3JlQ2hlY2tlZCxcclxuICBlcnJvck1lc3NhZ2UsXHJcbiAgaGFuZGxlQ2hhbmdlLFxyXG4gIHZhbHVlOiBjb3JlVmFsdWVcclxufSA9IHVzZUZpZWxkPFZhbHVlVHlwZT4ocHJvcHMubmFtZSwgcHJvcHMucnVsZXMsIHtcclxuICB2YWxpZGF0ZU9uTW91bnQ6IHByb3BzLnZhbGlkYXRlT25Nb3VudCxcclxuICB0eXBlOiAnY2hlY2tib3gnLFxyXG4gIGNoZWNrZWRWYWx1ZTogY2hlY2tib3hWYWx1ZSxcclxuICBpbml0aWFsVmFsdWU6IHByb3BzLm1vZGVsVmFsdWUgfHwgdW5kZWZpbmVkXHJcbn0pXHJcblxyXG5jb25zdCB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmxhYmVsIHx8IHByb3BzLm5hbWUpXHJcblxyXG5jb25zdCBkZXNjcmlwdGlvblRleHQgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5kZXNjcmlwdGlvbiB8fCBlcnJvck1lc3NhZ2UudmFsdWUpXHJcbmNvbnN0IGRlc2NyaXB0aW9uSWQgPSBjb21wdXRlZCgoKSA9PiBgJHtwcm9wcy5uYW1lfS1kZXNjcmlwdGlvbmApXHJcbmNvbnN0IGRlc2NyaXB0aW9uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWyd0ZXh0LWJvZHktMnhzJ11cclxuXHJcbiAgaWYgKHByb3BzLmlubGluZURlc2NyaXB0aW9uKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2lubGluZSBtbC0yJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdibG9jaycpXHJcbiAgfVxyXG5cclxuICBpZiAoZXJyb3JNZXNzYWdlLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZGFuZ2VyJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWZvcmVncm91bmQtMicpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGltcGxpY2l0SWQgPSByZWY8T3B0aW9uYWw8c3RyaW5nPj4oZ2VuZXJhdGVSYW5kb21JZCgnY2hlY2tib3gnKSlcclxuY29uc3QgZmluYWxJZCA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmlkIHx8IGltcGxpY2l0SWQudmFsdWUpXHJcblxyXG5jb25zdCBjaGVja2JveENsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFtcclxuICAgICdoLTMuNSB3LTMuNSByb3VuZGVkJyxcclxuICAgICdib3JkZXIgYmctZm91bmRhdGlvbiB0ZXh0LXByaW1hcnknLFxyXG4gICAgJ2hvdmVyOmJvcmRlci1mb3JlZ3JvdW5kLTIgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctb3V0bGluZS00IGZvY3VzOnJpbmctb2Zmc2V0LTEnLFxyXG4gICAgJ2Rpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTYwJ1xyXG4gIF1cclxuXHJcbiAgaWYgKGVycm9yTWVzc2FnZS52YWx1ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXItZGFuZ2VyLWxpZ2h0ZXInKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2JvcmRlci1vdXRsaW5lLTUnKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBvbkNoYW5nZSA9IChlOiB1bmtub3duKSA9PiB7XHJcbiAgaWYgKHByb3BzLmRpc2FibGVkKSByZXR1cm5cclxuICBoYW5kbGVDaGFuZ2UoZSlcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1Z2ZpeCBmb3Igc3RyYW5nZSBpc3N1ZSB3aGVyZSBjaGVja2JveCBhcHBlYXJzIGNoZWNrZWQgZXZlbiB0aG8gaXQgc2hvdWxkbnQgYmUuXHJcbiAqIEl0J3Mgbm90IGNsZWFyIHdoeSB0aGlzIGhhcHBlbnMsIGJ1dCBmb3Igc29tZSByZWFzb24gY29yZVZhbHVlLnZhbHVlIHNob3dzIHRoYXQgdGhlIGNoZWNrYm94XHJcbiAqIGlzIGNoZWNrZWQsIGV2ZW4gdGhvIHByb3BzLm1vZGVsVmFsdWUgaXMgdW5kZWZpbmVkLlxyXG4gKi9cclxub25Nb3VudGVkKCgpID0+IHtcclxuICBjb25zdCBuZXdNb2RlbFZhbHVlID0gcHJvcHMubW9kZWxWYWx1ZVxyXG4gIGNvbnN0IG5ld0NvcmVWYWx1ZSA9IGNvcmVWYWx1ZS52YWx1ZVxyXG5cclxuICBjb25zdCBzaG91bGRCZUNoZWNrZWQgPSBBcnJheS5pc0FycmF5KG5ld01vZGVsVmFsdWUpXHJcbiAgICA/IG5ld01vZGVsVmFsdWUuaW5jbHVkZXMocHJvcHMudmFsdWUgYXMgYW55KVxyXG4gICAgOiBuZXdNb2RlbFZhbHVlID09PSBwcm9wcy52YWx1ZVxyXG5cclxuICBjb25zdCBpc0NvcmVDaGVja2VkID0gQXJyYXkuaXNBcnJheShuZXdDb3JlVmFsdWUpXHJcbiAgICA/IG5ld0NvcmVWYWx1ZS5pbmNsdWRlcyhwcm9wcy52YWx1ZSBhcyBhbnkpXHJcbiAgICA6IG5ld0NvcmVWYWx1ZSA9PT0gcHJvcHMudmFsdWVcclxuXHJcbiAgaWYgKHNob3VsZEJlQ2hlY2tlZCAhPT0gaXNDb3JlQ2hlY2tlZCkge1xyXG4gICAgaGFuZGxlQ2hhbmdlKG5ld01vZGVsVmFsdWUpXHJcbiAgfVxyXG59KVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCBzcGFjZS14LTIgbWItMiBsYXN0Om1iLTBcIlxyXG4gICAgOmNsYXNzPVwiZGVzY3JpcHRpb24gJiYgaW5saW5lRGVzY3JpcHRpb24gPyAnaXRlbXMtc3RhcnQnIDogJ2l0ZW1zLWNlbnRlcidcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiIDpjbGFzcz1cInNpemUgPT09ICdzbScgPyAnaC00JyA6ICdoLTYnXCI+XHJcbiAgICAgIDwhLS0gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvZm9ybS1jb250cm9sLWhhcy1sYWJlbCAtLT5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgOmlkPVwiZmluYWxJZFwiXHJcbiAgICAgICAgOmNoZWNrZWQ9XCJjb3JlQ2hlY2tlZFwiXHJcbiAgICAgICAgOmFyaWEtZGVzY3JpYmVkYnk9XCJkZXNjcmlwdGlvbklkXCJcclxuICAgICAgICA6bmFtZT1cIm5hbWVcIlxyXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICA6dmFsdWU9XCJyYWRpb1ZhbHVlXCJcclxuICAgICAgICB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgIGNsYXNzPVwiaC00IHctNCByb3VuZGVkLWZ1bGwgdGV4dC1wcmltYXJ5IGZvY3VzOnJpbmctcHJpbWFyeSBiZy1mb3VuZGF0aW9uIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpiZy1kaXNhYmxlZCBkaXNhYmxlZDp0ZXh0LWRpc2FibGVkLTJcIlxyXG4gICAgICAgIDpjbGFzcz1cImNvbXB1dGVkQ2xhc3Nlc1wiXHJcbiAgICAgICAgdi1iaW5kPVwiJGF0dHJzXCJcclxuICAgICAgICBAY2hhbmdlPVwib25DaGFuZ2VcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICBpbmxpbmVEZXNjcmlwdGlvbiA/ICdmbGV4IHNwYWNlLXgtMiBpdGVtcy1jZW50ZXInIDogJycsXHJcbiAgICAgICAgc2l6ZSA9PT0gJ3NtJyA/ICd0ZXh0LWJvZHktMnhzJyA6ICd0ZXh0LWJvZHkteHMnXHJcbiAgICAgIF1cIlxyXG4gICAgPlxyXG4gICAgICA8bGFiZWxcclxuICAgICAgICA6Zm9yPVwiZmluYWxJZFwiXHJcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQgZmxleCBzcGFjZS14LTIgaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICA6Y2xhc3M9XCJ7ICdzci1vbmx5JzogaGlkZUxhYmVsLCAnIWN1cnNvci1ub3QtYWxsb3dlZCBvcGFjaXR5LTcwJzogZGlzYWJsZWQgfVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IHYtaWY9XCJpY29uXCI+XHJcbiAgICAgICAgICA8Y29tcG9uZW50XHJcbiAgICAgICAgICAgIDppcz1cImljb25cIlxyXG4gICAgICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICAgICAgc2l6ZSA9PT0gJ3NtJyA/ICdoLTYgc206aC04IHctNiBzbTp3LTgnIDogJ2gtOCB3LTggc206aC0xMCBzbTp3LTEwJ1xyXG4gICAgICAgICAgICBdXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cclxuICAgICAgICAgIDxzcGFuIDpjbGFzcz1cImxhYmVsQ2xhc3NlcyA/IGxhYmVsQ2xhc3NlcyA6ICcnXCI+e3sgdGl0bGUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8cFxyXG4gICAgICAgICAgICB2LWlmPVwiZGVzY3JpcHRpb25UZXh0ICYmICFpbmxpbmVEZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgIDppZD1cImRlc2NyaXB0aW9uSWRcIlxyXG4gICAgICAgICAgICA6Y2xhc3M9XCJkZXNjcmlwdGlvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBkZXNjcmlwdGlvblRleHQgfX1cclxuICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c3BhbiB2LWlmPVwic2hvd1JlcXVpcmVkXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlciBtbC0xXCI+Kjwvc3Bhbj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPHBcclxuICAgICAgICB2LWlmPVwiZGVzY3JpcHRpb25UZXh0ICYmIGlubGluZURlc2NyaXB0aW9uXCJcclxuICAgICAgICA6aWQ9XCJkZXNjcmlwdGlvbklkXCJcclxuICAgICAgICA6Y2xhc3M9XCJkZXNjcmlwdGlvbkNsYXNzZXNcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgZGVzY3JpcHRpb25UZXh0IH19XHJcbiAgICAgIDwvcD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cclxuaW1wb3J0IHsgdXNlRmllbGQgfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB0eXBlIHsgUnVsZUV4cHJlc3Npb24gfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCBvbk1vdW50ZWQsIHJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBQcm9wVHlwZSwgQ29uY3JldGVDb21wb25lbnQgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgT3B0aW9uYWwgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZCdcclxuXHJcbi8qKlxyXG4gKiBUcm91Ymxlc2hvb3Rpbmc6XHJcbiAqIC0gSWYgY2xpY2tpbmcgb24gdGhlIHJhZGlvIGRvZXNuJ3QgZG8gYW55dGhpbmcsIGNoZWNrIGlmIGFueSBvZiBpdHMgYW5jZXN0b3IgZWxlbWVudHNcclxuICogaGF2ZSBhIEBjbGljay5wcmV2ZW50IG9uIHRoZW0gYW55d2hlcmUuXHJcbiAqIC0gSWYgeW91J3JlIG5vdCB1c2luZyB0aGUgcmFkaW8gaW4gYSBncm91cCwgaXQncyBzdWdnZXN0ZWQgdGhhdCB5b3Ugc2V0IDp2YWx1ZT1cInRydWVcIixcclxuICogc28gdGhhdCBhIHYtbW9kZWwgYXR0YWNoZWQgdG8gdGhlIHJhZGlvIHdpbGwgYmUgZWl0aGVyICd0cnVlJyBvciAndW5kZWZpbmVkJyBkZXBlbmRpbmcgb24gdGhlXHJcbiAqIGNoZWNrZWQgc3RhdGVcclxuICovXHJcblxyXG50eXBlIFZhbHVlVHlwZSA9IE9wdGlvbmFsPHN0cmluZyB8IHRydWU+IHwgc3RyaW5nW11cclxudHlwZSBTaXplID0gJ3NtJyB8ICdiYXNlJ1xyXG5cclxuZGVmaW5lT3B0aW9ucyh7XHJcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZVxyXG59KVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XHJcbiAgLyoqXHJcbiAgICogSW5wdXQgbmFtZS9pZC4gSW4gYSByYWRpbyBncm91cCwgYWxsIHJhZGlvcyBtdXN0IGhhdmUgdGhlIHNhbWUgbmFtZSBhbmQgZGlmZmVyZW50IHZhbHVlcy5cclxuICAgKi9cclxuICBuYW1lOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICByZXF1aXJlZDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgaW5wdXQgaXMgZGlzYWJsZWRcclxuICAgKi9cclxuICBkaXNhYmxlZDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBTZXQgbGFiZWwgdGV4dFxyXG4gICAqL1xyXG4gIGxhYmVsOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFNldCBsYWJlbCB0ZXh0IGNsYXNzZXNcclxuICAgKi9cclxuICBsYWJlbENsYXNzZXM6IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxPcHRpb25hbDxzdHJpbmc+PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogSGVscCB0ZXh0XHJcbiAgICovXHJcbiAgZGVzY3JpcHRpb246IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxPcHRpb25hbDxzdHJpbmc+PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBpbmxpbmUgdGhlIGhlbHAgZGVzY3JpcHRpb25cclxuICAgKi9cclxuICBpbmxpbmVEZXNjcmlwdGlvbjoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBPcHRpb25hbCBJY29uXHJcbiAgICovXHJcbiAgaWNvbjoge1xyXG4gICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPENvbmNyZXRlQ29tcG9uZW50PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogdmVlLXZhbGlkYXRlIHZhbGlkYXRpb24gcnVsZXNcclxuICAgKi9cclxuICBydWxlczoge1xyXG4gICAgdHlwZTogW1N0cmluZywgT2JqZWN0LCBGdW5jdGlvbiwgQXJyYXldIGFzIFByb3BUeXBlPFJ1bGVFeHByZXNzaW9uPFZhbHVlVHlwZT4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiB2ZWUtdmFsaWRhdGUgdmFsaWRhdGlvbigpIG9uIGNvbXBvbmVudCBtb3VudFxyXG4gICAqL1xyXG4gIHZhbGlkYXRlT25Nb3VudDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHJlZCBcInJlcXVpcmVkXCIgYXN0ZXJpc2tcclxuICAgKi9cclxuICBzaG93UmVxdWlyZWQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogUmFkaW8gZ3JvdXAncyB2YWx1ZVxyXG4gICAqL1xyXG4gIG1vZGVsVmFsdWU6IHtcclxuICAgIHR5cGU6IFtTdHJpbmcsIEJvb2xlYW5dIGFzIFByb3BUeXBlPFZhbHVlVHlwZSB8IGZhbHNlPixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogUmFkaW8ncyBvd24gdmFsdWUuIElmIGl0IGlzIGNoZWNrZWQsIG1vZGVsVmFsdWUgd2lsbCBpbmNsdWRlIHRoaXMgdmFsdWUgKGFtb25nc3QgYW55IG90aGVyIGNoZWNrZWQgdmFsdWVzIGZyb20gdGhlIHNhbWUgZ3JvdXApLlxyXG4gICAqIElmIG5vdCBzZXQgd2lsbCBkZWZhdWx0IHRvICduYW1lJyB2YWx1ZS5cclxuICAgKi9cclxuICB2YWx1ZToge1xyXG4gICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0gYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nIHwgdHJ1ZT4+LFxyXG4gICAgZGVmYXVsdDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogSFRNTCBJRCB0byB1c2UsIG11c3QgYmUgZ2xvYmFsbHkgdW5pcXVlLiBJZiBub3Qgc3BlY2lmaWVkLCBhIHJhbmRvbSBJRCB3aWxsIGJlIGdlbmVyYXRlZC4gT25lIGlzIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBhc3NvY2lhdGUgdGhlIGxhYmVsIGFuZCByYWRpby5cclxuICAgKi9cclxuICBpZDoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICBoaWRlTGFiZWw6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgc2l6ZToge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPFNpemU+PixcclxuICAgIGRlZmF1bHQ6ICdiYXNlJ1xyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGdlbmVyYXRlUmFuZG9tSWQgPSAocHJlZml4OiBzdHJpbmcpID0+IGAke3ByZWZpeH0tJHtuYW5vaWQoKX1gXHJcblxyXG5kZWZpbmVFbWl0czx7XHJcbiAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbDogVmFsdWVUeXBlKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCByYWRpb1ZhbHVlID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMudmFsdWUgfHwgcHJvcHMubmFtZSlcclxuXHJcbmNvbnN0IHtcclxuICBjaGVja2VkOiBjb3JlQ2hlY2tlZCxcclxuICBlcnJvck1lc3NhZ2UsXHJcbiAgaGFuZGxlQ2hhbmdlLFxyXG4gIHZhbHVlOiBjb3JlVmFsdWVcclxufSA9IHVzZUZpZWxkPFZhbHVlVHlwZT4ocHJvcHMubmFtZSwgcHJvcHMucnVsZXMsIHtcclxuICB2YWxpZGF0ZU9uTW91bnQ6IHByb3BzLnZhbGlkYXRlT25Nb3VudCxcclxuICB0eXBlOiAncmFkaW8nLFxyXG4gIGNoZWNrZWRWYWx1ZTogcmFkaW9WYWx1ZSxcclxuICBpbml0aWFsVmFsdWU6IHByb3BzLm1vZGVsVmFsdWUgfHwgdW5kZWZpbmVkXHJcbn0pXHJcblxyXG5jb25zdCB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmxhYmVsIHx8IHByb3BzLm5hbWUpXHJcblxyXG5jb25zdCBjb21wdXRlZENsYXNzZXMgPSBjb21wdXRlZCgoKTogc3RyaW5nID0+IHtcclxuICByZXR1cm4gZXJyb3JNZXNzYWdlLnZhbHVlID8gJ2JvcmRlci1kYW5nZXItbGlnaHRlcicgOiAnYm9yZGVyLWZvcmVncm91bmQtNCAnXHJcbn0pXHJcblxyXG5jb25zdCBkZXNjcmlwdGlvblRleHQgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5kZXNjcmlwdGlvbiB8fCBlcnJvck1lc3NhZ2UudmFsdWUpXHJcbmNvbnN0IGRlc2NyaXB0aW9uSWQgPSBjb21wdXRlZCgoKSA9PiBgJHtwcm9wcy5uYW1lfS1kZXNjcmlwdGlvbmApXHJcbmNvbnN0IGRlc2NyaXB0aW9uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWyd0ZXh0LWJvZHktM3hzJ11cclxuXHJcbiAgaWYgKGVycm9yTWVzc2FnZS52YWx1ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWRhbmdlcicpXHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1mb3JlZ3JvdW5kLTInKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBpbXBsaWNpdElkID0gcmVmPE9wdGlvbmFsPHN0cmluZz4+KGdlbmVyYXRlUmFuZG9tSWQoJ3JhZGlvJykpXHJcbmNvbnN0IGZpbmFsSWQgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5pZCB8fCBpbXBsaWNpdElkLnZhbHVlKVxyXG5cclxuY29uc3Qgb25DaGFuZ2UgPSAoZTogdW5rbm93bikgPT4ge1xyXG4gIGlmIChwcm9wcy5kaXNhYmxlZCkgcmV0dXJuXHJcbiAgaGFuZGxlQ2hhbmdlKGUpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWdmaXggZm9yIHN0cmFuZ2UgaXNzdWUgd2hlcmUgcmFkaW8gYXBwZWFycyBjaGVja2VkIGV2ZW4gdGhvIGl0IHNob3VsZG50IGJlLlxyXG4gKiBJdCdzIG5vdCBjbGVhciB3aHkgdGhpcyBoYXBwZW5zLCBidXQgZm9yIHNvbWUgcmVhc29uIGNvcmVWYWx1ZS52YWx1ZSBzaG93cyB0aGF0IHRoZSByYWRpb1xyXG4gKiBpcyBjaGVja2VkLCBldmVuIHRobyBwcm9wcy5tb2RlbFZhbHVlIGlzIHVuZGVmaW5lZC5cclxuICovXHJcbm9uTW91bnRlZCgoKSA9PiB7XHJcbiAgY29uc3QgbmV3TW9kZWxWYWx1ZSA9IHByb3BzLm1vZGVsVmFsdWVcclxuICBjb25zdCBuZXdDb3JlVmFsdWUgPSBjb3JlVmFsdWUudmFsdWVcclxuXHJcbiAgY29uc3Qgc2hvdWxkQmVDaGVja2VkID0gQXJyYXkuaXNBcnJheShuZXdNb2RlbFZhbHVlKVxyXG4gICAgPyBuZXdNb2RlbFZhbHVlLmluY2x1ZGVzKHByb3BzLnZhbHVlIGFzIGFueSlcclxuICAgIDogbmV3TW9kZWxWYWx1ZSA9PT0gcHJvcHMudmFsdWVcclxuXHJcbiAgY29uc3QgaXNDb3JlQ2hlY2tlZCA9IEFycmF5LmlzQXJyYXkobmV3Q29yZVZhbHVlKVxyXG4gICAgPyBuZXdDb3JlVmFsdWUuaW5jbHVkZXMocHJvcHMudmFsdWUgYXMgYW55KVxyXG4gICAgOiBuZXdDb3JlVmFsdWUgPT09IHByb3BzLnZhbHVlXHJcblxyXG4gIGlmIChzaG91bGRCZUNoZWNrZWQgIT09IGlzQ29yZUNoZWNrZWQpIHtcclxuICAgIGhhbmRsZUNoYW5nZShuZXdNb2RlbFZhbHVlKVxyXG4gIH1cclxufSlcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1zdHJldGNoIHctZnVsbFwiXHJcbiAgICAgIDpjbGFzcz1cIlxyXG4gICAgICAgIGlzU3RhY2tlZFxyXG4gICAgICAgICAgPyAnZmxleC1jb2wgc3BhY2UteS0zICdcclxuICAgICAgICAgIDogJ2ZsZXgtY29sIHNtOmZsZXgtcm93IHNwYWNlLXktMyBzbTpzcGFjZS15LTAgc206c3BhY2UteC0zJ1xyXG4gICAgICBcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IHYtZm9yPVwib3B0aW9uIGluIG9wdGlvbnNcIiA6a2V5PVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJ3LWZ1bGwgZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIGNsYXNzPVwiYmctZm91bmRhdGlvbiByZWxhdGl2ZSB3LWZ1bGwgaC1mdWxsIHNlbGVjdC1ub25lIHJvdW5kZWQtbWQgYm9yZGVyIHNoYWRvd1wiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICAgIHNlbGVjdGVkID09PSBvcHRpb24udmFsdWUgPyAnYm9yZGVyLW91dGxpbmUtNCcgOiAnYm9yZGVyLW91dGxpbmUtMicsXHJcbiAgICAgICAgICAgIGRpc2FibGVkIHx8IG9wdGlvbi5kaXNhYmxlZFxyXG4gICAgICAgICAgICAgID8gJ29wYWNpdHktNjAgY3Vyc29yLW5vdC1hbGxvd2VkJ1xyXG4gICAgICAgICAgICAgIDogJ2hvdmVyOmJvcmRlci1vdXRsaW5lLTEnXHJcbiAgICAgICAgICBdXCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IG9wdGlvbi5kaXNhYmxlZFwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIEBjbGljaz1cInNlbGVjdEl0ZW0ob3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgc3BhY2UteS0yIGgtZnVsbFwiXHJcbiAgICAgICAgICAgIDpjbGFzcz1cInByb3BzLnNpemUgPT09ICdzbScgPyAncC0zJyA6ICdwLTQgJ1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGdhcC14LTNcIlxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cIm9wdGlvbi5pY29uID8gJ2l0ZW1zLXN0YXJ0JyA6ICdpdGVtcy1jZW50ZXInXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMSBpdGVtcy1jZW50ZXIgdGV4dC1sZWZ0IGdhcC14LTJcIj5cclxuICAgICAgICAgICAgICAgIDxjb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgOmlzPVwib3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICB2LWlmPVwib3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZm9yZWdyb3VuZCBoLTUgdy01XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aDRcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZm9yZWdyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgOmNsYXNzPVwicHJvcHMuc2l6ZSA9PT0gJ3NtJyA/ICd0ZXh0LWhlYWRpbmctc20nIDogJ3RleHQtaGVhZGluZydcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLnRpdGxlIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgIDxoNSB2LWlmPVwib3B0aW9uLnN1YnRpdGxlXCIgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQtMyB0ZXh0LWJvZHkteHNcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBvcHRpb24uc3VidGl0bGUgfX1cclxuICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaC01IHctNSByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLVsxLjVweF0gYm9yZGVyLW91dGxpbmUtNVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICB2LWlmPVwic2VsZWN0ZWQgPT09IG9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC0yLjUgdy0yLjUgcm91bmRlZC1mdWxsIGJnLXByaW1hcnkgZmxleFwiXHJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgdi1pZj1cIm9wdGlvbi5pbnRyb2R1Y3Rpb25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0ZXh0LWZvcmVncm91bmQtMiBzZWxlY3Qtbm9uZSB0ZXh0LWxlZnQgcHItOFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyBvcHRpb24uaW50cm9kdWN0aW9uIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8c2xvdCA6bmFtZT1cIm9wdGlvbi52YWx1ZVwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICB2LWlmPVwib3B0aW9uLmhlbHBcIlxyXG4gICAgICAgICAgY2xhc3M9XCJzbTpoaWRkZW4gdGV4dC14cyBmbGV4IHNwYWNlLXgtMC41IG10LTIgdGV4dC1mb3JlZ3JvdW5kXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8SW5mb3JtYXRpb25DaXJjbGVJY29uIGNsYXNzPVwiaC00IHctNFwiIC8+XHJcbiAgICAgICAgICB7eyBvcHRpb24uaGVscCB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiB2LWlmPVwiIWlzU3RhY2tlZFwiIGNsYXNzPVwiaGlkZGVuIHNtOmZsZXggc3BhY2UteC0zIHctZnVsbFwiPlxyXG4gICAgICA8ZGl2IHYtZm9yPVwib3B0aW9uIGluIG9wdGlvbnNcIiA6a2V5PVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICB2LWlmPVwib3B0aW9uLmhlbHBcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhzIGZsZXggc3BhY2UteC0wLjUgbXQtMiB0ZXh0LWZvcmVncm91bmQgc2VsZWN0LW5vbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxJbmZvcm1hdGlvbkNpcmNsZUljb24gY2xhc3M9XCJoLTQgdy00XCIgLz5cclxuICAgICAgICAgIHt7IG9wdGlvbi5oZWxwIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IHYtaWY9XCJlcnJvck1lc3NhZ2VcIiBjbGFzcz1cInRleHQtZGFuZ2VyIHRleHQtYm9keS0yeHMgbXQtMlwiPlxyXG4gICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIiBnZW5lcmljPVwiVmFsdWUgZXh0ZW5kcyBzdHJpbmdcIj5cclxuaW1wb3J0IHsgSW5mb3JtYXRpb25DaXJjbGVJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHsgdXNlRmllbGQsIHR5cGUgUnVsZUV4cHJlc3Npb24gfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7IEZvcm1SYWRpb0dyb3VwSXRlbSB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2NvbW1vbi9jb21wb25lbnRzJ1xyXG5cclxuZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAndXBkYXRlOm1vZGVsVmFsdWUnLCB2OiBWYWx1ZSk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgbmFtZT86IHN0cmluZ1xyXG4gICAgbW9kZWxWYWx1ZT86IFZhbHVlXHJcbiAgICBvcHRpb25zOiBGb3JtUmFkaW9Hcm91cEl0ZW08VmFsdWU+W11cclxuICAgIGRpc2FibGVkPzogYm9vbGVhblxyXG4gICAgaXNTdGFja2VkPzogYm9vbGVhblxyXG4gICAgc2l6ZT86ICdzbScgfCAnYmFzZSdcclxuICAgIHJ1bGVzPzogUnVsZUV4cHJlc3Npb248VmFsdWU+XHJcbiAgfT4oKSxcclxuICB7XHJcbiAgICBzaXplOiAnYmFzZScsXHJcbiAgICBuYW1lOiAnZm9ybVJhZGlvR3JvdXAnXHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCB7IHZhbHVlLCBlcnJvck1lc3NhZ2UgfSA9IHVzZUZpZWxkPFZhbHVlPihwcm9wcy5uYW1lLCBwcm9wcy5ydWxlcywge1xyXG4gIGluaXRpYWxWYWx1ZTogcHJvcHMubW9kZWxWYWx1ZSBhcyBWYWx1ZVxyXG59KVxyXG5cclxuY29uc3Qgc2VsZWN0ZWQgPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiB2YWx1ZS52YWx1ZSxcclxuICBzZXQ6IChuZXdWYWw6IFZhbHVlKSA9PiAodmFsdWUudmFsdWUgPSBuZXdWYWwpXHJcbn0pXHJcblxyXG5jb25zdCBzZWxlY3RJdGVtID0gKHZhbHVlOiBWYWx1ZSkgPT4ge1xyXG4gIHNlbGVjdGVkLnZhbHVlID0gdmFsdWVcclxufVxyXG48L3NjcmlwdD5cclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50ICovXHJcbmltcG9ydCB7IHVzZUZpZWxkIH0gZnJvbSAndmVlLXZhbGlkYXRlJ1xyXG5pbXBvcnQgdHlwZSB7IFJ1bGVFeHByZXNzaW9uIH0gZnJvbSAndmVlLXZhbGlkYXRlJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgb25Nb3VudGVkLCByZWYsIHVucmVmLCB3YXRjaCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBSZWYsIFRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBNYXliZU51bGxPclVuZGVmaW5lZCwgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZCdcclxuaW1wb3J0IHtcclxuICBkZWJvdW5jZSxcclxuICBpbmNsdWRlcyxcclxuICBpc0FycmF5LFxyXG4gIGlzQm9vbGVhbixcclxuICBpc1N0cmluZyxcclxuICBpc1VuZGVmaW5lZCxcclxuICBub29wXHJcbn0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHR5cGUgeyBMYWJlbFBvc2l0aW9uIH0gZnJvbSAnLi9pbnB1dCdcclxuXHJcbmV4cG9ydCB0eXBlIElucHV0Q29sb3IgPSAncGFnZScgfCAnZm91bmRhdGlvbicgfCAndHJhbnNwYXJlbnQnIHwgJ2Z1bGx5LXRyYW5zcGFyZW50J1xyXG5cclxuLyoqXHJcbiAqIENvbW1vbiBzZXR1cCBmb3IgdGV4dCBpbnB1dCAmIHRleHRhcmVhIGZpZWxkc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRleHRJbnB1dENvcmU8ViBleHRlbmRzIHN0cmluZyB8IHN0cmluZ1tdID0gc3RyaW5nPihwYXJhbXM6IHtcclxuICBwcm9wczogVG9SZWZzPHtcclxuICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgaGVscD86IHN0cmluZ1xyXG4gICAgbGFiZWw/OiBzdHJpbmdcclxuICAgIHNob3dMYWJlbD86IGJvb2xlYW5cclxuICAgIHJ1bGVzPzogUnVsZUV4cHJlc3Npb248Vj5cclxuICAgIHZhbGlkYXRlT25Nb3VudD86IGJvb2xlYW5cclxuICAgIHZhbGlkYXRlT25WYWx1ZVVwZGF0ZT86IGJvb2xlYW5cclxuICAgIG1vZGVsVmFsdWU/OiBWXHJcbiAgICBhdXRvRm9jdXM/OiBib29sZWFuXHJcbiAgICBzaG93Q2xlYXI/OiBib29sZWFuXHJcbiAgICB1c2VMYWJlbEluRXJyb3JzPzogYm9vbGVhblxyXG4gICAgY3VzdG9tRXJyb3JNZXNzYWdlPzogc3RyaW5nXHJcbiAgICBoaWRlRXJyb3JNZXNzYWdlPzogYm9vbGVhblxyXG4gICAgY29sb3I/OiBJbnB1dENvbG9yXHJcbiAgICBsYWJlbFBvc2l0aW9uPzogTGFiZWxQb3NpdGlvblxyXG4gICAgY3VzdG9tSGVscENsYXNzPzogc3RyaW5nXHJcbiAgfT5cclxuICBlbWl0OiB7XHJcbiAgICAoZTogJ2NoYW5nZScsIHZhbDogeyBldmVudD86IEV2ZW50OyB2YWx1ZTogViB9KTogdm9pZFxyXG4gICAgKGU6ICdjbGVhcicpOiB2b2lkXHJcbiAgfVxyXG4gIGlucHV0RWw6IFJlZjxOdWxsYWJsZTxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4+XHJcbiAgb3B0aW9ucz86IFBhcnRpYWw8e1xyXG4gICAgY3VzdG9tQ2xlYXI6ICgpID0+IHZvaWRcclxuICB9PlxyXG59KSB7XHJcbiAgY29uc3QgeyBwcm9wcywgaW5wdXRFbCwgZW1pdCwgb3B0aW9ucyB9ID0gcGFyYW1zXHJcblxyXG4gIGNvbnN0IHsgdmFsdWUsIGVycm9yTWVzc2FnZTogdmVlRXJyb3JNZXNzYWdlIH0gPSB1c2VGaWVsZDxWPihcclxuICAgIHByb3BzLm5hbWUsXHJcbiAgICBwcm9wcy5ydWxlcyxcclxuICAgIHtcclxuICAgICAgdmFsaWRhdGVPbk1vdW50OiB1bnJlZihwcm9wcy52YWxpZGF0ZU9uTW91bnQpLFxyXG4gICAgICB2YWxpZGF0ZU9uVmFsdWVVcGRhdGU6IHVucmVmKHByb3BzLnZhbGlkYXRlT25WYWx1ZVVwZGF0ZSksXHJcbiAgICAgIGluaXRpYWxWYWx1ZTogdW5yZWYocHJvcHMubW9kZWxWYWx1ZSkgfHwgdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgKVxyXG5cclxuICBjb25zdCBsYWJlbENsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgICAnZmxleCB0ZXh0LWJvZHkteHMgZm9udC1tZWRpdW0gZ2FwLTEgaXRlbXMtY2VudGVyJyxcclxuICAgICAgdW5yZWYocHJvcHMuY29sb3IpID09PSAnZm91bmRhdGlvbicgPyAndGV4dC1mb3JlZ3JvdW5kJyA6ICd0ZXh0LWZvcmVncm91bmQtMicsXHJcbiAgICAgIHVucmVmKHByb3BzLmxhYmVsUG9zaXRpb24pICE9PSAnbGVmdCcgPyAncGItMScgOiBudWxsXHJcbiAgICBdXHJcbiAgICBpZiAoIXVucmVmKHByb3BzLnNob3dMYWJlbCkpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdzci1vbmx5JylcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxuICB9KVxyXG5cclxuICBjb25zdCBjb3JlSW5wdXRDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbXHJcbiAgICAgICdmb2N1czpvdXRsaW5lLW5vbmUgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOmJnLWZvdW5kYXRpb24tZGlzYWJsZWQnLFxyXG4gICAgICAnZGlzYWJsZWQ6dGV4dC1kaXNhYmxlZC1tdXRlZCBwbGFjZWhvbGRlcjp0ZXh0LWZvcmVncm91bmQtMicsXHJcbiAgICAgICdyb3VuZGVkLW1kJ1xyXG4gICAgXVxyXG5cclxuICAgIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IGNvcmVDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgY29sb3IgPSB1bnJlZihwcm9wcy5jb2xvcilcclxuICAgIGNvbnN0IGNsYXNzUGFydHMgPSBbJ2Jsb2NrIHctZnVsbCB0ZXh0LWZvcmVncm91bmQnLCBjb3JlSW5wdXRDbGFzc2VzLnZhbHVlXVxyXG5cclxuICAgIGlmIChjb2xvciAhPT0gJ2Z1bGx5LXRyYW5zcGFyZW50Jykge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3B5LTIgcHgtMycpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3AtMCcpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc0Vycm9yLnZhbHVlKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnIWJvcmRlci1kYW5nZXInKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXItMCcpXHJcbiAgICAgIGlmIChjb2xvciAhPT0gJ2Z1bGx5LXRyYW5zcGFyZW50Jykge1xyXG4gICAgICAgIGNsYXNzUGFydHMucHVzaCgndHJhbnNpdGlvbi1hbGwgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctb3V0bGluZS0yJylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goJ2ZvY3VzOnJpbmctMCcpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sb3IgPT09ICdmb3VuZGF0aW9uJykge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goXHJcbiAgICAgICAgJ2JnLWZvdW5kYXRpb24gIWJvcmRlciBib3JkZXItb3V0bGluZS0yIGhvdmVyOmJvcmRlci1vdXRsaW5lLTUgZm9jdXMtdmlzaWJsZTpib3JkZXItb3V0bGluZS00ICFyaW5nLTAgZm9jdXMtdmlzaWJsZTohb3V0bGluZS0wJ1xyXG4gICAgICApXHJcbiAgICB9IGVsc2UgaWYgKGluY2x1ZGVzKFsndHJhbnNwYXJlbnQnLCAnZnVsbHktdHJhbnNwYXJlbnQnXSwgY29sb3IpKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctdHJhbnNwYXJlbnQnKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdiZy1mb3VuZGF0aW9uLXBhZ2UnKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IGludGVybmFsSGVscFRpcElkID0gcmVmKG5hbm9pZCgpKVxyXG5cclxuICBjb25zdCB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHVucmVmKHByb3BzLmxhYmVsKSB8fCB1bnJlZihwcm9wcy5uYW1lKSlcclxuXHJcbiAgY29uc3QgZXJyb3JNZXNzYWdlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYgKHVucmVmKHByb3BzLmN1c3RvbUVycm9yTWVzc2FnZSkpIHtcclxuICAgICAgcmV0dXJuIHVucmVmKHByb3BzLmN1c3RvbUVycm9yTWVzc2FnZSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiYXNlID0gdmVlRXJyb3JNZXNzYWdlLnZhbHVlXHJcbiAgICBpZiAoIWJhc2UgfHwgIXVucmVmKHByb3BzLnVzZUxhYmVsSW5FcnJvcnMpKSByZXR1cm4gYmFzZVxyXG4gICAgcmV0dXJuIGJhc2UucmVwbGFjZSgnVmFsdWUnLCB0aXRsZS52YWx1ZSlcclxuICB9KVxyXG5cclxuICBjb25zdCBoYXNFcnJvciA9IGNvbXB1dGVkKCgpID0+ICEhZXJyb3JNZXNzYWdlLnZhbHVlKVxyXG5cclxuICBjb25zdCBoaWRlSGVscFRpcCA9IGNvbXB1dGVkKFxyXG4gICAgKCkgPT4gZXJyb3JNZXNzYWdlLnZhbHVlICYmIHVucmVmKHByb3BzLmhpZGVFcnJvck1lc3NhZ2UpXHJcbiAgKVxyXG4gIGNvbnN0IGhlbHBUaXAgPSBjb21wdXRlZCgoKSA9PiBlcnJvck1lc3NhZ2UudmFsdWUgfHwgdW5yZWYocHJvcHMuaGVscCkpXHJcbiAgY29uc3QgaGFzSGVscFRpcCA9IGNvbXB1dGVkKCgpID0+ICEhaGVscFRpcC52YWx1ZSlcclxuICBjb25zdCBjdXN0b21IZWxwVGlwQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB1bnJlZihwcm9wcy5jdXN0b21IZWxwQ2xhc3MpKVxyXG4gIGNvbnN0IGhlbHBUaXBJZCA9IGNvbXB1dGVkKCgpID0+XHJcbiAgICBoYXNIZWxwVGlwLnZhbHVlID8gYCR7dW5yZWYocHJvcHMubmFtZSl9LSR7aW50ZXJuYWxIZWxwVGlwSWQudmFsdWV9YCA6IHVuZGVmaW5lZFxyXG4gIClcclxuXHJcbiAgY29uc3QgaGVscFRpcENsYXNzZXMgPSBjb21wdXRlZCgoKTogc3RyaW5nID0+IHtcclxuICAgIGNvbnN0IGNsYXNzUGFydHMgPSBbJ3RleHQtYm9keS0yeHMgYnJlYWstd29yZHMnXVxyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKGhhc0Vycm9yLnZhbHVlID8gJ3RleHQtZGFuZ2VyJyA6ICd0ZXh0LWZvcmVncm91bmQtMicpXHJcbiAgICBpZiAoY3VzdG9tSGVscFRpcENsYXNzLnZhbHVlKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaChjdXN0b21IZWxwVGlwQ2xhc3MudmFsdWUpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxuICB9KVxyXG5cclxuICBjb25zdCBzaG91bGRTaG93Q2xlYXIgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBpZiAoIXVucmVmKHByb3BzLnNob3dDbGVhcikpIHJldHVybiBmYWxzZVxyXG4gICAgcmV0dXJuICh2YWx1ZS52YWx1ZT8ubGVuZ3RoIHx8IDApID4gMFxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IGZvY3VzID0gKCkgPT4ge1xyXG4gICAgaW5wdXRFbC52YWx1ZT8uZm9jdXMoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgY2xlYXIgPSAoKSA9PiB7XHJcbiAgICB2YWx1ZS52YWx1ZSA9IChpc0FycmF5KHZhbHVlLnZhbHVlKSA/IFtdIDogJycpIGFzIFZcclxuICAgIG9wdGlvbnM/LmN1c3RvbUNsZWFyPy4oKVxyXG5cclxuICAgIGVtaXQoJ2NoYW5nZScsIHsgdmFsdWU6IHZhbHVlLnZhbHVlIH0pXHJcbiAgICBlbWl0KCdjbGVhcicpXHJcbiAgfVxyXG5cclxuICBvbk1vdW50ZWQoKCkgPT4ge1xyXG4gICAgaWYgKHVucmVmKHByb3BzLmF1dG9Gb2N1cykpIHtcclxuICAgICAgZm9jdXMoKVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBjb3JlSW5wdXRDbGFzc2VzLFxyXG4gICAgY29yZUNsYXNzZXMsXHJcbiAgICB0aXRsZSxcclxuICAgIHZhbHVlLFxyXG4gICAgaGVscFRpcElkLFxyXG4gICAgaGVscFRpcENsYXNzZXMsXHJcbiAgICBoZWxwVGlwLFxyXG4gICAgaGlkZUhlbHBUaXAsXHJcbiAgICBlcnJvck1lc3NhZ2UsXHJcbiAgICBjbGVhcixcclxuICAgIGZvY3VzLFxyXG4gICAgbGFiZWxDbGFzc2VzLFxyXG4gICAgc2hvdWxkU2hvd0NsZWFyLFxyXG4gICAgaGFzRXJyb3JcclxuICB9XHJcbn1cclxuXHJcbnR5cGUgRm9ybUlucHV0Q2hhbmdlRXZlbnQgPSB7IGV2ZW50PzogRXZlbnQ7IHZhbHVlOiBzdHJpbmcgfVxyXG5cclxuLyoqXHJcbiAqIEF0dGFjaCByZXR1cm5lZCBvbiBhbmQgYmluZCB1c2luZyB2LW9uIGFuZCB2LWJpbmQsIGFuZCB0aGVuIHlvdSBjYW4gdXNlIHRoZSByZXR1cm5lZCBgdmFsdWVgXHJcbiAqIHJlZiB0byBnZXQgdGhlIGlucHV0J3MgdmFsdWUgd2hpbGUgZW5zdXJpbmcgbm9ybWFsIGlucHV0IGV2ZW50cyBhcmUgZGVib3VuY2VkIGFuZCBvbmx5IGNoYW5nZS9jbGVhclxyXG4gKiBldmVudHMgY2F1c2UgdGhlIHZhbHVlIHRvIHByb3BhZ2F0ZSBpbW1lZGlhdGVseVxyXG4gKlxyXG4gKiBWZXJ5IHVzZWZ1bCBmb3Igc2VhcmNoIGlucHV0cyBhbmQgb3RoZXIga2luZCBvZiBhdXRvLXN1Ym1pdHRpbmcgaW5wdXRzIVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZURlYm91bmNlZFRleHRJbnB1dChwYXJhbXM/OiB7XHJcbiAgLyoqXHJcbiAgICogRm9yIGhvdyBsb25nIHNob3VsZCBiYXNpYyBpbnB1dCBldmVudHMgYmUgZGVib3VuY2VkLlxyXG4gICAqIERlZmF1bHQ6IDEwMDAgKG1zKVxyXG4gICAqL1xyXG4gIGRlYm91bmNlZEJ5PzogbnVtYmVyXHJcblxyXG4gIC8qKlxyXG4gICAqIElmIGVuYWJsZWQsIHZhbHVlIHdpbGwgb25seSBjaGFuZ2Ugb24gc3VibWl0L2VudGVyLCBhbmQganVzdCB0eXBpbmcgaW4gdmFsdWVzIHdpbGwgbmV2ZXJcclxuICAgKiByZWdpc3Rlci5cclxuICAgKiBEZWZhdWx0OiBmYWxzZVxyXG4gICAqL1xyXG4gIGRpc2FibGVEZWJvdW5jZWRJbnB1dD86IGJvb2xlYW5cclxuXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWxseSBwYXNzIGluIHRoZSBtb2RlbCByZWYgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgc291cmNlIG9mIHRydXRoXHJcbiAgICovXHJcbiAgbW9kZWw/OiBSZWY8TWF5YmVOdWxsT3JVbmRlZmluZWQ8c3RyaW5nPj5cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRvIHRydWUgaWYgeW91J3JlIHRyYWNraW5nIGNoYW5nZXMgb24gYSBiYXNpYyBIVE1MIGlucHV0IGVsZW1lbnQuIFRoaXMgd2lsbCBjaGFuZ2UgdGhlIGV2ZW50c1xyXG4gICAqIGJlaW5nIHVzZWQgKGUuZy4gaW5wdXQgaW5zdGVhZCBvZiB1cGRhdGU6bW9kZWxWYWx1ZSlcclxuICAgKlxyXG4gICAqIERlZmF1bHQ6IGZhbHNlXHJcbiAgICovXHJcbiAgaXNCYXNpY0h0bWxJbnB1dD86IGJvb2xlYW5cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50IHRoZSBjaGFuZ2UgZXZlbnQgdG8gYmUgZW1pdHRlZCBvbiBFbnRlciBrZXkgcHJlc3MuXHJcbiAgICogU2V0dGluZyBvbmx5IHdvcmtzIGZvciBiYXNpYyBodG1sIGlucHV0cyBjdXJyZW50bHkhXHJcbiAgICpcclxuICAgKiBEZWZhdWx0OiBEZWZhdWx0IGJlaGF2aW9yICh0cnVlIGZvciBpbnB1dCwgZmFsc2UgZm9yIHRleHRhcmVhKVxyXG4gICAqL1xyXG4gIHN1Ym1pdE9uRW50ZXI/OiBib29sZWFuXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIHNlZSBkZWJ1ZyBvdXRwdXQgZm9yIGhvdyBldmVudHMgZmlyZSBhbmQgYXJlIGhhbmRsZWRcclxuICAgKi9cclxuICBkZWJ1Zz86IGJvb2xlYW4gfCAoKC4uLmxvZ0FyZ3M6IHVua25vd25bXSkgPT4gdm9pZClcclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCB3aGVuIGEgbmV3IHZhbHVlIGlzIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGhlIG1vZGVsXHJcbiAgICovXHJcbiAgb25Xcml0ZT86ICh2YWw6IHN0cmluZykgPT4gdm9pZFxyXG59KSB7XHJcbiAgY29uc3Qge1xyXG4gICAgZGVib3VuY2VkQnkgPSAxMDAwLFxyXG4gICAgaXNCYXNpY0h0bWxJbnB1dCA9IGZhbHNlLFxyXG4gICAgc3VibWl0T25FbnRlcixcclxuICAgIGRpc2FibGVEZWJvdW5jZWRJbnB1dCxcclxuICAgIG9uV3JpdGVcclxuICB9ID0gcGFyYW1zIHx8IHt9XHJcbiAgY29uc3QgbG9nID0gcGFyYW1zPy5kZWJ1Z1xyXG4gICAgPyBpc0Jvb2xlYW4ocGFyYW1zLmRlYnVnKVxyXG4gICAgICA/IGNvbnNvbGUuZGVidWdcclxuICAgICAgOiBwYXJhbXMuZGVidWdcclxuICAgIDogbm9vcFxyXG5cclxuICAvLyBUaGUgYWN0dWFsIHNvdXJjZSBvZiB0cnV0aCBob2xkaW5nIHRoZSBmaW5hbCB2YWx1ZVxyXG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zPy5tb2RlbCB8fCByZWYoJycpXHJcblxyXG4gIC8vIFRoZSBpbnRlcm5hbCBtb2RlbCBvZiB0aGUgaW5wdXRcclxuICBjb25zdCBtb2RlbCA9IHJlZih2YWx1ZS52YWx1ZSlcclxuXHJcbiAgY29uc3QgZ2V0VmFsdWUgPSAodmFsOiBzdHJpbmcgfCBJbnB1dEV2ZW50IHwgRXZlbnQgfCBGb3JtSW5wdXRDaGFuZ2VFdmVudCkgPT4ge1xyXG4gICAgaWYgKGlzU3RyaW5nKHZhbCkpIHJldHVybiB2YWxcclxuICAgIGlmICgndmFsdWUnIGluIHZhbCkgcmV0dXJuIHZhbC52YWx1ZVxyXG5cclxuICAgIGNvbnN0IHRhcmdldCA9IHZhbC50YXJnZXQgYXMgTnVsbGFibGU8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XHJcbiAgICByZXR1cm4gdGFyZ2V0Py52YWx1ZSB8fCAnJ1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyc2lzdCBjaGFuZ2VzIHRvIHRoZSBjb3JlIHVuZGVybHlpbmcgc291cmNlIG9mIHRydXRoIHRoYXQncyBhdmFpbGFibGUgb3V0d2FyZHNcclxuICAgKi9cclxuICBjb25zdCBwZXJzaXN0VmFsdWUgPSAodmFsOiBzdHJpbmcpID0+IHtcclxuICAgIHZhbHVlLnZhbHVlID0gdmFsXHJcbiAgICBsb2coJ1ZhbHVlIHVwZGF0ZWQ6ICcgKyB2YWwpXHJcbiAgICBvbldyaXRlPy4odmFsKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZGVib3VuY2VkVmFsdWVVcGRhdGUgPSBkaXNhYmxlRGVib3VuY2VkSW5wdXRcclxuICAgID8gdW5kZWZpbmVkXHJcbiAgICA6IGRlYm91bmNlKCh2YWw6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHBlcnNpc3RWYWx1ZSh2YWwpXHJcbiAgICAgIH0sIGRlYm91bmNlZEJ5KVxyXG5cclxuICBjb25zdCBpbnB1dEV2ZW50TmFtZSA9IGlzQmFzaWNIdG1sSW5wdXQgPyAnaW5wdXQnIDogJ3VwZGF0ZTptb2RlbFZhbHVlJ1xyXG4gIGNvbnN0IG9uID0ge1xyXG4gICAgW2lucHV0RXZlbnROYW1lXTogKHZhbDogc3RyaW5nIHwgSW5wdXRFdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBuZXdWYWwgPSBnZXRWYWx1ZSh2YWwpXHJcbiAgICAgIG1vZGVsLnZhbHVlID0gbmV3VmFsXHJcbiAgICAgIGRlYm91bmNlZFZhbHVlVXBkYXRlPy4obmV3VmFsKVxyXG4gICAgICBsb2coYElucHV0IGV2ZW50IFske2lucHV0RXZlbnROYW1lfV0gdHJpZ2dlcmVkOiAke25ld1ZhbH1gKVxyXG4gICAgfSxcclxuICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgIGRlYm91bmNlZFZhbHVlVXBkYXRlPy5jYW5jZWwoKVxyXG4gICAgICBtb2RlbC52YWx1ZSA9ICcnXHJcbiAgICAgIHBlcnNpc3RWYWx1ZSgnJylcclxuICAgICAgbG9nKCdDbGVhciBldmVudCcpXHJcbiAgICB9LFxyXG4gICAgY2hhbmdlOiAodmFsOiBGb3JtSW5wdXRDaGFuZ2VFdmVudCB8IEV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld1ZhbCA9IGdldFZhbHVlKHZhbClcclxuICAgICAgZGVib3VuY2VkVmFsdWVVcGRhdGU/LmNhbmNlbCgpXHJcbiAgICAgIHBlcnNpc3RWYWx1ZShuZXdWYWwpXHJcbiAgICAgIG1vZGVsLnZhbHVlID0gbmV3VmFsXHJcbiAgICAgIGxvZygnQ2hhbmdlIGV2ZW50OiAnICsgbmV3VmFsKVxyXG4gICAgfSxcclxuICAgIGtleWRvd246IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmICghaXNCYXNpY0h0bWxJbnB1dCkgcmV0dXJuXHJcbiAgICAgIGlmIChpc1VuZGVmaW5lZChzdWJtaXRPbkVudGVyKSkgcmV0dXJuXHJcblxyXG4gICAgICBjb25zdCBpc0VudGVyID0gZS5rZXkgPT09ICdFbnRlcidcclxuICAgICAgaWYgKCFpc0VudGVyKSByZXR1cm5cclxuXHJcbiAgICAgIGNvbnN0IGlzVGV4dGFyZWEgPSBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnRcclxuXHJcbiAgICAgIGlmIChpc1RleHRhcmVhKSB7XHJcbiAgICAgICAgaWYgKHN1Ym1pdE9uRW50ZXIpIHtcclxuICAgICAgICAgIGxvZygnVHJpZ2dlcmluZyBzdWJtaXQgb24gZW50ZXInKVxyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICAgICAgICBvbi5jaGFuZ2UoZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKCFzdWJtaXRPbkVudGVyKSB7XHJcbiAgICAgICAgICBsb2coJ1ByZXZlbnRpbmcgc3VibWl0IG9uIGVudGVyJylcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBjb25zdCBiaW5kID0gY29tcHV0ZWQoKCkgPT4gKHtcclxuICAgIG1vZGVsVmFsdWU6IG1vZGVsLnZhbHVlIHx8ICcnXHJcbiAgfSkpXHJcblxyXG4gIHdhdGNoKHZhbHVlLCAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICAgIGlmIChvbGRWYWwgPT09IG5ld1ZhbCAmJiAhb2xkVmFsICYmICFuZXdWYWwpIHJldHVyblxyXG4gICAgaWYgKG1vZGVsLnZhbHVlID09PSB2YWx1ZS52YWx1ZSkgcmV0dXJuXHJcbiAgICBtb2RlbC52YWx1ZSA9IHZhbHVlLnZhbHVlXHJcbiAgfSlcclxuXHJcbiAgY29uc3Qgc3luY0Zyb21WYWx1ZSA9ICgpID0+IHtcclxuICAgIGRlYm91bmNlZFZhbHVlVXBkYXRlPy5jYW5jZWwoKVxyXG4gICAgbW9kZWwudmFsdWUgPSB2YWx1ZS52YWx1ZVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG9uLFxyXG4gICAgYmluZCxcclxuICAgIHZhbHVlLFxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JjZSBzeW5jIGludGVybmFsIHN0YXRlIGZyb20gdGhlIHNvdXJjZSBvZiB0cnV0aFxyXG4gICAgICovXHJcbiAgICBzeW5jRnJvbVZhbHVlXHJcbiAgfVxyXG59XHJcbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlanMtYWNjZXNzaWJpbGl0eS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgLS0+XHJcbjx0ZW1wbGF0ZT5cclxuICA8ZGl2IDpjbGFzcz1cImNvbXB1dGVkV3JhcHBlckNsYXNzZXNcIj5cclxuICAgIDxkaXZcclxuICAgICAgOmNsYXNzPVwiXHJcbiAgICAgICAgbGFiZWxQb3NpdGlvbiA9PT0gJ2xlZnQnXHJcbiAgICAgICAgICA/ICd3LWZ1bGwgbWQ6dy02LzEyIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXInXHJcbiAgICAgICAgICA6ICd3LWZ1bGwnXHJcbiAgICAgIFwiXHJcbiAgICA+XHJcbiAgICAgIDxsYWJlbCA6Zm9yPVwibmFtZVwiIDpjbGFzcz1cImxhYmVsQ2xhc3Nlc1wiPlxyXG4gICAgICAgIDxzcGFuPnt7IHRpdGxlIH19PC9zcGFuPlxyXG4gICAgICAgIDxkaXYgdi1pZj1cIiFzaG93UmVxdWlyZWRcIiBjbGFzcz1cInRleHQtYm9keS0yeHMgZm9udC1ub3JtYWxcIj4ob3B0aW9uYWwpPC9kaXY+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxzcGFuXHJcbiAgICAgICAgdi1pZj1cImxhYmVsUG9zaXRpb24gPT09ICdsZWZ0JyAmJiBoZWxwVGlwSWRMZWZ0XCJcclxuICAgICAgICA6aWQ9XCJoZWxwVGlwSWRMZWZ0XCJcclxuICAgICAgICA6Y2xhc3M9XCJoZWxwVGlwQ2xhc3Nlc1wiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBoZWxwVGlwIH19XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cInJlbGF0aXZlXCJcclxuICAgICAgOmNsYXNzPVwibGFiZWxQb3NpdGlvbiA9PT0gJ2xlZnQnID8gJ3ctZnVsbCBtZDp3LTYvMTInIDogJ3ctZnVsbCdcIlxyXG4gICAgPlxyXG4gICAgICA8dGV4dGFyZWFcclxuICAgICAgICA6aWQ9XCJuYW1lXCJcclxuICAgICAgICByZWY9XCJpbnB1dEVsZW1lbnRcIlxyXG4gICAgICAgIHYtbW9kZWw9XCJ2YWx1ZVwiXHJcbiAgICAgICAgOm5hbWU9XCJuYW1lXCJcclxuICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICBjb3JlQ2xhc3NlcyxcclxuICAgICAgICAgIGljb25DbGFzc2VzLFxyXG4gICAgICAgICAgc2l6ZUNsYXNzZXMsXHJcbiAgICAgICAgICB0ZXh0YXJlYUNsYXNzZXMgfHwgJycsXHJcbiAgICAgICAgICAnbWluLWgtWzZyZW1dIHNtOm1pbi1oLVszcmVtXSBzaW1wbGUtc2Nyb2xsYmFyJ1xyXG4gICAgICAgIF1cIlxyXG4gICAgICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgOmFyaWEtaW52YWxpZD1cImVycm9yTWVzc2FnZSA/ICd0cnVlJyA6ICdmYWxzZSdcIlxyXG4gICAgICAgIDphcmlhLWRlc2NyaWJlZGJ5PVwibGFiZWxQb3NpdGlvbiA9PT0gJ2xlZnQnID8gaGVscFRpcElkTGVmdCA6IGhlbHBUaXBJZFRvcFwiXHJcbiAgICAgICAgdi1iaW5kPVwiJGF0dHJzXCJcclxuICAgICAgICBAY2hhbmdlPVwiJGVtaXQoJ2NoYW5nZScsIHsgZXZlbnQ6ICRldmVudCwgdmFsdWUgfSlcIlxyXG4gICAgICAgIEBpbnB1dD1cIiRlbWl0KCdpbnB1dCcsIHsgZXZlbnQ6ICRldmVudCwgdmFsdWUgfSlcIlxyXG4gICAgICAgIEBrZXlkb3duLnN0b3BcclxuICAgICAgLz5cclxuICAgICAgPGFcclxuICAgICAgICB2LWlmPVwic2hvdWxkU2hvd0NsZWFyXCJcclxuICAgICAgICB0aXRsZT1cIkNsZWFyIGlucHV0XCJcclxuICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0yIHJpZ2h0LTAgZmxleCBpdGVtcy1jZW50ZXIgcHItMiBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgQGNsaWNrPVwiY2xlYXJcIlxyXG4gICAgICAgIEBrZXlkb3duPVwiY2xlYXJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzIHNyLW9ubHlcIj5DbGVhciBpbnB1dDwvc3Bhbj5cclxuICAgICAgICA8WE1hcmtJY29uIGNsYXNzPVwiaC01IHctNSB0ZXh0LWZvcmVncm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxyXG4gICAgICA8L2E+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxwXHJcbiAgICAgIHYtaWY9XCJsYWJlbFBvc2l0aW9uID09PSAndG9wJyAmJiBoZWxwVGlwSWRUb3BcIlxyXG4gICAgICA6aWQ9XCJoZWxwVGlwSWRUb3BcIlxyXG4gICAgICA6Y2xhc3M9XCJbJ210LTEuNScsIGhlbHBUaXBDbGFzc2VzXVwiXHJcbiAgICA+XHJcbiAgICAgIHt7IGhlbHBUaXAgfX1cclxuICAgIDwvcD5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgWE1hcmtJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjAvc29saWQnXHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB0eXBlIHsgUnVsZUV4cHJlc3Npb24gfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCByZWYsIHRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBMYWJlbFBvc2l0aW9uIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL2Zvcm0vaW5wdXQnXHJcbmltcG9ydCB0eXBlIHsgSW5wdXRDb2xvciB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9mb3JtL3RleHRJbnB1dCdcclxuaW1wb3J0IHsgdXNlVGV4dElucHV0Q29yZSB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9mb3JtL3RleHRJbnB1dCdcclxuXHJcbnR5cGUgSW5wdXRTaXplID0gJ3NtJyB8ICdiYXNlJyB8ICdsZycgfCAneGwnXHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWw6IHN0cmluZyk6IHZvaWRcclxuICAoZTogJ2NoYW5nZScsIHZhbDogeyBldmVudD86IEV2ZW50OyB2YWx1ZTogc3RyaW5nIH0pOiB2b2lkXHJcbiAgKGU6ICdpbnB1dCcsIHZhbDogeyBldmVudD86IEV2ZW50OyB2YWx1ZTogc3RyaW5nIH0pOiB2b2lkXHJcbiAgKGU6ICdjbGVhcicpOiB2b2lkXHJcbn0+KClcclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIC8qKlxyXG4gICAgICogVW5pcXVlIElEIGZvciB0aGUgaW5wdXQgKG11c3QgYmUgdW5pcXVlIHBhZ2Utd2lkZSlcclxuICAgICAqL1xyXG4gICAgbmFtZTogc3RyaW5nXHJcbiAgICBzaG93TGFiZWw/OiBib29sZWFuXHJcbiAgICBoZWxwPzogc3RyaW5nXHJcbiAgICBwbGFjZWhvbGRlcj86IHN0cmluZ1xyXG4gICAgbGFiZWw/OiBzdHJpbmdcclxuICAgIGRpc2FibGVkPzogYm9vbGVhblxyXG4gICAgcnVsZXM/OiBSdWxlRXhwcmVzc2lvbjxzdHJpbmc+XHJcbiAgICB2YWxpZGF0ZU9uTW91bnQ/OiBib29sZWFuXHJcbiAgICB2YWxpZGF0ZU9uVmFsdWVVcGRhdGU/OiBib29sZWFuXHJcbiAgICB1c2VMYWJlbEluRXJyb3JzPzogYm9vbGVhblxyXG4gICAgYXV0b0ZvY3VzPzogYm9vbGVhblxyXG4gICAgbW9kZWxWYWx1ZT86IHN0cmluZ1xyXG4gICAgc2hvd0NsZWFyPzogYm9vbGVhblxyXG4gICAgZnVsbFdpZHRoPzogYm9vbGVhblxyXG4gICAgc2hvd1JlcXVpcmVkPzogYm9vbGVhblxyXG4gICAgc2hvd09wdGlvbmFsPzogYm9vbGVhblxyXG4gICAgY29sb3I/OiBJbnB1dENvbG9yXHJcbiAgICB0ZXh0YXJlYUNsYXNzZXM/OiBzdHJpbmdcclxuICAgIHNpemU/OiBJbnB1dFNpemVcclxuICAgIGxhYmVsUG9zaXRpb24/OiBMYWJlbFBvc2l0aW9uXHJcbiAgICB3cmFwcGVyQ2xhc3Nlcz86IHN0cmluZ1xyXG4gIH0+KCksXHJcbiAge1xyXG4gICAgdXNlTGFiZWxJbkVycm9yczogdHJ1ZSxcclxuICAgIG1vZGVsVmFsdWU6ICcnLFxyXG4gICAgY29sb3I6ICdwYWdlJyxcclxuICAgIGxhYmVsUG9zaXRpb246ICd0b3AnLFxyXG4gICAgd3JhcHBlckNsYXNzZXM6ICcnXHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCBpbnB1dEVsZW1lbnQgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MVGV4dEFyZWFFbGVtZW50PilcclxuXHJcbmNvbnN0IHtcclxuICBjb3JlQ2xhc3NlcyxcclxuICB0aXRsZSxcclxuICB2YWx1ZSxcclxuICBoZWxwVGlwQ2xhc3NlcyxcclxuICBoZWxwVGlwLFxyXG4gIGVycm9yTWVzc2FnZSxcclxuICBsYWJlbENsYXNzZXMsXHJcbiAgY2xlYXIsXHJcbiAgZm9jdXMsXHJcbiAgc2hvdWxkU2hvd0NsZWFyXHJcbn0gPSB1c2VUZXh0SW5wdXRDb3JlKHtcclxuICBwcm9wczogdG9SZWZzKHByb3BzKSxcclxuICBlbWl0LFxyXG4gIGlucHV0RWw6IGlucHV0RWxlbWVudFxyXG59KVxyXG5cclxuY29uc3QgaGVscFRpcElkVG9wID0gY29tcHV0ZWQoKCkgPT4gYCR7cHJvcHMubmFtZX0taGVscC10b3BgKVxyXG5jb25zdCBoZWxwVGlwSWRMZWZ0ID0gY29tcHV0ZWQoKCkgPT4gYCR7cHJvcHMubmFtZX0taGVscC1sZWZ0YClcclxuXHJcbmNvbnN0IGljb25DbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWydwbC0yJ11cclxuXHJcbiAgaWYgKHNob3VsZFNob3dDbGVhci52YWx1ZSAmJiBlcnJvck1lc3NhZ2UudmFsdWUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncHItMTInKVxyXG4gIH0gZWxzZSBpZiAoc2hvdWxkU2hvd0NsZWFyLnZhbHVlIHx8IGVycm9yTWVzc2FnZS52YWx1ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdwci04JylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3Qgc2l6ZUNsYXNzZXMgPSBjb21wdXRlZCgoKTogc3RyaW5nID0+IHtcclxuICBzd2l0Y2ggKHByb3BzLnNpemUpIHtcclxuICAgIGNhc2UgJ3NtJzpcclxuICAgICAgcmV0dXJuICd0ZXh0LWJvZHkgc206dGV4dC1ib2R5LTJ4cydcclxuICAgIGNhc2UgJ2xnJzpcclxuICAgICAgcmV0dXJuICd0ZXh0LWJvZHkgc206dGV4dC1zbSdcclxuICAgIGNhc2UgJ3hsJzpcclxuICAgICAgcmV0dXJuICd0ZXh0LWJvZHkgc206dGV4dC1iYXNlJ1xyXG4gICAgY2FzZSAnYmFzZSc6XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gJ3RleHQtYm9keSBzbTp0ZXh0LWJvZHkteHMnXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgY29tcHV0ZWRXcmFwcGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc2VzID0gWydmbGV4JywgcHJvcHMud3JhcHBlckNsYXNzZXNdXHJcbiAgaWYgKHByb3BzLmZ1bGxXaWR0aCkge1xyXG4gICAgY2xhc3Nlcy5wdXNoKCd3LWZ1bGwnKVxyXG4gIH1cclxuXHJcbiAgaWYgKHByb3BzLmxhYmVsUG9zaXRpb24gPT09ICd0b3AnKSB7XHJcbiAgICBjbGFzc2VzLnB1c2goJ2ZsZXgtY29sJylcclxuICB9XHJcbiAgaWYgKHByb3BzLmxhYmVsUG9zaXRpb24gPT09ICdsZWZ0Jykge1xyXG4gICAgY2xhc3Nlcy5wdXNoKFxyXG4gICAgICAndy1mdWxsIHNwYWNlLXktMSBzbTpzcGFjZS15LTAgc206c3BhY2UteC04IGZsZXgtY29sIHNtOmZsZXgtcm93IGl0ZW1zLXN0YXJ0J1xyXG4gICAgKVxyXG4gIH1cclxuICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJylcclxufSlcclxuXHJcbmRlZmluZUV4cG9zZSh7IGZvY3VzIH0pXHJcbjwvc2NyaXB0PlxyXG4iLCI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPGRpdiA6Y2xhc3M9XCJjb21wdXRlZFdyYXBwZXJDbGFzc2VzXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIDpjbGFzcz1cIlxyXG4gICAgICAgIGxhYmVsUG9zaXRpb24gPT09ICdsZWZ0J1xyXG4gICAgICAgICAgPyAndy1mdWxsIG1kOnctNi8xMiBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyJ1xyXG4gICAgICAgICAgOiAndy1mdWxsJ1xyXG4gICAgICBcIlxyXG4gICAgPlxyXG4gICAgICA8bGFiZWwgOmZvcj1cIm5hbWVcIiA6Y2xhc3M9XCJsYWJlbENsYXNzZXNcIj5cclxuICAgICAgICA8c3Bhbj57eyB0aXRsZSB9fTwvc3Bhbj5cclxuICAgICAgICA8ZGl2IHYtaWY9XCJzaG93UmVxdWlyZWRcIiBjbGFzcz1cInRleHQtZGFuZ2VyIHRleHQtYm9keS14cyBvcGFjaXR5LTgwXCI+KjwvZGl2PlxyXG4gICAgICAgIDxkaXYgdi1lbHNlLWlmPVwic2hvd09wdGlvbmFsXCIgY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIGZvbnQtbm9ybWFsXCI+KG9wdGlvbmFsKTwvZGl2PlxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICA8cFxyXG4gICAgICAgIHYtaWY9XCJsYWJlbFBvc2l0aW9uID09PSAnbGVmdCcgJiYgaGVscFRpcElkICYmICFoaWRlSGVscFRpcFwiXHJcbiAgICAgICAgOmlkPVwiaGVscFRpcElkXCJcclxuICAgICAgICA6Y2xhc3M9XCJoZWxwVGlwQ2xhc3Nlc1wiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBoZWxwVGlwIH19XHJcbiAgICAgIDwvcD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJncm91cCByZWxhdGl2ZVwiXHJcbiAgICAgIDpjbGFzcz1cImxhYmVsUG9zaXRpb24gPT09ICdsZWZ0JyA/ICd3LWZ1bGwgbWQ6dy02LzEyJyA6ICd3LWZ1bGwnXCJcclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtaWY9XCJjdXN0b21JY29uXCJcclxuICAgICAgICBjbGFzcz1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgdG9wLTAgYm90dG9tLTAgbGVmdC0wIGZsZXggaXRlbXMtY2VudGVyIHBsLTJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPENvbXBvbmVudFxyXG4gICAgICAgICAgOmlzPVwiY3VzdG9tSWNvblwiXHJcbiAgICAgICAgICB2LWlmPVwiY3VzdG9tSWNvblwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJsZWFkaW5nSWNvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtaWY9XCJsb2FkaW5nXCJcclxuICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0wIGgtZnVsbCByaWdodC0wIGZsZXggaXRlbXMtY2VudGVyIHByLTIgdGV4dC1mb3JlZ3JvdW5kLTNcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPENvbW1vbkxvYWRpbmdJY29uIC8+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiB2LXRpcHB5PVwidG9vbHRpcFRleHRcIj5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIDppZD1cIm5hbWVcIlxyXG4gICAgICAgICAgcmVmPVwiaW5wdXRFbGVtZW50XCJcclxuICAgICAgICAgIHYtbW9kZWw9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICA6dHlwZT1cInR5cGVcIlxyXG4gICAgICAgICAgOm5hbWU9XCJuYW1lXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltjb3JlQ2xhc3NlcywgaWNvbkNsYXNzZXMsIHNpemVDbGFzc2VzLCBpbnB1dENsYXNzZXMgfHwgJyddXCJcclxuICAgICAgICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgIDphcmlhLWludmFsaWQ9XCJlcnJvck1lc3NhZ2UgPyAndHJ1ZScgOiAnZmFsc2UnXCJcclxuICAgICAgICAgIDphcmlhLWRlc2NyaWJlZGJ5PVwiaGVscFRpcElkXCJcclxuICAgICAgICAgIDpyZWFkb25seT1cInJlYWRPbmx5XCJcclxuICAgICAgICAgIHJvbGU9XCJ0ZXh0Ym94XCJcclxuICAgICAgICAgIHYtYmluZD1cIiRhdHRyc1wiXHJcbiAgICAgICAgICA6c3R5bGU9XCJpbnB1dFN0eWxlXCJcclxuICAgICAgICAgIEBjaGFuZ2U9XCIkZW1pdCgnY2hhbmdlJywgeyBldmVudDogJGV2ZW50LCB2YWx1ZSB9KVwiXHJcbiAgICAgICAgICBAaW5wdXQ9XCIkZW1pdCgnaW5wdXQnLCB7IGV2ZW50OiAkZXZlbnQsIHZhbHVlIH0pXCJcclxuICAgICAgICAgIEBmb2N1cz1cIiRlbWl0KCdmb2N1cycpXCJcclxuICAgICAgICAgIEBibHVyPVwiJGVtaXQoJ2JsdXInKVwiXHJcbiAgICAgICAgICBAa2V5ZG93bi5zdG9wXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxzbG90IG5hbWU9XCJpbnB1dC1yaWdodFwiPlxyXG4gICAgICAgIDxhXHJcbiAgICAgICAgICB2LWlmPVwicmlnaHRJY29uXCJcclxuICAgICAgICAgIDp0aXRsZT1cInJpZ2h0SWNvblRpdGxlXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICAgICAgc2l6ZUNsYXNzZXMsXHJcbiAgICAgICAgICAgIHJlYWRPbmx5XHJcbiAgICAgICAgICAgICAgPyAndy1mdWxsIGN1cnNvci10ZXh0IGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQgZ3JvdXAtaG92ZXI6Ym9yZGVyLW91dGxpbmUtNSByb3VuZGVkLW1kJ1xyXG4gICAgICAgICAgICAgIDogJ2N1cnNvci1wb2ludGVyJ1xyXG4gICAgICAgICAgXVwiXHJcbiAgICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0wIHJpZ2h0LTAgaGlkZGVuIGdyb3VwLWhvdmVyOmZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIHByLTEgdGV4dC1mb3JlZ3JvdW5kLTJcIlxyXG4gICAgICAgICAgQGNsaWNrPVwib25SaWdodEljb25DbGlja1wiXHJcbiAgICAgICAgICBAa2V5ZG93bj1cIm9uUmlnaHRJY29uQ2xpY2tcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ib2R5LXhzIHNyLW9ubHlcIj57eyByaWdodEljb25UaXRsZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxDb21wb25lbnRcclxuICAgICAgICAgICAgOmlzPVwicmlnaHRJY29uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJoLTYgdy02IHRleHQtZm9yZWdyb3VuZFwiXHJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgdi1lbHNlLWlmPVwic2hvdWxkU2hvd0NsZWFyXCJcclxuICAgICAgICAgIHRpdGxlPVwiQ2xlYXIgaW5wdXRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMCBib3R0b20tMCByaWdodC0wIGZsZXggaXRlbXMtY2VudGVyIHByLTIgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiY2xlYXJcIlxyXG4gICAgICAgICAgQGtleWRvd249XCJjbGVhclwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWJvZHkteHMgc3Itb25seVwiPkNsZWFyIGlucHV0PC9zcGFuPlxyXG4gICAgICAgICAgPFhNYXJrSWNvbiBjbGFzcz1cImgtNSB3LTUgdGV4dC1mb3JlZ3JvdW5kXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cclxuICAgICAgICA8L2E+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgdi1lbHNlLWlmPVwiIXNob3dMYWJlbCAmJiBzaG93UmVxdWlyZWQgJiYgIWVycm9yTWVzc2FnZVwiXHJcbiAgICAgICAgICBjbGFzcz1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgdG9wLTAgYm90dG9tLTAgbXQtMiB0ZXh0LWJvZHkgcmlnaHQtMCBmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LWRhbmdlciBwci0yLjVcIlxyXG4gICAgICAgICAgOmNsYXNzPVwiW3Nob3VsZFNob3dDbGVhciA/ICdwci04JyA6ICdwci0yJ11cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICpcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zbG90PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8cFxyXG4gICAgICB2LWlmPVwibGFiZWxQb3NpdGlvbiA9PT0gJ3RvcCcgJiYgaGVscFRpcElkICYmICFoaWRlSGVscFRpcFwiXHJcbiAgICAgIDppZD1cImhlbHBUaXBJZFwiXHJcbiAgICAgIDpjbGFzcz1cIlsnbXQtMS41JywgaGVscFRpcENsYXNzZXNdXCJcclxuICAgID5cclxuICAgICAge3sgaGVscFRpcCB9fVxyXG4gICAgPC9wPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgdHlwZSB7IFJ1bGVFeHByZXNzaW9uIH0gZnJvbSAndmVlLXZhbGlkYXRlJ1xyXG5pbXBvcnQgeyBYTWFya0ljb24gfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yMC9zb2xpZCdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiwgdG9SZWZzLCB1c2VTbG90cyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBDU1NQcm9wZXJ0aWVzLCBQcm9wVHlwZSB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IHVzZVRleHRJbnB1dENvcmUgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS90ZXh0SW5wdXQnXHJcbmltcG9ydCB0eXBlIHsgUHJvcEFueUNvbXBvbmVudCB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2NvbW1vbi9jb21wb25lbnRzJ1xyXG5pbXBvcnQgdHlwZSB7IElucHV0Q29sb3IgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS90ZXh0SW5wdXQnXHJcbmltcG9ydCB0eXBlIHsgTGFiZWxQb3NpdGlvbiB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9mb3JtL2lucHV0J1xyXG5pbXBvcnQgeyBDb21tb25Mb2FkaW5nSWNvbiB9IGZyb20gJ35+L3NyYy9saWInXHJcbmltcG9ydCB7IGRpcmVjdGl2ZSBhcyB2VGlwcHkgfSBmcm9tICd2dWUtdGlwcHknXHJcblxyXG50eXBlIElucHV0VHlwZSA9ICd0ZXh0JyB8ICdlbWFpbCcgfCAncGFzc3dvcmQnIHwgJ3VybCcgfCAnc2VhcmNoJyB8ICdudW1iZXInIHwgc3RyaW5nXHJcbnR5cGUgSW5wdXRTaXplID0gJ3NtJyB8ICdiYXNlJyB8ICdsZycgfCAneGwnXHJcblxyXG5kZWZpbmVPcHRpb25zKHtcclxuICBpbmhlcml0QXR0cnM6IGZhbHNlXHJcbn0pXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICAvKipcclxuICAgKiBJbnB1dCBcInR5cGVcIiB2YWx1ZSAoY2hhbmdlcyBiZWhhdmlvdXIgJiBsb29rKVxyXG4gICAqL1xyXG4gIHR5cGU6IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxJbnB1dFR5cGU+LFxyXG4gICAgZGVmYXVsdDogJ3RleHQnXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBVbmlxdWUgSUQgZm9yIHRoZSBpbnB1dCAobXVzdCBiZSB1bmlxdWUgcGFnZS13aWRlKVxyXG4gICAqL1xyXG4gIG5hbWU6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgbGFiZWwgKGxhYmVsIHdpbGwgYWx3YXlzIGJlIHNob3duIHRvIHNjcmVlbiByZWFkZXJzKVxyXG4gICAqL1xyXG4gIHNob3dMYWJlbDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgaGVscCB0ZXh0XHJcbiAgICovXHJcbiAgaGVscDoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBQbGFjZWhvbGRlciB0ZXh0XHJcbiAgICovXHJcbiAgcGxhY2Vob2xkZXI6IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxPcHRpb25hbDxzdHJpbmc+PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogU2V0IGxhYmVsIHRleHQgZXhwbGljaXRseVxyXG4gICAqL1xyXG4gIGxhYmVsOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgcmVkIFwicmVxdWlyZWRcIiBhc3Rlcmlza1xyXG4gICAqL1xyXG4gIHNob3dSZXF1aXJlZDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIFwib3B0aW9uYWxcIiB0ZXh0XHJcbiAgICovXHJcbiAgc2hvd09wdGlvbmFsOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgY29tcG9uZW50LCBibG9ja2luZyBpdCBmcm9tIHVzZXIgaW5wdXRcclxuICAgKi9cclxuICBkaXNhYmxlZDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgZWRpdGluZyB0aGUgY29tcG9uZW50LCBtYWtpbmcgaXQgcmVhZCBvbmx5XHJcbiAgICovXHJcbiAgcmVhZE9ubHk6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogdmVlLXZhbGlkYXRlIHZhbGlkYXRpb24gcnVsZXNcclxuICAgKi9cclxuICBydWxlczoge1xyXG4gICAgdHlwZTogW1N0cmluZywgT2JqZWN0LCBGdW5jdGlvbiwgQXJyYXldIGFzIFByb3BUeXBlPFJ1bGVFeHByZXNzaW9uPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiB2ZWUtdmFsaWRhdGUgdmFsaWRhdGlvbigpIG9uIGNvbXBvbmVudCBtb3VudFxyXG4gICAqL1xyXG4gIHZhbGlkYXRlT25Nb3VudDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHRyaWdnZXIgdmFsaWRhdGlvbiB3aGVuZXZlciB0aGUgdmFsdWUgY2hhbmdlc1xyXG4gICAqL1xyXG4gIHZhbGlkYXRlT25WYWx1ZVVwZGF0ZToge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaWxsIHJlcGxhY2UgdGhlIGdlbmVyaWMgXCJWYWx1ZVwiIHRleHQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgaW4gZXJyb3IgbWVzc2FnZXNcclxuICAgKi9cclxuICB1c2VMYWJlbEluRXJyb3JzOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogU2V0IGEgY3VzdG9tIGljb24gdG8gdXNlIGluc2lkZSB0aGUgaW5wdXRcclxuICAgKi9cclxuICBjdXN0b21JY29uOiB7XHJcbiAgICB0eXBlOiBbT2JqZWN0LCBGdW5jdGlvbl0gYXMgUHJvcFR5cGU8T3B0aW9uYWw8UHJvcEFueUNvbXBvbmVudD4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICBpY29uQ2xhc3Nlczoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgZGVmYXVsdDogbnVsbFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBmb2N1cyBvbiB0aGUgaW5wdXQgd2hlbiBjb21wb25lbnQgaXMgbW91bnRlZFxyXG4gICAqL1xyXG4gIGF1dG9Gb2N1czoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBtb2RlbFZhbHVlOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiAnJ1xyXG4gIH0sXHJcbiAgc2l6ZToge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPElucHV0U2l6ZT4sXHJcbiAgICBkZWZhdWx0OiAnYmFzZSdcclxuICB9LFxyXG4gIHNob3dDbGVhcjoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBpbnB1dENsYXNzZXM6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIGRlZmF1bHQ6IG51bGxcclxuICB9LFxyXG4gIGZ1bGxXaWR0aDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBsb2FkaW5nOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIGhpZGVFcnJvck1lc3NhZ2U6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgY3VzdG9tRXJyb3JNZXNzYWdlOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiBudWxsXHJcbiAgfSxcclxuICB3cmFwcGVyQ2xhc3Nlczoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgZGVmYXVsdDogKCkgPT4gJydcclxuICB9LFxyXG4gIGNvbG9yOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8SW5wdXRDb2xvcj4sXHJcbiAgICBkZWZhdWx0OiAncGFnZSdcclxuICB9LFxyXG4gIGxhYmVsUG9zaXRpb246IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxMYWJlbFBvc2l0aW9uPixcclxuICAgIGRlZmF1bHQ6ICd0b3AnXHJcbiAgfSxcclxuICByaWdodEljb246IHtcclxuICAgIHR5cGU6IFtPYmplY3QsIEZ1bmN0aW9uXSBhcyBQcm9wVHlwZTxPcHRpb25hbDxQcm9wQW55Q29tcG9uZW50Pj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIHJpZ2h0SWNvblRpdGxlOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIHRvb2x0aXBUZXh0OiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIGN1c3RvbUhlbHBDbGFzczoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsOiBzdHJpbmcpOiB2b2lkXHJcbiAgKGU6ICdjaGFuZ2UnLCB2YWw6IHsgZXZlbnQ/OiBFdmVudDsgdmFsdWU6IHN0cmluZyB9KTogdm9pZFxyXG4gIChlOiAnaW5wdXQnLCB2YWw6IHsgZXZlbnQ/OiBFdmVudDsgdmFsdWU6IHN0cmluZyB9KTogdm9pZFxyXG4gIChlOiAnY2xlYXInKTogdm9pZFxyXG4gIChlOiAnZm9jdXMnKTogdm9pZFxyXG4gIChlOiAnYmx1cicpOiB2b2lkXHJcbiAgKGU6ICdyaWdodEljb25DbGljaycpOiB2b2lkXHJcbn0+KClcclxuXHJcbmNvbnN0IHNsb3RzID0gdXNlU2xvdHMoKVxyXG5cclxuY29uc3QgaW5wdXRFbGVtZW50ID0gcmVmKG51bGwgYXMgTnVsbGFibGU8SFRNTElucHV0RWxlbWVudD4pXHJcblxyXG5jb25zdCB7XHJcbiAgY29yZUNsYXNzZXMsXHJcbiAgdGl0bGUsXHJcbiAgdmFsdWUsXHJcbiAgaGVscFRpcElkLFxyXG4gIGhlbHBUaXBDbGFzc2VzLFxyXG4gIGhlbHBUaXAsXHJcbiAgaGlkZUhlbHBUaXAsXHJcbiAgZXJyb3JNZXNzYWdlLFxyXG4gIGNsZWFyLFxyXG4gIGZvY3VzLFxyXG4gIGxhYmVsQ2xhc3NlcyxcclxuICBzaG91bGRTaG93Q2xlYXJcclxufSA9IHVzZVRleHRJbnB1dENvcmUoe1xyXG4gIHByb3BzOiB0b1JlZnMocHJvcHMpLFxyXG4gIGVtaXQsXHJcbiAgaW5wdXRFbDogaW5wdXRFbGVtZW50XHJcbn0pXHJcblxyXG5jb25zdCBpbnB1dFN0eWxlID0gY29tcHV0ZWQoKCk6IENTU1Byb3BlcnRpZXMgPT4ge1xyXG4gIGlmIChwcm9wcy5jb2xvciAhPT0gJ2Z1bGx5LXRyYW5zcGFyZW50JykgcmV0dXJuIHt9XHJcblxyXG4gIC8vIEluIGZ1bGx5IHRyYW5zcGFyZW50IG1vZGUsIHdlIHdhbnQgdGhlIGlucHV0IHRvIGZ1bGx5IGJsZW5kIGluIHcvIHBhcmVudCBzdHlsaW5nXHJcbiAgY29uc3Qgc3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XHJcbiAgICBmb250U2l6ZTogJ2luaGVyaXQnXHJcbiAgfVxyXG4gIHJldHVybiBzdHlsZVxyXG59KVxyXG5cclxuY29uc3QgbGVhZGluZ0ljb25DbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWydoLTQgdy00J11cclxuXHJcbiAgaWYgKHByb3BzLmljb25DbGFzc2VzKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2gocHJvcHMuaWNvbkNsYXNzZXMpXHJcbiAgfVxyXG5cclxuICBpZiAoZXJyb3JNZXNzYWdlLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZGFuZ2VyJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWZvcmVncm91bmQtMicpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGljb25DbGFzc2VzID0gY29tcHV0ZWQoKCk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbXVxyXG5cclxuICBpZiAocHJvcHMuY3VzdG9tSWNvbikge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdwbC04JylcclxuICB9XHJcblxyXG4gIGlmICghc2xvdHNbJ2lucHV0LXJpZ2h0J10pIHtcclxuICAgIGlmIChwcm9wcy5yaWdodEljb24gfHwgZXJyb3JNZXNzYWdlLnZhbHVlIHx8IHNob3VsZFNob3dDbGVhci52YWx1ZSkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3ByLTgnKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBzaXplQ2xhc3NlcyA9IGNvbXB1dGVkKCgpOiBzdHJpbmcgPT4ge1xyXG4gIC8vIGZ1bGx5IHRyYW5zcGFyZW50IHNob3VsZCBnZXQgc2l6aW5nL2NvbG9yaW5nIGluZm8gZnJvbSBwYXJlbnQgZWxlbWVudHMsXHJcbiAgLy8gaXRzIHN1cHBvc2VkIHRvIGZpdCBpbnRvIHRoZSBleGlzdGluZyBzdHlsZVxyXG4gIGNvbnN0IGlmTm90RnVsbHlUcmFuc3BhcmVudCA9ICh2YWw6IHN0cmluZykgPT5cclxuICAgIHByb3BzLmNvbG9yID09PSAnZnVsbHktdHJhbnNwYXJlbnQnID8gJycgOiB2YWxcclxuXHJcbiAgc3dpdGNoIChwcm9wcy5zaXplKSB7XHJcbiAgICBjYXNlICdzbSc6XHJcbiAgICAgIHJldHVybiBgaC02ICR7aWZOb3RGdWxseVRyYW5zcGFyZW50KCd0ZXh0LWJvZHkgc206dGV4dC1ib2R5LXNtJyl9YFxyXG4gICAgY2FzZSAnbGcnOlxyXG4gICAgICByZXR1cm4gYGgtMTAgJHtpZk5vdEZ1bGx5VHJhbnNwYXJlbnQoJ3RleHQtYm9keSBzbTp0ZXh0LVsxM3B4XScpfWBcclxuICAgIGNhc2UgJ3hsJzpcclxuICAgICAgcmV0dXJuIGBoLTE0ICR7aWZOb3RGdWxseVRyYW5zcGFyZW50KCd0ZXh0LWJvZHkgc206dGV4dC1zbScpfWBcclxuICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIGBoLTggJHtpZk5vdEZ1bGx5VHJhbnNwYXJlbnQoJ3RleHQtYm9keSBzbTp0ZXh0LWJvZHktc20nKX1gXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgY29tcHV0ZWRXcmFwcGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc2VzID0gWydmbGV4JywgcHJvcHMud3JhcHBlckNsYXNzZXNdXHJcbiAgaWYgKHByb3BzLmZ1bGxXaWR0aCkge1xyXG4gICAgY2xhc3Nlcy5wdXNoKCd3LWZ1bGwnKVxyXG4gIH1cclxuXHJcbiAgaWYgKHByb3BzLmxhYmVsUG9zaXRpb24gPT09ICd0b3AnKSB7XHJcbiAgICBjbGFzc2VzLnB1c2goJ2ZsZXgtY29sJylcclxuICB9XHJcbiAgaWYgKHByb3BzLmxhYmVsUG9zaXRpb24gPT09ICdsZWZ0Jykge1xyXG4gICAgY2xhc3Nlcy5wdXNoKCd3LWZ1bGwgc3BhY2UteS0xIHNtOnNwYWNlLXktMCBzbTpzcGFjZS14LTggZmxleC1jb2wgc206ZmxleC1yb3cnKVxyXG4gIH1cclxuICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IG9uUmlnaHRJY29uQ2xpY2sgPSAoKSA9PiB7XHJcbiAgZW1pdCgncmlnaHRJY29uQ2xpY2snKVxyXG59XHJcblxyXG5kZWZpbmVFeHBvc2UoeyBmb2N1cyB9KVxyXG48L3NjcmlwdD5cclxuIiwiaW1wb3J0IHsgaXNTdHJpbmcsIGlzVW5kZWZpbmVkIH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHR5cGUgeyBHZW5lcmljVmFsaWRhdGVGdW5jdGlvbiB9IGZyb20gJ3ZlZS12YWxpZGF0ZSdcclxuaW1wb3J0IHsgaXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcblxyXG5leHBvcnQgY29uc3QgVkFMSURfSFRUUF9VUkwgPSAvXmh0dHBzPzpcXC9cXC8vXHJcbmV4cG9ydCBjb25zdCBWQUxJRF9FTUFJTCA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvXHJcblxyXG4vKipcclxuICogTm90ZSBhYm91dCBuZXcgdmFsaWRhdG9yczpcclxuICogTWFrZSBzdXJlIHlvdSB1c2UgdGhlIHdvcmQgXCJWYWx1ZVwiIHRvIHJlZmVyIHRvIHRoZSB2YWx1ZSBiZWluZyB2YWxpZGF0ZWQgaW4gYWxsIGVycm9yIG1lc3NhZ2VzLCBjYXVzZSB0aGUgZHluYW1pYyBzdHJpbmcgcmVwbGFjZVxyXG4gKiB0aGF0IHJlcGxhY2VzIHRoYXQgcGFydCB3aXRoIHRoZSBhY3R1YWwgZmllbGQgbmFtZSB3b3JrcyBiYXNlZCBvbiB0aGF0XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEUtbWFpbCB2YWxpZGF0aW9uIHJ1bGUgKG5vdCBwZXJmZWN0LCBidXQgZS1tYWlscyBzaG91bGQgYmUgdmFsaWRhdGVkIGJ5IHNlbmRpbmcgb3V0IGNvbmZpcm1hdGlvbiBlLW1haWxzIGFueXdheSlcclxuICovXHJcbmV4cG9ydCBjb25zdCBpc0VtYWlsOiBHZW5lcmljVmFsaWRhdGVGdW5jdGlvbjxzdHJpbmc+ID0gKHZhbCkgPT5cclxuICAodmFsIHx8ICcnKS5tYXRjaChWQUxJRF9FTUFJTCkgPyB0cnVlIDogJ1ZhbHVlIHNob3VsZCBiZSBhIHZhbGlkIGUtbWFpbCBhZGRyZXNzJ1xyXG5cclxuLyoqXHJcbiAqIFVzZWQgZm9yIHBsYWNlaG9sZGVycyBpbnB1dHMgd2hlcmUgdGhlIHVzZXIgY2FuIGxlYXZlIHRoZSBmaWVsZCBlbXB0eVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzRW1haWxPckVtcHR5OiBHZW5lcmljVmFsaWRhdGVGdW5jdGlvbjxzdHJpbmc+ID0gKHZhbCkgPT5cclxuICAodmFsIHx8ICcnKS5tYXRjaChWQUxJRF9FTUFJTCkgfHwgIXZhbFxyXG4gICAgPyB0cnVlXHJcbiAgICA6ICdWYWx1ZSBzaG91bGQgYmUgYSB2YWxpZCBlLW1haWwgYWRkcmVzcydcclxuXHJcbmV4cG9ydCBjb25zdCBpc09uZU9yTXVsdGlwbGVFbWFpbHM6IEdlbmVyaWNWYWxpZGF0ZUZ1bmN0aW9uPHN0cmluZz4gPSAodmFsKSA9PiB7XHJcbiAgY29uc3QgZW1haWxzID0gKHZhbCB8fCAnJykuc3BsaXQoJywnKS5tYXAoKGkpID0+IGkudHJpbSgpKVxyXG4gIGNvbnN0IHZhbGlkID0gZW1haWxzLmV2ZXJ5KChlKSA9PiBlLm1hdGNoKFZBTElEX0VNQUlMKSlcclxuICByZXR1cm4gdmFsaWQgfHwgJ1ZhbHVlIHNob3VsZCBiZSBvbmUgb3IgbXVsdGlwbGUgY29tbWEtZGVsaW1pdGVkIGUtbWFpbCBhZGRyZXNzZXMnXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc1JlcXVpcmVkOiBHZW5lcmljVmFsaWRhdGVGdW5jdGlvbjx1bmtub3duPiA9ICh2YWwpID0+IHtcclxuICBpZiAoaXNTdHJpbmcodmFsKSkge1xyXG4gICAgdmFsID0gdmFsLnRyaW0oKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHZhbCA/IHRydWUgOiAnVmFsdWUgaXMgcmVxdWlyZWQnXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc1NhbWVBczogKFxyXG4gIG90aGVyRmllbGROYW1lOiBzdHJpbmcsXHJcbiAgb3RoZXJGaWVsZERpc3BsYXlOYW1lPzogc3RyaW5nXHJcbikgPT4gR2VuZXJpY1ZhbGlkYXRlRnVuY3Rpb248dW5rbm93bj4gPVxyXG4gIChvdGhlckZpZWxkTmFtZSwgb3RoZXJGaWVsZERpc3BsYXlOYW1lKSA9PiAodmFsLCBtZXRhKSA9PiB7XHJcbiAgICByZXR1cm4gdmFsID09PSBtZXRhLmZvcm1bb3RoZXJGaWVsZE5hbWVdXHJcbiAgICAgID8gdHJ1ZVxyXG4gICAgICA6IGBWYWx1ZSBtdXN0IGJlIHRoZSBzYW1lIGFzIGluIGZpZWxkICcke1xyXG4gICAgICAgICAgb3RoZXJGaWVsZERpc3BsYXlOYW1lIHx8IG90aGVyRmllbGROYW1lXHJcbiAgICAgICAgfSdgXHJcbiAgfVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzU3RyaW5nT2ZMZW5ndGggPVxyXG4gIChwYXJhbXM6IHtcclxuICAgIG1pbkxlbmd0aD86IG51bWJlclxyXG4gICAgbWF4TGVuZ3RoPzogbnVtYmVyXHJcbiAgfSk6IEdlbmVyaWNWYWxpZGF0ZUZ1bmN0aW9uPHN0cmluZz4gPT5cclxuICAodmFsKSA9PiB7XHJcbiAgICBjb25zdCB7IG1pbkxlbmd0aCwgbWF4TGVuZ3RoIH0gPSBwYXJhbXNcclxuICAgIHZhbCA9IGlzTnVsbE9yVW5kZWZpbmVkKHZhbCkgPyAnJyA6IHZhbFxyXG5cclxuICAgIGlmICghaXNTdHJpbmcodmFsKSkgcmV0dXJuICdWYWx1ZSBzaG91bGQgYmUgYSB0ZXh0IHN0cmluZydcclxuICAgIGlmICghaXNVbmRlZmluZWQobWluTGVuZ3RoKSAmJiB2YWwubGVuZ3RoIDwgbWluTGVuZ3RoKVxyXG4gICAgICByZXR1cm4gYFZhbHVlIG5lZWRzIHRvIGJlIGF0IGxlYXN0ICR7bWluTGVuZ3RofSBjaGFyYWN0ZXJzIGxvbmdgXHJcbiAgICBpZiAoIWlzVW5kZWZpbmVkKG1heExlbmd0aCkgJiYgdmFsLmxlbmd0aCA+IG1heExlbmd0aClcclxuICAgICAgcmV0dXJuIGBWYWx1ZSBjYW4ndCBiZSBsb25nZXIgdGhhbiAke21heExlbmd0aH0gY2hhcmFjdGVyc2BcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuZXhwb3J0IGNvbnN0IHN0cmluZ0NvbnRhaW5zID1cclxuICAocGFyYW1zOiB7XHJcbiAgICBtYXRjaDogc3RyaW5nIHwgUmVnRXhwXHJcbiAgICBtZXNzYWdlOiBzdHJpbmdcclxuICB9KTogR2VuZXJpY1ZhbGlkYXRlRnVuY3Rpb248c3RyaW5nPiA9PlxyXG4gICh2YWwpID0+IHtcclxuICAgIGNvbnN0IHsgbWF0Y2gsIG1lc3NhZ2UgfSA9IHBhcmFtc1xyXG5cclxuICAgIGlmICghaXNTdHJpbmcodmFsKSkgcmV0dXJuICdWYWx1ZSBzaG91bGQgYmUgYSB0ZXh0IHN0cmluZydcclxuICAgIGlmICghbWF0Y2gpIHJldHVybiB0cnVlXHJcblxyXG4gICAgaWYgKGlzU3RyaW5nKG1hdGNoKSkge1xyXG4gICAgICByZXR1cm4gdmFsLmluY2x1ZGVzKG1hdGNoKSA/IHRydWUgOiBtZXNzYWdlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbWF0Y2gudGVzdCh2YWwpID8gdHJ1ZSA6IG1lc3NhZ2VcclxuICAgIH1cclxuICB9XHJcblxyXG5leHBvcnQgY29uc3QgaXNVcmw6IEdlbmVyaWNWYWxpZGF0ZUZ1bmN0aW9uPHN0cmluZz4gPSAodmFsdWUpID0+IHtcclxuICBpZiAoVkFMSURfSFRUUF9VUkwudGVzdCh2YWx1ZSkpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG4gIHJldHVybiAnVmFsdWUgaXMgbm90IGEgdmFsaWQgVVJMJ1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNJdGVtU2VsZWN0ZWQ6IEdlbmVyaWNWYWxpZGF0ZUZ1bmN0aW9uPHVua25vd25bXT4gPSAodmFsKSA9PiB7XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoID4gMCkge1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcbiAgcmV0dXJuICdWYWx1ZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCBhIHNpbmdsZSBpdGVtIHNlbGVjdGVkJ1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNNdWx0aUl0ZW1TZWxlY3RlZCA9IDxUPih2YWw6IFRbXSB8IHVua25vd24pOiB0cnVlIHwgc3RyaW5nID0+IHtcclxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPiAwKSB7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuICByZXR1cm4gJ1ZhbHVlIHNob3VsZCBoYXZlIGF0IGxlYXN0IGEgc2luZ2xlIGl0ZW0gc2VsZWN0ZWQnXHJcbn1cclxuIiwiaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IHVzZU11dGF0aW9uT2JzZXJ2ZXIsIHVzZVJlc2l6ZU9ic2VydmVyIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJyNsb2Rhc2gnXHJcbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBSZWYsIENvbXB1dGVkUmVmIH0gZnJvbSAndnVlJ1xyXG5cclxuLyoqXHJcbiAqIFVzZSB0aGlzIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGhpZGRlbiBlbGVtZW50cyAoZS5nLiB1c2VyIGF2YXRhcnMpIGluIGEgd3JhcHBpbmcgZmxleCByb3cgdGhhdFxyXG4gKiBpcyBzdHlsZWQgdG8gb25seSBzaG93IHRoZSBmaXJzdCByb3cuIEZvciBleGFtcGxlLCB0aGVyZSBhcmUgMTIgdXNlcnMgdG90YWwsIHRoZXJlJ3Mgb25seSBzcGFjZSBmb3IgNSxcclxuICogYW5kIHRoaXMgY29tcG9zYWJsZSB3aWxsIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGhpZGRlbiBvbmVzIHRvIHVzZSBmb3IgdGhlIFwiK1hcIiBsYWJlbCAoKzcgaW4gdGhlIGV4YW1wbGUpXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBcImhpZGRlblwiIGl0ZW1zIG11c3Qgd3JhcCBpbnRvIGFub3RoZXIgbGluZSwgYmVjYXVzZSB3ZSB1c2UgdGhlaXIgb2Zmc2V0IGZyb20gdGhlIHRvcCBvZiB0aGUgcGFyZW50XHJcbiAqIHRvIGNoZWNrIGlmIHRoZXkncmUgaGlkZGVuIChjb21wYXJlZCB0byBpdGVtcyBpbiB0aGUgMXN0IHJvdylcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VXcmFwcGluZ0NvbnRhaW5lckhpZGRlbkNvdW50KHBhcmFtczoge1xyXG4gIC8qKlxyXG4gICAqIEVsZW1lbnQgdG8gd2F0Y2ggZm9yIGFueSBjaGFuZ2VzXHJcbiAgICovXHJcbiAgZWxlbWVudFRvV2F0Y2hGb3JDaGFuZ2VzOiBSZWY8TnVsbGFibGU8SFRNTEVsZW1lbnQ+PlxyXG4gIC8qKlxyXG4gICAqIFRoZSBlbGVtZW50IHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhlIHBvdGVudGlhbGx5IHZpc2libGUvaGlkZGVuIGl0ZW1zIGFzIGRpcmVjdCBjaGlsZHJlblxyXG4gICAqL1xyXG4gIGl0ZW1Db250YWluZXI6IFJlZjxOdWxsYWJsZTxIVE1MRWxlbWVudD4+XHJcblxyXG4gIC8qKlxyXG4gICAqIEFsbG93cyB5b3UgdG8gcGF1c2UgY2FsY3VsYXRpb25zIGNvbmRpdGlvbmFsbHlcclxuICAgKi9cclxuICBza2lwQ2FsY3VsYXRpb24/OiBDb21wdXRlZFJlZjxib29sZWFuPlxyXG5cclxuICAvKipcclxuICAgKiBJZiB0cnVlLCB3aWxsIHRyYWNrIHJlc2l6aW5nIG9mICdlbGVtZW50VG9XYXRjaEZvckNoYW5nZXMnLlxyXG4gICAqIERlZmF1bHQ6IGZhbHNlXHJcbiAgICovXHJcbiAgdHJhY2tSZXNpemU/OiBib29sZWFuXHJcblxyXG4gIC8qKlxyXG4gICAqIElmIHRydWUsIHdpbGwgdHJhY2sgZGVzY2VuZGFudHMgYmVpbmcgYWRkZWQvcmVtb3ZlZCB0byAnZWxlbWVudFRvV2F0Y2hGb3JDaGFuZ2VzJy5cclxuICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICovXHJcbiAgdHJhY2tNdXRhdGlvbnM/OiBib29sZWFuXHJcbn0pIHtcclxuICBjb25zdCB7XHJcbiAgICBza2lwQ2FsY3VsYXRpb24sXHJcbiAgICBlbGVtZW50VG9XYXRjaEZvckNoYW5nZXMsXHJcbiAgICBpdGVtQ29udGFpbmVyLFxyXG4gICAgdHJhY2tSZXNpemUgPSBmYWxzZSxcclxuICAgIHRyYWNrTXV0YXRpb25zID0gdHJ1ZVxyXG4gIH0gPSBwYXJhbXMgfHwge31cclxuXHJcbiAgLyoqXHJcbiAgICogRHluYW1pY2FsbHkgdXBkYXRlZCB0byBzaG93IHRoZSBudW1iZXIgb2YgaXRlbXMgY3VycmVudGx5IG5vdCB2aXNpYmxlIGluIHRoZSBjb250YWluZXJcclxuICAgKi9cclxuICBjb25zdCBoaWRkZW5JdGVtQ291bnQgPSByZWYoMClcclxuXHJcbiAgY29uc3QgcmVjYWxjdWxhdGUgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBpdGVtQ29udGFpbmVyLnZhbHVlXHJcbiAgICBpZiAoc2tpcENhbGN1bGF0aW9uPy52YWx1ZSB8fCAhdGFyZ2V0KSByZXR1cm5cclxuXHJcbiAgICBjb25zdCBhdmF0YXJFbGVtZW50cyA9IHRhcmdldC5jaGlsZHJlblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcGFyaW5nIG9mZnNldCBmcm9tIHBhcmVudCB0byBiZXR3ZWVuIGFsbCBhdmF0YXJzIHRvIHNlZSB3aGVuIHRoZXkgYnJlYWsgb2ZmIGludG8gYW5vdGhlciBsaW5lXHJcbiAgICAgKiBhbmQgYmVjb21lIGludmlzaWJsZVxyXG4gICAgICovXHJcbiAgICBsZXQgdmlzaWJsZUNvdW50ID0gMFxyXG4gICAgbGV0IHRvdGFsQ291bnQgPSAwXHJcbiAgICBsZXQgZmlyc3RFbE9mZnNldFRvcCA9IHVuZGVmaW5lZCBhcyBPcHRpb25hbDxudW1iZXI+XHJcbiAgICBmb3IgKGNvbnN0IGF2YXRhckVsIG9mIGF2YXRhckVsZW1lbnRzKSB7XHJcbiAgICAgIGNvbnN0IG9mZnNldFRvcCA9IChhdmF0YXJFbCBhcyBIVE1MRWxlbWVudCkub2Zmc2V0VG9wXHJcbiAgICAgIGlmIChpc1VuZGVmaW5lZChmaXJzdEVsT2Zmc2V0VG9wKSkge1xyXG4gICAgICAgIGZpcnN0RWxPZmZzZXRUb3AgPSBvZmZzZXRUb3BcclxuICAgICAgICB2aXNpYmxlQ291bnQgKz0gMVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChvZmZzZXRUb3AgPT09IGZpcnN0RWxPZmZzZXRUb3ApIHtcclxuICAgICAgICAgIHZpc2libGVDb3VudCArPSAxXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0b3RhbENvdW50ICs9IDFcclxuICAgIH1cclxuXHJcbiAgICBoaWRkZW5JdGVtQ291bnQudmFsdWUgPSB0b3RhbENvdW50IC0gdmlzaWJsZUNvdW50XHJcbiAgfVxyXG5cclxuICBpZiAodHJhY2tSZXNpemUpIHtcclxuICAgIHVzZVJlc2l6ZU9ic2VydmVyKGVsZW1lbnRUb1dhdGNoRm9yQ2hhbmdlcywgcmVjYWxjdWxhdGUpXHJcbiAgfVxyXG5cclxuICBpZiAodHJhY2tNdXRhdGlvbnMpIHtcclxuICAgIHVzZU11dGF0aW9uT2JzZXJ2ZXIoZWxlbWVudFRvV2F0Y2hGb3JDaGFuZ2VzLCByZWNhbGN1bGF0ZSwge1xyXG4gICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgIHN1YnRyZWU6IHRydWVcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgaGlkZGVuSXRlbUNvdW50XHJcbiAgfVxyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLXJldHVybiAqL1xyXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBSZWYsIFRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgdXNlV3JhcHBpbmdDb250YWluZXJIaWRkZW5Db3VudCB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9sYXlvdXQvcmVzaXplJ1xyXG5cclxudHlwZSBHZW5lcmljU2VsZWN0VmFsdWVUeXBlPFQ+ID0gVCB8IFRbXSB8IHVuZGVmaW5lZFxyXG5cclxuLyoqXHJcbiAqIENvbW1vbiBzZXR1cCBmb3IgRm9ybVNlbGVjdEJhc2Ugd3JhcHBpbmcgc2VsZWN0b3IgY29tcG9uZW50c1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZUZvcm1TZWxlY3RDaGlsZEludGVybmFsczxUPihwYXJhbXM6IHtcclxuICBwcm9wczogVG9SZWZzPHtcclxuICAgIG1vZGVsVmFsdWU/OiBHZW5lcmljU2VsZWN0VmFsdWVUeXBlPFQ+XHJcbiAgICBtdWx0aXBsZT86IGJvb2xlYW5cclxuICB9PlxyXG4gIGVtaXQ6IHtcclxuICAgIChlOiAndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWw6IEdlbmVyaWNTZWxlY3RWYWx1ZVR5cGU8VD4pOiB2b2lkXHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBzZWUge3VzZVdyYXBwaW5nQ29udGFpbmVySGlkZGVuQ291bnQoKX1cclxuICAgKi9cclxuICBkeW5hbWljVmlzaWJpbGl0eT86IHtcclxuICAgIGVsZW1lbnRUb1dhdGNoRm9yQ2hhbmdlczogUmVmPE51bGxhYmxlPEhUTUxFbGVtZW50Pj5cclxuICAgIGl0ZW1Db250YWluZXI6IFJlZjxOdWxsYWJsZTxIVE1MRWxlbWVudD4+XHJcbiAgfVxyXG59KSB7XHJcbiAgY29uc3QgeyBwcm9wcywgZW1pdCwgZHluYW1pY1Zpc2liaWxpdHkgfSA9IHBhcmFtc1xyXG5cclxuICBsZXQgaGlkZGVuSXRlbUNvdW50OiBSZWY8bnVtYmVyPlxyXG4gIGlmIChkeW5hbWljVmlzaWJpbGl0eSkge1xyXG4gICAgY29uc3QgeyBlbGVtZW50VG9XYXRjaEZvckNoYW5nZXMsIGl0ZW1Db250YWluZXIgfSA9IGR5bmFtaWNWaXNpYmlsaXR5XHJcbiAgICBjb25zdCBoaWRkZW5Db3VudERhdGEgPSB1c2VXcmFwcGluZ0NvbnRhaW5lckhpZGRlbkNvdW50KHtcclxuICAgICAgc2tpcENhbGN1bGF0aW9uOiBjb21wdXRlZCgoKSA9PiAhcHJvcHMubXVsdGlwbGU/LnZhbHVlKSxcclxuICAgICAgZWxlbWVudFRvV2F0Y2hGb3JDaGFuZ2VzLFxyXG4gICAgICBpdGVtQ29udGFpbmVyXHJcbiAgICB9KVxyXG4gICAgaGlkZGVuSXRlbUNvdW50ID0gaGlkZGVuQ291bnREYXRhLmhpZGRlbkl0ZW1Db3VudFxyXG4gIH0gZWxzZSB7XHJcbiAgICBoaWRkZW5JdGVtQ291bnQgPSByZWYoMClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZSB0aGlzIHRvIGdldCBvciBzZXQgdGhlIHYtbW9kZWwgdmFsdWUgb2YgdGhlIHNlbGVjdCBpbnB1dCBpbiBhIHByb3BlciB3YXlcclxuICAgKi9cclxuICBjb25zdCBzZWxlY3RlZFZhbHVlID0gY29tcHV0ZWQoe1xyXG4gICAgZ2V0OiAoKTogR2VuZXJpY1NlbGVjdFZhbHVlVHlwZTxUPiA9PiB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHByb3BzLm1vZGVsVmFsdWU/LnZhbHVlXHJcbiAgICAgIGlmIChwcm9wcy5tdWx0aXBsZT8udmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gaXNBcnJheShjdXJyZW50VmFsdWUpID8gY3VycmVudFZhbHVlIDogW11cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gaXNBcnJheShjdXJyZW50VmFsdWUpID8gdW5kZWZpbmVkIDogY3VycmVudFZhbHVlXHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBzZXQ6IChuZXdWYWw6IEdlbmVyaWNTZWxlY3RWYWx1ZVR5cGU8VD4pID0+IHtcclxuICAgICAgaWYgKHByb3BzLm11bHRpcGxlPy52YWx1ZSAmJiAhaXNBcnJheShuZXdWYWwpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdBdHRlbXB0aW5nIHRvIHNldCBub24tYXJyYXkgdmFsdWUgaW4gc2VsZWN0b3Igdy8gbXVsdGlwbGU9dHJ1ZScpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlPy52YWx1ZSAmJiBpc0FycmF5KG5ld1ZhbCkpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ0F0dGVtcHRpbmcgdG8gc2V0IGFycmF5IHZhbHVlIGluIHNlbGVjdG9yIHcvIG11bHRpcGxlPWZhbHNlJylcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG5cclxuICAgICAgZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBwcm9wcy5tdWx0aXBsZT8udmFsdWUgPyBuZXdWYWwgfHwgW10gOiBuZXdWYWwpXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgY29uc3QgaXNBcnJheVZhbHVlID0gKHY6IEdlbmVyaWNTZWxlY3RWYWx1ZVR5cGU8VD4pOiB2IGlzIFRbXSA9PiBpc0FycmF5KHYpXHJcbiAgY29uc3QgaXNNdWx0aUl0ZW1BcnJheVZhbHVlID0gKHY6IEdlbmVyaWNTZWxlY3RWYWx1ZVR5cGU8VD4pOiB2IGlzIFRbXSA9PlxyXG4gICAgaXNBcnJheSh2KSAmJiB2Lmxlbmd0aCA+IDFcclxuICBjb25zdCBmaXJzdEl0ZW0gPSAodjogTm9uTnVsbGFibGU8R2VuZXJpY1NlbGVjdFZhbHVlVHlwZTxUPj4pOiBUID0+XHJcbiAgICBpc0FycmF5VmFsdWUodikgPyB2WzBdIDogdlxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2VsZWN0ZWRWYWx1ZSxcclxuICAgIGhpZGRlblNlbGVjdGVkSXRlbUNvdW50OiBoaWRkZW5JdGVtQ291bnQsXHJcbiAgICBpc0FycmF5VmFsdWUsXHJcbiAgICBpc011bHRpSXRlbUFycmF5VmFsdWUsXHJcbiAgICBmaXJzdEl0ZW1cclxuICB9XHJcbn1cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXZcclxuICAgIDpjbGFzcz1cIltcclxuICAgICAgJ3JlbGF0aXZlIHctZnVsbCBoLTEgYmctYmx1ZS01MDAvMzAgdGV4dC14cyB0ZXh0LWZvcmVncm91bmQtb24tcHJpbWFyeSBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC14bCcsXHJcbiAgICAgIHNob3dCYXIgPyAnb3BhY2l0eS0xMDAnIDogJ29wYWNpdHktMCdcclxuICAgIF1cIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJzd29vc2hlciByZWxhdGl2ZSB0b3AtMCBiZy1ibHVlLTUwMC81MFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyB1c2VNb3VudGVkIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8eyBsb2FkaW5nOiBib29sZWFuOyBjbGllbnRPbmx5PzogYm9vbGVhbiB9PigpXHJcblxyXG5jb25zdCBtb3VudGVkID0gdXNlTW91bnRlZCgpXHJcbmNvbnN0IHNob3dCYXIgPSBjb21wdXRlZCgoKSA9PiAobW91bnRlZC52YWx1ZSB8fCAhcHJvcHMuY2xpZW50T25seSkgJiYgcHJvcHMubG9hZGluZylcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZSBzY29wZWQ+XHJcbi5zd29vc2hlciB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIGFuaW1hdGlvbjogc3dvb3NoIDFzIGluZmluaXRlIGxpbmVhcjtcclxuICB0cmFuc2Zvcm0tb3JpZ2luOiAwJSAzMCU7XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgc3dvb3NoIHtcclxuICAwJSB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCkgc2NhbGVYKDApO1xyXG4gIH1cclxuXHJcbiAgNDAlIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKSBzY2FsZVgoMC40KTtcclxuICB9XHJcblxyXG4gIDEwMCUge1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpIHNjYWxlWCgwLjUpO1xyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCJpbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBpc0NsaWVudCB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHR5cGUgeyBNYXliZVJlZiB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHsgZGVib3VuY2UsIGlzVW5kZWZpbmVkLCB0aHJvdHRsZSB9IGZyb20gJyNsb2Rhc2gnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCBvbkJlZm9yZVVubW91bnQsIG9uTW91bnRlZCwgcmVmLCB1bnJlZiwgd2F0Y2ggfSBmcm9tICd2dWUnXHJcblxyXG5leHBvcnQgZW51bSBUaHJvdHRsZU9yRGVib3VuY2Uge1xyXG4gIFRocm90dGxlLFxyXG4gIERlYm91bmNlXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEhvcml6b250YWxEaXJlY3Rpb24ge1xyXG4gIExlZnQsXHJcbiAgUmlnaHRcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVdpbmRvd1Jlc2l6ZUhhbmRsZXIoXHJcbiAgaGFuZGxlcjogKGU6IFVJRXZlbnQpID0+IHZvaWQsXHJcbiAgb3B0aW9ucz86IFBhcnRpYWw8e1xyXG4gICAgd2FpdDogbnVtYmVyXHJcbiAgICB0aHJvdHRsZU9yRGVib3VuY2U6IFRocm90dGxlT3JEZWJvdW5jZVxyXG4gIH0+XHJcbikge1xyXG4gIGlmICghaXNDbGllbnQpIHJldHVyblxyXG5cclxuICBjb25zdCB7IHdhaXQgPSAxMDAsIHRocm90dGxlT3JEZWJvdW5jZSA9IFRocm90dGxlT3JEZWJvdW5jZS5UaHJvdHRsZSB9ID0gb3B0aW9ucyB8fCB7fVxyXG4gIGNvbnN0IGZpbmFsSGFuZGxlciA9IHdhaXRcclxuICAgID8gdGhyb3R0bGVPckRlYm91bmNlID09PSBUaHJvdHRsZU9yRGVib3VuY2UuVGhyb3R0bGVcclxuICAgICAgPyB0aHJvdHRsZShoYW5kbGVyLCB3YWl0KVxyXG4gICAgICA6IGRlYm91bmNlKGhhbmRsZXIsIHdhaXQpXHJcbiAgICA6IGhhbmRsZXJcclxuXHJcbiAgb25Nb3VudGVkKCgpID0+IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmaW5hbEhhbmRsZXIpKVxyXG4gIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZmluYWxIYW5kbGVyKSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZU9uQmVmb3JlV2luZG93VW5sb2FkKGhhbmRsZXI6IChlOiBCZWZvcmVVbmxvYWRFdmVudCkgPT4gdm9pZCkge1xyXG4gIG9uTW91bnRlZCgoKSA9PiB7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgaGFuZGxlcilcclxuICB9KVxyXG5cclxuICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIGhhbmRsZXIpXHJcbiAgfSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlc3BvbnNpdmVIb3Jpem9udGFsRGlyZWN0aW9uQ2FsY3VsYXRpb24ocGFyYW1zOiB7XHJcbiAgZWw6IE1heWJlUmVmPE51bGxhYmxlPEhUTUxFbGVtZW50Pj5cclxuICBkZWZhdWx0RGlyZWN0aW9uPzogSG9yaXpvbnRhbERpcmVjdGlvblxyXG4gIC8qKlxyXG4gICAqIFN0b3AgcmVjYWxjdWxhdGlvbiBiZWxvdyB0aGlzIHNjcmVlbiBzaXplLiBEZWZhdWx0cyB0byBlbC53aWR0aCAqIDJcclxuICAgKi9cclxuICBzdG9wVXBkYXRlc0JlbG93V2lkdGg/OiBNYXliZVJlZjxudW1iZXI+XHJcbn0pIHtcclxuICBjb25zdCB7IGVsLCBkZWZhdWx0RGlyZWN0aW9uIH0gPSBwYXJhbXNcclxuXHJcbiAgY29uc3QgZGlyZWN0aW9uID0gcmVmPEhvcml6b250YWxEaXJlY3Rpb24+KFxyXG4gICAgIWlzVW5kZWZpbmVkKGRlZmF1bHREaXJlY3Rpb24pID8gZGVmYXVsdERpcmVjdGlvbiA6IEhvcml6b250YWxEaXJlY3Rpb24uUmlnaHRcclxuICApXHJcbiAgY29uc3Qgc3RvcFVwZGF0ZXNCZWxvd1dpZHRoID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3Qgc3RvcFVwZGF0ZXNCZWxvd1dpZHRoID0gdW5yZWYocGFyYW1zLnN0b3BVcGRhdGVzQmVsb3dXaWR0aClcclxuICAgIGlmICghaXNVbmRlZmluZWQoc3RvcFVwZGF0ZXNCZWxvd1dpZHRoKSkgcmV0dXJuIHN0b3BVcGRhdGVzQmVsb3dXaWR0aFxyXG5cclxuICAgIGNvbnN0IGVsZW1lbnQgPSB1bnJlZihlbClcclxuICAgIHJldHVybiBlbGVtZW50Py5vZmZzZXRXaWR0aCA/IGVsZW1lbnQub2Zmc2V0V2lkdGggKiAyIDogdW5kZWZpbmVkXHJcbiAgfSlcclxuXHJcbiAgY29uc3QgcmVjYWxjdWxhdGVEaXJlY3Rpb24gPSAoKSA9PiB7XHJcbiAgICBpZiAoIWlzQ2xpZW50KSByZXR1cm5cclxuXHJcbiAgICBjb25zdCBlbGVtZW50ID0gdW5yZWYoZWwpXHJcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVyblxyXG5cclxuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcbiAgICBjb25zdCBzaG93T25MZWZ0U2lkZSA9IHJlY3QueCArIHJlY3Qud2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aFxyXG4gICAgY29uc3Qgc2hvd09uUmlnaHRTaWRlID0gcmVjdC54IDwgMFxyXG5cclxuICAgIC8vIFNjcmVlbiB0b28gc21hbGwgLSBkbyBub3RoaW5nXHJcbiAgICBpZiAoXHJcbiAgICAgIChzaG93T25MZWZ0U2lkZSAmJiBzaG93T25SaWdodFNpZGUpIHx8XHJcbiAgICAgICghaXNVbmRlZmluZWQoc3RvcFVwZGF0ZXNCZWxvd1dpZHRoLnZhbHVlKSAmJlxyXG4gICAgICAgIHdpbmRvdy5pbm5lcldpZHRoIDwgc3RvcFVwZGF0ZXNCZWxvd1dpZHRoLnZhbHVlKVxyXG4gICAgKVxyXG4gICAgICByZXR1cm5cclxuXHJcbiAgICBpZiAoc2hvd09uTGVmdFNpZGUpIHtcclxuICAgICAgZGlyZWN0aW9uLnZhbHVlID0gSG9yaXpvbnRhbERpcmVjdGlvbi5MZWZ0XHJcbiAgICB9IGVsc2UgaWYgKHNob3dPblJpZ2h0U2lkZSkge1xyXG4gICAgICBkaXJlY3Rpb24udmFsdWUgPSBIb3Jpem9udGFsRGlyZWN0aW9uLlJpZ2h0XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1c2VXaW5kb3dSZXNpemVIYW5kbGVyKCgpID0+IHJlY2FsY3VsYXRlRGlyZWN0aW9uKCkpXHJcblxyXG4gIHdhdGNoKFxyXG4gICAgKCkgPT4gdW5yZWYoZWwpLFxyXG4gICAgKGVsZW1lbnQpID0+IHtcclxuICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICByZWNhbGN1bGF0ZURpcmVjdGlvbigpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICApXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBkaXJlY3Rpb246IGNvbXB1dGVkKCgpID0+IGRpcmVjdGlvbi52YWx1ZSksXHJcbiAgICByZWNhbGN1bGF0ZURpcmVjdGlvblxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBpc0NsaWVudCwgdHlwZSBVc2VFbGVtZW50Qm91bmRpbmdSZXR1cm4gfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7IGlzVW5kZWZpbmVkIH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHVucmVmLCB0eXBlIENvbXB1dGVkUmVmLCB0eXBlIENTU1Byb3BlcnRpZXMgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB7IEhvcml6b250YWxEaXJlY3Rpb24gfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvY29tbW9uL3dpbmRvdydcclxuXHJcbi8qKlxyXG4gKiBTaW1wbGlmaWVzIGNvcnJlY3RseSBhbmQgcmVzcG9uc2l2ZWx5IHBvc2l0aW9uaW5nIChkcm9wZG93bi9yaWdodC1jbGljay9ldGMpIG1lbnVzIHNvIHRoYXQgdGhleSBvcGVuXHJcbiAqIHRvIHRoZSBjb3JyZWN0IGRpcmVjdGlvbiwgY2FuIGNoYW5nZSBkaXJlY3Rpb25zIGlmIHRoZXJlJ3Mgbm90IGVub3VnaCBzcGFjZSBvciBldmVuIGdvIGZ1bGwgc2NyZWVuXHJcbiAqIGlmIHRoZXJlJ3Mgbm8gc3BhY2UgaW4gZWl0aGVyIGRpcmVjdGlvbi5cclxuICpcclxuICogQWxzbyBzdXBwb3J0cyB1cGRhdGluZyB2ZXJ0aWNhbCBwb3NpdGlvbiwgaW5jYXNlIHRoZSBtZW51IHdvdWxkIGNsaXAgdy8gdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXNlQm9keU1vdW50ZWRNZW51UG9zaXRpb25pbmcgPSAocGFyYW1zOiB7XHJcbiAgLyoqXHJcbiAgICogVGhlIGRpcmVjdGlvbiB0aGUgb3BlbiBzaG91bGQgcHJlZmVyYWJseSBvcGVuIGluLCBhc3N1bWluZyBpdCBoYXMgdGhlIHNwYWNlIHRvIGRvIHNvXHJcbiAgICovXHJcbiAgbWVudU9wZW5EaXJlY3Rpb24/OiBDb21wdXRlZFJlZjxIb3Jpem9udGFsRGlyZWN0aW9uPlxyXG4gIC8qKlxyXG4gICAqIHVzZUVsZW1lbnRCb3VuZGluZygpIG9mIHRoZSBidXR0b24gdGhhdCBvcGVucyB0aGUgbWVudVxyXG4gICAqL1xyXG4gIGJ1dHRvbkJvdW5kaW5nQm94OiBVc2VFbGVtZW50Qm91bmRpbmdSZXR1cm5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHRhcmdldCBtZW51IHdpZHRoLiBJZiBub3QgYXZhaWxhYmxlLCB3aWxsIHRyeSBhIHZlcnkgYmFzaWMgcG9zaXRpb25pbmcgbWV0aG9kXHJcbiAgICogdGhhdCBqdXN0IHVzZXMgdGhlIGJ1dHRvbiB3aWR0aC5cclxuICAgKi9cclxuICBtZW51V2lkdGg6IENvbXB1dGVkUmVmPG51bWJlciB8IHVuZGVmaW5lZD5cclxuICAvKipcclxuICAgKiBPcHRpb25hbGx5IGFsc28gY29udHJvbCB0YXJnZXQgbWVudSBoZWlnaHQuXHJcbiAgICovXHJcbiAgbWVudUhlaWdodD86IENvbXB1dGVkUmVmPG51bWJlciB8IHVuZGVmaW5lZD5cclxufSkgPT4ge1xyXG4gIGNvbnN0IG1lbnVTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge31cclxuICAgIGlmICghaXNDbGllbnQpIHJldHVybiBzdHlsZSAvLyBOb3QgU1NSIGNvbXBhdGlibGVcclxuXHJcbiAgICAvKipcclxuICAgICAqIDEuYS4gSWYgbWVudVdpZHRoIGlzIGJpZ2dlciB0aGFuIHNjcmVlbiB3aWR0aCwgdXNlIHNjcmVlbiB3aWR0aFxyXG4gICAgICogMS5iLiBJZiBtZW51V2lkdGggaXMgc21hbGxlciB0aGFuIHNjcmVlbiB3aWR0aCwgdXNlIG1lbnVXaWR0aFxyXG4gICAgICogMi4gSWYgMS5iLiBidXQgbWVudSBpcyBsZWF2aW5nIHNjcmVlbiBib3VuZHMsIG1ha2UgaXQgb3BlbiB0byBvdGhlciBkaXJlY3Rpb25cclxuICAgICAqXHJcbiAgICAgKiBBbHNvOlxyXG4gICAgICogMS5hLiBJZiBtZW51SGVpZ2h0IGlzIGJpZ2dlciB0aGFuIHNjcmVlbiBoZWlnaHQsIHVzZSBzY3JlZW4gaGVpZ2h0XHJcbiAgICAgKiAxLmIuIElmIG1lbnVIZWlnaHQgaXMgc21hbGxlciB0aGFuIHNjcmVlbiBoZWlnaHQsIHVzZSBzY3JlZW5IZWlnaHRcclxuICAgICAqIDIuIElmIDEuYi4gYnV0IG1lbnUgaXMgbGVhdmluZyBzY3JlZW4gYm91bmRzLCBtYWtlIGl0IG9wZW4gdG8gb3RoZXIgZGlyZWN0aW9uICh1cHdhcmRzKVxyXG4gICAgICovXHJcblxyXG4gICAgY29uc3Qgb3BlblRvTGVmdCA9IHVucmVmKHBhcmFtcy5tZW51T3BlbkRpcmVjdGlvbikgPT09IEhvcml6b250YWxEaXJlY3Rpb24uTGVmdFxyXG5cclxuICAgIGNvbnN0IHRvcCA9IHBhcmFtcy5idXR0b25Cb3VuZGluZ0JveC50b3AudmFsdWVcclxuICAgIGNvbnN0IGxlZnQgPSBwYXJhbXMuYnV0dG9uQm91bmRpbmdCb3gubGVmdC52YWx1ZVxyXG4gICAgY29uc3Qgd2lkdGggPSBwYXJhbXMuYnV0dG9uQm91bmRpbmdCb3gud2lkdGgudmFsdWVcclxuICAgIGNvbnN0IGhlaWdodCA9IHBhcmFtcy5idXR0b25Cb3VuZGluZ0JveC5oZWlnaHQudmFsdWVcclxuICAgIGNvbnN0IG1hcmdpbiA9IDQgLy8gaG93IG11Y2ggc3BhY2UgdG8gbGVhdmUgaW4gZnVsbC1zY3JlZW4gbW9kZSBvciBiZXR3ZWVuIGJ1dHRvbiBhbmQgbWVudVxyXG5cclxuICAgIGxldCBmaW5hbFdpZHRoID0gd2lkdGhcclxuICAgIGxldCBmaW5hbExlZnQgPSBsZWZ0XHJcbiAgICBsZXQgZmluYWxUb3AgPSB0b3AgKyBoZWlnaHQgKyBtYXJnaW5cclxuXHJcbiAgICBjb25zdCBtZW51V2lkdGggPSB1bnJlZihwYXJhbXMubWVudVdpZHRoKVxyXG4gICAgY29uc3QgbWVudUhlaWdodCA9IHVucmVmKHBhcmFtcz8ubWVudUhlaWdodClcclxuXHJcbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGhcclxuICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0XHJcblxyXG4gICAgY29uc3Qgdmlld3BvcnRXaWR0aFdpdGhvdXRNYXJnaW5zID0gdmlld3BvcnRXaWR0aCAtIG1hcmdpbiAqIDJcclxuICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0V2l0aG91dE1hcmdpbnMgPSB2aWV3cG9ydEhlaWdodCAtIG1hcmdpbiAqIDJcclxuXHJcbiAgICBpZiAoIWlzVW5kZWZpbmVkKG1lbnVXaWR0aCkpIHtcclxuICAgICAgaWYgKG1lbnVXaWR0aCA+IHZpZXdwb3J0V2lkdGhXaXRob3V0TWFyZ2lucykge1xyXG4gICAgICAgIC8vIE1lbnUgdG9vIGJpZzogdXNlIGZ1bGwgc2NyZWVuIHdpZHRoXHJcbiAgICAgICAgZmluYWxXaWR0aCA9IHZpZXdwb3J0V2lkdGhXaXRob3V0TWFyZ2luc1xyXG4gICAgICAgIGZpbmFsTGVmdCA9IG1hcmdpblxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIE9wZW4gdG8gcmlnaHQgb3IgbGVmdCBkZXBlbmRpbmcgb24gYXZhaWxhYmxlIHNwYWNlXHJcbiAgICAgICAgZmluYWxXaWR0aCA9IG1lbnVXaWR0aFxyXG5cclxuICAgICAgICBpZiAob3BlblRvTGVmdCkge1xyXG4gICAgICAgICAgZmluYWxMZWZ0ID0gbGVmdCArIHdpZHRoIC0gbWVudVdpZHRoXHJcbiAgICAgICAgICBpZiAoZmluYWxMZWZ0IDwgbWFyZ2luKSB7XHJcbiAgICAgICAgICAgIGZpbmFsTGVmdCA9IG1hcmdpblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAobGVmdCArIG1lbnVXaWR0aCA+IHZpZXdwb3J0V2lkdGhXaXRob3V0TWFyZ2lucykge1xyXG4gICAgICAgICAgICBmaW5hbExlZnQgPSBNYXRoLm1heChsZWZ0ICsgd2lkdGggLSBtZW51V2lkdGgsIG1hcmdpbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWlzVW5kZWZpbmVkKG1lbnVIZWlnaHQpKSB7XHJcbiAgICAgIGlmIChtZW51SGVpZ2h0ID4gdmlld3BvcnRIZWlnaHRXaXRob3V0TWFyZ2lucykge1xyXG4gICAgICAgIGZpbmFsVG9wID0gbWFyZ2luXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gQnkgZGVmYXVsdCBvcGVucyBkb3dud2FyZCwgc2VlIGlmIHdlIG5lZWQgdG8gbW92ZSB1cHdhcmQgaW5zdGVhZFxyXG4gICAgICAgIGlmICh0b3AgKyBoZWlnaHQgKyBtZW51SGVpZ2h0ID4gdmlld3BvcnRIZWlnaHRXaXRob3V0TWFyZ2lucykge1xyXG4gICAgICAgICAgZmluYWxUb3AgPSB0b3AgLSBtZW51SGVpZ2h0IC0gbWFyZ2luXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3R5bGUubGVmdCA9IGAke2ZpbmFsTGVmdH1weGBcclxuICAgIHN0eWxlLndpZHRoID0gYCR7ZmluYWxXaWR0aH1weGBcclxuICAgIHN0eWxlLnRvcCA9IGAke2ZpbmFsVG9wfXB4YFxyXG5cclxuICAgIHJldHVybiBzdHlsZVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiB7IG1lbnVTdHlsZSB9XHJcbn1cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDwhLS0gSWYgbXVsdGlwbGUsIHVzZSBGb3JtU2VsZWN0TXVsdGlwbGUgaW5zdGVhZCAtLT5cclxuICA8ZGl2PlxyXG4gICAgPExpc3Rib3hcclxuICAgICAgOmtleT1cImZvcmNlVXBkYXRlS2V5XCJcclxuICAgICAgdi1tb2RlbD1cIndyYXBwZWRWYWx1ZVwiXHJcbiAgICAgIDpuYW1lPVwibmFtZVwiXHJcbiAgICAgIDptdWx0aXBsZT1cIm11bHRpcGxlXCJcclxuICAgICAgOmJ5PVwiYnlcIlxyXG4gICAgICA6ZGlzYWJsZWQ9XCJpc0Rpc2FibGVkXCJcclxuICAgICAgYXM9XCJkaXZcIlxyXG4gICAgICA6Y2xhc3M9XCJ7XHJcbiAgICAgICAgJ21kOmZsZXggbWQ6aXRlbXMtY2VudGVyIG1kOnNwYWNlLXgtMiBtZDpqdXN0aWZ5LWJldHdlZW4nOiBpc0xlZnRMYWJlbFBvc2l0aW9uXHJcbiAgICAgIH1cIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiIDpjbGFzcz1cInsgJ3BiLTEnOiBzaG93TGFiZWwgJiYgIWlzTGVmdExhYmVsUG9zaXRpb24gfVwiPlxyXG4gICAgICAgIDxMaXN0Ym94TGFiZWxcclxuICAgICAgICAgIDppZD1cImxhYmVsSWRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IHRleHQtYm9keS14cyB0ZXh0LWZvcmVncm91bmQgZm9udC1tZWRpdW1cIlxyXG4gICAgICAgICAgOmNsYXNzPVwiW3sgJ3NyLW9ubHknOiAhc2hvd0xhYmVsIH0sIHsgJ2l0ZW1zLWNlbnRlciBnYXAtMSc6IHNob3dPcHRpb25hbCB9XVwiXHJcbiAgICAgICAgICA6Zm9yPVwiYnV0dG9uSWRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGxhYmVsIH19XHJcbiAgICAgICAgICA8ZGl2IHYtaWY9XCJzaG93UmVxdWlyZWRcIiBjbGFzcz1cInRleHQtZGFuZ2VyIHRleHQteHMgb3BhY2l0eS04MFwiPio8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgdi1lbHNlLWlmPVwic2hvd09wdGlvbmFsXCIgY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIGZvbnQtbm9ybWFsXCI+XHJcbiAgICAgICAgICAgIChvcHRpb25hbClcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvTGlzdGJveExhYmVsPlxyXG4gICAgICAgIDxwXHJcbiAgICAgICAgICB2LWlmPVwiaGVscFRpcElkICYmIGlzTGVmdExhYmVsUG9zaXRpb25cIlxyXG4gICAgICAgICAgOmlkPVwiaGVscFRpcElkXCJcclxuICAgICAgICAgIGNsYXNzPVwidGV4dC14c1wiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJoZWxwVGlwQ2xhc3Nlc1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgaGVscFRpcCB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgdi10aXBweT1cInRvb2x0aXBUZXh0XCI+XHJcbiAgICAgICAgPGRpdiA6Y2xhc3M9XCJidXR0b25zV3JhcHBlckNsYXNzZXNcIj5cclxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXhcIj4gLS0+XHJcbiAgICAgICAgICA8TGlzdGJveEJ1dHRvblxyXG4gICAgICAgICAgICA6aWQ9XCJidXR0b25JZFwiXHJcbiAgICAgICAgICAgIHJlZj1cImxpc3Rib3hCdXR0b25cIlxyXG4gICAgICAgICAgICB2LXNsb3Q9XCJ7IG9wZW4gfVwiXHJcbiAgICAgICAgICAgIDpjbGFzcz1cImJ1dHRvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3LWZ1bGxcIlxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cImJ1dHRvblN0eWxlID09PSAnc2ltcGxlJyA/ICdqdXN0aWZ5LXN0YXJ0JyA6ICdqdXN0aWZ5LWJldHdlZW4nXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdHJ1bmNhdGUgdGV4dC1sZWZ0IHRleHQteHMgc206dGV4dC1bMTNweF1cIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiW1xyXG4gICAgICAgICAgICAgICAgICBoYXNWYWx1ZVNlbGVjdGVkID8gJ3RleHQtZm9yZWdyb3VuZCcgOiAndGV4dC1mb3JlZ3JvdW5kLTInLFxyXG4gICAgICAgICAgICAgICAgICBidXR0b25TdHlsZSA9PT0gJ3NpbXBsZScgPyAnJyA6ICdncm93J1xyXG4gICAgICAgICAgICAgICAgXVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgIHYtaWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAhd3JhcHBlZFZhbHVlIHx8IChpc0FycmF5KHdyYXBwZWRWYWx1ZSkgJiYgIXdyYXBwZWRWYWx1ZS5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJub3RoaW5nLXNlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgcGxhY2Vob2xkZXIgPyBwbGFjZWhvbGRlciA6IGxhYmVsIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvc2xvdD5cclxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwic29tZXRoaW5nLXNlbGVjdGVkXCIgOnZhbHVlPVwid3JhcHBlZFZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgc2ltcGxlRGlzcGxheVRleHQod3JhcHBlZFZhbHVlKSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3Nsb3Q+XHJcbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicG9pbnRlci1ldmVudHMtbm9uZSBzaHJpbmstMCBtbC0xIGZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMlwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPEV4Y2xhbWF0aW9uQ2lyY2xlSWNvblxyXG4gICAgICAgICAgICAgICAgICB2LWlmPVwiZXJyb3JNZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTQgdy00IHRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIHYtZWxzZS1pZj1cIiFzaG93TGFiZWwgJiYgc2hvd1JlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LTR4bCB0ZXh0LWRhbmdlciBvcGFjaXR5LTUwIGgtNCB3LTQgbGVhZGluZy02XCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8Q2hldnJvblVwSWNvblxyXG4gICAgICAgICAgICAgICAgICB2LWlmPVwib3BlblwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxDaGV2cm9uRG93bkljb25cclxuICAgICAgICAgICAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gU3luYyBpc09wZW4gd2l0aCBkcm9wZG93biBvcGVuIHN0YXRlIC0tPlxyXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cIihpc09wZW4gPSBvcGVuKVwiPjwvdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L0xpc3Rib3hCdXR0b24+XHJcbiAgICAgICAgICA8IS0tIDwvZGl2PiAtLT5cclxuICAgICAgICAgIDwhLS0gQ2xlYXIgQnV0dG9uIC0tPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICB2LWlmPVwicmVuZGVyQ2xlYXJCdXR0b25cIlxyXG4gICAgICAgICAgICA6Y2xhc3M9XCJjbGVhckJ1dHRvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIEBjbGljaz1cImNsZWFyVmFsdWUoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxYTWFya0ljb24gY2xhc3M9XCJ3LTMgaC0zXCIgLz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPFRyYW5zaXRpb25cclxuICAgICAgICAgICAgdi1pZj1cImlzTW91bnRlZFwiXHJcbiAgICAgICAgICAgIGxlYXZlLWFjdGl2ZS1jbGFzcz1cInRyYW5zaXRpb24gZWFzZS1pbiBkdXJhdGlvbi0xMDBcIlxyXG4gICAgICAgICAgICBsZWF2ZS1mcm9tLWNsYXNzPVwib3BhY2l0eS0xMDBcIlxyXG4gICAgICAgICAgICBsZWF2ZS10by1jbGFzcz1cIm9wYWNpdHktMFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxUZWxlcG9ydCB0bz1cImJvZHlcIiA6ZGlzYWJsZWQ9XCIhbW91bnRNZW51T25Cb2R5XCI+XHJcbiAgICAgICAgICAgICAgPExpc3Rib3hPcHRpb25zXHJcbiAgICAgICAgICAgICAgICByZWY9XCJtZW51RWxcIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwibGlzdGJveE9wdGlvbnNDbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgIDpzdHlsZT1cImxpc3Rib3hPcHRpb25zU3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgQGZvY3VzPVwic2VhcmNoSW5wdXQ/LmZvY3VzKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCB2LWlmPVwiaGFzU2VhcmNoXCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sIG14LTEgbWItMVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHkgbGFiZWwgdGV4dC1mb3JlZ3JvdW5kXCI+U2VhcmNoPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgdG9wLTAgYm90dG9tLTAgbGVmdC0wIGZsZXggaXRlbXMtY2VudGVyIHBsLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxNYWduaWZ5aW5nR2xhc3NJY29uIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmQtMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICByZWY9XCJzZWFyY2hJbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB2LW1vZGVsPVwic2VhcmNoVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweS0xIHBsLTcgdy1mdWxsIGJnLWZvdW5kYXRpb24gcGxhY2Vob2xkZXI6Zm9udC1ub3JtYWwgbm9ybWFsIHBsYWNlaG9sZGVyOnRleHQtZm9yZWdyb3VuZC0yIHRleHQtWzEzcHhdIGZvY3VzLXZpc2libGU6W2JveC1zaGFkb3c6bm9uZV0gcm91bmRlZC1tZCBob3Zlcjpib3JkZXItb3V0bGluZS01IGZvY3VzLXZpc2libGU6Ym9yZGVyLW91dGxpbmUtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA6cGxhY2Vob2xkZXI9XCJzZWFyY2hQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBAa2V5ZG93bi5zdG9wXHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm92ZXJmbG93LWF1dG8gc2ltcGxlLXNjcm9sbGJhclwiXHJcbiAgICAgICAgICAgICAgICAgIDpjbGFzcz1cInByb3BzLm1lbnVNYXhIZWlnaHRDbGFzc2VzIHx8ICdtYXgtaC1bNTB2aF0geGw6bWF4LWgtODAnXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwiaXNBc3luY1NlYXJjaE1vZGUgJiYgaXNBc3luY0xvYWRpbmdcIiBjbGFzcz1cInB4LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Q29tbW9uTG9hZGluZ0JhciA6bG9hZGluZz1cInRydWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiB2LWVsc2UtaWY9XCJpc0FzeW5jU2VhcmNoTW9kZSAmJiAhY3VycmVudEl0ZW1zLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQtMiB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cIm5vdGhpbmctZm91bmRcIj5Ob3RoaW5nIGZvdW5kPC9zbG90PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCIhaXNBc3luY1NlYXJjaE1vZGUgfHwgIWlzQXN5bmNMb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPExpc3Rib3hPcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgIHYtZm9yPVwiaXRlbSBpbiBmaW5hbEl0ZW1zXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDprZXk9XCJpdGVtS2V5KGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHYtc2xvdD1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgfToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IGJvb2xlYW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBib29sZWFuXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIDp2YWx1ZT1cIihpdGVtIGFzIFNpbmdsZUl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkSXRlbVByZWRpY2F0ZT8uKGl0ZW0pIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdi10aXBweT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkSXRlbVByZWRpY2F0ZT8uKGl0ZW0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRpc2FibGVkSXRlbVRvb2x0aXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzcz1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rib3hPcHRpb25DbGFzc2VzKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZEl0ZW1QcmVkaWNhdGU/LihpdGVtKSB8fCBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJibG9jayBweC0yIHB5LTEuNSByb3VuZGVkLW1kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA/ICdiZy1oaWdobGlnaHQtMycgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoaWRlQ2hlY2ttYXJrcyA/ICdwci04JyA6ICdwci0yJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkaXNhYmxlZEl0ZW1QcmVkaWNhdGU/LihpdGVtKSAmJiAhc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnaG92ZXI6YmctaGlnaGxpZ2h0LTEnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbG90XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwib3B0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOml0ZW09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDphY3RpdmU9XCJhY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOnNlbGVjdGVkPVwic2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRJdGVtUHJlZGljYXRlPy4oaXRlbSkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNpbXBsZURpc3BsYXlUZXh0KGl0ZW0pIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbG90PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdi1pZj1cIiFoaWRlQ2hlY2ttYXJrcyAmJiBzZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhYnNvbHV0ZSB0b3AtMCBib3R0b20tMCByaWdodC0wIHRleHQtZm9yZWdyb3VuZCBmbGV4IGl0ZW1zLWNlbnRlciBwci00J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPENoZWNrSWNvbiBjbGFzcz1cImgtNCB3LTRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8L0xpc3Rib3hPcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L0xpc3Rib3hPcHRpb25zPlxyXG4gICAgICAgICAgICA8L1RlbGVwb3J0PlxyXG4gICAgICAgICAgPC9UcmFuc2l0aW9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvTGlzdGJveD5cclxuICAgIDxwXHJcbiAgICAgIHYtaWY9XCJoZWxwVGlwSWQgJiYgIWlzTGVmdExhYmVsUG9zaXRpb25cIlxyXG4gICAgICA6aWQ9XCJoZWxwVGlwSWRcIlxyXG4gICAgICBjbGFzcz1cIm10LTIgdGV4dC14c1wiXHJcbiAgICAgIDpjbGFzcz1cImhlbHBUaXBDbGFzc2VzXCJcclxuICAgID5cclxuICAgICAge3sgaGVscFRpcCB9fVxyXG4gICAgPC9wPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0XHJcbiAgc2V0dXBcclxuICBsYW5nPVwidHNcIlxyXG4gIGdlbmVyaWM9XCJTaW5nbGVJdGVtIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBzdHJpbmcgfCBudW1iZXJcIlxyXG4+XHJcbmltcG9ydCB7XHJcbiAgTGlzdGJveCxcclxuICBMaXN0Ym94QnV0dG9uLFxyXG4gIExpc3Rib3hPcHRpb24sXHJcbiAgTGlzdGJveE9wdGlvbnMsXHJcbiAgTGlzdGJveExhYmVsXHJcbn0gZnJvbSAnQGhlYWRsZXNzdWkvdnVlJ1xyXG5pbXBvcnQge1xyXG4gIENoZXZyb25Eb3duSWNvbixcclxuICBDaGVja0ljb24sXHJcbiAgQ2hldnJvblVwSWNvbixcclxuICBNYWduaWZ5aW5nR2xhc3NJY29uLFxyXG4gIFhNYXJrSWNvbixcclxuICBFeGNsYW1hdGlvbkNpcmNsZUljb25cclxufSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yMC9zb2xpZCdcclxuaW1wb3J0IHsgZGVib3VuY2UsIGlzQXJyYXksIGlzT2JqZWN0TGlrZSB9IGZyb20gJyNsb2Rhc2gnXHJcbmltcG9ydCB0eXBlIHsgQ1NTUHJvcGVydGllcywgUHJvcFR5cGUsIFJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIG9uTW91bnRlZCwgcmVmLCB1bnJlZiwgd2F0Y2ggfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgTWF5YmVBc3luYywgTnVsbGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyB1c2VGaWVsZCB9IGZyb20gJ3ZlZS12YWxpZGF0ZSdcclxuaW1wb3J0IHR5cGUgeyBSdWxlRXhwcmVzc2lvbiB9IGZyb20gJ3ZlZS12YWxpZGF0ZSdcclxuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJ1xyXG5pbXBvcnQgQ29tbW9uTG9hZGluZ0JhciBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9jb21tb24vbG9hZGluZy9CYXIudnVlJ1xyXG5pbXBvcnQge1xyXG4gIHVzZUVsZW1lbnRCb3VuZGluZyxcclxuICB1c2VNb3VudGVkLFxyXG4gIHVzZUludGVyc2VjdGlvbk9ic2VydmVyLFxyXG4gIGlzQ2xpZW50XHJcbn0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgdHlwZSB7IExhYmVsUG9zaXRpb24gfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS9pbnB1dCdcclxuaW1wb3J0IHsgZGlyZWN0aXZlIGFzIHZUaXBweSB9IGZyb20gJ3Z1ZS10aXBweSdcclxuaW1wb3J0IHsgdXNlQm9keU1vdW50ZWRNZW51UG9zaXRpb25pbmcgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvbGF5b3V0L21lbnUnXHJcbmltcG9ydCB7IEhvcml6b250YWxEaXJlY3Rpb24gfSBmcm9tICd+fi9zcmMvbGliJ1xyXG5cclxudHlwZSBCdXR0b25TdHlsZSA9ICdiYXNlJyB8ICdzaW1wbGUnIHwgJ3RpbnRlZCdcclxudHlwZSBWYWx1ZVR5cGUgPSBTaW5nbGVJdGVtIHwgU2luZ2xlSXRlbVtdIHwgdW5kZWZpbmVkXHJcbnR5cGUgSW5wdXRTaXplID0gJ3NtJyB8ICdiYXNlJyB8ICdsZycgfCAneGwnXHJcblxyXG5jb25zdCBpc09iamVjdExpa2VUeXBlID0gKHY6IHVua25vd24pOiB2IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IGlzT2JqZWN0TGlrZSh2KVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdjogVmFsdWVUeXBlKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICBzaXplOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8SW5wdXRTaXplPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIG11bHRpcGxlOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIGl0ZW1zOiB7XHJcbiAgICB0eXBlOiBBcnJheSBhcyBQcm9wVHlwZTxTaW5nbGVJdGVtW10+LFxyXG4gICAgZGVmYXVsdDogKCkgPT4gW11cclxuICB9LFxyXG4gIG1vZGVsVmFsdWU6IHtcclxuICAgIHR5cGU6IFtPYmplY3QsIEFycmF5LCBTdHJpbmddIGFzIFByb3BUeXBlPFZhbHVlVHlwZT4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRoZSBzZWFyY2ggYmFyLiBZb3UgbXVzdCBhbHNvIHNldCBvbmUgb2YgdGhlIGZvbGxvd2luZzpcclxuICAgKiAqIGZpbHRlclByZWRpY2F0ZSAtIHRvIGFsbG93IGZpbHRlcmluZyBwYXNzZWQgaW4gYGl0ZW1zYCBiYXNlZCBvbiBzZWFyY2ggYmFyXHJcbiAgICogKiBnZXRTZWFyY2hSZXN1bHRzIC0gdG8gYWxsb3cgYXN5bmNocm9ub3VzbHkgbG9hZGluZyBpdGVtcyBmcm9tIHNlcnZlciAocHJvcHMuaXRlbXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGluIHRoaXMgY2FzZSxcclxuICAgKiAgYnV0IGNhbiBiZSB1c2VkIHRvIHByZWZpbGwgaW5pdGlhbCB2YWx1ZXMpXHJcbiAgICovXHJcbiAgc2VhcmNoOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIElmIHNlYXJjaD10cnVlIGFuZCB0aGlzIGlzIHNldCwgeW91IGNhbiB1c2UgdGhpcyB0byBmaWx0ZXIgcGFzc2VkIGluIGl0ZW1zIGJhc2VkIG9uIHdoYXRldmVyXHJcbiAgICogdGhlIHVzZXIgZW50ZXJzIGluIHRoZSBzZWFyY2ggYmFyXHJcbiAgICovXHJcbiAgZmlsdGVyUHJlZGljYXRlOiB7XHJcbiAgICB0eXBlOiBGdW5jdGlvbiBhcyBQcm9wVHlwZTxcclxuICAgICAgT3B0aW9uYWw8KGl0ZW06IFNpbmdsZUl0ZW0sIHNlYXJjaFN0cmluZzogc3RyaW5nKSA9PiBib29sZWFuPlxyXG4gICAgPixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoaXMgdG8gZGlzYWJsZSBjZXJ0YWluIGl0ZW1zIGluIHRoZSBsaXN0XHJcbiAgICovXHJcbiAgZGlzYWJsZWRJdGVtUHJlZGljYXRlOiB7XHJcbiAgICB0eXBlOiBGdW5jdGlvbiBhcyBQcm9wVHlwZTxPcHRpb25hbDwoaXRlbTogU2luZ2xlSXRlbSkgPT4gYm9vbGVhbj4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBJZiBzZWFyY2g9dHJ1ZSBhbmQgdGhpcyBpcyBzZXQsIHlvdSBjYW4gdXNlIHRoaXMgdG8gbG9hZCBkYXRhIGFzeW5jaHJvbm91c2x5IGRlcGVuZGluZ1xyXG4gICAqIG9uIHRoZSBzZWFyY2ggcXVlcnlcclxuICAgKi9cclxuICBnZXRTZWFyY2hSZXN1bHRzOiB7XHJcbiAgICB0eXBlOiBGdW5jdGlvbiBhcyBQcm9wVHlwZTxcclxuICAgICAgT3B0aW9uYWw8KHNlYXJjaFN0cmluZzogc3RyaW5nKSA9PiBNYXliZUFzeW5jPFNpbmdsZUl0ZW1bXT4+XHJcbiAgICA+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICBzZWFyY2hQbGFjZWhvbGRlcjoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgZGVmYXVsdDogJ1NlYXJjaCdcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIExhYmVsIGlzIHJlcXVpcmVkIGF0IHRoZSB2ZXJ5IGxlYXN0IGZvciBzY3JlZW4tcmVhZGVyc1xyXG4gICAqL1xyXG4gIGxhYmVsOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICByZXF1aXJlZDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgdGV4dCB0aGF0IHJlcGxhY2VzIHRoZSBsYWJlbCBhcyB0aGUgcGxhY2Vob2xkZXIgd2hlbiBzZXQuXHJcbiAgICovXHJcbiAgcGxhY2Vob2xkZXI6IHtcclxuICAgIHR5cGU6IFN0cmluZ1xyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBzaG93IHRoZSBsYWJlbCB2aXN1YWxseVxyXG4gICAqL1xyXG4gIHNob3dMYWJlbDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBuYW1lOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICByZXF1aXJlZDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogT2JqZWN0cyB3aWxsIGJlIGNvbXBhcmVkIGJ5IHRoZSB2YWx1ZXMgaW4gdGhlIHNwZWNpZmllZCBwcm9wXHJcbiAgICovXHJcbiAgYnk6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gIH0sXHJcbiAgZGlzYWJsZWQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4gYXMgUHJvcFR5cGU8T3B0aW9uYWw8Ym9vbGVhbj4+LFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIGJ1dHRvblN0eWxlOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8QnV0dG9uU3R5bGU+PixcclxuICAgIGRlZmF1bHQ6ICdiYXNlJ1xyXG4gIH0sXHJcbiAgaGlkZUNoZWNrbWFya3M6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4gYXMgUHJvcFR5cGU8T3B0aW9uYWw8Ym9vbGVhbj4+LFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIGFsbG93VW5zZXQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4gYXMgUHJvcFR5cGU8T3B0aW9uYWw8Ym9vbGVhbj4+LFxyXG4gICAgZGVmYXVsdDogdHJ1ZVxyXG4gIH0sXHJcbiAgY2xlYXJhYmxlOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRpb24gc3R1ZmZcclxuICAgKi9cclxuICBydWxlczoge1xyXG4gICAgdHlwZTogW1N0cmluZywgT2JqZWN0LCBGdW5jdGlvbiwgQXJyYXldIGFzIFByb3BUeXBlPFxyXG4gICAgICBPcHRpb25hbDxSdWxlRXhwcmVzc2lvbjxWYWx1ZVR5cGU+PlxyXG4gICAgPixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogdmVlLXZhbGlkYXRlIHZhbGlkYXRpb24oKSBvbiBjb21wb25lbnQgbW91bnRcclxuICAgKi9cclxuICB2YWxpZGF0ZU9uTW91bnQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byB0cmlnZ2VyIHZhbGlkYXRpb24gd2hlbmV2ZXIgdGhlIHZhbHVlIGNoYW5nZXNcclxuICAgKi9cclxuICB2YWxpZGF0ZU9uVmFsdWVVcGRhdGU6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2lsbCByZXBsYWNlIHRoZSBnZW5lcmljIFwiVmFsdWVcIiB0ZXh0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGlucHV0IGluIGVycm9yIG1lc3NhZ2VzXHJcbiAgICovXHJcbiAgdXNlTGFiZWxJbkVycm9yczoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IHRydWVcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIGhlbHAgdGV4dFxyXG4gICAqL1xyXG4gIGhlbHA6IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxPcHRpb25hbDxzdHJpbmc+PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHNpemUgYXR0cmlidXRlIGluc3RlYWRcclxuICAgKi9cclxuICBmaXhlZEhlaWdodDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBCeSBkZWZhdWx0IGNvbXBvbmVudCBob2xkcyBpdHMgb3duIGludGVybmFsIHZhbHVlIHN0YXRlIHNvIHRoYXQgZXZlbiBpZiB5b3UgZG9uJ3QgaGF2ZSBpdCB0aWVkIHVwIHRvIGEgcmVhbCBgbW9kZWxWYWx1ZWAgcmVmIHNvbWV3aGVyZVxyXG4gICAqIGl0IGtub3dzIGl0cyBpbnRlcm5hbCBzdGF0ZSBhbmQgY2FuIHJlcG9ydCBpdCBvbiBmb3JtIHN1Ym1pdHMuXHJcbiAgICpcclxuICAgKiBJZiB5b3Ugc2V0IHRoaXMgdG8gdHJ1ZSwgaXRzIG9ubHkgZ29pbmcgdG8gcmVseSBvbiBgbW9kZWxWYWx1ZWAgYXMgaXRzIHByaW1hcnkgc291cmNlIG9mIHRydXRoIHNvIHRoYXQgeW91IGNhbiByZWplY3QgdXBkYXRlcyBldGMuXHJcbiAgICovXHJcbiAgZnVsbHlDb250cm9sVmFsdWU6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBzaG93IHRoZSByZWQgXCJyZXF1aXJlZFwiIGFzdGVyaXNrXHJcbiAgICovXHJcbiAgc2hvd1JlcXVpcmVkOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgb3B0aW9uYWwgdGV4dFxyXG4gICAqL1xyXG4gIHNob3dPcHRpb25hbDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIG1vdW50IHRoZSBtZW51IG9uIHRoZSBib2R5IGluc3RlYWQgb2YgaW5zaWRlIHRoZSBjb21wb25lbnQuIFVzZWZ1bCB3aGVuIHNlbGVjdCBib3ggaXMgbW91bnRlZCB3aXRoaW5cclxuICAgKiBkaWFsb2cgd2luZG93cyBhbmQgdGhlIG1lbnUgY2F1c2VzIHVubmVjZXNzYXJ5IG92ZXJmbG93LlxyXG4gICAqL1xyXG4gIG1vdW50TWVudU9uQm9keToge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBsYWJlbElkOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIGJ1dHRvbklkOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFRvb2x0aXAgc2hvd24gb24gZGlzYWJsZWQgaXRlbXNcclxuICAgKi9cclxuICBkaXNhYmxlZEl0ZW1Ub29sdGlwOiB7XHJcbiAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICB0eXBlOiBTdHJpbmdcclxuICB9LFxyXG4gIGxhYmVsUG9zaXRpb246IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxMYWJlbFBvc2l0aW9uPixcclxuICAgIGRlZmF1bHQ6ICd0b3AnXHJcbiAgfSxcclxuICB0b29sdGlwVGV4dDoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBPcHRpb25hbGx5IG1ha2UgdGhlIG1lbnUgd2lkdGggd2lkZXIvbmFycm93ZXIgdGhhbiB0aGUgYnV0dG9uIHdpZHRoIGJ5IHNwZWNpZnlpbmcgdGhlIG1heCB3aWR0aCBpbiBwaXhlbHMuXHJcbiAgICogT25seSBzdXBwb3J0ZWQgd2hlbiBgbW91bnRNZW51T25Cb2R5YCBpcyB0cnVlLlxyXG4gICAqL1xyXG4gIG1lbnVNYXhXaWR0aDoge1xyXG4gICAgdHlwZTogTnVtYmVyLFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBJZiBtZW51TWF4V2lkdGggaXMgc2V0IGFuZCBtZW51IGlzIHdpZGVyIHRoYW4gdGhlIGJ1dHRvbiwgdGhpcyB3aWxsIGRldGVybWluZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtZW51IG9wZW5pbmcuXHJcbiAgICogRGVmYXVsdDogJ2xlZnQnIChvcGVucyB0byB0aGUgbGVmdCBvZiB0aGUgYnV0dG9uKVxyXG4gICAqL1xyXG4gIG1lbnVPcGVuRGlyZWN0aW9uOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8J2xlZnQnIHwgJ3JpZ2h0Jz4sXHJcbiAgICBkZWZhdWx0OiAnbGVmdCdcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIEN1c3RvbSBtYXggaGVpZ2h0IGNsYXNzZXMgZm9yIHRoZSBkcm9wZG93biBtZW51LiBJZiBub3QgcHJvdmlkZWQsIGRlZmF1bHRzIHRvICdtYXgtaC1bNTB2aF0geGw6bWF4LWgtODAnXHJcbiAgICovXHJcbiAgbWVudU1heEhlaWdodENsYXNzZXM6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IHsgdmFsdWUsIGVycm9yTWVzc2FnZTogZXJyb3IgfSA9IHVzZUZpZWxkPFZhbHVlVHlwZT4ocHJvcHMubmFtZSwgcHJvcHMucnVsZXMsIHtcclxuICB2YWxpZGF0ZU9uTW91bnQ6IHByb3BzLnZhbGlkYXRlT25Nb3VudCxcclxuICB2YWxpZGF0ZU9uVmFsdWVVcGRhdGU6IHByb3BzLnZhbGlkYXRlT25WYWx1ZVVwZGF0ZSxcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXHJcbiAgaW5pdGlhbFZhbHVlOiBwcm9wcy5tb2RlbFZhbHVlIGFzIFZhbHVlVHlwZVxyXG59KVxyXG5cclxuY29uc3QgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpXHJcblxyXG5jb25zdCBzZWFyY2hJbnB1dCA9IHJlZihudWxsIGFzIE51bGxhYmxlPEhUTUxJbnB1dEVsZW1lbnQ+KVxyXG5jb25zdCBtZW51RWwgPSByZWYobnVsbCBhcyBOdWxsYWJsZTx7IGVsOiBOdWxsYWJsZTxIVE1MRWxlbWVudD4gfT4pXHJcbmNvbnN0IGxpc3Rib3hCdXR0b24gPSByZWYobnVsbCBhcyBOdWxsYWJsZTx7IGVsOiBOdWxsYWJsZTxIVE1MQnV0dG9uRWxlbWVudD4gfT4pXHJcbmNvbnN0IHNlYXJjaFZhbHVlID0gcmVmKCcnKVxyXG5jb25zdCBjdXJyZW50SXRlbXMgPSByZWYoW10pIGFzIFJlZjxTaW5nbGVJdGVtW10+XHJcbmNvbnN0IGlzQXN5bmNMb2FkaW5nID0gcmVmKGZhbHNlKVxyXG5jb25zdCBmb3JjZVVwZGF0ZUtleSA9IHJlZigxKVxyXG5jb25zdCBpbnRlcm5hbEhlbHBUaXBJZCA9IHJlZihuYW5vaWQoKSlcclxuY29uc3QgaXNPcGVuID0gcmVmKGZhbHNlKVxyXG5cclxuY29uc3QgbGlzdGJveEJ1dHRvbkJvdW5kaW5nID0gdXNlRWxlbWVudEJvdW5kaW5nKFxyXG4gIGNvbXB1dGVkKCgpID0+IGxpc3Rib3hCdXR0b24udmFsdWU/LmVsKSxcclxuICB7IHdpbmRvd1Jlc2l6ZTogdHJ1ZSwgd2luZG93U2Nyb2xsOiB0cnVlLCBpbW1lZGlhdGU6IHRydWUgfVxyXG4pXHJcblxyXG51c2VJbnRlcnNlY3Rpb25PYnNlcnZlcihcclxuICBjb21wdXRlZCgoKSA9PiBtZW51RWwudmFsdWU/LmVsKSxcclxuICAoW3sgaXNJbnRlcnNlY3RpbmcgfV0pID0+IHtcclxuICAgIGlmIChpc0ludGVyc2VjdGluZyAmJiBwcm9wcy5tb3VudE1lbnVPbkJvZHkpIHtcclxuICAgICAgbGlzdGJveEJ1dHRvbkJvdW5kaW5nLnVwZGF0ZSgpXHJcbiAgICB9XHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCB7IG1lbnVTdHlsZSB9ID0gdXNlQm9keU1vdW50ZWRNZW51UG9zaXRpb25pbmcoe1xyXG4gIG1lbnVPcGVuRGlyZWN0aW9uOiBjb21wdXRlZCgoKSA9PlxyXG4gICAgcHJvcHMubWVudU9wZW5EaXJlY3Rpb24gPT09ICdsZWZ0J1xyXG4gICAgICA/IEhvcml6b250YWxEaXJlY3Rpb24uTGVmdFxyXG4gICAgICA6IEhvcml6b250YWxEaXJlY3Rpb24uUmlnaHRcclxuICApLFxyXG4gIG1lbnVXaWR0aDogY29tcHV0ZWQoKCkgPT4gcHJvcHMubWVudU1heFdpZHRoKSxcclxuICBidXR0b25Cb3VuZGluZ0JveDogbGlzdGJveEJ1dHRvbkJvdW5kaW5nXHJcbn0pXHJcblxyXG5jb25zdCB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHVucmVmKHByb3BzLmxhYmVsKSB8fCB1bnJlZihwcm9wcy5uYW1lKSlcclxuY29uc3QgZXJyb3JNZXNzYWdlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGJhc2UgPSBlcnJvci52YWx1ZVxyXG4gIGlmICghYmFzZSB8fCAhdW5yZWYocHJvcHMudXNlTGFiZWxJbkVycm9ycykpIHJldHVybiBiYXNlXHJcbiAgcmV0dXJuIGJhc2UucmVwbGFjZSgnVmFsdWUnLCB0aXRsZS52YWx1ZSlcclxufSlcclxuY29uc3QgaGVscFRpcCA9IGNvbXB1dGVkKCgpID0+IGVycm9yTWVzc2FnZS52YWx1ZSB8fCB1bnJlZihwcm9wcy5oZWxwKSlcclxuY29uc3QgaGFzSGVscFRpcCA9IGNvbXB1dGVkKCgpID0+ICEhaGVscFRpcC52YWx1ZSlcclxuY29uc3QgaGVscFRpcElkID0gY29tcHV0ZWQoKCkgPT5cclxuICBoYXNIZWxwVGlwLnZhbHVlID8gYCR7dW5yZWYocHJvcHMubmFtZSl9LSR7aW50ZXJuYWxIZWxwVGlwSWQudmFsdWV9YCA6IHVuZGVmaW5lZFxyXG4pXHJcbmNvbnN0IGhlbHBUaXBDbGFzc2VzID0gY29tcHV0ZWQoKCk6IHN0cmluZyA9PlxyXG4gIGVycm9yLnZhbHVlID8gJ3RleHQtZGFuZ2VyJyA6ICd0ZXh0LWZvcmVncm91bmQtMidcclxuKVxyXG5cclxuY29uc3QgaXNMZWZ0TGFiZWxQb3NpdGlvbiA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmxhYmVsUG9zaXRpb24gPT09ICdsZWZ0JylcclxuXHJcbmNvbnN0IHJlbmRlckNsZWFyQnV0dG9uID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcHJvcHMuYnV0dG9uU3R5bGUgIT09ICdzaW1wbGUnICYmIHByb3BzLmNsZWFyYWJsZSAmJiAhcHJvcHMuZGlzYWJsZWRcclxuKVxyXG5cclxuY29uc3Qgc2l6ZUNsYXNzZXMgPSBjb21wdXRlZCgoKTogc3RyaW5nID0+IHtcclxuICBpZiAoIXByb3BzLnNpemUpIHJldHVybiAnJ1xyXG5cclxuICBzd2l0Y2ggKHByb3BzLnNpemUpIHtcclxuICAgIGNhc2UgJ3NtJzpcclxuICAgICAgcmV0dXJuICdoLTYgdGV4dC1ib2R5LXNtJ1xyXG4gICAgY2FzZSAnbGcnOlxyXG4gICAgICByZXR1cm4gJ2gtMTAgdGV4dC1bMTNweF0nXHJcbiAgICBjYXNlICd4bCc6XHJcbiAgICAgIHJldHVybiAnaC0xNCB0ZXh0LXNtJ1xyXG4gICAgY2FzZSAnYmFzZSc6XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gJ2gtOCB0ZXh0LWJvZHktc20nXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgYnV0dG9uc1dyYXBwZXJDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWydyZWxhdGl2ZSBmbGV4IGdyb3VwJ11cclxuXHJcbiAgaWYgKGVycm9yLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2hvdmVyOnNoYWRvdyByb3VuZGVkLW1kJylcclxuICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1kYW5nZXItZGFya2VyIGZvY3VzOmJvcmRlci1kYW5nZXInKVxyXG5cclxuICAgIGlmIChwcm9wcy5idXR0b25TdHlsZSAhPT0gJ3NpbXBsZScpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXIgYm9yZGVyLWRhbmdlcicpXHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChwcm9wcy5idXR0b25TdHlsZSAhPT0gJ3NpbXBsZScpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncm91bmRlZC1tZCBib3JkZXInKVxyXG4gICAgaWYgKGlzT3Blbi52YWx1ZSkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2JvcmRlci1vdXRsaW5lLTQnKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXItb3V0bGluZS0yIGhvdmVyOmJvcmRlci1vdXRsaW5lLTUgZm9jdXM6b3V0bGluZS0wJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy5maXhlZEhlaWdodCkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdoLTgnKVxyXG4gIH0gZWxzZSBpZiAoc2l6ZUNsYXNzZXMudmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKHNpemVDbGFzc2VzLnZhbHVlKVxyXG4gIH1cclxuXHJcbiAgaWYgKGlzTGVmdExhYmVsUG9zaXRpb24udmFsdWUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnbWQ6YmFzaXMtMS8yJylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgY29tbW9uQnV0dG9uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFtdXHJcblxyXG4gIGlmIChwcm9wcy5idXR0b25TdHlsZSAhPT0gJ3NpbXBsZScpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgaXNEaXNhYmxlZC52YWx1ZSA/ICdiZy1mb3VuZGF0aW9uLWRpc2FibGVkIHRleHQtZm9yZWdyb3VuZC1kaXNhYmxlZCcgOiAnJ1xyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgaWYgKGlzRGlzYWJsZWQudmFsdWUpIGNsYXNzUGFydHMucHVzaCgnY3Vyc29yLW5vdC1hbGxvd2VkJylcclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBjbGVhckJ1dHRvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFtcclxuICAgICdyZWxhdGl2ZSB6LVsxXScsXHJcbiAgICAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1jZW50ZXIgc2hyaW5rLTAnLFxyXG4gICAgJ3JvdW5kZWQtci1tZCBvdmVyZmxvdy1oaWRkZW4gdHJhbnNpdGlvbi1hbGwnLFxyXG4gICAgJ3RleHQtZm9yZWdyb3VuZCcsXHJcbiAgICBoYXNWYWx1ZVNlbGVjdGVkLnZhbHVlID8gYHctNiAke2NvbW1vbkJ1dHRvbkNsYXNzZXMudmFsdWV9YCA6ICd3LTAnXHJcbiAgXVxyXG5cclxuICBpZiAoIWlzRGlzYWJsZWQudmFsdWUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgJ2hvdmVyOmJnLXByaW1hcnkgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kLW9uLXByaW1hcnkgZGFyazp0ZXh0LWZvcmVncm91bmQtb24tcHJpbWFyeSdcclxuICAgIClcclxuICAgIGlmIChwcm9wcy5idXR0b25TdHlsZSA9PT0gJ3RpbnRlZCcpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdiZy1vdXRsaW5lLTMnKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdiZy1wcmltYXJ5LW11dGVkJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgYnV0dG9uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ3JlbGF0aXZlIHotWzJdJyxcclxuICAgICdub3JtYWwgcm91bmRlZC1tZCBjdXJzb3ItcG9pbnRlciB0cmFuc2l0aW9uIHRydW5jYXRlIGZsZXgtMScsXHJcbiAgICAnZmxleCBpdGVtcy1jZW50ZXIgZm9jdXM6b3V0bGluZS1vdXRsaW5lLTQgZm9jdXM6b3V0bGluZS0xJyxcclxuICAgIGNvbW1vbkJ1dHRvbkNsYXNzZXMudmFsdWVcclxuICBdXHJcblxyXG4gIGlmIChwcm9wcy5idXR0b25TdHlsZSAhPT0gJ3NpbXBsZScpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncC0yJylcclxuXHJcbiAgICBpZiAoIWlzRGlzYWJsZWQudmFsdWUpIHtcclxuICAgICAgaWYgKHByb3BzLmJ1dHRvblN0eWxlID09PSAndGludGVkJykge1xyXG4gICAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctZm91bmRhdGlvbiB0ZXh0LWZvcmVncm91bmQnKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctZm91bmRhdGlvbiB0ZXh0LWZvcmVncm91bmQnKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAocmVuZGVyQ2xlYXJCdXR0b24udmFsdWUgJiYgaGFzVmFsdWVTZWxlY3RlZC52YWx1ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdyb3VuZGVkLXItbm9uZScpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGhhc1NlYXJjaCA9IGNvbXB1dGVkKFxyXG4gICgpID0+ICEhKHByb3BzLnNlYXJjaCAmJiAocHJvcHMuZmlsdGVyUHJlZGljYXRlIHx8IHByb3BzLmdldFNlYXJjaFJlc3VsdHMpKVxyXG4pXHJcbmNvbnN0IGlzQXN5bmNTZWFyY2hNb2RlID0gY29tcHV0ZWQoKCkgPT4gaGFzU2VhcmNoLnZhbHVlICYmIHByb3BzLmdldFNlYXJjaFJlc3VsdHMpXHJcbmNvbnN0IGlzRGlzYWJsZWQgPSBjb21wdXRlZChcclxuICAoKSA9PiBwcm9wcy5kaXNhYmxlZCB8fCAoIXByb3BzLml0ZW1zLmxlbmd0aCAmJiAhaXNBc3luY1NlYXJjaE1vZGUudmFsdWUpXHJcbilcclxuXHJcbmNvbnN0IHdyYXBwZWRWYWx1ZSA9IGNvbXB1dGVkKHtcclxuICBnZXQ6ICgpID0+IHtcclxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhbHVlLnZhbHVlXHJcbiAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcclxuICAgICAgcmV0dXJuIGlzQXJyYXkoY3VycmVudFZhbHVlKSA/IGN1cnJlbnRWYWx1ZSA6IFtdXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gaXNBcnJheShjdXJyZW50VmFsdWUpID8gdW5kZWZpbmVkIDogY3VycmVudFZhbHVlXHJcbiAgICB9XHJcbiAgfSxcclxuICBzZXQ6IChuZXdWYWwpID0+IHtcclxuICAgIGlmIChwcm9wcy5tdWx0aXBsZSAmJiAhaXNBcnJheShuZXdWYWwpKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignQXR0ZW1wdGluZyB0byBzZXQgbm9uLWFycmF5IHZhbHVlIGluIHNlbGVjdG9yIHcvIG11bHRpcGxlPXRydWUnKVxyXG4gICAgICByZXR1cm5cclxuICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlICYmIGlzQXJyYXkobmV3VmFsKSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0F0dGVtcHRpbmcgdG8gc2V0IGFycmF5IHZhbHVlIGluIHNlbGVjdG9yIHcvIG11bHRpcGxlPWZhbHNlJylcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZpbmFsVmFsdWU6IHR5cGVvZiB2YWx1ZS52YWx1ZVxyXG4gICAgaWYgKHByb3BzLm11bHRpcGxlKSB7XHJcbiAgICAgIGZpbmFsVmFsdWUgPSBuZXdWYWwgfHwgW11cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWwgPSB2YWx1ZS52YWx1ZVxyXG4gICAgICBjb25zdCBpc1Vuc2V0ID1cclxuICAgICAgICBwcm9wcy5hbGxvd1Vuc2V0ICYmXHJcbiAgICAgICAgY3VycmVudFZhbCAmJlxyXG4gICAgICAgIG5ld1ZhbCAmJlxyXG4gICAgICAgIGl0ZW1LZXkoY3VycmVudFZhbCBhcyBTaW5nbGVJdGVtKSA9PT0gaXRlbUtleShuZXdWYWwgYXMgU2luZ2xlSXRlbSlcclxuICAgICAgZmluYWxWYWx1ZSA9IGlzVW5zZXQgPyB1bmRlZmluZWQgOiBuZXdWYWxcclxuICAgIH1cclxuXHJcbiAgICBpZiAocHJvcHMuZnVsbHlDb250cm9sVmFsdWUpIHtcclxuICAgICAgLy8gTm90IHNldHRpbmcgdmFsdWUudmFsdWUsIGNhdXNlIHRoZW4gd2UgZG9uJ3QgZ2l2ZSBhIGNoYW5jZSBmb3IgdGhlIHBhcmVudFxyXG4gICAgICAvLyBjb21wb25lbnQgdG8gcmVqZWN0IHRoZSB1cGRhdGVcclxuICAgICAgZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBmaW5hbFZhbHVlKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsdWUudmFsdWUgPSBmaW5hbFZhbHVlXHJcbiAgICB9XHJcblxyXG4gICAgLy8gaGFja3ksIGJ1dCB0aGVyZSdzIG5vIG90aGVyIHdheSB0byBmb3JjZSBMaXN0Qm94IHRvIHJlLXJlYWQgdGhlIG1vZGVsVmFsdWUgcHJvcCB3aGljaFxyXG4gICAgLy8gd2UgbmVlZCBpbiBjYXNlIHRoZSB1cGRhdGUgd2FzIHJlamVjdGVkIGFuZCBMaXN0Qm94IHN0aWxsIHRoaW5rcyB0aGUgdmFsdWUgaXMgdGhlIG9uZVxyXG4gICAgLy8gdGhhdCB3YXMgY2xpY2tlZCBvblxyXG4gICAgZm9yY2VVcGRhdGVLZXkudmFsdWUgKz0gMVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGhhc1ZhbHVlU2VsZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKHByb3BzLm11bHRpcGxlICYmIGlzQXJyYXkod3JhcHBlZFZhbHVlLnZhbHVlKSlcclxuICAgIHJldHVybiB3cmFwcGVkVmFsdWUudmFsdWUubGVuZ3RoICE9PSAwXHJcbiAgZWxzZSByZXR1cm4gISF3cmFwcGVkVmFsdWUudmFsdWVcclxufSlcclxuXHJcbmNvbnN0IGNsZWFyVmFsdWUgPSAoKSA9PiB7XHJcbiAgaWYgKHByb3BzLm11bHRpcGxlKSB3cmFwcGVkVmFsdWUudmFsdWUgPSBbXVxyXG4gIGVsc2Ugd3JhcHBlZFZhbHVlLnZhbHVlID0gdW5kZWZpbmVkXHJcbn1cclxuXHJcbmNvbnN0IGZpbmFsSXRlbXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3Qgc2VhcmNoVmFsID0gc2VhcmNoVmFsdWUudmFsdWVcclxuICBpZiAoIWhhc1NlYXJjaC52YWx1ZSB8fCAhc2VhcmNoVmFsPy5sZW5ndGgpIHJldHVybiBjdXJyZW50SXRlbXMudmFsdWVcclxuXHJcbiAgaWYgKHByb3BzLmZpbHRlclByZWRpY2F0ZSkge1xyXG4gICAgcmV0dXJuIGN1cnJlbnRJdGVtcy52YWx1ZS5maWx0ZXIoXHJcbiAgICAgIChpKSA9PiBwcm9wcy5maWx0ZXJQcmVkaWNhdGU/LihpLCBzZWFyY2hWYWwpIHx8IGZhbHNlXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY3VycmVudEl0ZW1zLnZhbHVlXHJcbn0pXHJcblxyXG5jb25zdCBsaXN0Ym94T3B0aW9uc0NsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFtcclxuICAgICdyb3VuZGVkLW1kIGJnLWZvdW5kYXRpb24gcHktMSBsYWJlbCBsYWJlbC0tbGlnaHQgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTMgc2hhZG93LW1kJ1xyXG4gIF1cclxuXHJcbiAgaWYgKHByb3BzLm1vdW50TWVudU9uQm9keSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdmaXhlZCB6LTUwJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdhYnNvbHV0ZSB0b3AtWzEwMCVdIHctZnVsbCB6LTQwIG10LTEnKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBsaXN0Ym94T3B0aW9uc1N0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGxldCBzdHlsZTogQ1NTUHJvcGVydGllcyA9IHt9XHJcbiAgaWYgKCFpc0NsaWVudCB8fCAhcHJvcHMubW91bnRNZW51T25Cb2R5KSByZXR1cm4gc3R5bGVcclxuXHJcbiAgc3R5bGUgPSB7XHJcbiAgICAuLi5zdHlsZSxcclxuICAgIC4uLm1lbnVTdHlsZS52YWx1ZVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHN0eWxlXHJcbn0pXHJcblxyXG5jb25zdCBzaW1wbGVEaXNwbGF5VGV4dCA9ICh2OiBWYWx1ZVR5cGUpID0+IEpTT04uc3RyaW5naWZ5KHYpXHJcbmNvbnN0IGl0ZW1LZXkgPSAodjogU2luZ2xlSXRlbSk6IHN0cmluZyB8IG51bWJlciA9PiB7XHJcbiAgaWYgKGlzT2JqZWN0TGlrZVR5cGUodikpIHtcclxuICAgIHJldHVybiB2W3Byb3BzLmJ5IHx8ICdpZCddIGFzIHN0cmluZ1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdlxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgdHJpZ2dlclNlYXJjaCA9IGFzeW5jICgpID0+IHtcclxuICBpZiAoIWlzQXN5bmNTZWFyY2hNb2RlLnZhbHVlIHx8ICFwcm9wcy5nZXRTZWFyY2hSZXN1bHRzKSByZXR1cm5cclxuXHJcbiAgaXNBc3luY0xvYWRpbmcudmFsdWUgPSB0cnVlXHJcbiAgdHJ5IHtcclxuICAgIGN1cnJlbnRJdGVtcy52YWx1ZSA9IGF3YWl0IHByb3BzLmdldFNlYXJjaFJlc3VsdHMoc2VhcmNoVmFsdWUudmFsdWUpXHJcbiAgfSBmaW5hbGx5IHtcclxuICAgIGlzQXN5bmNMb2FkaW5nLnZhbHVlID0gZmFsc2VcclxuICB9XHJcbn1cclxuY29uc3QgZGVib3VuY2VkU2VhcmNoID0gZGVib3VuY2UodHJpZ2dlclNlYXJjaCwgMTAwMClcclxuXHJcbmNvbnN0IGxpc3Rib3hPcHRpb25DbGFzc2VzID0gKHBhcmFtczogeyBhY3RpdmU6IGJvb2xlYW47IGRpc2FibGVkOiBib29sZWFuIH0pID0+IHtcclxuICBjb25zdCB7IGRpc2FibGVkIH0gPSBwYXJhbXMgfHwge31cclxuXHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFsncmVsYXRpdmUgdHJhbnNpdGlvbiBzZWxlY3Qtbm9uZSBweS0xIHB4LTInXVxyXG5cclxuICBpZiAoZGlzYWJsZWQpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnb3BhY2l0eS01MCBjdXJzb3Itbm90LWFsbG93ZWQnKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZm9yZWdyb3VuZCBjdXJzb3ItcG9pbnRlcicpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufVxyXG5cclxud2F0Y2goXHJcbiAgKCkgPT4gcHJvcHMuaXRlbXMsXHJcbiAgKG5ld0l0ZW1zKSA9PiB7XHJcbiAgICBjdXJyZW50SXRlbXMudmFsdWUgPSBuZXdJdGVtcy5zbGljZSgpXHJcbiAgfSxcclxuICB7IGltbWVkaWF0ZTogdHJ1ZSB9XHJcbilcclxuXHJcbndhdGNoKHNlYXJjaFZhbHVlLCAoKSA9PiB7XHJcbiAgaWYgKCFpc0FzeW5jU2VhcmNoTW9kZS52YWx1ZSkgcmV0dXJuXHJcbiAgdm9pZCBkZWJvdW5jZWRTZWFyY2goKVxyXG59KVxyXG5cclxud2F0Y2goaXNPcGVuLCAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICBpZiAobmV3VmFsICYmICFvbGRWYWwpIHtcclxuICAgIC8vIFVwZGF0ZSBtZW51IGxvY2F0aW9uICh0byBhdm9pZCBmbGFzaGluZylcclxuICAgIGxpc3Rib3hCdXR0b25Cb3VuZGluZy51cGRhdGUoKVxyXG4gIH1cclxufSlcclxuXHJcbm9uTW91bnRlZCgoKSA9PiB7XHJcbiAgaWYgKGlzQXN5bmNTZWFyY2hNb2RlLnZhbHVlICYmICFwcm9wcy5pdGVtcy5sZW5ndGgpIHtcclxuICAgIHZvaWQgdHJpZ2dlclNlYXJjaCgpXHJcbiAgfVxyXG59KVxyXG5cclxuZGVmaW5lRXhwb3NlKHsgdHJpZ2dlclNlYXJjaCB9KVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxDb21tb25CYWRnZVxyXG4gICAgY29sb3ItY2xhc3Nlcz1cInRleHQtZm9yZWdyb3VuZC1vbi1wcmltYXJ5XCJcclxuICAgIHJvdW5kZWRcclxuICAgIDpzdHlsZT1cInsgYmFja2dyb3VuZENvbG9yOiBzb3VyY2VBcHAuYmdDb2xvciB9XCJcclxuICA+XHJcbiAgICB7eyBzb3VyY2VBcHAuc2hvcnQgfX1cclxuICA8L0NvbW1vbkJhZGdlPlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgQ29tbW9uQmFkZ2UgZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvY29tbW9uL0JhZGdlLnZ1ZSdcclxuaW1wb3J0IHR5cGUgeyBTb3VyY2VBcHBEZWZpbml0aW9uIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5cclxuZGVmaW5lUHJvcHM8e1xyXG4gIHNvdXJjZUFwcDogU291cmNlQXBwRGVmaW5pdGlvblxyXG59PigpXHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPEZvcm1TZWxlY3RCYXNlXHJcbiAgICB2LW1vZGVsPVwic2VsZWN0ZWRWYWx1ZVwiXHJcbiAgICA6bXVsdGlwbGU9XCJtdWx0aXBsZVwiXHJcbiAgICA6aXRlbXM9XCJpdGVtcyA/PyBTb3VyY2VBcHBzXCJcclxuICAgIDpzZWFyY2g9XCJzZWFyY2hcIlxyXG4gICAgOnNlYXJjaC1wbGFjZWhvbGRlcj1cInNlYXJjaFBsYWNlaG9sZGVyXCJcclxuICAgIDpsYWJlbD1cImxhYmVsXCJcclxuICAgIDpzaG93LWxhYmVsPVwic2hvd0xhYmVsXCJcclxuICAgIDpuYW1lPVwibmFtZSB8fCAnc291cmNlQXBwcydcIlxyXG4gICAgOmZpbHRlci1wcmVkaWNhdGU9XCJzZWFyY2hGaWx0ZXJQcmVkaWNhdGVcIlxyXG4gICAgOmNsZWFyYWJsZT1cImNsZWFyYWJsZVwiXHJcbiAgICA6aGVscD1cImhlbHBcIlxyXG4gICAgOmxhYmVsLWlkPVwibGFiZWxJZFwiXHJcbiAgICA6YnV0dG9uLWlkPVwiYnV0dG9uSWRcIlxyXG4gICAgYnk9XCJuYW1lXCJcclxuICA+XHJcbiAgICA8dGVtcGxhdGUgI25vdGhpbmctc2VsZWN0ZWQ+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2VsZWN0b3JQbGFjZWhvbGRlclwiPlxyXG4gICAgICAgIHt7IHNlbGVjdG9yUGxhY2Vob2xkZXIgfX1cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cclxuICAgICAgICB7eyBtdWx0aXBsZSA/ICdTZWxlY3QgYXBwcycgOiAnU2VsZWN0IGFuIGFwcCcgfX1cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgI3NvbWV0aGluZy1zZWxlY3RlZD1cInsgdmFsdWUgfVwiPlxyXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cImlzTXVsdGlJdGVtQXJyYXlWYWx1ZSh2YWx1ZSlcIj5cclxuICAgICAgICA8ZGl2IHJlZj1cImVsZW1lbnRUb1dhdGNoRm9yQ2hhbmdlc1wiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0wLjUgaC01XCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIHJlZj1cIml0ZW1Db250YWluZXJcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC13cmFwIG92ZXJmbG93LWhpZGRlbiBzcGFjZS14LTAuNSBoLTVcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8U291cmNlQXBwQmFkZ2Ugdi1mb3I9XCJpdGVtIGluIHZhbHVlXCIgOmtleT1cIml0ZW0ubmFtZVwiIDpzb3VyY2UtYXBwPVwiaXRlbVwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgdi1pZj1cImhpZGRlblNlbGVjdGVkSXRlbUNvdW50ID4gMFwiIGNsYXNzPVwidGV4dC1mb3JlZ3JvdW5kLTIgbm9ybWFsXCI+XHJcbiAgICAgICAgICAgICt7eyBoaWRkZW5TZWxlY3RlZEl0ZW1Db3VudCB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiaC0yIHctMiByb3VuZGVkLWZ1bGwgbXItMlwiXHJcbiAgICAgICAgICAgIDpzdHlsZT1cInsgYmFja2dyb3VuZENvbG9yOiBmaXJzdEl0ZW0odmFsdWUpLmJnQ29sb3IgfVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZVwiPnt7IGZpcnN0SXRlbSh2YWx1ZSkubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgI29wdGlvbj1cInsgaXRlbSB9XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiaC0yIHctMiByb3VuZGVkLWZ1bGwgbXItMlwiXHJcbiAgICAgICAgICA6c3R5bGU9XCJ7IGJhY2tncm91bmRDb2xvcjogaXRlbS5iZ0NvbG9yIH1cIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZVwiPnt7IGl0ZW0ubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gIDwvRm9ybVNlbGVjdEJhc2U+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUsIE9wdGlvbmFsLCBTb3VyY2VBcHBEZWZpbml0aW9uIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBTb3VyY2VBcHBzIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyByZWYsIHRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBQcm9wVHlwZSB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHsgdXNlRm9ybVNlbGVjdENoaWxkSW50ZXJuYWxzIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL2Zvcm0vc2VsZWN0J1xyXG5pbXBvcnQgRm9ybVNlbGVjdEJhc2UgZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvZm9ybS9zZWxlY3QvQmFzZS52dWUnXHJcbmltcG9ydCBTb3VyY2VBcHBCYWRnZSBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9Tb3VyY2VBcHBCYWRnZS52dWUnXHJcblxyXG50eXBlIFZhbHVlVHlwZSA9IFNvdXJjZUFwcERlZmluaXRpb24gfCBTb3VyY2VBcHBEZWZpbml0aW9uW10gfCB1bmRlZmluZWRcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHY6IFZhbHVlVHlwZSk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBhbGxvdyBzZWxlY3RpbmcgbXVsdGlwbGUgc291cmNlIGFwcHNcclxuICAgKi9cclxuICBtdWx0aXBsZToge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBtb2RlbFZhbHVlOiB7XHJcbiAgICB0eXBlOiBbT2JqZWN0LCBBcnJheV0gYXMgUHJvcFR5cGU8VmFsdWVUeXBlPixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBhbGxvdyBmaWx0ZXJpbmcgc291cmNlIGFwcHMgdGhyb3VnaCBhIHNlYXJjaCBib3hcclxuICAgKi9cclxuICBzZWFyY2g6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogU2VhcmNoIHBsYWNlaG9sZGVyIHRleHRcclxuICAgKi9cclxuICBzZWFyY2hQbGFjZWhvbGRlcjoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgZGVmYXVsdDogJ1NlYXJjaCBhcHBzJ1xyXG4gIH0sXHJcbiAgc2VsZWN0b3JQbGFjZWhvbGRlcjoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBMYWJlbCBpcyByZXF1aXJlZCBhdCB0aGUgdmVyeSBsZWFzdCBmb3Igc2NyZWVuLXJlYWRlcnNcclxuICAgKi9cclxuICBsYWJlbDoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgcmVxdWlyZWQ6IHRydWVcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgbGFiZWwgdmlzdWFsbHlcclxuICAgKi9cclxuICBzaG93TGFiZWw6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgbmFtZToge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBDb250cm9sIHNvdXJjZSBhcHBzIHRvIHNob3cuIElmIGxlZnQgdW5kZWZpbmVkLCB3aWxsIHNob3cgYWxsIGF2YWlsYWJsZSBvcHRpb25zLlxyXG4gICAqL1xyXG4gIGl0ZW1zOiB7XHJcbiAgICB0eXBlOiBBcnJheSBhcyBQcm9wVHlwZTxPcHRpb25hbDxTb3VyY2VBcHBEZWZpbml0aW9uW10+PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgY2xlYXJhYmxlOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuXHJcbiAgfSxcclxuICBoZWxwOiB7XHJcbiAgICB0eXBlOiBTdHJpbmdcclxuICB9LFxyXG4gIGxhYmVsSWQ6IHtcclxuICAgIHR5cGU6IFN0cmluZ1xyXG4gIH0sXHJcbiAgYnV0dG9uSWQ6IHtcclxuICAgIHR5cGU6IFN0cmluZ1xyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGVsZW1lbnRUb1dhdGNoRm9yQ2hhbmdlcyA9IHJlZihudWxsIGFzIE51bGxhYmxlPEhUTUxFbGVtZW50PilcclxuY29uc3QgaXRlbUNvbnRhaW5lciA9IHJlZihudWxsIGFzIE51bGxhYmxlPEhUTUxFbGVtZW50PilcclxuXHJcbmNvbnN0IHsgc2VsZWN0ZWRWYWx1ZSwgaGlkZGVuU2VsZWN0ZWRJdGVtQ291bnQsIGlzTXVsdGlJdGVtQXJyYXlWYWx1ZSwgZmlyc3RJdGVtIH0gPVxyXG4gIHVzZUZvcm1TZWxlY3RDaGlsZEludGVybmFsczxTb3VyY2VBcHBEZWZpbml0aW9uPih7XHJcbiAgICBwcm9wczogdG9SZWZzKHByb3BzKSxcclxuICAgIGVtaXQsXHJcbiAgICBkeW5hbWljVmlzaWJpbGl0eTogeyBlbGVtZW50VG9XYXRjaEZvckNoYW5nZXMsIGl0ZW1Db250YWluZXIgfVxyXG4gIH0pXHJcblxyXG5jb25zdCBzZWFyY2hGaWx0ZXJQcmVkaWNhdGUgPSAoaTogU291cmNlQXBwRGVmaW5pdGlvbiwgc2VhcmNoOiBzdHJpbmcpID0+XHJcbiAgaS5uYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoLnRvTG9jYWxlTG93ZXJDYXNlKCkpXHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPEZvcm1TZWxlY3RCYXNlXHJcbiAgICB2LW1vZGVsPVwic2VsZWN0ZWRWYWx1ZVwiXHJcbiAgICA6bXVsdGlwbGU9XCJtdWx0aXBsZVwiXHJcbiAgICA6aXRlbXM9XCJpdGVtc1wiXHJcbiAgICA6bGFiZWw9XCJsYWJlbFwiXHJcbiAgICA6bmFtZT1cIm5hbWVcIlxyXG4gICAgOmhlbHA9XCJoZWxwXCJcclxuICAgIDpydWxlcz1cInJ1bGVzXCJcclxuICAgIDpieT1cImJ5XCJcclxuICAgIDpsYWJlbC1pZD1cImxhYmVsSWRcIlxyXG4gICAgOmJ1dHRvbi1pZD1cImJ1dHRvbklkXCJcclxuICA+XHJcbiAgICA8dGVtcGxhdGUgI3NvbWV0aGluZy1zZWxlY3RlZD1cInsgdmFsdWUgfVwiPlxyXG4gICAgICA8dWwgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMS41XCI+XHJcbiAgICAgICAgPGxpIHYtZm9yPVwiaXRlbSBpbiBpc0FycmF5VmFsdWUodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdXCIgOmtleT1cIml0ZW1bYnldXCI+XHJcbiAgICAgICAgICA8Q29tbW9uQmFkZ2VcclxuICAgICAgICAgICAgc2l6ZT1cImxnXCJcclxuICAgICAgICAgICAgY29sb3ItY2xhc3Nlcz1cImJvcmRlciBib3JkZXItb3V0bGluZS0yIGJnLWZvdW5kYXRpb24tcGFnZVwiXHJcbiAgICAgICAgICAgIGRvdC1pY29uLWNvbG9yLWNsYXNzZXM9XCJ0ZXh0LWZvcmVncm91bmRcIlxyXG4gICAgICAgICAgICByb3VuZGVkXHJcbiAgICAgICAgICAgIDpjbGlja2FibGUtaWNvbj1cInRydWVcIlxyXG4gICAgICAgICAgICA6aWNvbi1sZWZ0PVwiWE1hcmtJY29uXCJcclxuICAgICAgICAgICAgQGNsaWNrLWljb24uc3RvcD1cImRlc2VsZWN0SXRlbShpdGVtKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGl0ZW0udGV4dCB9fVxyXG4gICAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICA8L2xpPlxyXG4gICAgICA8L3VsPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDx0ZW1wbGF0ZSAjb3B0aW9uPVwieyBpdGVtIH1cIj5cclxuICAgICAge3sgaXRlbS50ZXh0IH19XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gIDwvRm9ybVNlbGVjdEJhc2U+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG4vLyBWdWUgY29tcG9uZW50cyBkb24ndCBzdXBwb3J0IGdlbmVyaWMgcHJvcHMsIHNvIGhhdmluZyB0byByZWx5IG9uIGFueVxyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xyXG5cclxuaW1wb3J0IHsgdG9SZWZzIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgRm9ybVNlbGVjdEJhc2UgZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvZm9ybS9zZWxlY3QvQmFzZS52dWUnXHJcbmltcG9ydCBDb21tb25CYWRnZSBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9jb21tb24vQmFkZ2UudnVlJ1xyXG5pbXBvcnQgeyB1c2VGb3JtU2VsZWN0Q2hpbGRJbnRlcm5hbHMgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS9zZWxlY3QnXHJcbmltcG9ydCB7IFhNYXJrSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L3NvbGlkJ1xyXG5cclxudHlwZSBTaW5nbGVJdGVtID0gYW55XHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWw6IEFycmF5PFNpbmdsZUl0ZW0+KTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBpdGVtczogQXJyYXk8U2luZ2xlSXRlbT5cclxuICBsYWJlbDogc3RyaW5nXHJcbiAgbmFtZTogc3RyaW5nXHJcbiAgaGVscD86IHN0cmluZ1xyXG4gIG1vZGVsVmFsdWU/OiBTaW5nbGVJdGVtIHwgU2luZ2xlSXRlbVtdIHwgdW5kZWZpbmVkXHJcbiAgbXVsdGlwbGU/OiBib29sZWFuXHJcbiAgcnVsZXM/OiBBcnJheTxhbnk+XHJcbiAgYnk6IHN0cmluZ1xyXG4gIGxhYmVsSWQ/OiBzdHJpbmdcclxuICBidXR0b25JZD86IHN0cmluZ1xyXG59PigpXHJcblxyXG5jb25zdCB7IHNlbGVjdGVkVmFsdWUsIGlzQXJyYXlWYWx1ZSB9ID0gdXNlRm9ybVNlbGVjdENoaWxkSW50ZXJuYWxzPFNpbmdsZUl0ZW0+KHtcclxuICBwcm9wczogdG9SZWZzKHByb3BzKSxcclxuICBlbWl0XHJcbn0pXHJcblxyXG5jb25zdCBkZXNlbGVjdEl0ZW0gPSAoaXRlbTogU2luZ2xlSXRlbSkgPT4ge1xyXG4gIGlmIChpc0FycmF5VmFsdWUoc2VsZWN0ZWRWYWx1ZS52YWx1ZSkpIHtcclxuICAgIHNlbGVjdGVkVmFsdWUudmFsdWUgPSBzZWxlY3RlZFZhbHVlLnZhbHVlLmZpbHRlcigoaSkgPT4gaS5pZCAhPT0gaXRlbS5pZClcclxuICB9IGVsc2Uge1xyXG4gICAgc2VsZWN0ZWRWYWx1ZS52YWx1ZSA9IHVuZGVmaW5lZFxyXG4gIH1cclxufVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgIDprZXk9XCJmb3JjZVVwZGF0ZUtleVwiXHJcbiAgICAgIDpjbGFzcz1cIntcclxuICAgICAgICAnbWQ6ZmxleCBtZDppdGVtcy1jZW50ZXIgbWQ6c3BhY2UteC0yIG1kOmp1c3RpZnktYmV0d2Vlbic6IGlzTGVmdExhYmVsUG9zaXRpb25cclxuICAgICAgfVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgOmNsYXNzPVwieyAncGItMSc6IHNob3dMYWJlbCAmJiAhaXNMZWZ0TGFiZWxQb3NpdGlvbiB9XCI+XHJcbiAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICA6aWQ9XCJsYWJlbElkXCJcclxuICAgICAgICAgIGNsYXNzPVwiZmxleCB0ZXh0LWJvZHkteHMgdGV4dC1mb3JlZ3JvdW5kIGZvbnQtbWVkaXVtIHBvaW50ZXItZXZlbnRzLW5vbmVcIlxyXG4gICAgICAgICAgOmNsYXNzPVwiW3sgJ3NyLW9ubHknOiAhc2hvd0xhYmVsIH0sIHsgJ2l0ZW1zLWNlbnRlciBnYXAtMSc6IHNob3dPcHRpb25hbCB9XVwiXHJcbiAgICAgICAgICA6Zm9yPVwiYnV0dG9uSWRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGxhYmVsIH19XHJcbiAgICAgICAgICA8ZGl2IHYtaWY9XCJzaG93UmVxdWlyZWRcIiBjbGFzcz1cInRleHQtZGFuZ2VyIHRleHQteHMgb3BhY2l0eS04MFwiPio8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgdi1lbHNlLWlmPVwic2hvd09wdGlvbmFsXCIgY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIGZvbnQtbm9ybWFsXCI+XHJcbiAgICAgICAgICAgIChvcHRpb25hbClcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPHBcclxuICAgICAgICAgIHYtaWY9XCJoZWxwVGlwSWQgJiYgaXNMZWZ0TGFiZWxQb3NpdGlvblwiXHJcbiAgICAgICAgICA6aWQ9XCJoZWxwVGlwSWRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhzXCJcclxuICAgICAgICAgIDpjbGFzcz1cImhlbHBUaXBDbGFzc2VzXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBoZWxwVGlwIH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiB2LXRpcHB5PVwidG9vbHRpcFRleHRcIj5cclxuICAgICAgICA8ZGl2IDpjbGFzcz1cImJ1dHRvbnNXcmFwcGVyQ2xhc3Nlc1wiPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICA6aWQ9XCJidXR0b25JZFwiXHJcbiAgICAgICAgICAgIHJlZj1cImxpc3Rib3hCdXR0b25cIlxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgOmNsYXNzPVwiYnV0dG9uQ2xhc3Nlc1wiXHJcbiAgICAgICAgICAgIDphcmlhLWV4cGFuZGVkPVwiaXNPcGVuXCJcclxuICAgICAgICAgICAgOmFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcclxuICAgICAgICAgICAgQGNsaWNrPVwidG9nZ2xlRHJvcGRvd25cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHctZnVsbFwiPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdHJ1bmNhdGUgZ3JvdyB0ZXh0LWxlZnQgdGV4dC14cyBzbTp0ZXh0LVsxM3B4XVwiXHJcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbaGFzVmFsdWVTZWxlY3RlZCA/ICd0ZXh0LWZvcmVncm91bmQnIDogJ3RleHQtZm9yZWdyb3VuZC0yJ11cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICB2LWlmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIXdyYXBwZWRWYWx1ZSB8fCAoaXNBcnJheSh3cmFwcGVkVmFsdWUpICYmICF3cmFwcGVkVmFsdWUubGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwibm90aGluZy1zZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHBsYWNlaG9sZGVyID8gcGxhY2Vob2xkZXIgOiBsYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3Nsb3Q+XHJcbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cclxuICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cInNvbWV0aGluZy1zZWxlY3RlZFwiIDp2YWx1ZT1cIndyYXBwZWRWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHNpbXBsZURpc3BsYXlUZXh0KHdyYXBwZWRWYWx1ZSkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9zbG90PlxyXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInBvaW50ZXItZXZlbnRzLW5vbmUgc2hyaW5rLTAgbWwtMSBmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTJcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxFeGNsYW1hdGlvbkNpcmNsZUljb25cclxuICAgICAgICAgICAgICAgICAgdi1pZj1cImVycm9yTWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCB0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICB2LWVsc2UtaWY9XCIhc2hvd0xhYmVsICYmIHNob3dSZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC00eGwgdGV4dC1kYW5nZXIgb3BhY2l0eS01MCBoLTQgdy00IGxlYWRpbmctNlwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPENoZXZyb25VcEljb25cclxuICAgICAgICAgICAgICAgICAgdi1pZj1cImlzT3BlblwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxDaGV2cm9uRG93bkljb25cclxuICAgICAgICAgICAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHYtaWY9XCJyZW5kZXJDbGVhckJ1dHRvblwiXHJcbiAgICAgICAgICAgIDpjbGFzcz1cImNsZWFyQnV0dG9uQ2xhc3Nlc1wiXHJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgQGNsaWNrPVwiY2xlYXJWYWx1ZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPFhNYXJrSWNvbiBjbGFzcz1cInctMyBoLTNcIiAvPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPFRyYW5zaXRpb25cclxuICAgICAgICAgICAgdi1pZj1cImlzTW91bnRlZFwiXHJcbiAgICAgICAgICAgIGxlYXZlLWFjdGl2ZS1jbGFzcz1cInRyYW5zaXRpb24gZWFzZS1pbiBkdXJhdGlvbi0xMDBcIlxyXG4gICAgICAgICAgICBsZWF2ZS1mcm9tLWNsYXNzPVwib3BhY2l0eS0xMDBcIlxyXG4gICAgICAgICAgICBsZWF2ZS10by1jbGFzcz1cIm9wYWNpdHktMFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxUZWxlcG9ydCB0bz1cImJvZHlcIiA6ZGlzYWJsZWQ9XCIhbW91bnRNZW51T25Cb2R5XCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgdi1pZj1cImlzT3BlblwiXHJcbiAgICAgICAgICAgICAgICByZWY9XCJtZW51RWxcIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwibGlzdGJveE9wdGlvbnNDbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgIDpzdHlsZT1cImxpc3Rib3hPcHRpb25zU3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxyXG4gICAgICAgICAgICAgICAgOmFyaWEtbGFiZWxsZWRieT1cImxhYmVsSWRcIlxyXG4gICAgICAgICAgICAgICAgQGZvY3VzPVwic2VhcmNoSW5wdXQ/LmZvY3VzKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwhLS0gU2VhcmNoIGlucHV0IHNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgdi1pZj1cImhhc1NlYXJjaFwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBteC0xIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5IGxhYmVsIHRleHQtZm9yZWdyb3VuZFwiPlNlYXJjaDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIHRvcC0wIGJvdHRvbS0wIGxlZnQtMCBmbGV4IGl0ZW1zLWNlbnRlciBwbC0yXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8TWFnbmlmeWluZ0dsYXNzSWNvbiBjbGFzcz1cImgtNCB3LTQgdGV4dC1mb3JlZ3JvdW5kLTJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVmPVwic2VhcmNoSW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdi1tb2RlbD1cInNlYXJjaFZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHktMSBwbC03IHctZnVsbCBiZy1mb3VuZGF0aW9uIHBsYWNlaG9sZGVyOmZvbnQtbm9ybWFsIG5vcm1hbCBwbGFjZWhvbGRlcjp0ZXh0LWZvcmVncm91bmQtMiB0ZXh0LVsxM3B4XSBmb2N1cy12aXNpYmxlOltib3gtc2hhZG93Om5vbmVdIHJvdW5kZWQtbWQgaG92ZXI6Ym9yZGVyLW91dGxpbmUtNSBmb2N1cy12aXNpYmxlOmJvcmRlci1vdXRsaW5lLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgOnBsYWNlaG9sZGVyPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGtleWRvd24uc3RvcFxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIHJlZj1cIm9wdGlvbnNDb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm92ZXJmbG93LWF1dG8gc2ltcGxlLXNjcm9sbGJhciBtYXgtaC02MCB4bDptYXgtaC04MCBnYXAtMSBmbGV4IGZsZXgtY29sXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwiaXNBc3luY1NlYXJjaE1vZGUgJiYgaXNBc3luY0xvYWRpbmdcIiBjbGFzcz1cInB4LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Q29tbW9uTG9hZGluZ0JhciA6bG9hZGluZz1cInRydWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiB2LWVsc2UtaWY9XCJpc0FzeW5jU2VhcmNoTW9kZSAmJiAhY3VycmVudEl0ZW1zLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQtMiB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cIm5vdGhpbmctZm91bmRcIj5Ob3RoaW5nIGZvdW5kPC9zbG90PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCIhaXNBc3luY1NlYXJjaE1vZGUgfHwgIWlzQXN5bmNMb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgdi1mb3I9XCJpdGVtIGluIGZpbmFsSXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgOmtleT1cIml0ZW1LZXkoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdi10aXBweT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZEl0ZW1QcmVkaWNhdGU/LihpdGVtKSA/IGRpc2FibGVkSXRlbVRvb2x0aXAgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgOmFyaWEtc2VsZWN0ZWQ9XCJpc1NlbGVjdGVkKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkSXRlbVByZWRpY2F0ZT8uKGl0ZW0pIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDpjbGFzcz1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0Ym94T3B0aW9uQ2xhc3Nlcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkSXRlbVByZWRpY2F0ZT8uKGl0ZW0pIHx8IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPVwiKGUpID0+IHNlbGVjdEl0ZW0oaXRlbSwgZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJibG9jayB3LWZ1bGwgcHgtMiBweS0xLjUgcm91bmRlZC1tZCB0ZXh0LWxlZnQgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWhpZGVDaGVja21hcmtzID8gJ3ByLTgnIDogJ3ByLTInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFkaXNhYmxlZEl0ZW1QcmVkaWNhdGU/LihpdGVtKSAmJiAhaXNTZWxlY3RlZChpdGVtKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnaG92ZXI6YmctaGlnaGxpZ2h0LTEnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Rm9ybUNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOm5hbWU9XCJgc2VsZWN0LSR7aXRlbUtleShpdGVtKX1gXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2hlY2tlZD1cImlzU2VsZWN0ZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkSXRlbVByZWRpY2F0ZT8uKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6aGlkZS1sYWJlbD1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBjaGFuZ2Uuc3RvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2xvdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJvcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDppdGVtPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOnNlbGVjdGVkPVwiaXNTZWxlY3RlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRJdGVtUHJlZGljYXRlPy4oaXRlbSkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2ltcGxlRGlzcGxheVRleHQoaXRlbSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbG90PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9UZWxlcG9ydD5cclxuICAgICAgICAgIDwvVHJhbnNpdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxwXHJcbiAgICAgIHYtaWY9XCJoZWxwVGlwSWQgJiYgIWlzTGVmdExhYmVsUG9zaXRpb25cIlxyXG4gICAgICA6aWQ9XCJoZWxwVGlwSWRcIlxyXG4gICAgICBjbGFzcz1cIm10LTIgdGV4dC14c1wiXHJcbiAgICAgIDpjbGFzcz1cImhlbHBUaXBDbGFzc2VzXCJcclxuICAgID5cclxuICAgICAge3sgaGVscFRpcCB9fVxyXG4gICAgPC9wPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0XHJcbiAgc2V0dXBcclxuICBsYW5nPVwidHNcIlxyXG4gIGdlbmVyaWM9XCJTaW5nbGVJdGVtIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBzdHJpbmcgfCBudW1iZXJcIlxyXG4+XHJcbmltcG9ydCB7XHJcbiAgQ2hldnJvbkRvd25JY29uLFxyXG4gIENoZXZyb25VcEljb24sXHJcbiAgTWFnbmlmeWluZ0dsYXNzSWNvbixcclxuICBYTWFya0ljb24sXHJcbiAgRXhjbGFtYXRpb25DaXJjbGVJY29uXHJcbn0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjAvc29saWQnXHJcbmltcG9ydCB7IGRlYm91bmNlLCBpc0FycmF5LCBpc09iamVjdExpa2UgfSBmcm9tICcjbG9kYXNoJ1xyXG5pbXBvcnQgdHlwZSB7IENTU1Byb3BlcnRpZXMsIFByb3BUeXBlLCBSZWYgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCBvbk1vdW50ZWQsIHJlZiwgdW5yZWYsIHdhdGNoLCBuZXh0VGljayB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBNYXliZUFzeW5jLCBOdWxsYWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IHVzZUZpZWxkIH0gZnJvbSAndmVlLXZhbGlkYXRlJ1xyXG5pbXBvcnQgdHlwZSB7IFJ1bGVFeHByZXNzaW9uIH0gZnJvbSAndmVlLXZhbGlkYXRlJ1xyXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQnXHJcbmltcG9ydCBDb21tb25Mb2FkaW5nQmFyIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9sb2FkaW5nL0Jhci52dWUnXHJcbmltcG9ydCB7XHJcbiAgdXNlRWxlbWVudEJvdW5kaW5nLFxyXG4gIHVzZU1vdW50ZWQsXHJcbiAgdXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIsXHJcbiAgb25DbGlja091dHNpZGVcclxufSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB0eXBlIHsgTGFiZWxQb3NpdGlvbiB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9mb3JtL2lucHV0J1xyXG5pbXBvcnQgeyBkaXJlY3RpdmUgYXMgdlRpcHB5IH0gZnJvbSAndnVlLXRpcHB5J1xyXG5pbXBvcnQgRm9ybUNoZWNrYm94IGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2Zvcm0vQ2hlY2tib3gudnVlJ1xyXG5cclxudHlwZSBCdXR0b25TdHlsZSA9ICdiYXNlJyB8ICdzaW1wbGUnIHwgJ3RpbnRlZCdcclxudHlwZSBWYWx1ZVR5cGUgPSBTaW5nbGVJdGVtIHwgU2luZ2xlSXRlbVtdIHwgdW5kZWZpbmVkXHJcbnR5cGUgSW5wdXRTaXplID0gJ3NtJyB8ICdiYXNlJyB8ICdsZycgfCAneGwnXHJcblxyXG5jb25zdCBpc09iamVjdExpa2VUeXBlID0gKHY6IHVua25vd24pOiB2IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IGlzT2JqZWN0TGlrZSh2KVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdjogVmFsdWVUeXBlKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICBzaXplOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8SW5wdXRTaXplPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIGl0ZW1zOiB7XHJcbiAgICB0eXBlOiBBcnJheSBhcyBQcm9wVHlwZTxTaW5nbGVJdGVtW10+LFxyXG4gICAgZGVmYXVsdDogKCkgPT4gW11cclxuICB9LFxyXG4gIG1vZGVsVmFsdWU6IHtcclxuICAgIHR5cGU6IFtBcnJheSwgT2JqZWN0LCBTdHJpbmcsIE51bWJlcl0gYXMgUHJvcFR5cGU8VmFsdWVUeXBlPixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBlbmFibGUgdGhlIHNlYXJjaCBiYXIuIFlvdSBtdXN0IGFsc28gc2V0IG9uZSBvZiB0aGUgZm9sbG93aW5nOlxyXG4gICAqICogZmlsdGVyUHJlZGljYXRlIC0gdG8gYWxsb3cgZmlsdGVyaW5nIHBhc3NlZCBpbiBgaXRlbXNgIGJhc2VkIG9uIHNlYXJjaCBiYXJcclxuICAgKiAqIGdldFNlYXJjaFJlc3VsdHMgLSB0byBhbGxvdyBhc3luY2hyb25vdXNseSBsb2FkaW5nIGl0ZW1zIGZyb20gc2VydmVyIChwcm9wcy5pdGVtcyBubyBsb25nZXIgcmVxdWlyZWQgaW4gdGhpcyBjYXNlLFxyXG4gICAqICBidXQgY2FuIGJlIHVzZWQgdG8gcHJlZmlsbCBpbml0aWFsIHZhbHVlcylcclxuICAgKi9cclxuICBzZWFyY2g6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogSWYgc2VhcmNoPXRydWUgYW5kIHRoaXMgaXMgc2V0LCB5b3UgY2FuIHVzZSB0aGlzIHRvIGZpbHRlciBwYXNzZWQgaW4gaXRlbXMgYmFzZWQgb24gd2hhdGV2ZXJcclxuICAgKiB0aGUgdXNlciBlbnRlcnMgaW4gdGhlIHNlYXJjaCBiYXJcclxuICAgKi9cclxuICBmaWx0ZXJQcmVkaWNhdGU6IHtcclxuICAgIHR5cGU6IEZ1bmN0aW9uIGFzIFByb3BUeXBlPFxyXG4gICAgICBPcHRpb25hbDwoaXRlbTogU2luZ2xlSXRlbSwgc2VhcmNoU3RyaW5nOiBzdHJpbmcpID0+IGJvb2xlYW4+XHJcbiAgICA+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBTZXQgdGhpcyB0byBkaXNhYmxlIGNlcnRhaW4gaXRlbXMgaW4gdGhlIGxpc3RcclxuICAgKi9cclxuICBkaXNhYmxlZEl0ZW1QcmVkaWNhdGU6IHtcclxuICAgIHR5cGU6IEZ1bmN0aW9uIGFzIFByb3BUeXBlPE9wdGlvbmFsPChpdGVtOiBTaW5nbGVJdGVtKSA9PiBib29sZWFuPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIElmIHNlYXJjaD10cnVlIGFuZCB0aGlzIGlzIHNldCwgeW91IGNhbiB1c2UgdGhpcyB0byBsb2FkIGRhdGEgYXN5bmNocm9ub3VzbHkgZGVwZW5kaW5nXHJcbiAgICogb24gdGhlIHNlYXJjaCBxdWVyeVxyXG4gICAqL1xyXG4gIGdldFNlYXJjaFJlc3VsdHM6IHtcclxuICAgIHR5cGU6IEZ1bmN0aW9uIGFzIFByb3BUeXBlPFxyXG4gICAgICBPcHRpb25hbDwoc2VhcmNoU3RyaW5nOiBzdHJpbmcpID0+IE1heWJlQXN5bmM8U2luZ2xlSXRlbVtdPj5cclxuICAgID4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIHNlYXJjaFBsYWNlaG9sZGVyOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiAnU2VhcmNoJ1xyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogTGFiZWwgaXMgcmVxdWlyZWQgYXQgdGhlIHZlcnkgbGVhc3QgZm9yIHNjcmVlbi1yZWFkZXJzXHJcbiAgICovXHJcbiAgbGFiZWw6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBPcHRpb25hbCB0ZXh0IHRoYXQgcmVwbGFjZXMgdGhlIGxhYmVsIGFzIHRoZSBwbGFjZWhvbGRlciB3aGVuIHNldC5cclxuICAgKi9cclxuICBwbGFjZWhvbGRlcjoge1xyXG4gICAgdHlwZTogU3RyaW5nXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIGxhYmVsIHZpc3VhbGx5XHJcbiAgICovXHJcbiAgc2hvd0xhYmVsOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIG5hbWU6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBPYmplY3RzIHdpbGwgYmUgY29tcGFyZWQgYnkgdGhlIHZhbHVlcyBpbiB0aGUgc3BlY2lmaWVkIHByb3BcclxuICAgKi9cclxuICBieToge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgfSxcclxuICBkaXNhYmxlZDoge1xyXG4gICAgdHlwZTogQm9vbGVhbiBhcyBQcm9wVHlwZTxPcHRpb25hbDxib29sZWFuPj4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgYnV0dG9uU3R5bGU6IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxPcHRpb25hbDxCdXR0b25TdHlsZT4+LFxyXG4gICAgZGVmYXVsdDogJ2Jhc2UnXHJcbiAgfSxcclxuICBoaWRlQ2hlY2ttYXJrczoge1xyXG4gICAgdHlwZTogQm9vbGVhbiBhcyBQcm9wVHlwZTxPcHRpb25hbDxib29sZWFuPj4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgYWxsb3dVbnNldDoge1xyXG4gICAgdHlwZTogQm9vbGVhbiBhcyBQcm9wVHlwZTxPcHRpb25hbDxib29sZWFuPj4sXHJcbiAgICBkZWZhdWx0OiB0cnVlXHJcbiAgfSxcclxuICBjbGVhcmFibGU6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGlvbiBzdHVmZlxyXG4gICAqL1xyXG4gIHJ1bGVzOiB7XHJcbiAgICB0eXBlOiBbU3RyaW5nLCBPYmplY3QsIEZ1bmN0aW9uLCBBcnJheV0gYXMgUHJvcFR5cGU8XHJcbiAgICAgIE9wdGlvbmFsPFJ1bGVFeHByZXNzaW9uPFZhbHVlVHlwZT4+XHJcbiAgICA+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiB2ZWUtdmFsaWRhdGUgdmFsaWRhdGlvbigpIG9uIGNvbXBvbmVudCBtb3VudFxyXG4gICAqL1xyXG4gIHZhbGlkYXRlT25Nb3VudDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHRyaWdnZXIgdmFsaWRhdGlvbiB3aGVuZXZlciB0aGUgdmFsdWUgY2hhbmdlc1xyXG4gICAqL1xyXG4gIHZhbGlkYXRlT25WYWx1ZVVwZGF0ZToge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaWxsIHJlcGxhY2UgdGhlIGdlbmVyaWMgXCJWYWx1ZVwiIHRleHQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgaW4gZXJyb3IgbWVzc2FnZXNcclxuICAgKi9cclxuICB1c2VMYWJlbEluRXJyb3JzOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgaGVscCB0ZXh0XHJcbiAgICovXHJcbiAgaGVscDoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCBVc2Ugc2l6ZSBhdHRyaWJ1dGUgaW5zdGVhZFxyXG4gICAqL1xyXG4gIGZpeGVkSGVpZ2h0OiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIEJ5IGRlZmF1bHQgY29tcG9uZW50IGhvbGRzIGl0cyBvd24gaW50ZXJuYWwgdmFsdWUgc3RhdGUgc28gdGhhdCBldmVuIGlmIHlvdSBkb24ndCBoYXZlIGl0IHRpZWQgdXAgdG8gYSByZWFsIGBtb2RlbFZhbHVlYCByZWYgc29tZXdoZXJlXHJcbiAgICogaXQga25vd3MgaXRzIGludGVybmFsIHN0YXRlIGFuZCBjYW4gcmVwb3J0IGl0IG9uIGZvcm0gc3VibWl0cy5cclxuICAgKlxyXG4gICAqIElmIHlvdSBzZXQgdGhpcyB0byB0cnVlLCBpdHMgb25seSBnb2luZyB0byByZWx5IG9uIGBtb2RlbFZhbHVlYCBhcyBpdHMgcHJpbWFyeSBzb3VyY2Ugb2YgdHJ1dGggc28gdGhhdCB5b3UgY2FuIHJlamVjdCB1cGRhdGVzIGV0Yy5cclxuICAgKi9cclxuICBmdWxseUNvbnRyb2xWYWx1ZToge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHJlZCBcInJlcXVpcmVkXCIgYXN0ZXJpc2tcclxuICAgKi9cclxuICBzaG93UmVxdWlyZWQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBzaG93IHRoZSBvcHRpb25hbCB0ZXh0XHJcbiAgICovXHJcbiAgc2hvd09wdGlvbmFsOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gbW91bnQgdGhlIG1lbnUgb24gdGhlIGJvZHkgaW5zdGVhZCBvZiBpbnNpZGUgdGhlIGNvbXBvbmVudC4gVXNlZnVsIHdoZW4gc2VsZWN0IGJveCBpcyBtb3VudGVkIHdpdGhpblxyXG4gICAqIGRpYWxvZyB3aW5kb3dzIGFuZCB0aGUgbWVudSBjYXVzZXMgdW5uZWNlc3Nhcnkgb3ZlcmZsb3cuXHJcbiAgICovXHJcbiAgbW91bnRNZW51T25Cb2R5OiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIGxhYmVsSWQ6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgYnV0dG9uSWQ6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogVG9vbHRpcCBzaG93biBvbiBkaXNhYmxlZCBpdGVtc1xyXG4gICAqL1xyXG4gIGRpc2FibGVkSXRlbVRvb2x0aXA6IHtcclxuICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgIHR5cGU6IFN0cmluZ1xyXG4gIH0sXHJcbiAgbGFiZWxQb3NpdGlvbjoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPExhYmVsUG9zaXRpb24+LFxyXG4gICAgZGVmYXVsdDogJ3RvcCdcclxuICB9LFxyXG4gIHRvb2x0aXBUZXh0OiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCB7IHZhbHVlLCBlcnJvck1lc3NhZ2U6IGVycm9yIH0gPSB1c2VGaWVsZDxWYWx1ZVR5cGU+KHByb3BzLm5hbWUsIHByb3BzLnJ1bGVzLCB7XHJcbiAgdmFsaWRhdGVPbk1vdW50OiBwcm9wcy52YWxpZGF0ZU9uTW91bnQsXHJcbiAgdmFsaWRhdGVPblZhbHVlVXBkYXRlOiBwcm9wcy52YWxpZGF0ZU9uVmFsdWVVcGRhdGUsXHJcbiAgaW5pdGlhbFZhbHVlOiBpc0FycmF5KHByb3BzLm1vZGVsVmFsdWUpID8gcHJvcHMubW9kZWxWYWx1ZSA6IFtdXHJcbn0pXHJcblxyXG5jb25zdCBpc01vdW50ZWQgPSB1c2VNb3VudGVkKClcclxuXHJcbmNvbnN0IHNlYXJjaElucHV0ID0gcmVmKG51bGwgYXMgTnVsbGFibGU8SFRNTElucHV0RWxlbWVudD4pXHJcbmNvbnN0IG1lbnVFbCA9IHJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpXHJcbmNvbnN0IGxpc3Rib3hCdXR0b24gPSByZWY8SFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsPihudWxsKVxyXG5jb25zdCBzZWFyY2hWYWx1ZSA9IHJlZignJylcclxuY29uc3QgY3VycmVudEl0ZW1zID0gcmVmKFtdKSBhcyBSZWY8U2luZ2xlSXRlbVtdPlxyXG5jb25zdCBpc0FzeW5jTG9hZGluZyA9IHJlZihmYWxzZSlcclxuY29uc3QgZm9yY2VVcGRhdGVLZXkgPSByZWYoMSlcclxuY29uc3QgaW50ZXJuYWxIZWxwVGlwSWQgPSByZWYobmFub2lkKCkpXHJcbmNvbnN0IGlzT3BlbiA9IHJlZihmYWxzZSlcclxuXHJcbmNvbnN0IGxpc3Rib3hCdXR0b25Cb3VuZGluZyA9IHVzZUVsZW1lbnRCb3VuZGluZyhsaXN0Ym94QnV0dG9uLCB7XHJcbiAgd2luZG93UmVzaXplOiB0cnVlLFxyXG4gIHdpbmRvd1Njcm9sbDogdHJ1ZSxcclxuICBpbW1lZGlhdGU6IHRydWVcclxufSlcclxuXHJcbnVzZUludGVyc2VjdGlvbk9ic2VydmVyKFxyXG4gIGNvbXB1dGVkKCgpID0+IG1lbnVFbC52YWx1ZSksXHJcbiAgKFt7IGlzSW50ZXJzZWN0aW5nIH1dKSA9PiB7XHJcbiAgICBpZiAoaXNJbnRlcnNlY3RpbmcgJiYgcHJvcHMubW91bnRNZW51T25Cb2R5KSB7XHJcbiAgICAgIGxpc3Rib3hCdXR0b25Cb3VuZGluZy51cGRhdGUoKVxyXG4gICAgfVxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgdGl0bGUgPSBjb21wdXRlZCgoKSA9PiB1bnJlZihwcm9wcy5sYWJlbCkgfHwgdW5yZWYocHJvcHMubmFtZSkpXHJcbmNvbnN0IGVycm9yTWVzc2FnZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBiYXNlID0gZXJyb3IudmFsdWVcclxuICBpZiAoIWJhc2UgfHwgIXVucmVmKHByb3BzLnVzZUxhYmVsSW5FcnJvcnMpKSByZXR1cm4gYmFzZVxyXG4gIHJldHVybiBiYXNlLnJlcGxhY2UoJ1ZhbHVlJywgdGl0bGUudmFsdWUpXHJcbn0pXHJcbmNvbnN0IGhlbHBUaXAgPSBjb21wdXRlZCgoKSA9PiBlcnJvck1lc3NhZ2UudmFsdWUgfHwgdW5yZWYocHJvcHMuaGVscCkpXHJcbmNvbnN0IGhhc0hlbHBUaXAgPSBjb21wdXRlZCgoKSA9PiAhIWhlbHBUaXAudmFsdWUpXHJcbmNvbnN0IGhlbHBUaXBJZCA9IGNvbXB1dGVkKCgpID0+XHJcbiAgaGFzSGVscFRpcC52YWx1ZSA/IGAke3VucmVmKHByb3BzLm5hbWUpfS0ke2ludGVybmFsSGVscFRpcElkLnZhbHVlfWAgOiB1bmRlZmluZWRcclxuKVxyXG5jb25zdCBoZWxwVGlwQ2xhc3NlcyA9IGNvbXB1dGVkKCgpOiBzdHJpbmcgPT5cclxuICBlcnJvci52YWx1ZSA/ICd0ZXh0LWRhbmdlcicgOiAndGV4dC1mb3JlZ3JvdW5kLTInXHJcbilcclxuXHJcbmNvbnN0IGlzTGVmdExhYmVsUG9zaXRpb24gPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5sYWJlbFBvc2l0aW9uID09PSAnbGVmdCcpXHJcblxyXG5jb25zdCByZW5kZXJDbGVhckJ1dHRvbiA9IGNvbXB1dGVkKFxyXG4gICgpID0+IHByb3BzLmJ1dHRvblN0eWxlICE9PSAnc2ltcGxlJyAmJiBwcm9wcy5jbGVhcmFibGUgJiYgIXByb3BzLmRpc2FibGVkXHJcbilcclxuXHJcbmNvbnN0IHNpemVDbGFzc2VzID0gY29tcHV0ZWQoKCk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKCFwcm9wcy5zaXplKSByZXR1cm4gJydcclxuXHJcbiAgc3dpdGNoIChwcm9wcy5zaXplKSB7XHJcbiAgICBjYXNlICdzbSc6XHJcbiAgICAgIHJldHVybiAnaC02IHRleHQtYm9keS1zbSdcclxuICAgIGNhc2UgJ2xnJzpcclxuICAgICAgcmV0dXJuICdoLTEwIHRleHQtWzEzcHhdJ1xyXG4gICAgY2FzZSAneGwnOlxyXG4gICAgICByZXR1cm4gJ2gtMTQgdGV4dC1zbSdcclxuICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICdoLTggdGV4dC1ib2R5LXNtJ1xyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGJ1dHRvbnNXcmFwcGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsncmVsYXRpdmUgZmxleCBncm91cCddXHJcblxyXG4gIGlmIChlcnJvci52YWx1ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdob3ZlcjpzaGFkb3cgcm91bmRlZC1tZCcpXHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZGFuZ2VyLWRhcmtlciBmb2N1czpib3JkZXItZGFuZ2VyJylcclxuXHJcbiAgICBpZiAocHJvcHMuYnV0dG9uU3R5bGUgIT09ICdzaW1wbGUnKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyIGJvcmRlci1kYW5nZXInKVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAocHJvcHMuYnV0dG9uU3R5bGUgIT09ICdzaW1wbGUnKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3JvdW5kZWQtbWQgYm9yZGVyJylcclxuICAgIGlmIChpc09wZW4udmFsdWUpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXItb3V0bGluZS00JylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLW91dGxpbmUtMiBob3Zlcjpib3JkZXItb3V0bGluZS01IGZvY3VzOm91dGxpbmUtMCcpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAocHJvcHMuZml4ZWRIZWlnaHQpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnaC04JylcclxuICB9IGVsc2UgaWYgKHNpemVDbGFzc2VzLnZhbHVlPy5sZW5ndGgpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaChzaXplQ2xhc3Nlcy52YWx1ZSlcclxuICB9XHJcblxyXG4gIGlmIChpc0xlZnRMYWJlbFBvc2l0aW9uLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ21kOmJhc2lzLTEvMicpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGNvbW1vbkJ1dHRvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbXVxyXG5cclxuICBpZiAocHJvcHMuYnV0dG9uU3R5bGUgIT09ICdzaW1wbGUnKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goXHJcbiAgICAgIGlzRGlzYWJsZWQudmFsdWUgPyAnYmctZm91bmRhdGlvbi1kaXNhYmxlZCB0ZXh0LWZvcmVncm91bmQtZGlzYWJsZWQnIDogJydcclxuICAgIClcclxuICB9XHJcblxyXG4gIGlmIChpc0Rpc2FibGVkLnZhbHVlKSBjbGFzc1BhcnRzLnB1c2goJ2N1cnNvci1ub3QtYWxsb3dlZCcpXHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgY2xlYXJCdXR0b25DbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHMgPSBbXHJcbiAgICAncmVsYXRpdmUgei1bMV0nLFxyXG4gICAgJ2ZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtY2VudGVyIHNocmluay0wJyxcclxuICAgICdyb3VuZGVkLXItbWQgb3ZlcmZsb3ctaGlkZGVuIHRyYW5zaXRpb24tYWxsJyxcclxuICAgICd0ZXh0LWZvcmVncm91bmQnLFxyXG4gICAgaGFzVmFsdWVTZWxlY3RlZC52YWx1ZSA/IGB3LTYgJHtjb21tb25CdXR0b25DbGFzc2VzLnZhbHVlfWAgOiAndy0wJ1xyXG4gIF1cclxuXHJcbiAgaWYgKCFpc0Rpc2FibGVkLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goXHJcbiAgICAgICdob3ZlcjpiZy1wcmltYXJ5IGhvdmVyOnRleHQtZm9yZWdyb3VuZC1vbi1wcmltYXJ5IGRhcms6dGV4dC1mb3JlZ3JvdW5kLW9uLXByaW1hcnknXHJcbiAgICApXHJcbiAgICBpZiAocHJvcHMuYnV0dG9uU3R5bGUgPT09ICd0aW50ZWQnKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctb3V0bGluZS0zJylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctcHJpbWFyeS1tdXRlZCcpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGJ1dHRvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFtcclxuICAgICdyZWxhdGl2ZSB6LVsyXScsXHJcbiAgICAnbm9ybWFsIHJvdW5kZWQtbWQgY3Vyc29yLXBvaW50ZXIgdHJhbnNpdGlvbiB0cnVuY2F0ZSBmbGV4LTEnLFxyXG4gICAgJ2ZsZXggaXRlbXMtY2VudGVyIGZvY3VzOm91dGxpbmUtb3V0bGluZS00IGZvY3VzOm91dGxpbmUtMScsXHJcbiAgICBjb21tb25CdXR0b25DbGFzc2VzLnZhbHVlXHJcbiAgXVxyXG5cclxuICBpZiAocHJvcHMuYnV0dG9uU3R5bGUgIT09ICdzaW1wbGUnKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3AtMicpXHJcblxyXG4gICAgaWYgKCFpc0Rpc2FibGVkLnZhbHVlKSB7XHJcbiAgICAgIGlmIChwcm9wcy5idXR0b25TdHlsZSA9PT0gJ3RpbnRlZCcpIHtcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goJ2JnLWZvdW5kYXRpb24gdGV4dC1mb3JlZ3JvdW5kJylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goJ2JnLWZvdW5kYXRpb24gdGV4dC1mb3JlZ3JvdW5kJylcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKHJlbmRlckNsZWFyQnV0dG9uLnZhbHVlICYmIGhhc1ZhbHVlU2VsZWN0ZWQudmFsdWUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncm91bmRlZC1yLW5vbmUnKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBoYXNTZWFyY2ggPSBjb21wdXRlZChcclxuICAoKSA9PiAhIShwcm9wcy5zZWFyY2ggJiYgKHByb3BzLmZpbHRlclByZWRpY2F0ZSB8fCBwcm9wcy5nZXRTZWFyY2hSZXN1bHRzKSlcclxuKVxyXG5jb25zdCBpc0FzeW5jU2VhcmNoTW9kZSA9IGNvbXB1dGVkKCgpID0+IGhhc1NlYXJjaC52YWx1ZSAmJiBwcm9wcy5nZXRTZWFyY2hSZXN1bHRzKVxyXG5jb25zdCBpc0Rpc2FibGVkID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcHJvcHMuZGlzYWJsZWQgfHwgKCFwcm9wcy5pdGVtcy5sZW5ndGggJiYgIWlzQXN5bmNTZWFyY2hNb2RlLnZhbHVlKVxyXG4pXHJcblxyXG5jb25zdCB3cmFwcGVkVmFsdWUgPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiB7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YWx1ZS52YWx1ZVxyXG4gICAgcmV0dXJuIGlzQXJyYXkoY3VycmVudFZhbHVlKSA/IGN1cnJlbnRWYWx1ZSA6IFtdXHJcbiAgfSxcclxuICBzZXQ6IChuZXdWYWwpID0+IHtcclxuICAgIGlmICghaXNBcnJheShuZXdWYWwpKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignQXR0ZW1wdGluZyB0byBzZXQgbm9uLWFycmF5IHZhbHVlIGluIHNlbGVjdG9yJylcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHByb3BzLmZ1bGx5Q29udHJvbFZhbHVlKSB7XHJcbiAgICAgIGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgbmV3VmFsKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsdWUudmFsdWUgPSBuZXdWYWxcclxuICAgIH1cclxuXHJcbiAgICBmb3JjZVVwZGF0ZUtleS52YWx1ZSArPSAxXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgaGFzVmFsdWVTZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoaXNBcnJheSh3cmFwcGVkVmFsdWUudmFsdWUpKSByZXR1cm4gd3JhcHBlZFZhbHVlLnZhbHVlLmxlbmd0aCAhPT0gMFxyXG4gIGVsc2UgcmV0dXJuICEhd3JhcHBlZFZhbHVlLnZhbHVlXHJcbn0pXHJcblxyXG5jb25zdCBjbGVhclZhbHVlID0gKCkgPT4ge1xyXG4gIHdyYXBwZWRWYWx1ZS52YWx1ZSA9IFtdXHJcbn1cclxuXHJcbmNvbnN0IGZpbmFsSXRlbXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3Qgc2VhcmNoVmFsID0gc2VhcmNoVmFsdWUudmFsdWVcclxuICBpZiAoIWhhc1NlYXJjaC52YWx1ZSB8fCAhc2VhcmNoVmFsPy5sZW5ndGgpIHJldHVybiBjdXJyZW50SXRlbXMudmFsdWVcclxuXHJcbiAgaWYgKHByb3BzLmZpbHRlclByZWRpY2F0ZSkge1xyXG4gICAgcmV0dXJuIGN1cnJlbnRJdGVtcy52YWx1ZS5maWx0ZXIoXHJcbiAgICAgIChpKSA9PiBwcm9wcy5maWx0ZXJQcmVkaWNhdGU/LihpLCBzZWFyY2hWYWwpIHx8IGZhbHNlXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY3VycmVudEl0ZW1zLnZhbHVlXHJcbn0pXHJcblxyXG5jb25zdCBsaXN0Ym94T3B0aW9uc0NsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFtcclxuICAgICdyb3VuZGVkLW1kIGJnLWZvdW5kYXRpb24gcHktMSBsYWJlbCBsYWJlbC0tbGlnaHQgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTMgc2hhZG93LW1kIG10LTEgJ1xyXG4gIF1cclxuXHJcbiAgaWYgKHByb3BzLm1vdW50TWVudU9uQm9keSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdmaXhlZCB6LTUwJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdhYnNvbHV0ZSB0b3AtWzEwMCVdIHctZnVsbCB6LTQwJylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgbGlzdGJveE9wdGlvbnNTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBzdHlsZTogQ1NTUHJvcGVydGllcyA9IHt9XHJcblxyXG4gIGlmIChwcm9wcy5tb3VudE1lbnVPbkJvZHkpIHtcclxuICAgIGNvbnN0IHRvcCA9IGxpc3Rib3hCdXR0b25Cb3VuZGluZy50b3AudmFsdWVcclxuICAgIGNvbnN0IGxlZnQgPSBsaXN0Ym94QnV0dG9uQm91bmRpbmcubGVmdC52YWx1ZVxyXG4gICAgY29uc3Qgd2lkdGggPSBsaXN0Ym94QnV0dG9uQm91bmRpbmcud2lkdGgudmFsdWVcclxuICAgIGNvbnN0IGhlaWdodCA9IGxpc3Rib3hCdXR0b25Cb3VuZGluZy5oZWlnaHQudmFsdWVcclxuXHJcbiAgICBzdHlsZS50b3AgPSBgJHt0b3AgKyBoZWlnaHR9cHhgXHJcbiAgICBzdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGBcclxuICAgIHN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgXHJcbiAgfVxyXG5cclxuICByZXR1cm4gc3R5bGVcclxufSlcclxuXHJcbmNvbnN0IHNpbXBsZURpc3BsYXlUZXh0ID0gKHY6IFZhbHVlVHlwZSkgPT4gSlNPTi5zdHJpbmdpZnkodilcclxuY29uc3QgaXRlbUtleSA9ICh2OiBTaW5nbGVJdGVtKTogc3RyaW5nIHwgbnVtYmVyID0+IHtcclxuICBpZiAoaXNPYmplY3RMaWtlVHlwZSh2KSkge1xyXG4gICAgcmV0dXJuIHZbcHJvcHMuYnkgfHwgJ2lkJ10gYXMgc3RyaW5nXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB2XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCB0cmlnZ2VyU2VhcmNoID0gYXN5bmMgKCkgPT4ge1xyXG4gIGlmICghaXNBc3luY1NlYXJjaE1vZGUudmFsdWUgfHwgIXByb3BzLmdldFNlYXJjaFJlc3VsdHMpIHJldHVyblxyXG5cclxuICBpc0FzeW5jTG9hZGluZy52YWx1ZSA9IHRydWVcclxuICB0cnkge1xyXG4gICAgY3VycmVudEl0ZW1zLnZhbHVlID0gYXdhaXQgcHJvcHMuZ2V0U2VhcmNoUmVzdWx0cyhzZWFyY2hWYWx1ZS52YWx1ZSlcclxuICB9IGZpbmFsbHkge1xyXG4gICAgaXNBc3luY0xvYWRpbmcudmFsdWUgPSBmYWxzZVxyXG4gIH1cclxufVxyXG5jb25zdCBkZWJvdW5jZWRTZWFyY2ggPSBkZWJvdW5jZSh0cmlnZ2VyU2VhcmNoLCAxMDAwKVxyXG5cclxuY29uc3QgbGlzdGJveE9wdGlvbkNsYXNzZXMgPSAocGFyYW1zOiB7IGRpc2FibGVkOiBib29sZWFuIH0pID0+IHtcclxuICBjb25zdCB7IGRpc2FibGVkIH0gPSBwYXJhbXNcclxuICBjb25zdCBjbGFzc1BhcnRzID0gWydyZWxhdGl2ZSB0cmFuc2l0aW9uIHNlbGVjdC1ub25lIHB4LTInXVxyXG5cclxuICBpZiAoZGlzYWJsZWQpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnb3BhY2l0eS01MCBjdXJzb3Itbm90LWFsbG93ZWQnKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZm9yZWdyb3VuZCBjdXJzb3ItcG9pbnRlcicpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufVxyXG5cclxud2F0Y2goXHJcbiAgKCkgPT4gcHJvcHMuaXRlbXMsXHJcbiAgKG5ld0l0ZW1zKSA9PiB7XHJcbiAgICBjdXJyZW50SXRlbXMudmFsdWUgPSBuZXdJdGVtcy5zbGljZSgpXHJcbiAgfSxcclxuICB7IGltbWVkaWF0ZTogdHJ1ZSB9XHJcbilcclxuXHJcbndhdGNoKHNlYXJjaFZhbHVlLCAoKSA9PiB7XHJcbiAgaWYgKCFpc0FzeW5jU2VhcmNoTW9kZS52YWx1ZSkgcmV0dXJuXHJcbiAgdm9pZCBkZWJvdW5jZWRTZWFyY2goKVxyXG59KVxyXG5cclxub25Nb3VudGVkKCgpID0+IHtcclxuICBpZiAoaXNBc3luY1NlYXJjaE1vZGUudmFsdWUgJiYgIXByb3BzLml0ZW1zLmxlbmd0aCkge1xyXG4gICAgdm9pZCB0cmlnZ2VyU2VhcmNoKClcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCB0b2dnbGVEcm9wZG93biA9ICgpID0+IHtcclxuICBpZiAoIWlzRGlzYWJsZWQudmFsdWUpIHtcclxuICAgIGlzT3Blbi52YWx1ZSA9ICFpc09wZW4udmFsdWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGlzU2VsZWN0ZWQgPSAoaXRlbTogU2luZ2xlSXRlbSkgPT4ge1xyXG4gIHJldHVybiB3cmFwcGVkVmFsdWUudmFsdWUuc29tZSgodikgPT4gaXRlbUtleSh2KSA9PT0gaXRlbUtleShpdGVtKSlcclxufVxyXG5cclxuY29uc3Qgb3B0aW9uc0NvbnRhaW5lciA9IHJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpXHJcbmNvbnN0IHNjcm9sbFBvc2l0aW9uID0gcmVmKDApXHJcblxyXG5jb25zdCBzZWxlY3RJdGVtID0gKGl0ZW06IFNpbmdsZUl0ZW0sIGV2ZW50PzogRXZlbnQpID0+IHtcclxuICBpZiAocHJvcHMuZGlzYWJsZWRJdGVtUHJlZGljYXRlPy4oaXRlbSkpIHJldHVyblxyXG4gIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKVxyXG5cclxuICBzY3JvbGxQb3NpdGlvbi52YWx1ZSA9IG9wdGlvbnNDb250YWluZXIudmFsdWU/LnNjcm9sbFRvcCB8fCAwXHJcblxyXG4gIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHdyYXBwZWRWYWx1ZS52YWx1ZVxyXG4gIGNvbnN0IGl0ZW1FeGlzdHMgPSBjdXJyZW50VmFsdWUuc29tZSgodikgPT4gaXRlbUtleSh2KSA9PT0gaXRlbUtleShpdGVtKSlcclxuXHJcbiAgd3JhcHBlZFZhbHVlLnZhbHVlID0gaXRlbUV4aXN0c1xyXG4gICAgPyBjdXJyZW50VmFsdWUuZmlsdGVyKCh2KSA9PiBpdGVtS2V5KHYpICE9PSBpdGVtS2V5KGl0ZW0pKVxyXG4gICAgOiBbLi4uY3VycmVudFZhbHVlLCBpdGVtXVxyXG5cclxuICB2b2lkIG5leHRUaWNrKCgpID0+IHtcclxuICAgIGlmIChvcHRpb25zQ29udGFpbmVyLnZhbHVlKSB7XHJcbiAgICAgIG9wdGlvbnNDb250YWluZXIudmFsdWUuc2Nyb2xsVG9wID0gc2Nyb2xsUG9zaXRpb24udmFsdWVcclxuICAgIH1cclxuICB9KVxyXG59XHJcblxyXG5vbkNsaWNrT3V0c2lkZShcclxuICBtZW51RWwsXHJcbiAgKCkgPT4ge1xyXG4gICAgaWYgKGlzT3Blbi52YWx1ZSkge1xyXG4gICAgICBpc09wZW4udmFsdWUgPSBmYWxzZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAge1xyXG4gICAgaWdub3JlOiBbbGlzdGJveEJ1dHRvbl1cclxuICB9XHJcbilcclxuXHJcbmRlZmluZUV4cG9zZSh7IHRyaWdnZXJTZWFyY2ggfSlcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yXCI+XHJcbiAgICA8SGVhZGxlc3NTd2l0Y2hcclxuICAgICAgOmlkPVwiaWQgfHwgbmFtZVwiXHJcbiAgICAgIHYtbW9kZWw9XCJlbmFibGVkXCJcclxuICAgICAgOmNsYXNzPVwic3dpdGNoQ2xhc3Nlc1wiXHJcbiAgICAgIDpuYW1lPVwibmFtZVwiXHJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgID5cclxuICAgICAgPHNwYW4gOmNsYXNzPVwic2xpZGVyQ2xhc3Nlc1wiPjwvc3Bhbj5cclxuICAgIDwvSGVhZGxlc3NTd2l0Y2g+XHJcbiAgICA8bGFiZWwgOmZvcj1cImlkIHx8IG5hbWVcIiA6Y2xhc3M9XCJsYWJlbENsYXNzZXNcIj5cclxuICAgICAgPHNwYW4+e3sgdGl0bGUgfX08L3NwYW4+XHJcbiAgICA8L2xhYmVsPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgU3dpdGNoIGFzIEhlYWRsZXNzU3dpdGNoIH0gZnJvbSAnQGhlYWRsZXNzdWkvdnVlJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIHNob3dMYWJlbD86IGJvb2xlYW5cclxuICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgbGFiZWw/OiBzdHJpbmdcclxuICAgIGRpc2FibGVkPzogYm9vbGVhblxyXG4gICAgaWQ/OiBzdHJpbmdcclxuICB9PigpLFxyXG4gIHtcclxuICAgIHNob3dMYWJlbDogdHJ1ZVxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgZW5hYmxlZCA9IGRlZmluZU1vZGVsPGJvb2xlYW4+KClcclxuXHJcbmNvbnN0IHRpdGxlID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMubGFiZWwgfHwgcHJvcHMubmFtZSlcclxuXHJcbmNvbnN0IGxhYmVsQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gWydibG9jayBsYWJlbC1saWdodCddXHJcblxyXG4gIGlmICghcHJvcHMuc2hvd0xhYmVsKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3NyLW9ubHknKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBzd2l0Y2hDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHMgPSBbXHJcbiAgICAncmVsYXRpdmUgaW5saW5lLWZsZXggZmxleC1zaHJpbmstMCBoLVsxOHB4XSB3LVszMHB4XSByb3VuZGVkLWZ1bGwnLFxyXG4gICAgJ3RyYW5zaXRpb24tY29sb3JzIGVhc2UtaW4tb3V0IGR1cmF0aW9uLTIwMCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZm9jdXMtdmlzaWJsZTpyaW5nLXByaW1hcnknLFxyXG4gICAgJ2N1cnNvci1wb2ludGVyIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTQwJ1xyXG4gIF1cclxuXHJcbiAgaWYgKGVuYWJsZWQudmFsdWUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnYmctcHJpbWFyeScpXHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnYmctZm9yZWdyb3VuZC0zJylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3Qgc2xpZGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ3BvaW50ZXItZXZlbnRzLW5vbmUgaW5saW5lLWJsb2NrIGgtMyB3LTMgcm91bmRlZC1mdWxsIG10LVszcHhdIG1sLVszcHhdJyxcclxuICAgICdyaW5nLTAgdHJhbnNpdGlvbiBlYXNlLWluLW91dCBkdXJhdGlvbi0yMDAgYmctZm9yZWdyb3VuZC1vbi1wcmltYXJ5J1xyXG4gIF1cclxuXHJcbiAgaWYgKGVuYWJsZWQudmFsdWUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgndHJhbnNsYXRlLXgtWzEycHhdJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0cmFuc2xhdGUteC0wJylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG48L3NjcmlwdD5cclxuIiwiPCEtLSBlc2xpbnQtZGlzYWJsZSB2dWVqcy1hY2Nlc3NpYmlsaXR5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAtLT5cclxuPHRlbXBsYXRlPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwicmVsYXRpdmUgZ3JvdXAgYmctZm91bmRhdGlvbiBib3JkZXIgYm9yZGVyLW91dGxpbmUtMiBwLTIgcm91bmRlZC1sZyBwci0yMFwiXHJcbiAgPlxyXG4gICAgPGRpdlxyXG4gICAgICB2LWlmPVwiaXNNdWx0aWxpbmVcIlxyXG4gICAgICBjbGFzcz1cInJlbGF0aXZlIHotMTAgdGV4dC1ib2R5LTJ4cyBzZWxlY3QtYWxsIHRleHQtZm9yZWdyb3VuZCBmb250LW1vbm8gYnJlYWstYWxsIHAtMiBwbC0zIG1heC1oLVs0LjhyZW1dIHNpbXBsZS1zY3JvbGxiYXIgb3ZlcmZsb3cteS1hdXRvXCJcclxuICAgICAgQGtleXByZXNzPVwia2V5Ym9hcmRDbGljayhzZWxlY3RBbGxUZXh0KVwiXHJcbiAgICA+XHJcbiAgICAgIHt7IHZhbHVlIH19XHJcbiAgICA8L2Rpdj5cclxuICAgIDxGb3JtVGV4dElucHV0XHJcbiAgICAgIHYtZWxzZVxyXG4gICAgICBjb2xvcj1cInRyYW5zcGFyZW50XCJcclxuICAgICAgbmFtZT1cImNvbnRlbnRJbnB1dFwiXHJcbiAgICAgIHJlYWRvbmx5XHJcbiAgICAgIDptb2RlbC12YWx1ZT1cInZhbHVlXCJcclxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB6LTEwICF0ZXh0LWJvZHktMnhzIHNtOiF0ZXh0LWJvZHkteHMgdGV4dC1mb3JlZ3JvdW5kIGZvbnQtbW9ubyBzZWxlY3QtYWxsIHRydW5jYXRlXCJcclxuICAgIC8+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgdG9wLTMgcmlnaHQtMiBmbGV4IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgIDpjb2xvcj1cImN0YUNvbG9yXCJcclxuICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgIDppY29uLWxlZnQ9XCJcclxuICAgICAgICAgIGlzSWNvbkJ1dHRvblxyXG4gICAgICAgICAgICA/IGNvcGllZFxyXG4gICAgICAgICAgICAgID8gQ2xpcGJvYXJkRG9jdW1lbnRDaGVja0ljb25cclxuICAgICAgICAgICAgICA6IENsaXBib2FyZERvY3VtZW50SWNvblxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgOmhpZGUtdGV4dD1cImlzSWNvbkJ1dHRvblwiXHJcbiAgICAgICAgQGNsaWNrPVwiaGFuZGxlQ29weVwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBjb3BpZWQgPyAnQ29waWVkJyA6IGN0YVRleHQgfX1cclxuICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyB1c2VDbGlwYm9hcmQgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7XHJcbiAgQ2xpcGJvYXJkRG9jdW1lbnRJY29uLFxyXG4gIENsaXBib2FyZERvY3VtZW50Q2hlY2tJY29uXHJcbn0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHsgRm9ybVRleHRJbnB1dCwgRm9ybUJ1dHRvbiB9IGZyb20gJ35+L3NyYy9saWInXHJcbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHsga2V5Ym9hcmRDbGljayB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2dsb2JhbC9hY2Nlc3NpYmlsaXR5J1xyXG5pbXBvcnQgdHlwZSB7IEZvcm1CdXR0b25TdHlsZSB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2Zvcm0vYnV0dG9uJ1xyXG5cclxudHlwZSBQcm9wcyA9IHtcclxuICB2YWx1ZTogc3RyaW5nXHJcbiAgaXNNdWx0aWxpbmU/OiBib29sZWFuXHJcbiAgaXNJY29uQnV0dG9uPzogYm9vbGVhblxyXG4gIHJvd3M/OiBudW1iZXJcclxuICBjdGFDb2xvcj86IEZvcm1CdXR0b25TdHlsZVxyXG4gIGN0YVRleHQ/OiBzdHJpbmdcclxufVxyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoZGVmaW5lUHJvcHM8UHJvcHM+KCksIHtcclxuICBpc011bHRpbGluZTogZmFsc2UsXHJcbiAgY3RhQ29sb3I6ICdvdXRsaW5lJyxcclxuICBjdGFUZXh0OiAnQ29weSdcclxufSlcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7IChlOiAnY29weScsIHZhbDogc3RyaW5nKTogdm9pZCB9PigpXHJcblxyXG5jb25zdCB7IGNvcHkgfSA9IHVzZUNsaXBib2FyZCh7IGxlZ2FjeTogdHJ1ZSB9KVxyXG5cclxuY29uc3QgY29waWVkID0gcmVmKGZhbHNlKVxyXG5cclxuY29uc3QgaGFuZGxlQ29weSA9IGFzeW5jICgpID0+IHtcclxuICBpZiAocHJvcHMudmFsdWUpIHtcclxuICAgIGF3YWl0IGNvcHkocHJvcHMudmFsdWUpXHJcbiAgICBjb3BpZWQudmFsdWUgPSB0cnVlXHJcbiAgICBlbWl0KCdjb3B5JywgcHJvcHMudmFsdWUpXHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvcGllZC52YWx1ZSA9IGZhbHNlXHJcbiAgICB9LCAyMDAwKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3Qgc2VsZWN0QWxsVGV4dCA9IChldmVudDogRXZlbnQpID0+IHtcclxuICBjb25zdCB0ZXh0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudFxyXG5cclxuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcclxuICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcclxuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyh0ZXh0RWxlbWVudClcclxuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxyXG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxyXG4gIH1cclxufVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIj5cclxuICAgICAgPGRpdiB2LWZvcj1cIihfLCBpbmRleCkgaW4gZGlnaXRDb3VudFwiIDprZXk9XCJpbmRleFwiIGNsYXNzPVwidy0xMFwiPlxyXG4gICAgICAgIDxGb3JtVGV4dElucHV0XHJcbiAgICAgICAgICByZWY9XCJpbnB1dFJlZnNcIlxyXG4gICAgICAgICAgdi1tb2RlbD1cImRpZ2l0c1tpbmRleF1cIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LWNlbnRlciAhdGV4dC1bMTRweF0gcHktNiAhcHgtMiBmb250LXNlbWlib2xkXCJcclxuICAgICAgICAgIGNvbG9yPVwiZm91bmRhdGlvblwiXHJcbiAgICAgICAgICA6bmFtZT1cImBjb2RlLSR7aW5kZXh9YFwiXHJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgIDplcnJvcj1cImludGVybmFsRXJyb3JcIlxyXG4gICAgICAgICAgOmN1c3RvbS1lcnJvci1tZXNzYWdlPVwiaW50ZXJuYWxFcnJvciA/ICcgJyA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICBtYXhsZW5ndGg9XCIxXCJcclxuICAgICAgICAgIHNpemU9XCJsZ1wiXHJcbiAgICAgICAgICBAaW5wdXQ9XCJvbklucHV0KGluZGV4KVwiXHJcbiAgICAgICAgICBAa2V5ZG93bj1cIm9uS2V5RG93bihpbmRleCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICBAcGFzdGU9XCJvblBhc3RlXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgb25Nb3VudGVkLCByZWYsIHdhdGNoIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyBGb3JtVGV4dElucHV0IH0gZnJvbSAnfn4vc3JjL2xpYidcclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIG1vZGVsVmFsdWU6IHN0cmluZ1xyXG4gICAgZGlnaXRDb3VudD86IG51bWJlclxyXG4gICAgZGlzYWJsZWQ/OiBib29sZWFuXHJcbiAgICBlcnJvcj86IGJvb2xlYW5cclxuICAgIGNsZWFyRXJyb3JPbkVkaXQ/OiBib29sZWFuXHJcbiAgfT4oKSxcclxuICB7XHJcbiAgICBkaWdpdENvdW50OiA2LFxyXG4gICAgY2xlYXJFcnJvck9uRWRpdDogdHJ1ZVxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFsndXBkYXRlOm1vZGVsVmFsdWUnLCAnY29tcGxldGUnXSlcclxuXHJcbmNvbnN0IGlucHV0UmVmcyA9IHJlZjxBcnJheTxIVE1MSW5wdXRFbGVtZW50IHwgbnVsbD4+KFtdKVxyXG5jb25zdCBkaWdpdHMgPSByZWY8c3RyaW5nW10+KG5ldyBBcnJheShwcm9wcy5kaWdpdENvdW50KS5maWxsKCcnKSBhcyBzdHJpbmdbXSlcclxuY29uc3QgaW50ZXJuYWxFcnJvciA9IHJlZihwcm9wcy5lcnJvcilcclxuXHJcbmNvbnN0IG9uSW5wdXQgPSAoaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gIGlmIChwcm9wcy5jbGVhckVycm9yT25FZGl0KSB7XHJcbiAgICBpbnRlcm5hbEVycm9yLnZhbHVlID0gZmFsc2VcclxuICB9XHJcblxyXG4gIGRpZ2l0cy52YWx1ZVtpbmRleF0gPSBkaWdpdHMudmFsdWVbaW5kZXhdLnJlcGxhY2UoL1teMC05XS9nLCAnJylcclxuXHJcbiAgLy8gTW92ZSB0byBuZXh0IGlucHV0IGlmIGF2YWlsYWJsZVxyXG4gIGlmIChkaWdpdHMudmFsdWVbaW5kZXhdICYmIGluZGV4IDwgcHJvcHMuZGlnaXRDb3VudCAtIDEpIHtcclxuICAgIGlucHV0UmVmcy52YWx1ZVtpbmRleCArIDFdPy5mb2N1cygpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBvbktleURvd24gPSAoaW5kZXg6IG51bWJlciwgZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyAmJiAhZGlnaXRzLnZhbHVlW2luZGV4XSAmJiBpbmRleCA+IDApIHtcclxuICAgIGlmIChwcm9wcy5jbGVhckVycm9yT25FZGl0KSB7XHJcbiAgICAgIGludGVybmFsRXJyb3IudmFsdWUgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgLy8gTW92ZSB0byBwcmV2aW91cyBpbnB1dCBvbiBiYWNrc3BhY2UgaWYgY3VycmVudCBpcyBlbXB0eVxyXG4gICAgZGlnaXRzLnZhbHVlW2luZGV4IC0gMV0gPSAnJ1xyXG4gICAgaW5wdXRSZWZzLnZhbHVlW2luZGV4IC0gMV0/LmZvY3VzKClcclxuICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgJiYgaW5kZXggPiAwKSB7XHJcbiAgICAvLyBNb3ZlIHRvIHByZXZpb3VzIGlucHV0IG9uIGxlZnQgYXJyb3dcclxuICAgIGlucHV0UmVmcy52YWx1ZVtpbmRleCAtIDFdPy5mb2N1cygpXHJcbiAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyAmJiBpbmRleCA8IHByb3BzLmRpZ2l0Q291bnQgLSAxKSB7XHJcbiAgICAvLyBNb3ZlIHRvIG5leHQgaW5wdXQgb24gcmlnaHQgYXJyb3dcclxuICAgIGlucHV0UmVmcy52YWx1ZVtpbmRleCArIDFdPy5mb2N1cygpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBvblBhc3RlID0gKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xyXG4gIGlmIChwcm9wcy5jbGVhckVycm9yT25FZGl0KSB7XHJcbiAgICBpbnRlcm5hbEVycm9yLnZhbHVlID0gZmFsc2VcclxuICB9XHJcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gIGNvbnN0IHBhc3RlZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCd0ZXh0JylcclxuICBpZiAoIXBhc3RlZERhdGEpIHJldHVyblxyXG5cclxuICBjb25zdCBudW1iZXJzID0gcGFzdGVkRGF0YS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNwbGl0KCcnKVxyXG5cclxuICBkaWdpdHMudmFsdWUgPSBbXHJcbiAgICAuLi5udW1iZXJzLnNsaWNlKDAsIHByb3BzLmRpZ2l0Q291bnQpLFxyXG4gICAgLi4uKEFycmF5KE1hdGgubWF4KDAsIHByb3BzLmRpZ2l0Q291bnQgLSBudW1iZXJzLmxlbmd0aCkpLmZpbGwoJycpIGFzIHN0cmluZ1tdKVxyXG4gIF1cclxuXHJcbiAgLy8gRm9jdXMgdGhlIG5leHQgZW1wdHkgaW5wdXQgb3IgdGhlIGxhc3QgaW5wdXRcclxuICBjb25zdCBuZXh0RW1wdHlJbmRleCA9IGRpZ2l0cy52YWx1ZS5maW5kSW5kZXgoKGQpID0+ICFkKVxyXG4gIGlmIChuZXh0RW1wdHlJbmRleCAhPT0gLTEpIHtcclxuICAgIGlucHV0UmVmcy52YWx1ZVtuZXh0RW1wdHlJbmRleF0/LmZvY3VzKClcclxuICB9IGVsc2Uge1xyXG4gICAgaW5wdXRSZWZzLnZhbHVlW3Byb3BzLmRpZ2l0Q291bnQgLSAxXT8uZm9jdXMoKVxyXG4gIH1cclxufVxyXG5cclxuLy8gRm9jdXMgZmlyc3QgaW5wdXQgb24gbW91bnRcclxub25Nb3VudGVkKCgpID0+IHtcclxuICBpZiAoaW5wdXRSZWZzLnZhbHVlWzBdKSB7XHJcbiAgICBpbnB1dFJlZnMudmFsdWVbMF0uZm9jdXMoKVxyXG4gIH1cclxufSlcclxuXHJcbi8vIFdhdGNoIGV4dGVybmFsIGVycm9yIHByb3AgY2hhbmdlc1xyXG53YXRjaChcclxuICAoKSA9PiBwcm9wcy5lcnJvcixcclxuICAobmV3VmFsdWUpID0+IHtcclxuICAgIGludGVybmFsRXJyb3IudmFsdWUgPSBuZXdWYWx1ZVxyXG4gIH1cclxuKVxyXG5cclxuLy8gV2F0Y2ggZm9yIGV4dGVybmFsIHZhbHVlIGNoYW5nZXNcclxud2F0Y2goXHJcbiAgKCkgPT4gcHJvcHMubW9kZWxWYWx1ZSxcclxuICAobmV3VmFsdWUpID0+IHtcclxuICAgIGlmIChuZXdWYWx1ZSkge1xyXG4gICAgICBjb25zdCBuZXdEaWdpdHMgPSBuZXdWYWx1ZS5zcGxpdCgnJylcclxuICAgICAgZGlnaXRzLnZhbHVlID0gW1xyXG4gICAgICAgIC4uLm5ld0RpZ2l0cyxcclxuICAgICAgICAuLi4oQXJyYXkocHJvcHMuZGlnaXRDb3VudCAtIG5ld0RpZ2l0cy5sZW5ndGgpLmZpbGwoJycpIGFzIHN0cmluZ1tdKVxyXG4gICAgICBdXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkaWdpdHMudmFsdWUgPSBBcnJheShwcm9wcy5kaWdpdENvdW50KS5maWxsKCcnKSBhcyBzdHJpbmdbXVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgeyBpbW1lZGlhdGU6IHRydWUgfVxyXG4pXHJcblxyXG4vLyBXYXRjaCBmb3IgY29tcGxldGlvblxyXG53YXRjaChcclxuICBkaWdpdHMsXHJcbiAgKG5ld0RpZ2l0cykgPT4ge1xyXG4gICAgY29uc3QgdmFsdWUgPSBuZXdEaWdpdHMuam9pbignJylcclxuICAgIGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsdWUpXHJcblxyXG4gICAgLy8gRW1pdCBjb21wbGV0ZSB3aGVuIGFsbCBkaWdpdHMgYXJlIGZpbGxlZFxyXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gcHJvcHMuZGlnaXRDb3VudCkge1xyXG4gICAgICBlbWl0KCdjb21wbGV0ZScsIHZhbHVlKVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgeyBkZWVwOiB0cnVlIH1cclxuKVxyXG48L3NjcmlwdD5cclxuIiwiaW1wb3J0IHsgZ2V0Q2xpZW50T3BlcmF0aW5nU3lzdGVtLCBPcGVyYXRpbmdTeXN0ZW0gfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcblxyXG5leHBvcnQgZW51bSBNb2RpZmllcktleXMge1xyXG4gIEN0cmxPckNtZCA9ICdjbWQtb3ItY3RybCcsXHJcbiAgQWx0T3JPcHQgPSAnYWx0LW9yLW9wdCcsXHJcbiAgU2hpZnQgPSAnc2hpZnQnXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjbGllbnRPcyA9IGdldENsaWVudE9wZXJhdGluZ1N5c3RlbSgpXHJcblxyXG5leHBvcnQgY29uc3QgTW9kaWZpZXJLZXlUaXRsZXM6IFJlY29yZDxNb2RpZmllcktleXMsIHN0cmluZz4gPSB7XHJcbiAgW01vZGlmaWVyS2V5cy5DdHJsT3JDbWRdOiBjbGllbnRPcyA9PT0gT3BlcmF0aW5nU3lzdGVtLk1hYyA/ICfijJgnIDogJ+KMgycsXHJcbiAgW01vZGlmaWVyS2V5cy5BbHRPck9wdF06IGNsaWVudE9zID09PSBPcGVyYXRpbmdTeXN0ZW0uTWFjID8gJ+KMpScgOiAnQWx0JyxcclxuICBbTW9kaWZpZXJLZXlzLlNoaWZ0XTogJ+KHpydcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleWJvYXJkU2hvcnRjdXRUaXRsZShrZXlzOiBBcnJheTxzdHJpbmcgfCBNb2RpZmllcktleXM+KSB7XHJcbiAgY29uc3QgaXNNb2RpZmllcktleSA9IChrOiBzdHJpbmcpOiBrIGlzIE1vZGlmaWVyS2V5cyA9PlxyXG4gICAgKE9iamVjdC52YWx1ZXMoTW9kaWZpZXJLZXlzKSBhcyBzdHJpbmdbXSkuaW5jbHVkZXMoaylcclxuXHJcbiAgcmV0dXJuIGtleXMubWFwKCh2KSA9PiAoaXNNb2RpZmllcktleSh2KSA/IE1vZGlmaWVyS2V5VGl0bGVzW3ZdIDogdikpLmpvaW4oJycpXHJcbn1cclxuIiwiaW1wb3J0IHsgdXNlTWFnaWNLZXlzLCB3aGVuZXZlciB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHsgT3BlcmF0aW5nU3lzdGVtIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBjbGllbnRPcywgTW9kaWZpZXJLZXlzIH0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvZm9ybS9pbnB1dCdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnXHJcblxyXG5leHBvcnQgdHlwZSBMYWJlbFBvc2l0aW9uID0gJ3RvcCcgfCAnbGVmdCcgfCAncmlnaHQnXHJcblxyXG4vKipcclxuICogb25LZXlEb3duIHdyYXBwZXIgdGhhdCBhbHNvIGNoZWNrcyBmb3IgbW9kaWZpZXIga2V5cyBiZWluZyBwcmVzc2VkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gb25LZXlib2FyZFNob3J0Y3V0KFxyXG4gIG1vZGlmaWVyczogTW9kaWZpZXJLZXlzW10sXHJcbiAga2V5OiBzdHJpbmcsXHJcbiAgY2FsbGJhY2s6ICgpID0+IHZvaWRcclxuKSB7XHJcbiAgY29uc3Qga2V5cyA9IHVzZU1hZ2ljS2V5cygpXHJcblxyXG4gIGNvbnN0IG1vZGlmaWVyS2V5cyA9IG1vZGlmaWVycy5tYXAoKG1vZGlmaWVyKSA9PiB7XHJcbiAgICBzd2l0Y2ggKG1vZGlmaWVyKSB7XHJcbiAgICAgIGNhc2UgTW9kaWZpZXJLZXlzLkN0cmxPckNtZDpcclxuICAgICAgICByZXR1cm4gY2xpZW50T3MgPT09IE9wZXJhdGluZ1N5c3RlbS5NYWMgPyAnTWV0YScgOiAnQ29udHJvbCdcclxuICAgICAgY2FzZSBNb2RpZmllcktleXMuQWx0T3JPcHQ6XHJcbiAgICAgICAgcmV0dXJuICdBbHQnXHJcbiAgICAgIGNhc2UgTW9kaWZpZXJLZXlzLlNoaWZ0OlxyXG4gICAgICAgIHJldHVybiAnU2hpZnQnXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICcnXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgY29uc3Qga2V5Q29tYmluYXRpb24gPSBgJHttb2RpZmllcktleXMuam9pbignKycpfSske2tleX1gXHJcblxyXG4gIHdoZW5ldmVyKGtleXNba2V5Q29tYmluYXRpb25dLCBjYWxsYmFjaylcclxufVxyXG5cclxuLyoqXHJcbiAqIFRvIHN1cHBvcnQgZ3JvdXAgY2hlY2tib3hlcywgdGhlIGNoZWNrYm94IHYtbW9kZWwgQVBJIGlzIGEgYml0IGNvbmZ1c2luZzogVGhlIHZhbHVlIGlzIGB0cnVlYCBvciBgdW5kZWZpbmVkYFxyXG4gKiBub3QgYHRydWVgIG9yIGBmYWxzZWAuXHJcbiAqXHJcbiAqIFRvIHNpbXBsaWZ5IHdvcmtpbmcgd2l0aCBzaW5nbGUgY2hlY2tib3hlcywgeW91IGNhbiB1c2UgdGhlIG1vZGVsIHJldHVybmVkIGZyb20gdGhpcyBjb21wb3NhYmxlXHJcbiAqIGFzIHRoZSBtb2RlbCBhbmQgYGlzQ2hlY2tlZGAgYXMgYSBoZWxwZnVsIHdyYXBwZXIgdGhhdCBhbGxvd3MgeW91IHRvIGRlYWwgd2l0aCBib29sZWFuIHZhbHVlcyBvbmx5XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXNlRm9ybUNoZWNrYm94TW9kZWwoXHJcbiAgb3B0aW9ucz86IFBhcnRpYWw8e1xyXG4gICAgbW9kZWw6IFJlZjx0cnVlIHwgdW5kZWZpbmVkPlxyXG4gIH0+XHJcbikge1xyXG4gIGNvbnN0IG1vZGVsID0gb3B0aW9ucz8ubW9kZWwgfHwgcmVmPHRydWUgfCB1bmRlZmluZWQ+KClcclxuICBjb25zdCBpc0NoZWNrZWQgPSBjb21wdXRlZCh7XHJcbiAgICBnZXQ6ICgpID0+ICEhbW9kZWwudmFsdWUsXHJcbiAgICBzZXQ6IChuZXdWYWwpID0+IChtb2RlbC52YWx1ZSA9IG5ld1ZhbCA/IHRydWUgOiB1bmRlZmluZWQpXHJcbiAgfSlcclxuXHJcbiAgcmV0dXJuIHsgbW9kZWwsIGlzQ2hlY2tlZCB9XHJcbn1cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxUcmFuc2l0aW9uUm9vdCBhcz1cInRlbXBsYXRlXCIgOnNob3c9XCJvcGVuXCI+XHJcbiAgICA8RGlhbG9nIGFzPVwiZGl2XCIgY2xhc3M9XCJyZWxhdGl2ZSB6LTUwXCIgb3BlbiBAY2xvc2U9XCJvbkNsb3NlXCI+XHJcbiAgICAgIDxUcmFuc2l0aW9uQ2hpbGRcclxuICAgICAgICBhcz1cInRlbXBsYXRlXCJcclxuICAgICAgICBlbnRlcj1cImVhc2Utb3V0IGR1cmF0aW9uLTMwMFwiXHJcbiAgICAgICAgZW50ZXItZnJvbT1cIm9wYWNpdHktMFwiXHJcbiAgICAgICAgZW50ZXItdG89XCJvcGFjaXR5LTEwMFwiXHJcbiAgICAgICAgbGVhdmU9XCJlYXNlLWluIGR1cmF0aW9uLTQwMFwiXHJcbiAgICAgICAgbGVhdmUtZnJvbT1cIm9wYWNpdHktMTAwXCJcclxuICAgICAgICBsZWF2ZS10bz1cIm9wYWNpdHktMFwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZpeGVkIHRvcC0wIGxlZnQtMCB3LWZ1bGwgaC1mdWxsIGJhY2tkcm9wLWJsdXIteHMgYmctYmxhY2svNjAgZGFyazpiZy1uZXV0cmFsLTkwMC82MCB0cmFuc2l0aW9uLW9wYWNpdHlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvVHJhbnNpdGlvbkNoaWxkPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZml4ZWQgdG9wLTAgbGVmdC0wIHotMTAgaC1zY3JlZW4gIWgtWzEwMGR2aF0gdy1zY3JlZW5cIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggbWQ6anVzdGlmeS1jZW50ZXIgaC1mdWxsIHctZnVsbCBtZDpwLTZcIlxyXG4gICAgICAgICAgOmNsYXNzPVwiW1xyXG4gICAgICAgICAgICBmdWxsc2NyZWVuID09PSAnbm9uZScgfHwgZnVsbHNjcmVlbiA9PT0gJ2Rlc2t0b3AnXHJcbiAgICAgICAgICAgICAgPyAncC00IGl0ZW1zLWNlbnRlcidcclxuICAgICAgICAgICAgICA6ICdpdGVtcy1lbmQgbWQ6aXRlbXMtY2VudGVyJ1xyXG4gICAgICAgICAgXVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPFRyYW5zaXRpb25DaGlsZFxyXG4gICAgICAgICAgICBhcz1cInRlbXBsYXRlXCJcclxuICAgICAgICAgICAgZW50ZXI9XCJlYXNlLW91dCBkdXJhdGlvbi01MDAwXCJcclxuICAgICAgICAgICAgOmVudGVyLWZyb209XCJgbWQ6b3BhY2l0eS0wICR7XHJcbiAgICAgICAgICAgICAgZnVsbHNjcmVlbiA9PT0gJ21vYmlsZScgfHwgZnVsbHNjcmVlbiA9PT0gJ2FsbCdcclxuICAgICAgICAgICAgICAgID8gJ3RyYW5zbGF0ZS15LVsxMDAlXSdcclxuICAgICAgICAgICAgICAgIDogJ3RyYW5zbGF0ZS15LTQnXHJcbiAgICAgICAgICAgIH0gbWQ6dHJhbnNsYXRlLXktNGBcIlxyXG4gICAgICAgICAgICBlbnRlci10bz1cIm1kOm9wYWNpdHktMTAwIHRyYW5zbGF0ZS15LTBcIlxyXG4gICAgICAgICAgICBsZWF2ZT1cImVhc2UtaW4gZHVyYXRpb24tNTAwMFwiXHJcbiAgICAgICAgICAgIGxlYXZlLWZyb209XCJtZDpvcGFjaXR5LTEwMCB0cmFuc2xhdGUteS0wXCJcclxuICAgICAgICAgICAgOmxlYXZlLXRvPVwiYG1kOm9wYWNpdHktMCAke1xyXG4gICAgICAgICAgICAgIGZ1bGxzY3JlZW4gPT09ICdtb2JpbGUnIHx8IGZ1bGxzY3JlZW4gPT09ICdhbGwnXHJcbiAgICAgICAgICAgICAgICA/ICd0cmFuc2xhdGUteS1bMTAwJV0nXHJcbiAgICAgICAgICAgICAgICA6ICd0cmFuc2xhdGUteS00J1xyXG4gICAgICAgICAgICB9IG1kOnRyYW5zbGF0ZS15LTRgXCJcclxuICAgICAgICAgICAgQGFmdGVyLWxlYXZlPVwib25GdWxseUNsb3NlZFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxEaWFsb2dQYW5lbFxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cImRpYWxvZ1BhbmVsQ2xhc3Nlc1wiXHJcbiAgICAgICAgICAgICAgZGlhbG9nLXBhbmVsLWNsYXNzZXNcclxuICAgICAgICAgICAgICA6YXM9XCJpc0Zvcm0gPyAnZm9ybScgOiAnZGl2J1wiXHJcbiAgICAgICAgICAgICAgQHN1Ym1pdC5wcmV2ZW50PVwib25Gb3JtU3VibWl0XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIHYtaWY9XCJoYXNUaXRsZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlci1iIGJvcmRlci1vdXRsaW5lLTNcIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwic2Nyb2xsZWRGcm9tVG9wICYmICdyZWxhdGl2ZSB6LTIwIHNoYWRvdy1sZydcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IHJvdW5kZWQtdC1sZyBzaHJpbmstMCBtaW4taC1bMnJlbV0gc206bWluLWgtWzNyZW1dIHB4LTYgcHktNCB0cnVuY2F0ZSB0ZXh0LWhlYWRpbmctc21cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHItMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Q2hldnJvbkxlZnRJY29uXHJcbiAgICAgICAgICAgICAgICAgICAgICB2LWlmPVwic2hvd0JhY2tCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTUgaC01IC1tbC0xIG1yLTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPVwiJGVtaXQoJ2JhY2snKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyB0aXRsZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS1cclxuICAgICAgICAgICAgICAgIER1ZSB0byBob3cgZm9ybXMgd29yaywgaWYgdGhlcmUncyBubyBvdGhlciBzdWJtaXQgYnV0dG9uLCBvbiBmb3JtIHN1Ym1pc3Npb24gdGhlIGZpcnN0IGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgd2lsbCBiZSBjbGlja2VkLiBUaGlzIGlzIGEgd29ya2Fyb3VuZCB0byBwcmV2ZW50IHRoZSBjbG9zZSBidXR0b24gZnJvbSBiZWluZyB0aGF0IGZpcnN0IGJ1dHRvbi5cclxuICAgICAgICAgICAgICAgIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NzYzOTExLzMxOTQ1NzdcclxuICAgICAgICAgICAgICAtLT5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaGlkZGVuXCIgdHlwZT1cImJ1dHRvblwiIC8+XHJcblxyXG4gICAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgICB2LWlmPVwiIWhpZGVDbG9zZXJcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgei0yMCB0b3AtNCByaWdodC01IHNocmluay0wICF3LTYgIWgtNiAhcC0wIHRleHQtZm9yZWdyb3VuZC0yXCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cImNsb3NlckNsYXNzZXNcIlxyXG4gICAgICAgICAgICAgICAgQGNsaWNrPVwib3BlbiA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8WE1hcmtJY29uIGNsYXNzPVwiaC02IHctNlwiIC8+XHJcbiAgICAgICAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIHJlZj1cInNsb3RDb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgdi1tZW1vPVwiaXNDbG9zaW5nID8gW21lbW9LZXldIDogWyhtZW1vS2V5ID0gTWF0aC5yYW5kb20oKSldXCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cInNsb3RDb250YWluZXJDbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgIEBzY3JvbGw9XCJvblNjcm9sbFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHNsb3Q+UHV0IHlvdXIgY29udGVudCBoZXJlITwvc2xvdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICB2LWlmPVwiaGFzQnV0dG9uc1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIHotNTAgZmxleCBqdXN0aWZ5LWVuZCBweC02IHBiLTYgc3BhY2UteC0yIHNocmluay0wIGJnLWZvdW5kYXRpb24tcGFnZVwiXHJcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7XHJcbiAgICAgICAgICAgICAgICAgICdzaGFkb3ctdCBwdC02JzogIXNjcm9sbGVkVG9Cb3R0b20sXHJcbiAgICAgICAgICAgICAgICAgIFtidXR0b25zV3JhcHBlckNsYXNzZXMgfHwgJyddOiB0cnVlXHJcbiAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cImJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgIHYtZm9yPVwiKGJ1dHRvbiwgaW5kZXgpIGluIGJ1dHRvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIDprZXk9XCJidXR0b24uaWQgfHwgaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIHYtdGlwcHk9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5wcm9wcz8uZGlzYWJsZWQgfHwgYnV0dG9uLmRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYnV0dG9uLmRpc2FibGVkTWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgdi1iaW5kPVwiYnV0dG9uLnByb3BzIHx8IHt9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImJ1dHRvbi5wcm9wcz8uZGlzYWJsZWQgfHwgYnV0dG9uLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDpzdWJtaXQ9XCJidXR0b24ucHJvcHM/LnN1Ym1pdCB8fCBidXR0b24uc3VibWl0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz1cIigkZXZlbnQpID0+IGJ1dHRvbi5vbkNsaWNrPy4oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgYnV0dG9uLnRleHQgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJidXR0b25zXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvRGlhbG9nUGFuZWw+XHJcbiAgICAgICAgICA8L1RyYW5zaXRpb25DaGlsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L0RpYWxvZz5cclxuICA8L1RyYW5zaXRpb25Sb290PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBEaWFsb2csIERpYWxvZ1BhbmVsLCBUcmFuc2l0aW9uQ2hpbGQsIFRyYW5zaXRpb25Sb290IH0gZnJvbSAnQGhlYWRsZXNzdWkvdnVlJ1xyXG5pbXBvcnQgeyBGb3JtQnV0dG9uLCB0eXBlIExheW91dERpYWxvZ0J1dHRvbiB9IGZyb20gJ35+L3NyYy9saWInXHJcbmltcG9ydCB7IFhNYXJrSWNvbiwgQ2hldnJvbkxlZnRJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHsgaXNDbGllbnQsIHVzZVJlc2l6ZU9ic2VydmVyLCB0eXBlIFJlc2l6ZU9ic2VydmVyQ2FsbGJhY2sgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCBvblVubW91bnRlZCwgcmVmLCB1c2VTbG90cywgd2F0Y2gsIHR5cGUgU2V0dXBDb250ZXh0IH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyB0aHJvdHRsZSB9IGZyb20gJyNsb2Rhc2gnXHJcbmltcG9ydCB7IGRpcmVjdGl2ZSBhcyB2VGlwcHkgfSBmcm9tICd2dWUtdGlwcHknXHJcblxyXG50eXBlIE1heFdpZHRoVmFsdWUgPSAneHMnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJ1xyXG50eXBlIEZ1bGxzY3JlZW5WYWx1ZXMgPSAnbW9iaWxlJyB8ICdkZXNrdG9wJyB8ICdhbGwnIHwgJ25vbmUnXHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAndXBkYXRlOm9wZW4nLCB2OiBib29sZWFuKTogdm9pZFxyXG4gIChlOiAnZnVsbHktY2xvc2VkJyk6IHZvaWRcclxuICAoZTogJ2JhY2snKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhcclxuICBkZWZpbmVQcm9wczx7XHJcbiAgICBvcGVuOiBib29sZWFuXHJcbiAgICBtYXhXaWR0aD86IE1heFdpZHRoVmFsdWVcclxuICAgIGZ1bGxzY3JlZW4/OiBGdWxsc2NyZWVuVmFsdWVzXHJcbiAgICBoaWRlQ2xvc2VyPzogYm9vbGVhblxyXG4gICAgc2hvd0JhY2tCdXR0b24/OiBib29sZWFuXHJcbiAgICAvKipcclxuICAgICAqIFByZXZlbnQgbW9kYWwgZnJvbSBjbG9zaW5nIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG91dHNpZGUgb2YgdGhlIG1vZGFsIG9yIHByZXNzZXMgRXNjXHJcbiAgICAgKi9cclxuICAgIHByZXZlbnRDbG9zZU9uQ2xpY2tPdXRzaWRlPzogYm9vbGVhblxyXG4gICAgdGl0bGU/OiBzdHJpbmdcclxuICAgIGJ1dHRvbnM/OiBBcnJheTxMYXlvdXREaWFsb2dCdXR0b24+XHJcbiAgICAvKipcclxuICAgICAqIEV4dHJhIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIGJ1dHRvbiBjb250YWluZXIuXHJcbiAgICAgKi9cclxuICAgIGJ1dHRvbnNXcmFwcGVyQ2xhc3Nlcz86IHN0cmluZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBzZXQsIHRoZSBtb2RhbCB3aWxsIGJlIHdyYXBwZWQgaW4gYSBmb3JtIGVsZW1lbnQgYW5kIHRoZSBgb25TdWJtaXRgIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSB1c2VyIHN1Ym1pdHMgdGhlIGZvcm1cclxuICAgICAqL1xyXG4gICAgb25TdWJtaXQ/OiAoZTogU3VibWl0RXZlbnQpID0+IHZvaWRcclxuICAgIGlzVHJhbnNwYXJlbnQ/OiBib29sZWFuXHJcbiAgICBjbG9zZXJDbGFzc2VzPzogc3RyaW5nXHJcbiAgICBoaWRlVGl0bGU/OiBib29sZWFuXHJcbiAgICBoaWRlQnV0dG9ucz86IGJvb2xlYW5cclxuICB9PigpLFxyXG4gIHtcclxuICAgIGZ1bGxzY3JlZW46ICdtb2JpbGUnXHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCBzbG90czogU2V0dXBDb250ZXh0WydzbG90cyddID0gdXNlU2xvdHMoKVxyXG5cclxuY29uc3QgaXNDbG9zaW5nID0gcmVmKGZhbHNlKVxyXG5jb25zdCBtZW1vS2V5ID0gcmVmKE1hdGgucmFuZG9tKCkpXHJcblxyXG5jb25zdCBzY3JvbGxlZEZyb21Ub3AgPSByZWYoZmFsc2UpXHJcbmNvbnN0IHNjcm9sbGVkVG9Cb3R0b20gPSByZWYodHJ1ZSlcclxuY29uc3Qgc2xvdENvbnRhaW5lciA9IHJlZjxIVE1MRWxlbWVudCB8IG51bGw+KG51bGwpXHJcblxyXG51c2VSZXNpemVPYnNlcnZlcihcclxuICBzbG90Q29udGFpbmVyLFxyXG4gIHRocm90dGxlPFJlc2l6ZU9ic2VydmVyQ2FsbGJhY2s+KCgpID0+IHtcclxuICAgIC8vIFRyaWdnZXJpbmcgb25TY3JvbGwgb24gc2l6ZSBjaGFuZ2UgdG9vIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHN0dWNrIHdpdGggc2hhZG93c1xyXG4gICAgLy8gZXZlbiB0aG8gdGhlIG5ldyBjb250ZW50IGlzIG5vdCBzY3JvbGxhYmxlXHJcbiAgICBvblNjcm9sbCh7IHRhcmdldDogc2xvdENvbnRhaW5lci52YWx1ZSB9KVxyXG4gIH0sIDYwKVxyXG4pXHJcblxyXG5jb25zdCBpc0Zvcm0gPSBjb21wdXRlZCgoKSA9PiAhIXByb3BzLm9uU3VibWl0KVxyXG5jb25zdCBoYXNCdXR0b25zID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gKHByb3BzLmJ1dHRvbnMgfHwgc2xvdHMuYnV0dG9ucykgJiYgIXByb3BzLmhpZGVCdXR0b25zXHJcbilcclxuY29uc3QgaGFzVGl0bGUgPSBjb21wdXRlZCgoKSA9PiAhcHJvcHMuaGlkZVRpdGxlICYmICghIXByb3BzLnRpdGxlIHx8ICEhc2xvdHMuaGVhZGVyKSlcclxuXHJcbmNvbnN0IG9wZW4gPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiBwcm9wcy5vcGVuLFxyXG4gIHNldDogKG5ld1ZhbCkgPT4gZW1pdCgndXBkYXRlOm9wZW4nLCBuZXdWYWwpXHJcbn0pXHJcblxyXG5jb25zdCBtYXhXaWR0aFdlaWdodCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBzd2l0Y2ggKHByb3BzLm1heFdpZHRoKSB7XHJcbiAgICBjYXNlICd4cyc6XHJcbiAgICAgIHJldHVybiAwXHJcbiAgICBjYXNlICdzbSc6XHJcbiAgICAgIHJldHVybiAxXHJcbiAgICBjYXNlICdtZCc6XHJcbiAgICAgIHJldHVybiAyXHJcbiAgICBjYXNlICdsZyc6XHJcbiAgICAgIHJldHVybiAzXHJcbiAgICBjYXNlICd4bCc6XHJcbiAgICAgIHJldHVybiA0XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gMTAwMDBcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCB3aWR0aENsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbJ3ctZnVsbCcsICdzbTp3LWZ1bGwnXVxyXG5cclxuICBpZiAoIWlzRnVsbHNjcmVlbkRlc2t0b3AudmFsdWUpIHtcclxuICAgIGlmIChtYXhXaWR0aFdlaWdodC52YWx1ZSA9PT0gMCkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ21kOm1heC13LXNtJylcclxuICAgIH1cclxuICAgIGlmIChtYXhXaWR0aFdlaWdodC52YWx1ZSA+PSAxKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnbWQ6bWF4LXctbGcnKVxyXG4gICAgfVxyXG4gICAgaWYgKG1heFdpZHRoV2VpZ2h0LnZhbHVlID49IDIpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdtZDptYXgtdy0yeGwnKVxyXG4gICAgfVxyXG4gICAgaWYgKG1heFdpZHRoV2VpZ2h0LnZhbHVlID49IDMpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdsZzptYXgtdy0zeGwnKVxyXG4gICAgfVxyXG4gICAgaWYgKG1heFdpZHRoV2VpZ2h0LnZhbHVlID49IDQpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd4bDptYXgtdy02eGwnKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdtZDptYXgtdy0yeGwnKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBpc0Z1bGxzY3JlZW5EZXNrdG9wID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcHJvcHMuZnVsbHNjcmVlbiA9PT0gJ2Rlc2t0b3AnIHx8IHByb3BzLmZ1bGxzY3JlZW4gPT09ICdhbGwnXHJcbilcclxuXHJcbmNvbnN0IGRpYWxvZ1BhbmVsQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFtcclxuICAgICd0cmFuc2Zvcm0gbWQ6cm91bmRlZC14bCB0ZXh0LWZvcmVncm91bmQgb3ZlcmZsb3ctaGlkZGVuIHRyYW5zaXRpb24tYWxsIHRleHQtbGVmdCBmbGV4IGZsZXgtY29sIG1kOmgtYXV0bydcclxuICBdXHJcblxyXG4gIGlmICghcHJvcHMuaXNUcmFuc3BhcmVudCkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdiZy1mb3VuZGF0aW9uLXBhZ2Ugc2hhZG93LXhsIGJvcmRlciBib3JkZXItb3V0bGluZS0yJylcclxuICB9XHJcblxyXG4gIGlmIChpc0Z1bGxzY3JlZW5EZXNrdG9wLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ21kOmgtZnVsbCcpXHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnbWQ6bWF4LWgtWzkwdmhdJylcclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy5mdWxsc2NyZWVuID09PSAnbW9iaWxlJyB8fCBwcm9wcy5mdWxsc2NyZWVuID09PSAnYWxsJykge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdtYXgtbWQ6aC1bOTh2aF0gbWF4LW1kOiFoLVs5OGR2aF0nKVxyXG4gIH1cclxuXHJcbiAgaWYgKHByb3BzLmZ1bGxzY3JlZW4gPT09ICdub25lJyB8fCBwcm9wcy5mdWxsc2NyZWVuID09PSAnZGVza3RvcCcpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncm91bmRlZC1sZyBtYXgtaC1bOTB2aF0nKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3JvdW5kZWQtdC1sZycpXHJcbiAgfVxyXG5cclxuICBjbGFzc1BhcnRzLnB1c2god2lkdGhDbGFzc2VzLnZhbHVlKVxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3Qgc2xvdENvbnRhaW5lckNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbJ2ZsZXgtMSBzaW1wbGUtc2Nyb2xsYmFyIG92ZXJmbG93LXktYXV0byB0ZXh0LWJvZHkteHMnXVxyXG5cclxuICBpZiAoIXByb3BzLmlzVHJhbnNwYXJlbnQpIHtcclxuICAgIGlmIChoYXNUaXRsZS52YWx1ZSkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3B4LTYgcHktNCcpXHJcbiAgICAgIGlmIChpc0Z1bGxzY3JlZW5EZXNrdG9wLnZhbHVlKSB7XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdtZDpwLTAnKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKCFpc0Z1bGxzY3JlZW5EZXNrdG9wLnZhbHVlKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgncHgtNiBweS00JylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3Qgb25DbG9zZSA9ICgpID0+IHtcclxuICBpZiAocHJvcHMucHJldmVudENsb3NlT25DbGlja091dHNpZGUpIHJldHVyblxyXG4gIG9wZW4udmFsdWUgPSBmYWxzZVxyXG59XHJcblxyXG5jb25zdCBvbkZ1bGx5Q2xvc2VkID0gKCkgPT4ge1xyXG4gIGVtaXQoJ2Z1bGx5LWNsb3NlZCcpXHJcbiAgaXNDbG9zaW5nLnZhbHVlID0gZmFsc2VcclxufVxyXG5cclxuY29uc3Qgb25Gb3JtU3VibWl0ID0gKGU6IFN1Ym1pdEV2ZW50KSA9PiB7XHJcbiAgcHJvcHMub25TdWJtaXQ/LihlKVxyXG59XHJcblxyXG5jb25zdCBvblNjcm9sbCA9IHRocm90dGxlKChlOiB7IHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsIH0pID0+IHtcclxuICBpZiAoIWUudGFyZ2V0KSByZXR1cm5cclxuXHJcbiAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnRcclxuICBjb25zdCB7IHNjcm9sbFRvcCwgb2Zmc2V0SGVpZ2h0LCBzY3JvbGxIZWlnaHQgfSA9IHRhcmdldFxyXG4gIHNjcm9sbGVkRnJvbVRvcC52YWx1ZSA9IHNjcm9sbFRvcCA+IDBcclxuICBzY3JvbGxlZFRvQm90dG9tLnZhbHVlID0gc2Nyb2xsVG9wICsgb2Zmc2V0SGVpZ2h0ID49IHNjcm9sbEhlaWdodFxyXG59LCA2MClcclxuXHJcbndhdGNoKFxyXG4gIG9wZW4sXHJcbiAgKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgPT4ge1xyXG4gICAgaWYgKGlzQ2xpZW50KSB7XHJcbiAgICAgIC8vIFRvZ2dsZSAnZGlhbG9nLW9wZW4nIGNsYXNzIG9uIDxodG1sPiB0byBwcmV2ZW50IHNjcm9sbCBqdW1waW5nIGFuZCBkaXNhYmxlIGJhY2tncm91bmQgc2Nyb2xsLlxyXG4gICAgICAvLyBUaGlzIG1haW50YWlucyB1c2VyIHNjcm9sbCBwb3NpdGlvbiB3aGVuIEhlYWRsZXNzIFVJIGRpYWxvZ3MgYXJlIGFjdGl2YXRlZC5cclxuICAgICAgY29uc3QgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxyXG4gICAgICBpZiAobmV3VmFsdWUpIHtcclxuICAgICAgICBodG1sLmNsYXNzTGlzdC5hZGQoJ2RpYWxvZy1vcGVuJylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBodG1sLmNsYXNzTGlzdC5yZW1vdmUoJ2RpYWxvZy1vcGVuJylcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghbmV3VmFsdWUgJiYgb2xkVmFsdWUpIHtcclxuICAgICAgaXNDbG9zaW5nLnZhbHVlID0gdHJ1ZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgeyBmbHVzaDogJ3N5bmMnIH1cclxuKVxyXG5cclxuLy8gQ2xlYW4gdXAgd2hlbiB0aGUgY29tcG9uZW50IHVubW91bnRzXHJcbm9uVW5tb3VudGVkKCgpID0+IHtcclxuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZGlhbG9nLW9wZW4nKVxyXG59KVxyXG48L3NjcmlwdD5cclxuPHN0eWxlPlxyXG5odG1sLmRpYWxvZy1vcGVuIHtcclxuICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50O1xyXG59XHJcbmh0bWwuZGlhbG9nLW9wZW4gYm9keSB7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgYm9yZGVyLXByaW1hcnktbXV0ZWRcIlxyXG4gICAgOmNsYXNzPVwie1xyXG4gICAgICAnYm9yZGVyLXQnOiBib3JkZXJULFxyXG4gICAgICAnYm9yZGVyLWInOiBib3JkZXJCLFxyXG4gICAgICAncmVsYXRpdmUgei0xMCc6IGlzRXhwYW5kZWRcclxuICAgIH1cIlxyXG4gID5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgc3BhY2UteC00IHNtOnNwYWNlLXgtOCBweS0yLjUgcHgtMlwiXHJcbiAgICAgIDpjbGFzcz1cImJhY2tncm91bmRDbGFzc1wiXHJcbiAgICAgIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgIHYtb249XCJcclxuICAgICAgICAhYnV0dG9uICYmICFhbHdheXNPcGVuXHJcbiAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICBjbGljazogdG9nZ2xlRXhwYW5zaW9uLFxyXG4gICAgICAgICAgICAgIGtleXByZXNzOiBrZXlib2FyZENsaWNrKHRvZ2dsZUV4cGFuc2lvbilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgOiB7fVxyXG4gICAgICBcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWhlYWRpbmctc20gZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xIHNtOnNwYWNlLXgtMiBzZWxlY3Qtbm9uZVwiXHJcbiAgICAgICAgOmNsYXNzPVwidGl0bGVDbGFzc2VzXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgdi1pZj1cIiRzbG90cy5pY29uIHx8IGljb25cIiBjbGFzcz1cImgtNCB3LTQgZW1wdHk6aC0wIGVtcHR5OnctMFwiPlxyXG4gICAgICAgICAgPHNsb3Qgdi1pZj1cIiRzbG90cy5pY29uXCIgbmFtZT1cImljb25cIiAvPlxyXG4gICAgICAgICAgPENvbXBvbmVudCA6aXM9XCJpY29uXCIgdi1pZj1cImljb25cIiBjbGFzcz1cInctZnVsbCBoLWZ1bGxcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxzcGFuPnt7IHRpdGxlIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8Q2hldnJvbkRvd25JY29uXHJcbiAgICAgICAgICB2LWlmPVwiIWJ1dHRvbiAmJiAhYWx3YXlzT3BlblwiXHJcbiAgICAgICAgICBjbGFzcz1cInctNCBoLTQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tNDAwXCJcclxuICAgICAgICAgIDpjbGFzcz1cImlzRXhwYW5kZWQgJiYgJ3JvdGF0ZS0xODAnXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICB2LWlmPVwiYnV0dG9uXCJcclxuICAgICAgICAgIDp0bz1cImJ1dHRvbi5leHBhbmRDb250ZW50ID8gdW5kZWZpbmVkIDogYnV0dG9uLnRvXCJcclxuICAgICAgICAgIDpjb2xvcj1cImJ1dHRvbi5leHBhbmRDb250ZW50ICYmIGlzRXhwYW5kZWQgPyAnb3V0bGluZScgOiBidXR0b24uY29sb3JcIlxyXG4gICAgICAgICAgOmljb24tcmlnaHQ9XCJcclxuICAgICAgICAgICAgYnV0dG9uLmV4cGFuZENvbnRlbnQgJiYgaXNFeHBhbmRlZCA/IHVuZGVmaW5lZCA6IGJ1dHRvbi5pY29uUmlnaHRcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgQGNsaWNrPVwiYnV0dG9uPy5vbkNsaWNrXCJcclxuICAgICAgICAgIHYtb249XCJidXR0b24/LmV4cGFuZENvbnRlbnQgPyB7IGNsaWNrOiB0b2dnbGVFeHBhbnNpb24gfSA6IHt9XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBidXR0b24uZXhwYW5kQ29udGVudCAmJiBpc0V4cGFuZGVkID8gJ0NhbmNlbCcgOiBidXR0b24udGV4dCB9fVxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJ0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAgb3ZlcmZsb3ctaGlkZGVuXCJcclxuICAgICAgOmNsYXNzPVwiW1xyXG4gICAgICAgIGFsbG93T3ZlcmZsb3cgJiYgaXNFeHBhbmRlZCA/ICchb3ZlcmZsb3ctdmlzaWJsZScgOiAnJyxcclxuICAgICAgICBpc0V4cGFuZGVkID8gJ21iLTIgbXQtMScgOiAnJyxcclxuICAgICAgICAhYnV0dG9uICYmICFhbHdheXNPcGVuID8gJ2N1cnNvci1wb2ludGVyIGhvdmVyOmJnLWZvdW5kYXRpb24tcGFnZScgOiAnJ1xyXG4gICAgICBdXCJcclxuICAgICAgOnN0eWxlPVwiXHJcbiAgICAgICAgYWx3YXlzT3BlblxyXG4gICAgICAgICAgPyAnbWF4LWhlaWdodDogbm9uZTsnXHJcbiAgICAgICAgICA6IGBtYXgtaGVpZ2h0OiAke2lzRXhwYW5kZWQgPyBjb250ZW50SGVpZ2h0ICsgJ3B4JyA6ICcwcHgnfWBcclxuICAgICAgXCJcclxuICAgID5cclxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJwcm9wcy5sYXp5TG9hZFwiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHYtaWY9XCJpc0V4cGFuZGVkIHx8IHByb3BzLmFsd2F5c09wZW5cIlxyXG4gICAgICAgICAgcmVmPVwiY29udGVudFwiXHJcbiAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtbWQgdGV4dC1zbSBwYi0zIHB4LTIgbXQtMVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNsb3Q+UGFuZWwgY29udGVudHM8L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcblxyXG4gICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgIDxkaXYgcmVmPVwiY29udGVudFwiIGNsYXNzPVwicm91bmRlZC1tZCB0ZXh0LXNtIHBiLTMgcHgtMiBtdC0xXCI+XHJcbiAgICAgICAgICA8c2xvdD5QYW5lbCBjb250ZW50czwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgcmVmLCBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBQcm9wVHlwZSwgUmVmIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyBDaGV2cm9uRG93bkljb24gfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yNC9vdXRsaW5lJ1xyXG5pbXBvcnQgeyBGb3JtQnV0dG9uIH0gZnJvbSAnfn4vc3JjL2xpYidcclxuaW1wb3J0IHsga2V5Ym9hcmRDbGljayB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2dsb2JhbC9hY2Nlc3NpYmlsaXR5J1xyXG5pbXBvcnQgdHlwZSB7IFByb3BBbnlDb21wb25lbnQgfSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vY29tcG9uZW50cydcclxuaW1wb3J0IHR5cGUgeyBGb3JtQnV0dG9uU3R5bGUgfSBmcm9tICd+fi9zcmMvaGVscGVycy9mb3JtL2J1dHRvbidcclxuaW1wb3J0IHsgdXNlRWxlbWVudFNpemUgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcblxyXG50eXBlIFRpdGxlQ29sb3IgPSAnZGVmYXVsdCcgfCAnZGFuZ2VyJyB8ICd3YXJuaW5nJyB8ICdzdWNjZXNzJyB8ICdzZWNvbmRhcnknIHwgJ2luZm8nXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICB0aXRsZTogU3RyaW5nLFxyXG4gIGJvcmRlclQ6IEJvb2xlYW4sXHJcbiAgYm9yZGVyQjogQm9vbGVhbixcclxuICBhbGxvd092ZXJmbG93OiBCb29sZWFuLFxyXG4gIHRpdGxlQ29sb3I6IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyAoKSA9PiBUaXRsZUNvbG9yLFxyXG4gICAgZGVmYXVsdDogJ2RlZmF1bHQnXHJcbiAgfSxcclxuICBidXR0b246IE9iamVjdCBhcyAoKSA9PlxyXG4gICAgfCB7XHJcbiAgICAgICAgZXhwYW5kQ29udGVudD86IGJvb2xlYW5cclxuICAgICAgICB0ZXh0OiBzdHJpbmdcclxuICAgICAgICB0bz86IHN0cmluZ1xyXG4gICAgICAgIGNvbG9yOiBGb3JtQnV0dG9uU3R5bGVcclxuICAgICAgICBpY29uUmlnaHQ/OiBQcm9wQW55Q29tcG9uZW50IHwgdW5kZWZpbmVkXHJcbiAgICAgICAgb25DbGljaz86ICgpID0+IHZvaWRcclxuICAgICAgfVxyXG4gICAgfCB1bmRlZmluZWQsXHJcbiAgYWx3YXlzT3BlbjogQm9vbGVhbixcclxuICBsYXp5TG9hZDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBpY29uOiB7XHJcbiAgICB0eXBlOiBbRnVuY3Rpb24sIE9iamVjdF0gYXMgUHJvcFR5cGU8UHJvcEFueUNvbXBvbmVudD4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBjb250ZW50OiBSZWY8SFRNTEVsZW1lbnQgfCBudWxsPiA9IHJlZihudWxsKVxyXG5jb25zdCB7IGhlaWdodDogc2Nyb2xsSGVpZ2h0IH0gPSB1c2VFbGVtZW50U2l6ZShjb250ZW50KVxyXG5cclxuY29uc3QgY29udGVudEhlaWdodCA9IGNvbXB1dGVkKCgpID0+IChzY3JvbGxIZWlnaHQudmFsdWUgfHwgMCkgKyA2NClcclxuY29uc3QgaXNFeHBhbmRlZCA9IGRlZmluZU1vZGVsPGJvb2xlYW4+KCdvcGVuJywgeyByZXF1aXJlZDogZmFsc2UgfSlcclxuXHJcbmNvbnN0IGJhY2tncm91bmRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc2VzID0gW11cclxuXHJcbiAgaWYgKCFwcm9wcy5idXR0b24gJiYgIXByb3BzLmFsd2F5c09wZW4pIHtcclxuICAgIGNsYXNzZXMucHVzaCgnY3Vyc29yLXBvaW50ZXInLCAnaG92ZXI6YmctZm91bmRhdGlvbi1wYWdlLTInKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzZXNcclxufSlcclxuXHJcbmNvbnN0IHRpdGxlQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBzd2l0Y2ggKHByb3BzLnRpdGxlQ29sb3IpIHtcclxuICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgIHJldHVybiAndGV4dC1kYW5nZXInXHJcbiAgICBjYXNlICd3YXJuaW5nJzpcclxuICAgICAgcmV0dXJuICd0ZXh0LXdhcm5pbmcnXHJcbiAgICBjYXNlICdzdWNjZXNzJzpcclxuICAgICAgcmV0dXJuICd0ZXh0LXN1Y2Nlc3MnXHJcbiAgICBjYXNlICdzZWNvbmRhcnknOlxyXG4gICAgICByZXR1cm4gJ3RleHQtc2Vjb25kYXJ5J1xyXG4gICAgY2FzZSAnaW5mbyc6XHJcbiAgICAgIHJldHVybiAndGV4dC1pbmZvJ1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICd0ZXh0LWZvcmVncm91bmQnXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgdG9nZ2xlRXhwYW5zaW9uID0gKCkgPT4ge1xyXG4gIGlzRXhwYW5kZWQudmFsdWUgPSAhaXNFeHBhbmRlZC52YWx1ZVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdj5cclxuICAgIDxIZWFkbGVzc0Rpc2Nsb3N1cmU+XHJcbiAgICAgIDxEaXNjbG9zdXJlQnV0dG9uIDpjbGFzcz1cImJ1dHRvbkNsYXNzZXNcIiBAY2xpY2s9XCJ0b2dnbGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMiBvdmVyZmxvdy1oaWRkZW4gcHItMSB3LWZ1bGxcIj5cclxuICAgICAgICAgIDxDb21wb25lbnQgOmlzPVwiaWNvblwiIHYtaWY9XCJpY29uXCIgY2xhc3M9XCJoLTUgdy01XCIgLz5cclxuICAgICAgICAgIDxzcGFuIHYtaWY9XCIhZWRpdFRpdGxlXCIgY2xhc3M9XCJ0ZXh0LWxlZnQgdy1mdWxsIHRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgIHt7IHRpdGxlIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8Rm9ybVRleHRJbnB1dFxyXG4gICAgICAgICAgICB2LWVsc2VcclxuICAgICAgICAgICAgdi1iaW5kPVwiYmluZFwiXHJcbiAgICAgICAgICAgIG5hbWU9XCJkaXNjbG9zdXJlVGl0bGVcIlxyXG4gICAgICAgICAgICBjb2xvcj1cImZ1bGx5LXRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgOmlucHV0LWNsYXNzZXM9XCJidXR0b25UZXh0Q2xhc3Nlc1wiXHJcbiAgICAgICAgICAgIDphdXRvLWZvY3VzPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIHdyYXBwZXItY2xhc3Nlcz1cImZsZXgtMVwiXHJcbiAgICAgICAgICAgIHYtb249XCJvblwiXHJcbiAgICAgICAgICAgIEBjbGljay5zdG9wXHJcbiAgICAgICAgICAgIEBibHVyPVwib25UaXRsZUlucHV0Qmx1clwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPHNsb3QgbmFtZT1cInRpdGxlLWFjdGlvbnNcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxDaGV2cm9uVXBJY29uIDpjbGFzcz1cImNoZXZyb25DbGFzc2VzXCIgLz5cclxuICAgICAgPC9EaXNjbG9zdXJlQnV0dG9uPlxyXG4gICAgICA8RGlzY2xvc3VyZVBhbmVsIHYtaWY9XCJvcGVuXCIgOmNsYXNzPVwicGFuZWxDbGFzc2VzXCIgc3RhdGljPlxyXG4gICAgICAgIDxkaXYgdi1pZj1cIiFsYXp5TG9hZCB8fCBvcGVuXCIgY2xhc3M9XCJsYWJlbC1saWdodFwiPlxyXG4gICAgICAgICAgPHNsb3Q+UGFuZWwgY29udGVudHM8L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvRGlzY2xvc3VyZVBhbmVsPlxyXG4gICAgPC9IZWFkbGVzc0Rpc2Nsb3N1cmU+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7XHJcbiAgRGlzY2xvc3VyZUJ1dHRvbixcclxuICBEaXNjbG9zdXJlIGFzIEhlYWRsZXNzRGlzY2xvc3VyZSxcclxuICBEaXNjbG9zdXJlUGFuZWxcclxufSBmcm9tICdAaGVhZGxlc3N1aS92dWUnXHJcbmltcG9ydCB7IENoZXZyb25VcEljb24gfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yNC9zb2xpZCdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHdhdGNoIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7IFByb3BBbnlDb21wb25lbnQgfSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vY29tcG9uZW50cydcclxuaW1wb3J0IHsgRm9ybVRleHRJbnB1dCwgdXNlRGVib3VuY2VkVGV4dElucHV0IH0gZnJvbSAnfn4vc3JjL2xpYidcclxuXHJcbnR5cGUgRGlzY2xvc3VyZUNvbG9yID0gJ2RlZmF1bHQnIHwgJ2RhbmdlcicgfCAnc3VjY2VzcycgfCAnd2FybmluZycgfCAnc3VidGxlJ1xyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgLyoqXHJcbiAgICAgKiBIZWFkbGVzc1VJIGljb24gY29tcG9uZW50IHRvIHVzZVxyXG4gICAgICovXHJcbiAgICBpY29uPzogUHJvcEFueUNvbXBvbmVudFxyXG4gICAgY29sb3I/OiBEaXNjbG9zdXJlQ29sb3JcclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0byBsYXp5IGxvYWQgdGhlIHBhbmVsIGNvbnRlbnRzIG9ubHkgdXBvbiBvcGVuaW5nXHJcbiAgICAgKi9cclxuICAgIGxhenlMb2FkPzogYm9vbGVhblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBlZGl0IG1vZGUgZW5hYmxlZCAtIGl0IHdpbGwgZXhpdCBtb2RlIHdoZW4gdXNlciB1bmZvY3VzZXNcclxuICAgICAqL1xyXG4gICAgZXhpdEVkaXRNb2RlT25CbHVyPzogYm9vbGVhblxyXG4gIH0+KCksXHJcbiAge1xyXG4gICAgY29sb3I6ICdkZWZhdWx0JyxcclxuICAgIGV4aXRFZGl0TW9kZU9uQmx1cjogdHJ1ZVxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgZWRpdFRpdGxlID0gZGVmaW5lTW9kZWw8Ym9vbGVhbj4oJ2VkaXRUaXRsZScpXHJcbmNvbnN0IHRpdGxlID0gZGVmaW5lTW9kZWw8c3RyaW5nPigndGl0bGUnKVxyXG5jb25zdCBvcGVuID0gZGVmaW5lTW9kZWw8Ym9vbGVhbj4oJ29wZW4nLCB7XHJcbiAgZGVmYXVsdDogZmFsc2VcclxufSlcclxuXHJcbmNvbnN0IHsgb24sIGJpbmQsIHN5bmNGcm9tVmFsdWUgfSA9IHVzZURlYm91bmNlZFRleHRJbnB1dCh7XHJcbiAgZGlzYWJsZURlYm91bmNlZElucHV0OiB0cnVlLFxyXG4gIG1vZGVsOiB0aXRsZVxyXG59KVxyXG5cclxuY29uc3QgYnV0dG9uVGV4dENsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFsnZm9udC1tZWRpdW0nXVxyXG5cclxuICBzd2l0Y2ggKHByb3BzLmNvbG9yKSB7XHJcbiAgICBjYXNlICd3YXJuaW5nJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LXdhcm5pbmcnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnc3VjY2Vzcyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1zdWNjZXNzJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1kYW5nZXInKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnc3VidGxlJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWZvcmVncm91bmQgdGV4dC1ib2R5LTJ4cycpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdkZWZhdWx0JzpcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1wcmltYXJ5JylcclxuICAgICAgYnJlYWtcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgYnV0dG9uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBsZXQgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbXVxyXG5cclxuICAvLyBDb21tb24gY2xhc3NlcyBzaGFyZWQgYmV0d2VlbiBzdWJ0bGUgYW5kIG90aGVyIHZhcmlhbnRzXHJcbiAgY2xhc3NQYXJ0cyA9IFtcclxuICAgICd3LWZ1bGwnLFxyXG4gICAgJ2ZsZXgnLFxyXG4gICAgJ2l0ZW1zLWNlbnRlcicsXHJcbiAgICAndHJhbnNpdGlvbicsXHJcbiAgICAnZ3JvdXAvZGlzY2xvc3VyZScsXHJcblxyXG4gICAgYnV0dG9uVGV4dENsYXNzZXMudmFsdWVcclxuICBdXHJcblxyXG4gIGlmIChwcm9wcy5jb2xvciA9PT0gJ3N1YnRsZScpIHtcclxuICAgIC8vIFN1YnRsZSB2YXJpYW50IHNwZWNpZmljIHN0eWxpbmdcclxuICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgJ2gtNycsXHJcbiAgICAgICdqdXN0aWZ5LW5vcm1hbCcsXHJcbiAgICAgICdwbC0xJyxcclxuICAgICAgJ3ByLTAuNScsXHJcblxyXG4gICAgICAncm91bmRlZC1tZCcsXHJcbiAgICAgICdob3ZlcjpiZy1oaWdobGlnaHQtMScsXHJcbiAgICAgICdyaW5nLW5vbmUnXHJcbiAgICApXHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIERlZmF1bHQgc3R5bGluZyBmb3Igb3RoZXIgdmFyaWFudHNcclxuICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgJ3ByLTMnLFxyXG4gICAgICAnaC0xMCcsXHJcbiAgICAgICdqdXN0aWZ5LWJldHdlZW4nLFxyXG4gICAgICAnYm9yZGVyLWwtMicsXHJcbiAgICAgICdweC0yJyxcclxuICAgICAgJ3JvdW5kZWQnLFxyXG4gICAgICAncmluZy0xJ1xyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgLy8gQWRkIGNvbG9yLXNwZWNpZmljIHN0eWxpbmdcclxuICBzd2l0Y2ggKHByb3BzLmNvbG9yKSB7XHJcbiAgICBjYXNlICd3YXJuaW5nJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXItd2FybmluZyByaW5nLXdhcm5pbmctbGlnaHRlciBob3ZlcjpyaW5nLXdhcm5pbmcnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnc3VjY2Vzcyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLXN1Y2Nlc3MgcmluZy1zdWNjZXNzLWxpZ2h0ZXIgaG92ZXI6cmluZy1zdWNjZXNzJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLWRhbmdlciByaW5nLWRhbmdlci1saWdodGVyIGhvdmVyOnJpbmctZGFuZ2VyJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ3N1YnRsZSc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLW5vbmUgcmluZy1ub25lIGZsZXgtcm93LXJldmVyc2UgZ2FwLXgtMSBqdXN0aWZ5LWVuZCcpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdkZWZhdWx0JzpcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLXByaW1hcnkgcmluZy1wcmltYXJ5LW11dGVkIGhvdmVyOnJpbmctcHJpbWFyeScpXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IHBhbmVsQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gWydwLTMgYm9yZGVyLXggYm9yZGVyLWIgcm91bmRlZC1iLW1kJ11cclxuXHJcbiAgc3dpdGNoIChwcm9wcy5jb2xvcikge1xyXG4gICAgY2FzZSAnd2FybmluZyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLXdhcm5pbmctbGlnaHRlcicpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdzdWNjZXNzJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXItc3VjY2Vzcy1saWdodGVyJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLWRhbmdlci1saWdodGVyJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ3N1YnRsZSc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLW5vbmUgcGwtMCBwci0wIHBiLTAgcHQtMCByb3VuZGVkLW5vbmUnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnZGVmYXVsdCc6XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2JvcmRlci1wcmltYXJ5LW11dGVkJylcclxuICAgICAgYnJlYWtcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgY2hldnJvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgYmFzZUNsYXNzZXMgPSAnaC00IHctNCB0cmFuc2l0aW9uLXRyYW5zZm9ybSBzaHJpbmstMCBkdXJhdGlvbi0yMDAgZWFzZS1pbi1vdXQnXHJcblxyXG4gIGlmIChwcm9wcy5jb2xvciA9PT0gJ3N1YnRsZScpIHtcclxuICAgIC8vIFN1YnRsZSB2YXJpYW50OiA5MMKwIHdoZW4gY2xvc2VkLCAwwrAgd2hlbiBvcGVuXHJcbiAgICByZXR1cm4gb3Blbi52YWx1ZVxyXG4gICAgICA/IGAke2Jhc2VDbGFzc2VzfSByb3RhdGUtMTgwIHRyYW5zZm9ybWBcclxuICAgICAgOiBgJHtiYXNlQ2xhc3Nlc30gcm90YXRlLTkwIHRyYW5zZm9ybWBcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gT3RoZXIgdmFyaWFudHM6IHJvdGF0ZSB3aGVuIGNsb3NlZCAoZGVmYXVsdCBiZWhhdmlvcilcclxuICAgIHJldHVybiAhb3Blbi52YWx1ZSA/IGAke2Jhc2VDbGFzc2VzfSByb3RhdGUtMTgwIHRyYW5zZm9ybWAgOiBiYXNlQ2xhc3Nlc1xyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IHRvZ2dsZSA9ICgpID0+IHtcclxuICBvcGVuLnZhbHVlID0gIW9wZW4udmFsdWVcclxufVxyXG5cclxuY29uc3Qgb25UaXRsZUlucHV0Qmx1ciA9ICgpID0+IHtcclxuICBpZiAoIXByb3BzLmV4aXRFZGl0TW9kZU9uQmx1cikgcmV0dXJuXHJcblxyXG4gIGVkaXRUaXRsZS52YWx1ZSA9IGZhbHNlXHJcbn1cclxuXHJcbndhdGNoKGVkaXRUaXRsZSwgKG5ld1ZhbCwgb2xkVmFsKSA9PiB7XHJcbiAgLy8gUmVzZXQgaW5wdXQgdmFsdWUgb24gdHVybmluZyBvbiBlZGl0IG1vZGVcclxuICBpZiAobmV3VmFsICYmICFvbGRWYWwpIHtcclxuICAgIHN5bmNGcm9tVmFsdWUoKVxyXG4gIH1cclxufSlcclxuPC9zY3JpcHQ+XHJcbiIsImltcG9ydCB0eXBlIHsgQ29uY3JldGVDb21wb25lbnQgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgRm9ybUJ1dHRvbiB9IGZyb20gJ35+L3NyYy9saWInXHJcblxyXG50eXBlIEZvcm1CdXR0b25Qcm9wcyA9IEluc3RhbmNlVHlwZTx0eXBlb2YgRm9ybUJ1dHRvbj5bJyRwcm9wcyddXHJcbmltcG9ydCB0eXBlIHsgUHJvcEFueUNvbXBvbmVudCB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2NvbW1vbi9jb21wb25lbnRzJ1xyXG5pbXBvcnQgdHlwZSB7IE1heWJlTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5cclxuZXhwb3J0IGVudW0gR3JpZExpc3RUb2dnbGVWYWx1ZSB7XHJcbiAgR3JpZCA9ICdncmlkJyxcclxuICBMaXN0ID0gJ2xpc3QnXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIExheW91dFRhYkl0ZW08SSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XHJcbiAgdGl0bGU6IHN0cmluZ1xyXG4gIGlkOiBJXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIExheW91dFBhZ2VUYWJJdGVtPEkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xyXG4gIHRpdGxlOiBzdHJpbmdcclxuICBpZDogSVxyXG4gIGNvdW50PzogbnVtYmVyXHJcbiAgdGFnPzogc3RyaW5nXHJcbiAgaWNvbj86IFByb3BBbnlDb21wb25lbnRcclxuICBkaXNhYmxlZD86IGJvb2xlYW5cclxuICBkaXNhYmxlZE1lc3NhZ2U/OiBzdHJpbmdcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTGF5b3V0TWVudUl0ZW08SSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XHJcbiAgaWNvbj86IENvbmNyZXRlQ29tcG9uZW50XHJcbiAgdGl0bGU6IHN0cmluZ1xyXG4gIGlkOiBJXHJcbiAgZGlzYWJsZWQ/OiBNYXliZU51bGxPclVuZGVmaW5lZDxib29sZWFuPlxyXG4gIGRpc2FibGVkVG9vbHRpcD86IE1heWJlTnVsbE9yVW5kZWZpbmVkPHN0cmluZz5cclxuICBjb2xvcj86ICdkYW5nZXInIHwgJ2luZm8nXHJcbiAgYWN0aXZlPzogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBMYXlvdXREaWFsb2dCdXR0b24gPSB7XHJcbiAgdGV4dDogc3RyaW5nXHJcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIEZvcm1CdXR0b25Qcm9wc1xyXG4gIG9uQ2xpY2s/OiAoZTogTW91c2VFdmVudCkgPT4gdm9pZFxyXG4gIGRpc2FibGVkPzogYm9vbGVhblxyXG4gIGRpc2FibGVkTWVzc2FnZT86IHN0cmluZ1xyXG4gIHN1Ym1pdD86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBUaGlzIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgYnV0dG9uIHdpdGhpbiB0aGUgZm9ybS4gRXZlbiBpZiB5b3UgaGF2ZSBkaWZmZXJlbnQgc2V0c1xyXG4gICAqIG9mIGJ1dHRvbnMgcmVuZGVyZWQgb24gZGlmZmVyZW50IHN0ZXBzIG9mIGEgd2l6YXJkLCBhbGwgb2YgdGhlbSBzaG91bGQgaGF2ZSB1bmlxdWUgSURzIHRvXHJcbiAgICogZW5zdXJlIHByb3BlciBmb3JtIGZ1bmN0aW9uYWxpdHkuXHJcbiAgICovXHJcbiAgaWQ/OiBzdHJpbmdcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTGF5b3V0SGVhZGVyQnV0dG9uID0ge1xyXG4gIGxhYmVsOiBzdHJpbmdcclxuICBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBGb3JtQnV0dG9uUHJvcHNcclxuICBvbkNsaWNrPzogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWRcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTGF5b3V0VGFibGVDb2xvdXJzID0gJ3ByaW1hcnknIHwgJ291dGxpbmUnIHwgJ3N1YnRsZScgfCAnZGFuZ2VyJ1xyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGJ1dHRvblxyXG4gICAgY2xhc3M9XCJtYXgtdy1tYXggdHJhbnNpdGlvbiBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgb3V0bGluZS1ub25lIHNlbGVjdC1ub25lIGgtOCB0ZXh0LWZvcmVncm91bmQgYm9yZGVyLTIgYm9yZGVyLXByaW1hcnktbXV0ZWQgZGFyazpib3JkZXItZm91bmRhdGlvbiBiZy1wcmltYXJ5LW11dGVkIHJvdW5kZWQtbWQgYWN0aXZlOnNjYWxlLVswLjk3XSBncm93XCJcclxuICAgIEBjbGljaz1cIm9uQ2xpY2tcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGJnLXByaW1hcnktbXV0ZWQgcm91bmRlZC1tZFwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0cmFuc2l0aW9uXCJcclxuICAgICAgICA6Y2xhc3M9XCJ7XHJcbiAgICAgICAgICAndHJhbnNsYXRlLXgtNyc6IHZhbHVlICE9PSBHcmlkTGlzdFRvZ2dsZVZhbHVlLkxpc3RcclxuICAgICAgICB9XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwidy03IGgtNyBiZy1mb3VuZGF0aW9uIGRhcms6YmctZm91bmRhdGlvbi0yIHRyYW5zaXRpb24gcm91bmRlZCBzaGFkb3dcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi10aXBweT1cIidMaXN0IFZpZXcnXCJcclxuICAgICAgICBjbGFzcz1cInJlbGF0aXZlIHotMTAgZmxleCBzcGFjZS14LTEgaXRlbXMtY2VudGVyIHAtMSByb3VuZGVkLWxcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEJhcnMzSWNvbiBjbGFzcz1cImgtNSB3LTVcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtdGlwcHk9XCInR3JpZCBWaWV3J1wiXHJcbiAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB6LTEwIGZsZXggc3BhY2UteC0xIGl0ZW1zLWNlbnRlciBwLTEgcm91bmRlZC1yXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxTcXVhcmVzMlgySWNvbiBjbGFzcz1cImgtNSB3LTVcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvYnV0dG9uPlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgQmFyczNJY29uLCBTcXVhcmVzMlgySWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L3NvbGlkJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHsgR3JpZExpc3RUb2dnbGVWYWx1ZSB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2xheW91dC9jb21wb25lbnRzJ1xyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ2NsaWNrJywgdjogTW91c2VFdmVudCk6IHZvaWRcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdjogR3JpZExpc3RUb2dnbGVWYWx1ZSk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgbW9kZWxWYWx1ZT86IEdyaWRMaXN0VG9nZ2xlVmFsdWVcclxufT4oKVxyXG5cclxuY29uc3QgdmFsdWUgPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiBwcm9wcy5tb2RlbFZhbHVlIHx8IEdyaWRMaXN0VG9nZ2xlVmFsdWUuR3JpZCxcclxuICBzZXQ6IChuZXdWYWwpID0+IGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgbmV3VmFsKVxyXG59KVxyXG5cclxuY29uc3Qgb25DbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgZW1pdCgnY2xpY2snLCBlKVxyXG5cclxuICBjb25zdCBuZXdWYWwgPVxyXG4gICAgdmFsdWUudmFsdWUgPT09IEdyaWRMaXN0VG9nZ2xlVmFsdWUuR3JpZFxyXG4gICAgICA/IEdyaWRMaXN0VG9nZ2xlVmFsdWUuTGlzdFxyXG4gICAgICA6IEdyaWRMaXN0VG9nZ2xlVmFsdWUuR3JpZFxyXG4gIHZhbHVlLnZhbHVlID0gbmV3VmFsXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3ZnXHJcbiAgICB3aWR0aD1cIjE2XCJcclxuICAgIGhlaWdodD1cIjE2XCJcclxuICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgPlxyXG4gICAgPHBhdGhcclxuICAgICAgZmlsbC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICBkPVwiTTEyLjg4NDkgNS45MTg1MUw3LjI1NjE0IDExLjc0TDMuOTk5NTEgOC40ODMzN0w0LjkzMzg4IDcuNTQ5TDcuMjQwMjggOS44NTU0TDExLjkzNDkgNUwxMi44ODQ5IDUuOTE4NTFaXCJcclxuICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAvPlxyXG4gIDwvc3ZnPlxyXG48L3RlbXBsYXRlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPEhlYWRsZXNzTWVudSB2LXNsb3Q9XCJ7IG9wZW46IGlzTWVudU9wZW4gfVwiIGFzPVwiZGl2XCIgY2xhc3M9XCJyZWxhdGl2ZSBpbmxpbmUtYmxvY2tcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxNZW51QnV0dG9uIDppZD1cIm1lbnVJZFwiIHJlZj1cIm1lbnVCdXR0b25cIiBjbGFzcz1cImhpZGRlblwiIEBjbGljay5zdG9wLnByZXZlbnQgLz5cclxuICAgICAgPCEtLSBjb25kaXRpb25hbCBwb2ludGVyLWV2ZW50cy1ub25lIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBkb3VibGUgZXZlbnRzIHdoZW4gY2xpY2tpbmcgb24gdGhlIGJ1dHRvbiB3aGVuIHRoZSBtZW51IGlzIGFscmVhZHkgb3BlbiAtLT5cclxuICAgICAgPGRpdiByZWY9XCJtZW51QnV0dG9uV3JhcHBlclwiIDpjbGFzcz1cImlzTWVudU9wZW4gPyAncG9pbnRlci1ldmVudHMtbm9uZScgOiAnJ1wiPlxyXG4gICAgICAgIDxzbG90IDp0b2dnbGU9XCJ0b2dnbGVcIiA6b3Blbj1cInByb2Nlc3NPcGVuKGlzTWVudU9wZW4pXCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxUZWxlcG9ydCB0bz1cImJvZHlcIiA6ZGlzYWJsZWQ9XCIhbW91bnRNZW51T25Cb2R5XCI+XHJcbiAgICAgIDxNZW51SXRlbXNcclxuICAgICAgICB2LWlmPVwiaXNNZW51T3BlblwiXHJcbiAgICAgICAgcmVmPVwibWVudUl0ZW1zXCJcclxuICAgICAgICA6Y2xhc3M9XCJtZW51SXRlbXNDbGFzc2VzXCJcclxuICAgICAgICA6c3R5bGU9XCJtZW51SXRlbXNTdHlsZXNcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiB2LWZvcj1cIihncm91cCwgaSkgaW4gaXRlbXNcIiA6a2V5PVwiaVwiIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICA8TWVudUl0ZW1cclxuICAgICAgICAgICAgdi1mb3I9XCJpdGVtIGluIGdyb3VwXCJcclxuICAgICAgICAgICAgdi1zbG90PVwieyBhY3RpdmUsIGRpc2FibGVkIH1cIlxyXG4gICAgICAgICAgICA6a2V5PVwiaXRlbS5pZFwiXHJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWQgfHwgdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgOmNvbG9yPVwiaXRlbS5jb2xvclwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuIHYtdGlwcHk9XCJpdGVtLmRpc2FibGVkICYmIGl0ZW0uZGlzYWJsZWRUb29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiYnVpbGRCdXR0b25DbGFzc3Nlcyh7IGFjdGl2ZSwgZGlzYWJsZWQsIGNvbG9yOiBpdGVtLmNvbG9yIH0pXCJcclxuICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgIEBjbGljaz1cImNob29zZUl0ZW0oaXRlbSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPENvbXBvbmVudCA6aXM9XCJpdGVtLmljb25cIiB2LWlmPVwiaXRlbS5pY29uXCIgY2xhc3M9XCJoLTQgdy00XCIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cInNob3dUaWNrcyA9PT0gdHJ1ZVwiIGNsYXNzPVwidy01IHNocmluay0wXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxJY29uQ2hlY2sgdi1pZj1cIml0ZW0uYWN0aXZlXCIgY2xhc3M9XCJoLTQgdy00IHRleHQtZm9yZWdyb3VuZC0yXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cIml0ZW1cIiA6aXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiA6Y2xhc3M9XCJ7IGdyb3c6ICEhc2hvd1RpY2tzIH1cIj57eyBpdGVtLnRpdGxlIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3Nsb3Q+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJzaG93VGlja3MgPT09ICdyaWdodCcgJiYgaXRlbS5hY3RpdmVcIiBjbGFzcz1cInctNSBzaHJpbmstMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8SWNvbkNoZWNrIHYtaWY9XCJpdGVtLmFjdGl2ZVwiIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmQtMlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9NZW51SXRlbT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9NZW51SXRlbXM+XHJcbiAgICA8L1RlbGVwb3J0PlxyXG4gIDwvSGVhZGxlc3NNZW51PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIiBnZW5lcmljPVwiTWVudUlkcyBleHRlbmRzIHN0cmluZyA9IHN0cmluZ1wiPlxyXG5pbXBvcnQgeyBkaXJlY3RpdmUgYXMgdlRpcHB5IH0gZnJvbSAndnVlLXRpcHB5J1xyXG5pbXBvcnQgeyBNZW51IGFzIEhlYWRsZXNzTWVudSwgTWVudUJ1dHRvbiwgTWVudUl0ZW1zLCBNZW51SXRlbSB9IGZyb20gJ0BoZWFkbGVzc3VpL3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiwgd2F0Y2gsIG9uTW91bnRlZCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHtcclxuICBIb3Jpem9udGFsRGlyZWN0aW9uLFxyXG4gIHVzZVJlc3BvbnNpdmVIb3Jpem9udGFsRGlyZWN0aW9uQ2FsY3VsYXRpb25cclxufSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvY29tbW9uL3dpbmRvdydcclxuaW1wb3J0IHR5cGUgeyBMYXlvdXRNZW51SXRlbSB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2xheW91dC9jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyB1c2VFbGVtZW50Qm91bmRpbmcsIHVzZUVsZW1lbnRTaXplLCB1c2VFdmVudExpc3RlbmVyIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgeyB1c2VCb2R5TW91bnRlZE1lbnVQb3NpdGlvbmluZyB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9sYXlvdXQvbWVudSdcclxuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICcjbG9kYXNoJ1xyXG5pbXBvcnQgSWNvbkNoZWNrIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2dsb2JhbC9pY29uL0NoZWNrLnZ1ZSdcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICd1cGRhdGU6b3BlbicsIHZhbDogYm9vbGVhbik6IHZvaWRcclxuICAoZTogJ2Nob3NlbicsIHZhbDogeyBldmVudDogTW91c2VFdmVudDsgaXRlbTogTGF5b3V0TWVudUl0ZW08TWVudUlkcz4gfSk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgb3Blbj86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiAyRCBhcnJheSBzbyB0aGF0IGl0ZW1zIGNhbiBiZSBncm91cGVkIHdpdGggZGl2aWRlcnMgYmV0d2VlbiB0aGVtXHJcbiAgICovXHJcbiAgaXRlbXM6IExheW91dE1lbnVJdGVtPE1lbnVJZHM+W11bXVxyXG4gIHNpemU/OiAnYmFzZScgfCAnbGcnIHwgbnVtYmVyXHJcbiAgbWVudUlkPzogc3RyaW5nXHJcbiAgLyoqXHJcbiAgICogUHJlZmVyYWJsZSBtZW51IHBvc2l0aW9uL2RpcmVjdGVkLiBUaGlzIGNhbiBjaGFuZ2UgZGVwZW5kaW5nIG9uIGF2YWlsYWJsZSBzcGFjZS5cclxuICAgKi9cclxuICBtZW51UG9zaXRpb24/OiBIb3Jpem9udGFsRGlyZWN0aW9uXHJcbiAgbW91bnRNZW51T25Cb2R5PzogYm9vbGVhblxyXG4gIGN1c3RvbU1lbnVJdGVtc0NsYXNzZXM/OiBzdHJpbmdbXVxyXG4gIHNob3dUaWNrcz86IGJvb2xlYW4gfCAncmlnaHQnXHJcbn0+KClcclxuXHJcbmNvbnN0IG1lbnVJdGVtcyA9IHJlZihudWxsIGFzIE51bGxhYmxlPHsgZWw6IEhUTUxEaXZFbGVtZW50IH0+KVxyXG5jb25zdCBtZW51QnV0dG9uID0gcmVmKG51bGwgYXMgTnVsbGFibGU8eyBlbDogSFRNTEJ1dHRvbkVsZW1lbnQgfT4pXHJcbmNvbnN0IG1lbnVCdXR0b25XcmFwcGVyID0gcmVmKG51bGwgYXMgTnVsbGFibGU8SFRNTEVsZW1lbnQ+KVxyXG5jb25zdCBpc09wZW5JbnRlcm5hbGx5ID0gcmVmKGZhbHNlKVxyXG5jb25zdCBpc01vdW50ZWQgPSByZWYoZmFsc2UpXHJcblxyXG5jb25zdCBmaW5hbE9wZW4gPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiBwcm9wcy5vcGVuIHx8IGZhbHNlLFxyXG4gIHNldDogKG5ld1ZhbCkgPT4gZW1pdCgndXBkYXRlOm9wZW4nLCBuZXdWYWwpXHJcbn0pXHJcblxyXG5jb25zdCBtZW51QnV0dG9uQm91bmRpbmcgPSB1c2VFbGVtZW50Qm91bmRpbmcobWVudUJ1dHRvbldyYXBwZXIsIHtcclxuICB3aW5kb3dSZXNpemU6IHRydWUsXHJcbiAgd2luZG93U2Nyb2xsOiB0cnVlLFxyXG4gIGltbWVkaWF0ZTogdHJ1ZVxyXG59KVxyXG5cclxuY29uc3QgbWVudUl0ZW1zU2l6ZSA9IHVzZUVsZW1lbnRTaXplKGNvbXB1dGVkKCgpID0+IG1lbnVJdGVtcy52YWx1ZT8uZWwgfHwgbnVsbCkpXHJcblxyXG5jb25zdCB7IGRpcmVjdGlvbjogY2FsY3VsYXRlZERpcmVjdGlvbiB9ID0gdXNlUmVzcG9uc2l2ZUhvcml6b250YWxEaXJlY3Rpb25DYWxjdWxhdGlvbih7XHJcbiAgZWw6IGNvbXB1dGVkKCgpID0+IG1lbnVJdGVtcy52YWx1ZT8uZWwgfHwgbnVsbCksXHJcbiAgZGVmYXVsdERpcmVjdGlvbjogcHJvcHMubWVudVBvc2l0aW9uLFxyXG4gIHN0b3BVcGRhdGVzQmVsb3dXaWR0aDogMzAwXHJcbn0pXHJcblxyXG5jb25zdCBtZW51RGlyZWN0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBwcm9wcy5tZW51UG9zaXRpb24gfHwgY2FsY3VsYXRlZERpcmVjdGlvbi52YWx1ZVxyXG59KVxyXG5cclxuY29uc3QgeyBtZW51U3R5bGUgfSA9IHVzZUJvZHlNb3VudGVkTWVudVBvc2l0aW9uaW5nKHtcclxuICBtZW51T3BlbkRpcmVjdGlvbjogbWVudURpcmVjdGlvbixcclxuICBidXR0b25Cb3VuZGluZ0JveDogbWVudUJ1dHRvbkJvdW5kaW5nLFxyXG4gIG1lbnVXaWR0aDogY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYgKGlzTnVtYmVyKHByb3BzLnNpemUpKSByZXR1cm4gcHJvcHMuc2l6ZVxyXG5cclxuICAgIHN3aXRjaCAocHJvcHMuc2l6ZSkge1xyXG4gICAgICBjYXNlICdsZyc6XHJcbiAgICAgICAgcmV0dXJuIDIwOFxyXG4gICAgICBjYXNlICdiYXNlJzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gMTc2XHJcbiAgICB9XHJcbiAgfSksXHJcbiAgbWVudUhlaWdodDogY29tcHV0ZWQoKCkgPT4gbWVudUl0ZW1zU2l6ZS5oZWlnaHQudmFsdWUpXHJcbn0pXHJcblxyXG5jb25zdCBtZW51SXRlbXNTdHlsZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgLy8gT25seSBhZGQgc3R5bGVzIGZvciBib2R5IG1vdW50ZWQgbWVudXNcclxuICBpZiAoIXByb3BzLm1vdW50TWVudU9uQm9keSkgcmV0dXJuIHt9XHJcbiAgaWYgKCFtZW51QnV0dG9uQm91bmRpbmcud2lkdGgudmFsdWUpIHJldHVybiB7fVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgcG9zaXRpb246ICdmaXhlZCcsXHJcbiAgICB6SW5kZXg6IDUwLFxyXG4gICAgLi4ubWVudVN0eWxlLnZhbHVlXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgbWVudUl0ZW1zQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ3ctNDQgb3JpZ2luLXRvcC1yaWdodCBkaXZpZGUteSBkaXZpZGUtb3V0bGluZS0zIHJvdW5kZWQtbWQgYmctZm91bmRhdGlvbiBzaGFkb3ctbGcgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTIgei01MCdcclxuICBdXHJcblxyXG4gIGlmIChwcm9wcy5jdXN0b21NZW51SXRlbXNDbGFzc2VzKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goLi4ucHJvcHMuY3VzdG9tTWVudUl0ZW1zQ2xhc3NlcylcclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy5tb3VudE1lbnVPbkJvZHkpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnZml4ZWQnKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2Fic29sdXRlIG10LTEnKVxyXG5cclxuICAgIGlmIChtZW51RGlyZWN0aW9uLnZhbHVlID09PSBIb3Jpem9udGFsRGlyZWN0aW9uLkxlZnQpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdyaWdodC0wJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy5zaXplID09PSAnbGcnKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3ctNTInKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3ctNDQnKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBidWlsZEJ1dHRvbkNsYXNzc2VzID0gKHBhcmFtczoge1xyXG4gIGFjdGl2ZT86IGJvb2xlYW5cclxuICBkaXNhYmxlZD86IGJvb2xlYW5cclxuICBjb2xvcj86ICdkYW5nZXInIHwgJ2luZm8nXHJcbn0pID0+IHtcclxuICBjb25zdCB7IGFjdGl2ZSwgZGlzYWJsZWQsIGNvbG9yIH0gPSBwYXJhbXNcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ2dyb3VwIGZsZXggc3BhY2UteC0yIHctZnVsbCBpdGVtcy1jZW50ZXIgcm91bmRlZC1tZCBweC0yIHB5LTEgdGV4dC1ib2R5LXhzIHRleHQtbGVmdCdcclxuICBdXHJcblxyXG4gIGlmIChhY3RpdmUgJiYgIWNvbG9yKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2JnLXByaW1hcnktbXV0ZWQgdGV4dC1mb3JlZ3JvdW5kJylcclxuICB9IGVsc2UgaWYgKGRpc2FibGVkKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ29wYWNpdHktNDAnKVxyXG4gIH0gZWxzZSBpZiAoY29sb3IgPT09ICdkYW5nZXInICYmIGFjdGl2ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWZvcmVncm91bmQtb24tcHJpbWFyeSBiZy1kYW5nZXInKVxyXG4gIH0gZWxzZSBpZiAoY29sb3IgPT09ICdkYW5nZXInICYmICFhY3RpdmUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1kYW5nZXInKVxyXG4gIH0gZWxzZSBpZiAoY29sb3IgPT09ICdpbmZvJyAmJiBhY3RpdmUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1mb3JlZ3JvdW5kLW9uLXByaW1hcnkgYmctaW5mbycpXHJcbiAgfSBlbHNlIGlmIChjb2xvciA9PT0gJ2luZm8nICYmICFhY3RpdmUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1pbmZvJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWZvcmVncm91bmQnKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn1cclxuXHJcbmNvbnN0IGNob29zZUl0ZW0gPSAoaXRlbTogTGF5b3V0TWVudUl0ZW08TWVudUlkcz4sIGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgZW1pdCgnY2hvc2VuJywgeyBpdGVtLCBldmVudCB9KVxyXG4gIHNldE9wZW4oZmFsc2UpXHJcbn1cclxuXHJcbmNvbnN0IHRvZ2dsZSA9ICgpID0+IHtcclxuICBtZW51QnV0dG9uLnZhbHVlPy5lbC5jbGljaygpXHJcbiAgaWYgKHByb3BzLm1vdW50TWVudU9uQm9keSkge1xyXG4gICAgbWVudUJ1dHRvbkJvdW5kaW5nLnVwZGF0ZSgpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBzZXRPcGVuID0gKG9wZW46IGJvb2xlYW4pID0+IHtcclxuICBpZiAoaXNPcGVuSW50ZXJuYWxseS52YWx1ZSA9PT0gb3BlbikgcmV0dXJuXHJcbiAgdG9nZ2xlKClcclxufVxyXG5cclxuLy8gb2sgdGhpcyBpcyBhIGJpdCBoYWNreSwgYnV0IGl0J3MgZG9uZSBiZWNhdXNlIG9mIGhlYWRsZXNzdWkncyBsaW1pdGVkIEFQSVxyXG4vLyB0aGUgcG9pbnQgb2YgdGhpcyBpcyAxKSBjYXN0IGFueSB0byBib29sIDIpIHN0b3JlICdvcGVuJyBzdGF0ZSBsb2NhbGx5XHJcbi8vIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBvdXRzaWRlIG9mIHRoZSB0ZW1wbGF0ZVxyXG5jb25zdCBwcm9jZXNzT3BlbiA9ICh2YWw6IHVua25vd24pOiB2YWwgaXMgYm9vbGVhbiA9PiB7XHJcbiAgY29uc3QgaXNPcGVuID0gISF2YWxcclxuICBpc09wZW5JbnRlcm5hbGx5LnZhbHVlID0gaXNPcGVuXHJcbiAgcmV0dXJuIGlzT3BlblxyXG59XHJcblxyXG53YXRjaChpc09wZW5JbnRlcm5hbGx5LCAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICBpZiAobmV3VmFsID09PSBvbGRWYWwpIHJldHVyblxyXG4gIGZpbmFsT3Blbi52YWx1ZSA9IG5ld1ZhbFxyXG59KVxyXG5cclxud2F0Y2goZmluYWxPcGVuLCAoc2hvdWxkQmVPcGVuKSA9PiB7XHJcbiAgaWYgKHNob3VsZEJlT3BlbiAmJiAhaXNPcGVuSW50ZXJuYWxseS52YWx1ZSkge1xyXG4gICAgdG9nZ2xlKClcclxuICB9IGVsc2UgaWYgKCFzaG91bGRCZU9wZW4gJiYgaXNPcGVuSW50ZXJuYWxseS52YWx1ZSkge1xyXG4gICAgdG9nZ2xlKClcclxuICB9XHJcbn0pXHJcblxyXG5vbk1vdW50ZWQoKCkgPT4ge1xyXG4gIGlzTW91bnRlZC52YWx1ZSA9IHRydWVcclxufSlcclxuXHJcbnVzZUV2ZW50TGlzdGVuZXIod2luZG93LCAncmVzaXplJywgKCkgPT4ge1xyXG4gIG1lbnVCdXR0b25Cb3VuZGluZy51cGRhdGUoKVxyXG59KVxyXG5cclxudXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csICdzY3JvbGwnLCAoKSA9PiB7XHJcbiAgbWVudUJ1dHRvbkJvdW5kaW5nLnVwZGF0ZSgpXHJcbn0pXHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHotMTAgZmxleCBmbGV4LWNvbCAhbXQtMFwiPlxyXG4gICAgPCEtLSBMZWZ0IEFycm93IEJ1dHRvbiAtLT5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBsZWZ0LVstMnB4XSB0b3AtWy0ycHhdIHotMjAgcHItOCBiZy1ncmFkaWVudC10by1yIGZyb20tZm91bmRhdGlvbi1wYWdlIHRvLXRyYW5zcGFyZW50XCJcclxuICAgID5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHYtaWY9XCJzaG93TGVmdEFycm93XCJcclxuICAgICAgICBjbGFzcz1cImJnLWZvdW5kYXRpb24gcC0xIHJvdW5kZWQtZnVsbCBib3JkZXIgYm9yZGVyLW91dGxpbmUtNCBzaGFkb3dcIlxyXG4gICAgICAgIEBjbGljaz1cInNjcm9sbExlZnRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEFycm93TG9uZ0xlZnRJY29uIGNsYXNzPVwiaC00IHctNFwiIC8+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgbGVmdC0wIHotMTAgdy1mdWxsIGgtWzFweF0gbXQtcHggYmctb3V0bGluZS0zIHRvcC03XCI+PC9kaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgIHJlZj1cInNjcm9sbENvbnRhaW5lclwiXHJcbiAgICAgIGNsYXNzPVwicmVsYXRpdmUgb3ZlcmZsb3cteC1hdXRvIGhpZGUtc2Nyb2xsYmFyIHctZnVsbFwiXHJcbiAgICAgIEBzY3JvbGw9XCJoYW5kbGVTY3JvbGxcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgOnN0eWxlPVwiYm9yZGVyU3R5bGVcIlxyXG4gICAgICAgIGNsYXNzPVwiaC1bMnB4XSBhYnNvbHV0ZSBib3R0b20tMCB6LTIwIHRyYW5zaXRpb24tW2xlZnQsd2lkdGhdIGR1cmF0aW9uLTMwMFwiXHJcbiAgICAgICAgOmNsYXNzPVwiaXNJbml0aWFsU2V0dXAgPyAnYmctdHJhbnNwYXJlbnQnIDogJ2JnLXByaW1hcnknXCJcclxuICAgICAgPjwvZGl2PlxyXG5cclxuICAgICAgPGRpdiByZWY9XCJidXR0b25Db250YWluZXJcIiBjbGFzcz1cImZsZXggdy1mdWxsIHNwYWNlLXgtNFwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHYtZm9yPVwiaXRlbSBpbiBpdGVtc1wiXHJcbiAgICAgICAgICA6a2V5PVwiaXRlbS5pZFwiXHJcbiAgICAgICAgICA6ZGF0YS10YWItaWQ9XCJpdGVtLmlkXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICAgICAgYnV0dG9uQ2xhc3MoaXRlbSksXHJcbiAgICAgICAgICAgIHsgJyFib3JkZXItcHJpbWFyeSc6IGlzQWN0aXZlSXRlbShpdGVtKSAmJiBpc0luaXRpYWxTZXR1cCB9XHJcbiAgICAgICAgICBdXCJcclxuICAgICAgICAgIGNsYXNzPVwidGFiLWJ1dHRvblwiXHJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICAgIEBjbGljaz1cInNldEFjdGl2ZUl0ZW0oaXRlbSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMiBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgICAgIDppcz1cIml0ZW0uaWNvblwiXHJcbiAgICAgICAgICAgICAgdi1pZj1cIml0ZW0uaWNvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzaHJpbmstMCBoLTQgdy00IHN0cm9rZS1bMnB4XVwiXHJcbiAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXctNlwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICB2LWlmPVwiaXRlbS5kaXNhYmxlZCAmJiBpdGVtLmRpc2FibGVkTWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICB2LXRpcHB5PVwiaXRlbS5kaXNhYmxlZE1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IGl0ZW0udGl0bGUgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gdi1lbHNlPnt7IGl0ZW0udGl0bGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgdi1pZj1cIml0ZW0uY291bnRcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1mdWxsIHB4LTIgdGV4dC1ib2R5LTN4cyB0cmFuc2l0aW9uLWFsbCBtaW4tdy02XCJcclxuICAgICAgICAgICAgICA6Y2xhc3M9XCJcclxuICAgICAgICAgICAgICAgIGFjdGl2ZUl0ZW0/LmlkID09PSBpdGVtLmlkXHJcbiAgICAgICAgICAgICAgICAgID8gJ3RleHQtcHJpbWFyeSBiZy1pbmZvLWxpZ2h0ZXIgZGFyazp0ZXh0LWZvcmVncm91bmQnXHJcbiAgICAgICAgICAgICAgICAgIDogJ3RleHQtZm9yZWdyb3VuZC0yIGJnLWhpZ2hsaWdodC0zJ1xyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLmNvdW50IH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPENvbW1vbkJhZGdlIHYtaWY9XCJpdGVtLnRhZ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGl0ZW0udGFnIH19XHJcbiAgICAgICAgICAgIDwvQ29tbW9uQmFkZ2U+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJpZ2h0IEFycm93IEJ1dHRvbiAtLT5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJhYnNvbHV0ZSByaWdodC1bLTJweF0gdG9wLVstMnB4XSB6LTIwIHBsLTggYmctZ3JhZGllbnQtdG8tbCBmcm9tLWZvdW5kYXRpb24tcGFnZSB0by10cmFuc3BhcmVudFwiXHJcbiAgICA+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB2LWlmPVwic2hvd1JpZ2h0QXJyb3dcIlxyXG4gICAgICAgIGNsYXNzPVwiYmctZm91bmRhdGlvbiBwLTEgcm91bmRlZC1mdWxsIGJvcmRlciBib3JkZXItb3V0bGluZS0zIHNoYWRvd1wiXHJcbiAgICAgICAgQGNsaWNrPVwic2Nyb2xsUmlnaHRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEFycm93TG9uZ1JpZ2h0SWNvbiBjbGFzcz1cImgtNCB3LTRcIiAvPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInB0LTRcIj5cclxuICAgICAgPHNsb3QgOmFjdGl2ZS1pdGVtPVwiYWN0aXZlSXRlbVwiIC8+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGNvbXB1dGVkLCByZWYsIG9uTW91bnRlZCwgd2F0Y2gsIG9uQmVmb3JlVW5tb3VudCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBDU1NQcm9wZXJ0aWVzIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7IExheW91dFBhZ2VUYWJJdGVtIH0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvbGF5b3V0L2NvbXBvbmVudHMnXHJcbmltcG9ydCB7IGlzQ2xpZW50IH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgeyBBcnJvd0xvbmdSaWdodEljb24sIEFycm93TG9uZ0xlZnRJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgdGhyb3R0bGUgfSBmcm9tICcjbG9kYXNoJ1xyXG5pbXBvcnQgeyB1c2VSZXNpemVPYnNlcnZlciB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IENvbW1vbkJhZGdlIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9CYWRnZS52dWUnXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBpdGVtczogTGF5b3V0UGFnZVRhYkl0ZW1bXVxyXG59PigpXHJcblxyXG5jb25zdCBhY3RpdmVJdGVtID0gZGVmaW5lTW9kZWw8TGF5b3V0UGFnZVRhYkl0ZW0+KCdhY3RpdmVJdGVtJywgeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG5cclxuY29uc3QgYnV0dG9uQ29udGFpbmVyID0gcmVmKG51bGwgYXMgTnVsbGFibGU8SFRNTERpdkVsZW1lbnQ+KVxyXG5jb25zdCBzY3JvbGxDb250YWluZXIgPSByZWY8SFRNTEVsZW1lbnQgfCBudWxsPihudWxsKVxyXG5jb25zdCBzaG93TGVmdEFycm93ID0gcmVmKGZhbHNlKVxyXG5jb25zdCBzaG93UmlnaHRBcnJvdyA9IHJlZihmYWxzZSlcclxuY29uc3QgaXNJbml0aWFsU2V0dXAgPSByZWYodHJ1ZSlcclxuXHJcbmNvbnN0IHVuZGVybGluZUxlZnQgPSByZWYoJzBweCcpXHJcbmNvbnN0IHVuZGVybGluZVdpZHRoID0gcmVmKCcwcHgnKVxyXG5cclxuY29uc3QgYnV0dG9uQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIChpdGVtOiBMYXlvdXRQYWdlVGFiSXRlbSkgPT4ge1xyXG4gICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVJdGVtLnZhbHVlPy5pZCA9PT0gaXRlbS5pZFxyXG4gICAgY29uc3QgYmFzZUNsYXNzZXMgPSBbXHJcbiAgICAgICdyZWxhdGl2ZScsXHJcbiAgICAgICd6LTEwJyxcclxuICAgICAgJ2ZsZXgnLFxyXG4gICAgICAnaXRlbXMtY2VudGVyJyxcclxuICAgICAgJ2Rpc2FibGVkOm9wYWNpdHktNjAgZGlzYWJsZWQ6aG92ZXI6Ym9yZGVyLXRyYW5zcGFyZW50IGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpob3ZlcjpiZy10cmFuc3BhcmVudCcsXHJcbiAgICAgICd0ZXh0LWJvZHkteHMnLFxyXG4gICAgICAnaG92ZXI6c206Ym9yZGVyLW91dGxpbmUtMicsXHJcbiAgICAgICdwYi0yJyxcclxuICAgICAgJ2JvcmRlci1iLVsycHhdJyxcclxuICAgICAgJ2JvcmRlci10cmFuc3BhcmVudCcsXHJcbiAgICAgICdtYXgtdy1tYXgnLFxyXG4gICAgICAnbGFzdDptci02JyxcclxuICAgICAgJ3doaXRlc3BhY2Utbm93cmFwJ1xyXG4gICAgXVxyXG5cclxuICAgIGlmIChpc0FjdGl2ZSkgYmFzZUNsYXNzZXMucHVzaCgndGV4dC1wcmltYXJ5JywgJ2hvdmVyOnRleHQtcHJpbWFyeScpXHJcbiAgICBlbHNlIGJhc2VDbGFzc2VzLnB1c2goJ3RleHQtZm9yZWdyb3VuZCcpXHJcblxyXG4gICAgcmV0dXJuIGJhc2VDbGFzc2VzXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgYWN0aXZlSXRlbVJlZiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBpZCA9IGFjdGl2ZUl0ZW0udmFsdWU/LmlkXHJcbiAgaWYgKCFpZCkgcmV0dXJuIG51bGxcclxuXHJcbiAgY29uc3QgcGFyZW50ID0gYnV0dG9uQ29udGFpbmVyLnZhbHVlXHJcbiAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsXHJcblxyXG4gIGNvbnN0IGJ0bnMgPSBbLi4ucGFyZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYi1idXR0b24nKV0gYXMgSFRNTEVsZW1lbnRbXVxyXG4gIHJldHVybiBidG5zLmZpbmQoKGIpID0+IGIuZGF0YXNldFsndGFiSWQnXSA9PT0gaWQpIHx8IG51bGxcclxufSlcclxuXHJcbmNvbnN0IGJvcmRlclN0eWxlID0gY29tcHV0ZWQ8Q1NTUHJvcGVydGllcz4oKCkgPT4gKHtcclxuICBsZWZ0OiB1bmRlcmxpbmVMZWZ0LnZhbHVlLFxyXG4gIHdpZHRoOiB1bmRlcmxpbmVXaWR0aC52YWx1ZVxyXG59KSlcclxuXHJcbmNvbnN0IHVwZGF0ZVVuZGVybGluZSA9ICgpID0+IHtcclxuICBjb25zdCBlbCA9IGFjdGl2ZUl0ZW1SZWYudmFsdWVcclxuICBpZiAoIWVsKSByZXR1cm5cclxuXHJcbiAgdW5kZXJsaW5lTGVmdC52YWx1ZSA9IGAke2VsLm9mZnNldExlZnR9cHhgXHJcbiAgdW5kZXJsaW5lV2lkdGgudmFsdWUgPSBgJHtlbC5jbGllbnRXaWR0aH1weGBcclxufVxyXG5cclxuY29uc3Qgc2V0QWN0aXZlSXRlbSA9IChpdGVtOiBMYXlvdXRQYWdlVGFiSXRlbSkgPT4ge1xyXG4gIGFjdGl2ZUl0ZW0udmFsdWUgPSBpdGVtXHJcbiAgaXNJbml0aWFsU2V0dXAudmFsdWUgPSBmYWxzZVxyXG59XHJcblxyXG5jb25zdCBpc0FjdGl2ZUl0ZW0gPSAoaXRlbTogTGF5b3V0UGFnZVRhYkl0ZW0pID0+IHtcclxuICByZXR1cm4gYWN0aXZlSXRlbS52YWx1ZT8uaWQgPT09IGl0ZW0uaWRcclxufVxyXG5cclxuY29uc3QgY2hlY2tBcnJvd3NWaXNpYmlsaXR5ID0gKCkgPT4ge1xyXG4gIGNvbnN0IGNvbnRhaW5lciA9IHNjcm9sbENvbnRhaW5lci52YWx1ZVxyXG4gIGlmICghY29udGFpbmVyKSByZXR1cm5cclxuXHJcbiAgY29uc3Qgc2Nyb2xsV2lkdGggPSBjb250YWluZXIuc2Nyb2xsV2lkdGhcclxuICBjb25zdCBjbGllbnRXaWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aFxyXG4gIGNvbnN0IHNjcm9sbExlZnQgPSBjb250YWluZXIuc2Nyb2xsTGVmdFxyXG4gIGNvbnN0IGJ1ZmZlciA9IDFcclxuXHJcbiAgc2hvd0xlZnRBcnJvdy52YWx1ZSA9IHNjcm9sbExlZnQgPiBidWZmZXJcclxuICBzaG93UmlnaHRBcnJvdy52YWx1ZSA9IHNjcm9sbExlZnQgPCBzY3JvbGxXaWR0aCAtIGNsaWVudFdpZHRoIC0gYnVmZmVyXHJcbn1cclxuXHJcbmNvbnN0IHNjcm9sbExlZnQgPSAoKSA9PiB7XHJcbiAgc2Nyb2xsQ29udGFpbmVyLnZhbHVlPy5zY3JvbGxCeSh7IGxlZnQ6IC0xMDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KSAvLyBBZGp1c3QgdGhlIHNjcm9sbCBhbW91bnQgYXMgbmVlZGVkXHJcbiAgY2hlY2tBcnJvd3NWaXNpYmlsaXR5KClcclxufVxyXG5cclxuY29uc3Qgc2Nyb2xsUmlnaHQgPSAoKSA9PiB7XHJcbiAgc2Nyb2xsQ29udGFpbmVyLnZhbHVlPy5zY3JvbGxCeSh7IGxlZnQ6IDEwMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pIC8vIEFkanVzdCB0aGUgc2Nyb2xsIGFtb3VudCBhcyBuZWVkZWRcclxuICBjaGVja0Fycm93c1Zpc2liaWxpdHkoKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVTY3JvbGwgPSB0aHJvdHRsZSgoKSA9PiB7XHJcbiAgY2hlY2tBcnJvd3NWaXNpYmlsaXR5KClcclxufSwgMjUwKVxyXG5cclxuY29uc3QgZW5zdXJlQWN0aXZlSXRlbVZpc2libGUgPSAoKSA9PiB7XHJcbiAgY29uc3QgYWN0aXZlQnV0dG9uID0gYWN0aXZlSXRlbVJlZi52YWx1ZVxyXG4gIGlmIChhY3RpdmVCdXR0b24gJiYgc2Nyb2xsQ29udGFpbmVyLnZhbHVlKSB7XHJcbiAgICBhY3RpdmVCdXR0b24uc2Nyb2xsSW50b1ZpZXcoe1xyXG4gICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXHJcbiAgICAgIGJsb2NrOiAnbmVhcmVzdCcsXHJcbiAgICAgIGlubGluZTogJ2NlbnRlcidcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5vbk1vdW50ZWQoKCkgPT4ge1xyXG4gIGlmIChpc0NsaWVudCkge1xyXG4gICAgaWYgKHByb3BzLml0ZW1zLmxlbmd0aCAmJiAhYWN0aXZlSXRlbS52YWx1ZSkge1xyXG4gICAgICBzZXRBY3RpdmVJdGVtKHByb3BzLml0ZW1zWzBdKVxyXG4gICAgfVxyXG4gICAgY2hlY2tBcnJvd3NWaXNpYmlsaXR5KClcclxuICAgIGVuc3VyZUFjdGl2ZUl0ZW1WaXNpYmxlKClcclxuICB9XHJcbn0pXHJcblxyXG53YXRjaChcclxuICAoKSA9PiBbcHJvcHMuaXRlbXMsIGFjdGl2ZUl0ZW0udmFsdWVdIGFzIGNvbnN0LFxyXG4gIChbbmV3SXRlbXNdKSA9PiB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdJdGVtcykgJiYgbmV3SXRlbXMubGVuZ3RoICYmICFhY3RpdmVJdGVtLnZhbHVlKSB7XHJcbiAgICAgIHNldEFjdGl2ZUl0ZW0obmV3SXRlbXNbMF0pXHJcbiAgICB9XHJcbiAgICBjaGVja0Fycm93c1Zpc2liaWxpdHkoKVxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgeyBzdG9wOiBzdG9wUmVzaXplT2JzZXJ2ZXIgfSA9IHVzZVJlc2l6ZU9ic2VydmVyKGFjdGl2ZUl0ZW1SZWYsICgpID0+XHJcbiAgdXBkYXRlVW5kZXJsaW5lKClcclxuKVxyXG5cclxub25CZWZvcmVVbm1vdW50KCgpID0+IHtcclxuICBoYW5kbGVTY3JvbGwuY2FuY2VsKClcclxuICBzdG9wUmVzaXplT2JzZXJ2ZXIoKVxyXG59KVxyXG48L3NjcmlwdD5cclxuPHN0eWxlPlxyXG4vKiBIaWRlIHNjcm9sbGJhciBmb3IgQ2hyb21lLCBTYWZhcmkgYW5kIE9wZXJhICovXHJcbi5oaWRlLXNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi8qIEhpZGUgc2Nyb2xsYmFyIGZvciBJRSwgRWRnZSBhbmQgRmlyZWZveCAqL1xyXG4uaGlkZS1zY3JvbGxiYXIge1xyXG4gIC1tcy1vdmVyZmxvdy1zdHlsZTogbm9uZTsgLyogSUUgYW5kIEVkZ2UgKi9cclxuICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7IC8qIEZpcmVmb3ggKi9cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZsZXggc3BhY2UteS04IGxnOnNwYWNlLXktMCBsZzpzcGFjZS14LTggZmxleC1jb2wgbGc6ZmxleC1yb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJsZzp3LTIvMTJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtY29sIHNwYWNlLXktMVwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHYtZm9yPVwiaXRlbSBpbiBpdGVtc1wiXHJcbiAgICAgICAgICA6a2V5PVwiaXRlbS5pZFwiXHJcbiAgICAgICAgICA6ZGF0YS10YWItaWQ9XCJpdGVtLmlkXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltidXR0b25DbGFzcyhpdGVtKV1cIlxyXG4gICAgICAgICAgOmRpc2FibGVkPVwiaXRlbS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICBAY2xpY2s9XCJzZXRBY3RpdmVJdGVtKGl0ZW0pXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIHYtdGlwcHk9XCJcclxuICAgICAgICAgICAgICBpdGVtLmRpc2FibGVkICYmIGl0ZW0uZGlzYWJsZWRNZXNzYWdlID8gaXRlbS5kaXNhYmxlZE1lc3NhZ2UgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMCByaWdodC0wIGxlZnQtMCBib3R0b20tMFwiXHJcbiAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBzcGFjZS14LTIgaXRlbXMtY2VudGVyIHB4LTJcIj5cclxuICAgICAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgICAgIDppcz1cIml0ZW0uaWNvblwiXHJcbiAgICAgICAgICAgICAgdi1pZj1cIml0ZW0uaWNvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzaHJpbmstMCBoLTQgdy00IHN0cm9rZS1bMnB4XVwiXHJcbiAgICAgICAgICAgID48L2NvbXBvbmVudD5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW4tdy02XCI+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIHYtaWY9XCJpdGVtLmNvdW50XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtZnVsbCBweC0yIHRleHQtYm9keS0zeHMgdHJhbnNpdGlvbi1hbGwgbWluLXctNlwiXHJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiXHJcbiAgICAgICAgICAgICAgICBhY3RpdmVJdGVtPy5pZCA9PT0gaXRlbS5pZFxyXG4gICAgICAgICAgICAgICAgICA/ICd0ZXh0LXByaW1hcnkgYmctaW5mby1saWdodGVyIGRhcms6dGV4dC1mb3JlZ3JvdW5kJ1xyXG4gICAgICAgICAgICAgICAgICA6ICd0ZXh0LWZvcmVncm91bmQtMiBiZy1mb3VuZGF0aW9uLTInXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0uY291bnQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgdi1pZj1cIml0ZW0udGFnXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRleHQtYm9keS0zeHMgZm9udC1tZWRpdW0gcHktMC41IHB4LTEuNSB0ZXh0LWZvcmVncm91bmQtMiBiZy1mb3VuZGF0aW9uLTIgdXBwZXJjYXNlIHRleHQtb3V0bGluZS00IHJvdW5kZWRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgaXRlbS50YWcgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibGc6dy0xMC8xMlwiPlxyXG4gICAgICA8c2xvdCA6YWN0aXZlLWl0ZW09XCJhY3RpdmVJdGVtXCIgLz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgY29tcHV0ZWQsIG9uTW91bnRlZCwgd2F0Y2ggfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgTGF5b3V0UGFnZVRhYkl0ZW0gfSBmcm9tICd+fi9zcmMvaGVscGVycy9sYXlvdXQvY29tcG9uZW50cydcclxuaW1wb3J0IHsgaXNDbGllbnQgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBpdGVtczogTGF5b3V0UGFnZVRhYkl0ZW1bXVxyXG59PigpXHJcblxyXG5jb25zdCBhY3RpdmVJdGVtID0gZGVmaW5lTW9kZWw8TGF5b3V0UGFnZVRhYkl0ZW0+KCdhY3RpdmVJdGVtJywgeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG5cclxuY29uc3QgYnV0dG9uQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIChpdGVtOiBMYXlvdXRQYWdlVGFiSXRlbSkgPT4ge1xyXG4gICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVJdGVtLnZhbHVlPy5pZCA9PT0gaXRlbS5pZFxyXG4gICAgY29uc3QgYmFzZUNsYXNzZXMgPSBbXHJcbiAgICAgICdyZWxhdGl2ZScsXHJcbiAgICAgICdmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTEuNScsXHJcbiAgICAgICdob3ZlcjpiZy1oaWdobGlnaHQtMicsXHJcbiAgICAgICdkaXNhYmxlZDpvcGFjaXR5LTYwIGRpc2FibGVkOmhvdmVyOmJvcmRlci10cmFuc3BhcmVudCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6aG92ZXI6YmctdHJhbnNwYXJlbnQgcm91bmRlZC1tZCcsXHJcbiAgICAgICd0ZXh0LWJvZHkteHMgZm9udC1tZWRpdW0nLFxyXG4gICAgICAncHktMSdcclxuICAgIF1cclxuXHJcbiAgICBpZiAoaXNBY3RpdmUpIGJhc2VDbGFzc2VzLnB1c2goJ2JnLXByaW1hcnktbXV0ZWQnKVxyXG4gICAgZWxzZSBiYXNlQ2xhc3Nlcy5wdXNoKCdib3JkZXItdHJhbnNwYXJlbnQgdGV4dC1mb3JlZ3JvdW5kJylcclxuXHJcbiAgICByZXR1cm4gYmFzZUNsYXNzZXNcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBzZXRBY3RpdmVJdGVtID0gKGl0ZW06IExheW91dFBhZ2VUYWJJdGVtKSA9PiB7XHJcbiAgYWN0aXZlSXRlbS52YWx1ZSA9IGl0ZW1cclxufVxyXG5cclxub25Nb3VudGVkKCgpID0+IHtcclxuICBpZiAoaXNDbGllbnQpIHtcclxuICAgIGlmIChwcm9wcy5pdGVtcy5sZW5ndGggJiYgIWFjdGl2ZUl0ZW0udmFsdWUpIHtcclxuICAgICAgc2V0QWN0aXZlSXRlbShwcm9wcy5pdGVtc1swXSlcclxuICAgIH1cclxuICB9XHJcbn0pXHJcblxyXG53YXRjaChcclxuICAoKSA9PiBbcHJvcHMuaXRlbXMsIGFjdGl2ZUl0ZW0udmFsdWVdLFxyXG4gIChbbmV3SXRlbXNdKSA9PiB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdJdGVtcykgJiYgbmV3SXRlbXMubGVuZ3RoICYmICFhY3RpdmVJdGVtLnZhbHVlKSB7XHJcbiAgICAgIHNldEFjdGl2ZUl0ZW0obmV3SXRlbXNbMF0pXHJcbiAgICB9XHJcbiAgfVxyXG4pXHJcbjwvc2NyaXB0PlxyXG4iLCI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPGRpdiA6Y2xhc3M9XCJ0YWJsZUNsYXNzZXNcIj5cclxuICAgIDxkaXYgOmNsYXNzPVwiaGVhZGVyUm93Q2xhc3Nlc1wiIDpzdHlsZT1cInsgcGFkZGluZ1JpZ2h0OiBwYWRkaW5nUmlnaHRTdHlsZSB9XCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICB2LWZvcj1cIihjb2x1bW4sIGNvbEluZGV4KSBpbiBjb2x1bW5zXCJcclxuICAgICAgICA6a2V5PVwiY29sdW1uLmlkXCJcclxuICAgICAgICA6Y2xhc3M9XCJnZXRIZWFkZXJDbGFzc2VzKGNvbHVtbi5pZCwgY29sSW5kZXgpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGNvbHVtbi5oZWFkZXIgfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgOmNsYXNzPVwicmVzdWx0Q29udGFpbmVyQ2xhc3Nlc1wiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi1pZj1cImxvYWRpbmcgfHwgIWl0ZW1zXCJcclxuICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTNcIlxyXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgID5cclxuICAgICAgICA8Q29tbW9uTG9hZGluZ0ljb24gLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJpdGVtcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgdi1mb3I9XCJpdGVtIGluIGl0ZW1zXCJcclxuICAgICAgICAgIDprZXk9XCJpdGVtLmlkXCJcclxuICAgICAgICAgIDpzdHlsZT1cInsgcGFkZGluZ1JpZ2h0OiBwYWRkaW5nUmlnaHRTdHlsZSB9XCJcclxuICAgICAgICAgIDpjbGFzcz1cInJvd3NXcmFwcGVyQ2xhc3Nlc1wiXHJcbiAgICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiaGFuZGxlUm93Q2xpY2soaXRlbSlcIlxyXG4gICAgICAgICAgQGtleXByZXNzPVwiaGFuZGxlUm93Q2xpY2soaXRlbSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihjb2x1bW4sIGNvbEluZGV4KSBpbiBjb2x1bW5zXCIgOmtleT1cImNvbHVtbi5pZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IDpjbGFzcz1cImdldENsYXNzZXMoY29sdW1uLmlkLCBjb2xJbmRleClcIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICA8c2xvdCA6bmFtZT1cImNvbHVtbi5pZFwiIDppdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZm9yZWdyb3VuZC0yIGZvbnQtbWVkaXVtIG9yZGVyLTFcIj5QbGFjZWhvbGRlcjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvc2xvdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICB2LWlmPVwiYnV0dG9uc1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgcmlnaHQtMS41IHNwYWNlLXgtMSBmbGV4IGl0ZW1zLWNlbnRlciBwLTAgaC1mdWxsXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiB2LWZvcj1cImJ1dHRvbiBpbiBidXR0b25zXCIgOmtleT1cImJ1dHRvbi5sYWJlbFwiPlxyXG4gICAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgICB2LXRpcHB5PVwiYnV0dG9uLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgOmljb24tbGVmdD1cImJ1dHRvbi5pY29uXCJcclxuICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJidXR0b24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiYnV0dG9uLmNsYXNzXCJcclxuICAgICAgICAgICAgICAgIDp0bz1cImlzU3RyaW5nKGJ1dHRvbi5hY3Rpb24pID8gYnV0dG9uLmFjdGlvbiA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cIiFpc1N0cmluZyhidXR0b24uYWN0aW9uKSA/IGJ1dHRvbi5hY3Rpb24oaXRlbSkgOiBub29wXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICA6c3R5bGU9XCJ7IHBhZGRpbmdSaWdodDogcGFkZGluZ1JpZ2h0U3R5bGUgfVwiXHJcbiAgICAgICAgOmNsYXNzPVwicm93c1dyYXBwZXJDbGFzc2VzXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgOmNsYXNzPVwiZ2V0Q2xhc3Nlcyh1bmRlZmluZWQsIDApXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwiZW1wdHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCB0ZXh0LWNlbnRlciBsYWJlbC1saWdodCB0ZXh0LWZvcmVncm91bmQtMiBpdGFsaWNcIj5cclxuICAgICAgICAgICAgICB7eyBlbXB0eU1lc3NhZ2UgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8c2xvdCBuYW1lPVwibG9hZGVyXCIgLz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiIGdlbmVyaWM9XCJUIGV4dGVuZHMge2lkOiBzdHJpbmd9LCBDIGV4dGVuZHMgc3RyaW5nXCI+XHJcbmltcG9ydCB7IG5vb3AsIGlzU3RyaW5nIH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgUHJvcEFueUNvbXBvbmVudCB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2NvbW1vbi9jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyBDb21tb25Mb2FkaW5nSWNvbiwgRm9ybUJ1dHRvbiB9IGZyb20gJ35+L3NyYy9saWInXHJcbmltcG9ydCB7IGRpcmVjdGl2ZSBhcyB2VGlwcHkgfSBmcm9tICd2dWUtdGlwcHknXHJcblxyXG5leHBvcnQgdHlwZSBUYWJsZUNvbHVtbjxJPiA9IHtcclxuICBpZDogSVxyXG4gIGhlYWRlcjogc3RyaW5nXHJcbiAgY2xhc3Nlczogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJvd0J1dHRvbjxUID0gdW5rbm93bj4gPSB7XHJcbiAgaWNvbjogUHJvcEFueUNvbXBvbmVudFxyXG4gIGxhYmVsOiBzdHJpbmdcclxuICBhY3Rpb246IChpdGVtOiBUKSA9PiB1bmtub3duXHJcbiAgY2xhc3M/OiBzdHJpbmdcclxuICB0b29sdGlwPzogc3RyaW5nXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuXHJcbn1cclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIGl0ZW1zOiBUW10gfCB1bmRlZmluZWQgfCBudWxsXHJcbiAgICBidXR0b25zPzogUm93QnV0dG9uPFQ+W11cclxuICAgIGNvbHVtbnM6IFRhYmxlQ29sdW1uPEM+W11cclxuICAgIG92ZXJmbG93Q2VsbHM/OiBib29sZWFuXHJcbiAgICBvblJvd0NsaWNrPzogKGl0ZW06IFQpID0+IHZvaWRcclxuICAgIHJvd0l0ZW1zQWxpZ24/OiAnY2VudGVyJyB8ICdzdHJldGNoJ1xyXG4gICAgZW1wdHlNZXNzYWdlPzogc3RyaW5nXHJcbiAgICBsb2FkaW5nPzogYm9vbGVhblxyXG4gIH0+KCksXHJcbiAgeyByb3dJdGVtc0FsaWduOiAnY2VudGVyJywgZW1wdHlNZXNzYWdlOiAnTm8gZGF0YSBmb3VuZCcgfVxyXG4pXHJcblxyXG5jb25zdCB0YWJsZUNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFtcclxuICAgICd3LWZ1bGwgdGV4dC1mb3JlZ3JvdW5kIHRleHQtc20gYm9yZGVyIGJvcmRlci1vdXRsaW5lLTMgcm91bmRlZC1sZycsXHJcbiAgICAnb3ZlcmZsb3cteC1hdXRvIHNpbXBsZS1zY3JvbGxiYXInLFxyXG4gICAgJ2gtZnVsbCBmbGV4IGZsZXgtY29sJ1xyXG4gIF1cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IHNoYXJlZENvbnRhaW5lckNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFsndy1mdWxsIG1pbi13LVs3NTBweF0nXVxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgcmVzdWx0Q29udGFpbmVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ2RpdmlkZS15IGRpdmlkZS1vdXRsaW5lLTMgb3ZlcmZsb3cteS1hdXRvIG92ZXJmbG93LXgtaGlkZGVuIHNpbXBsZS1zY3JvbGxiYXInLFxyXG4gICAgc2hhcmVkQ29udGFpbmVyQ2xhc3Nlcy52YWx1ZVxyXG4gIF1cclxuXHJcbiAgaWYgKHByb3BzLm92ZXJmbG93Q2VsbHMpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncGItMzInKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBidXR0b25Db3VudCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gKHByb3BzLmJ1dHRvbnMgfHwgW10pLmxlbmd0aFxyXG59KVxyXG5jb25zdCBwYWRkaW5nUmlnaHRTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBsZXQgcGFkZGluZyA9IDE2XHJcbiAgaWYgKGJ1dHRvbkNvdW50LnZhbHVlID4gMCkge1xyXG4gICAgcGFkZGluZyA9IDQ4ICsgKGJ1dHRvbkNvdW50LnZhbHVlIC0gMSkgKiA0MlxyXG4gIH1cclxuICByZXR1cm4gYCR7cGFkZGluZ31weGBcclxufSlcclxuXHJcbmNvbnN0IHJvd3NXcmFwcGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ3JlbGF0aXZlIGdyaWQgZ3JpZC1jb2xzLTEyIGl0ZW1zLWNlbnRlciBzcGFjZS14LTYgcHgtNCBweS0wLjUgbWluLXctWzc1MHB4XSB0ZXh0LWJvZHkteHMnXHJcbiAgXVxyXG5cclxuICBpZiAocHJvcHMub25Sb3dDbGljayAmJiBwcm9wcy5pdGVtcz8ubGVuZ3RoKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2N1cnNvci1wb2ludGVyIGhvdmVyOmJnLWhpZ2hsaWdodC0xJylcclxuICB9XHJcblxyXG4gIHN3aXRjaCAocHJvcHMucm93SXRlbXNBbGlnbikge1xyXG4gICAgY2FzZSAnY2VudGVyJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdpdGVtcy1jZW50ZXInKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnc3RyZXRjaCc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnaXRlbXMtc3RyZXRjaCcpXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGdldEhlYWRlckNsYXNzZXMgPSAoXHJcbiAgY29sdW1uOiBDIHwgdW5kZWZpbmVkLFxyXG4gIGNvbEluZGV4OiBudW1iZXIsXHJcbiAgb3B0aW9ucz86IFBhcnRpYWw8e1xyXG4gICAgbm9QYWRkaW5nOiBib29sZWFuXHJcbiAgfT5cclxuKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBjb2x1bW5DbGFzc2VzID0gY29sdW1uXHJcbiAgICA/IHByb3BzLmNvbHVtbnMuZmluZCgoYykgPT4gYy5pZCA9PT0gY29sdW1uKT8uY2xhc3Nlc1xyXG4gICAgOiAnJ1xyXG4gIGNvbnN0IGNsYXNzUGFydHMgPSBbY29sdW1uQ2xhc3NlcyB8fCAnJ11cclxuXHJcbiAgaWYgKCFvcHRpb25zPy5ub1BhZGRpbmcpIHtcclxuICAgIGlmIChjb2xJbmRleCA9PT0gMCkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3B4LTEnKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdsZzpwLTAgcHgtMScpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufVxyXG5cclxuY29uc3QgZ2V0Q2xhc3NlcyA9IChcclxuICBjb2x1bW46IEMgfCB1bmRlZmluZWQsXHJcbiAgY29sSW5kZXg6IG51bWJlcixcclxuICBvcHRpb25zPzogUGFydGlhbDx7XHJcbiAgICBub1BhZGRpbmc6IGJvb2xlYW5cclxuICB9PlxyXG4pOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHMgPSBbZ2V0SGVhZGVyQ2xhc3Nlcyhjb2x1bW4sIGNvbEluZGV4LCBvcHRpb25zKV1cclxuXHJcbiAgaWYgKGNvbEluZGV4ID09PSAwKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goYGJnLXRyYW5zcGFyZW50IHB5LTIgJHtjb2x1bW4gPyAncHItNScgOiAnY29sLXNwYW4tZnVsbCd9YClcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKGBteS0yYClcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVSb3dDbGljayA9IChpdGVtOiBUKSA9PiB7XHJcbiAgcHJvcHMub25Sb3dDbGljaz8uKGl0ZW0pXHJcbn1cclxuXHJcbmNvbnN0IGhlYWRlclJvd0NsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiBbXHJcbiAgJ3otMTAgZ3JpZCBncmlkLWNvbHMtMTIgaXRlbXMtY2VudGVyJyxcclxuICAnc3BhY2UteC02JyxcclxuICAncHgtNCBweS0zJyxcclxuICAnYmctZm91bmRhdGlvbi0yIHJvdW5kZWQtdC1sZycsXHJcbiAgJ2ZvbnQtbWVkaXVtIHRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTInLFxyXG4gICdib3JkZXItYiBib3JkZXItb3V0bGluZS0zJyxcclxuICBzaGFyZWRDb250YWluZXJDbGFzc2VzLnZhbHVlXHJcbl0pXHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiByZWY9XCJ3cmFwcGVyXCI+XHJcbiAgICA8SW50ZXJuYWxJbmZpbml0ZUxvYWRpbmdcclxuICAgICAgdi1pZj1cImluaXRpYWxpemVMb2FkZXJcIlxyXG4gICAgICB2LWJpbmQ9XCIkcHJvcHMuc2V0dGluZ3MgfHwge31cIlxyXG4gICAgICBAaW5maW5pdGU9XCIkZW1pdCgnaW5maW5pdGUnLCAkZXZlbnQpXCJcclxuICAgID5cclxuICAgICAgPHRlbXBsYXRlICNzcGlubmVyPlxyXG4gICAgICAgIDxDb21tb25Mb2FkaW5nQmFyIDpsb2FkaW5nPVwidHJ1ZVwiIGNsYXNzPVwibXktMlwiIC8+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDx0ZW1wbGF0ZSAjY29tcGxldGU+XHJcbiAgICAgICAgPCEtLSBObyBcIk5vIG1vcmUgaXRlbXNcIiBtZXNzYWdlLCBpbnN0ZWFkIGEgc21hbGwgYW1vdW50IG9mIHNwYWNpbmcgLS0+XHJcbiAgICAgICAgPGRpdiA6Y2xhc3M9XCJ7ICdoLTgnOiAhaGlkZVdoZW5Db21wbGV0ZSB9XCI+PC9kaXY+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDx0ZW1wbGF0ZSAjZXJyb3I9XCJ7IHJldHJ5IH1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIG15LTIgc3BhY2UteS0yIG10LTRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xXCI+XHJcbiAgICAgICAgICAgIDxFeGNsYW1hdGlvblRyaWFuZ2xlSWNvbiBjbGFzcz1cInctNSBoLTUgdGV4dC1kYW5nZXJcIiAvPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZm9yZWdyb3VuZC0yXCI+QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZzwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPEZvcm1CdXR0b24gdi1pZj1cImFsbG93UmV0cnlcIiBAY2xpY2s9XCJyZXRyeVwiPlJldHJ5PC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC9JbnRlcm5hbEluZmluaXRlTG9hZGluZz5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IEludGVybmFsSW5maW5pdGVMb2FkaW5nIGZyb20gJ3YzLWluZmluaXRlLWxvYWRpbmcnXHJcbmltcG9ydCB7IEV4Y2xhbWF0aW9uVHJpYW5nbGVJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHR5cGUgeyBJbmZpbml0ZUxvYWRlclN0YXRlIH0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvZ2xvYmFsL2NvbXBvbmVudHMnXHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCBDb21tb25Mb2FkaW5nQmFyIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9sb2FkaW5nL0Jhci52dWUnXHJcbmltcG9ydCB7IG9uTW91bnRlZCwgcmVmIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyBpc0NsaWVudCB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IEZvcm1CdXR0b24gZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvZm9ybS9CdXR0b24udnVlJ1xyXG5cclxuZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAnaW5maW5pdGUnLCAkc3RhdGU6IEluZmluaXRlTG9hZGVyU3RhdGUpOiB2b2lkXHJcbn0+KClcclxuXHJcbmRlZmluZVByb3BzPHtcclxuICAvKipcclxuICAgKiB2My1pbmZpbml0ZS1sb2FkaW5nIHByb3BzLCBzZWUgZG9jcyBvciB0eXBlIGRlZmluaXRpb25zXHJcbiAgICovXHJcbiAgc2V0dGluZ3M/OiB7XHJcbiAgICB0YXJnZXQ/OiBzdHJpbmdcclxuICAgIGRpc3RhbmNlPzogbnVtYmVyXHJcbiAgICB0b3A/OiBib29sZWFuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgaWRlbnRpZmllcj86IGFueVxyXG4gICAgZmlyc3Rsb2FkPzogYm9vbGVhblxyXG4gIH1cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGFsbG93IHJldHJ5IGFuZCBzaG93IGEgcmV0cnkgYnV0dG9uIHdoZW4gbG9hZGluZyBmYWlsc1xyXG4gICAqL1xyXG4gIGFsbG93UmV0cnk/OiBib29sZWFuXHJcbiAgLyoqXHJcbiAgICogSGlkZSBjb21wbGV0ZWx5IGFuZCBwcmV2ZW50IHRha2luZyBhbnkgc3BhY2Ugd2hlbiBub3QgbG9hZGluZ1xyXG4gICAqL1xyXG4gIGhpZGVXaGVuQ29tcGxldGU/OiBib29sZWFuXHJcbn0+KClcclxuXHJcbmNvbnN0IHdyYXBwZXIgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MRWxlbWVudD4pXHJcbmNvbnN0IGluaXRpYWxpemVMb2FkZXIgPSByZWYoZmFsc2UpXHJcblxyXG4vLyBUaGlzIGhhY2sgaXMgbmVjZXNzYXJ5IGNhdXNlIHNvbWV0aW1lcyB2My1pbmZpbml0ZS1sb2FkaW5nIGluaXRpYWxpemVzIHRvbyBlYXJseSBhbmQgZG9lc250IHRyaWdnZXJcclxuaWYgKGlzQ2xpZW50KSB7XHJcbiAgb25Nb3VudGVkKCgpID0+IHtcclxuICAgIGNvbnN0IGludCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgaWYgKHdyYXBwZXIudmFsdWU/LmlzQ29ubmVjdGVkKSB7XHJcbiAgICAgICAgaW5pdGlhbGl6ZUxvYWRlci52YWx1ZSA9IHRydWVcclxuICAgICAgICBjbGVhckludGVydmFsKGludClcclxuICAgICAgfVxyXG4gICAgfSwgMjAwKVxyXG4gIH0pXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZ3JvdXBcIj5cclxuICAgIDxkaXZcclxuICAgICAgdi1pZj1cImZhbmN5R2xvd1wiXHJcbiAgICAgIGNsYXNzPVwiYWJzb2x1dGUgLXRvcC0xIC1sZWZ0LTEgLXJpZ2h0LTEgLWJvdHRvbS0xIGJnLWJsdWUtMzAwIGRhcms6YmctYmx1ZS01MDAgb3BhY2l0eS01IGRhcms6b3BhY2l0eS0wIHJvdW5kZWQtbWQgYmx1ci1zbSBncm91cC1ob3ZlcjpvcGFjaXR5LTYwIGRhcms6Z3JvdXAtaG92ZXI6b3BhY2l0eS0zMCB0cmFuc2l0aW9uIGR1cmF0aW9uLTUwMFwiXHJcbiAgICA+PC9kaXY+XHJcbiAgICA8Q29tcG9uZW50XHJcbiAgICAgIDppcz1cImZvcm0gPyAnZm9ybScgOiAnZGl2J1wiXHJcbiAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICAncmVsYXRpdmUgZGl2aWRlLW91dGxpbmUtMyBiZy1mb3VuZGF0aW9uIHRleHQtZm9yZWdyb3VuZCBmbGV4IGZsZXgtY29sIGRpdmlkZS15IG92ZXJmbG93LWhpZGRlbicsXHJcbiAgICAgICAgY29tcHV0ZWRDbGFzc2VzXHJcbiAgICAgIF1cIlxyXG4gICAgICBAc3VibWl0PVwiZW1pdCgnc3VibWl0JywgJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgdi1pZj1cIiRzbG90cy5oZWFkZXJcIiA6Y2xhc3M9XCJzZWNvbmRhcnlTbG90UGFkZGluZ0NsYXNzZXNcIj5cclxuICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyXCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgOmNsYXNzPVwiWydncm93JywgZGVmYXVsdFNsb3RQYWRkaW5nQ2xhc3Nlc11cIj5cclxuICAgICAgICA8c2xvdCAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiB2LWlmPVwiJHNsb3RzLmZvb3RlclwiIDpjbGFzcz1cInNlY29uZGFyeVNsb3RQYWRkaW5nQ2xhc3Nlc1wiPlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXJcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvQ29tcG9uZW50PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7IChlOiAnc3VibWl0JywgdmFsOiBTdWJtaXRFdmVudCk6IHZvaWQgfT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XHJcbiAgLyoqXHJcbiAgICogVXNlIGEgYDxmb3JtLz5gIGVsZW1lbnQgYXMgYSB3cmFwcGVyIHRoYXQgd2lsbCBlbWl0ICdzdWJtaXQnIGV2ZW50cyBvdXQgZnJvbSB0aGUgY29tcG9uZW50IHdoZW4gdGhleSBvY2N1clxyXG4gICAqL1xyXG4gIGZvcm06IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQWRkIGEgcmluZyBvdXRsaW5lIG9uIGhvdmVyXHJcbiAgICovXHJcbiAgcmluZzoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBBZGQgYSBwcmltYXJ5LWNvbG9yZWQgZ2xvdyBvbiBob3ZlclxyXG4gICAqL1xyXG4gIGZhbmN5R2xvdzoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBjdXN0b21QYWRkaW5nOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIG5vU2hhZG93OiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIHBhbmVsQ2xhc3Nlczoge1xyXG4gICAgdHlwZTogU3RyaW5nXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3Qgc2Vjb25kYXJ5U2xvdFBhZGRpbmdDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT5cclxuICBwcm9wcy5jdXN0b21QYWRkaW5nID8gJycgOiAncHgtNCBweS00IHNtOnB4LTYnXHJcbilcclxuY29uc3QgZGVmYXVsdFNsb3RQYWRkaW5nQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+XHJcbiAgcHJvcHMuY3VzdG9tUGFkZGluZyA/ICcnIDogJ3B4LTQgcHktNCBzbTpwLTYnXHJcbilcclxuXHJcbmNvbnN0IGNvbXB1dGVkQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsncm91bmRlZC1sZyddXHJcblxyXG4gIGlmICghcHJvcHMubm9TaGFkb3cpIGNsYXNzUGFydHMucHVzaCgnc2hhZG93JylcclxuICBpZiAocHJvcHMucmluZykge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdyaW5nLW91dGxpbmUtMSBob3ZlcjpyaW5nLTEnKVxyXG4gIH1cclxuICBpZiAocHJvcHMucGFuZWxDbGFzc2VzKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2gocHJvcHMucGFuZWxDbGFzc2VzKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPCEtLSBJZiBwcm9tbyBjb250ZW50IGlzIGRlZmluZWQsIHNjcm9sbCB0aGUgbWVudSBpdGVtcy4gSWYgbm90LCBzY3JvbGwgdGhlIHdob2xlIGFzaWRlICAtLT5cclxuICA8YXNpZGVcclxuICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gaC1mdWxsIHctZnVsbFwiXHJcbiAgICA6Y2xhc3M9XCIkc2xvdHMucHJvbW8gPyAnJyA6ICdvdmVyZmxvdy15LWF1dG8gb3ZlcmZsb3cteC1oaWRkZW4gc2ltcGxlLXNjcm9sbGJhcidcIlxyXG4gID5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGgtZnVsbCB3LWZ1bGxcIlxyXG4gICAgICA6Y2xhc3M9XCIkc2xvdHMucHJvbW8gPyAnb3ZlcmZsb3cteS1hdXRvIG92ZXJmbG93LXgtaGlkZGVuIHNpbXBsZS1zY3JvbGxiYXInIDogJydcIlxyXG4gICAgPlxyXG4gICAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgdi1pZj1cIiRzbG90cy5wcm9tb1wiIGNsYXNzPVwic2hyaW5rLTAgcHQtMlwiPlxyXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbW9cIj48L3Nsb3Q+XHJcbiAgICA8L2Rpdj5cclxuICA8L2FzaWRlPlxyXG48L3RlbXBsYXRlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC15LTEgc206Z2FwLXktMiBib3JkZXIgYm9yZGVyLW91dGxpbmUtMyByb3VuZGVkLWxnIHB5LTIgcHgtMyBzbTpwLTQgc2VsZWN0LW5vbmVcIlxyXG4gID5cclxuICAgIDxoNlxyXG4gICAgICB2LWlmPVwidGl0bGVcIlxyXG4gICAgICBjbGFzcz1cInRleHQtYm9keS14cyBzbTp0ZXh0LWhlYWRpbmctc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kXCJcclxuICAgID5cclxuICAgICAge3sgdGl0bGUgfX1cclxuICAgIDwvaDY+XHJcbiAgICA8cCB2LWlmPVwidGV4dFwiIGNsYXNzPVwidGV4dC1ib2R5LTJ4cyBzbTp0ZXh0LWJvZHkteHMgdGV4dC1mb3JlZ3JvdW5kLTIgIWxlYWRpbmctNVwiPlxyXG4gICAgICB7eyB0ZXh0IH19XHJcbiAgICA8L3A+XHJcbiAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICB2LWlmPVwiYnV0dG9uVGV4dFwiXHJcbiAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgIGNsYXNzPVwibXQtMVwiXHJcbiAgICAgIDp0bz1cInRvXCJcclxuICAgICAgOnRhcmdldD1cInRvID8gJ19ibGFuaycgOiB1bmRlZmluZWRcIlxyXG4gICAgICBAY2xpY2s9XCIkZW1pdCgnb25DbGljaycpXCJcclxuICAgID5cclxuICAgICAge3sgYnV0dG9uVGV4dCB9fVxyXG4gICAgPC9Gb3JtQnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IEZvcm1CdXR0b24gZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvZm9ybS9CdXR0b24udnVlJ1xyXG5cclxuZGVmaW5lRW1pdHMoWydvbkNsaWNrJ10pXHJcblxyXG5kZWZpbmVQcm9wczx7XHJcbiAgdGl0bGU/OiBzdHJpbmdcclxuICB0ZXh0Pzogc3RyaW5nXHJcbiAgdG8/OiBzdHJpbmdcclxuICBidXR0b25UZXh0Pzogc3RyaW5nXHJcbn0+KClcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8bmF2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgPHNsb3Q+PC9zbG90PlxyXG4gIDwvbmF2PlxyXG48L3RlbXBsYXRlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPHN2Z1xyXG4gICAgd2lkdGg9XCIxNlwiXHJcbiAgICBoZWlnaHQ9XCIxNlwiXHJcbiAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgIGZpbGw9XCJub25lXCJcclxuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gID5cclxuICAgIDxwYXRoIGQ9XCJNOCAzVjEzTTMgOEgxM1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIC8+XHJcbiAgPC9zdmc+XHJcbjwvdGVtcGxhdGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3ZnXHJcbiAgICB3aWR0aD1cIjE0XCJcclxuICAgIGhlaWdodD1cIjE0XCJcclxuICAgIHZpZXdCb3g9XCIwIDAgMTQgMTRcIlxyXG4gICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgPlxyXG4gICAgPHBhdGhcclxuICAgICAgZD1cIk0zLjY2NzQ4IDMuNjY2ODdIMy4wMDA4MUMyLjY0NzE5IDMuNjY2ODcgMi4zMDgwNSAzLjgwNzM1IDIuMDU4IDQuMDU3MzlDMS44MDc5NiA0LjMwNzQ0IDEuNjY3NDggNC42NDY1OCAxLjY2NzQ4IDUuMDAwMlYxMS4wMDAyQzEuNjY3NDggMTEuMzUzOCAxLjgwNzk2IDExLjY5MyAyLjA1OCAxMS45NDNDMi4zMDgwNSAxMi4xOTMxIDIuNjQ3MTkgMTIuMzMzNSAzLjAwMDgxIDEyLjMzMzVIOS4wMDA4MUM5LjM1NDQzIDEyLjMzMzUgOS42OTM1NyAxMi4xOTMxIDkuOTQzNjIgMTEuOTQzQzEwLjE5MzcgMTEuNjkzIDEwLjMzNDEgMTEuMzUzOCAxMC4zMzQxIDExLjAwMDJWMTAuMzMzNVwiXHJcbiAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAvPlxyXG4gICAgPHBhdGhcclxuICAgICAgZD1cIk0xMi41OSAzLjM5MDA3QzEyLjg1MjYgMy4xMjc1MSAxMy4wMDAxIDIuNzcxMzkgMTMuMDAwMSAyLjQwMDA3QzEzLjAwMDEgMi4wMjg3NSAxMi44NTI2IDEuNjcyNjQgMTIuNTkgMS40MTAwN0MxMi4zMjc0IDEuMTQ3NTEgMTEuOTcxMyAxIDExLjYgMUMxMS4yMjg3IDEgMTAuODcyNiAxLjE0NzUxIDEwLjYxIDEuNDEwMDdMNSA3LjAwMDA3VjkuMDAwMDdIN0wxMi41OSAzLjM5MDA3WlwiXHJcbiAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAvPlxyXG4gICAgPHBhdGhcclxuICAgICAgZD1cIk05LjY2NzQ4IDIuMzMzMTNMMTEuNjY3NSA0LjMzMzEzXCJcclxuICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgIC8+XHJcbiAgPC9zdmc+XHJcbjwvdGVtcGxhdGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3ZnXHJcbiAgICB3aWR0aD1cIjE2XCJcclxuICAgIGhlaWdodD1cIjMyXCJcclxuICAgIHZpZXdCb3g9XCIwIDAgMTYgMzJcIlxyXG4gICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgPlxyXG4gICAgPHBhdGhcclxuICAgICAgZD1cIk03LjY0NjQ1IDE3Ljc0OThDNy44NDE3MSAxNy45NDUxIDguMTU4MjkgMTcuOTQ1MSA4LjM1MzU1IDE3Ljc0OThMMTEuMTQ2NCAxNC45NTY5QzExLjQ2MTQgMTQuNjQyIDExLjIzODMgMTQuMTAzNCAxMC43OTI5IDE0LjEwMzRINS4yMDcxMUM0Ljc2MTY1IDE0LjEwMzQgNC41Mzg1NyAxNC42NDIgNC44NTM1NSAxNC45NTY5TDcuNjQ2NDUgMTcuNzQ5OFpcIlxyXG4gICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcclxuICAgIC8+XHJcbiAgPC9zdmc+XHJcbjwvdGVtcGxhdGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBncm91cFwiPlxyXG4gICAgPGRpdlxyXG4gICAgICB2LWlmPVwidGl0bGVcIlxyXG4gICAgICBjbGFzcz1cImgtOCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gc2VsZWN0LW5vbmUgcm91bmRlZC1tZFwiXHJcbiAgICAgIDpjbGFzcz1cIltjb2xsYXBzaWJsZSAmJiAhbm9Ib3ZlciAmJiAnaG92ZXI6YmctaGlnaGxpZ2h0LTEnXVwiXHJcbiAgICA+XHJcbiAgICAgIDxjb21wb25lbnRcclxuICAgICAgICA6aXM9XCJjb2xsYXBzaWJsZSA/ICdidXR0b24nIDogJ2RpdidcIlxyXG4gICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdy1mdWxsXCJcclxuICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICBjb2xsYXBzaWJsZSA/ICdncm91cCByb3VuZGVkLW1kIGdhcC14LTEnIDogJ3NwYWNlLXgtMSBwLTEgdGV4dC1mb3JlZ3JvdW5kLTInLFxyXG4gICAgICAgICAgY29sbGFwc2libGUgJiYgIW5vSG92ZXIgPyAncHktMC41IHB4LTInIDogJ3BsLTInXHJcbiAgICAgICAgXVwiXHJcbiAgICAgICAgQGNsaWNrPVwiY29sbGFwc2libGUgPyAoaXNDb2xsYXBzZWQgPSAhaXNDb2xsYXBzZWQpIDogdW5kZWZpbmVkXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxBcnJvd0ZpbGxlZFxyXG4gICAgICAgICAgdi1pZj1cImNvbGxhcHNpYmxlXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltpc0NvbGxhcHNlZCA/ICctcm90YXRlLTkwJyA6ICcnLCBub0hvdmVyID8gJy1tbC0xJyA6ICcnXVwiXHJcbiAgICAgICAgICBjbGFzcz1cInRleHQtZm9yZWdyb3VuZC0yIHNocmluay0wXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHYtaWY9XCIkc2xvdHNbJ3RpdGxlLWljb24nXVwiXHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltjb2xsYXBzaWJsZSA/ICdtbC0xIG1yLTInIDogJyddXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwidGl0bGUtaWNvblwiPjwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LTEgaXRlbXMtY2VudGVyIHRydW5jYXRlIGp1c3RpZnktYmV0d2VlblwiPlxyXG4gICAgICAgICAgPGg2XHJcbiAgICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGUgdGV4dC1ib2R5LTJ4cyBwci0yXCJcclxuICAgICAgICAgICAgOmNsYXNzPVwiW25lc3RlZCA/ICd0ZXh0LWZvcmVncm91bmQnIDogJ2ZvbnQtc2VtaWJvbGQgdGV4dC1mb3JlZ3JvdW5kLTInXVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IHRpdGxlIH19XHJcbiAgICAgICAgICA8L2g2PlxyXG4gICAgICAgICAgPENvbW1vbkJhZGdlIHYtaWY9XCJ0YWdcIiByb3VuZGVkPlxyXG4gICAgICAgICAgICB7eyB0YWcgfX1cclxuICAgICAgICAgIDwvQ29tbW9uQmFkZ2U+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdi1pZj1cImljb25DbGlja1wiXHJcbiAgICAgICAgdi10aXBweT1cImljb25UZXh0ID8gaWNvblRleHQgOiB1bmRlZmluZWRcIlxyXG4gICAgICAgIDpkaXNhYmxlZD1cImljb25EaXNhYmxlZFwiXHJcbiAgICAgICAgY2xhc3M9XCJncm91cC1ob3ZlcjpmbGV4IHAtMSBzaHJpbmstMCBob3ZlcjpiZy1wcmltYXJ5LW11dGVkIHJvdW5kZWQgdGV4dC1mb3JlZ3JvdW5kLTJcIlxyXG4gICAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICAgIG5vSG92ZXIgPyAnJyA6ICdtci0yJyxcclxuICAgICAgICAgIGFsd2F5c1Nob3dJY29uID8gJ2ZsZXgnIDogJ2hpZGRlbicsXHJcbiAgICAgICAgICBpY29uRGlzYWJsZWQgPyAnb3BhY2l0eS01MCBjdXJzb3Itbm90LWFsbG93ZWQnIDogJydcclxuICAgICAgICBdXCJcclxuICAgICAgICBAY2xpY2s9XCJpY29uQ2xpY2tcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEVkaXQgdi1pZj1cImljb24gPT09ICdlZGl0J1wiIGNsYXNzPVwiaC00IHctNFwiIC8+XHJcbiAgICAgICAgPENoZXZyb25SaWdodEljb24gdi1lbHNlLWlmPVwiaWNvbiA9PT0gJ3ZpZXcnXCIgY2xhc3M9XCJoLTQgdy00XCIgLz5cclxuICAgICAgICA8UGx1cyB2LWVsc2UgY2xhc3M9XCJoLTQgdy00XCIgLz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IHYtc2hvdz1cIiFpc0NvbGxhcHNlZFwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCBQbHVzIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2dsb2JhbC9pY29uL1BsdXMudnVlJ1xyXG5pbXBvcnQgRWRpdCBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9nbG9iYWwvaWNvbi9FZGl0LnZ1ZSdcclxuaW1wb3J0IEFycm93RmlsbGVkIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2dsb2JhbC9pY29uL0Fycm93RmlsbGVkLnZ1ZSdcclxuaW1wb3J0IENvbW1vbkJhZGdlIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9CYWRnZS52dWUnXHJcbmltcG9ydCB7IENoZXZyb25SaWdodEljb24gfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yNC9vdXRsaW5lJ1xyXG5cclxuZGVmaW5lUHJvcHM8e1xyXG4gIHRhZz86IHN0cmluZ1xyXG4gIHRpdGxlPzogc3RyaW5nXHJcbiAgY29sbGFwc2libGU/OiBib29sZWFuXHJcbiAgY29sbGFwc2VkPzogYm9vbGVhblxyXG4gIGljb24/OiAnYWRkJyB8ICdlZGl0JyB8ICd2aWV3J1xyXG4gIGljb25UZXh0Pzogc3RyaW5nXHJcbiAgaWNvbkNsaWNrPzogKCkgPT4gdm9pZFxyXG4gIGljb25EaXNhYmxlZD86IGJvb2xlYW5cclxuICBub0hvdmVyPzogYm9vbGVhblxyXG4gIG5lc3RlZD86IGJvb2xlYW5cclxuICBhbHdheXNTaG93SWNvbj86IGJvb2xlYW5cclxufT4oKVxyXG5cclxuY29uc3QgaXNDb2xsYXBzZWQgPSBkZWZpbmVNb2RlbDxib29sZWFuPignY29sbGFwc2VkJylcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2XHJcbiAgICB2LWlmPVwiIWhhc0NoaWxkcmVuXCJcclxuICAgIHYtdGlwcHk9XCJ0b29sdGlwVGV4dFwiXHJcbiAgICA6dG89XCJ0b1wiXHJcbiAgICBjbGFzcz1cImdyb3VwL2l0ZW0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHNwYWNlLXgtMiBzaHJpbmstMCB0ZXh0LWJvZHkteHMgdGV4dC1mb3JlZ3JvdW5kIHNlbGVjdC1ub25lIHJvdW5kZWQtbWQgdy1mdWxsIHB5LTFcIlxyXG4gICAgOmNsYXNzPVwiW1xyXG4gICAgICAhZGlzYWJsZWQgJiYgJ2N1cnNvci1wb2ludGVyIGhvdmVyOmJnLWhpZ2hsaWdodC0xJyxcclxuICAgICAgZGlzYWJsZWQgJiYgJ2N1cnNvci1ub3QtYWxsb3dlZCcsXHJcbiAgICAgIGFjdGl2ZSAmJiAnYmctaGlnaGxpZ2h0LTMgaG92ZXI6IWJnLWhpZ2hsaWdodC0zJyxcclxuICAgICAgJHNsb3RzLmljb24gPyAncGwtMSBwci0yJyA6ICdwci0yIHBsLTcnLFxyXG4gICAgICBleHRyYVBhZGRpbmcgJiYgJyFwbC0xNCdcclxuICAgIF1cIlxyXG4gID5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgdHJ1bmNhdGVcIlxyXG4gICAgICA6Y2xhc3M9XCJbZGlzYWJsZWQgJiYgJ29wYWNpdHktNjAnXVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgdi1pZj1cIiRzbG90cy5pY29uXCIgY2xhc3M9XCJoLTYgdy02IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XHJcbiAgICAgICAgPHNsb3QgbmFtZT1cImljb25cIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZVwiPlxyXG4gICAgICAgIHt7IGxhYmVsIH19XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPEFycm93VXBSaWdodEljb25cclxuICAgICAgICB2LWlmPVwiZXh0ZXJuYWxcIlxyXG4gICAgICAgIGNsYXNzPVwiaC0yLjUgdy0yLjUgIXN0cm9rZS1bM3B4XSAtbWwtMSAtbXQtMS41IG9wYWNpdHktMCBncm91cC1ob3Zlci9pdGVtOm9wYWNpdHktMTAwIHNocmluay0wXCJcclxuICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPENvbW1vbkJhZGdlXHJcbiAgICAgIHYtaWY9XCJ0YWdcIlxyXG4gICAgICByb3VuZGVkXHJcbiAgICAgIDpjb2xvci1jbGFzc2VzPVwiXHJcbiAgICAgICAgY29sb3JDbGFzc2VzID8/IChkaXNhYmxlZCA/ICd0ZXh0LWZvcmVncm91bmQtMiBiZy1wcmltYXJ5LW11dGVkJyA6IHVuZGVmaW5lZClcclxuICAgICAgXCJcclxuICAgID5cclxuICAgICAge3sgdGFnIH19XHJcbiAgICA8L0NvbW1vbkJhZGdlPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgdi1lbHNlIGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB2LXRpcHB5PVwidG9vbHRpcFRleHRcIlxyXG4gICAgICBjbGFzcz1cImZsZXggc3BhY2UteC0xLjUgaXRlbXMtY2VudGVyIHctZnVsbCByb3VuZGVkLW1kIHAtMC41XCJcclxuICAgICAgOmNsYXNzPVwiW1xyXG4gICAgICAgICFkaXNhYmxlZCAmJiAnY3Vyc29yLXBvaW50ZXIgdGV4dC1mb3JlZ3JvdW5kLTIgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kJyxcclxuICAgICAgICBkaXNhYmxlZCAmJiAnb3BhY2l0eS02MCdcclxuICAgICAgXVwiXHJcbiAgICAgIEBjbGljaz1cInRvZ2dsZU9wZW5cIlxyXG4gICAgPlxyXG4gICAgICA8QXJyb3dGaWxsZWQgY2xhc3M9XCJoLTEgdy0yIHNocmluay0wXCIgOmNsYXNzPVwiW2lzT3BlbiA/ICcnIDogJy1yb3RhdGUtOTAnXVwiIC8+XHJcblxyXG4gICAgICA8aDYgY2xhc3M9XCJ0ZXh0LWhlYWRpbmctc20gZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xLjVcIj5cclxuICAgICAgICB7eyBsYWJlbCB9fVxyXG4gICAgICA8L2g2PlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8ZGl2IHYtc2hvdz1cImlzT3BlblwiIGNsYXNzPVwicGwtNFwiPlxyXG4gICAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IHJlZiwgdXNlU2xvdHMsIHR5cGUgU2V0dXBDb250ZXh0IH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgQXJyb3dGaWxsZWQgZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvZ2xvYmFsL2ljb24vQXJyb3dGaWxsZWQudnVlJ1xyXG5pbXBvcnQgeyBBcnJvd1VwUmlnaHRJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IENvbW1vbkJhZGdlIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9CYWRnZS52dWUnXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBsYWJlbDogc3RyaW5nXHJcbiAgdG8/OiBzdHJpbmdcclxuICB0YWc/OiBzdHJpbmdcclxuICBleHRlcm5hbD86IGJvb2xlYW5cclxuICBkaXNhYmxlZD86IGJvb2xlYW5cclxuICBhY3RpdmU/OiBib29sZWFuXHJcbiAgdG9vbHRpcFRleHQ/OiBzdHJpbmdcclxuICBleHRyYVBhZGRpbmc/OiBib29sZWFuXHJcbiAgY29sb3JDbGFzc2VzPzogc3RyaW5nXHJcbn0+KClcclxuXHJcbmNvbnN0IGlzT3BlbiA9IHJlZih0cnVlKVxyXG5cclxuY29uc3Qgc2xvdHM6IFNldHVwQ29udGV4dFsnc2xvdHMnXSA9IHVzZVNsb3RzKClcclxuXHJcbmNvbnN0IGhhc0NoaWxkcmVuID0gISFzbG90cy5kZWZhdWx0XHJcblxyXG5jb25zdCB0b2dnbGVPcGVuID0gKCkgPT4ge1xyXG4gIGlmICghcHJvcHMuZGlzYWJsZWQpIHtcclxuICAgIGlzT3Blbi52YWx1ZSA9ICFpc09wZW4udmFsdWVcclxuICB9XHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IDpjbGFzcz1cImNvbnRhaW5lckNsYXNzZXNcIj5cclxuICAgIDxkaXYgOmNsYXNzPVwic3ViY29udGFpbmVyQ2xhc3Nlc1wiPlxyXG4gICAgICA8ZGl2IHYtaWY9XCIhaGlkZUljb25cIj5cclxuICAgICAgICA8Q29tcG9uZW50IDppcz1cImljb25cIiA6Y2xhc3M9XCJpY29uQ2xhc3Nlc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XHJcbiAgICAgICAgPGgzIHYtaWY9XCJoYXNUaXRsZVwiIDpjbGFzcz1cInRpdGxlQ2xhc3Nlc1wiPlxyXG4gICAgICAgICAgPHNsb3QgbmFtZT1cInRpdGxlXCI+VGl0bGU8L3Nsb3Q+XHJcbiAgICAgICAgPC9oMz5cclxuICAgICAgICA8ZGl2IHYtaWY9XCJoYXNEZXNjcmlwdGlvblwiIDpjbGFzcz1cImRlc2NyaXB0aW9uQ2xhc3Nlc1wiPlxyXG4gICAgICAgICAgPHNsb3QgbmFtZT1cImRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0IGNvbnNlY3RldHVyIGFkaXBpc2ljaW5nIGVsaXQuIEFsaXF1aWQgcGFyaWF0dXIsXHJcbiAgICAgICAgICAgIGlwc3VtIHNpbWlsaXF1ZSB2ZW5pYW0uXHJcbiAgICAgICAgICA8L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAteC0yXCI+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIHYtZm9yPVwiKGFjdGlvbiwgaSkgaW4gYWN0aW9ucyB8fCBbXVwiXHJcbiAgICAgICAgICA6a2V5PVwiaVwiXHJcbiAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgIDp0bz1cImFjdGlvbi51cmxcIlxyXG4gICAgICAgICAgOmV4dGVybmFsPVwiYWN0aW9uLmV4dGVybmFsVXJsIHx8IGZhbHNlXCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImFjdGlvbi5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICBAY2xpY2s9XCJoYW5kbGVBY3Rpb25DbGljayhhY3Rpb24pXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBhY3Rpb24udGl0bGUgfX1cclxuICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi1pZj1cIndpdGhEaXNtaXNzXCJcclxuICAgICAgICBjbGFzcz1cImZsZXhcIlxyXG4gICAgICAgIDpjbGFzcz1cIltoYXNEZXNjcmlwdGlvbiA/ICdpdGVtcy1zdGFydCcgOiAnaXRlbXMtY2VudGVyJ11cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEZvcm1CdXR0b24gdHlwZT1cImJ1dHRvblwiIGNvbG9yPVwic3VidGxlXCIgc2l6ZT1cInNtXCIgQGNsaWNrPVwiJGVtaXQoJ2Rpc21pc3MnKVwiPlxyXG4gICAgICAgICAgRGlzbWlzc1xyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHtcclxuICBDaGVja0NpcmNsZUljb24sXHJcbiAgWENpcmNsZUljb24sXHJcbiAgSW5mb3JtYXRpb25DaXJjbGVJY29uLFxyXG4gIEV4Y2xhbWF0aW9uQ2lyY2xlSWNvblxyXG59IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L291dGxpbmUnXHJcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcjbG9kYXNoJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgdXNlU2xvdHMsIHR5cGUgU2V0dXBDb250ZXh0IH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgRm9ybUJ1dHRvbiBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9mb3JtL0J1dHRvbi52dWUnXHJcbmltcG9ydCB0eXBlIHtcclxuICBQcm9wQW55Q29tcG9uZW50LFxyXG4gIEFsZXJ0QWN0aW9uLFxyXG4gIEFsZXJ0Q29sb3JcclxufSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vY29tcG9uZW50cydcclxuXHJcbnR5cGUgU2l6ZSA9ICdkZWZhdWx0JyB8ICd4cycgfCAnMnhzJ1xyXG5cclxuZGVmaW5lRW1pdHM8eyAoZTogJ2Rpc21pc3MnKTogdm9pZCB9PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhcclxuICBkZWZpbmVQcm9wczx7XHJcbiAgICBjb2xvcj86IEFsZXJ0Q29sb3JcclxuICAgIHdpdGhEaXNtaXNzPzogYm9vbGVhblxyXG4gICAgYWN0aW9ucz86IEFycmF5PEFsZXJ0QWN0aW9uPlxyXG4gICAgY3VzdG9tSWNvbj86IFByb3BBbnlDb21wb25lbnRcclxuICAgIGhpZGVJY29uPzogYm9vbGVhblxyXG4gICAgc2l6ZT86IFNpemVcclxuICB9PigpLFxyXG4gIHtcclxuICAgIGNvbG9yOiAnc3VjY2VzcycsXHJcbiAgICBzaXplOiAnZGVmYXVsdCdcclxuICB9XHJcbilcclxuXHJcbmNvbnN0IHNsb3RzOiBTZXR1cENvbnRleHRbJ3Nsb3RzJ10gPSB1c2VTbG90cygpXHJcbmNvbnN0IGhhc0Rlc2NyaXB0aW9uID0gY29tcHV0ZWQoKCkgPT4gISFzbG90c1snZGVzY3JpcHRpb24nXSlcclxuY29uc3QgaGFzVGl0bGUgPSBjb21wdXRlZCgoKSA9PiAhIXNsb3RzWyd0aXRsZSddKVxyXG5cclxuY29uc3QgaWNvbiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAocHJvcHMuY3VzdG9tSWNvbikgcmV0dXJuIHByb3BzLmN1c3RvbUljb25cclxuXHJcbiAgc3dpdGNoIChwcm9wcy5jb2xvcikge1xyXG4gICAgY2FzZSAnaW5mbyc6XHJcbiAgICAgIHJldHVybiBJbmZvcm1hdGlvbkNpcmNsZUljb25cclxuICAgIGNhc2UgJ3dhcm5pbmcnOlxyXG4gICAgICByZXR1cm4gRXhjbGFtYXRpb25DaXJjbGVJY29uXHJcbiAgICBjYXNlICdkYW5nZXInOlxyXG4gICAgICByZXR1cm4gWENpcmNsZUljb25cclxuICAgIGNhc2UgJ3N1Y2Nlc3MnOlxyXG4gICAgICByZXR1cm4gQ2hlY2tDaXJjbGVJY29uXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gSW5mb3JtYXRpb25DaXJjbGVJY29uXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgY29udGFpbmVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsncm91bmRlZC1sZyB0ZXh0LWZvcmVncm91bmQgYm9yZGVyJ11cclxuXHJcbiAgc3dpdGNoIChwcm9wcy5zaXplKSB7XHJcbiAgICBjYXNlICcyeHMnOlxyXG4gICAgY2FzZSAneHMnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3AtMicpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdkZWZhdWx0JzpcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaChoYXNEZXNjcmlwdGlvbi52YWx1ZSA/ICdwLTMgc206cC00JyA6ICdwLTInKVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuXHJcbiAgc3dpdGNoIChwcm9wcy5jb2xvcikge1xyXG4gICAgY2FzZSAnc3VjY2Vzcyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctc3VjY2Vzcy1saWdodGVzdCBib3JkZXItb3V0bGluZS0yJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2luZm8nOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2JnLWZvdW5kYXRpb24tMiBib3JkZXItb3V0bGluZS0zJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctZGFuZ2VyLWxpZ2h0ZXN0IGJvcmRlci1vdXRsaW5lLTInKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnd2FybmluZyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctd2FybmluZy1saWdodGVzdCBib3JkZXItb3V0bGluZS0yJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ25ldXRyYWwnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2JnLWZvdW5kYXRpb24gYm9yZGVyLW91dGxpbmUtMicpXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IHN1YmNvbnRhaW5lckNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbJ2ZsZXggaXRlbXMtY2VudGVyIHctZnVsbCddXHJcblxyXG4gIHN3aXRjaCAocHJvcHMuc2l6ZSkge1xyXG4gICAgY2FzZSAnMnhzJzpcclxuICAgIGNhc2UgJ3hzJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdnYXAteC0xLjUnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnZGVmYXVsdCc6XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2dhcC14LTMnKVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBpY29uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFtdXHJcblxyXG4gIHN3aXRjaCAocHJvcHMuc2l6ZSkge1xyXG4gICAgY2FzZSAnMnhzJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdoLTQgdy00JylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ3hzJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdoLTUgdy01JylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2RlZmF1bHQnOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdoLTYgdy02JylcclxuICAgICAgYnJlYWtcclxuICB9XHJcblxyXG4gIHN3aXRjaCAocHJvcHMuY29sb3IpIHtcclxuICAgIGNhc2UgJ3N1Y2Nlc3MnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtc3VjY2Vzcy1kYXJrZXInKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnaW5mbyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1pbmZvLWRhcmtlciBkYXJrOnRleHQtcHJpbWFyeScpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdkYW5nZXInOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZGFuZ2VyLWRhcmtlcicpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICd3YXJuaW5nJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LXdhcm5pbmctZGFya2VyJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ25ldXRyYWwnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZm9yZWdyb3VuZC0yJylcclxuICAgICAgYnJlYWtcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgdGl0bGVDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWydmb250LW1lZGl1bSddXHJcblxyXG4gIHN3aXRjaCAocHJvcHMuc2l6ZSkge1xyXG4gICAgY2FzZSAnMnhzJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWJvZHktMnhzJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2RlZmF1bHQnOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWJvZHkteHMnKVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBkZXNjcmlwdGlvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbJ3doaXRlc3BhY2Utbm9ybWFsJ11cclxuXHJcbiAgc3dpdGNoIChwcm9wcy5zaXplKSB7XHJcbiAgICBjYXNlICcyeHMnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtYm9keS0yeHMgcHQtMC41JylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2RlZmF1bHQnOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWJvZHkteHMnKVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5mdW5jdGlvbiBoYW5kbGVBY3Rpb25DbGljayhhY3Rpb246IEFsZXJ0QWN0aW9uKSB7XHJcbiAgaWYgKGFjdGlvbi5vbkNsaWNrKSB7XHJcbiAgICBhY3Rpb24ub25DbGljaygpXHJcbiAgfSBlbHNlIHtcclxuICAgIG5vb3AoKVxyXG4gIH1cclxufVxyXG48L3NjcmlwdD5cclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xyXG5pbXBvcnQgeyB0eXBlIE1heWJlQXN5bmMsIGJ1aWxkTWFudWFsUHJvbWlzZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgY29tcHV0ZWRBc3luYyB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHR5cGUgeyBBc3luY0NvbXB1dGVkT3B0aW9ucyB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgQ29tcHV0ZWRSZWYgfSBmcm9tICd2dWUnXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jV3JpdGFibGVDb21wdXRlZE9wdGlvbnM8VD4ge1xyXG4gIGdldDogKC4uLmFyZ3M6IGFueVtdKSA9PiBNYXliZUFzeW5jPFQ+XHJcbiAgc2V0OiAodmFsdWU6IFQpID0+IE1heWJlQXN5bmM8dm9pZD5cclxuICBpbml0aWFsU3RhdGU6IFRcclxuICByZWFkT3B0aW9ucz86IEFzeW5jQ29tcHV0ZWRPcHRpb25zXHJcbiAgYXN5bmNSZWFkPzogYm9vbGVhblxyXG4gIGRlYnVnZ2luZz86IFBhcnRpYWw8e1xyXG4gICAgbG9nOiB7XHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgICB3cml0ZXNPbmx5PzogYm9vbGVhblxyXG4gICAgICByZWFkc09ubHk/OiBib29sZWFuXHJcbiAgICAgIGxvZ2dlcj86IChtc2c6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHZvaWRcclxuICAgIH1cclxuICB9PlxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBBc3luY1dyaXRhYmxlQ29tcHV0ZWRSZWY8VD4gPSBDb21wdXRlZFJlZjxUPiAmIHtcclxuICB1cGRhdGU6IEFzeW5jV3JpdGFibGVDb21wdXRlZE9wdGlvbnM8VD5bJ3NldCddXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBbGxvd3MgYXN5bmMgcmVhZC93cml0ZSBmcm9tL3RvIGNvbXB1dGVkLiBVc2UgYHJlcy52YWx1ZWAgdG8gcmVhZCBhbmQgYHJlcy51cGRhdGVgIHRvIHdyaXRlLiBJZiB5b3Ugb25seSBuZWVkXHJcbiAqIHRoZSBjb21wdXRlZCB0byBiZSByZWFkLW9ubHkgdGhlbiB1c2UgdnVldXNlJ3MgYGNvbXB1dGVkQXN5bmNgLiBJZiB5b3Ugb25seSBuZWVkIGFzeW5jIHdyaXRlcyB5b3UgY2FuXHJcbiAqIGRpc2FibGUgYXN5bmMgcmVhZHMgdGhyb3VnaCB0aGUgYGFzeW5jUmVhZGAgcGFyYW0uXHJcbiAqIEBwYXJhbSBwYXJhbXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB3cml0YWJsZUFzeW5jQ29tcHV0ZWQ8VD4oXHJcbiAgcGFyYW1zOiBBc3luY1dyaXRhYmxlQ29tcHV0ZWRPcHRpb25zPFQ+XHJcbik6IEFzeW5jV3JpdGFibGVDb21wdXRlZFJlZjxUPiB7XHJcbiAgY29uc3QgeyBnZXQsIGluaXRpYWxTdGF0ZSwgcmVhZE9wdGlvbnMsIHNldCwgYXN5bmNSZWFkID0gdHJ1ZSwgZGVidWdnaW5nIH0gPSBwYXJhbXNcclxuICBjb25zdCBsb2dTZXR0aW5ncyA9IGRlYnVnZ2luZz8ubG9nXHJcbiAgY29uc3QgZ2V0VHJhY2UgPSAoKSA9PiAobmV3IEVycm9yKCdUcmFjZTonKS5zdGFjayB8fCAnJykuc3Vic3RyaW5nKDcpXHJcbiAgY29uc3QgbG9nZ2VyID0gcGFyYW1zLmRlYnVnZ2luZz8ubG9nPy5sb2dnZXIgfHwgY29uc29sZS5kZWJ1Z1xyXG5cclxuICBjb25zdCBmaW5hbEdldDogdHlwZW9mIGdldCA9XHJcbiAgICBsb2dTZXR0aW5ncyAmJiAhbG9nU2V0dGluZ3Mud3JpdGVzT25seVxyXG4gICAgICA/ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJlcyA9IGdldCgpXHJcbiAgICAgICAgICBsb2dnZXIoYGRlYnVnZ2luZzogJyR7bG9nU2V0dGluZ3MubmFtZX0nIHJlYWRgLCByZXMsIGdldFRyYWNlKCkpXHJcbiAgICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgICAgfVxyXG4gICAgICA6IGdldFxyXG5cclxuICBjb25zdCBmaW5hbFNldDogdHlwZW9mIHNldCA9XHJcbiAgICBsb2dTZXR0aW5ncyAmJiAhbG9nU2V0dGluZ3MucmVhZHNPbmx5XHJcbiAgICAgID8gKG5ld1ZhbCkgPT4ge1xyXG4gICAgICAgICAgbG9nZ2VyKGBkZWJ1Z2dpbmc6ICcke2xvZ1NldHRpbmdzLm5hbWV9JyB3cml0dGVuIHRvYCwgbmV3VmFsLCBnZXRUcmFjZSgpKVxyXG4gICAgICAgICAgcmV0dXJuIHNldChuZXdWYWwpXHJcbiAgICAgICAgfVxyXG4gICAgICA6IHNldFxyXG5cclxuICBjb25zdCByZWFkVmFsdWUgPSBhc3luY1JlYWRcclxuICAgID8gY29tcHV0ZWRBc3luYyhmaW5hbEdldCwgaW5pdGlhbFN0YXRlLCByZWFkT3B0aW9ucylcclxuICAgIDogY29tcHV0ZWQoZmluYWxHZXQpXHJcblxyXG4gIGNvbnN0IGdldHRlciA9IGNvbXB1dGVkKCgpID0+IHJlYWRWYWx1ZS52YWx1ZSkgYXMgQXN5bmNXcml0YWJsZUNvbXB1dGVkUmVmPFQ+XHJcbiAgZ2V0dGVyLnVwZGF0ZSA9IGZpbmFsU2V0XHJcblxyXG4gIHJldHVybiBnZXR0ZXJcclxufVxyXG5cclxuZXhwb3J0IHsgYnVpbGRNYW51YWxQcm9taXNlIH1cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxzbG90IC8+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBnZXRDdXJyZW50SW5zdGFuY2UsIGluamVjdCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBDb21wb25lbnRJbnRlcm5hbEluc3RhbmNlLCBSZWYgfSBmcm9tICd2dWUnXHJcblxyXG4vKipcclxuICogU29ydCBvZiBoYWNreSAtIHdlIG5lZWQgdG8gbWFuaXB1bGF0ZSB0aGUgQGhlYWRsZXNzdWkgY29tYm9ib3ggc3RhdGUsIGJ1dCBpdCBjYW4ndCBiZSBpbmplY3RlZFxyXG4gKiBmcm9tIGl0cyBwYXJlbnQgY29tcG9uZW50IChUYWdzLnZ1ZSkuIFRoaXMgYmVpbmcgaW5pdGlhbGl6ZWQgaW5zaWRlIG9mIGEgc2xvdCBvZiB0aGUgY29tYm9ib3gsXHJcbiAqIGl0IGhhcyBhY2Nlc3MgdG8gdGhlIGNvbnRleHRcclxuICpcclxuICogQWxzbyB0aGUgY29udGV4dCBpcyBpbmFjY2Vzc2libGUgZHVlIHRvIGl0IGJlaW5nIHRpZWQgdG8gYSBwcml2YXRlIHN5bWJvbCwgc28gd2UgbmVlZFxyXG4gKiB0byByZXRyaWV2ZSB0aGF0IGEgYml0IGhhY2tpbHkgdG9vLlxyXG4gKi9cclxuXHJcbi8vIENvcGllZCBmcm9tIGhlYWRsZXNzdWlcclxuZW51bSBGb2N1cyB7XHJcbiAgLyoqIEZvY3VzIHRoZSBmaXJzdCBub24tZGlzYWJsZWQgaXRlbS4gKi9cclxuICBGaXJzdCxcclxuXHJcbiAgLyoqIEZvY3VzIHRoZSBwcmV2aW91cyBub24tZGlzYWJsZWQgaXRlbS4gKi9cclxuICBQcmV2aW91cyxcclxuXHJcbiAgLyoqIEZvY3VzIHRoZSBuZXh0IG5vbi1kaXNhYmxlZCBpdGVtLiAqL1xyXG4gIE5leHQsXHJcblxyXG4gIC8qKiBGb2N1cyB0aGUgbGFzdCBub24tZGlzYWJsZWQgaXRlbS4gKi9cclxuICBMYXN0LFxyXG5cclxuICAvKiogRm9jdXMgYSBzcGVjaWZpYyBpdGVtIGJhc2VkIG9uIHRoZSBgaWRgIG9mIHRoZSBpdGVtLiAqL1xyXG4gIFNwZWNpZmljLFxyXG5cclxuICAvKiogRm9jdXMgbm8gaXRlbXMgYXQgYWxsLiAqL1xyXG4gIE5vdGhpbmdcclxufVxyXG5cclxuZW51bSBDb21ib2JveFN0YXRlcyB7XHJcbiAgT3BlbixcclxuICBDbG9zZWRcclxufVxyXG5cclxuY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKSBhcyBDb21wb25lbnRJbnRlcm5hbEluc3RhbmNlICYge1xyXG4gIHByb3ZpZGVzOiBSZWNvcmQ8c3ltYm9sIHwgc3RyaW5nLCB1bmtub3duPlxyXG59XHJcbmNvbnN0IHByb3ZpZGVzID0gaW5zdGFuY2VbJ3Byb3ZpZGVzJ11cclxuY29uc3QgY3R4S2V5ID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhwcm92aWRlcykuZmluZChcclxuICAocykgPT4gcy5kZXNjcmlwdGlvbiA9PT0gJ0NvbWJvYm94Q29udGV4dCdcclxuKVxyXG5pZiAoIWN0eEtleSkge1xyXG4gIGNvbnNvbGUuZXJyb3IoJ0Zvcm1UYWdzQ29udGV4dE1hbmFnZXIgY3R4IGtleSBub3QgZm91bmQhJylcclxufVxyXG5cclxuY29uc3Qgc3RhdGUgPSBpbmplY3QoY3R4S2V5IHx8ICdfX3VuZGVmaW5lZCcpIGFzIE9wdGlvbmFsPHtcclxuICBnb1RvT3B0aW9uOiAoZm9jdXM6IEZvY3VzKSA9PiB2b2lkXHJcbiAgb3BlbkNvbWJvYm94OiAoKSA9PiB2b2lkXHJcbiAgY2xvc2VDb21ib2JveDogKCkgPT4gdm9pZFxyXG4gIGFjdGl2ZU9wdGlvbkluZGV4OiBSZWY8TnVsbGFibGU8bnVtYmVyPj5cclxuICBzZWxlY3RBY3RpdmVPcHRpb246ICgpID0+IHZvaWRcclxuICBjb21ib2JveFN0YXRlOiBSZWY8Q29tYm9ib3hTdGF0ZXM+XHJcbn0+XHJcblxyXG5pZiAoIXN0YXRlKSB7XHJcbiAgY29uc29sZS5lcnJvcignRm9ybVRhZ3NDb250ZXh0TWFuYWdlciBjdHggbm90IGZvdW5kIScpXHJcbn1cclxuXHJcbmNvbnN0IGdvVXAgPSAoKSA9PiB7XHJcbiAgc3RhdGU/LmdvVG9PcHRpb24oRm9jdXMuUHJldmlvdXMpXHJcbn1cclxuY29uc3QgZ29Eb3duID0gKCkgPT4ge1xyXG4gIHN0YXRlPy5nb1RvT3B0aW9uKEZvY3VzLk5leHQpXHJcbn1cclxuY29uc3Qgb3BlbiA9ICgpID0+IHtcclxuICBpZiAoIXN0YXRlKSByZXR1cm5cclxuICBzdGF0ZS5vcGVuQ29tYm9ib3goKVxyXG59XHJcbmNvbnN0IGNsb3NlID0gKCkgPT4ge1xyXG4gIHN0YXRlPy5jbG9zZUNvbWJvYm94KClcclxufVxyXG5jb25zdCBzZWxlY3RBY3RpdmUgPSAoKSA9PiB7XHJcbiAgc3RhdGU/LnNlbGVjdEFjdGl2ZU9wdGlvbigpXHJcbn1cclxuY29uc3QgaXNPcGVuID0gKCkgPT4gc3RhdGU/LmNvbWJvYm94U3RhdGUudmFsdWUgPT09IENvbWJvYm94U3RhdGVzLk9wZW5cclxuXHJcbmRlZmluZUV4cG9zZSh7IGdvVXAsIGdvRG93biwgb3BlbiwgY2xvc2UsIHNlbGVjdEFjdGl2ZSwgaXNPcGVuIH0pXHJcbjwvc2NyaXB0PlxyXG4iLCI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPENvbWJvYm94XHJcbiAgICB2LW1vZGVsPVwic2VsZWN0ZWRJdGVtc1wiXHJcbiAgICBhcz1cImRpdlwiXHJcbiAgICBtdWx0aXBsZVxyXG4gICAgY2xlYXJhYmxlXHJcbiAgICA6Y2xhc3M9XCJbd3JhcHBlckNsYXNzZXNdXCJcclxuICA+XHJcbiAgICA8Rm9ybVRhZ3NDb250ZXh0TWFuYWdlciByZWY9XCJjdHhNYW5hZ2VyXCI+XHJcbiAgICAgIDxsYWJlbCA6Zm9yPVwibmFtZVwiIDpjbGFzcz1cImxhYmVsQ2xhc3Nlc1wiPlxyXG4gICAgICAgIDxzcGFuPnt7IHRpdGxlIH19PC9zcGFuPlxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xIHB4LTIgcHktMVwiXHJcbiAgICAgICAgOmNsYXNzPVwiaW5wdXRXcmFwcGVyQ2xhc3Nlc1wiXHJcbiAgICAgID5cclxuICAgICAgICA8Q29tbW9uQmFkZ2VcclxuICAgICAgICAgIHYtZm9yPVwidGFnIGluIHNlbGVjdGVkSXRlbXNcIlxyXG4gICAgICAgICAgOmtleT1cInRhZ1wiXHJcbiAgICAgICAgICA6aWNvbi1sZWZ0PVwiIWRpc2FibGVkID8gWE1hcmtJY29uIDogdW5kZWZpbmVkXCJcclxuICAgICAgICAgIGNsaWNrYWJsZS1pY29uXHJcbiAgICAgICAgICBzaXplPVwibGdcIlxyXG4gICAgICAgICAgQGNsaWNrLWljb249XCIoKSA9PiByZW1vdmVUYWcodGFnKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgdGFnIH19XHJcbiAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIHJlZj1cImlucHV0RWxcIlxyXG4gICAgICAgICAgdi1tb2RlbD1cInF1ZXJ5XCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgIGNsYXNzPVwiYmctdHJhbnNwYXJlbnQgZ3JvdyBzaHJpbmsgYm9yZGVyLTAgZm9jdXM6cmluZy0wIHAtMFwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJbY29yZUlucHV0Q2xhc3Nlcywgc2l6ZUNsYXNzZXNdXCJcclxuICAgICAgICAgIHN0eWxlPVwiZmxleC1iYXNpczogNzBweDsgbWluLXdpZHRoOiA3MHB4XCJcclxuICAgICAgICAgIDpwbGFjZWhvbGRlcj1cIiFzZWxlY3RlZEl0ZW1zLmxlbmd0aCA/IHBsYWNlaG9sZGVyIDogdW5kZWZpbmVkXCJcclxuICAgICAgICAgIEBpbnB1dD1cIm9uUXVlcnlJbnB1dFwiXHJcbiAgICAgICAgICBAa2V5ZG93bi5lc2NhcGU9XCJvblF1ZXJ5RXNjYXBlXCJcclxuICAgICAgICAgIEBrZXlkb3duLmVudGVyLnN0b3AucHJldmVudD1cIm9uUXVlcnlJbnB1dCgkZXZlbnQsIHRydWUpXCJcclxuICAgICAgICAgIEBrZXlkb3duLnRhYj1cIm9uUXVlcnlJbnB1dFwiXHJcbiAgICAgICAgICBAa2V5ZG93bi5iYWNrc3BhY2U9XCJvblF1ZXJ5QmFja3NwYWNlXCJcclxuICAgICAgICAgIEBrZXlkb3duLmFycm93LXVwPVwib25RdWVyeUFycm93VXBcIlxyXG4gICAgICAgICAgQGtleWRvd24uYXJyb3ctZG93bj1cIm9uUXVlcnlBcnJvd0Rvd25cIlxyXG4gICAgICAgICAgQGJsdXI9XCJpc0F1dG9jb21wbGV0ZU9wZW4gPSBmYWxzZVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgdi1pZj1cInNob3VsZFNob3dDbGVhclwiXHJcbiAgICAgICAgICB0aXRsZT1cIkNsZWFyIGlucHV0XCJcclxuICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTIgcmlnaHQtMCBmbGV4IGl0ZW1zLWNlbnRlciBwci0yIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgIEBjbGljaz1cImNsZWFyXCJcclxuICAgICAgICAgIEBrZXlkb3duPVwiY2xlYXJcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC14cyBzci1vbmx5XCI+Q2xlYXIgaW5wdXQ8L3NwYW4+XHJcbiAgICAgICAgICA8WE1hcmtJY29uIGNsYXNzPVwiaC01IHctNSB0ZXh0LWZvcmVncm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICB2LWlmPVwiZXJyb3JNZXNzYWdlXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICAgICAgJ3BvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgdG9wLVsxMHB4XSByaWdodC0wIGZsZXggaXRlbXMtY2VudGVyJyxcclxuICAgICAgICAgICAgc2hvdWxkU2hvd0NsZWFyID8gJ3ByLTgnIDogJ3ByLTInXHJcbiAgICAgICAgICBdXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8RXhjbGFtYXRpb25DaXJjbGVJY29uIGNsYXNzPVwiaC00IHctNCB0ZXh0LWRhbmdlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgdi1lbHNlLWlmPVwic2hvd1JlcXVpcmVkXCJcclxuICAgICAgICAgIGNsYXNzPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSB0b3AtWzJweF0gdGV4dC00eGwgcmlnaHQtMCBmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LWRhbmdlciBvcGFjaXR5LTUwXCJcclxuICAgICAgICAgIDpjbGFzcz1cInNob3VsZFNob3dDbGVhciA/ICdwci04JyA6ICdwci0yJ1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgKlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgdi1lbHNlLWlmPVwic2hvd09wdGlvbmFsXCIgY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIGZvbnQtbm9ybWFsXCI+KG9wdGlvbmFsKTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPFRyYW5zaXRpb25Sb290XHJcbiAgICAgICAgbGVhdmU9XCJ0cmFuc2l0aW9uIGVhc2UtaW4gZHVyYXRpb24tMTAwXCJcclxuICAgICAgICBsZWF2ZS1mcm9tPVwib3BhY2l0eS0xMDBcIlxyXG4gICAgICAgIGxlYXZlLXRvPVwib3BhY2l0eS0wXCJcclxuICAgICAgICBjbGFzcz1cInJlbGF0aXZlIHB4LTAuNVwiXHJcbiAgICAgID5cclxuICAgICAgICA8Q29tYm9ib3hPcHRpb25zXHJcbiAgICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0xIG1heC1oLTYwIHctZnVsbCBvdmVyZmxvdy1hdXRvIHNpbXBsZS1zY3JvbGxiYXIgcm91bmRlZC1tZCBiZy1mb3VuZGF0aW9uIHB5LTEgc2hhZG93IGxhYmVsIGxhYmVsLS1saWdodCBvdXRsaW5lIG91dGxpbmUtMiBvdXRsaW5lLXByaW1hcnktbXV0ZWQgZm9jdXM6b3V0bGluZS1ub25lXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIHYtaWY9XCJpc0F1dG9jb21wbGV0ZUxvYWRpbmdcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInB4LTFcIlxyXG4gICAgICAgICAgICA6Y2xhc3M9XCJhdXRvY29tcGxldGVJdGVtcy5sZW5ndGggPyAnbWItMScgOiAnJ1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxDb21tb25Mb2FkaW5nQmFyIDpsb2FkaW5nPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgdi1pZj1cIiFhdXRvY29tcGxldGVJdGVtcy5sZW5ndGggJiYgIWlzQXV0b2NvbXBsZXRlTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1mb3JlZ3JvdW5kLTIgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICBQcmVzc1xyXG4gICAgICAgICAgICAgIDxzdHJvbmc+RW50ZXI8L3N0cm9uZz5cclxuICAgICAgICAgICAgICB0byBjcmVhdGUgdGFnIOKaoVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJhdXRvY29tcGxldGVJdGVtcy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgPENvbWJvYm94T3B0aW9uXHJcbiAgICAgICAgICAgICAgdi1mb3I9XCJ0YWcgaW4gYXV0b2NvbXBsZXRlSXRlbXNcIlxyXG4gICAgICAgICAgICAgIDprZXk9XCJ0YWdcIlxyXG4gICAgICAgICAgICAgIHYtc2xvdD1cInsgc2VsZWN0ZWQsIGFjdGl2ZSB9XCJcclxuICAgICAgICAgICAgICBhcz1cInRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICA6dmFsdWU9XCJ0YWdcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGxpXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGN1cnNvci1wb2ludGVyIHNlbGVjdC1ub25lIHB5LTEuNSBwbC0zXCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cIntcclxuICAgICAgICAgICAgICAgICAgJ3RleHQtcHJpbWFyeSc6IGFjdGl2ZSxcclxuICAgICAgICAgICAgICAgICAgJ3RleHQtZm9yZWdyb3VuZCc6ICFhY3RpdmVcclxuICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdHJ1bmNhdGVcIlxyXG4gICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7ICdmb250LW1lZGl1bSc6IHNlbGVjdGVkLCAnZm9udC1ub3JtYWwnOiAhc2VsZWN0ZWQgfVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHRhZyB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgdi1pZj1cInNlbGVjdGVkXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMCBib3R0b20tMCByaWdodC0wIGZsZXggaXRlbXMtY2VudGVyIHByLTRcIlxyXG4gICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7ICd0ZXh0LXByaW1hcnknOiBhY3RpdmUsICd0ZXh0LWZvcmVncm91bmQnOiAhYWN0aXZlIH1cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8Q2hlY2tJY29uIGNsYXNzPVwiaC01IHctNVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPC9Db21ib2JveE9wdGlvbj5cclxuICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgPC9Db21ib2JveE9wdGlvbnM+XHJcbiAgICAgIDwvVHJhbnNpdGlvblJvb3Q+XHJcbiAgICAgIDxwXHJcbiAgICAgICAgdi1pZj1cImhlbHBUaXBJZCAmJiAhaGlkZUhlbHBUaXBcIlxyXG4gICAgICAgIDppZD1cImhlbHBUaXBJZFwiXHJcbiAgICAgICAgY2xhc3M9XCJtdC0yXCJcclxuICAgICAgICA6Y2xhc3M9XCJoZWxwVGlwQ2xhc3Nlc1wiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBoZWxwVGlwIH19XHJcbiAgICAgIDwvcD5cclxuICAgIDwvRm9ybVRhZ3NDb250ZXh0TWFuYWdlcj5cclxuICA8L0NvbWJvYm94PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgcmVmLCBjb21wdXRlZCwgdG9SZWZzLCB3YXRjaCwgb25Nb3VudGVkIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQge1xyXG4gIENvbWJvYm94LFxyXG4gIENvbWJvYm94T3B0aW9ucyxcclxuICBDb21ib2JveE9wdGlvbixcclxuICBUcmFuc2l0aW9uUm9vdFxyXG59IGZyb20gJ0BoZWFkbGVzc3VpL3Z1ZSdcclxuaW1wb3J0IHsgQ2hlY2tJY29uLCBYTWFya0ljb24sIEV4Y2xhbWF0aW9uQ2lyY2xlSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzIwL3NvbGlkJ1xyXG5pbXBvcnQgeyBkZWJvdW5jZSwgdW5pcSB9IGZyb20gJyNsb2Rhc2gnXHJcbmltcG9ydCB7IHVzZVRleHRJbnB1dENvcmUgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS90ZXh0SW5wdXQnXHJcbmltcG9ydCB0eXBlIHsgSW5wdXRDb2xvciB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9mb3JtL3RleHRJbnB1dCdcclxuaW1wb3J0IHR5cGUgeyBSdWxlRXhwcmVzc2lvbiB9IGZyb20gJ3ZlZS12YWxpZGF0ZSdcclxuaW1wb3J0IHR5cGUgeyBNYXliZUFzeW5jLCBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IENvbW1vbkJhZGdlIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9CYWRnZS52dWUnXHJcbmltcG9ydCBGb3JtVGFnc0NvbnRleHRNYW5hZ2VyIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2Zvcm0vdGFncy9Db250ZXh0TWFuYWdlci52dWUnXHJcbmltcG9ydCB7IHVzZUZvY3VzIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgQ29tbW9uTG9hZGluZ0JhciBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9jb21tb24vbG9hZGluZy9CYXIudnVlJ1xyXG5cclxudHlwZSBJbnB1dFNpemUgPSAnc20nIHwgJ2Jhc2UnIHwgJ2xnJyB8ICd4bCdcclxudHlwZSBUYWcgPSBzdHJpbmdcclxuY29uc3QgaXNJbnB1dEV2ZW50ID0gKGU6IEV2ZW50KTogZSBpcyBJbnB1dEV2ZW50ID0+IGUudHlwZSA9PT0gJ2lucHV0J1xyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsOiBUYWdbXSk6IHZvaWRcclxuICAoZTogJ2NoYW5nZScsIHZhbDogeyBldmVudD86IEV2ZW50OyB2YWx1ZTogVGFnW10gfSk6IHZvaWRcclxuICAoZTogJ2NsZWFyJyk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgbmFtZTogc3RyaW5nXHJcbiAgICBoZWxwPzogc3RyaW5nXHJcbiAgICBsYWJlbD86IHN0cmluZ1xyXG4gICAgc2hvd0xhYmVsPzogYm9vbGVhblxyXG4gICAgcnVsZXM/OiBSdWxlRXhwcmVzc2lvbjxUYWdbXT5cclxuICAgIHZhbGlkYXRlT25Nb3VudD86IGJvb2xlYW5cclxuICAgIHZhbGlkYXRlT25WYWx1ZVVwZGF0ZT86IGJvb2xlYW5cclxuICAgIGF1dG9Gb2N1cz86IGJvb2xlYW5cclxuICAgIHNob3dDbGVhcj86IGJvb2xlYW5cclxuICAgIHNob3dSZXF1aXJlZD86IGJvb2xlYW5cclxuICAgIHNob3dPcHRpb25hbD86IGJvb2xlYW5cclxuICAgIGNvbG9yPzogSW5wdXRDb2xvclxyXG4gICAgd3JhcHBlckNsYXNzZXM/OiBzdHJpbmdcclxuICAgIHNpemU/OiBJbnB1dFNpemVcclxuICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nXHJcbiAgICBkaXNhYmxlZD86IGJvb2xlYW5cclxuICAgIHVzZUxhYmVsSW5FcnJvcnM/OiBib29sZWFuXHJcbiAgICBnZXRBdXRvY29tcGxldGVJdGVtcz86IChxdWVyeTogc3RyaW5nKSA9PiBNYXliZUFzeW5jPFRhZ1tdPlxyXG4gICAgbW9kZWxWYWx1ZT86IFRhZ1tdXHJcbiAgfT4oKSxcclxuICB7XHJcbiAgICBzaXplOiAnYmFzZScsXHJcbiAgICBjb2xvcjogJ3BhZ2UnLFxyXG4gICAgdXNlTGFiZWxJbkVycm9yczogdHJ1ZVxyXG4gIH1cclxuKVxyXG5cclxuLy8gY29uc3QgbG9jYWxWYWx1ZSA9IGRlZmluZU1vZGVsPFRhZ1tdPih7IGxvY2FsOiB0cnVlIH0pXHJcbmNvbnN0IGlucHV0RWwgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MSW5wdXRFbGVtZW50PilcclxuY29uc3QgeyBmb2N1c2VkOiBpc0lucHV0Rm9jdXNlZCB9ID0gdXNlRm9jdXMoaW5wdXRFbClcclxuXHJcbmNvbnN0IGN0eE1hbmFnZXIgPSByZWYoXHJcbiAgbnVsbCBhcyBOdWxsYWJsZTx7XHJcbiAgICBnb1VwOiAoKSA9PiB2b2lkXHJcbiAgICBnb0Rvd246ICgpID0+IHZvaWRcclxuICAgIG9wZW46ICgpID0+IHZvaWRcclxuICAgIGNsb3NlOiAoKSA9PiB2b2lkXHJcbiAgICBzZWxlY3RBY3RpdmU6ICgpID0+IHZvaWRcclxuICAgIGlzT3BlbjogKCkgPT4gYm9vbGVhblxyXG4gIH0+XHJcbilcclxuXHJcbmNvbnN0IHtcclxuICBjb3JlSW5wdXRDbGFzc2VzLFxyXG4gIGNvcmVDbGFzc2VzLFxyXG4gIGxhYmVsQ2xhc3NlcyxcclxuICB0aXRsZSxcclxuICBoZWxwVGlwLFxyXG4gIGhlbHBUaXBJZCxcclxuICBoaWRlSGVscFRpcCxcclxuICBoZWxwVGlwQ2xhc3NlcyxcclxuICBlcnJvck1lc3NhZ2UsXHJcbiAgY2xlYXIsXHJcbiAgdmFsdWVcclxufSA9IHVzZVRleHRJbnB1dENvcmUoe1xyXG4gIHByb3BzOiB0b1JlZnMocHJvcHMpLFxyXG4gIGVtaXQsXHJcbiAgaW5wdXRFbFxyXG4gIC8vIG9wdGlvbnM6IHtcclxuICAvLyAgIGN1c3RvbUNsZWFyOiAoKSA9PiAoc2VsZWN0ZWRJdGVtcy52YWx1ZSA9IFtdKVxyXG4gIC8vIH1cclxufSlcclxuXHJcbmNvbnN0IGF1dG9jb21wbGV0ZUl0ZW1zID0gcmVmKFtdIGFzIHN0cmluZ1tdKVxyXG5jb25zdCBpc0F1dG9jb21wbGV0ZUxvYWRpbmcgPSByZWYoZmFsc2UpXHJcbmNvbnN0IGlzQXV0b2NvbXBsZXRlT3BlbiA9IHJlZihmYWxzZSlcclxuY29uc3QgcXVlcnkgPSByZWYoJycpXHJcblxyXG5jb25zdCBzZWxlY3RlZEl0ZW1zID0gY29tcHV0ZWQoe1xyXG4gIGdldDogKCkgPT4gdmFsdWUudmFsdWUgfHwgW10sXHJcbiAgc2V0OiAobmV3VmFsKSA9PiB7XHJcbiAgICB2YWx1ZS52YWx1ZSA9IHVuaXEobmV3VmFsKS5maWx0ZXIoKHQpID0+ICEhdC5sZW5ndGgpXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3Qgc2l6ZUNsYXNzZXMgPSBjb21wdXRlZCgoKTogc3RyaW5nID0+IHtcclxuICBzd2l0Y2ggKHByb3BzLnNpemUpIHtcclxuICAgIGNhc2UgJ3NtJzpcclxuICAgICAgcmV0dXJuICdoLTYnXHJcbiAgICBjYXNlICdsZyc6XHJcbiAgICAgIHJldHVybiAnaC0xMCdcclxuICAgIGNhc2UgJ3hsJzpcclxuICAgICAgcmV0dXJuICdoLTE0J1xyXG4gICAgY2FzZSAnYmFzZSc6XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gJ2gtOCdcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBzaG91bGRTaG93Q2xlYXIgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5zaG93Q2xlYXIgJiYgISFzZWxlY3RlZEl0ZW1zLnZhbHVlLmxlbmd0aClcclxuXHJcbmNvbnN0IGlucHV0V3JhcHBlckNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbXHJcbiAgICBjb3JlQ2xhc3Nlcy52YWx1ZSxcclxuICAgIHByb3BzLmRpc2FibGVkXHJcbiAgICAgID8gJ2N1cnNvci1ub3QtYWxsb3dlZCAhYmctZm91bmRhdGlvbi1kaXNhYmxlZCAhdGV4dC1kaXNhYmxlZC1tdXRlZCdcclxuICAgICAgOiAnJ1xyXG4gIF1cclxuXHJcbiAgaWYgKHNob3VsZFNob3dDbGVhci52YWx1ZSAmJiAoZXJyb3JNZXNzYWdlLnZhbHVlIHx8IHByb3BzLnNob3dSZXF1aXJlZCkpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncHItMTQnKVxyXG4gIH0gZWxzZSBpZiAoc2hvdWxkU2hvd0NsZWFyLnZhbHVlIHx8IGVycm9yTWVzc2FnZS52YWx1ZSB8fCBwcm9wcy5zaG93UmVxdWlyZWQpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncHItOCcpXHJcbiAgfVxyXG5cclxuICBpZiAoZXJyb3JNZXNzYWdlLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2JvcmRlci0yIGJvcmRlci1kYW5nZXIgdGV4dC1kYW5nZXItZGFya2VyJylcclxuICAgIGlmIChpc0lucHV0Rm9jdXNlZC52YWx1ZSkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3JpbmctMSByaW5nLWRhbmdlcicpXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyIGJvcmRlci1vdXRsaW5lLTMnKVxyXG4gICAgaWYgKGlzSW5wdXRGb2N1c2VkLnZhbHVlKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgncmluZy0xIHJpbmctb3V0bGluZS0zJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgcmVtb3ZlVGFnID0gKHRhZzogVGFnKSA9PiB7XHJcbiAgaWYgKHByb3BzLmRpc2FibGVkKSByZXR1cm5cclxuXHJcbiAgY29uc3QgaWR4ID0gc2VsZWN0ZWRJdGVtcy52YWx1ZS5pbmRleE9mKHRhZylcclxuICBpZiAoaWR4ICE9PSAtMSkge1xyXG4gICAgY29uc3QgbmV3U2VsZWN0ZWQgPSBzZWxlY3RlZEl0ZW1zLnZhbHVlLnNsaWNlKClcclxuICAgIG5ld1NlbGVjdGVkLnNwbGljZShpZHgsIDEpXHJcblxyXG4gICAgc2VsZWN0ZWRJdGVtcy52YWx1ZSA9IG5ld1NlbGVjdGVkXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBvblF1ZXJ5RXNjYXBlID0gKCkgPT4ge1xyXG4gIGlucHV0RWwudmFsdWU/LmJsdXIoKVxyXG4gIGlzQXV0b2NvbXBsZXRlT3Blbi52YWx1ZSA9IGZhbHNlXHJcbn1cclxuXHJcbmNvbnN0IG9uUXVlcnlCYWNrc3BhY2UgPSAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG4gIGlmIChlLmtleSAhPT0gJ0JhY2tzcGFjZScpIHJldHVyblxyXG4gIGlmIChxdWVyeS52YWx1ZS5sZW5ndGgpIHJldHVyblxyXG5cclxuICAvLyBDbGVhciBsYXN0IHRhZ1xyXG4gIGNvbnN0IG5ld1RhZ3MgPSBzZWxlY3RlZEl0ZW1zLnZhbHVlLnNsaWNlKClcclxuICBuZXdUYWdzLnBvcCgpXHJcbiAgc2VsZWN0ZWRJdGVtcy52YWx1ZSA9IG5ld1RhZ3NcclxuICBpc0F1dG9jb21wbGV0ZU9wZW4udmFsdWUgPSBmYWxzZVxyXG59XHJcblxyXG5jb25zdCBvblF1ZXJ5QXJyb3dVcCA9ICgpID0+IHtcclxuICBpZiAoY3R4TWFuYWdlci52YWx1ZT8uaXNPcGVuKCkpIHtcclxuICAgIGN0eE1hbmFnZXIudmFsdWU/LmdvVXAoKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjdHhNYW5hZ2VyLnZhbHVlPy5vcGVuKClcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG9uUXVlcnlBcnJvd0Rvd24gPSAoKSA9PiB7XHJcbiAgaWYgKGN0eE1hbmFnZXIudmFsdWU/LmlzT3BlbigpKSB7XHJcbiAgICBjdHhNYW5hZ2VyLnZhbHVlPy5nb0Rvd24oKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjdHhNYW5hZ2VyLnZhbHVlPy5vcGVuKClcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHJlc29sdmVBdXRvY29tcGxldGVJdGVtcyA9IGFzeW5jICgpID0+IHtcclxuICBpZiAoIXByb3BzLmdldEF1dG9jb21wbGV0ZUl0ZW1zKSByZXR1cm5cclxuXHJcbiAgaXNBdXRvY29tcGxldGVMb2FkaW5nLnZhbHVlID0gdHJ1ZVxyXG4gIGF1dG9jb21wbGV0ZUl0ZW1zLnZhbHVlID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxyXG4gICAgcHJvcHMuZ2V0QXV0b2NvbXBsZXRlSXRlbXMocXVlcnkudmFsdWUpXHJcbiAgKVxyXG4gIGlzQXV0b2NvbXBsZXRlTG9hZGluZy52YWx1ZSA9IGZhbHNlXHJcbn1cclxuY29uc3QgZGVib3VuY2VkUmVzb2x2ZSA9IGRlYm91bmNlKHJlc29sdmVBdXRvY29tcGxldGVJdGVtcywgMTAwMClcclxuY29uc3QgZGVib3VuY2VkUmVzb2x2ZUFuZE1hcmtMb2FkaW5nID0gYXN5bmMgKCkgPT4ge1xyXG4gIGlzQXV0b2NvbXBsZXRlTG9hZGluZy52YWx1ZSA9IHRydWVcclxuICBhd2FpdCBkZWJvdW5jZWRSZXNvbHZlKClcclxufVxyXG5cclxuY29uc3Qgb25RdWVyeUlucHV0ID0gKGU6IEV2ZW50LCBmb3JjZUNyZWF0ZUZyb21JbnB1dD86IGJvb2xlYW4pID0+IHtcclxuICBjb25zdCBpc0FkZGluZ1RhZyA9IGlzSW5wdXRFdmVudChlKVxyXG4gICAgPyBlLmRhdGEgPT09ICcgJyB8fCBlLmRhdGEgPT09ICcsJyB8fCBlLmRhdGEgPT09ICc7J1xyXG4gICAgOiB0cnVlXHJcblxyXG4gIGlmIChpc0FkZGluZ1RhZykge1xyXG4gICAgbGV0IHNlbGVjdGVkID0gZmFsc2VcclxuICAgIGlmIChcclxuICAgICAgY3R4TWFuYWdlci52YWx1ZT8uaXNPcGVuKCkgJiZcclxuICAgICAgYXV0b2NvbXBsZXRlSXRlbXMudmFsdWUubGVuZ3RoICYmXHJcbiAgICAgICFmb3JjZUNyZWF0ZUZyb21JbnB1dFxyXG4gICAgKSB7XHJcbiAgICAgIC8vIEFkZCBmcm9tIG9wZW5lZCBhdXRvY29tcGxldGUgcGFuZWxcclxuICAgICAgY3R4TWFuYWdlci52YWx1ZT8uc2VsZWN0QWN0aXZlKClcclxuICAgICAgc2VsZWN0ZWQgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBBZGQgZnJvbSBxdWVyeVxyXG4gICAgICBjb25zdCBuZXdUYWcgPSBxdWVyeS52YWx1ZVxyXG4gICAgICAgIC50cmltKClcclxuICAgICAgICAuc3Vic3RyaW5nKDAsIHF1ZXJ5LnZhbHVlLmxlbmd0aCAtIChpc0lucHV0RXZlbnQoZSkgPyAxIDogMCkpXHJcblxyXG4gICAgICBjb25zdCB0YWdFeGlzdHMgPSBzZWxlY3RlZEl0ZW1zLnZhbHVlLmluY2x1ZGVzKG5ld1RhZylcclxuICAgICAgaWYgKG5ld1RhZy5sZW5ndGggPiAwICYmICF0YWdFeGlzdHMpIHtcclxuICAgICAgICBzZWxlY3RlZEl0ZW1zLnZhbHVlID0gWy4uLnNlbGVjdGVkSXRlbXMudmFsdWUsIG5ld1RhZ11cclxuICAgICAgICBzZWxlY3RlZCA9IHRydWVcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWxlY3RlZCkge1xyXG4gICAgICBxdWVyeS52YWx1ZSA9ICcnXHJcbiAgICAgIGlzQXV0b2NvbXBsZXRlT3Blbi52YWx1ZSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGlzQXV0b2NvbXBsZXRlT3Blbi52YWx1ZSA9ICEhcXVlcnkudmFsdWUubGVuZ3RoXHJcbiAgfVxyXG59XHJcblxyXG53YXRjaChpc0F1dG9jb21wbGV0ZU9wZW4sIChuZXdJc09wZW4sIG9sZElzT3BlbikgPT4ge1xyXG4gIGlmIChuZXdJc09wZW4gJiYgIW9sZElzT3Blbikge1xyXG4gICAgaWYgKHByb3BzLmdldEF1dG9jb21wbGV0ZUl0ZW1zKSBjdHhNYW5hZ2VyLnZhbHVlPy5vcGVuKClcclxuICB9IGVsc2UgaWYgKCFuZXdJc09wZW4gJiYgb2xkSXNPcGVuKSB7XHJcbiAgICBjdHhNYW5hZ2VyLnZhbHVlPy5jbG9zZSgpXHJcbiAgfVxyXG59KVxyXG5cclxud2F0Y2gocXVlcnksICgpID0+IHtcclxuICB2b2lkIGRlYm91bmNlZFJlc29sdmVBbmRNYXJrTG9hZGluZygpXHJcbn0pXHJcblxyXG4vLyAvLyBzeW5jaW5nIHZhbHVlIHcvIHZlZS12YWxpZGF0ZSBpbnRlcm5hbCBzdGF0ZVxyXG4vLyB3YXRjaChcclxuLy8gICBzZWxlY3RlZEl0ZW1zLFxyXG4vLyAgIChuZXdWYWwpID0+IHtcclxuLy8gICAgIHZhbHVlLnZhbHVlID0gbmV3VmFsLnNsaWNlKClcclxuLy8gICB9LFxyXG4vLyAgIHsgZGVlcDogdHJ1ZSwgaW1tZWRpYXRlOiB0cnVlIH1cclxuLy8gKVxyXG5cclxub25Nb3VudGVkKCgpID0+IHtcclxuICB2b2lkIHJlc29sdmVBdXRvY29tcGxldGVJdGVtcygpXHJcbn0pXHJcblxyXG5kZWZpbmVFeHBvc2UoeyByZXNvbHZlQXV0b2NvbXBsZXRlSXRlbXMgfSlcclxuPC9zY3JpcHQ+XHJcbiIsImltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7IFRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuXHJcbmV4cG9ydCB0eXBlIEF2YXRhclVzZXIgPSB7XHJcbiAgbmFtZTogc3RyaW5nXHJcbiAgYXZhdGFyPzogc3RyaW5nIHwgbnVsbFxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBBdmF0YXJVc2VyV2l0aElkID0gQXZhdGFyVXNlciAmIHsgaWQ6IHN0cmluZyB9XHJcblxyXG5leHBvcnQgdHlwZSBVc2VyQXZhdGFyU2l6ZSA9XHJcbiAgfCAnMnhzJ1xyXG4gIHwgJ3hzJ1xyXG4gIHwgJ3NtJ1xyXG4gIHwgJ2Jhc2UnXHJcbiAgfCAnbGcnXHJcbiAgfCAneGwnXHJcbiAgfCAneHhsJ1xyXG4gIHwgJzN4bCdcclxuICB8ICdlZGl0YWJsZSdcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VBdmF0YXJTaXplQ2xhc3NlcyhwYXJhbXM6IHtcclxuICBwcm9wczogVG9SZWZzPHtcclxuICAgIHNpemU/OiBVc2VyQXZhdGFyU2l6ZVxyXG4gIH0+XHJcbn0pIHtcclxuICBjb25zdCB7IHByb3BzIH0gPSBwYXJhbXNcclxuXHJcbiAgY29uc3QgaGVpZ2h0Q2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHNpemUgPSBwcm9wcy5zaXplPy52YWx1ZVxyXG4gICAgc3dpdGNoIChzaXplKSB7XHJcbiAgICAgIGNhc2UgJzJ4cyc6XHJcbiAgICAgICAgcmV0dXJuICdoLTQnXHJcbiAgICAgIGNhc2UgJ3hzJzpcclxuICAgICAgICByZXR1cm4gJ2gtNSdcclxuICAgICAgY2FzZSAnc20nOlxyXG4gICAgICAgIHJldHVybiAnaC02J1xyXG4gICAgICBjYXNlICdsZyc6XHJcbiAgICAgICAgcmV0dXJuICdoLTEwJ1xyXG4gICAgICBjYXNlICd4bCc6XHJcbiAgICAgICAgcmV0dXJuICdoLTE0J1xyXG4gICAgICBjYXNlICd4eGwnOlxyXG4gICAgICAgIHJldHVybiAnaC0yNCdcclxuICAgICAgY2FzZSAnM3hsJzpcclxuICAgICAgICByZXR1cm4gJ2gtMzInXHJcbiAgICAgIGNhc2UgJ2VkaXRhYmxlJzpcclxuICAgICAgICByZXR1cm4gJ2gtNjAnXHJcbiAgICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnaC04J1xyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IHdpZHRoQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHNpemUgPSBwcm9wcy5zaXplPy52YWx1ZVxyXG4gICAgc3dpdGNoIChzaXplKSB7XHJcbiAgICAgIGNhc2UgJzJ4cyc6XHJcbiAgICAgICAgcmV0dXJuICd3LTQnXHJcbiAgICAgIGNhc2UgJ3hzJzpcclxuICAgICAgICByZXR1cm4gJ3ctNSdcclxuICAgICAgY2FzZSAnc20nOlxyXG4gICAgICAgIHJldHVybiAndy02J1xyXG4gICAgICBjYXNlICdsZyc6XHJcbiAgICAgICAgcmV0dXJuICd3LTEwJ1xyXG4gICAgICBjYXNlICd4bCc6XHJcbiAgICAgICAgcmV0dXJuICd3LTE0J1xyXG4gICAgICBjYXNlICd4eGwnOlxyXG4gICAgICAgIHJldHVybiAndy0yNCdcclxuICAgICAgY2FzZSAnM3hsJzpcclxuICAgICAgICByZXR1cm4gJ3ctMzInXHJcbiAgICAgIGNhc2UgJ2VkaXRhYmxlJzpcclxuICAgICAgICByZXR1cm4gJ3ctNjAnXHJcbiAgICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAndy04J1xyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IHRleHRDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3Qgc2l6ZSA9IHByb3BzLnNpemU/LnZhbHVlXHJcbiAgICBzd2l0Y2ggKHNpemUpIHtcclxuICAgICAgY2FzZSAnMnhzJzpcclxuICAgICAgY2FzZSAneHMnOlxyXG4gICAgICAgIHJldHVybiAndGV4dC10aW55J1xyXG4gICAgICBjYXNlICdzbSc6XHJcbiAgICAgICAgcmV0dXJuICd0ZXh0LXhzJ1xyXG4gICAgICBjYXNlICdsZyc6XHJcbiAgICAgICAgcmV0dXJuICd0ZXh0LW1kJ1xyXG4gICAgICBjYXNlICd4bCc6XHJcbiAgICAgICAgcmV0dXJuICd0ZXh0LTJ4bCdcclxuICAgICAgY2FzZSAneHhsJzpcclxuICAgICAgICByZXR1cm4gJ3RleHQtMnhsJ1xyXG4gICAgICBjYXNlICczeGwnOlxyXG4gICAgICAgIHJldHVybiAndGV4dC0zeGwnXHJcbiAgICAgIGNhc2UgJ2VkaXRhYmxlJzpcclxuICAgICAgICByZXR1cm4gJ2gxJ1xyXG4gICAgICBjYXNlICdiYXNlJzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ3RleHQtYm9keS0yeHMnXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgY29uc3QgaWNvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBzaXplID0gcHJvcHMuc2l6ZT8udmFsdWVcclxuICAgIHN3aXRjaCAoc2l6ZSkge1xyXG4gICAgICBjYXNlICcyeHMnOlxyXG4gICAgICBjYXNlICd4cyc6XHJcbiAgICAgICAgcmV0dXJuICd3LTMgaC0zJ1xyXG4gICAgICBjYXNlICdzbSc6XHJcbiAgICAgICAgcmV0dXJuICd3LTMgaC0zJ1xyXG4gICAgICBjYXNlICdsZyc6XHJcbiAgICAgICAgcmV0dXJuICd3LTUgaC01J1xyXG4gICAgICBjYXNlICd4bCc6XHJcbiAgICAgICAgcmV0dXJuICd3LTggaC04J1xyXG4gICAgICBjYXNlICd4eGwnOlxyXG4gICAgICAgIHJldHVybiAndy0xMCBoLTEwJ1xyXG4gICAgICBjYXNlICdlZGl0YWJsZSc6XHJcbiAgICAgICAgcmV0dXJuICd3LTIwIGgtMjAnXHJcbiAgICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAndy00IGgtNCdcclxuICAgIH1cclxuICB9KVxyXG5cclxuICBjb25zdCBzaXplQ2xhc3NlcyA9IGNvbXB1dGVkKFxyXG4gICAgKCkgPT4gYCR7d2lkdGhDbGFzc2VzLnZhbHVlfSAke2hlaWdodENsYXNzZXMudmFsdWV9ICR7dGV4dENsYXNzZXMudmFsdWV9YFxyXG4gIClcclxuXHJcbiAgcmV0dXJuIHsgaGVpZ2h0Q2xhc3Nlcywgd2lkdGhDbGFzc2VzLCBzaXplQ2xhc3NlcywgaWNvbkNsYXNzZXMgfVxyXG59XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2XHJcbiAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICd0ZXh0LWZvcmVncm91bmQtb24tcHJpbWFyeSBmbGV4IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBvdmVyZmxvdy1oaWRkZW4gdXBwZXJjYXNlIHRyYW5zaXRpb24nLFxyXG4gICAgICByb3VuZGVkID8gJ3JvdW5kZWQtZnVsbCcgOiAncm91bmRlZC1tZCcsXHJcbiAgICAgIHNpemVDbGFzc2VzLFxyXG4gICAgICBiZ0NsYXNzZXMsXHJcbiAgICAgIGJvcmRlckNsYXNzZXMsXHJcbiAgICAgIGhvdmVyQ2xhc3NlcyxcclxuICAgICAgYWN0aXZlQ2xhc3Nlc1xyXG4gICAgXVwiXHJcbiAgPlxyXG4gICAgPHNsb3Q+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICB2LWlmPVwidXNlcj8uYXZhdGFyXCJcclxuICAgICAgICB2LXRpcHB5PVwiIWhpZGVUb29sdGlwID8gcHJvcHMudXNlcj8ubmFtZSA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgY2xhc3M9XCJoLWZ1bGwgdy1mdWxsIGJnLWNvdmVyIGJnLWNlbnRlciBiZy1uby1yZXBlYXRcIlxyXG4gICAgICAgIDpzdHlsZT1cInsgYmFja2dyb3VuZEltYWdlOiBgdXJsKCcke3VzZXIuYXZhdGFyfScpYCB9XCJcclxuICAgICAgLz5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtZWxzZS1pZj1cImluaXRpYWxzXCJcclxuICAgICAgICB2LXRpcHB5PVwiIWhpZGVUb29sdGlwID8gcHJvcHMudXNlcj8ubmFtZSA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgOmNsYXNzPVwidGV4dENsYXNzZXNcIlxyXG4gICAgICAgIGNsYXNzPVwiZmxleCBoLWZ1bGwgdy1mdWxsIHNlbGVjdC1ub25lIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBpbml0aWFscyB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiB2LWVsc2U+PFVzZXJDaXJjbGVJY29uIDpjbGFzcz1cImljb25DbGFzc2VzXCIgLz48L2Rpdj5cclxuICAgIDwvc2xvdD5cclxuICAgIDxzbG90IG5hbWU9XCJhYnNvbHV0ZS1hbmNob3JcIiAvPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBVc2VyQ2lyY2xlSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L3NvbGlkJ1xyXG5pbXBvcnQgdHlwZSB7IE1heWJlTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgdG9SZWZzIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyB1c2VBdmF0YXJTaXplQ2xhc3NlcyB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy91c2VyL2F2YXRhcidcclxuaW1wb3J0IHR5cGUgeyBBdmF0YXJVc2VyLCBVc2VyQXZhdGFyU2l6ZSB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy91c2VyL2F2YXRhcidcclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIHVzZXI/OiBNYXliZU51bGxPclVuZGVmaW5lZDxBdmF0YXJVc2VyPlxyXG4gICAgc2l6ZT86IFVzZXJBdmF0YXJTaXplXHJcbiAgICBob3ZlckVmZmVjdD86IGJvb2xlYW5cclxuICAgIGFjdGl2ZT86IGJvb2xlYW5cclxuICAgIG5vQm9yZGVyPzogYm9vbGVhblxyXG4gICAgbm9CZz86IGJvb2xlYW5cclxuICAgIGhpZGVUb29sdGlwPzogYm9vbGVhblxyXG4gICAgcm91bmRlZD86IGJvb2xlYW5cclxuICAgIGxpZ2h0U3R5bGU/OiBib29sZWFuXHJcbiAgfT4oKSxcclxuICB7XHJcbiAgICBzaXplOiAnYmFzZScsXHJcbiAgICBob3ZlckVmZmVjdDogZmFsc2UsXHJcbiAgICB1c2VyOiBudWxsLFxyXG4gICAgcm91bmRlZDogdHJ1ZSxcclxuICAgIGxpZ2h0U3R5bGU6IGZhbHNlXHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCB7IHNpemVDbGFzc2VzLCBpY29uQ2xhc3NlcyB9ID0gdXNlQXZhdGFyU2l6ZUNsYXNzZXMoeyBwcm9wczogdG9SZWZzKHByb3BzKSB9KVxyXG5cclxuY29uc3QgaW5pdGlhbHMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCFwcm9wcy51c2VyPy5uYW1lPy5sZW5ndGgpIHJldHVyblxyXG4gIGNvbnN0IHBhcnRzID0gcHJvcHMudXNlci5uYW1lLnNwbGl0KCcgJylcclxuICBjb25zdCBmaXJzdExldHRlciA9IHBhcnRzWzBdPy5bMF0gfHwgJydcclxuICBjb25zdCBzZWNvbmRMZXR0ZXIgPSBwYXJ0c1sxXT8uWzBdIHx8ICcnXHJcblxyXG4gIGlmIChwcm9wcy5zaXplID09PSAnc20nIHx8IHByb3BzLnNpemUgPT09ICd4cycpIHJldHVybiBmaXJzdExldHRlclxyXG4gIHJldHVybiBmaXJzdExldHRlciArIHNlY29uZExldHRlclxyXG59KVxyXG5cclxuY29uc3QgYm9yZGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAocHJvcHMubm9Cb3JkZXIpIHJldHVybiAnJ1xyXG4gIGlmIChwcm9wcy5saWdodFN0eWxlKSByZXR1cm4gJ2JvcmRlciBib3JkZXItb3V0bGluZS0yJ1xyXG4gIHJldHVybiAnYm9yZGVyIGJvcmRlci1mb3VuZGF0aW9uJ1xyXG59KVxyXG5cclxuY29uc3QgYmdDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9wcy5ub0JnKSByZXR1cm4gJydcclxuICBpZiAocHJvcHMubGlnaHRTdHlsZSkgcmV0dXJuICdiZy1mb3VuZGF0aW9uLTInXHJcbiAgcmV0dXJuICdiZy1pbmZvLWRhcmtlcidcclxufSlcclxuXHJcbmNvbnN0IGhvdmVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAocHJvcHMuaG92ZXJFZmZlY3QpXHJcbiAgICByZXR1cm4gJ2hvdmVyOmJvcmRlci1wcmltYXJ5IGZvY3VzOmJvcmRlci1wcmltYXJ5IGFjdGl2ZTpzY2FsZS05NSdcclxuICByZXR1cm4gJydcclxufSlcclxuXHJcbmNvbnN0IGFjdGl2ZUNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKHByb3BzLmFjdGl2ZSkgcmV0dXJuICdib3JkZXItcHJpbWFyeSdcclxuICByZXR1cm4gJydcclxufSlcclxuXHJcbmNvbnN0IHRleHRDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9wcy5saWdodFN0eWxlKSByZXR1cm4gJ3RleHQtZm9yZWdyb3VuZC0zJ1xyXG4gIHJldHVybiAnJ1xyXG59KVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXYgcmVmPVwiZWxlbWVudFRvV2F0Y2hGb3JDaGFuZ2VzXCIgOmNsYXNzPVwiYGZsZXggJHtvdmVybGFwID8gJy1zcGFjZS14LTInIDogJyd9YFwiPlxyXG4gICAgPGRpdlxyXG4gICAgICByZWY9XCJpdGVtQ29udGFpbmVyXCJcclxuICAgICAgOmNsYXNzPVwiYGZsZXggZmxleC13cmFwIG92ZXJmbG93LWhpZGRlbiAke1xyXG4gICAgICAgIG92ZXJsYXAgPyAnLXNwYWNlLXgtMiAnIDogJydcclxuICAgICAgfSAke2hlaWdodENsYXNzZXN9YFwiXHJcbiAgICA+XHJcbiAgICAgIDxVc2VyQXZhdGFyXHJcbiAgICAgICAgdi1mb3I9XCIodXNlciwgaSkgaW4gdmlzaWJsZVVzZXJzXCJcclxuICAgICAgICA6a2V5PVwidXNlci5pZCB8fCBpXCJcclxuICAgICAgICA6dXNlcj1cInVzZXJcIlxyXG4gICAgICAgIDpzaXplPVwic2l6ZVwiXHJcbiAgICAgICAgOmhpZGUtdG9vbHRpcD1cImhpZGVUb29sdGlwc1wiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxVc2VyQXZhdGFyXHJcbiAgICAgIHYtaWY9XCJ0b3RhbEhpZGRlbkNvdW50XCJcclxuICAgICAgOnNpemU9XCJzaXplXCJcclxuICAgICAgY2xhc3M9XCJzZWxlY3Qtbm9uZVwiXHJcbiAgICAgIDpjbGFzcz1cInsgJ2N1cnNvci1wb2ludGVyJzogISFvbkhpZGRlbkNvdW50Q2xpY2sgfVwiXHJcbiAgICAgIEBjbGljaz1cIm9uSGlkZGVuQ291bnRDbGljayAmJiBvbkhpZGRlbkNvdW50Q2xpY2soKVwiXHJcbiAgICA+XHJcbiAgICAgICt7eyB0b3RhbEhpZGRlbkNvdW50IH19XHJcbiAgICA8L1VzZXJBdmF0YXI+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCByZWYsIHRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IFVzZXJBdmF0YXIgZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvdXNlci9BdmF0YXIudnVlJ1xyXG5pbXBvcnQgeyB1c2VXcmFwcGluZ0NvbnRhaW5lckhpZGRlbkNvdW50IH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL2xheW91dC9yZXNpemUnXHJcbmltcG9ydCB7IHVzZUF2YXRhclNpemVDbGFzc2VzIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL3VzZXIvYXZhdGFyJ1xyXG5pbXBvcnQgdHlwZSB7IFVzZXJBdmF0YXJTaXplLCBBdmF0YXJVc2VyV2l0aElkIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL3VzZXIvYXZhdGFyJ1xyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgdXNlcnM6IEF2YXRhclVzZXJXaXRoSWRbXVxyXG4gICAgb3ZlcmxhcD86IGJvb2xlYW5cclxuICAgIHNpemU/OiBVc2VyQXZhdGFyU2l6ZVxyXG4gICAgbWF4Q291bnQ/OiBudW1iZXJcclxuICAgIGhpZGVUb29sdGlwcz86IGJvb2xlYW5cclxuICAgIG1heEF2YXRhcnM/OiBudW1iZXJcclxuICAgIG9uSGlkZGVuQ291bnRDbGljaz86ICgpID0+IHZvaWRcclxuICB9PigpLFxyXG4gIHtcclxuICAgIHVzZXJzOiAoKSA9PiBbXSxcclxuICAgIG92ZXJsYXA6IHRydWUsXHJcbiAgICBzaXplOiAnYmFzZScsXHJcbiAgICBtYXhDb3VudDogdW5kZWZpbmVkLFxyXG4gICAgaGlkZVRvb2x0aXBzOiBmYWxzZSxcclxuICAgIG1heEF2YXRhcnM6IHVuZGVmaW5lZCxcclxuICAgIG9uSGlkZGVuQ291bnRDbGljazogdW5kZWZpbmVkXHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCBlbGVtZW50VG9XYXRjaEZvckNoYW5nZXMgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MRWxlbWVudD4pXHJcbmNvbnN0IGl0ZW1Db250YWluZXIgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MRWxlbWVudD4pXHJcblxyXG5jb25zdCB7IGhpZGRlbkl0ZW1Db3VudCB9ID0gdXNlV3JhcHBpbmdDb250YWluZXJIaWRkZW5Db3VudCh7XHJcbiAgZWxlbWVudFRvV2F0Y2hGb3JDaGFuZ2VzLFxyXG4gIGl0ZW1Db250YWluZXIsXHJcbiAgdHJhY2tSZXNpemU6IHRydWUsXHJcbiAgdHJhY2tNdXRhdGlvbnM6IHRydWVcclxufSlcclxuXHJcbmNvbnN0IHsgaGVpZ2h0Q2xhc3NlcyB9ID0gdXNlQXZhdGFyU2l6ZUNsYXNzZXMoeyBwcm9wczogdG9SZWZzKHByb3BzKSB9KVxyXG5cclxuY29uc3QgbWF4Q291bnRIaWRkZW5JdGVtQ291bnQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCFwcm9wcy5tYXhDb3VudCkgcmV0dXJuIDBcclxuICByZXR1cm4gTWF0aC5tYXgocHJvcHMudXNlcnMubGVuZ3RoIC0gcHJvcHMubWF4Q291bnQsIDApXHJcbn0pXHJcblxyXG5jb25zdCB2aXNpYmxlVXNlcnMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgcmVzdWx0ID0gcHJvcHMudXNlcnNcclxuICBjb25zdCBsaW1pdCA9IE1hdGgubWluKHByb3BzLm1heENvdW50ID8/IEluZmluaXR5LCBwcm9wcy5tYXhBdmF0YXJzID8/IEluZmluaXR5KVxyXG4gIHJldHVybiByZXN1bHQuc2xpY2UoMCwgbGltaXQpXHJcbn0pXHJcblxyXG5jb25zdCBtYXhBdmF0YXJzSGlkZGVuQ291bnQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCFwcm9wcy5tYXhBdmF0YXJzKSByZXR1cm4gMFxyXG4gIHJldHVybiBNYXRoLm1heChwcm9wcy51c2Vycy5sZW5ndGggLSBwcm9wcy5tYXhBdmF0YXJzLCAwKVxyXG59KVxyXG5cclxuY29uc3QgdG90YWxIaWRkZW5Db3VudCA9IGNvbXB1dGVkKFxyXG4gICgpID0+XHJcbiAgICBoaWRkZW5JdGVtQ291bnQudmFsdWUgKyBtYXhDb3VudEhpZGRlbkl0ZW1Db3VudC52YWx1ZSArIG1heEF2YXRhcnNIaWRkZW5Db3VudC52YWx1ZVxyXG4pXHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPHN2Z1xyXG4gICAgY2xhc3M9XCJzcGlubmVyXCJcclxuICAgIDpjbGFzcz1cImljb25DbGFzc2VzXCJcclxuICAgIHdpZHRoPVwiMzJweFwiXHJcbiAgICBoZWlnaHQ9XCI0MHB4XCJcclxuICAgIHZpZXdCb3g9XCIwIDAgNjYgNjZcIlxyXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgPlxyXG4gICAgPGNpcmNsZVxyXG4gICAgICBjbGFzcz1cInBhdGhcIlxyXG4gICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjZcIlxyXG4gICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgY3g9XCIzM1wiXHJcbiAgICAgIGN5PVwiMzNcIlxyXG4gICAgICByPVwiMzBcIlxyXG4gICAgPjwvY2lyY2xlPlxyXG4gIDwvc3ZnPlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuXHJcbnR5cGUgU2l6ZSA9ICdiYXNlJyB8ICdzbScgfCAnbGcnXHJcblxyXG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhkZWZpbmVQcm9wczx7IGxvYWRpbmc/OiBib29sZWFuOyBzaXplPzogU2l6ZSB9PigpLCB7XHJcbiAgc2l6ZTogJ2Jhc2UnLFxyXG4gIGxvYWRpbmc6IHRydWVcclxufSlcclxuXHJcbmNvbnN0IGljb25DbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWycnXVxyXG4gIGNsYXNzUGFydHMucHVzaChwcm9wcy5sb2FkaW5nID8gJ29wYWNpdHktMTAwJyA6ICdvcGFjaXR5LTAnKVxyXG5cclxuICBzd2l0Y2ggKHByb3BzLnNpemUpIHtcclxuICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2gtNSB3LTUnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnc20nOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2gtNCB3LTQnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnbGcnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2gtOCB3LTgnKVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIHNjb3BlZD5cclxuQGtleWZyYW1lcyByb3RhdG9yIHtcclxuICAwJSB7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcclxuICB9XHJcbiAgMTAwJSB7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xyXG4gIH1cclxufVxyXG5cclxuQGtleWZyYW1lcyBkYXNoIHtcclxuICAwJSB7XHJcbiAgICBzdHJva2UtZGFzaG9mZnNldDogMTg3O1xyXG4gIH1cclxuICA1MCUge1xyXG4gICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IDQ2Ljc1O1xyXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTtcclxuICB9XHJcbiAgMTAwJSB7XHJcbiAgICBzdHJva2UtZGFzaG9mZnNldDogMTg3O1xyXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNDUwZGVnKTtcclxuICB9XHJcbn1cclxuXHJcbi5zcGlubmVyIHtcclxuICBhbmltYXRpb246IHJvdGF0b3IgMS40cyBsaW5lYXIgaW5maW5pdGU7XHJcbn1cclxuXHJcbi5wYXRoIHtcclxuICBzdHJva2UtZGFzaGFycmF5OiAxODc7XHJcbiAgc3Ryb2tlLWRhc2hvZmZzZXQ6IDA7XHJcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xyXG4gIGFuaW1hdGlvbjogZGFzaCAxLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgc3BhY2UteS0yXCI+XHJcbiAgICA8TGF6eVVzZXJBdmF0YXJFZGl0b3JcclxuICAgICAgdi1pZj1cImVkaXRNb2RlXCJcclxuICAgICAgOnVzZXI9XCJtb2RlbEFzVXNlclwiXHJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgOnNpemU9XCJzaXplXCJcclxuICAgICAgOnJvdW5kZWQ9XCJyb3VuZGVkXCJcclxuICAgICAgQGNhbmNlbD1cImVkaXRNb2RlID0gZmFsc2VcIlxyXG4gICAgICBAc2F2ZT1cIm9uU2F2ZVwiXHJcbiAgICAvPlxyXG4gICAgPGRpdiB2LWVsc2UgY2xhc3M9XCJyZWxhdGl2ZSBncm91cFwiPlxyXG4gICAgICA8aW1nXHJcbiAgICAgICAgdi1pZj1cIiFtb2RlbEFzVXNlci5hdmF0YXIgJiYgZGVmYXVsdEltZ1wiXHJcbiAgICAgICAgOnNyYz1cImRlZmF1bHRJbWdcIlxyXG4gICAgICAgIDphbHQ9XCJtb2RlbEFzVXNlci5uYW1lXCJcclxuICAgICAgICA6Y2xhc3M9XCJzaXplQ2xhc3Nlc1wiXHJcbiAgICAgIC8+XHJcbiAgICAgIDxVc2VyQXZhdGFyXHJcbiAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgaGlkZS10b29sdGlwXHJcbiAgICAgICAgOnVzZXI9XCJtb2RlbEFzVXNlclwiXHJcbiAgICAgICAgOnNpemU9XCJzaXplXCJcclxuICAgICAgICA6bGlnaHQtc3R5bGU9XCJsaWdodFN0eWxlXCJcclxuICAgICAgICA6cm91bmRlZD1cInJvdW5kZWRcIlxyXG4gICAgICAvPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJvcGFjaXR5LTAgdHJhbnNpdGlvbi1hbGwgYWJzb2x1dGUgZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAgdG9wLTAgcmlnaHQtMCBsZWZ0LTAgYm90dG9tLTAgZmxleCBpdGVtcy1lbmQganVzdGlmeS1jZW50ZXIgYm90dG9tLTRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiZWRpdE1vZGUgPSB0cnVlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICBDaGFuZ2VcclxuICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IHYtaWY9XCJlcnJvck1lc3NhZ2VcIiBjbGFzcz1cInctZnVsbCB0ZXh0LWNlbnRlciB0ZXh0LWRhbmdlciB0ZXh0LXNtXCI+XHJcbiAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTWF5YmVOdWxsT3JVbmRlZmluZWQsIE51bGxhYmxlIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQXN5bmNDb21wb25lbnQsIHRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IEZvcm1CdXR0b24gZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvZm9ybS9CdXR0b24udnVlJ1xyXG5pbXBvcnQgVXNlckF2YXRhciBmcm9tICd+fi9zcmMvY29tcG9uZW50cy91c2VyL0F2YXRhci52dWUnXHJcbmltcG9ydCB0eXBlIHsgQXZhdGFyVXNlciwgVXNlckF2YXRhclNpemUgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvdXNlci9hdmF0YXInXHJcbmltcG9ydCBDb21tb25Mb2FkaW5nSWNvbiBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9jb21tb24vbG9hZGluZy9JY29uLnZ1ZSdcclxuaW1wb3J0IHsgdXNlRmllbGQgfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB0eXBlIHsgUnVsZUV4cHJlc3Npb24gfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB7IHVzZUF2YXRhclNpemVDbGFzc2VzIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL3VzZXIvYXZhdGFyJ1xyXG5cclxudHlwZSBNb2RlbFR5cGUgPSBNYXliZU51bGxPclVuZGVmaW5lZDxzdHJpbmc+XHJcblxyXG5jb25zdCBMYXp5VXNlckF2YXRhckVkaXRvciA9IGRlZmluZUFzeW5jQ29tcG9uZW50KHtcclxuICBsb2FkZXI6ICgpID0+IGltcG9ydCgnfn4vc3JjL2NvbXBvbmVudHMvdXNlci9BdmF0YXJFZGl0b3IudnVlJyksXHJcbiAgbG9hZGluZ0NvbXBvbmVudDogQ29tbW9uTG9hZGluZ0ljb24sXHJcbiAgZGVsYXk6IDEwMFxyXG59KVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3NhdmUnLCBuZXdVcmw6IE1vZGVsVHlwZSk6IHZvaWRcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsdWU6IE1vZGVsVHlwZSk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgbW9kZWxWYWx1ZT86IE1vZGVsVHlwZVxyXG4gICAgLyoqXHJcbiAgICAgKiBQbGFjZWhvbGRlciBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGFuZCBzaG93IGluaXRpYWxzIGlmIG5vIGF2YXRhciBpcyBwcmVzZW50XHJcbiAgICAgKi9cclxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmdcclxuICAgIC8qKlxyXG4gICAgICogTmFtZSBvZiB0aGUgZmllbGQuIFVzZWQgZm9yIHZhbGlkYXRpb24gJiBmb3JtIHN1Ym1pdHNcclxuICAgICAqL1xyXG4gICAgbmFtZTogc3RyaW5nXHJcbiAgICBydWxlcz86IFJ1bGVFeHByZXNzaW9uPE1vZGVsVHlwZT5cclxuICAgIHZhbGlkYXRlT25Nb3VudD86IGJvb2xlYW5cclxuICAgIHZhbGlkYXRlT25WYWx1ZVVwZGF0ZT86IGJvb2xlYW5cclxuICAgIGRpc2FibGVkPzogYm9vbGVhblxyXG4gICAgc2l6ZT86IFVzZXJBdmF0YXJTaXplXHJcbiAgICBkZWZhdWx0SW1nPzogc3RyaW5nXHJcbiAgICByb3VuZGVkPzogYm9vbGVhblxyXG4gICAgbGlnaHRTdHlsZT86IGJvb2xlYW5cclxuICB9PigpLFxyXG4gIHtcclxuICAgIHJvdW5kZWQ6IHRydWUsXHJcbiAgICBsaWdodFN0eWxlOiBmYWxzZVxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgeyB2YWx1ZSwgZXJyb3JNZXNzYWdlIH0gPSB1c2VGaWVsZDxNb2RlbFR5cGU+KHByb3BzLm5hbWUsIHByb3BzLnJ1bGVzLCB7XHJcbiAgdmFsaWRhdGVPbk1vdW50OiBwcm9wcy52YWxpZGF0ZU9uTW91bnQsXHJcbiAgdmFsaWRhdGVPblZhbHVlVXBkYXRlOiBwcm9wcy52YWxpZGF0ZU9uVmFsdWVVcGRhdGUsXHJcbiAgaW5pdGlhbFZhbHVlOiBwcm9wcy5tb2RlbFZhbHVlIHx8IHVuZGVmaW5lZFxyXG59KVxyXG5jb25zdCB7IHNpemVDbGFzc2VzIH0gPSB1c2VBdmF0YXJTaXplQ2xhc3Nlcyh7IHByb3BzOiB0b1JlZnMocHJvcHMpIH0pXHJcblxyXG5jb25zdCBlZGl0TW9kZSA9IGRlZmluZU1vZGVsPGJvb2xlYW4+KCdlZGl0TW9kZScpXHJcblxyXG5jb25zdCBtb2RlbEFzVXNlciA9IGNvbXB1dGVkKFxyXG4gICgpOiBBdmF0YXJVc2VyID0+ICh7XHJcbiAgICBhdmF0YXI6IHZhbHVlLnZhbHVlLFxyXG4gICAgbmFtZTogcHJvcHMucGxhY2Vob2xkZXJcclxuICB9KVxyXG4pXHJcblxyXG5jb25zdCBvblNhdmUgPSAobmV3VXJsOiBOdWxsYWJsZTxzdHJpbmc+KSA9PiB7XHJcbiAgdmFsdWUudmFsdWUgPSBuZXdVcmxcclxuICBlbWl0KCdzYXZlJywgbmV3VXJsKVxyXG59XHJcblxyXG5jb25zdCBvcGVuID0gKCkgPT4gKGVkaXRNb2RlLnZhbHVlID0gdHJ1ZSlcclxuY29uc3QgY2xvc2UgPSAoKSA9PiAoZWRpdE1vZGUudmFsdWUgPSBmYWxzZSlcclxuXHJcbmRlZmluZUV4cG9zZSh7IG9wZW4sIGNsb3NlIH0pXHJcbjwvc2NyaXB0PlxyXG4iLCIvKipcclxuICogQmFzZSBPYmplY3RMb2FkZXIgZXJyb3JcclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCBtZXNzYWdlIGlmIG5vbmUgaXMgcGFzc2VkXHJcbiAgICovXHJcbiAgc3RhdGljIGRlZmF1bHRNZXNzYWdlID0gJ1VuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQnXHJcblxyXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMpIHtcclxuICAgIG1lc3NhZ2UgfHw9IG5ldy50YXJnZXQuZGVmYXVsdE1lc3NhZ2VcclxuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogVGhyb3cgdGhlc2UgaW4gZXhlY3V0aW9uIGJyYW5jaGVzIHRoYXQgc2hvdWxkIG5ldmVyIG9jY3VyIHVubGVzcyBpZiB0aGVyZSdzIGEgYnVnXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTG9naWNFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XHJcbiAgc3RhdGljIGRlZmF1bHRNZXNzYWdlID0gJ0FuIHVuZXhwZWN0ZWQgbG9naWMgZXJyb3Igb2NjdXJyZWQhJ1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVW5pbml0aWFsaXplZFJlc291cmNlQWNjZXNzRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xyXG4gIHN0YXRpYyBkZWZhdWx0TWVzc2FnZSA9ICdBdHRlbXB0aW5nIHRvIGFjY2VzcyBhbiB1bmluaXRpYWxpemVkIHJlc291cmNlJ1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29tcG9zYWJsZUludm9rZWRPdXRPZlNjb3BlRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xyXG4gIHN0YXRpYyBkZWZhdWx0TWVzc2FnZSA9XHJcbiAgICAnZ2V0Q3VycmVudEluc3RhbmNlKCkgcmV0dXJuZWQgbnVsbC4gTWV0aG9kIG11c3QgYmUgY2FsbGVkIGF0IHRoZSB0b3Agb2YgYSBzZXR1cCBmdW5jdGlvbidcclxufVxyXG5cclxuLyoqXHJcbiAqIFRocm93IHRoaXMgd2hlbiBzb21ldGhpbmcgdGhhdCdzIG9ubHkgc3VwcG9ydGVkIGR1cmluZyBDU1IgaXMgaW52b2tlZCBkdXJpbmcgU1NSIG9yIHZpY2UgdmVyc2FcclxuICovXHJcbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEVudmlyb25tZW50RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xyXG4gIHN0YXRpYyBkZWZhdWx0TWVzc2FnZSA9XHJcbiAgICAnT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgaW4gY3VycmVudCAoc2VydmVyIG9yIGNsaWVudCkgZW52aXJvbm1lbnQnXHJcbn1cclxuIiwiaW1wb3J0IHsgZGlmZmVyZW5jZSwgaW50ZXJzZWN0aW9uIH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHsgbWQ1IH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vZXJyb3InXHJcblxyXG5leHBvcnQgdHlwZSBGaWxlVHlwZVNwZWNpZmllciA9IFVuaXF1ZUZpbGVUeXBlU3BlY2lmaWVyIHwgYC4ke3N0cmluZ31gXHJcblxyXG5leHBvcnQgZW51bSBVbmlxdWVGaWxlVHlwZVNwZWNpZmllciB7XHJcbiAgQW55QXVkaW8gPSAnYXVkaW8vKicsXHJcbiAgQW55VmlkZW8gPSAndmlkZW8vKicsXHJcbiAgQW55SW1hZ2UgPSAnaW1hZ2UvKidcclxufVxyXG5cclxuLyoqXHJcbiAqIFZhbGlkYXRlIGlmIGZpbGUgaGFzIHRoZSBhbGxvd2VkIHR5cGUuIFdoaWxlIHdlIGNvdWxkIGFsc28gdGVzdCBmb3IgTUlNRSB0eXBlc1xyXG4gKiBub3QgaW4gVW5pcXVlRmlsZVR5cGVTcGVjaWZpZXIsIHRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGVcclxuICogJ2FjY2VwdCcgYXR0cmlidXRlLCB3aGljaCBvbmx5IGFsbG93cyBmb3IgZXh0ZW5zaW9ucyBvciBVbmlxdWVGaWxlVHlwZVNwZWNpZmllclxyXG4gKiB2YWx1ZXMuXHJcbiAqIEBwYXJhbSBmaWxlXHJcbiAqIEBwYXJhbSBhbGxvd2VkVHlwZXMgVGhlIGZpbGUgbXVzdCBoYXZlIG9uZSBvZiB0aGVzZSB0eXBlc1xyXG4gKiBAcmV0dXJucyBUcnVlIGlmIHZhbGlkLCBFcnJvciBvYmplY3QgaWYgbm90XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVGaWxlVHlwZShcclxuICBmaWxlOiBGaWxlLFxyXG4gIGFsbG93ZWRUeXBlczogRmlsZVR5cGVTcGVjaWZpZXJbXVxyXG4pOiB0cnVlIHwgRXJyb3Ige1xyXG4gIC8vIENoZWNrIG9uZSBvZiB0aGUgdW5pcXVlIGZpbGUgdHlwZSBzcGVjaWZpZXJzIGZpcnN0XHJcbiAgY29uc3QgYWxsb3dlZFVuaXF1ZVR5cGVzID0gaW50ZXJzZWN0aW9uKFxyXG4gICAgT2JqZWN0LnZhbHVlcyhVbmlxdWVGaWxlVHlwZVNwZWNpZmllciksXHJcbiAgICBhbGxvd2VkVHlwZXNcclxuICApXHJcbiAgZm9yIChjb25zdCBhbGxvd2VkVW5pcXVlVHlwZSBvZiBhbGxvd2VkVW5pcXVlVHlwZXMpIHtcclxuICAgIHN3aXRjaCAoYWxsb3dlZFVuaXF1ZVR5cGUpIHtcclxuICAgICAgY2FzZSBVbmlxdWVGaWxlVHlwZVNwZWNpZmllci5BbnlBdWRpbzpcclxuICAgICAgICBpZiAoZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2F1ZGlvJykpIHJldHVybiB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSBVbmlxdWVGaWxlVHlwZVNwZWNpZmllci5BbnlJbWFnZTpcclxuICAgICAgICBpZiAoZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlJykpIHJldHVybiB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSBVbmlxdWVGaWxlVHlwZVNwZWNpZmllci5BbnlWaWRlbzpcclxuICAgICAgICBpZiAoZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvJykpIHJldHVybiB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENoZWNrIGZpbGUgZXh0ZW5zaW9uc1xyXG4gIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gZGlmZmVyZW5jZShhbGxvd2VkVHlwZXMsIGFsbG93ZWRVbmlxdWVUeXBlcylcclxuICBjb25zdCBmaWxlRXh0ID0gcmVzb2x2ZUZpbGVFeHRlbnNpb24oZmlsZS5uYW1lKVxyXG4gIGlmICghZmlsZUV4dCkgcmV0dXJuIG5ldyBNaXNzaW5nRmlsZUV4dGVuc2lvbkVycm9yKClcclxuXHJcbiAgZm9yIChjb25zdCBhbGxvd2VkRXh0ZW5zaW9uIG9mIGFsbG93ZWRFeHRlbnNpb25zKSB7XHJcbiAgICBpZiAoYWxsb3dlZEV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpID09PSBmaWxlRXh0LnRvTG93ZXJDYXNlKCkpIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICByZXR1cm4gbmV3IEZvcmJpZGRlbkZpbGVUeXBlRXJyb3IoKVxyXG59XHJcblxyXG4vKipcclxuICogUmVzb2x2ZSBmaWxlIGV4dGVuc2lvbiAod2l0aCBsZWFkaW5nIGRvdClcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRmlsZUV4dGVuc2lvbihmaWxlTmFtZTogc3RyaW5nKTogTnVsbGFibGU8RmlsZVR5cGVTcGVjaWZpZXI+IHtcclxuICBjb25zdCBmaWxlTmFtZVBhcnRzID0gZmlsZU5hbWUuc3BsaXQoJy4nKVxyXG4gIGlmIChmaWxlTmFtZVBhcnRzLmxlbmd0aCA8IDIpIHJldHVybiBudWxsXHJcblxyXG4gIGNvbnN0IGV4dCA9IGZpbGVOYW1lUGFydHMucG9wKCkgfHwgbnVsbFxyXG4gIHJldHVybiBleHQgPyBgLiR7ZXh0fWAgOiBudWxsXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiBzdHJpbmcgaXMgYSBGaWxlVHlwZVNwZWNpZmllclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRmlsZVR5cGVTcGVjaWZpZXIodHlwZTogc3RyaW5nKTogdHlwZSBpcyBGaWxlVHlwZVNwZWNpZmllciB7XHJcbiAgcmV0dXJuIChcclxuICAgIHR5cGUuc3RhcnRzV2l0aCgnLicpIHx8XHJcbiAgICBPYmplY3QudmFsdWVzKFVuaXF1ZUZpbGVUeXBlU3BlY2lmaWVyIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pLmluY2x1ZGVzKHR5cGUpXHJcbiAgKVxyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgaHVtYW4gcmVhZGFibGUgZmlsZSBzaXplIHN0cmluZyBmcm9tIHRoZSBudW1lcmljIHNpemUgaW4gYnl0ZXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcmV0dHlGaWxlU2l6ZShzaXplSW5CeXRlczogbnVtYmVyKTogc3RyaW5nIHtcclxuICBjb25zdCByZW1vdmVUcmFpbGluZ1plcm9lcyA9IChmaWxlU2l6ZTogbnVtYmVyKSA9PlxyXG4gICAgcGFyc2VGbG9hdChmaWxlU2l6ZS50b0ZpeGVkKDIpKS50b1N0cmluZygpXHJcblxyXG4gIGlmIChzaXplSW5CeXRlcyA8IDEwMjQpIHtcclxuICAgIHJldHVybiBgJHtzaXplSW5CeXRlc31ieXRlc2BcclxuICB9XHJcblxyXG4gIGNvbnN0IGtiU2l6ZSA9IHNpemVJbkJ5dGVzIC8gMTAyNFxyXG4gIGlmIChrYlNpemUgPCAxMDI0KSB7XHJcbiAgICByZXR1cm4gYCR7cmVtb3ZlVHJhaWxpbmdaZXJvZXMoa2JTaXplKX1LQmBcclxuICB9XHJcblxyXG4gIGNvbnN0IG1iU2l6ZSA9IGtiU2l6ZSAvIDEwMjRcclxuICBpZiAobWJTaXplIDwgMTAyNCkge1xyXG4gICAgcmV0dXJuIGAke3JlbW92ZVRyYWlsaW5nWmVyb2VzKG1iU2l6ZSl9TUJgXHJcbiAgfVxyXG5cclxuICBjb25zdCBnYlNpemUgPSBtYlNpemUgLyAxMDI0XHJcbiAgcmV0dXJuIGAke3JlbW92ZVRyYWlsaW5nWmVyb2VzKGdiU2l6ZSl9R0JgXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBhbiBJRCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBmaWxlLiBUaGUgc2FtZSBmaWxlXHJcbiAqIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgSUQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGaWxlSWQoZmlsZTogRmlsZSk6IHN0cmluZyB7XHJcbiAgY29uc3QgaW1wb3J0YW50RGF0YSA9IHtcclxuICAgIG5hbWU6IGZpbGUubmFtZSxcclxuICAgIGxhc3RNb2RpZmllZDogZmlsZS5sYXN0TW9kaWZpZWQsXHJcbiAgICBzaXplOiBmaWxlLnNpemUsXHJcbiAgICB0eXBlOiBmaWxlLnR5cGVcclxuICB9XHJcblxyXG4gIHJldHVybiBtZDUoSlNPTi5zdHJpbmdpZnkoaW1wb3J0YW50RGF0YSkpXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNaXNzaW5nRmlsZUV4dGVuc2lvbkVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcclxuICBzdGF0aWMgZGVmYXVsdE1lc3NhZ2UgPSAnVGhlIHNlbGVjdGVkIGZpbGUgaGFzIGEgbWlzc2luZyBleHRlbnNpb24nXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBGb3JiaWRkZW5GaWxlVHlwZUVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcclxuICBzdGF0aWMgZGVmYXVsdE1lc3NhZ2UgPSAnVGhlIHNlbGVjdGVkIGZpbGUgdHlwZSBpcyBmb3JiaWRkZW4nXHJcbn1cclxuIiwiaW1wb3J0IHR5cGUgeyBNYXliZVJlZiB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHR5cGUgeyBNYXliZU51bGxPclVuZGVmaW5lZCwgTnVsbGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQge1xyXG4gIGdlbmVyYXRlRmlsZUlkLFxyXG4gIGlzRmlsZVR5cGVTcGVjaWZpZXIsXHJcbiAgcHJldHR5RmlsZVNpemUsXHJcbiAgdmFsaWRhdGVGaWxlVHlwZVxyXG59IGZyb20gJ35+L3NyYy9oZWxwZXJzL2Zvcm0vZmlsZSdcclxuaW1wb3J0IHR5cGUgeyBGaWxlVHlwZVNwZWNpZmllciB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2Zvcm0vZmlsZSdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHVucmVmIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7IENTU1Byb3BlcnRpZXMgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gJ35+L3NyYy9saWInXHJcbmltcG9ydCB0eXBlIHsgQmxvYlVwbG9hZFN0YXR1cyB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZC9ibG9icydcclxuXHJcbi8qKlxyXG4gKiBBIGZpbGUsIGFzIGVtaXR0ZWQgb3V0IGZyb20gRmlsZVVwbG9hZFpvbmVcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkYWJsZUZpbGVJdGVtIHtcclxuICBmaWxlOiBGaWxlXHJcbiAgZXJyb3I6IE51bGxhYmxlPEVycm9yPlxyXG4gIC8qKlxyXG4gICAqIFlvdSBjYW4gdXNlIHRoaXMgSUQgdG8gY2hlY2sgZm9yIEZpbGUgZXF1YWxpdHlcclxuICAgKi9cclxuICBpZDogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEJsb2JQb3N0UmVzdWx0SXRlbSA9IHtcclxuICBibG9iSWQ/OiBzdHJpbmdcclxuICBmaWxlTmFtZT86IHN0cmluZ1xyXG4gIGZpbGVTaXplPzogbnVtYmVyXHJcbiAgZm9ybUtleTogc3RyaW5nXHJcbiAgLyoqXHJcbiAgICogU3VjY2VzcyA9IDEsIEZhaWx1cmUgPSAyXHJcbiAgICovXHJcbiAgdXBsb2FkU3RhdHVzOiBCbG9iVXBsb2FkU3RhdHVzXHJcbiAgdXBsb2FkRXJyb3I6IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZEZpbGVJdGVtIGV4dGVuZHMgVXBsb2FkYWJsZUZpbGVJdGVtIHtcclxuICAvKipcclxuICAgKiBQcm9ncmVzcyBiZXR3ZWVuIDAgYW5kIDEwMFxyXG4gICAqL1xyXG4gIHByb2dyZXNzOiBudW1iZXJcclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiB1cGxvYWQgaGFzIGZpbmlzaGVkIHRoaXMgY29udGFpbnMgYSBCbG9iUG9zdFJlc3VsdEl0ZW1cclxuICAgKi9cclxuICByZXN1bHQ6IE9wdGlvbmFsPEJsb2JQb3N0UmVzdWx0SXRlbT5cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBhIGJsb2IgZ2V0cyBhc3NpZ25lZCB0byBhIHJlc291cmNlLCBpdCBzaG91bGQgY291bnQgYXMgaW4gdXNlLCBhbmQgdGhpcyB3aWxsXHJcbiAgICogcHJldmVudCBpdCBmcm9tIGJlaW5nIGRlbGV0ZWQgYXMganVua1xyXG4gICAqL1xyXG4gIGluVXNlPzogYm9vbGVhblxyXG59XHJcblxyXG5mdW5jdGlvbiBidWlsZEZpbGVUeXBlU3BlY2lmaWVycyhcclxuICBhY2NlcHQ6IE9wdGlvbmFsPHN0cmluZz5cclxuKTogT3B0aW9uYWw8RmlsZVR5cGVTcGVjaWZpZXJbXT4ge1xyXG4gIGlmICghYWNjZXB0KSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgY29uc3Qgc3BlY2lmaWVycyA9IGFjY2VwdFxyXG4gICAgLnNwbGl0KCcsJylcclxuICAgIC5tYXAoKHMpID0+IChpc0ZpbGVUeXBlU3BlY2lmaWVyKHMpID8gcyA6IG51bGwpKVxyXG4gICAgLmZpbHRlcigocyk6IHMgaXMgRmlsZVR5cGVTcGVjaWZpZXIgPT4gcyAhPT0gbnVsbClcclxuXHJcbiAgcmV0dXJuIHNwZWNpZmllcnMubGVuZ3RoID8gc3BlY2lmaWVycyA6IHVuZGVmaW5lZFxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlUHJlcGFyZVVwbG9hZGFibGVGaWxlcyhwYXJhbXM6IHtcclxuICBkaXNhYmxlZD86IE1heWJlUmVmPE9wdGlvbmFsPGJvb2xlYW4+PlxyXG4gIGFjY2VwdD86IE1heWJlUmVmPE9wdGlvbmFsPHN0cmluZz4+XHJcbiAgbXVsdGlwbGU/OiBNYXliZVJlZjxPcHRpb25hbDxib29sZWFuPj5cclxuICBjb3VudExpbWl0PzogTWF5YmVSZWY8T3B0aW9uYWw8bnVtYmVyPj5cclxuICBzaXplTGltaXQ6IE1heWJlUmVmPG51bWJlcj5cclxufSkge1xyXG4gIGNvbnN0IHsgZGlzYWJsZWQsIGFjY2VwdCwgbXVsdGlwbGUsIHNpemVMaW1pdCwgY291bnRMaW1pdCB9ID0gcGFyYW1zXHJcblxyXG4gIGNvbnN0IGZpbGVUeXBlU3BlY2lmaWVycyA9IGNvbXB1dGVkKCgpID0+IGJ1aWxkRmlsZVR5cGVTcGVjaWZpZXJzKHVucmVmKGFjY2VwdCkpKVxyXG5cclxuICBjb25zdCBoYW5kbGVGaWxlcyA9IChmaWxlczogRmlsZVtdKTogVXBsb2FkYWJsZUZpbGVJdGVtW10gPT4ge1xyXG4gICAgY29uc3QgcmVzdWx0czogVXBsb2FkYWJsZUZpbGVJdGVtW10gPSBbXVxyXG4gICAgY29uc3QgYWxsb3dlZFR5cGVzID0gZmlsZVR5cGVTcGVjaWZpZXJzLnZhbHVlXHJcblxyXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcbiAgICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVGaWxlSWQoZmlsZSlcclxuICAgICAgY29uc3QgZmluYWxDb3VudExpbWl0ID0gIXVucmVmKG11bHRpcGxlKSA/IDEgOiB1bnJlZihjb3VudExpbWl0KVxyXG5cclxuICAgICAgLy8gc2tpcCBmaWxlLCBpZiBpdCdzIHNlbGVjdGVkIHR3aWNlIHNvbWVob3dcclxuICAgICAgaWYgKHJlc3VsdHMuZmluZCgocikgPT4gci5pZCA9PT0gaWQpKSBjb250aW51ZVxyXG5cclxuICAgICAgLy8gT25seSBhbGxvdyBhIHNpbmdsZSBmaWxlIGlmICFtdWx0aXBsZVxyXG4gICAgICBpZiAoZmluYWxDb3VudExpbWl0ICYmIHJlc3VsdHMubGVuZ3RoID49IGZpbmFsQ291bnRMaW1pdCkge1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChhbGxvd2VkVHlwZXMpIHtcclxuICAgICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVGaWxlVHlwZShmaWxlLCBhbGxvd2VkVHlwZXMpXHJcbiAgICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHtcclxuICAgICAgICAgICAgZmlsZSxcclxuICAgICAgICAgICAgaWQsXHJcbiAgICAgICAgICAgIGVycm9yOiB2YWxpZGF0aW9uUmVzdWx0XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgY29udGludWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmaWxlLnNpemUgPiB1bnJlZihzaXplTGltaXQpKSB7XHJcbiAgICAgICAgcmVzdWx0cy5wdXNoKHtcclxuICAgICAgICAgIGZpbGUsXHJcbiAgICAgICAgICBpZCxcclxuICAgICAgICAgIGVycm9yOiBuZXcgRmlsZVRvb0xhcmdlRXJyb3IoXHJcbiAgICAgICAgICAgIGBUaGUgc2VsZWN0ZWQgZmlsZSdzIHNpemUgKCR7cHJldHR5RmlsZVNpemUoXHJcbiAgICAgICAgICAgICAgZmlsZS5zaXplXHJcbiAgICAgICAgICAgICl9KSBpcyB0b28gYmlnIChvdmVyICR7cHJldHR5RmlsZVNpemUodW5yZWYoc2l6ZUxpbWl0KSl9KWBcclxuICAgICAgICAgIClcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnRpbnVlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlc3VsdHMucHVzaCh7IGZpbGUsIGlkLCBlcnJvcjogbnVsbCB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHRzXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0ZSBpbmNvbWluZyBmaWxlcyBhbmQgYnVpbGQgVXBsb2FkYWJsZUZpbGVJdGVtIHN0cnVjdHMgb3V0IG9mIHRoZW1cclxuICAgICAqL1xyXG4gICAgYnVpbGRVcGxvYWRhYmxlRmlsZXM6IChmaWxlczogRmlsZVtdKSA9PiB7XHJcbiAgICAgIGlmICh1bnJlZihkaXNhYmxlZCB8fCBmYWxzZSkpIHJldHVyblxyXG4gICAgICByZXR1cm4gaGFuZGxlRmlsZXMoZmlsZXMpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZVRvb0xhcmdlRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xyXG4gIHN0YXRpYyBkZWZhdWx0TWVzc2FnZSA9IFwiVGhlIHNlbGVjdGVkIGZpbGUncyBzaXplIGlzIHRvbyBsYXJnZVwiXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VGaWxlVXBsb2FkUHJvZ3Jlc3NDb3JlKHBhcmFtczoge1xyXG4gIGl0ZW06IE1heWJlUmVmPE1heWJlTnVsbE9yVW5kZWZpbmVkPFVwbG9hZEZpbGVJdGVtPj5cclxufSkge1xyXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB1bnJlZihwYXJhbXMuaXRlbSlcclxuICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGxcclxuXHJcbiAgICBjb25zdCBpdGVtRXJyb3IgPSBpdGVtLmVycm9yXHJcbiAgICBpZiAoaXRlbUVycm9yKSByZXR1cm4gaXRlbUVycm9yLm1lc3NhZ2VcclxuXHJcbiAgICBjb25zdCB1cGxvYWRFcnJvciA9IGl0ZW0ucmVzdWx0Py51cGxvYWRFcnJvclxyXG4gICAgaWYgKHVwbG9hZEVycm9yKSByZXR1cm4gdXBsb2FkRXJyb3JcclxuXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IHByb2dyZXNzQmFyQ29sb3JDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB1bnJlZihwYXJhbXMuaXRlbSlcclxuICAgIGlmIChlcnJvck1lc3NhZ2UudmFsdWUpIHJldHVybiAnYmctZGFuZ2VyJ1xyXG4gICAgaWYgKGl0ZW0gJiYgaXRlbS5wcm9ncmVzcyA+PSAxMDApIHJldHVybiAnYmctc3VjY2VzcydcclxuICAgIHJldHVybiAnYmctcHJpbWFyeSdcclxuICB9KVxyXG5cclxuICBjb25zdCBwcm9ncmVzc0JhckNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICByZXR1cm4gWydoLTEnLCBwcm9ncmVzc0JhckNvbG9yQ2xhc3MudmFsdWVdLmpvaW4oJyAnKVxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IHByb2dyZXNzQmFyU3R5bGUgPSBjb21wdXRlZCgoKTogQ1NTUHJvcGVydGllcyA9PiB7XHJcbiAgICBjb25zdCBpdGVtID0gdW5yZWYocGFyYW1zLml0ZW0pXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aDogYCR7aXRlbSA/IGl0ZW0ucHJvZ3Jlc3MgOiAwfSVgXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgcmV0dXJuIHsgZXJyb3JNZXNzYWdlLCBwcm9ncmVzc0JhckNsYXNzZXMsIHByb2dyZXNzQmFyU3R5bGUgfVxyXG59XHJcbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlanMtYWNjZXNzaWJpbGl0eS9mb3JtLWNvbnRyb2wtaGFzLWxhYmVsIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPGRpdiByZWY9XCJmaWxlVXBsb2FkWm9uZVwiIGNsYXNzPVwiZmlsZS11cGxvYWQtem9uZVwiPlxyXG4gICAgPHNsb3RcclxuICAgICAgOmlzLWRyYWdnaW5nLWZpbGVzPVwiaXNPdmVyRHJvcFpvbmVcIlxyXG4gICAgICA6b3Blbi1maWxlLXBpY2tlcj1cInRyaWdnZXJQaWNrZXJcIlxyXG4gICAgICA6YWN0aXZhdG9yLW9uPVwieyBjbGljazogdHJpZ2dlclBpY2tlciB9XCJcclxuICAgIC8+XHJcbiAgICA8aW5wdXRcclxuICAgICAgcmVmPVwiZmlsZUlucHV0XCJcclxuICAgICAgdHlwZT1cImZpbGVcIlxyXG4gICAgICBjbGFzcz1cImhpZGRlblwiXHJcbiAgICAgIDphY2NlcHQ9XCJhY2NlcHRcIlxyXG4gICAgICA6bXVsdGlwbGU9XCJtdWx0aXBsZVwiXHJcbiAgICAgIEBjbGljay5zdG9wXHJcbiAgICAgIEBjaGFuZ2U9XCJvbklucHV0Q2hhbmdlXCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IHVzZURyb3Bab25lIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgcmVmIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyB1c2VQcmVwYXJlVXBsb2FkYWJsZUZpbGVzIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL2Zvcm0vZmlsZVVwbG9hZCdcclxuaW1wb3J0IHR5cGUgeyBVcGxvYWRhYmxlRmlsZUl0ZW0gfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS9maWxlVXBsb2FkJ1xyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ2ZpbGVzLXNlbGVjdGVkJywgdjogeyBmaWxlczogVXBsb2FkYWJsZUZpbGVJdGVtW10gfSk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgLyoqXHJcbiAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0F0dHJpYnV0ZXMvYWNjZXB0XHJcbiAgICAgKi9cclxuICAgIGFjY2VwdD86IHN0cmluZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0F0dHJpYnV0ZXMvbXVsdGlwbGVcclxuICAgICAqL1xyXG4gICAgbXVsdGlwbGU/OiBib29sZWFuXHJcbiAgICAvKipcclxuICAgICAqIE1heCBmaWxlIHNpemUgaW4gYnl0ZXNcclxuICAgICAqL1xyXG4gICAgc2l6ZUxpbWl0PzogbnVtYmVyXHJcbiAgICAvKipcclxuICAgICAqIE1heCBmaWxlIGNvdW50IGlmICdtdWx0aXBsZScgaXMgc2V0XHJcbiAgICAgKi9cclxuICAgIGNvdW50TGltaXQ/OiBudW1iZXJcclxuICAgIGRpc2FibGVkPzogYm9vbGVhblxyXG4gIH0+KCksXHJcbiAge1xyXG4gICAgc2l6ZUxpbWl0OiAxMDI0ICogMTAyNCAqIDEwMCAvLyAxMDBtYlxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgZmlsZVVwbG9hZFpvbmUgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MRGl2RWxlbWVudD4pXHJcbmNvbnN0IGZpbGVJbnB1dCA9IHJlZihudWxsIGFzIE51bGxhYmxlPEhUTUxJbnB1dEVsZW1lbnQ+KVxyXG5cclxuY29uc3QgeyBidWlsZFVwbG9hZGFibGVGaWxlcyB9ID0gdXNlUHJlcGFyZVVwbG9hZGFibGVGaWxlcyh7XHJcbiAgc2l6ZUxpbWl0OiBjb21wdXRlZCgoKSA9PiBwcm9wcy5zaXplTGltaXQpLFxyXG4gIGNvdW50TGltaXQ6IGNvbXB1dGVkKCgpID0+IHByb3BzLmNvdW50TGltaXQpLFxyXG4gIGFjY2VwdDogY29tcHV0ZWQoKCkgPT4gcHJvcHMuYWNjZXB0KSxcclxuICBtdWx0aXBsZTogY29tcHV0ZWQoKCkgPT4gcHJvcHMubXVsdGlwbGUpLFxyXG4gIGRpc2FibGVkOiBjb21wdXRlZCgoKSA9PiBwcm9wcy5kaXNhYmxlZClcclxufSlcclxuY29uc3QgaGFuZGxlSW5jb21pbmdGaWxlcyA9IChmaWxlczogRmlsZVtdKSA9PiB7XHJcbiAgY29uc3QgZmlsZUl0ZW1zID0gYnVpbGRVcGxvYWRhYmxlRmlsZXMoZmlsZXMpXHJcbiAgaWYgKCFmaWxlSXRlbXM/Lmxlbmd0aCkgcmV0dXJuXHJcbiAgZW1pdCgnZmlsZXMtc2VsZWN0ZWQnLCB7IGZpbGVzOiBmaWxlSXRlbXMgfSlcclxufVxyXG5cclxuY29uc3QgeyBpc092ZXJEcm9wWm9uZSB9ID0gdXNlRHJvcFpvbmUoZmlsZVVwbG9hZFpvbmUsIChmaWxlcykgPT4ge1xyXG4gIGlmICghZmlsZXM/Lmxlbmd0aCkgcmV0dXJuXHJcbiAgaGFuZGxlSW5jb21pbmdGaWxlcyhmaWxlcylcclxufSlcclxuXHJcbmNvbnN0IG9uSW5wdXRDaGFuZ2UgPSAoKSA9PiB7XHJcbiAgY29uc3QgaW5wdXQgPSBmaWxlSW5wdXQudmFsdWVcclxuICBpZiAoIWlucHV0KSByZXR1cm5cclxuXHJcbiAgY29uc3QgZmlsZXMgPSBbLi4uKGlucHV0LmZpbGVzIHx8IFtdKV1cclxuICBpbnB1dC52YWx1ZSA9ICcnIC8vIFJlc2V0dGluZyB2YWx1ZVxyXG5cclxuICBpZiAoIWZpbGVzLmxlbmd0aCkgcmV0dXJuXHJcbiAgaGFuZGxlSW5jb21pbmdGaWxlcyhmaWxlcylcclxufVxyXG5cclxuY29uc3QgdHJpZ2dlclBpY2tlciA9ICgpID0+IHtcclxuICBmaWxlSW5wdXQudmFsdWU/LmNsaWNrKClcclxufVxyXG5cclxuZGVmaW5lRXhwb3NlKHtcclxuICB0cmlnZ2VyUGlja2VyXHJcbn0pXHJcbjwvc2NyaXB0PlxyXG4iLCJpbXBvcnQgdHlwZSB7IE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IERpcmVjdGl2ZSB9IGZyb20gJ3Z1ZSdcclxuXHJcbmNvbnN0IGtleWJvYXJkQ2xpY2thYmxlS2V5cHJlc3NIYW5kbGVyID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICBpZiAoZS5jb2RlICE9PSAnRW50ZXInKSByZXR1cm5cclxuICA7KGUudGFyZ2V0IGFzIE9wdGlvbmFsPEhUTUxFbGVtZW50Pik/LmNsaWNrKClcclxufVxyXG5cclxuLyoqXHJcbiAqIE1ha2VzIGl0IHBvc3NpYmxlIHRvIG5hdmlnYXRlIHRvIGFuZCBjbGljayBvbiB0aGUgZWxlbWVudCB1c2luZyB0aGUga2V5Ym9hcmRcclxuICovXHJcbmV4cG9ydCBjb25zdCB2S2V5Ym9hcmRDbGlja2FibGU6IERpcmVjdGl2ZTxIVE1MRWxlbWVudD4gPSB7XHJcbiAgY3JlYXRlZChlbCkge1xyXG4gICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJylcclxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywga2V5Ym9hcmRDbGlja2FibGVLZXlwcmVzc0hhbmRsZXIpXHJcbiAgfSxcclxuICB1bm1vdW50ZWQoZWwpIHtcclxuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywga2V5Ym9hcmRDbGlja2FibGVLZXlwcmVzc0hhbmRsZXIpXHJcbiAgfVxyXG59XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsIGJnLW91dGxpbmUtMyByb3VuZGVkIGgtMS41IG92ZXJmbG93LWhpZGRlblwiPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImFib3NsdXRlIGxlZnQtMCB0b3AtMCByb3VuZGVkIGgtMS41XCJcclxuICAgICAgOmNsYXNzPVwiY29sb3JDbGFzc1wiXHJcbiAgICAgIDpzdHlsZT1cInsgd2lkdGg6IGAke3BlcmNlbnRhZ2UgPD0gMTAwID8gcGVyY2VudGFnZSA6IDEwMH0lYCB9XCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiIHNldHVwPlxyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIGN1cnJlbnRWYWx1ZTogbnVtYmVyXHJcbiAgbWF4VmFsdWU6IG51bWJlclxyXG59PigpXHJcblxyXG5jb25zdCBwZXJjZW50YWdlID0gY29tcHV0ZWQoKCkgPT4gKHByb3BzLmN1cnJlbnRWYWx1ZSAvIHByb3BzLm1heFZhbHVlKSAqIDEwMClcclxuY29uc3QgY29sb3JDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAocGVyY2VudGFnZS52YWx1ZSA+PSAxMDApIHtcclxuICAgIHJldHVybiAnYmctZGFuZ2VyJ1xyXG4gIH1cclxuICBpZiAocGVyY2VudGFnZS52YWx1ZSA+PSA4MCkge1xyXG4gICAgcmV0dXJuICdiZy13YXJuaW5nJ1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICdiZy1zdWNjZXNzJ1xyXG59KVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiYmctZm91bmRhdGlvbi1wYWdlIHNoYWRvdy1zbSBmbGV4IGZsZXgtY29sIGdhcC15LTEgc206Z2FwLXktMiBib3JkZXIgYm9yZGVyLW91dGxpbmUtMyByb3VuZGVkLWxnIHB5LTIgcHgtMyBzbTpwLTQgc2VsZWN0LW5vbmVcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgPGg2XHJcbiAgICAgICAgdi1pZj1cInRpdGxlXCJcclxuICAgICAgICBjbGFzcz1cInRleHQtYm9keS14cyBzbTp0ZXh0LWhlYWRpbmctc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IHRpdGxlIH19XHJcbiAgICAgIDwvaDY+XHJcbiAgICAgIDxYXHJcbiAgICAgICAgdi1pZj1cInNob3dDbG9zZXJcIlxyXG4gICAgICAgIHYta2V5Ym9hcmQtY2xpY2thYmxlXHJcbiAgICAgICAgY2xhc3M9XCJoLTQgdy00IGN1cnNvci1wb2ludGVyIGZvY3VzOm91dGxpbmUtbm9uZVwiXHJcbiAgICAgICAgQGNsaWNrPVwiJGVtaXQoJ2Nsb3NlJywgJGV2ZW50KVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxwIHYtaWY9XCJ0ZXh0XCIgY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIHNtOnRleHQtYm9keS14cyB0ZXh0LWZvcmVncm91bmQtMiAhbGVhZGluZy01XCI+XHJcbiAgICAgIHt7IHRleHQgfX1cclxuICAgIDwvcD5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kXCI+XHJcbiAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgdi1pZj1cImJ1dHRvblwiXHJcbiAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICBjbGFzcz1cIm10LTFcIlxyXG4gICAgICAgIDp0bz1cImJ1dHRvbi50b1wiXHJcbiAgICAgICAgOnRhcmdldD1cImJ1dHRvbi50byA/ICdfYmxhbmsnIDogdW5kZWZpbmVkXCJcclxuICAgICAgICBAY2xpY2s9XCIkZW1pdCgnY2xpY2snLCAkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGJ1dHRvbi50aXRsZSB9fVxyXG4gICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCBGb3JtQnV0dG9uIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2Zvcm0vQnV0dG9uLnZ1ZSdcclxuaW1wb3J0IHsgWCB9IGZyb20gJ2x1Y2lkZS12dWUtbmV4dCdcclxuaW1wb3J0IHsgdktleWJvYXJkQ2xpY2thYmxlIH0gZnJvbSAnfn4vc3JjL2RpcmVjdGl2ZXMvYWNjZXNzaWJpbGl0eSdcclxuXHJcbmRlZmluZUVtaXRzPHtcclxuICBjbGljazogW2U6IE1vdXNlRXZlbnRdXHJcbiAgY2xvc2U6IFtlOiBNb3VzZUV2ZW50XVxyXG59PigpXHJcblxyXG5kZWZpbmVQcm9wczx7XHJcbiAgdGl0bGU/OiBzdHJpbmdcclxuICB0ZXh0Pzogc3RyaW5nXHJcbiAgYnV0dG9uPzogeyB0bz86IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9XHJcbiAgc2hvd0Nsb3Nlcj86IGJvb2xlYW5cclxufT4oKVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBmbGV4LWNvbCBnYXAtMS41XCIgOnN0eWxlPVwicHJvcHMuc3R5bGVcIj5cclxuICAgIDxkaXYgdi1pZj1cIiFoaWRlSGVhZGVyXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cclxuICAgICAgPGxhYmVsXHJcbiAgICAgICAgOmZvcj1cIm5hbWVcIlxyXG4gICAgICAgIGNsYXNzPVwiYmxvY2sgdGV4dC1ib2R5LTJ4c1wiXHJcbiAgICAgICAgOmNsYXNzPVwiZGlzYWJsZWQgPyAndGV4dC1mb3JlZ3JvdW5kLTInIDogJ3RleHQtZm9yZWdyb3VuZCdcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgbGFiZWwgfHwgbmFtZSB9fVxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICA6bWluPVwibWluXCJcclxuICAgICAgICA6bWF4PVwibWF4XCJcclxuICAgICAgICA6c3RlcD1cInN0ZXBcIlxyXG4gICAgICAgIDp2YWx1ZT1cImN1cnJlbnRWYWx1ZVwiXHJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIDphcmlhLWxhYmVsPVwiYCR7bGFiZWx9IGN1cnJlbnQgdmFsdWVgXCJcclxuICAgICAgICBjbGFzcz1cInctOCB0ZXh0LWJvZHktMnhzIHRleHQtZm9yZWdyb3VuZC0yIGJnLXRyYW5zcGFyZW50IGJvcmRlci0wIGZvY3VzOm91dGxpbmUtbm9uZSBob3ZlcjpyaW5nLTEgaG92ZXI6cmluZy1vdXRsaW5lLTIgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctb3V0bGluZS00IGRpc2FibGVkOm9wYWNpdHktNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOmhvdmVyOnJpbmctMCByb3VuZGVkICFwLTAuNSB0ZXh0LXJpZ2h0XCJcclxuICAgICAgICBAaW5wdXQ9XCJoYW5kbGVOdW1iZXJJbnB1dFwiXHJcbiAgICAgICAgQGJsdXI9XCJ2YWxpZGF0ZUFuZENsYW1wXCJcclxuICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxpbnB1dFxyXG4gICAgICA6aWQ9XCJuYW1lXCJcclxuICAgICAgOm5hbWU9XCJuYW1lXCJcclxuICAgICAgdHlwZT1cInJhbmdlXCJcclxuICAgICAgOm1pbj1cIm1pblwiXHJcbiAgICAgIDptYXg9XCJtYXhcIlxyXG4gICAgICA6c3RlcD1cInN0ZXBcIlxyXG4gICAgICA6dmFsdWU9XCJjdXJyZW50VmFsdWVcIlxyXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXHJcbiAgICAgIGNsYXNzPVwibXQtMS41IHctZnVsbCBoLTQgb3V0bGluZS1ub25lIHNsaWRlciBzbGlkZXItZ3JhZGllbnRcIlxyXG4gICAgICA6Y2xhc3M9XCJ7XHJcbiAgICAgICAgJ2Rpc2FibGVkOm9wYWNpdHktNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkJzogZGlzYWJsZWQsXHJcbiAgICAgICAgJyFtdC0wJzogaW5wdXRCZWxvd1NsaWRlclxyXG4gICAgICB9XCJcclxuICAgICAgOmFyaWEtbGFiZWw9XCJsYWJlbFwiXHJcbiAgICAgIDphcmlhLXZhbHVlbWluPVwibWluXCJcclxuICAgICAgOmFyaWEtdmFsdWVtYXg9XCJtYXhcIlxyXG4gICAgICA6YXJpYS12YWx1ZW5vdz1cImN1cnJlbnRWYWx1ZVwiXHJcbiAgICAgIEBpbnB1dD1cImhhbmRsZUlucHV0XCJcclxuICAgIC8+XHJcbiAgICA8aW5wdXRcclxuICAgICAgdi1pZj1cImlucHV0QmVsb3dTbGlkZXJcIlxyXG4gICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgOm1pbj1cIm1pblwiXHJcbiAgICAgIDptYXg9XCJtYXhcIlxyXG4gICAgICA6c3RlcD1cInN0ZXBcIlxyXG4gICAgICA6dmFsdWU9XCJjdXJyZW50VmFsdWVcIlxyXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXHJcbiAgICAgIDphcmlhLWxhYmVsPVwiYCR7bGFiZWx9IGN1cnJlbnQgdmFsdWVgXCJcclxuICAgICAgY2xhc3M9XCJ3LTE2IHRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTIgYmctdHJhbnNwYXJlbnQgYm9yZGVyLTAgZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOnJpbmctMSBob3ZlcjpyaW5nLW91dGxpbmUtMiBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1vdXRsaW5lLTQgZGlzYWJsZWQ6b3BhY2l0eS01MCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6aG92ZXI6cmluZy0wIHJvdW5kZWQgIXAtMVwiXHJcbiAgICAgIEBpbnB1dD1cImhhbmRsZU51bWJlcklucHV0XCJcclxuICAgICAgQGJsdXI9XCJ2YWxpZGF0ZUFuZENsYW1wXCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBtaW46IG51bWJlclxyXG4gIG1heDogbnVtYmVyXHJcbiAgc3RlcDogbnVtYmVyXHJcbiAgbmFtZTogc3RyaW5nXHJcbiAgbGFiZWw6IHN0cmluZ1xyXG4gIGRpc2FibGVkPzogYm9vbGVhblxyXG4gIGhpZGVIZWFkZXI/OiBib29sZWFuXHJcbiAgaW5wdXRCZWxvd1NsaWRlcj86IGJvb2xlYW5cclxuICBzdHlsZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj5cclxufT4oKVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFsndXBkYXRlOm1vZGVsVmFsdWUnXSlcclxuXHJcbmNvbnN0IGN1cnJlbnRWYWx1ZSA9IGRlZmluZU1vZGVsKHtcclxuICB0eXBlOiBOdW1iZXIsXHJcbiAgZGVmYXVsdDogMFxyXG59KVxyXG5cclxuY29uc3QgY2xhbXBWYWx1ZSA9ICh2YWx1ZTogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuICByZXR1cm4gTWF0aC5tYXgocHJvcHMubWluLCBNYXRoLm1pbihwcm9wcy5tYXgsIHZhbHVlKSlcclxufVxyXG5cclxuY29uc3QgaGFuZGxlSW5wdXQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcclxuICBjb25zdCB2YWx1ZSA9IE51bWJlcih0YXJnZXQudmFsdWUpXHJcbiAgY29uc3QgY2xhbXBlZFZhbHVlID0gY2xhbXBWYWx1ZSh2YWx1ZSlcclxuICBjdXJyZW50VmFsdWUudmFsdWUgPSBjbGFtcGVkVmFsdWVcclxuICBlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGNsYW1wZWRWYWx1ZSlcclxufVxyXG5cclxuY29uc3QgaGFuZGxlTnVtYmVySW5wdXQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcclxuICBjb25zdCB2YWx1ZSA9IE51bWJlcih0YXJnZXQudmFsdWUpXHJcbiAgLy8gRG9uJ3QgY2xhbXAgZHVyaW5nIHR5cGluZywgb25seSBzZXQgdGhlIHZhbHVlXHJcbiAgY3VycmVudFZhbHVlLnZhbHVlID0gdmFsdWVcclxuICBlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbHVlKVxyXG59XHJcblxyXG5jb25zdCB2YWxpZGF0ZUFuZENsYW1wID0gKGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50XHJcbiAgY29uc3QgdmFsdWUgPSBOdW1iZXIodGFyZ2V0LnZhbHVlKVxyXG4gIGNvbnN0IGNsYW1wZWRWYWx1ZSA9IGNsYW1wVmFsdWUodmFsdWUpXHJcblxyXG4gIGlmICh2YWx1ZSAhPT0gY2xhbXBlZFZhbHVlKSB7XHJcbiAgICB0YXJnZXQudmFsdWUgPSBjbGFtcGVkVmFsdWUudG9TdHJpbmcoKVxyXG4gIH1cclxuXHJcbiAgY3VycmVudFZhbHVlLnZhbHVlID0gY2xhbXBlZFZhbHVlXHJcbiAgZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjbGFtcGVkVmFsdWUpXHJcbn1cclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGUgbGFuZz1cInBvc3Rjc3NcIiBzY29wZWQ+XHJcbmlucHV0W3R5cGU9J251bWJlciddOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLFxyXG5pbnB1dFt0eXBlPSdudW1iZXInXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7XHJcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xyXG4gIG1hcmdpbjogMDtcclxufVxyXG5cclxuaW5wdXRbdHlwZT0nbnVtYmVyJ10ge1xyXG4gIC1tb3otYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xyXG4gIGFwcGVhcmFuY2U6IHRleHRmaWVsZDtcclxufVxyXG5cclxuLnNsaWRlcjo6LXdlYmtpdC1zbGlkZXItcnVubmFibGUtdHJhY2sge1xyXG4gIEBhcHBseSBoLTQgcm91bmRlZC1mdWxsIG91dGxpbmUtb3V0bGluZS0yIGJnLWhpZ2hsaWdodC0xIHB4LTAuNTtcclxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMDQpO1xyXG4gIG91dGxpbmUtd2lkdGg6IDFweDtcclxuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcclxufVxyXG5cclxuLnNsaWRlcjo6LW1vei1yYW5nZS10cmFjayB7XHJcbiAgQGFwcGx5IGgtNCByb3VuZGVkLWZ1bGwgb3V0bGluZS1vdXRsaW5lLTIgYmctaGlnaGxpZ2h0LTEgcHgtMC41O1xyXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4wNCk7XHJcbiAgb3V0bGluZS13aWR0aDogMXB4O1xyXG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xyXG59XHJcblxyXG4uc2xpZGVyOjotd2Via2l0LXNsaWRlci10aHVtYiB7XHJcbiAgQGFwcGx5IGFwcGVhcmFuY2Utbm9uZSBoLTMgdy0zIG10LTAuNSByb3VuZGVkLWZ1bGwgYmctZm9yZWdyb3VuZC1vbi1wcmltYXJ5IGN1cnNvci1wb2ludGVyIG91dGxpbmUtb3V0bGluZS01O1xyXG4gIG91dGxpbmUtd2lkdGg6IDFweDtcclxuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcclxufVxyXG5cclxuLnNsaWRlcjo6LW1vei1yYW5nZS10aHVtYiB7XHJcbiAgQGFwcGx5IGFwcGVhcmFuY2Utbm9uZSBoLTMgdy0zIG10LTAuNSByb3VuZGVkLWZ1bGwgYmctZm9yZWdyb3VuZC1vbi1wcmltYXJ5IGN1cnNvci1wb2ludGVyIG91dGxpbmUtb3V0bGluZS01O1xyXG4gIG91dGxpbmUtd2lkdGg6IDFweDtcclxuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcclxufVxyXG5cclxuLyogR3JhZGllbnQgc3R5bGluZyBmb3Igc2xpZGVyIGlucHV0cyB3aGVuIGdyYWRpZW50IGN1c3RvbSBwcm9wZXJ0aWVzIGFyZSBzZXQgKi9cclxuLnNsaWRlci1ncmFkaWVudDo6LXdlYmtpdC1zbGlkZXItcnVubmFibGUtdHJhY2sge1xyXG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcclxuICAgIHRvIHJpZ2h0LFxyXG4gICAgdmFyKC0tZ3JhZGllbnQtZnJvbSwgdmFyKC0taGlnaGxpZ2h0LTEpKSxcclxuICAgIHZhcigtLWdyYWRpZW50LXRvLCB2YXIoLS1oaWdobGlnaHQtMSkpXHJcbiAgKSAhaW1wb3J0YW50O1xyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInctZnVsbCBoLTUgbWF4LXctOTZcIiA6c3R5bGU9XCJwcm9wcy5zdHlsZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmVcIj5cclxuICAgICAgICA8IS0tIE1pbiByYW5nZSBpbnB1dCAtLT5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIDppZD1cImAke25hbWV9LW1pbmBcIlxyXG4gICAgICAgICAgOm5hbWU9XCJgJHtuYW1lfS1taW5gXCJcclxuICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXHJcbiAgICAgICAgICA6bWluPVwibWluXCJcclxuICAgICAgICAgIDptYXg9XCJtYXhcIlxyXG4gICAgICAgICAgOnN0ZXA9XCJzdGVwXCJcclxuICAgICAgICAgIDp2YWx1ZT1cIm1vZGVsVmFsdWUubWluXCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdy1mdWxsIGgtNCBvdXRsaW5lLW5vbmUgc2xpZGVyIHNsaWRlci1taW5cIlxyXG4gICAgICAgICAgc3R5bGU9XCItd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7IGFwcGVhcmFuY2U6IG5vbmU7IHBvaW50ZXItZXZlbnRzOiBub25lXCJcclxuICAgICAgICAgIDpjbGFzcz1cInsgJ2Rpc2FibGVkOm9wYWNpdHktNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkJzogZGlzYWJsZWQgfVwiXHJcbiAgICAgICAgICA6YXJpYS1sYWJlbD1cImAke25hbWV9IG1pbmltdW1gXCJcclxuICAgICAgICAgIDphcmlhLXZhbHVlbWluPVwibWluXCJcclxuICAgICAgICAgIDphcmlhLXZhbHVlbWF4PVwibWF4XCJcclxuICAgICAgICAgIDphcmlhLXZhbHVlbm93PVwibW9kZWxWYWx1ZS5taW5cIlxyXG4gICAgICAgICAgQGlucHV0PVwiaGFuZGxlTWluSW5wdXRcIlxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIDwhLS0gTWF4IHJhbmdlIGlucHV0IC0tPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgOmlkPVwiYCR7bmFtZX0tbWF4YFwiXHJcbiAgICAgICAgICA6bmFtZT1cImAke25hbWV9LW1heGBcIlxyXG4gICAgICAgICAgdHlwZT1cInJhbmdlXCJcclxuICAgICAgICAgIDptaW49XCJtaW5cIlxyXG4gICAgICAgICAgOm1heD1cIm1heFwiXHJcbiAgICAgICAgICA6c3RlcD1cInN0ZXBcIlxyXG4gICAgICAgICAgOnZhbHVlPVwibW9kZWxWYWx1ZS5tYXhcIlxyXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB3LWZ1bGwgaC00IG91dGxpbmUtbm9uZSBzbGlkZXIgc2xpZGVyLW1heCBweC0wLjVcIlxyXG4gICAgICAgICAgc3R5bGU9XCItd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7IGFwcGVhcmFuY2U6IG5vbmU7IHBvaW50ZXItZXZlbnRzOiBub25lXCJcclxuICAgICAgICAgIDpjbGFzcz1cInsgJ2Rpc2FibGVkOm9wYWNpdHktNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkJzogZGlzYWJsZWQgfVwiXHJcbiAgICAgICAgICA6YXJpYS1sYWJlbD1cImAke25hbWV9IG1heGltdW1gXCJcclxuICAgICAgICAgIDphcmlhLXZhbHVlbWluPVwibWluXCJcclxuICAgICAgICAgIDphcmlhLXZhbHVlbWF4PVwibWF4XCJcclxuICAgICAgICAgIDphcmlhLXZhbHVlbm93PVwibW9kZWxWYWx1ZS5tYXhcIlxyXG4gICAgICAgICAgQGlucHV0PVwiaGFuZGxlTWF4SW5wdXRcIlxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIDwhLS0gVmlzdWFsIHRyYWNrIGhpZ2hsaWdodCBiZXR3ZWVuIGhhbmRsZXMgLS0+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMC41IGgtMyB3LWZ1bGwgcG9pbnRlci1ldmVudHMtbm9uZSB6LTAgb3ZlcmZsb3ctaGlkZGVuXCJcclxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogdHJhbnNwYXJlbnRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBpbnNldC0wIGJnLWdyYXktMzAwLzYwIGRhcms6YmctZ3JheS0yMDAvNDBcIlxyXG4gICAgICAgICAgICA6c3R5bGU9XCJ7XHJcbiAgICAgICAgICAgICAgbGVmdDogdHJhY2tMZWZ0LFxyXG4gICAgICAgICAgICAgIHJpZ2h0OiB0cmFja1JpZ2h0XHJcbiAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgdi1pZj1cInNob3dGaWVsZHNcIiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGdhcC0yIG10LTAuNVwiPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB2LW1vZGVsPVwibWluVmFsdWVTdHJpbmdcIlxyXG4gICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgIDptaW49XCJtaW5cIlxyXG4gICAgICAgIDptYXg9XCJtYXhcIlxyXG4gICAgICAgIDpzdGVwPVwic3RlcFwiXHJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIDphcmlhLWxhYmVsPVwiYCR7bmFtZX0tbWluYFwiXHJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJNaW5cIlxyXG4gICAgICAgIGNsYXNzPVwibXQtMCB3LTE2IHRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTIgYmctdHJhbnNwYXJlbnQgYm9yZGVyLTAgZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOnJpbmctMSBob3ZlcjpyaW5nLW91dGxpbmUtMiBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1vdXRsaW5lLTQgZGlzYWJsZWQ6b3BhY2l0eS01MCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6aG92ZXI6cmluZy0wIHJvdW5kZWQgIXAtMVwiXHJcbiAgICAgIC8+XHJcblxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB2LW1vZGVsPVwibWF4VmFsdWVTdHJpbmdcIlxyXG4gICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgIDptaW49XCJtaW5cIlxyXG4gICAgICAgIDptYXg9XCJtYXhcIlxyXG4gICAgICAgIDpzdGVwPVwic3RlcFwiXHJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIDphcmlhLWxhYmVsPVwiYCR7bmFtZX0tbWF4YFwiXHJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJNYXhcIlxyXG4gICAgICAgIGNsYXNzPVwibXQtMCB3LTE2IHRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTIgYmctdHJhbnNwYXJlbnQgYm9yZGVyLTAgZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOnJpbmctMSBob3ZlcjpyaW5nLW91dGxpbmUtMiBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1vdXRsaW5lLTQgZGlzYWJsZWQ6b3BhY2l0eS01MCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6aG92ZXI6cmluZy0wIHJvdW5kZWQgIXAtMSB0ZXh0LXJpZ2h0XCJcclxuICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICd2dWUnXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBtaW46IG51bWJlclxyXG4gIG1heDogbnVtYmVyXHJcbiAgc3RlcDogbnVtYmVyXHJcbiAgbmFtZTogc3RyaW5nXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuXHJcbiAgc2hvd0ZpZWxkcz86IGJvb2xlYW5cclxuICBzdHlsZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj5cclxufT4oKVxyXG5cclxuY29uc3QgbW9kZWxWYWx1ZSA9IGRlZmluZU1vZGVsPHsgbWluOiBudW1iZXI7IG1heDogbnVtYmVyIH0+KHtcclxuICBkZWZhdWx0OiAoKSA9PiAoeyBtaW46IDAsIG1heDogMTAwIH0pXHJcbn0pXHJcblxyXG5jb25zdCBjbGFtcFZhbHVlID0gKHZhbHVlOiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gIHJldHVybiBNYXRoLm1heChwcm9wcy5taW4sIE1hdGgubWluKHByb3BzLm1heCwgdmFsdWUpKVxyXG59XHJcblxyXG4vLyBTdHJpbmcgdmVyc2lvbnMgZm9yIEZvcm1UZXh0SW5wdXQgY29tcGF0aWJpbGl0eVxyXG5jb25zdCBtaW5WYWx1ZVN0cmluZyA9IGNvbXB1dGVkKHtcclxuICBnZXQ6ICgpID0+IG1vZGVsVmFsdWUudmFsdWUubWluLnRvU3RyaW5nKCksXHJcbiAgc2V0OiAodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgY29uc3QgbnVtVmFsdWUgPSBOdW1iZXIodmFsdWUpXHJcbiAgICBpZiAoIWlzTmFOKG51bVZhbHVlKSkge1xyXG4gICAgICBjb25zdCBjbGFtcGVkVmFsdWUgPSBjbGFtcFZhbHVlKG51bVZhbHVlKVxyXG4gICAgICBjb25zdCBmaW5hbFZhbHVlID0gTWF0aC5taW4oY2xhbXBlZFZhbHVlLCBtb2RlbFZhbHVlLnZhbHVlLm1heClcclxuICAgICAgbW9kZWxWYWx1ZS52YWx1ZSA9IHsgLi4ubW9kZWxWYWx1ZS52YWx1ZSwgbWluOiBmaW5hbFZhbHVlIH1cclxuICAgIH1cclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBtYXhWYWx1ZVN0cmluZyA9IGNvbXB1dGVkKHtcclxuICBnZXQ6ICgpID0+IG1vZGVsVmFsdWUudmFsdWUubWF4LnRvU3RyaW5nKCksXHJcbiAgc2V0OiAodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgY29uc3QgbnVtVmFsdWUgPSBOdW1iZXIodmFsdWUpXHJcbiAgICBpZiAoIWlzTmFOKG51bVZhbHVlKSkge1xyXG4gICAgICBjb25zdCBjbGFtcGVkVmFsdWUgPSBjbGFtcFZhbHVlKG51bVZhbHVlKVxyXG4gICAgICBjb25zdCBmaW5hbFZhbHVlID0gTWF0aC5tYXgoY2xhbXBlZFZhbHVlLCBtb2RlbFZhbHVlLnZhbHVlLm1pbilcclxuICAgICAgbW9kZWxWYWx1ZS52YWx1ZSA9IHsgLi4ubW9kZWxWYWx1ZS52YWx1ZSwgbWF4OiBmaW5hbFZhbHVlIH1cclxuICAgIH1cclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBtaW5QZXJjZW50YWdlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGJhc2VQZXJjZW50YWdlID1cclxuICAgICgobW9kZWxWYWx1ZS52YWx1ZS5taW4gLSBwcm9wcy5taW4pIC8gKHByb3BzLm1heCAtIHByb3BzLm1pbikpICogMTAwXHJcbiAgY29uc3QgdGh1bWJPZmZzZXQgPSAwLjVcclxuICByZXR1cm4gTWF0aC5tYXgoMCwgYmFzZVBlcmNlbnRhZ2UgLSB0aHVtYk9mZnNldClcclxufSlcclxuXHJcbmNvbnN0IG1heFBlcmNlbnRhZ2UgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgYmFzZVBlcmNlbnRhZ2UgPVxyXG4gICAgKChtb2RlbFZhbHVlLnZhbHVlLm1heCAtIHByb3BzLm1pbikgLyAocHJvcHMubWF4IC0gcHJvcHMubWluKSkgKiAxMDBcclxuICBjb25zdCB0aHVtYk9mZnNldCA9IDAuNVxyXG4gIHJldHVybiBNYXRoLm1pbigxMDAsIGJhc2VQZXJjZW50YWdlICsgdGh1bWJPZmZzZXQpXHJcbn0pXHJcblxyXG5jb25zdCB0cmFja0xlZnQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgcGVyY2VudGFnZSA9IG1pblBlcmNlbnRhZ2UudmFsdWVcclxuICBpZiAocGVyY2VudGFnZSA8IDI1KSByZXR1cm4gYCR7cGVyY2VudGFnZSArIDIuNX0lYFxyXG4gIGlmIChwZXJjZW50YWdlID4gNzUpIHJldHVybiBgJHtwZXJjZW50YWdlIC0gMi41fSVgXHJcbiAgcmV0dXJuIGAke3BlcmNlbnRhZ2V9JWBcclxufSlcclxuXHJcbmNvbnN0IHRyYWNrUmlnaHQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgcGVyY2VudGFnZSA9IDEwMCAtIG1heFBlcmNlbnRhZ2UudmFsdWVcclxuICBpZiAocGVyY2VudGFnZSA8IDI1KSByZXR1cm4gYCR7cGVyY2VudGFnZSArIDIuNX0lYFxyXG4gIGlmIChwZXJjZW50YWdlID4gNzUpIHJldHVybiBgJHtwZXJjZW50YWdlIC0gMi41fSVgXHJcbiAgcmV0dXJuIGAke3BlcmNlbnRhZ2V9JWBcclxufSlcclxuXHJcbmNvbnN0IGhhbmRsZU1pbklucHV0ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50XHJcbiAgY29uc3QgdmFsdWUgPSBjbGFtcFZhbHVlKE51bWJlcih0YXJnZXQudmFsdWUpKVxyXG5cclxuICBtb2RlbFZhbHVlLnZhbHVlID0ge1xyXG4gICAgLi4ubW9kZWxWYWx1ZS52YWx1ZSxcclxuICAgIG1pbjogTWF0aC5taW4odmFsdWUsIG1vZGVsVmFsdWUudmFsdWUubWF4KVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgaGFuZGxlTWF4SW5wdXQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcclxuICBjb25zdCB2YWx1ZSA9IGNsYW1wVmFsdWUoTnVtYmVyKHRhcmdldC52YWx1ZSkpXHJcblxyXG4gIG1vZGVsVmFsdWUudmFsdWUgPSB7XHJcbiAgICAuLi5tb2RlbFZhbHVlLnZhbHVlLFxyXG4gICAgbWF4OiBNYXRoLm1heCh2YWx1ZSwgbW9kZWxWYWx1ZS52YWx1ZS5taW4pXHJcbiAgfVxyXG59XHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIGxhbmc9XCJwb3N0Y3NzXCIgc2NvcGVkPlxyXG5pbnB1dFt0eXBlPSdudW1iZXInXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbixcclxuaW5wdXRbdHlwZT0nbnVtYmVyJ106Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24ge1xyXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcclxuICBtYXJnaW46IDA7XHJcbn1cclxuXHJcbmlucHV0W3R5cGU9J251bWJlciddIHtcclxuICAtbW96LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcclxuICBhcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XHJcbn1cclxuXHJcbi8qIFNob3cgdHJhY2sgZm9yIG1pbiBzbGlkZXIgKi9cclxuLnNsaWRlci1taW46Oi13ZWJraXQtc2xpZGVyLXJ1bm5hYmxlLXRyYWNrIHtcclxuICBAYXBwbHkgaC00IHJvdW5kZWQtZnVsbCBvdXRsaW5lLW91dGxpbmUtMiBiZy1oaWdobGlnaHQtMSBweC0wLjU7XHJcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjA0KTtcclxuICBvdXRsaW5lLXdpZHRoOiAxcHg7XHJcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XHJcbn1cclxuXHJcbi5zbGlkZXItbWluOjotbW96LXJhbmdlLXRyYWNrIHtcclxuICBAYXBwbHkgaC00IHJvdW5kZWQtZnVsbCBvdXRsaW5lLW91dGxpbmUtMiBiZy1oaWdobGlnaHQtMSBweC0wLjU7XHJcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjA0KTtcclxuICBvdXRsaW5lLXdpZHRoOiAxcHg7XHJcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XHJcbn1cclxuXHJcbi8qIEhpZGUgdHJhY2sgZm9yIG1heCBzbGlkZXIgKi9cclxuLnNsaWRlci1tYXg6Oi13ZWJraXQtc2xpZGVyLXJ1bm5hYmxlLXRyYWNrIHtcclxuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgb3V0bGluZTogbm9uZTtcclxuICBoZWlnaHQ6IDE2cHg7XHJcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xyXG59XHJcblxyXG4uc2xpZGVyLW1heDo6LW1vei1yYW5nZS10cmFjayB7XHJcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbiAgaGVpZ2h0OiAxNnB4O1xyXG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcclxufVxyXG5cclxuLyogRmlyZWZveCBzcGVjaWZpYyB0cmFjayBoaWRpbmcgKi9cclxuLnNsaWRlcjo6LW1vei1yYW5nZS1wcm9ncmVzcyB7XHJcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XHJcbn1cclxuXHJcbi5zbGlkZXI6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHtcclxuICBAYXBwbHkgYXBwZWFyYW5jZS1ub25lIGgtMyB3LTMgbXQtMC41IHJvdW5kZWQtZnVsbCBiZy1mb3JlZ3JvdW5kLW9uLXByaW1hcnkgY3Vyc29yLXBvaW50ZXIgb3V0bGluZS1vdXRsaW5lLTU7XHJcbiAgb3V0bGluZS13aWR0aDogMXB4O1xyXG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xyXG4gIHotaW5kZXg6IDIwO1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICBwb2ludGVyLWV2ZW50czogYXV0bztcclxufVxyXG5cclxuLnNsaWRlcjo6LW1vei1yYW5nZS10aHVtYiB7XHJcbiAgQGFwcGx5IGFwcGVhcmFuY2Utbm9uZSBoLTMgdy0zIG10LTAuNSByb3VuZGVkLWZ1bGwgYmctZm9yZWdyb3VuZC1vbi1wcmltYXJ5IGN1cnNvci1wb2ludGVyIG91dGxpbmUtb3V0bGluZS01O1xyXG4gIG91dGxpbmUtd2lkdGg6IDFweDtcclxuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcclxuICB6LWluZGV4OiAyMDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XHJcbn1cclxuXHJcbi8qIEdyYWRpZW50IHN0eWxpbmcgZm9yIHNsaWRlciBpbnB1dHMgd2hlbiBncmFkaWVudCBjdXN0b20gcHJvcGVydGllcyBhcmUgc2V0ICovXHJcbi5zbGlkZXItbWluOjotd2Via2l0LXNsaWRlci1ydW5uYWJsZS10cmFjayB7XHJcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxyXG4gICAgdG8gcmlnaHQsXHJcbiAgICB2YXIoLS1ncmFkaWVudC1mcm9tLCB2YXIoLS1oaWdobGlnaHQtMSkpLFxyXG4gICAgdmFyKC0tZ3JhZGllbnQtdG8sIHZhcigtLWhpZ2hsaWdodC0xKSlcclxuICApICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5zbGlkZXItbWluOjotbW96LXJhbmdlLXRyYWNrIHtcclxuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoXHJcbiAgICB0byByaWdodCxcclxuICAgIHZhcigtLWdyYWRpZW50LWZyb20sIHZhcigtLWhpZ2hsaWdodC0xKSksXHJcbiAgICB2YXIoLS1ncmFkaWVudC10bywgdmFyKC0taGlnaGxpZ2h0LTEpKVxyXG4gICkgIWltcG9ydGFudDtcclxufVxyXG48L3N0eWxlPlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL3VpLWNvbXBvbmVudHMvZGlzdC9saWIuanMiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5NSw5Niw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTA3LDEwOCwxMDksMTEwXX0=