Template
Port pages for data forms, score admin, student maintenance, vacation records, menu routing, and workbench. Add team switching, dynamic menu loading, viewport scaling, and bundled local fast-crud packages.
14433 lines
1.7 MiB
Plaintext
14433 lines
1.7 MiB
Plaintext
var ll = Object.defineProperty;
|
||
var sl = (e, t, n) => t in e ? ll(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
|
||
var ie = (e, t, n) => (sl(e, typeof t != "symbol" ? t + "" : t, n), n), ar = (e, t, n) => {
|
||
if (!t.has(e))
|
||
throw TypeError("Cannot " + n);
|
||
};
|
||
var p = (e, t, n) => (ar(e, t, "read from private field"), n ? n.call(e) : t.get(e)), ye = (e, t, n) => {
|
||
if (t.has(e))
|
||
throw TypeError("Cannot add the same private member more than once");
|
||
t instanceof WeakSet ? t.add(e) : t.set(e, n);
|
||
}, fe = (e, t, n, o) => (ar(e, t, "write to private field"), o ? o.call(e, n) : t.set(e, n), n);
|
||
var yo = (e, t, n, o) => ({
|
||
set _(r) {
|
||
fe(e, t, r, n);
|
||
},
|
||
get _() {
|
||
return p(e, t, o);
|
||
}
|
||
}), ne = (e, t, n) => (ar(e, t, "access private method"), n);
|
||
import { uiContext as Le, useUi as Se } from "@fast-crud/ui-interface";
|
||
import { defineAsyncComponent as ul, reactive as un, computed as V, defineComponent as ue, ref as K, onMounted as Cn, openBlock as b, createElementBlock as M, renderSlot as he, createCommentVNode as G, createElementVNode as oe, isRef as Bo, isShallow as Ha, watch as ut, shallowReactive as jo, createVNode as N, shallowRef as cl, inject as Ln, render as dl, toRaw as qn, unref as z, nextTick as Be, getCurrentInstance as Jo, normalizeStyle as xn, resolveComponent as Z, createBlock as $, withCtx as B, resolveDynamicComponent as H, isVNode as Hr, h as _r, mergeProps as W, normalizeClass as dt, createTextVNode as Ct, toDisplayString as Pe, provide as Ut, Fragment as be, renderList as Te, createSlots as Qo, normalizeProps as je, useAttrs as Zo, useSlots as Wr, withDirectives as er, resolveDirective as Cr, toRef as da, guardReactiveProps as Nt, withModifiers as fl, vShow as Wa, TransitionGroup as hl, toHandlerKey as ml, withKeys as pl } from "vue";
|
||
import { forEach as J, camelCase as Ua, upperFirst as gl, merge as mo, isString as Sr, toPath as vl, identity as bl, cloneDeep as ft, get as et, mergeWith as yl, cloneDeepWith as wl, isArray as xo, set as We, remove as Ka, size as _l, sortBy as Sn, pick as Ya, includes as Cl, each as yt, map as Sl, omit as cn, entries as Ur, unset as No, forOwn as Fl, toString as Rl, debounce as kl, keys as Ga } from "lodash-es";
|
||
import ot from "dayjs";
|
||
import { Icon as Dl } from "@iconify/vue";
|
||
import { useRoute as Xa } from "vue-router";
|
||
function Ol() {
|
||
var t;
|
||
return (t = new Error().stack) == null ? void 0 : t.split(`
|
||
`)[3];
|
||
}
|
||
const Lt = (...e) => {
|
||
};
|
||
function Fr(...e) {
|
||
console.log.apply(this, arguments);
|
||
}
|
||
function El(...e) {
|
||
console.warn.apply(this, arguments);
|
||
}
|
||
function Tl(...e) {
|
||
console.error.apply(this, arguments);
|
||
}
|
||
const $l = (...e) => {
|
||
Tl("%c [error]", "font-weight: 600;", ...e);
|
||
}, Al = (...e) => {
|
||
El("%c [warn]", "font-weight: 600;", ...e);
|
||
}, fa = (...e) => {
|
||
Fr("%c [info]", "font-weight: 600;", ...e);
|
||
}, Il = (...e) => {
|
||
if (!console.log)
|
||
return;
|
||
const t = Ol();
|
||
{
|
||
const n = ["%c [debug]", "font-weight: 600;", ...e];
|
||
Fr(...n);
|
||
const o = ["%c " + t, "color:#999"];
|
||
Fr(...o);
|
||
}
|
||
}, ce = {
|
||
debug: Lt,
|
||
info: Lt,
|
||
warn: Lt,
|
||
error: Lt,
|
||
log: Lt
|
||
};
|
||
function Vl(e = {}) {
|
||
const t = (e == null ? void 0 : e.level) || "info";
|
||
switch (ce.debug = Lt, ce.info = Lt, ce.warn = Lt, ce.error = Lt, ce.log = Lt, t) {
|
||
case "debug":
|
||
ce.debug = Il;
|
||
case "info":
|
||
ce.info = fa, ce.log = fa;
|
||
case "warn":
|
||
ce.warn = Al;
|
||
case "error":
|
||
ce.error = $l;
|
||
break;
|
||
}
|
||
}
|
||
Vl();
|
||
function Pl(e) {
|
||
return e == null || e === "";
|
||
}
|
||
function Ml(...e) {
|
||
for (const t of e)
|
||
if (!(t == null || t === ""))
|
||
return !1;
|
||
return !1;
|
||
}
|
||
function Bl(...e) {
|
||
for (const t of e)
|
||
if (t == null || t === "")
|
||
return !0;
|
||
return !1;
|
||
}
|
||
const Kr = {
|
||
isEmpty: Pl,
|
||
isAllEmpty: Ml,
|
||
hasEmpty: Bl
|
||
};
|
||
function jl(e, t = !1) {
|
||
}
|
||
function Yr(e) {
|
||
return ul({
|
||
loader: e,
|
||
onError(t, n, o, r) {
|
||
console.error("load error", t), t.message.match(/fetch/) && r <= 3 ? n() : o();
|
||
}
|
||
});
|
||
}
|
||
function xl(e, t, n, o) {
|
||
const r = Yr(n);
|
||
e.component(t, r, o);
|
||
}
|
||
function Nl(e, t, n, o, r) {
|
||
const a = po(t, o, r);
|
||
J(a, (i, l) => {
|
||
n && n.indexOf(l) != -1 || xl(e, l, i, null);
|
||
});
|
||
}
|
||
function Ll(e, t, n, o, r) {
|
||
const a = po(t, o, r);
|
||
J(a, (i, l) => {
|
||
n && n.indexOf(l) || e.component(l, i.default);
|
||
});
|
||
}
|
||
function po(e, t, n) {
|
||
const o = {};
|
||
return t == null && (t = /.*\/(.+).(vue|jsx|tsx)/), J(e, (r, a) => {
|
||
const i = a.match(t);
|
||
if ((i == null ? void 0 : i.length) <= 1) {
|
||
console.error(`"${a}" can't pick a component name,this component can't register`);
|
||
return;
|
||
}
|
||
let l = i[1];
|
||
l = Ua(l), l = gl(l), n && (r = n(r)), o[l] = r;
|
||
}), o;
|
||
}
|
||
function zl(e) {
|
||
const t = po(e), n = {};
|
||
return J(t, (o, r) => {
|
||
n[r] = Yr(o);
|
||
}), n;
|
||
}
|
||
function ql(e) {
|
||
const t = po(e), n = {};
|
||
return J(t, (o, r) => {
|
||
n[r] = o.default;
|
||
}), n;
|
||
}
|
||
const Hl = {
|
||
transformFromGlob: po,
|
||
installAsyncComponents: Nl,
|
||
installSyncComponents: Ll,
|
||
createAsyncComponent: Yr,
|
||
loadAsyncComponentFromGlob: zl,
|
||
loadComponentFromGlob: ql
|
||
};
|
||
class Gr {
|
||
constructor(t) {
|
||
ie(this, "remoteStorage");
|
||
ie(this, "$router");
|
||
ie(this, "tableName");
|
||
ie(this, "keyType");
|
||
ie(this, "id");
|
||
this.remoteStorage = t.remoteStorage, this.$router = t.$router, this.tableName = t.tableName, this.keyType = t.keyType, this.id = t.id;
|
||
}
|
||
getTableId() {
|
||
const t = this.tableName;
|
||
let n = "fs-crud";
|
||
return this.id && (n = n + "." + this.id), t && typeof t == "string" ? n + "." + t : n;
|
||
}
|
||
async getTable() {
|
||
const t = this.getTableId(), n = localStorage.getItem(t);
|
||
if (n != null)
|
||
return JSON.parse(n);
|
||
}
|
||
async saveTable(t) {
|
||
const n = this.getTableId();
|
||
localStorage.setItem(n, JSON.stringify(t));
|
||
}
|
||
async clearTable() {
|
||
const t = this.getTableId();
|
||
localStorage.removeItem(t);
|
||
}
|
||
async updateTableValue(t, n) {
|
||
if (n == null && (n = this.getItemKey()), this.remoteStorage) {
|
||
await this.remoteStorage.set(n, t);
|
||
return;
|
||
}
|
||
let o = await this.getTable();
|
||
o == null && (o = {}), o[n] = t, await this.saveTable(o);
|
||
}
|
||
getItemKey() {
|
||
const t = this.$router, n = this.keyType;
|
||
let o = location.href;
|
||
return t && (o = t.path), this.id && (o = o + "." + this.id), n == null || typeof n != "string" || !n ? o : o + "." + n;
|
||
}
|
||
async getTableValue(t) {
|
||
if (t == null && (t = this.getItemKey()), this.remoteStorage)
|
||
return await this.remoteStorage.get(t);
|
||
const n = await this.getTable();
|
||
return n == null ? null : n[t];
|
||
}
|
||
async clearTableValue(t) {
|
||
if (t == null && (t = this.getItemKey()), this.remoteStorage) {
|
||
await this.remoteStorage.remove(t);
|
||
return;
|
||
}
|
||
const n = await this.getTable();
|
||
n != null && (delete n[t], await this.saveTable(n));
|
||
}
|
||
}
|
||
const Wl = /\D/, Ul = /^[a-zA-Z_$]+([\w_$]*)$/, Kl = /"/g;
|
||
function ha(...e) {
|
||
return e.reduce((t, n) => t ? !n || n.startsWith("[") ? `${t}${n}` : `${t}.${n}` : n, "");
|
||
}
|
||
function Ja(e) {
|
||
function t(n, ...o) {
|
||
if (o = o.filter((r) => r !== void 0), e.isString(n))
|
||
return ha(...o, n);
|
||
if (Array.isArray(n))
|
||
return o = ha(...o), n.reduce((r, a) => {
|
||
const i = typeof a;
|
||
return i === "number" ? a < 0 || a % 1 !== 0 ? `${r}["${a}"]` : `${r}[${a}]` : i !== "string" ? `${r}["${a}"]` : a ? Wl.test(a) ? Ul.test(a) ? r ? `${r}.${a}` : `${r}${a}` : `${r}["${a.replace(Kl, '\\"')}"]` : `${r}[${a}]` : `${r}[""]`;
|
||
}, o);
|
||
}
|
||
return t;
|
||
}
|
||
Ja.notChainable = !0;
|
||
const Yl = /^[a-zA-Z_$]+([\w_$]*)$/, Gl = /"/g, Qa = Object.prototype.hasOwnProperty;
|
||
function Xl(e) {
|
||
const t = typeof e;
|
||
return e != null && (t == "object" || t == "function");
|
||
}
|
||
function Jl(e) {
|
||
const t = Ja(e);
|
||
function n(a) {
|
||
const { options: i, obj: l, callback: s } = a;
|
||
i.pathFormatArray = i.pathFormat == "array", a.depth = 0;
|
||
let u = !1;
|
||
const c = () => (u = !0, !1);
|
||
for (; a && !u; ) {
|
||
if (!a.inited) {
|
||
if (a.inited = !0, a.info = pa(a.value, i.ownPropertiesOnly), i.checkCircular && (a.circularParentIndex = -1, a.circularParent = null, a.isCircular = !1, a.info.isObject && !a.info.isEmpty)) {
|
||
let d = a.parent;
|
||
for (; d; ) {
|
||
if (d.value === a.value) {
|
||
a.isCircular = !0, a.circularParent = d, a.circularParentIndex = a.depth - d.depth - 1;
|
||
break;
|
||
}
|
||
d = d.parent;
|
||
}
|
||
}
|
||
if (a.children = [], i.childrenPath && i.childrenPath.forEach((d, f) => {
|
||
const h = e.get(a.value, d), g = pa(h, i.ownPropertiesOnly);
|
||
g.isEmpty || a.children.push([d, i.strChildrenPath[f], h, g]);
|
||
}), a.isLeaf = a.isCircular || i.childrenPath !== void 0 && !a.children.length || !a.info.isObject || a.info.isEmpty, a.needCallback = (a.depth || i.includeRoot) && (!i.leavesOnly || a.isLeaf), a.needCallback) {
|
||
const d = new ma(l, i, c);
|
||
d.setItem(a, !1);
|
||
try {
|
||
a.res = s(a.value, a.key, a.parent && a.parent.value, d);
|
||
} catch (f) {
|
||
throw f.message && (f.message += `
|
||
callback failed before deep iterate at:
|
||
` + t(a.path)), f;
|
||
}
|
||
}
|
||
if (u)
|
||
break;
|
||
a.res !== !1 && !u && !a.isCircular && a.info.isObject && (i.childrenPath !== void 0 && (a.depth || !i.rootIsChildren) ? (a.childrenItems = [], a.children.length && a.children.forEach(([d, f, h, g]) => {
|
||
a.childrenItems = [
|
||
...a.childrenItems,
|
||
...g.isArray ? o(a, h, i, d, f) : r(a, h, i, d, f)
|
||
];
|
||
})) : a.childrenItems = a.info.isArray ? o(a, a.value, i, [], "") : r(a, a.value, i, [], "")), a.currentChildIndex = -1;
|
||
}
|
||
if (a.childrenItems && a.currentChildIndex < a.childrenItems.length - 1) {
|
||
a.currentChildIndex++, a.childrenItems[a.currentChildIndex].parentItem = a, a = a.childrenItems[a.currentChildIndex];
|
||
continue;
|
||
}
|
||
if (a.needCallback && i.callbackAfterIterate) {
|
||
const d = new ma(l, i, c);
|
||
d.setItem(a, !0);
|
||
try {
|
||
s(a.value, a.key, a.parent && a.parent.value, d);
|
||
} catch (f) {
|
||
throw f.message && (f.message += `
|
||
callback failed after deep iterate at:
|
||
` + t(a.path)), f;
|
||
}
|
||
}
|
||
a = a.parentItem;
|
||
}
|
||
}
|
||
return n;
|
||
function o(a, i, l, s, u) {
|
||
let c;
|
||
l.pathFormatArray || (c = a.strPath || "", u && c && !u.startsWith("[") && (c += "."), c += u || "");
|
||
const d = [];
|
||
for (let f = 0; f < i.length; f++) {
|
||
const h = i[f];
|
||
if (h === void 0 && !(f in i))
|
||
continue;
|
||
let g;
|
||
const m = !l.pathFormatArray;
|
||
m && (g = `${c}[${f}]`), d.push({
|
||
value: h,
|
||
key: f + "",
|
||
path: [...a.path || [], ...s, f + ""],
|
||
strPath: g,
|
||
depth: a.depth + 1,
|
||
parent: {
|
||
value: a.value,
|
||
key: a.key,
|
||
path: m ? a.strPath : a.path,
|
||
parent: a.parent,
|
||
depth: a.depth,
|
||
info: a.info
|
||
},
|
||
childrenPath: s.length && s || void 0,
|
||
strChildrenPath: u || void 0
|
||
});
|
||
}
|
||
return d;
|
||
}
|
||
function r(a, i, l, s, u) {
|
||
let c;
|
||
l.pathFormatArray || (c = a.strPath || "", u && c && !u.startsWith("[") && (c += "."), c += u || "");
|
||
const d = [], f = !l.pathFormatArray;
|
||
for (const h in i) {
|
||
if (l.ownPropertiesOnly && !Qa.call(i, h))
|
||
continue;
|
||
let g;
|
||
f && (Yl.test(h) ? c ? g = `${c}.${h}` : g = `${h}` : g = `${c}["${h.replace(Gl, '\\"')}"]`), d.push({
|
||
value: i[h],
|
||
key: h,
|
||
path: [...a.path || [], ...s, h],
|
||
strPath: g,
|
||
depth: a.depth + 1,
|
||
parent: {
|
||
value: a.value,
|
||
key: a.key,
|
||
path: f ? a.strPath : a.path,
|
||
parent: a.parent,
|
||
depth: a.depth,
|
||
info: a.info
|
||
},
|
||
childrenPath: s.length && s || void 0,
|
||
strChildrenPath: u || void 0
|
||
});
|
||
}
|
||
return d;
|
||
}
|
||
}
|
||
class ma {
|
||
constructor(t, n, o) {
|
||
ie(this, "_item");
|
||
ie(this, "obj");
|
||
ie(this, "_options");
|
||
ie(this, "afterIterate");
|
||
this.obj = t, this._options = n, this.break = o;
|
||
}
|
||
setItem(t, n) {
|
||
this._item = t, this.afterIterate = n;
|
||
}
|
||
get path() {
|
||
return this._options.pathFormatArray ? this._item.path : this._item.strPath;
|
||
}
|
||
get parent() {
|
||
return this._item.parent;
|
||
}
|
||
get parents() {
|
||
if (!this._item._parents) {
|
||
this._item._parents = [];
|
||
let t = this._item.parent;
|
||
for (; t; )
|
||
this._item._parents[t.depth] = t, t = t.parent;
|
||
}
|
||
return this._item._parents;
|
||
}
|
||
get depth() {
|
||
return this._item.depth;
|
||
}
|
||
get isLeaf() {
|
||
return this._item.isLeaf;
|
||
}
|
||
get isCircular() {
|
||
return this._item.isCircular;
|
||
}
|
||
get circularParentIndex() {
|
||
return this._item.circularParentIndex;
|
||
}
|
||
get circularParent() {
|
||
return this._item.circularParent;
|
||
}
|
||
get childrenPath() {
|
||
return this._options.childrenPath !== void 0 && (this._options.pathFormatArray ? this._item.childrenPath : this._item.strChildrenPath) || void 0;
|
||
}
|
||
get info() {
|
||
return this._item.info;
|
||
}
|
||
}
|
||
function Ql(e, t) {
|
||
for (const n in e)
|
||
if (!t || Qa.call(e, n))
|
||
return !1;
|
||
return !0;
|
||
}
|
||
function pa(e, t) {
|
||
const n = { isObject: Xl(e) };
|
||
return n.isArray = n.isObject && Array.isArray(e), n.isEmpty = n.isArray ? !e.length : n.isObject ? Ql(e, t) : !0, n;
|
||
}
|
||
function Zl(e) {
|
||
const t = Jl(e);
|
||
function n(o, r, a) {
|
||
if (r === void 0 && (r = bl), a = mo({
|
||
includeRoot: !Array.isArray(o),
|
||
pathFormat: "string",
|
||
checkCircular: !1,
|
||
leavesOnly: !1,
|
||
ownPropertiesOnly: !0
|
||
//
|
||
}, a || {}), a.childrenPath !== void 0) {
|
||
if (!a.includeRoot && a.rootIsChildren === void 0 && (a.rootIsChildren = Array.isArray(o)), !Sr(a.childrenPath) && !Array.isArray(a.childrenPath))
|
||
throw Error("childrenPath can be string or array");
|
||
Sr(a.childrenPath) && (a.childrenPath = [a.childrenPath]), a.strChildrenPath = a.childrenPath, a.childrenPath = [];
|
||
for (let i = a.strChildrenPath.length - 1; i >= 0; i--)
|
||
a.childrenPath[i] = vl(a.strChildrenPath[i]);
|
||
}
|
||
return t({
|
||
value: o,
|
||
callback: r,
|
||
options: a,
|
||
obj: o
|
||
}), o;
|
||
}
|
||
return n;
|
||
}
|
||
const es = Zl({ isString: Sr }), Za = {
|
||
forEachDeep: es
|
||
}, ts = {
|
||
/**
|
||
* 重构object,但忽略某些字段
|
||
* @param ref
|
||
* @param skips
|
||
*/
|
||
omit(e, ...t) {
|
||
const n = Object.keys(e.value), o = {};
|
||
for (const r of n)
|
||
r !== "loading" && (t.indexOf(r) >= 0 || (o[r] = e.value[r]));
|
||
return o;
|
||
}
|
||
};
|
||
function ga(e) {
|
||
const t = document.createElement("textarea");
|
||
t.value = e, t.style.position = "fixed", t.style.top = "0", t.style.left = "0", t.style.opacity = "0", t.style.pointerEvents = "none", t.style.zIndex = "-1", document.body.appendChild(t);
|
||
try {
|
||
t.select(), t.setSelectionRange(0, 99999);
|
||
const n = document.execCommand("copy");
|
||
return document.body.removeChild(t), n ? !0 : (console.error("传统复制方法失败"), !1);
|
||
} catch (n) {
|
||
return console.error("传统复制方法出错: ", n), document.body.removeChild(t), !1;
|
||
}
|
||
}
|
||
async function ns(e) {
|
||
try {
|
||
return !navigator.clipboard || !navigator.clipboard.writeText ? (console.warn("Clipboard API not supported, falling back to traditional method"), ga(e)) : (await navigator.clipboard.writeText(e), !0);
|
||
} catch (t) {
|
||
return console.error("复制失败: ", t), ga(e);
|
||
}
|
||
}
|
||
async function os() {
|
||
return new Promise((e, t) => {
|
||
const n = document.createElement("textarea");
|
||
n.style.position = "fixed", n.style.top = "0", n.style.left = "0", n.style.opacity = "0", document.body.appendChild(n);
|
||
try {
|
||
if (n.focus(), document.execCommand("paste")) {
|
||
const r = n.value;
|
||
document.body.removeChild(n), e(r);
|
||
} else
|
||
document.body.removeChild(n), t(new Error("传统读取方法失败"));
|
||
} finally {
|
||
document.body.removeChild(n);
|
||
}
|
||
});
|
||
}
|
||
async function rs() {
|
||
try {
|
||
if (!navigator.clipboard || !navigator.clipboard.readText)
|
||
throw console.warn("Clipboard API not supported for reading"), new Error("浏览器不支持读取剪贴板");
|
||
if (navigator.permissions && (await navigator.permissions.query({ name: "clipboard-read" })).state === "denied")
|
||
throw new Error("剪贴板读取权限被拒绝");
|
||
return await navigator.clipboard.readText();
|
||
} catch (e) {
|
||
return console.error("读取剪贴板失败: ", e), await os();
|
||
}
|
||
}
|
||
const Xr = un({
|
||
store: {}
|
||
});
|
||
function as(e, t = "__default__") {
|
||
Xr.store[t] = e;
|
||
}
|
||
function is(e = "__default__") {
|
||
return Xr.store[e];
|
||
}
|
||
function ls(e = "__default__") {
|
||
Xr.store[e] = "";
|
||
}
|
||
const ss = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
clearMemoryClipboard: ls,
|
||
copyToClipboard: ns,
|
||
copyToMemory: as,
|
||
readToClipboard: rs,
|
||
readToMemory: is
|
||
}, Symbol.toStringTag, { value: "Module" })), an = {
|
||
logger: ce,
|
||
strings: Kr,
|
||
trace: jl,
|
||
vite: Hl,
|
||
store: Gr,
|
||
deepdash: Za,
|
||
dash: ts,
|
||
clipboard: ss
|
||
}, oo = {
|
||
commonOptions(e) {
|
||
return {};
|
||
},
|
||
defaultOptions(e) {
|
||
const { t, crudOptionsRef: n } = e, o = (a) => V(() => t(a)), r = Le.get();
|
||
return {
|
||
settings: {
|
||
plugins: {
|
||
mobile: {
|
||
enabled: !0,
|
||
props: {
|
||
isMobile: V(() => window.innerWidth < 768)
|
||
}
|
||
}
|
||
}
|
||
},
|
||
mode: {},
|
||
status: {},
|
||
search: {
|
||
container: {
|
||
is: "fs-search-layout-default",
|
||
collapse: !0,
|
||
col: {
|
||
span: 4
|
||
}
|
||
},
|
||
formItem: {
|
||
wrapperCol: {
|
||
style: {
|
||
// width: "50%"
|
||
}
|
||
}
|
||
},
|
||
options: {
|
||
...r.form.inlineLayout,
|
||
// n-form 是否显示校验反馈
|
||
showFeedback: !1
|
||
},
|
||
onValidateError({ trigger: a }) {
|
||
a === "search" && r.notification.error({ message: t("fs.search.error.message") });
|
||
},
|
||
collapse: !0,
|
||
show: !0,
|
||
buttons: {
|
||
search: {
|
||
className: {
|
||
"fs-search-btn-search": !0
|
||
},
|
||
icon: r.icons.search
|
||
},
|
||
reset: {
|
||
className: {
|
||
"fs-search-btn-reset": !0
|
||
},
|
||
icon: r.icons.refresh
|
||
}
|
||
}
|
||
},
|
||
form: {
|
||
pasteKey: "__default__",
|
||
labelPlacement: "left",
|
||
labelPosition: "right",
|
||
labelWidth: "120px",
|
||
style: {
|
||
"grid-template-columns": "50% 50%"
|
||
// grid布局,默认两列
|
||
},
|
||
row: {
|
||
gutter: 10
|
||
},
|
||
col: { span: 12 },
|
||
labelAlign: "right",
|
||
labelCol: { span: 4 },
|
||
wrapperCol: { span: 18 },
|
||
wrapper: {
|
||
is: r.dialog.name,
|
||
...r.formWrapper.buildWidthBind(r.dialog.name, "960px"),
|
||
...r.formWrapper.buildInitBind(r.dialog.name),
|
||
dragenabled: !0,
|
||
destroyOnClose: !0,
|
||
...r.dialog.footer(),
|
||
buttons: {
|
||
copy: {
|
||
text: o("fs.form.copy"),
|
||
order: 1,
|
||
click: async ({ form: a }) => {
|
||
var l, s;
|
||
const i = (s = (l = n.value) == null ? void 0 : l.form) == null ? void 0 : s.pasteKey;
|
||
an.clipboard.copyToMemory(JSON.stringify(a), i), r.message.success(t("fs.form.copySuccess"));
|
||
}
|
||
},
|
||
paste: {
|
||
text: o("fs.form.paste"),
|
||
order: 2,
|
||
badge: V(() => {
|
||
var l, s;
|
||
const a = (s = (l = n.value) == null ? void 0 : l.form) == null ? void 0 : s.pasteKey, i = an.clipboard.readToMemory(a);
|
||
return {
|
||
[r.badge.value]: i ? 1 : 0,
|
||
[r.badge.dot]: !!i
|
||
};
|
||
}),
|
||
click: async ({ form: a }) => {
|
||
var s, u;
|
||
const i = (u = (s = n.value) == null ? void 0 : s.form) == null ? void 0 : u.pasteKey, l = an.clipboard.readToMemory(i);
|
||
if (l)
|
||
try {
|
||
const c = JSON.parse(l);
|
||
mo(a, c);
|
||
} catch (c) {
|
||
console.error(c);
|
||
} finally {
|
||
an.clipboard.clearMemoryClipboard(i);
|
||
}
|
||
}
|
||
},
|
||
cancel: {
|
||
text: o("fs.form.cancel"),
|
||
order: 4,
|
||
click: ({ doClose: a }) => {
|
||
a();
|
||
}
|
||
},
|
||
reset: {
|
||
text: o("fs.form.reset"),
|
||
order: 3,
|
||
click: ({ reset: a }) => {
|
||
a();
|
||
}
|
||
},
|
||
ok: {
|
||
text: o("fs.form.ok"),
|
||
order: 5,
|
||
type: "primary",
|
||
click: async ({ submit: a }) => {
|
||
await a();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
addForm: {
|
||
mode: "add",
|
||
wrapper: {
|
||
title: o("fs.addForm.title")
|
||
}
|
||
},
|
||
editForm: {
|
||
mode: "edit",
|
||
wrapper: {
|
||
title: o("fs.editForm.title")
|
||
}
|
||
},
|
||
viewForm: {
|
||
mode: "view",
|
||
wrapper: {
|
||
title: o("fs.viewForm.title"),
|
||
buttons: {
|
||
reset: {
|
||
show: !1
|
||
},
|
||
cancel: {
|
||
show: !1
|
||
}
|
||
}
|
||
}
|
||
},
|
||
rowHandle: {
|
||
width: 250,
|
||
title: o("fs.rowHandle.title"),
|
||
order: 1e3,
|
||
dropdown: {
|
||
// 操作列折叠
|
||
more: {
|
||
text: null,
|
||
type: "primary",
|
||
size: "small",
|
||
icon: r.icons.more
|
||
}
|
||
}
|
||
},
|
||
pagination: {
|
||
background: !0,
|
||
pageSize: 20,
|
||
[r.pagination.currentPage]: 1,
|
||
[r.pagination.total]: 1,
|
||
pageSizes: [5, 10, 20, 50],
|
||
layout: "total, sizes, prev, pager, next, jumper",
|
||
showSizeChanger: !0,
|
||
showQuickJumper: !0,
|
||
showSizePicker: !0,
|
||
showTotal: (a) => t("fs.pagination.showTotal", [a])
|
||
//antdv
|
||
},
|
||
table: {
|
||
show: !0,
|
||
height: "100%",
|
||
rowKey: r.table.defaultRowKey,
|
||
stripe: !0,
|
||
border: !0,
|
||
bordered: !0,
|
||
singleLine: !1,
|
||
scrollTopOnRefreshed: !0,
|
||
editable: { enabled: !1, rowKey: "$editable_id" },
|
||
pagination: !1
|
||
//antdv 关闭默认分页
|
||
},
|
||
toolbar: {
|
||
compact: !0,
|
||
buttons: {
|
||
search: {
|
||
className: {
|
||
"fs-toolbar-btn-search": !0
|
||
}
|
||
},
|
||
compact: {
|
||
className: {
|
||
"fs-toolbar-btn-compact": !0
|
||
}
|
||
},
|
||
refresh: {
|
||
className: {
|
||
"fs-toolbar-btn-refresh": !0
|
||
}
|
||
},
|
||
export: {
|
||
className: {
|
||
"fs-toolbar-btn-export": !0
|
||
}
|
||
},
|
||
columns: {
|
||
className: {
|
||
"fs-toolbar-btn-columns": !0
|
||
}
|
||
}
|
||
}
|
||
},
|
||
actionbar: {
|
||
buttons: {
|
||
add: {
|
||
className: {
|
||
"fs-actionbar-btn-add": !0
|
||
},
|
||
type: "primary",
|
||
plain: !0,
|
||
icon: r.icons.add,
|
||
text: o("fs.actionbar.add")
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
};
|
||
function ir(e, t) {
|
||
return e.type !== "antdv" ? {} : { labelCol: { span: t }, wrapperCol: { span: 23 - t } };
|
||
}
|
||
function us() {
|
||
const { ui: e } = Se();
|
||
return {
|
||
colspan: {
|
||
//跨列
|
||
form: {
|
||
col: { span: 24 },
|
||
...ir(e, 2)
|
||
}
|
||
},
|
||
colspan3: {
|
||
//跨列
|
||
form: {
|
||
col: { span: 24 },
|
||
...ir(e, 3)
|
||
}
|
||
},
|
||
colspan4: {
|
||
//跨列
|
||
form: {
|
||
col: { span: 24 },
|
||
...ir(e, 4)
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const cs = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: us
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function ds() {
|
||
const e = Le.get();
|
||
return {
|
||
button: {
|
||
form: {
|
||
component: {
|
||
name: e.input.name,
|
||
vModel: e.input.modelValue,
|
||
[e.input.clearable]: !0
|
||
}
|
||
},
|
||
column: {
|
||
component: {
|
||
name: "fs-button",
|
||
vModel: "text"
|
||
}
|
||
}
|
||
},
|
||
link: {
|
||
form: {
|
||
component: {
|
||
name: e.input.name,
|
||
vModel: e.input.modelValue,
|
||
[e.input.clearable]: !0
|
||
}
|
||
},
|
||
column: {
|
||
component: {
|
||
name: "fs-button",
|
||
vModel: "text",
|
||
...e.button.linkType
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const fs = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: ds
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function hs() {
|
||
const e = Le.get();
|
||
return {
|
||
"dict-cascader": {
|
||
search: {
|
||
component: {
|
||
clearable: !0
|
||
}
|
||
},
|
||
form: {
|
||
component: {
|
||
name: "fs-dict-cascader",
|
||
vModel: e.cascader.modelValue,
|
||
[e.cascader.clearable]: !0
|
||
}
|
||
},
|
||
column: {
|
||
component: { name: "fs-dict-cascader-format" }
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const ms = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: hs
|
||
}, Symbol.toStringTag, { value: "Module" })), ei = {
|
||
name: "zh-cn",
|
||
fs: {
|
||
component: {
|
||
select: {
|
||
placeholder: "请选择"
|
||
}
|
||
},
|
||
addForm: { title: "添加" },
|
||
editForm: { title: "编辑" },
|
||
viewForm: { title: "查看" },
|
||
rowHandle: {
|
||
title: "操作",
|
||
remove: {
|
||
text: "删除",
|
||
confirmTitle: "删除提示",
|
||
confirmMessage: "您确定要删除该记录吗?",
|
||
success: "删除成功!",
|
||
confirmText: "确定",
|
||
cancelText: "取消"
|
||
},
|
||
copy: {
|
||
text: "复制"
|
||
},
|
||
edit: {
|
||
text: "编辑"
|
||
},
|
||
view: {
|
||
text: "查看"
|
||
}
|
||
},
|
||
form: {
|
||
cancel: "取消",
|
||
ok: "确定",
|
||
reset: "重置",
|
||
saveRemind: {
|
||
title: "提示",
|
||
content: "表单数据有变更,是否保存",
|
||
cancel: "不保存",
|
||
ok: "保存"
|
||
},
|
||
copy: "复制",
|
||
paste: "粘贴",
|
||
copySuccess: "表单数据已复制,您可以在添加对话框中粘贴"
|
||
},
|
||
actionbar: { add: "添加" },
|
||
toolbar: {
|
||
columnFilter: {
|
||
title: "列设置",
|
||
fixed: "固定",
|
||
order: "排序",
|
||
reset: "还原",
|
||
confirm: "确定",
|
||
unnamed: "未命名"
|
||
},
|
||
search: { title: "查询显示" },
|
||
refresh: { title: "刷新" },
|
||
compact: { title: "紧凑模式" },
|
||
export: { title: "下载" },
|
||
columns: { title: "列设置" }
|
||
},
|
||
search: {
|
||
container: {
|
||
collapseButton: {
|
||
text: {
|
||
collapse: "收起",
|
||
expand: "展开"
|
||
}
|
||
}
|
||
},
|
||
search: { text: "查询" },
|
||
reset: { text: "重置" },
|
||
error: {
|
||
message: "查询表单校验失败"
|
||
},
|
||
tabs: { all: "全部" }
|
||
},
|
||
pagination: {
|
||
showTotal: "共 {0} 条"
|
||
},
|
||
date: {
|
||
formatter: { to: "至" }
|
||
},
|
||
extends: {
|
||
tableSelect: {
|
||
view: "查看",
|
||
select: "选择",
|
||
current: "当前选中",
|
||
ok: "确定",
|
||
cancel: "取消"
|
||
},
|
||
copyable: {
|
||
copy: "复制",
|
||
success: "复制成功",
|
||
error: "复制失败"
|
||
},
|
||
cropper: {
|
||
title: "图片裁剪",
|
||
preview: "预览",
|
||
reChoose: "重新选择",
|
||
flipX: "左右翻转",
|
||
flipY: "上下翻转",
|
||
reset: "重置",
|
||
cancel: "取消",
|
||
confirm: "确定",
|
||
chooseImage: "+ 选择图片",
|
||
onlySupport: "仅支持",
|
||
sizeLimit: "大小不能超过",
|
||
sizeNoLimit: "大小不限制"
|
||
},
|
||
fileUploader: {
|
||
text: "文件上传",
|
||
limitTip: "文件数量不能超过 {0}",
|
||
sizeLimitTip: "文件大小不能超过 {0},当前大小:{1}",
|
||
loadError: "图片加载失败",
|
||
pixelLimitTip: "图片像素尺寸不能超过 宽:{0},高:{1}",
|
||
hasUploading: "还有文件正在上传,请等待上传完成,或删除它"
|
||
}
|
||
}
|
||
}
|
||
}, ps = {
|
||
name: "en",
|
||
fs: {
|
||
component: {
|
||
select: {
|
||
placeholder: "please select"
|
||
}
|
||
},
|
||
addForm: { title: "add" },
|
||
editForm: { title: "edit" },
|
||
viewForm: { title: "view" },
|
||
rowHandle: {
|
||
title: "handle",
|
||
remove: {
|
||
text: "remove",
|
||
confirmTitle: "remove tip",
|
||
confirmMessage: "Are you sure you want to delete this record?",
|
||
success: "delete success!",
|
||
confirmText: "confirm",
|
||
cancelText: "cancel"
|
||
},
|
||
copy: {
|
||
text: "copy"
|
||
},
|
||
edit: {
|
||
text: "edit"
|
||
},
|
||
view: {
|
||
text: "view"
|
||
}
|
||
},
|
||
form: {
|
||
cancel: "cancel",
|
||
ok: "ok",
|
||
reset: "reset",
|
||
saveRemind: {
|
||
title: "save remind",
|
||
content: "The form data has changed, whether to save",
|
||
cancel: "don't save",
|
||
ok: "save"
|
||
},
|
||
copy: "copy",
|
||
paste: "paste"
|
||
},
|
||
actionbar: { add: "add" },
|
||
toolbar: {
|
||
columnFilter: {
|
||
title: "columns set",
|
||
fixed: "fixed",
|
||
order: "sort",
|
||
reset: "reset",
|
||
confirm: "ok",
|
||
unnamed: "unnamed"
|
||
},
|
||
search: { title: "show search bar" },
|
||
refresh: { title: "refresh" },
|
||
compact: { title: "compact mode" },
|
||
export: { title: "download" },
|
||
columns: { title: "columns set" }
|
||
},
|
||
search: {
|
||
container: {
|
||
collapseButton: {
|
||
text: {
|
||
collapse: "collapse",
|
||
expand: "expand"
|
||
}
|
||
}
|
||
},
|
||
search: { text: "search" },
|
||
reset: { text: "reset" },
|
||
error: {
|
||
message: "form valid error"
|
||
},
|
||
tabs: { all: "All" }
|
||
},
|
||
pagination: {
|
||
showTotal: "Total {0} items"
|
||
},
|
||
date: { formatter: { to: "to" } },
|
||
extends: {
|
||
tableSelect: {
|
||
view: "view",
|
||
select: "select",
|
||
current: "Current selection",
|
||
ok: "OK",
|
||
cancel: "Cancel"
|
||
},
|
||
copyable: {
|
||
copy: "Copy",
|
||
success: "Copied successfully",
|
||
error: "Copy failed"
|
||
},
|
||
cropper: {
|
||
title: "image crop",
|
||
preview: "preview",
|
||
reChoose: "reChoose",
|
||
flipX: "flipX",
|
||
flipY: "flipY",
|
||
reset: "reset",
|
||
cancel: "cancel",
|
||
confirm: "confirm",
|
||
chooseImage: "+ choose image",
|
||
onlySupport: "only",
|
||
sizeLimit: "size limit",
|
||
sizeNoLimit: " no limit"
|
||
},
|
||
fileUploader: {
|
||
text: "fileUpload",
|
||
limitTip: "file count limit: {0}",
|
||
sizeLimitTip: "file size limit: {0}, current size: {1}",
|
||
loadError: "image load error",
|
||
pixelLimitTip: "pixel limit : width:{0},height:{1}",
|
||
hasUploading: "The file is being uploaded, please wait for the upload to complete or delete"
|
||
}
|
||
}
|
||
}
|
||
};
|
||
function gs(e, t) {
|
||
let n = et(ei, e);
|
||
return n == null ? e : t instanceof Array ? (J(t, (o, r) => {
|
||
n = n.replace("{" + r + "}", o);
|
||
}), n) : n.replace("{n}", t);
|
||
}
|
||
class vs {
|
||
constructor() {
|
||
ie(this, "vueI18nInstance", null);
|
||
}
|
||
t(t, n) {
|
||
return gs(t, n);
|
||
}
|
||
setVueI18n(t) {
|
||
if (!t)
|
||
return;
|
||
t.global && (t = t.global);
|
||
const n = t.availableLocales;
|
||
for (const o of n) {
|
||
if (o.startsWith("zh")) {
|
||
const r = t.getLocaleMessage(o), a = ft(r.fs || {});
|
||
t.mergeLocaleMessage(o, { fs: ei.fs }), t.mergeLocaleMessage(o, { fs: a });
|
||
} else if (o.startsWith("en")) {
|
||
const r = t.getLocaleMessage(o), a = ft(r.fs || {});
|
||
t.mergeLocaleMessage(o, { fs: ps.fs }), t.mergeLocaleMessage(o, { fs: a });
|
||
}
|
||
ce.debug("i18n", t.getLocaleMessage(o));
|
||
}
|
||
this.vueI18nInstance = t;
|
||
}
|
||
}
|
||
const Do = new vs();
|
||
function rt() {
|
||
return Do.vueI18nInstance != null ? {
|
||
// @ts-ignore
|
||
t: Do.vueI18nInstance.t
|
||
} : { t: Do.t };
|
||
}
|
||
var tr = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
|
||
function nr(e) {
|
||
return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
|
||
}
|
||
var ti = { exports: {} };
|
||
(function(e, t) {
|
||
(function(n, o) {
|
||
e.exports = o();
|
||
})(tr, function() {
|
||
return function(n, o) {
|
||
var r = o.prototype, a = r.format;
|
||
r.format = function(i) {
|
||
var l = this, s = this.$locale();
|
||
if (!this.isValid())
|
||
return a.bind(this)(i);
|
||
var u = this.$utils(), c = (i || "YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function(d) {
|
||
switch (d) {
|
||
case "Q":
|
||
return Math.ceil((l.$M + 1) / 3);
|
||
case "Do":
|
||
return s.ordinal(l.$D);
|
||
case "gggg":
|
||
return l.weekYear();
|
||
case "GGGG":
|
||
return l.isoWeekYear();
|
||
case "wo":
|
||
return s.ordinal(l.week(), "W");
|
||
case "w":
|
||
case "ww":
|
||
return u.s(l.week(), d === "w" ? 1 : 2, "0");
|
||
case "W":
|
||
case "WW":
|
||
return u.s(l.isoWeek(), d === "W" ? 1 : 2, "0");
|
||
case "k":
|
||
case "kk":
|
||
return u.s(String(l.$H === 0 ? 24 : l.$H), d === "k" ? 1 : 2, "0");
|
||
case "X":
|
||
return Math.floor(l.$d.getTime() / 1e3);
|
||
case "x":
|
||
return l.$d.getTime();
|
||
case "z":
|
||
return "[" + l.offsetName() + "]";
|
||
case "zzz":
|
||
return "[" + l.offsetName("long") + "]";
|
||
default:
|
||
return d;
|
||
}
|
||
});
|
||
return a.bind(this)(c);
|
||
};
|
||
};
|
||
});
|
||
})(ti);
|
||
var bs = ti.exports;
|
||
const ys = /* @__PURE__ */ nr(bs);
|
||
ot.extend(ys);
|
||
function lr(e, t) {
|
||
if (!Kr.isEmpty(e))
|
||
return ot(e).format(t);
|
||
}
|
||
function ni(e, t = "YYYY-MM-DD HH:mm:ss") {
|
||
if (e != null && e instanceof Array && e.length > 1) {
|
||
if (Kr.hasEmpty(e))
|
||
return;
|
||
const { t: n } = rt();
|
||
return `${lr(e[0], t)} ${n("fs.date.formatter.to")} ${lr(e[1], t)}`;
|
||
}
|
||
return lr(e, t);
|
||
}
|
||
function ws(e) {
|
||
const { value: t } = e;
|
||
return ni(t, "YYYY-MM-DD");
|
||
}
|
||
function _s(e) {
|
||
const { value: t } = e;
|
||
return ni(t, "YYYY-MM-DD HH:mm:ss");
|
||
}
|
||
var oi = { exports: {} };
|
||
(function(e, t) {
|
||
(function(n, o) {
|
||
e.exports = o();
|
||
})(tr, function() {
|
||
var n = "week", o = "year";
|
||
return function(r, a, i) {
|
||
var l = a.prototype;
|
||
l.week = function(s) {
|
||
if (s === void 0 && (s = null), s !== null)
|
||
return this.add(7 * (s - this.week()), "day");
|
||
var u = this.$locale().yearStart || 1;
|
||
if (this.month() === 11 && this.date() > 25) {
|
||
var c = i(this).startOf(o).add(1, o).date(u), d = i(this).endOf(n);
|
||
if (c.isBefore(d))
|
||
return 1;
|
||
}
|
||
var f = i(this).startOf(o).date(u).startOf(n).subtract(1, "millisecond"), h = this.diff(f, n, !0);
|
||
return h < 0 ? i(this).startOf("week").week() : Math.ceil(h);
|
||
}, l.weeks = function(s) {
|
||
return s === void 0 && (s = null), this.week(s);
|
||
};
|
||
};
|
||
});
|
||
})(oi);
|
||
var Cs = oi.exports;
|
||
const Ss = /* @__PURE__ */ nr(Cs);
|
||
var ri = { exports: {} };
|
||
(function(e, t) {
|
||
(function(n, o) {
|
||
e.exports = o();
|
||
})(tr, function() {
|
||
return function(n, o) {
|
||
o.prototype.weekday = function(r) {
|
||
var a = this.$locale().weekStart || 0, i = this.$W, l = (i < a ? i + 7 : i) - a;
|
||
return this.$utils().u(r) ? l : this.subtract(l, "day").add(r, "day");
|
||
};
|
||
};
|
||
});
|
||
})(ri);
|
||
var Fs = ri.exports;
|
||
const Rs = /* @__PURE__ */ nr(Fs);
|
||
var ai = { exports: {} };
|
||
(function(e, t) {
|
||
(function(n, o) {
|
||
e.exports = o();
|
||
})(tr, function() {
|
||
return function(n, o, r) {
|
||
var a = o.prototype, i = function(d) {
|
||
return d && (d.indexOf ? d : d.s);
|
||
}, l = function(d, f, h, g, m) {
|
||
var y = d.name ? d : d.$locale(), v = i(y[f]), F = i(y[h]), R = v || F.map(function(j) {
|
||
return j.slice(0, g);
|
||
});
|
||
if (!m)
|
||
return R;
|
||
var k = y.weekStart;
|
||
return R.map(function(j, A) {
|
||
return R[(A + (k || 0)) % 7];
|
||
});
|
||
}, s = function() {
|
||
return r.Ls[r.locale()];
|
||
}, u = function(d, f) {
|
||
return d.formats[f] || function(h) {
|
||
return h.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function(g, m, y) {
|
||
return m || y.slice(1);
|
||
});
|
||
}(d.formats[f.toUpperCase()]);
|
||
}, c = function() {
|
||
var d = this;
|
||
return { months: function(f) {
|
||
return f ? f.format("MMMM") : l(d, "months");
|
||
}, monthsShort: function(f) {
|
||
return f ? f.format("MMM") : l(d, "monthsShort", "months", 3);
|
||
}, firstDayOfWeek: function() {
|
||
return d.$locale().weekStart || 0;
|
||
}, weekdays: function(f) {
|
||
return f ? f.format("dddd") : l(d, "weekdays");
|
||
}, weekdaysMin: function(f) {
|
||
return f ? f.format("dd") : l(d, "weekdaysMin", "weekdays", 2);
|
||
}, weekdaysShort: function(f) {
|
||
return f ? f.format("ddd") : l(d, "weekdaysShort", "weekdays", 3);
|
||
}, longDateFormat: function(f) {
|
||
return u(d.$locale(), f);
|
||
}, meridiem: this.$locale().meridiem, ordinal: this.$locale().ordinal };
|
||
};
|
||
a.localeData = function() {
|
||
return c.bind(this)();
|
||
}, r.localeData = function() {
|
||
var d = s();
|
||
return { firstDayOfWeek: function() {
|
||
return d.weekStart || 0;
|
||
}, weekdays: function() {
|
||
return r.weekdays();
|
||
}, weekdaysShort: function() {
|
||
return r.weekdaysShort();
|
||
}, weekdaysMin: function() {
|
||
return r.weekdaysMin();
|
||
}, months: function() {
|
||
return r.months();
|
||
}, monthsShort: function() {
|
||
return r.monthsShort();
|
||
}, longDateFormat: function(f) {
|
||
return u(d, f);
|
||
}, meridiem: d.meridiem, ordinal: d.ordinal };
|
||
}, r.months = function() {
|
||
return l(s(), "months");
|
||
}, r.monthsShort = function() {
|
||
return l(s(), "monthsShort", "months", 3);
|
||
}, r.weekdays = function(d) {
|
||
return l(s(), "weekdays", null, null, d);
|
||
}, r.weekdaysShort = function(d) {
|
||
return l(s(), "weekdaysShort", "weekdays", 3, d);
|
||
}, r.weekdaysMin = function(d) {
|
||
return l(s(), "weekdaysMin", "weekdays", 2, d);
|
||
};
|
||
};
|
||
});
|
||
})(ai);
|
||
var ks = ai.exports;
|
||
const Ds = /* @__PURE__ */ nr(ks);
|
||
ot.extend(Rs);
|
||
ot.extend(Ds);
|
||
ot.extend(Ss);
|
||
function Os() {
|
||
const e = Le.get();
|
||
function t(o) {
|
||
const { row: r, key: a, value: i } = o;
|
||
i != null && (e.type === "naive" ? r[a] = ot(i).valueOf() : e.type === "antdv" && e.version === "4" || e.type);
|
||
}
|
||
return {
|
||
datetime: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("datetime"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
width: 170,
|
||
component: { name: "fs-date-format" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
},
|
||
date: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("date"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
align: "center",
|
||
width: 120,
|
||
component: { name: "fs-date-format", format: "YYYY-MM-DD" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
},
|
||
daterange: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("daterange"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: { width: 210, formatter: ws },
|
||
valueBuilder({ row: o, key: r, value: a }) {
|
||
a != null && Array.isArray(a) && a.length === 2 && a != null && (e.type === "naive" ? o[r] = [ot(a[0]).valueOf(), ot(a[1]).valueOf()] : o[r] = [ot(a[0]), ot(a[1])]);
|
||
}
|
||
},
|
||
datetimerange: {
|
||
form: {
|
||
component: {
|
||
...e.datePicker.buildDateType("datetimerange"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
width: 340,
|
||
formatter: _s
|
||
},
|
||
valueBuilder({ row: o, key: r, value: a }) {
|
||
a != null && Array.isArray(a) && a.length === 2 && (e.type === "naive" ? o[r] = [ot(a[0]).valueOf(), ot(a[1]).valueOf()] : o[r] = [ot(a[0]), ot(a[1])]);
|
||
}
|
||
},
|
||
time: {
|
||
form: {
|
||
component: {
|
||
//el-time-picker,a-time-picker
|
||
name: e.timePicker.name,
|
||
vModel: e.timePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
width: 100,
|
||
align: "center",
|
||
component: { name: "fs-date-format", format: "HH:mm:ss" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
},
|
||
month: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("month"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
align: "center",
|
||
width: 120,
|
||
component: { name: "fs-date-format", format: "YYYY-MM" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
},
|
||
week: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("week"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
align: "center",
|
||
width: 120,
|
||
component: { name: "fs-date-format", format: "YYYY-ww[周]" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
},
|
||
quarter: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("quarter"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
align: "center",
|
||
width: 120,
|
||
component: { name: "fs-date-format", format: "YYYY-[Q]Q" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
},
|
||
year: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("year"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
align: "center",
|
||
width: 120,
|
||
component: { name: "fs-date-format", format: "YYYY" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const Es = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Os
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Ts() {
|
||
const { ui: e } = Se();
|
||
return {
|
||
number: {
|
||
form: { component: { name: e.number.name, props: {} } },
|
||
align: "center"
|
||
},
|
||
switch: {
|
||
form: { component: { name: e.switch.name, props: {} } },
|
||
component: { name: e.switch.name, props: {} },
|
||
align: "center"
|
||
},
|
||
slider: {
|
||
form: { component: { name: "el-slider", props: {} } },
|
||
align: "center"
|
||
},
|
||
rate: {
|
||
form: { component: { name: "el-rate", props: {} } },
|
||
align: "center"
|
||
},
|
||
"color-picker": {
|
||
form: { component: { name: "el-color-picker", props: {} } },
|
||
align: "center"
|
||
},
|
||
transfer: {
|
||
form: { component: { name: "el-transfer", props: {} } },
|
||
align: "center"
|
||
},
|
||
autocomplete: {
|
||
form: { component: { name: "el-autocomplete", props: {} } }
|
||
}
|
||
};
|
||
}
|
||
const $s = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Ts
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function As() {
|
||
return {
|
||
icon: {
|
||
form: {
|
||
component: {
|
||
name: "fs-icon-selector",
|
||
vModel: "modelValue",
|
||
[Le.get().input.clearable]: !0
|
||
}
|
||
},
|
||
column: {
|
||
component: {
|
||
name: "fs-icon",
|
||
vModel: "icon",
|
||
style: "font-size:18px"
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const Is = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: As
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Vs() {
|
||
const e = Le.get();
|
||
return {
|
||
number: {
|
||
form: {
|
||
component: {
|
||
// el-input-number,a-input-number
|
||
name: e.number.name,
|
||
vModel: e.modelValue
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const Ps = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Vs
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Ms() {
|
||
return {
|
||
"phone-number": {
|
||
form: {
|
||
component: {
|
||
name: "el-phone-number-input"
|
||
}
|
||
},
|
||
column: {
|
||
formatter(e, t, n) {
|
||
let o = "";
|
||
return n != null && (n.callingCode != null ? o += "(+" + n.callingCode + ")" : n.countryCode != null && (o += "(" + n.countryCode + ")"), n.phoneNumber != null && (o += n.phoneNumber)), o;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const Bs = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Ms
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function js() {
|
||
const e = Le.get();
|
||
return {
|
||
select: {
|
||
search: { autoSearchTrigger: "change" },
|
||
form: {
|
||
component: {
|
||
name: e.select.name,
|
||
[e.select.clearable]: !0
|
||
}
|
||
}
|
||
},
|
||
"dict-select": {
|
||
search: { autoSearchTrigger: "change" },
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } },
|
||
form: {
|
||
component: {
|
||
name: "fs-dict-select",
|
||
vModel: e.select.modelValue,
|
||
[e.select.clearable]: !0
|
||
}
|
||
}
|
||
},
|
||
"table-select": {
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } },
|
||
form: {
|
||
component: {
|
||
name: "fs-table-select"
|
||
}
|
||
}
|
||
},
|
||
"editable-select": {
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } },
|
||
form: {
|
||
component: {
|
||
name: "fs-editable-select"
|
||
}
|
||
}
|
||
},
|
||
"dict-radio": {
|
||
search: {
|
||
component: {
|
||
name: "fs-dict-select",
|
||
vModel: e.select.modelValue,
|
||
autoSearchTrigger: "change"
|
||
}
|
||
},
|
||
form: {
|
||
component: {
|
||
name: "fs-dict-radio",
|
||
vModel: e.radioGroup.modelValue,
|
||
[e.select.clearable]: !0
|
||
}
|
||
},
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } }
|
||
},
|
||
"dict-checkbox": {
|
||
search: {
|
||
component: { name: "fs-dict-select" },
|
||
autoSearchTrigger: "change"
|
||
},
|
||
form: {
|
||
component: {
|
||
name: "fs-dict-checkbox",
|
||
vModel: e.radioGroup.modelValue,
|
||
[e.select.clearable]: !0
|
||
}
|
||
},
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } }
|
||
},
|
||
"dict-switch": {
|
||
search: {
|
||
component: { name: "fs-dict-select", vModel: e.select.modelValue },
|
||
autoSearchTrigger: "change"
|
||
},
|
||
form: {
|
||
component: {
|
||
name: "fs-dict-switch",
|
||
vModel: e.switch.modelValue,
|
||
[e.select.clearable]: !0
|
||
}
|
||
},
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } }
|
||
}
|
||
};
|
||
}
|
||
const xs = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: js
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Ns() {
|
||
const e = Le.get();
|
||
return {
|
||
text: {
|
||
form: {
|
||
component: {
|
||
// el-input, a-input
|
||
name: e.input.name,
|
||
vModel: e.textArea.modelValue,
|
||
[e.input.clearable]: !0
|
||
}
|
||
},
|
||
search: {
|
||
autoSearchTrigger: "enter"
|
||
}
|
||
},
|
||
password: {
|
||
form: {
|
||
component: {
|
||
// el-input / a-input-password
|
||
name: e.inputPassword.name,
|
||
vModel: e.inputPassword.modelValue,
|
||
...e.inputPassword.passwordType
|
||
}
|
||
},
|
||
search: {
|
||
autoSearchTrigger: "enter"
|
||
}
|
||
},
|
||
textarea: {
|
||
search: {
|
||
component: {
|
||
// el-input / a-input
|
||
name: e.input.name,
|
||
type: "text",
|
||
[e.input.clearable]: !0
|
||
},
|
||
autoSearchTrigger: "enter"
|
||
},
|
||
form: {
|
||
component: {
|
||
// el-input / a-textarea
|
||
name: e.textArea.name,
|
||
type: e.textArea.type,
|
||
vModel: e.textArea.modelValue,
|
||
[e.input.clearable]: !0
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const Ls = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Ns
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function zs() {
|
||
const e = Le.get();
|
||
return {
|
||
"dict-tree": {
|
||
search: { autoSearchTrigger: "change" },
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } },
|
||
form: {
|
||
component: {
|
||
name: "fs-dict-tree",
|
||
vModel: e.treeSelect.modelValue,
|
||
[e.treeSelect.clearable]: !0
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const qs = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: zs
|
||
}, Symbol.toStringTag, { value: "Module" })), Hs = /* @__PURE__ */ Object.assign({ "./list/assist.ts": cs, "./list/button.ts": fs, "./list/cascader.ts": ms, "./list/date.ts": Es, "./list/el.ts": $s, "./list/icon.ts": Is, "./list/number.ts": Ps, "./list/phone.ts": Bs, "./list/select.ts": xs, "./list/text.ts": Ls, "./list/tree.ts": qs }), ii = [];
|
||
J(Hs, (e) => {
|
||
ii.push(e.default);
|
||
});
|
||
const ro = {};
|
||
function Ws() {
|
||
return ro;
|
||
}
|
||
function Us(e) {
|
||
return ro[e];
|
||
}
|
||
function Ks(e) {
|
||
for (const t in e)
|
||
ro[t] = e[t];
|
||
}
|
||
const Tn = {
|
||
getType: Us,
|
||
addTypes: Ks,
|
||
getTypes: Ws,
|
||
install() {
|
||
for (const e of ii)
|
||
J(e(), (t, n) => {
|
||
ro[n] = t;
|
||
});
|
||
ce.debug("types installed:", ro);
|
||
}
|
||
}, Ys = ue({
|
||
name: "FsPage",
|
||
setup() {
|
||
const e = K();
|
||
return Cn(() => {
|
||
window.getComputedStyle(e.value.parentNode).getPropertyValue("position") !== "relative" && an.logger.warn(
|
||
"fs-page父节点的position建议为relative,因为fs-page为相对定位(position:absolute),如果样式没有异常,你可以忽略此警告"
|
||
);
|
||
}), {
|
||
pageRef: e
|
||
};
|
||
}
|
||
});
|
||
const $e = (e, t) => {
|
||
const n = e.__vccOpts || e;
|
||
for (const [o, r] of t)
|
||
n[o] = r;
|
||
return n;
|
||
}, Gs = {
|
||
ref: "pageRef",
|
||
class: "fs-page"
|
||
}, Xs = {
|
||
key: 0,
|
||
class: "fs-page-header"
|
||
}, Js = { class: "fs-page-content" }, Qs = {
|
||
key: 1,
|
||
class: "fs-page-footer"
|
||
};
|
||
function Zs(e, t, n, o, r, a) {
|
||
return b(), M("div", Gs, [
|
||
e.$slots.header != null ? (b(), M("div", Xs, [
|
||
he(e.$slots, "header")
|
||
])) : G("", !0),
|
||
oe("div", Js, [
|
||
he(e.$slots, "default")
|
||
]),
|
||
e.$slots.footer != null ? (b(), M("div", Qs, [
|
||
he(e.$slots, "footer")
|
||
])) : G("", !0)
|
||
], 512);
|
||
}
|
||
const eu = /* @__PURE__ */ $e(Ys, [["render", Zs]]);
|
||
function Rr(e) {
|
||
return e != null && (e instanceof li || Bo(e) || Ha(e));
|
||
}
|
||
function va(e) {
|
||
return Rr(e) && !e.cloneable;
|
||
}
|
||
function tu(e, ...t) {
|
||
function n(r, a) {
|
||
if (a != null && (xo(r) || Rr(a)))
|
||
return a;
|
||
}
|
||
let o = null;
|
||
for (const r of t)
|
||
Rr(r) && (o = r);
|
||
return o || yl(e, ...t, n);
|
||
}
|
||
function nu(e) {
|
||
if (va(e))
|
||
return e;
|
||
function t(n) {
|
||
if (va(n))
|
||
return n;
|
||
}
|
||
return wl(e, t);
|
||
}
|
||
let li = class {
|
||
constructor() {
|
||
ie(this, "cloneable", !1);
|
||
}
|
||
setCloneable(t) {
|
||
this.cloneable = t;
|
||
}
|
||
};
|
||
function Ee() {
|
||
return {
|
||
merge: tu,
|
||
cloneDeep: nu,
|
||
UnMergeable: li
|
||
};
|
||
}
|
||
const { cloneDeep: ou } = Ee();
|
||
function ru(e) {
|
||
return e instanceof Jr;
|
||
}
|
||
function au(e) {
|
||
return e instanceof or;
|
||
}
|
||
function ba(e, t, n) {
|
||
const o = {};
|
||
if (e == null)
|
||
return o;
|
||
const r = n ? ru : au;
|
||
return Za.forEachDeep(e, (a, i, l, s) => {
|
||
if (a == null)
|
||
return !1;
|
||
if (r(a)) {
|
||
const u = s.path;
|
||
if (t) {
|
||
for (const c of t)
|
||
if (typeof c == "string") {
|
||
if (u.startsWith(c))
|
||
return !1;
|
||
} else if (c instanceof RegExp && c.test(u))
|
||
return !0;
|
||
}
|
||
return o[u] = a, !1;
|
||
}
|
||
return !Ha(a);
|
||
}, {
|
||
// https://deepdash.io/#eachdeep-foreachdeep
|
||
checkCircular: !0
|
||
}), o;
|
||
}
|
||
function iu(e, t) {
|
||
if (e == null || Object.keys(e).length <= 0)
|
||
return null;
|
||
const n = {};
|
||
return J(e, (o, r) => {
|
||
n[r] = o.buildAsyncRef(t);
|
||
}), n;
|
||
}
|
||
function lu(e, t) {
|
||
t == null || Object.keys(t).length <= 0 || J(t, (n, o) => {
|
||
We(e, o, n.value == null ? null : n.value);
|
||
});
|
||
}
|
||
function su(e, t, n, o) {
|
||
const r = V(() => {
|
||
const l = e();
|
||
return ba(l, n, !1);
|
||
}), a = V(() => {
|
||
const l = e();
|
||
return ba(l, n, !0);
|
||
}), i = iu(a.value, t);
|
||
return V(() => {
|
||
let l = e();
|
||
const s = Object.keys(a.value).length, u = Object.keys(r.value).length;
|
||
if (s > 0 || u > 0) {
|
||
if (l = ou(l), u > 0) {
|
||
const c = t ? t() : {};
|
||
J(r.value, (d, f) => {
|
||
We(l, f, d.computeFn(c));
|
||
});
|
||
}
|
||
s > 0 && lu(l, i);
|
||
}
|
||
return o ? o(l) : l;
|
||
});
|
||
}
|
||
class or {
|
||
constructor(t) {
|
||
ie(this, "computeFn");
|
||
this.computeFn = t;
|
||
}
|
||
}
|
||
function uu(e) {
|
||
return new or(e);
|
||
}
|
||
class Jr {
|
||
constructor(t) {
|
||
ie(this, "watch");
|
||
ie(this, "asyncFn");
|
||
ie(this, "defaultValue");
|
||
const { asyncFn: n, defaultValue: o } = t;
|
||
this.watch = t.watch, this.asyncFn = n, this.defaultValue = o;
|
||
}
|
||
buildAsyncRef(t) {
|
||
t = t || function() {
|
||
};
|
||
const n = K(this.defaultValue), o = V(() => this.watch ? this.watch(t()) : null);
|
||
return ut(() => o.value, async (r) => {
|
||
n.value = await this.asyncFn(r, t());
|
||
}, { immediate: !0 }), n;
|
||
}
|
||
}
|
||
function cu(e) {
|
||
return new Jr(e);
|
||
}
|
||
function Vt() {
|
||
return {
|
||
ComputeValue: or,
|
||
compute: uu,
|
||
AsyncComputeValue: Jr,
|
||
asyncCompute: cu,
|
||
doComputed: su
|
||
};
|
||
}
|
||
const dn = {
|
||
orderDefault: 1
|
||
}, {
|
||
merge: It,
|
||
cloneDeep: Kt
|
||
} = Ee(), Hn = [];
|
||
function si(e) {
|
||
Ka(Hn, (t) => t.name === e.name), Hn.push(e), Hn.sort((t, n) => t.order - n.order), ce.debug("mergeColumnPlugin register success: current:", e, "registered:", Hn);
|
||
}
|
||
function du(e) {
|
||
var t, n;
|
||
if (e.dict) {
|
||
if ((t = e.column) != null && t.component) {
|
||
const o = jo(Kt(e.dict));
|
||
o.cloneable && (o.cloneable = !1), e.column.component.dict = It(o, e.column.component.dict);
|
||
}
|
||
if ((n = e.form) != null && n.component) {
|
||
const o = jo(Kt(e.dict));
|
||
o.cloneable && (o.cloneable = !1), e.form.component.dict = It(o, e.form.component.dict);
|
||
}
|
||
}
|
||
return e;
|
||
}
|
||
function fu(e) {
|
||
if (!e.type)
|
||
return e;
|
||
let t = [];
|
||
typeof e.type == "string" ? t = [e.type] : e.type instanceof Array && (t = e.type);
|
||
const n = {};
|
||
for (const o of t) {
|
||
const r = Tn.getType(o);
|
||
r && It(n, r);
|
||
}
|
||
return e = It(n, e), e;
|
||
}
|
||
const zn = [];
|
||
zn.push({
|
||
name: "type",
|
||
handle: fu,
|
||
order: -2
|
||
});
|
||
zn.push({
|
||
name: "dict",
|
||
handle: du,
|
||
order: -1
|
||
});
|
||
zn.push({
|
||
name: "viewFormUseCellComponent",
|
||
order: 10,
|
||
handle: (e = {}, t = {}) => {
|
||
var r, a;
|
||
if (!((r = t.settings) != null && r.viewFormUseCellComponent))
|
||
return e;
|
||
const o = {
|
||
component: ((a = e.column) == null ? void 0 : a.component) || {}
|
||
};
|
||
return (e.type === "text" || e.type instanceof Array && e.type.includes("text")) && (o.render || (o.render = (i) => {
|
||
const {
|
||
value: l
|
||
} = i;
|
||
return N("span", null, [l]);
|
||
})), It(e, {
|
||
viewForm: o
|
||
}), e;
|
||
}
|
||
});
|
||
zn.push({
|
||
name: "NaiveFormRuleFix",
|
||
order: 10,
|
||
handle: (e = {}, t = {}) => {
|
||
var o, r, a, i, l;
|
||
const {
|
||
ui: n
|
||
} = Se();
|
||
return n.type !== "naive" || ((o = e.addForm) != null && o.rules && (e.addForm.rule = e.addForm.rules), (r = e.editForm) != null && r.rules && (e.editForm.rule = e.editForm.rules), (a = e.viewForm) != null && a.rules && (e.viewForm.rule = e.viewForm.rules), (i = e.form) != null && i.rules && (e.form.rule = e.form.rules), (l = e.search) != null && l.rules && (e.search.rule = e.search.rules)), e;
|
||
}
|
||
});
|
||
zn.push({
|
||
name: "DefaultOrder",
|
||
order: 0,
|
||
handle: (e = {}, t = {}, n) => (et(e, "column.order") == null && We(e, "column.order", n), et(e, "form.order") == null && We(e, "form.order", n), e)
|
||
});
|
||
for (const e of zn)
|
||
si(e);
|
||
function Qr(e, t) {
|
||
const n = {};
|
||
let o = 0;
|
||
return J(e, (r, a) => {
|
||
if (r.key = a, r.children)
|
||
r.children = Qr(r.children, t);
|
||
else
|
||
for (const i of Hn)
|
||
r = i.handle(r, t, o);
|
||
n[a] = r, o++;
|
||
}), n;
|
||
}
|
||
function Zr(e = {}, t) {
|
||
return J(t, (n, o) => {
|
||
n.children ? Zr(e, n.children) : e[o] = n;
|
||
}), e;
|
||
}
|
||
function ea(e = {}, t) {
|
||
return J(t, (n, o) => {
|
||
n.children ? ea(e, n.children) : e[o] = n;
|
||
}), e;
|
||
}
|
||
function hu(e) {
|
||
const t = e, n = t.column || {};
|
||
n.title == null && (n.title = t.title), n.key = t.key;
|
||
const o = t.key !== "id" && t.key !== "_index";
|
||
return o && n.align == null && (n.align = "center"), o && n.sortable == null && (n.sortable = !0), t.children && (n.children = ci(t.children)), ui(n), un(n);
|
||
}
|
||
function ui(e) {
|
||
var t;
|
||
e && (t = e.component) != null && t.name && typeof e.component.name != "string" && (Bo(e.component.name) || (e.component.name = cl(e.component.name)));
|
||
}
|
||
function ci(e) {
|
||
let t = {};
|
||
return J(e, (n, o) => {
|
||
t[o] = hu(n);
|
||
}), t = ta(t), mu(t), t;
|
||
}
|
||
function mu(e) {
|
||
const t = [];
|
||
for (const n in e)
|
||
t.push(e[n]);
|
||
t.some((n) => n.fixed === "left") && t.forEach((n) => {
|
||
(n.type === "selection" || n.type === "index") && n.fixed == null && (n.fixed = "left");
|
||
});
|
||
}
|
||
function pu(e) {
|
||
return Sn(e, (t) => t.type === "selection" ? 0 : t.type === "index" ? 1 : 2, (t) => t.order ?? dn.orderDefault);
|
||
}
|
||
function ta(e) {
|
||
const t = [];
|
||
for (const r in e) {
|
||
const a = e[r];
|
||
a.key = r, a.children && _l(a.children) > 0 && (a.children = ta(a.children)), t.push(a);
|
||
}
|
||
const n = pu(t), o = {};
|
||
for (const r of n)
|
||
o[r.key] = r;
|
||
return o;
|
||
}
|
||
function di(e, t) {
|
||
const n = {};
|
||
return J(e, (o) => {
|
||
const r = Kt(o[t]) || {};
|
||
t === "form" && r.title == null && (r.title = o.title), r.key = o.key, n[o.key] = r, ui(r);
|
||
}), n;
|
||
}
|
||
function Wn(e, t, n, o) {
|
||
const r = di(n, t), a = It(Kt(e.form), e[t], {
|
||
columns: r
|
||
});
|
||
return o && o(a), a;
|
||
}
|
||
function gu(e, t = "search", n) {
|
||
var l;
|
||
const o = di(n, t), r = {}, a = ((l = e.settings) == null ? void 0 : l.searchCopyFormProps) ?? ["component", "valueChange", "title", "key", "label", "render"];
|
||
function i(s, u, c) {
|
||
if (Cl(a, c) && e.columns[u]) {
|
||
const f = e.columns[u][c];
|
||
f && (s[c] = f);
|
||
}
|
||
}
|
||
return J(Kt(e.form.columns), (s, u) => {
|
||
const c = {};
|
||
i(c, u, "valueResolve"), i(c, u, "valueBuilder"), r[u] = It(c, Ya(s, a));
|
||
}), It({
|
||
columns: r
|
||
}, {
|
||
columns: o
|
||
}, e.search);
|
||
}
|
||
function vu(e, t, n = "form") {
|
||
const {
|
||
t: o
|
||
} = rt(), {
|
||
merge: r
|
||
} = Ee();
|
||
t = t || {};
|
||
const a = {
|
||
value: null
|
||
}, i = r(oo.defaultOptions({
|
||
t: o,
|
||
crudOptionsRef: a
|
||
}), oo.commonOptions({
|
||
crudOptions: e,
|
||
context: t,
|
||
crudExpose: null
|
||
}), e);
|
||
a.value = i;
|
||
const l = Qr(Kt(i.columns), i), s = Zr({}, l), u = n === "form" ? "form" : `${n}Form`;
|
||
return Wn(i, u, s);
|
||
}
|
||
function bu(e) {
|
||
J(e.columns, (o, r) => {
|
||
o.key = r;
|
||
});
|
||
const t = Qr(Kt(e.columns), e);
|
||
e.columns = t;
|
||
const n = Zr({}, t);
|
||
return e.table.columns = ci(Kt(t)), e.table.columnsMap = ea({}, e.table.columns), It(e.toolbar, {
|
||
columnsFilter: {
|
||
originalColumns: Kt(e.table.columns)
|
||
}
|
||
}), e.form = Wn(e, "form", n), e.addForm = Wn(e, "addForm", n), e.editForm = Wn(e, "editForm", n), e.viewForm = Wn(e, "viewForm", n, (o) => {
|
||
J(o.columns, (r) => {
|
||
r.component || (r.component = {}), r.component.disabled = !0;
|
||
});
|
||
}), e.search = gu(e, "search", n), e.table.editable && (e.table.editable.addForm = It(e.addForm.columns, e.table.editable.addForm), e.table.editable.editForm = It(e.editForm.columns, e.table.editable.editForm)), e;
|
||
}
|
||
function Lo(e, t) {
|
||
J(e, (n, o) => {
|
||
n.key || (n.key = o), n.children ? Lo(n.children, t) : t(n, o);
|
||
});
|
||
}
|
||
function zo(e, t) {
|
||
J(e, (n, o) => {
|
||
n.key || (n.key = o), n.children ? zo(n.children, t) : t(n, o);
|
||
});
|
||
}
|
||
function na() {
|
||
return {
|
||
buildFormOptions: vu,
|
||
buildColumns: bu,
|
||
registerMergeColumnPlugin: si,
|
||
forEachColumns: zo,
|
||
doColumnsSort: ta,
|
||
forEachTableColumns: Lo
|
||
};
|
||
}
|
||
let yu = 0;
|
||
const sr = {};
|
||
async function wu(e) {
|
||
const t = e.id || `${yu++}`, n = document.createElement("div");
|
||
return new Promise((o, r) => {
|
||
let a = sr[t];
|
||
a != null && (a.vm.exposed.open(e), o(a));
|
||
const i = N(ao, {
|
||
id: t,
|
||
onClosed() {
|
||
e.id || delete sr[t];
|
||
}
|
||
});
|
||
i.appContext = ao._context, dl(i, n), document.body.appendChild(n);
|
||
const s = i.component;
|
||
a = {
|
||
id: t,
|
||
vNode: i,
|
||
vm: s,
|
||
props: i.component.props
|
||
}, sr[t] = a, a.vm.exposed.open(e), o(a.vm.exposed);
|
||
});
|
||
}
|
||
function _u(e = null) {
|
||
if (e == null)
|
||
try {
|
||
e = Ln("use:form:wrapper", () => {
|
||
})();
|
||
} catch (o) {
|
||
ce.warn("cant inject use:form:wrapper,建议在App.vue中使用<fs-form-provider>组件包裹<router-view/>", o);
|
||
}
|
||
let t = null;
|
||
e == null ? t = async (o) => await wu(o) : t = async (o) => await e.open(o);
|
||
async function n(o) {
|
||
const { buildFormOptions: r } = na(), a = r(o.crudOptions, o.context);
|
||
return await t(a);
|
||
}
|
||
return {
|
||
openDialog: t,
|
||
openCrudFormDialog: n
|
||
};
|
||
}
|
||
const { merge: fi } = Ee(), Cu = fi;
|
||
function Su(e) {
|
||
const { crudExpose: t } = e, { crudBinding: n } = t;
|
||
Se(), rt();
|
||
const { merge: o } = Ee();
|
||
ut(() => {
|
||
var a, i, l;
|
||
return (l = (i = (a = n.value) == null ? void 0 : a.table) == null ? void 0 : i.editable) == null ? void 0 : l.enabled;
|
||
}, (a) => {
|
||
var l, s, u, c, d;
|
||
const i = (u = (s = (l = n.value) == null ? void 0 : l.table) == null ? void 0 : s.editable) == null ? void 0 : u.customRowHandleActive;
|
||
if (i) {
|
||
i({
|
||
enabled: a,
|
||
mode: (c = n.value.table.editable) == null ? void 0 : c.mode,
|
||
rowHandle: n.value.rowHandle
|
||
});
|
||
return;
|
||
}
|
||
a ? ((d = n.value.table.editable) == null ? void 0 : d.mode) === "row" ? n.value.rowHandle.active = "editRow" : n.value.rowHandle.active = "editable" : n.value.rowHandle.active = "default";
|
||
});
|
||
const r = {
|
||
/**
|
||
* 启用编辑
|
||
* @param opts
|
||
*/
|
||
async enable(a, i) {
|
||
const l = n.value.table.editable;
|
||
o(l, { enabled: !0 }, a), i && i({ editable: l });
|
||
},
|
||
/**
|
||
* 禁用编辑
|
||
*/
|
||
disable() {
|
||
var a;
|
||
(a = t.getTableRef()) == null || a.editable.resume(), n.value.table.editable.enabled = !1, n.value.rowHandle.active = "default";
|
||
},
|
||
/**
|
||
* 激活所有编辑
|
||
*/
|
||
active(a) {
|
||
t.getTableRef().editable.active(a);
|
||
},
|
||
/**
|
||
* 退出编辑
|
||
*/
|
||
inactive() {
|
||
t.getTableRef().editable.inactive();
|
||
},
|
||
/**
|
||
* 添加行
|
||
*/
|
||
addRow(a) {
|
||
t.getTableRef().editable.addRow(a);
|
||
},
|
||
activeCols(a) {
|
||
t.getTableRef().editable.activeCols(a);
|
||
},
|
||
/**
|
||
* 还原,取消编辑
|
||
*/
|
||
resume() {
|
||
t.getTableRef().editable.resume();
|
||
},
|
||
/**
|
||
* 还原,取消编辑,同resume
|
||
*/
|
||
cancel() {
|
||
t.getTableRef().editable.cancelAll();
|
||
},
|
||
/**
|
||
* 本地保存,不提交到后台
|
||
*/
|
||
persist() {
|
||
t.getTableRef().editable.persist();
|
||
},
|
||
removeRow(a) {
|
||
t.getTableRef().editable.removeRow(a);
|
||
},
|
||
getEditableRow(a) {
|
||
var i, l;
|
||
return (l = (i = t.getTableRef()) == null ? void 0 : i.editable) == null ? void 0 : l.getEditableRow(a);
|
||
},
|
||
getActiveRows() {
|
||
var a, i;
|
||
return (i = (a = t.getTableRef()) == null ? void 0 : a.editable) == null ? void 0 : i.getActiveRows();
|
||
},
|
||
async doSaveRow(a) {
|
||
let i = a.editableId;
|
||
i || (i = a.row[n.value.table.editable.rowKey]);
|
||
const l = r.getEditableRow(i);
|
||
await l.save({
|
||
async doSave(s) {
|
||
var h, g;
|
||
const { isAdd: u, row: c, setData: d } = s, f = c;
|
||
if (((g = (h = n.value) == null ? void 0 : h.mode) == null ? void 0 : g.name) !== "local")
|
||
try {
|
||
if (l.loading = !0, u) {
|
||
const m = await n.value.request.addRequest({ form: f });
|
||
d(m);
|
||
} else
|
||
await n.value.request.editRequest({ form: f, row: f });
|
||
} finally {
|
||
l.loading = !1;
|
||
}
|
||
}
|
||
});
|
||
},
|
||
async doCancelRow(a) {
|
||
let i = a.editableId;
|
||
i || (i = a.row[n.value.table.editable.rowKey]);
|
||
const l = r.getEditableRow(i);
|
||
if (l.isAdd) {
|
||
r.removeRow(i);
|
||
return;
|
||
}
|
||
l.cancel();
|
||
},
|
||
async doRemoveRow(a) {
|
||
let i = a.editableId;
|
||
i || (i = a.row[n.value.table.editable.rowKey]);
|
||
const l = r.getEditableRow(i);
|
||
return await t.doRemove(a, {
|
||
async handle() {
|
||
return l.isAdd ? (r.removeRow(i), !1) : n.value.mode.name === "local" ? (r.removeRow(i), { isLocal: !0 }) : await n.value.request.delRequest(a);
|
||
}
|
||
});
|
||
},
|
||
getInstance() {
|
||
t.getTableRef().editable;
|
||
},
|
||
eachCells(a) {
|
||
var i;
|
||
(i = t.getTableRef().editable) == null || i.eachCells(a);
|
||
},
|
||
eachRows(a) {
|
||
var i;
|
||
(i = t.getTableRef().editable) == null || i.eachRows(a);
|
||
},
|
||
async validate() {
|
||
var a;
|
||
return await ((a = t.getTableRef().editable) == null ? void 0 : a.validate());
|
||
},
|
||
getTableData(a) {
|
||
var i;
|
||
return (i = t.getTableRef().editable) == null ? void 0 : i.getCleanTableData(a);
|
||
},
|
||
getCleanTableData(a) {
|
||
var i;
|
||
return (i = t.getTableRef().editable) == null ? void 0 : i.getCleanTableData(a);
|
||
}
|
||
};
|
||
return r;
|
||
}
|
||
function hi(e) {
|
||
const { crudRef: t, crudBinding: n } = e, { ui: o } = Se(), { t: r } = rt(), a = _u();
|
||
function i() {
|
||
t.value == null && ce.warn("crudRef还未初始化,请在onMounted之后调用");
|
||
}
|
||
function l() {
|
||
n.value == null && ce.warn("crudBinding还未初始化,请在useFs或useCrud之后调用");
|
||
}
|
||
const s = {
|
||
crudRef: t,
|
||
crudBinding: n,
|
||
getFormWrapperRef() {
|
||
return t.value.formWrapperRef;
|
||
},
|
||
getFormRef: () => {
|
||
const u = s.getFormWrapperRef();
|
||
if (u == null || (u == null ? void 0 : u.formRef) == null) {
|
||
ce.error("当前无法获取FormRef,请在编辑对话框已打开的状态下调用此方法,如果是在打开对话框时调用,可以尝试先nextTick");
|
||
return;
|
||
}
|
||
return u == null ? void 0 : u.formRef;
|
||
},
|
||
getFormData: () => {
|
||
const u = s.getFormRef();
|
||
return u == null ? void 0 : u.getFormData();
|
||
},
|
||
setFormData: (u, c) => {
|
||
var d;
|
||
(d = s.getFormRef()) == null || d.setFormData(u, c);
|
||
},
|
||
getFormComponentRef(u, c = !1) {
|
||
const d = s.getFormRef();
|
||
return d == null ? void 0 : d.getComponentRef(u, c);
|
||
},
|
||
doValueBuilder(u, c) {
|
||
c == null && (c = qn(n.value.columns)), ce.debug("doValueBuilder ,columns=", c);
|
||
const d = [];
|
||
zo(c, (f) => {
|
||
f.valueBuilder != null && d.push(f);
|
||
}), d.length !== 0 && (J(u, (f, h) => {
|
||
J(d, (g) => {
|
||
const m = g.valueBuilder({
|
||
value: et(f, g.key),
|
||
row: f,
|
||
form: f,
|
||
index: h,
|
||
key: g.key,
|
||
column: g
|
||
});
|
||
m != null && !(m instanceof Promise) && We(f, g.key, m);
|
||
}), f.children && xo(f.children) && s.doValueBuilder(f.children, c);
|
||
}), ce.debug("valueBuilder success:", u));
|
||
},
|
||
doValueResolve({ form: u }, c) {
|
||
c == null && (c = qn(n.value.columns));
|
||
const d = [];
|
||
zo(c, (f) => {
|
||
f.valueResolve != null && d.push(f);
|
||
}), d.length !== 0 && (ce.debug("doValueResolve ,columns=", c), J(d, (f) => {
|
||
const h = f.key, g = f.valueResolve({
|
||
value: et(u, h),
|
||
row: u,
|
||
form: u,
|
||
key: h,
|
||
column: f
|
||
});
|
||
g != null && !(g instanceof Promise) && We(u, h, g);
|
||
}), ce.debug("valueResolve success:", u));
|
||
},
|
||
doSearchValidate() {
|
||
s.getSearchRef().doValidate();
|
||
},
|
||
getSearchFormData() {
|
||
return n.value.search.validatedForm;
|
||
},
|
||
getSearchValidatedFormData() {
|
||
return n.value.search.validatedForm;
|
||
},
|
||
/**
|
||
* {form,mergeForm}
|
||
*/
|
||
setSearchFormData(u) {
|
||
if (t.value && t.value.setSearchFormData({
|
||
form: u.form,
|
||
mergeForm: u.mergeForm
|
||
}), u.mergeForm === !1)
|
||
for (const d in n.value.search.validatedForm)
|
||
delete n.value.search.validatedForm[d];
|
||
const { merge: c } = Ee();
|
||
c(n.value.search.validatedForm, u.form), u.triggerSearch && s.doRefresh();
|
||
},
|
||
/**
|
||
* 获取search组件ref
|
||
*/
|
||
getSearchRef() {
|
||
var u;
|
||
return i(), (u = t.value) == null ? void 0 : u.getSearchRef();
|
||
},
|
||
buildPageQuery(u) {
|
||
var m, y;
|
||
const c = u.page;
|
||
let d = u.form;
|
||
d == null && (d = ft(s.getSearchValidatedFormData()) || {}, (y = (m = n.value) == null ? void 0 : m.search) != null && y.columns && s.doValueResolve({ form: d }, qn(n.value.search.columns)));
|
||
let f = u.sort;
|
||
f == null && (f = n.value.table.sort || {});
|
||
const h = { page: c, form: d, sort: f };
|
||
let g = h;
|
||
return n.value.request.transformQuery && (g = n.value.request.transformQuery(h)), g;
|
||
},
|
||
async search(u, c = {}) {
|
||
const d = s.buildPageQuery(u);
|
||
let f;
|
||
const h = z(n.value.table.disableLoading);
|
||
try {
|
||
c.silence !== !0 && h !== !0 && (n.value.table.loading = !0), ce.debug("pageRequest", d), f = await n.value.request.pageRequest(d);
|
||
} finally {
|
||
n.value.table.loading = !1;
|
||
}
|
||
if (f == null) {
|
||
ce.warn("pageRequest返回结果不能为空");
|
||
return;
|
||
}
|
||
let g = f;
|
||
return n.value.request.transformRes && (g = n.value.request.transformRes({
|
||
res: f,
|
||
query: d
|
||
})), g.records && s.doValueBuilder(g.records), g;
|
||
},
|
||
getPage() {
|
||
let u = {
|
||
currentPage: 1,
|
||
pageSize: 10
|
||
};
|
||
return n.value.pagination && (u = {
|
||
currentPage: n.value.pagination[o.pagination.currentPage],
|
||
pageSize: n.value.pagination.pageSize
|
||
}), u;
|
||
},
|
||
async doRefresh(u) {
|
||
var y, v;
|
||
if (n.value.request.pageRequest == null)
|
||
return;
|
||
ce.debug("do refresh:", u), n.value.pagination && u != null && u.goFirstPage && (n.value.pagination[o.pagination.currentPage] = 1);
|
||
const c = s.getPage(), d = await s.search({ page: c }, { silence: u == null ? void 0 : u.silence });
|
||
if (d == null) {
|
||
ce.error("pageRequest返回结构不正确,请配置正确的request.transformRes,期望:{currentPage>0, pageSize>0, total, records:[]},实际返回:", d);
|
||
return;
|
||
}
|
||
const { currentPage: f = c.currentPage || 1, pageSize: h = c.pageSize, total: g } = d, { records: m } = d;
|
||
if (m == null || !(m instanceof Array) || g == null || f == null || f <= 0 || isNaN(f) || h == null || h <= 0 || isNaN(h)) {
|
||
ce.error("pageRequest返回结构不正确,请配置正确的request.transformRes,期望:{currentPage>0, pageSize>0, total, records:[]},实际返回:", d), ce.info("如果你的不需要分页,也需要按照上面的格式返回,可以让pageSize=99999,然后配置crudOptions.pagination.show=false来隐藏分页组件");
|
||
return;
|
||
}
|
||
if (n.value.data = m, n.value.pagination && (n.value.pagination[o.pagination.currentPage] = f, n.value.pagination.pageSize = h, n.value.pagination[o.pagination.total] = g || m.length), (u == null ? void 0 : u.scrollTop) ?? n.value.table.scrollTopOnRefreshed) {
|
||
const F = s.getTableRef();
|
||
F == null || F.scrollTo(0);
|
||
}
|
||
(v = (y = n.value) == null ? void 0 : y.table) != null && v.onRefreshed && n.value.table.onRefreshed({
|
||
data: m
|
||
});
|
||
},
|
||
/**
|
||
* 获取toolbar组件Ref
|
||
*/
|
||
getToolbarRef: () => t.value.toolbarRef,
|
||
/**
|
||
* 获取列设置组件Ref
|
||
*/
|
||
getColumnsFilterRef: () => s.getToolbarRef().columnsFilterRef,
|
||
/**
|
||
* 获取列设置的原始列配置Ref
|
||
* 可以修改列设置的原始配置
|
||
*/
|
||
getColumnsFilterOriginalColumnsRef: () => s.getColumnsFilterRef().original,
|
||
/**
|
||
* 获取列设置的列配置Ref
|
||
* 可以动态修改列设置每列的配置
|
||
*/
|
||
getColumnsFilterColumnsRef: () => s.getColumnsFilterRef().columns,
|
||
doPageTurn(u) {
|
||
n.value.pagination[o.pagination.currentPage] = u;
|
||
},
|
||
/**
|
||
*
|
||
* @param opts = {
|
||
* form
|
||
* goFirstPage =true
|
||
* mergeForm=false
|
||
* }
|
||
*/
|
||
async doSearch(u) {
|
||
ce.debug("do search:", u), u = fi({ goFirstPage: !0 }, u), u.goFirstPage && s.doPageTurn(1), u.form && t.value && s.setSearchFormData({
|
||
form: u.form,
|
||
mergeForm: u.mergeForm,
|
||
refWarning: !1,
|
||
triggerSearch: !1
|
||
}), await s.doRefresh();
|
||
},
|
||
/**
|
||
* 获取FsTable实例
|
||
*/
|
||
getTableRef() {
|
||
var u;
|
||
return i(), (u = t.value) == null ? void 0 : u.tableRef;
|
||
},
|
||
/**
|
||
* 获取x-Table实例
|
||
*/
|
||
getBaseTableRef() {
|
||
const u = this.getTableRef();
|
||
if (u == null) {
|
||
ce.warn("fs-table还未挂载");
|
||
return;
|
||
}
|
||
return u.tableRef;
|
||
},
|
||
/**
|
||
* 获取表格数据
|
||
*/
|
||
getTableData() {
|
||
return l(), n.value.data;
|
||
},
|
||
setTableData(u) {
|
||
l(), n.value.data = u;
|
||
},
|
||
insertTableRow(u, c) {
|
||
l(), n.value.data.splice(u, 0, c);
|
||
},
|
||
updateTableRow(u, c, d = !0) {
|
||
d ? n.value.data[u] = Cu(n.value.data[u], c) : n.value.data[u] = c;
|
||
},
|
||
removeTableRow(u) {
|
||
l(), n.value.data.splice(u, 1);
|
||
},
|
||
removeTableRowByRowKey: (u, c) => {
|
||
l(), c == null && (c = n.value.data);
|
||
for (let d = 0; d < c.length; d++) {
|
||
const f = c[d];
|
||
if (f[n.value.table.rowKey] === u)
|
||
return c.splice(d, 1), !0;
|
||
if (f.children && xo(f.children) && s.removeTableRowByRowKey(u, f.children))
|
||
return !0;
|
||
}
|
||
},
|
||
getTableDataRow(u) {
|
||
const c = s.getTableData();
|
||
if (c == null)
|
||
throw new Error("table data is not init");
|
||
if (c.length <= u)
|
||
throw new Error("index over array length");
|
||
return c[u];
|
||
},
|
||
/**
|
||
* 选择某一行
|
||
* @param index
|
||
* @param row
|
||
*/
|
||
doSelectCurrentRow({ row: u }) {
|
||
s.getTableRef().value.setCurrentRow(u);
|
||
},
|
||
/**
|
||
* 删除行按钮
|
||
* @param context
|
||
* @param opts
|
||
*/
|
||
async doRemove(u, c) {
|
||
var m;
|
||
const d = n.value.table.remove ?? c ?? {};
|
||
if ((c == null ? void 0 : c.noConfirm) !== !0)
|
||
try {
|
||
d.confirmFn ? await d.confirmFn(u) : await o.messageBox.confirm({
|
||
title: d.confirmTitle || r("fs.rowHandle.remove.confirmTitle"),
|
||
message: d.confirmMessage || r("fs.rowHandle.remove.confirmMessage"),
|
||
cancelButtonText: d.cancelButtonText || r("fs.rowHandle.remove.cancelText"),
|
||
confirmButtonText: d.confirmButtonText || r("fs.rowHandle.remove.confirmText"),
|
||
type: "warn",
|
||
...d.confirmProps
|
||
});
|
||
} catch {
|
||
d.onCanceled && await d.onCanceled(u);
|
||
return;
|
||
}
|
||
let f = null;
|
||
const h = ((m = n.value.mode) == null ? void 0 : m.name) === "local";
|
||
if (c != null && c.handle ? f = await c.handle(u) : h ? s.removeTableRow(u == null ? void 0 : u.index) : f = await n.value.request.delRequest(u), f === !1)
|
||
return;
|
||
const g = { ...u, res: f };
|
||
if (d.afterRemove && await d.afterRemove(g) === !1)
|
||
return !1;
|
||
d.showSuccessNotification !== !1 && o.notification.success(r("fs.rowHandle.remove.success")), h || d.refreshTable !== !1 && await s.doRefresh({ scrollTop: !1 }), d.onRemoved && await d.onRemoved({ ...u, res: f });
|
||
},
|
||
/**
|
||
*
|
||
* 打开表单对话框
|
||
* @param formOpts ={mode, initialForm: row, index,...formOptions}
|
||
*/
|
||
async openDialog(u) {
|
||
if (u.newInstance === !0 && a)
|
||
return await a.openDialog(u);
|
||
const c = this.getFormWrapperRef();
|
||
return c.open(u), c;
|
||
},
|
||
async _openDialog(u, c, d) {
|
||
var y, v;
|
||
const { merge: f } = Ee();
|
||
let h = c.row || c[o.tableColumn.row];
|
||
delete c.row, h == null && c.index != null && (h = s.getTableDataRow(c.index)), (v = (y = n.value) == null ? void 0 : y.request) != null && v.infoRequest && (h = await n.value.request.infoRequest({ mode: u, row: h }));
|
||
const g = {
|
||
mode: u
|
||
}, m = qn(n.value[u + "Form"]);
|
||
return f(g, m, { initialForm: h }, c, d), await this.openDialog(g);
|
||
},
|
||
async openAdd(u, c = {}) {
|
||
return this._openDialog("add", u, c);
|
||
},
|
||
async openEdit(u, c = {}) {
|
||
return this._openDialog("edit", u, c);
|
||
},
|
||
async openView(u, c = {}) {
|
||
return this._openDialog("view", u, c);
|
||
},
|
||
async openCopy(u, c = {}) {
|
||
return this._openDialog("add", u, c);
|
||
},
|
||
editable: void 0
|
||
};
|
||
return s.editable = Su({ crudExpose: s }), { expose: s, crudExpose: s };
|
||
}
|
||
async function Fu() {
|
||
const e = await /* @__PURE__ */ Object.assign({ "./lib/index.ts": () => import("./index-4c7fb80e.mjs") });
|
||
let t = null;
|
||
return yt(e, (o) => {
|
||
t = o;
|
||
}), (await t()).exportUtil;
|
||
}
|
||
async function Ru() {
|
||
const e = await /* @__PURE__ */ Object.assign({ "./lib/index.ts": () => import("./index-4c7fb80e.mjs") });
|
||
let t = null;
|
||
return yt(e, (o) => {
|
||
t = o;
|
||
}), (await t()).importUtil;
|
||
}
|
||
function ku({ originalRow: e, row: t, key: n, col: o }) {
|
||
var i;
|
||
const r = e[n], a = (i = o.component) == null ? void 0 : i.dict;
|
||
if (a && r != null) {
|
||
const l = a.getNodesFromDataMap(r);
|
||
if (l != null && l.length > 0) {
|
||
const s = Sl(l, (u) => a.getLabel(u) || a.getValue(u)).join("|");
|
||
s != null && s !== "" && (t[n] = s);
|
||
}
|
||
}
|
||
return t;
|
||
}
|
||
async function Du(e, t = {}) {
|
||
if (t.server) {
|
||
const u = e.getPage(), c = e.buildPageQuery({ page: u });
|
||
await t.server(c);
|
||
return;
|
||
}
|
||
const n = e.crudBinding;
|
||
let o = t.columns;
|
||
o == null && (o = [], yt(n.value.table.columnsMap, (u) => {
|
||
if (!(t.columnFilter && t.columnFilter(u) === !1) && !(t.onlyShow && z(u.show) === !1) && u.exportable !== !1 && u.key !== "_index") {
|
||
const c = {
|
||
key: u.key,
|
||
title: u.title
|
||
};
|
||
o.push(c);
|
||
}
|
||
}));
|
||
for (const u of o) {
|
||
const c = n.value.table.columnsMap[u.key];
|
||
u.columnProps = c || {}, t.columnBuilder && t.columnBuilder({ col: u });
|
||
}
|
||
const { merge: r } = Ee(), a = await Fu(), i = [];
|
||
let l = n.value.data;
|
||
if (t.dataFrom === "search") {
|
||
const u = r({
|
||
page: {
|
||
currentPage: 1,
|
||
pageSize: 99999999
|
||
}
|
||
}, n.value.toolbar.export.searchParams);
|
||
l = (await e.search(u, { silence: !0 })).records;
|
||
}
|
||
for (const u of l) {
|
||
const c = ft(u);
|
||
yt(o, (d) => {
|
||
const f = d.columnProps, h = {
|
||
row: c,
|
||
originalRow: u,
|
||
key: d.key,
|
||
col: f,
|
||
exportCol: d
|
||
};
|
||
t.autoUseDictLabel !== !1 && ku(h), t.dataFormatter && t.dataFormatter(h);
|
||
}), i.push(c);
|
||
}
|
||
const s = r({
|
||
columns: o,
|
||
data: i,
|
||
filename: "table",
|
||
noHeader: !1,
|
||
separator: ",",
|
||
quoted: !1
|
||
//每项数据是否加引号
|
||
}, {
|
||
...t
|
||
});
|
||
t.fileType === "excel" ? await a.excel(s) : await a.csv(s);
|
||
}
|
||
async function Rp(e, t) {
|
||
const o = await (await Ru()).csv(t.file), r = e.crudBinding;
|
||
t.append === !1 && (r.value.data.length = 0);
|
||
const a = r.value.table.editable.enabled;
|
||
for (const i of o.data)
|
||
a ? e.editable.addRow({ row: i, active: !1 }) : r.value.data.push(i);
|
||
}
|
||
const mi = {};
|
||
function pi(e, t, n = {}) {
|
||
mi[e] = {
|
||
handle: t,
|
||
opts: n
|
||
};
|
||
}
|
||
function Ou(e) {
|
||
return mi[e];
|
||
}
|
||
pi("rowSelection", (e, t, n) => {
|
||
const r = t.crudExpose.crudBinding;
|
||
function a() {
|
||
var s, u;
|
||
return ((u = (s = r.value) == null ? void 0 : s.table) == null ? void 0 : u.rowKey) || "id";
|
||
}
|
||
const { ui: i } = Se();
|
||
if (!e) {
|
||
ce.warn("请配置settings.plugins.rowSelection.props参数");
|
||
return;
|
||
}
|
||
let l = i.table;
|
||
return (n == null ? void 0 : n.table.tableVersion) == "v2" && (l = i.tableV2), l.buildSelectionCrudOptions({
|
||
crossPage: e.crossPage,
|
||
getRowKey: a,
|
||
getPageData() {
|
||
return r.value.data;
|
||
},
|
||
useCompute: () => Vt(),
|
||
selectionFixed: e.selectionFixed,
|
||
multiple: e.multiple,
|
||
selectedRowKeys: e.selectedRowKeys,
|
||
onSelectedKeysChanged: async (s) => {
|
||
const u = e.selectedRowKeys instanceof Function ? e.selectedRowKeys() : e.selectedRowKeys;
|
||
u.value = [...s], await Be(), e.onSelectedChanged && e.onSelectedChanged(u.value);
|
||
}
|
||
});
|
||
}, {
|
||
before: !0,
|
||
order: -2
|
||
});
|
||
pi("mobile", (e, t, n) => {
|
||
const o = n.rowHandle, r = o.buttons;
|
||
let a = {};
|
||
for (const l in r) {
|
||
const s = r[l];
|
||
Bo(s.dropdown) ? a = s : a[l] = {
|
||
...s,
|
||
dropdown: V(() => e.isMobile.value ? !0 : s.dropdown)
|
||
};
|
||
}
|
||
let i = o.width;
|
||
return (i == null || !Bo(i)) && (i = V(() => {
|
||
var l;
|
||
return e.isMobile.value ? ((l = e == null ? void 0 : e.rowHandle) == null ? void 0 : l.width) || 60 : o.width || 250;
|
||
})), {
|
||
rowHandle: {
|
||
width: i,
|
||
buttons: a
|
||
}
|
||
};
|
||
}, {
|
||
before: !1,
|
||
order: -2
|
||
});
|
||
const { merge: Jt } = Ee();
|
||
function Eu(e) {
|
||
e.context == null && (e.context = {});
|
||
const t = Le.get(), { t: n } = rt(), o = (D) => V(() => n(D));
|
||
let r = e.crudOptions;
|
||
const a = e.expose || e.crudExpose;
|
||
if (!a)
|
||
throw new Error("crudExpose不能为空,请给useCrud传入{crudExpose}参数");
|
||
const i = a, { crudBinding: l } = i, { doRefresh: s, doValueResolve: u } = i;
|
||
function c() {
|
||
return {
|
||
pagination: {
|
||
...t.pagination.onChange({
|
||
setCurrentPage(Y) {
|
||
l.value.pagination[t.pagination.currentPage] = Y, l.value.pagination._onCurrentChange && l.value.pagination._onCurrentChange({ current: Y, pagination: l.value.pagination });
|
||
},
|
||
setPageSize(Y) {
|
||
l.value.pagination.pageSize = Y, l.value.pagination[t.pagination.currentPage] = 1, l.value.pagination._onPageSizeChange && l.value.pagination._onPageSizeChange({
|
||
pageSize: Y,
|
||
current: 1,
|
||
pagination: l.value.pagination
|
||
});
|
||
},
|
||
async doAfterChange() {
|
||
return await s();
|
||
}
|
||
})
|
||
}
|
||
};
|
||
}
|
||
function d() {
|
||
return {
|
||
form: {
|
||
async doSubmit(D) {
|
||
var Y, le, I, P;
|
||
if (D.mode === "edit")
|
||
if (u(D), ((Y = r.mode) == null ? void 0 : Y.name) === "local")
|
||
i.updateTableRow(D.index, D.form, r.mode.isMergeWhenUpdate);
|
||
else
|
||
return (le = l.value.request) != null && le.editRequest || ce.warn("request.editRequest 未定义,无法保存"), await l.value.request.editRequest(D);
|
||
else if (D.mode === "add")
|
||
if (u(D), ((I = r.mode) == null ? void 0 : I.name) === "local") {
|
||
const X = r.mode.isAppendWhenAdd ? i.getTableData().length : 0;
|
||
i.insertTableRow(X, D.form);
|
||
} else
|
||
return (P = l.value.request) != null && P.addRequest || ce.warn("request.addRequest 未定义,无法保存"), await l.value.request.addRequest(D);
|
||
},
|
||
async onSuccess({ mode: D }) {
|
||
D === "edit" ? await s({ scrollTop: !1 }) : D === "add" ? await s({ scrollTop: !0, goFirstPage: !0 }) : await s();
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function f() {
|
||
return {
|
||
rowHandle: {
|
||
buttons: {
|
||
remove: {
|
||
click: async (D) => {
|
||
D.row = D[t.tableColumn.row], await i.doRemove(D);
|
||
}
|
||
},
|
||
copy: {
|
||
show: !1,
|
||
click: async (D) => {
|
||
D.row = D[t.tableColumn.row], await i.openCopy({
|
||
row: D.row,
|
||
index: D.index
|
||
});
|
||
}
|
||
},
|
||
edit: {
|
||
click: async (D) => {
|
||
D.row = D[t.tableColumn.row], await i.openEdit({
|
||
row: D.row,
|
||
index: D.index
|
||
});
|
||
}
|
||
},
|
||
view: {
|
||
click: async (D) => {
|
||
D.row = D[t.tableColumn.row], await i.openView({
|
||
row: D.row,
|
||
index: D.index
|
||
});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function h() {
|
||
return {
|
||
search: {
|
||
buttons: {
|
||
search: {
|
||
loading: V(() => {
|
||
var D, Y;
|
||
return (Y = (D = l.value) == null ? void 0 : D.table) == null ? void 0 : Y.loading;
|
||
})
|
||
}
|
||
},
|
||
on_reset() {
|
||
l.value.table.sort = {}, Lo(l.value.table.columns, (Y) => {
|
||
Y.sortOrder = !1;
|
||
});
|
||
const D = a.getBaseTableRef();
|
||
D != null && D.clearSort && D.clearSort();
|
||
},
|
||
on_search() {
|
||
a.doRefresh({ goFirstPage: !0 });
|
||
},
|
||
"onUpdate:form": (D) => {
|
||
l.value.search.form = D;
|
||
},
|
||
"onUpdate:validatedForm": (D) => {
|
||
l.value.search.validatedForm = D;
|
||
},
|
||
"onUpdate:collapse": (D) => {
|
||
l.value.search.collapse = D;
|
||
},
|
||
container: {
|
||
collapse: !0,
|
||
"onUpdate:collapse": (D) => {
|
||
l.value.search.container.collapse = D;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function g() {
|
||
return {
|
||
tabs: {},
|
||
onTabChange(D) {
|
||
a.setSearchFormData({ form: D, mergeForm: !0 }), s();
|
||
}
|
||
};
|
||
}
|
||
function m() {
|
||
const D = K(!1);
|
||
return {
|
||
toolbar: {
|
||
buttons: {
|
||
refresh: {
|
||
type: "default",
|
||
icon: t.icons.refresh,
|
||
title: o("fs.toolbar.refresh.title"),
|
||
size: "small",
|
||
plain: !0,
|
||
order: 1,
|
||
circle: !0,
|
||
click: async () => {
|
||
await a.doRefresh({ scrollTop: !1 });
|
||
}
|
||
},
|
||
search: {
|
||
type: "default",
|
||
icon: t.icons.search,
|
||
title: o("fs.toolbar.search.title"),
|
||
size: "small",
|
||
plain: !0,
|
||
order: 2,
|
||
circle: !0,
|
||
click: () => {
|
||
l.value.search.show = !l.value.search.show;
|
||
}
|
||
},
|
||
compact: {
|
||
type: "default",
|
||
icon: t.icons.compact,
|
||
title: o("fs.toolbar.compact.title"),
|
||
size: "small",
|
||
plain: !0,
|
||
order: 3,
|
||
circle: !0,
|
||
click: () => {
|
||
l.value.toolbar.compact = !l.value.toolbar.compact;
|
||
}
|
||
},
|
||
export: {
|
||
show: !0,
|
||
type: "default",
|
||
icon: t.icons.export,
|
||
order: 4,
|
||
size: "small",
|
||
plain: !0,
|
||
loading: D,
|
||
title: o("fs.toolbar.export.title"),
|
||
circle: !0,
|
||
click: async () => {
|
||
D.value = !0;
|
||
try {
|
||
const Y = l.value.toolbar.export ?? {};
|
||
await Du(a, {
|
||
...Y,
|
||
fileType: "excel",
|
||
dataFrom: "local",
|
||
onlyShow: !0,
|
||
filename: Y.filename ?? `table_${Date.now()}`
|
||
});
|
||
} finally {
|
||
D.value = !1;
|
||
}
|
||
}
|
||
},
|
||
columns: {
|
||
type: "default",
|
||
icon: t.icons.columnsFilter,
|
||
title: o("fs.toolbar.columns.title"),
|
||
size: "small",
|
||
plain: !0,
|
||
circle: !0,
|
||
order: 5
|
||
}
|
||
},
|
||
"onUpdate:columns"(Y) {
|
||
const le = l.value.table.columns;
|
||
function I(X, O) {
|
||
const x = {};
|
||
return J(O, (Q) => {
|
||
const re = X[Q.key];
|
||
if (re) {
|
||
if (re.columnSetShow === !1) {
|
||
x[Q.key] = re;
|
||
return;
|
||
}
|
||
delete re.order;
|
||
const ge = Jt({ ...re }, Q);
|
||
x[Q.key] = ge, re.children && (ge.children = I(re.children, Q.children));
|
||
}
|
||
}), x;
|
||
}
|
||
const P = I(le, Y);
|
||
l.value.table.columns = P, l.value.table.columnsMap = ea({}, P);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function y() {
|
||
return {
|
||
table: {
|
||
onSortChange(D) {
|
||
const { isServerSort: Y, prop: le, asc: I, order: P } = D;
|
||
Lo(l.value.table.columns, (O) => {
|
||
O.key === le ? O.sortOrder = P : O.sortOrder = !1;
|
||
});
|
||
const X = l.value.table.sort;
|
||
l.value.table.sort = Y ? { prop: le, order: P, asc: I } : null, (Y || X != null) && i.doRefresh();
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function v() {
|
||
return {
|
||
actionbar: {
|
||
buttons: {
|
||
add: {
|
||
click() {
|
||
i.openAdd({});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function F() {
|
||
const { compute: D } = Vt();
|
||
return {
|
||
actionbar: {
|
||
buttons: {
|
||
addRow: {
|
||
show: !1,
|
||
text: o("fs.actionbar.add"),
|
||
type: "primary",
|
||
click: () => {
|
||
i.editable.addRow();
|
||
}
|
||
}
|
||
}
|
||
},
|
||
rowHandle: {
|
||
group: {
|
||
editable: {
|
||
remove: {
|
||
text: "删除",
|
||
...t.button.colors("danger"),
|
||
click: async (Y) => {
|
||
const { index: le, row: I } = Y, P = I[l.value.table.editable.rowKey];
|
||
await i.editable.doRemoveRow({ editableId: P, row: I });
|
||
}
|
||
}
|
||
},
|
||
editRow: {
|
||
edit: {
|
||
text: "编辑",
|
||
loading: D((Y) => {
|
||
const { index: le, row: I } = Y, P = I[l.value.table.editable.rowKey], X = i.editable.getEditableRow(P);
|
||
return !!(X != null && X.loading);
|
||
}),
|
||
click: async (Y) => {
|
||
var X;
|
||
const { index: le, row: I } = Y, P = I[l.value.table.editable.rowKey];
|
||
if (l.value.table.editable.exclusive) {
|
||
const O = i.editable.getActiveRows();
|
||
J(O, (x) => {
|
||
l.value.table.editable.exclusiveEffect === "save" ? i.editable.doSaveRow({ row: x.rowData }) : i.editable.doCancelRow({ row: x.rowData });
|
||
});
|
||
}
|
||
(X = i.editable.getEditableRow(P)) == null || X.active();
|
||
},
|
||
show: D((Y) => {
|
||
var X, O;
|
||
const { index: le, row: I } = Y, P = I[l.value.table.editable.rowKey];
|
||
return !((O = (X = i.editable) == null ? void 0 : X.getEditableRow(P)) != null && O.isEditing);
|
||
})
|
||
},
|
||
save: {
|
||
text: "保存",
|
||
loading: !1,
|
||
click: async (Y) => {
|
||
const { index: le, row: I } = Y;
|
||
await i.editable.doSaveRow({ row: I });
|
||
},
|
||
show: D((Y) => {
|
||
var X, O;
|
||
const { index: le, row: I } = Y, P = I[l.value.table.editable.rowKey];
|
||
return !!((O = (X = i.editable) == null ? void 0 : X.getEditableRow(P)) != null && O.isEditing);
|
||
})
|
||
},
|
||
cancel: {
|
||
text: "取消",
|
||
click: async (Y) => {
|
||
var P;
|
||
const { index: le, row: I } = Y;
|
||
await ((P = i.editable) == null ? void 0 : P.doCancelRow({ row: I }));
|
||
},
|
||
show: D((Y) => {
|
||
var X, O;
|
||
const { index: le, row: I } = Y, P = I[l.value.table.editable.rowKey];
|
||
return !!((O = (X = i.editable) == null ? void 0 : X.getEditableRow(P)) != null && O.isEditing);
|
||
})
|
||
},
|
||
remove: {
|
||
text: "删除",
|
||
...t.button.colors("danger"),
|
||
click: async (Y) => {
|
||
var X;
|
||
const { index: le, row: I } = Y, P = I[l.value.table.editable.rowKey];
|
||
await ((X = i.editable) == null ? void 0 : X.doRemoveRow({ row: I, editableId: P }));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const { cloneDeep: R } = Ee();
|
||
function k(D) {
|
||
D.search.validatedForm = R(D.search.initialForm);
|
||
}
|
||
function j(D) {
|
||
var re;
|
||
const Y = { value: null };
|
||
let le = R(D);
|
||
const I = oo.commonOptions(e), P = oo.defaultOptions({ t: n, crudOptionsRef: Y });
|
||
r = Jt({}, P, I, le), Y.value = r;
|
||
const X = z(r.settings);
|
||
if (X) {
|
||
const ge = z(X.plugins);
|
||
J(ge, (te, w) => {
|
||
if (te.enabled === !1)
|
||
return;
|
||
let _ = te.handle, C = {};
|
||
if (_ == null) {
|
||
const L = Ou(w);
|
||
L != null && (_ = L.handle, C = L.opts);
|
||
}
|
||
if (_ == null)
|
||
return;
|
||
const S = te.before ?? C.before, E = _(te.props, e, r);
|
||
S !== !1 ? le = Jt(E, le) : le = Jt(le, E);
|
||
});
|
||
}
|
||
const O = Jt(P, c(), d(), f(), h(), g(), m(), y(), v(), F(), I, le), { buildColumns: x } = na(), Q = x(O);
|
||
return k(Q), (re = Q == null ? void 0 : Q.settings) != null && re.onUseCrud && Q.settings.onUseCrud(Q), Q;
|
||
}
|
||
function A(D) {
|
||
l.value = j(D), ce.info("fast-crud inited, crudBinding=", l.value);
|
||
}
|
||
function T(D) {
|
||
const Y = Jt({}, r, D);
|
||
return A(Y), r = Y, Y;
|
||
}
|
||
A(r);
|
||
function q(D) {
|
||
Jt(l.value, D);
|
||
}
|
||
return {
|
||
appendCrudOptions: T,
|
||
resetCrudOptions: A,
|
||
appendCrudBinding: q,
|
||
rebuildCrudBindings: j
|
||
};
|
||
}
|
||
function gi(e) {
|
||
const { createCrudOptions: t, crudExposeRef: n } = e, o = e.crudRef || K(), r = e.crudBinding || K({});
|
||
let a = e.crudExpose;
|
||
a || (a = hi({ crudRef: o, crudBinding: r }).crudExpose), n && !n.value && (n.value = a), e.context == null && (e.context = {});
|
||
const i = e.context;
|
||
e.onExpose && e.onExpose({ crudRef: o, crudBinding: r, crudExpose: a, context: i });
|
||
const l = t({
|
||
...e,
|
||
crudExpose: a,
|
||
expose: a,
|
||
context: i
|
||
});
|
||
function s(u) {
|
||
const c = { crudExpose: a, ...u, context: i };
|
||
Jt(u.crudOptions, e.crudOptionsOverride);
|
||
const d = Eu(c);
|
||
return {
|
||
...u,
|
||
...d,
|
||
crudRef: o,
|
||
crudExpose: a,
|
||
crudBinding: r,
|
||
context: i
|
||
};
|
||
}
|
||
return l instanceof Promise ? l.then((u) => s(u)) : s(l);
|
||
}
|
||
function kp(e) {
|
||
return gi(e);
|
||
}
|
||
function Tu(e) {
|
||
return gi(e);
|
||
}
|
||
function $u() {
|
||
const e = K(), t = K(), n = {}, { crudExpose: o } = hi({ crudBinding: t, crudRef: e });
|
||
return {
|
||
crudRef: e,
|
||
crudBinding: t,
|
||
context: n,
|
||
crudExpose: o
|
||
};
|
||
}
|
||
function fn(e, t, n = "modelValue") {
|
||
const o = Le.get();
|
||
let r = e.dict;
|
||
r && r.prototype && (r.clear(), r = jo(ft(e.dict)), r.cloneable = !1, r.clear());
|
||
function a() {
|
||
return V(() => {
|
||
let A = [];
|
||
if (e.options ? A = e.options : r && r.data != null && (r.data instanceof Array || an.logger.warn("dict.data类型错误,期望为数组,实际:", r.data), A = r.data, e.transformDictData && (A = e.transformDictData(ft(r.data)))), o.type === "naive" || o.type === "element") {
|
||
const T = [];
|
||
for (const q of A)
|
||
T.push({
|
||
...q,
|
||
value: F(q),
|
||
label: k(q)
|
||
});
|
||
return T;
|
||
}
|
||
return A;
|
||
});
|
||
}
|
||
function i() {
|
||
return r;
|
||
}
|
||
const l = Ln("get:scope", function() {
|
||
});
|
||
function s() {
|
||
const A = e[n] || t.attrs[n];
|
||
return {
|
||
...l(),
|
||
componentRef: u,
|
||
value: A
|
||
};
|
||
}
|
||
const { proxy: u } = Jo(), c = async (A = !1) => {
|
||
if (!r)
|
||
return;
|
||
if (r.getNodesByValues) {
|
||
const q = s();
|
||
if (q.value == null)
|
||
return;
|
||
let D = q.value;
|
||
Array.isArray(q.value) || (D = [q.value]), await r.appendByValues(D);
|
||
return;
|
||
}
|
||
if (r.loading)
|
||
return;
|
||
const T = s();
|
||
if (A) {
|
||
await r.reloadDict(T);
|
||
return;
|
||
}
|
||
await r.loadDict(T);
|
||
};
|
||
c();
|
||
const d = async () => {
|
||
await c(!0);
|
||
}, f = () => {
|
||
r && r.clear();
|
||
}, h = () => {
|
||
r != null && (!r.prototype && !r.cloneable || ut(() => e[n], () => {
|
||
d();
|
||
}));
|
||
};
|
||
(() => {
|
||
ut(() => r == null ? void 0 : r.data, () => {
|
||
const A = s();
|
||
t.attrs.onDictChange, t.emit("dict-change", { dict: r, ...A });
|
||
}, {
|
||
immediate: !0
|
||
});
|
||
})();
|
||
const m = () => {
|
||
var A;
|
||
return (A = i()) == null ? void 0 : A.data;
|
||
}, y = (A, T) => {
|
||
let q = T;
|
||
return i() && (q = i()[T]), A[q];
|
||
}, v = (A, T) => {
|
||
let q = T;
|
||
i() && (q = i()[T]), delete A[q];
|
||
}, F = (A) => y(A, "value"), R = (A) => y(A, "children"), k = (A) => {
|
||
if (e.labelFormatter)
|
||
return e.labelFormatter(A);
|
||
const T = y(A, "label");
|
||
return T == null ? "" : String(T);
|
||
};
|
||
return {
|
||
createComputedOptions: a,
|
||
loadDict: c,
|
||
reloadDict: d,
|
||
clearDict: f,
|
||
getDictData: m,
|
||
getDict: i,
|
||
watchValue: h,
|
||
getValue: F,
|
||
getLabel: k,
|
||
getChildren: R,
|
||
getColor: (A) => y(A, "color"),
|
||
removePropValue: v,
|
||
curDict: r
|
||
};
|
||
}
|
||
const Rn = typeof performance == "object" && performance && typeof performance.now == "function" ? performance : Date, vi = /* @__PURE__ */ new Set(), kr = typeof process == "object" && process ? process : {}, bi = (e, t, n, o) => {
|
||
typeof kr.emitWarning == "function" ? kr.emitWarning(e, t, n, o) : console.error(`[${n}] ${t}: ${e}`);
|
||
};
|
||
let qo = globalThis.AbortController, ya = globalThis.AbortSignal;
|
||
var qa;
|
||
if (typeof qo > "u") {
|
||
ya = class {
|
||
constructor() {
|
||
ie(this, "onabort");
|
||
ie(this, "_onabort", []);
|
||
ie(this, "reason");
|
||
ie(this, "aborted", !1);
|
||
}
|
||
addEventListener(o, r) {
|
||
this._onabort.push(r);
|
||
}
|
||
}, qo = class {
|
||
constructor() {
|
||
ie(this, "signal", new ya());
|
||
t();
|
||
}
|
||
abort(o) {
|
||
var r, a;
|
||
if (!this.signal.aborted) {
|
||
this.signal.reason = o, this.signal.aborted = !0;
|
||
for (const i of this.signal._onabort)
|
||
i(o);
|
||
(a = (r = this.signal).onabort) == null || a.call(r, o);
|
||
}
|
||
}
|
||
};
|
||
let e = ((qa = kr.env) == null ? void 0 : qa.LRU_CACHE_IGNORE_AC_WARNING) !== "1";
|
||
const t = () => {
|
||
e && (e = !1, bi("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.", "NO_ABORT_CONTROLLER", "ENOTSUP", t));
|
||
};
|
||
}
|
||
const Au = (e) => !vi.has(e), Qt = (e) => e && e === Math.floor(e) && e > 0 && isFinite(e), yi = (e) => Qt(e) ? e <= Math.pow(2, 8) ? Uint8Array : e <= Math.pow(2, 16) ? Uint16Array : e <= Math.pow(2, 32) ? Uint32Array : e <= Number.MAX_SAFE_INTEGER ? Oo : null : null;
|
||
class Oo extends Array {
|
||
constructor(t) {
|
||
super(t), this.fill(0);
|
||
}
|
||
}
|
||
var In;
|
||
const vn = class vn {
|
||
constructor(t, n) {
|
||
ie(this, "heap");
|
||
ie(this, "length");
|
||
if (!p(vn, In))
|
||
throw new TypeError("instantiate Stack using Stack.create(n)");
|
||
this.heap = new n(t), this.length = 0;
|
||
}
|
||
static create(t) {
|
||
const n = yi(t);
|
||
if (!n)
|
||
return [];
|
||
fe(vn, In, !0);
|
||
const o = new vn(t, n);
|
||
return fe(vn, In, !1), o;
|
||
}
|
||
push(t) {
|
||
this.heap[this.length++] = t;
|
||
}
|
||
pop() {
|
||
return this.heap[--this.length];
|
||
}
|
||
};
|
||
In = new WeakMap(), // private constructor
|
||
ye(vn, In, !1);
|
||
let Dr = vn;
|
||
var Rt, pt, kt, Dt, Vn, Pn, Ue, Ot, He, Ve, we, lt, gt, nt, Xe, Et, Je, Tt, $t, vt, At, rn, st, lo, Er, yn, Wt, so, bt, Xo, wi, wn, Mn, uo, Bt, Zt, jt, en, co, Tr, pp, Bn, Eo, jn, To, Ae, Ie, fo, $r, _n, Un, xt, tn, ho, Ar;
|
||
const la = class la {
|
||
constructor(t) {
|
||
ye(this, lo);
|
||
ye(this, Xo);
|
||
ye(this, Bt);
|
||
ye(this, jt);
|
||
ye(this, co);
|
||
ye(this, Bn);
|
||
ye(this, jn);
|
||
ye(this, Ae);
|
||
ye(this, fo);
|
||
ye(this, _n);
|
||
ye(this, xt);
|
||
ye(this, ho);
|
||
// options that cannot be changed without disaster
|
||
ye(this, Rt, void 0);
|
||
ye(this, pt, void 0);
|
||
ye(this, kt, void 0);
|
||
ye(this, Dt, void 0);
|
||
ye(this, Vn, void 0);
|
||
ye(this, Pn, void 0);
|
||
/**
|
||
* {@link LRUCache.OptionsBase.ttl}
|
||
*/
|
||
ie(this, "ttl");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.ttlResolution}
|
||
*/
|
||
ie(this, "ttlResolution");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.ttlAutopurge}
|
||
*/
|
||
ie(this, "ttlAutopurge");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.updateAgeOnGet}
|
||
*/
|
||
ie(this, "updateAgeOnGet");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.updateAgeOnHas}
|
||
*/
|
||
ie(this, "updateAgeOnHas");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.allowStale}
|
||
*/
|
||
ie(this, "allowStale");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.noDisposeOnSet}
|
||
*/
|
||
ie(this, "noDisposeOnSet");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.noUpdateTTL}
|
||
*/
|
||
ie(this, "noUpdateTTL");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.maxEntrySize}
|
||
*/
|
||
ie(this, "maxEntrySize");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.sizeCalculation}
|
||
*/
|
||
ie(this, "sizeCalculation");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}
|
||
*/
|
||
ie(this, "noDeleteOnFetchRejection");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.noDeleteOnStaleGet}
|
||
*/
|
||
ie(this, "noDeleteOnStaleGet");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}
|
||
*/
|
||
ie(this, "allowStaleOnFetchAbort");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}
|
||
*/
|
||
ie(this, "allowStaleOnFetchRejection");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.ignoreFetchAbort}
|
||
*/
|
||
ie(this, "ignoreFetchAbort");
|
||
// computed properties
|
||
ye(this, Ue, void 0);
|
||
ye(this, Ot, void 0);
|
||
ye(this, He, void 0);
|
||
ye(this, Ve, void 0);
|
||
ye(this, we, void 0);
|
||
ye(this, lt, void 0);
|
||
ye(this, gt, void 0);
|
||
ye(this, nt, void 0);
|
||
ye(this, Xe, void 0);
|
||
ye(this, Et, void 0);
|
||
ye(this, Je, void 0);
|
||
ye(this, Tt, void 0);
|
||
ye(this, $t, void 0);
|
||
ye(this, vt, void 0);
|
||
ye(this, At, void 0);
|
||
ye(this, rn, void 0);
|
||
ye(this, st, void 0);
|
||
// conditionally set private methods related to TTL
|
||
ye(this, yn, () => {
|
||
});
|
||
ye(this, Wt, () => {
|
||
});
|
||
ye(this, so, () => {
|
||
});
|
||
/* c8 ignore stop */
|
||
ye(this, bt, () => !1);
|
||
ye(this, wn, (t) => {
|
||
});
|
||
ye(this, Mn, (t, n, o) => {
|
||
});
|
||
ye(this, uo, (t, n, o, r) => {
|
||
if (o || r)
|
||
throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");
|
||
return 0;
|
||
});
|
||
/**
|
||
* A String value that is used in the creation of the default string
|
||
* description of an object. Called by the built-in method
|
||
* `Object.prototype.toString`.
|
||
*/
|
||
ie(this, pp, "LRUCache");
|
||
const { max: n = 0, ttl: o, ttlResolution: r = 1, ttlAutopurge: a, updateAgeOnGet: i, updateAgeOnHas: l, allowStale: s, dispose: u, disposeAfter: c, noDisposeOnSet: d, noUpdateTTL: f, maxSize: h = 0, maxEntrySize: g = 0, sizeCalculation: m, fetchMethod: y, memoMethod: v, noDeleteOnFetchRejection: F, noDeleteOnStaleGet: R, allowStaleOnFetchRejection: k, allowStaleOnFetchAbort: j, ignoreFetchAbort: A } = t;
|
||
if (n !== 0 && !Qt(n))
|
||
throw new TypeError("max option must be a nonnegative integer");
|
||
const T = n ? yi(n) : Array;
|
||
if (!T)
|
||
throw new Error("invalid max value: " + n);
|
||
if (fe(this, Rt, n), fe(this, pt, h), this.maxEntrySize = g || p(this, pt), this.sizeCalculation = m, this.sizeCalculation) {
|
||
if (!p(this, pt) && !this.maxEntrySize)
|
||
throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");
|
||
if (typeof this.sizeCalculation != "function")
|
||
throw new TypeError("sizeCalculation set to non-function");
|
||
}
|
||
if (v !== void 0 && typeof v != "function")
|
||
throw new TypeError("memoMethod must be a function if defined");
|
||
if (fe(this, Pn, v), y !== void 0 && typeof y != "function")
|
||
throw new TypeError("fetchMethod must be a function if specified");
|
||
if (fe(this, Vn, y), fe(this, rn, !!y), fe(this, He, /* @__PURE__ */ new Map()), fe(this, Ve, new Array(n).fill(void 0)), fe(this, we, new Array(n).fill(void 0)), fe(this, lt, new T(n)), fe(this, gt, new T(n)), fe(this, nt, 0), fe(this, Xe, 0), fe(this, Et, Dr.create(n)), fe(this, Ue, 0), fe(this, Ot, 0), typeof u == "function" && fe(this, kt, u), typeof c == "function" ? (fe(this, Dt, c), fe(this, Je, [])) : (fe(this, Dt, void 0), fe(this, Je, void 0)), fe(this, At, !!p(this, kt)), fe(this, st, !!p(this, Dt)), this.noDisposeOnSet = !!d, this.noUpdateTTL = !!f, this.noDeleteOnFetchRejection = !!F, this.allowStaleOnFetchRejection = !!k, this.allowStaleOnFetchAbort = !!j, this.ignoreFetchAbort = !!A, this.maxEntrySize !== 0) {
|
||
if (p(this, pt) !== 0 && !Qt(p(this, pt)))
|
||
throw new TypeError("maxSize must be a positive integer if specified");
|
||
if (!Qt(this.maxEntrySize))
|
||
throw new TypeError("maxEntrySize must be a positive integer if specified");
|
||
ne(this, Xo, wi).call(this);
|
||
}
|
||
if (this.allowStale = !!s, this.noDeleteOnStaleGet = !!R, this.updateAgeOnGet = !!i, this.updateAgeOnHas = !!l, this.ttlResolution = Qt(r) || r === 0 ? r : 1, this.ttlAutopurge = !!a, this.ttl = o || 0, this.ttl) {
|
||
if (!Qt(this.ttl))
|
||
throw new TypeError("ttl must be a positive integer if specified");
|
||
ne(this, lo, Er).call(this);
|
||
}
|
||
if (p(this, Rt) === 0 && this.ttl === 0 && p(this, pt) === 0)
|
||
throw new TypeError("At least one of max, maxSize, or ttl is required");
|
||
if (!this.ttlAutopurge && !p(this, Rt) && !p(this, pt)) {
|
||
const q = "LRU_CACHE_UNBOUNDED";
|
||
Au(q) && (vi.add(q), bi("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.", "UnboundedCacheWarning", q, la));
|
||
}
|
||
}
|
||
/**
|
||
* Do not call this method unless you need to inspect the
|
||
* inner workings of the cache. If anything returned by this
|
||
* object is modified in any way, strange breakage may occur.
|
||
*
|
||
* These fields are private for a reason!
|
||
*
|
||
* @internal
|
||
*/
|
||
static unsafeExposeInternals(t) {
|
||
return {
|
||
// properties
|
||
starts: p(t, $t),
|
||
ttls: p(t, vt),
|
||
sizes: p(t, Tt),
|
||
keyMap: p(t, He),
|
||
keyList: p(t, Ve),
|
||
valList: p(t, we),
|
||
next: p(t, lt),
|
||
prev: p(t, gt),
|
||
get head() {
|
||
return p(t, nt);
|
||
},
|
||
get tail() {
|
||
return p(t, Xe);
|
||
},
|
||
free: p(t, Et),
|
||
// methods
|
||
isBackgroundFetch: (n) => {
|
||
var o;
|
||
return ne(o = t, Ae, Ie).call(o, n);
|
||
},
|
||
backgroundFetch: (n, o, r, a) => {
|
||
var i;
|
||
return ne(i = t, jn, To).call(i, n, o, r, a);
|
||
},
|
||
moveToTail: (n) => {
|
||
var o;
|
||
return ne(o = t, _n, Un).call(o, n);
|
||
},
|
||
indexes: (n) => {
|
||
var o;
|
||
return ne(o = t, Bt, Zt).call(o, n);
|
||
},
|
||
rindexes: (n) => {
|
||
var o;
|
||
return ne(o = t, jt, en).call(o, n);
|
||
},
|
||
isStale: (n) => {
|
||
var o;
|
||
return p(o = t, bt).call(o, n);
|
||
}
|
||
};
|
||
}
|
||
// Protected read-only members
|
||
/**
|
||
* {@link LRUCache.OptionsBase.max} (read-only)
|
||
*/
|
||
get max() {
|
||
return p(this, Rt);
|
||
}
|
||
/**
|
||
* {@link LRUCache.OptionsBase.maxSize} (read-only)
|
||
*/
|
||
get maxSize() {
|
||
return p(this, pt);
|
||
}
|
||
/**
|
||
* The total computed size of items in the cache (read-only)
|
||
*/
|
||
get calculatedSize() {
|
||
return p(this, Ot);
|
||
}
|
||
/**
|
||
* The number of items stored in the cache (read-only)
|
||
*/
|
||
get size() {
|
||
return p(this, Ue);
|
||
}
|
||
/**
|
||
* {@link LRUCache.OptionsBase.fetchMethod} (read-only)
|
||
*/
|
||
get fetchMethod() {
|
||
return p(this, Vn);
|
||
}
|
||
get memoMethod() {
|
||
return p(this, Pn);
|
||
}
|
||
/**
|
||
* {@link LRUCache.OptionsBase.dispose} (read-only)
|
||
*/
|
||
get dispose() {
|
||
return p(this, kt);
|
||
}
|
||
/**
|
||
* {@link LRUCache.OptionsBase.disposeAfter} (read-only)
|
||
*/
|
||
get disposeAfter() {
|
||
return p(this, Dt);
|
||
}
|
||
/**
|
||
* Return the number of ms left in the item's TTL. If item is not in cache,
|
||
* returns `0`. Returns `Infinity` if item is in cache without a defined TTL.
|
||
*/
|
||
getRemainingTTL(t) {
|
||
return p(this, He).has(t) ? 1 / 0 : 0;
|
||
}
|
||
/**
|
||
* Return a generator yielding `[key, value]` pairs,
|
||
* in order from most recently used to least recently used.
|
||
*/
|
||
*entries() {
|
||
for (const t of ne(this, Bt, Zt).call(this))
|
||
p(this, we)[t] !== void 0 && p(this, Ve)[t] !== void 0 && !ne(this, Ae, Ie).call(this, p(this, we)[t]) && (yield [p(this, Ve)[t], p(this, we)[t]]);
|
||
}
|
||
/**
|
||
* Inverse order version of {@link LRUCache.entries}
|
||
*
|
||
* Return a generator yielding `[key, value]` pairs,
|
||
* in order from least recently used to most recently used.
|
||
*/
|
||
*rentries() {
|
||
for (const t of ne(this, jt, en).call(this))
|
||
p(this, we)[t] !== void 0 && p(this, Ve)[t] !== void 0 && !ne(this, Ae, Ie).call(this, p(this, we)[t]) && (yield [p(this, Ve)[t], p(this, we)[t]]);
|
||
}
|
||
/**
|
||
* Return a generator yielding the keys in the cache,
|
||
* in order from most recently used to least recently used.
|
||
*/
|
||
*keys() {
|
||
for (const t of ne(this, Bt, Zt).call(this)) {
|
||
const n = p(this, Ve)[t];
|
||
n !== void 0 && !ne(this, Ae, Ie).call(this, p(this, we)[t]) && (yield n);
|
||
}
|
||
}
|
||
/**
|
||
* Inverse order version of {@link LRUCache.keys}
|
||
*
|
||
* Return a generator yielding the keys in the cache,
|
||
* in order from least recently used to most recently used.
|
||
*/
|
||
*rkeys() {
|
||
for (const t of ne(this, jt, en).call(this)) {
|
||
const n = p(this, Ve)[t];
|
||
n !== void 0 && !ne(this, Ae, Ie).call(this, p(this, we)[t]) && (yield n);
|
||
}
|
||
}
|
||
/**
|
||
* Return a generator yielding the values in the cache,
|
||
* in order from most recently used to least recently used.
|
||
*/
|
||
*values() {
|
||
for (const t of ne(this, Bt, Zt).call(this))
|
||
p(this, we)[t] !== void 0 && !ne(this, Ae, Ie).call(this, p(this, we)[t]) && (yield p(this, we)[t]);
|
||
}
|
||
/**
|
||
* Inverse order version of {@link LRUCache.values}
|
||
*
|
||
* Return a generator yielding the values in the cache,
|
||
* in order from least recently used to most recently used.
|
||
*/
|
||
*rvalues() {
|
||
for (const t of ne(this, jt, en).call(this))
|
||
p(this, we)[t] !== void 0 && !ne(this, Ae, Ie).call(this, p(this, we)[t]) && (yield p(this, we)[t]);
|
||
}
|
||
/**
|
||
* Iterating over the cache itself yields the same results as
|
||
* {@link LRUCache.entries}
|
||
*/
|
||
[Symbol.iterator]() {
|
||
return this.entries();
|
||
}
|
||
/**
|
||
* Find a value for which the supplied fn method returns a truthy value,
|
||
* similar to `Array.find()`. fn is called as `fn(value, key, cache)`.
|
||
*/
|
||
find(t, n = {}) {
|
||
for (const o of ne(this, Bt, Zt).call(this)) {
|
||
const r = p(this, we)[o], a = ne(this, Ae, Ie).call(this, r) ? r.__staleWhileFetching : r;
|
||
if (a !== void 0 && t(a, p(this, Ve)[o], this))
|
||
return this.get(p(this, Ve)[o], n);
|
||
}
|
||
}
|
||
/**
|
||
* Call the supplied function on each item in the cache, in order from most
|
||
* recently used to least recently used.
|
||
*
|
||
* `fn` is called as `fn(value, key, cache)`.
|
||
*
|
||
* If `thisp` is provided, function will be called in the `this`-context of
|
||
* the provided object, or the cache if no `thisp` object is provided.
|
||
*
|
||
* Does not update age or recenty of use, or iterate over stale values.
|
||
*/
|
||
forEach(t, n = this) {
|
||
for (const o of ne(this, Bt, Zt).call(this)) {
|
||
const r = p(this, we)[o], a = ne(this, Ae, Ie).call(this, r) ? r.__staleWhileFetching : r;
|
||
a !== void 0 && t.call(n, a, p(this, Ve)[o], this);
|
||
}
|
||
}
|
||
/**
|
||
* The same as {@link LRUCache.forEach} but items are iterated over in
|
||
* reverse order. (ie, less recently used items are iterated over first.)
|
||
*/
|
||
rforEach(t, n = this) {
|
||
for (const o of ne(this, jt, en).call(this)) {
|
||
const r = p(this, we)[o], a = ne(this, Ae, Ie).call(this, r) ? r.__staleWhileFetching : r;
|
||
a !== void 0 && t.call(n, a, p(this, Ve)[o], this);
|
||
}
|
||
}
|
||
/**
|
||
* Delete any stale entries. Returns true if anything was removed,
|
||
* false otherwise.
|
||
*/
|
||
purgeStale() {
|
||
let t = !1;
|
||
for (const n of ne(this, jt, en).call(this, { allowStale: !0 }))
|
||
p(this, bt).call(this, n) && (ne(this, xt, tn).call(this, p(this, Ve)[n], "expire"), t = !0);
|
||
return t;
|
||
}
|
||
/**
|
||
* Get the extended info about a given entry, to get its value, size, and
|
||
* TTL info simultaneously. Returns `undefined` if the key is not present.
|
||
*
|
||
* Unlike {@link LRUCache#dump}, which is designed to be portable and survive
|
||
* serialization, the `start` value is always the current timestamp, and the
|
||
* `ttl` is a calculated remaining time to live (negative if expired).
|
||
*
|
||
* Always returns stale values, if their info is found in the cache, so be
|
||
* sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})
|
||
* if relevant.
|
||
*/
|
||
info(t) {
|
||
const n = p(this, He).get(t);
|
||
if (n === void 0)
|
||
return;
|
||
const o = p(this, we)[n], r = ne(this, Ae, Ie).call(this, o) ? o.__staleWhileFetching : o;
|
||
if (r === void 0)
|
||
return;
|
||
const a = { value: r };
|
||
if (p(this, vt) && p(this, $t)) {
|
||
const i = p(this, vt)[n], l = p(this, $t)[n];
|
||
if (i && l) {
|
||
const s = i - (Rn.now() - l);
|
||
a.ttl = s, a.start = Date.now();
|
||
}
|
||
}
|
||
return p(this, Tt) && (a.size = p(this, Tt)[n]), a;
|
||
}
|
||
/**
|
||
* Return an array of [key, {@link LRUCache.Entry}] tuples which can be
|
||
* passed to {@link LRLUCache#load}.
|
||
*
|
||
* The `start` fields are calculated relative to a portable `Date.now()`
|
||
* timestamp, even if `performance.now()` is available.
|
||
*
|
||
* Stale entries are always included in the `dump`, even if
|
||
* {@link LRUCache.OptionsBase.allowStale} is false.
|
||
*
|
||
* Note: this returns an actual array, not a generator, so it can be more
|
||
* easily passed around.
|
||
*/
|
||
dump() {
|
||
const t = [];
|
||
for (const n of ne(this, Bt, Zt).call(this, { allowStale: !0 })) {
|
||
const o = p(this, Ve)[n], r = p(this, we)[n], a = ne(this, Ae, Ie).call(this, r) ? r.__staleWhileFetching : r;
|
||
if (a === void 0 || o === void 0)
|
||
continue;
|
||
const i = { value: a };
|
||
if (p(this, vt) && p(this, $t)) {
|
||
i.ttl = p(this, vt)[n];
|
||
const l = Rn.now() - p(this, $t)[n];
|
||
i.start = Math.floor(Date.now() - l);
|
||
}
|
||
p(this, Tt) && (i.size = p(this, Tt)[n]), t.unshift([o, i]);
|
||
}
|
||
return t;
|
||
}
|
||
/**
|
||
* Reset the cache and load in the items in entries in the order listed.
|
||
*
|
||
* The shape of the resulting cache may be different if the same options are
|
||
* not used in both caches.
|
||
*
|
||
* The `start` fields are assumed to be calculated relative to a portable
|
||
* `Date.now()` timestamp, even if `performance.now()` is available.
|
||
*/
|
||
load(t) {
|
||
this.clear();
|
||
for (const [n, o] of t) {
|
||
if (o.start) {
|
||
const r = Date.now() - o.start;
|
||
o.start = Rn.now() - r;
|
||
}
|
||
this.set(n, o.value, o);
|
||
}
|
||
}
|
||
/**
|
||
* Add a value to the cache.
|
||
*
|
||
* Note: if `undefined` is specified as a value, this is an alias for
|
||
* {@link LRUCache#delete}
|
||
*
|
||
* Fields on the {@link LRUCache.SetOptions} options param will override
|
||
* their corresponding values in the constructor options for the scope
|
||
* of this single `set()` operation.
|
||
*
|
||
* If `start` is provided, then that will set the effective start
|
||
* time for the TTL calculation. Note that this must be a previous
|
||
* value of `performance.now()` if supported, or a previous value of
|
||
* `Date.now()` if not.
|
||
*
|
||
* Options object may also include `size`, which will prevent
|
||
* calling the `sizeCalculation` function and just use the specified
|
||
* number if it is a positive integer, and `noDisposeOnSet` which
|
||
* will prevent calling a `dispose` function in the case of
|
||
* overwrites.
|
||
*
|
||
* If the `size` (or return value of `sizeCalculation`) for a given
|
||
* entry is greater than `maxEntrySize`, then the item will not be
|
||
* added to the cache.
|
||
*
|
||
* Will update the recency of the entry.
|
||
*
|
||
* If the value is `undefined`, then this is an alias for
|
||
* `cache.delete(key)`. `undefined` is never stored in the cache.
|
||
*/
|
||
set(t, n, o = {}) {
|
||
var f, h, g, m, y;
|
||
if (n === void 0)
|
||
return this.delete(t), this;
|
||
const { ttl: r = this.ttl, start: a, noDisposeOnSet: i = this.noDisposeOnSet, sizeCalculation: l = this.sizeCalculation, status: s } = o;
|
||
let { noUpdateTTL: u = this.noUpdateTTL } = o;
|
||
const c = p(this, uo).call(this, t, n, o.size || 0, l);
|
||
if (this.maxEntrySize && c > this.maxEntrySize)
|
||
return s && (s.set = "miss", s.maxEntrySizeExceeded = !0), ne(this, xt, tn).call(this, t, "set"), this;
|
||
let d = p(this, Ue) === 0 ? void 0 : p(this, He).get(t);
|
||
if (d === void 0)
|
||
d = p(this, Ue) === 0 ? p(this, Xe) : p(this, Et).length !== 0 ? p(this, Et).pop() : p(this, Ue) === p(this, Rt) ? ne(this, Bn, Eo).call(this, !1) : p(this, Ue), p(this, Ve)[d] = t, p(this, we)[d] = n, p(this, He).set(t, d), p(this, lt)[p(this, Xe)] = d, p(this, gt)[d] = p(this, Xe), fe(this, Xe, d), yo(this, Ue)._++, p(this, Mn).call(this, d, c, s), s && (s.set = "add"), u = !1;
|
||
else {
|
||
ne(this, _n, Un).call(this, d);
|
||
const v = p(this, we)[d];
|
||
if (n !== v) {
|
||
if (p(this, rn) && ne(this, Ae, Ie).call(this, v)) {
|
||
v.__abortController.abort(new Error("replaced"));
|
||
const { __staleWhileFetching: F } = v;
|
||
F !== void 0 && !i && (p(this, At) && ((f = p(this, kt)) == null || f.call(this, F, t, "set")), p(this, st) && ((h = p(this, Je)) == null || h.push([F, t, "set"])));
|
||
} else
|
||
i || (p(this, At) && ((g = p(this, kt)) == null || g.call(this, v, t, "set")), p(this, st) && ((m = p(this, Je)) == null || m.push([v, t, "set"])));
|
||
if (p(this, wn).call(this, d), p(this, Mn).call(this, d, c, s), p(this, we)[d] = n, s) {
|
||
s.set = "replace";
|
||
const F = v && ne(this, Ae, Ie).call(this, v) ? v.__staleWhileFetching : v;
|
||
F !== void 0 && (s.oldValue = F);
|
||
}
|
||
} else
|
||
s && (s.set = "update");
|
||
}
|
||
if (r !== 0 && !p(this, vt) && ne(this, lo, Er).call(this), p(this, vt) && (u || p(this, so).call(this, d, r, a), s && p(this, Wt).call(this, s, d)), !i && p(this, st) && p(this, Je)) {
|
||
const v = p(this, Je);
|
||
let F;
|
||
for (; F = v == null ? void 0 : v.shift(); )
|
||
(y = p(this, Dt)) == null || y.call(this, ...F);
|
||
}
|
||
return this;
|
||
}
|
||
/**
|
||
* Evict the least recently used item, returning its value or
|
||
* `undefined` if cache is empty.
|
||
*/
|
||
pop() {
|
||
var t;
|
||
try {
|
||
for (; p(this, Ue); ) {
|
||
const n = p(this, we)[p(this, nt)];
|
||
if (ne(this, Bn, Eo).call(this, !0), ne(this, Ae, Ie).call(this, n)) {
|
||
if (n.__staleWhileFetching)
|
||
return n.__staleWhileFetching;
|
||
} else if (n !== void 0)
|
||
return n;
|
||
}
|
||
} finally {
|
||
if (p(this, st) && p(this, Je)) {
|
||
const n = p(this, Je);
|
||
let o;
|
||
for (; o = n == null ? void 0 : n.shift(); )
|
||
(t = p(this, Dt)) == null || t.call(this, ...o);
|
||
}
|
||
}
|
||
}
|
||
/**
|
||
* Check if a key is in the cache, without updating the recency of use.
|
||
* Will return false if the item is stale, even though it is technically
|
||
* in the cache.
|
||
*
|
||
* Check if a key is in the cache, without updating the recency of
|
||
* use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set
|
||
* to `true` in either the options or the constructor.
|
||
*
|
||
* Will return `false` if the item is stale, even though it is technically in
|
||
* the cache. The difference can be determined (if it matters) by using a
|
||
* `status` argument, and inspecting the `has` field.
|
||
*
|
||
* Will not update item age unless
|
||
* {@link LRUCache.OptionsBase.updateAgeOnHas} is set.
|
||
*/
|
||
has(t, n = {}) {
|
||
const { updateAgeOnHas: o = this.updateAgeOnHas, status: r } = n, a = p(this, He).get(t);
|
||
if (a !== void 0) {
|
||
const i = p(this, we)[a];
|
||
if (ne(this, Ae, Ie).call(this, i) && i.__staleWhileFetching === void 0)
|
||
return !1;
|
||
if (p(this, bt).call(this, a))
|
||
r && (r.has = "stale", p(this, Wt).call(this, r, a));
|
||
else
|
||
return o && p(this, yn).call(this, a), r && (r.has = "hit", p(this, Wt).call(this, r, a)), !0;
|
||
} else
|
||
r && (r.has = "miss");
|
||
return !1;
|
||
}
|
||
/**
|
||
* Like {@link LRUCache#get} but doesn't update recency or delete stale
|
||
* items.
|
||
*
|
||
* Returns `undefined` if the item is stale, unless
|
||
* {@link LRUCache.OptionsBase.allowStale} is set.
|
||
*/
|
||
peek(t, n = {}) {
|
||
const { allowStale: o = this.allowStale } = n, r = p(this, He).get(t);
|
||
if (r === void 0 || !o && p(this, bt).call(this, r))
|
||
return;
|
||
const a = p(this, we)[r];
|
||
return ne(this, Ae, Ie).call(this, a) ? a.__staleWhileFetching : a;
|
||
}
|
||
async fetch(t, n = {}) {
|
||
const {
|
||
// get options
|
||
allowStale: o = this.allowStale,
|
||
updateAgeOnGet: r = this.updateAgeOnGet,
|
||
noDeleteOnStaleGet: a = this.noDeleteOnStaleGet,
|
||
// set options
|
||
ttl: i = this.ttl,
|
||
noDisposeOnSet: l = this.noDisposeOnSet,
|
||
size: s = 0,
|
||
sizeCalculation: u = this.sizeCalculation,
|
||
noUpdateTTL: c = this.noUpdateTTL,
|
||
// fetch exclusive options
|
||
noDeleteOnFetchRejection: d = this.noDeleteOnFetchRejection,
|
||
allowStaleOnFetchRejection: f = this.allowStaleOnFetchRejection,
|
||
ignoreFetchAbort: h = this.ignoreFetchAbort,
|
||
allowStaleOnFetchAbort: g = this.allowStaleOnFetchAbort,
|
||
context: m,
|
||
forceRefresh: y = !1,
|
||
status: v,
|
||
signal: F
|
||
} = n;
|
||
if (!p(this, rn))
|
||
return v && (v.fetch = "get"), this.get(t, {
|
||
allowStale: o,
|
||
updateAgeOnGet: r,
|
||
noDeleteOnStaleGet: a,
|
||
status: v
|
||
});
|
||
const R = {
|
||
allowStale: o,
|
||
updateAgeOnGet: r,
|
||
noDeleteOnStaleGet: a,
|
||
ttl: i,
|
||
noDisposeOnSet: l,
|
||
size: s,
|
||
sizeCalculation: u,
|
||
noUpdateTTL: c,
|
||
noDeleteOnFetchRejection: d,
|
||
allowStaleOnFetchRejection: f,
|
||
allowStaleOnFetchAbort: g,
|
||
ignoreFetchAbort: h,
|
||
status: v,
|
||
signal: F
|
||
};
|
||
let k = p(this, He).get(t);
|
||
if (k === void 0) {
|
||
v && (v.fetch = "miss");
|
||
const j = ne(this, jn, To).call(this, t, k, R, m);
|
||
return j.__returned = j;
|
||
} else {
|
||
const j = p(this, we)[k];
|
||
if (ne(this, Ae, Ie).call(this, j)) {
|
||
const Y = o && j.__staleWhileFetching !== void 0;
|
||
return v && (v.fetch = "inflight", Y && (v.returnedStale = !0)), Y ? j.__staleWhileFetching : j.__returned = j;
|
||
}
|
||
const A = p(this, bt).call(this, k);
|
||
if (!y && !A)
|
||
return v && (v.fetch = "hit"), ne(this, _n, Un).call(this, k), r && p(this, yn).call(this, k), v && p(this, Wt).call(this, v, k), j;
|
||
const T = ne(this, jn, To).call(this, t, k, R, m), D = T.__staleWhileFetching !== void 0 && o;
|
||
return v && (v.fetch = A ? "stale" : "refresh", D && A && (v.returnedStale = !0)), D ? T.__staleWhileFetching : T.__returned = T;
|
||
}
|
||
}
|
||
async forceFetch(t, n = {}) {
|
||
const o = await this.fetch(t, n);
|
||
if (o === void 0)
|
||
throw new Error("fetch() returned undefined");
|
||
return o;
|
||
}
|
||
memo(t, n = {}) {
|
||
const o = p(this, Pn);
|
||
if (!o)
|
||
throw new Error("no memoMethod provided to constructor");
|
||
const { context: r, forceRefresh: a, ...i } = n, l = this.get(t, i);
|
||
if (!a && l !== void 0)
|
||
return l;
|
||
const s = o(t, l, {
|
||
options: i,
|
||
context: r
|
||
});
|
||
return this.set(t, s, i), s;
|
||
}
|
||
/**
|
||
* Return a value from the cache. Will update the recency of the cache
|
||
* entry found.
|
||
*
|
||
* If the key is not found, get() will return `undefined`.
|
||
*/
|
||
get(t, n = {}) {
|
||
const { allowStale: o = this.allowStale, updateAgeOnGet: r = this.updateAgeOnGet, noDeleteOnStaleGet: a = this.noDeleteOnStaleGet, status: i } = n, l = p(this, He).get(t);
|
||
if (l !== void 0) {
|
||
const s = p(this, we)[l], u = ne(this, Ae, Ie).call(this, s);
|
||
return i && p(this, Wt).call(this, i, l), p(this, bt).call(this, l) ? (i && (i.get = "stale"), u ? (i && o && s.__staleWhileFetching !== void 0 && (i.returnedStale = !0), o ? s.__staleWhileFetching : void 0) : (a || ne(this, xt, tn).call(this, t, "expire"), i && o && (i.returnedStale = !0), o ? s : void 0)) : (i && (i.get = "hit"), u ? s.__staleWhileFetching : (ne(this, _n, Un).call(this, l), r && p(this, yn).call(this, l), s));
|
||
} else
|
||
i && (i.get = "miss");
|
||
}
|
||
/**
|
||
* Deletes a key out of the cache.
|
||
*
|
||
* Returns true if the key was deleted, false otherwise.
|
||
*/
|
||
delete(t) {
|
||
return ne(this, xt, tn).call(this, t, "delete");
|
||
}
|
||
/**
|
||
* Clear the cache entirely, throwing away all values.
|
||
*/
|
||
clear() {
|
||
return ne(this, ho, Ar).call(this, "delete");
|
||
}
|
||
};
|
||
pp = Symbol.toStringTag, Rt = new WeakMap(), pt = new WeakMap(), kt = new WeakMap(), Dt = new WeakMap(), Vn = new WeakMap(), Pn = new WeakMap(), Ue = new WeakMap(), Ot = new WeakMap(), He = new WeakMap(), Ve = new WeakMap(), we = new WeakMap(), lt = new WeakMap(), gt = new WeakMap(), nt = new WeakMap(), Xe = new WeakMap(), Et = new WeakMap(), Je = new WeakMap(), Tt = new WeakMap(), $t = new WeakMap(), vt = new WeakMap(), At = new WeakMap(), rn = new WeakMap(), st = new WeakMap(), lo = new WeakSet(), Er = function() {
|
||
const t = new Oo(p(this, Rt)), n = new Oo(p(this, Rt));
|
||
fe(this, vt, t), fe(this, $t, n), fe(this, so, (a, i, l = Rn.now()) => {
|
||
if (n[a] = i !== 0 ? l : 0, t[a] = i, i !== 0 && this.ttlAutopurge) {
|
||
const s = setTimeout(() => {
|
||
p(this, bt).call(this, a) && ne(this, xt, tn).call(this, p(this, Ve)[a], "expire");
|
||
}, i + 1);
|
||
s.unref && s.unref();
|
||
}
|
||
}), fe(this, yn, (a) => {
|
||
n[a] = t[a] !== 0 ? Rn.now() : 0;
|
||
}), fe(this, Wt, (a, i) => {
|
||
if (t[i]) {
|
||
const l = t[i], s = n[i];
|
||
if (!l || !s)
|
||
return;
|
||
a.ttl = l, a.start = s, a.now = o || r();
|
||
const u = a.now - s;
|
||
a.remainingTTL = l - u;
|
||
}
|
||
});
|
||
let o = 0;
|
||
const r = () => {
|
||
const a = Rn.now();
|
||
if (this.ttlResolution > 0) {
|
||
o = a;
|
||
const i = setTimeout(() => o = 0, this.ttlResolution);
|
||
i.unref && i.unref();
|
||
}
|
||
return a;
|
||
};
|
||
this.getRemainingTTL = (a) => {
|
||
const i = p(this, He).get(a);
|
||
if (i === void 0)
|
||
return 0;
|
||
const l = t[i], s = n[i];
|
||
if (!l || !s)
|
||
return 1 / 0;
|
||
const u = (o || r()) - s;
|
||
return l - u;
|
||
}, fe(this, bt, (a) => {
|
||
const i = n[a], l = t[a];
|
||
return !!l && !!i && (o || r()) - i > l;
|
||
});
|
||
}, yn = new WeakMap(), Wt = new WeakMap(), so = new WeakMap(), bt = new WeakMap(), Xo = new WeakSet(), wi = function() {
|
||
const t = new Oo(p(this, Rt));
|
||
fe(this, Ot, 0), fe(this, Tt, t), fe(this, wn, (n) => {
|
||
fe(this, Ot, p(this, Ot) - t[n]), t[n] = 0;
|
||
}), fe(this, uo, (n, o, r, a) => {
|
||
if (ne(this, Ae, Ie).call(this, o))
|
||
return 0;
|
||
if (!Qt(r))
|
||
if (a) {
|
||
if (typeof a != "function")
|
||
throw new TypeError("sizeCalculation must be a function");
|
||
if (r = a(o, n), !Qt(r))
|
||
throw new TypeError("sizeCalculation return invalid (expect positive integer)");
|
||
} else
|
||
throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");
|
||
return r;
|
||
}), fe(this, Mn, (n, o, r) => {
|
||
if (t[n] = o, p(this, pt)) {
|
||
const a = p(this, pt) - t[n];
|
||
for (; p(this, Ot) > a; )
|
||
ne(this, Bn, Eo).call(this, !0);
|
||
}
|
||
fe(this, Ot, p(this, Ot) + t[n]), r && (r.entrySize = o, r.totalCalculatedSize = p(this, Ot));
|
||
});
|
||
}, wn = new WeakMap(), Mn = new WeakMap(), uo = new WeakMap(), Bt = new WeakSet(), Zt = function* ({ allowStale: t = this.allowStale } = {}) {
|
||
if (p(this, Ue))
|
||
for (let n = p(this, Xe); !(!ne(this, co, Tr).call(this, n) || ((t || !p(this, bt).call(this, n)) && (yield n), n === p(this, nt))); )
|
||
n = p(this, gt)[n];
|
||
}, jt = new WeakSet(), en = function* ({ allowStale: t = this.allowStale } = {}) {
|
||
if (p(this, Ue))
|
||
for (let n = p(this, nt); !(!ne(this, co, Tr).call(this, n) || ((t || !p(this, bt).call(this, n)) && (yield n), n === p(this, Xe))); )
|
||
n = p(this, lt)[n];
|
||
}, co = new WeakSet(), Tr = function(t) {
|
||
return t !== void 0 && p(this, He).get(p(this, Ve)[t]) === t;
|
||
}, Bn = new WeakSet(), Eo = function(t) {
|
||
var a, i;
|
||
const n = p(this, nt), o = p(this, Ve)[n], r = p(this, we)[n];
|
||
return p(this, rn) && ne(this, Ae, Ie).call(this, r) ? r.__abortController.abort(new Error("evicted")) : (p(this, At) || p(this, st)) && (p(this, At) && ((a = p(this, kt)) == null || a.call(this, r, o, "evict")), p(this, st) && ((i = p(this, Je)) == null || i.push([r, o, "evict"]))), p(this, wn).call(this, n), t && (p(this, Ve)[n] = void 0, p(this, we)[n] = void 0, p(this, Et).push(n)), p(this, Ue) === 1 ? (fe(this, nt, fe(this, Xe, 0)), p(this, Et).length = 0) : fe(this, nt, p(this, lt)[n]), p(this, He).delete(o), yo(this, Ue)._--, n;
|
||
}, jn = new WeakSet(), To = function(t, n, o, r) {
|
||
const a = n === void 0 ? void 0 : p(this, we)[n];
|
||
if (ne(this, Ae, Ie).call(this, a))
|
||
return a;
|
||
const i = new qo(), { signal: l } = o;
|
||
l == null || l.addEventListener("abort", () => i.abort(l.reason), {
|
||
signal: i.signal
|
||
});
|
||
const s = {
|
||
signal: i.signal,
|
||
options: o,
|
||
context: r
|
||
}, u = (m, y = !1) => {
|
||
const { aborted: v } = i.signal, F = o.ignoreFetchAbort && m !== void 0;
|
||
if (o.status && (v && !y ? (o.status.fetchAborted = !0, o.status.fetchError = i.signal.reason, F && (o.status.fetchAbortIgnored = !0)) : o.status.fetchResolved = !0), v && !F && !y)
|
||
return d(i.signal.reason);
|
||
const R = h;
|
||
return p(this, we)[n] === h && (m === void 0 ? R.__staleWhileFetching ? p(this, we)[n] = R.__staleWhileFetching : ne(this, xt, tn).call(this, t, "fetch") : (o.status && (o.status.fetchUpdated = !0), this.set(t, m, s.options))), m;
|
||
}, c = (m) => (o.status && (o.status.fetchRejected = !0, o.status.fetchError = m), d(m)), d = (m) => {
|
||
const { aborted: y } = i.signal, v = y && o.allowStaleOnFetchAbort, F = v || o.allowStaleOnFetchRejection, R = F || o.noDeleteOnFetchRejection, k = h;
|
||
if (p(this, we)[n] === h && (!R || k.__staleWhileFetching === void 0 ? ne(this, xt, tn).call(this, t, "fetch") : v || (p(this, we)[n] = k.__staleWhileFetching)), F)
|
||
return o.status && k.__staleWhileFetching !== void 0 && (o.status.returnedStale = !0), k.__staleWhileFetching;
|
||
if (k.__returned === k)
|
||
throw m;
|
||
}, f = (m, y) => {
|
||
var F;
|
||
const v = (F = p(this, Vn)) == null ? void 0 : F.call(this, t, a, s);
|
||
v && v instanceof Promise && v.then((R) => m(R === void 0 ? void 0 : R), y), i.signal.addEventListener("abort", () => {
|
||
(!o.ignoreFetchAbort || o.allowStaleOnFetchAbort) && (m(void 0), o.allowStaleOnFetchAbort && (m = (R) => u(R, !0)));
|
||
});
|
||
};
|
||
o.status && (o.status.fetchDispatched = !0);
|
||
const h = new Promise(f).then(u, c), g = Object.assign(h, {
|
||
__abortController: i,
|
||
__staleWhileFetching: a,
|
||
__returned: void 0
|
||
});
|
||
return n === void 0 ? (this.set(t, g, { ...s.options, status: void 0 }), n = p(this, He).get(t)) : p(this, we)[n] = g, g;
|
||
}, Ae = new WeakSet(), Ie = function(t) {
|
||
if (!p(this, rn))
|
||
return !1;
|
||
const n = t;
|
||
return !!n && n instanceof Promise && n.hasOwnProperty("__staleWhileFetching") && n.__abortController instanceof qo;
|
||
}, fo = new WeakSet(), $r = function(t, n) {
|
||
p(this, gt)[n] = t, p(this, lt)[t] = n;
|
||
}, _n = new WeakSet(), Un = function(t) {
|
||
t !== p(this, Xe) && (t === p(this, nt) ? fe(this, nt, p(this, lt)[t]) : ne(this, fo, $r).call(this, p(this, gt)[t], p(this, lt)[t]), ne(this, fo, $r).call(this, p(this, Xe), t), fe(this, Xe, t));
|
||
}, xt = new WeakSet(), tn = function(t, n) {
|
||
var r, a, i, l;
|
||
let o = !1;
|
||
if (p(this, Ue) !== 0) {
|
||
const s = p(this, He).get(t);
|
||
if (s !== void 0)
|
||
if (o = !0, p(this, Ue) === 1)
|
||
ne(this, ho, Ar).call(this, n);
|
||
else {
|
||
p(this, wn).call(this, s);
|
||
const u = p(this, we)[s];
|
||
if (ne(this, Ae, Ie).call(this, u) ? u.__abortController.abort(new Error("deleted")) : (p(this, At) || p(this, st)) && (p(this, At) && ((r = p(this, kt)) == null || r.call(this, u, t, n)), p(this, st) && ((a = p(this, Je)) == null || a.push([u, t, n]))), p(this, He).delete(t), p(this, Ve)[s] = void 0, p(this, we)[s] = void 0, s === p(this, Xe))
|
||
fe(this, Xe, p(this, gt)[s]);
|
||
else if (s === p(this, nt))
|
||
fe(this, nt, p(this, lt)[s]);
|
||
else {
|
||
const c = p(this, gt)[s];
|
||
p(this, lt)[c] = p(this, lt)[s];
|
||
const d = p(this, lt)[s];
|
||
p(this, gt)[d] = p(this, gt)[s];
|
||
}
|
||
yo(this, Ue)._--, p(this, Et).push(s);
|
||
}
|
||
}
|
||
if (p(this, st) && ((i = p(this, Je)) != null && i.length)) {
|
||
const s = p(this, Je);
|
||
let u;
|
||
for (; u = s == null ? void 0 : s.shift(); )
|
||
(l = p(this, Dt)) == null || l.call(this, ...u);
|
||
}
|
||
return o;
|
||
}, ho = new WeakSet(), Ar = function(t) {
|
||
var n, o, r;
|
||
for (const a of ne(this, jt, en).call(this, { allowStale: !0 })) {
|
||
const i = p(this, we)[a];
|
||
if (ne(this, Ae, Ie).call(this, i))
|
||
i.__abortController.abort(new Error("deleted"));
|
||
else {
|
||
const l = p(this, Ve)[a];
|
||
p(this, At) && ((n = p(this, kt)) == null || n.call(this, i, l, t)), p(this, st) && ((o = p(this, Je)) == null || o.push([i, l, t]));
|
||
}
|
||
}
|
||
if (p(this, He).clear(), p(this, we).fill(void 0), p(this, Ve).fill(void 0), p(this, vt) && p(this, $t) && (p(this, vt).fill(0), p(this, $t).fill(0)), p(this, Tt) && p(this, Tt).fill(0), fe(this, nt, 0), fe(this, Xe, 0), p(this, Et).length = 0, fe(this, Ot, 0), fe(this, Ue, 0), p(this, st) && p(this, Je)) {
|
||
const a = p(this, Je);
|
||
let i;
|
||
for (; i = a == null ? void 0 : a.shift(); )
|
||
(r = p(this, Dt)) == null || r.call(this, ...i);
|
||
}
|
||
};
|
||
let Or = la;
|
||
const wo = new Or({
|
||
max: 500,
|
||
maxSize: 5e3,
|
||
ttl: 1e3 * 60 * 30,
|
||
sizeCalculation: (e, t) => 1
|
||
}), { UnMergeable: Iu } = Ee();
|
||
function Vu(e) {
|
||
_i = e;
|
||
}
|
||
let _i = async (e) => (ce.warn("请配置 app.use(FsCrud,{dictRequest:(context)=>{ 你的字典请求方法 }})"), []);
|
||
class Ci extends Iu {
|
||
//loadDict成功后的通知
|
||
constructor(n) {
|
||
super();
|
||
ie(this, "cache", !1);
|
||
// 获取到结果是否进行全局缓存
|
||
ie(this, "prototype", !1);
|
||
// 是否原型配置
|
||
ie(this, "immediate", !0);
|
||
//是否立即请求
|
||
ie(this, "url");
|
||
ie(this, "getData");
|
||
ie(this, "value", "value");
|
||
ie(this, "label", "label");
|
||
ie(this, "labelBuilder");
|
||
ie(this, "children", "children");
|
||
ie(this, "color", "color");
|
||
ie(this, "isTree", !1);
|
||
ie(this, "_data", null);
|
||
ie(this, "originalData");
|
||
ie(this, "dataMap", {});
|
||
ie(this, "loading", !1);
|
||
ie(this, "custom", {});
|
||
ie(this, "getNodesByValues");
|
||
ie(this, "onReady");
|
||
ie(this, "notifies", []);
|
||
ie(this, "_unfetchValues", {});
|
||
Object.defineProperty(this, "loading", {
|
||
value: !1,
|
||
enumerable: !1
|
||
}), Object.defineProperty(this, "notifies", {
|
||
value: !1,
|
||
enumerable: !1
|
||
}), Object.defineProperty(this, "originalData", {
|
||
value: null,
|
||
enumerable: !1
|
||
}), this.loading = !1, mo(this, n), n.data != null && (this.originalData = n.data, this.setData(n.data)), this.toMap();
|
||
}
|
||
get data() {
|
||
return this._data;
|
||
}
|
||
set data(n) {
|
||
this._data = n, this.toMap();
|
||
}
|
||
isDynamic() {
|
||
return this.url instanceof Function || this.getData instanceof Function || this.prototype;
|
||
}
|
||
setData(n) {
|
||
this.data = n;
|
||
}
|
||
/**
|
||
* 加载字典
|
||
*/
|
||
async _loadDict(n) {
|
||
if (this.data && !n.reload)
|
||
return this.data;
|
||
if (this.loading)
|
||
return this._registerNotify();
|
||
let o = null;
|
||
if (this.getNodesByValues) {
|
||
if (n.value) {
|
||
let r = null;
|
||
this.cache && this.url && (r = this.url + n.value);
|
||
let a = null;
|
||
if (r && (a = wo.get(r)), a)
|
||
o = a;
|
||
else {
|
||
const i = Array.isArray(n.value) ? n.value : [n.value];
|
||
if (o = await this.getNodesByValues(i, n), o != null && !(o instanceof Array)) {
|
||
ce.error("getNodesByValues需要返回数组,当前返回值:", o);
|
||
return;
|
||
}
|
||
r && wo.set(r, o);
|
||
}
|
||
}
|
||
} else if (this.originalData)
|
||
o = this.originalData;
|
||
else {
|
||
this.loading = !0;
|
||
try {
|
||
o = await this.getRemoteDictData(n);
|
||
} finally {
|
||
this.loading = !1;
|
||
}
|
||
}
|
||
this.data = o, this.onReady && this.onReady({ dict: this, ...n }), this._triggerNotify();
|
||
}
|
||
_triggerNotify() {
|
||
this.notifies && this.notifies.length > 0 && (J(this.notifies, (n) => {
|
||
n(this.data);
|
||
}), this.notifies.length = 0);
|
||
}
|
||
_registerNotify() {
|
||
let n = null;
|
||
const o = new Promise((r) => {
|
||
n = (a) => {
|
||
r(a);
|
||
};
|
||
});
|
||
return this.notifies || (this.notifies = []), this.notifies.push(n), o;
|
||
}
|
||
/**
|
||
* 加载字典
|
||
* @param context 当prototype=true时会传入
|
||
*/
|
||
async loadDict(n) {
|
||
return await this._loadDict({ ...n });
|
||
}
|
||
async reloadDict(n) {
|
||
return await this.loadDict({ ...n, reload: !0 });
|
||
}
|
||
/**
|
||
* 根据value获取nodes 追加数据
|
||
* @param values
|
||
*/
|
||
async appendByValues(n) {
|
||
if (this.getNodesByValues == null) {
|
||
ce.warn("请配置getNodesByValues");
|
||
return;
|
||
}
|
||
for (const r of n)
|
||
this.dataMap[r] || this._unfetchValues[r] || (this._unfetchValues[r] = {
|
||
loading: !1,
|
||
value: r
|
||
});
|
||
await Be(), await Be(), await Be();
|
||
const o = [];
|
||
if (J(this._unfetchValues, (r) => {
|
||
r.loading || (r.loading = !0, o.push(r.value));
|
||
}), o.length > 0) {
|
||
const r = await this.getNodesByValues(o);
|
||
this.setData([...this.data || [], ...r]);
|
||
for (const a of o)
|
||
delete this._unfetchValues[a];
|
||
return Object.keys(this._unfetchValues).length === 0 && this._triggerNotify(), this.data;
|
||
} else
|
||
return this._registerNotify();
|
||
}
|
||
clear() {
|
||
this.originalData = null, this.setData(null);
|
||
}
|
||
async getRemoteDictData(n) {
|
||
let o, r, a;
|
||
if (this.url && (a = this.url, a instanceof Function && (a = a({ ...n, dict: this })), r = a), this.getData != null)
|
||
o = async () => {
|
||
const i = await this.getData({ url: a, dict: this, ...n });
|
||
return Array.isArray(i) ? i : [];
|
||
};
|
||
else if (a)
|
||
o = async () => {
|
||
const i = await _i({ url: a, dict: this });
|
||
return Array.isArray(i) ? i : [];
|
||
};
|
||
else
|
||
return [];
|
||
if (this.cache && r) {
|
||
let i = wo.get(r);
|
||
if (i == null)
|
||
i = {
|
||
loaded: !1,
|
||
loading: !0,
|
||
data: void 0,
|
||
callback: []
|
||
}, wo.set(r, i);
|
||
else {
|
||
if (i.loaded)
|
||
return i.data;
|
||
if (i.loading)
|
||
return new Promise((l) => {
|
||
const s = (u) => {
|
||
l(u);
|
||
};
|
||
i.callback.push(s);
|
||
});
|
||
}
|
||
try {
|
||
i.loaded = !1, i.loading = !0;
|
||
let l = await o();
|
||
l = l || [], l instanceof Array || ce.warn("dict data 格式有误,期望格式为数组,实际格式为:", l), i.data = l, i.loaded = !0, i.loading = !1;
|
||
for (const s of i.callback)
|
||
s(l);
|
||
return i.callback = [], l;
|
||
} catch (l) {
|
||
i.loading = !1, i.loaded = !1, ce.error("load dict error:", l);
|
||
}
|
||
}
|
||
return await o();
|
||
}
|
||
toMap() {
|
||
if (this._data == null) {
|
||
this.dataMap = {};
|
||
return;
|
||
}
|
||
const n = {};
|
||
this.data && this.buildMap(n, this.data || []), this.dataMap = n;
|
||
}
|
||
buildMap(n, o) {
|
||
J(o, (r) => {
|
||
n[this.getValue(r)] = r, this.isTree && this.getChildren(r) && this.buildMap(n, this.getChildren(r));
|
||
});
|
||
}
|
||
getValue(n) {
|
||
return n[this.value];
|
||
}
|
||
getLabel(n) {
|
||
return this.labelBuilder ? this.labelBuilder(n) : n[this.label];
|
||
}
|
||
getChildren(n) {
|
||
return n[this.children];
|
||
}
|
||
getColor(n) {
|
||
return n[this.color];
|
||
}
|
||
getDictData() {
|
||
return this.data;
|
||
}
|
||
getDictMap() {
|
||
return this.dataMap;
|
||
}
|
||
getNodeByValue(n) {
|
||
return this.dataMap[n];
|
||
}
|
||
getNodesFromDataMap(n) {
|
||
if (n == null)
|
||
return [];
|
||
xo(n) || (n = [n]);
|
||
const o = [];
|
||
return J(n, (r) => {
|
||
const a = this.dataMap[r];
|
||
a ? o.push(a) : o.push({ [this.value]: r });
|
||
}), o;
|
||
}
|
||
}
|
||
function Pu(e) {
|
||
const t = jo(new Ci(e));
|
||
return !t.prototype && t.immediate && t.loadDict(), t;
|
||
}
|
||
function Mu() {
|
||
return {
|
||
dict: Pu,
|
||
setDictRequest: Vu,
|
||
Dict: Ci
|
||
};
|
||
}
|
||
function Ep() {
|
||
return {
|
||
addTypes: Tn.addTypes,
|
||
getType: Tn.getType,
|
||
getTypes: Tn.getTypes,
|
||
install: Tn.install
|
||
};
|
||
}
|
||
async function Bu(e) {
|
||
await Be();
|
||
const t = e.getModal();
|
||
if (t == null)
|
||
return;
|
||
const n = t.querySelector(".ant-modal-header");
|
||
if (n == null)
|
||
return;
|
||
const o = t, a = t.style;
|
||
n.style.cursor = "move", n.onmousedown = (i) => {
|
||
const l = i.clientX, s = i.clientY;
|
||
o.style.transform = "translate(0px, 0px)";
|
||
let u, c;
|
||
a.left.includes("%") ? (u = +document.body.clientWidth * (+a.left.replace(/%/g, "") / 100), c = +document.body.clientHeight * (+a.top.replace(/%/g, "") / 100)) : (u = +a.left.replace(/px/g, ""), c = +a.top.replace(/px/g, ""), c = c === 0 ? 100 : c), document.onmousemove = function(d) {
|
||
const f = d.clientX - l, h = d.clientY - s;
|
||
o.style.left = `${f + u}px`, o.style.top = `${h + c}px`;
|
||
}, document.onmouseup = function(d) {
|
||
document.onmousemove = null, document.onmouseup = null;
|
||
};
|
||
};
|
||
}
|
||
async function ju(e) {
|
||
await Be();
|
||
const t = e.getModal();
|
||
if (t == null)
|
||
return;
|
||
const n = t.querySelector(".n-card-header");
|
||
if (n == null)
|
||
return;
|
||
const o = t, a = t.style;
|
||
n.style.cursor = "move", n.onmousedown = (i) => {
|
||
const l = i.clientX, s = i.clientY;
|
||
o.style.transform = "translate(0px, 0px)";
|
||
let u, c;
|
||
a.left.includes("%") ? (u = +document.body.clientWidth * (+a.left.replace(/%/g, "") / 100), c = +document.body.clientHeight * (+a.top.replace(/%/g, "") / 100)) : (u = +a.left.replace(/px/g, ""), c = +a.top.replace(/px/g, "")), document.onmousemove = async function(d) {
|
||
if (d.clientX == 0 && d.clientY == 0)
|
||
return;
|
||
const f = d.clientX - l, h = d.clientY - s;
|
||
o.style.left = `${f + u}px`, o.style.top = `${h + c}px`;
|
||
}, document.onmouseup = function(d) {
|
||
document.onmousemove = null, document.onmouseup = null;
|
||
};
|
||
};
|
||
}
|
||
async function xu(e) {
|
||
const { ui: t } = Se();
|
||
t.type === "antdv" ? await Bu(e) : t.type === "element" || await ju(e);
|
||
}
|
||
function Nu() {
|
||
return {
|
||
dragModal: xu
|
||
};
|
||
}
|
||
const Lu = {
|
||
logger: {
|
||
off: {
|
||
tableColumns: !1
|
||
}
|
||
}
|
||
}, zu = ue({
|
||
name: "FsContainer",
|
||
props: {
|
||
/**
|
||
* 是否固定高度
|
||
*/
|
||
fixedHeight: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* body的样式
|
||
*/
|
||
bodyStyle: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
/**
|
||
* inner的样式
|
||
*/
|
||
innerStyle: {
|
||
type: Object,
|
||
default: () => ({})
|
||
}
|
||
},
|
||
setup(e, t) {
|
||
const { merge: n } = Ee(), o = V(() => e.fixedHeight === !1 ? n({ position: "relative" }, e.innerStyle) : e.innerStyle), r = V(() => e.fixedHeight === !1 ? n({ flex: "unset" }, e.bodyStyle) : e.bodyStyle);
|
||
return {
|
||
computedInnerStyle: o,
|
||
computedBodyStyle: r
|
||
};
|
||
}
|
||
});
|
||
const qu = { class: "fs-container" }, Hu = { class: "box" }, Wu = { class: "header" }, Uu = { class: "footer" };
|
||
function Ku(e, t, n, o, r, a) {
|
||
return b(), M("div", qu, [
|
||
oe("div", Hu, [
|
||
oe("div", {
|
||
class: "inner",
|
||
style: xn(e.computedInnerStyle)
|
||
}, [
|
||
oe("div", Wu, [
|
||
he(e.$slots, "header")
|
||
]),
|
||
oe("div", {
|
||
class: "body",
|
||
style: xn(e.computedBodyStyle)
|
||
}, [
|
||
he(e.$slots, "default")
|
||
], 4),
|
||
oe("div", Uu, [
|
||
he(e.$slots, "footer")
|
||
])
|
||
], 4)
|
||
]),
|
||
he(e.$slots, "box")
|
||
]);
|
||
}
|
||
const Yu = /* @__PURE__ */ $e(zu, [["render", Ku]]), Gu = ue({
|
||
name: "FsLayoutDefault"
|
||
});
|
||
const Xu = { class: "fs-crud-header" }, Ju = { class: "fs-header-top" }, Qu = { class: "fs-header-middle" }, Zu = { class: "fs-header-bottom" }, ec = { class: "fs-crud-footer" };
|
||
function tc(e, t, n, o, r, a) {
|
||
const i = Z("fs-container");
|
||
return b(), $(i, { class: "fs-layout-default" }, {
|
||
header: B(() => [
|
||
oe("div", Xu, [
|
||
oe("div", Ju, [
|
||
he(e.$slots, "header-top")
|
||
]),
|
||
he(e.$slots, "search"),
|
||
oe("div", Qu, [
|
||
he(e.$slots, "header-middle")
|
||
]),
|
||
he(e.$slots, "actionbar"),
|
||
he(e.$slots, "toolbar"),
|
||
oe("div", Zu, [
|
||
he(e.$slots, "header-bottom")
|
||
]),
|
||
he(e.$slots, "tabs")
|
||
])
|
||
]),
|
||
footer: B(() => [
|
||
oe("div", ec, [
|
||
he(e.$slots, "footer-top"),
|
||
he(e.$slots, "pagination"),
|
||
he(e.$slots, "footer-bottom")
|
||
])
|
||
]),
|
||
default: B(() => [
|
||
he(e.$slots, "default"),
|
||
he(e.$slots, "table"),
|
||
he(e.$slots, "form")
|
||
]),
|
||
_: 3
|
||
});
|
||
}
|
||
const nc = /* @__PURE__ */ $e(Gu, [["render", tc]]), oc = ue({
|
||
name: "FsLayoutCard",
|
||
setup() {
|
||
const e = Ln("get:crudBinding"), t = V(() => {
|
||
var r, a;
|
||
return e == null ? !0 : (a = (r = e()) == null ? void 0 : r.search) == null ? void 0 : a.show;
|
||
}), { ui: n } = Se(), o = K(n.card.name);
|
||
return {
|
||
searchShow: t,
|
||
cardComponentName: o
|
||
};
|
||
}
|
||
});
|
||
const rc = { class: "fs-header-top" }, ac = { class: "fs-header-bottom" }, ic = { class: "top-bar" }, lc = { class: "top-bar" }, sc = { class: "fs-crud-footer" };
|
||
function uc(e, t, n, o, r, a) {
|
||
const i = Z("fs-container");
|
||
return b(), $(i, { class: "fs-layout-card" }, {
|
||
header: B(() => [
|
||
oe("div", rc, [
|
||
he(e.$slots, "header-top")
|
||
]),
|
||
e.searchShow ? (b(), $(H(e.cardComponentName), { key: 0 }, {
|
||
default: B(() => [
|
||
he(e.$slots, "search")
|
||
]),
|
||
_: 3
|
||
})) : G("", !0),
|
||
oe("div", ac, [
|
||
he(e.$slots, "header-bottom")
|
||
])
|
||
]),
|
||
default: B(() => [
|
||
N(i, null, {
|
||
header: B(() => [
|
||
he(e.$slots, "tabs")
|
||
]),
|
||
default: B(() => [
|
||
(b(), $(H(e.cardComponentName), { class: "fs-layout-card-body" }, {
|
||
title: B(() => [
|
||
oe("div", ic, [
|
||
he(e.$slots, "actionbar"),
|
||
he(e.$slots, "toolbar")
|
||
])
|
||
]),
|
||
header: B(() => [
|
||
oe("div", lc, [
|
||
he(e.$slots, "actionbar"),
|
||
he(e.$slots, "toolbar")
|
||
])
|
||
]),
|
||
default: B(() => [
|
||
N(i, null, {
|
||
footer: B(() => [
|
||
oe("div", sc, [
|
||
he(e.$slots, "footer-top"),
|
||
he(e.$slots, "pagination"),
|
||
he(e.$slots, "footer-bottom")
|
||
])
|
||
]),
|
||
default: B(() => [
|
||
he(e.$slots, "default"),
|
||
he(e.$slots, "table"),
|
||
he(e.$slots, "form")
|
||
]),
|
||
_: 3
|
||
})
|
||
]),
|
||
_: 3
|
||
}))
|
||
]),
|
||
_: 3
|
||
})
|
||
]),
|
||
_: 3
|
||
});
|
||
}
|
||
const cc = /* @__PURE__ */ $e(oc, [["render", uc]]);
|
||
function wa(e) {
|
||
return typeof e == "function" || Object.prototype.toString.call(e) === "[object Object]" && !Hr(e);
|
||
}
|
||
const dc = /* @__PURE__ */ ue({
|
||
name: "FsButton",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 文字
|
||
*/
|
||
text: {
|
||
type: String,
|
||
default: "",
|
||
required: !1
|
||
},
|
||
/**
|
||
* 图标
|
||
*/
|
||
icon: {
|
||
type: [String, Object, Function],
|
||
default: "",
|
||
required: !1
|
||
},
|
||
/**
|
||
* 右边的图标
|
||
*/
|
||
iconRight: {
|
||
type: [String, Object, Function],
|
||
default: "",
|
||
required: !1
|
||
},
|
||
/**
|
||
* 是否圆形按钮,text需配置为null
|
||
*/
|
||
circle: {
|
||
type: Boolean,
|
||
default: !1,
|
||
required: !1
|
||
},
|
||
/**
|
||
* tooltip配置,为空不显示tooltip
|
||
*/
|
||
tooltip: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* badge配置,为空不显示badge
|
||
* `{count:0,dot:"show"}`
|
||
*/
|
||
badge: {
|
||
type: Object,
|
||
default: null,
|
||
required: !1
|
||
},
|
||
/**
|
||
* x-button的配置,当x-button的配置与fs-button的配置有冲突时可以配置在此处
|
||
* 比如:n-button的text
|
||
*/
|
||
buttonProps: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 自定义的className
|
||
*/
|
||
className: {
|
||
type: [String, Array, Object],
|
||
default: void 0,
|
||
required: !1
|
||
},
|
||
/**
|
||
* 是否加载中
|
||
*/
|
||
loading: {
|
||
type: Boolean,
|
||
default: void 0,
|
||
required: !1
|
||
}
|
||
},
|
||
emits: ["click"],
|
||
setup(e, t) {
|
||
const {
|
||
ui: n
|
||
} = Se(), {
|
||
merge: o
|
||
} = Ee(), r = K(!1), a = V(() => e.loading ?? r.value ?? !1), i = (h, g = "fs-button-icon") => {
|
||
if (h != null)
|
||
return typeof h == "string" ? N(Z("fs-icon"), {
|
||
icon: h,
|
||
class: g
|
||
}, null) : typeof h == "function" ? h() : N(Z("fs-icon"), W(h, {
|
||
class: g
|
||
}), null);
|
||
};
|
||
let l = () => {
|
||
const h = e.icon, g = e.iconRight, m = n.type !== "element", y = !m;
|
||
let v;
|
||
const F = {
|
||
...t.slots
|
||
};
|
||
(h && !m && !y || t.slots.default || e.text || g) && (F.default = () => {
|
||
const T = [];
|
||
return h && !m && !y && T.push(i(h)), t.slots.default && T.push(t.slots.default()), e.text && T.push(e.text), g && T.push(i(g, "fs-button-icon-right")), T;
|
||
}), h && (m && !F.icon ? F.icon = () => i(h) : y && !F.icon && (v = i(h)));
|
||
const R = e.circle ? n.button.circle : {}, k = H(n.button.name), j = (T) => {
|
||
T.loadingRef = r, t.emit("click", T);
|
||
}, A = o({
|
||
...R,
|
||
//icon,
|
||
class: {
|
||
"fs-button": !0,
|
||
"is-thin": !e.text && !t.slots.default
|
||
},
|
||
loading: a.value,
|
||
onClick: j
|
||
}, {
|
||
class: e.className,
|
||
...cn(t.attrs, ["click", "order", "show", "render", "dropdown"]),
|
||
...e.buttonProps
|
||
});
|
||
return v && (A.icon = v), _r(k, A, F);
|
||
};
|
||
const s = l, u = H(n.badge.name);
|
||
if (e.badge && (l = () => {
|
||
let h;
|
||
return N(u, e.badge, wa(h = s()) ? h : {
|
||
default: () => [h]
|
||
});
|
||
}), !e.tooltip)
|
||
return l;
|
||
const c = H(n.tooltip.name), d = V(() => cn(e.tooltip, "slots")), f = n.tooltip.trigger;
|
||
return () => {
|
||
var g;
|
||
const h = {
|
||
...(g = e.tooltip) == null ? void 0 : g.slots,
|
||
[f]: l
|
||
};
|
||
return N(c, d.value, wa(h) ? h : {
|
||
default: () => [h]
|
||
});
|
||
};
|
||
}
|
||
}), fc = /* @__PURE__ */ ue({
|
||
name: "FsIcon",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* icon名称
|
||
*/
|
||
icon: {
|
||
type: String,
|
||
default: void 0,
|
||
require: !0
|
||
},
|
||
baseUrl: {
|
||
type: String,
|
||
default: ""
|
||
},
|
||
size: {
|
||
type: String,
|
||
default: ""
|
||
}
|
||
},
|
||
setup(e, t) {
|
||
const {
|
||
ui: n
|
||
} = Se(), o = V(() => {
|
||
var a;
|
||
if (e.icon && ((a = e.icon) == null ? void 0 : a.indexOf(":")) >= 0) {
|
||
if (e.icon.startsWith("http:") || e.icon.startsWith("https:")) {
|
||
let c = null;
|
||
return e.icon.startsWith("http://") || e.icon.startsWith("https://") ? c = e.icon : c = e.baseUrl + e.icon.replace("http:", "").replace("https:", ""), () => {
|
||
const d = {};
|
||
return e.size && (d.width = e.size, d.height = e.size), N("span", {
|
||
class: "fs-icon-image-container",
|
||
style: d
|
||
}, [N("img", W({
|
||
class: "fs-icon-image",
|
||
src: c
|
||
}, t.attrs), null)]);
|
||
};
|
||
}
|
||
if (e.icon.startsWith("svg:")) {
|
||
const c = H("FsIconSvg");
|
||
return () => {
|
||
const d = e.icon.replace("svg:", "");
|
||
return N(c, W({
|
||
class: "fs-icon",
|
||
icon: d
|
||
}, t.attrs), null);
|
||
};
|
||
}
|
||
const i = H("FsIconify"), l = e.icon.split(":");
|
||
let s = {}, u = e.icon;
|
||
return l.length >= 3 && (s = {
|
||
color: l[2]
|
||
}, u = l[0] + ":" + l[1]), () => N(i, W({
|
||
class: "fs-icon",
|
||
icon: u,
|
||
style: s
|
||
}, t.attrs), null);
|
||
}
|
||
const r = H(e.icon);
|
||
return typeof r == "string" ? () => N("span", {
|
||
title: "error icon name"
|
||
}, [r]) : n.icon.isComponent ? () => N(r, W({
|
||
class: "fs-icon"
|
||
}, t.attrs), null) : () => N(Z("el-icon"), W({
|
||
class: "fs-icon"
|
||
}, t.attrs), {
|
||
default: () => [N(r, null, null)]
|
||
});
|
||
});
|
||
return () => o.value();
|
||
}
|
||
}), hc = ue({
|
||
name: "FsIconify",
|
||
components: { Icon: Dl },
|
||
props: {
|
||
/**
|
||
* 图标名称
|
||
*/
|
||
icon: {
|
||
type: String
|
||
},
|
||
/**
|
||
* 旋转
|
||
*/
|
||
spin: {
|
||
type: Boolean,
|
||
default: !1
|
||
}
|
||
},
|
||
setup(e, t) {
|
||
return { iconifyRef: K(null) };
|
||
}
|
||
});
|
||
function mc(e, t, n, o, r, a) {
|
||
const i = Z("Icon");
|
||
return b(), M("span", {
|
||
class: dt(["fs-iconify", { "fs-iconify-spin": e.spin }])
|
||
}, [
|
||
N(i, {
|
||
ref: "iconifyRef",
|
||
icon: e.icon,
|
||
inline: !0
|
||
}, null, 8, ["icon"])
|
||
], 2);
|
||
}
|
||
const pc = /* @__PURE__ */ $e(hc, [["render", mc]]), gc = ue({
|
||
name: "FsSvgIcon",
|
||
props: {
|
||
icon: {
|
||
type: String,
|
||
required: !0
|
||
},
|
||
size: {
|
||
type: [Number, String],
|
||
default: 16
|
||
},
|
||
spin: {
|
||
type: Boolean,
|
||
default: !1
|
||
}
|
||
},
|
||
setup(e) {
|
||
const t = V(() => `#${e.icon}`), n = V(() => {
|
||
const { size: o } = e;
|
||
let r = `${o}`;
|
||
return r = `${r.replace("px", "")}px`, {
|
||
width: r,
|
||
height: r
|
||
};
|
||
});
|
||
return { symbolId: t, getStyle: n };
|
||
}
|
||
});
|
||
const vc = {
|
||
class: "fs-icon-svg-content",
|
||
"aria-hidden": "true"
|
||
}, bc = ["xlink:href"];
|
||
function yc(e, t, n, o, r, a) {
|
||
return b(), M("span", {
|
||
class: dt(["fs-icon-svg", e.spin && "fs-icon-spin"])
|
||
}, [
|
||
(b(), M("svg", vc, [
|
||
oe("use", { "xlink:href": e.symbolId }, null, 8, bc)
|
||
]))
|
||
], 2);
|
||
}
|
||
const wc = /* @__PURE__ */ $e(gc, [["render", yc]]), _c = ue({
|
||
name: "FsLabel",
|
||
props: {
|
||
compact: {
|
||
type: Boolean,
|
||
default: !1
|
||
},
|
||
label: {
|
||
type: String,
|
||
default: ""
|
||
},
|
||
labelAttrs: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
contentAttrs: {
|
||
type: Object,
|
||
default: () => ({})
|
||
}
|
||
}
|
||
});
|
||
function Cc(e, t, n, o, r, a) {
|
||
return b(), M("div", {
|
||
class: dt(["fs-label", { compact: e.compact }])
|
||
}, [
|
||
oe("div", W({ class: "label" }, e.labelAttrs), [
|
||
Ct(Pe(e.label) + " ", 1),
|
||
he(e.$slots, "label")
|
||
], 16),
|
||
oe("div", W({ class: "content" }, e.contentAttrs), [
|
||
he(e.$slots, "default")
|
||
], 16)
|
||
], 2);
|
||
}
|
||
const Sc = /* @__PURE__ */ $e(_c, [["render", Cc]]), Fc = {
|
||
key: 0,
|
||
class: "fs-loading"
|
||
}, Rc = { key: 0 }, kc = ue({
|
||
name: "FsLoading"
|
||
}), Dc = /* @__PURE__ */ ue({
|
||
...kc,
|
||
props: {
|
||
loading: { type: Boolean },
|
||
icon: {},
|
||
text: {}
|
||
},
|
||
setup(e) {
|
||
const { ui: t } = Se();
|
||
return (n, o) => {
|
||
const r = Z("fs-icon");
|
||
return e.loading ? (b(), M("div", Fc, [
|
||
N(r, {
|
||
class: "fs-icon-spin",
|
||
icon: e.icon ?? z(t).icons.refresh
|
||
}, null, 8, ["icon"]),
|
||
e.text ? (b(), M("span", Rc, Pe(e.text), 1)) : G("", !0)
|
||
])) : G("", !0);
|
||
};
|
||
}
|
||
});
|
||
const Oc = ue({
|
||
name: "FsBox"
|
||
}), Ec = { class: "fs-box" };
|
||
function Tc(e, t, n, o, r, a) {
|
||
return b(), M("div", Ec, [
|
||
he(e.$slots, "default")
|
||
]);
|
||
}
|
||
const $c = /* @__PURE__ */ $e(Oc, [["render", Tc]]);
|
||
function Ac(e) {
|
||
return typeof e == "function" || Object.prototype.toString.call(e) === "[object Object]" && !Hr(e);
|
||
}
|
||
function _a(e, t) {
|
||
if (e[t] instanceof Array) {
|
||
const n = e[t];
|
||
e[t] = (o) => {
|
||
for (const r of n)
|
||
r(o);
|
||
};
|
||
}
|
||
}
|
||
const Ic = ["div", "span", "a", "p", "pre", "li", "ol", "ul"], Si = /* @__PURE__ */ ue({
|
||
name: "FsComponentRender",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* modelValue
|
||
*/
|
||
modelValue: {},
|
||
/**
|
||
* 组件名称
|
||
*/
|
||
name: {},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 子元素,同slots
|
||
*/
|
||
children: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 事件监听
|
||
*/
|
||
on: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 同 on
|
||
*/
|
||
events: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 上下文scope
|
||
*/
|
||
scope: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* modelValue的属性名
|
||
*/
|
||
vModel: {
|
||
type: [String, Object]
|
||
},
|
||
/**
|
||
* 组件参数,会与attrs合并
|
||
*/
|
||
props: {},
|
||
/**
|
||
* 自定义render
|
||
*/
|
||
render: {},
|
||
/**
|
||
* 当输入框的值上报为undefine时,转为null
|
||
*/
|
||
undefineToNull: {
|
||
type: Boolean,
|
||
default: !0
|
||
}
|
||
},
|
||
emits: ["update:dict", "update:modelValue", "mounted"],
|
||
setup(e, t) {
|
||
const {
|
||
ui: n
|
||
} = Se(), {
|
||
merge: o
|
||
} = Ee();
|
||
Ut("get:scope", () => e.scope), Cn(() => {
|
||
t.emit("mounted", e.scope);
|
||
});
|
||
const r = K(), a = V(() => {
|
||
const h = {
|
||
name: "modelValue",
|
||
trim: !1,
|
||
number: !1,
|
||
transform: void 0
|
||
};
|
||
e.vModel && (typeof e.vModel == "string" ? h.name = e.vModel : o(h, e.vModel));
|
||
const g = e.modelValue ?? (n.type === "antdv" ? void 0 : null), m = "onUpdate:" + h.name, y = {
|
||
ref: r,
|
||
// scope: props.scope,
|
||
// fix element display false bug
|
||
[h.name]: g,
|
||
[m]: (F) => {
|
||
if (F && (h.trim && (F = F.trim()), h.number)) {
|
||
const R = Number(F);
|
||
isNaN(R) || (F = R);
|
||
}
|
||
h.transform && (F = h.transform(F)), F === void 0 && e.undefineToNull && (F = null), t.emit("update:modelValue", F);
|
||
},
|
||
...e.props
|
||
}, v = {
|
||
...e.events,
|
||
...e.on
|
||
};
|
||
return J(v, (F, R) => {
|
||
const k = F;
|
||
R.startsWith("on") || (R = Ua("on_" + R)), y[R] = (j) => k({
|
||
...e.scope,
|
||
$event: j
|
||
});
|
||
}), y;
|
||
}), i = () => {
|
||
const h = {}, g = (m, y) => {
|
||
m instanceof Function ? h[y] = (v) => m({
|
||
...e.scope,
|
||
scope: v
|
||
}) : h[y] = () => m;
|
||
};
|
||
return J(e.children, g), J(e.slots, g), h;
|
||
}, l = V(() => {
|
||
e.name;
|
||
let h = z(e.name) || n.input.name;
|
||
typeof h == "function" && (h = h());
|
||
const g = {
|
||
isAsyncComponent: !1,
|
||
component: h
|
||
};
|
||
let m = g.component;
|
||
return Ic.includes(m) || (typeof m == "string" && (m = Z(m)), (m == null ? void 0 : m.name) === "AsyncComponentWrapper" && (g.isAsyncComponent = !0)), g.component = m, g;
|
||
}), s = i;
|
||
function u() {
|
||
return l.value.isAsyncComponent ? d() : c();
|
||
}
|
||
function c() {
|
||
return r.value;
|
||
}
|
||
async function d() {
|
||
const h = c();
|
||
return h ?? new Promise((g, m) => {
|
||
f(g, m, 0);
|
||
});
|
||
}
|
||
function f(h, g, m) {
|
||
setTimeout(() => {
|
||
const y = c();
|
||
if (y != null) {
|
||
h(y);
|
||
return;
|
||
}
|
||
if (m++, m > 20) {
|
||
g(new Error("异步组件加载超时"));
|
||
return;
|
||
}
|
||
f(h, g, m);
|
||
}, 200);
|
||
}
|
||
return t.expose({
|
||
props: e,
|
||
getTargetRefSync: c,
|
||
getTargetRef: u,
|
||
getTargetRefAsync: d
|
||
}), () => {
|
||
let h;
|
||
const g = W(a.value, t.attrs);
|
||
return _a(g, "onChange"), _a(g, "onBlur"), e.render ? e.render({
|
||
...e.scope,
|
||
attrs: g
|
||
}) : N(l.value.component, g, Ac(h = s()) ? h : {
|
||
default: () => [h]
|
||
});
|
||
};
|
||
}
|
||
}), Vc = /* @__PURE__ */ ue({
|
||
name: "FsSlotRender",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {
|
||
type: Function
|
||
},
|
||
/**
|
||
* 上下文
|
||
*/
|
||
scope: {
|
||
type: Object
|
||
}
|
||
},
|
||
setup(e) {
|
||
return () => e.slots(e.scope);
|
||
}
|
||
}), Fi = /* @__PURE__ */ ue({
|
||
name: "FsRender",
|
||
functional: !0,
|
||
props: {
|
||
renderFunc: {
|
||
type: Function
|
||
},
|
||
scope: {
|
||
type: Object
|
||
}
|
||
},
|
||
setup() {
|
||
},
|
||
render() {
|
||
return this.renderFunc(this.scope);
|
||
}
|
||
}), Pc = ue({
|
||
name: "FsForm",
|
||
props: {
|
||
/**
|
||
* 初始表单数据
|
||
**/
|
||
initialForm: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 字段模版
|
||
* {
|
||
* key:{
|
||
* title: "字段名称",
|
||
* component:{
|
||
* name:"组件名称"
|
||
* ...组件参数
|
||
* }
|
||
* }
|
||
* }
|
||
* */
|
||
columns: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 字段分组
|
||
* {
|
||
* type:'xxx', //分组展示类型
|
||
* groups:{ //分组数据
|
||
* groupKey:{ title:'xxx',columns:['fieldKey','fieldKey']}
|
||
* }
|
||
* }
|
||
*/
|
||
group: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 重置表单后的操作
|
||
*/
|
||
doReset: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 点击保存按钮,表单校验前执行操作(async)
|
||
*/
|
||
beforeValidate: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 表单校验完完成后,提交前处理(async)
|
||
*/
|
||
beforeSubmit: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 点击保存按钮时执行操作(async)
|
||
*/
|
||
doSubmit: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 表单提交后处理(async)
|
||
*/
|
||
afterSubmit: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 插槽内容
|
||
*/
|
||
slots: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
/**
|
||
* 布局方式【flex|grid】
|
||
*/
|
||
display: {
|
||
type: String,
|
||
default: "flex"
|
||
// flex
|
||
},
|
||
/**
|
||
* 序号,编辑时会传入
|
||
*/
|
||
index: {
|
||
type: Number,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 模式 [add,edit,view,自定义]
|
||
*/
|
||
mode: {
|
||
type: String,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* a-row配置
|
||
*/
|
||
row: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* el-col|a-col配置,可配置跨列
|
||
*/
|
||
col: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* formItem的公共配置
|
||
*/
|
||
formItem: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* helper位置:{position:'label'}
|
||
*/
|
||
helper: {
|
||
type: Object
|
||
},
|
||
watch: {
|
||
type: Function,
|
||
default: null
|
||
}
|
||
},
|
||
emits: ["reset", "submit", "success", "validationError", "value-change", "init"],
|
||
setup(e, t) {
|
||
var w, _;
|
||
const { merge: n } = Ee(), { ui: o } = Se(), { AsyncComputeValue: r, doComputed: a } = Vt(), i = K(), l = un({}), { proxy: s } = Jo();
|
||
yt(e.columns, (C) => {
|
||
C.value != null && (C.value instanceof r || C.value instanceof or) && ce.warn("form.value配置不支持Compute/AsyncCompute类型的动态计算");
|
||
});
|
||
function u() {
|
||
const C = {};
|
||
return yt(e.columns, (S, E) => {
|
||
const L = z(S.value);
|
||
L !== void 0 && We(C, E, L);
|
||
}), n(C, ft(e.initialForm)), C;
|
||
}
|
||
const c = u();
|
||
y(c);
|
||
const d = V(() => ({
|
||
row: c,
|
||
form: l,
|
||
index: e.index,
|
||
mode: e.mode || "add",
|
||
attrs: t.attrs,
|
||
getComponentRef: A
|
||
}));
|
||
function f() {
|
||
return d.value;
|
||
}
|
||
const h = V(() => e.columns);
|
||
function g(C) {
|
||
C != null && yt(e.columns, (S, E) => {
|
||
let L = et(C, E);
|
||
if (S.valueBuilder) {
|
||
const se = S.valueBuilder({
|
||
value: L,
|
||
key: E,
|
||
row: c,
|
||
form: C,
|
||
index: e.index,
|
||
mode: e.mode
|
||
});
|
||
se != null && !(se instanceof Promise) && We(C, E, se);
|
||
}
|
||
});
|
||
}
|
||
function m() {
|
||
return l;
|
||
}
|
||
function y(C, S = {}) {
|
||
if (g(C), S.mergeForm === !1)
|
||
for (const L in l)
|
||
delete l[L];
|
||
n(l, C);
|
||
const { valueChange: E } = S;
|
||
E && J(e.columns, (L, se) => {
|
||
const ae = l[se];
|
||
R(se, ae);
|
||
});
|
||
}
|
||
function v(...C) {
|
||
return n({}, e.col, ...C);
|
||
}
|
||
function F(C) {
|
||
return { key: C.key, ...d.value };
|
||
}
|
||
function R(C, S) {
|
||
const E = { key: C, value: S, formRef: s, ...d.value, immediate: !1 };
|
||
t.emit("value-change", E);
|
||
let L = e.columns[C].valueChange;
|
||
L && (L instanceof Function ? L(E) : L.handle && L.handle(E));
|
||
}
|
||
const k = K({});
|
||
function j(C) {
|
||
return k.value[C].getFormItemRef();
|
||
}
|
||
function A(C, S = !1) {
|
||
var E;
|
||
return (E = j(C)) == null ? void 0 : E.getComponentRef(S);
|
||
}
|
||
const T = K([]);
|
||
J((w = e.group) == null ? void 0 : w.groups, (C, S) => {
|
||
C.collapsed !== !0 && T.value.push(S);
|
||
}), ((_ = e.group) == null ? void 0 : _.groupType) === "tabs" && (T.value = T.value.length > 0 ? T.value[0] : null);
|
||
const q = a(
|
||
() => e.group,
|
||
f,
|
||
null,
|
||
(C = {}) => {
|
||
const S = {};
|
||
J(C == null ? void 0 : C.groups, (se, ae) => {
|
||
J(se.columns, (de) => {
|
||
if (h.value[de] == null) {
|
||
an.logger.warn("无效的分组字段:" + de);
|
||
return;
|
||
}
|
||
S[de] = ae;
|
||
});
|
||
});
|
||
const E = C.groupType;
|
||
let L = {
|
||
parent: o.collapse.name,
|
||
child: o.collapseItem.name
|
||
};
|
||
return E === "tabs" && (L.parent = o.tabs.name, L.child = o.tabPane.name), n(
|
||
{
|
||
wrapper: L,
|
||
groupedKeys: S
|
||
},
|
||
C
|
||
);
|
||
}
|
||
), D = V(() => {
|
||
const C = [];
|
||
return J(h.value, (S, E) => {
|
||
var se, ae;
|
||
const L = ft(e.formItem || {});
|
||
S = n(L, S), S.key = E, S.order == null && (S.order = dn.orderDefault), (((se = q.value) == null ? void 0 : se.groupedKeys) == null || ((ae = q.value) == null ? void 0 : ae.groupedKeys[E]) == null) && C.push(S), S.col = v(S.col);
|
||
}), C.sort((S, E) => S.order - E.order), C;
|
||
});
|
||
function Y() {
|
||
return i.value;
|
||
}
|
||
async function le() {
|
||
const C = u(), S = Ur(l);
|
||
for (const E of S) {
|
||
const L = et(C, E[0]);
|
||
L == null ? No(l, E[0]) : We(l, E[0], L);
|
||
}
|
||
e.doReset && await e.doReset(d.value), t.emit("reset");
|
||
}
|
||
const I = K(), P = K({});
|
||
function X(C) {
|
||
var S, E;
|
||
if ((S = q.value) != null && S.groupedKeys)
|
||
for (let L in C) {
|
||
const se = (E = q.value) == null ? void 0 : E.groupedKeys[L];
|
||
se != null && (C["group." + se] = !0);
|
||
}
|
||
}
|
||
async function O() {
|
||
const C = { ...d.value, form: l };
|
||
if (C.mode !== "view") {
|
||
if (e.beforeValidate && await e.beforeValidate(C) === !1)
|
||
return !1;
|
||
try {
|
||
P.value = {}, await o.form.validateWrap(i.value), I.value = !0;
|
||
} catch (S) {
|
||
I.value = !1;
|
||
const E = o.form.transformValidateErrors(S);
|
||
throw X(E), P.value = E, t.emit("validationError", d.value), S;
|
||
}
|
||
}
|
||
}
|
||
async function x() {
|
||
await O();
|
||
const C = ft(qn(l)), S = { ...d.value, form: C };
|
||
if (ce.debug("form submit", JSON.stringify(l)), yt(e.columns, (E, L) => {
|
||
let se = et(C, L);
|
||
if (E.valueResolve) {
|
||
const ae = E.valueResolve({
|
||
value: se,
|
||
key: L,
|
||
...S
|
||
});
|
||
ae != null && !(ae instanceof Promise) && We(C, L, ae);
|
||
}
|
||
}), e.beforeSubmit && await e.beforeSubmit(S) === !1)
|
||
return !1;
|
||
if (yt(e.columns, (E, L) => {
|
||
E.submit === !1 ? No(C, L) : E.submit === !0 && We(C, L, C[L]);
|
||
}), e.doSubmit) {
|
||
const E = await e.doSubmit(S);
|
||
if (S.res = E, E === !1)
|
||
return !1;
|
||
}
|
||
return t.emit("submit", S), e.afterSubmit && await e.afterSubmit(S) === !1 ? !1 : (t.emit("success", S), S);
|
||
}
|
||
Cn(() => {
|
||
J(h.value, (C, S) => {
|
||
if (C.valueChange == null)
|
||
return;
|
||
let E = C.valueChange;
|
||
if (E && E.immediate === !0 && E.handle) {
|
||
const L = { key: S, value: l[S], formRef: s, ...d.value, immediate: !0 };
|
||
E.handle && E.handle(L);
|
||
}
|
||
});
|
||
});
|
||
function Q(C) {
|
||
return !!(C && z(C.show) !== !1);
|
||
}
|
||
function re(C) {
|
||
if (!C.columns || z(C.show) === !1)
|
||
return !1;
|
||
for (let S of C.columns) {
|
||
if (h.value[S] == null)
|
||
continue;
|
||
if (Q(h.value[S]))
|
||
return !0;
|
||
}
|
||
return !1;
|
||
}
|
||
e.watch && ut(
|
||
() => l,
|
||
(C, S) => {
|
||
e.watch && e.watch(d.value);
|
||
},
|
||
{
|
||
deep: !0,
|
||
immediate: !0
|
||
}
|
||
);
|
||
function ge() {
|
||
const C = JSON.stringify(c), S = JSON.stringify(l);
|
||
return C !== S;
|
||
}
|
||
const te = V(() => n({}, e.slots, t.slots));
|
||
return t.emit("init", d.value), {
|
||
get: (C, S) => et(C, S),
|
||
set: (C, S, E) => {
|
||
We(C, S, E), R(S, E);
|
||
},
|
||
ui: o,
|
||
validRef: I,
|
||
errorsRef: P,
|
||
formRef: i,
|
||
computedColumns: h,
|
||
computedDefaultColumns: D,
|
||
submit: x,
|
||
reset: le,
|
||
getFormRef: Y,
|
||
scope: d,
|
||
buildItemScope: F,
|
||
groupActiveKey: T,
|
||
form: l,
|
||
formItemRefs: k,
|
||
getFormData: m,
|
||
setFormData: y,
|
||
getComponentRef: A,
|
||
mergeCol: v,
|
||
validate: O,
|
||
computedGroup: q,
|
||
getContextFn: f,
|
||
formItemShow: Q,
|
||
groupItemShow: re,
|
||
isDirty: ge,
|
||
mergedSlots: te
|
||
};
|
||
}
|
||
});
|
||
function Mc(e, t, n, o, r, a) {
|
||
const i = Z("fs-form-item-col"), l = Z("fs-render");
|
||
return b(), $(H(e.ui.form.name), {
|
||
ref: "formRef",
|
||
class: dt(["fs-form", {
|
||
"fs-form-grid": e.display === "grid",
|
||
"fs-form-flex": e.display === "flex",
|
||
"fs-form-invalid": e.validRef === !1
|
||
}]),
|
||
onsubmit: "event.preventDefault();",
|
||
model: e.form
|
||
}, {
|
||
default: B(() => [
|
||
(b(), $(H(e.ui.row.name), W({ class: "fs-row" }, e.row), {
|
||
default: B(() => [
|
||
(b(!0), M(be, null, Te(e.computedDefaultColumns, (s) => (b(), $(i, {
|
||
key: s == null ? void 0 : s.key,
|
||
ref_for: !0,
|
||
ref: (u) => {
|
||
u && (e.formItemRefs[s.key] = u);
|
||
},
|
||
col: e.mergeCol(s.col),
|
||
item: s,
|
||
helper: e.helper,
|
||
"model-value": e.get(e.form, s.key),
|
||
slots: e.mergedSlots["form_" + s.key],
|
||
"get-context-fn": e.getContextFn,
|
||
"onUpdate:modelValue": (u) => e.set(e.form, s.key, u)
|
||
}, null, 8, ["col", "item", "helper", "model-value", "slots", "get-context-fn", "onUpdate:modelValue"]))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16)),
|
||
e.computedGroup.wrapper ? (b(), $(H(e.computedGroup.wrapper.parent), W({
|
||
key: 0,
|
||
[e.ui.collapse.modelValue]: e.groupActiveKey,
|
||
["onUpdate:" + e.ui.collapse.modelValue]: t[0] || (t[0] = (s) => e.groupActiveKey = s),
|
||
style: { width: "100%" }
|
||
}, e.computedGroup), {
|
||
default: B(() => [
|
||
(b(!0), M(be, null, Te(e.computedGroup.groups, (s, u) => (b(), M(be, { key: u }, [
|
||
e.groupItemShow(s) ? (b(), $(H(e.computedGroup.wrapper.child), W({
|
||
key: 0,
|
||
[e.ui.collapse.keyName || ""]: u
|
||
}, { ref_for: !0 }, s, {
|
||
class: { "fs-form-group-error": e.errorsRef["group." + u] }
|
||
}), Qo({
|
||
default: B(() => [
|
||
(b(), $(H(e.ui.row.name), W({ class: "fs-row" }, { ref_for: !0 }, e.row), {
|
||
default: B(() => [
|
||
(b(!0), M(be, null, Te(s.columns, (c) => (b(), M(be, { key: c }, [
|
||
e.computedColumns[c] ? (b(), $(i, {
|
||
key: 0,
|
||
ref_for: !0,
|
||
ref: (d) => {
|
||
d && (e.formItemRefs[c] = d);
|
||
},
|
||
col: e.mergeCol(e.computedColumns[c].col),
|
||
item: e.computedColumns[c],
|
||
"model-value": e.get(e.form, c),
|
||
slots: e.mergedSlots["form_" + c],
|
||
"get-context-fn": e.getContextFn,
|
||
helper: e.helper,
|
||
"onUpdate:modelValue": (d) => e.set(e.form, c, d)
|
||
}, null, 8, ["col", "item", "model-value", "slots", "get-context-fn", "helper", "onUpdate:modelValue"])) : G("", !0)
|
||
], 64))), 128))
|
||
]),
|
||
_: 2
|
||
}, 1040))
|
||
]),
|
||
_: 2
|
||
}, [
|
||
Te(s.slots, (c, d) => ({
|
||
name: d,
|
||
fn: B((f) => [
|
||
N(l, {
|
||
"render-func": c,
|
||
scope: { ...f, hasError: e.errorsRef["group." + u] }
|
||
}, null, 8, ["render-func", "scope"])
|
||
])
|
||
}))
|
||
]), 1040, ["class"])) : G("", !0)
|
||
], 64))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16)) : G("", !0)
|
||
]),
|
||
_: 1
|
||
}, 8, ["class", "model"]);
|
||
}
|
||
const Bc = /* @__PURE__ */ $e(Pc, [["render", Mc]]), jc = ue({
|
||
name: "FsFormItem",
|
||
components: { FsRender: Fi },
|
||
props: {
|
||
/**
|
||
* 表单字段值(v-model)
|
||
*/
|
||
modelValue: {},
|
||
/**
|
||
* 字段配置
|
||
*/
|
||
item: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 字段组件插槽
|
||
*/
|
||
formSlot: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
getContextFn: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
helper: {
|
||
type: [String, Object]
|
||
}
|
||
},
|
||
emits: ["update:modelValue"],
|
||
setup(e, t) {
|
||
const { ui: n } = Se(), { merge: o } = Ee(), r = K(), a = () => {
|
||
const m = e.getContextFn ? e.getContextFn() : {};
|
||
return { value: e.modelValue, key: e.item.key, ...m };
|
||
};
|
||
function i(m) {
|
||
t.emit("update:modelValue", m);
|
||
}
|
||
function l(m = !1) {
|
||
var y, v;
|
||
return m ? (y = r.value) == null ? void 0 : y.getTargetRefAsync() : (v = r.value) == null ? void 0 : v.getTargetRef();
|
||
}
|
||
const s = V(() => {
|
||
const m = {
|
||
...e.item
|
||
};
|
||
return delete m.title, delete m.label, m;
|
||
}), u = V(() => {
|
||
var m, y, v;
|
||
return ((y = (m = e.item) == null ? void 0 : m.helper) == null ? void 0 : y.position) || ((v = e.helper) == null ? void 0 : v.position);
|
||
}), c = V(() => {
|
||
var m, y;
|
||
return o({}, (m = e.item.helper) == null ? void 0 : m.tooltip, (y = e.helper) == null ? void 0 : y.tooltip);
|
||
}), d = V(() => {
|
||
if (e.item != null)
|
||
return e.item.key.indexOf(".") >= 0 ? e.item.key.split(".") : e.item.key;
|
||
}), f = V(() => e.item.label || e.item.title), h = V(() => f.value instanceof Function);
|
||
return {
|
||
ui: n,
|
||
updateModelValue: i,
|
||
scopeFunc: a,
|
||
getComponentRef: l,
|
||
componentRenderRef: r,
|
||
computedHelperPosition: u,
|
||
computedHelperTooltip: c,
|
||
computedKey: d,
|
||
computedLabelIsRender: h,
|
||
computedLabel: f,
|
||
computedLabelRender: () => f.value(a()),
|
||
computedItem: s
|
||
};
|
||
}
|
||
});
|
||
const xc = {
|
||
key: 0,
|
||
class: "fs-form-item-label-text"
|
||
}, Nc = ["title"], Lc = { class: "fs-form-helper-tooltip" }, zc = { class: "fs-form-item-label-icon" }, qc = { class: "fs-form-item-content" }, Hc = { class: "fs-form-item-render" }, Wc = { class: "fs-form-item-component" };
|
||
function Uc(e, t, n, o, r, a) {
|
||
const i = Z("fs-render"), l = Z("fs-form-helper"), s = Z("fs-icon"), u = Z("fs-slot-render"), c = Z("fs-component-render");
|
||
return e.computedItem ? (b(), $(H(e.ui.formItem.name), W({
|
||
key: 0,
|
||
class: "fs-form-item",
|
||
[e.ui.formItem.prop || ""]: e.computedKey
|
||
}, e.computedItem, {
|
||
path: e.computedItem.key,
|
||
"rule-path": e.computedItem.key
|
||
}), {
|
||
label: B(() => [
|
||
e.computedLabelIsRender ? (b(), M("span", xc, [
|
||
N(i, { "render-func": e.computedLabelRender }, null, 8, ["render-func"])
|
||
])) : (b(), M("span", {
|
||
key: 1,
|
||
class: "fs-form-item-label-text",
|
||
title: e.computedLabel
|
||
}, Pe(e.computedLabel), 9, Nc)),
|
||
e.computedItem.helper && e.computedHelperPosition === "label" ? (b(), $(H(e.ui.tooltip.name), je(W({ key: 2 }, e.computedHelperTooltip)), {
|
||
[e.ui.tooltip.content]: B(() => [
|
||
oe("span", Lc, [
|
||
N(l, {
|
||
helper: e.computedItem.helper,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["helper", "scope"])
|
||
])
|
||
]),
|
||
[e.ui.tooltip.trigger]: B(() => [
|
||
oe("span", zc, [
|
||
N(s, {
|
||
class: "fs-form-item-label-icon-inner",
|
||
icon: e.ui.icons.question
|
||
}, null, 8, ["icon"])
|
||
])
|
||
]),
|
||
_: 2
|
||
}, 1040)) : G("", !0)
|
||
]),
|
||
default: B(() => {
|
||
var d;
|
||
return [
|
||
oe("div", qc, [
|
||
e.computedItem.topRender ? (b(), $(i, {
|
||
key: 0,
|
||
"render-func": e.computedItem.topRender,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : G("", !0),
|
||
oe("div", Hc, [
|
||
e.computedItem.prefixRender ? (b(), $(i, {
|
||
key: 0,
|
||
"render-func": e.computedItem.prefixRender,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : G("", !0),
|
||
oe("div", Wc, [
|
||
e.formSlot ? (b(), $(u, {
|
||
key: 0,
|
||
slots: e.formSlot,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["slots", "scope"])) : ((d = e.computedItem.component) == null ? void 0 : d.show) !== !1 ? (b(), M(be, { key: 1 }, [
|
||
e.computedItem.conditionalRender && e.computedItem.conditionalRender.match && e.computedItem.conditionalRender.match(e.scopeFunc()) ? (b(), $(i, {
|
||
key: 0,
|
||
"render-func": e.computedItem.conditionalRender.render,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : e.computedItem.render ? (b(), $(i, {
|
||
key: 1,
|
||
"render-func": e.computedItem.render,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : (b(), $(c, W({
|
||
key: 2,
|
||
ref: "componentRenderRef"
|
||
}, e.computedItem.component, {
|
||
"model-value": e.modelValue,
|
||
scope: e.scopeFunc(),
|
||
"onUpdate:modelValue": e.updateModelValue
|
||
}), null, 16, ["model-value", "scope", "onUpdate:modelValue"]))
|
||
], 64)) : G("", !0)
|
||
]),
|
||
e.computedItem.suffixRender ? (b(), $(i, {
|
||
key: 1,
|
||
"render-func": e.computedItem.suffixRender,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : G("", !0)
|
||
]),
|
||
e.computedItem.bottomRender ? (b(), $(i, {
|
||
key: 1,
|
||
"render-func": e.computedItem.bottomRender,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : G("", !0),
|
||
e.computedItem.helper && e.computedHelperPosition !== "label" ? (b(), $(l, {
|
||
key: 2,
|
||
helper: e.computedItem.helper,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["helper", "scope"])) : G("", !0)
|
||
])
|
||
];
|
||
}),
|
||
_: 1
|
||
}, 16, ["path", "rule-path"])) : G("", !0);
|
||
}
|
||
const Kc = /* @__PURE__ */ $e(jc, [["render", Uc]]), Yc = /* @__PURE__ */ ue({
|
||
__name: "fs-form-item-col",
|
||
props: {
|
||
/**
|
||
* 字段配置
|
||
*/
|
||
item: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 字段组件插槽
|
||
*/
|
||
slots: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
getContextFn: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
col: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
helper: {
|
||
type: [String, Object],
|
||
default: void 0
|
||
}
|
||
},
|
||
setup(e, { expose: t }) {
|
||
const { ui: n } = Se(), o = e, { doComputed: r } = Vt(), a = r(
|
||
() => o.item,
|
||
() => o.getContextFn()
|
||
), { merge: i } = Ee(), l = Zo(), s = K();
|
||
function u() {
|
||
return s.value;
|
||
}
|
||
return t({
|
||
getFormItemRef: u
|
||
}), (c, d) => {
|
||
var h;
|
||
const f = Z("fs-form-item");
|
||
return z(a) && z(a).show !== !1 ? (b(), $(H(z(n).col.name), W({
|
||
key: 0,
|
||
class: "fs-col"
|
||
}, z(i)(e.col, (h = z(a)) == null ? void 0 : h.col)), {
|
||
default: B(() => {
|
||
var g;
|
||
return [
|
||
z(a) && ((g = z(a)) == null ? void 0 : g.blank) !== !0 ? (b(), $(f, W({
|
||
key: 0,
|
||
ref_key: "formItemRef",
|
||
ref: s,
|
||
item: z(a),
|
||
"form-slot": e.slots,
|
||
"get-context-fn": e.getContextFn,
|
||
helper: e.helper
|
||
}, z(l)), null, 16, ["item", "form-slot", "get-context-fn", "helper"])) : G("", !0)
|
||
];
|
||
}),
|
||
_: 1
|
||
}, 16)) : G("", !0);
|
||
};
|
||
}
|
||
});
|
||
const Gc = ue({
|
||
name: "FsFormHelper",
|
||
props: {
|
||
/**
|
||
* 帮助说明, text: 说明文字, render: function(scope) 自定义渲染
|
||
*/
|
||
helper: {
|
||
type: [
|
||
/**
|
||
* text: 说明文字,
|
||
* render: function , 自定义render
|
||
*/
|
||
Object,
|
||
/**
|
||
* 说明文本
|
||
*/
|
||
String
|
||
]
|
||
},
|
||
scope: {}
|
||
},
|
||
setup(e) {
|
||
}
|
||
});
|
||
const Xc = { class: "fs-form-helper" }, Jc = { key: 0 }, Qc = { key: 2 };
|
||
function Zc(e, t, n, o, r, a) {
|
||
const i = Z("fs-render");
|
||
return b(), M("div", Xc, [
|
||
typeof e.helper == "string" ? (b(), M("pre", Jc, Pe(e.helper), 1)) : e.helper.render ? (b(), $(i, {
|
||
key: 1,
|
||
"render-func": e.helper.render,
|
||
scope: e.scope
|
||
}, null, 8, ["render-func", "scope"])) : e.helper.text ? (b(), M("pre", Qc, Pe(e.helper.text), 1)) : G("", !0)
|
||
]);
|
||
}
|
||
const ed = /* @__PURE__ */ $e(Gc, [["render", Zc]]);
|
||
function td(e) {
|
||
return typeof e == "function" || Object.prototype.toString.call(e) === "[object Object]" && !Hr(e);
|
||
}
|
||
const ao = /* @__PURE__ */ ue({
|
||
name: "FsFormWrapper",
|
||
props: {
|
||
/**
|
||
* 表单配置
|
||
* {
|
||
* wrapper:{ //表单包装配置
|
||
* is: 'el-dialog'//el-dialog|a-modal|el-drawer|a-drawer,
|
||
* draggable: false, //是否支持拖动
|
||
* inner:false //是否在页面内部打开
|
||
* }
|
||
* ...FsForm配置
|
||
* }
|
||
*/
|
||
options: {},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {},
|
||
/**
|
||
* 是否在内部打开对话框
|
||
*/
|
||
inner: {},
|
||
/**
|
||
* 内部打开对话框的wrapper
|
||
*/
|
||
innerWrapper: {},
|
||
id: {},
|
||
zIndex: {}
|
||
},
|
||
emits: ["reset", "submit", "validationError", "value-change", "open", "opened", "mounted", "closed", "inner-change"],
|
||
setup(e, t) {
|
||
var Qe;
|
||
const {
|
||
t: n
|
||
} = rt(), {
|
||
merge: o
|
||
} = Ee(), r = K(!1), a = K(), i = K(), l = K(), s = K(), u = K(), c = K(!1), d = K(), f = K(), h = K(), g = K(), m = e.id || Math.floor(Math.random() * 1e6) + "", y = "fs-form-wrapper_" + m, v = K({});
|
||
function F(ee = {}) {
|
||
var ve;
|
||
return {
|
||
formWrapperId: m,
|
||
formWrapperIdClass: y,
|
||
close: P,
|
||
doClose: X,
|
||
onClosed: O,
|
||
onOpened: x,
|
||
open: R,
|
||
title: g,
|
||
fullscreenEnabled: se,
|
||
fullscreen: L,
|
||
formWrapperIs: a,
|
||
formWrapperOpen: r,
|
||
formWrapperBind: l,
|
||
computedButtons: E,
|
||
onValueChange: Q,
|
||
innerBind: Ce,
|
||
formWrapperSlots: v,
|
||
wrapper: l.value,
|
||
options: i.value,
|
||
formRef: u.value,
|
||
form: te(),
|
||
wrapperBindRef: l,
|
||
formOptionsRef: i,
|
||
setFormData: w,
|
||
getFormData: te,
|
||
reset: ge,
|
||
loading: c,
|
||
toggleFullscreen: ae,
|
||
submit: re,
|
||
mode: (ve = i.value) == null ? void 0 : ve.mode,
|
||
...ee
|
||
};
|
||
}
|
||
const R = async (ee) => {
|
||
var Ge, Ht;
|
||
const {
|
||
wrapper: ve
|
||
} = ee;
|
||
ve.onOpen && ve.onOpen(ee), g.value = z(ve.title), a.value = ee.wrapper.is, s.value = ve, i.value = {
|
||
...cn(ee, "wrapper", "slots"),
|
||
slots: {
|
||
...e.slots,
|
||
...ee.slots,
|
||
...t.slots
|
||
}
|
||
};
|
||
const Oe = de.formWrapper.customClass(a.value), Fe = `fs-form-wrapper fs-form-wrapper-${(Ge = i.value) == null ? void 0 : Ge.mode} ${y} ${ve[Oe] || ""} `;
|
||
return l.value = {
|
||
...cn(ve, "title", "onOpen", "onClosed", "onOpened", "is", "inner", "beforeClose"),
|
||
[Oe]: Fe
|
||
}, v.value = {
|
||
...e.slots,
|
||
...(Ht = ee.wrapper) == null ? void 0 : Ht.slots,
|
||
...t.slots
|
||
}, t.emit("open", F()), d.value = () => {
|
||
ve.onClosed && ve.onClosed(F());
|
||
}, f.value = () => {
|
||
ve.onOpened && ve.onOpened(F());
|
||
}, h.value = ve.beforeClose, ve.fullscreen != null && (L.value = ve.fullscreen), t.emit("inner-change", !!s.value.inner), await Be(), r.value = !0, await Be(), x(), F();
|
||
};
|
||
async function k() {
|
||
var Oe;
|
||
const ee = s.value.saveRemind;
|
||
if (((Oe = u.value) == null ? void 0 : Oe.isDirty()) && ee) {
|
||
let Fe = !1;
|
||
if (ee instanceof Function)
|
||
Fe = await ee();
|
||
else
|
||
try {
|
||
await de.messageBox.confirm({
|
||
title: n("fs.form.saveRemind.title"),
|
||
message: n("fs.form.saveRemind.content"),
|
||
confirmButtonText: n("fs.form.saveRemind.ok"),
|
||
cancelButtonText: n("fs.form.saveRemind.cancel")
|
||
}), Fe = !0;
|
||
} catch {
|
||
Fe = !1;
|
||
}
|
||
Fe && await re();
|
||
}
|
||
}
|
||
const j = Xa();
|
||
let A = null;
|
||
function T() {
|
||
return s.value.saveDraft ? (A == null && (A = new Gr({
|
||
$router: j,
|
||
tableName: "addFormDraft",
|
||
keyType: e.id || "0"
|
||
})), A) : null;
|
||
}
|
||
async function q() {
|
||
var Fe;
|
||
const ee = s.value.saveDraft, ve = (Fe = u.value) == null ? void 0 : Fe.isDirty(), Oe = i.value.mode == "add";
|
||
return ve && ee && Oe ? (await T().updateTableValue(te()), !0) : !1;
|
||
}
|
||
async function D() {
|
||
const ee = T();
|
||
ee && await ee.clearTableValue();
|
||
}
|
||
async function Y() {
|
||
const ee = T();
|
||
if (ee) {
|
||
const ve = await ee.getTableValue();
|
||
ve && w(ve, {
|
||
mergeForm: !0
|
||
});
|
||
}
|
||
}
|
||
async function le() {
|
||
let ee = !1;
|
||
return s.value.saveDraft && (ee = await q()), h.value && h.value(F()) == !1 ? !1 : (ee || await k(), !0);
|
||
}
|
||
const I = V(() => de.type == "element" ? {
|
||
beforeClose: (ee) => {
|
||
X();
|
||
}
|
||
} : {}), P = async () => {
|
||
r.value = !1;
|
||
}, X = async () => await le() == !1 ? !1 : (P(), !0), O = () => {
|
||
d.value && d.value(), t.emit("closed"), i.value = null;
|
||
}, x = () => {
|
||
if (s.value.saveDraft && Y(), t.emit("opened"), f.value && f.value(), l.value.draggable || l.value.dragenabled) {
|
||
const {
|
||
dragModal: ee
|
||
} = Nu();
|
||
ee({
|
||
getModal: () => document.querySelector(`.${y}`)
|
||
});
|
||
}
|
||
}, Q = (ee) => {
|
||
t.emit("value-change", ee);
|
||
};
|
||
async function re() {
|
||
c.value = !0;
|
||
try {
|
||
if (await u.value.submit() === !1)
|
||
return;
|
||
await D(), P();
|
||
} finally {
|
||
c.value = !1;
|
||
}
|
||
}
|
||
async function ge() {
|
||
await u.value.reset();
|
||
}
|
||
function te() {
|
||
var ee;
|
||
return (ee = u.value) == null ? void 0 : ee.getFormData();
|
||
}
|
||
function w(ee, ve) {
|
||
var Oe;
|
||
(Oe = u.value) == null || Oe.setFormData(ee, ve);
|
||
}
|
||
const {
|
||
doComputed: _
|
||
} = Vt();
|
||
function C() {
|
||
var ee, ve, Oe;
|
||
return {
|
||
row: (ee = i.value) == null ? void 0 : ee.initialForm,
|
||
form: te(),
|
||
index: (ve = i.value) == null ? void 0 : ve.index,
|
||
mode: (Oe = i.value) == null ? void 0 : Oe.mode,
|
||
attrs: i.value,
|
||
getComponentRef(...Fe) {
|
||
var Ge;
|
||
(Ge = u.value) == null || Ge.getComponentRef(...Fe);
|
||
}
|
||
};
|
||
}
|
||
const S = _(() => {
|
||
var ee;
|
||
return (ee = l.value) == null ? void 0 : ee.buttons;
|
||
}, C), E = V(() => {
|
||
const ee = {
|
||
cancel: {},
|
||
reset: {},
|
||
ok: {
|
||
loading: c.value
|
||
}
|
||
}, ve = o(ee, S.value), Oe = [];
|
||
return J(ve, (Fe, Ge) => {
|
||
Fe.key = Ge, Oe.push(Fe), Fe.onClick == null && Fe.click != null && (Fe.onClick = (Ht) => {
|
||
Fe.click(F({
|
||
loadingRef: Ht == null ? void 0 : Ht.loadingRef
|
||
}));
|
||
});
|
||
}), Sn(Oe, (Fe) => Fe.order ?? dn.orderDefault);
|
||
});
|
||
Cn(async () => {
|
||
e.options != null && await R(e.options), t.emit("mounted", Jo().exposed);
|
||
});
|
||
const L = K(!1), se = V(() => {
|
||
var ee;
|
||
return !((ee = a.value) != null && ee.endsWith("drawer"));
|
||
});
|
||
function ae() {
|
||
L.value = !L.value;
|
||
}
|
||
const de = Le.get(), Ce = V(() => s.value.inner ? de.formWrapper.buildInnerBind({
|
||
getInnerWrapper() {
|
||
if (s.value.innerContainerSelector) {
|
||
const ee = document.querySelector(s.value.innerContainerSelector);
|
||
if (ee)
|
||
return ee.classList.add("fs-form-inner-wrapper"), ee;
|
||
console.error(`找不到选择器为${s.value.innerContainerSelector}的元素`);
|
||
}
|
||
return e.innerWrapper;
|
||
}
|
||
}) : {});
|
||
t.expose({
|
||
formWrapperId: m,
|
||
formWrapperIdClass: y,
|
||
close: P,
|
||
doClose: X,
|
||
onClosed: O,
|
||
onOpened: x,
|
||
open: R,
|
||
title: g,
|
||
fullscreenEnabled: se,
|
||
fullscreen: L,
|
||
toggleFullscreen: ae,
|
||
formOptions: i,
|
||
formWrapperIs: a,
|
||
formWrapperOpen: r,
|
||
formWrapperBind: l,
|
||
formRef: u,
|
||
submit: re,
|
||
reset: ge,
|
||
computedButtons: E,
|
||
loading: c,
|
||
getFormData: te,
|
||
setFormData: w,
|
||
onValueChange: Q,
|
||
innerBind: Ce,
|
||
formWrapperSlots: v,
|
||
form: te(),
|
||
wrapperBindRef: l,
|
||
formOptionsRef: i,
|
||
mode: (Qe = i.value) == null ? void 0 : Qe.mode
|
||
});
|
||
const ze = Wr();
|
||
return () => {
|
||
if (!l.value)
|
||
return null;
|
||
const ee = Le.get();
|
||
let ve = {};
|
||
const Oe = {
|
||
...ze,
|
||
...v.value
|
||
}, Fe = (Pt, hn, at = Oe) => at[Pt] ? at[Pt](hn) : null, Ge = a.value || "el-dialog";
|
||
if (i.value) {
|
||
const {
|
||
index: Pt,
|
||
mode: hn
|
||
} = i.value || {}, at = {
|
||
_self: this,
|
||
index: Pt,
|
||
mode: hn,
|
||
getFormData: te
|
||
};
|
||
ve = {
|
||
[ee.formWrapper.titleSlotName]: () => {
|
||
let Fn = null;
|
||
return se.value && (Fn = N(Z("fs-icon"), {
|
||
class: "fs-fullscreen-icon",
|
||
onClick: ae,
|
||
icon: L.value ? ee.icons.fullScreen : ee.icons.unFullScreen
|
||
}, null)), N("div", {
|
||
class: "fs-form-header"
|
||
}, [N("div", {
|
||
class: "fs-form-header-left"
|
||
}, [Fe("form-header-left", at), g.value, Fe("form-header-right", at)]), N("div", {
|
||
class: "fs-form-header-action"
|
||
}, [Fe("form-header-action-left", at), Fn, Fe("form-header-action-right", at)])]);
|
||
},
|
||
default: () => {
|
||
var ua;
|
||
const Fn = [];
|
||
return J(E.value, (ca) => {
|
||
ca.show !== !1 && Fn.push(N(Z("fs-button"), ca, null));
|
||
}), N("div", {
|
||
class: "fs-form-wrapper-body"
|
||
}, [N("div", {
|
||
class: "fs-form-body"
|
||
}, [Fe("form-body-top", at), N("div", {
|
||
class: "fs-form-content"
|
||
}, [Fe("form-body-left", at), N(Z("fs-form"), W({
|
||
ref: u
|
||
}, i.value, {
|
||
onValueChange: Q
|
||
}), null), Fe("form-body-right", at)]), Fe("form-body-bottom", at)]), er(N("div", {
|
||
class: "fs-form-footer-btns"
|
||
}, [Fe("form-footer-left", at), Fn, Fe("form-footer-right", at)]), [[Cr("if"), Fn.length > 0 || ((ua = l.value.footerProps) == null ? void 0 : ua.show) !== !1], [Cr("bind"), l.value.footerProps]])]);
|
||
}
|
||
};
|
||
}
|
||
if (ee.formWrapper.hasContentWrap) {
|
||
const Pt = ee.formWrapper.hasContentWrap(Ge), hn = ve;
|
||
if (Pt) {
|
||
const at = H(Pt);
|
||
ve = {
|
||
default: () => N(at, W({
|
||
closable: !0
|
||
}, s.value.contentProps), td(hn) ? hn : {
|
||
default: () => [hn]
|
||
})
|
||
};
|
||
}
|
||
}
|
||
const Ht = ee.formWrapper.visible, el = {
|
||
[Ht]: r.value,
|
||
["onUpdate:" + Ht]: async (Pt) => {
|
||
if (Pt === !1 && r.value)
|
||
return await X();
|
||
r.value = Pt;
|
||
}
|
||
}, tl = ee.formWrapper.buildOnClosedBind(Ge, O), sa = ee.formWrapper.customClass(Ge), nl = `${L.value ? "fs-fullscreen" : ""} ${l.value[sa] || ""}`, ol = {
|
||
[sa]: nl
|
||
}, rl = {
|
||
fullscreen: L.value
|
||
}, al = {
|
||
zIndex: l.value.zIndex || e.zIndex
|
||
}, il = H(Ge);
|
||
return N(il, W(l.value, ol, el, tl, rl, Ce.value, al, I.value), ve);
|
||
};
|
||
}
|
||
}), nd = ue({
|
||
name: "FsFormProvider"
|
||
}), od = /* @__PURE__ */ ue({
|
||
...nd,
|
||
setup(e) {
|
||
const t = K({}), n = K({});
|
||
return Ut("get:form:wrapper:context", (o) => n.value[o]), Ut("use:form:wrapper", () => ({
|
||
setContext(o, r) {
|
||
n.value[o] = r;
|
||
},
|
||
open(o) {
|
||
const r = o.id || Math.floor(Math.random() * 1e6) + "";
|
||
return new Promise((a, i) => {
|
||
t.value[r] = {
|
||
id: r,
|
||
// zIndex: getMaxZIndex() + 1,
|
||
async onMounted(l) {
|
||
await l.open(o), a(l);
|
||
},
|
||
onClosed() {
|
||
o.id || delete t.value[r];
|
||
}
|
||
};
|
||
});
|
||
}
|
||
})), (o, r) => (b(), M(be, null, [
|
||
he(o.$slots, "default"),
|
||
(b(!0), M(be, null, Te(t.value, (a) => (b(), $(z(ao), W({
|
||
key: a.id
|
||
}, { ref_for: !0 }, a), null, 16))), 128))
|
||
], 64));
|
||
}
|
||
}), rd = {
|
||
default: "default",
|
||
"header-top": "headerTop",
|
||
headerTop: "headerTop",
|
||
"header-bottom": "headerBottom",
|
||
headerBottom: "headerBottom",
|
||
"header-middle": "headerMiddle",
|
||
headerMiddle: "headerMiddle",
|
||
"actionbar-left": "actionbarLeft",
|
||
actionbarLeft: "actionbarLeft",
|
||
"actionbar-right": "actionbarRight",
|
||
actionbarRight: "actionbarRight",
|
||
"toolbar-left": "toolbarLeft",
|
||
toolbarLeft: "toolbarLeft",
|
||
"toolbar-right": "toolbarRight",
|
||
toolbarRight: "toolbarRight",
|
||
"pagination-left": "paginationLeft",
|
||
paginationLeft: "paginationLeft",
|
||
"pagination-right": "paginationRight",
|
||
paginationRight: "paginationRight",
|
||
"footer-top": "footerTop",
|
||
footerTop: "footerTop",
|
||
"footer-bottom": "footerBottom",
|
||
footerBottom: "footerBottom"
|
||
};
|
||
function Ca(e) {
|
||
const t = {};
|
||
return J(e, (n, o) => {
|
||
if (n == null)
|
||
return;
|
||
const r = rd[o] || o;
|
||
(o === r || t[r] == null) && (t[r] = n);
|
||
}), t;
|
||
}
|
||
function ad(e, t) {
|
||
return {
|
||
...Ca(e),
|
||
...Ca(t)
|
||
};
|
||
}
|
||
function _o(e, t) {
|
||
const n = {};
|
||
return J(e, (o, r) => {
|
||
r.startsWith(t) && (n[r] = o);
|
||
}), n;
|
||
}
|
||
function id(e, t) {
|
||
Ut("get:columns", () => e.table.columns), Ut("update:columns", (n) => {
|
||
t.emit("update:columns", n);
|
||
}), Ut("get:crudBinding", () => e);
|
||
}
|
||
function ld(e, t) {
|
||
const n = K(), o = () => n.value, r = () => n.value ? n.value.getForm() : (ce.warn("请使用expose.getSearchFormData代替"), {}), a = () => n.value ? n.value.getValidatedForm() : (ce.warn("请使用expose.getSearchValidatedFormData代替"), {});
|
||
function i({ form: l, mergeForm: s = !1 }) {
|
||
n.value && n.value.setForm(l, s);
|
||
}
|
||
return {
|
||
searchRef: n,
|
||
getSearchRef: o,
|
||
getSearchFormData: r,
|
||
setSearchFormData: i,
|
||
getSearchValidatedFormData: a
|
||
};
|
||
}
|
||
function sd(e, t, n) {
|
||
return {
|
||
tabsBinding: V(() => {
|
||
var r, a, i, l, s, u, c;
|
||
if (t.tabs && t.tabs.show && t.tabs.name) {
|
||
let d = null;
|
||
const f = { ...t.tabs };
|
||
return (r = t.search) != null && r.columns && ((l = (i = (a = t.search) == null ? void 0 : a.columns[t.tabs.name]) == null ? void 0 : i.component) != null && l.dict) && (d = (c = (u = (s = t.search) == null ? void 0 : s.columns[t.tabs.name]) == null ? void 0 : u.component) == null ? void 0 : c.dict, f.value == null && (f.value = d.value), f.label == null && (f.label = d.label), f.options == null && (f.options = d.data || [])), {
|
||
...f,
|
||
modelValue: t.search.validatedForm && t.search.validatedForm[t.tabs.name],
|
||
"onUpdate:modelValue": (h) => {
|
||
n.emit("tab-change", { [t.tabs.name]: h });
|
||
}
|
||
};
|
||
}
|
||
return {
|
||
show: !1
|
||
};
|
||
})
|
||
};
|
||
}
|
||
function ud(e, t, { tableRef: n, containerRef: o }) {
|
||
var u;
|
||
const r = Le.get();
|
||
let a = r.table;
|
||
if (((u = e.table) == null ? void 0 : u.tableVersion) === "v2" && (a = r.tableV2), a.hasMaxHeight(e.table))
|
||
return {};
|
||
if (!a.fixedHeaderNeedComputeBodyHeight)
|
||
return {};
|
||
const i = K(null);
|
||
function l() {
|
||
var g;
|
||
const c = (g = n == null ? void 0 : n.value) == null ? void 0 : g.$el;
|
||
if (c == null || c.querySelector == null || !(c.querySelector instanceof Function))
|
||
return;
|
||
const d = c.querySelector(a.headerDomSelector);
|
||
if (d == null)
|
||
return;
|
||
const f = c.getBoundingClientRect().height, h = d.getBoundingClientRect().height;
|
||
i.value = f - h - 2 + (e.table.maxHeightAdjust || 0), ce.debug("table max height recomputed ", i.value);
|
||
}
|
||
function s() {
|
||
var h;
|
||
const c = (h = n == null ? void 0 : n.value) == null ? void 0 : h.$el;
|
||
if (c == null)
|
||
return;
|
||
const d = c.parentNode;
|
||
new ResizeObserver(function(g) {
|
||
ce.debug("table resized", g), g.length > 0 && g[0].contentRect.height > 0 && (l(), setTimeout(() => {
|
||
l();
|
||
}, 200), setTimeout(() => {
|
||
l();
|
||
}, 500));
|
||
}).observe(d);
|
||
}
|
||
return Cn(async () => {
|
||
await Be(), await Be(), s();
|
||
}), { maxHeightRef: i, computeBodyHeight: l };
|
||
}
|
||
function cd(e, t) {
|
||
const n = Le.get(), o = K(), r = K(), a = K(), { maxHeightRef: i, computeBodyHeight: l } = ud(e, t, { tableRef: o, containerRef: a }), { merge: s } = Ee(), u = da(e, "table"), c = V(() => {
|
||
var q;
|
||
let A = {};
|
||
if ((i == null ? void 0 : i.value) != null) {
|
||
let D = n.table;
|
||
((q = e.table) == null ? void 0 : q.tableVersion) === "v2" && (D = n.tableV2), A = D.buildMaxHeight(i.value);
|
||
}
|
||
const T = an.dash.omit(u, "loading", "columns", "columnsMap");
|
||
return s(A, { ...t.attrs, ...T });
|
||
}), d = da(e, "toolbar"), f = V(() => ad(e.slots, t.slots)), h = V(() => _o(f.value, "cell")), g = V(() => _o(f.value, "form")), m = V(() => _o(f.value, "search")), y = V(() => _o(f.value, "toolbar")), v = K(), F = V(() => {
|
||
const A = { compact: e.toolbar.compact !== !1 };
|
||
return e.customClass && (A[e.customClass] = !0), A;
|
||
}), R = K(), k = K(!1);
|
||
return {
|
||
tableRef: o,
|
||
containerRef: a,
|
||
toolbarRef: r,
|
||
computedTable: c,
|
||
computedToolbar: d,
|
||
mergedSlots: f,
|
||
computedCellSlots: h,
|
||
formWrapperRef: v,
|
||
isFormInner: k,
|
||
onFormInnerChange: (A) => {
|
||
k.value = A;
|
||
},
|
||
computedFormSlots: g,
|
||
computedSearchSlots: m,
|
||
computedToolbarSlots: y,
|
||
computeBodyHeight: l,
|
||
computedClass: F,
|
||
innerWrapperRef: R
|
||
};
|
||
}
|
||
const dd = ue({
|
||
name: "FsCrud",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 表格id
|
||
*/
|
||
id: {
|
||
type: String,
|
||
default: ""
|
||
},
|
||
/**
|
||
* 表格配置,见FsTable
|
||
*/
|
||
table: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 表格数据
|
||
*/
|
||
// eslint-disable-next-line vue/require-default-prop
|
||
data: {
|
||
type: Array
|
||
},
|
||
/**
|
||
* 操作列配置,见FsRowHandle
|
||
*/
|
||
rowHandle: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 查询框配置,见FsSearch
|
||
*/
|
||
search: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 工具条配置,见FsToolbar
|
||
*/
|
||
toolbar: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 动作条配置,见FsActionbar
|
||
*/
|
||
actionbar: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* tabs filter
|
||
*/
|
||
tabs: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 添加表单对话框配置,见FsFormWrapper
|
||
*/
|
||
addForm: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 编辑表单对话框配置,见FsFormWrapper
|
||
*/
|
||
editForm: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 查看表单对话框配置,见FsFormWrapper
|
||
*/
|
||
viewForm: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 翻页配置,支持el-pagination|a-pagination配置
|
||
*/
|
||
pagination: {
|
||
type: Object,
|
||
default() {
|
||
return { show: !1 };
|
||
}
|
||
},
|
||
/**
|
||
* 容器配置,见FsContainer
|
||
*/
|
||
container: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 配置式插槽,模板插槽同名时优先
|
||
*/
|
||
slots: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* crud包裹容器的class
|
||
*/
|
||
customClass: {},
|
||
/**
|
||
* 不要传到fs-table去
|
||
*/
|
||
form: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 可选择
|
||
*/
|
||
selection: {
|
||
type: Object,
|
||
default() {
|
||
return { show: !1 };
|
||
}
|
||
}
|
||
},
|
||
emits: ["update:search", "update:compact", "update:columns", "form-value-change", "update:modelValue", "tab-change"],
|
||
setup(e, t) {
|
||
const { ui: n } = Se();
|
||
id(e, t);
|
||
const o = ld(), r = sd(o, e, t), a = cd(e, t);
|
||
return {
|
||
ui: n,
|
||
...o,
|
||
...a,
|
||
...r
|
||
};
|
||
}
|
||
});
|
||
const fd = { class: "fs-crud-search" }, hd = {
|
||
key: 0,
|
||
class: "fs-crud-actionbar"
|
||
}, md = {
|
||
key: 0,
|
||
class: "fs-crud-toolbar"
|
||
}, pd = { class: "fs-crud-pagination" }, gd = { class: "fs-pagination-left" }, vd = { class: "fs-pagination" }, bd = { class: "fs-pagination-right" };
|
||
function yd(e, t, n, o, r, a) {
|
||
var f;
|
||
const i = Z("fs-slot-render"), l = Z("fs-actionbar"), s = Z("fs-toolbar"), u = Z("fs-tabs-filter"), c = Z("fs-table"), d = Z("fs-form-wrapper");
|
||
return b(), $(H(((f = e.container) == null ? void 0 : f.is) || "fs-layout-default"), W({
|
||
ref: "containerRef",
|
||
class: "fs-crud-container"
|
||
}, e.container, { class: e.computedClass }), {
|
||
"header-top": B(() => [
|
||
e.mergedSlots.headerTop ? (b(), $(i, {
|
||
key: 0,
|
||
slots: e.mergedSlots.headerTop
|
||
}, null, 8, ["slots"])) : G("", !0)
|
||
]),
|
||
"header-bottom": B(() => [
|
||
e.mergedSlots.headerBottom ? (b(), $(i, {
|
||
key: 0,
|
||
slots: e.mergedSlots.headerBottom
|
||
}, null, 8, ["slots"])) : G("", !0)
|
||
]),
|
||
"header-middle": B(() => [
|
||
e.mergedSlots.headerMiddle ? (b(), $(i, {
|
||
key: 0,
|
||
slots: e.mergedSlots.headerMiddle
|
||
}, null, 8, ["slots"])) : G("", !0)
|
||
]),
|
||
search: B(() => [
|
||
oe("div", fd, [
|
||
(b(), $(H(e.search.is || "fs-search"), W({ ref: "searchRef" }, e.search, { slots: e.computedSearchSlots }), null, 16, ["slots"]))
|
||
])
|
||
]),
|
||
actionbar: B(() => [
|
||
e.actionbar && e.actionbar.show !== !1 ? (b(), M("div", hd, [
|
||
e.mergedSlots.actionbarLeft ? (b(), $(i, {
|
||
key: 0,
|
||
slots: e.mergedSlots.actionbarLeft
|
||
}, null, 8, ["slots"])) : G("", !0),
|
||
N(l, je(Nt(e.actionbar)), null, 16),
|
||
e.mergedSlots.actionbarRight ? (b(), $(i, {
|
||
key: 1,
|
||
slots: e.mergedSlots.actionbarRight
|
||
}, null, 8, ["slots"])) : G("", !0)
|
||
])) : G("", !0)
|
||
]),
|
||
toolbar: B(() => [
|
||
e.toolbar && e.toolbar.show !== !1 ? (b(), M("div", md, [
|
||
e.mergedSlots.toolbarLeft ? (b(), $(i, {
|
||
key: 0,
|
||
slots: e.mergedSlots.toolbarLeft
|
||
}, null, 8, ["slots"])) : G("", !0),
|
||
N(s, W({ ref: "toolbarRef" }, e.toolbar, {
|
||
slots: e.computedToolbarSlots,
|
||
columns: e.table.columns
|
||
}), null, 16, ["slots", "columns"]),
|
||
e.mergedSlots.toolbarRight ? (b(), $(i, {
|
||
key: 1,
|
||
slots: e.mergedSlots.toolbarRight
|
||
}, null, 8, ["slots"])) : G("", !0)
|
||
])) : G("", !0)
|
||
]),
|
||
tabs: B(() => [
|
||
e.tabsBinding.show ? (b(), $(u, W({
|
||
key: 0,
|
||
ref: "tabsRef",
|
||
class: "fs-tabs"
|
||
}, e.tabsBinding), null, 16)) : G("", !0)
|
||
]),
|
||
table: B(() => [
|
||
N(c, W({
|
||
ref: "tableRef",
|
||
class: "fs-crud-table"
|
||
}, e.computedTable, {
|
||
columns: e.table.columns,
|
||
loading: e.table.loading,
|
||
"row-handle": e.rowHandle,
|
||
data: e.data,
|
||
"cell-slots": e.computedCellSlots
|
||
}), null, 16, ["columns", "loading", "row-handle", "data", "cell-slots"])
|
||
]),
|
||
form: B(() => [
|
||
oe("div", {
|
||
ref: "innerWrapperRef",
|
||
class: dt(["fs-form-wrapper-container", { "fs-form-inner-wrapper": e.isFormInner }])
|
||
}, [
|
||
N(d, {
|
||
ref: "formWrapperRef",
|
||
slots: e.computedFormSlots,
|
||
"inner-wrapper": e.innerWrapperRef,
|
||
onInnerChange: e.onFormInnerChange,
|
||
onValueChange: t[0] || (t[0] = (h) => e.$emit("form-value-change", h))
|
||
}, null, 8, ["slots", "inner-wrapper", "onInnerChange"])
|
||
], 2)
|
||
]),
|
||
pagination: B(() => [
|
||
oe("div", pd, [
|
||
oe("div", gd, [
|
||
e.mergedSlots.paginationLeft ? (b(), $(i, {
|
||
key: 0,
|
||
slots: e.mergedSlots.paginationLeft
|
||
}, null, 8, ["slots"])) : G("", !0)
|
||
]),
|
||
oe("div", vd, [
|
||
e.pagination.show !== !1 ? (b(), $(H(e.ui.pagination.name), je(W({ key: 0 }, e.pagination)), null, 16)) : G("", !0)
|
||
]),
|
||
oe("div", bd, [
|
||
e.mergedSlots.paginationRight ? (b(), $(i, {
|
||
key: 0,
|
||
slots: e.mergedSlots.paginationRight
|
||
}, null, 8, ["slots"])) : G("", !0)
|
||
])
|
||
])
|
||
]),
|
||
"footer-top": B(() => [
|
||
e.mergedSlots.footerTop ? (b(), $(i, {
|
||
key: 0,
|
||
slots: e.mergedSlots.footerTop
|
||
}, null, 8, ["slots"])) : G("", !0)
|
||
]),
|
||
"footer-bottom": B(() => [
|
||
e.mergedSlots.footerBottom ? (b(), $(i, {
|
||
key: 0,
|
||
slots: e.mergedSlots.footerBottom
|
||
}, null, 8, ["slots"])) : G("", !0)
|
||
]),
|
||
default: B(() => [
|
||
e.mergedSlots.default ? (b(), $(i, {
|
||
key: 0,
|
||
slots: e.mergedSlots.default
|
||
}, null, 8, ["slots"])) : G("", !0)
|
||
]),
|
||
_: 1
|
||
}, 16, ["class"]);
|
||
}
|
||
const wd = /* @__PURE__ */ $e(dd, [["render", yd]]), _d = ue({
|
||
name: "FsRowHandle",
|
||
props: {
|
||
/**
|
||
* 按钮折叠配置
|
||
*/
|
||
dropdown: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 按钮配置
|
||
* {
|
||
* view:{...FsButton,click:Function,order:1},
|
||
* edit:{...FsButton,click:Function,order:2},
|
||
* remove:{...FsButton,click:Function,order:3},
|
||
* ...自定义
|
||
* }
|
||
*/
|
||
buttons: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 按钮分组,上面的buttons为默认分组
|
||
* {
|
||
* groupKey:{buttonKey:{},buttonKey2:{}}
|
||
* }
|
||
*/
|
||
group: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 当前激活分组
|
||
*/
|
||
active: {
|
||
type: String,
|
||
default: "default"
|
||
},
|
||
/**
|
||
* scope
|
||
*/
|
||
scope: {
|
||
type: Object,
|
||
default: () => ({})
|
||
}
|
||
},
|
||
emits: ["handle"],
|
||
setup(e, t) {
|
||
const { ui: n } = Se(), { merge: o } = Ee(), { t: r } = rt(), a = V(() => ({
|
||
...e.scope,
|
||
row: e.scope[n.tableColumn.row],
|
||
index: e.scope[n.tableColumn.index]
|
||
})), i = (y, v) => {
|
||
const F = e.scope[n.tableColumn.index], R = e.scope[n.tableColumn.row], k = { key: y.key, row: R, btn: y, index: F, ...e.scope, loadingRef: v == null ? void 0 : v.loadingRef };
|
||
if (y.click)
|
||
return y.click(k);
|
||
t.emit("handle", k);
|
||
}, { doComputed: l } = Vt(), s = V(() => ({
|
||
dropdown: e.dropdown,
|
||
buttons: e.buttons,
|
||
active: e.active,
|
||
group: e.group
|
||
})), u = l(
|
||
() => s.value,
|
||
() => {
|
||
const y = e.scope[n.tableColumn.index], v = e.scope[n.tableColumn.row];
|
||
return { ...e.scope, index: y, row: v };
|
||
}
|
||
), c = V(() => {
|
||
let y = null;
|
||
if (u.value.active == null || u.value.active === "default") {
|
||
const F = {
|
||
view: {
|
||
key: "view",
|
||
text: r("fs.rowHandle.view.text"),
|
||
title: r("fs.rowHandle.view.text"),
|
||
size: "small"
|
||
},
|
||
copy: {
|
||
key: "copy",
|
||
text: r("fs.rowHandle.copy.text"),
|
||
title: r("fs.rowHandle.copy.text"),
|
||
size: "small"
|
||
},
|
||
edit: {
|
||
key: "edit",
|
||
type: "primary",
|
||
text: r("fs.rowHandle.edit.text"),
|
||
title: r("fs.rowHandle.edit.text"),
|
||
size: "small"
|
||
},
|
||
remove: {
|
||
key: "remove",
|
||
...n.button.colors("danger"),
|
||
text: r("fs.rowHandle.remove.text"),
|
||
title: r("fs.rowHandle.remove.text"),
|
||
size: "small"
|
||
}
|
||
};
|
||
y = o(F, u.value.buttons);
|
||
} else
|
||
y = u.value.group[u.value.active];
|
||
const v = [];
|
||
return J(y, (F, R) => {
|
||
F.key = R, F.show !== !1 && v.push(F);
|
||
}), Sn(v, (F) => F.order ?? dn.orderDefault);
|
||
}), d = V(() => u.value.dropdown == null || u.value.dropdown.atLeast == null || u.value.dropdown.atLeast <= 0 || c.value.length <= u.value.dropdown.atLeast ? 0 : u.value.dropdown.atLeast || 0);
|
||
function f(y, v) {
|
||
return y.dropdown === !0 || d.value > 0 && d.value < v;
|
||
}
|
||
const h = V(() => {
|
||
let y = 0;
|
||
for (const v of c.value) {
|
||
if (f(v, y))
|
||
return !0;
|
||
y++;
|
||
}
|
||
return !1;
|
||
});
|
||
function g(y) {
|
||
for (let v of c.value)
|
||
if (y === v.key) {
|
||
i(v);
|
||
return;
|
||
}
|
||
}
|
||
const m = V(() => {
|
||
const y = {};
|
||
if (n.dropdown.renderMode !== "slot") {
|
||
const v = c.value, F = [];
|
||
J(v, (R, k) => {
|
||
R.show !== !1 && f(R, k) && F.push({
|
||
[n.dropdown.value]: R.key,
|
||
[n.dropdown.label]: R.text,
|
||
title: R.title
|
||
});
|
||
}), y.options = F;
|
||
}
|
||
return {
|
||
...cn(e.dropdown, "more", "atLeast"),
|
||
...n.dropdown.command(g),
|
||
...y
|
||
};
|
||
});
|
||
return {
|
||
ui: n,
|
||
hasDropdownBtn: h,
|
||
computedHandleBtns: c,
|
||
doDropdownItemClick: g,
|
||
computedDropdownAtLeast: d,
|
||
doClick: i,
|
||
isDropdownBtn: f,
|
||
scopeRef: a,
|
||
computedDropdownBinding: m
|
||
};
|
||
}
|
||
});
|
||
const Cd = { class: "fs-row-handle" }, Sd = {
|
||
key: 0,
|
||
class: "row-handle-btn fs-handle-row-dropdown"
|
||
};
|
||
function Fd(e, t, n, o, r, a) {
|
||
const i = Z("fs-render"), l = Z("fs-button"), s = Z("fs-icon");
|
||
return b(), M("div", Cd, [
|
||
he(e.$slots, "cell-rowHandle-left", je(Nt(e.scopeRef))),
|
||
(b(!0), M(be, null, Te(e.computedHandleBtns, (u, c) => (b(), M(be, { key: c }, [
|
||
u.show !== !1 && !e.isDropdownBtn(u, c) ? (b(), M(be, { key: 0 }, [
|
||
u.render ? (b(), $(i, {
|
||
key: 0,
|
||
"render-func": u.render,
|
||
scope: e.scopeRef
|
||
}, null, 8, ["render-func", "scope"])) : (b(), $(l, W({
|
||
key: 1,
|
||
class: "row-handle-btn"
|
||
}, { ref_for: !0 }, u, {
|
||
onClick: fl((d) => e.doClick(u, d), ["stop"])
|
||
}), null, 16, ["onClick"]))
|
||
], 64)) : G("", !0)
|
||
], 64))), 128)),
|
||
he(e.$slots, "cell-rowHandle-middle", je(Nt(e.scope))),
|
||
e.hasDropdownBtn ? (b(), M("span", Sd, [
|
||
(b(), $(H(e.ui.dropdown.name), je(Nt(e.computedDropdownBinding)), {
|
||
[e.ui.dropdown.slotName]: B(() => [
|
||
e.ui.dropdown.renderMode === "slot" ? (b(), $(H(e.ui.dropdownMenu.name), je(W({ key: 0 }, e.ui.dropdownMenu.command(e.doDropdownItemClick))), {
|
||
default: B(() => [
|
||
(b(!0), M(be, null, Te(e.computedHandleBtns, (u, c) => (b(), M(be, { key: c }, [
|
||
u.show !== !1 && e.isDropdownBtn(u, c) ? (b(), $(H(e.ui.dropdownItem.name), W({
|
||
key: 0,
|
||
[e.ui.dropdownItem.command || ""]: u.key
|
||
}, { ref_for: !0 }, u.dropdownItem, {
|
||
disabled: u.disabled
|
||
}), {
|
||
default: B(() => [
|
||
u.render ? (b(), $(i, {
|
||
key: 0,
|
||
"render-func": u.render,
|
||
scope: e.scopeRef
|
||
}, null, 8, ["render-func", "scope"])) : (b(), M("div", W({
|
||
key: 1,
|
||
class: "fs-row-handle-dropdown-item"
|
||
}, { ref_for: !0 }, u), [
|
||
u.icon ? (b(), $(s, {
|
||
key: 0,
|
||
icon: u.icon
|
||
}, null, 8, ["icon"])) : G("", !0),
|
||
Ct(" " + Pe(u.text || u.title), 1)
|
||
], 16))
|
||
]),
|
||
_: 2
|
||
}, 1040, ["disabled"])) : G("", !0)
|
||
], 64))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16)) : G("", !0)
|
||
]),
|
||
default: B(() => [
|
||
N(l, je(Nt(e.dropdown.more)), null, 16)
|
||
]),
|
||
_: 2
|
||
}, 1040))
|
||
])) : G("", !0),
|
||
he(e.$slots, "cell-rowHandle-right", je(Nt(e.scope)))
|
||
]);
|
||
}
|
||
const Ri = /* @__PURE__ */ $e(_d, [["render", Fd]]);
|
||
function bn() {
|
||
return bn = Object.assign ? Object.assign.bind() : function(e) {
|
||
for (var t = 1; t < arguments.length; t++) {
|
||
var n = arguments[t];
|
||
for (var o in n)
|
||
Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]);
|
||
}
|
||
return e;
|
||
}, bn.apply(this, arguments);
|
||
}
|
||
function Rd(e, t) {
|
||
e.prototype = Object.create(t.prototype), e.prototype.constructor = e, io(e, t);
|
||
}
|
||
function Ir(e) {
|
||
return Ir = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(n) {
|
||
return n.__proto__ || Object.getPrototypeOf(n);
|
||
}, Ir(e);
|
||
}
|
||
function io(e, t) {
|
||
return io = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(o, r) {
|
||
return o.__proto__ = r, o;
|
||
}, io(e, t);
|
||
}
|
||
function kd() {
|
||
if (typeof Reflect > "u" || !Reflect.construct || Reflect.construct.sham)
|
||
return !1;
|
||
if (typeof Proxy == "function")
|
||
return !0;
|
||
try {
|
||
return Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
|
||
})), !0;
|
||
} catch {
|
||
return !1;
|
||
}
|
||
}
|
||
function $o(e, t, n) {
|
||
return kd() ? $o = Reflect.construct.bind() : $o = function(r, a, i) {
|
||
var l = [null];
|
||
l.push.apply(l, a);
|
||
var s = Function.bind.apply(r, l), u = new s();
|
||
return i && io(u, i.prototype), u;
|
||
}, $o.apply(null, arguments);
|
||
}
|
||
function Dd(e) {
|
||
return Function.toString.call(e).indexOf("[native code]") !== -1;
|
||
}
|
||
function Vr(e) {
|
||
var t = typeof Map == "function" ? /* @__PURE__ */ new Map() : void 0;
|
||
return Vr = function(o) {
|
||
if (o === null || !Dd(o))
|
||
return o;
|
||
if (typeof o != "function")
|
||
throw new TypeError("Super expression must either be null or a function");
|
||
if (typeof t < "u") {
|
||
if (t.has(o))
|
||
return t.get(o);
|
||
t.set(o, r);
|
||
}
|
||
function r() {
|
||
return $o(o, arguments, Ir(this).constructor);
|
||
}
|
||
return r.prototype = Object.create(o.prototype, {
|
||
constructor: {
|
||
value: r,
|
||
enumerable: !1,
|
||
writable: !0,
|
||
configurable: !0
|
||
}
|
||
}), io(r, o);
|
||
}, Vr(e);
|
||
}
|
||
var Od = /%[sdj%]/g, ki = function() {
|
||
};
|
||
typeof process < "u" && process.env && process.env.NODE_ENV !== "production" && typeof window < "u" && typeof document < "u" && (ki = function(t, n) {
|
||
typeof console < "u" && console.warn && typeof ASYNC_VALIDATOR_NO_WARNING > "u" && n.every(function(o) {
|
||
return typeof o == "string";
|
||
}) && console.warn(t, n);
|
||
});
|
||
function Pr(e) {
|
||
if (!e || !e.length)
|
||
return null;
|
||
var t = {};
|
||
return e.forEach(function(n) {
|
||
var o = n.field;
|
||
t[o] = t[o] || [], t[o].push(n);
|
||
}), t;
|
||
}
|
||
function _t(e) {
|
||
for (var t = arguments.length, n = new Array(t > 1 ? t - 1 : 0), o = 1; o < t; o++)
|
||
n[o - 1] = arguments[o];
|
||
var r = 0, a = n.length;
|
||
if (typeof e == "function")
|
||
return e.apply(null, n);
|
||
if (typeof e == "string") {
|
||
var i = e.replace(Od, function(l) {
|
||
if (l === "%%")
|
||
return "%";
|
||
if (r >= a)
|
||
return l;
|
||
switch (l) {
|
||
case "%s":
|
||
return String(n[r++]);
|
||
case "%d":
|
||
return Number(n[r++]);
|
||
case "%j":
|
||
try {
|
||
return JSON.stringify(n[r++]);
|
||
} catch {
|
||
return "[Circular]";
|
||
}
|
||
break;
|
||
default:
|
||
return l;
|
||
}
|
||
});
|
||
return i;
|
||
}
|
||
return e;
|
||
}
|
||
function Ed(e) {
|
||
return e === "string" || e === "url" || e === "hex" || e === "email" || e === "date" || e === "pattern";
|
||
}
|
||
function Ye(e, t) {
|
||
return !!(e == null || t === "array" && Array.isArray(e) && !e.length || Ed(t) && typeof e == "string" && !e);
|
||
}
|
||
function Td(e, t, n) {
|
||
var o = [], r = 0, a = e.length;
|
||
function i(l) {
|
||
o.push.apply(o, l || []), r++, r === a && n(o);
|
||
}
|
||
e.forEach(function(l) {
|
||
t(l, i);
|
||
});
|
||
}
|
||
function Sa(e, t, n) {
|
||
var o = 0, r = e.length;
|
||
function a(i) {
|
||
if (i && i.length) {
|
||
n(i);
|
||
return;
|
||
}
|
||
var l = o;
|
||
o = o + 1, l < r ? t(e[l], a) : n([]);
|
||
}
|
||
a([]);
|
||
}
|
||
function $d(e) {
|
||
var t = [];
|
||
return Object.keys(e).forEach(function(n) {
|
||
t.push.apply(t, e[n] || []);
|
||
}), t;
|
||
}
|
||
var Fa = /* @__PURE__ */ function(e) {
|
||
Rd(t, e);
|
||
function t(n, o) {
|
||
var r;
|
||
return r = e.call(this, "Async Validation Error") || this, r.errors = n, r.fields = o, r;
|
||
}
|
||
return t;
|
||
}(/* @__PURE__ */ Vr(Error));
|
||
function Ad(e, t, n, o, r) {
|
||
if (t.first) {
|
||
var a = new Promise(function(f, h) {
|
||
var g = function(v) {
|
||
return o(v), v.length ? h(new Fa(v, Pr(v))) : f(r);
|
||
}, m = $d(e);
|
||
Sa(m, n, g);
|
||
});
|
||
return a.catch(function(f) {
|
||
return f;
|
||
}), a;
|
||
}
|
||
var i = t.firstFields === !0 ? Object.keys(e) : t.firstFields || [], l = Object.keys(e), s = l.length, u = 0, c = [], d = new Promise(function(f, h) {
|
||
var g = function(y) {
|
||
if (c.push.apply(c, y), u++, u === s)
|
||
return o(c), c.length ? h(new Fa(c, Pr(c))) : f(r);
|
||
};
|
||
l.length || (o(c), f(r)), l.forEach(function(m) {
|
||
var y = e[m];
|
||
i.indexOf(m) !== -1 ? Sa(y, n, g) : Td(y, n, g);
|
||
});
|
||
});
|
||
return d.catch(function(f) {
|
||
return f;
|
||
}), d;
|
||
}
|
||
function Id(e) {
|
||
return !!(e && e.message !== void 0);
|
||
}
|
||
function Vd(e, t) {
|
||
for (var n = e, o = 0; o < t.length; o++) {
|
||
if (n == null)
|
||
return n;
|
||
n = n[t[o]];
|
||
}
|
||
return n;
|
||
}
|
||
function Ra(e, t) {
|
||
return function(n) {
|
||
var o;
|
||
return e.fullFields ? o = Vd(t, e.fullFields) : o = t[n.field || e.fullField], Id(n) ? (n.field = n.field || e.fullField, n.fieldValue = o, n) : {
|
||
message: typeof n == "function" ? n() : n,
|
||
fieldValue: o,
|
||
field: n.field || e.fullField
|
||
};
|
||
};
|
||
}
|
||
function ka(e, t) {
|
||
if (t) {
|
||
for (var n in t)
|
||
if (t.hasOwnProperty(n)) {
|
||
var o = t[n];
|
||
typeof o == "object" && typeof e[n] == "object" ? e[n] = bn({}, e[n], o) : e[n] = o;
|
||
}
|
||
}
|
||
return e;
|
||
}
|
||
var Di = function(t, n, o, r, a, i) {
|
||
t.required && (!o.hasOwnProperty(t.field) || Ye(n, i || t.type)) && r.push(_t(a.messages.required, t.fullField));
|
||
}, Pd = function(t, n, o, r, a) {
|
||
(/^\s+$/.test(n) || n === "") && r.push(_t(a.messages.whitespace, t.fullField));
|
||
}, Co, Md = function() {
|
||
if (Co)
|
||
return Co;
|
||
var e = "[a-fA-F\\d:]", t = function(k) {
|
||
return k && k.includeBoundaries ? "(?:(?<=\\s|^)(?=" + e + ")|(?<=" + e + ")(?=\\s|$))" : "";
|
||
}, n = "(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}", o = "[a-fA-F\\d]{1,4}", r = (`
|
||
(?:
|
||
(?:` + o + ":){7}(?:" + o + `|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8
|
||
(?:` + o + ":){6}(?:" + n + "|:" + o + `|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4
|
||
(?:` + o + ":){5}(?::" + n + "|(?::" + o + `){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4
|
||
(?:` + o + ":){4}(?:(?::" + o + "){0,1}:" + n + "|(?::" + o + `){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4
|
||
(?:` + o + ":){3}(?:(?::" + o + "){0,2}:" + n + "|(?::" + o + `){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4
|
||
(?:` + o + ":){2}(?:(?::" + o + "){0,3}:" + n + "|(?::" + o + `){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4
|
||
(?:` + o + ":){1}(?:(?::" + o + "){0,4}:" + n + "|(?::" + o + `){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4
|
||
(?::(?:(?::` + o + "){0,5}:" + n + "|(?::" + o + `){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4
|
||
)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1
|
||
`).replace(/\s*\/\/.*$/gm, "").replace(/\n/g, "").trim(), a = new RegExp("(?:^" + n + "$)|(?:^" + r + "$)"), i = new RegExp("^" + n + "$"), l = new RegExp("^" + r + "$"), s = function(k) {
|
||
return k && k.exact ? a : new RegExp("(?:" + t(k) + n + t(k) + ")|(?:" + t(k) + r + t(k) + ")", "g");
|
||
};
|
||
s.v4 = function(R) {
|
||
return R && R.exact ? i : new RegExp("" + t(R) + n + t(R), "g");
|
||
}, s.v6 = function(R) {
|
||
return R && R.exact ? l : new RegExp("" + t(R) + r + t(R), "g");
|
||
};
|
||
var u = "(?:(?:[a-z]+:)?//)", c = "(?:\\S+(?::\\S*)?@)?", d = s.v4().source, f = s.v6().source, h = "(?:(?:[a-z\\u00a1-\\uffff0-9][-_]*)*[a-z\\u00a1-\\uffff0-9]+)", g = "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*", m = "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))", y = "(?::\\d{2,5})?", v = '(?:[/?#][^\\s"]*)?', F = "(?:" + u + "|www\\.)" + c + "(?:localhost|" + d + "|" + f + "|" + h + g + m + ")" + y + v;
|
||
return Co = new RegExp("(?:^" + F + "$)", "i"), Co;
|
||
}, Da = {
|
||
// http://emailregex.com/
|
||
email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/,
|
||
// url: new RegExp(
|
||
// '^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$',
|
||
// 'i',
|
||
// ),
|
||
hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i
|
||
}, Kn = {
|
||
integer: function(t) {
|
||
return Kn.number(t) && parseInt(t, 10) === t;
|
||
},
|
||
float: function(t) {
|
||
return Kn.number(t) && !Kn.integer(t);
|
||
},
|
||
array: function(t) {
|
||
return Array.isArray(t);
|
||
},
|
||
regexp: function(t) {
|
||
if (t instanceof RegExp)
|
||
return !0;
|
||
try {
|
||
return !!new RegExp(t);
|
||
} catch {
|
||
return !1;
|
||
}
|
||
},
|
||
date: function(t) {
|
||
return typeof t.getTime == "function" && typeof t.getMonth == "function" && typeof t.getYear == "function" && !isNaN(t.getTime());
|
||
},
|
||
number: function(t) {
|
||
return isNaN(t) ? !1 : typeof t == "number";
|
||
},
|
||
object: function(t) {
|
||
return typeof t == "object" && !Kn.array(t);
|
||
},
|
||
method: function(t) {
|
||
return typeof t == "function";
|
||
},
|
||
email: function(t) {
|
||
return typeof t == "string" && t.length <= 320 && !!t.match(Da.email);
|
||
},
|
||
url: function(t) {
|
||
return typeof t == "string" && t.length <= 2048 && !!t.match(Md());
|
||
},
|
||
hex: function(t) {
|
||
return typeof t == "string" && !!t.match(Da.hex);
|
||
}
|
||
}, Bd = function(t, n, o, r, a) {
|
||
if (t.required && n === void 0) {
|
||
Di(t, n, o, r, a);
|
||
return;
|
||
}
|
||
var i = ["integer", "float", "array", "regexp", "object", "method", "email", "number", "date", "url", "hex"], l = t.type;
|
||
i.indexOf(l) > -1 ? Kn[l](n) || r.push(_t(a.messages.types[l], t.fullField, t.type)) : l && typeof n !== t.type && r.push(_t(a.messages.types[l], t.fullField, t.type));
|
||
}, jd = function(t, n, o, r, a) {
|
||
var i = typeof t.len == "number", l = typeof t.min == "number", s = typeof t.max == "number", u = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, c = n, d = null, f = typeof n == "number", h = typeof n == "string", g = Array.isArray(n);
|
||
if (f ? d = "number" : h ? d = "string" : g && (d = "array"), !d)
|
||
return !1;
|
||
g && (c = n.length), h && (c = n.replace(u, "_").length), i ? c !== t.len && r.push(_t(a.messages[d].len, t.fullField, t.len)) : l && !s && c < t.min ? r.push(_t(a.messages[d].min, t.fullField, t.min)) : s && !l && c > t.max ? r.push(_t(a.messages[d].max, t.fullField, t.max)) : l && s && (c < t.min || c > t.max) && r.push(_t(a.messages[d].range, t.fullField, t.min, t.max));
|
||
}, kn = "enum", xd = function(t, n, o, r, a) {
|
||
t[kn] = Array.isArray(t[kn]) ? t[kn] : [], t[kn].indexOf(n) === -1 && r.push(_t(a.messages[kn], t.fullField, t[kn].join(", ")));
|
||
}, Nd = function(t, n, o, r, a) {
|
||
if (t.pattern) {
|
||
if (t.pattern instanceof RegExp)
|
||
t.pattern.lastIndex = 0, t.pattern.test(n) || r.push(_t(a.messages.pattern.mismatch, t.fullField, n, t.pattern));
|
||
else if (typeof t.pattern == "string") {
|
||
var i = new RegExp(t.pattern);
|
||
i.test(n) || r.push(_t(a.messages.pattern.mismatch, t.fullField, n, t.pattern));
|
||
}
|
||
}
|
||
}, Re = {
|
||
required: Di,
|
||
whitespace: Pd,
|
||
type: Bd,
|
||
range: jd,
|
||
enum: xd,
|
||
pattern: Nd
|
||
}, Ld = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (Ye(n, "string") && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a, "string"), Ye(n, "string") || (Re.type(t, n, r, i, a), Re.range(t, n, r, i, a), Re.pattern(t, n, r, i, a), t.whitespace === !0 && Re.whitespace(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, zd = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && Re.type(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, qd = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (n === "" && (n = void 0), Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && (Re.type(t, n, r, i, a), Re.range(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, Hd = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && Re.type(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Wd = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), Ye(n) || Re.type(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Ud = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && (Re.type(t, n, r, i, a), Re.range(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, Kd = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && (Re.type(t, n, r, i, a), Re.range(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, Yd = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (n == null && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a, "array"), n != null && (Re.type(t, n, r, i, a), Re.range(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, Gd = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && Re.type(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Xd = "enum", Jd = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && Re[Xd](t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Qd = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (Ye(n, "string") && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), Ye(n, "string") || Re.pattern(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Zd = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (Ye(n, "date") && !t.required)
|
||
return o();
|
||
if (Re.required(t, n, r, i, a), !Ye(n, "date")) {
|
||
var s;
|
||
n instanceof Date ? s = n : s = new Date(n), Re.type(t, s, r, i, a), s && Re.range(t, s.getTime(), r, i, a);
|
||
}
|
||
}
|
||
o(i);
|
||
}, ef = function(t, n, o, r, a) {
|
||
var i = [], l = Array.isArray(n) ? "array" : typeof n;
|
||
Re.required(t, n, r, i, a, l), o(i);
|
||
}, ur = function(t, n, o, r, a) {
|
||
var i = t.type, l = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (Ye(n, i) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, l, a, i), Ye(n, i) || Re.type(t, n, r, l, a);
|
||
}
|
||
o(l);
|
||
}, tf = function(t, n, o, r, a) {
|
||
var i = [], l = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (l) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Jn = {
|
||
string: Ld,
|
||
method: zd,
|
||
number: qd,
|
||
boolean: Hd,
|
||
regexp: Wd,
|
||
integer: Ud,
|
||
float: Kd,
|
||
array: Yd,
|
||
object: Gd,
|
||
enum: Jd,
|
||
pattern: Qd,
|
||
date: Zd,
|
||
url: ur,
|
||
hex: ur,
|
||
email: ur,
|
||
required: ef,
|
||
any: tf
|
||
};
|
||
function Mr() {
|
||
return {
|
||
default: "Validation error on field %s",
|
||
required: "%s is required",
|
||
enum: "%s must be one of %s",
|
||
whitespace: "%s cannot be empty",
|
||
date: {
|
||
format: "%s date %s is invalid for format %s",
|
||
parse: "%s date could not be parsed, %s is invalid ",
|
||
invalid: "%s date %s is invalid"
|
||
},
|
||
types: {
|
||
string: "%s is not a %s",
|
||
method: "%s is not a %s (function)",
|
||
array: "%s is not an %s",
|
||
object: "%s is not an %s",
|
||
number: "%s is not a %s",
|
||
date: "%s is not a %s",
|
||
boolean: "%s is not a %s",
|
||
integer: "%s is not an %s",
|
||
float: "%s is not a %s",
|
||
regexp: "%s is not a valid %s",
|
||
email: "%s is not a valid %s",
|
||
url: "%s is not a valid %s",
|
||
hex: "%s is not a valid %s"
|
||
},
|
||
string: {
|
||
len: "%s must be exactly %s characters",
|
||
min: "%s must be at least %s characters",
|
||
max: "%s cannot be longer than %s characters",
|
||
range: "%s must be between %s and %s characters"
|
||
},
|
||
number: {
|
||
len: "%s must equal %s",
|
||
min: "%s cannot be less than %s",
|
||
max: "%s cannot be greater than %s",
|
||
range: "%s must be between %s and %s"
|
||
},
|
||
array: {
|
||
len: "%s must be exactly %s in length",
|
||
min: "%s cannot be less than %s in length",
|
||
max: "%s cannot be greater than %s in length",
|
||
range: "%s must be between %s and %s in length"
|
||
},
|
||
pattern: {
|
||
mismatch: "%s value %s does not match pattern %s"
|
||
},
|
||
clone: function() {
|
||
var t = JSON.parse(JSON.stringify(this));
|
||
return t.clone = this.clone, t;
|
||
}
|
||
};
|
||
}
|
||
var Br = Mr(), go = /* @__PURE__ */ function() {
|
||
function e(n) {
|
||
this.rules = null, this._messages = Br, this.define(n);
|
||
}
|
||
var t = e.prototype;
|
||
return t.define = function(o) {
|
||
var r = this;
|
||
if (!o)
|
||
throw new Error("Cannot configure a schema with no rules");
|
||
if (typeof o != "object" || Array.isArray(o))
|
||
throw new Error("Rules must be an object");
|
||
this.rules = {}, Object.keys(o).forEach(function(a) {
|
||
var i = o[a];
|
||
r.rules[a] = Array.isArray(i) ? i : [i];
|
||
});
|
||
}, t.messages = function(o) {
|
||
return o && (this._messages = ka(Mr(), o)), this._messages;
|
||
}, t.validate = function(o, r, a) {
|
||
var i = this;
|
||
r === void 0 && (r = {}), a === void 0 && (a = function() {
|
||
});
|
||
var l = o, s = r, u = a;
|
||
if (typeof s == "function" && (u = s, s = {}), !this.rules || Object.keys(this.rules).length === 0)
|
||
return u && u(null, l), Promise.resolve(l);
|
||
function c(m) {
|
||
var y = [], v = {};
|
||
function F(k) {
|
||
if (Array.isArray(k)) {
|
||
var j;
|
||
y = (j = y).concat.apply(j, k);
|
||
} else
|
||
y.push(k);
|
||
}
|
||
for (var R = 0; R < m.length; R++)
|
||
F(m[R]);
|
||
y.length ? (v = Pr(y), u(y, v)) : u(null, l);
|
||
}
|
||
if (s.messages) {
|
||
var d = this.messages();
|
||
d === Br && (d = Mr()), ka(d, s.messages), s.messages = d;
|
||
} else
|
||
s.messages = this.messages();
|
||
var f = {}, h = s.keys || Object.keys(this.rules);
|
||
h.forEach(function(m) {
|
||
var y = i.rules[m], v = l[m];
|
||
y.forEach(function(F) {
|
||
var R = F;
|
||
typeof R.transform == "function" && (l === o && (l = bn({}, l)), v = l[m] = R.transform(v)), typeof R == "function" ? R = {
|
||
validator: R
|
||
} : R = bn({}, R), R.validator = i.getValidationMethod(R), R.validator && (R.field = m, R.fullField = R.fullField || m, R.type = i.getType(R), f[m] = f[m] || [], f[m].push({
|
||
rule: R,
|
||
value: v,
|
||
source: l,
|
||
field: m
|
||
}));
|
||
});
|
||
});
|
||
var g = {};
|
||
return Ad(f, s, function(m, y) {
|
||
var v = m.rule, F = (v.type === "object" || v.type === "array") && (typeof v.fields == "object" || typeof v.defaultField == "object");
|
||
F = F && (v.required || !v.required && m.value), v.field = m.field;
|
||
function R(A, T) {
|
||
return bn({}, T, {
|
||
fullField: v.fullField + "." + A,
|
||
fullFields: v.fullFields ? [].concat(v.fullFields, [A]) : [A]
|
||
});
|
||
}
|
||
function k(A) {
|
||
A === void 0 && (A = []);
|
||
var T = Array.isArray(A) ? A : [A];
|
||
!s.suppressWarning && T.length && e.warning("async-validator:", T), T.length && v.message !== void 0 && (T = [].concat(v.message));
|
||
var q = T.map(Ra(v, l));
|
||
if (s.first && q.length)
|
||
return g[v.field] = 1, y(q);
|
||
if (!F)
|
||
y(q);
|
||
else {
|
||
if (v.required && !m.value)
|
||
return v.message !== void 0 ? q = [].concat(v.message).map(Ra(v, l)) : s.error && (q = [s.error(v, _t(s.messages.required, v.field))]), y(q);
|
||
var D = {};
|
||
v.defaultField && Object.keys(m.value).map(function(I) {
|
||
D[I] = v.defaultField;
|
||
}), D = bn({}, D, m.rule.fields);
|
||
var Y = {};
|
||
Object.keys(D).forEach(function(I) {
|
||
var P = D[I], X = Array.isArray(P) ? P : [P];
|
||
Y[I] = X.map(R.bind(null, I));
|
||
});
|
||
var le = new e(Y);
|
||
le.messages(s.messages), m.rule.options && (m.rule.options.messages = s.messages, m.rule.options.error = s.error), le.validate(m.value, m.rule.options || s, function(I) {
|
||
var P = [];
|
||
q && q.length && P.push.apply(P, q), I && I.length && P.push.apply(P, I), y(P.length ? P : null);
|
||
});
|
||
}
|
||
}
|
||
var j;
|
||
if (v.asyncValidator)
|
||
j = v.asyncValidator(v, m.value, k, m.source, s);
|
||
else if (v.validator) {
|
||
try {
|
||
j = v.validator(v, m.value, k, m.source, s);
|
||
} catch (A) {
|
||
console.error == null || console.error(A), s.suppressValidatorError || setTimeout(function() {
|
||
throw A;
|
||
}, 0), k(A.message);
|
||
}
|
||
j === !0 ? k() : j === !1 ? k(typeof v.message == "function" ? v.message(v.fullField || v.field) : v.message || (v.fullField || v.field) + " fails") : j instanceof Array ? k(j) : j instanceof Error && k(j.message);
|
||
}
|
||
j && j.then && j.then(function() {
|
||
return k();
|
||
}, function(A) {
|
||
return k(A);
|
||
});
|
||
}, function(m) {
|
||
c(m);
|
||
}, l);
|
||
}, t.getType = function(o) {
|
||
if (o.type === void 0 && o.pattern instanceof RegExp && (o.type = "pattern"), typeof o.validator != "function" && o.type && !Jn.hasOwnProperty(o.type))
|
||
throw new Error(_t("Unknown rule type %s", o.type));
|
||
return o.type || "string";
|
||
}, t.getValidationMethod = function(o) {
|
||
if (typeof o.validator == "function")
|
||
return o.validator;
|
||
var r = Object.keys(o), a = r.indexOf("message");
|
||
return a !== -1 && r.splice(a, 1), r.length === 1 && r[0] === "required" ? Jn.required : Jn[this.getType(o)] || void 0;
|
||
}, e;
|
||
}();
|
||
go.register = function(t, n) {
|
||
if (typeof n != "function")
|
||
throw new Error("Cannot register a validator by type, validator is not a function");
|
||
Jn[t] = n;
|
||
};
|
||
go.warning = ki;
|
||
go.messages = Br;
|
||
go.validators = Jn;
|
||
function nf(e) {
|
||
const t = {};
|
||
for (const n in e) {
|
||
const o = e[n].getForm(), r = o.rules || o.rule, a = n.split(".");
|
||
let i = t;
|
||
if (r)
|
||
for (let l = 0; l < a.length; l++) {
|
||
const s = a[l];
|
||
i[s] || (i[s] = { type: "object", fields: {} }), l == a.length - 1 ? i[s] = r : i = i[s].fields;
|
||
}
|
||
}
|
||
return new go(t);
|
||
}
|
||
function jr(e, t) {
|
||
J(e, (n) => {
|
||
n.children ? jr(n.children, t) : t(n);
|
||
});
|
||
}
|
||
function of(e, t) {
|
||
const n = Le.get();
|
||
function o() {
|
||
if (e.data)
|
||
return e.data;
|
||
if (t.value) {
|
||
let r = n.table;
|
||
return e.tableVersion === "v2" && (r = n.tableV2), t.value[r.data] || [];
|
||
}
|
||
return [];
|
||
}
|
||
return {
|
||
getData: o,
|
||
insert(r, a) {
|
||
o().splice(r, 0, a);
|
||
},
|
||
unshift(r) {
|
||
o().unshift(r);
|
||
},
|
||
remove(r) {
|
||
o().splice(r, 1);
|
||
},
|
||
get(r) {
|
||
return o()[r];
|
||
}
|
||
};
|
||
}
|
||
function rf(e, t, n) {
|
||
const o = of(e, n), r = un([]);
|
||
function a(w) {
|
||
return typeof e.rowKey == "string" ? w[e.rowKey] : e.rowKey(w);
|
||
}
|
||
function i(w) {
|
||
return w[e.editable.rowKey];
|
||
}
|
||
function l(w) {
|
||
for (const _ in r) {
|
||
const C = r[_], S = C.cells, E = C.rowData;
|
||
if (w({ rowData: E, row: C, cells: S }) === "break")
|
||
return;
|
||
}
|
||
}
|
||
function s(w) {
|
||
l(({ rowData: _, row: C, cells: S }) => {
|
||
J(S, (E, L) => {
|
||
w({ rowData: _, row: C, cells: S, cell: E, key: L });
|
||
});
|
||
});
|
||
}
|
||
const { merge: u } = Ee(), c = V(() => u({
|
||
enabled: !1,
|
||
//模式,free,row,cell
|
||
mode: "free",
|
||
rowKey: "id",
|
||
addForm: {},
|
||
editForm: {},
|
||
//是否排他式激活,激活一个,其他自动提交或取消
|
||
exclusive: !0,
|
||
//排他式激活时,其他的效果,cancel,save
|
||
exclusiveEffect: "cancel",
|
||
//激活触发方式,onClick,onDbClick
|
||
activeTrigger: "onClick",
|
||
//默认激活
|
||
activeDefault: !1,
|
||
isEditable(w) {
|
||
return !0;
|
||
}
|
||
}, e.editable));
|
||
function d(w, _, C, S) {
|
||
function E(Ce) {
|
||
return et(w, Ce);
|
||
}
|
||
function L(Ce, ze) {
|
||
We(w, Ce, ze);
|
||
}
|
||
const se = V(() => {
|
||
var Ce;
|
||
return ((Ce = S.editable) == null ? void 0 : Ce.updateCell) || c.value.updateCell;
|
||
}), ae = V(() => {
|
||
var Ce;
|
||
return ((Ce = S.editable) == null ? void 0 : Ce.showAction) ?? c.value.showAction;
|
||
}), de = un({
|
||
mode: C < 0 ? "add" : "edit",
|
||
oldValue: void 0,
|
||
newValue: void 0,
|
||
loading: !1,
|
||
isEditing: c.value.activeDefault,
|
||
activeTrigger: c.value.activeTrigger,
|
||
column: S,
|
||
updateCell: se,
|
||
showAction: ae,
|
||
isEditable: () => {
|
||
var Qe;
|
||
let Ce = (Qe = S == null ? void 0 : S.editable) == null ? void 0 : Qe.disabled;
|
||
Ce instanceof Function && (Ce = Ce({ column: S, editableId: C, row: w }));
|
||
let ze = null;
|
||
return Ce != null && (ze = !Ce), ze ?? (c.value.isEditable({ editableId: C, key: _, row: w }) || !1);
|
||
},
|
||
isChanged: () => de.newValue !== de.oldValue,
|
||
getForm: () => {
|
||
let Ce = c.value[de.mode + "Form"];
|
||
return Ce == null && (Ce = c.value.editForm), Ce[_];
|
||
},
|
||
active: (Ce = {}) => {
|
||
(Ce.exclusive ?? c.value.exclusive) && ((Ce.exclusiveEffect ?? c.value.exclusiveEffect) === "save" ? k() : j()), de.isEditing = !0, de.oldValue = E(_);
|
||
const Qe = c.value.editForm[_];
|
||
Qe && le(Qe, w);
|
||
},
|
||
inactive: () => {
|
||
de.isEditing = !1, de.newValue = E(_);
|
||
},
|
||
resume: () => {
|
||
de.isEditing && (de.isEditing = !1, L(_, de.oldValue), delete de.newValue, delete de.oldValue);
|
||
},
|
||
cancel: () => {
|
||
de.resume();
|
||
},
|
||
persist: () => {
|
||
de.isEditing = !1, delete de.newValue, delete de.oldValue;
|
||
},
|
||
save: async () => {
|
||
const Ce = z(de.updateCell);
|
||
if (!Ce) {
|
||
ce.warn("没有配置table.editable.updateCell方法,无法保存,相关文档:http://fast-crud.docmirror.cn/api/crud-options/table.html#editable");
|
||
return;
|
||
}
|
||
de.loading = !0;
|
||
try {
|
||
const ze = await Ce({ editableId: C, row: w, key: _, value: E(_) }), Qe = w[c.value.rowKey];
|
||
(Qe == null || Qe <= 0) && ((ze && ze[c.value.rowKey]) == null ? ce.error(`对于添加的行,updateCell方法需要返回{'id':value},如果你配置了别的rowKey,需要返回{[rowKey]:id}。
|
||
当前返回值:${JSON.stringify(ze)}`) : w[c.value.rowKey] = ze[c.value.rowKey]), de.persist();
|
||
} finally {
|
||
de.loading = !1;
|
||
}
|
||
}
|
||
});
|
||
return de;
|
||
}
|
||
function f(w, _) {
|
||
const C = {};
|
||
jr(e.columns, (ae) => {
|
||
C[ae.key] = d(_, ae.key, w, ae);
|
||
});
|
||
const S = V(() => nf(C)), E = a(_), L = E == null || E < 0, se = un({
|
||
isAdd: L,
|
||
rowData: _,
|
||
editableId: w,
|
||
isEditing: !1,
|
||
loading: !1,
|
||
cells: C,
|
||
validator: S,
|
||
inactive: () => {
|
||
se.isEditing = !1, J(se.cells, (ae) => {
|
||
ae.isEditing && ae.inactive();
|
||
});
|
||
},
|
||
active: () => {
|
||
se.isEditing = !0, J(se.cells, (ae) => {
|
||
ae.active({ exclusive: !1 });
|
||
});
|
||
},
|
||
persist: () => {
|
||
se.isEditing = !1, se.inactive(), delete se.isAdd, J(se.cells, (ae) => {
|
||
ae.persist();
|
||
});
|
||
},
|
||
resume: () => {
|
||
se.isEditing = !1, J(se.cells, (ae) => {
|
||
ae.resume();
|
||
});
|
||
},
|
||
cancel: () => {
|
||
se.resume();
|
||
},
|
||
validate: async (ae) => {
|
||
try {
|
||
return J(se.cells, (de, Ce) => {
|
||
de.validateErrors = [];
|
||
}), ae == null && (ae = se.rowData), await se.validator.validate(ae), !0;
|
||
} catch (de) {
|
||
const { errors: Ce, fields: ze } = de;
|
||
return J(ze, (Qe, ee) => {
|
||
const ve = se.cells[ee];
|
||
ve && (ve.validateErrors = Qe);
|
||
}), ze;
|
||
}
|
||
},
|
||
getRowData: () => {
|
||
const ae = ft(se.rowData);
|
||
return delete ae[e.editable.rowKey], delete ae.children, ae;
|
||
},
|
||
save: async (ae) => {
|
||
const { doSave: de } = ae, Ce = se.rowData, { merge: ze } = Ee();
|
||
if (await se.validate() !== !0)
|
||
return;
|
||
function ee(Oe) {
|
||
Oe && (a(Oe) == null && console.error("保存接口没有返回rowKey,无法更新该行的id,newRow:", Oe), ze(Ce, Oe));
|
||
}
|
||
se.loading = !0;
|
||
const ve = se.getRowData();
|
||
try {
|
||
await de({ isAdd: se.isAdd, row: ve, setData: ee }), se.persist();
|
||
} finally {
|
||
se.loading = !1;
|
||
}
|
||
}
|
||
});
|
||
if (ut(() => _, async (ae, de, Ce) => {
|
||
await se.validate();
|
||
}, {
|
||
deep: !0
|
||
}), _.children && _.children.length > 0)
|
||
for (const ae of _.children) {
|
||
ae[e.editable.rowKey] || (ae[e.editable.rowKey] = g());
|
||
const de = ae[e.editable.rowKey];
|
||
r[de] = f(de, ae);
|
||
}
|
||
return L && se.active(), se;
|
||
}
|
||
let h = 0;
|
||
function g() {
|
||
return h++, h;
|
||
}
|
||
function m(w) {
|
||
w == null && (w = o.getData());
|
||
const _ = Object.assign({}, r);
|
||
Fl(r, (C, S) => {
|
||
delete r[S];
|
||
}), J(w, (C) => {
|
||
C[e.editable.rowKey] || (C[e.editable.rowKey] = g());
|
||
const S = C[e.editable.rowKey];
|
||
_[S] ? r[S] = _[S] : r[S] = f(S, C);
|
||
}), c.value.onSetup && c.value.onSetup();
|
||
}
|
||
function y(w) {
|
||
const _ = e.editable.rowKey, C = [];
|
||
for (const S of w) {
|
||
const E = { [_]: S[_] };
|
||
S.children && S.children.length && (E.children = y(S.children)), C.push(E);
|
||
}
|
||
return C;
|
||
}
|
||
ut(() => {
|
||
const w = e.data;
|
||
let _ = [];
|
||
return w != null && w instanceof Array && (_ = y(w)), JSON.stringify(_);
|
||
}, (w, _) => {
|
||
c.value.enabled && m(e.data);
|
||
}, {
|
||
immediate: !0
|
||
}), ut(() => c.value.enabled, (w) => {
|
||
var _;
|
||
w && (((_ = o.getData()) == null ? void 0 : _.length) > 0 && m(), c.value.onEnabled && c.value.onEnabled({ ...c.value }));
|
||
}, {
|
||
immediate: !0
|
||
}), ut(() => c.value.mode, () => {
|
||
c.value.onEnabled && c.value.onEnabled({ ...c.value });
|
||
});
|
||
function v(w, _) {
|
||
var C;
|
||
if (_ != null)
|
||
return (C = r[w]) == null ? void 0 : C.cells[_];
|
||
}
|
||
function F(w = {}) {
|
||
s(({ cell: _ }) => {
|
||
_.active({ ...w, exclusive: !1 });
|
||
});
|
||
}
|
||
function R() {
|
||
s(({ cell: w }) => {
|
||
w.isEditing && w.inactive();
|
||
});
|
||
}
|
||
async function k() {
|
||
s(({ cell: w }) => {
|
||
w.isEditing && w.save();
|
||
});
|
||
}
|
||
function j() {
|
||
s(({ cell: w }) => {
|
||
w.isEditing && w.cancel();
|
||
});
|
||
}
|
||
function A() {
|
||
R(), l(({ row: w }) => {
|
||
delete w.isAdd;
|
||
}), s(({ cell: w }) => {
|
||
delete w.newValue, delete w.oldValue;
|
||
});
|
||
}
|
||
function T() {
|
||
s(({ cell: w }) => {
|
||
w.resume();
|
||
});
|
||
}
|
||
function q() {
|
||
let w = !1;
|
||
return l(({ cells: _ }) => {
|
||
J(_, (C) => {
|
||
if (C.isChanged())
|
||
return w = !0, "break";
|
||
});
|
||
}), w;
|
||
}
|
||
let D = 0;
|
||
function Y(w, _) {
|
||
jr(w, (C) => {
|
||
le(C, _);
|
||
});
|
||
}
|
||
function le(w, _) {
|
||
const C = et(_, w.key), S = z(w.value);
|
||
S != null && C == null && We(_, w.key, S);
|
||
}
|
||
async function I(w = { row: void 0, active: !0 }) {
|
||
let _ = w.row || { [c.value.rowKey]: --D, [e.rowKey]: D };
|
||
if (Y(c.value.addForm, _), w.addRowFunc) {
|
||
const C = await w.addRowFunc({ row: w.row });
|
||
C && (_ = C);
|
||
} else if (e.editable.addRow) {
|
||
const C = await e.editable.addRow(o.getData(), _);
|
||
C && (_ = C);
|
||
} else
|
||
o.unshift(_);
|
||
if (w.active ?? e.editable.activeDefault) {
|
||
await Be();
|
||
const C = i(_), S = x(C);
|
||
S && S.active();
|
||
}
|
||
}
|
||
function P(w, _) {
|
||
for (let C = 0; C < _.length; C++) {
|
||
const S = _[C];
|
||
if (i(S) === w)
|
||
return Ka(_, S), !0;
|
||
if (S.children && S.children.length > 0 && P(w, S.children))
|
||
return;
|
||
}
|
||
return !1;
|
||
}
|
||
function X(w) {
|
||
delete r[w], P(w, o.getData());
|
||
}
|
||
function O(w) {
|
||
const { cols: _ } = w;
|
||
l(({ cells: C }) => {
|
||
J(_, (S) => {
|
||
C[S].active({ ...w, exclusive: !1 });
|
||
});
|
||
});
|
||
}
|
||
function x(w) {
|
||
return r[w];
|
||
}
|
||
function Q() {
|
||
const w = [];
|
||
return l(({ row: _ }) => {
|
||
_.isEditing && w.push(_);
|
||
}), w;
|
||
}
|
||
async function re() {
|
||
const w = {};
|
||
let _ = !1;
|
||
for (const C in r) {
|
||
const S = r[C], E = await S.validate();
|
||
E != !0 && (w[S.editableId] = E, _ = !0);
|
||
}
|
||
return _ ? w : !0;
|
||
}
|
||
function ge(w) {
|
||
for (const _ of w)
|
||
delete _[e.editable.rowKey], _.children && _.children.length > 0 && ge(_.children);
|
||
return w;
|
||
}
|
||
function te(w) {
|
||
return w == null && (w = ft(o.getData())), w == null ? [] : ge(w);
|
||
}
|
||
return {
|
||
editable: {
|
||
options: c,
|
||
setupEditable: m,
|
||
inactive: R,
|
||
active: F,
|
||
persist: A,
|
||
saveEach: k,
|
||
cancelAll: j,
|
||
resume: T,
|
||
addRow: I,
|
||
removeRow: X,
|
||
getEditableRow: x,
|
||
activeCols: O,
|
||
hasDirty: q,
|
||
getEditableCell: v,
|
||
eachRows: l,
|
||
eachCells: s,
|
||
validate: re,
|
||
getCleanTableData: te,
|
||
getActiveRows: Q
|
||
}
|
||
};
|
||
}
|
||
function af(e) {
|
||
const t = (o, r) => et(e, `value[${o}].${r}`);
|
||
Ut("componentRef:get", t);
|
||
const n = (o, r, a) => We(e, `value[${o}].${r}`, a);
|
||
return Ut("componentRef:set", n), {
|
||
getter: t,
|
||
setter: n
|
||
};
|
||
}
|
||
const Oi = /* @__PURE__ */ ue({
|
||
name: "FsCell",
|
||
props: {
|
||
item: {},
|
||
/**
|
||
* scope
|
||
*/
|
||
scope: {
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {},
|
||
/**
|
||
* 条件渲染,符合条件的情况下优先渲染
|
||
*/
|
||
conditionalRender: {
|
||
type: Object
|
||
}
|
||
},
|
||
setup(e, t) {
|
||
const {
|
||
doComputed: n
|
||
} = Vt(), {
|
||
ui: o
|
||
} = Se(), i = n(() => ({
|
||
component: e.item.component
|
||
}), () => e.scope, null, (f) => f.component), l = K();
|
||
function s() {
|
||
return l.value.getTargetRef();
|
||
}
|
||
t.expose({
|
||
getTargetRef: s,
|
||
targetRef: l
|
||
});
|
||
const u = V(() => {
|
||
let f = e.item.showTitle;
|
||
const h = e.scope.value;
|
||
return f === !0 && (f = h), f;
|
||
}), c = V(() => (h) => N("span", {
|
||
class: "fs-cell",
|
||
title: u.value
|
||
}, [h])), d = () => {
|
||
var y, v;
|
||
const f = e.scope.value, h = c.value, g = {
|
||
...e.scope,
|
||
props: e.item
|
||
}, m = e.item.conditionalRender ?? e.conditionalRender;
|
||
if (m && m.match && m.match(g))
|
||
return h(m.render(g));
|
||
if (e.slots)
|
||
return h(e.slots(g));
|
||
if (e.item.formatter)
|
||
return h(e.item.formatter(g));
|
||
if (e.item.cellRender)
|
||
return h(e.item.cellRender(g));
|
||
if (e.item.render)
|
||
console.warn("column.render 配置已废弃,请使用column.cellRender代替");
|
||
else
|
||
return (y = i.value) != null && y.name ? ((v = i.value) == null ? void 0 : v.show) === !1 ? void 0 : N(Si, W({
|
||
title: u.value,
|
||
ref: l
|
||
}, i.value, {
|
||
scope: g
|
||
}), null) : h(Rl(f));
|
||
};
|
||
if (e.item.tooltip) {
|
||
const f = H(o.tooltip.name);
|
||
return () => {
|
||
let h = {}, g = {};
|
||
typeof e.item.tooltip == "object" ? (h = cn(e.item.tooltip, "slots"), g = {
|
||
...e.item.tooltip.slots
|
||
}) : g[o.tooltip.content] = () => e.item.tooltip === !0 ? u.value ?? e.scope.value : typeof e.item.tooltip == "function" ? e.item.tooltip({
|
||
...e.scope
|
||
}) : e.item.tooltip;
|
||
const m = {
|
||
...g,
|
||
[o.tooltip.trigger]: () => d()
|
||
};
|
||
return N(f, h, m);
|
||
};
|
||
} else
|
||
return d;
|
||
}
|
||
}), Ei = /* @__PURE__ */ ue({
|
||
name: "FsEditableCell",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 组件配置
|
||
*/
|
||
item: {},
|
||
scope: {},
|
||
index: {},
|
||
editableId: {},
|
||
columnKey: {},
|
||
editableCell: {
|
||
type: Object
|
||
},
|
||
editableOpts: {
|
||
type: Object
|
||
},
|
||
slots: {},
|
||
disabled: {},
|
||
readonly: {}
|
||
},
|
||
setup(e, t) {
|
||
Le.get();
|
||
const {
|
||
doComputed: n
|
||
} = Vt();
|
||
if (e.index === -1)
|
||
return () => {
|
||
};
|
||
const r = n(() => {
|
||
var h;
|
||
return (h = e.editableCell) == null ? void 0 : h.getForm();
|
||
}, () => e.scope), a = V(() => {
|
||
var h;
|
||
return r.value && r.value.show !== !1 && ((h = e.editableCell) == null ? void 0 : h.isEditable());
|
||
});
|
||
function i(h) {
|
||
h && a.value && e.editableCell.active();
|
||
}
|
||
async function l() {
|
||
var h;
|
||
if (((h = e.editableOpts) == null ? void 0 : h.mode) === "free") {
|
||
await e.editableCell.persist();
|
||
return;
|
||
}
|
||
await e.editableCell.save();
|
||
}
|
||
function s() {
|
||
e.editableCell.cancel();
|
||
}
|
||
const u = V(() => {
|
||
var h, g;
|
||
return ((h = e.editableOpts) == null ? void 0 : h.mode) !== "cell" && ((g = e.editableOpts) == null ? void 0 : g.mode) !== "free" ? !1 : e.editableCell.showAction;
|
||
}), c = V(() => e.editableCell.isChanged && e.editableCell.isChanged()), d = () => e.scope, f = {
|
||
default: () => N(Z("fs-cell"), W({
|
||
ref: "targetRef",
|
||
item: e.item,
|
||
scope: e.scope,
|
||
slots: e.slots
|
||
}, t.attrs), null),
|
||
edit: () => {
|
||
var g, m;
|
||
let h = null;
|
||
return (g = e.editableCell) != null && g.isEditing && (r.value.blank === !1 || ((m = r.value.component) == null ? void 0 : m.show) === !1 ? h = null : r.value.conditionalRender && r.value.conditionalRender.match && r.value.conditionalRender.match(d()) ? h = N(Z("fs-render"), W({
|
||
"render-func": r.value.conditionalRender.render,
|
||
scope: d()
|
||
}, t.attrs), null) : r.value.render ? h = N(Z("fs-render"), W({
|
||
"render-func": r.value.render,
|
||
scope: d()
|
||
}, t.attrs), null) : h = N(Z("fs-component-render"), W({
|
||
ref: "targetInputRef"
|
||
}, r.value.component, t.attrs, {
|
||
scope: e.scope
|
||
}), null)), h;
|
||
}
|
||
};
|
||
return () => {
|
||
var m, y;
|
||
if (!a.value || e.disabled || e.readonly)
|
||
return N(Z("fs-cell"), W({
|
||
ref: "targetRef",
|
||
item: e.item,
|
||
scope: e.scope
|
||
}, t.attrs), null);
|
||
const h = e.editableCell, g = (m = e.editableOpts) == null ? void 0 : m.activeTrigger;
|
||
return N(Z("fs-editable"), {
|
||
ref: "editableRef",
|
||
class: "fs-editable-cell",
|
||
editing: h == null ? void 0 : h.isEditing,
|
||
showAction: u.value,
|
||
submitOnEnter: (y = e.editableOpts) == null ? void 0 : y.submitOnEnter,
|
||
dirty: c.value,
|
||
"onUpdate:editing": i,
|
||
onSubmit: l,
|
||
onCancel: s,
|
||
loading: h == null ? void 0 : h.loading,
|
||
trigger: g,
|
||
validateErrors: h == null ? void 0 : h.validateErrors
|
||
}, f);
|
||
};
|
||
},
|
||
methods: {
|
||
getTargetRef() {
|
||
var e;
|
||
return ((e = this.$refs.targetInputRef) == null ? void 0 : e.getTargetRef()) || this.$refs.targetRef;
|
||
}
|
||
}
|
||
});
|
||
function lf({
|
||
props: e,
|
||
ui: t,
|
||
sortedColumns: n,
|
||
renderRowHandle: o,
|
||
renderCellComponent: r,
|
||
renderContext: a,
|
||
componentDefines: i
|
||
}) {
|
||
const {
|
||
tableComp: l,
|
||
tableColumnComp: s,
|
||
tableColumnGroupComp: u
|
||
} = i;
|
||
t.tableColumn;
|
||
const c = {}, d = (f) => {
|
||
const h = {
|
||
...f.columnSlots
|
||
}, g = "cell_" + f.key;
|
||
let m = s;
|
||
if (f.children)
|
||
h.default = () => {
|
||
const v = [];
|
||
return J(f.children, (F) => {
|
||
F.show !== !1 && v.push(d(F));
|
||
}), v;
|
||
}, m = u;
|
||
else if (f.type != null) {
|
||
ce.debug("cell render column.type:", f.type);
|
||
const v = e.cellSlots && e.cellSlots[g];
|
||
v && (h.default = v);
|
||
} else
|
||
h.default = B((v) => v == null ? [N("div", null, [Ct("1111")])] : [r(f, v)], a);
|
||
const y = {
|
||
...f
|
||
};
|
||
return delete y.children, N(m, W({
|
||
ref: "tableColumnRef"
|
||
}, y, {
|
||
label: f.title,
|
||
prop: f.key,
|
||
dataIndex: f.key
|
||
}), h);
|
||
};
|
||
return c.default = () => {
|
||
var h;
|
||
const f = [];
|
||
if (J(n, (g) => {
|
||
g.show !== !1 && f.push(d(g));
|
||
}), e.rowHandle && e.rowHandle.show !== !1) {
|
||
const g = {
|
||
default: B((m) => [o(m)], a),
|
||
...(h = e.rowHandle) == null ? void 0 : h.columnSlots
|
||
};
|
||
f.push(N(s, W({
|
||
ref: "tableColumnRef"
|
||
}, e.rowHandle, {
|
||
label: e.rowHandle.title,
|
||
prop: e.rowHandle.key || "rowHandle"
|
||
}), g));
|
||
}
|
||
return f;
|
||
}, e.slots && J(e.slots, (f, h) => {
|
||
c[h] = f;
|
||
}), c;
|
||
}
|
||
function Ti(e, t) {
|
||
var d;
|
||
const {
|
||
props: n,
|
||
renderRowHandle: o,
|
||
renderCellComponent: r,
|
||
renderContext: a,
|
||
sortedColumns: i
|
||
} = e, {
|
||
ui: l
|
||
} = Se(), s = i ?? {}, u = [];
|
||
let c = l.table;
|
||
n.tableVersion === "v2" && (c = l.tableV2);
|
||
for (const f in s) {
|
||
const h = s[f];
|
||
if (h.show === !1)
|
||
continue;
|
||
const g = {
|
||
...h
|
||
};
|
||
if (g._parent = t, g.dataIndex = h.key, u.push(g), h.children != null) {
|
||
const y = {
|
||
...e,
|
||
sortedColumns: h.children
|
||
};
|
||
delete y.renderRowHandle, g.children = Ti(y, g);
|
||
} else if (h.type == null) {
|
||
const y = g[c.renderMethod], v = {
|
||
...g
|
||
};
|
||
delete v[c.renderMethod], y ? g[c.renderMethod] = B((F, R, k) => {
|
||
const j = c.rebuildRenderScope(F, R, k), A = B(() => r(v, j), a);
|
||
return y(j, A);
|
||
}, a) : g[c.renderMethod] = B((F, R, k) => {
|
||
const j = c.rebuildRenderScope(F, R, k);
|
||
return r(v, j);
|
||
}, a);
|
||
}
|
||
}
|
||
if (o && ((d = n.rowHandle) == null ? void 0 : d.show) !== !1) {
|
||
const f = {
|
||
key: "_rowHandle",
|
||
...n.rowHandle
|
||
};
|
||
f[c.renderMethod] = B((h, g, m) => {
|
||
const y = c.rebuildRenderScope(h, g, m);
|
||
return o(y);
|
||
}, a), u.push(f);
|
||
}
|
||
return ce.debug("table columns:", u), u;
|
||
}
|
||
const sf = /* @__PURE__ */ ue({
|
||
name: "FsTable",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
tableVersion: {
|
||
type: String
|
||
},
|
||
/**
|
||
* table插槽
|
||
*/
|
||
slots: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 单元格插槽
|
||
*/
|
||
cellSlots: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 列配置,支持el-table-column|a-table-column配置
|
||
*/
|
||
columns: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 操作列
|
||
*/
|
||
rowHandle: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 是否显示表格
|
||
*/
|
||
show: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 表格数据
|
||
*/
|
||
data: {
|
||
type: Array,
|
||
default: () => []
|
||
},
|
||
conditionalRender: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 行编辑,批量编辑
|
||
*/
|
||
editable: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
loading: {
|
||
type: Boolean,
|
||
default: !1
|
||
},
|
||
/**
|
||
* 当前sort状态
|
||
*/
|
||
sort: {
|
||
type: Object
|
||
},
|
||
request: {
|
||
type: Object
|
||
},
|
||
rowKey: {
|
||
type: [String, Function],
|
||
default: "id"
|
||
}
|
||
},
|
||
emits: ["row-handle", "value-change", "pagination-change", "filter-change", "sort-change", "data-change"],
|
||
setup(e, t) {
|
||
const n = K(), o = K([]);
|
||
af(o);
|
||
const r = (I, P) => {
|
||
if (!P || I == null || I > o.value.length)
|
||
return;
|
||
const O = o.value[I][P];
|
||
return O == null ? void 0 : O.getTargetRef();
|
||
}, {
|
||
ui: a
|
||
} = Se(), i = Jo();
|
||
ut(() => e.data, (I) => {
|
||
t.emit("data-change", {
|
||
data: I
|
||
});
|
||
});
|
||
let l = a.table, s = a.tableColumn;
|
||
e.tableVersion === "v2" && (l = a.tableV2, s = a.tableColumnV2);
|
||
function u(I = 0) {
|
||
l.scrollTo({
|
||
top: I,
|
||
tableRef: n,
|
||
fsTableRef: i
|
||
});
|
||
}
|
||
const c = H(l.name), d = rf(e, t, n), f = (I, P) => {
|
||
const X = P[s.row], O = X, x = P[s.index];
|
||
return P.index = x, {
|
||
...P,
|
||
key: I.key,
|
||
value: et(X, I.key),
|
||
row: X,
|
||
form: O,
|
||
getComponentRef: (Q) => r(x, Q)
|
||
};
|
||
};
|
||
function h(I) {
|
||
t.emit("row-handle", I);
|
||
}
|
||
const g = l.onChange({
|
||
onSortChange: (I) => {
|
||
t.emit("sort-change", I);
|
||
},
|
||
onFilterChange: (I) => {
|
||
t.emit("filter-change", I);
|
||
},
|
||
onPagination: () => {
|
||
},
|
||
bubbleUp: (I) => {
|
||
I(t.attrs);
|
||
}
|
||
}), m = (I) => {
|
||
I == null && (I = {}), I.index = I[s.index];
|
||
const P = "cell-rowHandle", X = {};
|
||
if (e.cellSlots)
|
||
for (const O in e.cellSlots)
|
||
O.startsWith(P) && (X[O] = e.cellSlots[O]);
|
||
return N(Ri, W(e.rowHandle, {
|
||
scope: I,
|
||
onHandle: h
|
||
}), X);
|
||
}, y = (I, P) => {
|
||
var _, C, S, E, L, se, ae, de, Ce, ze, Qe, ee;
|
||
const X = "cell_" + I.key;
|
||
P == null && (P = {});
|
||
const O = (P.row = P[s.row]) || {}, x = {
|
||
modelValue: et(P[s.row], I.key),
|
||
"onUpdate:modelValue": (ve) => {
|
||
var Fe;
|
||
We(P[s.row], I.key, ve);
|
||
const Oe = f(I, P);
|
||
t.emit("value-change", Oe), I.valueChange && (I.valueChange instanceof Function ? I.valueChange(Oe) : (Fe = I.valueChange) == null || Fe.handle(Oe));
|
||
}
|
||
}, Q = (ve) => {
|
||
const Oe = P[s.index], Fe = I.key;
|
||
let Ge = o.value[Oe];
|
||
Ge == null && (o.value[Oe] = Ge = {}), Ge[Fe] = ve;
|
||
}, re = P[s.index], ge = O[(_ = e.editable) == null ? void 0 : _.rowKey], te = e.cellSlots && e.cellSlots[X], w = f(I, P);
|
||
if (((E = (S = (C = d.editable) == null ? void 0 : C.options) == null ? void 0 : S.value) == null ? void 0 : E.enabled) === !0) {
|
||
const ve = d.editable.getEditableCell(ge, I.key);
|
||
return N(Ei, W({
|
||
ref: Q,
|
||
key: I.key,
|
||
columnKey: I.key,
|
||
index: re,
|
||
editableId: ge,
|
||
item: I,
|
||
editableCell: ve,
|
||
editableOpts: (se = (L = d.editable) == null ? void 0 : L.options) == null ? void 0 : se.value,
|
||
scope: w,
|
||
slots: te,
|
||
disabled: (Ce = (de = (ae = d.editable) == null ? void 0 : ae.options) == null ? void 0 : de.value) == null ? void 0 : Ce.disabled,
|
||
readonly: (ee = (Qe = (ze = d.editable) == null ? void 0 : ze.options) == null ? void 0 : Qe.value) == null ? void 0 : ee.readonly
|
||
}, x), null);
|
||
} else
|
||
return N(Oi, W({
|
||
ref: Q,
|
||
key: I.key,
|
||
item: I,
|
||
scope: w,
|
||
slots: te
|
||
}, x, {
|
||
conditionalRender: e.conditionalRender
|
||
}), null);
|
||
}, {
|
||
expose: v
|
||
} = t;
|
||
v({
|
||
tableRef: n,
|
||
componentRefs: o,
|
||
getComponentRef: r,
|
||
...d,
|
||
scrollTo: u
|
||
});
|
||
const {
|
||
doColumnsSort: F
|
||
} = na(), R = l.renderMode, k = V(() => ({
|
||
[l.data]: e.data
|
||
})), {
|
||
merge: j,
|
||
cloneDeep: A
|
||
} = Ee(), T = V(() => {
|
||
let I = e.rowKey;
|
||
return a.type === "naive" && typeof e.rowKey == "string" && (I = (P) => P[e.rowKey]), j({
|
||
rowKey: I
|
||
}, t.attrs, g);
|
||
}), q = V(() => F(A(e.columns))), D = H(a.tableColumn.name), Y = H(a.tableColumnGroup.name), le = {
|
||
tableComp: c,
|
||
tableColumnComp: D,
|
||
tableColumnGroupComp: Y
|
||
};
|
||
if (R === "slot") {
|
||
const I = V(() => lf({
|
||
props: e,
|
||
ui: a,
|
||
sortedColumns: q.value,
|
||
renderRowHandle: m,
|
||
renderCellComponent: y,
|
||
renderContext: i,
|
||
componentDefines: le
|
||
}));
|
||
return () => {
|
||
if (e.show === !1)
|
||
return;
|
||
const P = N(c, W({
|
||
ref: n,
|
||
loading: e.loading
|
||
}, T.value, k.value), I.value);
|
||
if (typeof l.vLoading == "string") {
|
||
const X = Cr(l.vLoading);
|
||
return er(P, [[X, e.loading]]);
|
||
}
|
||
return P;
|
||
};
|
||
} else {
|
||
const I = V(() => Ti({
|
||
props: e,
|
||
ctx: t,
|
||
ui: a,
|
||
getContextFn: f,
|
||
sortedColumns: q.value,
|
||
componentRefs: o,
|
||
renderRowHandle: m,
|
||
renderCellComponent: y,
|
||
renderContext: i,
|
||
columns: e.columns
|
||
})), P = V(() => {
|
||
const O = [];
|
||
function x(Q) {
|
||
Q.forEach((re) => {
|
||
re.children ? x(re.children) : O.push(re);
|
||
});
|
||
}
|
||
return x(I.value), O;
|
||
}), X = V(() => l.buildMultiHeadersBind ? l.buildMultiHeadersBind({
|
||
treeColumns: I.value,
|
||
flatColumns: P.value
|
||
}) : {
|
||
bind: {},
|
||
slots: {}
|
||
});
|
||
return () => {
|
||
var re;
|
||
if (e.show === !1)
|
||
return;
|
||
const O = {
|
||
...e.slots,
|
||
...(re = X.value) == null ? void 0 : re.slots
|
||
}, x = l.columnsIsFlat, Q = (ge = {}) => {
|
||
var te;
|
||
return N(c, W({
|
||
ref: n,
|
||
loading: e.loading
|
||
}, T.value, {
|
||
columns: x ? P.value : I.value
|
||
}, k.value, (te = X.value) == null ? void 0 : te.bind, ge), O);
|
||
};
|
||
if (e.tableVersion === "v2" && a.type === "element") {
|
||
const ge = {
|
||
default({
|
||
width: te,
|
||
height: w
|
||
}) {
|
||
return Q({
|
||
width: te,
|
||
height: w
|
||
});
|
||
}
|
||
};
|
||
return N(Z("el-auto-resizer"), null, ge);
|
||
}
|
||
return Q();
|
||
};
|
||
}
|
||
}
|
||
}), uf = { class: "fs-editable" }, cf = { class: "fs-editable-input" }, df = {
|
||
key: 0,
|
||
class: "fs-editable-dirty"
|
||
}, ff = {
|
||
key: 0,
|
||
class: "fs-editable-action fs-editable-icon"
|
||
}, hf = { class: "fs-editable-input" }, mf = { class: "fs-editable-action" }, pf = { class: "error-icon" }, gf = /* @__PURE__ */ ue({
|
||
__name: "fs-editable",
|
||
props: {
|
||
disabled: { type: Boolean, default: !1 },
|
||
editing: { type: Boolean, default: !1 },
|
||
dirty: { type: Boolean, default: !1 },
|
||
trigger: { type: [String, Boolean], default: "onClick" },
|
||
loading: { type: Boolean, default: !1 },
|
||
showAction: { type: [Boolean, Object], default: !0 },
|
||
submitOnEnter: { type: Boolean, default: !1 },
|
||
validateErrors: { default: () => [] }
|
||
},
|
||
emits: ["update:editing", "submit", "cancel"],
|
||
setup(e, { emit: t }) {
|
||
const n = e, { ui: o } = Se(), r = t, a = V(() => n.trigger ? {
|
||
[n.trigger]: () => {
|
||
r("update:editing", !0);
|
||
}
|
||
} : {}), i = V(() => n.showAction !== !1 && (typeof n.showAction != "object" || n.showAction.submit !== !1)), l = V(() => n.showAction !== !1 && (typeof n.showAction != "object" || n.showAction.cancel !== !1));
|
||
function s() {
|
||
r("submit");
|
||
}
|
||
function u() {
|
||
r("cancel");
|
||
}
|
||
function c(h) {
|
||
!n.submitOnEnter || n.loading || h.key !== "Enter" || h.isComposing || h.altKey || h.ctrlKey || h.metaKey || h.shiftKey || h.target instanceof HTMLTextAreaElement || (h.preventDefault(), s());
|
||
}
|
||
function d() {
|
||
var h;
|
||
return ((h = n.validateErrors) == null ? void 0 : h.length) > 0;
|
||
}
|
||
function f() {
|
||
var h, g;
|
||
if (((h = n.validateErrors) == null ? void 0 : h.length) !== 0)
|
||
return (g = n.validateErrors) == null ? void 0 : g.map((m) => m.message).join(",");
|
||
}
|
||
return (h, g) => {
|
||
const m = Z("fs-icon");
|
||
return b(), M("div", uf, [
|
||
!e.editing || e.disabled ? (b(), M("div", W({
|
||
key: 0,
|
||
class: "fs-editable-inner fs-editable-pointer"
|
||
}, a.value), [
|
||
oe("div", cf, [
|
||
e.dirty ? (b(), M("div", df)) : G("", !0),
|
||
he(h.$slots, "default")
|
||
]),
|
||
e.trigger && !e.disabled ? (b(), M("div", ff, [
|
||
N(m, {
|
||
icon: z(o).icons.edit
|
||
}, null, 8, ["icon"])
|
||
])) : G("", !0)
|
||
], 16)) : (b(), M("div", {
|
||
key: 1,
|
||
class: dt(["fs-editable-inner", { "fs-validate-error": d() }]),
|
||
onKeydown: c
|
||
}, [
|
||
oe("div", hf, [
|
||
he(h.$slots, "edit")
|
||
]),
|
||
oe("div", mf, [
|
||
(b(), $(H(z(o).tooltip.name), null, {
|
||
[z(o).tooltip.content]: B(() => [
|
||
oe("span", pf, Pe(f()), 1)
|
||
]),
|
||
[z(o).tooltip.trigger]: B(() => [
|
||
N(m, {
|
||
class: dt({ hidden: !d(), "error-icon": !0 }),
|
||
size: "mini",
|
||
icon: z(o).icons.info
|
||
}, null, 8, ["class", "icon"])
|
||
]),
|
||
_: 2
|
||
}, 1024)),
|
||
i.value ? (b(), M(be, { key: 0 }, [
|
||
e.loading ? (b(), $(m, {
|
||
key: 0,
|
||
size: "mini",
|
||
spin: !0,
|
||
icon: z(o).icons.refresh
|
||
}, null, 8, ["icon"])) : (b(), $(m, {
|
||
key: 1,
|
||
size: "mini",
|
||
icon: z(o).icons.check,
|
||
onClick: s
|
||
}, null, 8, ["icon"]))
|
||
], 64)) : G("", !0),
|
||
l.value ? (b(), $(m, {
|
||
key: 1,
|
||
class: dt({ hidden: e.loading }),
|
||
size: "mini",
|
||
icon: z(o).icons.close,
|
||
onClick: u
|
||
}, null, 8, ["class", "icon"])) : G("", !0)
|
||
])
|
||
], 34))
|
||
]);
|
||
};
|
||
}
|
||
});
|
||
const vf = ue({
|
||
name: "FsActionbar",
|
||
props: {
|
||
/**
|
||
* 按钮配置
|
||
* {
|
||
* add:{
|
||
* ...FsButton,
|
||
* show:true
|
||
* },
|
||
* custom:{...}
|
||
* }
|
||
*/
|
||
buttons: {}
|
||
},
|
||
emits: ["action"],
|
||
setup(e, t) {
|
||
function n(r, a, i) {
|
||
const l = { key: r, btn: a, $event: i, loadingRef: i == null ? void 0 : i.loadingRef };
|
||
if (a.click) {
|
||
a.click(l);
|
||
return;
|
||
}
|
||
if (a.onClick) {
|
||
a.onClick(l);
|
||
return;
|
||
}
|
||
t.emit("action", l);
|
||
}
|
||
const o = V(() => {
|
||
let r = [];
|
||
for (let i in e.buttons)
|
||
r.push({
|
||
// @ts-ignore
|
||
...e.buttons[i],
|
||
_key: i
|
||
});
|
||
r = Sn(r, (i) => i.order ?? dn.orderDefault);
|
||
const a = {};
|
||
return r.forEach((i) => {
|
||
let l = i._key;
|
||
delete i._key, a[l] = i;
|
||
}), a;
|
||
});
|
||
return {
|
||
onClick: n,
|
||
computedButtons: o
|
||
};
|
||
}
|
||
});
|
||
const bf = { class: "fs-actionbar" };
|
||
function yf(e, t, n, o, r, a) {
|
||
const i = Z("fs-button");
|
||
return b(), M("div", bf, [
|
||
(b(!0), M(be, null, Te(e.computedButtons, (l, s) => (b(), M(be, { key: s }, [
|
||
l.show !== !1 ? (b(), $(i, W({
|
||
key: 0,
|
||
ref_for: !0
|
||
}, l, {
|
||
onClick: (u) => e.onClick(s, l, u)
|
||
}), null, 16, ["onClick"])) : G("", !0)
|
||
], 64))), 128))
|
||
]);
|
||
}
|
||
const wf = /* @__PURE__ */ $e(vf, [["render", yf]]);
|
||
class Tp {
|
||
constructor() {
|
||
/**
|
||
* 是否执行valueChange
|
||
*/
|
||
ie(this, "valueChange");
|
||
ie(this, "mergeForm");
|
||
}
|
||
}
|
||
const oa = "ColumnsFilterContext", _f = /* @__PURE__ */ ue({
|
||
__name: "index",
|
||
props: {
|
||
container: { default: () => ({ is: "fs-columns-filter-layout-default" }) },
|
||
is: {},
|
||
show: { type: Boolean },
|
||
mode: { default: "default" },
|
||
columns: {},
|
||
originalColumns: {},
|
||
storage: { type: [Boolean, String, Object], default: !0 },
|
||
text: {},
|
||
onReset: {},
|
||
onSubmit: {}
|
||
},
|
||
emits: ["update:columns", "update:show", "reset", "submit"],
|
||
setup(e, { expose: t, emit: n }) {
|
||
const o = e, r = n, { t: a } = rt(), i = Le.get(), l = K(!1), s = () => {
|
||
l.value = !0;
|
||
}, u = V(() => R(o.originalColumns)), c = K([]), d = V(() => {
|
||
const _ = {};
|
||
return m(u.value, (C) => {
|
||
_[C.__key] = C;
|
||
}), _;
|
||
}), { merge: f, cloneDeep: h } = Ee(), g = V(() => {
|
||
const _ = {
|
||
title: a("fs.toolbar.columnFilter.title"),
|
||
fixed: a("fs.toolbar.columnFilter.fixed"),
|
||
order: a("fs.toolbar.columnFilter.order"),
|
||
reset: a("fs.toolbar.columnFilter.reset"),
|
||
confirm: a("fs.toolbar.columnFilter.confirm"),
|
||
unnamed: a("fs.toolbar.columnFilter.unnamed")
|
||
};
|
||
return f(_, o.text), _;
|
||
});
|
||
function m(_, C) {
|
||
if (_)
|
||
if (Array.isArray(_))
|
||
for (const S of _)
|
||
C(S), S.children && m(S.children, C);
|
||
else
|
||
for (const S in _) {
|
||
const E = _[S];
|
||
C(E), E.children && m(E.children, C);
|
||
}
|
||
}
|
||
const y = ["__show", "__disabled", "__parent", "__key", "__title"];
|
||
function v(_) {
|
||
return {
|
||
key: _.key,
|
||
title: _.title,
|
||
fixed: _.fixed ?? !1,
|
||
show: _.show ?? !0,
|
||
__show: _.columnSetShow !== !1,
|
||
__disabled: _.columnSetDisabled ?? !1,
|
||
__title: _.columnSetTitle
|
||
};
|
||
}
|
||
function F(_) {
|
||
const C = {};
|
||
return J(_, (S) => {
|
||
const E = cn(S, "children", ...y);
|
||
S.children && S.children.length > 0 && (E.children = F(S.children)), C[S.key] = E;
|
||
}), C;
|
||
}
|
||
function R(_, C) {
|
||
const S = [];
|
||
return J(_, (E) => {
|
||
const L = v(E);
|
||
L.__parent = C, L.__key = `${(C == null ? void 0 : C.key) || ""}.${E.key}`, S.push(L), E.children && (L.children = R(E.children, L));
|
||
}), S;
|
||
}
|
||
function k(_) {
|
||
c.value = R(_);
|
||
}
|
||
async function j() {
|
||
c.value = R(o.originalColumns), await A(!0), await Q(), r("reset");
|
||
}
|
||
async function A(_ = !1) {
|
||
_ || await O(c.value);
|
||
const C = h(c.value);
|
||
return m(C, (S) => {
|
||
if (S)
|
||
for (const E of Object.keys(S))
|
||
E.startsWith("__") && delete S[E];
|
||
}), le(C), l.value = !1, C;
|
||
}
|
||
async function T(_ = !1) {
|
||
const C = await A(_);
|
||
r("submit", { columns: C });
|
||
}
|
||
const q = V(() => o.originalColumns);
|
||
Ut(oa, {
|
||
originalColumns: q,
|
||
originalColumnsMap: d,
|
||
currentColumns: c,
|
||
text: g,
|
||
active: l,
|
||
submit: T,
|
||
reset: j
|
||
});
|
||
async function D() {
|
||
await T(!1), r("update:show", !1);
|
||
}
|
||
async function Y() {
|
||
await j(), r("update:show", !1);
|
||
}
|
||
function le(_) {
|
||
r("update:columns", F(_));
|
||
}
|
||
const I = Ln("get:crudBinding", () => ({ id: "" })), P = K();
|
||
function X() {
|
||
const _ = typeof o.storage == "object" ? o.storage : null, C = typeof o.storage == "string" ? o.storage : "";
|
||
if (P.value == null) {
|
||
const S = Xa();
|
||
P.value = new Gr({
|
||
$router: S,
|
||
tableName: "columnsFilter",
|
||
keyType: C,
|
||
remoteStorage: _
|
||
});
|
||
}
|
||
return P.value.id = I().id, P.value;
|
||
}
|
||
async function O(_) {
|
||
if (o.storage === !1)
|
||
return;
|
||
const C = h(_);
|
||
m(C, (S) => {
|
||
delete S.__parent;
|
||
}), await X().updateTableValue(C);
|
||
}
|
||
async function x() {
|
||
if (o.storage !== !1)
|
||
return await X().getTableValue();
|
||
}
|
||
async function Q() {
|
||
await X().clearTableValue();
|
||
}
|
||
function re(_) {
|
||
const C = [];
|
||
m(_, (E) => {
|
||
const L = Ya(E, "key", "__show", "__disabled");
|
||
C.push(JSON.stringify(L));
|
||
}), C.sort();
|
||
let S = "";
|
||
for (const E of C)
|
||
S += E;
|
||
return S;
|
||
}
|
||
ut(
|
||
() => o.columns,
|
||
(_) => {
|
||
k(_);
|
||
}
|
||
);
|
||
const ge = async () => {
|
||
k(o.columns);
|
||
const _ = await x();
|
||
if (_) {
|
||
const C = re(_);
|
||
if (re(u.value) !== C)
|
||
return;
|
||
c.value = _, await Be(), await T(!0);
|
||
}
|
||
};
|
||
async function te(_) {
|
||
await _(c), await A();
|
||
}
|
||
ut(
|
||
() => u.value,
|
||
async (_) => {
|
||
await ge();
|
||
},
|
||
{
|
||
immediate: !0
|
||
}
|
||
), t({
|
||
start: s,
|
||
save: A,
|
||
update: te,
|
||
original: u,
|
||
columns: c
|
||
});
|
||
function w(_) {
|
||
return _.__title || _.label || _.title || _.key || g.value.unnamed;
|
||
}
|
||
return (_, C) => {
|
||
var E;
|
||
const S = Z("fs-button");
|
||
return e.mode === "simple" ? (b(), M(be, { key: 0 }, [
|
||
(b(), $(H(z(i).row.name), { class: "fs-table-columns-filter-simple" }, {
|
||
default: B(() => [
|
||
(b(!0), M(be, null, Te(c.value, (L, se) => {
|
||
var ae;
|
||
return er((b(), $(H(z(i).col.name), {
|
||
key: se,
|
||
span: 6
|
||
}, {
|
||
default: B(() => {
|
||
var de;
|
||
return [
|
||
(b(), $(H(z(i).checkbox.name), je({
|
||
[z(i).checkbox.modelValue]: L.show,
|
||
["onUpdate:" + z(i).checkbox.modelValue]: (Ce) => L.show = Ce,
|
||
disabled: ((de = u.value[L.key]) == null ? void 0 : de.__disabled) === !0,
|
||
class: "item-label",
|
||
title: w(L)
|
||
}), {
|
||
default: B(() => [
|
||
Ct(Pe(w(L)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040, ["disabled", "title"]))
|
||
];
|
||
}),
|
||
_: 2
|
||
}, 1024)), [
|
||
[Wa, ((ae = u.value[L.key]) == null ? void 0 : ae.__show) !== !1]
|
||
]);
|
||
}), 128))
|
||
]),
|
||
_: 1
|
||
})),
|
||
(b(), $(H(z(i).divider.name))),
|
||
(b(), $(H(z(i).row.name), null, {
|
||
default: B(() => [
|
||
N(S, {
|
||
style: { "margin-right": "5px" },
|
||
type: "primary",
|
||
icon: z(i).icons.check,
|
||
text: g.value.confirm,
|
||
onClick: C[0] || (C[0] = (L) => D())
|
||
}, null, 8, ["icon", "text"]),
|
||
N(S, {
|
||
icon: z(i).icons.refresh,
|
||
text: g.value.reset,
|
||
onClick: Y
|
||
}, null, 8, ["icon", "text"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
], 64)) : (b(), $(H(((E = e.container) == null ? void 0 : E.is) || "fs-columns-filter-layout-default"), je(W({ key: 1 }, e.container)), {
|
||
buttons: B(() => [
|
||
(b(), $(H(z(i).row.name), {
|
||
class: "fs-drawer-footer",
|
||
gutter: 10
|
||
}, {
|
||
default: B(() => [
|
||
(b(), $(H(z(i).col.name), { span: 12 }, {
|
||
default: B(() => [
|
||
N(S, {
|
||
icon: z(i).icons.refresh,
|
||
text: g.value.reset,
|
||
block: "",
|
||
onClick: j
|
||
}, null, 8, ["icon", "text"])
|
||
]),
|
||
_: 1
|
||
})),
|
||
(b(), $(H(z(i).col.name), { span: 12 }, {
|
||
default: B(() => [
|
||
N(S, {
|
||
type: "primary",
|
||
icon: z(i).icons.check,
|
||
text: g.value.confirm,
|
||
block: "",
|
||
onClick: C[1] || (C[1] = (L) => T(!1))
|
||
}, null, 8, ["icon", "text"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
]),
|
||
_: 1
|
||
}))
|
||
]),
|
||
_: 1
|
||
}, 16));
|
||
};
|
||
}
|
||
});
|
||
const Cf = ue({
|
||
name: "FsToolbar",
|
||
components: { FsTableColumnsFilter: _f },
|
||
props: {
|
||
/**
|
||
* 按钮配置
|
||
*{
|
||
* search:{}, 查询
|
||
* refresh:{}, 刷新
|
||
* compact:{}, 紧凑模式
|
||
* export:{}, 导出
|
||
* columns:{} 列设置
|
||
*}
|
||
**/
|
||
buttons: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 当前是否紧凑模式
|
||
*/
|
||
compact: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 列配置
|
||
*/
|
||
columns: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 是否保存用户列设置
|
||
* 传string则表示传入缓存的主key
|
||
*/
|
||
storage: {
|
||
type: [String, Boolean],
|
||
default: !0
|
||
},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {},
|
||
/**
|
||
* 列设置配置
|
||
*/
|
||
columnsFilter: {
|
||
type: Object
|
||
}
|
||
},
|
||
emits: ["update:columns"],
|
||
setup(e, t) {
|
||
rt();
|
||
const n = K(), { ui: o } = Se(), { merge: r } = Ee(), a = V(() => {
|
||
const s = {
|
||
columns: {
|
||
click: () => {
|
||
n.value.start();
|
||
}
|
||
}
|
||
};
|
||
r(s, e.buttons);
|
||
let u = [];
|
||
for (let d in s)
|
||
u.push({
|
||
...s[d],
|
||
_key: d
|
||
});
|
||
u = Sn(u, (d) => d.order ?? dn.orderDefault);
|
||
const c = {};
|
||
return u.forEach((d) => {
|
||
let f = d._key;
|
||
delete d._key, c[f] = d;
|
||
}), c;
|
||
}), i = K(!1);
|
||
return {
|
||
ui: o,
|
||
columnsFilterRef: n,
|
||
computedButtons: a,
|
||
popoverVisible: i,
|
||
handleSimpleClick: (s) => {
|
||
o.type !== "element" && (i.value = !i.value);
|
||
}
|
||
};
|
||
}
|
||
});
|
||
const Sf = { class: "fs-toolbar" };
|
||
function Ff(e, t, n, o, r, a) {
|
||
var l;
|
||
const i = Z("fs-button");
|
||
return b(), M("div", Sf, [
|
||
(b(!0), M(be, null, Te(e.computedButtons, (s, u) => {
|
||
var c;
|
||
return b(), M(be, { key: u }, [
|
||
s.show !== !1 ? (b(), M(be, { key: 0 }, [
|
||
u === "columns" && e.columnsFilter && ((c = e.columnsFilter) == null ? void 0 : c.mode) === "simple" ? (b(), $(H(e.ui.popover.name), je({
|
||
key: 0,
|
||
[e.ui.popover.visible]: e.popoverVisible,
|
||
["onUpdate:" + e.ui.popover.visible]: t[2] || (t[2] = (d) => e.popoverVisible = d),
|
||
"display-directive": "show",
|
||
placement: "bottom",
|
||
width: 760,
|
||
trigger: "click"
|
||
}), {
|
||
[e.ui.popover.triggerSlotName]: B(() => [
|
||
N(i, W({ ref_for: !0 }, s, { onClick: e.handleSimpleClick }), null, 16, ["onClick"])
|
||
]),
|
||
[e.ui.popover.contentSlotName]: B(() => [
|
||
e.columns ? (b(), $(H(e.columnsFilter.is || "fs-table-columns-filter"), W({
|
||
key: 0,
|
||
ref_for: !0,
|
||
ref: "columnsFilterRef",
|
||
show: e.popoverVisible,
|
||
"onUpdate:show": t[0] || (t[0] = (d) => e.popoverVisible = d),
|
||
mode: "simple"
|
||
}, { ref_for: !0 }, e.columnsFilter, {
|
||
columns: e.columns,
|
||
storage: e.storage,
|
||
"onUpdate:columns": t[1] || (t[1] = (d) => e.$emit("update:columns", d))
|
||
}), null, 16, ["show", "columns", "storage"])) : G("", !0)
|
||
]),
|
||
_: 2
|
||
}, 1040)) : (b(), $(i, W({
|
||
key: 1,
|
||
ref_for: !0
|
||
}, s, {
|
||
onClick: (d) => s.click(d)
|
||
}), null, 16, ["onClick"]))
|
||
], 64)) : G("", !0)
|
||
], 64);
|
||
}), 128)),
|
||
e.columns && ((l = e.columnsFilter) == null ? void 0 : l.mode) !== "simple" ? (b(), $(H(e.columnsFilter.is || "fs-table-columns-filter"), W({
|
||
key: 0,
|
||
ref: "columnsFilterRef",
|
||
storage: e.storage
|
||
}, e.columnsFilter, {
|
||
columns: e.columns,
|
||
"onUpdate:columns": t[3] || (t[3] = (s) => e.$emit("update:columns", s))
|
||
}), null, 16, ["storage", "columns"])) : G("", !0)
|
||
]);
|
||
}
|
||
const Rf = /* @__PURE__ */ $e(Cf, [["render", Ff]]);
|
||
/**!
|
||
* Sortable 1.14.0
|
||
* @author RubaXa <trash@rubaxa.org>
|
||
* @author owenm <owen23355@gmail.com>
|
||
* @license MIT
|
||
*/
|
||
function Oa(e, t) {
|
||
var n = Object.keys(e);
|
||
if (Object.getOwnPropertySymbols) {
|
||
var o = Object.getOwnPropertySymbols(e);
|
||
t && (o = o.filter(function(r) {
|
||
return Object.getOwnPropertyDescriptor(e, r).enumerable;
|
||
})), n.push.apply(n, o);
|
||
}
|
||
return n;
|
||
}
|
||
function qt(e) {
|
||
for (var t = 1; t < arguments.length; t++) {
|
||
var n = arguments[t] != null ? arguments[t] : {};
|
||
t % 2 ? Oa(Object(n), !0).forEach(function(o) {
|
||
kf(e, o, n[o]);
|
||
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Oa(Object(n)).forEach(function(o) {
|
||
Object.defineProperty(e, o, Object.getOwnPropertyDescriptor(n, o));
|
||
});
|
||
}
|
||
return e;
|
||
}
|
||
function Ao(e) {
|
||
"@babel/helpers - typeof";
|
||
return typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? Ao = function(t) {
|
||
return typeof t;
|
||
} : Ao = function(t) {
|
||
return t && typeof Symbol == "function" && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t;
|
||
}, Ao(e);
|
||
}
|
||
function kf(e, t, n) {
|
||
return t in e ? Object.defineProperty(e, t, {
|
||
value: n,
|
||
enumerable: !0,
|
||
configurable: !0,
|
||
writable: !0
|
||
}) : e[t] = n, e;
|
||
}
|
||
function Gt() {
|
||
return Gt = Object.assign || function(e) {
|
||
for (var t = 1; t < arguments.length; t++) {
|
||
var n = arguments[t];
|
||
for (var o in n)
|
||
Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]);
|
||
}
|
||
return e;
|
||
}, Gt.apply(this, arguments);
|
||
}
|
||
function Df(e, t) {
|
||
if (e == null)
|
||
return {};
|
||
var n = {}, o = Object.keys(e), r, a;
|
||
for (a = 0; a < o.length; a++)
|
||
r = o[a], !(t.indexOf(r) >= 0) && (n[r] = e[r]);
|
||
return n;
|
||
}
|
||
function Of(e, t) {
|
||
if (e == null)
|
||
return {};
|
||
var n = Df(e, t), o, r;
|
||
if (Object.getOwnPropertySymbols) {
|
||
var a = Object.getOwnPropertySymbols(e);
|
||
for (r = 0; r < a.length; r++)
|
||
o = a[r], !(t.indexOf(o) >= 0) && Object.prototype.propertyIsEnumerable.call(e, o) && (n[o] = e[o]);
|
||
}
|
||
return n;
|
||
}
|
||
var Ef = "1.14.0";
|
||
function Yt(e) {
|
||
if (typeof window < "u" && window.navigator)
|
||
return !!/* @__PURE__ */ navigator.userAgent.match(e);
|
||
}
|
||
var Xt = Yt(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i), vo = Yt(/Edge/i), Ea = Yt(/firefox/i), Qn = Yt(/safari/i) && !Yt(/chrome/i) && !Yt(/android/i), $i = Yt(/iP(ad|od|hone)/i), Tf = Yt(/chrome/i) && Yt(/android/i), Ai = {
|
||
capture: !1,
|
||
passive: !1
|
||
};
|
||
function De(e, t, n) {
|
||
e.addEventListener(t, n, !Xt && Ai);
|
||
}
|
||
function ke(e, t, n) {
|
||
e.removeEventListener(t, n, !Xt && Ai);
|
||
}
|
||
function Ho(e, t) {
|
||
if (t) {
|
||
if (t[0] === ">" && (t = t.substring(1)), e)
|
||
try {
|
||
if (e.matches)
|
||
return e.matches(t);
|
||
if (e.msMatchesSelector)
|
||
return e.msMatchesSelector(t);
|
||
if (e.webkitMatchesSelector)
|
||
return e.webkitMatchesSelector(t);
|
||
} catch {
|
||
return !1;
|
||
}
|
||
return !1;
|
||
}
|
||
}
|
||
function $f(e) {
|
||
return e.host && e !== document && e.host.nodeType ? e.host : e.parentNode;
|
||
}
|
||
function Mt(e, t, n, o) {
|
||
if (e) {
|
||
n = n || document;
|
||
do {
|
||
if (t != null && (t[0] === ">" ? e.parentNode === n && Ho(e, t) : Ho(e, t)) || o && e === n)
|
||
return e;
|
||
if (e === n)
|
||
break;
|
||
} while (e = $f(e));
|
||
}
|
||
return null;
|
||
}
|
||
var Ta = /\s+/g;
|
||
function ht(e, t, n) {
|
||
if (e && t)
|
||
if (e.classList)
|
||
e.classList[n ? "add" : "remove"](t);
|
||
else {
|
||
var o = (" " + e.className + " ").replace(Ta, " ").replace(" " + t + " ", " ");
|
||
e.className = (o + (n ? " " + t : "")).replace(Ta, " ");
|
||
}
|
||
}
|
||
function me(e, t, n) {
|
||
var o = e && e.style;
|
||
if (o) {
|
||
if (n === void 0)
|
||
return document.defaultView && document.defaultView.getComputedStyle ? n = document.defaultView.getComputedStyle(e, "") : e.currentStyle && (n = e.currentStyle), t === void 0 ? n : n[t];
|
||
!(t in o) && t.indexOf("webkit") === -1 && (t = "-webkit-" + t), o[t] = n + (typeof n == "string" ? "" : "px");
|
||
}
|
||
}
|
||
function An(e, t) {
|
||
var n = "";
|
||
if (typeof e == "string")
|
||
n = e;
|
||
else
|
||
do {
|
||
var o = me(e, "transform");
|
||
o && o !== "none" && (n = o + " " + n);
|
||
} while (!t && (e = e.parentNode));
|
||
var r = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;
|
||
return r && new r(n);
|
||
}
|
||
function Ii(e, t, n) {
|
||
if (e) {
|
||
var o = e.getElementsByTagName(t), r = 0, a = o.length;
|
||
if (n)
|
||
for (; r < a; r++)
|
||
n(o[r], r);
|
||
return o;
|
||
}
|
||
return [];
|
||
}
|
||
function zt() {
|
||
var e = document.scrollingElement;
|
||
return e || document.documentElement;
|
||
}
|
||
function Ke(e, t, n, o, r) {
|
||
if (!(!e.getBoundingClientRect && e !== window)) {
|
||
var a, i, l, s, u, c, d;
|
||
if (e !== window && e.parentNode && e !== zt() ? (a = e.getBoundingClientRect(), i = a.top, l = a.left, s = a.bottom, u = a.right, c = a.height, d = a.width) : (i = 0, l = 0, s = window.innerHeight, u = window.innerWidth, c = window.innerHeight, d = window.innerWidth), (t || n) && e !== window && (r = r || e.parentNode, !Xt))
|
||
do
|
||
if (r && r.getBoundingClientRect && (me(r, "transform") !== "none" || n && me(r, "position") !== "static")) {
|
||
var f = r.getBoundingClientRect();
|
||
i -= f.top + parseInt(me(r, "border-top-width")), l -= f.left + parseInt(me(r, "border-left-width")), s = i + a.height, u = l + a.width;
|
||
break;
|
||
}
|
||
while (r = r.parentNode);
|
||
if (o && e !== window) {
|
||
var h = An(r || e), g = h && h.a, m = h && h.d;
|
||
h && (i /= m, l /= g, d /= g, c /= m, s = i + c, u = l + d);
|
||
}
|
||
return {
|
||
top: i,
|
||
left: l,
|
||
bottom: s,
|
||
right: u,
|
||
width: d,
|
||
height: c
|
||
};
|
||
}
|
||
}
|
||
function $a(e, t, n) {
|
||
for (var o = ln(e, !0), r = Ke(e)[t]; o; ) {
|
||
var a = Ke(o)[n], i = void 0;
|
||
if (n === "top" || n === "left" ? i = r >= a : i = r <= a, !i)
|
||
return o;
|
||
if (o === zt())
|
||
break;
|
||
o = ln(o, !1);
|
||
}
|
||
return !1;
|
||
}
|
||
function Nn(e, t, n, o) {
|
||
for (var r = 0, a = 0, i = e.children; a < i.length; ) {
|
||
if (i[a].style.display !== "none" && i[a] !== pe.ghost && (o || i[a] !== pe.dragged) && Mt(i[a], n.draggable, e, !1)) {
|
||
if (r === t)
|
||
return i[a];
|
||
r++;
|
||
}
|
||
a++;
|
||
}
|
||
return null;
|
||
}
|
||
function ra(e, t) {
|
||
for (var n = e.lastElementChild; n && (n === pe.ghost || me(n, "display") === "none" || t && !Ho(n, t)); )
|
||
n = n.previousElementSibling;
|
||
return n || null;
|
||
}
|
||
function St(e, t) {
|
||
var n = 0;
|
||
if (!e || !e.parentNode)
|
||
return -1;
|
||
for (; e = e.previousElementSibling; )
|
||
e.nodeName.toUpperCase() !== "TEMPLATE" && e !== pe.clone && (!t || Ho(e, t)) && n++;
|
||
return n;
|
||
}
|
||
function Aa(e) {
|
||
var t = 0, n = 0, o = zt();
|
||
if (e)
|
||
do {
|
||
var r = An(e), a = r.a, i = r.d;
|
||
t += e.scrollLeft * a, n += e.scrollTop * i;
|
||
} while (e !== o && (e = e.parentNode));
|
||
return [t, n];
|
||
}
|
||
function Af(e, t) {
|
||
for (var n in e)
|
||
if (e.hasOwnProperty(n)) {
|
||
for (var o in t)
|
||
if (t.hasOwnProperty(o) && t[o] === e[n][o])
|
||
return Number(n);
|
||
}
|
||
return -1;
|
||
}
|
||
function ln(e, t) {
|
||
if (!e || !e.getBoundingClientRect)
|
||
return zt();
|
||
var n = e, o = !1;
|
||
do
|
||
if (n.clientWidth < n.scrollWidth || n.clientHeight < n.scrollHeight) {
|
||
var r = me(n);
|
||
if (n.clientWidth < n.scrollWidth && (r.overflowX == "auto" || r.overflowX == "scroll") || n.clientHeight < n.scrollHeight && (r.overflowY == "auto" || r.overflowY == "scroll")) {
|
||
if (!n.getBoundingClientRect || n === document.body)
|
||
return zt();
|
||
if (o || t)
|
||
return n;
|
||
o = !0;
|
||
}
|
||
}
|
||
while (n = n.parentNode);
|
||
return zt();
|
||
}
|
||
function If(e, t) {
|
||
if (e && t)
|
||
for (var n in t)
|
||
t.hasOwnProperty(n) && (e[n] = t[n]);
|
||
return e;
|
||
}
|
||
function cr(e, t) {
|
||
return Math.round(e.top) === Math.round(t.top) && Math.round(e.left) === Math.round(t.left) && Math.round(e.height) === Math.round(t.height) && Math.round(e.width) === Math.round(t.width);
|
||
}
|
||
var Zn;
|
||
function Vi(e, t) {
|
||
return function() {
|
||
if (!Zn) {
|
||
var n = arguments, o = this;
|
||
n.length === 1 ? e.call(o, n[0]) : e.apply(o, n), Zn = setTimeout(function() {
|
||
Zn = void 0;
|
||
}, t);
|
||
}
|
||
};
|
||
}
|
||
function Vf() {
|
||
clearTimeout(Zn), Zn = void 0;
|
||
}
|
||
function Pi(e, t, n) {
|
||
e.scrollLeft += t, e.scrollTop += n;
|
||
}
|
||
function Mi(e) {
|
||
var t = window.Polymer, n = window.jQuery || window.Zepto;
|
||
return t && t.dom ? t.dom(e).cloneNode(!0) : n ? n(e).clone(!0)[0] : e.cloneNode(!0);
|
||
}
|
||
var wt = "Sortable" + (/* @__PURE__ */ new Date()).getTime();
|
||
function Pf() {
|
||
var e = [], t;
|
||
return {
|
||
captureAnimationState: function() {
|
||
if (e = [], !!this.options.animation) {
|
||
var o = [].slice.call(this.el.children);
|
||
o.forEach(function(r) {
|
||
if (!(me(r, "display") === "none" || r === pe.ghost)) {
|
||
e.push({
|
||
target: r,
|
||
rect: Ke(r)
|
||
});
|
||
var a = qt({}, e[e.length - 1].rect);
|
||
if (r.thisAnimationDuration) {
|
||
var i = An(r, !0);
|
||
i && (a.top -= i.f, a.left -= i.e);
|
||
}
|
||
r.fromRect = a;
|
||
}
|
||
});
|
||
}
|
||
},
|
||
addAnimationState: function(o) {
|
||
e.push(o);
|
||
},
|
||
removeAnimationState: function(o) {
|
||
e.splice(Af(e, {
|
||
target: o
|
||
}), 1);
|
||
},
|
||
animateAll: function(o) {
|
||
var r = this;
|
||
if (!this.options.animation) {
|
||
clearTimeout(t), typeof o == "function" && o();
|
||
return;
|
||
}
|
||
var a = !1, i = 0;
|
||
e.forEach(function(l) {
|
||
var s = 0, u = l.target, c = u.fromRect, d = Ke(u), f = u.prevFromRect, h = u.prevToRect, g = l.rect, m = An(u, !0);
|
||
m && (d.top -= m.f, d.left -= m.e), u.toRect = d, u.thisAnimationDuration && cr(f, d) && !cr(c, d) && // Make sure animatingRect is on line between toRect & fromRect
|
||
(g.top - d.top) / (g.left - d.left) === (c.top - d.top) / (c.left - d.left) && (s = Bf(g, f, h, r.options)), cr(d, c) || (u.prevFromRect = c, u.prevToRect = d, s || (s = r.options.animation), r.animate(u, g, d, s)), s && (a = !0, i = Math.max(i, s), clearTimeout(u.animationResetTimer), u.animationResetTimer = setTimeout(function() {
|
||
u.animationTime = 0, u.prevFromRect = null, u.fromRect = null, u.prevToRect = null, u.thisAnimationDuration = null;
|
||
}, s), u.thisAnimationDuration = s);
|
||
}), clearTimeout(t), a ? t = setTimeout(function() {
|
||
typeof o == "function" && o();
|
||
}, i) : typeof o == "function" && o(), e = [];
|
||
},
|
||
animate: function(o, r, a, i) {
|
||
if (i) {
|
||
me(o, "transition", ""), me(o, "transform", "");
|
||
var l = An(this.el), s = l && l.a, u = l && l.d, c = (r.left - a.left) / (s || 1), d = (r.top - a.top) / (u || 1);
|
||
o.animatingX = !!c, o.animatingY = !!d, me(o, "transform", "translate3d(" + c + "px," + d + "px,0)"), this.forRepaintDummy = Mf(o), me(o, "transition", "transform " + i + "ms" + (this.options.easing ? " " + this.options.easing : "")), me(o, "transform", "translate3d(0,0,0)"), typeof o.animated == "number" && clearTimeout(o.animated), o.animated = setTimeout(function() {
|
||
me(o, "transition", ""), me(o, "transform", ""), o.animated = !1, o.animatingX = !1, o.animatingY = !1;
|
||
}, i);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function Mf(e) {
|
||
return e.offsetWidth;
|
||
}
|
||
function Bf(e, t, n, o) {
|
||
return Math.sqrt(Math.pow(t.top - e.top, 2) + Math.pow(t.left - e.left, 2)) / Math.sqrt(Math.pow(t.top - n.top, 2) + Math.pow(t.left - n.left, 2)) * o.animation;
|
||
}
|
||
var Dn = [], dr = {
|
||
initializeByDefault: !0
|
||
}, bo = {
|
||
mount: function(t) {
|
||
for (var n in dr)
|
||
dr.hasOwnProperty(n) && !(n in t) && (t[n] = dr[n]);
|
||
Dn.forEach(function(o) {
|
||
if (o.pluginName === t.pluginName)
|
||
throw "Sortable: Cannot mount plugin ".concat(t.pluginName, " more than once");
|
||
}), Dn.push(t);
|
||
},
|
||
pluginEvent: function(t, n, o) {
|
||
var r = this;
|
||
this.eventCanceled = !1, o.cancel = function() {
|
||
r.eventCanceled = !0;
|
||
};
|
||
var a = t + "Global";
|
||
Dn.forEach(function(i) {
|
||
n[i.pluginName] && (n[i.pluginName][a] && n[i.pluginName][a](qt({
|
||
sortable: n
|
||
}, o)), n.options[i.pluginName] && n[i.pluginName][t] && n[i.pluginName][t](qt({
|
||
sortable: n
|
||
}, o)));
|
||
});
|
||
},
|
||
initializePlugins: function(t, n, o, r) {
|
||
Dn.forEach(function(l) {
|
||
var s = l.pluginName;
|
||
if (!(!t.options[s] && !l.initializeByDefault)) {
|
||
var u = new l(t, n, t.options);
|
||
u.sortable = t, u.options = t.options, t[s] = u, Gt(o, u.defaults);
|
||
}
|
||
});
|
||
for (var a in t.options)
|
||
if (t.options.hasOwnProperty(a)) {
|
||
var i = this.modifyOption(t, a, t.options[a]);
|
||
typeof i < "u" && (t.options[a] = i);
|
||
}
|
||
},
|
||
getEventProperties: function(t, n) {
|
||
var o = {};
|
||
return Dn.forEach(function(r) {
|
||
typeof r.eventProperties == "function" && Gt(o, r.eventProperties.call(n[r.pluginName], t));
|
||
}), o;
|
||
},
|
||
modifyOption: function(t, n, o) {
|
||
var r;
|
||
return Dn.forEach(function(a) {
|
||
t[a.pluginName] && a.optionListeners && typeof a.optionListeners[n] == "function" && (r = a.optionListeners[n].call(t[a.pluginName], o));
|
||
}), r;
|
||
}
|
||
};
|
||
function jf(e) {
|
||
var t = e.sortable, n = e.rootEl, o = e.name, r = e.targetEl, a = e.cloneEl, i = e.toEl, l = e.fromEl, s = e.oldIndex, u = e.newIndex, c = e.oldDraggableIndex, d = e.newDraggableIndex, f = e.originalEvent, h = e.putSortable, g = e.extraEventProperties;
|
||
if (t = t || n && n[wt], !!t) {
|
||
var m, y = t.options, v = "on" + o.charAt(0).toUpperCase() + o.substr(1);
|
||
window.CustomEvent && !Xt && !vo ? m = new CustomEvent(o, {
|
||
bubbles: !0,
|
||
cancelable: !0
|
||
}) : (m = document.createEvent("Event"), m.initEvent(o, !0, !0)), m.to = i || n, m.from = l || n, m.item = r || n, m.clone = a, m.oldIndex = s, m.newIndex = u, m.oldDraggableIndex = c, m.newDraggableIndex = d, m.originalEvent = f, m.pullMode = h ? h.lastPutMode : void 0;
|
||
var F = qt(qt({}, g), bo.getEventProperties(o, t));
|
||
for (var R in F)
|
||
m[R] = F[R];
|
||
n && n.dispatchEvent(m), y[v] && y[v].call(t, m);
|
||
}
|
||
}
|
||
var xf = ["evt"], ct = function(t, n) {
|
||
var o = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, r = o.evt, a = Of(o, xf);
|
||
bo.pluginEvent.bind(pe)(t, n, qt({
|
||
dragEl: U,
|
||
parentEl: xe,
|
||
ghostEl: _e,
|
||
rootEl: Me,
|
||
nextEl: gn,
|
||
lastDownEl: Io,
|
||
cloneEl: Ne,
|
||
cloneHidden: on,
|
||
dragStarted: Yn,
|
||
putSortable: Ze,
|
||
activeSortable: pe.active,
|
||
originalEvent: r,
|
||
oldIndex: $n,
|
||
oldDraggableIndex: eo,
|
||
newIndex: mt,
|
||
newDraggableIndex: nn,
|
||
hideGhostForTarget: Ni,
|
||
unhideGhostForTarget: Li,
|
||
cloneNowHidden: function() {
|
||
on = !0;
|
||
},
|
||
cloneNowShown: function() {
|
||
on = !1;
|
||
},
|
||
dispatchSortableEvent: function(l) {
|
||
it({
|
||
sortable: n,
|
||
name: l,
|
||
originalEvent: r
|
||
});
|
||
}
|
||
}, a));
|
||
};
|
||
function it(e) {
|
||
jf(qt({
|
||
putSortable: Ze,
|
||
cloneEl: Ne,
|
||
targetEl: U,
|
||
rootEl: Me,
|
||
oldIndex: $n,
|
||
oldDraggableIndex: eo,
|
||
newIndex: mt,
|
||
newDraggableIndex: nn
|
||
}, e));
|
||
}
|
||
var U, xe, _e, Me, gn, Io, Ne, on, $n, mt, eo, nn, So, Ze, En = !1, Wo = !1, Uo = [], mn, Ft, fr, hr, Ia, Va, Yn, On, to, no = !1, Fo = !1, Vo, tt, mr = [], xr = !1, Ko = [], rr = typeof document < "u", Ro = $i, Pa = vo || Xt ? "cssFloat" : "float", Nf = rr && !Tf && !$i && "draggable" in document.createElement("div"), Bi = function() {
|
||
if (rr) {
|
||
if (Xt)
|
||
return !1;
|
||
var e = document.createElement("x");
|
||
return e.style.cssText = "pointer-events:auto", e.style.pointerEvents === "auto";
|
||
}
|
||
}(), ji = function(t, n) {
|
||
var o = me(t), r = parseInt(o.width) - parseInt(o.paddingLeft) - parseInt(o.paddingRight) - parseInt(o.borderLeftWidth) - parseInt(o.borderRightWidth), a = Nn(t, 0, n), i = Nn(t, 1, n), l = a && me(a), s = i && me(i), u = l && parseInt(l.marginLeft) + parseInt(l.marginRight) + Ke(a).width, c = s && parseInt(s.marginLeft) + parseInt(s.marginRight) + Ke(i).width;
|
||
if (o.display === "flex")
|
||
return o.flexDirection === "column" || o.flexDirection === "column-reverse" ? "vertical" : "horizontal";
|
||
if (o.display === "grid")
|
||
return o.gridTemplateColumns.split(" ").length <= 1 ? "vertical" : "horizontal";
|
||
if (a && l.float && l.float !== "none") {
|
||
var d = l.float === "left" ? "left" : "right";
|
||
return i && (s.clear === "both" || s.clear === d) ? "vertical" : "horizontal";
|
||
}
|
||
return a && (l.display === "block" || l.display === "flex" || l.display === "table" || l.display === "grid" || u >= r && o[Pa] === "none" || i && o[Pa] === "none" && u + c > r) ? "vertical" : "horizontal";
|
||
}, Lf = function(t, n, o) {
|
||
var r = o ? t.left : t.top, a = o ? t.right : t.bottom, i = o ? t.width : t.height, l = o ? n.left : n.top, s = o ? n.right : n.bottom, u = o ? n.width : n.height;
|
||
return r === l || a === s || r + i / 2 === l + u / 2;
|
||
}, zf = function(t, n) {
|
||
var o;
|
||
return Uo.some(function(r) {
|
||
var a = r[wt].options.emptyInsertThreshold;
|
||
if (!(!a || ra(r))) {
|
||
var i = Ke(r), l = t >= i.left - a && t <= i.right + a, s = n >= i.top - a && n <= i.bottom + a;
|
||
if (l && s)
|
||
return o = r;
|
||
}
|
||
}), o;
|
||
}, xi = function(t) {
|
||
function n(a, i) {
|
||
return function(l, s, u, c) {
|
||
var d = l.options.group.name && s.options.group.name && l.options.group.name === s.options.group.name;
|
||
if (a == null && (i || d))
|
||
return !0;
|
||
if (a == null || a === !1)
|
||
return !1;
|
||
if (i && a === "clone")
|
||
return a;
|
||
if (typeof a == "function")
|
||
return n(a(l, s, u, c), i)(l, s, u, c);
|
||
var f = (i ? l : s).options.group.name;
|
||
return a === !0 || typeof a == "string" && a === f || a.join && a.indexOf(f) > -1;
|
||
};
|
||
}
|
||
var o = {}, r = t.group;
|
||
(!r || Ao(r) != "object") && (r = {
|
||
name: r
|
||
}), o.name = r.name, o.checkPull = n(r.pull, !0), o.checkPut = n(r.put), o.revertClone = r.revertClone, t.group = o;
|
||
}, Ni = function() {
|
||
!Bi && _e && me(_e, "display", "none");
|
||
}, Li = function() {
|
||
!Bi && _e && me(_e, "display", "");
|
||
};
|
||
rr && document.addEventListener("click", function(e) {
|
||
if (Wo)
|
||
return e.preventDefault(), e.stopPropagation && e.stopPropagation(), e.stopImmediatePropagation && e.stopImmediatePropagation(), Wo = !1, !1;
|
||
}, !0);
|
||
var pn = function(t) {
|
||
if (U) {
|
||
t = t.touches ? t.touches[0] : t;
|
||
var n = zf(t.clientX, t.clientY);
|
||
if (n) {
|
||
var o = {};
|
||
for (var r in t)
|
||
t.hasOwnProperty(r) && (o[r] = t[r]);
|
||
o.target = o.rootEl = n, o.preventDefault = void 0, o.stopPropagation = void 0, n[wt]._onDragOver(o);
|
||
}
|
||
}
|
||
}, qf = function(t) {
|
||
U && U.parentNode[wt]._isOutsideThisEl(t.target);
|
||
};
|
||
function pe(e, t) {
|
||
if (!(e && e.nodeType && e.nodeType === 1))
|
||
throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(e));
|
||
this.el = e, this.options = t = Gt({}, t), e[wt] = this;
|
||
var n = {
|
||
group: null,
|
||
sort: !0,
|
||
disabled: !1,
|
||
store: null,
|
||
handle: null,
|
||
draggable: /^[uo]l$/i.test(e.nodeName) ? ">li" : ">*",
|
||
swapThreshold: 1,
|
||
// percentage; 0 <= x <= 1
|
||
invertSwap: !1,
|
||
// invert always
|
||
invertedSwapThreshold: null,
|
||
// will be set to same as swapThreshold if default
|
||
removeCloneOnHide: !0,
|
||
direction: function() {
|
||
return ji(e, this.options);
|
||
},
|
||
ghostClass: "sortable-ghost",
|
||
chosenClass: "sortable-chosen",
|
||
dragClass: "sortable-drag",
|
||
ignore: "a, img",
|
||
filter: null,
|
||
preventOnFilter: !0,
|
||
animation: 0,
|
||
easing: null,
|
||
setData: function(i, l) {
|
||
i.setData("Text", l.textContent);
|
||
},
|
||
dropBubble: !1,
|
||
dragoverBubble: !1,
|
||
dataIdAttr: "data-id",
|
||
delay: 0,
|
||
delayOnTouchOnly: !1,
|
||
touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,
|
||
forceFallback: !1,
|
||
fallbackClass: "sortable-fallback",
|
||
fallbackOnBody: !1,
|
||
fallbackTolerance: 0,
|
||
fallbackOffset: {
|
||
x: 0,
|
||
y: 0
|
||
},
|
||
supportPointer: pe.supportPointer !== !1 && "PointerEvent" in window && !Qn,
|
||
emptyInsertThreshold: 5
|
||
};
|
||
bo.initializePlugins(this, e, n);
|
||
for (var o in n)
|
||
!(o in t) && (t[o] = n[o]);
|
||
xi(t);
|
||
for (var r in this)
|
||
r.charAt(0) === "_" && typeof this[r] == "function" && (this[r] = this[r].bind(this));
|
||
this.nativeDraggable = t.forceFallback ? !1 : Nf, this.nativeDraggable && (this.options.touchStartThreshold = 1), t.supportPointer ? De(e, "pointerdown", this._onTapStart) : (De(e, "mousedown", this._onTapStart), De(e, "touchstart", this._onTapStart)), this.nativeDraggable && (De(e, "dragover", this), De(e, "dragenter", this)), Uo.push(this.el), t.store && t.store.get && this.sort(t.store.get(this) || []), Gt(this, Pf());
|
||
}
|
||
pe.prototype = /** @lends Sortable.prototype */
|
||
{
|
||
constructor: pe,
|
||
_isOutsideThisEl: function(t) {
|
||
!this.el.contains(t) && t !== this.el && (On = null);
|
||
},
|
||
_getDirection: function(t, n) {
|
||
return typeof this.options.direction == "function" ? this.options.direction.call(this, t, n, U) : this.options.direction;
|
||
},
|
||
_onTapStart: function(t) {
|
||
if (t.cancelable) {
|
||
var n = this, o = this.el, r = this.options, a = r.preventOnFilter, i = t.type, l = t.touches && t.touches[0] || t.pointerType && t.pointerType === "touch" && t, s = (l || t).target, u = t.target.shadowRoot && (t.path && t.path[0] || t.composedPath && t.composedPath()[0]) || s, c = r.filter;
|
||
if (Jf(o), !U && !(/mousedown|pointerdown/.test(i) && t.button !== 0 || r.disabled) && !u.isContentEditable && !(!this.nativeDraggable && Qn && s && s.tagName.toUpperCase() === "SELECT") && (s = Mt(s, r.draggable, o, !1), !(s && s.animated) && Io !== s)) {
|
||
if ($n = St(s), eo = St(s, r.draggable), typeof c == "function") {
|
||
if (c.call(this, t, s, this)) {
|
||
it({
|
||
sortable: n,
|
||
rootEl: u,
|
||
name: "filter",
|
||
targetEl: s,
|
||
toEl: o,
|
||
fromEl: o
|
||
}), ct("filter", n, {
|
||
evt: t
|
||
}), a && t.cancelable && t.preventDefault();
|
||
return;
|
||
}
|
||
} else if (c && (c = c.split(",").some(function(d) {
|
||
if (d = Mt(u, d.trim(), o, !1), d)
|
||
return it({
|
||
sortable: n,
|
||
rootEl: d,
|
||
name: "filter",
|
||
targetEl: s,
|
||
fromEl: o,
|
||
toEl: o
|
||
}), ct("filter", n, {
|
||
evt: t
|
||
}), !0;
|
||
}), c)) {
|
||
a && t.cancelable && t.preventDefault();
|
||
return;
|
||
}
|
||
r.handle && !Mt(u, r.handle, o, !1) || this._prepareDragStart(t, l, s);
|
||
}
|
||
}
|
||
},
|
||
_prepareDragStart: function(t, n, o) {
|
||
var r = this, a = r.el, i = r.options, l = a.ownerDocument, s;
|
||
if (o && !U && o.parentNode === a) {
|
||
var u = Ke(o);
|
||
if (Me = a, U = o, xe = U.parentNode, gn = U.nextSibling, Io = o, So = i.group, pe.dragged = U, mn = {
|
||
target: U,
|
||
clientX: (n || t).clientX,
|
||
clientY: (n || t).clientY
|
||
}, Ia = mn.clientX - u.left, Va = mn.clientY - u.top, this._lastX = (n || t).clientX, this._lastY = (n || t).clientY, U.style["will-change"] = "all", s = function() {
|
||
if (ct("delayEnded", r, {
|
||
evt: t
|
||
}), pe.eventCanceled) {
|
||
r._onDrop();
|
||
return;
|
||
}
|
||
r._disableDelayedDragEvents(), !Ea && r.nativeDraggable && (U.draggable = !0), r._triggerDragStart(t, n), it({
|
||
sortable: r,
|
||
name: "choose",
|
||
originalEvent: t
|
||
}), ht(U, i.chosenClass, !0);
|
||
}, i.ignore.split(",").forEach(function(c) {
|
||
Ii(U, c.trim(), pr);
|
||
}), De(l, "dragover", pn), De(l, "mousemove", pn), De(l, "touchmove", pn), De(l, "mouseup", r._onDrop), De(l, "touchend", r._onDrop), De(l, "touchcancel", r._onDrop), Ea && this.nativeDraggable && (this.options.touchStartThreshold = 4, U.draggable = !0), ct("delayStart", this, {
|
||
evt: t
|
||
}), i.delay && (!i.delayOnTouchOnly || n) && (!this.nativeDraggable || !(vo || Xt))) {
|
||
if (pe.eventCanceled) {
|
||
this._onDrop();
|
||
return;
|
||
}
|
||
De(l, "mouseup", r._disableDelayedDrag), De(l, "touchend", r._disableDelayedDrag), De(l, "touchcancel", r._disableDelayedDrag), De(l, "mousemove", r._delayedDragTouchMoveHandler), De(l, "touchmove", r._delayedDragTouchMoveHandler), i.supportPointer && De(l, "pointermove", r._delayedDragTouchMoveHandler), r._dragStartTimer = setTimeout(s, i.delay);
|
||
} else
|
||
s();
|
||
}
|
||
},
|
||
_delayedDragTouchMoveHandler: function(t) {
|
||
var n = t.touches ? t.touches[0] : t;
|
||
Math.max(Math.abs(n.clientX - this._lastX), Math.abs(n.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1)) && this._disableDelayedDrag();
|
||
},
|
||
_disableDelayedDrag: function() {
|
||
U && pr(U), clearTimeout(this._dragStartTimer), this._disableDelayedDragEvents();
|
||
},
|
||
_disableDelayedDragEvents: function() {
|
||
var t = this.el.ownerDocument;
|
||
ke(t, "mouseup", this._disableDelayedDrag), ke(t, "touchend", this._disableDelayedDrag), ke(t, "touchcancel", this._disableDelayedDrag), ke(t, "mousemove", this._delayedDragTouchMoveHandler), ke(t, "touchmove", this._delayedDragTouchMoveHandler), ke(t, "pointermove", this._delayedDragTouchMoveHandler);
|
||
},
|
||
_triggerDragStart: function(t, n) {
|
||
n = n || t.pointerType == "touch" && t, !this.nativeDraggable || n ? this.options.supportPointer ? De(document, "pointermove", this._onTouchMove) : n ? De(document, "touchmove", this._onTouchMove) : De(document, "mousemove", this._onTouchMove) : (De(U, "dragend", this), De(Me, "dragstart", this._onDragStart));
|
||
try {
|
||
document.selection ? Po(function() {
|
||
document.selection.empty();
|
||
}) : window.getSelection().removeAllRanges();
|
||
} catch {
|
||
}
|
||
},
|
||
_dragStarted: function(t, n) {
|
||
if (En = !1, Me && U) {
|
||
ct("dragStarted", this, {
|
||
evt: n
|
||
}), this.nativeDraggable && De(document, "dragover", qf);
|
||
var o = this.options;
|
||
!t && ht(U, o.dragClass, !1), ht(U, o.ghostClass, !0), pe.active = this, t && this._appendGhost(), it({
|
||
sortable: this,
|
||
name: "start",
|
||
originalEvent: n
|
||
});
|
||
} else
|
||
this._nulling();
|
||
},
|
||
_emulateDragOver: function() {
|
||
if (Ft) {
|
||
this._lastX = Ft.clientX, this._lastY = Ft.clientY, Ni();
|
||
for (var t = document.elementFromPoint(Ft.clientX, Ft.clientY), n = t; t && t.shadowRoot && (t = t.shadowRoot.elementFromPoint(Ft.clientX, Ft.clientY), t !== n); )
|
||
n = t;
|
||
if (U.parentNode[wt]._isOutsideThisEl(t), n)
|
||
do {
|
||
if (n[wt]) {
|
||
var o = void 0;
|
||
if (o = n[wt]._onDragOver({
|
||
clientX: Ft.clientX,
|
||
clientY: Ft.clientY,
|
||
target: t,
|
||
rootEl: n
|
||
}), o && !this.options.dragoverBubble)
|
||
break;
|
||
}
|
||
t = n;
|
||
} while (n = n.parentNode);
|
||
Li();
|
||
}
|
||
},
|
||
_onTouchMove: function(t) {
|
||
if (mn) {
|
||
var n = this.options, o = n.fallbackTolerance, r = n.fallbackOffset, a = t.touches ? t.touches[0] : t, i = _e && An(_e, !0), l = _e && i && i.a, s = _e && i && i.d, u = Ro && tt && Aa(tt), c = (a.clientX - mn.clientX + r.x) / (l || 1) + (u ? u[0] - mr[0] : 0) / (l || 1), d = (a.clientY - mn.clientY + r.y) / (s || 1) + (u ? u[1] - mr[1] : 0) / (s || 1);
|
||
if (!pe.active && !En) {
|
||
if (o && Math.max(Math.abs(a.clientX - this._lastX), Math.abs(a.clientY - this._lastY)) < o)
|
||
return;
|
||
this._onDragStart(t, !0);
|
||
}
|
||
if (_e) {
|
||
i ? (i.e += c - (fr || 0), i.f += d - (hr || 0)) : i = {
|
||
a: 1,
|
||
b: 0,
|
||
c: 0,
|
||
d: 1,
|
||
e: c,
|
||
f: d
|
||
};
|
||
var f = "matrix(".concat(i.a, ",").concat(i.b, ",").concat(i.c, ",").concat(i.d, ",").concat(i.e, ",").concat(i.f, ")");
|
||
me(_e, "webkitTransform", f), me(_e, "mozTransform", f), me(_e, "msTransform", f), me(_e, "transform", f), fr = c, hr = d, Ft = a;
|
||
}
|
||
t.cancelable && t.preventDefault();
|
||
}
|
||
},
|
||
_appendGhost: function() {
|
||
if (!_e) {
|
||
var t = this.options.fallbackOnBody ? document.body : Me, n = Ke(U, !0, Ro, !0, t), o = this.options;
|
||
if (Ro) {
|
||
for (tt = t; me(tt, "position") === "static" && me(tt, "transform") === "none" && tt !== document; )
|
||
tt = tt.parentNode;
|
||
tt !== document.body && tt !== document.documentElement ? (tt === document && (tt = zt()), n.top += tt.scrollTop, n.left += tt.scrollLeft) : tt = zt(), mr = Aa(tt);
|
||
}
|
||
_e = U.cloneNode(!0), ht(_e, o.ghostClass, !1), ht(_e, o.fallbackClass, !0), ht(_e, o.dragClass, !0), me(_e, "transition", ""), me(_e, "transform", ""), me(_e, "box-sizing", "border-box"), me(_e, "margin", 0), me(_e, "top", n.top), me(_e, "left", n.left), me(_e, "width", n.width), me(_e, "height", n.height), me(_e, "opacity", "0.8"), me(_e, "position", Ro ? "absolute" : "fixed"), me(_e, "zIndex", "100000"), me(_e, "pointerEvents", "none"), pe.ghost = _e, t.appendChild(_e), me(_e, "transform-origin", Ia / parseInt(_e.style.width) * 100 + "% " + Va / parseInt(_e.style.height) * 100 + "%");
|
||
}
|
||
},
|
||
_onDragStart: function(t, n) {
|
||
var o = this, r = t.dataTransfer, a = o.options;
|
||
if (ct("dragStart", this, {
|
||
evt: t
|
||
}), pe.eventCanceled) {
|
||
this._onDrop();
|
||
return;
|
||
}
|
||
ct("setupClone", this), pe.eventCanceled || (Ne = Mi(U), Ne.draggable = !1, Ne.style["will-change"] = "", this._hideClone(), ht(Ne, this.options.chosenClass, !1), pe.clone = Ne), o.cloneId = Po(function() {
|
||
ct("clone", o), !pe.eventCanceled && (o.options.removeCloneOnHide || Me.insertBefore(Ne, U), o._hideClone(), it({
|
||
sortable: o,
|
||
name: "clone"
|
||
}));
|
||
}), !n && ht(U, a.dragClass, !0), n ? (Wo = !0, o._loopId = setInterval(o._emulateDragOver, 50)) : (ke(document, "mouseup", o._onDrop), ke(document, "touchend", o._onDrop), ke(document, "touchcancel", o._onDrop), r && (r.effectAllowed = "move", a.setData && a.setData.call(o, r, U)), De(document, "drop", o), me(U, "transform", "translateZ(0)")), En = !0, o._dragStartId = Po(o._dragStarted.bind(o, n, t)), De(document, "selectstart", o), Yn = !0, Qn && me(document.body, "user-select", "none");
|
||
},
|
||
// Returns true - if no further action is needed (either inserted or another condition)
|
||
_onDragOver: function(t) {
|
||
var n = this.el, o = t.target, r, a, i, l = this.options, s = l.group, u = pe.active, c = So === s, d = l.sort, f = Ze || u, h, g = this, m = !1;
|
||
if (xr)
|
||
return;
|
||
function y(re, ge) {
|
||
ct(re, g, qt({
|
||
evt: t,
|
||
isOwner: c,
|
||
axis: h ? "vertical" : "horizontal",
|
||
revert: i,
|
||
dragRect: r,
|
||
targetRect: a,
|
||
canSort: d,
|
||
fromSortable: f,
|
||
target: o,
|
||
completed: F,
|
||
onMove: function(w, _) {
|
||
return ko(Me, n, U, r, w, Ke(w), t, _);
|
||
},
|
||
changed: R
|
||
}, ge));
|
||
}
|
||
function v() {
|
||
y("dragOverAnimationCapture"), g.captureAnimationState(), g !== f && f.captureAnimationState();
|
||
}
|
||
function F(re) {
|
||
return y("dragOverCompleted", {
|
||
insertion: re
|
||
}), re && (c ? u._hideClone() : u._showClone(g), g !== f && (ht(U, Ze ? Ze.options.ghostClass : u.options.ghostClass, !1), ht(U, l.ghostClass, !0)), Ze !== g && g !== pe.active ? Ze = g : g === pe.active && Ze && (Ze = null), f === g && (g._ignoreWhileAnimating = o), g.animateAll(function() {
|
||
y("dragOverAnimationComplete"), g._ignoreWhileAnimating = null;
|
||
}), g !== f && (f.animateAll(), f._ignoreWhileAnimating = null)), (o === U && !U.animated || o === n && !o.animated) && (On = null), !l.dragoverBubble && !t.rootEl && o !== document && (U.parentNode[wt]._isOutsideThisEl(t.target), !re && pn(t)), !l.dragoverBubble && t.stopPropagation && t.stopPropagation(), m = !0;
|
||
}
|
||
function R() {
|
||
mt = St(U), nn = St(U, l.draggable), it({
|
||
sortable: g,
|
||
name: "change",
|
||
toEl: n,
|
||
newIndex: mt,
|
||
newDraggableIndex: nn,
|
||
originalEvent: t
|
||
});
|
||
}
|
||
if (t.preventDefault !== void 0 && t.cancelable && t.preventDefault(), o = Mt(o, l.draggable, n, !0), y("dragOver"), pe.eventCanceled)
|
||
return m;
|
||
if (U.contains(t.target) || o.animated && o.animatingX && o.animatingY || g._ignoreWhileAnimating === o)
|
||
return F(!1);
|
||
if (Wo = !1, u && !l.disabled && (c ? d || (i = xe !== Me) : Ze === this || (this.lastPutMode = So.checkPull(this, u, U, t)) && s.checkPut(this, u, U, t))) {
|
||
if (h = this._getDirection(t, o) === "vertical", r = Ke(U), y("dragOverValid"), pe.eventCanceled)
|
||
return m;
|
||
if (i)
|
||
return xe = Me, v(), this._hideClone(), y("revert"), pe.eventCanceled || (gn ? Me.insertBefore(U, gn) : Me.appendChild(U)), F(!0);
|
||
var k = ra(n, l.draggable);
|
||
if (!k || Kf(t, h, this) && !k.animated) {
|
||
if (k === U)
|
||
return F(!1);
|
||
if (k && n === t.target && (o = k), o && (a = Ke(o)), ko(Me, n, U, r, o, a, t, !!o) !== !1)
|
||
return v(), n.appendChild(U), xe = n, R(), F(!0);
|
||
} else if (k && Uf(t, h, this)) {
|
||
var j = Nn(n, 0, l, !0);
|
||
if (j === U)
|
||
return F(!1);
|
||
if (o = j, a = Ke(o), ko(Me, n, U, r, o, a, t, !1) !== !1)
|
||
return v(), n.insertBefore(U, j), xe = n, R(), F(!0);
|
||
} else if (o.parentNode === n) {
|
||
a = Ke(o);
|
||
var A = 0, T, q = U.parentNode !== n, D = !Lf(U.animated && U.toRect || r, o.animated && o.toRect || a, h), Y = h ? "top" : "left", le = $a(o, "top", "top") || $a(U, "top", "top"), I = le ? le.scrollTop : void 0;
|
||
On !== o && (T = a[Y], no = !1, Fo = !D && l.invertSwap || q), A = Yf(t, o, a, h, D ? 1 : l.swapThreshold, l.invertedSwapThreshold == null ? l.swapThreshold : l.invertedSwapThreshold, Fo, On === o);
|
||
var P;
|
||
if (A !== 0) {
|
||
var X = St(U);
|
||
do
|
||
X -= A, P = xe.children[X];
|
||
while (P && (me(P, "display") === "none" || P === _e));
|
||
}
|
||
if (A === 0 || P === o)
|
||
return F(!1);
|
||
On = o, to = A;
|
||
var O = o.nextElementSibling, x = !1;
|
||
x = A === 1;
|
||
var Q = ko(Me, n, U, r, o, a, t, x);
|
||
if (Q !== !1)
|
||
return (Q === 1 || Q === -1) && (x = Q === 1), xr = !0, setTimeout(Wf, 30), v(), x && !O ? n.appendChild(U) : o.parentNode.insertBefore(U, x ? O : o), le && Pi(le, 0, I - le.scrollTop), xe = U.parentNode, T !== void 0 && !Fo && (Vo = Math.abs(T - Ke(o)[Y])), R(), F(!0);
|
||
}
|
||
if (n.contains(U))
|
||
return F(!1);
|
||
}
|
||
return !1;
|
||
},
|
||
_ignoreWhileAnimating: null,
|
||
_offMoveEvents: function() {
|
||
ke(document, "mousemove", this._onTouchMove), ke(document, "touchmove", this._onTouchMove), ke(document, "pointermove", this._onTouchMove), ke(document, "dragover", pn), ke(document, "mousemove", pn), ke(document, "touchmove", pn);
|
||
},
|
||
_offUpEvents: function() {
|
||
var t = this.el.ownerDocument;
|
||
ke(t, "mouseup", this._onDrop), ke(t, "touchend", this._onDrop), ke(t, "pointerup", this._onDrop), ke(t, "touchcancel", this._onDrop), ke(document, "selectstart", this);
|
||
},
|
||
_onDrop: function(t) {
|
||
var n = this.el, o = this.options;
|
||
if (mt = St(U), nn = St(U, o.draggable), ct("drop", this, {
|
||
evt: t
|
||
}), xe = U && U.parentNode, mt = St(U), nn = St(U, o.draggable), pe.eventCanceled) {
|
||
this._nulling();
|
||
return;
|
||
}
|
||
En = !1, Fo = !1, no = !1, clearInterval(this._loopId), clearTimeout(this._dragStartTimer), Nr(this.cloneId), Nr(this._dragStartId), this.nativeDraggable && (ke(document, "drop", this), ke(n, "dragstart", this._onDragStart)), this._offMoveEvents(), this._offUpEvents(), Qn && me(document.body, "user-select", ""), me(U, "transform", ""), t && (Yn && (t.cancelable && t.preventDefault(), !o.dropBubble && t.stopPropagation()), _e && _e.parentNode && _e.parentNode.removeChild(_e), (Me === xe || Ze && Ze.lastPutMode !== "clone") && Ne && Ne.parentNode && Ne.parentNode.removeChild(Ne), U && (this.nativeDraggable && ke(U, "dragend", this), pr(U), U.style["will-change"] = "", Yn && !En && ht(U, Ze ? Ze.options.ghostClass : this.options.ghostClass, !1), ht(U, this.options.chosenClass, !1), it({
|
||
sortable: this,
|
||
name: "unchoose",
|
||
toEl: xe,
|
||
newIndex: null,
|
||
newDraggableIndex: null,
|
||
originalEvent: t
|
||
}), Me !== xe ? (mt >= 0 && (it({
|
||
rootEl: xe,
|
||
name: "add",
|
||
toEl: xe,
|
||
fromEl: Me,
|
||
originalEvent: t
|
||
}), it({
|
||
sortable: this,
|
||
name: "remove",
|
||
toEl: xe,
|
||
originalEvent: t
|
||
}), it({
|
||
rootEl: xe,
|
||
name: "sort",
|
||
toEl: xe,
|
||
fromEl: Me,
|
||
originalEvent: t
|
||
}), it({
|
||
sortable: this,
|
||
name: "sort",
|
||
toEl: xe,
|
||
originalEvent: t
|
||
})), Ze && Ze.save()) : mt !== $n && mt >= 0 && (it({
|
||
sortable: this,
|
||
name: "update",
|
||
toEl: xe,
|
||
originalEvent: t
|
||
}), it({
|
||
sortable: this,
|
||
name: "sort",
|
||
toEl: xe,
|
||
originalEvent: t
|
||
})), pe.active && ((mt == null || mt === -1) && (mt = $n, nn = eo), it({
|
||
sortable: this,
|
||
name: "end",
|
||
toEl: xe,
|
||
originalEvent: t
|
||
}), this.save()))), this._nulling();
|
||
},
|
||
_nulling: function() {
|
||
ct("nulling", this), Me = U = xe = _e = gn = Ne = Io = on = mn = Ft = Yn = mt = nn = $n = eo = On = to = Ze = So = pe.dragged = pe.ghost = pe.clone = pe.active = null, Ko.forEach(function(t) {
|
||
t.checked = !0;
|
||
}), Ko.length = fr = hr = 0;
|
||
},
|
||
handleEvent: function(t) {
|
||
switch (t.type) {
|
||
case "drop":
|
||
case "dragend":
|
||
this._onDrop(t);
|
||
break;
|
||
case "dragenter":
|
||
case "dragover":
|
||
U && (this._onDragOver(t), Hf(t));
|
||
break;
|
||
case "selectstart":
|
||
t.preventDefault();
|
||
break;
|
||
}
|
||
},
|
||
/**
|
||
* Serializes the item into an array of string.
|
||
* @returns {String[]}
|
||
*/
|
||
toArray: function() {
|
||
for (var t = [], n, o = this.el.children, r = 0, a = o.length, i = this.options; r < a; r++)
|
||
n = o[r], Mt(n, i.draggable, this.el, !1) && t.push(n.getAttribute(i.dataIdAttr) || Xf(n));
|
||
return t;
|
||
},
|
||
/**
|
||
* Sorts the elements according to the array.
|
||
* @param {String[]} order order of the items
|
||
*/
|
||
sort: function(t, n) {
|
||
var o = {}, r = this.el;
|
||
this.toArray().forEach(function(a, i) {
|
||
var l = r.children[i];
|
||
Mt(l, this.options.draggable, r, !1) && (o[a] = l);
|
||
}, this), n && this.captureAnimationState(), t.forEach(function(a) {
|
||
o[a] && (r.removeChild(o[a]), r.appendChild(o[a]));
|
||
}), n && this.animateAll();
|
||
},
|
||
/**
|
||
* Save the current sorting
|
||
*/
|
||
save: function() {
|
||
var t = this.options.store;
|
||
t && t.set && t.set(this);
|
||
},
|
||
/**
|
||
* For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
|
||
* @param {HTMLElement} el
|
||
* @param {String} [selector] default: `options.draggable`
|
||
* @returns {HTMLElement|null}
|
||
*/
|
||
closest: function(t, n) {
|
||
return Mt(t, n || this.options.draggable, this.el, !1);
|
||
},
|
||
/**
|
||
* Set/get option
|
||
* @param {string} name
|
||
* @param {*} [value]
|
||
* @returns {*}
|
||
*/
|
||
option: function(t, n) {
|
||
var o = this.options;
|
||
if (n === void 0)
|
||
return o[t];
|
||
var r = bo.modifyOption(this, t, n);
|
||
typeof r < "u" ? o[t] = r : o[t] = n, t === "group" && xi(o);
|
||
},
|
||
/**
|
||
* Destroy
|
||
*/
|
||
destroy: function() {
|
||
ct("destroy", this);
|
||
var t = this.el;
|
||
t[wt] = null, ke(t, "mousedown", this._onTapStart), ke(t, "touchstart", this._onTapStart), ke(t, "pointerdown", this._onTapStart), this.nativeDraggable && (ke(t, "dragover", this), ke(t, "dragenter", this)), Array.prototype.forEach.call(t.querySelectorAll("[draggable]"), function(n) {
|
||
n.removeAttribute("draggable");
|
||
}), this._onDrop(), this._disableDelayedDragEvents(), Uo.splice(Uo.indexOf(this.el), 1), this.el = t = null;
|
||
},
|
||
_hideClone: function() {
|
||
if (!on) {
|
||
if (ct("hideClone", this), pe.eventCanceled)
|
||
return;
|
||
me(Ne, "display", "none"), this.options.removeCloneOnHide && Ne.parentNode && Ne.parentNode.removeChild(Ne), on = !0;
|
||
}
|
||
},
|
||
_showClone: function(t) {
|
||
if (t.lastPutMode !== "clone") {
|
||
this._hideClone();
|
||
return;
|
||
}
|
||
if (on) {
|
||
if (ct("showClone", this), pe.eventCanceled)
|
||
return;
|
||
U.parentNode == Me && !this.options.group.revertClone ? Me.insertBefore(Ne, U) : gn ? Me.insertBefore(Ne, gn) : Me.appendChild(Ne), this.options.group.revertClone && this.animate(U, Ne), me(Ne, "display", ""), on = !1;
|
||
}
|
||
}
|
||
};
|
||
function Hf(e) {
|
||
e.dataTransfer && (e.dataTransfer.dropEffect = "move"), e.cancelable && e.preventDefault();
|
||
}
|
||
function ko(e, t, n, o, r, a, i, l) {
|
||
var s, u = e[wt], c = u.options.onMove, d;
|
||
return window.CustomEvent && !Xt && !vo ? s = new CustomEvent("move", {
|
||
bubbles: !0,
|
||
cancelable: !0
|
||
}) : (s = document.createEvent("Event"), s.initEvent("move", !0, !0)), s.to = t, s.from = e, s.dragged = n, s.draggedRect = o, s.related = r || t, s.relatedRect = a || Ke(t), s.willInsertAfter = l, s.originalEvent = i, e.dispatchEvent(s), c && (d = c.call(u, s, i)), d;
|
||
}
|
||
function pr(e) {
|
||
e.draggable = !1;
|
||
}
|
||
function Wf() {
|
||
xr = !1;
|
||
}
|
||
function Uf(e, t, n) {
|
||
var o = Ke(Nn(n.el, 0, n.options, !0)), r = 10;
|
||
return t ? e.clientX < o.left - r || e.clientY < o.top && e.clientX < o.right : e.clientY < o.top - r || e.clientY < o.bottom && e.clientX < o.left;
|
||
}
|
||
function Kf(e, t, n) {
|
||
var o = Ke(ra(n.el, n.options.draggable)), r = 10;
|
||
return t ? e.clientX > o.right + r || e.clientX <= o.right && e.clientY > o.bottom && e.clientX >= o.left : e.clientX > o.right && e.clientY > o.top || e.clientX <= o.right && e.clientY > o.bottom + r;
|
||
}
|
||
function Yf(e, t, n, o, r, a, i, l) {
|
||
var s = o ? e.clientY : e.clientX, u = o ? n.height : n.width, c = o ? n.top : n.left, d = o ? n.bottom : n.right, f = !1;
|
||
if (!i) {
|
||
if (l && Vo < u * r) {
|
||
if (!no && (to === 1 ? s > c + u * a / 2 : s < d - u * a / 2) && (no = !0), no)
|
||
f = !0;
|
||
else if (to === 1 ? s < c + Vo : s > d - Vo)
|
||
return -to;
|
||
} else if (s > c + u * (1 - r) / 2 && s < d - u * (1 - r) / 2)
|
||
return Gf(t);
|
||
}
|
||
return f = f || i, f && (s < c + u * a / 2 || s > d - u * a / 2) ? s > c + u / 2 ? 1 : -1 : 0;
|
||
}
|
||
function Gf(e) {
|
||
return St(U) < St(e) ? 1 : -1;
|
||
}
|
||
function Xf(e) {
|
||
for (var t = e.tagName + e.className + e.src + e.href + e.textContent, n = t.length, o = 0; n--; )
|
||
o += t.charCodeAt(n);
|
||
return o.toString(36);
|
||
}
|
||
function Jf(e) {
|
||
Ko.length = 0;
|
||
for (var t = e.getElementsByTagName("input"), n = t.length; n--; ) {
|
||
var o = t[n];
|
||
o.checked && Ko.push(o);
|
||
}
|
||
}
|
||
function Po(e) {
|
||
return setTimeout(e, 0);
|
||
}
|
||
function Nr(e) {
|
||
return clearTimeout(e);
|
||
}
|
||
rr && De(document, "touchmove", function(e) {
|
||
(pe.active || En) && e.cancelable && e.preventDefault();
|
||
});
|
||
pe.utils = {
|
||
on: De,
|
||
off: ke,
|
||
css: me,
|
||
find: Ii,
|
||
is: function(t, n) {
|
||
return !!Mt(t, n, t, !1);
|
||
},
|
||
extend: If,
|
||
throttle: Vi,
|
||
closest: Mt,
|
||
toggleClass: ht,
|
||
clone: Mi,
|
||
index: St,
|
||
nextTick: Po,
|
||
cancelNextTick: Nr,
|
||
detectDirection: ji,
|
||
getChild: Nn
|
||
};
|
||
pe.get = function(e) {
|
||
return e[wt];
|
||
};
|
||
pe.mount = function() {
|
||
for (var e = arguments.length, t = new Array(e), n = 0; n < e; n++)
|
||
t[n] = arguments[n];
|
||
t[0].constructor === Array && (t = t[0]), t.forEach(function(o) {
|
||
if (!o.prototype || !o.prototype.constructor)
|
||
throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(o));
|
||
o.utils && (pe.utils = qt(qt({}, pe.utils), o.utils)), bo.mount(o);
|
||
});
|
||
};
|
||
pe.create = function(e, t) {
|
||
return new pe(e, t);
|
||
};
|
||
pe.version = Ef;
|
||
var qe = [], Gn, Lr, zr = !1, gr, vr, Yo, Xn;
|
||
function Qf() {
|
||
function e() {
|
||
this.defaults = {
|
||
scroll: !0,
|
||
forceAutoScrollFallback: !1,
|
||
scrollSensitivity: 30,
|
||
scrollSpeed: 10,
|
||
bubbleScroll: !0
|
||
};
|
||
for (var t in this)
|
||
t.charAt(0) === "_" && typeof this[t] == "function" && (this[t] = this[t].bind(this));
|
||
}
|
||
return e.prototype = {
|
||
dragStarted: function(n) {
|
||
var o = n.originalEvent;
|
||
this.sortable.nativeDraggable ? De(document, "dragover", this._handleAutoScroll) : this.options.supportPointer ? De(document, "pointermove", this._handleFallbackAutoScroll) : o.touches ? De(document, "touchmove", this._handleFallbackAutoScroll) : De(document, "mousemove", this._handleFallbackAutoScroll);
|
||
},
|
||
dragOverCompleted: function(n) {
|
||
var o = n.originalEvent;
|
||
!this.options.dragOverBubble && !o.rootEl && this._handleAutoScroll(o);
|
||
},
|
||
drop: function() {
|
||
this.sortable.nativeDraggable ? ke(document, "dragover", this._handleAutoScroll) : (ke(document, "pointermove", this._handleFallbackAutoScroll), ke(document, "touchmove", this._handleFallbackAutoScroll), ke(document, "mousemove", this._handleFallbackAutoScroll)), Ma(), Mo(), Vf();
|
||
},
|
||
nulling: function() {
|
||
Yo = Lr = Gn = zr = Xn = gr = vr = null, qe.length = 0;
|
||
},
|
||
_handleFallbackAutoScroll: function(n) {
|
||
this._handleAutoScroll(n, !0);
|
||
},
|
||
_handleAutoScroll: function(n, o) {
|
||
var r = this, a = (n.touches ? n.touches[0] : n).clientX, i = (n.touches ? n.touches[0] : n).clientY, l = document.elementFromPoint(a, i);
|
||
if (Yo = n, o || this.options.forceAutoScrollFallback || vo || Xt || Qn) {
|
||
br(n, this.options, l, o);
|
||
var s = ln(l, !0);
|
||
zr && (!Xn || a !== gr || i !== vr) && (Xn && Ma(), Xn = setInterval(function() {
|
||
var u = ln(document.elementFromPoint(a, i), !0);
|
||
u !== s && (s = u, Mo()), br(n, r.options, u, o);
|
||
}, 10), gr = a, vr = i);
|
||
} else {
|
||
if (!this.options.bubbleScroll || ln(l, !0) === zt()) {
|
||
Mo();
|
||
return;
|
||
}
|
||
br(n, this.options, ln(l, !1), !1);
|
||
}
|
||
}
|
||
}, Gt(e, {
|
||
pluginName: "scroll",
|
||
initializeByDefault: !0
|
||
});
|
||
}
|
||
function Mo() {
|
||
qe.forEach(function(e) {
|
||
clearInterval(e.pid);
|
||
}), qe = [];
|
||
}
|
||
function Ma() {
|
||
clearInterval(Xn);
|
||
}
|
||
var br = Vi(function(e, t, n, o) {
|
||
if (t.scroll) {
|
||
var r = (e.touches ? e.touches[0] : e).clientX, a = (e.touches ? e.touches[0] : e).clientY, i = t.scrollSensitivity, l = t.scrollSpeed, s = zt(), u = !1, c;
|
||
Lr !== n && (Lr = n, Mo(), Gn = t.scroll, c = t.scrollFn, Gn === !0 && (Gn = ln(n, !0)));
|
||
var d = 0, f = Gn;
|
||
do {
|
||
var h = f, g = Ke(h), m = g.top, y = g.bottom, v = g.left, F = g.right, R = g.width, k = g.height, j = void 0, A = void 0, T = h.scrollWidth, q = h.scrollHeight, D = me(h), Y = h.scrollLeft, le = h.scrollTop;
|
||
h === s ? (j = R < T && (D.overflowX === "auto" || D.overflowX === "scroll" || D.overflowX === "visible"), A = k < q && (D.overflowY === "auto" || D.overflowY === "scroll" || D.overflowY === "visible")) : (j = R < T && (D.overflowX === "auto" || D.overflowX === "scroll"), A = k < q && (D.overflowY === "auto" || D.overflowY === "scroll"));
|
||
var I = j && (Math.abs(F - r) <= i && Y + R < T) - (Math.abs(v - r) <= i && !!Y), P = A && (Math.abs(y - a) <= i && le + k < q) - (Math.abs(m - a) <= i && !!le);
|
||
if (!qe[d])
|
||
for (var X = 0; X <= d; X++)
|
||
qe[X] || (qe[X] = {});
|
||
(qe[d].vx != I || qe[d].vy != P || qe[d].el !== h) && (qe[d].el = h, qe[d].vx = I, qe[d].vy = P, clearInterval(qe[d].pid), (I != 0 || P != 0) && (u = !0, qe[d].pid = setInterval((function() {
|
||
o && this.layer === 0 && pe.active._onTouchMove(Yo);
|
||
var O = qe[this.layer].vy ? qe[this.layer].vy * l : 0, x = qe[this.layer].vx ? qe[this.layer].vx * l : 0;
|
||
typeof c == "function" && c.call(pe.dragged.parentNode[wt], x, O, e, Yo, qe[this.layer].el) !== "continue" || Pi(qe[this.layer].el, x, O);
|
||
}).bind({
|
||
layer: d
|
||
}), 24))), d++;
|
||
} while (t.bubbleScroll && f !== s && (f = ln(f, !1)));
|
||
zr = u;
|
||
}
|
||
}, 30), zi = function(t) {
|
||
var n = t.originalEvent, o = t.putSortable, r = t.dragEl, a = t.activeSortable, i = t.dispatchSortableEvent, l = t.hideGhostForTarget, s = t.unhideGhostForTarget;
|
||
if (n) {
|
||
var u = o || a;
|
||
l();
|
||
var c = n.changedTouches && n.changedTouches.length ? n.changedTouches[0] : n, d = document.elementFromPoint(c.clientX, c.clientY);
|
||
s(), u && !u.el.contains(d) && (i("spill"), this.onSpill({
|
||
dragEl: r,
|
||
putSortable: o
|
||
}));
|
||
}
|
||
};
|
||
function aa() {
|
||
}
|
||
aa.prototype = {
|
||
startIndex: null,
|
||
dragStart: function(t) {
|
||
var n = t.oldDraggableIndex;
|
||
this.startIndex = n;
|
||
},
|
||
onSpill: function(t) {
|
||
var n = t.dragEl, o = t.putSortable;
|
||
this.sortable.captureAnimationState(), o && o.captureAnimationState();
|
||
var r = Nn(this.sortable.el, this.startIndex, this.options);
|
||
r ? this.sortable.el.insertBefore(n, r) : this.sortable.el.appendChild(n), this.sortable.animateAll(), o && o.animateAll();
|
||
},
|
||
drop: zi
|
||
};
|
||
Gt(aa, {
|
||
pluginName: "revertOnSpill"
|
||
});
|
||
function ia() {
|
||
}
|
||
ia.prototype = {
|
||
onSpill: function(t) {
|
||
var n = t.dragEl, o = t.putSortable, r = o || this.sortable;
|
||
r.captureAnimationState(), n.parentNode && n.parentNode.removeChild(n), r.animateAll();
|
||
},
|
||
drop: zi
|
||
};
|
||
Gt(ia, {
|
||
pluginName: "removeOnSpill"
|
||
});
|
||
pe.mount(new Qf());
|
||
pe.mount(ia, aa);
|
||
var Zf = Object.defineProperty, eh = Object.defineProperties, th = Object.getOwnPropertyDescriptors, Ba = Object.getOwnPropertySymbols, nh = Object.prototype.hasOwnProperty, oh = Object.prototype.propertyIsEnumerable, ja = (e, t, n) => t in e ? Zf(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n, sn = (e, t) => {
|
||
for (var n in t || (t = {}))
|
||
nh.call(t, n) && ja(e, n, t[n]);
|
||
if (Ba)
|
||
for (var n of Ba(t))
|
||
oh.call(t, n) && ja(e, n, t[n]);
|
||
return e;
|
||
}, Go = (e, t) => eh(e, th(t));
|
||
function yr(e) {
|
||
e.parentElement !== null && e.parentElement.removeChild(e);
|
||
}
|
||
function xa(e, t, n) {
|
||
const o = n === 0 ? e.children[0] : e.children[n - 1].nextSibling;
|
||
e.insertBefore(t, o);
|
||
}
|
||
function rh() {
|
||
return typeof window < "u" ? window.console : global.console;
|
||
}
|
||
const ah = rh();
|
||
function ih(e) {
|
||
const t = /* @__PURE__ */ Object.create(null);
|
||
return function(o) {
|
||
return t[o] || (t[o] = e(o));
|
||
};
|
||
}
|
||
const lh = /-(\w)/g, sh = ih((e) => e.replace(lh, (t, n) => n.toUpperCase())), qi = ["Start", "Add", "Remove", "Update", "End"], Hi = ["Choose", "Unchoose", "Sort", "Filter", "Clone"], Wi = ["Move"], uh = [Wi, qi, Hi].flatMap((e) => e).map((e) => `on${e}`), qr = {
|
||
manage: Wi,
|
||
manageAndEmit: qi,
|
||
emit: Hi
|
||
};
|
||
function ch(e) {
|
||
return uh.indexOf(e) !== -1;
|
||
}
|
||
const dh = [
|
||
"a",
|
||
"abbr",
|
||
"address",
|
||
"area",
|
||
"article",
|
||
"aside",
|
||
"audio",
|
||
"b",
|
||
"base",
|
||
"bdi",
|
||
"bdo",
|
||
"blockquote",
|
||
"body",
|
||
"br",
|
||
"button",
|
||
"canvas",
|
||
"caption",
|
||
"cite",
|
||
"code",
|
||
"col",
|
||
"colgroup",
|
||
"data",
|
||
"datalist",
|
||
"dd",
|
||
"del",
|
||
"details",
|
||
"dfn",
|
||
"dialog",
|
||
"div",
|
||
"dl",
|
||
"dt",
|
||
"em",
|
||
"embed",
|
||
"fieldset",
|
||
"figcaption",
|
||
"figure",
|
||
"footer",
|
||
"form",
|
||
"h1",
|
||
"h2",
|
||
"h3",
|
||
"h4",
|
||
"h5",
|
||
"h6",
|
||
"head",
|
||
"header",
|
||
"hgroup",
|
||
"hr",
|
||
"html",
|
||
"i",
|
||
"iframe",
|
||
"img",
|
||
"input",
|
||
"ins",
|
||
"kbd",
|
||
"label",
|
||
"legend",
|
||
"li",
|
||
"link",
|
||
"main",
|
||
"map",
|
||
"mark",
|
||
"math",
|
||
"menu",
|
||
"menuitem",
|
||
"meta",
|
||
"meter",
|
||
"nav",
|
||
"noscript",
|
||
"object",
|
||
"ol",
|
||
"optgroup",
|
||
"option",
|
||
"output",
|
||
"p",
|
||
"param",
|
||
"picture",
|
||
"pre",
|
||
"progress",
|
||
"q",
|
||
"rb",
|
||
"rp",
|
||
"rt",
|
||
"rtc",
|
||
"ruby",
|
||
"s",
|
||
"samp",
|
||
"script",
|
||
"section",
|
||
"select",
|
||
"slot",
|
||
"small",
|
||
"source",
|
||
"span",
|
||
"strong",
|
||
"style",
|
||
"sub",
|
||
"summary",
|
||
"sup",
|
||
"svg",
|
||
"table",
|
||
"tbody",
|
||
"td",
|
||
"template",
|
||
"textarea",
|
||
"tfoot",
|
||
"th",
|
||
"thead",
|
||
"time",
|
||
"title",
|
||
"tr",
|
||
"track",
|
||
"u",
|
||
"ul",
|
||
"var",
|
||
"video",
|
||
"wbr"
|
||
];
|
||
function fh(e) {
|
||
return dh.includes(e);
|
||
}
|
||
function hh(e) {
|
||
return ["transition-group", "TransitionGroup"].includes(e);
|
||
}
|
||
function Ui(e) {
|
||
return ["id", "class", "role", "style"].includes(e) || e.startsWith("data-") || e.startsWith("aria-") || e.startsWith("on");
|
||
}
|
||
function Ki(e) {
|
||
return e.reduce((t, [n, o]) => (t[n] = o, t), {});
|
||
}
|
||
function mh({ $attrs: e, componentData: t = {} }) {
|
||
const n = Ki(Object.entries(e).filter(([o, r]) => Ui(o)));
|
||
return sn(sn({}, n), t);
|
||
}
|
||
function ph({ $attrs: e, callBackBuilder: t }) {
|
||
const n = Ki(Yi(e));
|
||
Object.entries(t).forEach(([r, a]) => {
|
||
qr[r].forEach((i) => {
|
||
n[`on${i}`] = a(i);
|
||
});
|
||
});
|
||
const o = `[data-draggable]${n.draggable || ""}`;
|
||
return Go(sn({}, n), {
|
||
draggable: o
|
||
});
|
||
}
|
||
function Yi(e) {
|
||
return Object.entries(e).filter(([t, n]) => !Ui(t)).map(([t, n]) => [sh(t), n]).filter(([t, n]) => !ch(t));
|
||
}
|
||
const Na = (e) => {
|
||
const t = e.el || Array.isArray(e.children) && e.children[0].el.parentNode;
|
||
return t || console.error("使用 transition-group , 需要在slot中template内至少2层html标签"), t || {};
|
||
}, gh = (e, t) => e.__draggable_context = t, La = (e) => e.__draggable_context;
|
||
class vh {
|
||
constructor({
|
||
nodes: { header: t, default: n, footer: o },
|
||
root: r,
|
||
realList: a
|
||
}) {
|
||
this.defaultNodes = n, this.children = [...t, ...n, ...o], this.externalComponent = r.externalComponent, this.rootTransition = r.transition, this.tag = r.tag, this.realList = a;
|
||
}
|
||
get _isRootComponent() {
|
||
return this.externalComponent || this.rootTransition;
|
||
}
|
||
render(t, n) {
|
||
const { tag: o, children: r, _isRootComponent: a } = this;
|
||
return t(o, n, a ? { default: () => r } : r);
|
||
}
|
||
updated() {
|
||
const { defaultNodes: t, realList: n } = this;
|
||
t.forEach((o, r) => {
|
||
gh(Na(o), {
|
||
element: n[r],
|
||
index: r
|
||
});
|
||
});
|
||
}
|
||
getUnderlyingVm(t) {
|
||
return La(t);
|
||
}
|
||
getVmIndexFromDomIndex(t, n) {
|
||
const { defaultNodes: o } = this, { length: r } = o, a = n.children, i = a.item(t);
|
||
if (i === null)
|
||
return r;
|
||
const l = La(i);
|
||
if (l)
|
||
return l.index;
|
||
if (r === 0)
|
||
return 0;
|
||
const s = Na(o[0]), u = [...a].findIndex((c) => c === s);
|
||
return t < u ? 0 : r;
|
||
}
|
||
}
|
||
function bh(e, t) {
|
||
const n = e[t];
|
||
return n ? n() : [];
|
||
}
|
||
function yh({ $slots: e, realList: t, getKey: n }) {
|
||
const o = t || [], [r, a] = ["header", "footer"].map((s) => bh(e, s)), { item: i } = e;
|
||
if (!i)
|
||
throw new Error("draggable element must have an item slot");
|
||
const l = o.flatMap((s, u) => i({ element: s, index: u }).map((c) => (c.key = n(s), c.props = Go(sn({}, c.props || {}), { "data-draggable": !0 }), c)));
|
||
if (l.length !== o.length)
|
||
throw new Error("Item slot must have only one child");
|
||
return {
|
||
header: r,
|
||
footer: a,
|
||
default: l
|
||
};
|
||
}
|
||
function wh(e) {
|
||
const t = hh(e), n = !fh(e) && !t;
|
||
return {
|
||
transition: t,
|
||
externalComponent: n,
|
||
tag: n ? Z(e) : t ? hl : e
|
||
};
|
||
}
|
||
function _h({ $slots: e, tag: t, realList: n, getKey: o }) {
|
||
const r = yh({ $slots: e, realList: n, getKey: o }), a = wh(t);
|
||
return new vh({ nodes: r, root: a, realList: n });
|
||
}
|
||
function Gi(e, t) {
|
||
Be(() => this.$emit(e.toLowerCase(), t));
|
||
}
|
||
function Xi(e) {
|
||
return (t, n) => {
|
||
if (this.realList !== null)
|
||
return this[`onDrag${e}`](t, n);
|
||
};
|
||
}
|
||
function Ch(e) {
|
||
const t = Xi.call(this, e);
|
||
return (n, o) => {
|
||
t.call(this, n, o), Gi.call(this, e, n);
|
||
};
|
||
}
|
||
let wr = null;
|
||
const Sh = {
|
||
list: {
|
||
type: Array,
|
||
required: !1,
|
||
default: null
|
||
},
|
||
modelValue: {
|
||
type: Array,
|
||
required: !1,
|
||
default: null
|
||
},
|
||
itemKey: {
|
||
type: [String, Function],
|
||
required: !0
|
||
},
|
||
clone: {
|
||
type: Function,
|
||
default: (e) => e
|
||
},
|
||
tag: {
|
||
type: String,
|
||
default: "div"
|
||
},
|
||
move: {
|
||
type: Function,
|
||
default: null
|
||
},
|
||
componentData: {
|
||
type: Object,
|
||
required: !1,
|
||
default: null
|
||
}
|
||
}, Fh = [
|
||
"update:modelValue",
|
||
"change",
|
||
...[...qr.manageAndEmit, ...qr.emit].map((e) => e.toLowerCase())
|
||
], Rh = ue({
|
||
name: "draggable",
|
||
inheritAttrs: !1,
|
||
props: Sh,
|
||
emits: Fh,
|
||
data() {
|
||
return {
|
||
error: !1
|
||
};
|
||
},
|
||
render() {
|
||
try {
|
||
this.error = !1;
|
||
const { $slots: e, $attrs: t, tag: n, componentData: o, realList: r, getKey: a } = this, i = _h({
|
||
$slots: e,
|
||
tag: n,
|
||
realList: r,
|
||
getKey: a
|
||
});
|
||
this.componentStructure = i;
|
||
const l = mh({ $attrs: t, componentData: o });
|
||
return i.render(_r, l);
|
||
} catch (e) {
|
||
return this.error = !0, _r("pre", { style: { color: "red" } }, e.stack);
|
||
}
|
||
},
|
||
created() {
|
||
this.list !== null && this.modelValue !== null && ah.error("modelValue and list props are mutually exclusive! Please set one or another.");
|
||
},
|
||
mounted() {
|
||
if (this.error)
|
||
return;
|
||
const { $attrs: e, $el: t, componentStructure: n } = this;
|
||
n.updated();
|
||
const o = ph({
|
||
$attrs: e,
|
||
callBackBuilder: {
|
||
manageAndEmit: (a) => Ch.call(this, a),
|
||
emit: (a) => Gi.bind(this, a),
|
||
manage: (a) => Xi.call(this, a)
|
||
}
|
||
}), r = t.nodeType === 1 ? t : t.parentElement;
|
||
this._sortable = new pe(r, o), this.targetDomElement = r, r.__draggable_component__ = this;
|
||
},
|
||
updated() {
|
||
this.componentStructure.updated();
|
||
},
|
||
beforeUnmount() {
|
||
this._sortable !== void 0 && this._sortable.destroy();
|
||
},
|
||
computed: {
|
||
realList() {
|
||
const { list: e } = this;
|
||
return e || this.modelValue;
|
||
},
|
||
getKey() {
|
||
const { itemKey: e } = this;
|
||
return typeof e == "function" ? e : (t) => t[e];
|
||
}
|
||
},
|
||
watch: {
|
||
$attrs: {
|
||
handler(e) {
|
||
const { _sortable: t } = this;
|
||
t && Yi(e).forEach(([n, o]) => {
|
||
t.option(n, o);
|
||
});
|
||
},
|
||
deep: !0
|
||
}
|
||
},
|
||
methods: {
|
||
getUnderlyingVm(e) {
|
||
return this.componentStructure.getUnderlyingVm(e) || null;
|
||
},
|
||
getUnderlyingPotencialDraggableComponent(e) {
|
||
return e.__draggable_component__;
|
||
},
|
||
emitChanges(e) {
|
||
Be(() => this.$emit("change", e));
|
||
},
|
||
alterList(e) {
|
||
if (this.list) {
|
||
e(this.list);
|
||
return;
|
||
}
|
||
const t = [...this.modelValue];
|
||
e(t), this.$emit("update:modelValue", t);
|
||
},
|
||
spliceList() {
|
||
const e = (t) => t.splice(...arguments);
|
||
this.alterList(e);
|
||
},
|
||
updatePosition(e, t) {
|
||
const n = (o) => o.splice(t, 0, o.splice(e, 1)[0]);
|
||
this.alterList(n);
|
||
},
|
||
getRelatedContextFromMoveEvent({ to: e, related: t }) {
|
||
const n = this.getUnderlyingPotencialDraggableComponent(e);
|
||
if (!n)
|
||
return { component: n };
|
||
const o = n.realList, r = { list: o, component: n };
|
||
if (e !== t && o) {
|
||
const a = n.getUnderlyingVm(t) || {};
|
||
return sn(sn({}, a), r);
|
||
}
|
||
return r;
|
||
},
|
||
getVmIndexFromDomIndex(e) {
|
||
return this.componentStructure.getVmIndexFromDomIndex(e, this.targetDomElement);
|
||
},
|
||
onDragStart(e) {
|
||
this.context = this.getUnderlyingVm(e.item), e.item._underlying_vm_ = this.clone(this.context.element), wr = e.item;
|
||
},
|
||
onDragAdd(e) {
|
||
const t = e.item._underlying_vm_;
|
||
if (t === void 0)
|
||
return;
|
||
yr(e.item);
|
||
const n = this.getVmIndexFromDomIndex(e.newIndex);
|
||
this.spliceList(n, 0, t);
|
||
const o = { element: t, newIndex: n };
|
||
this.emitChanges({ added: o });
|
||
},
|
||
onDragRemove(e) {
|
||
if (xa(this.$el, e.item, e.oldIndex), e.pullMode === "clone") {
|
||
yr(e.clone);
|
||
return;
|
||
}
|
||
const { index: t, element: n } = this.context;
|
||
this.spliceList(t, 1);
|
||
const o = { element: n, oldIndex: t };
|
||
this.emitChanges({ removed: o });
|
||
},
|
||
onDragUpdate(e) {
|
||
yr(e.item), xa(e.from, e.item, e.oldIndex);
|
||
const t = this.context.index, n = this.getVmIndexFromDomIndex(e.newIndex);
|
||
this.updatePosition(t, n);
|
||
const o = { element: this.context.element, oldIndex: t, newIndex: n };
|
||
this.emitChanges({ moved: o });
|
||
},
|
||
computeFutureIndex(e, t) {
|
||
if (!e.element)
|
||
return 0;
|
||
const n = [...t.to.children].filter((i) => i.style.display !== "none"), o = n.indexOf(t.related), r = e.component.getVmIndexFromDomIndex(o);
|
||
return n.indexOf(wr) !== -1 || !t.willInsertAfter ? r : r + 1;
|
||
},
|
||
onDragMove(e, t) {
|
||
const { move: n, realList: o } = this;
|
||
if (!n || !o)
|
||
return !0;
|
||
const r = this.getRelatedContextFromMoveEvent(e), a = this.computeFutureIndex(r, e), i = Go(sn({}, this.context), {
|
||
futureIndex: a
|
||
}), l = Go(sn({}, e), {
|
||
relatedContext: r,
|
||
draggedContext: i
|
||
});
|
||
return n(l, t);
|
||
},
|
||
onDragEnd() {
|
||
wr = null;
|
||
}
|
||
}
|
||
}), kh = ue({
|
||
name: "FsTableColumnsFixedController",
|
||
props: {
|
||
modelValue: {
|
||
default: !1
|
||
}
|
||
},
|
||
emits: ["update:modelValue", "change"],
|
||
setup(e, t) {
|
||
const { ui: n } = Se(), o = V(() => [
|
||
{
|
||
value: "left",
|
||
icon: n.icons.left
|
||
// 'el-icon-arrow-left'
|
||
},
|
||
{
|
||
value: !1,
|
||
icon: n.icons.close
|
||
// 'el-icon-close'
|
||
},
|
||
{
|
||
value: "right",
|
||
icon: n.icons.right
|
||
// 'el-icon-arrow-right'
|
||
}
|
||
]);
|
||
function r(a) {
|
||
t.emit("update:modelValue", a), t.emit("change", a);
|
||
}
|
||
return {
|
||
ui: n,
|
||
options: o,
|
||
submit: r
|
||
};
|
||
}
|
||
});
|
||
function Dh(e, t, n, o, r, a) {
|
||
const i = Z("fs-button");
|
||
return b(), $(H(e.ui.buttonGroup.name), { class: "fs-table-columns-fixed-controller" }, {
|
||
default: B(() => [
|
||
(b(!0), M(be, null, Te(e.options, (l) => (b(), $(i, {
|
||
key: l.icon,
|
||
type: e.modelValue === l.value ? "primary" : "default",
|
||
icon: l.icon,
|
||
size: "small",
|
||
onClick: (s) => e.submit(l.value)
|
||
}, null, 8, ["type", "icon", "onClick"]))), 128))
|
||
]),
|
||
_: 1
|
||
});
|
||
}
|
||
const Ji = /* @__PURE__ */ $e(kh, [["render", Dh]]), Oh = ["title", "i"], Eh = { class: "item-right" }, Th = {
|
||
"flex-box": "0",
|
||
class: "component--list-item-handle handle"
|
||
}, $h = { style: { "margin-left": "20px", "padding-left": "10px", "border-left": "1px solid #eee" } }, Qi = /* @__PURE__ */ ue({
|
||
__name: "fs-columns-filter-nest-list",
|
||
props: {
|
||
columns: {},
|
||
isRoot: { type: Boolean, default: !1 }
|
||
},
|
||
emits: ["check-changed", "fixed-changed"],
|
||
setup(e, { emit: t }) {
|
||
const { ui: n } = Se(), o = t, { originalColumns: r, currentColumns: a, originalColumnsMap: i, text: l, active: s } = Ln(oa);
|
||
function u(m) {
|
||
return m.__title || m.label || m.title || m.key || l.value.unnamed;
|
||
}
|
||
function c(m) {
|
||
const y = m.draggedContext.element, v = m.relatedContext.element, F = [];
|
||
for (const T of a.value)
|
||
T.key === y.key ? F.push(v) : T.key === v.key ? F.push(y) : F.push(T);
|
||
let R = 0, k = F.length - 1, j = F.length - 1, A = 0;
|
||
for (let T = 0; T < F.length; T++) {
|
||
const q = F[T];
|
||
q.fixed === "left" ? R = T : q.fixed === "right" ? k = k > T ? T : k : (j = j > T ? T : j, A = A < T ? T : A);
|
||
}
|
||
if (j < R || A > k)
|
||
return !1;
|
||
}
|
||
function d(m) {
|
||
return "update:" + m;
|
||
}
|
||
function f(m) {
|
||
m.show = !m.show;
|
||
function y(F) {
|
||
F.children && F.children.forEach((R) => {
|
||
!R.__show || R.__disabled || (R.show = F.show, y(R));
|
||
});
|
||
}
|
||
y(m);
|
||
function v(F) {
|
||
if (F.__parent) {
|
||
const R = F.__parent;
|
||
R && (R.show = R.children.filter((k) => k.__show && k.show === !0).length > 0, v(R));
|
||
}
|
||
}
|
||
v(m);
|
||
}
|
||
function h() {
|
||
o("check-changed");
|
||
}
|
||
function g(m, y) {
|
||
o("fixed-changed", m, y);
|
||
}
|
||
return (m, y) => {
|
||
const v = Z("fs-icon"), F = Z("fs-columns-filter-nest-list", !0);
|
||
return b(), $(z(Rh), {
|
||
list: e.columns,
|
||
"item-key": "key",
|
||
move: c
|
||
}, {
|
||
item: B(({ element: R, index: k }) => {
|
||
var j, A;
|
||
return [
|
||
oe("div", null, [
|
||
er(oe("div", {
|
||
title: u(R),
|
||
class: "component--list-item",
|
||
flex: "main:justify cross:center",
|
||
i: k
|
||
}, [
|
||
(b(), $(H(z(n).checkbox.name), W({
|
||
[z(n).checkbox.modelValue || ""]: R.show,
|
||
disabled: ((j = z(i)[R.__key]) == null ? void 0 : j.__disabled) === !0,
|
||
class: "item-label",
|
||
title: u(R)
|
||
}, {
|
||
[ml(d(z(n).checkbox.modelValue))]: (T) => f(R)
|
||
}, { onChange: h }), {
|
||
default: B(() => [
|
||
Ct(Pe(u(R)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040, ["disabled", "title"])),
|
||
oe("div", Eh, [
|
||
e.isRoot ? (b(), $(Ji, {
|
||
key: 0,
|
||
modelValue: R.fixed,
|
||
"onUpdate:modelValue": (T) => R.fixed = T,
|
||
"flex-box": "0",
|
||
class: "d2-mr-10",
|
||
onChange: (T) => g(k, T)
|
||
}, null, 8, ["modelValue", "onUpdate:modelValue", "onChange"])) : G("", !0),
|
||
oe("div", Th, [
|
||
N(v, {
|
||
icon: z(n).icons.sort
|
||
}, null, 8, ["icon"])
|
||
])
|
||
])
|
||
], 8, Oh), [
|
||
[Wa, ((A = z(i)[R.__key]) == null ? void 0 : A.__show) !== !1]
|
||
]),
|
||
oe("div", $h, [
|
||
R.children ? (b(), $(F, {
|
||
key: 0,
|
||
columns: R.children,
|
||
onCheckChanged: h
|
||
}, null, 8, ["columns"])) : G("", !0)
|
||
])
|
||
])
|
||
];
|
||
}),
|
||
_: 1
|
||
}, 8, ["list"]);
|
||
};
|
||
}
|
||
}), Ah = { class: "component--list" }, Ih = {
|
||
key: "__first__",
|
||
class: "component--list-item",
|
||
flex: "main:justify cross:center"
|
||
}, Vh = { span: 12 }, Ph = { class: "title" }, Mh = /* @__PURE__ */ ue({
|
||
__name: "fs-columns-filter-layout-default",
|
||
props: {
|
||
width: {},
|
||
drawer: {}
|
||
},
|
||
setup(e) {
|
||
const { ui: t } = Se(), { originalColumns: n, currentColumns: o, text: r, active: a } = Ln(oa), i = e, l = V(() => mo(
|
||
{
|
||
[t.drawer.visible]: a.value,
|
||
["onUpdate:" + t.drawer.visible]: (y) => {
|
||
a.value = y;
|
||
},
|
||
[t.drawer.width]: i.width || "400px"
|
||
},
|
||
i.drawer
|
||
)), s = K(!1);
|
||
function u(y) {
|
||
s.value = y, o.value = o.value.map((v) => (!v.__show || v.__disabled || (v.show = y), v));
|
||
}
|
||
const c = V(() => ({
|
||
[t.checkbox.modelValue]: s.value,
|
||
["onUpdate:" + t.checkbox.modelValue]: (y) => {
|
||
u(y);
|
||
}
|
||
})), d = V(() => o.value.filter((y) => y.__show && y.show === !0).length), f = V(() => o.value.filter((y) => y.__show).length), h = V(() => d.value > 0 && d.value < f.value);
|
||
ut(
|
||
() => {
|
||
o.value;
|
||
},
|
||
() => {
|
||
m();
|
||
},
|
||
{ immediate: !0 }
|
||
);
|
||
function g(y, v) {
|
||
v && (o.value[y].show = !0), v === "left" && o.value.unshift(o.value.splice(y, 1)[0]), v === "right" && o.value.push(o.value.splice(y, 1)[0]), m();
|
||
}
|
||
function m() {
|
||
s.value = d.value === f.value;
|
||
}
|
||
return (y, v) => (b(), $(H(z(t).drawer.name), W({
|
||
class: "fs-columns-filter-layout-default",
|
||
title: z(r).title
|
||
}, l.value, { "append-to-body": "" }), {
|
||
default: B(() => [
|
||
(b(), $(H(z(t).drawer.hasContentWrap || "div"), {
|
||
class: "fs-drawer-wrapper fs-table-columns-filter",
|
||
title: z(r).title
|
||
}, {
|
||
default: B(() => [
|
||
(b(), $(H(z(t).card.name), { shadow: "never" }, {
|
||
default: B(() => [
|
||
oe("div", Ah, [
|
||
oe("div", Ih, [
|
||
oe("span", Vh, [
|
||
(b(), $(H(z(t).checkbox.name), W({ indeterminate: h.value }, c.value), {
|
||
default: B(() => [
|
||
Ct(Pe(d.value) + " / " + Pe(f.value), 1)
|
||
]),
|
||
_: 1
|
||
}, 16, ["indeterminate"]))
|
||
]),
|
||
oe("span", Ph, Pe(z(r).fixed) + " / " + Pe(z(r).order), 1)
|
||
]),
|
||
N(Qi, {
|
||
columns: z(o),
|
||
"is-root": !0,
|
||
onCheckChanged: m,
|
||
onFixedChanged: g
|
||
}, null, 8, ["columns"])
|
||
])
|
||
]),
|
||
_: 1
|
||
})),
|
||
he(y.$slots, "buttons")
|
||
]),
|
||
_: 3
|
||
}, 8, ["title"]))
|
||
]),
|
||
_: 3
|
||
}, 16, ["title"]));
|
||
}
|
||
}), Bh = ue({
|
||
name: "FsSearchButtons",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
buttons: {
|
||
type: Object
|
||
}
|
||
},
|
||
setup() {
|
||
const { ui: e } = Se();
|
||
return { ui: e };
|
||
}
|
||
}), jh = { class: "fs-search-col fs-search-btns" };
|
||
function xh(e, t, n, o, r, a) {
|
||
const i = Z("fs-button");
|
||
return b(), M("div", jh, [
|
||
(b(), $(H(e.ui.formItem.name), null, {
|
||
default: B(() => [
|
||
(b(!0), M(be, null, Te(e.buttons, (l, s) => (b(), M(be, { key: s }, [
|
||
l.show ? (b(), $(i, W({
|
||
key: 0,
|
||
ref_for: !0
|
||
}, l, {
|
||
onClick: (u) => l._click(u)
|
||
}), null, 16, ["onClick"])) : G("", !0)
|
||
], 64))), 128))
|
||
]),
|
||
_: 1
|
||
}))
|
||
]);
|
||
}
|
||
const Zi = /* @__PURE__ */ $e(Bh, [["render", xh]]), Nh = /* @__PURE__ */ ue({
|
||
name: "FsSearch",
|
||
components: {
|
||
FsSearchButtons: Zi
|
||
},
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 布局容器
|
||
*/
|
||
container: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 初始查询条件
|
||
* 点击重置,会重置成该条件
|
||
*/
|
||
initialForm: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 校验后的查询表单数据
|
||
*/
|
||
validatedForm: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 表单参数
|
||
* 支持el-form | a-form的属性
|
||
*/
|
||
options: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 查询字段配置
|
||
*/
|
||
columns: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 按钮配置,可以根据order排序
|
||
* `{search:{...FsButton},reset:{...FsButton}}`
|
||
*/
|
||
buttons: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 点击重置后是否立即触发查询
|
||
*/
|
||
searchAfterReset: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 是否开启自动查询
|
||
*/
|
||
autoSearch: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 自动查询,防抖设置
|
||
* 传false则关闭自动查询
|
||
*/
|
||
debounce: {
|
||
type: [Boolean, Object],
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 是否显示查询框
|
||
*/
|
||
show: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 是否启用校验
|
||
*/
|
||
validate: {
|
||
default: !1
|
||
},
|
||
/**
|
||
* 是否任意值变化就触发校验
|
||
*/
|
||
validateOnChange: {
|
||
default: !0,
|
||
type: Boolean
|
||
},
|
||
/**
|
||
* 列的宽度设置,span=xx
|
||
*/
|
||
col: {},
|
||
/**
|
||
* 统一字段的formItem属性
|
||
*/
|
||
formItem: {
|
||
type: Object,
|
||
default: void 0
|
||
}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 查询事件
|
||
**/
|
||
"search",
|
||
/**
|
||
* 查询事件,此事件供系统调用
|
||
*/
|
||
"_search",
|
||
/**
|
||
* 重置事件,供用户使用
|
||
**/
|
||
"reset",
|
||
/**
|
||
* 重置事件,此事件供系统调用
|
||
*/
|
||
"_reset",
|
||
/**
|
||
* 校验失败事件
|
||
*/
|
||
"validate-error",
|
||
/**
|
||
* 校验后的表单数据变化
|
||
*/
|
||
"update:validatedForm"
|
||
],
|
||
setup(e, t) {
|
||
const {
|
||
ui: n
|
||
} = Se(), {
|
||
merge: o
|
||
} = Ee(), r = o, {
|
||
doComputed: a,
|
||
AsyncComputeValue: i,
|
||
ComputeValue: l
|
||
} = Vt();
|
||
yt(e.columns, (w) => {
|
||
w.value != null && (w.value instanceof i || w.value instanceof l) && ce.warn("search.value配置不支持ComputeValue/AsyncCompute类型的动态计算");
|
||
});
|
||
function s() {
|
||
const w = {};
|
||
return J(e.columns, (_, C) => {
|
||
var E;
|
||
if (_.value === void 0)
|
||
return;
|
||
const S = z(_.value);
|
||
S !== void 0 && _.show !== !1 && ((E = _.component) == null ? void 0 : E.show) !== !1 && (w[C] = S);
|
||
}), ft(o({}, e.initialForm, w));
|
||
}
|
||
const u = un(s());
|
||
let c = null;
|
||
const d = a(() => e.columns, j, null, (w) => {
|
||
const _ = ft(e.formItem || {});
|
||
J(w, (E) => {
|
||
o(E, _, E);
|
||
}), e.validate || J(w, (E) => {
|
||
delete E.rules, delete E.rule;
|
||
}), e.col && J(w, (E) => {
|
||
E.col = o({}, e.col, E.col);
|
||
}), J(w, (E) => {
|
||
E._cellRender = () => m(E);
|
||
});
|
||
let C = [];
|
||
J(w, (E, L) => {
|
||
E._key = L, C.push(E);
|
||
}), C = Sn(C, (E) => E.order ?? dn.orderDefault);
|
||
const S = {};
|
||
return C.forEach((E) => {
|
||
let L = E._key;
|
||
delete E._key, S[L] = E;
|
||
}), S;
|
||
});
|
||
function f() {
|
||
const w = ft(u);
|
||
t.emit("update:validatedForm", w);
|
||
}
|
||
ut(() => e.validatedForm, (w) => {
|
||
for (const _ in u)
|
||
delete u[_];
|
||
o(u, w || {});
|
||
}, {
|
||
deep: !0
|
||
});
|
||
const h = (w, _) => et(w, _);
|
||
function g(w) {
|
||
if (w != null)
|
||
return w.indexOf(".") >= 0 ? w.split(".") : w;
|
||
}
|
||
function m(w) {
|
||
const _ = w.key;
|
||
async function C(ae) {
|
||
ge(ae, w);
|
||
}
|
||
function S() {
|
||
Q(w);
|
||
}
|
||
function E(ae, de) {
|
||
de.code === "Enter" && ae.autoSearchTrigger != !1 && q();
|
||
}
|
||
let L = null;
|
||
e.slots["search_" + _] ? L = N(Z("fs-slot-render"), {
|
||
slots: e.slots["search_" + _],
|
||
scope: A(_)
|
||
}, null) : w.render ? L = N(Z("fs-render"), {
|
||
"render-func": w.render,
|
||
scope: A(_)
|
||
}, null) : w.component && w.component.show !== !1 && (L = N(Z("fs-component-render"), W({
|
||
ref: (ae) => {
|
||
F.value[_] = ae;
|
||
},
|
||
"model-value": h(u, _),
|
||
onKeyup: (ae) => {
|
||
E(w, ae);
|
||
}
|
||
}, w.component, {
|
||
scope: A(_),
|
||
"onUpdate:modelValue": C,
|
||
onInput: S,
|
||
onCompositionstart: () => {
|
||
re(!0);
|
||
},
|
||
onCompositionend: () => {
|
||
re(!1);
|
||
}
|
||
}), null));
|
||
const se = g(_);
|
||
return n.formItem.render({
|
||
props: {
|
||
...w,
|
||
label: w.title,
|
||
[n.formItem.prop]: se,
|
||
path: _,
|
||
rulePath: _
|
||
},
|
||
slots: {
|
||
default() {
|
||
return L;
|
||
}
|
||
}
|
||
});
|
||
}
|
||
const y = K(), {
|
||
t: v
|
||
} = rt(), F = K({});
|
||
function R(w) {
|
||
return F.value[w];
|
||
}
|
||
function k(w) {
|
||
var _;
|
||
return (_ = R(w)) == null ? void 0 : _.getTargetRef();
|
||
}
|
||
function j() {
|
||
return {
|
||
form: u,
|
||
validatedForm: e.validatedForm,
|
||
getComponentRef: k,
|
||
doSearch: q,
|
||
doReset: D,
|
||
doValidate: T
|
||
};
|
||
}
|
||
function A(w) {
|
||
return {
|
||
...j(),
|
||
key: w,
|
||
value: h(u, w)
|
||
};
|
||
}
|
||
async function T(w = !1, _ = "search") {
|
||
try {
|
||
return e.validate && await n.form.validateWrap(y.value), !0;
|
||
} catch (C) {
|
||
return w || t.emit("validate-error", {
|
||
...j(),
|
||
error: C,
|
||
trigger: _
|
||
}), !1;
|
||
}
|
||
}
|
||
async function q() {
|
||
c && c.cancel(), await T() && (f(), await Be(), t.emit("_search", j()), t.emit("search", j()));
|
||
}
|
||
async function D() {
|
||
const w = s(), _ = Ur(u);
|
||
for (const C of _) {
|
||
const S = h(w, C[0]);
|
||
S == null ? No(u, C[0]) : We(u, C[0], S);
|
||
}
|
||
await T() && (f(), await Be(), e.reset && e.reset(j()), t.emit("_reset", j()), t.emit("reset", j()), e.searchAfterReset && q());
|
||
}
|
||
const Y = V(() => {
|
||
const w = [], _ = {
|
||
search: {
|
||
show: !0,
|
||
type: "primary",
|
||
disabled: !1,
|
||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||
click: (C) => {
|
||
q();
|
||
},
|
||
order: 1,
|
||
text: v("fs.search.search.text")
|
||
// '查询',
|
||
},
|
||
reset: {
|
||
show: !0,
|
||
disabled: !1,
|
||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||
click: (C) => {
|
||
D();
|
||
},
|
||
text: v("fs.search.reset.text"),
|
||
// '重置',
|
||
order: 2
|
||
}
|
||
};
|
||
o(_, e.buttons);
|
||
for (let C in _) {
|
||
const S = _[C];
|
||
S._click = () => {
|
||
S.click(j());
|
||
}, w.push(S);
|
||
}
|
||
return w.sort((C, S) => C.order - S.order), w;
|
||
});
|
||
function le() {
|
||
var w;
|
||
if (e.autoSearch !== !1 && e.debounce !== !1) {
|
||
let _ = ((w = e.debounce) == null ? void 0 : w.wait) || 500;
|
||
c = kl(q, _, e.debounce);
|
||
}
|
||
}
|
||
le();
|
||
function I() {
|
||
return u;
|
||
}
|
||
function P() {
|
||
return e.validatedForm;
|
||
}
|
||
function X(w, _ = !0) {
|
||
_ || yt(Ga(u), (C) => {
|
||
delete u[C];
|
||
}), r(u, w), f();
|
||
}
|
||
const O = K(!1), x = () => {
|
||
ce.debug("do auto search,inputEventDisabled:", O.value), O.value !== !0 && c && c();
|
||
}, Q = (w) => {
|
||
w.autoSearchTrigger === "input" && x();
|
||
}, re = (w) => {
|
||
O.value = w;
|
||
};
|
||
async function ge(w, _) {
|
||
const C = _.key;
|
||
We(u, C, w);
|
||
const S = e.validateOnChangeSilent;
|
||
if (_.valueChange) {
|
||
const E = _.key, L = u[E], se = k(E), ae = _.valueChange instanceof Function ? _.valueChange : _.valueChange.handle, de = j(), Ce = {
|
||
index: 0,
|
||
row: de.form,
|
||
form: de.form,
|
||
...de,
|
||
key: E,
|
||
value: L,
|
||
componentRef: se,
|
||
immediate: !1,
|
||
getComponentRef: k,
|
||
mode: "search"
|
||
};
|
||
ae(Ce);
|
||
}
|
||
e.validateOnChange && await T(S, "change") && f(), O.value, (_.autoSearchTrigger == null || _.autoSearchTrigger === !0 || _.autoSearchTrigger === "change") && x();
|
||
}
|
||
const te = V(() => e.validate ? e.options.rules : []);
|
||
return f(), {
|
||
get: h,
|
||
ui: n,
|
||
onValueChanged: ge,
|
||
doValidate: T,
|
||
doSearch: q,
|
||
doReset: D,
|
||
formData: u,
|
||
componentRenderRefs: F,
|
||
getComponentRenderRef: R,
|
||
getComponentRef: k,
|
||
getForm: I,
|
||
getValidatedForm: P,
|
||
setForm: X,
|
||
searchFormRef: y,
|
||
onInput: Q,
|
||
inputEventDisabled: O,
|
||
changeInputEventDisabled: re,
|
||
computedColumns: d,
|
||
computedButtons: Y,
|
||
computedRules: te,
|
||
buildFieldContext: A,
|
||
getContextFn: j
|
||
};
|
||
}
|
||
});
|
||
const Lh = { class: "fs-search fs-search-v2" }, zh = { class: "fs-search-buttons" };
|
||
function qh(e, t, n, o, r, a) {
|
||
const i = Z("fs-button"), l = Z("fs-slot-render");
|
||
return b(), M("div", Lh, [
|
||
(b(), $(H(e.ui.collapseTransition.name), null, {
|
||
default: B(() => [
|
||
(b(), $(H(e.ui.form.name), W({
|
||
ref: "searchFormRef",
|
||
model: e.formData,
|
||
onsubmit: "event.preventDefault();"
|
||
}, e.options, {
|
||
rules: e.computedRules,
|
||
class: "fs-search-form"
|
||
}), {
|
||
default: B(() => {
|
||
var s;
|
||
return [
|
||
e.show !== !1 ? (b(), $(H(((s = e.container) == null ? void 0 : s.is) || "fs-search-layout-default"), W({ key: 0 }, e.container, {
|
||
columns: e.computedColumns,
|
||
"get-context-fn": e.getContextFn
|
||
}), Qo({
|
||
"search-buttons": B(() => [
|
||
oe("div", zh, [
|
||
(b(!0), M(be, null, Te(e.computedButtons, (u, c) => (b(), M(be, { key: c }, [
|
||
u.show !== !1 ? (b(), $(i, W({
|
||
key: 0,
|
||
ref_for: !0
|
||
}, u, {
|
||
onClick: (d) => u._click()
|
||
}), null, 16, ["onClick"])) : G("", !0)
|
||
], 64))), 128))
|
||
])
|
||
]),
|
||
_: 2
|
||
}, [
|
||
e.slots["search-left"] ? {
|
||
name: "search-left",
|
||
fn: B(() => [
|
||
N(l, {
|
||
slots: e.slots["search-left"],
|
||
scope: e.getContextFn()
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
key: "0"
|
||
} : void 0,
|
||
e.slots["search-middle"] ? {
|
||
name: "search-middle",
|
||
fn: B(() => [
|
||
N(l, {
|
||
slots: e.slots["search-middle"],
|
||
scope: e.getContextFn()
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
key: "1"
|
||
} : void 0,
|
||
e.slots["search-right"] ? {
|
||
name: "search-right",
|
||
fn: B(() => [
|
||
N(l, {
|
||
slots: e.slots["search-right"],
|
||
scope: e.getContextFn()
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
key: "2"
|
||
} : void 0
|
||
]), 1040, ["columns", "get-context-fn"])) : G("", !0)
|
||
];
|
||
}),
|
||
_: 1
|
||
}, 16, ["model", "rules"]))
|
||
]),
|
||
_: 1
|
||
}))
|
||
]);
|
||
}
|
||
const Hh = /* @__PURE__ */ $e(Nh, [["render", qh]]), Wh = ue({
|
||
name: "FsSearchV1",
|
||
components: { FsSearchButtons: Zi },
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 初始查询条件
|
||
* 点击重置,会重置成该条件
|
||
*/
|
||
initialForm: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 表单参数
|
||
* 支持el-form | a-form的属性
|
||
*/
|
||
options: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 查询字段配置
|
||
*/
|
||
columns: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* tabs
|
||
* { show , options,key, default}
|
||
*/
|
||
tabs: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 按钮配置,可以根据order排序
|
||
* {search:{...FsButton},reset:{...FsButton}}
|
||
*/
|
||
buttons: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 点击重置后是否立即触发查询
|
||
*/
|
||
searchAfterReset: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 是否开启自动查询
|
||
*/
|
||
autoSearch: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 自动查询,防抖设置
|
||
* 传false则关闭自动查询
|
||
*/
|
||
debounce: {
|
||
type: [Boolean, Object],
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 是否显示查询框
|
||
*/
|
||
show: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 是否启用校验
|
||
*/
|
||
validate: {
|
||
default: !1
|
||
},
|
||
/**
|
||
* 布局, single-line 单行, multi-line 多行(支持展开收起)
|
||
*/
|
||
layout: {
|
||
type: String,
|
||
default: "single-line"
|
||
},
|
||
/**
|
||
* 列的宽度设置,span=xx
|
||
*/
|
||
col: {},
|
||
/**
|
||
* 是否折叠
|
||
*/
|
||
collapse: {
|
||
type: Boolean,
|
||
default: !1
|
||
}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 查询事件
|
||
**/
|
||
"search",
|
||
/**
|
||
* 重置事件
|
||
**/
|
||
"reset",
|
||
"collapse",
|
||
"update:collapse"
|
||
],
|
||
setup(e, t) {
|
||
const { ui: n } = Se();
|
||
Cn(() => {
|
||
if (ge.value && X.value) {
|
||
O.value = X.value.$el.offsetHeight;
|
||
const w = X.value.$el.children;
|
||
w && w.length > 1 && (x.value = w[1].offsetHeight + 2);
|
||
}
|
||
});
|
||
let o = null;
|
||
function r() {
|
||
return cloneDeep(e.initialForm || {});
|
||
}
|
||
const a = un(r()), { doComputed: i, AsyncComputeValue: l } = Vt();
|
||
yt(e.columns, (w) => {
|
||
w.value != null && w.value instanceof l && ce.warn("search.value配置不支持AsyncCompute类型的动态计算");
|
||
});
|
||
const { merge: s } = Ee(), u = s, c = i(
|
||
() => e.columns,
|
||
y,
|
||
null,
|
||
(w) => {
|
||
e.validate || J(w, (S) => {
|
||
delete S.rules;
|
||
}), e.col && J(w, (S) => {
|
||
S.col = s({}, e.col, S.col);
|
||
});
|
||
let _ = [];
|
||
J(w, (S, E) => {
|
||
S._key = E, _.push(S);
|
||
}), _ = Sn(_, (S) => S.order ?? dn.orderDefault);
|
||
const C = {};
|
||
return _.forEach((S) => {
|
||
let E = S._key;
|
||
delete S._key, C[E] = S;
|
||
}), C;
|
||
}
|
||
);
|
||
J(c.value, (w, _) => {
|
||
var S;
|
||
if (w.value === void 0)
|
||
return;
|
||
const C = z(w.value);
|
||
C !== void 0 && w.show !== !1 && ((S = w.component) == null ? void 0 : S.show) !== !1 && (a[_] = C);
|
||
});
|
||
const d = K(), { t: f } = rt(), h = K({});
|
||
function g(w) {
|
||
return h.value[w];
|
||
}
|
||
function m(w) {
|
||
var _, C;
|
||
return (C = (_ = g(w)) == null ? void 0 : _.$refs) == null ? void 0 : C.targetRef;
|
||
}
|
||
function y() {
|
||
return { form: a, validatedForm: a, getComponentRef: m, doValidate: null };
|
||
}
|
||
const v = K(y());
|
||
async function F() {
|
||
if (o && o.cancel(), await n.form.validateWrap(d.value))
|
||
t.emit("search", v.value);
|
||
else
|
||
return n.message.error({
|
||
message: f("fs.search.error.message")
|
||
}), !1;
|
||
}
|
||
function R() {
|
||
const w = r(), _ = Ur(a);
|
||
for (const C of _) {
|
||
const S = et(w, C[0]);
|
||
S == null ? No(a, C[0]) : We(a, C[0], S);
|
||
}
|
||
e.reset && e.reset(v.value), t.emit("reset", y()), e.searchAfterReset && Be(() => {
|
||
F();
|
||
});
|
||
}
|
||
const k = V(() => {
|
||
const w = [], _ = {
|
||
search: {
|
||
show: !0,
|
||
type: "primary",
|
||
disabled: !1,
|
||
click: (C) => {
|
||
F();
|
||
},
|
||
order: 1,
|
||
text: f("fs.search.search.text")
|
||
// '查询',
|
||
},
|
||
reset: {
|
||
show: !0,
|
||
disabled: !1,
|
||
click: (C) => {
|
||
R();
|
||
},
|
||
text: f("fs.search.reset.text"),
|
||
// '重置',
|
||
order: 2
|
||
}
|
||
};
|
||
s(_, e.buttons);
|
||
for (let C in _) {
|
||
const S = _[C];
|
||
S._click = () => {
|
||
S.click(y());
|
||
}, w.push(S);
|
||
}
|
||
return w.sort((C, S) => C.order - S.order), w;
|
||
});
|
||
function j() {
|
||
var w;
|
||
if (e.autoSearch !== !1 && e.debounce !== !1) {
|
||
let _ = ((w = e.debounce) == null ? void 0 : w.wait) || 500;
|
||
o = debounce(F, _, e.debounce);
|
||
}
|
||
}
|
||
j();
|
||
function A() {
|
||
return a;
|
||
}
|
||
function T(w, _ = !0) {
|
||
_ || yt(Ga(a), (C) => {
|
||
delete a[C];
|
||
}), u(a, w);
|
||
}
|
||
const q = K(!1), D = () => {
|
||
ce.debug("do auto search,inputEventDisabled:", q.value), q.value !== !0 && o && o();
|
||
}, Y = (w) => {
|
||
w.autoSearchTrigger === "input" && D();
|
||
}, le = (w) => {
|
||
q.value = w, D();
|
||
};
|
||
function I(w, _) {
|
||
const C = _.key;
|
||
if (We(a, C, w), _.valueChange) {
|
||
const S = _.key, E = a[S], L = m(S);
|
||
(_.valueChange instanceof Function ? _.valueChange : _.valueChange.handle)({ key: S, value: E, componentRef: L, ...y(), immidiate: !1 });
|
||
}
|
||
(_.autoSearchTrigger == null || _.autoSearchTrigger === !0 || _.autoSearchTrigger === "change") && D();
|
||
}
|
||
const P = V(() => e.validate ? e.options.rules : []), X = K(), O = K(0), x = K(0), Q = () => {
|
||
t.emit("update:collapse", !e.collapse), t.emit("collapse", !e.collapse);
|
||
}, re = V(() => e.layout === "multi-line" ? n.col.name : "div"), ge = V(() => e.layout === "multi-line"), te = V(() => ge.value ? e.collapse ? x.value ? x.value + "px" : "" : O.value ? O.value + "px" : "" : "auto");
|
||
return {
|
||
get: (w, _) => et(w, _),
|
||
ui: n,
|
||
onValueChanged: I,
|
||
doSearch: F,
|
||
doReset: R,
|
||
form: a,
|
||
componentRenderRefs: h,
|
||
getComponentRenderRef: g,
|
||
getComponentRef: m,
|
||
getForm: A,
|
||
setForm: T,
|
||
searchFormRef: d,
|
||
onInput: Y,
|
||
inputEventDisabled: q,
|
||
changeInputEventDisabled: le,
|
||
computedColumns: c,
|
||
computedButtons: k,
|
||
computedRules: P,
|
||
columnsRowRef: X,
|
||
computedColumnBoxHeight: te,
|
||
computedColName: re,
|
||
computedIsMultiLine: ge,
|
||
toggleCollapse: Q,
|
||
searchEventContextRef: v
|
||
};
|
||
}
|
||
});
|
||
const Uh = { class: "fs-search-box" }, Kh = { class: "fs-search-main" }, Yh = {
|
||
key: 0,
|
||
class: "fs-search-col"
|
||
}, Gh = {
|
||
key: 1,
|
||
class: "fs-search-col fs-search-middle"
|
||
}, Xh = {
|
||
key: 3,
|
||
class: "fs-search-col fs-search-right"
|
||
}, Jh = {
|
||
key: 0,
|
||
class: "fs-search-action"
|
||
};
|
||
function Qh(e, t, n, o, r, a) {
|
||
const i = Z("fs-slot-render"), l = Z("fs-component-render"), s = Z("fs-search-buttons"), u = Z("fs-button");
|
||
return b(), $(H(e.ui.collapseTransition.name), null, {
|
||
default: B(() => [
|
||
e.show !== !1 ? (b(), M("div", {
|
||
key: 0,
|
||
class: dt(["fs-search", { "fs-search-multi-line": e.computedIsMultiLine }])
|
||
}, [
|
||
(b(), $(H(e.ui.form.name), W({
|
||
ref: "searchFormRef",
|
||
model: e.form
|
||
}, e.options, {
|
||
rules: e.computedRules,
|
||
class: "fs-search-form",
|
||
onCompositionstart: t[0] || (t[0] = (c) => e.changeInputEventDisabled(!0)),
|
||
onCompositionend: t[1] || (t[1] = (c) => e.changeInputEventDisabled(!1))
|
||
}), {
|
||
default: B(() => [
|
||
oe("div", Uh, [
|
||
oe("div", Kh, [
|
||
oe("div", {
|
||
class: dt(["fs-search-columns", { "fs-search-collapse": e.collapse }]),
|
||
style: xn({ height: e.computedColumnBoxHeight })
|
||
}, [
|
||
(b(), $(H(e.ui.row.name), { ref: "columnsRowRef" }, {
|
||
default: B(() => [
|
||
e.slots["search-left"] ? (b(), M("div", Yh, [
|
||
(b(), $(H(e.ui.formItem.name), null, {
|
||
default: B(() => [
|
||
N(i, {
|
||
slots: e.slots["search-left"],
|
||
scope: e.searchEventContextRef
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
])) : G("", !0),
|
||
(b(!0), M(be, null, Te(e.computedColumns, (c, d) => (b(), M(be, { key: d }, [
|
||
c.show === !0 ? (b(), $(H(e.computedColName), W({
|
||
key: 0,
|
||
class: "fs-search-col"
|
||
}, { ref_for: !0 }, c.col), {
|
||
default: B(() => [
|
||
(b(), $(H(e.ui.formItem.name), W({ ref_for: !0 }, c, {
|
||
[e.ui.formItem.prop || ""]: d,
|
||
label: c.title
|
||
}), {
|
||
default: B(() => [
|
||
e.slots["search_" + d] ? (b(), $(i, {
|
||
key: 0,
|
||
slots: e.slots["search_" + d],
|
||
scope: { ...e.searchEventContextRef, key: d }
|
||
}, null, 8, ["slots", "scope"])) : (b(), M(be, { key: 1 }, [
|
||
c.component && c.component.show !== !1 ? (b(), $(l, W({
|
||
key: 0,
|
||
ref_for: !0,
|
||
ref: (f) => {
|
||
f && (e.componentRenderRefs[c.key] = f);
|
||
},
|
||
"model-value": e.get(e.form, d)
|
||
}, { ref_for: !0 }, c.component, {
|
||
scope: e.searchEventContextRef,
|
||
"onUpdate:modelValue": (f) => e.onValueChanged(f, c),
|
||
onInput: (f) => e.onInput(c)
|
||
}), null, 16, ["model-value", "scope", "onUpdate:modelValue", "onInput"])) : G("", !0)
|
||
], 64))
|
||
]),
|
||
_: 2
|
||
}, 1040, ["label"]))
|
||
]),
|
||
_: 2
|
||
}, 1040)) : G("", !0)
|
||
], 64))), 128)),
|
||
e.slots["search-middle"] ? (b(), M("div", Gh, [
|
||
(b(), $(H(e.ui.formItem.name), null, {
|
||
default: B(() => [
|
||
N(i, {
|
||
slots: e.slots["search-middle"],
|
||
scope: e.searchEventContextRef
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
])) : G("", !0),
|
||
e.computedIsMultiLine ? G("", !0) : (b(), $(s, {
|
||
key: 2,
|
||
buttons: e.computedButtons
|
||
}, null, 8, ["buttons"])),
|
||
e.slots["search-right"] ? (b(), M("div", Xh, [
|
||
(b(), $(H(e.ui.formItem.name), null, {
|
||
default: B(() => [
|
||
N(i, {
|
||
slots: e.slots["search-right"],
|
||
scope: e.searchEventContextRef
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
])) : G("", !0)
|
||
]),
|
||
_: 1
|
||
}, 512))
|
||
], 6),
|
||
e.computedIsMultiLine ? (b(), $(s, {
|
||
key: 0,
|
||
buttons: e.computedButtons
|
||
}, null, 8, ["buttons"])) : G("", !0)
|
||
]),
|
||
e.computedIsMultiLine ? (b(), M("div", Jh, [
|
||
(b(), $(H(e.ui.formItem.name), null, {
|
||
default: B(() => [
|
||
N(u, {
|
||
icon: e.collapse ? e.ui.icons.caretUp : e.ui.icons.caretDown,
|
||
onClick: e.toggleCollapse
|
||
}, null, 8, ["icon", "onClick"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
])) : G("", !0)
|
||
])
|
||
]),
|
||
_: 1
|
||
}, 16, ["model", "rules"]))
|
||
], 2)) : G("", !0)
|
||
]),
|
||
_: 1
|
||
});
|
||
}
|
||
const Zh = /* @__PURE__ */ $e(Wh, [["render", Qh]]), em = ue({
|
||
name: "FsSearchLayoutDefault",
|
||
props: {
|
||
/**
|
||
* 是否收缩
|
||
*/
|
||
collapse: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 展开按钮
|
||
*/
|
||
collapseButton: {
|
||
type: Object
|
||
},
|
||
action: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 布局模式
|
||
*/
|
||
layout: {
|
||
type: String,
|
||
default: "single-line"
|
||
},
|
||
/**
|
||
* 查询字段列表,可以精细化自定义查询字段布局
|
||
*/
|
||
columns: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 默认的col配置
|
||
*/
|
||
col: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 获取查询上下文
|
||
*/
|
||
getContextFn: {
|
||
type: Function
|
||
}
|
||
},
|
||
emits: ["update:collapse", "collapse"],
|
||
setup(e, t) {
|
||
const { ui: n } = Se(), { t: o } = rt(), r = K(), a = V(() => e.layout === "multi-line");
|
||
Cn(() => {
|
||
a.value && r.value && (l.value = r.value.$el.offsetHeight);
|
||
});
|
||
const i = V(() => !a.value || !e.collapse ? "auto" : l.value ? l.value + "px" : ""), l = K(0), s = () => {
|
||
t.emit("update:collapse", !e.collapse), t.emit("collapse", !e.collapse);
|
||
};
|
||
function u(c) {
|
||
return mo({}, e.col, c);
|
||
}
|
||
return {
|
||
ui: n,
|
||
columnsRowRef: r,
|
||
computedColumnBoxHeight: i,
|
||
computedIsMultiLine: a,
|
||
toggleCollapse: s,
|
||
mergeCol: u,
|
||
t: o
|
||
};
|
||
}
|
||
});
|
||
const tm = { class: "fs-search-box" }, nm = { class: "fs-search-col fs-search-slot" }, om = { class: "fs-search-col fs-search-slot" }, rm = { class: "fs-search-col fs-search-slot" }, am = {
|
||
key: 0,
|
||
class: "fs-search-buttons-group fs-search-multi-line-buttons"
|
||
};
|
||
function im(e, t, n, o, r, a) {
|
||
var s;
|
||
const i = Z("fs-render"), l = Z("fs-button");
|
||
return b(), M("div", {
|
||
class: dt(["fs-search-layout-default", { "fs-search-multi-line": e.computedIsMultiLine }])
|
||
}, [
|
||
oe("div", tm, [
|
||
oe("div", {
|
||
class: dt(["fs-search-main", { "fs-search-collapse": e.collapse }]),
|
||
style: xn({ maxHeight: e.computedColumnBoxHeight })
|
||
}, [
|
||
(b(), $(H(e.ui.row.name), {
|
||
ref: "columnsRowRef",
|
||
class: "fs-search-columns"
|
||
}, {
|
||
default: B(() => {
|
||
var u;
|
||
return [
|
||
oe("span", nm, [
|
||
he(e.$slots, "search-left")
|
||
]),
|
||
(b(!0), M(be, null, Te(e.columns, (c, d) => (b(), M(be, { key: d }, [
|
||
c.show ? (b(), $(H(e.ui.col.name), W({
|
||
key: 0,
|
||
class: "fs-search-col"
|
||
}, { ref_for: !0 }, e.mergeCol(c.col)), {
|
||
default: B(() => [
|
||
N(i, {
|
||
"render-func": c._cellRender,
|
||
scope: e.getContextFn()
|
||
}, null, 8, ["render-func", "scope"])
|
||
]),
|
||
_: 2
|
||
}, 1040)) : G("", !0)
|
||
], 64))), 128)),
|
||
oe("span", om, [
|
||
he(e.$slots, "search-middle")
|
||
]),
|
||
e.computedIsMultiLine ? G("", !0) : (b(), $(H(e.ui.col.name), W({
|
||
key: 0,
|
||
class: "fs-search-col fs-search-buttons-group"
|
||
}, e.mergeCol((u = e.action) == null ? void 0 : u.col)), {
|
||
default: B(() => {
|
||
var c;
|
||
return [
|
||
(b(), $(H(e.ui.formItem.name), je({
|
||
[e.ui.formItem.label || ""]: (c = e.action) == null ? void 0 : c.label
|
||
}), {
|
||
default: B(() => [
|
||
he(e.$slots, "search-buttons", je(Nt(e.getContextFn())))
|
||
]),
|
||
_: 3
|
||
}, 16))
|
||
];
|
||
}),
|
||
_: 3
|
||
}, 16)),
|
||
oe("span", rm, [
|
||
he(e.$slots, "search-right", je(Nt(e.getContextFn())))
|
||
])
|
||
];
|
||
}),
|
||
_: 3
|
||
}, 512))
|
||
], 6),
|
||
e.computedIsMultiLine ? (b(), M("div", am, [
|
||
he(e.$slots, "search-buttons"),
|
||
((s = e.collapseButton) == null ? void 0 : s.show) !== !1 ? (b(), $(l, W({
|
||
key: 0,
|
||
icon: e.collapse ? e.ui.icons.caretDown : e.ui.icons.caretUp,
|
||
text: e.collapse ? e.t("fs.search.container.collapseButton.text.expand") : e.t("fs.search.container.collapseButton.text.collapse")
|
||
}, e.collapseButton, { onClick: e.toggleCollapse }), null, 16, ["icon", "text", "onClick"])) : G("", !0)
|
||
])) : G("", !0)
|
||
])
|
||
], 2);
|
||
}
|
||
const lm = /* @__PURE__ */ $e(em, [["render", im]]), sm = { class: "fs-tabs-filter" }, um = ue({
|
||
name: "FsTabsFilter",
|
||
inheritAttrs: !1
|
||
}), cm = /* @__PURE__ */ ue({
|
||
...um,
|
||
props: {
|
||
name: {},
|
||
show: { type: Boolean, default: !1 },
|
||
defaultOption: { default: void 0 },
|
||
options: { default: () => [] },
|
||
modelValue: {},
|
||
value: { default: "value" },
|
||
label: { default: "label" }
|
||
},
|
||
emits: ["update:modelValue", "change"],
|
||
setup(e, { emit: t }) {
|
||
const n = Zo(), { merge: o } = Ee(), r = e, a = V(() => {
|
||
const g = {
|
||
show: !0,
|
||
value: null,
|
||
label: h("fs.search.tabs.all")
|
||
};
|
||
return o(g, r.defaultOption || {});
|
||
}), i = "_default_key_", l = V(() => {
|
||
const g = r.modelValue == null || r.modelValue === a.value.value ? i : r.modelValue;
|
||
return {
|
||
type: "card",
|
||
...n,
|
||
[f.tabs.modelValue]: g,
|
||
["onUpdate:" + f.tabs.modelValue]: u
|
||
};
|
||
}), s = t;
|
||
function u(g) {
|
||
i === g && (g = a.value.value);
|
||
const m = r.modelValue;
|
||
s("update:modelValue", g), m !== g && s("change", g);
|
||
}
|
||
function c(g) {
|
||
return g[r.value];
|
||
}
|
||
function d(g) {
|
||
return g[r.label];
|
||
}
|
||
const { ui: f } = Se(), { t: h } = rt();
|
||
return (g, m) => (b(), M("div", sm, [
|
||
(b(), $(H(z(f).tabs.name), je(Nt(l.value)), {
|
||
default: B(() => [
|
||
a.value.show ? (b(), $(H(z(f).tabPane.name), je({
|
||
key: 0,
|
||
[z(f).tabPane.key || ""]: i,
|
||
[z(f).tabPane.tab || ""]: a.value.label
|
||
}), null, 16)) : G("", !0),
|
||
(b(!0), M(be, null, Te(e.options, (y, v) => (b(), $(H(z(f).tabPane.name), je({
|
||
key: v,
|
||
[z(f).tabPane.key || ""]: c(y),
|
||
[z(f).tabPane.tab || ""]: d(y)
|
||
}), null, 16))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16))
|
||
]));
|
||
}
|
||
});
|
||
const dm = { class: "fs-icon-selector" }, fm = {
|
||
key: 0,
|
||
class: "fs-icon-selector-dialog"
|
||
}, hm = { class: "fs-icon-selector-dialog-content" }, mm = { class: "icon-tabs-box mt-10" }, pm = { class: "search-box" }, gm = { class: "color-select" }, vm = ["onClick"], bm = { class: "icon-container" }, ym = { class: "icon-list" }, wm = ["title", "onClick", "onDblclick"], _m = { class: "load-more" }, Cm = { key: 1 }, Sm = { class: "footer" }, Fm = ue({
|
||
name: "FsIconSelector"
|
||
}), Rm = /* @__PURE__ */ ue({
|
||
...Fm,
|
||
props: {
|
||
modelValue: {
|
||
type: String,
|
||
default: ""
|
||
},
|
||
dialog: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
tabs: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
// 限制每页显示数量
|
||
limit: {
|
||
type: Number,
|
||
default: 136
|
||
},
|
||
iconSets: {
|
||
type: Array,
|
||
default: () => [
|
||
"logos",
|
||
"fa-brands",
|
||
"fa-solid",
|
||
"fa-regular",
|
||
"carbon",
|
||
"ion",
|
||
"ant-design",
|
||
"mdi",
|
||
"twemoji",
|
||
"svg-spinners"
|
||
]
|
||
},
|
||
apiProvider: {
|
||
type: String,
|
||
default: "https://api.iconify.design"
|
||
},
|
||
colors: {
|
||
type: Array,
|
||
default: () => [
|
||
"",
|
||
"#007AFF",
|
||
"#34C759",
|
||
"#FF9500",
|
||
"#FF3B30",
|
||
"#FFCC00",
|
||
"#424242",
|
||
"#8E8E93",
|
||
"#AF52DE",
|
||
"#5AC8FA",
|
||
"#A2845E"
|
||
]
|
||
}
|
||
},
|
||
emits: ["update:modelValue"],
|
||
setup(e, { emit: t }) {
|
||
const n = t, o = 136, r = e, { ui: a } = Se(), i = K(!1), l = V(() => ({
|
||
width: 1024,
|
||
style: {
|
||
width: "1024px"
|
||
},
|
||
...r.dialog,
|
||
[a.dialog.visible]: i.value,
|
||
[`onUpdate:${a.dialog.visible}`]: (O) => {
|
||
i.value = O;
|
||
}
|
||
})), s = a.formItem.injectFormItemContext(), u = V(() => ({
|
||
...f,
|
||
[a.input.modelValue]: r.modelValue,
|
||
[`onUpdate:${a.input.modelValue}`]: (O) => {
|
||
c(O);
|
||
}
|
||
})), c = (O) => {
|
||
n("update:modelValue", O), s == null || s.onChange();
|
||
}, d = () => {
|
||
var x;
|
||
i.value = !0, r.iconSets.length > 0 && k.value.records.length === 0 && F(r.iconSets[0]);
|
||
const O = ((x = r.modelValue) == null ? void 0 : x.split(":")) || [];
|
||
O.length >= 2 ? (q.value = O[0] + ":" + O[1], D.value = O[2]) : (q.value = r.modelValue, D.value = "");
|
||
}, f = Zo(), h = {
|
||
async getCollections() {
|
||
return await (await fetch(`${r.apiProvider}/collections`)).json();
|
||
},
|
||
async getIcons(O) {
|
||
return await (await fetch(`${r.apiProvider}/collection?prefix=${O}`)).json();
|
||
},
|
||
async search(O, x) {
|
||
const Q = x.start ?? 0, re = x.limit ?? 50;
|
||
return await (await fetch(`${r.apiProvider}/search?query=${O}&start=${Q}&limit=${re}`)).json();
|
||
}
|
||
}, g = K({}), m = async (O) => {
|
||
let x = g.value[O];
|
||
if (!x) {
|
||
const Q = await h.getIcons(O), re = Q.uncategorized ?? [], ge = Q.categories ?? [];
|
||
x = re;
|
||
for (const te in ge)
|
||
x = x.concat(ge[te]);
|
||
x = x.map((te) => `${O}:${te}`), g.value[O] = x;
|
||
}
|
||
return x;
|
||
}, y = K(""), v = K("all"), F = (O) => {
|
||
v.value = O, y.value = "", R(), j();
|
||
}, R = () => {
|
||
k.value.start = 0, k.value.records = [], k.value.total = 0, k.value.limit = r.limit ?? o;
|
||
}, k = K({
|
||
loading: !1,
|
||
start: 0,
|
||
limit: r.limit ?? o,
|
||
total: null,
|
||
query: "",
|
||
records: []
|
||
}), j = async () => {
|
||
if (!k.value.loading) {
|
||
k.value.query !== y.value && R(), k.value.loading = !0;
|
||
try {
|
||
const O = await A();
|
||
k.value.records = k.value.records.concat(O.icons), k.value.total = O.total, k.value.limit = O.limit, k.value.query = y.value;
|
||
} finally {
|
||
k.value.loading = !1;
|
||
}
|
||
}
|
||
};
|
||
async function A() {
|
||
if (v.value === "all") {
|
||
if (!y.value) {
|
||
a.notification.warn("请输入搜索关键字");
|
||
return;
|
||
}
|
||
return await h.search(y.value, k.value);
|
||
} else
|
||
return await T(v.value);
|
||
}
|
||
async function T(O) {
|
||
const x = await m(O);
|
||
let Q = x;
|
||
y.value && (Q = x.filter((te) => te.includes(y.value)));
|
||
let re = k.value.start + k.value.limit;
|
||
return re > Q.length && (re = Q.length), {
|
||
icons: Q.slice(k.value.start, re),
|
||
total: Q.length,
|
||
limit: k.value.limit,
|
||
start: k.value.start
|
||
};
|
||
}
|
||
const q = K(""), D = K(""), Y = (O, x = !1) => {
|
||
q.value = O, x && le();
|
||
}, le = () => {
|
||
i.value = !1;
|
||
let O = q.value;
|
||
D.value && (O = O + ":" + D.value), c(O);
|
||
}, I = (O) => {
|
||
D.value = O;
|
||
}, P = async () => {
|
||
k.value.start += k.value.limit, await j();
|
||
}, X = V(() => ({
|
||
...r.tabs,
|
||
[a.tabs.modelValue]: v.value,
|
||
[`onUpdate:${a.tabs.modelValue}`]: F
|
||
}));
|
||
return (O, x) => {
|
||
const Q = Z("fs-icon"), re = Z("fs-button"), ge = Z("fs-loading");
|
||
return b(), M("div", dm, [
|
||
(b(), $(H(z(a).input.name), W(u.value, {
|
||
class: "fs-icon-selector-search",
|
||
onClick: d
|
||
}), {
|
||
prefix: B(() => [
|
||
e.modelValue ? (b(), $(Q, {
|
||
key: 0,
|
||
class: "fs-icon-selector-input-prefix",
|
||
icon: e.modelValue
|
||
}, null, 8, ["icon"])) : G("", !0)
|
||
]),
|
||
_: 1
|
||
}, 16)),
|
||
i.value ? (b(), M("div", fm, [
|
||
(b(), $(H(z(a).dialog.name), W({
|
||
preset: "dialog",
|
||
title: "选择图标"
|
||
}, l.value, { footer: null }), {
|
||
default: B(() => [
|
||
oe("div", hm, [
|
||
oe("div", mm, [
|
||
(b(), $(H(z(a).tabs.name), W(X.value, { type: "card" }), {
|
||
default: B(() => [
|
||
(b(), $(H(z(a).tabPane.name), je({
|
||
key: "all",
|
||
[z(a).tabPane.key || ""]: "all",
|
||
[z(a).tabPane.tab || ""]: "全部"
|
||
}), null, 16)),
|
||
(b(!0), M(be, null, Te(e.iconSets, (te) => (b(), $(H(z(a).tabPane.name), je({
|
||
key: te,
|
||
[z(a).tabPane.key || ""]: te,
|
||
[z(a).tabPane.tab || ""]: te
|
||
}), null, 16))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16)),
|
||
oe("div", pm, [
|
||
(b(), $(H(z(a).input.name), je({
|
||
[z(a).input.modelValue]: y.value,
|
||
["onUpdate:" + z(a).input.modelValue]: x[0] || (x[0] = (te) => y.value = te),
|
||
class: "search-input",
|
||
placeholder: "搜索图标, 双击选择",
|
||
onKeydown: pl(j, ["enter"])
|
||
}), {
|
||
suffix: B(() => [
|
||
N(re, {
|
||
type: "primary",
|
||
size: "small",
|
||
icon: z(a).icons.search,
|
||
onClick: j
|
||
}, null, 8, ["icon"])
|
||
]),
|
||
_: 1
|
||
}, 16)),
|
||
oe("div", gm, [
|
||
x[2] || (x[2] = Ct(" 图标颜色: ", -1)),
|
||
(b(!0), M(be, null, Te(e.colors, (te) => (b(), M("div", {
|
||
key: te,
|
||
class: dt(["color-item", { active: te === D.value }]),
|
||
style: xn({ backgroundColor: te }),
|
||
onClick: (w) => I(te)
|
||
}, Pe(te ? "" : "无"), 15, vm))), 128)),
|
||
(b(), $(H(z(a).input.name), je({
|
||
style: { width: "100px" },
|
||
icon: z(a).icons.search,
|
||
[z(a).input.modelValue || ""]: D.value,
|
||
onInput: x[1] || (x[1] = (te) => I(te))
|
||
}), null, 16, ["icon"]))
|
||
])
|
||
]),
|
||
oe("div", bm, [
|
||
oe("div", ym, [
|
||
(b(!0), M(be, null, Te(k.value.records, (te) => (b(), M("div", {
|
||
key: te,
|
||
class: dt(["icon-item", { active: te === q.value }]),
|
||
title: te,
|
||
onClick: (w) => Y(te, !1),
|
||
onDblclick: (w) => Y(te, !0)
|
||
}, [
|
||
N(Q, {
|
||
icon: D.value ? `${te}:${D.value}` : te,
|
||
class: "text-2xl"
|
||
}, null, 8, ["icon"])
|
||
], 42, wm))), 128))
|
||
]),
|
||
oe("div", _m, [
|
||
k.value.loading ? (b(), $(ge, {
|
||
key: 0,
|
||
loading: k.value.loading,
|
||
text: "加载中"
|
||
}, null, 8, ["loading"])) : k.value.total == null || k.value.total == 0 ? (b(), M("div", Cm, [...x[3] || (x[3] = [
|
||
oe("div", null, "暂无数据", -1)
|
||
])])) : k.value.total > k.value.start + k.value.limit ? (b(), M("div", {
|
||
key: 2,
|
||
onClick: P
|
||
}, [...x[4] || (x[4] = [
|
||
oe("div", null, "加载更多", -1)
|
||
])])) : G("", !0)
|
||
])
|
||
]),
|
||
oe("div", Sm, [
|
||
N(re, {
|
||
type: "primary",
|
||
onClick: le
|
||
}, {
|
||
default: B(() => [...x[5] || (x[5] = [
|
||
Ct("确定", -1)
|
||
])]),
|
||
_: 1
|
||
})
|
||
])
|
||
])
|
||
])
|
||
]),
|
||
_: 1
|
||
}, 16))
|
||
])) : G("", !0)
|
||
]);
|
||
};
|
||
}
|
||
});
|
||
const km = ue({
|
||
name: "FsDictRadio",
|
||
props: {
|
||
/**
|
||
* 数据字典配置
|
||
*/
|
||
dict: {},
|
||
/**
|
||
* 可选项,比dict.data优先级高
|
||
*/
|
||
options: { type: Array },
|
||
/**
|
||
* radio组件名称
|
||
* antdv使用button样式的时候有用
|
||
* 即将废弃,请使用optionName
|
||
*/
|
||
radioName: {},
|
||
/**
|
||
* 选项的组件名称
|
||
*/
|
||
optionName: {
|
||
type: String
|
||
},
|
||
/**
|
||
* 选项的属性
|
||
*/
|
||
optionProps: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 转换DictData
|
||
*/
|
||
transformDictData: {
|
||
type: Function,
|
||
default: void 0
|
||
}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 字典数据变化事件
|
||
*/
|
||
"dict-change",
|
||
/**
|
||
* 选中值变化事件,可以获取到当前选中的option对象
|
||
*/
|
||
"selected-change",
|
||
/**
|
||
* 值变化事件
|
||
*/
|
||
"change"
|
||
],
|
||
setup(e, t) {
|
||
const { ui: n } = Se();
|
||
e.radioName && console.warn("参数radioName即将废弃,请改成optionName");
|
||
const o = V(() => e.optionName ?? e.radioName ?? n.radio.name);
|
||
let r = fn(e, t, n.radioGroup.modelValue);
|
||
const a = r.createComputedOptions();
|
||
return {
|
||
ui: n,
|
||
computedRadioName: o,
|
||
...r,
|
||
computedOptions: a,
|
||
onSelectedChange: (l) => {
|
||
t.emit("change", l), l && l.target && (l = l.target.value);
|
||
const s = r.getDict();
|
||
if (s && s.dataMap && s.dataMap[l]) {
|
||
const u = s.dataMap[l];
|
||
t.emit("selected-change", u);
|
||
} else
|
||
t.emit("selected-change", null);
|
||
}
|
||
};
|
||
}
|
||
});
|
||
function Dm(e, t, n, o, r, a) {
|
||
return b(), $(H(e.ui.radioGroup.name), { onChange: e.onSelectedChange }, {
|
||
default: B(() => [
|
||
(b(!0), M(be, null, Te(e.computedOptions, (i) => (b(), $(H(e.computedRadioName), W({
|
||
ref_for: !0,
|
||
ref: "radioRef",
|
||
key: e.getValue(i),
|
||
[e.ui.radio.value || ""]: e.getValue(i)
|
||
}, { ref_for: !0 }, e.optionProps), {
|
||
default: B(() => [
|
||
Ct(Pe(e.getLabel(i)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040))), 128))
|
||
]),
|
||
_: 1
|
||
}, 40, ["onChange"]);
|
||
}
|
||
const Om = /* @__PURE__ */ $e(km, [["render", Dm]]), Em = ue({
|
||
name: "FsDictSelect"
|
||
}), Tm = /* @__PURE__ */ ue({
|
||
...Em,
|
||
props: {
|
||
dict: {},
|
||
options: {},
|
||
slots: {},
|
||
renderLabel: {
|
||
type: Function
|
||
},
|
||
transformDictData: {
|
||
type: Function
|
||
}
|
||
},
|
||
emits: ["dict-change", "selected-change", "change"],
|
||
setup(e, {
|
||
expose: t,
|
||
emit: n
|
||
}) {
|
||
const o = e, r = n, a = K(), {
|
||
t: i
|
||
} = rt(), l = V(() => o.placeholder || i("fs.component.select.placeholder")), {
|
||
ui: s
|
||
} = Se(), u = Zo(), d = fn(o, {
|
||
emit: r,
|
||
attrs: u
|
||
}, s.select.modelValue), f = d.createComputedOptions(), h = K();
|
||
o.dict && (h.value = s.select.fieldNames({
|
||
value: o.dict.value,
|
||
label: o.dict.label
|
||
}));
|
||
const g = (v) => {
|
||
r("change", v);
|
||
const F = d.getDict();
|
||
if (v && Array.isArray(v) && v.length > 0) {
|
||
const R = [];
|
||
for (const k of v)
|
||
F && F.dataMap && F.dataMap[k] && R.push(F.dataMap[k]);
|
||
r("selected-change", R);
|
||
return;
|
||
}
|
||
if (F && F.dataMap && F.dataMap[v]) {
|
||
const R = F.dataMap[v];
|
||
r("selected-change", R);
|
||
} else
|
||
r("selected-change", null);
|
||
}, m = Wr();
|
||
t({
|
||
selectRef: a,
|
||
computedPlaceholder: l,
|
||
...d,
|
||
computedOptions: f,
|
||
onSelectedChange: g
|
||
});
|
||
const y = () => {
|
||
const {
|
||
ui: v
|
||
} = Se(), F = H(v.select.name), R = v.select.modelValue;
|
||
if (v.option.name == null) {
|
||
const q = f.value || [], D = {
|
||
[`onUpdate:${R}`]: (le) => {
|
||
this.$emit(`onUpdate:${R}`, le), g(le);
|
||
},
|
||
...u
|
||
}, Y = {
|
||
...m,
|
||
...o.slots
|
||
};
|
||
return N(F, W({
|
||
ref: "selectRef",
|
||
placeholder: l.value,
|
||
options: q
|
||
}, h.value, {
|
||
renderLabel: o.renderLabel
|
||
}, D), Y);
|
||
}
|
||
const k = [], j = H(v.option.name), A = f.value || [];
|
||
for (const q of A) {
|
||
const D = N(j, W(q, {
|
||
value: d.getValue(q),
|
||
label: d.getLabel(q)
|
||
}), {
|
||
default: () => [o.renderLabel ? o.renderLabel(q) : d.getLabel(q)]
|
||
});
|
||
k.push(D);
|
||
}
|
||
const T = {
|
||
default: () => k,
|
||
...m,
|
||
...o.slots
|
||
};
|
||
return N(F, W({
|
||
ref: "selectRef",
|
||
placeholder: l.value,
|
||
onChange: g
|
||
}, u), T);
|
||
};
|
||
return (v, F) => (b(), $(y));
|
||
}
|
||
});
|
||
function $m(e) {
|
||
if (e == null)
|
||
return 0;
|
||
typeof e != "string" && (e = JSON.stringify(e));
|
||
let t = 0, n, o, r;
|
||
if (e.length === 0)
|
||
return t;
|
||
for (n = 0, r = e.length; n < r; n++)
|
||
o = e.charCodeAt(n), t = (t << 5) - t + o, t |= 0;
|
||
return Math.abs(t);
|
||
}
|
||
function Am(e) {
|
||
let t = [];
|
||
return typeof e.modelValue == "string" && e.multiple && e.separator != null && e.separator !== "" ? t = e.modelValue.split(e.separator) : e.modelValue instanceof Array ? t = e.modelValue : t = [e.modelValue], t;
|
||
}
|
||
const Im = ue({
|
||
name: "FsValuesFormat",
|
||
props: {
|
||
/**
|
||
* 值
|
||
*/
|
||
modelValue: {},
|
||
/**
|
||
* 字典配置
|
||
*/
|
||
dict: {},
|
||
/**
|
||
* 是否多选
|
||
*/
|
||
multiple: { default: !0 },
|
||
/**
|
||
* 分隔符<br/>
|
||
* 多选时,如果value为string,则以该分隔符分割成多个展示<br/>
|
||
* 传入空字符串,表示不分割<br/>
|
||
*/
|
||
separator: { default: "," },
|
||
/**
|
||
* 颜色
|
||
* element=【auto, primary, success, warning, danger ,info】
|
||
* antdv=【auto, primary, success, blue,red,...】
|
||
* 配置auto,则自动根据value值hashcode分配颜色值
|
||
*/
|
||
color: {},
|
||
/**
|
||
* 效果(仅element)
|
||
**/
|
||
effect: {},
|
||
/**
|
||
* 自动染色颜色值列表
|
||
*/
|
||
autoColors: {
|
||
type: Array
|
||
},
|
||
/**
|
||
* 自动主题列表(仅element)
|
||
* 【 light, plain 】
|
||
*/
|
||
autoEffects: {
|
||
type: Array
|
||
},
|
||
/**
|
||
* 显示类型:【text, tag】
|
||
*/
|
||
type: {
|
||
default: "tag"
|
||
},
|
||
/**
|
||
* 值的类型,【 value | object】
|
||
*/
|
||
valueType: {
|
||
type: String
|
||
},
|
||
/**
|
||
* 当value值不在字典中时默认显示的文本
|
||
*/
|
||
defaultLabel: {},
|
||
/**
|
||
* label自定义render
|
||
*/
|
||
labelFormatter: {
|
||
type: Function
|
||
},
|
||
/**
|
||
* 自定义选项render
|
||
*/
|
||
itemRender: {
|
||
type: Function
|
||
},
|
||
/**
|
||
* 最多显示的选项数量,超出部分显示为 +N
|
||
*/
|
||
maxVisible: {
|
||
type: Number
|
||
},
|
||
closable: {
|
||
type: Boolean,
|
||
default: !1
|
||
}
|
||
},
|
||
emits: ["click", "dict-change", "close", "update:modelValue"],
|
||
setup(e, t) {
|
||
const { ui: n } = Se(), o = n.tag.colors, r = ["plain", "light"], a = fn(e, t), { getColor: i, getValue: l, removePropValue: s } = a;
|
||
a.watchValue();
|
||
function u(m, y) {
|
||
!y.effect && m.effect && (y.effect = m.effect);
|
||
const v = n.tag.type, F = i(y);
|
||
if (F != null) {
|
||
if (typeof F != "string")
|
||
return;
|
||
s(y, "color"), y[v] = F;
|
||
return;
|
||
}
|
||
if (m.color === "auto") {
|
||
const R = $m(l(y));
|
||
l(y);
|
||
const k = m.autoColors ? m.autoColors : o;
|
||
y[v] = k[R % k.length];
|
||
const j = m.autoEffects ? m.autoEffects : r;
|
||
y.effect = j[Math.floor(R / k.length) % j.length];
|
||
} else
|
||
y[v] = m.color;
|
||
}
|
||
const c = V(() => {
|
||
var j, A;
|
||
if (e.valueType === "object")
|
||
return e.modelValue && !Array.isArray(e.modelValue) ? [e.modelValue] : e.modelValue;
|
||
const m = a.getDict();
|
||
if (e.modelValue == null || e.modelValue === "")
|
||
return [];
|
||
const y = Am(e);
|
||
let v = [];
|
||
const F = ((j = e.dict) == null ? void 0 : j.value) || "value", R = ((A = e.dict) == null ? void 0 : A.label) || "label";
|
||
m ? (v = m.getNodesFromDataMap(y), J(v, (T) => {
|
||
T[R] == null && (T[R] = e.defaultLabel || T[F]);
|
||
})) : (v = [], J(y, (T) => {
|
||
T instanceof Object ? v.push(T) : v.push({
|
||
[F]: T,
|
||
[R]: T
|
||
});
|
||
}));
|
||
const k = [];
|
||
return J(v, (T) => {
|
||
k.push(cn(T, "children"));
|
||
}), J(k, (T) => {
|
||
u(e, T);
|
||
}), k;
|
||
}), d = V(() => e.maxVisible == null || e.maxVisible < 0 ? c.value : c.value.slice(0, e.maxVisible)), f = V(() => c.value.length - d.value.length);
|
||
function h(m) {
|
||
t.emit("click", { item: m });
|
||
}
|
||
function g(m, y) {
|
||
t.emit("close", { item: y, index: m });
|
||
const v = [];
|
||
for (let F = 0; F < c.value.length; F++)
|
||
F !== m && v.push(l(c.value[F]));
|
||
t.emit("update:modelValue", v);
|
||
}
|
||
return {
|
||
ui: n,
|
||
...a,
|
||
doClick: h,
|
||
computedValueItems: c,
|
||
visibleValueItems: d,
|
||
hiddenValueCount: f,
|
||
doClose: g
|
||
};
|
||
}
|
||
});
|
||
const Vm = { class: "fs-values-format" }, Pm = { key: 0 }, Mm = ["onClick"], Bm = { key: 0 };
|
||
function jm(e, t, n, o, r, a) {
|
||
const i = Z("fs-render"), l = Z("fs-icon");
|
||
return b(), M("span", Vm, [
|
||
e.itemRender ? (b(), M(be, { key: 0 }, [
|
||
(b(!0), M(be, null, Te(e.visibleValueItems, (s) => (b(), $(i, {
|
||
key: e.getValue(s),
|
||
"render-func": e.itemRender,
|
||
scope: s
|
||
}, null, 8, ["render-func", "scope"]))), 128)),
|
||
e.hiddenValueCount > 0 ? (b(), M("span", Pm, "+" + Pe(e.hiddenValueCount), 1)) : G("", !0)
|
||
], 64)) : e.type === "text" ? (b(), M(be, { key: 1 }, [
|
||
(b(!0), M(be, null, Te(e.visibleValueItems, (s) => (b(), M("span", {
|
||
key: e.getValue(s),
|
||
onClick: (u) => e.doClick(s)
|
||
}, Pe(e.getLabel(s)), 9, Mm))), 128)),
|
||
e.hiddenValueCount > 0 ? (b(), M("span", Bm, "+" + Pe(e.hiddenValueCount), 1)) : G("", !0)
|
||
], 64)) : (b(), M(be, { key: 2 }, [
|
||
(b(!0), M(be, null, Te(e.visibleValueItems, (s, u) => (b(), $(H(e.ui.tag.name), W({
|
||
key: e.getValue(s),
|
||
class: "fs-tag",
|
||
size: "small",
|
||
closable: e.closable
|
||
}, { ref_for: !0 }, s, {
|
||
icon: null,
|
||
name: null,
|
||
onClose: (c) => e.doClose(u, s),
|
||
onClick: (c) => e.doClick(s)
|
||
}), {
|
||
default: B(() => [
|
||
s.icon ? (b(), $(l, {
|
||
key: 0,
|
||
icon: s.icon,
|
||
spin: s.iconSpin,
|
||
class: "fs-tag-icon"
|
||
}, null, 8, ["icon", "spin"])) : G("", !0),
|
||
Ct(" " + Pe(e.getLabel(s)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040, ["closable", "onClose", "onClick"]))), 128)),
|
||
e.hiddenValueCount > 0 ? (b(), $(H(e.ui.tag.name), {
|
||
key: 0,
|
||
class: "fs-tag",
|
||
size: "small",
|
||
closable: !1
|
||
}, {
|
||
default: B(() => [
|
||
Ct(" +" + Pe(e.hiddenValueCount), 1)
|
||
]),
|
||
_: 1
|
||
})) : G("", !0)
|
||
], 64))
|
||
]);
|
||
}
|
||
const xm = /* @__PURE__ */ $e(Im, [["render", jm]]), Nm = ue({
|
||
name: "FsDictCascaderFormat",
|
||
props: {
|
||
/**
|
||
* 值<br/>
|
||
* 单选时 '1,2,3' 或 [1,2,3]<br/>
|
||
* 多选[[1,2,3],[4,5,6]]<br/>
|
||
*/
|
||
// @ts-ignore
|
||
modelValue: {
|
||
type: [String, Array],
|
||
default: void 0,
|
||
require: !0
|
||
},
|
||
/**
|
||
* value的分隔符<br/>
|
||
* 多选时,如果value为string,则以该分隔符分割成多个展示<br/>
|
||
* 传入空字符串,表示不分割<br/>
|
||
*/
|
||
// @ts-ignore
|
||
separator: { type: String, default: ",", require: !1 },
|
||
/**
|
||
* 是否多选
|
||
*/
|
||
// @ts-ignore
|
||
multiple: { type: Boolean, default: !1 },
|
||
/**
|
||
* 数据字典
|
||
*/
|
||
dict: {
|
||
type: Object,
|
||
default: void 0,
|
||
require: !1
|
||
}
|
||
},
|
||
emits: ["dict-change"],
|
||
setup(e, t) {
|
||
var r;
|
||
const n = fn(e, t);
|
||
(r = e.dict) != null && r.getNodesByValues && n.watchValue();
|
||
const o = V(() => e.multiple);
|
||
return {
|
||
...n,
|
||
computedMultiple: o
|
||
};
|
||
},
|
||
data() {
|
||
return {};
|
||
},
|
||
computed: {
|
||
labels() {
|
||
return this.modelValue == null ? [] : this.buildValueItem(this.modelValue);
|
||
},
|
||
multipleLabels() {
|
||
if (this.modelValue == null)
|
||
return [];
|
||
const e = [];
|
||
for (const t of this.modelValue)
|
||
e.push(this.buildValueItem(t));
|
||
return e;
|
||
}
|
||
},
|
||
methods: {
|
||
getValueArr(e) {
|
||
if (e == null)
|
||
if (this.multiple) {
|
||
e = [];
|
||
for (const n of this.modelValue)
|
||
for (const o of n)
|
||
e.push(o);
|
||
} else
|
||
e = this.modelValue;
|
||
if (e == null)
|
||
return [];
|
||
let t = null;
|
||
return typeof e == "string" && !this.multiple && this.separator != null && this.separator !== "" ? t = e.split(this.separator) : e instanceof Array ? t = e : t = [e], t;
|
||
},
|
||
buildValueItem(e) {
|
||
const t = this.getValueArr(e), n = this.getDict();
|
||
if (n)
|
||
return n.getNodesFromDataMap(t);
|
||
}
|
||
}
|
||
}), Lm = { key: 0 }, zm = { key: 0 };
|
||
function qm(e, t, n, o, r, a) {
|
||
return b(), M("span", null, [
|
||
e.computedMultiple ? (b(!0), M(be, { key: 0 }, Te(e.multipleLabels, (i, l) => (b(), M("div", { key: l }, [
|
||
(b(!0), M(be, null, Te(i, (s, u) => (b(), M("span", { key: u }, [
|
||
u !== 0 ? (b(), M("span", Lm, " / ")) : G("", !0),
|
||
oe("span", null, Pe(e.getLabel(s)), 1)
|
||
]))), 128))
|
||
]))), 128)) : (b(!0), M(be, { key: 1 }, Te(e.labels, (i, l) => (b(), M("span", { key: l }, [
|
||
l !== 0 ? (b(), M("span", zm, " / ")) : G("", !0),
|
||
oe("span", null, Pe(e.getLabel(i)), 1)
|
||
]))), 128))
|
||
]);
|
||
}
|
||
const Hm = /* @__PURE__ */ $e(Nm, [["render", qm]]), Wm = ue({
|
||
name: "FsDictCascader",
|
||
props: {
|
||
/**
|
||
* 字典配置
|
||
*/
|
||
dict: {},
|
||
/**
|
||
* 选项,比dict.data优先级高
|
||
*/
|
||
options: { type: Array },
|
||
/**
|
||
* 转换DictData
|
||
*/
|
||
transformDictData: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 级联选择器插槽,模板插槽同名时优先
|
||
*/
|
||
slots: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 字典数据变化事件
|
||
*/
|
||
"dict-change",
|
||
/**
|
||
* 选中值变化事件,可以获取到当前选中的option对象
|
||
*/
|
||
"selected-change",
|
||
/**
|
||
* 值变化事件
|
||
*/
|
||
"change"
|
||
],
|
||
setup(e, t) {
|
||
const n = K(), o = fn(e, t), { ui: r } = Se(), a = K();
|
||
e.dict && (a.value = r.cascader.fieldNames({
|
||
// @ts-ignore
|
||
value: e.dict.value,
|
||
// @ts-ignore
|
||
label: e.dict.label,
|
||
// @ts-ignore
|
||
children: e.dict.children
|
||
}));
|
||
const i = o.createComputedOptions(), l = V(() => ({ ...e.slots, ...t.slots }));
|
||
function s(u) {
|
||
if (t.emit("change", u), u) {
|
||
let c = [];
|
||
const d = o.getDict();
|
||
if (d && d.dataMap) {
|
||
for (let f of u) {
|
||
const h = d.dataMap[f];
|
||
h && c.push(h);
|
||
}
|
||
t.emit("selected-change", c);
|
||
}
|
||
} else
|
||
t.emit("selected-change", null);
|
||
}
|
||
return {
|
||
ui: r,
|
||
cascaderRef: n,
|
||
...o,
|
||
fieldNamesBinder: a,
|
||
computedOptions: i,
|
||
mergedSlots: l,
|
||
onSelectChange: s
|
||
};
|
||
}
|
||
});
|
||
function Um(e, t, n, o, r, a) {
|
||
const i = Z("fs-slot-render");
|
||
return b(), $(H(e.ui.cascader.name), W({
|
||
ref: "cascaderRef",
|
||
options: e.computedOptions
|
||
}, e.fieldNamesBinder, { onChange: e.onSelectChange }), Qo({ _: 2 }, [
|
||
Te(e.mergedSlots, (l, s) => ({
|
||
name: s,
|
||
fn: B((u) => [
|
||
N(i, {
|
||
slots: l,
|
||
scope: u
|
||
}, null, 8, ["slots", "scope"])
|
||
])
|
||
}))
|
||
]), 1040, ["options", "onChange"]);
|
||
}
|
||
const Km = /* @__PURE__ */ $e(Wm, [["render", Um]]), Ym = ue({
|
||
name: "FsDictCheckbox",
|
||
props: {
|
||
/**
|
||
* 字典
|
||
*/
|
||
dict: {},
|
||
/**
|
||
* 选项,比dict.data优先级高
|
||
*/
|
||
options: { type: Array, default: void 0, require: !1 },
|
||
/**
|
||
* 选项的组件名称
|
||
*/
|
||
optionName: {
|
||
type: String
|
||
},
|
||
/**
|
||
* 选项的属性
|
||
*/
|
||
optionProps: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 转换DictData
|
||
*/
|
||
transformDictData: {
|
||
type: Function,
|
||
default: void 0
|
||
}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 字典数据变化事件
|
||
*/
|
||
"dict-change",
|
||
/**
|
||
* 选中值变化事件,可以获取到当前选中的option对象
|
||
*/
|
||
"selected-change",
|
||
/**
|
||
* 值变化事件
|
||
*/
|
||
"change"
|
||
],
|
||
setup(e, t) {
|
||
const { ui: n } = Se();
|
||
let o = fn(e, t, n.checkboxGroup.modelValue);
|
||
const r = o.createComputedOptions();
|
||
return {
|
||
ui: n,
|
||
...o,
|
||
computedOptions: r,
|
||
onSelectedChange: (i) => {
|
||
if (t.emit("change", i), i) {
|
||
let l = [];
|
||
const s = o.getDict();
|
||
if (s && s.dataMap) {
|
||
for (let u of i) {
|
||
const c = s.dataMap[u];
|
||
c && l.push(c);
|
||
}
|
||
t.emit("selected-change", l);
|
||
}
|
||
} else
|
||
t.emit("selected-change", null);
|
||
}
|
||
};
|
||
}
|
||
});
|
||
function Gm(e, t, n, o, r, a) {
|
||
return b(), $(H(e.ui.checkboxGroup.name), { onChange: e.onSelectedChange }, {
|
||
default: B(() => [
|
||
(b(!0), M(be, null, Te(e.computedOptions, (i) => (b(), $(H(e.optionName || e.ui.checkbox.name), W({
|
||
ref_for: !0,
|
||
ref: "checkboxRef",
|
||
key: e.getValue(i),
|
||
[e.ui.checkbox.value || ""]: e.getValue(i)
|
||
}, { ref_for: !0 }, e.optionProps), {
|
||
default: B(() => [
|
||
Ct(Pe(e.getLabel(i)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040))), 128))
|
||
]),
|
||
_: 1
|
||
}, 40, ["onChange"]);
|
||
}
|
||
const Xm = /* @__PURE__ */ $e(Ym, [["render", Gm]]), Jm = ue({
|
||
name: "FsDictSwitch",
|
||
props: {
|
||
/**
|
||
* 字典第一个为开启
|
||
* 第二个为关闭
|
||
*/
|
||
dict: {
|
||
type: Object
|
||
},
|
||
options: {},
|
||
/**
|
||
* 转换DictData
|
||
*/
|
||
transformDictData: {
|
||
type: Function,
|
||
default: void 0
|
||
}
|
||
},
|
||
emits: ["dict-change"],
|
||
setup(e, t) {
|
||
const { ui: n } = Se();
|
||
let o = fn(e, t, n.switch.modelValue);
|
||
const r = o.createComputedOptions();
|
||
return {
|
||
ui: n,
|
||
...o,
|
||
computedOptions: r
|
||
};
|
||
},
|
||
computed: {
|
||
_active() {
|
||
return this.computedOptions.length > 0 ? this.computedOptions[0] : {};
|
||
},
|
||
_inActive() {
|
||
return this.computedOptions.length > 1 ? this.computedOptions[1] : {};
|
||
},
|
||
binding() {
|
||
var t, n, o, r, a, i;
|
||
const e = Le.get();
|
||
return {
|
||
// @ts-ignore
|
||
[e.switch.activeText]: this._active[((t = this.dict) == null ? void 0 : t.label) || "label"],
|
||
// @ts-ignore
|
||
[e.switch.inactiveText]: this._inActive[((n = this.dict) == null ? void 0 : n.label) || "label"],
|
||
// @ts-ignore
|
||
[e.switch.activeColor]: this._active[((o = this.dict) == null ? void 0 : o.color) || "color"],
|
||
// @ts-ignore
|
||
[e.switch.inactiveColor]: this._inActive[((r = this.dict) == null ? void 0 : r.color) || "color"],
|
||
// @ts-ignore
|
||
[e.switch.activeValue]: this._active[((a = this.dict) == null ? void 0 : a.value) || "value"],
|
||
// @ts-ignore
|
||
[e.switch.inactiveValue]: this._inActive[((i = this.dict) == null ? void 0 : i.value) || "value"]
|
||
};
|
||
}
|
||
}
|
||
});
|
||
function Qm(e, t, n, o, r, a) {
|
||
return b(), $(H(e.ui.switch.name), W({ ref: "switchRef" }, e.binding), null, 16);
|
||
}
|
||
const Zm = /* @__PURE__ */ $e(Jm, [["render", Qm]]), ep = ue({
|
||
name: "FsDateFormat",
|
||
props: {
|
||
/**
|
||
* 日期时间值,支持long,string,date等,由dayjs转化
|
||
*/
|
||
modelValue: { required: !1 },
|
||
/**
|
||
* 输入格式化,不传则由dayjs自动转化
|
||
*/
|
||
valueFormat: { type: String, default: void 0, required: !1 },
|
||
/**
|
||
* 输出格式化
|
||
*/
|
||
format: { type: String, default: "YYYY-MM-DD HH:mm:ss", required: !1 }
|
||
},
|
||
data() {
|
||
return {
|
||
item: {}
|
||
};
|
||
},
|
||
computed: {
|
||
doFormat() {
|
||
if (this.modelValue == null || this.modelValue === "")
|
||
return "";
|
||
let e = null;
|
||
return this.valueFormat != null ? e = ot(this.modelValue, this.valueFormat) : e = ot(this.modelValue), e.format(this.format);
|
||
}
|
||
},
|
||
created() {
|
||
},
|
||
methods: {}
|
||
});
|
||
function tp(e, t, n, o, r, a) {
|
||
return b(), M("span", null, Pe(e.doFormat), 1);
|
||
}
|
||
const np = /* @__PURE__ */ $e(ep, [["render", tp]]), op = ue({
|
||
name: "FsDictTree",
|
||
components: {},
|
||
props: {
|
||
/**
|
||
* 数据字典
|
||
*/
|
||
dict: {},
|
||
/**
|
||
* 可选项,比dict.data优先级高
|
||
*/
|
||
options: { type: Array },
|
||
/**
|
||
* placeholder
|
||
*/
|
||
placeholder: { type: String },
|
||
/**
|
||
* 转换DictData
|
||
*/
|
||
transformDictData: {
|
||
type: Function,
|
||
default: void 0
|
||
}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 字典数据变化事件
|
||
*/
|
||
"dict-change",
|
||
/**
|
||
* 选中值变化事件,可以获取到当前选中的option对象
|
||
*/
|
||
"selected-change",
|
||
/**
|
||
* 值变化事件
|
||
*/
|
||
"change"
|
||
],
|
||
// render () {
|
||
// return this.renderFunc({ data: this.data, dataMap: this.dataMap, scope: this.scope, attrs: this.$attrs })
|
||
// },
|
||
setup(e, t) {
|
||
const { t: n } = rt(), { ui: o } = Se(), r = V(() => e.placeholder || n("fs.component.select.placeholder"));
|
||
let a = fn(e, t);
|
||
const i = t.slots, l = a.createComputedOptions(), s = V(() => {
|
||
const d = a.getDict();
|
||
return o.treeSelect.buildOptionKeysNameBinding({
|
||
label: d.label,
|
||
value: d.value,
|
||
children: d.children
|
||
});
|
||
}), u = (d) => {
|
||
if (t.emit("change", d), d) {
|
||
const f = a.getDict();
|
||
if (f && f.dataMap)
|
||
if (d instanceof Array) {
|
||
let h = [];
|
||
for (let g of d) {
|
||
const m = f.dataMap[g];
|
||
m && h.push(m);
|
||
}
|
||
t.emit("selected-change", h);
|
||
} else
|
||
t.emit("selected-change", f.dataMap[d]);
|
||
} else
|
||
t.emit("selected-change", null);
|
||
}, c = K();
|
||
return {
|
||
ui: o,
|
||
computedBinding: s,
|
||
computedPlaceholder: r,
|
||
...a,
|
||
computedOptions: l,
|
||
onSelectedChange: u,
|
||
slots: i,
|
||
treeRef: c
|
||
};
|
||
}
|
||
});
|
||
function rp(e, t, n, o, r, a) {
|
||
const i = Z("fs-slot-render");
|
||
return b(), $(H(e.ui.treeSelect.name), W({
|
||
ref: "treeRef",
|
||
[e.ui.treeSelect.options || ""]: e.computedOptions,
|
||
placeholder: e.computedPlaceholder
|
||
}, e.computedBinding, { onChange: e.onSelectedChange }), Qo({ _: 2 }, [
|
||
Te(e.slots, (l, s) => ({
|
||
name: s,
|
||
fn: B((u) => [
|
||
N(i, {
|
||
slots: l,
|
||
scope: u
|
||
}, null, 8, ["slots", "scope"])
|
||
])
|
||
}))
|
||
]), 1040, ["placeholder", "onChange"]);
|
||
}
|
||
const ap = /* @__PURE__ */ $e(op, [["render", rp]]), ip = {
|
||
class: "fs-table-select"
|
||
}, lp = {
|
||
key: 0,
|
||
class: "fs-table-select-current"
|
||
}, sp = /* @__PURE__ */ ue({
|
||
__name: "fs-table-select",
|
||
props: {
|
||
modelValue: {},
|
||
createCrudOptions: {},
|
||
crudOptionsOverride: {
|
||
default: void 0
|
||
},
|
||
beforeOpen: {},
|
||
dict: {},
|
||
select: {
|
||
default: void 0
|
||
},
|
||
showSelect: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
dialog: {
|
||
default: void 0
|
||
},
|
||
showCurrent: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
valuesFormat: {
|
||
default: void 0
|
||
},
|
||
height: {
|
||
default: void 0
|
||
},
|
||
multiple: {
|
||
type: Boolean
|
||
},
|
||
crossPage: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
rowKey: {
|
||
default: void 0
|
||
},
|
||
disabled: {
|
||
type: Boolean,
|
||
default: !1
|
||
},
|
||
readonly: {
|
||
type: Boolean,
|
||
default: !1
|
||
},
|
||
valueType: {
|
||
default: "value"
|
||
},
|
||
viewMode: {
|
||
type: Boolean,
|
||
default: !1
|
||
},
|
||
emitOnViewModel: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
destroyOnClose: {
|
||
type: Boolean,
|
||
default: !0
|
||
}
|
||
},
|
||
emits: [
|
||
"change",
|
||
"update:modelValue",
|
||
/* 选中行变化事件 */
|
||
"selected-change",
|
||
/*对话框即将关闭*/
|
||
"dialog-close",
|
||
/*对话框已关闭*/
|
||
"dialog-closed",
|
||
/*对话框关闭*/
|
||
"close",
|
||
/*对话框打开*/
|
||
"open"
|
||
],
|
||
setup(e, {
|
||
expose: t,
|
||
emit: n
|
||
}) {
|
||
const o = e, r = Wr(), a = n, {
|
||
ui: i
|
||
} = Se(), {
|
||
t: l
|
||
} = rt(), s = K(), u = K(), c = K(!1);
|
||
function d() {
|
||
c.value = !1, a("close", P());
|
||
}
|
||
function f() {
|
||
c.value = !0, a("open", P());
|
||
}
|
||
function h() {
|
||
d();
|
||
}
|
||
const {
|
||
crudRef: g,
|
||
crudBinding: m,
|
||
crudExpose: y
|
||
} = $u();
|
||
function v(O) {
|
||
O == null || Array.isArray(O) && O.length == 0 ? T.value = [] : (o.multiple ? T.value = O || [] : T.value = [O], o.valueType === "object" && (T.value = T.value.map((x) => o.dict.getValue(x))));
|
||
}
|
||
const F = K(), R = V(() => ({
|
||
wrapper: {}
|
||
})), k = async (O = {}) => {
|
||
var re, ge;
|
||
if (o.disabled || o.readonly || (re = o.select) != null && re.disabled || (ge = o.select) != null && ge.readonly)
|
||
return;
|
||
if (o.dict == null)
|
||
throw new Error("必须配置dict,且必须配置dict.getNodesByValues");
|
||
const x = await Tu({
|
||
crudBinding: m,
|
||
crudRef: g,
|
||
createCrudOptions: o.createCrudOptions,
|
||
crudOptionsOverride: Y(),
|
||
context: {
|
||
t: l,
|
||
ui: i,
|
||
...O == null ? void 0 : O.context
|
||
},
|
||
crudExpose: y
|
||
});
|
||
v(o.modelValue), o.beforeOpen && await o.beforeOpen({
|
||
crudOptions: O == null ? void 0 : O.crudOptions,
|
||
...P()
|
||
}), O && x.appendCrudOptions(O == null ? void 0 : O.crudOptions);
|
||
const Q = le({
|
||
wrapper: {
|
||
title: o.viewMode ? l("fs.extends.tableSelect.view") : l("fs.extends.tableSelect.select"),
|
||
width: "80%",
|
||
draggable: !0,
|
||
is: i.dialog.name,
|
||
footer: !1,
|
||
...i.formWrapper.buildInitBind(i.dialog.name),
|
||
buttons: {
|
||
reset: {
|
||
show: !1
|
||
},
|
||
cancel: {
|
||
text: l("fs.extends.tableSelect.cancel"),
|
||
async click() {
|
||
F.value.close();
|
||
}
|
||
},
|
||
ok: {
|
||
type: "primary",
|
||
text: l("fs.extends.tableSelect.ok"),
|
||
async click() {
|
||
await I();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}, {
|
||
wrapper: o.dialog
|
||
});
|
||
return F.value.open(Q), await Be(), await y.doRefresh(), x;
|
||
}, j = V(() => ({
|
||
maxVisible: 3,
|
||
...o.valuesFormat
|
||
})), A = V(() => {
|
||
const O = `onUpdate:${i.select.modelValue}`;
|
||
let x = o.modelValue;
|
||
return o.valueType === "object" && o.modelValue && (o.multiple ? x = o.modelValue.map((Q) => o.dict.getValue(Q)) : x = o.dict.getValue(o.modelValue)), {
|
||
[i.select.modelValue]: x,
|
||
[O]: (Q) => {
|
||
a("update:modelValue", Q);
|
||
},
|
||
[i.select.clearable]: !0,
|
||
...i.select.buildMultiBinding(o.multiple),
|
||
show: !1,
|
||
...o.select
|
||
};
|
||
});
|
||
ut(() => o.modelValue, async (O) => {
|
||
O !== T.value && (v(O), await Be(), await o.dict.appendByValues(T.value));
|
||
});
|
||
const T = K([]);
|
||
function q() {
|
||
return o.rowKey || m.value.table.rowKey || "id";
|
||
}
|
||
const D = K(!1);
|
||
function Y() {
|
||
var re, ge;
|
||
let O = i.table;
|
||
((ge = (re = m.value) == null ? void 0 : re.table) == null ? void 0 : ge.tableVersion) === "v2" && (O = i.tableV2);
|
||
let x = O.buildSelectionCrudOptions({
|
||
crossPage: o.crossPage,
|
||
selectOnClickRow: !0,
|
||
getRowKey: q,
|
||
getPageData() {
|
||
return m.value.data;
|
||
},
|
||
useCompute: Vt,
|
||
multiple: o.multiple,
|
||
selectedRowKeys: T,
|
||
onSelectedKeysChanged: async (te) => {
|
||
T.value = [...te], await Be(), await o.dict.appendByValues(T.value);
|
||
}
|
||
});
|
||
return le({
|
||
table: {
|
||
async onRefreshed() {
|
||
if (O.setSelectedRows) {
|
||
D.value = !0, await Be(), await Be();
|
||
const te = y.getBaseTableRef();
|
||
O.setSelectedRows({
|
||
getRowKey: q,
|
||
multiple: o.multiple,
|
||
tableRef: te,
|
||
selectedRowKeys: T
|
||
}), D.value = !1;
|
||
}
|
||
}
|
||
}
|
||
}, x, o.crudOptionsOverride);
|
||
}
|
||
const {
|
||
merge: le
|
||
} = Ee();
|
||
async function I() {
|
||
var re;
|
||
if (o.dict.loading)
|
||
return;
|
||
let O = null, x = null;
|
||
((re = T.value) == null ? void 0 : re.length) > 0 && (O = [...T.value], x = O.map((ge) => o.dict.getDictMap()[ge]), o.valueType === "object" && (O = x), o.multiple !== !0 && O.length > 0 && (O = O[0])), (!o.viewMode || o.emitOnViewModel) && (a("update:modelValue", O), a("change", O), a("selected-change", x));
|
||
let Q = {
|
||
value: O,
|
||
rows: x,
|
||
selectedRowKeys: T.value
|
||
};
|
||
a("dialog-close", Q), await Be(), await F.value.close(), a("dialog-closed", Q);
|
||
}
|
||
const P = () => ({
|
||
opened: c,
|
||
open: k,
|
||
selectedRowKeys: T,
|
||
dictSelectRef: s,
|
||
valuesFormatRef: u,
|
||
crudRef: g,
|
||
crudBinding: m,
|
||
crudExpose: y,
|
||
close: h
|
||
}), X = K(P());
|
||
return t(X.value), (O, x) => {
|
||
const Q = Z("fs-dict-select"), re = Z("fs-values-format"), ge = Z("fs-crud"), te = Z("fs-form-wrapper");
|
||
return b(), M("div", ip, [!(r != null && r.default) && !e.viewMode ? (b(), $(Q, W({
|
||
key: 0,
|
||
ref_key: "dictSelectRef",
|
||
ref: s
|
||
}, A.value, {
|
||
open: !1,
|
||
disabled: e.disabled,
|
||
readonly: e.readonly,
|
||
dict: e.dict,
|
||
onClick: k
|
||
}), null, 16, ["disabled", "readonly", "dict"])) : G("", !0), he(O.$slots, "default", je(Nt(X.value))), (b(), $(H(z(i).formItem.skipValidationWrapper), null, {
|
||
default: B(() => [N(te, W({
|
||
ref_key: "formWrapperRef",
|
||
ref: F
|
||
}, R.value, {
|
||
onClosed: d,
|
||
onOpen: f
|
||
}), {
|
||
"form-body-top": B(() => [c.value || e.destroyOnClose === !1 ? (b(), M("div", {
|
||
key: 0,
|
||
style: xn({
|
||
width: "100%",
|
||
height: e.height || "70vh"
|
||
})
|
||
}, [N(ge, W({
|
||
ref_key: "crudRef",
|
||
ref: g
|
||
}, z(m)), {
|
||
"header-top": B(() => [e.showCurrent !== !1 && !e.viewMode ? (b(), M("div", lp, [Ct(Pe(z(l)("fs.extends.tableSelect.current")) + ": ", 1), N(re, W({
|
||
ref_key: "valuesFormatRef",
|
||
ref: u,
|
||
modelValue: T.value,
|
||
"onUpdate:modelValue": x[0] || (x[0] = (w) => T.value = w),
|
||
dict: e.dict,
|
||
closable: !0
|
||
}, j.value), null, 16, ["modelValue", "dict"])])) : G("", !0)]),
|
||
_: 1
|
||
}, 16)], 4)) : G("", !0)]),
|
||
_: 1
|
||
}, 16)]),
|
||
_: 1
|
||
}))]);
|
||
};
|
||
}
|
||
});
|
||
const up = { class: "fs-editable-select" }, cp = { class: "select" }, dp = ue({
|
||
/**
|
||
* 可编辑选择器
|
||
*/
|
||
name: "FsEditableSelect"
|
||
}), fp = /* @__PURE__ */ ue({
|
||
...dp,
|
||
props: {
|
||
modelValue: {},
|
||
dict: {},
|
||
tableSelect: {},
|
||
dictSelect: {},
|
||
button: {}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 关闭对话框时触发
|
||
*/
|
||
"refresh",
|
||
"update:modelValue"
|
||
],
|
||
setup(e, { emit: t }) {
|
||
const n = e, o = t;
|
||
function r() {
|
||
var i;
|
||
o("refresh"), (i = n.dict) == null || i.reloadDict();
|
||
}
|
||
function a(i) {
|
||
o("update:modelValue", i);
|
||
}
|
||
return (i, l) => {
|
||
const s = Z("fs-dict-select"), u = Z("fs-button"), c = Z("fs-table-select");
|
||
return b(), M("div", up, [
|
||
oe("div", cp, [
|
||
N(s, W({
|
||
value: e.modelValue,
|
||
dict: e.dict
|
||
}, e.dictSelect, { "onUpdate:value": a }), null, 16, ["value", "dict"])
|
||
]),
|
||
N(c, W({
|
||
class: "table-select",
|
||
"model-value": e.modelValue,
|
||
dict: e.dict,
|
||
"destroy-on-close": !1,
|
||
height: "400px"
|
||
}, e.tableSelect, {
|
||
"onUpdate:modelValue": a,
|
||
onDialogClosed: r
|
||
}), {
|
||
default: B((d) => [
|
||
N(u, W({
|
||
type: "primary",
|
||
icon: "ant-design:edit-outlined"
|
||
}, e.button, {
|
||
onClick: d.open
|
||
}), null, 16, ["onClick"])
|
||
]),
|
||
_: 1
|
||
}, 16, ["model-value", "dict"])
|
||
]);
|
||
};
|
||
}
|
||
});
|
||
const za = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
FsActionbar: wf,
|
||
FsBox: $c,
|
||
FsButton: dc,
|
||
FsCell: Oi,
|
||
FsColumnsFilterLayoutDefault: Mh,
|
||
FsComponentRender: Si,
|
||
FsContainer: Yu,
|
||
FsCrud: wd,
|
||
FsDateFormat: np,
|
||
FsDictCascader: Km,
|
||
FsDictCascaderFormat: Hm,
|
||
FsDictCheckbox: Xm,
|
||
FsDictRadio: Om,
|
||
FsDictSelect: Tm,
|
||
FsDictSwitch: Zm,
|
||
FsDictTree: ap,
|
||
FsEditable: gf,
|
||
FsEditableCell: Ei,
|
||
FsEditableSelect: fp,
|
||
FsForm: Bc,
|
||
FsFormHelper: ed,
|
||
FsFormItem: Kc,
|
||
FsFormItemCol: Yc,
|
||
FsFormProvider: od,
|
||
FsFormWrapper: ao,
|
||
FsIcon: fc,
|
||
FsIconSelector: Rm,
|
||
FsIconSvg: wc,
|
||
FsIconify: pc,
|
||
FsLabel: Sc,
|
||
FsLayoutCard: cc,
|
||
FsLayoutDefault: nc,
|
||
FsLoading: Dc,
|
||
FsPage: eu,
|
||
FsRender: Fi,
|
||
FsRowHandle: Ri,
|
||
FsSearch: Hh,
|
||
FsSearchLayoutDefault: lm,
|
||
FsSearchV1: Zh,
|
||
FsSlotRender: Vc,
|
||
FsTable: sf,
|
||
FsTableColumnsFixedController: Ji,
|
||
FsTableSelect: sp,
|
||
FsTabsFilter: cm,
|
||
FsToolbar: Rf,
|
||
FsValuesFormat: xm,
|
||
fsColumnsFilterNestList: Qi
|
||
}, Symbol.toStringTag, { value: "Module" })), { setDictRequest: hp } = Mu(), $p = {
|
||
install(e, t = {}) {
|
||
t.ui && Le.set(t.ui);
|
||
const { merge: n } = Ee();
|
||
t.commonOptions && (oo.commonOptions = t.commonOptions), t.dictRequest && hp(t.dictRequest), t.i18n && Do.setVueI18n(t.i18n);
|
||
const o = t.customComponents || {};
|
||
for (const r in za) {
|
||
const a = o[r] || za[r];
|
||
e.component(r, a);
|
||
}
|
||
ao._context = e._context, Tn.install(), e.config.globalProperties.$fsui = Le.get(), n(Lu.logger, t.logger), mp(t.logger);
|
||
}
|
||
};
|
||
function mp(e) {
|
||
var t;
|
||
((t = e == null ? void 0 : e.off) == null ? void 0 : t.tableColumns) !== !1 && console.warn(`[fast-crud] crudBinding.value.table.columns / toolbar.columnsFilter.originalColumns 由array改成map. 请改成通过key读取,你可以全局代码搜索【value.table.columns / columnsFilter.originalColumns】来检查是否有使用它们。
|
||
[通过 app.use(FastCrud,{logger:{off:{tableColumns:false}}}) 可关闭此警告] `);
|
||
}
|
||
export {
|
||
wd as $,
|
||
Jr as A,
|
||
pi as B,
|
||
or as C,
|
||
Ci as D,
|
||
Ou as E,
|
||
$p as F,
|
||
Lu as G,
|
||
eu as H,
|
||
Yu as I,
|
||
nc as J,
|
||
cc as K,
|
||
Si as L,
|
||
Vc as M,
|
||
Fi as N,
|
||
dc as O,
|
||
fc as P,
|
||
pc as Q,
|
||
wc as R,
|
||
Rm as S,
|
||
Sc as T,
|
||
Bc as U,
|
||
Kc as V,
|
||
Yc as W,
|
||
ed as X,
|
||
ao as Y,
|
||
od as Z,
|
||
Dc as _,
|
||
rt as a,
|
||
sf as a0,
|
||
Oi as a1,
|
||
Ei as a2,
|
||
gf as a3,
|
||
Ri as a4,
|
||
Hh as a5,
|
||
Zh as a6,
|
||
lm as a7,
|
||
cm as a8,
|
||
wf as a9,
|
||
Rf as aa,
|
||
Mh as ab,
|
||
Qi as ac,
|
||
Ji as ad,
|
||
Om as ae,
|
||
Tm as af,
|
||
xm as ag,
|
||
Hm as ah,
|
||
Km as ai,
|
||
Xm as aj,
|
||
Zm as ak,
|
||
np as al,
|
||
$c as am,
|
||
ap as an,
|
||
sp as ao,
|
||
fp as ap,
|
||
Tp as aq,
|
||
oa as ar,
|
||
Fu as as,
|
||
Ru as at,
|
||
Du as au,
|
||
Rp as av,
|
||
Eu as b,
|
||
tr as c,
|
||
kp as d,
|
||
Tu as e,
|
||
$u as f,
|
||
nr as g,
|
||
uu as h,
|
||
cu as i,
|
||
Vt as j,
|
||
fn as k,
|
||
Pu as l,
|
||
Mu as m,
|
||
Ep as n,
|
||
hi as o,
|
||
Ee as p,
|
||
ea as q,
|
||
si as r,
|
||
Vl as s,
|
||
Lo as t,
|
||
an as u,
|
||
zo as v,
|
||
na as w,
|
||
Nu as x,
|
||
_u as y,
|
||
mi as z
|
||
};
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtOGQ0YjA1MDIubWpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdXRpbC5sb2cudHMiLCIuLi8uLi9zcmMvdXRpbHMvdXRpbC5zdHJpbmcudHMiLCIuLi8uLi9zcmMvdXRpbHMvdXRpbC50cmFjZS50cyIsIi4uLy4uL3NyYy91dGlscy91dGlsLnZpdGUudHMiLCIuLi8uLi9zcmMvdXRpbHMvdXRpbC5zdG9yZS50cyIsIi4uLy4uL3NyYy91dGlscy9kZWVwZGFzaC9wcml2YXRlL2dldFBhdGhUb1N0cmluZy50cyIsIi4uLy4uL3NyYy91dGlscy9kZWVwZGFzaC9wcml2YXRlL2dldEl0ZXJhdGUudHMiLCIuLi8uLi9zcmMvdXRpbHMvZGVlcGRhc2gvZ2V0LWVhY2gtZGVlcC50cyIsIi4uLy4uL3NyYy91dGlscy9kZWVwZGFzaC9pbmRleC50cyIsIi4uLy4uL3NyYy91dGlscy91dGlsLmRhc2gudHMiLCIuLi8uLi9zcmMvdXRpbHMvdXRpbC5jbGlwYm9hcmQudHMiLCIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiLCIuLi8uLi9zcmMvdXNlL2RlZmF1bHQtY3J1ZC1vcHRpb25zLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvYXNzaXN0LnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvYnV0dG9uLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvY2FzY2FkZXIudHMiLCIuLi8uLi9zcmMvbG9jYWxlL2xhbmcvemgtY24udHMiLCIuLi8uLi9zcmMvbG9jYWxlL2xhbmcvZW4udHMiLCIuLi8uLi9zcmMvbG9jYWxlL2luZGV4LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2RheWpzQDEuMTEuMjMvbm9kZV9tb2R1bGVzL2RheWpzL3BsdWdpbi9hZHZhbmNlZEZvcm1hdC5qcyIsIi4uLy4uL3NyYy90eXBlcy9mdW5jdGlvbnMudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4yMy9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3dlZWtPZlllYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4yMy9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3dlZWtkYXkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4yMy9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL2xvY2FsZURhdGEuanMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC9kYXRlLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvZWwudHMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC9pY29uLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvbnVtYmVyLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvcGhvbmUudHMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC9zZWxlY3QudHMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC90ZXh0LnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvdHJlZS50cyIsIi4uLy4uL3NyYy90eXBlcy9pbmRleC50cyIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1wYWdlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1wYWdlLnZ1ZSIsIi4uLy4uL3NyYy91c2UvdXNlLW1lcmdlLnRzIiwiLi4vLi4vc3JjL3VzZS91c2UtY29tcHV0ZS50cyIsIi4uLy4uL3NyYy91dGlscy91dGlsLmNvbnN0YW50cy50cyIsIi4uLy4uL3NyYy91c2UvdXNlLWNvbHVtbnMudHN4IiwiLi4vLi4vc3JjL3VzZS91c2UtZm9ybS50cyIsIi4uLy4uL3NyYy91c2UvdXNlLWV4cG9zZS50cyIsIi4uLy4uL3NyYy9saWIvZnMtZXhwb3J0L2luZGV4LnRzIiwiLi4vLi4vc3JjL3VzZS91c2UtcGx1Z2lucy50cyIsIi4uLy4uL3NyYy91c2UvdXNlLWNydWQudHMiLCIuLi8uLi9zcmMvdXNlL3VzZS1kaWN0LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xydS1jYWNoZUAxMC40LjMvbm9kZV9tb2R1bGVzL2xydS1jYWNoZS9kaXN0L2VzbS9pbmRleC5qcyIsIi4uLy4uL3NyYy91c2UvdXNlLWRpY3QtZGVmaW5lLnRzIiwiLi4vLi4vc3JjL3VzZS91c2UtdHlwZXMudHMiLCIuLi8uLi9zcmMvdXNlL3VzZS1kcmFnLnRzIiwiLi4vLi4vc3JjL3VzZS9jb25maWcudHMiLCIuLi9zcmMvY29tcG9uZW50cy9jb250YWluZXIvZnMtY29udGFpbmVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1jb250YWluZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY29udGFpbmVyL2ZzLWxheW91dC1kZWZhdWx0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1sYXlvdXQtZGVmYXVsdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb250YWluZXIvZnMtbGF5b3V0LWNhcmQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY29udGFpbmVyL2ZzLWxheW91dC1jYXJkLnZ1ZSIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2Jhc2ljL2ZzLWJ1dHRvbi50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1pY29uLnRzeCIsIi4uL3NyYy9jb21wb25lbnRzL2Jhc2ljL2ZzLWljb25pZnkudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvYmFzaWMvZnMtaWNvbmlmeS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1pY29uLXN2Zy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1pY29uLXN2Zy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1sYWJlbC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1sYWJlbC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1sb2FkaW5nLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Jhc2ljL2ZzLWJveC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1ib3gudnVlIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvcmVuZGVyL2ZzLWNvbXBvbmVudC1yZW5kZXIudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvcmVuZGVyL2ZzLXNsb3QtcmVuZGVyLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL3JlbmRlci9mcy1yZW5kZXIudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9mcy1mb3JtLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtZm9ybS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taXRlbS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taXRlbS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taXRlbS1jb2wudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9mcy1mb3JtLWhlbHBlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taGVscGVyLnZ1ZSIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtZm9ybS13cmFwcGVyLnRzeCIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtZm9ybS1wcm92aWRlci52dWUiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9mcy1jcnVkLXNsb3RzLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvZnMtY3J1ZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9mcy1jcnVkLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtcm93LWhhbmRsZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLXJvdy1oYW5kbGUudnVlIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2FzeW5jLXZhbGlkYXRvckA0LjIuNS9ub2RlX21vZHVsZXMvYXN5bmMtdmFsaWRhdG9yL2Rpc3Qtd2ViL2luZGV4LmpzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9lZGl0YWJsZS92YWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9jcnVkL2VkaXRhYmxlL3VzZS1lZGl0YWJsZS50cyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2NydWQvdXNlL3Byb3ZpZGVyLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9mcy1jZWxsLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2NydWQvZWRpdGFibGUvZnMtZWRpdGFibGUtY2VsbC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLXRhYmxlLnRzeCIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZWRpdGFibGUvZnMtZWRpdGFibGUudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvYWN0aW9uYmFyL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2FjdGlvbmJhci9pbmRleC52dWUiLCIuLi8uLi9zcmMvZC9leHBvc2UudHMiLCIuLi8uLi9zcmMvZC9jb2x1bW5zLWZpbHRlci50cyIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvaW5kZXgudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvdG9vbGJhci9pbmRleC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy90b29sYmFyL2luZGV4LnZ1ZSIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9zb3J0YWJsZWpzQDEuMTQuMC9ub2RlX21vZHVsZXMvc29ydGFibGVqcy9tb2R1bGFyL3NvcnRhYmxlLmVzbS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS92dWVkcmFnZ2FibGUtZXNANC4xLjFfdnVlQDMuNS40NF90eXBlc2NyaXB0QDUuMS42Xy9ub2RlX21vZHVsZXMvdnVlZHJhZ2dhYmxlLWVzL2Rpc3QvaW5kZXguZXMuanMiLCIuLi9zcmMvY29tcG9uZW50cy90b29sYmFyL2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyL2ZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlci9pbmRleC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy90b29sYmFyL2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyL2ZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlci9pbmRleC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy90b29sYmFyL2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyL2ZzLWNvbHVtbnMtZmlsdGVyLW5lc3QtbGlzdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy90b29sYmFyL2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyL2ZzLWNvbHVtbnMtZmlsdGVyLWxheW91dC1kZWZhdWx0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9idXR0b25zLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9idXR0b25zLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9pbmRleC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9zZWFyY2gvaW5kZXgudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL3NlYXJjaF92MS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9zZWFyY2gvc2VhcmNoX3YxLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9sYXlvdXQtZGVmYXVsdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9zZWFyY2gvbGF5b3V0LWRlZmF1bHQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL3RhYnMtZmlsdGVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtaWNvbi1zZWxlY3Rvci9pbmRleC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtcmFkaW8udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LXJhZGlvLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1zZWxlY3QudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy12YWx1ZXMtZm9ybWF0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtdmFsdWVzLWZvcm1hdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtY2FzY2FkZXItZm9ybWF0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1jYXNjYWRlci1mb3JtYXQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LWNhc2NhZGVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1jYXNjYWRlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtY2hlY2tib3gudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LWNoZWNrYm94LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1zd2l0Y2gudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kYXRlLWZvcm1hdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtdHJlZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtdHJlZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLXRhYmxlLXNlbGVjdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWVkaXRhYmxlLXNlbGVjdC52dWUiLCIuLi8uLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOltudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTooZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOmV8fHNlbGYpLmRheWpzX3BsdWdpbl9hZHZhbmNlZEZvcm1hdD10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIHI9dC5wcm90b3R5cGUsbj1yLmZvcm1hdDtyLmZvcm1hdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLHI9dGhpcy4kbG9jYWxlKCk7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBuLmJpbmQodGhpcykoZSk7dmFyIHM9dGhpcy4kdXRpbHMoKSxhPShlfHxcIllZWVktTU0tRERUSEg6bW06c3NaXCIpLnJlcGxhY2UoL1xcWyhbXlxcXV0rKV18UXx3b3x3d3x3fFdXfFd8enp6fHp8Z2dnZ3xHR0dHfERvfFh8eHxrezEsMn18Uy9nLChmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZVwiUVwiOnJldHVybiBNYXRoLmNlaWwoKHQuJE0rMSkvMyk7Y2FzZVwiRG9cIjpyZXR1cm4gci5vcmRpbmFsKHQuJEQpO2Nhc2VcImdnZ2dcIjpyZXR1cm4gdC53ZWVrWWVhcigpO2Nhc2VcIkdHR0dcIjpyZXR1cm4gdC5pc29XZWVrWWVhcigpO2Nhc2VcIndvXCI6cmV0dXJuIHIub3JkaW5hbCh0LndlZWsoKSxcIldcIik7Y2FzZVwid1wiOmNhc2VcInd3XCI6cmV0dXJuIHMucyh0LndlZWsoKSxcIndcIj09PWU/MToyLFwiMFwiKTtjYXNlXCJXXCI6Y2FzZVwiV1dcIjpyZXR1cm4gcy5zKHQuaXNvV2VlaygpLFwiV1wiPT09ZT8xOjIsXCIwXCIpO2Nhc2VcImtcIjpjYXNlXCJra1wiOnJldHVybiBzLnMoU3RyaW5nKDA9PT10LiRIPzI0OnQuJEgpLFwia1wiPT09ZT8xOjIsXCIwXCIpO2Nhc2VcIlhcIjpyZXR1cm4gTWF0aC5mbG9vcih0LiRkLmdldFRpbWUoKS8xZTMpO2Nhc2VcInhcIjpyZXR1cm4gdC4kZC5nZXRUaW1lKCk7Y2FzZVwielwiOnJldHVyblwiW1wiK3Qub2Zmc2V0TmFtZSgpK1wiXVwiO2Nhc2VcInp6elwiOnJldHVyblwiW1wiK3Qub2Zmc2V0TmFtZShcImxvbmdcIikrXCJdXCI7ZGVmYXVsdDpyZXR1cm4gZX19KSk7cmV0dXJuIG4uYmluZCh0aGlzKShhKX19fSkpOyIsbnVsbCwiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5kYXlqc19wbHVnaW5fd2Vla09mWWVhcj10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9XCJ3ZWVrXCIsdD1cInllYXJcIjtyZXR1cm4gZnVuY3Rpb24oaSxuLHIpe3ZhciBmPW4ucHJvdG90eXBlO2Yud2Vlaz1mdW5jdGlvbihpKXtpZih2b2lkIDA9PT1pJiYoaT1udWxsKSxudWxsIT09aSlyZXR1cm4gdGhpcy5hZGQoNyooaS10aGlzLndlZWsoKSksXCJkYXlcIik7dmFyIG49dGhpcy4kbG9jYWxlKCkueWVhclN0YXJ0fHwxO2lmKDExPT09dGhpcy5tb250aCgpJiZ0aGlzLmRhdGUoKT4yNSl7dmFyIGY9cih0aGlzKS5zdGFydE9mKHQpLmFkZCgxLHQpLmRhdGUobikscz1yKHRoaXMpLmVuZE9mKGUpO2lmKGYuaXNCZWZvcmUocykpcmV0dXJuIDF9dmFyIGE9cih0aGlzKS5zdGFydE9mKHQpLmRhdGUobikuc3RhcnRPZihlKS5zdWJ0cmFjdCgxLFwibWlsbGlzZWNvbmRcIiksbz10aGlzLmRpZmYoYSxlLCEwKTtyZXR1cm4gbzwwP3IodGhpcykuc3RhcnRPZihcIndlZWtcIikud2VlaygpOk1hdGguY2VpbChvKX0sZi53ZWVrcz1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bnVsbCksdGhpcy53ZWVrKGUpfX19KSk7IiwiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5kYXlqc19wbHVnaW5fd2Vla2RheT10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dC5wcm90b3R5cGUud2Vla2RheT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnR8fDAsaT10aGlzLiRXLG49KGk8dD9pKzc6aSktdDtyZXR1cm4gdGhpcy4kdXRpbHMoKS51KGUpP246dGhpcy5zdWJ0cmFjdChuLFwiZGF5XCIpLmFkZChlLFwiZGF5XCIpfX19KSk7IiwiIWZ1bmN0aW9uKG4sZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KG49XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczpufHxzZWxmKS5kYXlqc19wbHVnaW5fbG9jYWxlRGF0YT1lKCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGZ1bmN0aW9uKG4sZSx0KXt2YXIgcj1lLnByb3RvdHlwZSxvPWZ1bmN0aW9uKG4pe3JldHVybiBuJiYobi5pbmRleE9mP246bi5zKX0sdT1mdW5jdGlvbihuLGUsdCxyLHUpe3ZhciBpPW4ubmFtZT9uOm4uJGxvY2FsZSgpLGE9byhpW2VdKSxzPW8oaVt0XSksZj1hfHxzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIG4uc2xpY2UoMCxyKX0pKTtpZighdSlyZXR1cm4gZjt2YXIgZD1pLndlZWtTdGFydDtyZXR1cm4gZi5tYXAoKGZ1bmN0aW9uKG4sZSl7cmV0dXJuIGZbKGUrKGR8fDApKSU3XX0pKX0saT1mdW5jdGlvbigpe3JldHVybiB0LkxzW3QubG9jYWxlKCldfSxhPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG4uZm9ybWF0c1tlXXx8ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvKFxcW1teXFxdXStdKXwoTU1NTXxNTXxERHxkZGRkKS9nLChmdW5jdGlvbihuLGUsdCl7cmV0dXJuIGV8fHQuc2xpY2UoMSl9KSl9KG4uZm9ybWF0c1tlLnRvVXBwZXJDYXNlKCldKX0scz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJue21vbnRoczpmdW5jdGlvbihlKXtyZXR1cm4gZT9lLmZvcm1hdChcIk1NTU1cIik6dShuLFwibW9udGhzXCIpfSxtb250aHNTaG9ydDpmdW5jdGlvbihlKXtyZXR1cm4gZT9lLmZvcm1hdChcIk1NTVwiKTp1KG4sXCJtb250aHNTaG9ydFwiLFwibW9udGhzXCIsMyl9LGZpcnN0RGF5T2ZXZWVrOmZ1bmN0aW9uKCl7cmV0dXJuIG4uJGxvY2FsZSgpLndlZWtTdGFydHx8MH0sd2Vla2RheXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/ZS5mb3JtYXQoXCJkZGRkXCIpOnUobixcIndlZWtkYXlzXCIpfSx3ZWVrZGF5c01pbjpmdW5jdGlvbihlKXtyZXR1cm4gZT9lLmZvcm1hdChcImRkXCIpOnUobixcIndlZWtkYXlzTWluXCIsXCJ3ZWVrZGF5c1wiLDIpfSx3ZWVrZGF5c1Nob3J0OmZ1bmN0aW9uKGUpe3JldHVybiBlP2UuZm9ybWF0KFwiZGRkXCIpOnUobixcIndlZWtkYXlzU2hvcnRcIixcIndlZWtkYXlzXCIsMyl9LGxvbmdEYXRlRm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiBhKG4uJGxvY2FsZSgpLGUpfSxtZXJpZGllbTp0aGlzLiRsb2NhbGUoKS5tZXJpZGllbSxvcmRpbmFsOnRoaXMuJGxvY2FsZSgpLm9yZGluYWx9fTtyLmxvY2FsZURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gcy5iaW5kKHRoaXMpKCl9LHQubG9jYWxlRGF0YT1mdW5jdGlvbigpe3ZhciBuPWkoKTtyZXR1cm57Zmlyc3REYXlPZldlZWs6ZnVuY3Rpb24oKXtyZXR1cm4gbi53ZWVrU3RhcnR8fDB9LHdlZWtkYXlzOmZ1bmN0aW9uKCl7cmV0dXJuIHQud2Vla2RheXMoKX0sd2Vla2RheXNTaG9ydDpmdW5jdGlvbigpe3JldHVybiB0LndlZWtkYXlzU2hvcnQoKX0sd2Vla2RheXNNaW46ZnVuY3Rpb24oKXtyZXR1cm4gdC53ZWVrZGF5c01pbigpfSxtb250aHM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5tb250aHMoKX0sbW9udGhzU2hvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5tb250aHNTaG9ydCgpfSxsb25nRGF0ZUZvcm1hdDpmdW5jdGlvbihlKXtyZXR1cm4gYShuLGUpfSxtZXJpZGllbTpuLm1lcmlkaWVtLG9yZGluYWw6bi5vcmRpbmFsfX0sdC5tb250aHM9ZnVuY3Rpb24oKXtyZXR1cm4gdShpKCksXCJtb250aHNcIil9LHQubW9udGhzU2hvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdShpKCksXCJtb250aHNTaG9ydFwiLFwibW9udGhzXCIsMyl9LHQud2Vla2RheXM9ZnVuY3Rpb24obil7cmV0dXJuIHUoaSgpLFwid2Vla2RheXNcIixudWxsLG51bGwsbil9LHQud2Vla2RheXNTaG9ydD1mdW5jdGlvbihuKXtyZXR1cm4gdShpKCksXCJ3ZWVrZGF5c1Nob3J0XCIsXCJ3ZWVrZGF5c1wiLDMsbil9LHQud2Vla2RheXNNaW49ZnVuY3Rpb24obil7cmV0dXJuIHUoaSgpLFwid2Vla2RheXNNaW5cIixcIndlZWtkYXlzXCIsMixuKX19fSkpOyIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IHJlZj1cInBhZ2VSZWZcIiBjbGFzcz1cImZzLXBhZ2VcIj5cclxuICAgIDxkaXYgdi1pZj1cIiRzbG90cy5oZWFkZXIgIT0gbnVsbFwiIGNsYXNzPVwiZnMtcGFnZS1oZWFkZXJcIj5cclxuICAgICAgPHNsb3QgbmFtZT1cImhlYWRlclwiPjwvc2xvdD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdlLWNvbnRlbnRcIj5cclxuICAgICAgPHNsb3Q+PC9zbG90PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IHYtaWY9XCIkc2xvdHMuZm9vdGVyICE9IG51bGxcIiBjbGFzcz1cImZzLXBhZ2UtZm9vdGVyXCI+XHJcbiAgICAgIDxzbG90IG5hbWU9XCJmb290ZXJcIj48L3Nsb3Q+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgb25Nb3VudGVkLCByZWYsIFJlZiB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgdXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzUGFnZVwiLFxyXG4gIHNldHVwKCkge1xyXG4gICAgY29uc3QgcGFnZVJlZjogUmVmID0gcmVmKCk7XHJcbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYWdlUmVmLnZhbHVlLnBhcmVudE5vZGUpO1xyXG4gICAgICBjb25zdCBwb3NpdGlvblZhbHVlID0gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoXCJwb3NpdGlvblwiKTtcclxuICAgICAgaWYgKHBvc2l0aW9uVmFsdWUgIT09IFwicmVsYXRpdmVcIikge1xyXG4gICAgICAgIHV0aWxzLmxvZ2dlci53YXJuKFxyXG4gICAgICAgICAgXCJmcy1wYWdl54i26IqC54K555qEcG9zaXRpb27lu7rorq7kuLpyZWxhdGl2ZSzlm6DkuLpmcy1wYWdl5Li655u45a+55a6a5L2N77yIcG9zaXRpb246YWJzb2x1dGXvvInvvIzlpoLmnpzmoLflvI/msqHmnInlvILluLjvvIzkvaDlj6/ku6Xlv73nlaXmraTorablkYpcIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcGFnZVJlZlxyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuXHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtcGFnZSB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgdG9wOiAwO1xyXG4gIGJvdHRvbTogMDtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG5cclxuICAuZnMtcGFnZS1oZWFkZXIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcclxuICAgID4gLnRpdGxlIHtcclxuICAgICAgZmxleDogMTtcclxuICAgICAganVzdGlmeS1zZWxmOiBmbGV4LXN0YXJ0O1xyXG4gICAgICBwYWRkaW5nOiAxOHB4O1xyXG4gICAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgICBjb2xvcjogIzQ0NDtcclxuXHJcbiAgICAgIC5zdWIge1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgICBjb2xvcjogZ3JheTtcclxuICAgICAgICBtYXJnaW4tbGVmdDogMjBweDtcclxuICAgICAgICBmb250LXdlaWdodDogbGlnaHRlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgPiAubW9yZSB7XHJcbiAgICAgIGp1c3RpZnktc2VsZjogZmxleC1lbmQ7XHJcbiAgICAgIG1hcmdpbi1yaWdodDogMThweDtcclxuICAgICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgfVxyXG4gIH1cclxuICAuZnMtcGFnZS1jb250ZW50IHtcclxuICAgIGZsZXg6IDE7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcbn1cclxuPC9zdHlsZT5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXYgcmVmPVwicGFnZVJlZlwiIGNsYXNzPVwiZnMtcGFnZVwiPlxyXG4gICAgPGRpdiB2LWlmPVwiJHNsb3RzLmhlYWRlciAhPSBudWxsXCIgY2xhc3M9XCJmcy1wYWdlLWhlYWRlclwiPlxyXG4gICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyXCI+PC9zbG90PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImZzLXBhZ2UtY29udGVudFwiPlxyXG4gICAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgdi1pZj1cIiRzbG90cy5mb290ZXIgIT0gbnVsbFwiIGNsYXNzPVwiZnMtcGFnZS1mb290ZXJcIj5cclxuICAgICAgPHNsb3QgbmFtZT1cImZvb3RlclwiPjwvc2xvdD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBvbk1vdW50ZWQsIHJlZiwgUmVmIH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyB1dGlscyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNQYWdlXCIsXHJcbiAgc2V0dXAoKSB7XHJcbiAgICBjb25zdCBwYWdlUmVmOiBSZWYgPSByZWYoKTtcclxuICAgIG9uTW91bnRlZCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhZ2VSZWYudmFsdWUucGFyZW50Tm9kZSk7XHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uVmFsdWUgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShcInBvc2l0aW9uXCIpO1xyXG4gICAgICBpZiAocG9zaXRpb25WYWx1ZSAhPT0gXCJyZWxhdGl2ZVwiKSB7XHJcbiAgICAgICAgdXRpbHMubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgICBcImZzLXBhZ2XniLboioLngrnnmoRwb3NpdGlvbuW7uuiuruS4unJlbGF0aXZlLOWboOS4umZzLXBhZ2XkuLrnm7jlr7nlrprkvY3vvIhwb3NpdGlvbjphYnNvbHV0Ze+8ie+8jOWmguaenOagt+W8j+ayoeacieW8guW4uO+8jOS9oOWPr+S7peW/veeVpeatpOitpuWRilwiXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwYWdlUmVmXHJcbiAgICB9O1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi5mcy1wYWdlIHtcclxuICB3aWR0aDogMTAwJTtcclxuICB0b3A6IDA7XHJcbiAgYm90dG9tOiAwO1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcblxyXG4gIC5mcy1wYWdlLWhlYWRlciB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xyXG4gICAgPiAudGl0bGUge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgICBqdXN0aWZ5LXNlbGY6IGZsZXgtc3RhcnQ7XHJcbiAgICAgIHBhZGRpbmc6IDE4cHg7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICAgIGNvbG9yOiAjNDQ0O1xyXG5cclxuICAgICAgLnN1YiB7XHJcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgICAgIGNvbG9yOiBncmF5O1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiBsaWdodGVyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICA+IC5tb3JlIHtcclxuICAgICAganVzdGlmeS1zZWxmOiBmbGV4LWVuZDtcclxuICAgICAgbWFyZ2luLXJpZ2h0OiAxOHB4O1xyXG4gICAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC5mcy1wYWdlLWNvbnRlbnQge1xyXG4gICAgZmxleDogMTtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIi8qKlxuICogQG1vZHVsZSBMUlVDYWNoZVxuICovXG5jb25zdCBwZXJmID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSAnb2JqZWN0JyAmJlxuICAgIHBlcmZvcm1hbmNlICYmXG4gICAgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gcGVyZm9ybWFuY2VcbiAgICA6IERhdGU7XG5jb25zdCB3YXJuZWQgPSBuZXcgU2V0KCk7XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbmNvbnN0IFBST0NFU1MgPSAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmICEhcHJvY2VzcyA/IHByb2Nlc3MgOiB7fSk7XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbmNvbnN0IGVtaXRXYXJuaW5nID0gKG1zZywgdHlwZSwgY29kZSwgZm4pID0+IHtcbiAgICB0eXBlb2YgUFJPQ0VTUy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IFBST0NFU1MuZW1pdFdhcm5pbmcobXNnLCB0eXBlLCBjb2RlLCBmbilcbiAgICAgICAgOiBjb25zb2xlLmVycm9yKGBbJHtjb2RlfV0gJHt0eXBlfTogJHttc2d9YCk7XG59O1xubGV0IEFDID0gZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXI7XG5sZXQgQVMgPSBnbG9iYWxUaGlzLkFib3J0U2lnbmFsO1xuLyogYzggaWdub3JlIHN0YXJ0ICovXG5pZiAodHlwZW9mIEFDID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIEFTID0gY2xhc3MgQWJvcnRTaWduYWwge1xuICAgICAgICBvbmFib3J0O1xuICAgICAgICBfb25hYm9ydCA9IFtdO1xuICAgICAgICByZWFzb247XG4gICAgICAgIGFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihfLCBmbikge1xuICAgICAgICAgICAgdGhpcy5fb25hYm9ydC5wdXNoKGZuKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy9AdHMtaWdub3JlXG4gICAgQUMgPSBjbGFzcyBBYm9ydENvbnRyb2xsZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHdhcm5BQ1BvbHlmaWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsID0gbmV3IEFTKCk7XG4gICAgICAgIGFib3J0KHJlYXNvbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2lnbmFsLmFib3J0ZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLnNpZ25hbC5yZWFzb24gPSByZWFzb247XG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMuc2lnbmFsLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIHRoaXMuc2lnbmFsLl9vbmFib3J0KSB7XG4gICAgICAgICAgICAgICAgZm4ocmVhc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2lnbmFsLm9uYWJvcnQ/LihyZWFzb24pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBsZXQgcHJpbnRBQ1BvbHlmaWxsV2FybmluZyA9IFBST0NFU1MuZW52Py5MUlVfQ0FDSEVfSUdOT1JFX0FDX1dBUk5JTkcgIT09ICcxJztcbiAgICBjb25zdCB3YXJuQUNQb2x5ZmlsbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFwcmludEFDUG9seWZpbGxXYXJuaW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBwcmludEFDUG9seWZpbGxXYXJuaW5nID0gZmFsc2U7XG4gICAgICAgIGVtaXRXYXJuaW5nKCdBYm9ydENvbnRyb2xsZXIgaXMgbm90IGRlZmluZWQuIElmIHVzaW5nIGxydS1jYWNoZSBpbiAnICtcbiAgICAgICAgICAgICdub2RlIDE0LCBsb2FkIGFuIEFib3J0Q29udHJvbGxlciBwb2x5ZmlsbCBmcm9tIHRoZSAnICtcbiAgICAgICAgICAgICdgbm9kZS1hYm9ydC1jb250cm9sbGVyYCBwYWNrYWdlLiBBIG1pbmltYWwgcG9seWZpbGwgaXMgJyArXG4gICAgICAgICAgICAncHJvdmlkZWQgZm9yIHVzZSBieSBMUlVDYWNoZS5mZXRjaCgpLCBidXQgaXQgc2hvdWxkIG5vdCBiZSAnICtcbiAgICAgICAgICAgICdyZWxpZWQgdXBvbiBpbiBvdGhlciBjb250ZXh0cyAoZWcsIHBhc3NpbmcgaXQgdG8gb3RoZXIgQVBJcyB0aGF0ICcgK1xuICAgICAgICAgICAgJ3VzZSBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgbWlnaHQgaGF2ZSB1bmRlc2lyYWJsZSBlZmZlY3RzKS4gJyArXG4gICAgICAgICAgICAnWW91IG1heSBkaXNhYmxlIHRoaXMgd2l0aCBMUlVfQ0FDSEVfSUdOT1JFX0FDX1dBUk5JTkc9MSBpbiB0aGUgZW52LicsICdOT19BQk9SVF9DT05UUk9MTEVSJywgJ0VOT1RTVVAnLCB3YXJuQUNQb2x5ZmlsbCk7XG4gICAgfTtcbn1cbi8qIGM4IGlnbm9yZSBzdG9wICovXG5jb25zdCBzaG91bGRXYXJuID0gKGNvZGUpID0+ICF3YXJuZWQuaGFzKGNvZGUpO1xuY29uc3QgVFlQRSA9IFN5bWJvbCgndHlwZScpO1xuY29uc3QgaXNQb3NJbnQgPSAobikgPT4gbiAmJiBuID09PSBNYXRoLmZsb29yKG4pICYmIG4gPiAwICYmIGlzRmluaXRlKG4pO1xuLyogYzggaWdub3JlIHN0YXJ0ICovXG4vLyBUaGlzIGlzIGEgbGl0dGxlIGJpdCByaWRpY3Vsb3VzLCB0YmguXG4vLyBUaGUgbWF4aW11bSBhcnJheSBsZW5ndGggaXMgMl4zMi0xIG9yIHRoZXJlYWJvdXRzIG9uIG1vc3QgSlMgaW1wbHMuXG4vLyBBbmQgd2VsbCBiZWZvcmUgdGhhdCBwb2ludCwgeW91J3JlIGNhY2hpbmcgdGhlIGVudGlyZSB3b3JsZCwgSSBtZWFuLFxuLy8gdGhhdCdzIH4zMkdCIG9mIGp1c3QgaW50ZWdlcnMgZm9yIHRoZSBuZXh0L3ByZXYgbGlua3MsIHBsdXMgd2hhdGV2ZXJcbi8vIGVsc2UgdG8gaG9sZCB0aGF0IG1hbnkga2V5cyBhbmQgdmFsdWVzLiAgSnVzdCBmaWxsaW5nIHRoZSBtZW1vcnkgd2l0aFxuLy8gemVyb2VzIGF0IGluaXQgdGltZSBpcyBicnV0YWwgd2hlbiB5b3UgZ2V0IHRoYXQgYmlnLlxuLy8gQnV0IHdoeSBub3QgYmUgY29tcGxldGU/XG4vLyBNYXliZSBpbiB0aGUgZnV0dXJlLCB0aGVzZSBsaW1pdHMgd2lsbCBoYXZlIGV4cGFuZGVkLlxuY29uc3QgZ2V0VWludEFycmF5ID0gKG1heCkgPT4gIWlzUG9zSW50KG1heClcbiAgICA/IG51bGxcbiAgICA6IG1heCA8PSBNYXRoLnBvdygyLCA4KVxuICAgICAgICA/IFVpbnQ4QXJyYXlcbiAgICAgICAgOiBtYXggPD0gTWF0aC5wb3coMiwgMTYpXG4gICAgICAgICAgICA/IFVpbnQxNkFycmF5XG4gICAgICAgICAgICA6IG1heCA8PSBNYXRoLnBvdygyLCAzMilcbiAgICAgICAgICAgICAgICA/IFVpbnQzMkFycmF5XG4gICAgICAgICAgICAgICAgOiBtYXggPD0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICAgICAgICAgICAgICAgICAgPyBaZXJvQXJyYXlcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuLyogYzggaWdub3JlIHN0b3AgKi9cbmNsYXNzIFplcm9BcnJheSBleHRlbmRzIEFycmF5IHtcbiAgICBjb25zdHJ1Y3RvcihzaXplKSB7XG4gICAgICAgIHN1cGVyKHNpemUpO1xuICAgICAgICB0aGlzLmZpbGwoMCk7XG4gICAgfVxufVxuY2xhc3MgU3RhY2sge1xuICAgIGhlYXA7XG4gICAgbGVuZ3RoO1xuICAgIC8vIHByaXZhdGUgY29uc3RydWN0b3JcbiAgICBzdGF0aWMgI2NvbnN0cnVjdGluZyA9IGZhbHNlO1xuICAgIHN0YXRpYyBjcmVhdGUobWF4KSB7XG4gICAgICAgIGNvbnN0IEhlYXBDbHMgPSBnZXRVaW50QXJyYXkobWF4KTtcbiAgICAgICAgaWYgKCFIZWFwQ2xzKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICBTdGFjay4jY29uc3RydWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcyA9IG5ldyBTdGFjayhtYXgsIEhlYXBDbHMpO1xuICAgICAgICBTdGFjay4jY29uc3RydWN0aW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihtYXgsIEhlYXBDbHMpIHtcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICghU3RhY2suI2NvbnN0cnVjdGluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5zdGFudGlhdGUgU3RhY2sgdXNpbmcgU3RhY2suY3JlYXRlKG4pJyk7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgdGhpcy5oZWFwID0gbmV3IEhlYXBDbHMobWF4KTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICBwdXNoKG4pIHtcbiAgICAgICAgdGhpcy5oZWFwW3RoaXMubGVuZ3RoKytdID0gbjtcbiAgICB9XG4gICAgcG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFwWy0tdGhpcy5sZW5ndGhdO1xuICAgIH1cbn1cbi8qKlxuICogRGVmYXVsdCBleHBvcnQsIHRoZSB0aGluZyB5b3UncmUgdXNpbmcgdGhpcyBtb2R1bGUgdG8gZ2V0LlxuICpcbiAqIFRoZSBgS2AgYW5kIGBWYCB0eXBlcyBkZWZpbmUgdGhlIGtleSBhbmQgdmFsdWUgdHlwZXMsIHJlc3BlY3RpdmVseS4gVGhlXG4gKiBvcHRpb25hbCBgRkNgIHR5cGUgZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgYGNvbnRleHRgIG9iamVjdCBwYXNzZWQgdG9cbiAqIGBjYWNoZS5mZXRjaCgpYCBhbmQgYGNhY2hlLm1lbW8oKWAuXG4gKlxuICogS2V5cyBhbmQgdmFsdWVzICoqbXVzdCBub3QqKiBiZSBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgb3B0aW9ucyBvYmplY3QgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBgbWF4YCxcbiAqIGBtYXhTaXplYCwgYGZldGNoTWV0aG9kYCwgYG1lbW9NZXRob2RgLCBgZGlzcG9zZWAgYW5kIGBkaXNwb3NlQWZ0ZXJgKSBhcmVcbiAqIGFkZGVkIGFzIG5vcm1hbCBwdWJsaWMgbWVtYmVycy4gKFRoZSBsaXN0ZWQgb3B0aW9ucyBhcmUgcmVhZC1vbmx5IGdldHRlcnMuKVxuICpcbiAqIENoYW5naW5nIGFueSBvZiB0aGVzZSB3aWxsIGFsdGVyIHRoZSBkZWZhdWx0cyBmb3Igc3Vic2VxdWVudCBtZXRob2QgY2FsbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZSB7XG4gICAgLy8gb3B0aW9ucyB0aGF0IGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgZGlzYXN0ZXJcbiAgICAjbWF4O1xuICAgICNtYXhTaXplO1xuICAgICNkaXNwb3NlO1xuICAgICNkaXNwb3NlQWZ0ZXI7XG4gICAgI2ZldGNoTWV0aG9kO1xuICAgICNtZW1vTWV0aG9kO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS50dGx9XG4gICAgICovXG4gICAgdHRsO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS50dGxSZXNvbHV0aW9ufVxuICAgICAqL1xuICAgIHR0bFJlc29sdXRpb247XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnR0bEF1dG9wdXJnZX1cbiAgICAgKi9cbiAgICB0dGxBdXRvcHVyZ2U7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnVwZGF0ZUFnZU9uR2V0fVxuICAgICAqL1xuICAgIHVwZGF0ZUFnZU9uR2V0O1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkhhc31cbiAgICAgKi9cbiAgICB1cGRhdGVBZ2VPbkhhcztcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZX1cbiAgICAgKi9cbiAgICBhbGxvd1N0YWxlO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5ub0Rpc3Bvc2VPblNldH1cbiAgICAgKi9cbiAgICBub0Rpc3Bvc2VPblNldDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9VcGRhdGVUVEx9XG4gICAgICovXG4gICAgbm9VcGRhdGVUVEw7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm1heEVudHJ5U2l6ZX1cbiAgICAgKi9cbiAgICBtYXhFbnRyeVNpemU7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnNpemVDYWxjdWxhdGlvbn1cbiAgICAgKi9cbiAgICBzaXplQ2FsY3VsYXRpb247XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbn1cbiAgICAgKi9cbiAgICBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vRGVsZXRlT25TdGFsZUdldH1cbiAgICAgKi9cbiAgICBub0RlbGV0ZU9uU3RhbGVHZXQ7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGVPbkZldGNoQWJvcnR9XG4gICAgICovXG4gICAgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb259XG4gICAgICovXG4gICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmlnbm9yZUZldGNoQWJvcnR9XG4gICAgICovXG4gICAgaWdub3JlRmV0Y2hBYm9ydDtcbiAgICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzXG4gICAgI3NpemU7XG4gICAgI2NhbGN1bGF0ZWRTaXplO1xuICAgICNrZXlNYXA7XG4gICAgI2tleUxpc3Q7XG4gICAgI3ZhbExpc3Q7XG4gICAgI25leHQ7XG4gICAgI3ByZXY7XG4gICAgI2hlYWQ7XG4gICAgI3RhaWw7XG4gICAgI2ZyZWU7XG4gICAgI2Rpc3Bvc2VkO1xuICAgICNzaXplcztcbiAgICAjc3RhcnRzO1xuICAgICN0dGxzO1xuICAgICNoYXNEaXNwb3NlO1xuICAgICNoYXNGZXRjaE1ldGhvZDtcbiAgICAjaGFzRGlzcG9zZUFmdGVyO1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIHVubGVzcyB5b3UgbmVlZCB0byBpbnNwZWN0IHRoZVxuICAgICAqIGlubmVyIHdvcmtpbmdzIG9mIHRoZSBjYWNoZS4gIElmIGFueXRoaW5nIHJldHVybmVkIGJ5IHRoaXNcbiAgICAgKiBvYmplY3QgaXMgbW9kaWZpZWQgaW4gYW55IHdheSwgc3RyYW5nZSBicmVha2FnZSBtYXkgb2NjdXIuXG4gICAgICpcbiAgICAgKiBUaGVzZSBmaWVsZHMgYXJlIHByaXZhdGUgZm9yIGEgcmVhc29uIVxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc3RhdGljIHVuc2FmZUV4cG9zZUludGVybmFscyhjKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBzdGFydHM6IGMuI3N0YXJ0cyxcbiAgICAgICAgICAgIHR0bHM6IGMuI3R0bHMsXG4gICAgICAgICAgICBzaXplczogYy4jc2l6ZXMsXG4gICAgICAgICAgICBrZXlNYXA6IGMuI2tleU1hcCxcbiAgICAgICAgICAgIGtleUxpc3Q6IGMuI2tleUxpc3QsXG4gICAgICAgICAgICB2YWxMaXN0OiBjLiN2YWxMaXN0LFxuICAgICAgICAgICAgbmV4dDogYy4jbmV4dCxcbiAgICAgICAgICAgIHByZXY6IGMuI3ByZXYsXG4gICAgICAgICAgICBnZXQgaGVhZCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYy4jaGVhZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgdGFpbCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYy4jdGFpbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmcmVlOiBjLiNmcmVlLFxuICAgICAgICAgICAgLy8gbWV0aG9kc1xuICAgICAgICAgICAgaXNCYWNrZ3JvdW5kRmV0Y2g6IChwKSA9PiBjLiNpc0JhY2tncm91bmRGZXRjaChwKSxcbiAgICAgICAgICAgIGJhY2tncm91bmRGZXRjaDogKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KSA9PiBjLiNiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpLFxuICAgICAgICAgICAgbW92ZVRvVGFpbDogKGluZGV4KSA9PiBjLiNtb3ZlVG9UYWlsKGluZGV4KSxcbiAgICAgICAgICAgIGluZGV4ZXM6IChvcHRpb25zKSA9PiBjLiNpbmRleGVzKG9wdGlvbnMpLFxuICAgICAgICAgICAgcmluZGV4ZXM6IChvcHRpb25zKSA9PiBjLiNyaW5kZXhlcyhvcHRpb25zKSxcbiAgICAgICAgICAgIGlzU3RhbGU6IChpbmRleCkgPT4gYy4jaXNTdGFsZShpbmRleCksXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIFByb3RlY3RlZCByZWFkLW9ubHkgbWVtYmVyc1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5tYXh9IChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IG1heCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21heDtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm1heFNpemV9IChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IG1heFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNtYXhTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY29tcHV0ZWQgc2l6ZSBvZiBpdGVtcyBpbiB0aGUgY2FjaGUgKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgY2FsY3VsYXRlZFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWxjdWxhdGVkU2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBpdGVtcyBzdG9yZWQgaW4gdGhlIGNhY2hlIChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IGZldGNoTWV0aG9kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmV0Y2hNZXRob2Q7XG4gICAgfVxuICAgIGdldCBtZW1vTWV0aG9kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWVtb01ldGhvZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmRpc3Bvc2V9IChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IGRpc3Bvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkaXNwb3NlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZGlzcG9zZUFmdGVyfSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBkaXNwb3NlQWZ0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkaXNwb3NlQWZ0ZXI7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBtYXggPSAwLCB0dGwsIHR0bFJlc29sdXRpb24gPSAxLCB0dGxBdXRvcHVyZ2UsIHVwZGF0ZUFnZU9uR2V0LCB1cGRhdGVBZ2VPbkhhcywgYWxsb3dTdGFsZSwgZGlzcG9zZSwgZGlzcG9zZUFmdGVyLCBub0Rpc3Bvc2VPblNldCwgbm9VcGRhdGVUVEwsIG1heFNpemUgPSAwLCBtYXhFbnRyeVNpemUgPSAwLCBzaXplQ2FsY3VsYXRpb24sIGZldGNoTWV0aG9kLCBtZW1vTWV0aG9kLCBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sIG5vRGVsZXRlT25TdGFsZUdldCwgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sIGFsbG93U3RhbGVPbkZldGNoQWJvcnQsIGlnbm9yZUZldGNoQWJvcnQsIH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAobWF4ICE9PSAwICYmICFpc1Bvc0ludChtYXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXggb3B0aW9uIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgVWludEFycmF5ID0gbWF4ID8gZ2V0VWludEFycmF5KG1heCkgOiBBcnJheTtcbiAgICAgICAgaWYgKCFVaW50QXJyYXkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtYXggdmFsdWU6ICcgKyBtYXgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI21heCA9IG1heDtcbiAgICAgICAgdGhpcy4jbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgICAgIHRoaXMubWF4RW50cnlTaXplID0gbWF4RW50cnlTaXplIHx8IHRoaXMuI21heFNpemU7XG4gICAgICAgIHRoaXMuc2l6ZUNhbGN1bGF0aW9uID0gc2l6ZUNhbGN1bGF0aW9uO1xuICAgICAgICBpZiAodGhpcy5zaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4jbWF4U2l6ZSAmJiAhdGhpcy5tYXhFbnRyeVNpemUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gc2V0IHRvIG5vbi1mdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtZW1vTWV0aG9kICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBtZW1vTWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtZW1vTWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiBpZiBkZWZpbmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jbWVtb01ldGhvZCA9IG1lbW9NZXRob2Q7XG4gICAgICAgIGlmIChmZXRjaE1ldGhvZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2YgZmV0Y2hNZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZldGNoTWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiBpZiBzcGVjaWZpZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmZXRjaE1ldGhvZCA9IGZldGNoTWV0aG9kO1xuICAgICAgICB0aGlzLiNoYXNGZXRjaE1ldGhvZCA9ICEhZmV0Y2hNZXRob2Q7XG4gICAgICAgIHRoaXMuI2tleU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy4ja2V5TGlzdCA9IG5ldyBBcnJheShtYXgpLmZpbGwodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy4jdmFsTGlzdCA9IG5ldyBBcnJheShtYXgpLmZpbGwodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy4jbmV4dCA9IG5ldyBVaW50QXJyYXkobWF4KTtcbiAgICAgICAgdGhpcy4jcHJldiA9IG5ldyBVaW50QXJyYXkobWF4KTtcbiAgICAgICAgdGhpcy4jaGVhZCA9IDA7XG4gICAgICAgIHRoaXMuI3RhaWwgPSAwO1xuICAgICAgICB0aGlzLiNmcmVlID0gU3RhY2suY3JlYXRlKG1heCk7XG4gICAgICAgIHRoaXMuI3NpemUgPSAwO1xuICAgICAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSA9IDA7XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy4jZGlzcG9zZSA9IGRpc3Bvc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlQWZ0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlciA9IGRpc3Bvc2VBZnRlcjtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNoYXNEaXNwb3NlID0gISF0aGlzLiNkaXNwb3NlO1xuICAgICAgICB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgPSAhIXRoaXMuI2Rpc3Bvc2VBZnRlcjtcbiAgICAgICAgdGhpcy5ub0Rpc3Bvc2VPblNldCA9ICEhbm9EaXNwb3NlT25TZXQ7XG4gICAgICAgIHRoaXMubm9VcGRhdGVUVEwgPSAhIW5vVXBkYXRlVFRMO1xuICAgICAgICB0aGlzLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiA9ICEhbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uO1xuICAgICAgICB0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uID0gISFhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbjtcbiAgICAgICAgdGhpcy5hbGxvd1N0YWxlT25GZXRjaEFib3J0ID0gISFhbGxvd1N0YWxlT25GZXRjaEFib3J0O1xuICAgICAgICB0aGlzLmlnbm9yZUZldGNoQWJvcnQgPSAhIWlnbm9yZUZldGNoQWJvcnQ7XG4gICAgICAgIC8vIE5COiBtYXhFbnRyeVNpemUgaXMgc2V0IHRvIG1heFNpemUgaWYgaXQncyBzZXRcbiAgICAgICAgaWYgKHRoaXMubWF4RW50cnlTaXplICE9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jbWF4U2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICghaXNQb3NJbnQodGhpcy4jbWF4U2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4U2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUG9zSW50KHRoaXMubWF4RW50cnlTaXplKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heEVudHJ5U2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVTaXplVHJhY2tpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbG93U3RhbGUgPSAhIWFsbG93U3RhbGU7XG4gICAgICAgIHRoaXMubm9EZWxldGVPblN0YWxlR2V0ID0gISFub0RlbGV0ZU9uU3RhbGVHZXQ7XG4gICAgICAgIHRoaXMudXBkYXRlQWdlT25HZXQgPSAhIXVwZGF0ZUFnZU9uR2V0O1xuICAgICAgICB0aGlzLnVwZGF0ZUFnZU9uSGFzID0gISF1cGRhdGVBZ2VPbkhhcztcbiAgICAgICAgdGhpcy50dGxSZXNvbHV0aW9uID1cbiAgICAgICAgICAgIGlzUG9zSW50KHR0bFJlc29sdXRpb24pIHx8IHR0bFJlc29sdXRpb24gPT09IDBcbiAgICAgICAgICAgICAgICA/IHR0bFJlc29sdXRpb25cbiAgICAgICAgICAgICAgICA6IDE7XG4gICAgICAgIHRoaXMudHRsQXV0b3B1cmdlID0gISF0dGxBdXRvcHVyZ2U7XG4gICAgICAgIHRoaXMudHRsID0gdHRsIHx8IDA7XG4gICAgICAgIGlmICh0aGlzLnR0bCkge1xuICAgICAgICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLnR0bCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0dGwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNpbml0aWFsaXplVFRMVHJhY2tpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkbyBub3QgYWxsb3cgY29tcGxldGVseSB1bmJvdW5kZWQgY2FjaGVzXG4gICAgICAgIGlmICh0aGlzLiNtYXggPT09IDAgJiYgdGhpcy50dGwgPT09IDAgJiYgdGhpcy4jbWF4U2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXQgbGVhc3Qgb25lIG9mIG1heCwgbWF4U2l6ZSwgb3IgdHRsIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnR0bEF1dG9wdXJnZSAmJiAhdGhpcy4jbWF4ICYmICF0aGlzLiNtYXhTaXplKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gJ0xSVV9DQUNIRV9VTkJPVU5ERUQnO1xuICAgICAgICAgICAgaWYgKHNob3VsZFdhcm4oY29kZSkpIHtcbiAgICAgICAgICAgICAgICB3YXJuZWQuYWRkKGNvZGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdUVEwgY2FjaGluZyB3aXRob3V0IHR0bEF1dG9wdXJnZSwgbWF4LCBvciBtYXhTaXplIGNhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCBpbiB1bmJvdW5kZWQgbWVtb3J5IGNvbnN1bXB0aW9uLic7XG4gICAgICAgICAgICAgICAgZW1pdFdhcm5pbmcobXNnLCAnVW5ib3VuZGVkQ2FjaGVXYXJuaW5nJywgY29kZSwgTFJVQ2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG1zIGxlZnQgaW4gdGhlIGl0ZW0ncyBUVEwuIElmIGl0ZW0gaXMgbm90IGluIGNhY2hlLFxuICAgICAqIHJldHVybnMgYDBgLiBSZXR1cm5zIGBJbmZpbml0eWAgaWYgaXRlbSBpcyBpbiBjYWNoZSB3aXRob3V0IGEgZGVmaW5lZCBUVEwuXG4gICAgICovXG4gICAgZ2V0UmVtYWluaW5nVFRMKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy4ja2V5TWFwLmhhcyhrZXkpID8gSW5maW5pdHkgOiAwO1xuICAgIH1cbiAgICAjaW5pdGlhbGl6ZVRUTFRyYWNraW5nKCkge1xuICAgICAgICBjb25zdCB0dGxzID0gbmV3IFplcm9BcnJheSh0aGlzLiNtYXgpO1xuICAgICAgICBjb25zdCBzdGFydHMgPSBuZXcgWmVyb0FycmF5KHRoaXMuI21heCk7XG4gICAgICAgIHRoaXMuI3R0bHMgPSB0dGxzO1xuICAgICAgICB0aGlzLiNzdGFydHMgPSBzdGFydHM7XG4gICAgICAgIHRoaXMuI3NldEl0ZW1UVEwgPSAoaW5kZXgsIHR0bCwgc3RhcnQgPSBwZXJmLm5vdygpKSA9PiB7XG4gICAgICAgICAgICBzdGFydHNbaW5kZXhdID0gdHRsICE9PSAwID8gc3RhcnQgOiAwO1xuICAgICAgICAgICAgdHRsc1tpbmRleF0gPSB0dGw7XG4gICAgICAgICAgICBpZiAodHRsICE9PSAwICYmIHRoaXMudHRsQXV0b3B1cmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZSh0aGlzLiNrZXlMaXN0W2luZGV4XSwgJ2V4cGlyZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgdHRsICsgMSk7XG4gICAgICAgICAgICAgICAgLy8gdW5yZWYoKSBub3Qgc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXNcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICBpZiAodC51bnJlZikge1xuICAgICAgICAgICAgICAgICAgICB0LnVucmVmKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UgPSBpbmRleCA9PiB7XG4gICAgICAgICAgICBzdGFydHNbaW5kZXhdID0gdHRsc1tpbmRleF0gIT09IDAgPyBwZXJmLm5vdygpIDogMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3RhdHVzVFRMID0gKHN0YXR1cywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICh0dGxzW2luZGV4XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR0bCA9IHR0bHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgICAgIGlmICghdHRsIHx8ICFzdGFydClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHN0YXR1cy50dGwgPSB0dGw7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgc3RhdHVzLm5vdyA9IGNhY2hlZE5vdyB8fCBnZXROb3coKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZ2UgPSBzdGF0dXMubm93IC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnJlbWFpbmluZ1RUTCA9IHR0bCAtIGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gZGVib3VuY2UgY2FsbHMgdG8gcGVyZi5ub3coKSB0byAxcyBzbyB3ZSdyZSBub3QgaGl0dGluZ1xuICAgICAgICAvLyB0aGF0IGNvc3RseSBjYWxsIHJlcGVhdGVkbHkuXG4gICAgICAgIGxldCBjYWNoZWROb3cgPSAwO1xuICAgICAgICBjb25zdCBnZXROb3cgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gcGVyZi5ub3coKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnR0bFJlc29sdXRpb24gPiAwKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVkTm93ID0gbjtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiAoY2FjaGVkTm93ID0gMCksIHRoaXMudHRsUmVzb2x1dGlvbik7XG4gICAgICAgICAgICAgICAgLy8gbm90IGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zXG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICAgICAgaWYgKHQudW5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdC51bnJlZigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2V0UmVtYWluaW5nVFRMID0ga2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHR0bCA9IHR0bHNbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKCF0dGwgfHwgIXN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWdlID0gKGNhY2hlZE5vdyB8fCBnZXROb3coKSkgLSBzdGFydDtcbiAgICAgICAgICAgIHJldHVybiB0dGwgLSBhZ2U7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI2lzU3RhbGUgPSBpbmRleCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gc3RhcnRzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0dGxzW2luZGV4XTtcbiAgICAgICAgICAgIHJldHVybiAhIXQgJiYgISFzICYmIChjYWNoZWROb3cgfHwgZ2V0Tm93KCkpIC0gcyA+IHQ7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIGNvbmRpdGlvbmFsbHkgc2V0IHByaXZhdGUgbWV0aG9kcyByZWxhdGVkIHRvIFRUTFxuICAgICN1cGRhdGVJdGVtQWdlID0gKCkgPT4geyB9O1xuICAgICNzdGF0dXNUVEwgPSAoKSA9PiB7IH07XG4gICAgI3NldEl0ZW1UVEwgPSAoKSA9PiB7IH07XG4gICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAjaXNTdGFsZSA9ICgpID0+IGZhbHNlO1xuICAgICNpbml0aWFsaXplU2l6ZVRyYWNraW5nKCkge1xuICAgICAgICBjb25zdCBzaXplcyA9IG5ldyBaZXJvQXJyYXkodGhpcy4jbWF4KTtcbiAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgPSAwO1xuICAgICAgICB0aGlzLiNzaXplcyA9IHNpemVzO1xuICAgICAgICB0aGlzLiNyZW1vdmVJdGVtU2l6ZSA9IGluZGV4ID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplIC09IHNpemVzW2luZGV4XTtcbiAgICAgICAgICAgIHNpemVzW2luZGV4XSA9IDA7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3JlcXVpcmVTaXplID0gKGssIHYsIHNpemUsIHNpemVDYWxjdWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgLy8gcHJvdmlzaW9uYWxseSBhY2NlcHQgYmFja2dyb3VuZCBmZXRjaGVzLlxuICAgICAgICAgICAgLy8gYWN0dWFsIHZhbHVlIHNpemUgd2lsbCBiZSBjaGVja2VkIHdoZW4gdGhleSByZXR1cm4uXG4gICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZUNhbGN1bGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2l6ZUNhbGN1bGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemVDYWxjdWxhdGlvbih2LCBrKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1Bvc0ludChzaXplKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZUNhbGN1bGF0aW9uIHJldHVybiBpbnZhbGlkIChleHBlY3QgcG9zaXRpdmUgaW50ZWdlciknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBzaXplIHZhbHVlIChtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIpLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdXaGVuIG1heFNpemUgb3IgbWF4RW50cnlTaXplIGlzIHVzZWQsIHNpemVDYWxjdWxhdGlvbiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdvciBzaXplIG11c3QgYmUgc2V0LicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNhZGRJdGVtU2l6ZSA9IChpbmRleCwgc2l6ZSwgc3RhdHVzKSA9PiB7XG4gICAgICAgICAgICBzaXplc1tpbmRleF0gPSBzaXplO1xuICAgICAgICAgICAgaWYgKHRoaXMuI21heFNpemUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhTaXplID0gdGhpcy4jbWF4U2l6ZSAtIHNpemVzW2luZGV4XTtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy4jY2FsY3VsYXRlZFNpemUgPiBtYXhTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2V2aWN0KHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplICs9IHNpemVzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZW50cnlTaXplID0gc2l6ZTtcbiAgICAgICAgICAgICAgICBzdGF0dXMudG90YWxDYWxjdWxhdGVkU2l6ZSA9IHRoaXMuI2NhbGN1bGF0ZWRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAjcmVtb3ZlSXRlbVNpemUgPSBfaSA9PiB7IH07XG4gICAgI2FkZEl0ZW1TaXplID0gKF9pLCBfcywgX3N0KSA9PiB7IH07XG4gICAgI3JlcXVpcmVTaXplID0gKF9rLCBfdiwgc2l6ZSwgc2l6ZUNhbGN1bGF0aW9uKSA9PiB7XG4gICAgICAgIGlmIChzaXplIHx8IHNpemVDYWxjdWxhdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2Fubm90IHNldCBzaXplIHdpdGhvdXQgc2V0dGluZyBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZSBvbiBjYWNoZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH07XG4gICAgKiNpbmRleGVzKHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuI3NpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLiN0YWlsOyB0cnVlOykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy4jaXNWYWxpZEluZGV4KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dTdGFsZSB8fCAhdGhpcy4jaXNTdGFsZShpKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gdGhpcy4jaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNwcmV2W2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAqI3JpbmRleGVzKHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuI3NpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLiNoZWFkOyB0cnVlOykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy4jaXNWYWxpZEluZGV4KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dTdGFsZSB8fCAhdGhpcy4jaXNTdGFsZShpKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gdGhpcy4jdGFpbCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNuZXh0W2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAjaXNWYWxpZEluZGV4KGluZGV4KSB7XG4gICAgICAgIHJldHVybiAoaW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdGhpcy4ja2V5TWFwLmdldCh0aGlzLiNrZXlMaXN0W2luZGV4XSkgPT09IGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIGBba2V5LCB2YWx1ZV1gIHBhaXJzLFxuICAgICAqIGluIG9yZGVyIGZyb20gbW9zdCByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKmVudHJpZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiN2YWxMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLiNrZXlMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBbdGhpcy4ja2V5TGlzdFtpXSwgdGhpcy4jdmFsTGlzdFtpXV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52ZXJzZSBvcmRlciB2ZXJzaW9uIG9mIHtAbGluayBMUlVDYWNoZS5lbnRyaWVzfVxuICAgICAqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIGBba2V5LCB2YWx1ZV1gIHBhaXJzLFxuICAgICAqIGluIG9yZGVyIGZyb20gbGVhc3QgcmVjZW50bHkgdXNlZCB0byBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKnJlbnRyaWVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbExpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIFt0aGlzLiNrZXlMaXN0W2ldLCB0aGlzLiN2YWxMaXN0W2ldXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIGtleXMgaW4gdGhlIGNhY2hlLFxuICAgICAqIGluIG9yZGVyIGZyb20gbW9zdCByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKmtleXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSB0aGlzLiNrZXlMaXN0W2ldO1xuICAgICAgICAgICAgaWYgKGsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52ZXJzZSBvcmRlciB2ZXJzaW9uIG9mIHtAbGluayBMUlVDYWNoZS5rZXlzfVxuICAgICAqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSBrZXlzIGluIHRoZSBjYWNoZSxcbiAgICAgKiBpbiBvcmRlciBmcm9tIGxlYXN0IHJlY2VudGx5IHVzZWQgdG8gbW9zdCByZWNlbnRseSB1c2VkLlxuICAgICAqL1xuICAgICpya2V5cygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI3JpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSB0aGlzLiNrZXlMaXN0W2ldO1xuICAgICAgICAgICAgaWYgKGsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSB2YWx1ZXMgaW4gdGhlIGNhY2hlLFxuICAgICAqIGluIG9yZGVyIGZyb20gbW9zdCByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKnZhbHVlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZlcnNlIG9yZGVyIHZlcnNpb24gb2Yge0BsaW5rIExSVUNhY2hlLnZhbHVlc31cbiAgICAgKlxuICAgICAqIFJldHVybiBhIGdlbmVyYXRvciB5aWVsZGluZyB0aGUgdmFsdWVzIGluIHRoZSBjYWNoZSxcbiAgICAgKiBpbiBvcmRlciBmcm9tIGxlYXN0IHJlY2VudGx5IHVzZWQgdG8gbW9zdCByZWNlbnRseSB1c2VkLlxuICAgICAqL1xuICAgICpydmFsdWVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRpbmcgb3ZlciB0aGUgY2FjaGUgaXRzZWxmIHlpZWxkcyB0aGUgc2FtZSByZXN1bHRzIGFzXG4gICAgICoge0BsaW5rIExSVUNhY2hlLmVudHJpZXN9XG4gICAgICovXG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBTdHJpbmcgdmFsdWUgdGhhdCBpcyB1c2VkIGluIHRoZSBjcmVhdGlvbiBvZiB0aGUgZGVmYXVsdCBzdHJpbmdcbiAgICAgKiBkZXNjcmlwdGlvbiBvZiBhbiBvYmplY3QuIENhbGxlZCBieSB0aGUgYnVpbHQtaW4gbWV0aG9kXG4gICAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgICAqL1xuICAgIFtTeW1ib2wudG9TdHJpbmdUYWddID0gJ0xSVUNhY2hlJztcbiAgICAvKipcbiAgICAgKiBGaW5kIGEgdmFsdWUgZm9yIHdoaWNoIHRoZSBzdXBwbGllZCBmbiBtZXRob2QgcmV0dXJucyBhIHRydXRoeSB2YWx1ZSxcbiAgICAgKiBzaW1pbGFyIHRvIGBBcnJheS5maW5kKClgLiBmbiBpcyBjYWxsZWQgYXMgYGZuKHZhbHVlLCBrZXksIGNhY2hlKWAuXG4gICAgICovXG4gICAgZmluZChmbiwgZ2V0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGZuKHZhbHVlLCB0aGlzLiNrZXlMaXN0W2ldLCB0aGlzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldCh0aGlzLiNrZXlMaXN0W2ldLCBnZXRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBzdXBwbGllZCBmdW5jdGlvbiBvbiBlYWNoIGl0ZW0gaW4gdGhlIGNhY2hlLCBpbiBvcmRlciBmcm9tIG1vc3RcbiAgICAgKiByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAgICpcbiAgICAgKiBgZm5gIGlzIGNhbGxlZCBhcyBgZm4odmFsdWUsIGtleSwgY2FjaGUpYC5cbiAgICAgKlxuICAgICAqIElmIGB0aGlzcGAgaXMgcHJvdmlkZWQsIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBgdGhpc2AtY29udGV4dCBvZlxuICAgICAqIHRoZSBwcm92aWRlZCBvYmplY3QsIG9yIHRoZSBjYWNoZSBpZiBubyBgdGhpc3BgIG9iamVjdCBpcyBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIERvZXMgbm90IHVwZGF0ZSBhZ2Ugb3IgcmVjZW50eSBvZiB1c2UsIG9yIGl0ZXJhdGUgb3ZlciBzdGFsZSB2YWx1ZXMuXG4gICAgICovXG4gICAgZm9yRWFjaChmbiwgdGhpc3AgPSB0aGlzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzcCwgdmFsdWUsIHRoaXMuI2tleUxpc3RbaV0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIHtAbGluayBMUlVDYWNoZS5mb3JFYWNofSBidXQgaXRlbXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW5cbiAgICAgKiByZXZlcnNlIG9yZGVyLiAgKGllLCBsZXNzIHJlY2VudGx5IHVzZWQgaXRlbXMgYXJlIGl0ZXJhdGVkIG92ZXIgZmlyc3QuKVxuICAgICAqL1xuICAgIHJmb3JFYWNoKGZuLCB0aGlzcCA9IHRoaXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI3JpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzcCwgdmFsdWUsIHRoaXMuI2tleUxpc3RbaV0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhbnkgc3RhbGUgZW50cmllcy4gUmV0dXJucyB0cnVlIGlmIGFueXRoaW5nIHdhcyByZW1vdmVkLFxuICAgICAqIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdXJnZVN0YWxlKCkge1xuICAgICAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaXNTdGFsZShpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZSh0aGlzLiNrZXlMaXN0W2ldLCAnZXhwaXJlJyk7XG4gICAgICAgICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZXh0ZW5kZWQgaW5mbyBhYm91dCBhIGdpdmVuIGVudHJ5LCB0byBnZXQgaXRzIHZhbHVlLCBzaXplLCBhbmRcbiAgICAgKiBUVEwgaW5mbyBzaW11bHRhbmVvdXNseS4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50LlxuICAgICAqXG4gICAgICogVW5saWtlIHtAbGluayBMUlVDYWNoZSNkdW1wfSwgd2hpY2ggaXMgZGVzaWduZWQgdG8gYmUgcG9ydGFibGUgYW5kIHN1cnZpdmVcbiAgICAgKiBzZXJpYWxpemF0aW9uLCB0aGUgYHN0YXJ0YCB2YWx1ZSBpcyBhbHdheXMgdGhlIGN1cnJlbnQgdGltZXN0YW1wLCBhbmQgdGhlXG4gICAgICogYHR0bGAgaXMgYSBjYWxjdWxhdGVkIHJlbWFpbmluZyB0aW1lIHRvIGxpdmUgKG5lZ2F0aXZlIGlmIGV4cGlyZWQpLlxuICAgICAqXG4gICAgICogQWx3YXlzIHJldHVybnMgc3RhbGUgdmFsdWVzLCBpZiB0aGVpciBpbmZvIGlzIGZvdW5kIGluIHRoZSBjYWNoZSwgc28gYmVcbiAgICAgKiBzdXJlIHRvIGNoZWNrIGZvciBleHBpcmF0aW9ucyAoaWUsIGEgbmVnYXRpdmUge0BsaW5rIExSVUNhY2hlLkVudHJ5I3R0bH0pXG4gICAgICogaWYgcmVsZXZhbnQuXG4gICAgICovXG4gICAgaW5mbyhrZXkpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuI2tleU1hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgIDogdjtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHsgdmFsdWUgfTtcbiAgICAgICAgaWYgKHRoaXMuI3R0bHMgJiYgdGhpcy4jc3RhcnRzKSB7XG4gICAgICAgICAgICBjb25zdCB0dGwgPSB0aGlzLiN0dGxzW2ldO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLiNzdGFydHNbaV07XG4gICAgICAgICAgICBpZiAodHRsICYmIHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtYWluID0gdHRsIC0gKHBlcmYubm93KCkgLSBzdGFydCk7XG4gICAgICAgICAgICAgICAgZW50cnkudHRsID0gcmVtYWluO1xuICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc2l6ZXMpIHtcbiAgICAgICAgICAgIGVudHJ5LnNpemUgPSB0aGlzLiNzaXplc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhcnJheSBvZiBba2V5LCB7QGxpbmsgTFJVQ2FjaGUuRW50cnl9XSB0dXBsZXMgd2hpY2ggY2FuIGJlXG4gICAgICogcGFzc2VkIHRvIHtAbGluayBMUkxVQ2FjaGUjbG9hZH0uXG4gICAgICpcbiAgICAgKiBUaGUgYHN0YXJ0YCBmaWVsZHMgYXJlIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gYSBwb3J0YWJsZSBgRGF0ZS5ub3coKWBcbiAgICAgKiB0aW1lc3RhbXAsIGV2ZW4gaWYgYHBlcmZvcm1hbmNlLm5vdygpYCBpcyBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBTdGFsZSBlbnRyaWVzIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIGBkdW1wYCwgZXZlbiBpZlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlfSBpcyBmYWxzZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IHRoaXMgcmV0dXJucyBhbiBhY3R1YWwgYXJyYXksIG5vdCBhIGdlbmVyYXRvciwgc28gaXQgY2FuIGJlIG1vcmVcbiAgICAgKiBlYXNpbHkgcGFzc2VkIGFyb3VuZC5cbiAgICAgKi9cbiAgICBkdW1wKCkge1xuICAgICAgICBjb25zdCBhcnIgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLiNrZXlMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwga2V5ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHsgdmFsdWUgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLiN0dGxzICYmIHRoaXMuI3N0YXJ0cykge1xuICAgICAgICAgICAgICAgIGVudHJ5LnR0bCA9IHRoaXMuI3R0bHNbaV07XG4gICAgICAgICAgICAgICAgLy8gYWx3YXlzIGR1bXAgdGhlIHN0YXJ0IHJlbGF0aXZlIHRvIGEgcG9ydGFibGUgdGltZXN0YW1wXG4gICAgICAgICAgICAgICAgLy8gaXQncyBvayBmb3IgdGhpcyB0byBiZSBhIGJpdCBzbG93LCBpdCdzIGEgcmFyZSBvcGVyYXRpb24uXG4gICAgICAgICAgICAgICAgY29uc3QgYWdlID0gcGVyZi5ub3coKSAtIHRoaXMuI3N0YXJ0c1tpXTtcbiAgICAgICAgICAgICAgICBlbnRyeS5zdGFydCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAtIGFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy4jc2l6ZXMpIHtcbiAgICAgICAgICAgICAgICBlbnRyeS5zaXplID0gdGhpcy4jc2l6ZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcnIudW5zaGlmdChba2V5LCBlbnRyeV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0IHRoZSBjYWNoZSBhbmQgbG9hZCBpbiB0aGUgaXRlbXMgaW4gZW50cmllcyBpbiB0aGUgb3JkZXIgbGlzdGVkLlxuICAgICAqXG4gICAgICogVGhlIHNoYXBlIG9mIHRoZSByZXN1bHRpbmcgY2FjaGUgbWF5IGJlIGRpZmZlcmVudCBpZiB0aGUgc2FtZSBvcHRpb25zIGFyZVxuICAgICAqIG5vdCB1c2VkIGluIGJvdGggY2FjaGVzLlxuICAgICAqXG4gICAgICogVGhlIGBzdGFydGAgZmllbGRzIGFyZSBhc3N1bWVkIHRvIGJlIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gYSBwb3J0YWJsZVxuICAgICAqIGBEYXRlLm5vdygpYCB0aW1lc3RhbXAsIGV2ZW4gaWYgYHBlcmZvcm1hbmNlLm5vdygpYCBpcyBhdmFpbGFibGUuXG4gICAgICovXG4gICAgbG9hZChhcnIpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBhcnIpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydCkge1xuICAgICAgICAgICAgICAgIC8vIGVudHJ5LnN0YXJ0IGlzIGEgcG9ydGFibGUgdGltZXN0YW1wLCBidXQgd2UgbWF5IGJlIHVzaW5nXG4gICAgICAgICAgICAgICAgLy8gbm9kZSdzIHBlcmZvcm1hbmNlLm5vdygpLCBzbyBjYWxjdWxhdGUgdGhlIG9mZnNldCwgc28gdGhhdFxuICAgICAgICAgICAgICAgIC8vIHdlIGdldCB0aGUgaW50ZW5kZWQgcmVtYWluaW5nIFRUTCwgbm8gbWF0dGVyIGhvdyBsb25nIGl0J3NcbiAgICAgICAgICAgICAgICAvLyBiZWVuIG9uIGljZS5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGl0J3Mgb2sgZm9yIHRoaXMgdG8gYmUgYSBiaXQgc2xvdywgaXQncyBhIHJhcmUgb3BlcmF0aW9uLlxuICAgICAgICAgICAgICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSBlbnRyeS5zdGFydDtcbiAgICAgICAgICAgICAgICBlbnRyeS5zdGFydCA9IHBlcmYubm93KCkgLSBhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIGVudHJ5LnZhbHVlLCBlbnRyeSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgdmFsdWUgdG8gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogTm90ZTogaWYgYHVuZGVmaW5lZGAgaXMgc3BlY2lmaWVkIGFzIGEgdmFsdWUsIHRoaXMgaXMgYW4gYWxpYXMgZm9yXG4gICAgICoge0BsaW5rIExSVUNhY2hlI2RlbGV0ZX1cbiAgICAgKlxuICAgICAqIEZpZWxkcyBvbiB0aGUge0BsaW5rIExSVUNhY2hlLlNldE9wdGlvbnN9IG9wdGlvbnMgcGFyYW0gd2lsbCBvdmVycmlkZVxuICAgICAqIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zIGZvciB0aGUgc2NvcGVcbiAgICAgKiBvZiB0aGlzIHNpbmdsZSBgc2V0KClgIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIElmIGBzdGFydGAgaXMgcHJvdmlkZWQsIHRoZW4gdGhhdCB3aWxsIHNldCB0aGUgZWZmZWN0aXZlIHN0YXJ0XG4gICAgICogdGltZSBmb3IgdGhlIFRUTCBjYWxjdWxhdGlvbi4gTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBhIHByZXZpb3VzXG4gICAgICogdmFsdWUgb2YgYHBlcmZvcm1hbmNlLm5vdygpYCBpZiBzdXBwb3J0ZWQsIG9yIGEgcHJldmlvdXMgdmFsdWUgb2ZcbiAgICAgKiBgRGF0ZS5ub3coKWAgaWYgbm90LlxuICAgICAqXG4gICAgICogT3B0aW9ucyBvYmplY3QgbWF5IGFsc28gaW5jbHVkZSBgc2l6ZWAsIHdoaWNoIHdpbGwgcHJldmVudFxuICAgICAqIGNhbGxpbmcgdGhlIGBzaXplQ2FsY3VsYXRpb25gIGZ1bmN0aW9uIGFuZCBqdXN0IHVzZSB0aGUgc3BlY2lmaWVkXG4gICAgICogbnVtYmVyIGlmIGl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciwgYW5kIGBub0Rpc3Bvc2VPblNldGAgd2hpY2hcbiAgICAgKiB3aWxsIHByZXZlbnQgY2FsbGluZyBhIGBkaXNwb3NlYCBmdW5jdGlvbiBpbiB0aGUgY2FzZSBvZlxuICAgICAqIG92ZXJ3cml0ZXMuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgYHNpemVgIChvciByZXR1cm4gdmFsdWUgb2YgYHNpemVDYWxjdWxhdGlvbmApIGZvciBhIGdpdmVuXG4gICAgICogZW50cnkgaXMgZ3JlYXRlciB0aGFuIGBtYXhFbnRyeVNpemVgLCB0aGVuIHRoZSBpdGVtIHdpbGwgbm90IGJlXG4gICAgICogYWRkZWQgdG8gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogV2lsbCB1cGRhdGUgdGhlIHJlY2VuY3kgb2YgdGhlIGVudHJ5LlxuICAgICAqXG4gICAgICogSWYgdGhlIHZhbHVlIGlzIGB1bmRlZmluZWRgLCB0aGVuIHRoaXMgaXMgYW4gYWxpYXMgZm9yXG4gICAgICogYGNhY2hlLmRlbGV0ZShrZXkpYC4gYHVuZGVmaW5lZGAgaXMgbmV2ZXIgc3RvcmVkIGluIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBzZXQoaywgdiwgc2V0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKGspO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0dGwgPSB0aGlzLnR0bCwgc3RhcnQsIG5vRGlzcG9zZU9uU2V0ID0gdGhpcy5ub0Rpc3Bvc2VPblNldCwgc2l6ZUNhbGN1bGF0aW9uID0gdGhpcy5zaXplQ2FsY3VsYXRpb24sIHN0YXR1cywgfSA9IHNldE9wdGlvbnM7XG4gICAgICAgIGxldCB7IG5vVXBkYXRlVFRMID0gdGhpcy5ub1VwZGF0ZVRUTCB9ID0gc2V0T3B0aW9ucztcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuI3JlcXVpcmVTaXplKGssIHYsIHNldE9wdGlvbnMuc2l6ZSB8fCAwLCBzaXplQ2FsY3VsYXRpb24pO1xuICAgICAgICAvLyBpZiB0aGUgaXRlbSBkb2Vzbid0IGZpdCwgZG9uJ3QgZG8gYW55dGhpbmdcbiAgICAgICAgLy8gTkI6IG1heEVudHJ5U2l6ZSBzZXQgdG8gbWF4U2l6ZSBieSBkZWZhdWx0XG4gICAgICAgIGlmICh0aGlzLm1heEVudHJ5U2l6ZSAmJiBzaXplID4gdGhpcy5tYXhFbnRyeVNpemUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuc2V0ID0gJ21pc3MnO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5tYXhFbnRyeVNpemVFeGNlZWRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoYXZlIHRvIGRlbGV0ZSwgaW4gY2FzZSBzb21ldGhpbmcgaXMgdGhlcmUgYWxyZWFkeS5cbiAgICAgICAgICAgIHRoaXMuI2RlbGV0ZShrLCAnc2V0Jyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLiNzaXplID09PSAwID8gdW5kZWZpbmVkIDogdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGFkZGl0aW9uXG4gICAgICAgICAgICBpbmRleCA9ICh0aGlzLiNzaXplID09PSAwXG4gICAgICAgICAgICAgICAgPyB0aGlzLiN0YWlsXG4gICAgICAgICAgICAgICAgOiB0aGlzLiNmcmVlLmxlbmd0aCAhPT0gMFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuI2ZyZWUucG9wKClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLiNzaXplID09PSB0aGlzLiNtYXhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy4jZXZpY3QoZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuI3NpemUpO1xuICAgICAgICAgICAgdGhpcy4ja2V5TGlzdFtpbmRleF0gPSBrO1xuICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSB2O1xuICAgICAgICAgICAgdGhpcy4ja2V5TWFwLnNldChrLCBpbmRleCk7XG4gICAgICAgICAgICB0aGlzLiNuZXh0W3RoaXMuI3RhaWxdID0gaW5kZXg7XG4gICAgICAgICAgICB0aGlzLiNwcmV2W2luZGV4XSA9IHRoaXMuI3RhaWw7XG4gICAgICAgICAgICB0aGlzLiN0YWlsID0gaW5kZXg7XG4gICAgICAgICAgICB0aGlzLiNzaXplKys7XG4gICAgICAgICAgICB0aGlzLiNhZGRJdGVtU2l6ZShpbmRleCwgc2l6ZSwgc3RhdHVzKTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgc3RhdHVzLnNldCA9ICdhZGQnO1xuICAgICAgICAgICAgbm9VcGRhdGVUVEwgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZVxuICAgICAgICAgICAgdGhpcy4jbW92ZVRvVGFpbChpbmRleCk7XG4gICAgICAgICAgICBjb25zdCBvbGRWYWwgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGlmICh2ICE9PSBvbGRWYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRmV0Y2hNZXRob2QgJiYgdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2gob2xkVmFsKSkge1xuICAgICAgICAgICAgICAgICAgICBvbGRWYWwuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdyZXBsYWNlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBfX3N0YWxlV2hpbGVGZXRjaGluZzogcyB9ID0gb2xkVmFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAocyAhPT0gdW5kZWZpbmVkICYmICFub0Rpc3Bvc2VPblNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4ocywgaywgJ3NldCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFtzLCBrLCAnc2V0J10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFub0Rpc3Bvc2VPblNldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKG9sZFZhbCwgaywgJ3NldCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFtvbGRWYWwsIGssICdzZXQnXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jcmVtb3ZlSXRlbVNpemUoaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2FkZEl0ZW1TaXplKGluZGV4LCBzaXplLCBzdGF0dXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gdjtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQgPSAncmVwbGFjZSc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkVmFsICYmIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKG9sZFZhbClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb2xkVmFsLl9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9sZFZhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuc2V0ID0gJ3VwZGF0ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR0bCAhPT0gMCAmJiAhdGhpcy4jdHRscykge1xuICAgICAgICAgICAgdGhpcy4jaW5pdGlhbGl6ZVRUTFRyYWNraW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3R0bHMpIHtcbiAgICAgICAgICAgIGlmICghbm9VcGRhdGVUVEwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNzZXRJdGVtVFRMKGluZGV4LCB0dGwsIHN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbm9EaXNwb3NlT25TZXQgJiYgdGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICBjb25zdCBkdCA9IHRoaXMuI2Rpc3Bvc2VkO1xuICAgICAgICAgICAgbGV0IHRhc2s7XG4gICAgICAgICAgICB3aGlsZSAoKHRhc2sgPSBkdD8uc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXI/LiguLi50YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZpY3QgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgaXRlbSwgcmV0dXJuaW5nIGl0cyB2YWx1ZSBvclxuICAgICAqIGB1bmRlZmluZWRgIGlmIGNhY2hlIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIHBvcCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLiNzaXplKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy4jdmFsTGlzdFt0aGlzLiNoZWFkXTtcbiAgICAgICAgICAgICAgICB0aGlzLiNldmljdCh0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godmFsKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLl9fc3RhbGVXaGlsZUZldGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsLl9fc3RhbGVXaGlsZUZldGNoaW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciAmJiB0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWQ7XG4gICAgICAgICAgICAgICAgbGV0IHRhc2s7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCh0YXNrID0gZHQ/LnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAjZXZpY3QoZnJlZSkge1xuICAgICAgICBjb25zdCBoZWFkID0gdGhpcy4jaGVhZDtcbiAgICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaGVhZF07XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2hlYWRdO1xuICAgICAgICBpZiAodGhpcy4jaGFzRmV0Y2hNZXRob2QgJiYgdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgIHYuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdldmljdGVkJykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UgfHwgdGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2U/Lih2LCBrLCAnZXZpY3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlZD8ucHVzaChbdiwgaywgJ2V2aWN0J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplKGhlYWQpO1xuICAgICAgICAvLyBpZiB3ZSBhcmVuJ3QgYWJvdXQgdG8gdXNlIHRoZSBpbmRleCwgdGhlbiBudWxsIHRoZXNlIG91dFxuICAgICAgICBpZiAoZnJlZSkge1xuICAgICAgICAgICAgdGhpcy4ja2V5TGlzdFtoZWFkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaGVhZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLiNmcmVlLnB1c2goaGVhZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3NpemUgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuI2hlYWQgPSB0aGlzLiN0YWlsID0gMDtcbiAgICAgICAgICAgIHRoaXMuI2ZyZWUubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2hlYWQgPSB0aGlzLiNuZXh0W2hlYWRdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2tleU1hcC5kZWxldGUoayk7XG4gICAgICAgIHRoaXMuI3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGhlYWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEga2V5IGlzIGluIHRoZSBjYWNoZSwgd2l0aG91dCB1cGRhdGluZyB0aGUgcmVjZW5jeSBvZiB1c2UuXG4gICAgICogV2lsbCByZXR1cm4gZmFsc2UgaWYgdGhlIGl0ZW0gaXMgc3RhbGUsIGV2ZW4gdGhvdWdoIGl0IGlzIHRlY2huaWNhbGx5XG4gICAgICogaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQ2hlY2sgaWYgYSBrZXkgaXMgaW4gdGhlIGNhY2hlLCB3aXRob3V0IHVwZGF0aW5nIHRoZSByZWNlbmN5IG9mXG4gICAgICogdXNlLiBBZ2UgaXMgdXBkYXRlZCBpZiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudXBkYXRlQWdlT25IYXN9IGlzIHNldFxuICAgICAqIHRvIGB0cnVlYCBpbiBlaXRoZXIgdGhlIG9wdGlvbnMgb3IgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogV2lsbCByZXR1cm4gYGZhbHNlYCBpZiB0aGUgaXRlbSBpcyBzdGFsZSwgZXZlbiB0aG91Z2ggaXQgaXMgdGVjaG5pY2FsbHkgaW5cbiAgICAgKiB0aGUgY2FjaGUuIFRoZSBkaWZmZXJlbmNlIGNhbiBiZSBkZXRlcm1pbmVkIChpZiBpdCBtYXR0ZXJzKSBieSB1c2luZyBhXG4gICAgICogYHN0YXR1c2AgYXJndW1lbnQsIGFuZCBpbnNwZWN0aW5nIHRoZSBgaGFzYCBmaWVsZC5cbiAgICAgKlxuICAgICAqIFdpbGwgbm90IHVwZGF0ZSBpdGVtIGFnZSB1bmxlc3NcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudXBkYXRlQWdlT25IYXN9IGlzIHNldC5cbiAgICAgKi9cbiAgICBoYXMoaywgaGFzT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgdXBkYXRlQWdlT25IYXMgPSB0aGlzLnVwZGF0ZUFnZU9uSGFzLCBzdGF0dXMgfSA9IGhhc09wdGlvbnM7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSAmJlxuICAgICAgICAgICAgICAgIHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy4jaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlQWdlT25IYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdXBkYXRlSXRlbUFnZShpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmhhcyA9ICdoaXQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmhhcyA9ICdzdGFsZSc7XG4gICAgICAgICAgICAgICAgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgc3RhdHVzLmhhcyA9ICdtaXNzJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpa2Uge0BsaW5rIExSVUNhY2hlI2dldH0gYnV0IGRvZXNuJ3QgdXBkYXRlIHJlY2VuY3kgb3IgZGVsZXRlIHN0YWxlXG4gICAgICogaXRlbXMuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBpdGVtIGlzIHN0YWxlLCB1bmxlc3NcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZX0gaXMgc2V0LlxuICAgICAqL1xuICAgIHBlZWsoaywgcGVla09wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUgfSA9IHBlZWtPcHRpb25zO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoIWFsbG93U3RhbGUgJiYgdGhpcy4jaXNTdGFsZShpbmRleCkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAvLyBlaXRoZXIgc3RhbGUgYW5kIGFsbG93ZWQsIG9yIGZvcmNpbmcgYSByZWZyZXNoIG9mIG5vbi1zdGFsZSB2YWx1ZVxuICAgICAgICByZXR1cm4gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nIDogdjtcbiAgICB9XG4gICAgI2JhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgY29udGV4dCkge1xuICAgICAgICBjb25zdCB2ID0gaW5kZXggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjID0gbmV3IEFDKCk7XG4gICAgICAgIGNvbnN0IHsgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAvLyB3aGVuL2lmIG91ciBBQyBzaWduYWxzLCB0aGVuIHN0b3AgbGlzdGVuaW5nIHRvIHRoZWlycy5cbiAgICAgICAgc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IGFjLmFib3J0KHNpZ25hbC5yZWFzb24pLCB7XG4gICAgICAgICAgICBzaWduYWw6IGFjLnNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGZldGNoT3B0cyA9IHtcbiAgICAgICAgICAgIHNpZ25hbDogYWMuc2lnbmFsLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNiID0gKHYsIHVwZGF0ZUNhY2hlID0gZmFsc2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgYWJvcnRlZCB9ID0gYWMuc2lnbmFsO1xuICAgICAgICAgICAgY29uc3QgaWdub3JlQWJvcnQgPSBvcHRpb25zLmlnbm9yZUZldGNoQWJvcnQgJiYgdiAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFib3J0ZWQgJiYgIXVwZGF0ZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoQWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoRXJyb3IgPSBhYy5zaWduYWwucmVhc29uO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaWdub3JlQWJvcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEFib3J0SWdub3JlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaFJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWJvcnRlZCAmJiAhaWdub3JlQWJvcnQgJiYgIXVwZGF0ZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoRmFpbChhYy5zaWduYWwucmVhc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVpdGhlciB3ZSBkaWRuJ3QgYWJvcnQsIGFuZCBhcmUgc3RpbGwgaGVyZSwgb3Igd2UgZGlkLCBhbmQgaWdub3JlZFxuICAgICAgICAgICAgY29uc3QgYmYgPSBwO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbExpc3RbaW5kZXhdID09PSBwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkZWxldGUoaywgJ2ZldGNoJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGssIHYsIGZldGNoT3B0cy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZWIgPSAoZXIpID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoUmVqZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoRXJyb3IgPSBlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmZXRjaEZhaWwoZXIpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBmZXRjaEZhaWwgPSAoZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgYWJvcnRlZCB9ID0gYWMuc2lnbmFsO1xuICAgICAgICAgICAgY29uc3QgYWxsb3dTdGFsZUFib3J0ZWQgPSBhYm9ydGVkICYmIG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93U3RhbGUgPSBhbGxvd1N0YWxlQWJvcnRlZCB8fCBvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uO1xuICAgICAgICAgICAgY29uc3Qgbm9EZWxldGUgPSBhbGxvd1N0YWxlIHx8IG9wdGlvbnMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uO1xuICAgICAgICAgICAgY29uc3QgYmYgPSBwO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbExpc3RbaW5kZXhdID09PSBwKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgd2UgYWxsb3cgc3RhbGUgb24gZmV0Y2ggcmVqZWN0aW9ucywgdGhlbiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0XG4gICAgICAgICAgICAgICAgLy8gdGhlIHN0YWxlIHZhbHVlIGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGNhY2hlIHdoZW4gdGhlIGZldGNoIGZhaWxzLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRlbCA9ICFub0RlbGV0ZSB8fCBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZyA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChkZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKGssICdmZXRjaCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghYWxsb3dTdGFsZUFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgcmVwbGFjZSB0aGUgKnByb21pc2UqIHdpdGggdGhlIHN0YWxlIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBwcm9taXNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgICAgIC8vIGxlYXZlIGl0IHVudG91Y2hlZCBpZiB3ZSdyZSBzdGlsbCB3YWl0aW5nIGZvciBhblxuICAgICAgICAgICAgICAgICAgICAvLyBhYm9ydGVkIGJhY2tncm91bmQgZmV0Y2ggdGhhdCBoYXNuJ3QgeWV0IHJldHVybmVkLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbGxvd1N0YWxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzICYmIGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJmLl9fcmV0dXJuZWQgPT09IGJmKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBjYWxsID0gKHJlcywgcmVqKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmbXAgPSB0aGlzLiNmZXRjaE1ldGhvZD8uKGssIHYsIGZldGNoT3B0cyk7XG4gICAgICAgICAgICBpZiAoZm1wICYmIGZtcCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBmbXAudGhlbih2ID0+IHJlcyh2ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB2KSwgcmVqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlnbm9yZWQsIHdlIGdvIHVudGlsIHdlIGZpbmlzaCwgcmVnYXJkbGVzcy5cbiAgICAgICAgICAgIC8vIGRlZmVyIGNoZWNrIHVudGlsIHdlIGFyZSBhY3R1YWxseSBhYm9ydGluZyxcbiAgICAgICAgICAgIC8vIHNvIGZldGNoTWV0aG9kIGNhbiBvdmVycmlkZS5cbiAgICAgICAgICAgIGFjLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlRmV0Y2hBYm9ydCB8fFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gaXQgZXZlbnR1YWxseSByZXNvbHZlcywgdXBkYXRlIHRoZSBjYWNoZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdiA9PiBjYih2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMpXG4gICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaERpc3BhdGNoZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBwID0gbmV3IFByb21pc2UocGNhbGwpLnRoZW4oY2IsIGViKTtcbiAgICAgICAgY29uc3QgYmYgPSBPYmplY3QuYXNzaWduKHAsIHtcbiAgICAgICAgICAgIF9fYWJvcnRDb250cm9sbGVyOiBhYyxcbiAgICAgICAgICAgIF9fc3RhbGVXaGlsZUZldGNoaW5nOiB2LFxuICAgICAgICAgICAgX19yZXR1cm5lZDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGludGVybmFsLCBkb24ndCBleHBvc2Ugc3RhdHVzLlxuICAgICAgICAgICAgdGhpcy5zZXQoaywgYmYsIHsgLi4uZmV0Y2hPcHRzLm9wdGlvbnMsIHN0YXR1czogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSBiZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmY7XG4gICAgfVxuICAgICNpc0JhY2tncm91bmRGZXRjaChwKSB7XG4gICAgICAgIGlmICghdGhpcy4jaGFzRmV0Y2hNZXRob2QpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGIgPSBwO1xuICAgICAgICByZXR1cm4gKCEhYiAmJlxuICAgICAgICAgICAgYiBpbnN0YW5jZW9mIFByb21pc2UgJiZcbiAgICAgICAgICAgIGIuaGFzT3duUHJvcGVydHkoJ19fc3RhbGVXaGlsZUZldGNoaW5nJykgJiZcbiAgICAgICAgICAgIGIuX19hYm9ydENvbnRyb2xsZXIgaW5zdGFuY2VvZiBBQyk7XG4gICAgfVxuICAgIGFzeW5jIGZldGNoKGssIGZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgXG4gICAgICAgIC8vIGdldCBvcHRpb25zXG4gICAgICAgIGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUsIHVwZGF0ZUFnZU9uR2V0ID0gdGhpcy51cGRhdGVBZ2VPbkdldCwgbm9EZWxldGVPblN0YWxlR2V0ID0gdGhpcy5ub0RlbGV0ZU9uU3RhbGVHZXQsIFxuICAgICAgICAvLyBzZXQgb3B0aW9uc1xuICAgICAgICB0dGwgPSB0aGlzLnR0bCwgbm9EaXNwb3NlT25TZXQgPSB0aGlzLm5vRGlzcG9zZU9uU2V0LCBzaXplID0gMCwgc2l6ZUNhbGN1bGF0aW9uID0gdGhpcy5zaXplQ2FsY3VsYXRpb24sIG5vVXBkYXRlVFRMID0gdGhpcy5ub1VwZGF0ZVRUTCwgXG4gICAgICAgIC8vIGZldGNoIGV4Y2x1c2l2ZSBvcHRpb25zXG4gICAgICAgIG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiA9IHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLCBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sIGlnbm9yZUZldGNoQWJvcnQgPSB0aGlzLmlnbm9yZUZldGNoQWJvcnQsIGFsbG93U3RhbGVPbkZldGNoQWJvcnQgPSB0aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsIGNvbnRleHQsIGZvcmNlUmVmcmVzaCA9IGZhbHNlLCBzdGF0dXMsIHNpZ25hbCwgfSA9IGZldGNoT3B0aW9ucztcbiAgICAgICAgaWYgKCF0aGlzLiNoYXNGZXRjaE1ldGhvZCkge1xuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICBzdGF0dXMuZmV0Y2ggPSAnZ2V0JztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChrLCB7XG4gICAgICAgICAgICAgICAgYWxsb3dTdGFsZSxcbiAgICAgICAgICAgICAgICB1cGRhdGVBZ2VPbkdldCxcbiAgICAgICAgICAgICAgICBub0RlbGV0ZU9uU3RhbGVHZXQsXG4gICAgICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGFsbG93U3RhbGUsXG4gICAgICAgICAgICB1cGRhdGVBZ2VPbkdldCxcbiAgICAgICAgICAgIG5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgICAgICAgIHR0bCxcbiAgICAgICAgICAgIG5vRGlzcG9zZU9uU2V0LFxuICAgICAgICAgICAgc2l6ZSxcbiAgICAgICAgICAgIHNpemVDYWxjdWxhdGlvbixcbiAgICAgICAgICAgIG5vVXBkYXRlVFRMLFxuICAgICAgICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICAgICAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0LFxuICAgICAgICAgICAgaWdub3JlRmV0Y2hBYm9ydCxcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmZldGNoID0gJ21pc3MnO1xuICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMuI2JhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gKHAuX19yZXR1cm5lZCA9IHApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaW4gY2FjaGUsIG1heWJlIGFscmVhZHkgZmV0Y2hpbmdcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWxlID0gYWxsb3dTdGFsZSAmJiB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZmV0Y2ggPSAnaW5mbGlnaHQnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFsZSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiAodi5fX3JldHVybmVkID0gdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiB3ZSBmb3JjZSBhIHJlZnJlc2gsIHRoYXQgbWVhbnMgZG8gTk9UIHNlcnZlIHRoZSBjYWNoZWQgdmFsdWUsXG4gICAgICAgICAgICAvLyB1bmxlc3Mgd2UgYXJlIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgcmVmcmVzaGluZyB0aGUgY2FjaGUuXG4gICAgICAgICAgICBjb25zdCBpc1N0YWxlID0gdGhpcy4jaXNTdGFsZShpbmRleCk7XG4gICAgICAgICAgICBpZiAoIWZvcmNlUmVmcmVzaCAmJiAhaXNTdGFsZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdoaXQnO1xuICAgICAgICAgICAgICAgIHRoaXMuI21vdmVUb1RhaWwoaW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVBZ2VPbkdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiN1cGRhdGVJdGVtQWdlKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gb2ssIGl0IGlzIHN0YWxlIG9yIGEgZm9yY2VkIHJlZnJlc2gsIGFuZCBub3QgYWxyZWFkeSBmZXRjaGluZy5cbiAgICAgICAgICAgIC8vIHJlZnJlc2ggdGhlIGNhY2hlLlxuICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMuI2JhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgY29udGV4dCk7XG4gICAgICAgICAgICBjb25zdCBoYXNTdGFsZSA9IHAuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHN0YWxlVmFsID0gaGFzU3RhbGUgJiYgYWxsb3dTdGFsZTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZmV0Y2ggPSBpc1N0YWxlID8gJ3N0YWxlJyA6ICdyZWZyZXNoJztcbiAgICAgICAgICAgICAgICBpZiAoc3RhbGVWYWwgJiYgaXNTdGFsZSlcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YWxlVmFsID8gcC5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IChwLl9fcmV0dXJuZWQgPSBwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBmb3JjZUZldGNoKGssIGZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHYgPSBhd2FpdCB0aGlzLmZldGNoKGssIGZldGNoT3B0aW9ucyk7XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZldGNoKCkgcmV0dXJuZWQgdW5kZWZpbmVkJyk7XG4gICAgICAgIHJldHVybiB2O1xuICAgIH1cbiAgICBtZW1vKGssIG1lbW9PcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgbWVtb01ldGhvZCA9IHRoaXMuI21lbW9NZXRob2Q7XG4gICAgICAgIGlmICghbWVtb01ldGhvZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBtZW1vTWV0aG9kIHByb3ZpZGVkIHRvIGNvbnN0cnVjdG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBjb250ZXh0LCBmb3JjZVJlZnJlc2gsIC4uLm9wdGlvbnMgfSA9IG1lbW9PcHRpb25zO1xuICAgICAgICBjb25zdCB2ID0gdGhpcy5nZXQoaywgb3B0aW9ucyk7XG4gICAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmIHYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjb25zdCB2diA9IG1lbW9NZXRob2Qoaywgdiwge1xuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldChrLCB2diwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB2djtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgdmFsdWUgZnJvbSB0aGUgY2FjaGUuIFdpbGwgdXBkYXRlIHRoZSByZWNlbmN5IG9mIHRoZSBjYWNoZVxuICAgICAqIGVudHJ5IGZvdW5kLlxuICAgICAqXG4gICAgICogSWYgdGhlIGtleSBpcyBub3QgZm91bmQsIGdldCgpIHdpbGwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGdldChrLCBnZXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlLCB1cGRhdGVBZ2VPbkdldCA9IHRoaXMudXBkYXRlQWdlT25HZXQsIG5vRGVsZXRlT25TdGFsZUdldCA9IHRoaXMubm9EZWxldGVPblN0YWxlR2V0LCBzdGF0dXMsIH0gPSBnZXRPcHRpb25zO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgZmV0Y2hpbmcgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpc1N0YWxlKGluZGV4KSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5nZXQgPSAnc3RhbGUnO1xuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBvbmx5IGlmIG5vdCBhbiBpbi1mbGlnaHQgYmFja2dyb3VuZCBmZXRjaFxuICAgICAgICAgICAgICAgIGlmICghZmV0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub0RlbGV0ZU9uU3RhbGVHZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZShrLCAnZXhwaXJlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmJiBhbGxvd1N0YWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dTdGFsZSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dTdGFsZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd1N0YWxlID8gdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmdldCA9ICdoaXQnO1xuICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGN1cnJlbnRseSBmZXRjaGluZyBpdCwgd2UgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBpdCB5ZXRcbiAgICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBzdGFsZSwgd2hpY2ggbWVhbnMgdGhpcyBpc24ndCBhIHN0YWxlV2hpbGVSZWZldGNoaW5nLlxuICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90IHN0YWxlLCBhbmQgZmV0Y2hpbmcsIEFORCBoYXMgYSBfX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIC8vIHZhbHVlLCB0aGVuIHRoYXQgbWVhbnMgdGhlIHVzZXIgZmV0Y2hlZCB3aXRoIHtmb3JjZVJlZnJlc2g6dHJ1ZX0sXG4gICAgICAgICAgICAgICAgLy8gc28gaXQncyBzYWZlIHRvIHJldHVybiB0aGF0IHZhbHVlLlxuICAgICAgICAgICAgICAgIGlmIChmZXRjaGluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuI21vdmVUb1RhaWwoaW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVBZ2VPbkdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiN1cGRhdGVJdGVtQWdlKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgc3RhdHVzLmdldCA9ICdtaXNzJztcbiAgICAgICAgfVxuICAgIH1cbiAgICAjY29ubmVjdChwLCBuKSB7XG4gICAgICAgIHRoaXMuI3ByZXZbbl0gPSBwO1xuICAgICAgICB0aGlzLiNuZXh0W3BdID0gbjtcbiAgICB9XG4gICAgI21vdmVUb1RhaWwoaW5kZXgpIHtcbiAgICAgICAgLy8gaWYgdGFpbCBhbHJlYWR5LCBub3RoaW5nIHRvIGRvXG4gICAgICAgIC8vIGlmIGhlYWQsIG1vdmUgaGVhZCB0byBuZXh0W2luZGV4XVxuICAgICAgICAvLyBlbHNlXG4gICAgICAgIC8vICAgbW92ZSBuZXh0W3ByZXZbaW5kZXhdXSB0byBuZXh0W2luZGV4XSAoaGVhZCBoYXMgbm8gcHJldilcbiAgICAgICAgLy8gICBtb3ZlIHByZXZbbmV4dFtpbmRleF1dIHRvIHByZXZbaW5kZXhdXG4gICAgICAgIC8vIHByZXZbaW5kZXhdID0gdGFpbFxuICAgICAgICAvLyBuZXh0W3RhaWxdID0gaW5kZXhcbiAgICAgICAgLy8gdGFpbCA9IGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gdGhpcy4jdGFpbCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLiNoZWFkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI25leHRbaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY29ubmVjdCh0aGlzLiNwcmV2W2luZGV4XSwgdGhpcy4jbmV4dFtpbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY29ubmVjdCh0aGlzLiN0YWlsLCBpbmRleCk7XG4gICAgICAgICAgICB0aGlzLiN0YWlsID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBhIGtleSBvdXQgb2YgdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgd2FzIGRlbGV0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBkZWxldGUoaykge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGVsZXRlKGssICdkZWxldGUnKTtcbiAgICB9XG4gICAgI2RlbGV0ZShrLCByZWFzb24pIHtcbiAgICAgICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuI3NpemUgIT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI3NpemUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY2xlYXIocmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHYuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdkZWxldGVkJykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UgfHwgdGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2U/Lih2LCBrLCByZWFzb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFt2LCBrLCByZWFzb25dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNrZXlNYXAuZGVsZXRlKGspO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNrZXlMaXN0W2luZGV4XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy4jdGFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jdGFpbCA9IHRoaXMuI3ByZXZbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluZGV4ID09PSB0aGlzLiNoZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNoZWFkID0gdGhpcy4jbmV4dFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaSA9IHRoaXMuI3ByZXZbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jbmV4dFtwaV0gPSB0aGlzLiNuZXh0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5pID0gdGhpcy4jbmV4dFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNwcmV2W25pXSA9IHRoaXMuI3ByZXZbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3NpemUtLTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZnJlZS5wdXNoKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciAmJiB0aGlzLiNkaXNwb3NlZD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkdCA9IHRoaXMuI2Rpc3Bvc2VkO1xuICAgICAgICAgICAgbGV0IHRhc2s7XG4gICAgICAgICAgICB3aGlsZSAoKHRhc2sgPSBkdD8uc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXI/LiguLi50YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsZXRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIGNhY2hlIGVudGlyZWx5LCB0aHJvd2luZyBhd2F5IGFsbCB2YWx1ZXMuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjbGVhcignZGVsZXRlJyk7XG4gICAgfVxuICAgICNjbGVhcihyZWFzb24pIHtcbiAgICAgICAgZm9yIChjb25zdCBpbmRleCBvZiB0aGlzLiNyaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgICAgIHYuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdkZWxldGVkJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2U/Lih2LCBrLCByZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFt2LCBrLCByZWFzb25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4ja2V5TWFwLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuI3ZhbExpc3QuZmlsbCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLiNrZXlMaXN0LmZpbGwodW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHRoaXMuI3R0bHMgJiYgdGhpcy4jc3RhcnRzKSB7XG4gICAgICAgICAgICB0aGlzLiN0dGxzLmZpbGwoMCk7XG4gICAgICAgICAgICB0aGlzLiNzdGFydHMuZmlsbCgwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc2l6ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI3NpemVzLmZpbGwoMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jaGVhZCA9IDA7XG4gICAgICAgIHRoaXMuI3RhaWwgPSAwO1xuICAgICAgICB0aGlzLiNmcmVlLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplID0gMDtcbiAgICAgICAgdGhpcy4jc2l6ZSA9IDA7XG4gICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgJiYgdGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWQ7XG4gICAgICAgICAgICBsZXQgdGFzaztcbiAgICAgICAgICAgIHdoaWxlICgodGFzayA9IGR0Py5zaGlmdCgpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIixudWxsLG51bGwsbnVsbCxudWxsLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImJveFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5uZXJcIiA6c3R5bGU9XCJjb21wdXRlZElubmVyU3R5bGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICA8IS0tIGhlYWRlciAtLT5cclxuICAgICAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXJcIj48L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJvZHlcIiA6c3R5bGU9XCJjb21wdXRlZEJvZHlTdHlsZVwiPlxyXG4gICAgICAgICAgPCEtLSBib2R5LCDpq5jluqboh6rpgILlupQgLS0+XHJcbiAgICAgICAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlclwiPlxyXG4gICAgICAgICAgPCEtLSBmb290ZXIgLS0+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyXCI+PC9zbG90PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHNsb3QgbmFtZT1cImJveFwiPjwvc2xvdD5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgY29tcHV0ZWQgfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xyXG4vKipcclxuICogY3J1ZOeahOWuueWZqO+8jOagueaNruWklumDqOmrmOW6puiHqumAguW6lFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzQ29udGFpbmVyXCIsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5Zu65a6a6auY5bqmXHJcbiAgICAgKi9cclxuICAgIGZpeGVkSGVpZ2h0OiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIGJvZHnnmoTmoLflvI9cclxuICAgICAqL1xyXG4gICAgYm9keVN0eWxlOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogaW5uZXLnmoTmoLflvI9cclxuICAgICAqL1xyXG4gICAgaW5uZXJTdHlsZToge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQ6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcclxuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XHJcbiAgICBjb25zdCBjb21wdXRlZElubmVyU3R5bGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGlmIChwcm9wcy5maXhlZEhlaWdodCA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4gbWVyZ2UoeyBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiIH0sIHByb3BzLmlubmVyU3R5bGUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwcm9wcy5pbm5lclN0eWxlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY29tcHV0ZWRCb2R5U3R5bGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGlmIChwcm9wcy5maXhlZEhlaWdodCA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4gbWVyZ2UoeyBmbGV4OiBcInVuc2V0XCIgfSwgcHJvcHMuYm9keVN0eWxlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcHJvcHMuYm9keVN0eWxlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY29tcHV0ZWRJbm5lclN0eWxlLFxyXG4gICAgICBjb21wdXRlZEJvZHlTdHlsZVxyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuXHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtY29udGFpbmVyIHtcclxuICAmLmNvbXBhY3Qge1xyXG4gICAgcGFkZGluZzogMDtcclxuICB9XHJcbiAgcGFkZGluZzogMCAyMHB4O1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgLmJveCB7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgZmxleDogMTtcclxuICAgIC5pbm5lciB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIHRvcDogMDtcclxuICAgICAgYm90dG9tOiAwO1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICAuaGVhZGVyIHtcclxuICAgICAgICBmbGV4LXNocmluazogMDtcclxuICAgICAgfVxyXG4gICAgICAuYm9keSB7XHJcbiAgICAgICAgZmxleDogMTtcclxuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gICAgICB9XHJcbiAgICAgIC5mb290ZXIge1xyXG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZnMtY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpbm5lclwiIDpzdHlsZT1cImNvbXB1dGVkSW5uZXJTdHlsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cclxuICAgICAgICAgIDwhLS0gaGVhZGVyIC0tPlxyXG4gICAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlclwiPjwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keVwiIDpzdHlsZT1cImNvbXB1dGVkQm9keVN0eWxlXCI+XHJcbiAgICAgICAgICA8IS0tIGJvZHksIOmrmOW6puiHqumAguW6lCAtLT5cclxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XHJcbiAgICAgICAgICA8IS0tIGZvb3RlciAtLT5cclxuICAgICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXJcIj48L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8c2xvdCBuYW1lPVwiYm94XCI+PC9zbG90PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBjb21wdXRlZCB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcbi8qKlxyXG4gKiBjcnVk55qE5a655Zmo77yM5qC55o2u5aSW6YOo6auY5bqm6Ieq6YCC5bqUXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNDb250YWluZXJcIixcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDmmK/lkKblm7rlrprpq5jluqZcclxuICAgICAqL1xyXG4gICAgZml4ZWRIZWlnaHQ6IHtcclxuICAgICAgdHlwZTogQm9vbGVhbixcclxuICAgICAgZGVmYXVsdDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogYm9keeeahOagt+W8j1xyXG4gICAgICovXHJcbiAgICBib2R5U3R5bGU6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0OiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBpbm5lcueahOagt+W8j1xyXG4gICAgICovXHJcbiAgICBpbm5lclN0eWxlOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xyXG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcclxuICAgIGNvbnN0IGNvbXB1dGVkSW5uZXJTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgaWYgKHByb3BzLmZpeGVkSGVpZ2h0ID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiBtZXJnZSh7IHBvc2l0aW9uOiBcInJlbGF0aXZlXCIgfSwgcHJvcHMuaW5uZXJTdHlsZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHByb3BzLmlubmVyU3R5bGU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZEJvZHlTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgaWYgKHByb3BzLmZpeGVkSGVpZ2h0ID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiBtZXJnZSh7IGZsZXg6IFwidW5zZXRcIiB9LCBwcm9wcy5ib2R5U3R5bGUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwcm9wcy5ib2R5U3R5bGU7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjb21wdXRlZElubmVyU3R5bGUsXHJcbiAgICAgIGNvbXB1dGVkQm9keVN0eWxlXHJcbiAgICB9O1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi5mcy1jb250YWluZXIge1xyXG4gICYuY29tcGFjdCB7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gIH1cclxuICBwYWRkaW5nOiAwIDIwcHg7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAuYm94IHtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBmbGV4OiAxO1xyXG4gICAgLmlubmVyIHtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgdG9wOiAwO1xyXG4gICAgICBib3R0b206IDA7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIC5oZWFkZXIge1xyXG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgICB9XHJcbiAgICAgIC5ib2R5IHtcclxuICAgICAgICBmbGV4OiAxO1xyXG4gICAgICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICAgIH1cclxuICAgICAgLmZvb3RlciB7XHJcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuPC9zdHlsZT5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxmcy1jb250YWluZXIgY2xhc3M9XCJmcy1sYXlvdXQtZGVmYXVsdFwiPlxyXG4gICAgPHRlbXBsYXRlICNoZWFkZXI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLWhlYWRlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItdG9wXCI+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLXRvcFwiPjwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoXCI+PC9zbG90PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItbWlkZGxlXCI+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLW1pZGRsZVwiPjwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c2xvdCBuYW1lPVwiYWN0aW9uYmFyXCI+PC9zbG90PlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyXCI+PC9zbG90PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItYm90dG9tXCI+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c2xvdCBuYW1lPVwidGFic1wiPjwvc2xvdD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG5cclxuICAgIDwhLS0g6buY6K6k5o+S5qe9IC0tPlxyXG4gICAgPHNsb3Q+PC9zbG90PlxyXG4gICAgPCEtLSB0YWJsZSAtLT5cclxuICAgIDxzbG90IG5hbWU9XCJ0YWJsZVwiPjwvc2xvdD5cclxuXHJcbiAgICA8c2xvdCBuYW1lPVwiZm9ybVwiPiA8L3Nsb3Q+XHJcblxyXG4gICAgPHRlbXBsYXRlICNmb290ZXI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLWZvb3RlclwiPlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItdG9wXCI+PC9zbG90PlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJwYWdpbmF0aW9uXCI+PC9zbG90PlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItYm90dG9tXCI+PC9zbG90PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgPC9mcy1jb250YWluZXI+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XHJcbi8qKlxyXG4gKiDpu5jorqTluIPlsYBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc0xheW91dERlZmF1bHRcIlxyXG59KTtcclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLWxheW91dC1kZWZhdWx0IHtcclxuICAuZnMtdGFicy1maWx0ZXIge1xyXG4gICAgbWFyZ2luLXRvcDogMTBweDtcclxuICB9XHJcbn1cclxuPC9zdHlsZT5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxmcy1jb250YWluZXIgY2xhc3M9XCJmcy1sYXlvdXQtZGVmYXVsdFwiPlxyXG4gICAgPHRlbXBsYXRlICNoZWFkZXI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLWhlYWRlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItdG9wXCI+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLXRvcFwiPjwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoXCI+PC9zbG90PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItbWlkZGxlXCI+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLW1pZGRsZVwiPjwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c2xvdCBuYW1lPVwiYWN0aW9uYmFyXCI+PC9zbG90PlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyXCI+PC9zbG90PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItYm90dG9tXCI+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c2xvdCBuYW1lPVwidGFic1wiPjwvc2xvdD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG5cclxuICAgIDwhLS0g6buY6K6k5o+S5qe9IC0tPlxyXG4gICAgPHNsb3Q+PC9zbG90PlxyXG4gICAgPCEtLSB0YWJsZSAtLT5cclxuICAgIDxzbG90IG5hbWU9XCJ0YWJsZVwiPjwvc2xvdD5cclxuXHJcbiAgICA8c2xvdCBuYW1lPVwiZm9ybVwiPiA8L3Nsb3Q+XHJcblxyXG4gICAgPHRlbXBsYXRlICNmb290ZXI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLWZvb3RlclwiPlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItdG9wXCI+PC9zbG90PlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJwYWdpbmF0aW9uXCI+PC9zbG90PlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItYm90dG9tXCI+PC9zbG90PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgPC9mcy1jb250YWluZXI+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XHJcbi8qKlxyXG4gKiDpu5jorqTluIPlsYBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc0xheW91dERlZmF1bHRcIlxyXG59KTtcclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLWxheW91dC1kZWZhdWx0IHtcclxuICAuZnMtdGFicy1maWx0ZXIge1xyXG4gICAgbWFyZ2luLXRvcDogMTBweDtcclxuICB9XHJcbn1cclxuPC9zdHlsZT5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxmcy1jb250YWluZXIgY2xhc3M9XCJmcy1sYXlvdXQtY2FyZFwiPlxyXG4gICAgPHRlbXBsYXRlICNoZWFkZXI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItdG9wXCI+XHJcbiAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci10b3BcIj48L3Nsb3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8Y29tcG9uZW50IDppcz1cImNhcmRDb21wb25lbnROYW1lXCIgdi1pZj1cInNlYXJjaFNob3dcIj5cclxuICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoXCI+PC9zbG90PlxyXG4gICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci1ib3R0b21cIj5cclxuICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG5cclxuICAgIDxmcy1jb250YWluZXI+XHJcbiAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJ0YWJzXCI+PC9zbG90PlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8Y29tcG9uZW50IDppcz1cImNhcmRDb21wb25lbnROYW1lXCIgY2xhc3M9XCJmcy1sYXlvdXQtY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgPHRlbXBsYXRlICN0aXRsZT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtYmFyXCI+XHJcbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25iYXJcIj48L3Nsb3Q+XHJcbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyXCI+PC9zbG90PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtYmFyXCI+XHJcbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25iYXJcIj48L3Nsb3Q+XHJcbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyXCI+PC9zbG90PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8ZnMtY29udGFpbmVyPlxyXG4gICAgICAgICAgPCEtLSDpu5jorqTmj5Lmp70gLS0+XHJcbiAgICAgICAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgICAgICAgICA8IS0tIHRhYmxlIC0tPlxyXG4gICAgICAgICAgPHNsb3QgbmFtZT1cInRhYmxlXCI+PC9zbG90PlxyXG4gICAgICAgICAgPHNsb3QgbmFtZT1cImZvcm1cIj48L3Nsb3Q+XHJcbiAgICAgICAgICA8dGVtcGxhdGUgI2Zvb3Rlcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNydWQtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci10b3BcIj48L3Nsb3Q+XHJcbiAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cInBhZ2luYXRpb25cIj48L3Nsb3Q+XHJcbiAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci1ib3R0b21cIj48L3Nsb3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8L2ZzLWNvbnRhaW5lcj5cclxuICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICA8L2ZzLWNvbnRhaW5lcj5cclxuICA8L2ZzLWNvbnRhaW5lcj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIGluamVjdCwgcmVmIH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLXVpXCI7XHJcbi8qKlxyXG4gKiBjYXJk5biD5bGAXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNMYXlvdXRDYXJkXCIsXHJcbiAgc2V0dXAoKSB7XHJcbiAgICBjb25zdCBnZXRDcnVkQmluZGluZyA9IGluamVjdChcImdldDpjcnVkQmluZGluZ1wiKTtcclxuICAgIGNvbnN0IHNlYXJjaFNob3cgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGlmIChnZXRDcnVkQmluZGluZyA9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICByZXR1cm4gZ2V0Q3J1ZEJpbmRpbmcoKT8uc2VhcmNoPy5zaG93O1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuXHJcbiAgICBjb25zdCBjYXJkQ29tcG9uZW50TmFtZSA9IHJlZih1aS5jYXJkLm5hbWUpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VhcmNoU2hvdyxcclxuICAgICAgY2FyZENvbXBvbmVudE5hbWVcclxuICAgIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLWxheW91dC1jYXJkIHtcclxuICAmID4gLmJveCA+IC5pbm5lciA+IC5oZWFkZXIge1xyXG4gICAgbWFyZ2luOiAxMHB4IDEwcHggNXB4IDEwcHg7XHJcbiAgfVxyXG4gICYgPiAuYm94ID4gLmlubmVyID4gLmJvZHkge1xyXG4gICAgbWFyZ2luOiA1cHggMTBweCAxMHB4IDEwcHg7XHJcbiAgfVxyXG4gIC50b3AtYmFyIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgfVxyXG4gIC5mcy1jb250YWluZXIge1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIC5ib3gge1xyXG4gICAgICAuaW5uZXIge1xyXG4gICAgICAgIC5oZWFkZXIge1xyXG4gICAgICAgICAgLmFudC1jYXJkLWJvZHkge1xyXG4gICAgICAgICAgICBwYWRkaW5nOiAxNHB4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAuZnMtbGF5b3V0LWNhcmQtYm9keSB7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuXHJcbiAgICAuYW50LWNhcmQtaGVhZCB7XHJcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XHJcbiAgICAgIHBhZGRpbmc6IDBweDtcclxuICAgICAgLmFudC1jYXJkLWhlYWQtdGl0bGUge1xyXG4gICAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAuZWwtY2FyZF9faGVhZGVyIHtcclxuICAgICAgcGFkZGluZzogMDtcclxuICAgIH1cclxuXHJcbiAgICAubi1jYXJkLWhlYWRlciB7XHJcbiAgICAgIHBhZGRpbmc6IDBweDtcclxuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7XHJcbiAgICB9XHJcbiAgICAubi1jYXJkX19jb250ZW50IHtcclxuICAgICAgcGFkZGluZzogMTBweDtcclxuICAgIH1cclxuXHJcbiAgICAuZnMtY3J1ZC1hY3Rpb25iYXIge1xyXG4gICAgICBtYXJnaW46IDEwcHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICB9XHJcbiAgICAuZnMtY3J1ZC10b29sYmFyIHtcclxuICAgICAgbWFyZ2luOiAxMHB4O1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC5hbnQtY2FyZC1ib2R5IHtcclxuICAgICAgZmxleDogMTtcclxuICAgICAgcGFkZGluZzogMTBweDtcclxuICAgIH1cclxuICAgIC5lbC1jYXJkX19ib2R5IHtcclxuICAgICAgZmxleDogMTtcclxuICAgICAgcGFkZGluZzogMTBweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC5mcy10YWJzLWZpbHRlciB7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAtMXB4O1xyXG4gICAgLm4tdGFicyAubi10YWJzLW5hdi5uLXRhYnMtbmF2LS1jYXJkLXR5cGUgLm4tdGFicy10YWIge1xyXG4gICAgICAmLm4tdGFicy10YWItLWFjdGl2ZSB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcclxuICAgICAgfVxyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmNjA7XHJcbiAgICB9XHJcblxyXG4gICAgLmVsLXRhYnMtLWNhcmQgPiAuZWwtdGFic19faGVhZGVyIC5lbC10YWJzX19pdGVtIHtcclxuICAgICAgJi5pcy1hY3RpdmUge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XHJcbiAgICAgIH1cclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjgwO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGZzLWNvbnRhaW5lciBjbGFzcz1cImZzLWxheW91dC1jYXJkXCI+XHJcbiAgICA8dGVtcGxhdGUgI2hlYWRlcj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci10b3BcIj5cclxuICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLXRvcFwiPjwvc2xvdD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxjb21wb25lbnQgOmlzPVwiY2FyZENvbXBvbmVudE5hbWVcIiB2LWlmPVwic2VhcmNoU2hvd1wiPlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2hcIj48L3Nsb3Q+XHJcbiAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtaGVhZGVyLWJvdHRvbVwiPlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItYm90dG9tXCI+PC9zbG90PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvdGVtcGxhdGU+XHJcblxyXG4gICAgPGZzLWNvbnRhaW5lcj5cclxuICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XHJcbiAgICAgICAgPHNsb3QgbmFtZT1cInRhYnNcIj48L3Nsb3Q+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDxjb21wb25lbnQgOmlzPVwiY2FyZENvbXBvbmVudE5hbWVcIiBjbGFzcz1cImZzLWxheW91dC1jYXJkLWJvZHlcIj5cclxuICAgICAgICA8dGVtcGxhdGUgI3RpdGxlPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1iYXJcIj5cclxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cImFjdGlvbmJhclwiPjwvc2xvdD5cclxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInRvb2xiYXJcIj48L3Nsb3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1iYXJcIj5cclxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cImFjdGlvbmJhclwiPjwvc2xvdD5cclxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInRvb2xiYXJcIj48L3Nsb3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgIDxmcy1jb250YWluZXI+XHJcbiAgICAgICAgICA8IS0tIOm7mOiupOaPkuanvSAtLT5cclxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cclxuICAgICAgICAgIDwhLS0gdGFibGUgLS0+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwidGFibGVcIj48L3Nsb3Q+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwiZm9ybVwiPjwvc2xvdD5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtY3J1ZC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyLXRvcFwiPjwvc2xvdD5cclxuICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwicGFnaW5hdGlvblwiPjwvc2xvdD5cclxuICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyLWJvdHRvbVwiPjwvc2xvdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgIDwvZnMtY29udGFpbmVyPlxyXG4gICAgICA8L2NvbXBvbmVudD5cclxuICAgIDwvZnMtY29udGFpbmVyPlxyXG4gIDwvZnMtY29udGFpbmVyPlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgaW5qZWN0LCByZWYgfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtdWlcIjtcclxuLyoqXHJcbiAqIGNhcmTluIPlsYBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc0xheW91dENhcmRcIixcclxuICBzZXR1cCgpIHtcclxuICAgIGNvbnN0IGdldENydWRCaW5kaW5nID0gaW5qZWN0KFwiZ2V0OmNydWRCaW5kaW5nXCIpO1xyXG4gICAgY29uc3Qgc2VhcmNoU2hvdyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgaWYgKGdldENydWRCaW5kaW5nID09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHJldHVybiBnZXRDcnVkQmluZGluZygpPy5zZWFyY2g/LnNob3c7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG5cclxuICAgIGNvbnN0IGNhcmRDb21wb25lbnROYW1lID0gcmVmKHVpLmNhcmQubmFtZSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZWFyY2hTaG93LFxyXG4gICAgICBjYXJkQ29tcG9uZW50TmFtZVxyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuXHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtbGF5b3V0LWNhcmQge1xyXG4gICYgPiAuYm94ID4gLmlubmVyID4gLmhlYWRlciB7XHJcbiAgICBtYXJnaW46IDEwcHggMTBweCA1cHggMTBweDtcclxuICB9XHJcbiAgJiA+IC5ib3ggPiAuaW5uZXIgPiAuYm9keSB7XHJcbiAgICBtYXJnaW46IDVweCAxMHB4IDEwcHggMTBweDtcclxuICB9XHJcbiAgLnRvcC1iYXIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICB9XHJcbiAgLmZzLWNvbnRhaW5lciB7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgLmJveCB7XHJcbiAgICAgIC5pbm5lciB7XHJcbiAgICAgICAgLmhlYWRlciB7XHJcbiAgICAgICAgICAuYW50LWNhcmQtYm9keSB7XHJcbiAgICAgICAgICAgIHBhZGRpbmc6IDE0cHg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC5mcy1sYXlvdXQtY2FyZC1ib2R5IHtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG5cclxuICAgIC5hbnQtY2FyZC1oZWFkIHtcclxuICAgICAgbWluLWhlaWdodDogMDtcclxuICAgICAgcGFkZGluZzogMHB4O1xyXG4gICAgICAuYW50LWNhcmQtaGVhZC10aXRsZSB7XHJcbiAgICAgICAgcGFkZGluZzogMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC5lbC1jYXJkX19oZWFkZXIge1xyXG4gICAgICBwYWRkaW5nOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC5uLWNhcmQtaGVhZGVyIHtcclxuICAgICAgcGFkZGluZzogMHB4O1xyXG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTtcclxuICAgIH1cclxuICAgIC5uLWNhcmRfX2NvbnRlbnQge1xyXG4gICAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5mcy1jcnVkLWFjdGlvbmJhciB7XHJcbiAgICAgIG1hcmdpbjogMTBweDtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIH1cclxuICAgIC5mcy1jcnVkLXRvb2xiYXIge1xyXG4gICAgICBtYXJnaW46IDEwcHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLmFudC1jYXJkLWJvZHkge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgfVxyXG4gICAgLmVsLWNhcmRfX2JvZHkge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLmZzLXRhYnMtZmlsdGVyIHtcclxuICAgIG1hcmdpbi1ib3R0b206IC0xcHg7XHJcbiAgICAubi10YWJzIC5uLXRhYnMtbmF2Lm4tdGFicy1uYXYtLWNhcmQtdHlwZSAubi10YWJzLXRhYiB7XHJcbiAgICAgICYubi10YWJzLXRhYi0tYWN0aXZlIHtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xyXG4gICAgICB9XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY2MDtcclxuICAgIH1cclxuXHJcbiAgICAuZWwtdGFicy0tY2FyZCA+IC5lbC10YWJzX19oZWFkZXIgLmVsLXRhYnNfX2l0ZW0ge1xyXG4gICAgICAmLmlzLWFjdGl2ZSB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcclxuICAgICAgfVxyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmODA7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbjwvc3R5bGU+XHJcbiIsbnVsbCxudWxsLCI8dGVtcGxhdGU+XHJcbiAgPHNwYW4gY2xhc3M9XCJmcy1pY29uaWZ5XCIgOmNsYXNzPVwieyAnZnMtaWNvbmlmeS1zcGluJzogc3BpbiB9XCI+XHJcbiAgICA8SWNvbiByZWY9XCJpY29uaWZ5UmVmXCIgOmljb249XCJpY29uXCIgOmlubGluZT1cInRydWVcIiAvPlxyXG4gIDwvc3Bhbj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBuZXh0VGljaywgb25Nb3VudGVkLCByZWYsIHVucmVmLCB3YXRjaCB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgSWNvbiB9IGZyb20gXCJAaWNvbmlmeS92dWVcIjtcclxuLyoqXHJcbiAqIGljb25pZnkg5oyJ6ZyA5Yqg6L295Zu+5qCH57uE5Lu2XHJcbiAqIGh0dHBzOi8vaWNvbmlmeS5kZXNpZ24vaWNvbi1zZXRzL2lvbi9cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc0ljb25pZnlcIixcclxuICBjb21wb25lbnRzOiB7IEljb24gfSxcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDlm77moIflkI3np7BcclxuICAgICAqL1xyXG4gICAgaWNvbjoge1xyXG4gICAgICB0eXBlOiBTdHJpbmdcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaXi+i9rFxyXG4gICAgICovXHJcbiAgICBzcGluOiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgfSxcclxuICBzZXR1cChwcm9wcywgY3R4KSB7XHJcbiAgICBjb25zdCBpY29uaWZ5UmVmID0gcmVmKG51bGwpO1xyXG4gICAgcmV0dXJuIHsgaWNvbmlmeVJlZiB9O1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLWljb25pZnkge1xyXG4gIC8vZGlzcGxheTogaW5saW5lLWZsZXggIWltcG9ydGFudDtcclxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICYtc3BpbiB7XHJcbiAgICBzdmcge1xyXG4gICAgICBhbmltYXRpb246IGZzTG9hZGluZ0NpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmLmZzLWljb24ge1xyXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XHJcbiAgfVxyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIGZzTG9hZGluZ0NpcmNsZSB7XHJcbiAgZnJvbSB7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcclxuICB9XHJcbiAgdG8ge1xyXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcclxuICB9XHJcbn1cclxuXHJcbkAtd2Via2l0LWtleWZyYW1lcyBmc0xvYWRpbmdDaXJjbGUge1xyXG4gIGZyb20ge1xyXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XHJcbiAgfVxyXG4gIHRvIHtcclxuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XHJcbiAgfVxyXG59XHJcblxyXG4vL3NwYW4uaWNvbmlmeSB7XHJcbi8vICBkaXNwbGF5OiBibG9jaztcclxuLy8gIG1pbi13aWR0aDogMWVtO1xyXG4vLyAgbWluLWhlaWdodDogMWVtO1xyXG4vLyAgLy8gYmFja2dyb3VuZC1jb2xvcjogQGljb25pZnktYmctY29sb3I7XHJcbi8vICBib3JkZXItcmFkaXVzOiAxMDAlO1xyXG4vL31cclxuPC9zdHlsZT5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxzcGFuIGNsYXNzPVwiZnMtaWNvbmlmeVwiIDpjbGFzcz1cInsgJ2ZzLWljb25pZnktc3Bpbic6IHNwaW4gfVwiPlxyXG4gICAgPEljb24gcmVmPVwiaWNvbmlmeVJlZlwiIDppY29uPVwiaWNvblwiIDppbmxpbmU9XCJ0cnVlXCIgLz5cclxuICA8L3NwYW4+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIG9uTW91bnRlZCwgcmVmLCB1bnJlZiwgd2F0Y2ggfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IEljb24gfSBmcm9tIFwiQGljb25pZnkvdnVlXCI7XHJcbi8qKlxyXG4gKiBpY29uaWZ5IOaMiemcgOWKoOi9veWbvuagh+e7hOS7tlxyXG4gKiBodHRwczovL2ljb25pZnkuZGVzaWduL2ljb24tc2V0cy9pb24vXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNJY29uaWZ5XCIsXHJcbiAgY29tcG9uZW50czogeyBJY29uIH0sXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5Zu+5qCH5ZCN56ewXHJcbiAgICAgKi9cclxuICAgIGljb246IHtcclxuICAgICAgdHlwZTogU3RyaW5nXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDml4vovaxcclxuICAgICAqL1xyXG4gICAgc3Bpbjoge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xyXG4gICAgY29uc3QgaWNvbmlmeVJlZiA9IHJlZihudWxsKTtcclxuICAgIHJldHVybiB7IGljb25pZnlSZWYgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi5mcy1pY29uaWZ5IHtcclxuICAvL2Rpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7XHJcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAmLXNwaW4ge1xyXG4gICAgc3ZnIHtcclxuICAgICAgYW5pbWF0aW9uOiBmc0xvYWRpbmdDaXJjbGUgMXMgaW5maW5pdGUgbGluZWFyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJi5mcy1pY29uIHtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gIH1cclxufVxyXG5cclxuQGtleWZyYW1lcyBmc0xvYWRpbmdDaXJjbGUge1xyXG4gIGZyb20ge1xyXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XHJcbiAgfVxyXG4gIHRvIHtcclxuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XHJcbiAgfVxyXG59XHJcblxyXG5ALXdlYmtpdC1rZXlmcmFtZXMgZnNMb2FkaW5nQ2lyY2xlIHtcclxuICBmcm9tIHtcclxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xyXG4gIH1cclxuICB0byB7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xyXG4gIH1cclxufVxyXG5cclxuLy9zcGFuLmljb25pZnkge1xyXG4vLyAgZGlzcGxheTogYmxvY2s7XHJcbi8vICBtaW4td2lkdGg6IDFlbTtcclxuLy8gIG1pbi1oZWlnaHQ6IDFlbTtcclxuLy8gIC8vIGJhY2tncm91bmQtY29sb3I6IEBpY29uaWZ5LWJnLWNvbG9yO1xyXG4vLyAgYm9yZGVyLXJhZGl1czogMTAwJTtcclxuLy99XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3BhbiA6Y2xhc3M9XCJbJ2ZzLWljb24tc3ZnJywgc3BpbiAmJiAnZnMtaWNvbi1zcGluJ11cIj5cclxuICAgIDxzdmcgY2xhc3M9XCJmcy1pY29uLXN2Zy1jb250ZW50XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICAgIDx1c2UgOnhsaW5rOmhyZWY9XCJzeW1ib2xJZFwiPjwvdXNlPlxyXG4gICAgPC9zdmc+XHJcbiAgPC9zcGFuPlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgdHlwZSB7IENTU1Byb3BlcnRpZXMgfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgY29tcHV0ZWQgfSBmcm9tIFwidnVlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNTdmdJY29uXCIsXHJcbiAgcHJvcHM6IHtcclxuICAgIGljb246IHtcclxuICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHNpemU6IHtcclxuICAgICAgdHlwZTogW051bWJlciwgU3RyaW5nXSxcclxuICAgICAgZGVmYXVsdDogMTZcclxuICAgIH0sXHJcbiAgICBzcGluOiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgfSxcclxuICBzZXR1cChwcm9wcykge1xyXG4gICAgY29uc3Qgc3ltYm9sSWQgPSBjb21wdXRlZCgoKSA9PiBgIyR7cHJvcHMuaWNvbn1gKTtcclxuXHJcbiAgICBjb25zdCBnZXRTdHlsZSA9IGNvbXB1dGVkKCgpOiBDU1NQcm9wZXJ0aWVzID0+IHtcclxuICAgICAgY29uc3QgeyBzaXplIH0gPSBwcm9wcztcclxuICAgICAgbGV0IHMgPSBgJHtzaXplfWA7XHJcbiAgICAgIHMgPSBgJHtzLnJlcGxhY2UoXCJweFwiLCBcIlwiKX1weGA7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgd2lkdGg6IHMsXHJcbiAgICAgICAgaGVpZ2h0OiBzXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB7IHN5bWJvbElkLCBnZXRTdHlsZSB9O1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLWljb24tc3ZnIHtcclxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuICAmLmZzLWljb24tc3BpbiB7XHJcbiAgICBhbmltYXRpb246IGxvYWRpbmdDaXJjbGUgMXMgaW5maW5pdGUgbGluZWFyO1xyXG4gIH1cclxuXHJcbiAgLmZzLWljb24tc3ZnLWNvbnRlbnQge1xyXG4gICAgd2lkdGg6IDFlbTtcclxuICAgIGhlaWdodDogMWVtO1xyXG4gICAgdmVydGljYWwtYWxpZ246IC0wLjE1ZW07XHJcbiAgICBmaWxsOiBjdXJyZW50Q29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPHNwYW4gOmNsYXNzPVwiWydmcy1pY29uLXN2ZycsIHNwaW4gJiYgJ2ZzLWljb24tc3BpbiddXCI+XHJcbiAgICA8c3ZnIGNsYXNzPVwiZnMtaWNvbi1zdmctY29udGVudFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICA8dXNlIDp4bGluazpocmVmPVwic3ltYm9sSWRcIj48L3VzZT5cclxuICAgIDwvc3ZnPlxyXG4gIDwvc3Bhbj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHR5cGUgeyBDU1NQcm9wZXJ0aWVzIH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIGNvbXB1dGVkIH0gZnJvbSBcInZ1ZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzU3ZnSWNvblwiLFxyXG4gIHByb3BzOiB7XHJcbiAgICBpY29uOiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICBzaXplOiB7XHJcbiAgICAgIHR5cGU6IFtOdW1iZXIsIFN0cmluZ10sXHJcbiAgICAgIGRlZmF1bHQ6IDE2XHJcbiAgICB9LFxyXG4gICAgc3Bpbjoge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgc2V0dXAocHJvcHMpIHtcclxuICAgIGNvbnN0IHN5bWJvbElkID0gY29tcHV0ZWQoKCkgPT4gYCMke3Byb3BzLmljb259YCk7XHJcblxyXG4gICAgY29uc3QgZ2V0U3R5bGUgPSBjb21wdXRlZCgoKTogQ1NTUHJvcGVydGllcyA9PiB7XHJcbiAgICAgIGNvbnN0IHsgc2l6ZSB9ID0gcHJvcHM7XHJcbiAgICAgIGxldCBzID0gYCR7c2l6ZX1gO1xyXG4gICAgICBzID0gYCR7cy5yZXBsYWNlKFwicHhcIiwgXCJcIil9cHhgO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHdpZHRoOiBzLFxyXG4gICAgICAgIGhlaWdodDogc1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4geyBzeW1ib2xJZCwgZ2V0U3R5bGUgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi5mcy1pY29uLXN2ZyB7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcbiAgJi5mcy1pY29uLXNwaW4ge1xyXG4gICAgYW5pbWF0aW9uOiBsb2FkaW5nQ2lyY2xlIDFzIGluZmluaXRlIGxpbmVhcjtcclxuICB9XHJcblxyXG4gIC5mcy1pY29uLXN2Zy1jb250ZW50IHtcclxuICAgIHdpZHRoOiAxZW07XHJcbiAgICBoZWlnaHQ6IDFlbTtcclxuICAgIHZlcnRpY2FsLWFsaWduOiAtMC4xNWVtO1xyXG4gICAgZmlsbDogY3VycmVudENvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcbn1cclxuPC9zdHlsZT5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJmcy1sYWJlbFwiIDpjbGFzcz1cInsgY29tcGFjdDogY29tcGFjdCB9XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIiB2LWJpbmQ9XCJsYWJlbEF0dHJzXCI+XHJcbiAgICAgIHt7IGxhYmVsIH19XHJcbiAgICAgIDxzbG90IG5hbWU9XCJsYWJlbFwiPjwvc2xvdD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIiB2LWJpbmQ9XCJjb250ZW50QXR0cnNcIj5cclxuICAgICAgPHNsb3Q+PC9zbG90PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcclxuXHJcbi8qKlxyXG4gKiBsYWJlbOe7hOS7tlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzTGFiZWxcIixcclxuICBwcm9wczoge1xyXG4gICAgY29tcGFjdDoge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfSxcclxuICAgIGxhYmVsOiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogXCJcIlxyXG4gICAgfSxcclxuICAgIGxhYmVsQXR0cnM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe30pXHJcbiAgICB9LFxyXG4gICAgY29udGVudEF0dHJzOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdDogKCkgPT4gKHt9KVxyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLWxhYmVsIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgJi5jb21wYWN0IHtcclxuICAgIC5sYWJlbCB7XHJcbiAgICAgIG1pbi13aWR0aDogYXV0bztcclxuICAgIH1cclxuICAgIC5jb250ZW50IHtcclxuICAgICAgbWluLXdpZHRoOiBhdXRvO1xyXG4gICAgfVxyXG4gIH1cclxuICAubGFiZWwge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA4cHg7XHJcbiAgICBtaW4td2lkdGg6IDgwcHg7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xyXG4gIH1cclxuICAuY29udGVudCB7XHJcbiAgICBmbGV4OiAxO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIG1pbi13aWR0aDogODBweDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICBmbGV4LXdyYXA6IG5vd3JhcDtcclxuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgfVxyXG4gIG1hcmdpbi1yaWdodDogMTVweDtcclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLWxhYmVsXCIgOmNsYXNzPVwieyBjb21wYWN0OiBjb21wYWN0IH1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJsYWJlbFwiIHYtYmluZD1cImxhYmVsQXR0cnNcIj5cclxuICAgICAge3sgbGFiZWwgfX1cclxuICAgICAgPHNsb3QgbmFtZT1cImxhYmVsXCI+PC9zbG90PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiIHYtYmluZD1cImNvbnRlbnRBdHRyc1wiPlxyXG4gICAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xyXG5cclxuLyoqXHJcbiAqIGxhYmVs57uE5Lu2XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNMYWJlbFwiLFxyXG4gIHByb3BzOiB7XHJcbiAgICBjb21wYWN0OiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAgbGFiZWw6IHtcclxuICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICBkZWZhdWx0OiBcIlwiXHJcbiAgICB9LFxyXG4gICAgbGFiZWxBdHRyczoge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7fSlcclxuICAgIH0sXHJcbiAgICBjb250ZW50QXR0cnM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe30pXHJcbiAgICB9XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtbGFiZWwge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAmLmNvbXBhY3Qge1xyXG4gICAgLmxhYmVsIHtcclxuICAgICAgbWluLXdpZHRoOiBhdXRvO1xyXG4gICAgfVxyXG4gICAgLmNvbnRlbnQge1xyXG4gICAgICBtaW4td2lkdGg6IGF1dG87XHJcbiAgICB9XHJcbiAgfVxyXG4gIC5sYWJlbCB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDtcclxuICAgIG1pbi13aWR0aDogODBweDtcclxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XHJcbiAgfVxyXG4gIC5jb250ZW50IHtcclxuICAgIGZsZXg6IDE7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgbWluLXdpZHRoOiA4MHB4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICB9XHJcbiAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgYXMgX19NQUNST1NfZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qLyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNMb2FkaW5nXCJcclxufSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cclxuICA8ZGl2IHYtaWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJmcy1sb2FkaW5nXCI+XHJcbiAgICA8ZnMtaWNvbiBjbGFzcz1cImZzLWljb24tc3BpblwiIDppY29uPVwiaWNvbiA/PyB1aS5pY29ucy5yZWZyZXNoXCI+PC9mcy1pY29uPlxyXG4gICAgPHNwYW4gdi1pZj1cInRleHRcIj57eyB0ZXh0IH19PC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcclxuXHJcbjtcclxuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgbG9hZGluZz86IGJvb2xlYW47XHJcbiAgaWNvbj86IHN0cmluZztcclxuICB0ZXh0Pzogc3RyaW5nO1xyXG59PigpO1xyXG48L3NjcmlwdD5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi5mcy1sb2FkaW5nIHtcclxuICB3aWR0aDogMTAwJTtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIC5mcy1pY29uIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICB3aWR0aDogOTAlO1xyXG4gICAgaGVpZ2h0OiA5MCU7XHJcbiAgICBtYXgtd2lkdGg6IDUwcHg7XHJcbiAgICBtYXgtaGVpZ2h0OiA1MHB4O1xyXG4gICAgJi5mcy1pY29uLXNwaW4ge1xyXG4gICAgICBzdmcge1xyXG4gICAgICAgIGFuaW1hdGlvbjogZnMtbG9hZGluZy1jaXJjbGUgMXMgaW5maW5pdGUgbGluZWFyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBALXdlYmtpdC1rZXlmcmFtZXMgZnMtbG9hZGluZy1jaXJjbGUge1xyXG4gICAgZnJvbSB7XHJcbiAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xyXG4gICAgfVxyXG4gICAgdG8ge1xyXG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLWJveFwiPlxyXG4gICAgPHNsb3Q+PC9zbG90PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XHJcblxyXG4vKipcclxuICog5Y2V57qv55qE5YyF6KO55LiA5Liq5a2Q57uE5Lu2XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNCb3hcIlxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZnMtYm94XCI+XHJcbiAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcclxuXHJcbi8qKlxyXG4gKiDljZXnuq/nmoTljIXoo7nkuIDkuKrlrZDnu4Tku7ZcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc0JveFwiXHJcbn0pO1xyXG48L3NjcmlwdD5cclxuIixudWxsLG51bGwsbnVsbCwiPHRlbXBsYXRlPlxyXG4gIDxjb21wb25lbnRcclxuICAgIDppcz1cInVpLmZvcm0ubmFtZVwiXHJcbiAgICByZWY9XCJmb3JtUmVmXCJcclxuICAgIGNsYXNzPVwiZnMtZm9ybVwiXHJcbiAgICA6Y2xhc3M9XCJ7XHJcbiAgICAgICdmcy1mb3JtLWdyaWQnOiBkaXNwbGF5ID09PSAnZ3JpZCcsXHJcbiAgICAgICdmcy1mb3JtLWZsZXgnOiBkaXNwbGF5ID09PSAnZmxleCcsXHJcbiAgICAgICdmcy1mb3JtLWludmFsaWQnOiB2YWxpZFJlZiA9PT0gZmFsc2VcclxuICAgIH1cIlxyXG4gICAgb25zdWJtaXQ9XCJldmVudC5wcmV2ZW50RGVmYXVsdCgpO1wiXHJcbiAgICA6bW9kZWw9XCJmb3JtXCJcclxuICA+XHJcbiAgICA8IS0tIHJvdyAtLT5cclxuICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiBjbGFzcz1cImZzLXJvd1wiIHYtYmluZD1cInJvd1wiPlxyXG4gICAgICA8IS0tIGNvbCAtLT5cclxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiaXRlbSBpbiBjb21wdXRlZERlZmF1bHRDb2x1bW5zXCIgOmtleT1cIml0ZW0/LmtleVwiPlxyXG4gICAgICAgIDxmcy1mb3JtLWl0ZW0tY29sXHJcbiAgICAgICAgICA6cmVmPVwiXHJcbiAgICAgICAgICAgIChlbDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtSXRlbVJlZnNbaXRlbS5rZXldID0gZWw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgOmNvbD1cIm1lcmdlQ29sKGl0ZW0uY29sKVwiXHJcbiAgICAgICAgICA6aXRlbT1cIml0ZW1cIlxyXG4gICAgICAgICAgOmhlbHBlcj1cImhlbHBlclwiXHJcbiAgICAgICAgICA6bW9kZWwtdmFsdWU9XCJnZXQoZm9ybSwgaXRlbS5rZXkpXCJcclxuICAgICAgICAgIDpzbG90cz1cIm1lcmdlZFNsb3RzWydmb3JtXycgKyBpdGVtLmtleV1cIlxyXG4gICAgICAgICAgOmdldC1jb250ZXh0LWZuPVwiZ2V0Q29udGV4dEZuXCJcclxuICAgICAgICAgIEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJzZXQoZm9ybSwgaXRlbS5rZXksICRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8L2NvbXBvbmVudD5cclxuICAgIDxjb21wb25lbnRcclxuICAgICAgOmlzPVwiY29tcHV0ZWRHcm91cC53cmFwcGVyLnBhcmVudFwiXHJcbiAgICAgIHYtaWY9XCJjb21wdXRlZEdyb3VwLndyYXBwZXJcIlxyXG4gICAgICB2LW1vZGVsOlt1aS5jb2xsYXBzZS5tb2RlbFZhbHVlXT1cImdyb3VwQWN0aXZlS2V5XCJcclxuICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiXHJcbiAgICAgIHYtYmluZD1cImNvbXB1dGVkR3JvdXBcIlxyXG4gICAgPlxyXG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoZ3JvdXBJdGVtLCBncm91cEtleSkgb2YgY29tcHV0ZWRHcm91cC5ncm91cHNcIiA6a2V5PVwiZ3JvdXBLZXlcIj5cclxuICAgICAgICA8Y29tcG9uZW50XHJcbiAgICAgICAgICA6aXM9XCJjb21wdXRlZEdyb3VwLndyYXBwZXIuY2hpbGRcIlxyXG4gICAgICAgICAgdi1pZj1cImdyb3VwSXRlbVNob3coZ3JvdXBJdGVtKVwiXHJcbiAgICAgICAgICA6W3VpLmNvbGxhcHNlLmtleU5hbWVdPVwiZ3JvdXBLZXlcIlxyXG4gICAgICAgICAgdi1iaW5kPVwiZ3JvdXBJdGVtXCJcclxuICAgICAgICAgIDpjbGFzcz1cInsgJ2ZzLWZvcm0tZ3JvdXAtZXJyb3InOiBlcnJvcnNSZWZbJ2dyb3VwLicgKyBncm91cEtleV0gfVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIHNsb3ROYW1lKSBvZiBncm91cEl0ZW0uc2xvdHNcIiA6a2V5PVwic2xvdE5hbWVcIiAjW3Nsb3ROYW1lXT1cInNjb3BlXCI+XHJcbiAgICAgICAgICAgIDxmcy1yZW5kZXIgOnJlbmRlci1mdW5jPVwiaXRlbVwiIDpzY29wZT1cInsgLi4uc2NvcGUsIGhhc0Vycm9yOiBlcnJvcnNSZWZbJ2dyb3VwLicgKyBncm91cEtleV0gfVwiIC8+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPCEtLSByb3cgLS0+XHJcbiAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCIgY2xhc3M9XCJmcy1yb3dcIiB2LWJpbmQ9XCJyb3dcIj5cclxuICAgICAgICAgICAgPCEtLSBjb2wgLS0+XHJcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cImtleSBpbiBncm91cEl0ZW0uY29sdW1uc1wiIDprZXk9XCJrZXlcIj5cclxuICAgICAgICAgICAgICA8ZnMtZm9ybS1pdGVtLWNvbFxyXG4gICAgICAgICAgICAgICAgdi1pZj1cImNvbXB1dGVkQ29sdW1uc1trZXldXCJcclxuICAgICAgICAgICAgICAgIDpyZWY9XCJcclxuICAgICAgICAgICAgICAgICAgKGVsOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1JdGVtUmVmc1trZXldID0gZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgOmNvbD1cIm1lcmdlQ29sKGNvbXB1dGVkQ29sdW1uc1trZXldLmNvbClcIlxyXG4gICAgICAgICAgICAgICAgOml0ZW09XCJjb21wdXRlZENvbHVtbnNba2V5XVwiXHJcbiAgICAgICAgICAgICAgICA6bW9kZWwtdmFsdWU9XCJnZXQoZm9ybSwga2V5KVwiXHJcbiAgICAgICAgICAgICAgICA6c2xvdHM9XCJtZXJnZWRTbG90c1snZm9ybV8nICsga2V5XVwiXHJcbiAgICAgICAgICAgICAgICA6Z2V0LWNvbnRleHQtZm49XCJnZXRDb250ZXh0Rm5cIlxyXG4gICAgICAgICAgICAgICAgOmhlbHBlcj1cImhlbHBlclwiXHJcbiAgICAgICAgICAgICAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwic2V0KGZvcm0sIGtleSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC9jb21wb25lbnQ+XHJcbiAgPC9jb21wb25lbnQ+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQge1xyXG4gIGNvbXB1dGVkLFxyXG4gIGRlZmluZUNvbXBvbmVudCxcclxuICBnZXRDdXJyZW50SW5zdGFuY2UsXHJcbiAgb25Nb3VudGVkLFxyXG4gIHJlYWN0aXZlLFxyXG4gIFJlZixcclxuICByZWYsXHJcbiAgdG9SYXcsXHJcbiAgdW5yZWYsXHJcbiAgVW53cmFwTmVzdGVkUmVmcyxcclxuICB3YXRjaFxyXG59IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgZWFjaCwgc2V0LCBjbG9uZURlZXAsIGVudHJpZXMsIGdldCwgdW5zZXQsIGZvckVhY2gsIG1lcmdlIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5pbXBvcnQgeyBDb21wdXRlVmFsdWUsIHVzZUNvbXB1dGUgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1jb21wdXRlXCI7XHJcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwubG9nXCI7XHJcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtbWVyZ2VcIjtcclxuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IEZvcm1TY29wZUNvbnRleHQsIFNldEZvcm1EYXRhT3B0aW9ucywgdXNlVWksIHV0aWxzIH0gZnJvbSBcIi4uLy4uL2luZGV4XCI7XHJcblxyXG4vKipcclxuICog6YWN572u5YyW55qE6KGo5Y2V57uE5Lu2XHJcbiAqIOaatOmcsueahOaWueazle+8mlxyXG4gKiByZWYuc3VibWl0KCkgPSDmj5DkuqTooajljZVcclxuICogcmVmLnJlc2V0KCkgPSDph43nva7ooajljZVcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc0Zvcm1cIixcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDliJ3lp4vooajljZXmlbDmja5cclxuICAgICAqKi9cclxuICAgIGluaXRpYWxGb3JtOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOWtl+auteaooeeJiFxyXG4gICAgICoge1xyXG4gICAgICogICBrZXk6e1xyXG4gICAgICogICAgIHRpdGxlOiBcIuWtl+auteWQjeensFwiLFxyXG4gICAgICogICAgIGNvbXBvbmVudDp7XHJcbiAgICAgKiAgICAgICBuYW1lOlwi57uE5Lu25ZCN56ewXCJcclxuICAgICAqICAgICAgIC4uLue7hOS7tuWPguaVsFxyXG4gICAgICogICAgIH1cclxuICAgICAqICAgfVxyXG4gICAgICogfVxyXG4gICAgICogKi9cclxuICAgIGNvbHVtbnM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOWtl+auteWIhue7hFxyXG4gICAgICoge1xyXG4gICAgICogICB0eXBlOid4eHgnLCAvL+WIhue7hOWxleekuuexu+Wei1xyXG4gICAgICogICBncm91cHM6eyAvL+WIhue7hOaVsOaNrlxyXG4gICAgICogICAgIGdyb3VwS2V5OnsgdGl0bGU6J3h4eCcsY29sdW1uczpbJ2ZpZWxkS2V5JywnZmllbGRLZXknXX1cclxuICAgICAqICAgfVxyXG4gICAgICogfVxyXG4gICAgICovXHJcbiAgICBncm91cDoge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog6YeN572u6KGo5Y2V5ZCO55qE5pON5L2cXHJcbiAgICAgKi9cclxuICAgIGRvUmVzZXQ6IHtcclxuICAgICAgdHlwZTogRnVuY3Rpb24sXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog54K55Ye75L+d5a2Y5oyJ6ZKu77yM6KGo5Y2V5qCh6aqM5YmN5omn6KGM5pON5L2c77yIYXN5bmPvvIlcclxuICAgICAqL1xyXG4gICAgYmVmb3JlVmFsaWRhdGU6IHtcclxuICAgICAgdHlwZTogRnVuY3Rpb24sXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog6KGo5Y2V5qCh6aqM5a6M5a6M5oiQ5ZCO77yM5o+Q5Lqk5YmN5aSE55CG77yIYXN5bmPvvIlcclxuICAgICAqL1xyXG4gICAgYmVmb3JlU3VibWl0OiB7XHJcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOeCueWHu+S/neWtmOaMiemSruaXtuaJp+ihjOaTjeS9nO+8iGFzeW5j77yJXHJcbiAgICAgKi9cclxuICAgIGRvU3VibWl0OiB7XHJcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOihqOWNleaPkOS6pOWQjuWkhOeQhu+8iGFzeW5j77yJXHJcbiAgICAgKi9cclxuICAgIGFmdGVyU3VibWl0OiB7XHJcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaPkuanveWGheWuuVxyXG4gICAgICovXHJcbiAgICBzbG90czoge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQ6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOW4g+WxgOaWueW8j+OAkGZsZXh8Z3JpZOOAkVxyXG4gICAgICovXHJcbiAgICBkaXNwbGF5OiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogXCJmbGV4XCIgLy8gZmxleFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5bqP5Y+377yM57yW6L6R5pe25Lya5Lyg5YWlXHJcbiAgICAgKi9cclxuICAgIGluZGV4OiB7XHJcbiAgICAgIHR5cGU6IE51bWJlcixcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmqKHlvI8gW2FkZCxlZGl0LHZpZXcs6Ieq5a6a5LmJXVxyXG4gICAgICovXHJcbiAgICBtb2RlOiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBhLXJvd+mFjee9rlxyXG4gICAgICovXHJcbiAgICByb3c6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIGVsLWNvbHxhLWNvbOmFjee9ru+8jOWPr+mFjee9rui3qOWIl1xyXG4gICAgICovXHJcbiAgICBjb2w6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIGZvcm1JdGVt55qE5YWs5YWx6YWN572uXHJcbiAgICAgKi9cclxuICAgIGZvcm1JdGVtOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBoZWxwZXLkvY3nva7vvJp7cG9zaXRpb246J2xhYmVsJ31cclxuICAgICAqL1xyXG4gICAgaGVscGVyOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuXHJcbiAgICB3YXRjaDoge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvbixcclxuICAgICAgZGVmYXVsdDogbnVsbFxyXG4gICAgfVxyXG4gIH0sXHJcbiAgZW1pdHM6IFtcInJlc2V0XCIsIFwic3VibWl0XCIsIFwic3VjY2Vzc1wiLCBcInZhbGlkYXRpb25FcnJvclwiLCBcInZhbHVlLWNoYW5nZVwiLCBcImluaXRcIl0sXHJcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xyXG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgICBjb25zdCB7IEFzeW5jQ29tcHV0ZVZhbHVlLCBkb0NvbXB1dGVkIH0gPSB1c2VDb21wdXRlKCk7XHJcbiAgICBjb25zdCBmb3JtUmVmID0gcmVmKCk7XHJcbiAgICBjb25zdCBmb3JtOiBVbndyYXBOZXN0ZWRSZWZzPGFueT4gPSByZWFjdGl2ZSh7fSk7XHJcbiAgICBjb25zdCB7IHByb3h5IH0gPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcclxuXHJcbiAgICAvLyB1dGlscy50cmFjZShcImZzLWZvcm1cIik7XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxyXG4gICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLnZhbHVlICE9IG51bGwgJiYgKGl0ZW0udmFsdWUgaW5zdGFuY2VvZiBBc3luY0NvbXB1dGVWYWx1ZSB8fCBpdGVtLnZhbHVlIGluc3RhbmNlb2YgQ29tcHV0ZVZhbHVlKSkge1xyXG4gICAgICAgIGxvZ2dlci53YXJuKFwiZm9ybS52YWx1ZemFjee9ruS4jeaUr+aMgUNvbXB1dGUvQXN5bmNDb21wdXRl57G75Z6L55qE5Yqo5oCB6K6h566XXCIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxGb3JtKCkge1xyXG4gICAgICBjb25zdCBmb3JtID0ge307XHJcbiAgICAgIC8vIOWIneWni+aVsOaNrui1i+WAvFxyXG4gICAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtOiBhbnksIGtleTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGVmVmFsdWUgPSB1bnJlZihpdGVtLnZhbHVlKTtcclxuICAgICAgICBpZiAoZGVmVmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgc2V0KGZvcm0sIGtleSwgZGVmVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIG1lcmdlKGZvcm0sIGNsb25lRGVlcChwcm9wcy5pbml0aWFsRm9ybSkpO1xyXG4gICAgICByZXR1cm4gZm9ybTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbml0aWFsRm9ybSA9IGNyZWF0ZUluaXRpYWxGb3JtKCk7XHJcbiAgICBzZXRGb3JtRGF0YShpbml0aWFsRm9ybSk7XHJcblxyXG4gICAgY29uc3Qgc2NvcGU6IFJlZjxGb3JtU2NvcGVDb250ZXh0PiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICByb3c6IGluaXRpYWxGb3JtLFxyXG4gICAgICAgIGZvcm0sXHJcbiAgICAgICAgaW5kZXg6IHByb3BzLmluZGV4LFxyXG4gICAgICAgIG1vZGU6IHByb3BzLm1vZGUgfHwgXCJhZGRcIixcclxuICAgICAgICBhdHRyczogY3R4LmF0dHJzLFxyXG4gICAgICAgIGdldENvbXBvbmVudFJlZlxyXG4gICAgICB9IGFzIEZvcm1TY29wZUNvbnRleHQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRDb250ZXh0Rm4oKSB7XHJcbiAgICAgIHJldHVybiBzY29wZS52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb21wdXRlZENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiBwcm9wcy5jb2x1bW5zO1xyXG4gICAgfSk7XHJcbiAgICAvL2Zvcm0udmFsdWVCdWlsZGVyXHJcblxyXG4gICAgZnVuY3Rpb24gZG9WYWx1ZUJ1aWxkZXIoZm9ybTogYW55KSB7XHJcbiAgICAgIGlmIChmb3JtID09IG51bGwpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55LCBrZXk6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IGdldChmb3JtLCBrZXkpO1xyXG4gICAgICAgIGlmIChpdGVtLnZhbHVlQnVpbGRlcikge1xyXG4gICAgICAgICAgY29uc3QgcmVzOiBhbnkgPSBpdGVtLnZhbHVlQnVpbGRlcih7XHJcbiAgICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIHJvdzogaW5pdGlhbEZvcm0sXHJcbiAgICAgICAgICAgIGZvcm0sXHJcbiAgICAgICAgICAgIGluZGV4OiBwcm9wcy5pbmRleCxcclxuICAgICAgICAgICAgbW9kZTogcHJvcHMubW9kZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAocmVzICE9IG51bGwgJiYgIShyZXMgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xyXG4gICAgICAgICAgICBzZXQoZm9ybSwga2V5LCByZXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Rm9ybURhdGEoKSB7XHJcbiAgICAgIHJldHVybiBmb3JtO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gc2V0Rm9ybURhdGEoZm9ybURhdGE6IGFueSwgb3B0aW9uczogU2V0Rm9ybURhdGFPcHRpb25zID0ge30pIHtcclxuICAgICAgZG9WYWx1ZUJ1aWxkZXIoZm9ybURhdGEpO1xyXG5cclxuICAgICAgaWYgKG9wdGlvbnMubWVyZ2VGb3JtID09PSBmYWxzZSkge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm0pIHtcclxuICAgICAgICAgIGRlbGV0ZSBmb3JtW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIG1lcmdlKGZvcm0sIGZvcm1EYXRhKTtcclxuICAgICAgY29uc3QgeyB2YWx1ZUNoYW5nZSB9ID0gb3B0aW9ucztcclxuICAgICAgaWYgKHZhbHVlQ2hhbmdlKSB7XHJcbiAgICAgICAgZm9yRWFjaChwcm9wcy5jb2x1bW5zLCAoY29sdW1uOiBhbnksIGtleTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1ba2V5XTtcclxuICAgICAgICAgIGRvVmFsdWVDaGFuZ2Uoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtZXJnZUNvbCguLi5jb2w6IGFueSkge1xyXG4gICAgICByZXR1cm4gbWVyZ2Uoe30sIHByb3BzLmNvbCwgLi4uY29sKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBidWlsZEl0ZW1TY29wZShpdGVtOiBhbnkpOiBGb3JtU2NvcGVDb250ZXh0IHtcclxuICAgICAgcmV0dXJuIHsga2V5OiBpdGVtLmtleSwgLi4uc2NvcGUudmFsdWUgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBkb1ZhbHVlQnVpbGRlcihmb3JtKTtcclxuXHJcbiAgICAvLyB3YXRjaChcclxuICAgIC8vICAgKCkgPT4gcHJvcHMuaW5pdGlhbEZvcm0sXHJcbiAgICAvLyAgICgpID0+IHtcclxuICAgIC8vICAgICBzZXRGb3JtRGF0YShjcmVhdGVJbml0aWFsRm9ybSgpLCB7IG1lcmdlRm9ybTogZmFsc2UgfSk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICk7XHJcblxyXG4gICAgZnVuY3Rpb24gZG9WYWx1ZUNoYW5nZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgICBjb25zdCBldmVudCA9IHsga2V5LCB2YWx1ZSwgZm9ybVJlZjogcHJveHksIC4uLnNjb3BlLnZhbHVlLCBpbW1lZGlhdGU6IGZhbHNlIH07XHJcbiAgICAgIGN0eC5lbWl0KFwidmFsdWUtY2hhbmdlXCIsIGV2ZW50KTtcclxuICAgICAgbGV0IHZhbHVlQ2hhbmdlID0gcHJvcHMuY29sdW1uc1trZXldLnZhbHVlQ2hhbmdlO1xyXG4gICAgICBpZiAodmFsdWVDaGFuZ2UpIHtcclxuICAgICAgICBpZiAodmFsdWVDaGFuZ2UgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xyXG4gICAgICAgICAgdmFsdWVDaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVDaGFuZ2UuaGFuZGxlKSB7XHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZS5oYW5kbGUoZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZvcm1JdGVtUmVmczogUmVmID0gcmVmKHt9KTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRGb3JtSXRlbVJlZihrZXk6IHN0cmluZykge1xyXG4gICAgICByZXR1cm4gZm9ybUl0ZW1SZWZzLnZhbHVlW2tleV0uZ2V0Rm9ybUl0ZW1SZWYoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoa2V5OiBzdHJpbmcsIGlzQXN5bmMgPSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gZ2V0Rm9ybUl0ZW1SZWYoa2V5KT8uZ2V0Q29tcG9uZW50UmVmKGlzQXN5bmMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdyb3VwQWN0aXZlS2V5ID0gcmVmKFtdKTtcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNldHVwLXByb3BzLWRlc3RydWN0dXJlXHJcbiAgICBmb3JFYWNoKHByb3BzLmdyb3VwPy5ncm91cHMsIChncm91cEl0ZW06IGFueSwga2V5OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGdyb3VwSXRlbS5jb2xsYXBzZWQgIT09IHRydWUpIHtcclxuICAgICAgICBncm91cEFjdGl2ZUtleS52YWx1ZS5wdXNoKGtleSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxyXG4gICAgaWYgKHByb3BzLmdyb3VwPy5ncm91cFR5cGUgPT09IFwidGFic1wiKSB7XHJcbiAgICAgIGdyb3VwQWN0aXZlS2V5LnZhbHVlID0gZ3JvdXBBY3RpdmVLZXkudmFsdWUubGVuZ3RoID4gMCA/IGdyb3VwQWN0aXZlS2V5LnZhbHVlWzBdIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvL+aehOW7uuWIhue7hOaVsOaNrlxyXG4gICAgY29uc3QgY29tcHV0ZWRHcm91cCA9IGRvQ29tcHV0ZWQoXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICByZXR1cm4gcHJvcHMuZ3JvdXA7XHJcbiAgICAgIH0sXHJcbiAgICAgIGdldENvbnRleHRGbixcclxuICAgICAgbnVsbCxcclxuICAgICAgKGdyb3VwID0ge30pID0+IHtcclxuICAgICAgICAvL+aJvuWHuuayoeaciea3u+WKoOi/m+WIhue7hOeahOWtl+autVxyXG4gICAgICAgIGNvbnN0IGdyb3VwZWRLZXlzOiBhbnkgPSB7fTtcclxuICAgICAgICBmb3JFYWNoKGdyb3VwPy5ncm91cHMsIChncm91cEl0ZW06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGZvckVhY2goZ3JvdXBJdGVtLmNvbHVtbnMsIChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGNvbXB1dGVkQ29sdW1ucy52YWx1ZVtpdGVtXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgdXRpbHMubG9nZ2VyLndhcm4oXCLml6DmlYjnmoTliIbnu4TlrZfmrrXvvJpcIiArIGl0ZW0pO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBncm91cGVkS2V5c1tpdGVtXSA9IGtleTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCB0eXBlID0gZ3JvdXAuZ3JvdXBUeXBlO1xyXG4gICAgICAgIGxldCB3cmFwcGVyID0ge1xyXG4gICAgICAgICAgcGFyZW50OiB1aS5jb2xsYXBzZS5uYW1lLFxyXG4gICAgICAgICAgY2hpbGQ6IHVpLmNvbGxhcHNlSXRlbS5uYW1lXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodHlwZSA9PT0gXCJ0YWJzXCIpIHtcclxuICAgICAgICAgIHdyYXBwZXIucGFyZW50ID0gdWkudGFicy5uYW1lO1xyXG4gICAgICAgICAgd3JhcHBlci5jaGlsZCA9IHVpLnRhYlBhbmUubmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1lcmdlKFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB3cmFwcGVyLFxyXG4gICAgICAgICAgICBncm91cGVkS2V5c1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGdyb3VwXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZERlZmF1bHRDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb2x1bW5zOiBhbnkgPSBbXTtcclxuICAgICAgLy9kZWZhdWx0IGNvbHVtbnPmjpLluo9cclxuICAgICAgZm9yRWFjaChjb21wdXRlZENvbHVtbnMudmFsdWUsICh2YWx1ZTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBjbG9uZURlZXAocHJvcHMuZm9ybUl0ZW0gfHwge30pO1xyXG4gICAgICAgIHZhbHVlID0gbWVyZ2UoaXRlbSwgdmFsdWUpO1xyXG4gICAgICAgIHZhbHVlLmtleSA9IGtleTtcclxuICAgICAgICBpZiAodmFsdWUub3JkZXIgPT0gbnVsbCkge1xyXG4gICAgICAgICAgdmFsdWUub3JkZXIgPSBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29tcHV0ZWRHcm91cC52YWx1ZT8uZ3JvdXBlZEtleXMgPT0gbnVsbCB8fCBjb21wdXRlZEdyb3VwLnZhbHVlPy5ncm91cGVkS2V5c1trZXldID09IG51bGwpIHtcclxuICAgICAgICAgIGNvbHVtbnMucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhbHVlLmNvbCA9IG1lcmdlQ29sKHZhbHVlLmNvbCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICAvL+aOkuW6j1xyXG4gICAgICBjb2x1bW5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBjb2x1bW5zO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Rm9ybVJlZigpIHtcclxuICAgICAgcmV0dXJuIGZvcm1SZWYudmFsdWU7XHJcbiAgICB9XHJcbiAgICBhc3luYyBmdW5jdGlvbiByZXNldCgpIHtcclxuICAgICAgLy8gdWkuZm9ybS5yZXNldFdyYXAoZm9ybVJlZi52YWx1ZSwgeyBmb3JtLCBpbml0aWFsRm9ybTogY3JlYXRlSW5pdGlhbEZvcm0oKSB9KTtcclxuICAgICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xyXG4gICAgICBjb25zdCBlbnRyaWVzUmV0ID0gZW50cmllcyhmb3JtKTtcclxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzUmV0KSB7XHJcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gZ2V0KGluaXRpYWxGb3JtLCBlbnRyeVswXSk7XHJcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICB1bnNldChmb3JtLCBlbnRyeVswXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNldChmb3JtLCBlbnRyeVswXSwgaW5pdGlhbFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChwcm9wcy5kb1Jlc2V0KSB7XHJcbiAgICAgICAgYXdhaXQgcHJvcHMuZG9SZXNldChzY29wZS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgY3R4LmVtaXQoXCJyZXNldFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWxpZFJlZjogUmVmID0gcmVmKCk7XHJcbiAgICBjb25zdCBlcnJvcnNSZWY6IFJlZiA9IHJlZih7fSk7XHJcblxyXG4gICAgZnVuY3Rpb24gZmlsbEdyb3VwRXJyb3IoZmllbGRFcnJvcnM6IGFueSkge1xyXG4gICAgICBpZiAoIWNvbXB1dGVkR3JvdXAudmFsdWU/Lmdyb3VwZWRLZXlzKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IGtleSBpbiBmaWVsZEVycm9ycykge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwID0gY29tcHV0ZWRHcm91cC52YWx1ZT8uZ3JvdXBlZEtleXNba2V5XTtcclxuICAgICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkge1xyXG4gICAgICAgICAgZmllbGRFcnJvcnNbXCJncm91cC5cIiArIGdyb3VwXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGUoKSB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRlU2NvcGUgPSB7IC4uLnNjb3BlLnZhbHVlLCBmb3JtIH07XHJcbiAgICAgIGlmICh2YWxpZGF0ZVNjb3BlLm1vZGUgPT09IFwidmlld1wiKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm9wcy5iZWZvcmVWYWxpZGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IHByb3BzLmJlZm9yZVZhbGlkYXRlKHZhbGlkYXRlU2NvcGUpO1xyXG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGVycm9yc1JlZi52YWx1ZSA9IHt9O1xyXG4gICAgICAgIGF3YWl0IHVpLmZvcm0udmFsaWRhdGVXcmFwKGZvcm1SZWYudmFsdWUpO1xyXG4gICAgICAgIHZhbGlkUmVmLnZhbHVlID0gdHJ1ZTtcclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgdmFsaWRSZWYudmFsdWUgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCB2YWxpZGF0ZUVycm9ycyA9IHVpLmZvcm0udHJhbnNmb3JtVmFsaWRhdGVFcnJvcnMoZSk7XHJcbiAgICAgICAgZmlsbEdyb3VwRXJyb3IodmFsaWRhdGVFcnJvcnMpO1xyXG4gICAgICAgIGVycm9yc1JlZi52YWx1ZSA9IHZhbGlkYXRlRXJyb3JzO1xyXG4gICAgICAgIGN0eC5lbWl0KFwidmFsaWRhdGlvbkVycm9yXCIsIHNjb3BlLnZhbHVlKTtcclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBmdW5jdGlvbiBzdWJtaXQoKSB7XHJcbiAgICAgIGF3YWl0IHZhbGlkYXRlKCk7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gY2xvbmVEZWVwKHRvUmF3KGZvcm0pKTtcclxuICAgICAgY29uc3Qgc3VibWl0U2NvcGUgPSB7IC4uLnNjb3BlLnZhbHVlLCBmb3JtOiBmb3JtRGF0YSB9O1xyXG4gICAgICBsb2dnZXIuZGVidWcoXCJmb3JtIHN1Ym1pdFwiLCBKU09OLnN0cmluZ2lmeShmb3JtKSk7XHJcbiAgICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBsZXQgdmFsdWUgPSBnZXQoZm9ybURhdGEsIGtleSk7XHJcbiAgICAgICAgaWYgKGl0ZW0udmFsdWVSZXNvbHZlKSB7XHJcbiAgICAgICAgICBjb25zdCByZXM6IGFueSA9IGl0ZW0udmFsdWVSZXNvbHZlKHtcclxuICAgICAgICAgICAgdmFsdWUsXHJcbiAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgLi4uc3VibWl0U2NvcGVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYgKHJlcyAhPSBudWxsICYmICEocmVzIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcclxuICAgICAgICAgICAgc2V0KGZvcm1EYXRhLCBrZXksIHJlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChwcm9wcy5iZWZvcmVTdWJtaXQpIHtcclxuICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBwcm9wcy5iZWZvcmVTdWJtaXQoc3VibWl0U2NvcGUpO1xyXG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL+enu+mZpOS4jeWFgeiuuOaPkOS6pOeahOWtl+autVxyXG4gICAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uc3VibWl0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgdW5zZXQoZm9ybURhdGEsIGtleSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnN1Ym1pdCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgLy/orr7nva7lvLrliLbmj5DkuqTnmoTlrZfmrrVcclxuICAgICAgICAgIHNldChmb3JtRGF0YSwga2V5LCBmb3JtRGF0YVtrZXldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHByb3BzLmRvU3VibWl0KSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcHJvcHMuZG9TdWJtaXQoc3VibWl0U2NvcGUpO1xyXG4gICAgICAgIHN1Ym1pdFNjb3BlLnJlcyA9IHJlcztcclxuICAgICAgICBpZiAocmVzID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjdHguZW1pdChcInN1Ym1pdFwiLCBzdWJtaXRTY29wZSk7XHJcbiAgICAgIGlmIChwcm9wcy5hZnRlclN1Ym1pdCkge1xyXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBwcm9wcy5hZnRlclN1Ym1pdChzdWJtaXRTY29wZSk7XHJcbiAgICAgICAgaWYgKHN1Y2Nlc3MgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGN0eC5lbWl0KFwic3VjY2Vzc1wiLCBzdWJtaXRTY29wZSk7XHJcblxyXG4gICAgICByZXR1cm4gc3VibWl0U2NvcGU7XHJcbiAgICB9XHJcblxyXG4gICAgb25Nb3VudGVkKCgpID0+IHtcclxuICAgICAgLy8gaW1tZWRpYXRlIHZhbHVlQ2hhbmdl6Kem5Y+RXHJcbiAgICAgIGZvckVhY2goY29tcHV0ZWRDb2x1bW5zLnZhbHVlLCAoaXRlbTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLnZhbHVlQ2hhbmdlID09IG51bGwpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHZhbHVlQ2hhbmdlID0gaXRlbS52YWx1ZUNoYW5nZTtcclxuICAgICAgICBpZiAodmFsdWVDaGFuZ2UgJiYgdmFsdWVDaGFuZ2UuaW1tZWRpYXRlID09PSB0cnVlICYmIHZhbHVlQ2hhbmdlLmhhbmRsZSkge1xyXG4gICAgICAgICAgY29uc3QgZXZlbnQgPSB7IGtleSwgdmFsdWU6IGZvcm1ba2V5XSwgZm9ybVJlZjogcHJveHksIC4uLnNjb3BlLnZhbHVlLCBpbW1lZGlhdGU6IHRydWUgfTtcclxuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZS5oYW5kbGUpIHtcclxuICAgICAgICAgICAgdmFsdWVDaGFuZ2UuaGFuZGxlKGV2ZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZnVuY3Rpb24gZm9ybUl0ZW1TaG93KGl0ZW06IGFueSkge1xyXG4gICAgICBpZiAoaXRlbSAmJiB1bnJlZihpdGVtLnNob3cpICE9PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGdyb3VwSXRlbVNob3coZ3JvdXBJdGVtOiBhbnkpIHtcclxuICAgICAgaWYgKCFncm91cEl0ZW0uY29sdW1ucykge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodW5yZWYoZ3JvdXBJdGVtLnNob3cpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQga2V5IG9mIGdyb3VwSXRlbS5jb2x1bW5zKSB7XHJcbiAgICAgICAgaWYgKGNvbXB1dGVkQ29sdW1ucy52YWx1ZVtrZXldID09IG51bGwpIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpc0ZpZWxkU2hvdyA9IGZvcm1JdGVtU2hvdyhjb21wdXRlZENvbHVtbnMudmFsdWVba2V5XSk7XHJcbiAgICAgICAgaWYgKGlzRmllbGRTaG93KSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwcm9wcy53YXRjaCkge1xyXG4gICAgICB3YXRjaChcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZm9ybTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChuZXdWYWwsIG9sZFZhbCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHByb3BzLndhdGNoKSB7XHJcbiAgICAgICAgICAgIHByb3BzLndhdGNoKHNjb3BlLnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRlZXA6IHRydWUsXHJcbiAgICAgICAgICBpbW1lZGlhdGU6IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaXNEaXJ0eSgpIHtcclxuICAgICAgY29uc3QgYmVmb3JlID0gSlNPTi5zdHJpbmdpZnkoaW5pdGlhbEZvcm0pO1xyXG4gICAgICBjb25zdCBhZnRlciA9IEpTT04uc3RyaW5naWZ5KGZvcm0pO1xyXG4gICAgICByZXR1cm4gYmVmb3JlICE9PSBhZnRlcjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtZXJnZWRTbG90cyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgcmV0dXJuIG1lcmdlKHt9LCBwcm9wcy5zbG90cywgY3R4LnNsb3RzKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGN0eC5lbWl0KFwiaW5pdFwiLCBzY29wZS52YWx1ZSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZ2V0OiAoZm9ybTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHJldHVybiBnZXQoZm9ybSwga2V5KTtcclxuICAgICAgfSxcclxuICAgICAgc2V0OiAoZm9ybTogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgIHNldChmb3JtLCBrZXksIHZhbHVlKTtcclxuICAgICAgICBkb1ZhbHVlQ2hhbmdlKGtleSwgdmFsdWUpO1xyXG4gICAgICB9LFxyXG4gICAgICB1aSxcclxuICAgICAgdmFsaWRSZWYsXHJcbiAgICAgIGVycm9yc1JlZixcclxuICAgICAgZm9ybVJlZixcclxuICAgICAgY29tcHV0ZWRDb2x1bW5zLFxyXG4gICAgICBjb21wdXRlZERlZmF1bHRDb2x1bW5zLFxyXG4gICAgICBzdWJtaXQsXHJcbiAgICAgIHJlc2V0LFxyXG4gICAgICBnZXRGb3JtUmVmLFxyXG4gICAgICBzY29wZSxcclxuICAgICAgYnVpbGRJdGVtU2NvcGUsXHJcbiAgICAgIGdyb3VwQWN0aXZlS2V5LFxyXG4gICAgICBmb3JtLFxyXG4gICAgICBmb3JtSXRlbVJlZnMsXHJcbiAgICAgIGdldEZvcm1EYXRhLFxyXG4gICAgICBzZXRGb3JtRGF0YSxcclxuICAgICAgZ2V0Q29tcG9uZW50UmVmLFxyXG4gICAgICBtZXJnZUNvbCxcclxuICAgICAgdmFsaWRhdGUsXHJcbiAgICAgIGNvbXB1dGVkR3JvdXAsXHJcbiAgICAgIGdldENvbnRleHRGbixcclxuICAgICAgZm9ybUl0ZW1TaG93LFxyXG4gICAgICBncm91cEl0ZW1TaG93LFxyXG4gICAgICBpc0RpcnR5LFxyXG4gICAgICBtZXJnZWRTbG90c1xyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuXHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtZm9ybSB7XHJcbiAgLmVsLWNvbGxhcHNlLWl0ZW1fX2NvbnRlbnQge1xyXG4gICAgbWFyZ2luLXRvcDogMTBweDtcclxuICAgIHBhZGRpbmctbGVmdDogMzBweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDMwcHg7XHJcbiAgfVxyXG5cclxuICAuZnMtZm9ybS1pbnZhbGlkIHtcclxuICB9XHJcblxyXG4gIC5mcy1mb3JtLWl0ZW0tY29tcG9uZW50IHtcclxuICAgIC5hbnQtcGlja2VyLFxyXG4gICAgLmFudC1pbnB1dC1hZmZpeC13cmFwcGVyLFxyXG4gICAgLmFudC1pbnB1dC1udW1iZXIsXHJcbiAgICAuZWwtY2FzY2FkZXIsXHJcbiAgICAuZWwtZGF0ZS1lZGl0b3IsXHJcbiAgICAuZWwtaW5wdXQtbnVtYmVyLFxyXG4gICAgLmVsLWlucHV0LFxyXG4gICAgPiAuZWwtc2VsZWN0LFxyXG4gICAgPiAubi1zZWxlY3QsXHJcbiAgICAubi1kYXRlLXBpY2tlcixcclxuICAgIC5uLWlucHV0LW51bWJlciB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2ljb24ge1xyXG4gICAgICBtYXJnaW4tbGVmdDogMTBweDtcclxuICAgIH1cclxuICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2Nsb3NlLWljb24ge1xyXG4gICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XHJcbiAgICB9XHJcblxyXG4gICAgLmVsLXJhbmdlLWVkaXRvci5lbC1pbnB1dF9fd3JhcHBlciB7XHJcbiAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy5lbC1kYXRlLWVkaXRvci5lbC1pbnB1dF9fd3JhcHBlciB7XHJcbiAgLy8gIHdpZHRoOiAxMDAlO1xyXG4gIC8vfVxyXG59XHJcblxyXG4uZnMtZm9ybS1ncmlkIHtcclxuICAuZnMtcm93IHtcclxuICAgIGRpc3BsYXk6IGdyaWQ7XHJcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDUwJSA1MCU7XHJcbiAgICAvLyBnYXA6IDAgMjBweDsgLy/liJfpl7Tot50gMjBweFxyXG4gICAgLmZzLWNvbCB7XHJcbiAgICAgIG1heC13aWR0aDogMTAwJTtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYW50ZHZcclxuICAgIC5hbnQtZm9ybS1pdGVtLWxhYmVsIHtcclxuICAgICAgd2lkdGg6IDEwMHB4O1xyXG4gICAgICBmbGV4OiBub25lO1xyXG4gICAgICBtYXgtd2lkdGg6IG5vbmU7XHJcbiAgICB9XHJcbiAgICAuYW50LWZvcm0taXRlbS1jb250cm9sLXdyYXBwZXIge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgICBtYXgtd2lkdGg6IG5vbmU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBlbGVtZW50XHJcbiAgLmVsLXJvdzo6YWZ0ZXIsXHJcbiAgLmVsLXJvdzo6YmVmb3JlIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG59XHJcbi5mcy1mb3JtLWZsZXgge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xyXG4gIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcclxuICBmbGV4LXdyYXA6IHdyYXA7XHJcbiAgLmZzLXJvdyB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICB9XHJcbn1cclxuXHJcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xyXG4gIC5mcy1mb3JtLWZsZXgge1xyXG4gICAgLmZzLXJvdyB7XHJcbiAgICAgIC5mcy1jb2wge1xyXG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBmbGV4OiAwIDAgMTAwJTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIChtYXgtd2lkdGg6IDU3NXB4KSB7XHJcbiAgLmZzLWZvcm0tZmxleCB7XHJcbiAgICAuZnMtcm93IHtcclxuICAgICAgLmZzLWNvbCB7XHJcbiAgICAgICAgLy8uYW50LWZvcm0taXRlbS1sYWJlbCB7XHJcbiAgICAgICAgLy8gIGZsZXg6IG5vbmU7XHJcbiAgICAgICAgLy99XHJcbiAgICAgICAgLy8uYW50LWZvcm0taXRlbSAuYW50LWZvcm0taXRlbS1jb250cm9sIHtcclxuICAgICAgICAvLyAgZmxleDogMTtcclxuICAgICAgICAvLyAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8Y29tcG9uZW50XHJcbiAgICA6aXM9XCJ1aS5mb3JtLm5hbWVcIlxyXG4gICAgcmVmPVwiZm9ybVJlZlwiXHJcbiAgICBjbGFzcz1cImZzLWZvcm1cIlxyXG4gICAgOmNsYXNzPVwie1xyXG4gICAgICAnZnMtZm9ybS1ncmlkJzogZGlzcGxheSA9PT0gJ2dyaWQnLFxyXG4gICAgICAnZnMtZm9ybS1mbGV4JzogZGlzcGxheSA9PT0gJ2ZsZXgnLFxyXG4gICAgICAnZnMtZm9ybS1pbnZhbGlkJzogdmFsaWRSZWYgPT09IGZhbHNlXHJcbiAgICB9XCJcclxuICAgIG9uc3VibWl0PVwiZXZlbnQucHJldmVudERlZmF1bHQoKTtcIlxyXG4gICAgOm1vZGVsPVwiZm9ybVwiXHJcbiAgPlxyXG4gICAgPCEtLSByb3cgLS0+XHJcbiAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCIgY2xhc3M9XCJmcy1yb3dcIiB2LWJpbmQ9XCJyb3dcIj5cclxuICAgICAgPCEtLSBjb2wgLS0+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIml0ZW0gaW4gY29tcHV0ZWREZWZhdWx0Q29sdW1uc1wiIDprZXk9XCJpdGVtPy5rZXlcIj5cclxuICAgICAgICA8ZnMtZm9ybS1pdGVtLWNvbFxyXG4gICAgICAgICAgOnJlZj1cIlxyXG4gICAgICAgICAgICAoZWw6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgZm9ybUl0ZW1SZWZzW2l0ZW0ua2V5XSA9IGVsO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgIDpjb2w9XCJtZXJnZUNvbChpdGVtLmNvbClcIlxyXG4gICAgICAgICAgOml0ZW09XCJpdGVtXCJcclxuICAgICAgICAgIDpoZWxwZXI9XCJoZWxwZXJcIlxyXG4gICAgICAgICAgOm1vZGVsLXZhbHVlPVwiZ2V0KGZvcm0sIGl0ZW0ua2V5KVwiXHJcbiAgICAgICAgICA6c2xvdHM9XCJtZXJnZWRTbG90c1snZm9ybV8nICsgaXRlbS5rZXldXCJcclxuICAgICAgICAgIDpnZXQtY29udGV4dC1mbj1cImdldENvbnRleHRGblwiXHJcbiAgICAgICAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwic2V0KGZvcm0sIGl0ZW0ua2V5LCAkZXZlbnQpXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC9jb21wb25lbnQ+XHJcbiAgICA8Y29tcG9uZW50XHJcbiAgICAgIDppcz1cImNvbXB1dGVkR3JvdXAud3JhcHBlci5wYXJlbnRcIlxyXG4gICAgICB2LWlmPVwiY29tcHV0ZWRHcm91cC53cmFwcGVyXCJcclxuICAgICAgdi1tb2RlbDpbdWkuY29sbGFwc2UubW9kZWxWYWx1ZV09XCJncm91cEFjdGl2ZUtleVwiXHJcbiAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCVcIlxyXG4gICAgICB2LWJpbmQ9XCJjb21wdXRlZEdyb3VwXCJcclxuICAgID5cclxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGdyb3VwSXRlbSwgZ3JvdXBLZXkpIG9mIGNvbXB1dGVkR3JvdXAuZ3JvdXBzXCIgOmtleT1cImdyb3VwS2V5XCI+XHJcbiAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgOmlzPVwiY29tcHV0ZWRHcm91cC53cmFwcGVyLmNoaWxkXCJcclxuICAgICAgICAgIHYtaWY9XCJncm91cEl0ZW1TaG93KGdyb3VwSXRlbSlcIlxyXG4gICAgICAgICAgOlt1aS5jb2xsYXBzZS5rZXlOYW1lXT1cImdyb3VwS2V5XCJcclxuICAgICAgICAgIHYtYmluZD1cImdyb3VwSXRlbVwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJ7ICdmcy1mb3JtLWdyb3VwLWVycm9yJzogZXJyb3JzUmVmWydncm91cC4nICsgZ3JvdXBLZXldIH1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBzbG90TmFtZSkgb2YgZ3JvdXBJdGVtLnNsb3RzXCIgOmtleT1cInNsb3ROYW1lXCIgI1tzbG90TmFtZV09XCJzY29wZVwiPlxyXG4gICAgICAgICAgICA8ZnMtcmVuZGVyIDpyZW5kZXItZnVuYz1cIml0ZW1cIiA6c2NvcGU9XCJ7IC4uLnNjb3BlLCBoYXNFcnJvcjogZXJyb3JzUmVmWydncm91cC4nICsgZ3JvdXBLZXldIH1cIiAvPlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIDwhLS0gcm93IC0tPlxyXG4gICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yb3cubmFtZVwiIGNsYXNzPVwiZnMtcm93XCIgdi1iaW5kPVwicm93XCI+XHJcbiAgICAgICAgICAgIDwhLS0gY29sIC0tPlxyXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCJrZXkgaW4gZ3JvdXBJdGVtLmNvbHVtbnNcIiA6a2V5PVwia2V5XCI+XHJcbiAgICAgICAgICAgICAgPGZzLWZvcm0taXRlbS1jb2xcclxuICAgICAgICAgICAgICAgIHYtaWY9XCJjb21wdXRlZENvbHVtbnNba2V5XVwiXHJcbiAgICAgICAgICAgICAgICA6cmVmPVwiXHJcbiAgICAgICAgICAgICAgICAgIChlbDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtSXRlbVJlZnNba2V5XSA9IGVsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIDpjb2w9XCJtZXJnZUNvbChjb21wdXRlZENvbHVtbnNba2V5XS5jb2wpXCJcclxuICAgICAgICAgICAgICAgIDppdGVtPVwiY29tcHV0ZWRDb2x1bW5zW2tleV1cIlxyXG4gICAgICAgICAgICAgICAgOm1vZGVsLXZhbHVlPVwiZ2V0KGZvcm0sIGtleSlcIlxyXG4gICAgICAgICAgICAgICAgOnNsb3RzPVwibWVyZ2VkU2xvdHNbJ2Zvcm1fJyArIGtleV1cIlxyXG4gICAgICAgICAgICAgICAgOmdldC1jb250ZXh0LWZuPVwiZ2V0Q29udGV4dEZuXCJcclxuICAgICAgICAgICAgICAgIDpoZWxwZXI9XCJoZWxwZXJcIlxyXG4gICAgICAgICAgICAgICAgQHVwZGF0ZTptb2RlbC12YWx1ZT1cInNldChmb3JtLCBrZXksICRldmVudClcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvY29tcG9uZW50PlxyXG4gIDwvY29tcG9uZW50PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHtcclxuICBjb21wdXRlZCxcclxuICBkZWZpbmVDb21wb25lbnQsXHJcbiAgZ2V0Q3VycmVudEluc3RhbmNlLFxyXG4gIG9uTW91bnRlZCxcclxuICByZWFjdGl2ZSxcclxuICBSZWYsXHJcbiAgcmVmLFxyXG4gIHRvUmF3LFxyXG4gIHVucmVmLFxyXG4gIFVud3JhcE5lc3RlZFJlZnMsXHJcbiAgd2F0Y2hcclxufSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IGVhY2gsIHNldCwgY2xvbmVEZWVwLCBlbnRyaWVzLCBnZXQsIHVuc2V0LCBmb3JFYWNoLCBtZXJnZSB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuaW1wb3J0IHsgQ29tcHV0ZVZhbHVlLCB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtY29tcHV0ZVwiO1xyXG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuLi8uLi91dGlscy91dGlsLmxvZ1wiO1xyXG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLW1lcmdlXCI7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBGb3JtU2NvcGVDb250ZXh0LCBTZXRGb3JtRGF0YU9wdGlvbnMsIHVzZVVpLCB1dGlscyB9IGZyb20gXCIuLi8uLi9pbmRleFwiO1xyXG5cclxuLyoqXHJcbiAqIOmFjee9ruWMlueahOihqOWNlee7hOS7tlxyXG4gKiDmmrTpnLLnmoTmlrnms5XvvJpcclxuICogcmVmLnN1Ym1pdCgpID0g5o+Q5Lqk6KGo5Y2VXHJcbiAqIHJlZi5yZXNldCgpID0g6YeN572u6KGo5Y2VXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNGb3JtXCIsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL6KGo5Y2V5pWw5o2uXHJcbiAgICAgKiovXHJcbiAgICBpbml0aWFsRm9ybToge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDlrZfmrrXmqKHniYhcclxuICAgICAqIHtcclxuICAgICAqICAga2V5OntcclxuICAgICAqICAgICB0aXRsZTogXCLlrZfmrrXlkI3np7BcIixcclxuICAgICAqICAgICBjb21wb25lbnQ6e1xyXG4gICAgICogICAgICAgbmFtZTpcIue7hOS7tuWQjeensFwiXHJcbiAgICAgKiAgICAgICAuLi7nu4Tku7blj4LmlbBcclxuICAgICAqICAgICB9XHJcbiAgICAgKiAgIH1cclxuICAgICAqIH1cclxuICAgICAqICovXHJcbiAgICBjb2x1bW5zOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDlrZfmrrXliIbnu4RcclxuICAgICAqIHtcclxuICAgICAqICAgdHlwZToneHh4JywgLy/liIbnu4TlsZXnpLrnsbvlnotcclxuICAgICAqICAgZ3JvdXBzOnsgLy/liIbnu4TmlbDmja5cclxuICAgICAqICAgICBncm91cEtleTp7IHRpdGxlOid4eHgnLGNvbHVtbnM6WydmaWVsZEtleScsJ2ZpZWxkS2V5J119XHJcbiAgICAgKiAgIH1cclxuICAgICAqIH1cclxuICAgICAqL1xyXG4gICAgZ3JvdXA6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOmHjee9ruihqOWNleWQjueahOaTjeS9nFxyXG4gICAgICovXHJcbiAgICBkb1Jlc2V0OiB7XHJcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOeCueWHu+S/neWtmOaMiemSru+8jOihqOWNleagoemqjOWJjeaJp+ihjOaTjeS9nO+8iGFzeW5j77yJXHJcbiAgICAgKi9cclxuICAgIGJlZm9yZVZhbGlkYXRlOiB7XHJcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOihqOWNleagoemqjOWujOWujOaIkOWQju+8jOaPkOS6pOWJjeWkhOeQhu+8iGFzeW5j77yJXHJcbiAgICAgKi9cclxuICAgIGJlZm9yZVN1Ym1pdDoge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvbixcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDngrnlh7vkv53lrZjmjInpkq7ml7bmiafooYzmk43kvZzvvIhhc3luY++8iVxyXG4gICAgICovXHJcbiAgICBkb1N1Ym1pdDoge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvbixcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDooajljZXmj5DkuqTlkI7lpITnkIbvvIhhc3luY++8iVxyXG4gICAgICovXHJcbiAgICBhZnRlclN1Ym1pdDoge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvbixcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmj5Lmp73lhoXlrrlcclxuICAgICAqL1xyXG4gICAgc2xvdHM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0OiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDluIPlsYDmlrnlvI/jgJBmbGV4fGdyaWTjgJFcclxuICAgICAqL1xyXG4gICAgZGlzcGxheToge1xyXG4gICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgIGRlZmF1bHQ6IFwiZmxleFwiIC8vIGZsZXhcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOW6j+WPt++8jOe8lui+keaXtuS8muS8oOWFpVxyXG4gICAgICovXHJcbiAgICBpbmRleDoge1xyXG4gICAgICB0eXBlOiBOdW1iZXIsXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5qih5byPIFthZGQsZWRpdCx2aWV3LOiHquWumuS5iV1cclxuICAgICAqL1xyXG4gICAgbW9kZToge1xyXG4gICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogYS1yb3fphY3nva5cclxuICAgICAqL1xyXG4gICAgcm93OiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBlbC1jb2x8YS1jb2zphY3nva7vvIzlj6/phY3nva7ot6jliJdcclxuICAgICAqL1xyXG4gICAgY29sOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBmb3JtSXRlbeeahOWFrOWFsemFjee9rlxyXG4gICAgICovXHJcbiAgICBmb3JtSXRlbToge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogaGVscGVy5L2N572u77yae3Bvc2l0aW9uOidsYWJlbCd9XHJcbiAgICAgKi9cclxuICAgIGhlbHBlcjoge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH0sXHJcblxyXG4gICAgd2F0Y2g6IHtcclxuICAgICAgdHlwZTogRnVuY3Rpb24sXHJcbiAgICAgIGRlZmF1bHQ6IG51bGxcclxuICAgIH1cclxuICB9LFxyXG4gIGVtaXRzOiBbXCJyZXNldFwiLCBcInN1Ym1pdFwiLCBcInN1Y2Nlc3NcIiwgXCJ2YWxpZGF0aW9uRXJyb3JcIiwgXCJ2YWx1ZS1jaGFuZ2VcIiwgXCJpbml0XCJdLFxyXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcclxuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XHJcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG4gICAgY29uc3QgeyBBc3luY0NvbXB1dGVWYWx1ZSwgZG9Db21wdXRlZCB9ID0gdXNlQ29tcHV0ZSgpO1xyXG4gICAgY29uc3QgZm9ybVJlZiA9IHJlZigpO1xyXG4gICAgY29uc3QgZm9ybTogVW53cmFwTmVzdGVkUmVmczxhbnk+ID0gcmVhY3RpdmUoe30pO1xyXG4gICAgY29uc3QgeyBwcm94eSB9ID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XHJcblxyXG4gICAgLy8gdXRpbHMudHJhY2UoXCJmcy1mb3JtXCIpO1xyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2V0dXAtcHJvcHMtZGVzdHJ1Y3R1cmVcclxuICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS52YWx1ZSAhPSBudWxsICYmIChpdGVtLnZhbHVlIGluc3RhbmNlb2YgQXN5bmNDb21wdXRlVmFsdWUgfHwgaXRlbS52YWx1ZSBpbnN0YW5jZW9mIENvbXB1dGVWYWx1ZSkpIHtcclxuICAgICAgICBsb2dnZXIud2FybihcImZvcm0udmFsdWXphY3nva7kuI3mlK/mjIFDb21wdXRlL0FzeW5jQ29tcHV0Zeexu+Wei+eahOWKqOaAgeiuoeeul1wiKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBmdW5jdGlvbiBjcmVhdGVJbml0aWFsRm9ybSgpIHtcclxuICAgICAgY29uc3QgZm9ybSA9IHt9O1xyXG4gICAgICAvLyDliJ3lp4vmlbDmja7otYvlgLxcclxuICAgICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55LCBrZXk6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRlZlZhbHVlID0gdW5yZWYoaXRlbS52YWx1ZSk7XHJcbiAgICAgICAgaWYgKGRlZlZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHNldChmb3JtLCBrZXksIGRlZlZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBtZXJnZShmb3JtLCBjbG9uZURlZXAocHJvcHMuaW5pdGlhbEZvcm0pKTtcclxuICAgICAgcmV0dXJuIGZvcm07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xyXG4gICAgc2V0Rm9ybURhdGEoaW5pdGlhbEZvcm0pO1xyXG5cclxuICAgIGNvbnN0IHNjb3BlOiBSZWY8Rm9ybVNjb3BlQ29udGV4dD4gPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgcm93OiBpbml0aWFsRm9ybSxcclxuICAgICAgICBmb3JtLFxyXG4gICAgICAgIGluZGV4OiBwcm9wcy5pbmRleCxcclxuICAgICAgICBtb2RlOiBwcm9wcy5tb2RlIHx8IFwiYWRkXCIsXHJcbiAgICAgICAgYXR0cnM6IGN0eC5hdHRycyxcclxuICAgICAgICBnZXRDb21wb25lbnRSZWZcclxuICAgICAgfSBhcyBGb3JtU2NvcGVDb250ZXh0O1xyXG4gICAgfSk7XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Q29udGV4dEZuKCkge1xyXG4gICAgICByZXR1cm4gc2NvcGUudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29tcHV0ZWRDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4gcHJvcHMuY29sdW1ucztcclxuICAgIH0pO1xyXG4gICAgLy9mb3JtLnZhbHVlQnVpbGRlclxyXG5cclxuICAgIGZ1bmN0aW9uIGRvVmFsdWVCdWlsZGVyKGZvcm06IGFueSkge1xyXG4gICAgICBpZiAoZm9ybSA9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSwga2V5OiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgdmFsdWUgPSBnZXQoZm9ybSwga2V5KTtcclxuICAgICAgICBpZiAoaXRlbS52YWx1ZUJ1aWxkZXIpIHtcclxuICAgICAgICAgIGNvbnN0IHJlczogYW55ID0gaXRlbS52YWx1ZUJ1aWxkZXIoe1xyXG4gICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICByb3c6IGluaXRpYWxGb3JtLFxyXG4gICAgICAgICAgICBmb3JtLFxyXG4gICAgICAgICAgICBpbmRleDogcHJvcHMuaW5kZXgsXHJcbiAgICAgICAgICAgIG1vZGU6IHByb3BzLm1vZGVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYgKHJlcyAhPSBudWxsICYmICEocmVzIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcclxuICAgICAgICAgICAgc2V0KGZvcm0sIGtleSwgcmVzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldEZvcm1EYXRhKCkge1xyXG4gICAgICByZXR1cm4gZm9ybTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldEZvcm1EYXRhKGZvcm1EYXRhOiBhbnksIG9wdGlvbnM6IFNldEZvcm1EYXRhT3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgIGRvVmFsdWVCdWlsZGVyKGZvcm1EYXRhKTtcclxuXHJcbiAgICAgIGlmIChvcHRpb25zLm1lcmdlRm9ybSA9PT0gZmFsc2UpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtKSB7XHJcbiAgICAgICAgICBkZWxldGUgZm9ybVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBtZXJnZShmb3JtLCBmb3JtRGF0YSk7XHJcbiAgICAgIGNvbnN0IHsgdmFsdWVDaGFuZ2UgfSA9IG9wdGlvbnM7XHJcbiAgICAgIGlmICh2YWx1ZUNoYW5nZSkge1xyXG4gICAgICAgIGZvckVhY2gocHJvcHMuY29sdW1ucywgKGNvbHVtbjogYW55LCBrZXk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtW2tleV07XHJcbiAgICAgICAgICBkb1ZhbHVlQ2hhbmdlKGtleSwgdmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWVyZ2VDb2woLi4uY29sOiBhbnkpIHtcclxuICAgICAgcmV0dXJuIG1lcmdlKHt9LCBwcm9wcy5jb2wsIC4uLmNvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gYnVpbGRJdGVtU2NvcGUoaXRlbTogYW55KTogRm9ybVNjb3BlQ29udGV4dCB7XHJcbiAgICAgIHJldHVybiB7IGtleTogaXRlbS5rZXksIC4uLnNjb3BlLnZhbHVlIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZG9WYWx1ZUJ1aWxkZXIoZm9ybSk7XHJcblxyXG4gICAgLy8gd2F0Y2goXHJcbiAgICAvLyAgICgpID0+IHByb3BzLmluaXRpYWxGb3JtLFxyXG4gICAgLy8gICAoKSA9PiB7XHJcbiAgICAvLyAgICAgc2V0Rm9ybURhdGEoY3JlYXRlSW5pdGlhbEZvcm0oKSwgeyBtZXJnZUZvcm06IGZhbHNlIH0pO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyApO1xyXG5cclxuICAgIGZ1bmN0aW9uIGRvVmFsdWVDaGFuZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgICAgY29uc3QgZXZlbnQgPSB7IGtleSwgdmFsdWUsIGZvcm1SZWY6IHByb3h5LCAuLi5zY29wZS52YWx1ZSwgaW1tZWRpYXRlOiBmYWxzZSB9O1xyXG4gICAgICBjdHguZW1pdChcInZhbHVlLWNoYW5nZVwiLCBldmVudCk7XHJcbiAgICAgIGxldCB2YWx1ZUNoYW5nZSA9IHByb3BzLmNvbHVtbnNba2V5XS52YWx1ZUNoYW5nZTtcclxuICAgICAgaWYgKHZhbHVlQ2hhbmdlKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlQ2hhbmdlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlQ2hhbmdlLmhhbmRsZSkge1xyXG4gICAgICAgICAgdmFsdWVDaGFuZ2UuaGFuZGxlKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmb3JtSXRlbVJlZnM6IFJlZiA9IHJlZih7fSk7XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Rm9ybUl0ZW1SZWYoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgcmV0dXJuIGZvcm1JdGVtUmVmcy52YWx1ZVtrZXldLmdldEZvcm1JdGVtUmVmKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGtleTogc3RyaW5nLCBpc0FzeW5jID0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIGdldEZvcm1JdGVtUmVmKGtleSk/LmdldENvbXBvbmVudFJlZihpc0FzeW5jKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBncm91cEFjdGl2ZUtleSA9IHJlZihbXSk7XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxyXG4gICAgZm9yRWFjaChwcm9wcy5ncm91cD8uZ3JvdXBzLCAoZ3JvdXBJdGVtOiBhbnksIGtleTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChncm91cEl0ZW0uY29sbGFwc2VkICE9PSB0cnVlKSB7XHJcbiAgICAgICAgZ3JvdXBBY3RpdmVLZXkudmFsdWUucHVzaChrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2V0dXAtcHJvcHMtZGVzdHJ1Y3R1cmVcclxuICAgIGlmIChwcm9wcy5ncm91cD8uZ3JvdXBUeXBlID09PSBcInRhYnNcIikge1xyXG4gICAgICBncm91cEFjdGl2ZUtleS52YWx1ZSA9IGdyb3VwQWN0aXZlS2V5LnZhbHVlLmxlbmd0aCA+IDAgPyBncm91cEFjdGl2ZUtleS52YWx1ZVswXSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy/mnoTlu7rliIbnu4TmlbDmja5cclxuICAgIGNvbnN0IGNvbXB1dGVkR3JvdXAgPSBkb0NvbXB1dGVkKFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHByb3BzLmdyb3VwO1xyXG4gICAgICB9LFxyXG4gICAgICBnZXRDb250ZXh0Rm4sXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIChncm91cCA9IHt9KSA9PiB7XHJcbiAgICAgICAgLy/mib7lh7rmsqHmnInmt7vliqDov5vliIbnu4TnmoTlrZfmrrVcclxuICAgICAgICBjb25zdCBncm91cGVkS2V5czogYW55ID0ge307XHJcbiAgICAgICAgZm9yRWFjaChncm91cD8uZ3JvdXBzLCAoZ3JvdXBJdGVtOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBmb3JFYWNoKGdyb3VwSXRlbS5jb2x1bW5zLCAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb21wdXRlZENvbHVtbnMudmFsdWVbaXRlbV0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHV0aWxzLmxvZ2dlci53YXJuKFwi5peg5pWI55qE5YiG57uE5a2X5q6177yaXCIgKyBpdGVtKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZ3JvdXBlZEtleXNbaXRlbV0gPSBrZXk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgdHlwZSA9IGdyb3VwLmdyb3VwVHlwZTtcclxuICAgICAgICBsZXQgd3JhcHBlciA9IHtcclxuICAgICAgICAgIHBhcmVudDogdWkuY29sbGFwc2UubmFtZSxcclxuICAgICAgICAgIGNoaWxkOiB1aS5jb2xsYXBzZUl0ZW0ubmFtZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHR5cGUgPT09IFwidGFic1wiKSB7XHJcbiAgICAgICAgICB3cmFwcGVyLnBhcmVudCA9IHVpLnRhYnMubmFtZTtcclxuICAgICAgICAgIHdyYXBwZXIuY2hpbGQgPSB1aS50YWJQYW5lLm5hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtZXJnZShcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgd3JhcHBlcixcclxuICAgICAgICAgICAgZ3JvdXBlZEtleXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBncm91cFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgY29tcHV0ZWREZWZhdWx0Q29sdW1ucyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgY29uc3QgY29sdW1uczogYW55ID0gW107XHJcbiAgICAgIC8vZGVmYXVsdCBjb2x1bW5z5o6S5bqPXHJcbiAgICAgIGZvckVhY2goY29tcHV0ZWRDb2x1bW5zLnZhbHVlLCAodmFsdWU6IGFueSwga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjb25zdCBpdGVtID0gY2xvbmVEZWVwKHByb3BzLmZvcm1JdGVtIHx8IHt9KTtcclxuICAgICAgICB2YWx1ZSA9IG1lcmdlKGl0ZW0sIHZhbHVlKTtcclxuICAgICAgICB2YWx1ZS5rZXkgPSBrZXk7XHJcbiAgICAgICAgaWYgKHZhbHVlLm9yZGVyID09IG51bGwpIHtcclxuICAgICAgICAgIHZhbHVlLm9yZGVyID0gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbXB1dGVkR3JvdXAudmFsdWU/Lmdyb3VwZWRLZXlzID09IG51bGwgfHwgY29tcHV0ZWRHcm91cC52YWx1ZT8uZ3JvdXBlZEtleXNba2V5XSA9PSBudWxsKSB7XHJcbiAgICAgICAgICBjb2x1bW5zLnB1c2godmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YWx1ZS5jb2wgPSBtZXJnZUNvbCh2YWx1ZS5jb2wpO1xyXG4gICAgICB9KTtcclxuICAgICAgLy/mjpLluo9cclxuICAgICAgY29sdW1ucy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gY29sdW1ucztcclxuICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIGdldEZvcm1SZWYoKSB7XHJcbiAgICAgIHJldHVybiBmb3JtUmVmLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZnVuY3Rpb24gcmVzZXQoKSB7XHJcbiAgICAgIC8vIHVpLmZvcm0ucmVzZXRXcmFwKGZvcm1SZWYudmFsdWUsIHsgZm9ybSwgaW5pdGlhbEZvcm06IGNyZWF0ZUluaXRpYWxGb3JtKCkgfSk7XHJcbiAgICAgIGNvbnN0IGluaXRpYWxGb3JtID0gY3JlYXRlSW5pdGlhbEZvcm0oKTtcclxuICAgICAgY29uc3QgZW50cmllc1JldCA9IGVudHJpZXMoZm9ybSk7XHJcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllc1JldCkge1xyXG4gICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IGdldChpbml0aWFsRm9ybSwgZW50cnlbMF0pO1xyXG4gICAgICAgIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgdW5zZXQoZm9ybSwgZW50cnlbMF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXQoZm9ybSwgZW50cnlbMF0sIGluaXRpYWxWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocHJvcHMuZG9SZXNldCkge1xyXG4gICAgICAgIGF3YWl0IHByb3BzLmRvUmVzZXQoc2NvcGUudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGN0eC5lbWl0KFwicmVzZXRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsaWRSZWY6IFJlZiA9IHJlZigpO1xyXG4gICAgY29uc3QgZXJyb3JzUmVmOiBSZWYgPSByZWYoe30pO1xyXG5cclxuICAgIGZ1bmN0aW9uIGZpbGxHcm91cEVycm9yKGZpZWxkRXJyb3JzOiBhbnkpIHtcclxuICAgICAgaWYgKCFjb21wdXRlZEdyb3VwLnZhbHVlPy5ncm91cGVkS2V5cykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBrZXkgaW4gZmllbGRFcnJvcnMpIHtcclxuICAgICAgICBjb25zdCBncm91cCA9IGNvbXB1dGVkR3JvdXAudmFsdWU/Lmdyb3VwZWRLZXlzW2tleV07XHJcbiAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpIHtcclxuICAgICAgICAgIGZpZWxkRXJyb3JzW1wiZ3JvdXAuXCIgKyBncm91cF0gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xyXG4gICAgICBjb25zdCB2YWxpZGF0ZVNjb3BlID0geyAuLi5zY29wZS52YWx1ZSwgZm9ybSB9O1xyXG4gICAgICBpZiAodmFsaWRhdGVTY29wZS5tb2RlID09PSBcInZpZXdcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJvcHMuYmVmb3JlVmFsaWRhdGUpIHtcclxuICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBwcm9wcy5iZWZvcmVWYWxpZGF0ZSh2YWxpZGF0ZVNjb3BlKTtcclxuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBlcnJvcnNSZWYudmFsdWUgPSB7fTtcclxuICAgICAgICBhd2FpdCB1aS5mb3JtLnZhbGlkYXRlV3JhcChmb3JtUmVmLnZhbHVlKTtcclxuICAgICAgICB2YWxpZFJlZi52YWx1ZSA9IHRydWU7XHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIHZhbGlkUmVmLnZhbHVlID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgdmFsaWRhdGVFcnJvcnMgPSB1aS5mb3JtLnRyYW5zZm9ybVZhbGlkYXRlRXJyb3JzKGUpO1xyXG4gICAgICAgIGZpbGxHcm91cEVycm9yKHZhbGlkYXRlRXJyb3JzKTtcclxuICAgICAgICBlcnJvcnNSZWYudmFsdWUgPSB2YWxpZGF0ZUVycm9ycztcclxuICAgICAgICBjdHguZW1pdChcInZhbGlkYXRpb25FcnJvclwiLCBzY29wZS52YWx1ZSk7XHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgZnVuY3Rpb24gc3VibWl0KCkge1xyXG4gICAgICBhd2FpdCB2YWxpZGF0ZSgpO1xyXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IGNsb25lRGVlcCh0b1Jhdyhmb3JtKSk7XHJcbiAgICAgIGNvbnN0IHN1Ym1pdFNjb3BlID0geyAuLi5zY29wZS52YWx1ZSwgZm9ybTogZm9ybURhdGEgfTtcclxuICAgICAgbG9nZ2VyLmRlYnVnKFwiZm9ybSBzdWJtaXRcIiwgSlNPTi5zdHJpbmdpZnkoZm9ybSkpO1xyXG4gICAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gZ2V0KGZvcm1EYXRhLCBrZXkpO1xyXG4gICAgICAgIGlmIChpdGVtLnZhbHVlUmVzb2x2ZSkge1xyXG4gICAgICAgICAgY29uc3QgcmVzOiBhbnkgPSBpdGVtLnZhbHVlUmVzb2x2ZSh7XHJcbiAgICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIC4uLnN1Ym1pdFNjb3BlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCAmJiAhKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpKSB7XHJcbiAgICAgICAgICAgIHNldChmb3JtRGF0YSwga2V5LCByZXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAocHJvcHMuYmVmb3JlU3VibWl0KSB7XHJcbiAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgcHJvcHMuYmVmb3JlU3VibWl0KHN1Ym1pdFNjb3BlKTtcclxuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy/np7vpmaTkuI3lhYHorrjmj5DkuqTnmoTlrZfmrrVcclxuICAgICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLnN1Ym1pdCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgIHVuc2V0KGZvcm1EYXRhLCBrZXkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS5zdWJtaXQgPT09IHRydWUpIHtcclxuICAgICAgICAgIC8v6K6+572u5by65Yi25o+Q5Lqk55qE5a2X5q61XHJcbiAgICAgICAgICBzZXQoZm9ybURhdGEsIGtleSwgZm9ybURhdGFba2V5XSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChwcm9wcy5kb1N1Ym1pdCkge1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHByb3BzLmRvU3VibWl0KHN1Ym1pdFNjb3BlKTtcclxuICAgICAgICBzdWJtaXRTY29wZS5yZXMgPSByZXM7XHJcbiAgICAgICAgaWYgKHJlcyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY3R4LmVtaXQoXCJzdWJtaXRcIiwgc3VibWl0U2NvcGUpO1xyXG4gICAgICBpZiAocHJvcHMuYWZ0ZXJTdWJtaXQpIHtcclxuICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgcHJvcHMuYWZ0ZXJTdWJtaXQoc3VibWl0U2NvcGUpO1xyXG4gICAgICAgIGlmIChzdWNjZXNzID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjdHguZW1pdChcInN1Y2Nlc3NcIiwgc3VibWl0U2NvcGUpO1xyXG5cclxuICAgICAgcmV0dXJuIHN1Ym1pdFNjb3BlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTW91bnRlZCgoKSA9PiB7XHJcbiAgICAgIC8vIGltbWVkaWF0ZSB2YWx1ZUNoYW5nZeinpuWPkVxyXG4gICAgICBmb3JFYWNoKGNvbXB1dGVkQ29sdW1ucy52YWx1ZSwgKGl0ZW06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoaXRlbS52YWx1ZUNoYW5nZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB2YWx1ZUNoYW5nZSA9IGl0ZW0udmFsdWVDaGFuZ2U7XHJcbiAgICAgICAgaWYgKHZhbHVlQ2hhbmdlICYmIHZhbHVlQ2hhbmdlLmltbWVkaWF0ZSA9PT0gdHJ1ZSAmJiB2YWx1ZUNoYW5nZS5oYW5kbGUpIHtcclxuICAgICAgICAgIGNvbnN0IGV2ZW50ID0geyBrZXksIHZhbHVlOiBmb3JtW2tleV0sIGZvcm1SZWY6IHByb3h5LCAuLi5zY29wZS52YWx1ZSwgaW1tZWRpYXRlOiB0cnVlIH07XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2UuaGFuZGxlKSB7XHJcbiAgICAgICAgICAgIHZhbHVlQ2hhbmdlLmhhbmRsZShldmVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIGZvcm1JdGVtU2hvdyhpdGVtOiBhbnkpIHtcclxuICAgICAgaWYgKGl0ZW0gJiYgdW5yZWYoaXRlbS5zaG93KSAhPT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBncm91cEl0ZW1TaG93KGdyb3VwSXRlbTogYW55KSB7XHJcbiAgICAgIGlmICghZ3JvdXBJdGVtLmNvbHVtbnMpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHVucmVmKGdyb3VwSXRlbS5zaG93KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGtleSBvZiBncm91cEl0ZW0uY29sdW1ucykge1xyXG4gICAgICAgIGlmIChjb21wdXRlZENvbHVtbnMudmFsdWVba2V5XSA9PSBudWxsKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXNGaWVsZFNob3cgPSBmb3JtSXRlbVNob3coY29tcHV0ZWRDb2x1bW5zLnZhbHVlW2tleV0pO1xyXG4gICAgICAgIGlmIChpc0ZpZWxkU2hvdykge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocHJvcHMud2F0Y2gpIHtcclxuICAgICAgd2F0Y2goXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGZvcm07XHJcbiAgICAgICAgfSxcclxuICAgICAgICAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICAgICAgICAgIGlmIChwcm9wcy53YXRjaCkge1xyXG4gICAgICAgICAgICBwcm9wcy53YXRjaChzY29wZS52YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkZWVwOiB0cnVlLFxyXG4gICAgICAgICAgaW1tZWRpYXRlOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGlzRGlydHkoKSB7XHJcbiAgICAgIGNvbnN0IGJlZm9yZSA9IEpTT04uc3RyaW5naWZ5KGluaXRpYWxGb3JtKTtcclxuICAgICAgY29uc3QgYWZ0ZXIgPSBKU09OLnN0cmluZ2lmeShmb3JtKTtcclxuICAgICAgcmV0dXJuIGJlZm9yZSAhPT0gYWZ0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWVyZ2VkU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuc2xvdHMsIGN0eC5zbG90cyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjdHguZW1pdChcImluaXRcIiwgc2NvcGUudmFsdWUpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGdldDogKGZvcm06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICByZXR1cm4gZ2V0KGZvcm0sIGtleSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHNldDogKGZvcm06IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICBzZXQoZm9ybSwga2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgZG9WYWx1ZUNoYW5nZShrZXksIHZhbHVlKTtcclxuICAgICAgfSxcclxuICAgICAgdWksXHJcbiAgICAgIHZhbGlkUmVmLFxyXG4gICAgICBlcnJvcnNSZWYsXHJcbiAgICAgIGZvcm1SZWYsXHJcbiAgICAgIGNvbXB1dGVkQ29sdW1ucyxcclxuICAgICAgY29tcHV0ZWREZWZhdWx0Q29sdW1ucyxcclxuICAgICAgc3VibWl0LFxyXG4gICAgICByZXNldCxcclxuICAgICAgZ2V0Rm9ybVJlZixcclxuICAgICAgc2NvcGUsXHJcbiAgICAgIGJ1aWxkSXRlbVNjb3BlLFxyXG4gICAgICBncm91cEFjdGl2ZUtleSxcclxuICAgICAgZm9ybSxcclxuICAgICAgZm9ybUl0ZW1SZWZzLFxyXG4gICAgICBnZXRGb3JtRGF0YSxcclxuICAgICAgc2V0Rm9ybURhdGEsXHJcbiAgICAgIGdldENvbXBvbmVudFJlZixcclxuICAgICAgbWVyZ2VDb2wsXHJcbiAgICAgIHZhbGlkYXRlLFxyXG4gICAgICBjb21wdXRlZEdyb3VwLFxyXG4gICAgICBnZXRDb250ZXh0Rm4sXHJcbiAgICAgIGZvcm1JdGVtU2hvdyxcclxuICAgICAgZ3JvdXBJdGVtU2hvdyxcclxuICAgICAgaXNEaXJ0eSxcclxuICAgICAgbWVyZ2VkU2xvdHNcclxuICAgIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLWZvcm0ge1xyXG4gIC5lbC1jb2xsYXBzZS1pdGVtX19jb250ZW50IHtcclxuICAgIG1hcmdpbi10b3A6IDEwcHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDMwcHg7XHJcbiAgICBwYWRkaW5nLXJpZ2h0OiAzMHB4O1xyXG4gIH1cclxuXHJcbiAgLmZzLWZvcm0taW52YWxpZCB7XHJcbiAgfVxyXG5cclxuICAuZnMtZm9ybS1pdGVtLWNvbXBvbmVudCB7XHJcbiAgICAuYW50LXBpY2tlcixcclxuICAgIC5hbnQtaW5wdXQtYWZmaXgtd3JhcHBlcixcclxuICAgIC5hbnQtaW5wdXQtbnVtYmVyLFxyXG4gICAgLmVsLWNhc2NhZGVyLFxyXG4gICAgLmVsLWRhdGUtZWRpdG9yLFxyXG4gICAgLmVsLWlucHV0LW51bWJlcixcclxuICAgIC5lbC1pbnB1dCxcclxuICAgID4gLmVsLXNlbGVjdCxcclxuICAgID4gLm4tc2VsZWN0LFxyXG4gICAgLm4tZGF0ZS1waWNrZXIsXHJcbiAgICAubi1pbnB1dC1udW1iZXIge1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgIH1cclxuXHJcbiAgICAuZWwtZGF0ZS1lZGl0b3IgLmVsLXJhbmdlX19pY29uIHtcclxuICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XHJcbiAgICB9XHJcbiAgICAuZWwtZGF0ZS1lZGl0b3IgLmVsLXJhbmdlX19jbG9zZS1pY29uIHtcclxuICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5lbC1yYW5nZS1lZGl0b3IuZWwtaW5wdXRfX3dyYXBwZXIge1xyXG4gICAgICBwYWRkaW5nOiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8uZWwtZGF0ZS1lZGl0b3IuZWwtaW5wdXRfX3dyYXBwZXIge1xyXG4gIC8vICB3aWR0aDogMTAwJTtcclxuICAvL31cclxufVxyXG5cclxuLmZzLWZvcm0tZ3JpZCB7XHJcbiAgLmZzLXJvdyB7XHJcbiAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA1MCUgNTAlO1xyXG4gICAgLy8gZ2FwOiAwIDIwcHg7IC8v5YiX6Ze06LedIDIwcHhcclxuICAgIC5mcy1jb2wge1xyXG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFudGR2XHJcbiAgICAuYW50LWZvcm0taXRlbS1sYWJlbCB7XHJcbiAgICAgIHdpZHRoOiAxMDBweDtcclxuICAgICAgZmxleDogbm9uZTtcclxuICAgICAgbWF4LXdpZHRoOiBub25lO1xyXG4gICAgfVxyXG4gICAgLmFudC1mb3JtLWl0ZW0tY29udHJvbC13cmFwcGVyIHtcclxuICAgICAgZmxleDogMTtcclxuICAgICAgbWF4LXdpZHRoOiBub25lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZWxlbWVudFxyXG4gIC5lbC1yb3c6OmFmdGVyLFxyXG4gIC5lbC1yb3c6OmJlZm9yZSB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gIH1cclxufVxyXG4uZnMtZm9ybS1mbGV4IHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcclxuICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XHJcbiAgZmxleC13cmFwOiB3cmFwO1xyXG4gIC5mcy1yb3cge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcclxuICAuZnMtZm9ybS1mbGV4IHtcclxuICAgIC5mcy1yb3cge1xyXG4gICAgICAuZnMtY29sIHtcclxuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgZmxleDogMCAwIDEwMCU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbkBtZWRpYSAobWF4LXdpZHRoOiA1NzVweCkge1xyXG4gIC5mcy1mb3JtLWZsZXgge1xyXG4gICAgLmZzLXJvdyB7XHJcbiAgICAgIC5mcy1jb2wge1xyXG4gICAgICAgIC8vLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xyXG4gICAgICAgIC8vICBmbGV4OiBub25lO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICAgIC8vLmFudC1mb3JtLWl0ZW0gLmFudC1mb3JtLWl0ZW0tY29udHJvbCB7XHJcbiAgICAgICAgLy8gIGZsZXg6IDE7XHJcbiAgICAgICAgLy8gIG1heC13aWR0aDogMTAwJTtcclxuICAgICAgICAvL31cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGNvbXBvbmVudFxyXG4gICAgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiXHJcbiAgICB2LWlmPVwiY29tcHV0ZWRJdGVtXCJcclxuICAgIGNsYXNzPVwiZnMtZm9ybS1pdGVtXCJcclxuICAgIDpbdWkuZm9ybUl0ZW0ucHJvcF09XCJjb21wdXRlZEtleVwiXHJcbiAgICB2LWJpbmQ9XCJjb21wdXRlZEl0ZW1cIlxyXG4gICAgOnBhdGg9XCJjb21wdXRlZEl0ZW0ua2V5XCJcclxuICAgIDpydWxlLXBhdGg9XCJjb21wdXRlZEl0ZW0ua2V5XCJcclxuICA+XHJcbiAgICA8dGVtcGxhdGUgI2xhYmVsPlxyXG4gICAgICA8c3BhbiB2LWlmPVwiY29tcHV0ZWRMYWJlbElzUmVuZGVyXCIgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tbGFiZWwtdGV4dFwiPlxyXG4gICAgICAgIDxmcy1yZW5kZXIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRMYWJlbFJlbmRlclwiPjwvZnMtcmVuZGVyPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxzcGFuIHYtZWxzZSBjbGFzcz1cImZzLWZvcm0taXRlbS1sYWJlbC10ZXh0XCIgOnRpdGxlPVwiY29tcHV0ZWRMYWJlbFwiPlxyXG4gICAgICAgIHt7IGNvbXB1dGVkTGFiZWwgfX1cclxuICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgIDppcz1cInVpLnRvb2x0aXAubmFtZVwiXHJcbiAgICAgICAgdi1pZj1cImNvbXB1dGVkSXRlbS5oZWxwZXIgJiYgY29tcHV0ZWRIZWxwZXJQb3NpdGlvbiA9PT0gJ2xhYmVsJ1wiXHJcbiAgICAgICAgdi1iaW5kPVwiY29tcHV0ZWRIZWxwZXJUb29sdGlwXCJcclxuICAgICAgPlxyXG4gICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnRvb2x0aXAuY29udGVudF0+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLWZvcm0taGVscGVyLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgPGZzLWZvcm0taGVscGVyIDpoZWxwZXI9XCJjb21wdXRlZEl0ZW0uaGVscGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgPHRlbXBsYXRlICNbdWkudG9vbHRpcC50cmlnZ2VyXT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtZm9ybS1pdGVtLWxhYmVsLWljb25cIj5cclxuICAgICAgICAgICAgPGZzLWljb24gY2xhc3M9XCJmcy1mb3JtLWl0ZW0tbGFiZWwtaWNvbi1pbm5lclwiIDppY29uPVwidWkuaWNvbnMucXVlc3Rpb25cIj48L2ZzLWljb24+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPGRpdiBjbGFzcz1cImZzLWZvcm0taXRlbS1jb250ZW50XCI+XHJcbiAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS50b3BSZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0udG9wUmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1pdGVtLXJlbmRlclwiPlxyXG4gICAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS5wcmVmaXhSZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0ucHJlZml4UmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tY29tcG9uZW50XCI+XHJcbiAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cImZvcm1TbG90XCIgOnNsb3RzPVwiZm9ybVNsb3RcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XHJcbiAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwiY29tcHV0ZWRJdGVtLmNvbXBvbmVudD8uc2hvdyAhPT0gZmFsc2VcIj5cclxuICAgICAgICAgICAgPGZzLXJlbmRlclxyXG4gICAgICAgICAgICAgIHYtaWY9XCJcclxuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXRlbS5jb25kaXRpb25hbFJlbmRlciAmJlxyXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJdGVtLmNvbmRpdGlvbmFsUmVuZGVyLm1hdGNoICYmXHJcbiAgICAgICAgICAgICAgICBjb21wdXRlZEl0ZW0uY29uZGl0aW9uYWxSZW5kZXIubWF0Y2goc2NvcGVGdW5jKCkpXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0uY29uZGl0aW9uYWxSZW5kZXIucmVuZGVyXCJcclxuICAgICAgICAgICAgICA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxmcy1yZW5kZXIgdi1lbHNlLWlmPVwiY29tcHV0ZWRJdGVtLnJlbmRlclwiIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XHJcbiAgICAgICAgICAgIDxmcy1jb21wb25lbnQtcmVuZGVyXHJcbiAgICAgICAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgICAgICAgcmVmPVwiY29tcG9uZW50UmVuZGVyUmVmXCJcclxuICAgICAgICAgICAgICB2LWJpbmQ9XCJjb21wdXRlZEl0ZW0uY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICA6bW9kZWwtdmFsdWU9XCJtb2RlbFZhbHVlXCJcclxuICAgICAgICAgICAgICA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiXHJcbiAgICAgICAgICAgICAgQHVwZGF0ZTptb2RlbC12YWx1ZT1cInVwZGF0ZU1vZGVsVmFsdWVcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJjb21wdXRlZEl0ZW0uc3VmZml4UmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLnN1ZmZpeFJlbmRlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS5ib3R0b21SZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0uYm90dG9tUmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxyXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cImNvbXB1dGVkSXRlbS5oZWxwZXIgJiYgY29tcHV0ZWRIZWxwZXJQb3NpdGlvbiAhPT0gJ2xhYmVsJ1wiPlxyXG4gICAgICAgIDxmcy1mb3JtLWhlbHBlciA6aGVscGVyPVwiY29tcHV0ZWRJdGVtLmhlbHBlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvY29tcG9uZW50PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIFJlZiwgUHJvcFR5cGUgfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCBGc1JlbmRlciBmcm9tIFwiLi4vcmVuZGVyL2ZzLXJlbmRlci5qc1wiO1xyXG5pbXBvcnQgeyB1c2VNZXJnZSwgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcbi8qKlxyXG4gKiBmb3JtLWl0ZW3nu4Tku7blsIHoo4VcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc0Zvcm1JdGVtXCIsXHJcbiAgY29tcG9uZW50czogeyBGc1JlbmRlciB9LFxyXG4gIHByb3BzOiB7XHJcbiAgICAvKipcclxuICAgICAqIOihqOWNleWtl+auteWAvCh2LW1vZGVsKVxyXG4gICAgICovXHJcbiAgICBtb2RlbFZhbHVlOiB7fSxcclxuICAgIC8qKlxyXG4gICAgICog5a2X5q616YWN572uXHJcbiAgICAgKi9cclxuICAgIGl0ZW06IHtcclxuICAgICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPGFueT4sXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5a2X5q6157uE5Lu25o+S5qe9XHJcbiAgICAgKi9cclxuICAgIGZvcm1TbG90OiB7XHJcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICBnZXRDb250ZXh0Rm46IHtcclxuICAgICAgdHlwZTogRnVuY3Rpb24sXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIGhlbHBlcjoge1xyXG4gICAgICB0eXBlOiBbU3RyaW5nLCBPYmplY3RdXHJcbiAgICB9XHJcbiAgfSxcclxuICBlbWl0czogW1widXBkYXRlOm1vZGVsVmFsdWVcIl0sXHJcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xyXG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XHJcbiAgICBjb25zdCBjb21wb25lbnRSZW5kZXJSZWYgPSByZWYoKTtcclxuICAgIC8vIHV0aWxzLnRyYWNlKFwiZnMtZm9ybS1pdGVtXCIpO1xyXG4gICAgLy8gY29uc3Qgc2NvcGVDb21wdXRlZDogUmVmPFNjb3BlQ29udGV4dD4gPSBjb21wdXRlZCgoKSA9PiB7fSk7XHJcblxyXG4gICAgY29uc3Qgc2NvcGVGdW5jID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBzY29wZSA9IHByb3BzLmdldENvbnRleHRGbiA/IHByb3BzLmdldENvbnRleHRGbigpIDoge307XHJcbiAgICAgIHJldHVybiB7IHZhbHVlOiBwcm9wcy5tb2RlbFZhbHVlLCBrZXk6IHByb3BzLml0ZW0ua2V5LCAuLi5zY29wZSB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVNb2RlbFZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoaXNBc3luYyA9IGZhbHNlKSB7XHJcbiAgICAgIGlmIChpc0FzeW5jKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZi52YWx1ZT8uZ2V0VGFyZ2V0UmVmQXN5bmMoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29tcG9uZW50UmVuZGVyUmVmLnZhbHVlPy5nZXRUYXJnZXRSZWYoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb21wdXRlZEl0ZW0gPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IHtcclxuICAgICAgICAuLi5wcm9wcy5pdGVtXHJcbiAgICAgIH07XHJcbiAgICAgIGRlbGV0ZSByZXMudGl0bGU7XHJcbiAgICAgIGRlbGV0ZSByZXMubGFiZWw7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZEhlbHBlclBvc2l0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4gcHJvcHMuaXRlbT8uaGVscGVyPy5wb3NpdGlvbiB8fCAocHJvcHMuaGVscGVyIGFzIGFueSk/LnBvc2l0aW9uO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBjb21wdXRlZEhlbHBlclRvb2x0aXAgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuaXRlbS5oZWxwZXI/LnRvb2x0aXAsIChwcm9wcy5oZWxwZXIgYXMgYW55KT8udG9vbHRpcCk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGNvbXB1dGVkS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBpZiAocHJvcHMuaXRlbSA9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm9wcy5pdGVtLmtleS5pbmRleE9mKFwiLlwiKSA+PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHByb3BzLml0ZW0ua2V5LnNwbGl0KFwiLlwiKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcHJvcHMuaXRlbS5rZXk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZExhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4gcHJvcHMuaXRlbS5sYWJlbCB8fCBwcm9wcy5pdGVtLnRpdGxlO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBjb21wdXRlZExhYmVsSXNSZW5kZXIgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiBjb21wdXRlZExhYmVsLnZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb247XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZExhYmVsUmVuZGVyID0gKCkgPT4ge1xyXG4gICAgICByZXR1cm4gY29tcHV0ZWRMYWJlbC52YWx1ZShzY29wZUZ1bmMoKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpLFxyXG4gICAgICB1cGRhdGVNb2RlbFZhbHVlLFxyXG4gICAgICBzY29wZUZ1bmMsXHJcbiAgICAgIGdldENvbXBvbmVudFJlZixcclxuICAgICAgY29tcG9uZW50UmVuZGVyUmVmLFxyXG4gICAgICBjb21wdXRlZEhlbHBlclBvc2l0aW9uLFxyXG4gICAgICBjb21wdXRlZEhlbHBlclRvb2x0aXAsXHJcbiAgICAgIGNvbXB1dGVkS2V5LFxyXG4gICAgICBjb21wdXRlZExhYmVsSXNSZW5kZXIsXHJcbiAgICAgIGNvbXB1dGVkTGFiZWwsXHJcbiAgICAgIGNvbXB1dGVkTGFiZWxSZW5kZXIsXHJcbiAgICAgIGNvbXB1dGVkSXRlbVxyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuXHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtZm9ybS1pdGVtIHtcclxuICAuYW50LWZvcm0taXRlbS1sYWJlbCB7XHJcbiAgICAvL2xpbmUtaGVpZ2h0OiAxO1xyXG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC10ZXh0IHtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgfVxyXG4gIH1cclxuICAuZWwtZm9ybS1pdGVtIHtcclxuICAgIC5mcy1mb3JtLWl0ZW0tbGFiZWwtaWNvbiB7XHJcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgICBoZWlnaHQ6IGluaGVyaXQ7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC5mcy1mb3JtLWl0ZW0tbGFiZWwtaWNvbiB7XHJcbiAgICBtYXJnaW46IDAgMnB4O1xyXG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC1pY29uLWlubmVyIHtcclxuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XHJcbiAgICAgIGhlaWdodDogaW5oZXJpdDtcclxuICAgIH1cclxuICB9XHJcbiAgLmZzLWZvcm0taXRlbS1jb250ZW50IHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBmbGV4OiAxO1xyXG4gICAgLmZzLWZvcm0taXRlbS1yZW5kZXIge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbiAgICAgIC5mcy1mb3JtLWl0ZW0tY29tcG9uZW50IHtcclxuICAgICAgICBmbGV4OiAxO1xyXG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4uZnMtZm9ybS1oZWxwZXItdG9vbHRpcCB7XHJcbiAgLmZzLWZvcm0taGVscGVyIHtcclxuICAgIGNvbG9yOiBpbmhlcml0O1xyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGNvbXBvbmVudFxyXG4gICAgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiXHJcbiAgICB2LWlmPVwiY29tcHV0ZWRJdGVtXCJcclxuICAgIGNsYXNzPVwiZnMtZm9ybS1pdGVtXCJcclxuICAgIDpbdWkuZm9ybUl0ZW0ucHJvcF09XCJjb21wdXRlZEtleVwiXHJcbiAgICB2LWJpbmQ9XCJjb21wdXRlZEl0ZW1cIlxyXG4gICAgOnBhdGg9XCJjb21wdXRlZEl0ZW0ua2V5XCJcclxuICAgIDpydWxlLXBhdGg9XCJjb21wdXRlZEl0ZW0ua2V5XCJcclxuICA+XHJcbiAgICA8dGVtcGxhdGUgI2xhYmVsPlxyXG4gICAgICA8c3BhbiB2LWlmPVwiY29tcHV0ZWRMYWJlbElzUmVuZGVyXCIgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tbGFiZWwtdGV4dFwiPlxyXG4gICAgICAgIDxmcy1yZW5kZXIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRMYWJlbFJlbmRlclwiPjwvZnMtcmVuZGVyPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxzcGFuIHYtZWxzZSBjbGFzcz1cImZzLWZvcm0taXRlbS1sYWJlbC10ZXh0XCIgOnRpdGxlPVwiY29tcHV0ZWRMYWJlbFwiPlxyXG4gICAgICAgIHt7IGNvbXB1dGVkTGFiZWwgfX1cclxuICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgIDppcz1cInVpLnRvb2x0aXAubmFtZVwiXHJcbiAgICAgICAgdi1pZj1cImNvbXB1dGVkSXRlbS5oZWxwZXIgJiYgY29tcHV0ZWRIZWxwZXJQb3NpdGlvbiA9PT0gJ2xhYmVsJ1wiXHJcbiAgICAgICAgdi1iaW5kPVwiY29tcHV0ZWRIZWxwZXJUb29sdGlwXCJcclxuICAgICAgPlxyXG4gICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnRvb2x0aXAuY29udGVudF0+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLWZvcm0taGVscGVyLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgPGZzLWZvcm0taGVscGVyIDpoZWxwZXI9XCJjb21wdXRlZEl0ZW0uaGVscGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgPHRlbXBsYXRlICNbdWkudG9vbHRpcC50cmlnZ2VyXT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtZm9ybS1pdGVtLWxhYmVsLWljb25cIj5cclxuICAgICAgICAgICAgPGZzLWljb24gY2xhc3M9XCJmcy1mb3JtLWl0ZW0tbGFiZWwtaWNvbi1pbm5lclwiIDppY29uPVwidWkuaWNvbnMucXVlc3Rpb25cIj48L2ZzLWljb24+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPGRpdiBjbGFzcz1cImZzLWZvcm0taXRlbS1jb250ZW50XCI+XHJcbiAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS50b3BSZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0udG9wUmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1pdGVtLXJlbmRlclwiPlxyXG4gICAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS5wcmVmaXhSZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0ucHJlZml4UmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tY29tcG9uZW50XCI+XHJcbiAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cImZvcm1TbG90XCIgOnNsb3RzPVwiZm9ybVNsb3RcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XHJcbiAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwiY29tcHV0ZWRJdGVtLmNvbXBvbmVudD8uc2hvdyAhPT0gZmFsc2VcIj5cclxuICAgICAgICAgICAgPGZzLXJlbmRlclxyXG4gICAgICAgICAgICAgIHYtaWY9XCJcclxuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXRlbS5jb25kaXRpb25hbFJlbmRlciAmJlxyXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJdGVtLmNvbmRpdGlvbmFsUmVuZGVyLm1hdGNoICYmXHJcbiAgICAgICAgICAgICAgICBjb21wdXRlZEl0ZW0uY29uZGl0aW9uYWxSZW5kZXIubWF0Y2goc2NvcGVGdW5jKCkpXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0uY29uZGl0aW9uYWxSZW5kZXIucmVuZGVyXCJcclxuICAgICAgICAgICAgICA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxmcy1yZW5kZXIgdi1lbHNlLWlmPVwiY29tcHV0ZWRJdGVtLnJlbmRlclwiIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XHJcbiAgICAgICAgICAgIDxmcy1jb21wb25lbnQtcmVuZGVyXHJcbiAgICAgICAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgICAgICAgcmVmPVwiY29tcG9uZW50UmVuZGVyUmVmXCJcclxuICAgICAgICAgICAgICB2LWJpbmQ9XCJjb21wdXRlZEl0ZW0uY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICA6bW9kZWwtdmFsdWU9XCJtb2RlbFZhbHVlXCJcclxuICAgICAgICAgICAgICA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiXHJcbiAgICAgICAgICAgICAgQHVwZGF0ZTptb2RlbC12YWx1ZT1cInVwZGF0ZU1vZGVsVmFsdWVcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJjb21wdXRlZEl0ZW0uc3VmZml4UmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLnN1ZmZpeFJlbmRlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS5ib3R0b21SZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0uYm90dG9tUmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxyXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cImNvbXB1dGVkSXRlbS5oZWxwZXIgJiYgY29tcHV0ZWRIZWxwZXJQb3NpdGlvbiAhPT0gJ2xhYmVsJ1wiPlxyXG4gICAgICAgIDxmcy1mb3JtLWhlbHBlciA6aGVscGVyPVwiY29tcHV0ZWRJdGVtLmhlbHBlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvY29tcG9uZW50PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIFJlZiwgUHJvcFR5cGUgfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCBGc1JlbmRlciBmcm9tIFwiLi4vcmVuZGVyL2ZzLXJlbmRlci5qc1wiO1xyXG5pbXBvcnQgeyB1c2VNZXJnZSwgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcbi8qKlxyXG4gKiBmb3JtLWl0ZW3nu4Tku7blsIHoo4VcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc0Zvcm1JdGVtXCIsXHJcbiAgY29tcG9uZW50czogeyBGc1JlbmRlciB9LFxyXG4gIHByb3BzOiB7XHJcbiAgICAvKipcclxuICAgICAqIOihqOWNleWtl+auteWAvCh2LW1vZGVsKVxyXG4gICAgICovXHJcbiAgICBtb2RlbFZhbHVlOiB7fSxcclxuICAgIC8qKlxyXG4gICAgICog5a2X5q616YWN572uXHJcbiAgICAgKi9cclxuICAgIGl0ZW06IHtcclxuICAgICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPGFueT4sXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5a2X5q6157uE5Lu25o+S5qe9XHJcbiAgICAgKi9cclxuICAgIGZvcm1TbG90OiB7XHJcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICBnZXRDb250ZXh0Rm46IHtcclxuICAgICAgdHlwZTogRnVuY3Rpb24sXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIGhlbHBlcjoge1xyXG4gICAgICB0eXBlOiBbU3RyaW5nLCBPYmplY3RdXHJcbiAgICB9XHJcbiAgfSxcclxuICBlbWl0czogW1widXBkYXRlOm1vZGVsVmFsdWVcIl0sXHJcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xyXG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XHJcbiAgICBjb25zdCBjb21wb25lbnRSZW5kZXJSZWYgPSByZWYoKTtcclxuICAgIC8vIHV0aWxzLnRyYWNlKFwiZnMtZm9ybS1pdGVtXCIpO1xyXG4gICAgLy8gY29uc3Qgc2NvcGVDb21wdXRlZDogUmVmPFNjb3BlQ29udGV4dD4gPSBjb21wdXRlZCgoKSA9PiB7fSk7XHJcblxyXG4gICAgY29uc3Qgc2NvcGVGdW5jID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBzY29wZSA9IHByb3BzLmdldENvbnRleHRGbiA/IHByb3BzLmdldENvbnRleHRGbigpIDoge307XHJcbiAgICAgIHJldHVybiB7IHZhbHVlOiBwcm9wcy5tb2RlbFZhbHVlLCBrZXk6IHByb3BzLml0ZW0ua2V5LCAuLi5zY29wZSB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVNb2RlbFZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoaXNBc3luYyA9IGZhbHNlKSB7XHJcbiAgICAgIGlmIChpc0FzeW5jKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZi52YWx1ZT8uZ2V0VGFyZ2V0UmVmQXN5bmMoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29tcG9uZW50UmVuZGVyUmVmLnZhbHVlPy5nZXRUYXJnZXRSZWYoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb21wdXRlZEl0ZW0gPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IHtcclxuICAgICAgICAuLi5wcm9wcy5pdGVtXHJcbiAgICAgIH07XHJcbiAgICAgIGRlbGV0ZSByZXMudGl0bGU7XHJcbiAgICAgIGRlbGV0ZSByZXMubGFiZWw7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZEhlbHBlclBvc2l0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4gcHJvcHMuaXRlbT8uaGVscGVyPy5wb3NpdGlvbiB8fCAocHJvcHMuaGVscGVyIGFzIGFueSk/LnBvc2l0aW9uO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBjb21wdXRlZEhlbHBlclRvb2x0aXAgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuaXRlbS5oZWxwZXI/LnRvb2x0aXAsIChwcm9wcy5oZWxwZXIgYXMgYW55KT8udG9vbHRpcCk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGNvbXB1dGVkS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBpZiAocHJvcHMuaXRlbSA9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm9wcy5pdGVtLmtleS5pbmRleE9mKFwiLlwiKSA+PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHByb3BzLml0ZW0ua2V5LnNwbGl0KFwiLlwiKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcHJvcHMuaXRlbS5rZXk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZExhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4gcHJvcHMuaXRlbS5sYWJlbCB8fCBwcm9wcy5pdGVtLnRpdGxlO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBjb21wdXRlZExhYmVsSXNSZW5kZXIgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiBjb21wdXRlZExhYmVsLnZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb247XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZExhYmVsUmVuZGVyID0gKCkgPT4ge1xyXG4gICAgICByZXR1cm4gY29tcHV0ZWRMYWJlbC52YWx1ZShzY29wZUZ1bmMoKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpLFxyXG4gICAgICB1cGRhdGVNb2RlbFZhbHVlLFxyXG4gICAgICBzY29wZUZ1bmMsXHJcbiAgICAgIGdldENvbXBvbmVudFJlZixcclxuICAgICAgY29tcG9uZW50UmVuZGVyUmVmLFxyXG4gICAgICBjb21wdXRlZEhlbHBlclBvc2l0aW9uLFxyXG4gICAgICBjb21wdXRlZEhlbHBlclRvb2x0aXAsXHJcbiAgICAgIGNvbXB1dGVkS2V5LFxyXG4gICAgICBjb21wdXRlZExhYmVsSXNSZW5kZXIsXHJcbiAgICAgIGNvbXB1dGVkTGFiZWwsXHJcbiAgICAgIGNvbXB1dGVkTGFiZWxSZW5kZXIsXHJcbiAgICAgIGNvbXB1dGVkSXRlbVxyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuXHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtZm9ybS1pdGVtIHtcclxuICAuYW50LWZvcm0taXRlbS1sYWJlbCB7XHJcbiAgICAvL2xpbmUtaGVpZ2h0OiAxO1xyXG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC10ZXh0IHtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgfVxyXG4gIH1cclxuICAuZWwtZm9ybS1pdGVtIHtcclxuICAgIC5mcy1mb3JtLWl0ZW0tbGFiZWwtaWNvbiB7XHJcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgICBoZWlnaHQ6IGluaGVyaXQ7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC5mcy1mb3JtLWl0ZW0tbGFiZWwtaWNvbiB7XHJcbiAgICBtYXJnaW46IDAgMnB4O1xyXG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC1pY29uLWlubmVyIHtcclxuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XHJcbiAgICAgIGhlaWdodDogaW5oZXJpdDtcclxuICAgIH1cclxuICB9XHJcbiAgLmZzLWZvcm0taXRlbS1jb250ZW50IHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBmbGV4OiAxO1xyXG4gICAgLmZzLWZvcm0taXRlbS1yZW5kZXIge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbiAgICAgIC5mcy1mb3JtLWl0ZW0tY29tcG9uZW50IHtcclxuICAgICAgICBmbGV4OiAxO1xyXG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4uZnMtZm9ybS1oZWxwZXItdG9vbHRpcCB7XHJcbiAgLmZzLWZvcm0taGVscGVyIHtcclxuICAgIGNvbG9yOiBpbmhlcml0O1xyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGNvbXBvbmVudFxyXG4gICAgOmlzPVwidWkuY29sLm5hbWVcIlxyXG4gICAgdi1pZj1cImNvbXB1dGVkSXRlbSAmJiBjb21wdXRlZEl0ZW0uc2hvdyAhPT0gZmFsc2VcIlxyXG4gICAgY2xhc3M9XCJmcy1jb2xcIlxyXG4gICAgdi1iaW5kPVwibWVyZ2UoY29sLCBjb21wdXRlZEl0ZW0/LmNvbClcIlxyXG4gID5cclxuICAgIDxmcy1mb3JtLWl0ZW1cclxuICAgICAgdi1pZj1cImNvbXB1dGVkSXRlbSAmJiBjb21wdXRlZEl0ZW0/LmJsYW5rICE9PSB0cnVlXCJcclxuICAgICAgcmVmPVwiZm9ybUl0ZW1SZWZcIlxyXG4gICAgICA6aXRlbT1cImNvbXB1dGVkSXRlbVwiXHJcbiAgICAgIDpmb3JtLXNsb3Q9XCJzbG90c1wiXHJcbiAgICAgIDpnZXQtY29udGV4dC1mbj1cImdldENvbnRleHRGblwiXHJcbiAgICAgIDpoZWxwZXI9XCJoZWxwZXJcIlxyXG4gICAgICB2LWJpbmQ9XCJhdHRyc1wiXHJcbiAgICAvPlxyXG4gIDwvY29tcG9uZW50PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiIHNldHVwPlxyXG5pbXBvcnQgeyB1c2VBdHRycywgUHJvcFR5cGUsIHJlZiB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcclxuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1tZXJnZVwiO1xyXG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCJAZmFzdC1jcnVkL3VpLWludGVyZmFjZVwiO1xyXG5jb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICAvKipcclxuICAgKiDlrZfmrrXphY3nva5cclxuICAgKi9cclxuICBpdGVtOiB7XHJcbiAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8YW55PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICog5a2X5q6157uE5Lu25o+S5qe9XHJcbiAgICovXHJcbiAgc2xvdHM6IHtcclxuICAgIHR5cGU6IEZ1bmN0aW9uLFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICBnZXRDb250ZXh0Rm46IHtcclxuICAgIHR5cGU6IEZ1bmN0aW9uLFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICBjb2w6IHtcclxuICAgIHR5cGU6IE9iamVjdCxcclxuICAgIGRlZmF1bHQ6ICgpID0+IHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gIH0sXHJcbiAgaGVscGVyOiB7XHJcbiAgICB0eXBlOiBbU3RyaW5nLCBPYmplY3RdLFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfVxyXG59KTtcclxuY29uc3QgeyBkb0NvbXB1dGVkIH0gPSB1c2VDb21wdXRlKCk7XHJcblxyXG5jb25zdCBjb21wdXRlZEl0ZW0gPSBkb0NvbXB1dGVkKFxyXG4gICgpID0+IHtcclxuICAgIHJldHVybiBwcm9wcy5pdGVtO1xyXG4gIH0sXHJcbiAgKCkgPT4ge1xyXG4gICAgcmV0dXJuIHByb3BzLmdldENvbnRleHRGbigpO1xyXG4gIH1cclxuKTtcclxuXHJcbmNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XHJcblxyXG5jb25zdCBhdHRycyA9IHVzZUF0dHJzKCk7XHJcbmNvbnN0IGZvcm1JdGVtUmVmID0gcmVmKCk7XHJcbmZ1bmN0aW9uIGdldEZvcm1JdGVtUmVmKCkge1xyXG4gIHJldHVybiBmb3JtSXRlbVJlZi52YWx1ZTtcclxufVxyXG5cclxuZGVmaW5lRXhwb3NlKHtcclxuICBnZXRGb3JtSXRlbVJlZlxyXG59KTtcclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLWZvcm0taXRlbS1jb2wge1xyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1oZWxwZXJcIj5cclxuICAgIDxwcmUgdi1pZj1cInR5cGVvZiBoZWxwZXIgPT09ICdzdHJpbmcnXCI+e3sgaGVscGVyIH19PC9wcmU+XHJcbiAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwiaGVscGVyLnJlbmRlclwiPlxyXG4gICAgICA8ZnMtcmVuZGVyIDpyZW5kZXItZnVuYz1cImhlbHBlci5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZVwiIC8+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPHByZSB2LWVsc2UtaWY9XCJoZWxwZXIudGV4dFwiPnt7IGhlbHBlci50ZXh0IH19PC9wcmU+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5cclxuLyoqXHJcbiAqIOihqOWNleWtl+auteW4ruWKqeivtOaYjue7hOS7tlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzRm9ybUhlbHBlclwiLFxyXG4gIHByb3BzOiB7XHJcbiAgICAvKipcclxuICAgICAqIOW4ruWKqeivtOaYjiwgdGV4dDog6K+05piO5paH5a2XLCByZW5kZXI6IGZ1bmN0aW9uKHNjb3BlKSDoh6rlrprkuYnmuLLmn5NcclxuICAgICAqL1xyXG4gICAgaGVscGVyOiB7XHJcbiAgICAgIHR5cGU6IFtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB0ZXh0OiDor7TmmI7mloflrZcsXHJcbiAgICAgICAgICogcmVuZGVyOiBmdW5jdGlvbiAsIOiHquWumuS5iXJlbmRlclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIE9iamVjdCxcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDor7TmmI7mlofmnKxcclxuICAgICAgICAgKi9cclxuICAgICAgICBTdHJpbmdcclxuICAgICAgXVxyXG4gICAgfSxcclxuICAgIHNjb3BlOiB7fVxyXG4gIH0sXHJcbiAgc2V0dXAocHJvcHMpIHtcclxuICAgIC8vIHV0aWxzLnRyYWNlKFwiZnMtZm9ybS1pdGVtXCIpO1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLWZvcm0taGVscGVyIHtcclxuICBjb2xvcjogIzdlN2U3ZTtcclxuICBsaW5lLWhlaWdodDogMS4zO1xyXG4gIG1hcmdpbi10b3A6IDRweDtcclxuICBtYXJnaW4tYm90dG9tOiA2cHg7XHJcblxyXG4gIGZvbnQtc2l6ZTogMTJweDtcclxuICBwcmUge1xyXG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XHJcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XHJcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAwcHg7XHJcbiAgfVxyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1oZWxwZXJcIj5cclxuICAgIDxwcmUgdi1pZj1cInR5cGVvZiBoZWxwZXIgPT09ICdzdHJpbmcnXCI+e3sgaGVscGVyIH19PC9wcmU+XHJcbiAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwiaGVscGVyLnJlbmRlclwiPlxyXG4gICAgICA8ZnMtcmVuZGVyIDpyZW5kZXItZnVuYz1cImhlbHBlci5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZVwiIC8+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPHByZSB2LWVsc2UtaWY9XCJoZWxwZXIudGV4dFwiPnt7IGhlbHBlci50ZXh0IH19PC9wcmU+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5cclxuLyoqXHJcbiAqIOihqOWNleWtl+auteW4ruWKqeivtOaYjue7hOS7tlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzRm9ybUhlbHBlclwiLFxyXG4gIHByb3BzOiB7XHJcbiAgICAvKipcclxuICAgICAqIOW4ruWKqeivtOaYjiwgdGV4dDog6K+05piO5paH5a2XLCByZW5kZXI6IGZ1bmN0aW9uKHNjb3BlKSDoh6rlrprkuYnmuLLmn5NcclxuICAgICAqL1xyXG4gICAgaGVscGVyOiB7XHJcbiAgICAgIHR5cGU6IFtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB0ZXh0OiDor7TmmI7mloflrZcsXHJcbiAgICAgICAgICogcmVuZGVyOiBmdW5jdGlvbiAsIOiHquWumuS5iXJlbmRlclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIE9iamVjdCxcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDor7TmmI7mlofmnKxcclxuICAgICAgICAgKi9cclxuICAgICAgICBTdHJpbmdcclxuICAgICAgXVxyXG4gICAgfSxcclxuICAgIHNjb3BlOiB7fVxyXG4gIH0sXHJcbiAgc2V0dXAocHJvcHMpIHtcclxuICAgIC8vIHV0aWxzLnRyYWNlKFwiZnMtZm9ybS1pdGVtXCIpO1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLWZvcm0taGVscGVyIHtcclxuICBjb2xvcjogIzdlN2U3ZTtcclxuICBsaW5lLWhlaWdodDogMS4zO1xyXG4gIG1hcmdpbi10b3A6IDRweDtcclxuICBtYXJnaW4tYm90dG9tOiA2cHg7XHJcblxyXG4gIGZvbnQtc2l6ZTogMTJweDtcclxuICBwcmUge1xyXG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XHJcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XHJcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAwcHg7XHJcbiAgfVxyXG59XHJcbjwvc3R5bGU+XHJcbiIsbnVsbCwiPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCBhcyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc0Zvcm1Qcm92aWRlclwiXHJcbn0pO1xuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XHJcbiAgPHNsb3Q+PC9zbG90PlxyXG4gIDxmcy1mb3JtLXdyYXBwZXIgdi1mb3I9XCJpdGVtIG9mIGZvcm1XcmFwcGVyTGlzdFwiIDprZXk9XCJpdGVtLmlkXCIgdi1iaW5kPVwiaXRlbVwiIC8+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBwcm92aWRlLCBSZWYsIHJlZiB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IEZzRm9ybVdyYXBwZXIgZnJvbSBcIi4vZnMtZm9ybS13cmFwcGVyLmpzXCI7XHJcbmltcG9ydCB7IE9wZW5EaWFsb2dQcm9wcyB9IGZyb20gXCIuLi8uLi9kXCI7XHJcblxyXG47XHJcblxyXG5jb25zdCBmb3JtV3JhcHBlckxpc3Q6IFJlZiA9IHJlZih7fSk7XHJcblxyXG5mdW5jdGlvbiBnZXRNYXhaSW5kZXgoKTogbnVtYmVyIHtcclxuICBsZXQgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiKlwiKTtcclxuICBsZXQgbWF4WmluZGV4ID0gMTA7XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgbWF4WmluZGV4ID0gTWF0aC5tYXgobWF4WmluZGV4LCBlbGVtZW50c1tpXS5zdHlsZS56SW5kZXggfHwgMCk7XHJcbiAgfVxyXG4gIHJldHVybiBtYXhaaW5kZXg7XHJcbn1cclxuXHJcbmNvbnN0IGZvcm1XcmFwcGVyQ29udGV4dCA9IHJlZih7fSk7XHJcbnByb3ZpZGUoXCJnZXQ6Zm9ybTp3cmFwcGVyOmNvbnRleHRcIiwgKGtleSkgPT4ge1xyXG4gIHJldHVybiBmb3JtV3JhcHBlckNvbnRleHQudmFsdWVba2V5XTtcclxufSk7XHJcblxyXG5wcm92aWRlKFwidXNlOmZvcm06d3JhcHBlclwiLCAoKSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHNldENvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgICAgZm9ybVdyYXBwZXJDb250ZXh0LnZhbHVlW2tleV0gPSB2YWx1ZTtcclxuICAgIH0sXHJcbiAgICBvcGVuKG9wdHM6IE9wZW5EaWFsb2dQcm9wcykge1xyXG4gICAgICBjb25zdCBpZCA9IG9wdHMuaWQgfHwgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMCkgKyBcIlwiO1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGZvcm1XcmFwcGVyTGlzdC52YWx1ZVtpZF0gPSB7XHJcbiAgICAgICAgICBpZCxcclxuICAgICAgICAgIC8vIHpJbmRleDogZ2V0TWF4WkluZGV4KCkgKyAxLFxyXG4gICAgICAgICAgYXN5bmMgb25Nb3VudGVkKGluc3RhbmNlOiBhbnkpIHtcclxuICAgICAgICAgICAgYXdhaXQgaW5zdGFuY2Uub3BlbihvcHRzKTtcclxuICAgICAgICAgICAgcmVzb2x2ZShpbnN0YW5jZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25DbG9zZWQoKSB7XHJcbiAgICAgICAgICAgIGlmICghb3B0cy5pZCkge1xyXG4gICAgICAgICAgICAgIC8v5aaC5p6c5LiN5piv5Zu65a6aaWTvvIzliJnlhbPpl63lkI7plIDmr4FcclxuICAgICAgICAgICAgICBkZWxldGUgZm9ybVdyYXBwZXJMaXN0LnZhbHVlW2lkXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuIixudWxsLCI8dGVtcGxhdGU+XHJcbiAgPGNvbXBvbmVudFxyXG4gICAgOmlzPVwiY29udGFpbmVyPy5pcyB8fCAnZnMtbGF5b3V0LWRlZmF1bHQnXCJcclxuICAgIHJlZj1cImNvbnRhaW5lclJlZlwiXHJcbiAgICBjbGFzcz1cImZzLWNydWQtY29udGFpbmVyXCJcclxuICAgIHYtYmluZD1cImNvbnRhaW5lclwiXHJcbiAgICA6Y2xhc3M9XCJjb21wdXRlZENsYXNzXCJcclxuICA+XHJcbiAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cIm1lcmdlZFNsb3RzLmRlZmF1bHRcIiA6c2xvdHM9XCJtZXJnZWRTbG90cy5kZWZhdWx0XCIgLz5cclxuXHJcbiAgICA8dGVtcGxhdGUgI2hlYWRlci10b3A+XHJcbiAgICAgIDxmcy1zbG90LXJlbmRlciB2LWlmPVwibWVyZ2VkU2xvdHMuaGVhZGVyVG9wXCIgOnNsb3RzPVwibWVyZ2VkU2xvdHMuaGVhZGVyVG9wXCIgLz5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgI2hlYWRlci1ib3R0b20+XHJcbiAgICAgIDxmcy1zbG90LXJlbmRlciB2LWlmPVwibWVyZ2VkU2xvdHMuaGVhZGVyQm90dG9tXCIgOnNsb3RzPVwibWVyZ2VkU2xvdHMuaGVhZGVyQm90dG9tXCIgLz5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgI2hlYWRlci1taWRkbGU+XHJcbiAgICAgIDxmcy1zbG90LXJlbmRlciB2LWlmPVwibWVyZ2VkU2xvdHMuaGVhZGVyTWlkZGxlXCIgOnNsb3RzPVwibWVyZ2VkU2xvdHMuaGVhZGVyTWlkZGxlXCIgLz5cclxuICAgIDwvdGVtcGxhdGU+XHJcblxyXG4gICAgPHRlbXBsYXRlICNzZWFyY2g+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLXNlYXJjaFwiPlxyXG4gICAgICAgIDxjb21wb25lbnQgOmlzPVwic2VhcmNoLmlzIHx8ICdmcy1zZWFyY2gnXCIgcmVmPVwic2VhcmNoUmVmXCIgdi1iaW5kPVwic2VhcmNoXCIgOnNsb3RzPVwiY29tcHV0ZWRTZWFyY2hTbG90c1wiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuXHJcbiAgICA8dGVtcGxhdGUgI2FjdGlvbmJhcj5cclxuICAgICAgPGRpdiB2LWlmPVwiYWN0aW9uYmFyICYmIGFjdGlvbmJhci5zaG93ICE9PSBmYWxzZVwiIGNsYXNzPVwiZnMtY3J1ZC1hY3Rpb25iYXJcIj5cclxuICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cIm1lcmdlZFNsb3RzLmFjdGlvbmJhckxlZnRcIiA6c2xvdHM9XCJtZXJnZWRTbG90cy5hY3Rpb25iYXJMZWZ0XCIgLz5cclxuICAgICAgICA8ZnMtYWN0aW9uYmFyIHYtYmluZD1cImFjdGlvbmJhclwiIC8+XHJcbiAgICAgICAgPGZzLXNsb3QtcmVuZGVyIHYtaWY9XCJtZXJnZWRTbG90cy5hY3Rpb25iYXJSaWdodFwiIDpzbG90cz1cIm1lcmdlZFNsb3RzLmFjdGlvbmJhclJpZ2h0XCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG5cclxuICAgIDx0ZW1wbGF0ZSAjdG9vbGJhcj5cclxuICAgICAgPGRpdiB2LWlmPVwidG9vbGJhciAmJiB0b29sYmFyLnNob3cgIT09IGZhbHNlXCIgY2xhc3M9XCJmcy1jcnVkLXRvb2xiYXJcIj5cclxuICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cIm1lcmdlZFNsb3RzLnRvb2xiYXJMZWZ0XCIgOnNsb3RzPVwibWVyZ2VkU2xvdHMudG9vbGJhckxlZnRcIiAvPlxyXG4gICAgICAgIDxmcy10b29sYmFyIHJlZj1cInRvb2xiYXJSZWZcIiB2LWJpbmQ9XCJ0b29sYmFyXCIgOnNsb3RzPVwiY29tcHV0ZWRUb29sYmFyU2xvdHNcIiA6Y29sdW1ucz1cInRhYmxlLmNvbHVtbnNcIiAvPlxyXG4gICAgICAgIDxmcy1zbG90LXJlbmRlciB2LWlmPVwibWVyZ2VkU2xvdHMudG9vbGJhclJpZ2h0XCIgOnNsb3RzPVwibWVyZ2VkU2xvdHMudG9vbGJhclJpZ2h0XCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPHRlbXBsYXRlICN0YWJzPlxyXG4gICAgICA8ZnMtdGFicy1maWx0ZXIgdi1pZj1cInRhYnNCaW5kaW5nLnNob3dcIiByZWY9XCJ0YWJzUmVmXCIgY2xhc3M9XCJmcy10YWJzXCIgdi1iaW5kPVwidGFic0JpbmRpbmdcIiAvPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDx0ZW1wbGF0ZSAjdGFibGU+XHJcbiAgICAgIDxmcy10YWJsZVxyXG4gICAgICAgIHJlZj1cInRhYmxlUmVmXCJcclxuICAgICAgICBjbGFzcz1cImZzLWNydWQtdGFibGVcIlxyXG4gICAgICAgIHYtYmluZD1cImNvbXB1dGVkVGFibGVcIlxyXG4gICAgICAgIDpjb2x1bW5zPVwidGFibGUuY29sdW1uc1wiXHJcbiAgICAgICAgOmxvYWRpbmc9XCJ0YWJsZS5sb2FkaW5nXCJcclxuICAgICAgICA6cm93LWhhbmRsZT1cInJvd0hhbmRsZVwiXHJcbiAgICAgICAgOmRhdGE9XCJkYXRhXCJcclxuICAgICAgICA6Y2VsbC1zbG90cz1cImNvbXB1dGVkQ2VsbFNsb3RzXCJcclxuICAgICAgLz5cclxuICAgIDwvdGVtcGxhdGU+XHJcblxyXG4gICAgPHRlbXBsYXRlICNmb3JtPlxyXG4gICAgICA8ZGl2IHJlZj1cImlubmVyV3JhcHBlclJlZlwiIGNsYXNzPVwiZnMtZm9ybS13cmFwcGVyLWNvbnRhaW5lclwiIDpjbGFzcz1cInsgJ2ZzLWZvcm0taW5uZXItd3JhcHBlcic6IGlzRm9ybUlubmVyIH1cIj5cclxuICAgICAgICA8ZnMtZm9ybS13cmFwcGVyXHJcbiAgICAgICAgICByZWY9XCJmb3JtV3JhcHBlclJlZlwiXHJcbiAgICAgICAgICA6c2xvdHM9XCJjb21wdXRlZEZvcm1TbG90c1wiXHJcbiAgICAgICAgICA6aW5uZXItd3JhcHBlcj1cImlubmVyV3JhcHBlclJlZlwiXHJcbiAgICAgICAgICBAaW5uZXItY2hhbmdlPVwib25Gb3JtSW5uZXJDaGFuZ2VcIlxyXG4gICAgICAgICAgQHZhbHVlLWNoYW5nZT1cIiRlbWl0KCdmb3JtLXZhbHVlLWNoYW5nZScsICRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPCEtLSDnvJbovpHlr7nor53moYYgLS0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuXHJcbiAgICA8dGVtcGxhdGUgI3BhZ2luYXRpb24+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLXBhZ2luYXRpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcGFnaW5hdGlvbi1sZWZ0XCI+XHJcbiAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cIm1lcmdlZFNsb3RzLnBhZ2luYXRpb25MZWZ0XCIgOnNsb3RzPVwibWVyZ2VkU2xvdHMucGFnaW5hdGlvbkxlZnRcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdpbmF0aW9uXCI+XHJcbiAgICAgICAgICA8IS0tIHBhZ2luYXRpb24uY3VycmVudFBhZ2Ug5aaC5p6c5Li656m677yMIGVsZW1lbnTkvJrlh7rorablkYogLS0+XHJcbiAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLnBhZ2luYXRpb24ubmFtZVwiIHYtaWY9XCJwYWdpbmF0aW9uLnNob3cgIT09IGZhbHNlXCIgdi1iaW5kPVwicGFnaW5hdGlvblwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLXBhZ2luYXRpb24tcmlnaHRcIj5cclxuICAgICAgICAgIDxmcy1zbG90LXJlbmRlciB2LWlmPVwibWVyZ2VkU2xvdHMucGFnaW5hdGlvblJpZ2h0XCIgOnNsb3RzPVwibWVyZ2VkU2xvdHMucGFnaW5hdGlvblJpZ2h0XCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG5cclxuICAgIDx0ZW1wbGF0ZSAjZm9vdGVyLXRvcD5cclxuICAgICAgPGZzLXNsb3QtcmVuZGVyIHYtaWY9XCJtZXJnZWRTbG90cy5mb290ZXJUb3BcIiA6c2xvdHM9XCJtZXJnZWRTbG90cy5mb290ZXJUb3BcIiAvPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDx0ZW1wbGF0ZSAjZm9vdGVyLWJvdHRvbT5cclxuICAgICAgPGZzLXNsb3QtcmVuZGVyIHYtaWY9XCJtZXJnZWRTbG90cy5mb290ZXJCb3R0b21cIiA6c2xvdHM9XCJtZXJnZWRTbG90cy5mb290ZXJCb3R0b21cIiAvPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICA8L2NvbXBvbmVudD5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIG9uTW91bnRlZCwgUHJvcFR5cGUsIHByb3ZpZGUsIHJlZiwgU2V0dXBDb250ZXh0LCB0b1JlZiB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgdWlDb250ZXh0IH0gZnJvbSBcIi4uL3VpXCI7XHJcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uL3VzZS91c2UtbWVyZ2VcIjtcclxuaW1wb3J0IHV0aWxMb2cgZnJvbSBcIi4uL3V0aWxzL3V0aWwubG9nXCI7XHJcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uL3V0aWxzL3V0aWwubG9nXCI7XHJcbmltcG9ydCB7IFJvd1NlbGVjdGlvblByb3BzLCBTZXRTZWFyY2hGb3JtRGF0YVByb3BzIH0gZnJvbSBcIi4uL2RcIjtcclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vdXNlXCI7XHJcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XHJcbmltcG9ydCB7IGZpbHRlckNydWRTbG90cywgbWVyZ2VDcnVkU2xvdHMsIHR5cGUgQ3J1ZFNsb3RzIH0gZnJvbSBcIi4vZnMtY3J1ZC1zbG90c1wiO1xyXG5cclxuLy8gdXRpbHMudHJhY2UoXCJmcy10YWJsZVwiKTtcclxuY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcclxuXHJcbmZ1bmN0aW9uIHVzZVByb3ZpZGVycyhwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCkge1xyXG4gIHByb3ZpZGUoXCJnZXQ6Y29sdW1uc1wiLCAoKSA9PiB7XHJcbiAgICByZXR1cm4gcHJvcHMudGFibGUuY29sdW1ucztcclxuICB9KTtcclxuICBwcm92aWRlKFwidXBkYXRlOmNvbHVtbnNcIiwgKGNvbHVtbnM6IGFueSkgPT4ge1xyXG4gICAgY3R4LmVtaXQoXCJ1cGRhdGU6Y29sdW1uc1wiLCBjb2x1bW5zKTtcclxuICB9KTtcclxuXHJcbiAgcHJvdmlkZShcImdldDpjcnVkQmluZGluZ1wiLCAoKSA9PiB7XHJcbiAgICByZXR1cm4gcHJvcHM7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVzZVNlYXJjaChwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCkge1xyXG4gIGNvbnN0IHNlYXJjaFJlZiA9IHJlZigpO1xyXG4gIGNvbnN0IGdldFNlYXJjaFJlZiA9ICgpID0+IHtcclxuICAgIHJldHVybiBzZWFyY2hSZWYudmFsdWU7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZ2V0U2VhcmNoRm9ybURhdGEgPSAoKSA9PiB7XHJcbiAgICBpZiAoc2VhcmNoUmVmLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBzZWFyY2hSZWYudmFsdWUuZ2V0Rm9ybSgpO1xyXG4gICAgfVxyXG4gICAgbG9nZ2VyLndhcm4oXCLor7fkvb/nlKhleHBvc2UuZ2V0U2VhcmNoRm9ybURhdGHku6Pmm79cIik7XHJcbiAgICByZXR1cm4ge307XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZ2V0U2VhcmNoVmFsaWRhdGVkRm9ybURhdGEgPSAoKSA9PiB7XHJcbiAgICBpZiAoc2VhcmNoUmVmLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBzZWFyY2hSZWYudmFsdWUuZ2V0VmFsaWRhdGVkRm9ybSgpO1xyXG4gICAgfVxyXG4gICAgbG9nZ2VyLndhcm4oXCLor7fkvb/nlKhleHBvc2UuZ2V0U2VhcmNoVmFsaWRhdGVkRm9ybURhdGHku6Pmm79cIik7XHJcbiAgICByZXR1cm4ge307XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICog6K6+572uZm9ybeWAvFxyXG4gICAqIEBwYXJhbSBmb3JtIGZvcm3lr7nosaFcclxuICAgKiBAcGFyYW0gb3B0cyA9IHtcclxuICAgKiAgICBpc01lcmdlOmZhbHNlIOaYr+WQpuS4juWOn+aciWZvcm3lgLzlkIjlubYsXHJcbiAgICogfVxyXG4gICAqL1xyXG4gIGZ1bmN0aW9uIHNldFNlYXJjaEZvcm1EYXRhKHsgZm9ybSwgbWVyZ2VGb3JtID0gZmFsc2UgfTogU2V0U2VhcmNoRm9ybURhdGFQcm9wcykge1xyXG4gICAgaWYgKHNlYXJjaFJlZi52YWx1ZSkge1xyXG4gICAgICBzZWFyY2hSZWYudmFsdWUuc2V0Rm9ybShmb3JtLCBtZXJnZUZvcm0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHNlYXJjaFJlZixcclxuICAgIGdldFNlYXJjaFJlZixcclxuICAgIGdldFNlYXJjaEZvcm1EYXRhLFxyXG4gICAgc2V0U2VhcmNoRm9ybURhdGEsXHJcbiAgICBnZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YVxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVzZVRhYnMoc2VhcmNoUmV0OiBhbnksIHByb3BzOiBhbnksIGN0eDogU2V0dXBDb250ZXh0KSB7XHJcbiAgY29uc3QgdGFic0JpbmRpbmcgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBpZiAocHJvcHMudGFicyAmJiBwcm9wcy50YWJzLnNob3cgJiYgcHJvcHMudGFicy5uYW1lKSB7XHJcbiAgICAgIGxldCBkaWN0ID0gbnVsbDtcclxuICAgICAgY29uc3QgZGVmYXVsdFRhYnMgPSB7IC4uLnByb3BzLnRhYnMgfTtcclxuICAgICAgaWYgKHByb3BzLnNlYXJjaD8uY29sdW1ucyAmJiBwcm9wcy5zZWFyY2g/LmNvbHVtbnNbcHJvcHMudGFicy5uYW1lXT8uY29tcG9uZW50Py5kaWN0KSB7XHJcbiAgICAgICAgZGljdCA9IHByb3BzLnNlYXJjaD8uY29sdW1uc1twcm9wcy50YWJzLm5hbWVdPy5jb21wb25lbnQ/LmRpY3Q7XHJcbiAgICAgICAgaWYgKGRlZmF1bHRUYWJzLnZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgIGRlZmF1bHRUYWJzLnZhbHVlID0gZGljdC52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRlZmF1bHRUYWJzLmxhYmVsID09IG51bGwpIHtcclxuICAgICAgICAgIGRlZmF1bHRUYWJzLmxhYmVsID0gZGljdC5sYWJlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRlZmF1bHRUYWJzLm9wdGlvbnMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgZGVmYXVsdFRhYnMub3B0aW9ucyA9IGRpY3QuZGF0YSB8fCBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uZGVmYXVsdFRhYnMsXHJcbiAgICAgICAgbW9kZWxWYWx1ZTogcHJvcHMuc2VhcmNoLnZhbGlkYXRlZEZvcm0gJiYgcHJvcHMuc2VhcmNoLnZhbGlkYXRlZEZvcm1bcHJvcHMudGFicy5uYW1lXSxcclxuICAgICAgICBcIm9uVXBkYXRlOm1vZGVsVmFsdWVcIjogKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGN0eC5lbWl0KFwidGFiLWNoYW5nZVwiLCB7IFtwcm9wcy50YWJzLm5hbWVdOiB2YWx1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzaG93OiBmYWxzZVxyXG4gICAgfTtcclxuICB9KTtcclxuICByZXR1cm4ge1xyXG4gICAgdGFic0JpbmRpbmdcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiB1c2VGaXhlZEhlaWdodChwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCwgeyB0YWJsZVJlZiwgY29udGFpbmVyUmVmIH06IGFueSkge1xyXG4gIGNvbnN0IHVpID0gdWlDb250ZXh0LmdldCgpO1xyXG4gIGxldCB0YWJsZUNJID0gdWkudGFibGU7XHJcbiAgaWYgKHByb3BzLnRhYmxlPy50YWJsZVZlcnNpb24gPT09IFwidjJcIikge1xyXG4gICAgdGFibGVDSSA9IHVpLnRhYmxlVjI7XHJcbiAgfVxyXG4gIGlmICh0YWJsZUNJLmhhc01heEhlaWdodChwcm9wcy50YWJsZSkpIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcbiAgaWYgKCF0YWJsZUNJLmZpeGVkSGVhZGVyTmVlZENvbXB1dGVCb2R5SGVpZ2h0KSB7XHJcbiAgICByZXR1cm4ge307XHJcbiAgfVxyXG4gIGNvbnN0IG1heEhlaWdodFJlZiA9IHJlZihudWxsKTtcclxuXHJcbiAgZnVuY3Rpb24gY29tcHV0ZUJvZHlIZWlnaHQoKSB7XHJcbiAgICBjb25zdCB0YWJsZURvbSA9IHRhYmxlUmVmPy52YWx1ZT8uJGVsO1xyXG4gICAgaWYgKHRhYmxlRG9tID09IG51bGwgfHwgdGFibGVEb20ucXVlcnlTZWxlY3RvciA9PSBudWxsIHx8ICEodGFibGVEb20ucXVlcnlTZWxlY3RvciBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBoZWFkRG9tID0gdGFibGVEb20ucXVlcnlTZWxlY3Rvcih0YWJsZUNJLmhlYWRlckRvbVNlbGVjdG9yKTtcclxuICAgIGlmIChoZWFkRG9tID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGFibGVIZWlnaHQgPSB0YWJsZURvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XHJcbiAgICBjb25zdCBoZWFkSGVpZ2h0ID0gaGVhZERvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XHJcbiAgICBtYXhIZWlnaHRSZWYudmFsdWUgPSB0YWJsZUhlaWdodCAtIGhlYWRIZWlnaHQgLSAyICsgKHByb3BzLnRhYmxlLm1heEhlaWdodEFkanVzdCB8fCAwKTtcclxuXHJcbiAgICB1dGlsTG9nLmRlYnVnKFwidGFibGUgbWF4IGhlaWdodCByZWNvbXB1dGVkIFwiLCBtYXhIZWlnaHRSZWYudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gd2F0Y2hCb2R5SGVpZ2h0Q2hhbmdlKCkge1xyXG4gICAgY29uc3QgdGFibGVEb20gPSB0YWJsZVJlZj8udmFsdWU/LiRlbDtcclxuICAgIGlmICh0YWJsZURvbSA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHRhYmxlV3JhcHBlckRvbSA9IHRhYmxlRG9tLnBhcmVudE5vZGU7XHJcblxyXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcclxuICAgICAgdXRpbExvZy5kZWJ1ZyhcInRhYmxlIHJlc2l6ZWRcIiwgZW50cmllcyk7XHJcbiAgICAgIC8vIOavj+asoeiiq+ingua1i+eahOWFg+e0oOWwuuWvuOWPkeeUn+aUueWPmOi/memHjOmDveS8muaJp+ihjFxyXG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIGVudHJpZXNbMF0uY29udGVudFJlY3QuaGVpZ2h0ID4gMCkge1xyXG4gICAgICAgIGNvbXB1dGVCb2R5SGVpZ2h0KCk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xyXG4gICAgICAgIH0sIDIwMCk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0YWJsZVdyYXBwZXJEb20pOyAvLyDop4LmtYtET03lhYPntKBcclxuICB9XHJcblxyXG4gIG9uTW91bnRlZChhc3luYyAoKSA9PiB7XHJcbiAgICBhd2FpdCBuZXh0VGljaygpO1xyXG4gICAgYXdhaXQgbmV4dFRpY2soKTtcclxuICAgIHdhdGNoQm9keUhlaWdodENoYW5nZSgpO1xyXG4gIH0pO1xyXG4gIHJldHVybiB7IG1heEhlaWdodFJlZiwgY29tcHV0ZUJvZHlIZWlnaHQgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXNlVGFibGUocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcclxuICBjb25zdCB1aSA9IHVpQ29udGV4dC5nZXQoKTtcclxuICBjb25zdCB0YWJsZVJlZiA9IHJlZigpO1xyXG4gIGNvbnN0IHRvb2xiYXJSZWYgPSByZWYoKTtcclxuICBjb25zdCBjb250YWluZXJSZWYgPSByZWYoKTtcclxuICBjb25zdCB7IG1heEhlaWdodFJlZiwgY29tcHV0ZUJvZHlIZWlnaHQgfSA9IHVzZUZpeGVkSGVpZ2h0KHByb3BzLCBjdHgsIHsgdGFibGVSZWYsIGNvbnRhaW5lclJlZiB9KTtcclxuICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xyXG4gIGNvbnN0IHRhYmxlUHJvcFJlZiA9IHRvUmVmKHByb3BzLCBcInRhYmxlXCIpO1xyXG4gIGNvbnN0IGNvbXB1dGVkVGFibGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAvLyBhbnRkdiBuYWl2ZSDpq5jluqboh6rpgILlupTvvIwg5aaC5p6c55So5oi35pyJ6YWN572uc2Nyb2xs77yM5YiZ5LyY5YWI5L2/55So55So5oi36YWN572u55qEXHJcbiAgICBsZXQgZml4ZWRIZWlnaHQgPSB7fTtcclxuICAgIGlmIChtYXhIZWlnaHRSZWY/LnZhbHVlICE9IG51bGwpIHtcclxuICAgICAgbGV0IHRhYmxlQ0kgPSB1aS50YWJsZTtcclxuICAgICAgaWYgKHByb3BzLnRhYmxlPy50YWJsZVZlcnNpb24gPT09IFwidjJcIikge1xyXG4gICAgICAgIHRhYmxlQ0kgPSB1aS50YWJsZVYyO1xyXG4gICAgICB9XHJcbiAgICAgIGZpeGVkSGVpZ2h0ID0gdGFibGVDSS5idWlsZE1heEhlaWdodChtYXhIZWlnaHRSZWYudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcEF0dHJzID0gdXRpbHMuZGFzaC5vbWl0KHRhYmxlUHJvcFJlZiwgXCJsb2FkaW5nXCIsIFwiY29sdW1uc1wiLCBcImNvbHVtbnNNYXBcIik7XHJcblxyXG4gICAgcmV0dXJuIG1lcmdlKGZpeGVkSGVpZ2h0LCB7IC4uLmN0eC5hdHRycywgLi4ucEF0dHJzIH0pO1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBjb21wdXRlZFRvb2xiYXIgPSB0b1JlZihwcm9wcywgXCJ0b29sYmFyXCIpO1xyXG4gIGNvbnN0IG1lcmdlZFNsb3RzID0gY29tcHV0ZWQoKCkgPT4gbWVyZ2VDcnVkU2xvdHMocHJvcHMuc2xvdHMsIGN0eC5zbG90cykpO1xyXG5cclxuICBjb25zdCBjb21wdXRlZENlbGxTbG90cyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIHJldHVybiBmaWx0ZXJDcnVkU2xvdHMobWVyZ2VkU2xvdHMudmFsdWUsIFwiY2VsbFwiKTtcclxuICB9KTtcclxuXHJcbiAgY29uc3QgY29tcHV0ZWRGb3JtU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICByZXR1cm4gZmlsdGVyQ3J1ZFNsb3RzKG1lcmdlZFNsb3RzLnZhbHVlLCBcImZvcm1cIik7XHJcbiAgfSk7XHJcbiAgY29uc3QgY29tcHV0ZWRTZWFyY2hTbG90cyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIHJldHVybiBmaWx0ZXJDcnVkU2xvdHMobWVyZ2VkU2xvdHMudmFsdWUsIFwic2VhcmNoXCIpO1xyXG4gIH0pO1xyXG4gIGNvbnN0IGNvbXB1dGVkVG9vbGJhclNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgcmV0dXJuIGZpbHRlckNydWRTbG90cyhtZXJnZWRTbG90cy52YWx1ZSwgXCJ0b29sYmFyXCIpO1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBmb3JtV3JhcHBlclJlZiA9IHJlZigpO1xyXG5cclxuICBjb25zdCBjb21wdXRlZENsYXNzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgY2xheno6IGFueSA9IHsgY29tcGFjdDogcHJvcHMudG9vbGJhci5jb21wYWN0ICE9PSBmYWxzZSB9O1xyXG4gICAgaWYgKHByb3BzLmN1c3RvbUNsYXNzKSB7XHJcbiAgICAgIGNsYXp6W3Byb3BzLmN1c3RvbUNsYXNzXSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xheno7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IGlubmVyV3JhcHBlclJlZiA9IHJlZigpO1xyXG5cclxuICBjb25zdCBpc0Zvcm1Jbm5lciA9IHJlZihmYWxzZSk7XHJcbiAgY29uc3Qgb25Gb3JtSW5uZXJDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgaXNGb3JtSW5uZXIudmFsdWUgPSB2YWx1ZTtcclxuICB9O1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgdGFibGVSZWYsXHJcbiAgICBjb250YWluZXJSZWYsXHJcbiAgICB0b29sYmFyUmVmLFxyXG4gICAgY29tcHV0ZWRUYWJsZSxcclxuICAgIGNvbXB1dGVkVG9vbGJhcixcclxuICAgIG1lcmdlZFNsb3RzLFxyXG4gICAgY29tcHV0ZWRDZWxsU2xvdHMsXHJcbiAgICBmb3JtV3JhcHBlclJlZixcclxuICAgIGlzRm9ybUlubmVyLFxyXG4gICAgb25Gb3JtSW5uZXJDaGFuZ2UsXHJcbiAgICBjb21wdXRlZEZvcm1TbG90cyxcclxuICAgIGNvbXB1dGVkU2VhcmNoU2xvdHMsXHJcbiAgICBjb21wdXRlZFRvb2xiYXJTbG90cyxcclxuICAgIGNvbXB1dGVCb2R5SGVpZ2h0LFxyXG4gICAgY29tcHV0ZWRDbGFzcyxcclxuICAgIGlubmVyV3JhcHBlclJlZlxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBmcy1jcnVkXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNDcnVkXCIsXHJcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDooajmoLxpZFxyXG4gICAgICovXHJcbiAgICBpZDoge1xyXG4gICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgIGRlZmF1bHQ6IFwiXCJcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOihqOagvOmFjee9ru+8jOingUZzVGFibGVcclxuICAgICAqL1xyXG4gICAgdGFibGU6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog6KGo5qC85pWw5o2uXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvcmVxdWlyZS1kZWZhdWx0LXByb3BcclxuICAgIGRhdGE6IHtcclxuICAgICAgdHlwZTogQXJyYXlcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaTjeS9nOWIl+mFjee9ru+8jOingUZzUm93SGFuZGxlXHJcbiAgICAgKi9cclxuICAgIHJvd0hhbmRsZToge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmn6Xor6LmoYbphY3nva7vvIzop4FGc1NlYXJjaFxyXG4gICAgICovXHJcbiAgICBzZWFyY2g6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5bel5YW35p2h6YWN572u77yM6KeBRnNUb29sYmFyXHJcbiAgICAgKi9cclxuICAgIHRvb2xiYXI6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5Yqo5L2c5p2h6YWN572u77yM6KeBRnNBY3Rpb25iYXJcclxuICAgICAqL1xyXG4gICAgYWN0aW9uYmFyOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIHRhYnMgZmlsdGVyXHJcbiAgICAgKi9cclxuICAgIHRhYnM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5re75Yqg6KGo5Y2V5a+56K+d5qGG6YWN572u77yM6KeBRnNGb3JtV3JhcHBlclxyXG4gICAgICovXHJcbiAgICBhZGRGb3JtOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOe8lui+keihqOWNleWvueivneahhumFjee9ru+8jOingUZzRm9ybVdyYXBwZXJcclxuICAgICAqL1xyXG4gICAgZWRpdEZvcm06IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5p+l55yL6KGo5Y2V5a+56K+d5qGG6YWN572u77yM6KeBRnNGb3JtV3JhcHBlclxyXG4gICAgICovXHJcbiAgICB2aWV3Rm9ybToge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDnv7vpobXphY3nva4s5pSv5oyBZWwtcGFnaW5hdGlvbnxhLXBhZ2luYXRpb27phY3nva5cclxuICAgICAqL1xyXG4gICAgcGFnaW5hdGlvbjoge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgc2hvdzogZmFsc2UgfTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5a655Zmo6YWN572u77yM6KeBRnNDb250YWluZXJcclxuICAgICAqL1xyXG4gICAgY29udGFpbmVyOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOmFjee9ruW8j+aPkuanve+8jOaooeadv+aPkuanveWQjOWQjeaXtuS8mOWFiFxyXG4gICAgICovXHJcbiAgICBzbG90czoge1xyXG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8Q3J1ZFNsb3RzPixcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjcnVk5YyF6KO55a655Zmo55qEY2xhc3NcclxuICAgICAqL1xyXG4gICAgY3VzdG9tQ2xhc3M6IHt9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDkuI3opoHkvKDliLBmcy10YWJsZeWOu1xyXG4gICAgICovXHJcbiAgICBmb3JtOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlj6/pgInmi6lcclxuICAgICAqL1xyXG4gICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCBhcyBQcm9wVHlwZTxSb3dTZWxlY3Rpb25Qcm9wcz4sXHJcbiAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgc2hvdzogZmFsc2UgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgZW1pdHM6IFtcInVwZGF0ZTpzZWFyY2hcIiwgXCJ1cGRhdGU6Y29tcGFjdFwiLCBcInVwZGF0ZTpjb2x1bW5zXCIsIFwiZm9ybS12YWx1ZS1jaGFuZ2VcIiwgXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCBcInRhYi1jaGFuZ2VcIl0sXHJcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgICB1c2VQcm92aWRlcnMocHJvcHMsIGN0eCk7XHJcbiAgICBjb25zdCBzZWFyY2ggPSB1c2VTZWFyY2gocHJvcHMsIGN0eCk7XHJcbiAgICBjb25zdCB0YWJzID0gdXNlVGFicyhzZWFyY2gsIHByb3BzLCBjdHgpO1xyXG4gICAgY29uc3QgdGFibGUgPSB1c2VUYWJsZShwcm9wcywgY3R4KTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpLFxyXG4gICAgICAuLi5zZWFyY2gsXHJcbiAgICAgIC4uLnRhYmxlLFxyXG4gICAgICAuLi50YWJzXHJcbiAgICB9O1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLy/kvZzkuLrmlbDmja7ooajmoLzkvb/nlKjnmoTpooTorr7moLflvI/vvIzpmpDol49mb290ZXLvvIzooajmoLzpq5jluqbnoo7orrDlvZXmlbDlop7liqDogIzlop7liqBcclxuLmZzLWNydWQtYXMtdGFibGUge1xyXG4gIG1pbi1oZWlnaHQ6IDAgIWltcG9ydGFudDtcclxuICBoZWlnaHQ6IHVuc2V0O1xyXG5cclxuICAuZnMtY3J1ZC1mb290ZXIge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICB9XHJcblxyXG4gIC5ib3ggLmlubmVyIHtcclxuICAgIHBvc2l0aW9uOiBzdGF0aWM7XHJcbiAgfVxyXG59XHJcblxyXG4uZnMtY3J1ZC1jb250YWluZXIge1xyXG4gIG1pbi1oZWlnaHQ6IDMwMHB4O1xyXG5cclxuICAmLmNvbXBhY3Qge1xyXG4gICAgLmVsLXRhYmxlLS1ib3JkZXIge1xyXG4gICAgICBib3JkZXItbGVmdDogMDtcclxuICAgIH1cclxuXHJcbiAgICAuZnMtY3J1ZC1oZWFkZXIge1xyXG4gICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XHJcbiAgICB9XHJcblxyXG4gICAgLmZzLWNydWQtZm9vdGVyIHtcclxuICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xyXG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLmZzLWNydWQtaGVhZGVyIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDA7XHJcbiAgICBmbGV4LXdyYXA6IHdyYXA7XHJcblxyXG4gICAgLmZzLWhlYWRlci10b3Age1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgIH1cclxuXHJcbiAgICAuZnMtY3J1ZC1zZWFyY2gge1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgZ3JpZC1jb2x1bW46IHNwYW4gMjtcclxuICAgICAgcGFkZGluZy1ib3R0b206IDVweDtcclxuICAgIH1cclxuXHJcbiAgICAuZnMtaGVhZGVyLW1pZGRsZSB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC5mcy1oZWFkZXItYm90dG9tIHtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLmZzLWNydWQtYWN0aW9uYmFyIHtcclxuICAgICAgLy8gcGFkZGluZy10b3A6IDVweDtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgZmxleDogMTAwMDA7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIG1pbi13aWR0aDogMXB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5mcy1jcnVkLXRvb2xiYXIge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XHJcbiAgICAgIGZsZXg6IDE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAuZnMtY3J1ZC10YWJsZSB7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICB9XHJcblxyXG4gIC5mcy1jcnVkLWZvb3RlciB7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDA7XHJcblxyXG4gICAgLmZzLWNydWQtcGFnaW5hdGlvbiB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cclxuICAgICAgLmZzLXBhZ2luYXRpb24tbGVmdCB7XHJcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xyXG5cclxuICAgICAgICAvKiDlt6bkvqfmsqHmnInmj5Lmp73lhoXlrrnml7bkuI3nlZnnqbrpmpnvvIzkv53or4HliIbpobXlmajkuKXmoLzlsYXkuK0gKi9cclxuICAgICAgICAmOmVtcHR5IHtcclxuICAgICAgICAgIG1hcmdpbi1yaWdodDogMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5mcy1wYWdpbmF0aW9uLXJpZ2h0IHtcclxuICAgICAgICBmbGV4OiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAuZnMtcGFnaW5hdGlvbiB7XHJcbiAgICAgICAgLyog5YiG6aG15Zmo5bGF5Lit77ya5LiN5YaN5pKR5ruh5pW06KGM77yM5a695bqm6Ieq6YCC5bqU5bm25oqK5YiG6aG157uE5Lu25rC05bmz5bGF5LitICovXHJcbiAgICAgICAgZmxleDogMCAxIGF1dG87XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuXHJcbiAgICAgICAgLmFudC1wYWdpbmF0aW9uLW9wdGlvbnMge1xyXG4gICAgICAgICAgLmFudC1zZWxlY3Qge1xyXG4gICAgICAgICAgICB3aWR0aDogYXV0bztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5lbC1wYWdpbmF0aW9uIHtcclxuICAgICAgICAgIHBhZGRpbmctbGVmdDogMDtcclxuICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDA7XHJcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5mcy1wYWdpbmF0aW9uLXJpZ2h0IHtcclxuICAgICAgICBmbGV4OiAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcclxuICAuZnMtY3J1ZC1jb250YWluZXIge1xyXG4gICAgLmJvZHkge1xyXG4gICAgICBvdmVyZmxvdy15OiB1bnNldCAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG4gICAgLmFudC10YWJsZS1ib2R5IHtcclxuICAgICAgbWF4LWhlaWdodDogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5uLWRhdGEtdGFibGUtYmFzZS10YWJsZS1ib2R5IHtcclxuICAgICAgbWF4LWhlaWdodDogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5mcy1jcnVkLWhlYWRlciAuZnMtY3J1ZC1hY3Rpb25iYXIge1xyXG4gICAgICBmbGV4OiB1bnNldCAhaW1wb3J0YW50O1xyXG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XHJcbiAgICAgIG1hcmdpbi1ib3R0b206IDJweDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuPC9zdHlsZT5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxjb21wb25lbnRcclxuICAgIDppcz1cImNvbnRhaW5lcj8uaXMgfHwgJ2ZzLWxheW91dC1kZWZhdWx0J1wiXHJcbiAgICByZWY9XCJjb250YWluZXJSZWZcIlxyXG4gICAgY2xhc3M9XCJmcy1jcnVkLWNvbnRhaW5lclwiXHJcbiAgICB2LWJpbmQ9XCJjb250YWluZXJcIlxyXG4gICAgOmNsYXNzPVwiY29tcHV0ZWRDbGFzc1wiXHJcbiAgPlxyXG4gICAgPGZzLXNsb3QtcmVuZGVyIHYtaWY9XCJtZXJnZWRTbG90cy5kZWZhdWx0XCIgOnNsb3RzPVwibWVyZ2VkU2xvdHMuZGVmYXVsdFwiIC8+XHJcblxyXG4gICAgPHRlbXBsYXRlICNoZWFkZXItdG9wPlxyXG4gICAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cIm1lcmdlZFNsb3RzLmhlYWRlclRvcFwiIDpzbG90cz1cIm1lcmdlZFNsb3RzLmhlYWRlclRvcFwiIC8+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPHRlbXBsYXRlICNoZWFkZXItYm90dG9tPlxyXG4gICAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cIm1lcmdlZFNsb3RzLmhlYWRlckJvdHRvbVwiIDpzbG90cz1cIm1lcmdlZFNsb3RzLmhlYWRlckJvdHRvbVwiIC8+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPHRlbXBsYXRlICNoZWFkZXItbWlkZGxlPlxyXG4gICAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cIm1lcmdlZFNsb3RzLmhlYWRlck1pZGRsZVwiIDpzbG90cz1cIm1lcmdlZFNsb3RzLmhlYWRlck1pZGRsZVwiIC8+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG5cclxuICAgIDx0ZW1wbGF0ZSAjc2VhcmNoPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY3J1ZC1zZWFyY2hcIj5cclxuICAgICAgICA8Y29tcG9uZW50IDppcz1cInNlYXJjaC5pcyB8fCAnZnMtc2VhcmNoJ1wiIHJlZj1cInNlYXJjaFJlZlwiIHYtYmluZD1cInNlYXJjaFwiIDpzbG90cz1cImNvbXB1dGVkU2VhcmNoU2xvdHNcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvdGVtcGxhdGU+XHJcblxyXG4gICAgPHRlbXBsYXRlICNhY3Rpb25iYXI+XHJcbiAgICAgIDxkaXYgdi1pZj1cImFjdGlvbmJhciAmJiBhY3Rpb25iYXIuc2hvdyAhPT0gZmFsc2VcIiBjbGFzcz1cImZzLWNydWQtYWN0aW9uYmFyXCI+XHJcbiAgICAgICAgPGZzLXNsb3QtcmVuZGVyIHYtaWY9XCJtZXJnZWRTbG90cy5hY3Rpb25iYXJMZWZ0XCIgOnNsb3RzPVwibWVyZ2VkU2xvdHMuYWN0aW9uYmFyTGVmdFwiIC8+XHJcbiAgICAgICAgPGZzLWFjdGlvbmJhciB2LWJpbmQ9XCJhY3Rpb25iYXJcIiAvPlxyXG4gICAgICAgIDxmcy1zbG90LXJlbmRlciB2LWlmPVwibWVyZ2VkU2xvdHMuYWN0aW9uYmFyUmlnaHRcIiA6c2xvdHM9XCJtZXJnZWRTbG90cy5hY3Rpb25iYXJSaWdodFwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuXHJcbiAgICA8dGVtcGxhdGUgI3Rvb2xiYXI+XHJcbiAgICAgIDxkaXYgdi1pZj1cInRvb2xiYXIgJiYgdG9vbGJhci5zaG93ICE9PSBmYWxzZVwiIGNsYXNzPVwiZnMtY3J1ZC10b29sYmFyXCI+XHJcbiAgICAgICAgPGZzLXNsb3QtcmVuZGVyIHYtaWY9XCJtZXJnZWRTbG90cy50b29sYmFyTGVmdFwiIDpzbG90cz1cIm1lcmdlZFNsb3RzLnRvb2xiYXJMZWZ0XCIgLz5cclxuICAgICAgICA8ZnMtdG9vbGJhciByZWY9XCJ0b29sYmFyUmVmXCIgdi1iaW5kPVwidG9vbGJhclwiIDpzbG90cz1cImNvbXB1dGVkVG9vbGJhclNsb3RzXCIgOmNvbHVtbnM9XCJ0YWJsZS5jb2x1bW5zXCIgLz5cclxuICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cIm1lcmdlZFNsb3RzLnRvb2xiYXJSaWdodFwiIDpzbG90cz1cIm1lcmdlZFNsb3RzLnRvb2xiYXJSaWdodFwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDx0ZW1wbGF0ZSAjdGFicz5cclxuICAgICAgPGZzLXRhYnMtZmlsdGVyIHYtaWY9XCJ0YWJzQmluZGluZy5zaG93XCIgcmVmPVwidGFic1JlZlwiIGNsYXNzPVwiZnMtdGFic1wiIHYtYmluZD1cInRhYnNCaW5kaW5nXCIgLz5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgI3RhYmxlPlxyXG4gICAgICA8ZnMtdGFibGVcclxuICAgICAgICByZWY9XCJ0YWJsZVJlZlwiXHJcbiAgICAgICAgY2xhc3M9XCJmcy1jcnVkLXRhYmxlXCJcclxuICAgICAgICB2LWJpbmQ9XCJjb21wdXRlZFRhYmxlXCJcclxuICAgICAgICA6Y29sdW1ucz1cInRhYmxlLmNvbHVtbnNcIlxyXG4gICAgICAgIDpsb2FkaW5nPVwidGFibGUubG9hZGluZ1wiXHJcbiAgICAgICAgOnJvdy1oYW5kbGU9XCJyb3dIYW5kbGVcIlxyXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXHJcbiAgICAgICAgOmNlbGwtc2xvdHM9XCJjb21wdXRlZENlbGxTbG90c1wiXHJcbiAgICAgIC8+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG5cclxuICAgIDx0ZW1wbGF0ZSAjZm9ybT5cclxuICAgICAgPGRpdiByZWY9XCJpbm5lcldyYXBwZXJSZWZcIiBjbGFzcz1cImZzLWZvcm0td3JhcHBlci1jb250YWluZXJcIiA6Y2xhc3M9XCJ7ICdmcy1mb3JtLWlubmVyLXdyYXBwZXInOiBpc0Zvcm1Jbm5lciB9XCI+XHJcbiAgICAgICAgPGZzLWZvcm0td3JhcHBlclxyXG4gICAgICAgICAgcmVmPVwiZm9ybVdyYXBwZXJSZWZcIlxyXG4gICAgICAgICAgOnNsb3RzPVwiY29tcHV0ZWRGb3JtU2xvdHNcIlxyXG4gICAgICAgICAgOmlubmVyLXdyYXBwZXI9XCJpbm5lcldyYXBwZXJSZWZcIlxyXG4gICAgICAgICAgQGlubmVyLWNoYW5nZT1cIm9uRm9ybUlubmVyQ2hhbmdlXCJcclxuICAgICAgICAgIEB2YWx1ZS1jaGFuZ2U9XCIkZW1pdCgnZm9ybS12YWx1ZS1jaGFuZ2UnLCAkZXZlbnQpXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDwhLS0g57yW6L6R5a+56K+d5qGGIC0tPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvdGVtcGxhdGU+XHJcblxyXG4gICAgPHRlbXBsYXRlICNwYWdpbmF0aW9uPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY3J1ZC1wYWdpbmF0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLXBhZ2luYXRpb24tbGVmdFwiPlxyXG4gICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIHYtaWY9XCJtZXJnZWRTbG90cy5wYWdpbmF0aW9uTGVmdFwiIDpzbG90cz1cIm1lcmdlZFNsb3RzLnBhZ2luYXRpb25MZWZ0XCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcGFnaW5hdGlvblwiPlxyXG4gICAgICAgICAgPCEtLSBwYWdpbmF0aW9uLmN1cnJlbnRQYWdlIOWmguaenOS4uuepuu+8jCBlbGVtZW505Lya5Ye66K2m5ZGKIC0tPlxyXG4gICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5wYWdpbmF0aW9uLm5hbWVcIiB2LWlmPVwicGFnaW5hdGlvbi5zaG93ICE9PSBmYWxzZVwiIHYtYmluZD1cInBhZ2luYXRpb25cIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdpbmF0aW9uLXJpZ2h0XCI+XHJcbiAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cIm1lcmdlZFNsb3RzLnBhZ2luYXRpb25SaWdodFwiIDpzbG90cz1cIm1lcmdlZFNsb3RzLnBhZ2luYXRpb25SaWdodFwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuXHJcbiAgICA8dGVtcGxhdGUgI2Zvb3Rlci10b3A+XHJcbiAgICAgIDxmcy1zbG90LXJlbmRlciB2LWlmPVwibWVyZ2VkU2xvdHMuZm9vdGVyVG9wXCIgOnNsb3RzPVwibWVyZ2VkU2xvdHMuZm9vdGVyVG9wXCIgLz5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgI2Zvb3Rlci1ib3R0b20+XHJcbiAgICAgIDxmcy1zbG90LXJlbmRlciB2LWlmPVwibWVyZ2VkU2xvdHMuZm9vdGVyQm90dG9tXCIgOnNsb3RzPVwibWVyZ2VkU2xvdHMuZm9vdGVyQm90dG9tXCIgLz5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgPC9jb21wb25lbnQ+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCBvbk1vdW50ZWQsIFByb3BUeXBlLCBwcm92aWRlLCByZWYsIFNldHVwQ29udGV4dCwgdG9SZWYgfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IHVpQ29udGV4dCB9IGZyb20gXCIuLi91aVwiO1xyXG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi91c2UvdXNlLW1lcmdlXCI7XHJcbmltcG9ydCB1dGlsTG9nIGZyb20gXCIuLi91dGlscy91dGlsLmxvZ1wiO1xyXG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuLi91dGlscy91dGlsLmxvZ1wiO1xyXG5pbXBvcnQgeyBSb3dTZWxlY3Rpb25Qcm9wcywgU2V0U2VhcmNoRm9ybURhdGFQcm9wcyB9IGZyb20gXCIuLi9kXCI7XHJcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uL3VzZVwiO1xyXG5pbXBvcnQgeyB1dGlscyB9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5pbXBvcnQgeyBmaWx0ZXJDcnVkU2xvdHMsIG1lcmdlQ3J1ZFNsb3RzLCB0eXBlIENydWRTbG90cyB9IGZyb20gXCIuL2ZzLWNydWQtc2xvdHNcIjtcclxuXHJcbi8vIHV0aWxzLnRyYWNlKFwiZnMtdGFibGVcIik7XHJcbmNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XHJcblxyXG5mdW5jdGlvbiB1c2VQcm92aWRlcnMocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcclxuICBwcm92aWRlKFwiZ2V0OmNvbHVtbnNcIiwgKCkgPT4ge1xyXG4gICAgcmV0dXJuIHByb3BzLnRhYmxlLmNvbHVtbnM7XHJcbiAgfSk7XHJcbiAgcHJvdmlkZShcInVwZGF0ZTpjb2x1bW5zXCIsIChjb2x1bW5zOiBhbnkpID0+IHtcclxuICAgIGN0eC5lbWl0KFwidXBkYXRlOmNvbHVtbnNcIiwgY29sdW1ucyk7XHJcbiAgfSk7XHJcblxyXG4gIHByb3ZpZGUoXCJnZXQ6Y3J1ZEJpbmRpbmdcIiwgKCkgPT4ge1xyXG4gICAgcmV0dXJuIHByb3BzO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1c2VTZWFyY2gocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcclxuICBjb25zdCBzZWFyY2hSZWYgPSByZWYoKTtcclxuICBjb25zdCBnZXRTZWFyY2hSZWYgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gc2VhcmNoUmVmLnZhbHVlO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGdldFNlYXJjaEZvcm1EYXRhID0gKCkgPT4ge1xyXG4gICAgaWYgKHNlYXJjaFJlZi52YWx1ZSkge1xyXG4gICAgICByZXR1cm4gc2VhcmNoUmVmLnZhbHVlLmdldEZvcm0oKTtcclxuICAgIH1cclxuICAgIGxvZ2dlci53YXJuKFwi6K+35L2/55SoZXhwb3NlLmdldFNlYXJjaEZvcm1EYXRh5Luj5pu/XCIpO1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGdldFNlYXJjaFZhbGlkYXRlZEZvcm1EYXRhID0gKCkgPT4ge1xyXG4gICAgaWYgKHNlYXJjaFJlZi52YWx1ZSkge1xyXG4gICAgICByZXR1cm4gc2VhcmNoUmVmLnZhbHVlLmdldFZhbGlkYXRlZEZvcm0oKTtcclxuICAgIH1cclxuICAgIGxvZ2dlci53YXJuKFwi6K+35L2/55SoZXhwb3NlLmdldFNlYXJjaFZhbGlkYXRlZEZvcm1EYXRh5Luj5pu/XCIpO1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIOiuvue9rmZvcm3lgLxcclxuICAgKiBAcGFyYW0gZm9ybSBmb3Jt5a+56LGhXHJcbiAgICogQHBhcmFtIG9wdHMgPSB7XHJcbiAgICogICAgaXNNZXJnZTpmYWxzZSDmmK/lkKbkuI7ljp/mnIlmb3Jt5YC85ZCI5bm2LFxyXG4gICAqIH1cclxuICAgKi9cclxuICBmdW5jdGlvbiBzZXRTZWFyY2hGb3JtRGF0YSh7IGZvcm0sIG1lcmdlRm9ybSA9IGZhbHNlIH06IFNldFNlYXJjaEZvcm1EYXRhUHJvcHMpIHtcclxuICAgIGlmIChzZWFyY2hSZWYudmFsdWUpIHtcclxuICAgICAgc2VhcmNoUmVmLnZhbHVlLnNldEZvcm0oZm9ybSwgbWVyZ2VGb3JtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzZWFyY2hSZWYsXHJcbiAgICBnZXRTZWFyY2hSZWYsXHJcbiAgICBnZXRTZWFyY2hGb3JtRGF0YSxcclxuICAgIHNldFNlYXJjaEZvcm1EYXRhLFxyXG4gICAgZ2V0U2VhcmNoVmFsaWRhdGVkRm9ybURhdGFcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiB1c2VUYWJzKHNlYXJjaFJldDogYW55LCBwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCkge1xyXG4gIGNvbnN0IHRhYnNCaW5kaW5nID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYgKHByb3BzLnRhYnMgJiYgcHJvcHMudGFicy5zaG93ICYmIHByb3BzLnRhYnMubmFtZSkge1xyXG4gICAgICBsZXQgZGljdCA9IG51bGw7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRUYWJzID0geyAuLi5wcm9wcy50YWJzIH07XHJcbiAgICAgIGlmIChwcm9wcy5zZWFyY2g/LmNvbHVtbnMgJiYgcHJvcHMuc2VhcmNoPy5jb2x1bW5zW3Byb3BzLnRhYnMubmFtZV0/LmNvbXBvbmVudD8uZGljdCkge1xyXG4gICAgICAgIGRpY3QgPSBwcm9wcy5zZWFyY2g/LmNvbHVtbnNbcHJvcHMudGFicy5uYW1lXT8uY29tcG9uZW50Py5kaWN0O1xyXG4gICAgICAgIGlmIChkZWZhdWx0VGFicy52YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICBkZWZhdWx0VGFicy52YWx1ZSA9IGRpY3QudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkZWZhdWx0VGFicy5sYWJlbCA9PSBudWxsKSB7XHJcbiAgICAgICAgICBkZWZhdWx0VGFicy5sYWJlbCA9IGRpY3QubGFiZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkZWZhdWx0VGFicy5vcHRpb25zID09IG51bGwpIHtcclxuICAgICAgICAgIGRlZmF1bHRUYWJzLm9wdGlvbnMgPSBkaWN0LmRhdGEgfHwgW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLmRlZmF1bHRUYWJzLFxyXG4gICAgICAgIG1vZGVsVmFsdWU6IHByb3BzLnNlYXJjaC52YWxpZGF0ZWRGb3JtICYmIHByb3BzLnNlYXJjaC52YWxpZGF0ZWRGb3JtW3Byb3BzLnRhYnMubmFtZV0sXHJcbiAgICAgICAgXCJvblVwZGF0ZTptb2RlbFZhbHVlXCI6ICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjdHguZW1pdChcInRhYi1jaGFuZ2VcIiwgeyBbcHJvcHMudGFicy5uYW1lXTogdmFsdWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2hvdzogZmFsc2VcclxuICAgIH07XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHtcclxuICAgIHRhYnNCaW5kaW5nXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXNlRml4ZWRIZWlnaHQocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQsIHsgdGFibGVSZWYsIGNvbnRhaW5lclJlZiB9OiBhbnkpIHtcclxuICBjb25zdCB1aSA9IHVpQ29udGV4dC5nZXQoKTtcclxuICBsZXQgdGFibGVDSSA9IHVpLnRhYmxlO1xyXG4gIGlmIChwcm9wcy50YWJsZT8udGFibGVWZXJzaW9uID09PSBcInYyXCIpIHtcclxuICAgIHRhYmxlQ0kgPSB1aS50YWJsZVYyO1xyXG4gIH1cclxuICBpZiAodGFibGVDSS5oYXNNYXhIZWlnaHQocHJvcHMudGFibGUpKSB7XHJcbiAgICByZXR1cm4ge307XHJcbiAgfVxyXG4gIGlmICghdGFibGVDSS5maXhlZEhlYWRlck5lZWRDb21wdXRlQm9keUhlaWdodCkge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuICBjb25zdCBtYXhIZWlnaHRSZWYgPSByZWYobnVsbCk7XHJcblxyXG4gIGZ1bmN0aW9uIGNvbXB1dGVCb2R5SGVpZ2h0KCkge1xyXG4gICAgY29uc3QgdGFibGVEb20gPSB0YWJsZVJlZj8udmFsdWU/LiRlbDtcclxuICAgIGlmICh0YWJsZURvbSA9PSBudWxsIHx8IHRhYmxlRG9tLnF1ZXJ5U2VsZWN0b3IgPT0gbnVsbCB8fCAhKHRhYmxlRG9tLnF1ZXJ5U2VsZWN0b3IgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaGVhZERvbSA9IHRhYmxlRG9tLnF1ZXJ5U2VsZWN0b3IodGFibGVDSS5oZWFkZXJEb21TZWxlY3Rvcik7XHJcbiAgICBpZiAoaGVhZERvbSA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHRhYmxlSGVpZ2h0ID0gdGFibGVEb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xyXG4gICAgY29uc3QgaGVhZEhlaWdodCA9IGhlYWREb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xyXG4gICAgbWF4SGVpZ2h0UmVmLnZhbHVlID0gdGFibGVIZWlnaHQgLSBoZWFkSGVpZ2h0IC0gMiArIChwcm9wcy50YWJsZS5tYXhIZWlnaHRBZGp1c3QgfHwgMCk7XHJcblxyXG4gICAgdXRpbExvZy5kZWJ1ZyhcInRhYmxlIG1heCBoZWlnaHQgcmVjb21wdXRlZCBcIiwgbWF4SGVpZ2h0UmVmLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHdhdGNoQm9keUhlaWdodENoYW5nZSgpIHtcclxuICAgIGNvbnN0IHRhYmxlRG9tID0gdGFibGVSZWY/LnZhbHVlPy4kZWw7XHJcbiAgICBpZiAodGFibGVEb20gPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB0YWJsZVdyYXBwZXJEb20gPSB0YWJsZURvbS5wYXJlbnROb2RlO1xyXG5cclxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzKSB7XHJcbiAgICAgIHV0aWxMb2cuZGVidWcoXCJ0YWJsZSByZXNpemVkXCIsIGVudHJpZXMpO1xyXG4gICAgICAvLyDmr4/mrKHooqvop4LmtYvnmoTlhYPntKDlsLrlr7jlj5HnlJ/mlLnlj5jov5nph4zpg73kvJrmiafooYxcclxuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCAmJiBlbnRyaWVzWzBdLmNvbnRlbnRSZWN0LmhlaWdodCA+IDApIHtcclxuICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgY29tcHV0ZUJvZHlIZWlnaHQoKTtcclxuICAgICAgICB9LCAyMDApO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgY29tcHV0ZUJvZHlIZWlnaHQoKTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIG9ic2VydmVyLm9ic2VydmUodGFibGVXcmFwcGVyRG9tKTsgLy8g6KeC5rWLRE9N5YWD57SgXHJcbiAgfVxyXG5cclxuICBvbk1vdW50ZWQoYXN5bmMgKCkgPT4ge1xyXG4gICAgYXdhaXQgbmV4dFRpY2soKTtcclxuICAgIGF3YWl0IG5leHRUaWNrKCk7XHJcbiAgICB3YXRjaEJvZHlIZWlnaHRDaGFuZ2UoKTtcclxuICB9KTtcclxuICByZXR1cm4geyBtYXhIZWlnaHRSZWYsIGNvbXB1dGVCb2R5SGVpZ2h0IH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVzZVRhYmxlKHByb3BzOiBhbnksIGN0eDogU2V0dXBDb250ZXh0KSB7XHJcbiAgY29uc3QgdWkgPSB1aUNvbnRleHQuZ2V0KCk7XHJcbiAgY29uc3QgdGFibGVSZWYgPSByZWYoKTtcclxuICBjb25zdCB0b29sYmFyUmVmID0gcmVmKCk7XHJcbiAgY29uc3QgY29udGFpbmVyUmVmID0gcmVmKCk7XHJcbiAgY29uc3QgeyBtYXhIZWlnaHRSZWYsIGNvbXB1dGVCb2R5SGVpZ2h0IH0gPSB1c2VGaXhlZEhlaWdodChwcm9wcywgY3R4LCB7IHRhYmxlUmVmLCBjb250YWluZXJSZWYgfSk7XHJcbiAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcclxuICBjb25zdCB0YWJsZVByb3BSZWYgPSB0b1JlZihwcm9wcywgXCJ0YWJsZVwiKTtcclxuICBjb25zdCBjb21wdXRlZFRhYmxlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgLy8gYW50ZHYgbmFpdmUg6auY5bqm6Ieq6YCC5bqU77yMIOWmguaenOeUqOaIt+aciemFjee9rnNjcm9sbO+8jOWImeS8mOWFiOS9v+eUqOeUqOaIt+mFjee9rueahFxyXG4gICAgbGV0IGZpeGVkSGVpZ2h0ID0ge307XHJcbiAgICBpZiAobWF4SGVpZ2h0UmVmPy52YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIGxldCB0YWJsZUNJID0gdWkudGFibGU7XHJcbiAgICAgIGlmIChwcm9wcy50YWJsZT8udGFibGVWZXJzaW9uID09PSBcInYyXCIpIHtcclxuICAgICAgICB0YWJsZUNJID0gdWkudGFibGVWMjtcclxuICAgICAgfVxyXG4gICAgICBmaXhlZEhlaWdodCA9IHRhYmxlQ0kuYnVpbGRNYXhIZWlnaHQobWF4SGVpZ2h0UmVmLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBBdHRycyA9IHV0aWxzLmRhc2gub21pdCh0YWJsZVByb3BSZWYsIFwibG9hZGluZ1wiLCBcImNvbHVtbnNcIiwgXCJjb2x1bW5zTWFwXCIpO1xyXG5cclxuICAgIHJldHVybiBtZXJnZShmaXhlZEhlaWdodCwgeyAuLi5jdHguYXR0cnMsIC4uLnBBdHRycyB9KTtcclxuICB9KTtcclxuXHJcbiAgY29uc3QgY29tcHV0ZWRUb29sYmFyID0gdG9SZWYocHJvcHMsIFwidG9vbGJhclwiKTtcclxuICBjb25zdCBtZXJnZWRTbG90cyA9IGNvbXB1dGVkKCgpID0+IG1lcmdlQ3J1ZFNsb3RzKHByb3BzLnNsb3RzLCBjdHguc2xvdHMpKTtcclxuXHJcbiAgY29uc3QgY29tcHV0ZWRDZWxsU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICByZXR1cm4gZmlsdGVyQ3J1ZFNsb3RzKG1lcmdlZFNsb3RzLnZhbHVlLCBcImNlbGxcIik7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IGNvbXB1dGVkRm9ybVNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgcmV0dXJuIGZpbHRlckNydWRTbG90cyhtZXJnZWRTbG90cy52YWx1ZSwgXCJmb3JtXCIpO1xyXG4gIH0pO1xyXG4gIGNvbnN0IGNvbXB1dGVkU2VhcmNoU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICByZXR1cm4gZmlsdGVyQ3J1ZFNsb3RzKG1lcmdlZFNsb3RzLnZhbHVlLCBcInNlYXJjaFwiKTtcclxuICB9KTtcclxuICBjb25zdCBjb21wdXRlZFRvb2xiYXJTbG90cyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIHJldHVybiBmaWx0ZXJDcnVkU2xvdHMobWVyZ2VkU2xvdHMudmFsdWUsIFwidG9vbGJhclwiKTtcclxuICB9KTtcclxuXHJcbiAgY29uc3QgZm9ybVdyYXBwZXJSZWYgPSByZWYoKTtcclxuXHJcbiAgY29uc3QgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IGNsYXp6OiBhbnkgPSB7IGNvbXBhY3Q6IHByb3BzLnRvb2xiYXIuY29tcGFjdCAhPT0gZmFsc2UgfTtcclxuICAgIGlmIChwcm9wcy5jdXN0b21DbGFzcykge1xyXG4gICAgICBjbGF6eltwcm9wcy5jdXN0b21DbGFzc10gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsYXp6O1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBpbm5lcldyYXBwZXJSZWYgPSByZWYoKTtcclxuXHJcbiAgY29uc3QgaXNGb3JtSW5uZXIgPSByZWYoZmFsc2UpO1xyXG4gIGNvbnN0IG9uRm9ybUlubmVyQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHtcclxuICAgIGlzRm9ybUlubmVyLnZhbHVlID0gdmFsdWU7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHRhYmxlUmVmLFxyXG4gICAgY29udGFpbmVyUmVmLFxyXG4gICAgdG9vbGJhclJlZixcclxuICAgIGNvbXB1dGVkVGFibGUsXHJcbiAgICBjb21wdXRlZFRvb2xiYXIsXHJcbiAgICBtZXJnZWRTbG90cyxcclxuICAgIGNvbXB1dGVkQ2VsbFNsb3RzLFxyXG4gICAgZm9ybVdyYXBwZXJSZWYsXHJcbiAgICBpc0Zvcm1Jbm5lcixcclxuICAgIG9uRm9ybUlubmVyQ2hhbmdlLFxyXG4gICAgY29tcHV0ZWRGb3JtU2xvdHMsXHJcbiAgICBjb21wdXRlZFNlYXJjaFNsb3RzLFxyXG4gICAgY29tcHV0ZWRUb29sYmFyU2xvdHMsXHJcbiAgICBjb21wdXRlQm9keUhlaWdodCxcclxuICAgIGNvbXB1dGVkQ2xhc3MsXHJcbiAgICBpbm5lcldyYXBwZXJSZWZcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogZnMtY3J1ZFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzQ3J1ZFwiLFxyXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog6KGo5qC8aWRcclxuICAgICAqL1xyXG4gICAgaWQ6IHtcclxuICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICBkZWZhdWx0OiBcIlwiXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDooajmoLzphY3nva7vvIzop4FGc1RhYmxlXHJcbiAgICAgKi9cclxuICAgIHRhYmxlOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOihqOagvOaVsOaNrlxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL3JlcXVpcmUtZGVmYXVsdC1wcm9wXHJcbiAgICBkYXRhOiB7XHJcbiAgICAgIHR5cGU6IEFycmF5XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmk43kvZzliJfphY3nva7vvIzop4FGc1Jvd0hhbmRsZVxyXG4gICAgICovXHJcbiAgICByb3dIYW5kbGU6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5p+l6K+i5qGG6YWN572u77yM6KeBRnNTZWFyY2hcclxuICAgICAqL1xyXG4gICAgc2VhcmNoOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOW3peWFt+adoemFjee9ru+8jOingUZzVG9vbGJhclxyXG4gICAgICovXHJcbiAgICB0b29sYmFyOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOWKqOS9nOadoemFjee9ru+8jOingUZzQWN0aW9uYmFyXHJcbiAgICAgKi9cclxuICAgIGFjdGlvbmJhcjoge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiB0YWJzIGZpbHRlclxyXG4gICAgICovXHJcbiAgICB0YWJzOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoOihqOWNleWvueivneahhumFjee9ru+8jOingUZzRm9ybVdyYXBwZXJcclxuICAgICAqL1xyXG4gICAgYWRkRm9ybToge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDnvJbovpHooajljZXlr7nor53moYbphY3nva7vvIzop4FGc0Zvcm1XcmFwcGVyXHJcbiAgICAgKi9cclxuICAgIGVkaXRGb3JtOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOafpeeci+ihqOWNleWvueivneahhumFjee9ru+8jOingUZzRm9ybVdyYXBwZXJcclxuICAgICAqL1xyXG4gICAgdmlld0Zvcm06IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog57+76aG16YWN572uLOaUr+aMgWVsLXBhZ2luYXRpb258YS1wYWdpbmF0aW9u6YWN572uXHJcbiAgICAgKi9cclxuICAgIHBhZ2luYXRpb246IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiB7IHNob3c6IGZhbHNlIH07XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOWuueWZqOmFjee9ru+8jOingUZzQ29udGFpbmVyXHJcbiAgICAgKi9cclxuICAgIGNvbnRhaW5lcjoge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDphY3nva7lvI/mj5Lmp73vvIzmqKHmnb/mj5Lmp73lkIzlkI3ml7bkvJjlhYhcclxuICAgICAqL1xyXG4gICAgc2xvdHM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPENydWRTbG90cz4sXHJcbiAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY3J1ZOWMheijueWuueWZqOeahGNsYXNzXHJcbiAgICAgKi9cclxuICAgIGN1c3RvbUNsYXNzOiB7fSxcclxuICAgIC8qKlxyXG4gICAgICog5LiN6KaB5Lyg5YiwZnMtdGFibGXljrtcclxuICAgICAqL1xyXG4gICAgZm9ybToge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Y+v6YCJ5oupXHJcbiAgICAgKi9cclxuICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8Um93U2VsZWN0aW9uUHJvcHM+LFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiB7IHNob3c6IGZhbHNlIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG4gIGVtaXRzOiBbXCJ1cGRhdGU6c2VhcmNoXCIsIFwidXBkYXRlOmNvbXBhY3RcIiwgXCJ1cGRhdGU6Y29sdW1uc1wiLCBcImZvcm0tdmFsdWUtY2hhbmdlXCIsIFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgXCJ0YWItY2hhbmdlXCJdLFxyXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eDogYW55KSB7XHJcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG4gICAgdXNlUHJvdmlkZXJzKHByb3BzLCBjdHgpO1xyXG4gICAgY29uc3Qgc2VhcmNoID0gdXNlU2VhcmNoKHByb3BzLCBjdHgpO1xyXG4gICAgY29uc3QgdGFicyA9IHVzZVRhYnMoc2VhcmNoLCBwcm9wcywgY3R4KTtcclxuICAgIGNvbnN0IHRhYmxlID0gdXNlVGFibGUocHJvcHMsIGN0eCk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1aSxcclxuICAgICAgLi4uc2VhcmNoLFxyXG4gICAgICAuLi50YWJsZSxcclxuICAgICAgLi4udGFic1xyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi8v5L2c5Li65pWw5o2u6KGo5qC85L2/55So55qE6aKE6K6+5qC35byP77yM6ZqQ6JePZm9vdGVy77yM6KGo5qC86auY5bqm56KO6K6w5b2V5pWw5aKe5Yqg6ICM5aKe5YqgXHJcbi5mcy1jcnVkLWFzLXRhYmxlIHtcclxuICBtaW4taGVpZ2h0OiAwICFpbXBvcnRhbnQ7XHJcbiAgaGVpZ2h0OiB1bnNldDtcclxuXHJcbiAgLmZzLWNydWQtZm9vdGVyIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG5cclxuICAuYm94IC5pbm5lciB7XHJcbiAgICBwb3NpdGlvbjogc3RhdGljO1xyXG4gIH1cclxufVxyXG5cclxuLmZzLWNydWQtY29udGFpbmVyIHtcclxuICBtaW4taGVpZ2h0OiAzMDBweDtcclxuXHJcbiAgJi5jb21wYWN0IHtcclxuICAgIC5lbC10YWJsZS0tYm9yZGVyIHtcclxuICAgICAgYm9yZGVyLWxlZnQ6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLmZzLWNydWQtaGVhZGVyIHtcclxuICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xyXG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5mcy1jcnVkLWZvb3RlciB7XHJcbiAgICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuICAgICAgcGFkZGluZy1yaWdodDogMTBweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC5mcy1jcnVkLWhlYWRlciB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgcGFkZGluZzogMTBweCAwO1xyXG4gICAgZmxleC13cmFwOiB3cmFwO1xyXG5cclxuICAgIC5mcy1oZWFkZXItdG9wIHtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLmZzLWNydWQtc2VhcmNoIHtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIGdyaWQtY29sdW1uOiBzcGFuIDI7XHJcbiAgICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XHJcbiAgICB9XHJcblxyXG4gICAgLmZzLWhlYWRlci1taWRkbGUge1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgIH1cclxuXHJcbiAgICAuZnMtaGVhZGVyLWJvdHRvbSB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC5mcy1jcnVkLWFjdGlvbmJhciB7XHJcbiAgICAgIC8vIHBhZGRpbmctdG9wOiA1cHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXg6IDEwMDAwO1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBtaW4td2lkdGg6IDFweDtcclxuICAgIH1cclxuXHJcbiAgICAuZnMtY3J1ZC10b29sYmFyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLmZzLWNydWQtdGFibGUge1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgfVxyXG5cclxuICAuZnMtY3J1ZC1mb290ZXIge1xyXG4gICAgcGFkZGluZzogMTBweCAwO1xyXG5cclxuICAgIC5mcy1jcnVkLXBhZ2luYXRpb24ge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuXHJcbiAgICAgIC5mcy1wYWdpbmF0aW9uLWxlZnQge1xyXG4gICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcclxuXHJcbiAgICAgICAgLyog5bem5L6n5rKh5pyJ5o+S5qe95YaF5a655pe25LiN55WZ56m66ZqZ77yM5L+d6K+B5YiG6aG15Zmo5Lil5qC85bGF5LitICovXHJcbiAgICAgICAgJjplbXB0eSB7XHJcbiAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAuZnMtcGFnaW5hdGlvbi1yaWdodCB7XHJcbiAgICAgICAgZmxleDogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmZzLXBhZ2luYXRpb24ge1xyXG4gICAgICAgIC8qIOWIhumhteWZqOWxheS4re+8muS4jeWGjeaSkea7oeaVtOihjO+8jOWuveW6puiHqumAguW6lOW5tuaKiuWIhumhtee7hOS7tuawtOW5s+WxheS4rSAqL1xyXG4gICAgICAgIGZsZXg6IDAgMSBhdXRvO1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcblxyXG4gICAgICAgIC5hbnQtcGFnaW5hdGlvbi1vcHRpb25zIHtcclxuICAgICAgICAgIC5hbnQtc2VsZWN0IHtcclxuICAgICAgICAgICAgd2lkdGg6IGF1dG87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuZWwtcGFnaW5hdGlvbiB7XHJcbiAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7XHJcbiAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwO1xyXG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAuZnMtcGFnaW5hdGlvbi1yaWdodCB7XHJcbiAgICAgICAgZmxleDogMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XHJcbiAgLmZzLWNydWQtY29udGFpbmVyIHtcclxuICAgIC5ib2R5IHtcclxuICAgICAgb3ZlcmZsb3cteTogdW5zZXQgIWltcG9ydGFudDtcclxuICAgIH1cclxuICAgIC5hbnQtdGFibGUtYm9keSB7XHJcbiAgICAgIG1heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgb3ZlcmZsb3c6IGF1dG8gIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAubi1kYXRhLXRhYmxlLWJhc2UtdGFibGUtYm9keSB7XHJcbiAgICAgIG1heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgb3ZlcmZsb3c6IGF1dG8gIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAuZnMtY3J1ZC1oZWFkZXIgLmZzLWNydWQtYWN0aW9uYmFyIHtcclxuICAgICAgZmxleDogdW5zZXQgIWltcG9ydGFudDtcclxuICAgICAgZmxleC13cmFwOiB3cmFwO1xyXG4gICAgICBtYXJnaW4tYm90dG9tOiAycHg7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZnMtcm93LWhhbmRsZVwiPlxyXG4gICAgPHNsb3QgbmFtZT1cImNlbGwtcm93SGFuZGxlLWxlZnRcIiB2LWJpbmQ9XCJzY29wZVJlZlwiPjwvc2xvdD5cclxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gY29tcHV0ZWRIYW5kbGVCdG5zXCIgOmtleT1cImluZGV4XCI+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXRlbS5zaG93ICE9PSBmYWxzZSAmJiAhaXNEcm9wZG93bkJ0bihpdGVtLCBpbmRleClcIj5cclxuICAgICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJpdGVtLnJlbmRlclwiIDpyZW5kZXItZnVuYz1cIml0ZW0ucmVuZGVyXCIgOnNjb3BlPVwic2NvcGVSZWZcIiAvPlxyXG4gICAgICAgIDxmcy1idXR0b24gdi1lbHNlIGNsYXNzPVwicm93LWhhbmRsZS1idG5cIiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrLnN0b3A9XCJkb0NsaWNrKGl0ZW0sICRldmVudClcIiAvPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDxzbG90IG5hbWU9XCJjZWxsLXJvd0hhbmRsZS1taWRkbGVcIiB2LWJpbmQ9XCJzY29wZVwiPjwvc2xvdD5cclxuICAgIDwhLS0g5LiL5ouJ5oyJ6ZKu6I+c5Y2VIC0tPlxyXG4gICAgPHNwYW4gdi1pZj1cImhhc0Ryb3Bkb3duQnRuXCIgY2xhc3M9XCJyb3ctaGFuZGxlLWJ0biBmcy1oYW5kbGUtcm93LWRyb3Bkb3duXCI+XHJcbiAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZHJvcGRvd24ubmFtZVwiIHYtYmluZD1cImNvbXB1dGVkRHJvcGRvd25CaW5kaW5nXCI+XHJcbiAgICAgICAgPGZzLWJ1dHRvbiB2LWJpbmQ9XCJkcm9wZG93bi5tb3JlXCIgLz5cclxuICAgICAgICA8dGVtcGxhdGUgI1t1aS5kcm9wZG93bi5zbG90TmFtZV0+XHJcbiAgICAgICAgICA8Y29tcG9uZW50XHJcbiAgICAgICAgICAgIDppcz1cInVpLmRyb3Bkb3duTWVudS5uYW1lXCJcclxuICAgICAgICAgICAgdi1pZj1cInVpLmRyb3Bkb3duLnJlbmRlck1vZGUgPT09ICdzbG90J1wiXHJcbiAgICAgICAgICAgIHYtYmluZD1cInVpLmRyb3Bkb3duTWVudS5jb21tYW5kKGRvRHJvcGRvd25JdGVtQ2xpY2spXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjb21wdXRlZEhhbmRsZUJ0bnNcIiA6a2V5PVwiaW5kZXhcIj5cclxuICAgICAgICAgICAgICA8Y29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICA6aXM9XCJ1aS5kcm9wZG93bkl0ZW0ubmFtZVwiXHJcbiAgICAgICAgICAgICAgICB2LWlmPVwiaXRlbS5zaG93ICE9PSBmYWxzZSAmJiBpc0Ryb3Bkb3duQnRuKGl0ZW0sIGluZGV4KVwiXHJcbiAgICAgICAgICAgICAgICA6W3VpLmRyb3Bkb3duSXRlbS5jb21tYW5kXT1cIml0ZW0ua2V5XCJcclxuICAgICAgICAgICAgICAgIHYtYmluZD1cIml0ZW0uZHJvcGRvd25JdGVtXCJcclxuICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxmcy1yZW5kZXIgdi1pZj1cIml0ZW0ucmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiaXRlbS5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZVJlZlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHYtZWxzZSBjbGFzcz1cImZzLXJvdy1oYW5kbGUtZHJvcGRvd24taXRlbVwiIHYtYmluZD1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgPGZzLWljb24gdi1pZj1cIml0ZW0uaWNvblwiIDppY29uPVwiaXRlbS5pY29uXCIgLz4ge3sgaXRlbS50ZXh0IHx8IGl0ZW0udGl0bGUgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8c2xvdCBuYW1lPVwiY2VsbC1yb3dIYW5kbGUtcmlnaHRcIiB2LWJpbmQ9XCJzY29wZVwiPjwvc2xvdD5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgZm9yRWFjaCwgc29ydEJ5LCBvbWl0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xyXG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLXVpXCI7XHJcbmltcG9ydCB7IHVzZUNvbXB1dGUgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1jb21wdXRlXCI7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBCdXR0b25Qcm9wcywgU2NvcGVDb250ZXh0IH0gZnJvbSBcIi4uLy4uL2RcIjtcclxuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcblxyXG4vKipcclxuICog5pON5L2c5YiX6YWN572uXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNSb3dIYW5kbGVcIixcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDmjInpkq7mipjlj6DphY3nva5cclxuICAgICAqL1xyXG4gICAgZHJvcGRvd246IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmjInpkq7phY3nva5cclxuICAgICAqIHtcclxuICAgICAqICAgdmlldzp7Li4uRnNCdXR0b24sY2xpY2s6RnVuY3Rpb24sb3JkZXI6MX0sXHJcbiAgICAgKiAgIGVkaXQ6ey4uLkZzQnV0dG9uLGNsaWNrOkZ1bmN0aW9uLG9yZGVyOjJ9LFxyXG4gICAgICogICByZW1vdmU6ey4uLkZzQnV0dG9uLGNsaWNrOkZ1bmN0aW9uLG9yZGVyOjN9LFxyXG4gICAgICogICAuLi7oh6rlrprkuYlcclxuICAgICAqIH1cclxuICAgICAqL1xyXG4gICAgYnV0dG9uczoge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaMiemSruWIhue7hCzkuIrpnaLnmoRidXR0b25z5Li66buY6K6k5YiG57uEXHJcbiAgICAgKiAge1xyXG4gICAgICogICAgZ3JvdXBLZXk6e2J1dHRvbktleTp7fSxidXR0b25LZXkyOnt9fVxyXG4gICAgICogIH1cclxuICAgICAqL1xyXG4gICAgZ3JvdXA6IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPliY3mv4DmtLvliIbnu4RcclxuICAgICAqL1xyXG4gICAgYWN0aXZlOiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCJcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIHNjb3BlXHJcbiAgICAgKi9cclxuICAgIHNjb3BlOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgZW1pdHM6IFtcImhhbmRsZVwiXSxcclxuICBzZXR1cChwcm9wczogYW55LCBjdHgpIHtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xyXG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XHJcblxyXG4gICAgY29uc3Qgc2NvcGVSZWYgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4ucHJvcHMuc2NvcGUsXHJcbiAgICAgICAgcm93OiBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5yb3ddLFxyXG4gICAgICAgIGluZGV4OiBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5pbmRleF1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZG9DbGljayA9IChpdGVtOiBhbnksICRldmVudD86IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLmluZGV4XTtcclxuICAgICAgY29uc3Qgcm93ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4ucm93XTtcclxuICAgICAgY29uc3QgZTogU2NvcGVDb250ZXh0ID0geyBrZXk6IGl0ZW0ua2V5LCByb3csIGJ0bjogaXRlbSwgaW5kZXgsIC4uLnByb3BzLnNjb3BlLCBsb2FkaW5nUmVmOiAkZXZlbnQ/LmxvYWRpbmdSZWYgfTtcclxuICAgICAgaWYgKGl0ZW0uY2xpY2spIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5jbGljayhlKTtcclxuICAgICAgfVxyXG4gICAgICBjdHguZW1pdChcImhhbmRsZVwiLCBlKTtcclxuICAgIH07XHJcbiAgICBjb25zdCB7IGRvQ29tcHV0ZWQgfSA9IHVzZUNvbXB1dGUoKTtcclxuICAgIGNvbnN0IHBpY2tlZFByb3BzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRyb3Bkb3duOiBwcm9wcy5kcm9wZG93bixcclxuICAgICAgICBidXR0b25zOiBwcm9wcy5idXR0b25zLFxyXG4gICAgICAgIGFjdGl2ZTogcHJvcHMuYWN0aXZlLFxyXG4gICAgICAgIGdyb3VwOiBwcm9wcy5ncm91cFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBjb21wdXRlUHJvcHMgPSBkb0NvbXB1dGVkKFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHBpY2tlZFByb3BzLnZhbHVlO1xyXG4gICAgICB9LFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5pbmRleF07XHJcbiAgICAgICAgY29uc3Qgcm93ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4ucm93XTtcclxuICAgICAgICByZXR1cm4geyAuLi5wcm9wcy5zY29wZSwgaW5kZXgsIHJvdyB9O1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIC8vY29uc3QgY29tcHV0ZVByb3BzID0geyB2YWx1ZTogcHJvcHMgfTtcclxuICAgIGNvbnN0IGNvbXB1dGVkSGFuZGxlQnRucyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgbGV0IG1lcmdlZEJ0bnMgPSBudWxsO1xyXG4gICAgICBpZiAoY29tcHV0ZVByb3BzLnZhbHVlLmFjdGl2ZSA9PSBudWxsIHx8IGNvbXB1dGVQcm9wcy52YWx1ZS5hY3RpdmUgPT09IFwiZGVmYXVsdFwiKSB7XHJcbiAgICAgICAgY29uc3QgZGVmQnRucyA9IHtcclxuICAgICAgICAgIHZpZXc6IHtcclxuICAgICAgICAgICAga2V5OiBcInZpZXdcIixcclxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS52aWV3LnRleHRcIiksXHJcbiAgICAgICAgICAgIHRpdGxlOiB0KFwiZnMucm93SGFuZGxlLnZpZXcudGV4dFwiKSxcclxuICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY29weToge1xyXG4gICAgICAgICAgICBrZXk6IFwiY29weVwiLFxyXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMucm93SGFuZGxlLmNvcHkudGV4dFwiKSxcclxuICAgICAgICAgICAgdGl0bGU6IHQoXCJmcy5yb3dIYW5kbGUuY29weS50ZXh0XCIpLFxyXG4gICAgICAgICAgICBzaXplOiBcInNtYWxsXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlZGl0OiB7XHJcbiAgICAgICAgICAgIGtleTogXCJlZGl0XCIsXHJcbiAgICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxyXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMucm93SGFuZGxlLmVkaXQudGV4dFwiKSxcclxuICAgICAgICAgICAgdGl0bGU6IHQoXCJmcy5yb3dIYW5kbGUuZWRpdC50ZXh0XCIpLFxyXG4gICAgICAgICAgICBzaXplOiBcInNtYWxsXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICByZW1vdmU6IHtcclxuICAgICAgICAgICAga2V5OiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICAuLi51aS5idXR0b24uY29sb3JzKFwiZGFuZ2VyXCIpLFxyXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMucm93SGFuZGxlLnJlbW92ZS50ZXh0XCIpLFxyXG4gICAgICAgICAgICB0aXRsZTogdChcImZzLnJvd0hhbmRsZS5yZW1vdmUudGV4dFwiKSxcclxuICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBtZXJnZWRCdG5zID0gbWVyZ2UoZGVmQnRucywgY29tcHV0ZVByb3BzLnZhbHVlLmJ1dHRvbnMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1lcmdlZEJ0bnMgPSBjb21wdXRlUHJvcHMudmFsdWUuZ3JvdXBbY29tcHV0ZVByb3BzLnZhbHVlLmFjdGl2ZV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGJ0bnM6IEJ1dHRvblByb3BzW10gPSBbXTtcclxuICAgICAgZm9yRWFjaChtZXJnZWRCdG5zLCAoaXRlbSwga2V5KSA9PiB7XHJcbiAgICAgICAgaXRlbS5rZXkgPSBrZXk7XHJcbiAgICAgICAgaWYgKGl0ZW0uc2hvdyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnRucy5wdXNoKGl0ZW0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBzb3J0QnkoYnRucywgKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4gaXRlbS5vcmRlciA/PyBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkRHJvcGRvd25BdExlYXN0ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duID09IG51bGwgfHxcclxuICAgICAgICBjb21wdXRlUHJvcHMudmFsdWUuZHJvcGRvd24uYXRMZWFzdCA9PSBudWxsIHx8XHJcbiAgICAgICAgY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3QgPD0gMCB8fFxyXG4gICAgICAgIGNvbXB1dGVkSGFuZGxlQnRucy52YWx1ZS5sZW5ndGggPD0gY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3RcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93bi5hdExlYXN0IHx8IDA7XHJcbiAgICB9KTtcclxuICAgIGZ1bmN0aW9uIGlzRHJvcGRvd25CdG4oaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgIGlmIChpdGVtLmRyb3Bkb3duID09PSB0cnVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbXB1dGVkRHJvcGRvd25BdExlYXN0LnZhbHVlID4gMCAmJiBjb21wdXRlZERyb3Bkb3duQXRMZWFzdC52YWx1ZSA8IGluZGV4KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaGFzRHJvcGRvd25CdG4gPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWUpIHtcclxuICAgICAgICBjb25zdCBpcyA9IGlzRHJvcGRvd25CdG4oaXRlbSwgaW5kZXgpO1xyXG4gICAgICAgIGlmIChpcykge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4Kys7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZnVuY3Rpb24gZG9Ecm9wZG93bkl0ZW1DbGljaygkZXZlbnQ6IGFueSkge1xyXG4gICAgICBmb3IgKGxldCBidG4gb2YgY29tcHV0ZWRIYW5kbGVCdG5zLnZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCRldmVudCA9PT0gYnRuLmtleSkge1xyXG4gICAgICAgICAgZG9DbGljayhidG4pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkRHJvcGRvd25CaW5kaW5nID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBiaW5kaW5nOiBhbnkgPSB7fTtcclxuICAgICAgaWYgKHVpLmRyb3Bkb3duLnJlbmRlck1vZGUgIT09IFwic2xvdFwiKSB7XHJcbiAgICAgICAgLy8gbmFpdmUg6YCa6L+Hb3B0aW9uc+mFjee9ruadpeaYvuekuuWtkOmhuVxyXG4gICAgICAgIGNvbnN0IGJ0bnMgPSBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWU7XHJcbiAgICAgICAgY29uc3Qgb3B0czogQnV0dG9uUHJvcHNbXSA9IFtdO1xyXG4gICAgICAgIGZvckVhY2goYnRucywgKHZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHZhbHVlLnNob3cgIT09IGZhbHNlICYmIGlzRHJvcGRvd25CdG4odmFsdWUsIGluZGV4KSkge1xyXG4gICAgICAgICAgICBvcHRzLnB1c2goe1xyXG4gICAgICAgICAgICAgIFt1aS5kcm9wZG93bi52YWx1ZV06IHZhbHVlLmtleSxcclxuICAgICAgICAgICAgICBbdWkuZHJvcGRvd24ubGFiZWxdOiB2YWx1ZS50ZXh0LFxyXG4gICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZS50aXRsZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBiaW5kaW5nLm9wdGlvbnMgPSBvcHRzO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4ub21pdChwcm9wcy5kcm9wZG93biwgXCJtb3JlXCIsIFwiYXRMZWFzdFwiKSxcclxuICAgICAgICAuLi51aS5kcm9wZG93bi5jb21tYW5kKGRvRHJvcGRvd25JdGVtQ2xpY2spLFxyXG4gICAgICAgIC4uLmJpbmRpbmdcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpLFxyXG4gICAgICBoYXNEcm9wZG93bkJ0bixcclxuICAgICAgY29tcHV0ZWRIYW5kbGVCdG5zLFxyXG4gICAgICBkb0Ryb3Bkb3duSXRlbUNsaWNrLFxyXG4gICAgICBjb21wdXRlZERyb3Bkb3duQXRMZWFzdCxcclxuICAgICAgZG9DbGljayxcclxuICAgICAgaXNEcm9wZG93bkJ0bixcclxuICAgICAgc2NvcGVSZWYsXHJcbiAgICAgIGNvbXB1dGVkRHJvcGRvd25CaW5kaW5nXHJcbiAgICB9O1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi5mcy1yb3ctaGFuZGxlIHtcclxuICAvLyBkaXNwbGF5OiBmbGV4IDsgLy8g6L+Z6YeM5LiN6IO955SoZmxleO+8jOWQpuWImeS8muegtOWdj2FsaWduOmNlbnRlcumFjee9rlxyXG4gIGZsZXgtd3JhcDogd3JhcDtcclxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIC5lbC1idXR0b24gKyAuZWwtYnV0dG9uIHtcclxuICAgIG1hcmdpbi1sZWZ0OiAycHg7XHJcbiAgfVxyXG4gICYgPiAqIHtcclxuICAgIG1hcmdpbjogMnB4O1xyXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIH1cclxuICAuZnMtcm93LWhhbmRsZS1kcm9wZG93bi1pdGVtIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgfVxyXG5cclxuICAubi1idXR0b24ge1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIG1hcmdpbjogMnB4O1xyXG4gIH1cclxuXHJcbiAgLnJvdy1oYW5kbGUtYnRuIHtcclxuICAgIC5mcy1pY29uIHtcclxuICAgICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLXJvdy1oYW5kbGVcIj5cclxuICAgIDxzbG90IG5hbWU9XCJjZWxsLXJvd0hhbmRsZS1sZWZ0XCIgdi1iaW5kPVwic2NvcGVSZWZcIj48L3Nsb3Q+XHJcbiAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNvbXB1dGVkSGFuZGxlQnRuc1wiIDprZXk9XCJpbmRleFwiPlxyXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cIml0ZW0uc2hvdyAhPT0gZmFsc2UgJiYgIWlzRHJvcGRvd25CdG4oaXRlbSwgaW5kZXgpXCI+XHJcbiAgICAgICAgPGZzLXJlbmRlciB2LWlmPVwiaXRlbS5yZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJpdGVtLnJlbmRlclwiIDpzY29wZT1cInNjb3BlUmVmXCIgLz5cclxuICAgICAgICA8ZnMtYnV0dG9uIHYtZWxzZSBjbGFzcz1cInJvdy1oYW5kbGUtYnRuXCIgdi1iaW5kPVwiaXRlbVwiIEBjbGljay5zdG9wPVwiZG9DbGljayhpdGVtLCAkZXZlbnQpXCIgLz5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8c2xvdCBuYW1lPVwiY2VsbC1yb3dIYW5kbGUtbWlkZGxlXCIgdi1iaW5kPVwic2NvcGVcIj48L3Nsb3Q+XHJcbiAgICA8IS0tIOS4i+aLieaMiemSruiPnOWNlSAtLT5cclxuICAgIDxzcGFuIHYtaWY9XCJoYXNEcm9wZG93bkJ0blwiIGNsYXNzPVwicm93LWhhbmRsZS1idG4gZnMtaGFuZGxlLXJvdy1kcm9wZG93blwiPlxyXG4gICAgICA8Y29tcG9uZW50IDppcz1cInVpLmRyb3Bkb3duLm5hbWVcIiB2LWJpbmQ9XCJjb21wdXRlZERyb3Bkb3duQmluZGluZ1wiPlxyXG4gICAgICAgIDxmcy1idXR0b24gdi1iaW5kPVwiZHJvcGRvd24ubW9yZVwiIC8+XHJcbiAgICAgICAgPHRlbXBsYXRlICNbdWkuZHJvcGRvd24uc2xvdE5hbWVdPlxyXG4gICAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgICA6aXM9XCJ1aS5kcm9wZG93bk1lbnUubmFtZVwiXHJcbiAgICAgICAgICAgIHYtaWY9XCJ1aS5kcm9wZG93bi5yZW5kZXJNb2RlID09PSAnc2xvdCdcIlxyXG4gICAgICAgICAgICB2LWJpbmQ9XCJ1aS5kcm9wZG93bk1lbnUuY29tbWFuZChkb0Ryb3Bkb3duSXRlbUNsaWNrKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gY29tcHV0ZWRIYW5kbGVCdG5zXCIgOmtleT1cImluZGV4XCI+XHJcbiAgICAgICAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgOmlzPVwidWkuZHJvcGRvd25JdGVtLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgdi1pZj1cIml0ZW0uc2hvdyAhPT0gZmFsc2UgJiYgaXNEcm9wZG93bkJ0bihpdGVtLCBpbmRleClcIlxyXG4gICAgICAgICAgICAgICAgOlt1aS5kcm9wZG93bkl0ZW0uY29tbWFuZF09XCJpdGVtLmtleVwiXHJcbiAgICAgICAgICAgICAgICB2LWJpbmQ9XCJpdGVtLmRyb3Bkb3duSXRlbVwiXHJcbiAgICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJpdGVtLnJlbmRlclwiIDpyZW5kZXItZnVuYz1cIml0ZW0ucmVuZGVyXCIgOnNjb3BlPVwic2NvcGVSZWZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGRpdiB2LWVsc2UgY2xhc3M9XCJmcy1yb3ctaGFuZGxlLWRyb3Bkb3duLWl0ZW1cIiB2LWJpbmQ9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmcy1pY29uIHYtaWY9XCJpdGVtLmljb25cIiA6aWNvbj1cIml0ZW0uaWNvblwiIC8+IHt7IGl0ZW0udGV4dCB8fCBpdGVtLnRpdGxlIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPHNsb3QgbmFtZT1cImNlbGwtcm93SGFuZGxlLXJpZ2h0XCIgdi1iaW5kPVwic2NvcGVcIj48L3Nsb3Q+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IGZvckVhY2gsIHNvcnRCeSwgb21pdCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS11aVwiO1xyXG5pbXBvcnQgeyB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtY29tcHV0ZVwiO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgQnV0dG9uUHJvcHMsIFNjb3BlQ29udGV4dCB9IGZyb20gXCIuLi8uLi9kXCI7XHJcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xyXG5cclxuLyoqXHJcbiAqIOaTjeS9nOWIl+mFjee9rlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzUm93SGFuZGxlXCIsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5oyJ6ZKu5oqY5Y+g6YWN572uXHJcbiAgICAgKi9cclxuICAgIGRyb3Bkb3duOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5oyJ6ZKu6YWN572uXHJcbiAgICAgKiB7XHJcbiAgICAgKiAgIHZpZXc6ey4uLkZzQnV0dG9uLGNsaWNrOkZ1bmN0aW9uLG9yZGVyOjF9LFxyXG4gICAgICogICBlZGl0OnsuLi5Gc0J1dHRvbixjbGljazpGdW5jdGlvbixvcmRlcjoyfSxcclxuICAgICAqICAgcmVtb3ZlOnsuLi5Gc0J1dHRvbixjbGljazpGdW5jdGlvbixvcmRlcjozfSxcclxuICAgICAqICAgLi4u6Ieq5a6a5LmJXHJcbiAgICAgKiB9XHJcbiAgICAgKi9cclxuICAgIGJ1dHRvbnM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmjInpkq7liIbnu4Qs5LiK6Z2i55qEYnV0dG9uc+S4uum7mOiupOWIhue7hFxyXG4gICAgICogIHtcclxuICAgICAqICAgIGdyb3VwS2V5OntidXR0b25LZXk6e30sYnV0dG9uS2V5Mjp7fX1cclxuICAgICAqICB9XHJcbiAgICAgKi9cclxuICAgIGdyb3VwOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5b2T5YmN5r+A5rS75YiG57uEXHJcbiAgICAgKi9cclxuICAgIGFjdGl2ZToge1xyXG4gICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBzY29wZVxyXG4gICAgICovXHJcbiAgICBzY29wZToge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQ6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG4gIGVtaXRzOiBbXCJoYW5kbGVcIl0sXHJcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4KSB7XHJcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcclxuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xyXG5cclxuICAgIGNvbnN0IHNjb3BlUmVmID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLnByb3BzLnNjb3BlLFxyXG4gICAgICAgIHJvdzogcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4ucm93XSxcclxuICAgICAgICBpbmRleDogcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4uaW5kZXhdXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGRvQ2xpY2sgPSAoaXRlbTogYW55LCAkZXZlbnQ/OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgaW5kZXggPSBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5pbmRleF07XHJcbiAgICAgIGNvbnN0IHJvdyA9IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLnJvd107XHJcbiAgICAgIGNvbnN0IGU6IFNjb3BlQ29udGV4dCA9IHsga2V5OiBpdGVtLmtleSwgcm93LCBidG46IGl0ZW0sIGluZGV4LCAuLi5wcm9wcy5zY29wZSwgbG9hZGluZ1JlZjogJGV2ZW50Py5sb2FkaW5nUmVmIH07XHJcbiAgICAgIGlmIChpdGVtLmNsaWNrKSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uY2xpY2soZSk7XHJcbiAgICAgIH1cclxuICAgICAgY3R4LmVtaXQoXCJoYW5kbGVcIiwgZSk7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgeyBkb0NvbXB1dGVkIH0gPSB1c2VDb21wdXRlKCk7XHJcbiAgICBjb25zdCBwaWNrZWRQcm9wcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBkcm9wZG93bjogcHJvcHMuZHJvcGRvd24sXHJcbiAgICAgICAgYnV0dG9uczogcHJvcHMuYnV0dG9ucyxcclxuICAgICAgICBhY3RpdmU6IHByb3BzLmFjdGl2ZSxcclxuICAgICAgICBncm91cDogcHJvcHMuZ3JvdXBcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgY29tcHV0ZVByb3BzID0gZG9Db21wdXRlZChcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBwaWNrZWRQcm9wcy52YWx1ZTtcclxuICAgICAgfSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4uaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLnJvd107XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ucHJvcHMuc2NvcGUsIGluZGV4LCByb3cgfTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICAvL2NvbnN0IGNvbXB1dGVQcm9wcyA9IHsgdmFsdWU6IHByb3BzIH07XHJcbiAgICBjb25zdCBjb21wdXRlZEhhbmRsZUJ0bnMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGxldCBtZXJnZWRCdG5zID0gbnVsbDtcclxuICAgICAgaWYgKGNvbXB1dGVQcm9wcy52YWx1ZS5hY3RpdmUgPT0gbnVsbCB8fCBjb21wdXRlUHJvcHMudmFsdWUuYWN0aXZlID09PSBcImRlZmF1bHRcIikge1xyXG4gICAgICAgIGNvbnN0IGRlZkJ0bnMgPSB7XHJcbiAgICAgICAgICB2aWV3OiB7XHJcbiAgICAgICAgICAgIGtleTogXCJ2aWV3XCIsXHJcbiAgICAgICAgICAgIHRleHQ6IHQoXCJmcy5yb3dIYW5kbGUudmlldy50ZXh0XCIpLFxyXG4gICAgICAgICAgICB0aXRsZTogdChcImZzLnJvd0hhbmRsZS52aWV3LnRleHRcIiksXHJcbiAgICAgICAgICAgIHNpemU6IFwic21hbGxcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGNvcHk6IHtcclxuICAgICAgICAgICAga2V5OiBcImNvcHlcIixcclxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS5jb3B5LnRleHRcIiksXHJcbiAgICAgICAgICAgIHRpdGxlOiB0KFwiZnMucm93SGFuZGxlLmNvcHkudGV4dFwiKSxcclxuICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZWRpdDoge1xyXG4gICAgICAgICAgICBrZXk6IFwiZWRpdFwiLFxyXG4gICAgICAgICAgICB0eXBlOiBcInByaW1hcnlcIixcclxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS5lZGl0LnRleHRcIiksXHJcbiAgICAgICAgICAgIHRpdGxlOiB0KFwiZnMucm93SGFuZGxlLmVkaXQudGV4dFwiKSxcclxuICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcmVtb3ZlOiB7XHJcbiAgICAgICAgICAgIGtleTogXCJyZW1vdmVcIixcclxuICAgICAgICAgICAgLi4udWkuYnV0dG9uLmNvbG9ycyhcImRhbmdlclwiKSxcclxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS5yZW1vdmUudGV4dFwiKSxcclxuICAgICAgICAgICAgdGl0bGU6IHQoXCJmcy5yb3dIYW5kbGUucmVtb3ZlLnRleHRcIiksXHJcbiAgICAgICAgICAgIHNpemU6IFwic21hbGxcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbWVyZ2VkQnRucyA9IG1lcmdlKGRlZkJ0bnMsIGNvbXB1dGVQcm9wcy52YWx1ZS5idXR0b25zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtZXJnZWRCdG5zID0gY29tcHV0ZVByb3BzLnZhbHVlLmdyb3VwW2NvbXB1dGVQcm9wcy52YWx1ZS5hY3RpdmVdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBidG5zOiBCdXR0b25Qcm9wc1tdID0gW107XHJcbiAgICAgIGZvckVhY2gobWVyZ2VkQnRucywgKGl0ZW0sIGtleSkgPT4ge1xyXG4gICAgICAgIGl0ZW0ua2V5ID0ga2V5O1xyXG4gICAgICAgIGlmIChpdGVtLnNob3cgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJ0bnMucHVzaChpdGVtKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gc29ydEJ5KGJ0bnMsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZERyb3Bkb3duQXRMZWFzdCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93biA9PSBudWxsIHx8XHJcbiAgICAgICAgY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3QgPT0gbnVsbCB8fFxyXG4gICAgICAgIGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93bi5hdExlYXN0IDw9IDAgfHxcclxuICAgICAgICBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWUubGVuZ3RoIDw9IGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93bi5hdExlYXN0XHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjb21wdXRlUHJvcHMudmFsdWUuZHJvcGRvd24uYXRMZWFzdCB8fCAwO1xyXG4gICAgfSk7XHJcbiAgICBmdW5jdGlvbiBpc0Ryb3Bkb3duQnRuKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgICBpZiAoaXRlbS5kcm9wZG93biA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb21wdXRlZERyb3Bkb3duQXRMZWFzdC52YWx1ZSA+IDAgJiYgY29tcHV0ZWREcm9wZG93bkF0TGVhc3QudmFsdWUgPCBpbmRleCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGhhc0Ryb3Bkb3duQnRuID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29tcHV0ZWRIYW5kbGVCdG5zLnZhbHVlKSB7XHJcbiAgICAgICAgY29uc3QgaXMgPSBpc0Ryb3Bkb3duQnRuKGl0ZW0sIGluZGV4KTtcclxuICAgICAgICBpZiAoaXMpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCsrO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIGRvRHJvcGRvd25JdGVtQ2xpY2soJGV2ZW50OiBhbnkpIHtcclxuICAgICAgZm9yIChsZXQgYnRuIG9mIGNvbXB1dGVkSGFuZGxlQnRucy52YWx1ZSkge1xyXG4gICAgICAgIGlmICgkZXZlbnQgPT09IGJ0bi5rZXkpIHtcclxuICAgICAgICAgIGRvQ2xpY2soYnRuKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb21wdXRlZERyb3Bkb3duQmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgY29uc3QgYmluZGluZzogYW55ID0ge307XHJcbiAgICAgIGlmICh1aS5kcm9wZG93bi5yZW5kZXJNb2RlICE9PSBcInNsb3RcIikge1xyXG4gICAgICAgIC8vIG5haXZlIOmAmui/h29wdGlvbnPphY3nva7mnaXmmL7npLrlrZDpoblcclxuICAgICAgICBjb25zdCBidG5zID0gY29tcHV0ZWRIYW5kbGVCdG5zLnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IG9wdHM6IEJ1dHRvblByb3BzW10gPSBbXTtcclxuICAgICAgICBmb3JFYWNoKGJ0bnMsICh2YWx1ZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgIGlmICh2YWx1ZS5zaG93ICE9PSBmYWxzZSAmJiBpc0Ryb3Bkb3duQnRuKHZhbHVlLCBpbmRleCkpIHtcclxuICAgICAgICAgICAgb3B0cy5wdXNoKHtcclxuICAgICAgICAgICAgICBbdWkuZHJvcGRvd24udmFsdWVdOiB2YWx1ZS5rZXksXHJcbiAgICAgICAgICAgICAgW3VpLmRyb3Bkb3duLmxhYmVsXTogdmFsdWUudGV4dCxcclxuICAgICAgICAgICAgICB0aXRsZTogdmFsdWUudGl0bGVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYmluZGluZy5vcHRpb25zID0gb3B0cztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLm9taXQocHJvcHMuZHJvcGRvd24sIFwibW9yZVwiLCBcImF0TGVhc3RcIiksXHJcbiAgICAgICAgLi4udWkuZHJvcGRvd24uY29tbWFuZChkb0Ryb3Bkb3duSXRlbUNsaWNrKSxcclxuICAgICAgICAuLi5iaW5kaW5nXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1aSxcclxuICAgICAgaGFzRHJvcGRvd25CdG4sXHJcbiAgICAgIGNvbXB1dGVkSGFuZGxlQnRucyxcclxuICAgICAgZG9Ecm9wZG93bkl0ZW1DbGljayxcclxuICAgICAgY29tcHV0ZWREcm9wZG93bkF0TGVhc3QsXHJcbiAgICAgIGRvQ2xpY2ssXHJcbiAgICAgIGlzRHJvcGRvd25CdG4sXHJcbiAgICAgIHNjb3BlUmVmLFxyXG4gICAgICBjb21wdXRlZERyb3Bkb3duQmluZGluZ1xyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuXHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtcm93LWhhbmRsZSB7XHJcbiAgLy8gZGlzcGxheTogZmxleCA7IC8vIOi/memHjOS4jeiDveeUqGZsZXjvvIzlkKbliJnkvJrnoLTlnY9hbGlnbjpjZW50ZXLphY3nva5cclxuICBmbGV4LXdyYXA6IHdyYXA7XHJcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAuZWwtYnV0dG9uICsgLmVsLWJ1dHRvbiB7XHJcbiAgICBtYXJnaW4tbGVmdDogMnB4O1xyXG4gIH1cclxuICAmID4gKiB7XHJcbiAgICBtYXJnaW46IDJweDtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICB9XHJcbiAgLmZzLXJvdy1oYW5kbGUtZHJvcGRvd24taXRlbSB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gIH1cclxuXHJcbiAgLm4tYnV0dG9uIHtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBtYXJnaW46IDJweDtcclxuICB9XHJcblxyXG4gIC5yb3ctaGFuZGxlLWJ0biB7XHJcbiAgICAuZnMtaWNvbiB7XHJcbiAgICAgIG1hcmdpbjogYXV0bztcclxuICAgIH1cclxuICB9XHJcbn1cclxuPC9zdHlsZT5cclxuIiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG5cbiAgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG5cbiAgdHJ5IHtcbiAgICBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gIGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHtcbiAgICBfY29uc3RydWN0ID0gUmVmbGVjdC5jb25zdHJ1Y3QuYmluZCgpO1xuICB9IGVsc2Uge1xuICAgIF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlRnVuY3Rpb24oZm4pIHtcbiAgcmV0dXJuIEZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoZm4pLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiID8gbmV3IE1hcCgpIDogdW5kZWZpbmVkO1xuXG4gIF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gICAgaWYgKENsYXNzID09PSBudWxsIHx8ICFfaXNOYXRpdmVGdW5jdGlvbihDbGFzcykpIHJldHVybiBDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHtcbiAgICAgIHJldHVybiBfY29uc3RydWN0KENsYXNzLCBhcmd1bWVudHMsIF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihXcmFwcGVyLCBDbGFzcyk7XG4gIH07XG5cbiAgcmV0dXJuIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpO1xufVxuXG4vKiBlc2xpbnQgbm8tY29uc29sZTowICovXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbnZhciB3YXJuaW5nID0gZnVuY3Rpb24gd2FybmluZygpIHt9OyAvLyBkb24ndCBwcmludCB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBpbiBwcm9kdWN0aW9uIGVudiBvciBub2RlIHJ1bnRpbWVcblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcodHlwZSwgZXJyb3JzKSB7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLndhcm4gJiYgdHlwZW9mIEFTWU5DX1ZBTElEQVRPUl9OT19XQVJOSU5HID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGVycm9ycy5ldmVyeShmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdzdHJpbmcnO1xuICAgICAgfSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKHR5cGUsIGVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKSB7XG4gIGlmICghZXJyb3JzIHx8ICFlcnJvcnMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICBlcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICB2YXIgZmllbGQgPSBlcnJvci5maWVsZDtcbiAgICBmaWVsZHNbZmllbGRdID0gZmllbGRzW2ZpZWxkXSB8fCBbXTtcbiAgICBmaWVsZHNbZmllbGRdLnB1c2goZXJyb3IpO1xuICB9KTtcbiAgcmV0dXJuIGZpZWxkcztcbn1cbmZ1bmN0aW9uIGZvcm1hdCh0ZW1wbGF0ZSkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICB2YXIgaSA9IDA7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcblxuICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgc3RyID0gdGVtcGxhdGUucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uICh4KSB7XG4gICAgICBpZiAoeCA9PT0gJyUlJykge1xuICAgICAgICByZXR1cm4gJyUnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaSA+PSBsZW4pIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoeCkge1xuICAgICAgICBjYXNlICclcyc6XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuXG4gICAgICAgIGNhc2UgJyVkJzpcbiAgICAgICAgICByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG5cbiAgICAgICAgY2FzZSAnJWonOlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHJldHVybiB0ZW1wbGF0ZTtcbn1cblxuZnVuY3Rpb24gaXNOYXRpdmVTdHJpbmdUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICd1cmwnIHx8IHR5cGUgPT09ICdoZXgnIHx8IHR5cGUgPT09ICdlbWFpbCcgfHwgdHlwZSA9PT0gJ2RhdGUnIHx8IHR5cGUgPT09ICdwYXR0ZXJuJztcbn1cblxuZnVuY3Rpb24gaXNFbXB0eVZhbHVlKHZhbHVlLCB0eXBlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gJ2FycmF5JyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAhdmFsdWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNOYXRpdmVTdHJpbmdUeXBlKHR5cGUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIGNhbGxiYWNrKSB7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNvdW50KGVycm9ycykge1xuICAgIHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBlcnJvcnMgfHwgW10pO1xuICAgIHRvdGFsKys7XG5cbiAgICBpZiAodG90YWwgPT09IGFyckxlbmd0aCkge1xuICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgfVxuICB9XG5cbiAgYXJyLmZvckVhY2goZnVuY3Rpb24gKGEpIHtcbiAgICBmdW5jKGEsIGNvdW50KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzeW5jU2VyaWFsQXJyYXkoYXJyLCBmdW5jLCBjYWxsYmFjaykge1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aDtcblxuICBmdW5jdGlvbiBuZXh0KGVycm9ycykge1xuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCkge1xuICAgICAgY2FsbGJhY2soZXJyb3JzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb3JpZ2luYWwgPSBpbmRleDtcbiAgICBpbmRleCA9IGluZGV4ICsgMTtcblxuICAgIGlmIChvcmlnaW5hbCA8IGFyckxlbmd0aCkge1xuICAgICAgZnVuYyhhcnJbb3JpZ2luYWxdLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soW10pO1xuICAgIH1cbiAgfVxuXG4gIG5leHQoW10pO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuT2JqQXJyKG9iakFycikge1xuICB2YXIgcmV0ID0gW107XG4gIE9iamVjdC5rZXlzKG9iakFycikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgIHJldC5wdXNoLmFwcGx5KHJldCwgb2JqQXJyW2tdIHx8IFtdKTtcbiAgfSk7XG4gIHJldHVybiByZXQ7XG59XG5cbnZhciBBc3luY1ZhbGlkYXRpb25FcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Vycm9yKSB7XG4gIF9pbmhlcml0c0xvb3NlKEFzeW5jVmFsaWRhdGlvbkVycm9yLCBfRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIEFzeW5jVmFsaWRhdGlvbkVycm9yKGVycm9ycywgZmllbGRzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfRXJyb3IuY2FsbCh0aGlzLCAnQXN5bmMgVmFsaWRhdGlvbiBFcnJvcicpIHx8IHRoaXM7XG4gICAgX3RoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIF90aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICByZXR1cm4gQXN5bmNWYWxpZGF0aW9uRXJyb3I7XG59KCAvKiNfX1BVUkVfXyovX3dyYXBOYXRpdmVTdXBlcihFcnJvcikpO1xuZnVuY3Rpb24gYXN5bmNNYXAob2JqQXJyLCBvcHRpb24sIGZ1bmMsIGNhbGxiYWNrLCBzb3VyY2UpIHtcbiAgaWYgKG9wdGlvbi5maXJzdCkge1xuICAgIHZhciBfcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyb3JzKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyByZWplY3QobmV3IEFzeW5jVmFsaWRhdGlvbkVycm9yKGVycm9ycywgY29udmVydEZpZWxkc0Vycm9yKGVycm9ycykpKSA6IHJlc29sdmUoc291cmNlKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBmbGF0dGVuQXJyID0gZmxhdHRlbk9iakFycihvYmpBcnIpO1xuICAgICAgYXN5bmNTZXJpYWxBcnJheShmbGF0dGVuQXJyLCBmdW5jLCBuZXh0KTtcbiAgICB9KTtcblxuICAgIF9wZW5kaW5nW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9wZW5kaW5nO1xuICB9XG5cbiAgdmFyIGZpcnN0RmllbGRzID0gb3B0aW9uLmZpcnN0RmllbGRzID09PSB0cnVlID8gT2JqZWN0LmtleXMob2JqQXJyKSA6IG9wdGlvbi5maXJzdEZpZWxkcyB8fCBbXTtcbiAgdmFyIG9iakFycktleXMgPSBPYmplY3Qua2V5cyhvYmpBcnIpO1xuICB2YXIgb2JqQXJyTGVuZ3RoID0gb2JqQXJyS2V5cy5sZW5ndGg7XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICAgIHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBlcnJvcnMpO1xuICAgICAgdG90YWwrKztcblxuICAgICAgaWYgKHRvdGFsID09PSBvYmpBcnJMZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA/IHJlamVjdChuZXcgQXN5bmNWYWxpZGF0aW9uRXJyb3IocmVzdWx0cywgY29udmVydEZpZWxkc0Vycm9yKHJlc3VsdHMpKSkgOiByZXNvbHZlKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghb2JqQXJyS2V5cy5sZW5ndGgpIHtcbiAgICAgIGNhbGxiYWNrKHJlc3VsdHMpO1xuICAgICAgcmVzb2x2ZShzb3VyY2UpO1xuICAgIH1cblxuICAgIG9iakFycktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgYXJyID0gb2JqQXJyW2tleV07XG5cbiAgICAgIGlmIChmaXJzdEZpZWxkcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgIGFzeW5jU2VyaWFsQXJyYXkoYXJyLCBmdW5jLCBuZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIG5leHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcGVuZGluZ1tcImNhdGNoXCJdKGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGU7XG4gIH0pO1xuICByZXR1cm4gcGVuZGluZztcbn1cblxuZnVuY3Rpb24gaXNFcnJvck9iaihvYmopIHtcbiAgcmV0dXJuICEhKG9iaiAmJiBvYmoubWVzc2FnZSAhPT0gdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUodmFsdWUsIHBhdGgpIHtcbiAgdmFyIHYgPSB2YWx1ZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2O1xuICAgIH1cblxuICAgIHYgPSB2W3BhdGhbaV1dO1xuICB9XG5cbiAgcmV0dXJuIHY7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZW1lbnRFcnJvcihydWxlLCBzb3VyY2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvZSkge1xuICAgIHZhciBmaWVsZFZhbHVlO1xuXG4gICAgaWYgKHJ1bGUuZnVsbEZpZWxkcykge1xuICAgICAgZmllbGRWYWx1ZSA9IGdldFZhbHVlKHNvdXJjZSwgcnVsZS5mdWxsRmllbGRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmllbGRWYWx1ZSA9IHNvdXJjZVtvZS5maWVsZCB8fCBydWxlLmZ1bGxGaWVsZF07XG4gICAgfVxuXG4gICAgaWYgKGlzRXJyb3JPYmoob2UpKSB7XG4gICAgICBvZS5maWVsZCA9IG9lLmZpZWxkIHx8IHJ1bGUuZnVsbEZpZWxkO1xuICAgICAgb2UuZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWU7XG4gICAgICByZXR1cm4gb2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHR5cGVvZiBvZSA9PT0gJ2Z1bmN0aW9uJyA/IG9lKCkgOiBvZSxcbiAgICAgIGZpZWxkVmFsdWU6IGZpZWxkVmFsdWUsXG4gICAgICBmaWVsZDogb2UuZmllbGQgfHwgcnVsZS5mdWxsRmllbGRcbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gZGVlcE1lcmdlKHRhcmdldCwgc291cmNlKSB7XG4gIGlmIChzb3VyY2UpIHtcbiAgICBmb3IgKHZhciBzIGluIHNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShzKSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vbc107XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRhcmdldFtzXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0YXJnZXRbc10gPSBfZXh0ZW5kcyh7fSwgdGFyZ2V0W3NdLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W3NdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG52YXIgcmVxdWlyZWQkMSA9IGZ1bmN0aW9uIHJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgdHlwZSkge1xuICBpZiAocnVsZS5yZXF1aXJlZCAmJiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKSB8fCBpc0VtcHR5VmFsdWUodmFsdWUsIHR5cGUgfHwgcnVsZS50eXBlKSkpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5yZXF1aXJlZCwgcnVsZS5mdWxsRmllbGQpKTtcbiAgfVxufTtcblxuLyoqXG4gKiAgUnVsZSBmb3IgdmFsaWRhdGluZyB3aGl0ZXNwYWNlLlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBlcnJvcnMgQW4gYXJyYXkgb2YgZXJyb3JzIHRoYXQgdGhpcyBydWxlIG1heSBhZGRcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG5cbnZhciB3aGl0ZXNwYWNlID0gZnVuY3Rpb24gd2hpdGVzcGFjZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgaWYgKC9eXFxzKyQvLnRlc3QodmFsdWUpIHx8IHZhbHVlID09PSAnJykge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLndoaXRlc3BhY2UsIHJ1bGUuZnVsbEZpZWxkKSk7XG4gIH1cbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rZXZ2YS91cmwtcmVnZXgvYmxvYi9tYXN0ZXIvaW5kZXguanNcbnZhciB1cmxSZWc7XG52YXIgZ2V0VXJsUmVnZXggPSAoZnVuY3Rpb24gKCkge1xuICBpZiAodXJsUmVnKSB7XG4gICAgcmV0dXJuIHVybFJlZztcbiAgfVxuXG4gIHZhciB3b3JkID0gJ1thLWZBLUZcXFxcZDpdJztcblxuICB2YXIgYiA9IGZ1bmN0aW9uIGIob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZUJvdW5kYXJpZXMgPyBcIig/Oig/PD1cXFxcc3xeKSg/PVwiICsgd29yZCArIFwiKXwoPzw9XCIgKyB3b3JkICsgXCIpKD89XFxcXHN8JCkpXCIgOiAnJztcbiAgfTtcblxuICB2YXIgdjQgPSAnKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSg/OlxcXFwuKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSl7M30nO1xuICB2YXIgdjZzZWcgPSAnW2EtZkEtRlxcXFxkXXsxLDR9JztcbiAgdmFyIHY2ID0gKFwiXFxuKD86XFxuKD86XCIgKyB2NnNlZyArIFwiOil7N30oPzpcIiArIHY2c2VnICsgXCJ8Oil8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMToyOjM6NDo1OjY6Nzo6ICAxOjI6Mzo0OjU6Njo3OjhcXG4oPzpcIiArIHY2c2VnICsgXCI6KXs2fSg/OlwiICsgdjQgKyBcInw6XCIgKyB2NnNlZyArIFwifDopfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMToyOjM6NDo1OjY6OiAgICAxOjI6Mzo0OjU6Njo6OCAgIDE6MjozOjQ6NTo2Ojo4ICAxOjI6Mzo0OjU6Njo6MS4yLjMuNFxcbig/OlwiICsgdjZzZWcgKyBcIjopezV9KD86OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDJ9fDopfCAgICAgICAgICAgICAgICAgICAvLyAxOjI6Mzo0OjU6OiAgICAgIDE6MjozOjQ6NTo6Nzo4ICAgMToyOjM6NDo1Ojo4ICAgIDE6MjozOjQ6NTo6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7NH0oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDF9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDN9fDopfCAvLyAxOjI6Mzo0OjogICAgICAgIDE6MjozOjQ6OjY6Nzo4ICAgMToyOjM6NDo6OCAgICAgIDE6MjozOjQ6OjY6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7M30oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDJ9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDR9fDopfCAvLyAxOjI6Mzo6ICAgICAgICAgIDE6MjozOjo1OjY6Nzo4ICAgMToyOjM6OjggICAgICAgIDE6MjozOjo1OjY6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7Mn0oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDN9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDV9fDopfCAvLyAxOjI6OiAgICAgICAgICAgIDE6Mjo6NDo1OjY6Nzo4ICAgMToyOjo4ICAgICAgICAgIDE6Mjo6NDo1OjY6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7MX0oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDR9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDZ9fDopfCAvLyAxOjogICAgICAgICAgICAgIDE6OjM6NDo1OjY6Nzo4ICAgMTo6OCAgICAgICAgICAgIDE6OjM6NDo1OjY6NzoxLjIuMy40XFxuKD86Oig/Oig/OjpcIiArIHY2c2VnICsgXCIpezAsNX06XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsN318OikpICAgICAgICAgICAgIC8vIDo6MjozOjQ6NTo2Ojc6OCAgOjoyOjM6NDo1OjY6Nzo4ICA6OjggICAgICAgICAgICAgOjoxLjIuMy40XFxuKSg/OiVbMC05YS16QS1aXXsxLH0pPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICVldGgwICAgICAgICAgICAgJTFcXG5cIikucmVwbGFjZSgvXFxzKlxcL1xcLy4qJC9nbSwgJycpLnJlcGxhY2UoL1xcbi9nLCAnJykudHJpbSgpOyAvLyBQcmUtY29tcGlsZSBvbmx5IHRoZSBleGFjdCByZWdleGVzIGJlY2F1c2UgYWRkaW5nIGEgZ2xvYmFsIGZsYWcgbWFrZSByZWdleGVzIHN0YXRlZnVsXG5cbiAgdmFyIHY0NkV4YWN0ID0gbmV3IFJlZ0V4cChcIig/Ol5cIiArIHY0ICsgXCIkKXwoPzpeXCIgKyB2NiArIFwiJClcIik7XG4gIHZhciB2NGV4YWN0ID0gbmV3IFJlZ0V4cChcIl5cIiArIHY0ICsgXCIkXCIpO1xuICB2YXIgdjZleGFjdCA9IG5ldyBSZWdFeHAoXCJeXCIgKyB2NiArIFwiJFwiKTtcblxuICB2YXIgaXAgPSBmdW5jdGlvbiBpcChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5leGFjdCA/IHY0NkV4YWN0IDogbmV3IFJlZ0V4cChcIig/OlwiICsgYihvcHRpb25zKSArIHY0ICsgYihvcHRpb25zKSArIFwiKXwoPzpcIiArIGIob3B0aW9ucykgKyB2NiArIGIob3B0aW9ucykgKyBcIilcIiwgJ2cnKTtcbiAgfTtcblxuICBpcC52NCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5leGFjdCA/IHY0ZXhhY3QgOiBuZXcgUmVnRXhwKFwiXCIgKyBiKG9wdGlvbnMpICsgdjQgKyBiKG9wdGlvbnMpLCAnZycpO1xuICB9O1xuXG4gIGlwLnY2ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmV4YWN0ID8gdjZleGFjdCA6IG5ldyBSZWdFeHAoXCJcIiArIGIob3B0aW9ucykgKyB2NiArIGIob3B0aW9ucyksICdnJyk7XG4gIH07XG5cbiAgdmFyIHByb3RvY29sID0gXCIoPzooPzpbYS16XSs6KT8vLylcIjtcbiAgdmFyIGF1dGggPSAnKD86XFxcXFMrKD86OlxcXFxTKik/QCk/JztcbiAgdmFyIGlwdjQgPSBpcC52NCgpLnNvdXJjZTtcbiAgdmFyIGlwdjYgPSBpcC52NigpLnNvdXJjZTtcbiAgdmFyIGhvc3QgPSBcIig/Oig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XVstX10qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKVwiO1xuICB2YXIgZG9tYWluID0gXCIoPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XS0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSpcIjtcbiAgdmFyIHRsZCA9IFwiKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZl17Mix9KSlcIjtcbiAgdmFyIHBvcnQgPSAnKD86OlxcXFxkezIsNX0pPyc7XG4gIHZhciBwYXRoID0gJyg/OlsvPyNdW15cXFxcc1wiXSopPyc7XG4gIHZhciByZWdleCA9IFwiKD86XCIgKyBwcm90b2NvbCArIFwifHd3d1xcXFwuKVwiICsgYXV0aCArIFwiKD86bG9jYWxob3N0fFwiICsgaXB2NCArIFwifFwiICsgaXB2NiArIFwifFwiICsgaG9zdCArIGRvbWFpbiArIHRsZCArIFwiKVwiICsgcG9ydCArIHBhdGg7XG4gIHVybFJlZyA9IG5ldyBSZWdFeHAoXCIoPzpeXCIgKyByZWdleCArIFwiJClcIiwgJ2knKTtcbiAgcmV0dXJuIHVybFJlZztcbn0pO1xuXG4vKiBlc2xpbnQgbWF4LWxlbjowICovXG5cbnZhciBwYXR0ZXJuJDIgPSB7XG4gIC8vIGh0dHA6Ly9lbWFpbHJlZ2V4LmNvbS9cbiAgZW1haWw6IC9eKChbXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfV0pfCgoW2EtekEtWlxcLTAtOVxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0rXFwuKStbYS16QS1aXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXXsyLH0pKSQvLFxuICAvLyB1cmw6IG5ldyBSZWdFeHAoXG4gIC8vICAgJ14oPyFtYWlsdG86KSg/Oig/Omh0dHB8aHR0cHN8ZnRwKTovL3wvLykoPzpcXFxcUysoPzo6XFxcXFMqKT9AKT8oPzooPzooPzpbMS05XVxcXFxkP3wxXFxcXGRcXFxcZHwyWzAxXVxcXFxkfDIyWzAtM10pKD86XFxcXC4oPzoxP1xcXFxkezEsMn18MlswLTRdXFxcXGR8MjVbMC01XSkpezJ9KD86XFxcXC4oPzpbMC05XVxcXFxkP3wxXFxcXGRcXFxcZHwyWzAtNF1cXFxcZHwyNVswLTRdKSl8KD86KD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKy0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSg/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKy0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSooPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmXXsyLH0pKSl8bG9jYWxob3N0KSg/OjpcXFxcZHsyLDV9KT8oPzooL3xcXFxcP3wjKVteXFxcXHNdKik/JCcsXG4gIC8vICAgJ2knLFxuICAvLyApLFxuICBoZXg6IC9eIz8oW2EtZjAtOV17Nn18W2EtZjAtOV17M30pJC9pXG59O1xudmFyIHR5cGVzID0ge1xuICBpbnRlZ2VyOiBmdW5jdGlvbiBpbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVzLm51bWJlcih2YWx1ZSkgJiYgcGFyc2VJbnQodmFsdWUsIDEwKSA9PT0gdmFsdWU7XG4gIH0sXG4gIFwiZmxvYXRcIjogZnVuY3Rpb24gZmxvYXQodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZXMubnVtYmVyKHZhbHVlKSAmJiAhdHlwZXMuaW50ZWdlcih2YWx1ZSk7XG4gIH0sXG4gIGFycmF5OiBmdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfSxcbiAgcmVnZXhwOiBmdW5jdGlvbiByZWdleHAodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISFuZXcgUmVnRXhwKHZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBkYXRlOiBmdW5jdGlvbiBkYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZS5nZXRUaW1lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS5nZXRNb250aCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUuZ2V0WWVhciA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfSxcbiAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIG9iamVjdDogZnVuY3Rpb24gb2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXR5cGVzLmFycmF5KHZhbHVlKTtcbiAgfSxcbiAgbWV0aG9kOiBmdW5jdGlvbiBtZXRob2QodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xuICB9LFxuICBlbWFpbDogZnVuY3Rpb24gZW1haWwodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPD0gMzIwICYmICEhdmFsdWUubWF0Y2gocGF0dGVybiQyLmVtYWlsKTtcbiAgfSxcbiAgdXJsOiBmdW5jdGlvbiB1cmwodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPD0gMjA0OCAmJiAhIXZhbHVlLm1hdGNoKGdldFVybFJlZ2V4KCkpO1xuICB9LFxuICBoZXg6IGZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICEhdmFsdWUubWF0Y2gocGF0dGVybiQyLmhleCk7XG4gIH1cbn07XG5cbnZhciB0eXBlJDEgPSBmdW5jdGlvbiB0eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICBpZiAocnVsZS5yZXF1aXJlZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVxdWlyZWQkMShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBjdXN0b20gPSBbJ2ludGVnZXInLCAnZmxvYXQnLCAnYXJyYXknLCAncmVnZXhwJywgJ29iamVjdCcsICdtZXRob2QnLCAnZW1haWwnLCAnbnVtYmVyJywgJ2RhdGUnLCAndXJsJywgJ2hleCddO1xuICB2YXIgcnVsZVR5cGUgPSBydWxlLnR5cGU7XG5cbiAgaWYgKGN1c3RvbS5pbmRleE9mKHJ1bGVUeXBlKSA+IC0xKSB7XG4gICAgaWYgKCF0eXBlc1tydWxlVHlwZV0odmFsdWUpKSB7XG4gICAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy50eXBlc1tydWxlVHlwZV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLnR5cGUpKTtcbiAgICB9IC8vIHN0cmFpZ2h0IHR5cGVvZiBjaGVja1xuXG4gIH0gZWxzZSBpZiAocnVsZVR5cGUgJiYgdHlwZW9mIHZhbHVlICE9PSBydWxlLnR5cGUpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy50eXBlc1tydWxlVHlwZV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLnR5cGUpKTtcbiAgfVxufTtcblxudmFyIHJhbmdlID0gZnVuY3Rpb24gcmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIHZhciBsZW4gPSB0eXBlb2YgcnVsZS5sZW4gPT09ICdudW1iZXInO1xuICB2YXIgbWluID0gdHlwZW9mIHJ1bGUubWluID09PSAnbnVtYmVyJztcbiAgdmFyIG1heCA9IHR5cGVvZiBydWxlLm1heCA9PT0gJ251bWJlcic7IC8vIOato+WImeWMuemFjeeggeeCueiMg+WbtOS7jlUrMDEwMDAw5LiA55u05YiwVSsxMEZGRkbnmoTmloflrZfvvIjooaXlhYXlubPpnaJTdXBwbGVtZW50YXJ5IFBsYW5l77yJXG5cbiAgdmFyIHNwUmVnZXhwID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZztcbiAgdmFyIHZhbCA9IHZhbHVlO1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIG51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIHZhciBzdHIgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICB2YXIgYXJyID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG5cbiAgaWYgKG51bSkge1xuICAgIGtleSA9ICdudW1iZXInO1xuICB9IGVsc2UgaWYgKHN0cikge1xuICAgIGtleSA9ICdzdHJpbmcnO1xuICB9IGVsc2UgaWYgKGFycikge1xuICAgIGtleSA9ICdhcnJheSc7XG4gIH0gLy8gaWYgdGhlIHZhbHVlIGlzIG5vdCBvZiBhIHN1cHBvcnRlZCB0eXBlIGZvciByYW5nZSB2YWxpZGF0aW9uXG4gIC8vIHRoZSB2YWxpZGF0aW9uIHJ1bGUgcnVsZSBzaG91bGQgdXNlIHRoZVxuICAvLyB0eXBlIHByb3BlcnR5IHRvIGFsc28gdGVzdCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGVcblxuXG4gIGlmICgha2V5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGFycikge1xuICAgIHZhbCA9IHZhbHVlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChzdHIpIHtcbiAgICAvLyDlpITnkIbnoIHngrnlpKfkuo5VKzAxMDAwMOeahOaWh+Wtl2xlbmd0aOWxnuaAp+S4jeWHhuehrueahGJ1Z++8jOWmglwi8KCut/CgrrfwoK63XCIubGVuZ2h0ICE9PSAzXG4gICAgdmFsID0gdmFsdWUucmVwbGFjZShzcFJlZ2V4cCwgJ18nKS5sZW5ndGg7XG4gIH1cblxuICBpZiAobGVuKSB7XG4gICAgaWYgKHZhbCAhPT0gcnVsZS5sZW4pIHtcbiAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ubGVuLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5sZW4pKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobWluICYmICFtYXggJiYgdmFsIDwgcnVsZS5taW4pIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLm1pbiwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWluKSk7XG4gIH0gZWxzZSBpZiAobWF4ICYmICFtaW4gJiYgdmFsID4gcnVsZS5tYXgpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLm1heCwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWF4KSk7XG4gIH0gZWxzZSBpZiAobWluICYmIG1heCAmJiAodmFsIDwgcnVsZS5taW4gfHwgdmFsID4gcnVsZS5tYXgpKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5yYW5nZSwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWluLCBydWxlLm1heCkpO1xuICB9XG59O1xuXG52YXIgRU5VTSQxID0gJ2VudW0nO1xuXG52YXIgZW51bWVyYWJsZSQxID0gZnVuY3Rpb24gZW51bWVyYWJsZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgcnVsZVtFTlVNJDFdID0gQXJyYXkuaXNBcnJheShydWxlW0VOVU0kMV0pID8gcnVsZVtFTlVNJDFdIDogW107XG5cbiAgaWYgKHJ1bGVbRU5VTSQxXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1tFTlVNJDFdLCBydWxlLmZ1bGxGaWVsZCwgcnVsZVtFTlVNJDFdLmpvaW4oJywgJykpKTtcbiAgfVxufTtcblxudmFyIHBhdHRlcm4kMSA9IGZ1bmN0aW9uIHBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIGlmIChydWxlLnBhdHRlcm4pIHtcbiAgICBpZiAocnVsZS5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBpZiBhIFJlZ0V4cCBpbnN0YW5jZSBpcyBwYXNzZWQsIHJlc2V0IGBsYXN0SW5kZXhgIGluIGNhc2UgaXRzIGBnbG9iYWxgXG4gICAgICAvLyBmbGFnIGlzIGFjY2lkZW50YWxseSBzZXQgdG8gYHRydWVgLCB3aGljaCBpbiBhIHZhbGlkYXRpb24gc2NlbmFyaW9cbiAgICAgIC8vIGlzIG5vdCBuZWNlc3NhcnkgYW5kIHRoZSByZXN1bHQgbWlnaHQgYmUgbWlzbGVhZGluZ1xuICAgICAgcnVsZS5wYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG5cbiAgICAgIGlmICghcnVsZS5wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnBhdHRlcm4ubWlzbWF0Y2gsIHJ1bGUuZnVsbEZpZWxkLCB2YWx1ZSwgcnVsZS5wYXR0ZXJuKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcnVsZS5wYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIF9wYXR0ZXJuID0gbmV3IFJlZ0V4cChydWxlLnBhdHRlcm4pO1xuXG4gICAgICBpZiAoIV9wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnBhdHRlcm4ubWlzbWF0Y2gsIHJ1bGUuZnVsbEZpZWxkLCB2YWx1ZSwgcnVsZS5wYXR0ZXJuKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgcnVsZXMgPSB7XG4gIHJlcXVpcmVkOiByZXF1aXJlZCQxLFxuICB3aGl0ZXNwYWNlOiB3aGl0ZXNwYWNlLFxuICB0eXBlOiB0eXBlJDEsXG4gIHJhbmdlOiByYW5nZSxcbiAgXCJlbnVtXCI6IGVudW1lcmFibGUkMSxcbiAgcGF0dGVybjogcGF0dGVybiQxXG59O1xuXG52YXIgc3RyaW5nID0gZnVuY3Rpb24gc3RyaW5nKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ3N0cmluZycpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsICdzdHJpbmcnKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5wYXR0ZXJuKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChydWxlLndoaXRlc3BhY2UgPT09IHRydWUpIHtcbiAgICAgICAgcnVsZXMud2hpdGVzcGFjZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgbWV0aG9kID0gZnVuY3Rpb24gbWV0aG9kKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgbnVtYmVyID0gZnVuY3Rpb24gbnVtYmVyKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIF9ib29sZWFuID0gZnVuY3Rpb24gX2Jvb2xlYW4ocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciByZWdleHAgPSBmdW5jdGlvbiByZWdleHAocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgaW50ZWdlciA9IGZ1bmN0aW9uIGludGVnZXIocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgZmxvYXRGbiA9IGZ1bmN0aW9uIGZsb2F0Rm4ocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgYXJyYXkgPSBmdW5jdGlvbiBhcnJheShydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmICgodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgJ2FycmF5Jyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIG9iamVjdCA9IGZ1bmN0aW9uIG9iamVjdChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIEVOVU0gPSAnZW51bSc7XG5cbnZhciBlbnVtZXJhYmxlID0gZnVuY3Rpb24gZW51bWVyYWJsZShydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzW0VOVU1dKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBwYXR0ZXJuID0gZnVuY3Rpb24gcGF0dGVybihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcbiAgICAgIHJ1bGVzLnBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIGRhdGUgPSBmdW5jdGlvbiBkYXRlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdpbnRlZ2VyIHJ1bGUgY2FsbGVkICVqJywgcnVsZSk7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7IC8vIGNvbnNvbGUubG9nKCd2YWxpZGF0ZSBvbiAlcyB2YWx1ZScsIHZhbHVlKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCAnZGF0ZScpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdkYXRlJykpIHtcbiAgICAgIHZhciBkYXRlT2JqZWN0O1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIGRhdGVPYmplY3QgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGVPYmplY3QgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgZGF0ZU9iamVjdCwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoZGF0ZU9iamVjdCkge1xuICAgICAgICBydWxlcy5yYW5nZShydWxlLCBkYXRlT2JqZWN0LmdldFRpbWUoKSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgcmVxdWlyZWQgPSBmdW5jdGlvbiByZXF1aXJlZChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB0eXBlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAnYXJyYXknIDogdHlwZW9mIHZhbHVlO1xuICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsIHR5cGUpO1xuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIHR5cGUgPSBmdW5jdGlvbiB0eXBlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBydWxlVHlwZSA9IHJ1bGUudHlwZTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCBydWxlVHlwZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgcnVsZVR5cGUpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsIHJ1bGVUeXBlKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgYW55ID0gZnVuY3Rpb24gYW55KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIHZhbGlkYXRvcnMgPSB7XG4gIHN0cmluZzogc3RyaW5nLFxuICBtZXRob2Q6IG1ldGhvZCxcbiAgbnVtYmVyOiBudW1iZXIsXG4gIFwiYm9vbGVhblwiOiBfYm9vbGVhbixcbiAgcmVnZXhwOiByZWdleHAsXG4gIGludGVnZXI6IGludGVnZXIsXG4gIFwiZmxvYXRcIjogZmxvYXRGbixcbiAgYXJyYXk6IGFycmF5LFxuICBvYmplY3Q6IG9iamVjdCxcbiAgXCJlbnVtXCI6IGVudW1lcmFibGUsXG4gIHBhdHRlcm46IHBhdHRlcm4sXG4gIGRhdGU6IGRhdGUsXG4gIHVybDogdHlwZSxcbiAgaGV4OiB0eXBlLFxuICBlbWFpbDogdHlwZSxcbiAgcmVxdWlyZWQ6IHJlcXVpcmVkLFxuICBhbnk6IGFueVxufTtcblxuZnVuY3Rpb24gbmV3TWVzc2FnZXMoKSB7XG4gIHJldHVybiB7XG4gICAgXCJkZWZhdWx0XCI6ICdWYWxpZGF0aW9uIGVycm9yIG9uIGZpZWxkICVzJyxcbiAgICByZXF1aXJlZDogJyVzIGlzIHJlcXVpcmVkJyxcbiAgICBcImVudW1cIjogJyVzIG11c3QgYmUgb25lIG9mICVzJyxcbiAgICB3aGl0ZXNwYWNlOiAnJXMgY2Fubm90IGJlIGVtcHR5JyxcbiAgICBkYXRlOiB7XG4gICAgICBmb3JtYXQ6ICclcyBkYXRlICVzIGlzIGludmFsaWQgZm9yIGZvcm1hdCAlcycsXG4gICAgICBwYXJzZTogJyVzIGRhdGUgY291bGQgbm90IGJlIHBhcnNlZCwgJXMgaXMgaW52YWxpZCAnLFxuICAgICAgaW52YWxpZDogJyVzIGRhdGUgJXMgaXMgaW52YWxpZCdcbiAgICB9LFxuICAgIHR5cGVzOiB7XG4gICAgICBzdHJpbmc6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBtZXRob2Q6ICclcyBpcyBub3QgYSAlcyAoZnVuY3Rpb24pJyxcbiAgICAgIGFycmF5OiAnJXMgaXMgbm90IGFuICVzJyxcbiAgICAgIG9iamVjdDogJyVzIGlzIG5vdCBhbiAlcycsXG4gICAgICBudW1iZXI6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBkYXRlOiAnJXMgaXMgbm90IGEgJXMnLFxuICAgICAgXCJib29sZWFuXCI6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBpbnRlZ2VyOiAnJXMgaXMgbm90IGFuICVzJyxcbiAgICAgIFwiZmxvYXRcIjogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIHJlZ2V4cDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcbiAgICAgIGVtYWlsOiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnLFxuICAgICAgdXJsOiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnLFxuICAgICAgaGV4OiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnXG4gICAgfSxcbiAgICBzdHJpbmc6IHtcbiAgICAgIGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBjaGFyYWN0ZXJzJyxcbiAgICAgIG1pbjogJyVzIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycsXG4gICAgICBtYXg6ICclcyBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gJXMgY2hhcmFjdGVycycsXG4gICAgICByYW5nZTogJyVzIG11c3QgYmUgYmV0d2VlbiAlcyBhbmQgJXMgY2hhcmFjdGVycydcbiAgICB9LFxuICAgIG51bWJlcjoge1xuICAgICAgbGVuOiAnJXMgbXVzdCBlcXVhbCAlcycsXG4gICAgICBtaW46ICclcyBjYW5ub3QgYmUgbGVzcyB0aGFuICVzJyxcbiAgICAgIG1heDogJyVzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJXMnLFxuICAgICAgcmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzJ1xuICAgIH0sXG4gICAgYXJyYXk6IHtcbiAgICAgIGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBpbiBsZW5ndGgnLFxuICAgICAgbWluOiAnJXMgY2Fubm90IGJlIGxlc3MgdGhhbiAlcyBpbiBsZW5ndGgnLFxuICAgICAgbWF4OiAnJXMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAlcyBpbiBsZW5ndGgnLFxuICAgICAgcmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzIGluIGxlbmd0aCdcbiAgICB9LFxuICAgIHBhdHRlcm46IHtcbiAgICAgIG1pc21hdGNoOiAnJXMgdmFsdWUgJXMgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiAlcydcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgIHZhciBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKTtcbiAgICAgIGNsb25lZC5jbG9uZSA9IHRoaXMuY2xvbmU7XG4gICAgICByZXR1cm4gY2xvbmVkO1xuICAgIH1cbiAgfTtcbn1cbnZhciBtZXNzYWdlcyA9IG5ld01lc3NhZ2VzKCk7XG5cbi8qKlxuICogIEVuY2Fwc3VsYXRlcyBhIHZhbGlkYXRpb24gc2NoZW1hLlxuICpcbiAqICBAcGFyYW0gZGVzY3JpcHRvciBBbiBvYmplY3QgZGVjbGFyaW5nIHZhbGlkYXRpb24gcnVsZXNcbiAqICBmb3IgdGhpcyBzY2hlbWEuXG4gKi9cblxudmFyIFNjaGVtYSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU3RhdGljID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEluc3RhbmNlID09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBTY2hlbWEoZGVzY3JpcHRvcikge1xuICAgIHRoaXMucnVsZXMgPSBudWxsO1xuICAgIHRoaXMuX21lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgdGhpcy5kZWZpbmUoZGVzY3JpcHRvcik7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU2NoZW1hLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKHJ1bGVzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICghcnVsZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbmZpZ3VyZSBhIHNjaGVtYSB3aXRoIG5vIHJ1bGVzJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBydWxlcyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShydWxlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUnVsZXMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bGVzID0ge307XG4gICAgT2JqZWN0LmtleXMocnVsZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBpdGVtID0gcnVsZXNbbmFtZV07XG4gICAgICBfdGhpcy5ydWxlc1tuYW1lXSA9IEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtIDogW2l0ZW1dO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5tZXNzYWdlcyA9IGZ1bmN0aW9uIG1lc3NhZ2VzKF9tZXNzYWdlcykge1xuICAgIGlmIChfbWVzc2FnZXMpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2VzID0gZGVlcE1lcmdlKG5ld01lc3NhZ2VzKCksIF9tZXNzYWdlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VzO1xuICB9O1xuXG4gIF9wcm90by52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHNvdXJjZV8sIG8sIG9jKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAobyA9PT0gdm9pZCAwKSB7XG4gICAgICBvID0ge307XG4gICAgfVxuXG4gICAgaWYgKG9jID09PSB2b2lkIDApIHtcbiAgICAgIG9jID0gZnVuY3Rpb24gb2MoKSB7fTtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlID0gc291cmNlXztcbiAgICB2YXIgb3B0aW9ucyA9IG87XG4gICAgdmFyIGNhbGxiYWNrID0gb2M7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucnVsZXMgfHwgT2JqZWN0LmtleXModGhpcy5ydWxlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzb3VyY2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXBsZXRlKHJlc3VsdHMpIHtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciBmaWVsZHMgPSB7fTtcblxuICAgICAgZnVuY3Rpb24gYWRkKGUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgICAgICB2YXIgX2Vycm9ycztcblxuICAgICAgICAgIGVycm9ycyA9IChfZXJyb3JzID0gZXJyb3JzKS5jb25jYXQuYXBwbHkoX2Vycm9ycywgZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFkZChyZXN1bHRzW2ldKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHNvdXJjZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZHMgPSBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKTtcbiAgICAgICAgY2FsbGJhY2soZXJyb3JzLCBmaWVsZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1lc3NhZ2VzKSB7XG4gICAgICB2YXIgbWVzc2FnZXMkMSA9IHRoaXMubWVzc2FnZXMoKTtcblxuICAgICAgaWYgKG1lc3NhZ2VzJDEgPT09IG1lc3NhZ2VzKSB7XG4gICAgICAgIG1lc3NhZ2VzJDEgPSBuZXdNZXNzYWdlcygpO1xuICAgICAgfVxuXG4gICAgICBkZWVwTWVyZ2UobWVzc2FnZXMkMSwgb3B0aW9ucy5tZXNzYWdlcyk7XG4gICAgICBvcHRpb25zLm1lc3NhZ2VzID0gbWVzc2FnZXMkMTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy5tZXNzYWdlcyA9IHRoaXMubWVzc2FnZXMoKTtcbiAgICB9XG5cbiAgICB2YXIgc2VyaWVzID0ge307XG4gICAgdmFyIGtleXMgPSBvcHRpb25zLmtleXMgfHwgT2JqZWN0LmtleXModGhpcy5ydWxlcyk7XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uICh6KSB7XG4gICAgICB2YXIgYXJyID0gX3RoaXMyLnJ1bGVzW3pdO1xuICAgICAgdmFyIHZhbHVlID0gc291cmNlW3pdO1xuICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgdmFyIHJ1bGUgPSByO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcnVsZS50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpZiAoc291cmNlID09PSBzb3VyY2VfKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBfZXh0ZW5kcyh7fSwgc291cmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWx1ZSA9IHNvdXJjZVt6XSA9IHJ1bGUudHJhbnNmb3JtKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJ1bGUgPSB7XG4gICAgICAgICAgICB2YWxpZGF0b3I6IHJ1bGVcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJ1bGUgPSBfZXh0ZW5kcyh7fSwgcnVsZSk7XG4gICAgICAgIH0gLy8gRmlsbCB2YWxpZGF0b3IuIFNraXAgaWYgbm90aGluZyBuZWVkIHRvIHZhbGlkYXRlXG5cblxuICAgICAgICBydWxlLnZhbGlkYXRvciA9IF90aGlzMi5nZXRWYWxpZGF0aW9uTWV0aG9kKHJ1bGUpO1xuXG4gICAgICAgIGlmICghcnVsZS52YWxpZGF0b3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBydWxlLmZpZWxkID0gejtcbiAgICAgICAgcnVsZS5mdWxsRmllbGQgPSBydWxlLmZ1bGxGaWVsZCB8fCB6O1xuICAgICAgICBydWxlLnR5cGUgPSBfdGhpczIuZ2V0VHlwZShydWxlKTtcbiAgICAgICAgc2VyaWVzW3pdID0gc2VyaWVzW3pdIHx8IFtdO1xuICAgICAgICBzZXJpZXNbel0ucHVzaCh7XG4gICAgICAgICAgcnVsZTogcnVsZSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZmllbGQ6IHpcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgZXJyb3JGaWVsZHMgPSB7fTtcbiAgICByZXR1cm4gYXN5bmNNYXAoc2VyaWVzLCBvcHRpb25zLCBmdW5jdGlvbiAoZGF0YSwgZG9JdCkge1xuICAgICAgdmFyIHJ1bGUgPSBkYXRhLnJ1bGU7XG4gICAgICB2YXIgZGVlcCA9IChydWxlLnR5cGUgPT09ICdvYmplY3QnIHx8IHJ1bGUudHlwZSA9PT0gJ2FycmF5JykgJiYgKHR5cGVvZiBydWxlLmZpZWxkcyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHJ1bGUuZGVmYXVsdEZpZWxkID09PSAnb2JqZWN0Jyk7XG4gICAgICBkZWVwID0gZGVlcCAmJiAocnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBkYXRhLnZhbHVlKTtcbiAgICAgIHJ1bGUuZmllbGQgPSBkYXRhLmZpZWxkO1xuXG4gICAgICBmdW5jdGlvbiBhZGRGdWxsRmllbGQoa2V5LCBzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzY2hlbWEsIHtcbiAgICAgICAgICBmdWxsRmllbGQ6IHJ1bGUuZnVsbEZpZWxkICsgXCIuXCIgKyBrZXksXG4gICAgICAgICAgZnVsbEZpZWxkczogcnVsZS5mdWxsRmllbGRzID8gW10uY29uY2F0KHJ1bGUuZnVsbEZpZWxkcywgW2tleV0pIDogW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNiKGUpIHtcbiAgICAgICAgaWYgKGUgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGUgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBlcnJvckxpc3QgPSBBcnJheS5pc0FycmF5KGUpID8gZSA6IFtlXTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMuc3VwcHJlc3NXYXJuaW5nICYmIGVycm9yTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICBTY2hlbWEud2FybmluZygnYXN5bmMtdmFsaWRhdG9yOicsIGVycm9yTGlzdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3JMaXN0Lmxlbmd0aCAmJiBydWxlLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVycm9yTGlzdCA9IFtdLmNvbmNhdChydWxlLm1lc3NhZ2UpO1xuICAgICAgICB9IC8vIEZpbGwgZXJyb3IgaW5mb1xuXG5cbiAgICAgICAgdmFyIGZpbGxlZEVycm9ycyA9IGVycm9yTGlzdC5tYXAoY29tcGxlbWVudEVycm9yKHJ1bGUsIHNvdXJjZSkpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmZpcnN0ICYmIGZpbGxlZEVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICBlcnJvckZpZWxkc1tydWxlLmZpZWxkXSA9IDE7XG4gICAgICAgICAgcmV0dXJuIGRvSXQoZmlsbGVkRXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGVlcCkge1xuICAgICAgICAgIGRvSXQoZmlsbGVkRXJyb3JzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiBydWxlIGlzIHJlcXVpcmVkIGJ1dCB0aGUgdGFyZ2V0IG9iamVjdFxuICAgICAgICAgIC8vIGRvZXMgbm90IGV4aXN0IGZhaWwgYXQgdGhlIHJ1bGUgbGV2ZWwgYW5kIGRvbid0XG4gICAgICAgICAgLy8gZ28gZGVlcGVyXG4gICAgICAgICAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgIWRhdGEudmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChydWxlLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBmaWxsZWRFcnJvcnMgPSBbXS5jb25jYXQocnVsZS5tZXNzYWdlKS5tYXAoY29tcGxlbWVudEVycm9yKHJ1bGUsIHNvdXJjZSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmVycm9yKSB7XG4gICAgICAgICAgICAgIGZpbGxlZEVycm9ycyA9IFtvcHRpb25zLmVycm9yKHJ1bGUsIGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnJlcXVpcmVkLCBydWxlLmZpZWxkKSldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZG9JdChmaWxsZWRFcnJvcnMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBmaWVsZHNTY2hlbWEgPSB7fTtcblxuICAgICAgICAgIGlmIChydWxlLmRlZmF1bHRGaWVsZCkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGF0YS52YWx1ZSkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgZmllbGRzU2NoZW1hW2tleV0gPSBydWxlLmRlZmF1bHRGaWVsZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpZWxkc1NjaGVtYSA9IF9leHRlbmRzKHt9LCBmaWVsZHNTY2hlbWEsIGRhdGEucnVsZS5maWVsZHMpO1xuICAgICAgICAgIHZhciBwYXJlZEZpZWxkc1NjaGVtYSA9IHt9O1xuICAgICAgICAgIE9iamVjdC5rZXlzKGZpZWxkc1NjaGVtYSkuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgICAgIHZhciBmaWVsZFNjaGVtYSA9IGZpZWxkc1NjaGVtYVtmaWVsZF07XG4gICAgICAgICAgICB2YXIgZmllbGRTY2hlbWFMaXN0ID0gQXJyYXkuaXNBcnJheShmaWVsZFNjaGVtYSkgPyBmaWVsZFNjaGVtYSA6IFtmaWVsZFNjaGVtYV07XG4gICAgICAgICAgICBwYXJlZEZpZWxkc1NjaGVtYVtmaWVsZF0gPSBmaWVsZFNjaGVtYUxpc3QubWFwKGFkZEZ1bGxGaWVsZC5iaW5kKG51bGwsIGZpZWxkKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIHNjaGVtYSA9IG5ldyBTY2hlbWEocGFyZWRGaWVsZHNTY2hlbWEpO1xuICAgICAgICAgIHNjaGVtYS5tZXNzYWdlcyhvcHRpb25zLm1lc3NhZ2VzKTtcblxuICAgICAgICAgIGlmIChkYXRhLnJ1bGUub3B0aW9ucykge1xuICAgICAgICAgICAgZGF0YS5ydWxlLm9wdGlvbnMubWVzc2FnZXMgPSBvcHRpb25zLm1lc3NhZ2VzO1xuICAgICAgICAgICAgZGF0YS5ydWxlLm9wdGlvbnMuZXJyb3IgPSBvcHRpb25zLmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjaGVtYS52YWxpZGF0ZShkYXRhLnZhbHVlLCBkYXRhLnJ1bGUub3B0aW9ucyB8fCBvcHRpb25zLCBmdW5jdGlvbiAoZXJycykge1xuICAgICAgICAgICAgdmFyIGZpbmFsRXJyb3JzID0gW107XG5cbiAgICAgICAgICAgIGlmIChmaWxsZWRFcnJvcnMgJiYgZmlsbGVkRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBmaW5hbEVycm9ycy5wdXNoLmFwcGx5KGZpbmFsRXJyb3JzLCBmaWxsZWRFcnJvcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJycyAmJiBlcnJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBmaW5hbEVycm9ycy5wdXNoLmFwcGx5KGZpbmFsRXJyb3JzLCBlcnJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9JdChmaW5hbEVycm9ycy5sZW5ndGggPyBmaW5hbEVycm9ycyA6IG51bGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciByZXM7XG5cbiAgICAgIGlmIChydWxlLmFzeW5jVmFsaWRhdG9yKSB7XG4gICAgICAgIHJlcyA9IHJ1bGUuYXN5bmNWYWxpZGF0b3IocnVsZSwgZGF0YS52YWx1ZSwgY2IsIGRhdGEuc291cmNlLCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAocnVsZS52YWxpZGF0b3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXMgPSBydWxlLnZhbGlkYXRvcihydWxlLCBkYXRhLnZhbHVlLCBjYiwgZGF0YS5zb3VyY2UsIG9wdGlvbnMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnNvbGUuZXJyb3IoZXJyb3IpOyAvLyByZXRocm93IHRvIHJlcG9ydCBlcnJvclxuXG4gICAgICAgICAgaWYgKCFvcHRpb25zLnN1cHByZXNzVmFsaWRhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNiKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNiKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICAgIGNiKHR5cGVvZiBydWxlLm1lc3NhZ2UgPT09ICdmdW5jdGlvbicgPyBydWxlLm1lc3NhZ2UocnVsZS5mdWxsRmllbGQgfHwgcnVsZS5maWVsZCkgOiBydWxlLm1lc3NhZ2UgfHwgKHJ1bGUuZnVsbEZpZWxkIHx8IHJ1bGUuZmllbGQpICsgXCIgZmFpbHNcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBjYihyZXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY2IocmVzLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXMgJiYgcmVzLnRoZW4pIHtcbiAgICAgICAgcmVzLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjYigpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBjYihlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIGNvbXBsZXRlKHJlc3VsdHMpO1xuICAgIH0sIHNvdXJjZSk7XG4gIH07XG5cbiAgX3Byb3RvLmdldFR5cGUgPSBmdW5jdGlvbiBnZXRUeXBlKHJ1bGUpIHtcbiAgICBpZiAocnVsZS50eXBlID09PSB1bmRlZmluZWQgJiYgcnVsZS5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICBydWxlLnR5cGUgPSAncGF0dGVybic7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBydWxlLnZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJyAmJiBydWxlLnR5cGUgJiYgIXZhbGlkYXRvcnMuaGFzT3duUHJvcGVydHkocnVsZS50eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdCgnVW5rbm93biBydWxlIHR5cGUgJXMnLCBydWxlLnR5cGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcnVsZS50eXBlIHx8ICdzdHJpbmcnO1xuICB9O1xuXG4gIF9wcm90by5nZXRWYWxpZGF0aW9uTWV0aG9kID0gZnVuY3Rpb24gZ2V0VmFsaWRhdGlvbk1ldGhvZChydWxlKSB7XG4gICAgaWYgKHR5cGVvZiBydWxlLnZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHJ1bGUudmFsaWRhdG9yO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocnVsZSk7XG4gICAgdmFyIG1lc3NhZ2VJbmRleCA9IGtleXMuaW5kZXhPZignbWVzc2FnZScpO1xuXG4gICAgaWYgKG1lc3NhZ2VJbmRleCAhPT0gLTEpIHtcbiAgICAgIGtleXMuc3BsaWNlKG1lc3NhZ2VJbmRleCwgMSk7XG4gICAgfVxuXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmIGtleXNbMF0gPT09ICdyZXF1aXJlZCcpIHtcbiAgICAgIHJldHVybiB2YWxpZGF0b3JzLnJlcXVpcmVkO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3JzW3RoaXMuZ2V0VHlwZShydWxlKV0gfHwgdW5kZWZpbmVkO1xuICB9O1xuXG4gIHJldHVybiBTY2hlbWE7XG59KCk7XG5cblNjaGVtYS5yZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKHR5cGUsIHZhbGlkYXRvcikge1xuICBpZiAodHlwZW9mIHZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZ2lzdGVyIGEgdmFsaWRhdG9yIGJ5IHR5cGUsIHZhbGlkYXRvciBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFsaWRhdG9yc1t0eXBlXSA9IHZhbGlkYXRvcjtcbn07XG5cblNjaGVtYS53YXJuaW5nID0gd2FybmluZztcblNjaGVtYS5tZXNzYWdlcyA9IG1lc3NhZ2VzO1xuU2NoZW1hLnZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzO1xuXG5leHBvcnQgeyBTY2hlbWEgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLWVkaXRhYmxlXCI+XHJcbiAgICA8ZGl2IHYtaWY9XCIhZWRpdGluZyB8fCBkaXNhYmxlZFwiIGNsYXNzPVwiZnMtZWRpdGFibGUtaW5uZXIgZnMtZWRpdGFibGUtcG9pbnRlclwiIHYtYmluZD1cImFjdGl2ZVRyaWdnZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZzLWVkaXRhYmxlLWlucHV0XCI+XHJcbiAgICAgICAgPGRpdiB2LWlmPVwiZGlydHlcIiBjbGFzcz1cImZzLWVkaXRhYmxlLWRpcnR5XCIgLz5cclxuICAgICAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IHYtaWY9XCJ0cmlnZ2VyICYmICFkaXNhYmxlZFwiIGNsYXNzPVwiZnMtZWRpdGFibGUtYWN0aW9uIGZzLWVkaXRhYmxlLWljb25cIj5cclxuICAgICAgICA8ZnMtaWNvbiA6aWNvbj1cInVpLmljb25zLmVkaXRcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiB2LWVsc2UgY2xhc3M9XCJmcy1lZGl0YWJsZS1pbm5lclwiIDpjbGFzcz1cInsgJ2ZzLXZhbGlkYXRlLWVycm9yJzogaGFzRXJyb3IoKSB9XCIgQGtleWRvd249XCJvbktleWRvd25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZzLWVkaXRhYmxlLWlucHV0XCI+XHJcbiAgICAgICAgPHNsb3QgbmFtZT1cImVkaXRcIj48L3Nsb3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtZWRpdGFibGUtYWN0aW9uXCI+XHJcbiAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS50b29sdGlwLm5hbWVcIj5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnRvb2x0aXAuY29udGVudF0+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3ItaWNvblwiPlxyXG4gICAgICAgICAgICAgIHt7IGdldFZhbGlkYXRlRXJyb3JNZXNzYWdlKCkgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnRvb2x0aXAudHJpZ2dlcl0+XHJcbiAgICAgICAgICAgIDxmcy1pY29uIDpjbGFzcz1cInsgaGlkZGVuOiAhaGFzRXJyb3IoKSwgJ2Vycm9yLWljb24nOiB0cnVlIH1cIiBzaXplPVwibWluaVwiIDppY29uPVwidWkuaWNvbnMuaW5mb1wiIC8+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2hvd1N1Ym1pdEFjdGlvblwiPlxyXG4gICAgICAgICAgPGZzLWljb24gdi1pZj1cImxvYWRpbmdcIiBzaXplPVwibWluaVwiIDpzcGluPVwidHJ1ZVwiIDppY29uPVwidWkuaWNvbnMucmVmcmVzaFwiIC8+XHJcbiAgICAgICAgICA8ZnMtaWNvbiB2LWVsc2Ugc2l6ZT1cIm1pbmlcIiA6aWNvbj1cInVpLmljb25zLmNoZWNrXCIgQGNsaWNrPVwiZG9TdWJtaXRcIiAvPlxyXG4gICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgPGZzLWljb24gdi1pZj1cInNob3dDYW5jZWxBY3Rpb25cIiA6Y2xhc3M9XCJ7IGhpZGRlbjogbG9hZGluZyB9XCIgc2l6ZT1cIm1pbmlcIiA6aWNvbj1cInVpLmljb25zLmNsb3NlXCIgQGNsaWNrPVwiZG9DYW5jZWxcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiQGZhc3QtY3J1ZC91aS1pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tIFwidnVlXCI7XHJcblxyXG50eXBlIEZzRWRpdGFibGVQcm9wcyA9IHtcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgZWRpdGluZzogYm9vbGVhbjtcclxuICBkaXJ0eT86IGJvb2xlYW47XHJcbiAgdHJpZ2dlcj86IFwib25DbGlja1wiIHwgXCJvbkRiQ2xpY2tcIiB8IGZhbHNlO1xyXG4gIGxvYWRpbmc/OiBib29sZWFuO1xyXG4gIHNob3dBY3Rpb24/OiBib29sZWFuIHwgeyBzdWJtaXQ/OiBib29sZWFuOyBjYW5jZWw/OiBib29sZWFuIH07XHJcbiAgc3VibWl0T25FbnRlcj86IGJvb2xlYW47XHJcbiAgdmFsaWRhdGVFcnJvcnM/OiBhbnlbXTtcclxufTtcclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoZGVmaW5lUHJvcHM8RnNFZGl0YWJsZVByb3BzPigpLCB7XHJcbiAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gIGVkaXRpbmc6IGZhbHNlLFxyXG4gIGRpcnR5OiBmYWxzZSxcclxuICBsb2FkaW5nOiBmYWxzZSxcclxuICBzaG93QWN0aW9uOiB0cnVlLFxyXG4gIHN1Ym1pdE9uRW50ZXI6IGZhbHNlLFxyXG4gIHRyaWdnZXI6IFwib25DbGlja1wiLFxyXG4gIHZhbGlkYXRlRXJyb3JzOiAoKSA9PiB7XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG59KTtcclxuXHJcbmNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbmNvbnN0IGVtaXRzID0gZGVmaW5lRW1pdHMoW1widXBkYXRlOmVkaXRpbmdcIiwgXCJzdWJtaXRcIiwgXCJjYW5jZWxcIl0pO1xyXG5jb25zdCBhY3RpdmVUcmlnZ2VyID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmICghcHJvcHMudHJpZ2dlcikge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuICByZXR1cm4ge1xyXG4gICAgW3Byb3BzLnRyaWdnZXJdOiAoKSA9PiB7XHJcbiAgICAgIGVtaXRzKFwidXBkYXRlOmVkaXRpbmdcIiwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfTtcclxufSk7XHJcbmNvbnN0IHNob3dTdWJtaXRBY3Rpb24gPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIHByb3BzLnNob3dBY3Rpb24gIT09IGZhbHNlICYmICh0eXBlb2YgcHJvcHMuc2hvd0FjdGlvbiAhPT0gXCJvYmplY3RcIiB8fCBwcm9wcy5zaG93QWN0aW9uLnN1Ym1pdCAhPT0gZmFsc2UpO1xyXG59KTtcclxuY29uc3Qgc2hvd0NhbmNlbEFjdGlvbiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gcHJvcHMuc2hvd0FjdGlvbiAhPT0gZmFsc2UgJiYgKHR5cGVvZiBwcm9wcy5zaG93QWN0aW9uICE9PSBcIm9iamVjdFwiIHx8IHByb3BzLnNob3dBY3Rpb24uY2FuY2VsICE9PSBmYWxzZSk7XHJcbn0pO1xyXG5mdW5jdGlvbiBkb1N1Ym1pdCgpIHtcclxuICBlbWl0cyhcInN1Ym1pdFwiKTtcclxufVxyXG5mdW5jdGlvbiBkb0NhbmNlbCgpIHtcclxuICBlbWl0cyhcImNhbmNlbFwiKTtcclxufVxyXG5mdW5jdGlvbiBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICBpZiAoXHJcbiAgICAhcHJvcHMuc3VibWl0T25FbnRlciB8fFxyXG4gICAgcHJvcHMubG9hZGluZyB8fFxyXG4gICAgZXZlbnQua2V5ICE9PSBcIkVudGVyXCIgfHxcclxuICAgIGV2ZW50LmlzQ29tcG9zaW5nIHx8XHJcbiAgICBldmVudC5hbHRLZXkgfHxcclxuICAgIGV2ZW50LmN0cmxLZXkgfHxcclxuICAgIGV2ZW50Lm1ldGFLZXkgfHxcclxuICAgIGV2ZW50LnNoaWZ0S2V5IHx8XHJcbiAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50XHJcbiAgKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgZG9TdWJtaXQoKTtcclxufVxyXG5mdW5jdGlvbiBoYXNFcnJvcigpIHtcclxuICByZXR1cm4gcHJvcHMudmFsaWRhdGVFcnJvcnM/Lmxlbmd0aCA+IDA7XHJcbn1cclxuZnVuY3Rpb24gZ2V0VmFsaWRhdGVFcnJvck1lc3NhZ2UoKSB7XHJcbiAgaWYgKHByb3BzLnZhbGlkYXRlRXJyb3JzPy5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgcmV0dXJuIHByb3BzLnZhbGlkYXRlRXJyb3JzPy5tYXAoKGl0ZW0pID0+IGl0ZW0ubWVzc2FnZSkuam9pbihcIixcIik7XHJcbn1cclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLWVkaXRhYmxlIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgLmZzLWVkaXRhYmxlLXBvaW50ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIH1cclxuICAuZnMtZWRpdGFibGUtaW5uZXIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIG1pbi1oZWlnaHQ6IDIzcHg7XHJcbiAgICAuZnMtZWRpdGFibGUtZGlydHkge1xyXG4gICAgICBib3JkZXItcmFkaXVzOiAxMDBweDtcclxuICAgICAgd2lkdGg6IDVweDtcclxuICAgICAgaGVpZ2h0OiA1cHg7XHJcbiAgICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xyXG4gICAgICBiYWNrZ3JvdW5kOiByZWQ7XHJcbiAgICB9XHJcbiAgICAuZnMtZWRpdGFibGUtaW5wdXQge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgfVxyXG4gICAgLmZzLWVkaXRhYmxlLWFjdGlvbiB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xyXG4gICAgICBpLFxyXG4gICAgICAuYW50aWNvbiB7XHJcbiAgICAgICAgd2lkdGg6IDIwcHg7XHJcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIH1cclxuICAgICAgLmhpZGRlbiB7XHJcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLmZzLWVkaXRhYmxlLWljb24ge1xyXG4gICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XHJcbiAgICB9XHJcbiAgICAmOmhvdmVyIC5mcy1lZGl0YWJsZS1pY29uIHtcclxuICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcclxuICAgIH1cclxuXHJcbiAgICAuZWwtcmFkaW8ge1xyXG4gICAgICBtYXJnaW4tcmlnaHQ6IDVweDtcclxuICAgICAgLmVsLXJhZGlvX19sYWJlbCB7XHJcbiAgICAgICAgcGFkZGluZzogMnB4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgJi5mcy12YWxpZGF0ZS1lcnJvciB7XHJcbiAgICAgIC5lcnJvci1pY29uIHtcclxuICAgICAgICBjb2xvcjogI2ZmNGQ0ZjtcclxuICAgICAgfVxyXG4gICAgICAuYW50LWlucHV0LWFmZml4LXdyYXBwZXIge1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogI2ZmNGQ0ZjtcclxuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiKDI1NSAzOCA1IC8gNiUpO1xyXG4gICAgICB9XHJcbiAgICAgIC5lbC1pbnB1dF9fd3JhcHBlciB7XHJcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAjZmY0ZDRmICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMXB4ICNmZjRkNGYgaW5zZXQgIWltcG9ydGFudDtcclxuICAgICAgfVxyXG4gICAgICAubi1pbnB1dCAubi1pbnB1dF9fc3RhdGUtYm9yZGVyIHtcclxuICAgICAgICBib3JkZXItY29sb3I6ICNmZjRkNGYgIWltcG9ydGFudDtcclxuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiKDI1NSAzOCA1IC8gNiUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZnMtYWN0aW9uYmFyXCI+XHJcbiAgICA8dGVtcGxhdGUgdi1mb3I9XCIodmFsdWUsIGtleSkgaW4gY29tcHV0ZWRCdXR0b25zXCIgOmtleT1cImtleVwiPlxyXG4gICAgICA8ZnMtYnV0dG9uIHYtaWY9XCJ2YWx1ZS5zaG93ICE9PSBmYWxzZVwiIHYtYmluZD1cInZhbHVlXCIgQGNsaWNrPVwib25DbGljayhrZXksIHZhbHVlLCAkZXZlbnQpXCIgLz5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgY29tcHV0ZWQsIFJlZiB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgc29ydEJ5IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgQWN0aW9uYmFyQ2xpY2tFdmVudCwgQnV0dG9uc1Byb3BzIH0gZnJvbSBcIi4uLy4uL2RcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc0FjdGlvbmJhclwiLFxyXG4gIHByb3BzOiB7XHJcbiAgICAvKipcclxuICAgICAqIOaMiemSrumFjee9rlxyXG4gICAgICoge1xyXG4gICAgICogIGFkZDp7XHJcbiAgICAgKiAgICAuLi5Gc0J1dHRvbixcclxuICAgICAqICAgIHNob3c6dHJ1ZVxyXG4gICAgICogIH0sXHJcbiAgICAgKiAgY3VzdG9tOnsuLi59XHJcbiAgICAgKiB9XHJcbiAgICAgKi9cclxuICAgIGJ1dHRvbnM6IHt9XHJcbiAgfSBhcyBhbnksXHJcbiAgZW1pdHM6IFtcImFjdGlvblwiXSxcclxuICBzZXR1cChwcm9wcywgY3R4OiBhbnkpIHtcclxuICAgIGZ1bmN0aW9uIG9uQ2xpY2soa2V5OiBhbnksIGJ0bjogYW55LCAkZXZlbnQ6IGFueSkge1xyXG4gICAgICBjb25zdCBlID0geyBrZXksIGJ0biwgJGV2ZW50LCBsb2FkaW5nUmVmOiAkZXZlbnQ/LmxvYWRpbmdSZWYgfTtcclxuICAgICAgaWYgKGJ0bi5jbGljaykge1xyXG4gICAgICAgIGJ0bi5jbGljayhlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGJ0bi5vbkNsaWNrKSB7XHJcbiAgICAgICAgYnRuLm9uQ2xpY2soZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGN0eC5lbWl0KFwiYWN0aW9uXCIsIGUpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zOiBSZWYgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGxldCBzb3J0QXJyID0gW107XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgZm9yIChsZXQga2V5IGluIHByb3BzLmJ1dHRvbnMpIHtcclxuICAgICAgICBzb3J0QXJyLnB1c2goe1xyXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgLi4ucHJvcHMuYnV0dG9uc1trZXldLFxyXG4gICAgICAgICAgX2tleToga2V5XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgc29ydEFyciA9IHNvcnRCeShzb3J0QXJyLCAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBzb3J0ZWRCdXR0b25zOiBCdXR0b25zUHJvcHM8QWN0aW9uYmFyQ2xpY2tFdmVudD4gPSB7fTtcclxuXHJcbiAgICAgIHNvcnRBcnIuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IF9rZXkgPSBpdGVtLl9rZXk7XHJcbiAgICAgICAgZGVsZXRlIGl0ZW0uX2tleTtcclxuICAgICAgICBzb3J0ZWRCdXR0b25zW19rZXldID0gaXRlbTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBzb3J0ZWRCdXR0b25zO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBvbkNsaWNrLFxyXG4gICAgICBjb21wdXRlZEJ1dHRvbnNcclxuICAgIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtYWN0aW9uYmFyIHtcclxuICAvLyBkaXNwbGF5OiBmbGV4O1xyXG4gIC8vIGdhcDogNHB4O1xyXG4gIC5mcy1idXR0b24ge1xyXG4gICAgbWFyZ2luOiAycHg7IC8vIOaNouihjOS5i+WQjuS5n+imgeacieS4gOeCuemXtOmalFxyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLWFjdGlvbmJhclwiPlxyXG4gICAgPHRlbXBsYXRlIHYtZm9yPVwiKHZhbHVlLCBrZXkpIGluIGNvbXB1dGVkQnV0dG9uc1wiIDprZXk9XCJrZXlcIj5cclxuICAgICAgPGZzLWJ1dHRvbiB2LWlmPVwidmFsdWUuc2hvdyAhPT0gZmFsc2VcIiB2LWJpbmQ9XCJ2YWx1ZVwiIEBjbGljaz1cIm9uQ2xpY2soa2V5LCB2YWx1ZSwgJGV2ZW50KVwiIC8+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIGNvbXB1dGVkLCBSZWYgfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IHNvcnRCeSB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IEFjdGlvbmJhckNsaWNrRXZlbnQsIEJ1dHRvbnNQcm9wcyB9IGZyb20gXCIuLi8uLi9kXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNBY3Rpb25iYXJcIixcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDmjInpkq7phY3nva5cclxuICAgICAqIHtcclxuICAgICAqICBhZGQ6e1xyXG4gICAgICogICAgLi4uRnNCdXR0b24sXHJcbiAgICAgKiAgICBzaG93OnRydWVcclxuICAgICAqICB9LFxyXG4gICAgICogIGN1c3RvbTp7Li4ufVxyXG4gICAgICogfVxyXG4gICAgICovXHJcbiAgICBidXR0b25zOiB7fVxyXG4gIH0gYXMgYW55LFxyXG4gIGVtaXRzOiBbXCJhY3Rpb25cIl0sXHJcbiAgc2V0dXAocHJvcHMsIGN0eDogYW55KSB7XHJcbiAgICBmdW5jdGlvbiBvbkNsaWNrKGtleTogYW55LCBidG46IGFueSwgJGV2ZW50OiBhbnkpIHtcclxuICAgICAgY29uc3QgZSA9IHsga2V5LCBidG4sICRldmVudCwgbG9hZGluZ1JlZjogJGV2ZW50Py5sb2FkaW5nUmVmIH07XHJcbiAgICAgIGlmIChidG4uY2xpY2spIHtcclxuICAgICAgICBidG4uY2xpY2soZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChidG4ub25DbGljaykge1xyXG4gICAgICAgIGJ0bi5vbkNsaWNrKGUpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjdHguZW1pdChcImFjdGlvblwiLCBlKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbXB1dGVkQnV0dG9uczogUmVmID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBsZXQgc29ydEFyciA9IFtdO1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGZvciAobGV0IGtleSBpbiBwcm9wcy5idXR0b25zKSB7XHJcbiAgICAgICAgc29ydEFyci5wdXNoKHtcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgIC4uLnByb3BzLmJ1dHRvbnNba2V5XSxcclxuICAgICAgICAgIF9rZXk6IGtleVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBpdGVtLm9yZGVyID8/IENvbnN0YW50cy5vcmRlckRlZmF1bHQ7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3Qgc29ydGVkQnV0dG9uczogQnV0dG9uc1Byb3BzPEFjdGlvbmJhckNsaWNrRXZlbnQ+ID0ge307XHJcblxyXG4gICAgICBzb3J0QXJyLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBfa2V5ID0gaXRlbS5fa2V5O1xyXG4gICAgICAgIGRlbGV0ZSBpdGVtLl9rZXk7XHJcbiAgICAgICAgc29ydGVkQnV0dG9uc1tfa2V5XSA9IGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gc29ydGVkQnV0dG9ucztcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgb25DbGljayxcclxuICAgICAgY29tcHV0ZWRCdXR0b25zXHJcbiAgICB9O1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLWFjdGlvbmJhciB7XHJcbiAgLy8gZGlzcGxheTogZmxleDtcclxuICAvLyBnYXA6IDRweDtcclxuICAuZnMtYnV0dG9uIHtcclxuICAgIG1hcmdpbjogMnB4OyAvLyDmjaLooYzkuYvlkI7kuZ/opoHmnInkuIDngrnpl7TpmpRcclxuICB9XHJcbn1cclxuPC9zdHlsZT5cclxuIixudWxsLG51bGwsIjx0ZW1wbGF0ZT5cclxuICA8IS0tIOeugOWNleaooeW8jyAtLT5cclxuICA8dGVtcGxhdGUgdi1pZj1cIm1vZGUgPT09ICdzaW1wbGUnXCI+XHJcbiAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCIgY2xhc3M9XCJmcy10YWJsZS1jb2x1bW5zLWZpbHRlci1zaW1wbGVcIj5cclxuICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgIDppcz1cInVpLmNvbC5uYW1lXCJcclxuICAgICAgICB2LWZvcj1cIihlbGVtZW50LCBrZXkpIGluIGN1cnJlbnRDb2x1bW5zXCJcclxuICAgICAgICB2LXNob3c9XCJvcmlnaW5hbFtlbGVtZW50LmtleV0/Ll9fc2hvdyAhPT0gZmFsc2VcIlxyXG4gICAgICAgIDprZXk9XCJrZXlcIlxyXG4gICAgICAgIDpzcGFuPVwiNlwiXHJcbiAgICAgID5cclxuICAgICAgICA8Y29tcG9uZW50XHJcbiAgICAgICAgICA6aXM9XCJ1aS5jaGVja2JveC5uYW1lXCJcclxuICAgICAgICAgIHYtbW9kZWw6W3VpLmNoZWNrYm94Lm1vZGVsVmFsdWVdPVwiZWxlbWVudC5zaG93XCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cIm9yaWdpbmFsW2VsZW1lbnQua2V5XT8uX19kaXNhYmxlZCA9PT0gdHJ1ZVwiXHJcbiAgICAgICAgICBjbGFzcz1cIml0ZW0tbGFiZWxcIlxyXG4gICAgICAgICAgOnRpdGxlPVwiYnVpbGRUZXh0KGVsZW1lbnQpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBidWlsZFRleHQoZWxlbWVudCkgfX1cclxuICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICA8L2NvbXBvbmVudD5cclxuICAgIDxjb21wb25lbnQgOmlzPVwidWkuZGl2aWRlci5uYW1lXCIgLz5cclxuICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIj5cclxuICAgICAgPGZzLWJ1dHRvblxyXG4gICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA1cHhcIlxyXG4gICAgICAgIHR5cGU9XCJwcmltYXJ5XCJcclxuICAgICAgICA6aWNvbj1cInVpLmljb25zLmNoZWNrXCJcclxuICAgICAgICA6dGV4dD1cIl90ZXh0LmNvbmZpcm1cIlxyXG4gICAgICAgIEBjbGljaz1cInNpbXBsZVN1Ym1pdCgpXCJcclxuICAgICAgLz5cclxuICAgICAgPGZzLWJ1dHRvbiA6aWNvbj1cInVpLmljb25zLnJlZnJlc2hcIiA6dGV4dD1cIl90ZXh0LnJlc2V0XCIgQGNsaWNrPVwic2ltcGxlUmVzZXRcIiAvPlxyXG4gICAgPC9jb21wb25lbnQ+XHJcbiAgPC90ZW1wbGF0ZT5cclxuICA8IS0tIOWujOWFqOaooeW8jyAtLT5cclxuXHJcbiAgPGNvbXBvbmVudCA6aXM9XCJjb250YWluZXI/LmlzIHx8ICdmcy1jb2x1bW5zLWZpbHRlci1sYXlvdXQtZGVmYXVsdCdcIiB2LWVsc2Ugdi1iaW5kPVwiY29udGFpbmVyXCI+XHJcbiAgICA8dGVtcGxhdGUgI2J1dHRvbnM+XHJcbiAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiBjbGFzcz1cImZzLWRyYXdlci1mb290ZXJcIiA6Z3V0dGVyPVwiMTBcIj5cclxuICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmNvbC5uYW1lXCIgOnNwYW49XCIxMlwiPlxyXG4gICAgICAgICAgPGZzLWJ1dHRvbiA6aWNvbj1cInVpLmljb25zLnJlZnJlc2hcIiA6dGV4dD1cIl90ZXh0LnJlc2V0XCIgYmxvY2sgQGNsaWNrPVwicmVzZXRcIiAvPlxyXG4gICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuY29sLm5hbWVcIiA6c3Bhbj1cIjEyXCI+XHJcbiAgICAgICAgICA8ZnMtYnV0dG9uIHR5cGU9XCJwcmltYXJ5XCIgOmljb249XCJ1aS5pY29ucy5jaGVja1wiIDp0ZXh0PVwiX3RleHQuY29uZmlybVwiIGJsb2NrIEBjbGljaz1cInN1Ym1pdChmYWxzZSlcIiAvPlxyXG4gICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICA8L2NvbXBvbmVudD5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgPC9jb21wb25lbnQ+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiIHNldHVwPlxyXG4vKipcclxuICogRnNUYWJsZUNvbHVtbnNGaWx0ZXLvvIzliJforr7nva7nu4Tku7ZcclxuICovXHJcbmltcG9ydCB7IG9taXQsIGZvckVhY2gsIHBpY2sgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCBUYWJsZVN0b3JlIGZyb20gXCIuLi8uLi8uLi91dGlscy91dGlsLnN0b3JlXCI7XHJcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vLi4vbG9jYWxlXCI7XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBpbmplY3QsIG5leHRUaWNrLCBwcm92aWRlLCBSZWYsIHJlZiwgd2F0Y2ggfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IHVpQ29udGV4dCB9IGZyb20gXCIuLi8uLi8uLi91aVwiO1xyXG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi8uLi91c2UvdXNlLW1lcmdlXCI7XHJcbmltcG9ydCB7IHVzZVJvdXRlIH0gZnJvbSBcInZ1ZS1yb3V0ZXJcIjtcclxuaW1wb3J0IHtcclxuICBDb2x1bW5Qcm9wcyxcclxuICBDb2x1bW5zRmlsdGVyQ29tcG9uZW50UHJvcHMsXHJcbiAgQ29sdW1uc0ZpbHRlckl0ZW0sXHJcbiAgQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXksXHJcbiAgVGFibGVDb2x1bW5zUHJvcHNcclxufSBmcm9tIFwiLi4vLi4vLi4vZFwiO1xyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoZGVmaW5lUHJvcHM8Q29sdW1uc0ZpbHRlckNvbXBvbmVudFByb3BzPigpLCB7XHJcbiAgc3RvcmFnZTogdHJ1ZSxcclxuICBtb2RlOiBcImRlZmF1bHRcIixcclxuICBjb250YWluZXI6ICgpID0+IHtcclxuICAgIHJldHVybiB7IGlzOiBcImZzLWNvbHVtbnMtZmlsdGVyLWxheW91dC1kZWZhdWx0XCIgfTtcclxuICB9XHJcbn0pO1xyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoW1widXBkYXRlOmNvbHVtbnNcIiwgXCJ1cGRhdGU6c2hvd1wiLCBcInJlc2V0XCIsIFwic3VibWl0XCJdKTtcclxuXHJcbmNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xyXG5jb25zdCB1aSA9IHVpQ29udGV4dC5nZXQoKTtcclxuY29uc3QgYWN0aXZlID0gcmVmKGZhbHNlKTtcclxuY29uc3Qgc3RhcnQgPSAoKSA9PiB7XHJcbiAgYWN0aXZlLnZhbHVlID0gdHJ1ZTtcclxufTtcclxuXHJcbi8vIOaVsOe7hOW9ouW8j+eahOWOn+Wni3RyZWVcclxuY29uc3Qgb3JpZ2luYWw6IFJlZjxDb2x1bW5zRmlsdGVySXRlbVtdPiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gdHJhbnNmb3JtQ29sdW1uc1RyZWUocHJvcHMub3JpZ2luYWxDb2x1bW5zKTtcclxufSk7XHJcbi8v5pWw57uE5b2i5byP55qEdHJlZVxyXG5jb25zdCBjdXJyZW50Q29sdW1uczogUmVmPENvbHVtbnNGaWx0ZXJJdGVtW10+ID0gcmVmKFtdKTtcclxuXHJcbmNvbnN0IG9yaWdpbmFsQ29sdW1uc01hcDogUmVmPFJlY29yZDxzdHJpbmcsIENvbHVtbnNGaWx0ZXJJdGVtPj4gPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBDb2x1bW5zRmlsdGVySXRlbT4gPSB7fTtcclxuICBlYWNoVHJlZShvcmlnaW5hbC52YWx1ZSwgKGl0ZW06IENvbHVtbnNGaWx0ZXJJdGVtKSA9PiB7XHJcbiAgICBtYXBbaXRlbS5fX2tleV0gPSBpdGVtO1xyXG4gIH0pO1xyXG4gIHJldHVybiBtYXA7XHJcbn0pO1xyXG5jb25zdCB7IG1lcmdlLCBjbG9uZURlZXAgfSA9IHVzZU1lcmdlKCk7XHJcblxyXG5jb25zdCBfdGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBkZWYgPSB7XHJcbiAgICB0aXRsZTogdChcImZzLnRvb2xiYXIuY29sdW1uRmlsdGVyLnRpdGxlXCIpLFxyXG4gICAgZml4ZWQ6IHQoXCJmcy50b29sYmFyLmNvbHVtbkZpbHRlci5maXhlZFwiKSxcclxuICAgIG9yZGVyOiB0KFwiZnMudG9vbGJhci5jb2x1bW5GaWx0ZXIub3JkZXJcIiksXHJcbiAgICByZXNldDogdChcImZzLnRvb2xiYXIuY29sdW1uRmlsdGVyLnJlc2V0XCIpLFxyXG4gICAgY29uZmlybTogdChcImZzLnRvb2xiYXIuY29sdW1uRmlsdGVyLmNvbmZpcm1cIiksXHJcbiAgICB1bm5hbWVkOiB0KFwiZnMudG9vbGJhci5jb2x1bW5GaWx0ZXIudW5uYW1lZFwiKVxyXG4gIH07XHJcbiAgbWVyZ2UoZGVmLCBwcm9wcy50ZXh0KTtcclxuICByZXR1cm4gZGVmO1xyXG59KTtcclxuXHJcbmZ1bmN0aW9uIGVhY2hUcmVlKHRyZWU6IGFueSwgY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XHJcbiAgaWYgKCF0cmVlKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG4gIGlmIChBcnJheS5pc0FycmF5KHRyZWUpKSB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdHJlZSkge1xyXG4gICAgICBjYWxsYmFjayhpdGVtKTtcclxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgICBlYWNoVHJlZShpdGVtLmNoaWxkcmVuLCBjYWxsYmFjayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdHJlZSkge1xyXG4gICAgICBjb25zdCBpdGVtID0gdHJlZVtrZXldO1xyXG4gICAgICBjYWxsYmFjayhpdGVtKTtcclxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgICBlYWNoVHJlZShpdGVtLmNoaWxkcmVuLCBjYWxsYmFjayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IF9fa2V5cyA9IFtcIl9fc2hvd1wiLCBcIl9fZGlzYWJsZWRcIiwgXCJfX3BhcmVudFwiLCBcIl9fa2V5XCIsIFwiX190aXRsZVwiXTtcclxuZnVuY3Rpb24gYnVpbGRDb2x1bW5GaWx0ZXJJdGVtKGl0ZW06IENvbHVtblByb3BzKTogQ29sdW1uc0ZpbHRlckl0ZW0ge1xyXG4gIHJldHVybiB7XHJcbiAgICBrZXk6IGl0ZW0ua2V5LFxyXG4gICAgdGl0bGU6IGl0ZW0udGl0bGUsXHJcbiAgICBmaXhlZDogaXRlbS5maXhlZCA/PyBmYWxzZSxcclxuICAgIHNob3c6IGl0ZW0uc2hvdyA/PyB0cnVlLFxyXG4gICAgX19zaG93OiBpdGVtLmNvbHVtblNldFNob3cgIT09IGZhbHNlLFxyXG4gICAgX19kaXNhYmxlZDogaXRlbS5jb2x1bW5TZXREaXNhYmxlZCA/PyBmYWxzZSxcclxuICAgIF9fdGl0bGU6IGl0ZW0uY29sdW1uU2V0VGl0bGVcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiB0cmFuc2Zvcm1Ub1RhYmxlQ29sdW1ucyhyZXN1bHQ6IENvbHVtbnNGaWx0ZXJJdGVtW10pIHtcclxuICBjb25zdCBjb2x1bW5zOiBUYWJsZUNvbHVtbnNQcm9wcyA9IHt9O1xyXG4gIGZvckVhY2gocmVzdWx0LCAoaXRlbSkgPT4ge1xyXG4gICAgY29uc3QgY29sdW1uOiBDb2x1bW5Qcm9wcyA9IG9taXQoaXRlbSwgXCJjaGlsZHJlblwiLCAuLi5fX2tleXMpO1xyXG4gICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbHVtbi5jaGlsZHJlbiA9IHRyYW5zZm9ybVRvVGFibGVDb2x1bW5zKGl0ZW0uY2hpbGRyZW4pO1xyXG4gICAgfVxyXG4gICAgY29sdW1uc1tpdGVtLmtleV0gPSBjb2x1bW47XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGNvbHVtbnM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRyYW5zZm9ybUNvbHVtbnNUcmVlKHZhbHVlOiBUYWJsZUNvbHVtbnNQcm9wcywgcGFyZW50PzogQ29sdW1uc0ZpbHRlckl0ZW0pOiBDb2x1bW5zRmlsdGVySXRlbVtdIHtcclxuICBjb25zdCBjb2x1bW5zOiBDb2x1bW5zRmlsdGVySXRlbVtdID0gW107XHJcbiAgZm9yRWFjaCh2YWx1ZSwgKGl0ZW0pID0+IHtcclxuICAgIGNvbnN0IGNvbHVtbiA9IGJ1aWxkQ29sdW1uRmlsdGVySXRlbShpdGVtKTtcclxuICAgIGNvbHVtbi5fX3BhcmVudCA9IHBhcmVudDtcclxuICAgIGNvbHVtbi5fX2tleSA9IGAke3BhcmVudD8ua2V5IHx8IFwiXCJ9LiR7aXRlbS5rZXl9YDtcclxuICAgIGNvbHVtbnMucHVzaChjb2x1bW4pO1xyXG4gICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgY29sdW1uLmNoaWxkcmVuID0gdHJhbnNmb3JtQ29sdW1uc1RyZWUoaXRlbS5jaGlsZHJlbiwgY29sdW1uKTtcclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gY29sdW1ucztcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0Q3VycmVudFZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICBjdXJyZW50Q29sdW1ucy52YWx1ZSA9IHRyYW5zZm9ybUNvbHVtbnNUcmVlKHZhbHVlKTtcclxufVxyXG5cclxuLy8g6L+Y5Y6fXHJcbmFzeW5jIGZ1bmN0aW9uIHJlc2V0KCkge1xyXG4gIGN1cnJlbnRDb2x1bW5zLnZhbHVlID0gdHJhbnNmb3JtQ29sdW1uc1RyZWUocHJvcHMub3JpZ2luYWxDb2x1bW5zKTtcclxuICBhd2FpdCBkb19zYXZlKHRydWUpO1xyXG4gIGF3YWl0IGNsZWFyVGhpc1N0b3JhZ2UoKTtcclxuICBlbWl0KFwicmVzZXRcIik7XHJcbn1cclxuXHJcbi8vIOehruiupFxyXG5hc3luYyBmdW5jdGlvbiBkb19zYXZlKG5vU2F2ZSA9IGZhbHNlKSB7XHJcbiAgaWYgKCFub1NhdmUpIHtcclxuICAgIGF3YWl0IHNhdmVPcHRpb25zVG9TdG9yYWdlKGN1cnJlbnRDb2x1bW5zLnZhbHVlKTtcclxuICB9XHJcbiAgY29uc3QgcmVzdWx0ID0gY2xvbmVEZWVwKGN1cnJlbnRDb2x1bW5zLnZhbHVlKTtcclxuXHJcbiAgLy/op6PlhrNuYWl2ZSB1aeS4juWIl+iuvue9ruWGsueqgeeahOmXrumimFxyXG4gIGVhY2hUcmVlKHJlc3VsdCwgKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgaWYgKGl0ZW0pIHtcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoaXRlbSkpIHtcclxuICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJfX1wiKSkge1xyXG4gICAgICAgICAgZGVsZXRlIGl0ZW1ba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgZG9FbWl0KHJlc3VsdCk7XHJcbiAgYWN0aXZlLnZhbHVlID0gZmFsc2U7XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gc3VibWl0KG5vU2F2ZSA9IGZhbHNlKSB7XHJcbiAgY29uc3QgY29sdW1ucyA9IGF3YWl0IGRvX3NhdmUobm9TYXZlKTtcclxuICBlbWl0KFwic3VibWl0XCIsIHsgY29sdW1ucyB9KTtcclxufVxyXG5jb25zdCBjb21wdXRlZE9yaWdpbmFsQ29sdW1ucyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gcHJvcHMub3JpZ2luYWxDb2x1bW5zO1xyXG59KTtcclxucHJvdmlkZShDb2x1bW5zRmlsdGVyUHJvdmlkZUtleSwge1xyXG4gIG9yaWdpbmFsQ29sdW1uczogY29tcHV0ZWRPcmlnaW5hbENvbHVtbnMsXHJcbiAgb3JpZ2luYWxDb2x1bW5zTWFwOiBvcmlnaW5hbENvbHVtbnNNYXAsXHJcbiAgY3VycmVudENvbHVtbnMsXHJcbiAgdGV4dDogX3RleHQsXHJcbiAgYWN0aXZlLFxyXG4gIHN1Ym1pdCxcclxuICByZXNldFxyXG59KTtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHNpbXBsZVN1Ym1pdCgpIHtcclxuICBhd2FpdCBzdWJtaXQoZmFsc2UpO1xyXG4gIGVtaXQoXCJ1cGRhdGU6c2hvd1wiLCBmYWxzZSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gc2ltcGxlUmVzZXQoKSB7XHJcbiAgYXdhaXQgcmVzZXQoKTtcclxuICBlbWl0KFwidXBkYXRlOnNob3dcIiwgZmFsc2UpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkb0VtaXQocmVzdWx0OiBDb2x1bW5zRmlsdGVySXRlbVtdKSB7XHJcbiAgZW1pdChcInVwZGF0ZTpjb2x1bW5zXCIsIHRyYW5zZm9ybVRvVGFibGVDb2x1bW5zKHJlc3VsdCkpO1xyXG59XHJcblxyXG5jb25zdCBnZXRDcnVkQmluZGluZyA9IGluamVjdChcImdldDpjcnVkQmluZGluZ1wiLCAoKSA9PiB7XHJcbiAgcmV0dXJuIHsgaWQ6IFwiXCIgfTtcclxufSk7XHJcblxyXG5jb25zdCBzdG9yYWdlVGFibGVTdG9yZSA9IHJlZigpO1xyXG5mdW5jdGlvbiBnZXRTdG9yYWdlVGFibGUoKSB7XHJcbiAgLy9wcm9wcy5zdG9yYWdl5piv5ZCm5a6e546w5LqGQ29sdW1uRmlsdGVyU3RvcmFnZSDmjqXlj6NcclxuICBjb25zdCByZW1vdGVTdG9yYWdlID0gdHlwZW9mIHByb3BzLnN0b3JhZ2UgPT09IFwib2JqZWN0XCIgPyBwcm9wcy5zdG9yYWdlIDogbnVsbDtcclxuICBjb25zdCBrZXlUeXBlID0gdHlwZW9mIHByb3BzLnN0b3JhZ2UgPT09IFwic3RyaW5nXCIgPyBwcm9wcy5zdG9yYWdlIDogXCJcIjtcclxuICBpZiAoc3RvcmFnZVRhYmxlU3RvcmUudmFsdWUgPT0gbnVsbCkge1xyXG4gICAgY29uc3Qgcm91dGUgPSB1c2VSb3V0ZSgpO1xyXG4gICAgc3RvcmFnZVRhYmxlU3RvcmUudmFsdWUgPSBuZXcgVGFibGVTdG9yZSh7XHJcbiAgICAgICRyb3V0ZXI6IHJvdXRlLFxyXG4gICAgICB0YWJsZU5hbWU6IFwiY29sdW1uc0ZpbHRlclwiLFxyXG4gICAgICBrZXlUeXBlOiBrZXlUeXBlLFxyXG4gICAgICByZW1vdGVTdG9yYWdlXHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcmFnZVRhYmxlU3RvcmUudmFsdWUuaWQgPSBnZXRDcnVkQmluZGluZygpLmlkO1xyXG4gIHJldHVybiBzdG9yYWdlVGFibGVTdG9yZS52YWx1ZTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gc2F2ZU9wdGlvbnNUb1N0b3JhZ2UodmFsdWU6IGFueSkge1xyXG4gIGlmIChwcm9wcy5zdG9yYWdlID09PSBmYWxzZSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBjb25zdCBzdG9yZWRPcHRpb25zOiBhbnkgPSBjbG9uZURlZXAodmFsdWUpO1xyXG4gIC8v5Yig6ZmkcGFyZW505byV55SoXHJcbiAgZWFjaFRyZWUoc3RvcmVkT3B0aW9ucywgKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgZGVsZXRlIGl0ZW0uX19wYXJlbnQ7XHJcbiAgfSk7XHJcblxyXG4gIGF3YWl0IGdldFN0b3JhZ2VUYWJsZSgpLnVwZGF0ZVRhYmxlVmFsdWUoc3RvcmVkT3B0aW9ucyk7XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnNGcm9tU3RvcmFnZSgpIHtcclxuICBpZiAocHJvcHMuc3RvcmFnZSA9PT0gZmFsc2UpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgcmV0dXJuIGF3YWl0IGdldFN0b3JhZ2VUYWJsZSgpLmdldFRhYmxlVmFsdWUoKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBjbGVhclRoaXNTdG9yYWdlKCkge1xyXG4gIGF3YWl0IGdldFN0b3JhZ2VUYWJsZSgpLmNsZWFyVGFibGVWYWx1ZSgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRDb2x1bW5zSGFzaChjb2x1bW5zOiBhbnkpIHtcclxuICBjb25zdCBrZXlzOiBhbnkgPSBbXTtcclxuICBlYWNoVHJlZShjb2x1bW5zLCAoaXRlbTogYW55KSA9PiB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBwaWNrKGl0ZW0sIFwia2V5XCIsIFwiX19zaG93XCIsIFwiX19kaXNhYmxlZFwiKTtcclxuICAgIGtleXMucHVzaChKU09OLnN0cmluZ2lmeSh0YXJnZXQpKTtcclxuICB9KTtcclxuICBrZXlzLnNvcnQoKTtcclxuICBsZXQgaGFzaCA9IFwiXCI7XHJcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG4gICAgaGFzaCArPSBrZXk7XHJcbiAgfVxyXG4gIHJldHVybiBoYXNoO1xyXG59XHJcbndhdGNoKFxyXG4gICgpID0+IHtcclxuICAgIHJldHVybiBwcm9wcy5jb2x1bW5zO1xyXG4gIH0sXHJcbiAgKHZhbHVlKSA9PiB7XHJcbiAgICBzZXRDdXJyZW50VmFsdWUodmFsdWUpO1xyXG4gIH1cclxuKTtcclxuXHJcbmNvbnN0IGluaXQgPSBhc3luYyAoKSA9PiB7XHJcbiAgc2V0Q3VycmVudFZhbHVlKHByb3BzLmNvbHVtbnMpO1xyXG4gIGNvbnN0IHN0b3JlZE9wdGlvbnMgPSBhd2FpdCBnZXRPcHRpb25zRnJvbVN0b3JhZ2UoKTtcclxuICBpZiAoc3RvcmVkT3B0aW9ucykge1xyXG4gICAgY29uc3Qgc3RvcmVIYXNoID0gZ2V0Q29sdW1uc0hhc2goc3RvcmVkT3B0aW9ucyk7XHJcbiAgICBjb25zdCBvcHRpb25IYXNoID0gZ2V0Q29sdW1uc0hhc2gob3JpZ2luYWwudmFsdWUpO1xyXG4gICAgaWYgKG9wdGlvbkhhc2ggIT09IHN0b3JlSGFzaCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcImNvbHVtbnMgY2hhbmdlZCwgaWdub3JlIGxvY2FsIHN0b3JhZ2VcIik7XHJcbiAgICAgIC8vIOWmguaenOWtl+auteWIl+aciei/h+S/ruaUue+8jOWImeS4jeS9v+eUqOacrOWcsOiuvue9rlxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjdXJyZW50Q29sdW1ucy52YWx1ZSA9IHN0b3JlZE9wdGlvbnM7XHJcbiAgICBhd2FpdCBuZXh0VGljaygpO1xyXG4gICAgYXdhaXQgc3VibWl0KHRydWUpO1xyXG4gIH1cclxufTtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZShjaGFuZ2U6IChjdXJyZW50Q29sdW1uczogUmVmPENvbHVtbnNGaWx0ZXJJdGVtW10+KSA9PiBQcm9taXNlPHZvaWQ+KSB7XHJcbiAgYXdhaXQgY2hhbmdlKGN1cnJlbnRDb2x1bW5zKTtcclxuICBhd2FpdCBkb19zYXZlKCk7XHJcbn1cclxuXHJcbndhdGNoKFxyXG4gICgpID0+IHtcclxuICAgIHJldHVybiBvcmlnaW5hbC52YWx1ZTtcclxuICB9LFxyXG4gIGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgYXdhaXQgaW5pdCgpO1xyXG4gIH0sXHJcbiAge1xyXG4gICAgaW1tZWRpYXRlOiB0cnVlXHJcbiAgfVxyXG4pO1xyXG5cclxuZGVmaW5lRXhwb3NlKHtcclxuICBzdGFydCxcclxuICBzYXZlOiBkb19zYXZlLFxyXG4gIHVwZGF0ZSxcclxuICBvcmlnaW5hbCxcclxuICBjb2x1bW5zOiBjdXJyZW50Q29sdW1uc1xyXG59KTtcclxuXHJcbmZ1bmN0aW9uIGJ1aWxkVGV4dChlbGVtZW50OiBhbnkpIHtcclxuICByZXR1cm4gZWxlbWVudC5fX3RpdGxlIHx8IGVsZW1lbnQubGFiZWwgfHwgZWxlbWVudC50aXRsZSB8fCBlbGVtZW50LmtleSB8fCBfdGV4dC52YWx1ZS51bm5hbWVkO1xyXG59XHJcbjwvc2NyaXB0PlxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyLXNpbXBsZSB7XHJcbiAgbWluLXdpZHRoOiA3NjBweDtcclxuICBwYWRkaW5nLXRvcDogMjBweDtcclxufVxyXG5cclxuLmZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyIHtcclxuICA6Zm9jdXMge1xyXG4gICAgb3V0bGluZTogMDtcclxuICB9XHJcblxyXG4gIFtmbGV4fj1cImNyb3NzOmNlbnRlclwiXSB7XHJcbiAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICB9XHJcblxyXG4gIFtmbGV4fj1cIm1haW46anVzdGlmeVwiXSB7XHJcbiAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5O1xyXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gIH1cclxuXHJcbiAgW2ZsZXhdIHtcclxuICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICB9XHJcblxyXG4gIFtmbGV4LWJveD1cIjFcIl0ge1xyXG4gICAgZmxleC1ncm93OiAxO1xyXG4gICAgZmxleC1zaHJpbms6IDE7XHJcbiAgfVxyXG5cclxuICBbZmxleF0gPiAqIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgfVxyXG5cclxuICAuZWwtZHJhd2VyX19ib2R5IHtcclxuICAgIGhlaWdodDogMDtcclxuICB9XHJcblxyXG4gIC5mcy1kcmF3ZXItd3JhcHBlciB7XHJcbiAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgb3ZlcmZsb3cteTogYXV0bztcclxuICB9XHJcblxyXG4gIC5mcy1kcmF3ZXItZm9vdGVyIHtcclxuICAgIHBhZGRpbmc6IDIwcHg7XHJcbiAgfVxyXG5cclxuICAuY29tcG9uZW50LS1saXN0IHtcclxuICAgIG1hcmdpbjogLTIwcHg7XHJcblxyXG4gICAgLml0ZW0tbGFiZWwge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgICBtaW4td2lkdGg6IDA7XHJcblxyXG4gICAgICAuYW50LWNoZWNrYm94ICsgc3BhbiB7XHJcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAuaXRlbS1yaWdodCB7XHJcbiAgICAgIGZsZXgtc2hyaW5rOiAxO1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgfVxyXG5cclxuICAgIC50aXRsZSB7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIH1cclxuXHJcbiAgICAuY29tcG9uZW50LS1saXN0LWl0ZW0ge1xyXG4gICAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgICBtYXJnaW4tYm90dG9tOiAxcHg7XHJcblxyXG4gICAgICAmLmdob3N0IHtcclxuICAgICAgICBvcGFjaXR5OiAwLjU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICY6bGFzdC1jaGlsZCB7XHJcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAuY29tcG9uZW50LS1saXN0LWl0ZW0taGFuZGxlIHtcclxuICAgICAgICBtYXJnaW4tbGVmdDogMTBweDtcclxuICAgICAgICBjdXJzb3I6IG1vdmU7XHJcblxyXG4gICAgICAgICYuZGlzYWJsZWQge1xyXG4gICAgICAgICAgb3BhY2l0eTogMC4zO1xyXG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLXRvb2xiYXJcIj5cclxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBrZXkpIG9mIGNvbXB1dGVkQnV0dG9uc1wiIDprZXk9XCJrZXlcIj5cclxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpdGVtLnNob3cgIT09IGZhbHNlXCI+XHJcbiAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgOmlzPVwidWkucG9wb3Zlci5uYW1lXCJcclxuICAgICAgICAgIHYtaWY9XCJrZXkgPT09ICdjb2x1bW5zJyAmJiBjb2x1bW5zRmlsdGVyICYmIGNvbHVtbnNGaWx0ZXI/Lm1vZGUgPT09ICdzaW1wbGUnXCJcclxuICAgICAgICAgIHYtbW9kZWw6W3VpLnBvcG92ZXIudmlzaWJsZV09XCJwb3BvdmVyVmlzaWJsZVwiXHJcbiAgICAgICAgICBkaXNwbGF5LWRpcmVjdGl2ZT1cInNob3dcIlxyXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcclxuICAgICAgICAgIDp3aWR0aD1cIjc2MFwiXHJcbiAgICAgICAgICB0cmlnZ2VyPVwiY2xpY2tcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnBvcG92ZXIudHJpZ2dlclNsb3ROYW1lXT5cclxuICAgICAgICAgICAgPGZzLWJ1dHRvbiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrPVwiaGFuZGxlU2ltcGxlQ2xpY2tcIiAvPlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnBvcG92ZXIuY29udGVudFNsb3ROYW1lXT5cclxuICAgICAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgICAgIDppcz1cImNvbHVtbnNGaWx0ZXIuaXMgfHwgJ2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyJ1wiXHJcbiAgICAgICAgICAgICAgdi1pZj1cImNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIHJlZj1cImNvbHVtbnNGaWx0ZXJSZWZcIlxyXG4gICAgICAgICAgICAgIHYtbW9kZWw6c2hvdz1cInBvcG92ZXJWaXNpYmxlXCJcclxuICAgICAgICAgICAgICBtb2RlPVwic2ltcGxlXCJcclxuICAgICAgICAgICAgICB2LWJpbmQ9XCJjb2x1bW5zRmlsdGVyXCJcclxuICAgICAgICAgICAgICA6Y29sdW1ucz1cImNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIDpzdG9yYWdlPVwic3RvcmFnZVwiXHJcbiAgICAgICAgICAgICAgQHVwZGF0ZTpjb2x1bW5zPVwiJGVtaXQoJ3VwZGF0ZTpjb2x1bW5zJywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgIDxmcy1idXR0b24gdi1lbHNlIHYtYmluZD1cIml0ZW1cIiBAY2xpY2s9XCJpdGVtLmNsaWNrKCRldmVudClcIiAvPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDxjb21wb25lbnRcclxuICAgICAgOmlzPVwiY29sdW1uc0ZpbHRlci5pcyB8fCAnZnMtdGFibGUtY29sdW1ucy1maWx0ZXInXCJcclxuICAgICAgdi1pZj1cImNvbHVtbnMgJiYgY29sdW1uc0ZpbHRlcj8ubW9kZSAhPT0gJ3NpbXBsZSdcIlxyXG4gICAgICByZWY9XCJjb2x1bW5zRmlsdGVyUmVmXCJcclxuICAgICAgOnN0b3JhZ2U9XCJzdG9yYWdlXCJcclxuICAgICAgdi1iaW5kPVwiY29sdW1uc0ZpbHRlclwiXHJcbiAgICAgIDpjb2x1bW5zPVwiY29sdW1uc1wiXHJcbiAgICAgIEB1cGRhdGU6Y29sdW1ucz1cIiRlbWl0KCd1cGRhdGU6Y29sdW1ucycsICRldmVudClcIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCBGc1RhYmxlQ29sdW1uc0ZpbHRlciBmcm9tIFwiLi9mcy10YWJsZS1jb2x1bW5zLWZpbHRlci9pbmRleC52dWVcIjtcclxuaW1wb3J0IHsgc29ydEJ5IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBQcm9wVHlwZSwgcmVmLCBSZWYgfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBCdXR0b25Qcm9wcywgQnV0dG9uc1Byb3BzLCBUYWJsZUNvbHVtbnNQcm9wcyB9IGZyb20gXCIuLi8uLi9kXCI7XHJcbmltcG9ydCB7IHVzZU1lcmdlLCB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcclxuLyoqXHJcbiAqIOW3peWFt+adoVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzVG9vbGJhclwiLFxyXG4gIGNvbXBvbmVudHM6IHsgRnNUYWJsZUNvbHVtbnNGaWx0ZXIgfSxcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDmjInpkq7phY3nva5cclxuICAgICAqe1xyXG4gICAgICogICBzZWFyY2g6e30sIOafpeivolxyXG4gICAgICogICByZWZyZXNoOnt9LCDliLfmlrBcclxuICAgICAqICAgY29tcGFjdDp7fSwg57Sn5YeR5qih5byPXHJcbiAgICAgKiAgIGV4cG9ydDp7fSwg5a+85Ye6XHJcbiAgICAgKiAgIGNvbHVtbnM6e30g5YiX6K6+572uXHJcbiAgICAgKn1cclxuICAgICAqKi9cclxuICAgIGJ1dHRvbnM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPliY3mmK/lkKbntKflh5HmqKHlvI9cclxuICAgICAqL1xyXG4gICAgY29tcGFjdDoge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiB0cnVlXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDliJfphY3nva5cclxuICAgICAqL1xyXG4gICAgY29sdW1uczoge1xyXG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8VGFibGVDb2x1bW5zUHJvcHM+LFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuS/neWtmOeUqOaIt+WIl+iuvue9rlxyXG4gICAgICog5Lygc3RyaW5n5YiZ6KGo56S65Lyg5YWl57yT5a2Y55qE5Li7a2V5XHJcbiAgICAgKi9cclxuICAgIHN0b3JhZ2U6IHtcclxuICAgICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0sXHJcbiAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaPkuanvVxyXG4gICAgICovXHJcbiAgICBzbG90czoge30sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJforr7nva7phY3nva5cclxuICAgICAqL1xyXG4gICAgY29sdW1uc0ZpbHRlcjoge1xyXG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8YW55PlxyXG4gICAgfVxyXG4gIH0sXHJcbiAgZW1pdHM6IFtcInVwZGF0ZTpjb2x1bW5zXCJdLFxyXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eCkge1xyXG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XHJcbiAgICBjb25zdCBjb2x1bW5zRmlsdGVyUmVmOiBSZWYgPSByZWYoKTtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xyXG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBkZWZhdWx0QnV0dG9uczogQnV0dG9uc1Byb3BzPHZvaWQ+ID0ge1xyXG4gICAgICAgIGNvbHVtbnM6IHtcclxuICAgICAgICAgIGNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbHVtbnNGaWx0ZXJSZWYudmFsdWUuc3RhcnQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBtZXJnZShkZWZhdWx0QnV0dG9ucywgcHJvcHMuYnV0dG9ucyk7XHJcbiAgICAgIC8vIGlmIChkZWZhdWx0QnV0dG9ucy5zZWFyY2gpIHtcclxuICAgICAgLy8gICBkZWZhdWx0QnV0dG9ucy5zZWFyY2gudHlwZSA9IHByb3BzLnNlYXJjaCA/IFwicHJpbWFyeVwiIDogXCJkZWZhdWx0XCI7XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gaWYgKGRlZmF1bHRCdXR0b25zLmNvbXBhY3QpIHtcclxuICAgICAgLy8gICBkZWZhdWx0QnV0dG9ucy5jb21wYWN0LnR5cGUgPSBwcm9wcy5jb21wYWN0ID8gXCJwcmltYXJ5XCIgOiBcImRlZmF1bHRcIjtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgbGV0IHNvcnRBcnI6IEJ1dHRvblByb3BzW10gPSBbXTtcclxuICAgICAgZm9yIChsZXQgZGVmYXVsdEJ1dHRvbnNLZXkgaW4gZGVmYXVsdEJ1dHRvbnMpIHtcclxuICAgICAgICBzb3J0QXJyLnB1c2goe1xyXG4gICAgICAgICAgLi4uZGVmYXVsdEJ1dHRvbnNbZGVmYXVsdEJ1dHRvbnNLZXldLFxyXG4gICAgICAgICAgX2tleTogZGVmYXVsdEJ1dHRvbnNLZXlcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBzb3J0QXJyID0gc29ydEJ5KHNvcnRBcnIsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBzb3J0ZWRCdXR0b25zOiBCdXR0b25zUHJvcHM8dm9pZD4gPSB7fTtcclxuXHJcbiAgICAgIHNvcnRBcnIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGxldCBfa2V5ID0gaXRlbS5fa2V5O1xyXG4gICAgICAgIGRlbGV0ZSBpdGVtLl9rZXk7XHJcbiAgICAgICAgc29ydGVkQnV0dG9uc1tfa2V5XSA9IGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gc29ydGVkQnV0dG9ucztcclxuICAgIH0pO1xyXG4gICAgY29uc3QgcG9wb3ZlclZpc2libGUgPSByZWYoZmFsc2UpO1xyXG4gICAgY29uc3QgaGFuZGxlU2ltcGxlQ2xpY2sgPSAoJGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmICh1aS50eXBlID09PSBcImVsZW1lbnRcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBwb3BvdmVyVmlzaWJsZS52YWx1ZSA9ICFwb3BvdmVyVmlzaWJsZS52YWx1ZTtcclxuICAgIH07XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1aSxcclxuICAgICAgY29sdW1uc0ZpbHRlclJlZixcclxuICAgICAgY29tcHV0ZWRCdXR0b25zLFxyXG4gICAgICBwb3BvdmVyVmlzaWJsZSxcclxuICAgICAgaGFuZGxlU2ltcGxlQ2xpY2tcclxuICAgIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtdG9vbGJhciB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuXHJcbiAgLmZzLWJ1dHRvbiB7XHJcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLXRvb2xiYXJcIj5cclxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBrZXkpIG9mIGNvbXB1dGVkQnV0dG9uc1wiIDprZXk9XCJrZXlcIj5cclxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpdGVtLnNob3cgIT09IGZhbHNlXCI+XHJcbiAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgOmlzPVwidWkucG9wb3Zlci5uYW1lXCJcclxuICAgICAgICAgIHYtaWY9XCJrZXkgPT09ICdjb2x1bW5zJyAmJiBjb2x1bW5zRmlsdGVyICYmIGNvbHVtbnNGaWx0ZXI/Lm1vZGUgPT09ICdzaW1wbGUnXCJcclxuICAgICAgICAgIHYtbW9kZWw6W3VpLnBvcG92ZXIudmlzaWJsZV09XCJwb3BvdmVyVmlzaWJsZVwiXHJcbiAgICAgICAgICBkaXNwbGF5LWRpcmVjdGl2ZT1cInNob3dcIlxyXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcclxuICAgICAgICAgIDp3aWR0aD1cIjc2MFwiXHJcbiAgICAgICAgICB0cmlnZ2VyPVwiY2xpY2tcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnBvcG92ZXIudHJpZ2dlclNsb3ROYW1lXT5cclxuICAgICAgICAgICAgPGZzLWJ1dHRvbiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrPVwiaGFuZGxlU2ltcGxlQ2xpY2tcIiAvPlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnBvcG92ZXIuY29udGVudFNsb3ROYW1lXT5cclxuICAgICAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgICAgIDppcz1cImNvbHVtbnNGaWx0ZXIuaXMgfHwgJ2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyJ1wiXHJcbiAgICAgICAgICAgICAgdi1pZj1cImNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIHJlZj1cImNvbHVtbnNGaWx0ZXJSZWZcIlxyXG4gICAgICAgICAgICAgIHYtbW9kZWw6c2hvdz1cInBvcG92ZXJWaXNpYmxlXCJcclxuICAgICAgICAgICAgICBtb2RlPVwic2ltcGxlXCJcclxuICAgICAgICAgICAgICB2LWJpbmQ9XCJjb2x1bW5zRmlsdGVyXCJcclxuICAgICAgICAgICAgICA6Y29sdW1ucz1cImNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIDpzdG9yYWdlPVwic3RvcmFnZVwiXHJcbiAgICAgICAgICAgICAgQHVwZGF0ZTpjb2x1bW5zPVwiJGVtaXQoJ3VwZGF0ZTpjb2x1bW5zJywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgIDxmcy1idXR0b24gdi1lbHNlIHYtYmluZD1cIml0ZW1cIiBAY2xpY2s9XCJpdGVtLmNsaWNrKCRldmVudClcIiAvPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDxjb21wb25lbnRcclxuICAgICAgOmlzPVwiY29sdW1uc0ZpbHRlci5pcyB8fCAnZnMtdGFibGUtY29sdW1ucy1maWx0ZXInXCJcclxuICAgICAgdi1pZj1cImNvbHVtbnMgJiYgY29sdW1uc0ZpbHRlcj8ubW9kZSAhPT0gJ3NpbXBsZSdcIlxyXG4gICAgICByZWY9XCJjb2x1bW5zRmlsdGVyUmVmXCJcclxuICAgICAgOnN0b3JhZ2U9XCJzdG9yYWdlXCJcclxuICAgICAgdi1iaW5kPVwiY29sdW1uc0ZpbHRlclwiXHJcbiAgICAgIDpjb2x1bW5zPVwiY29sdW1uc1wiXHJcbiAgICAgIEB1cGRhdGU6Y29sdW1ucz1cIiRlbWl0KCd1cGRhdGU6Y29sdW1ucycsICRldmVudClcIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCBGc1RhYmxlQ29sdW1uc0ZpbHRlciBmcm9tIFwiLi9mcy10YWJsZS1jb2x1bW5zLWZpbHRlci9pbmRleC52dWVcIjtcclxuaW1wb3J0IHsgc29ydEJ5IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBQcm9wVHlwZSwgcmVmLCBSZWYgfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBCdXR0b25Qcm9wcywgQnV0dG9uc1Byb3BzLCBUYWJsZUNvbHVtbnNQcm9wcyB9IGZyb20gXCIuLi8uLi9kXCI7XHJcbmltcG9ydCB7IHVzZU1lcmdlLCB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcclxuLyoqXHJcbiAqIOW3peWFt+adoVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzVG9vbGJhclwiLFxyXG4gIGNvbXBvbmVudHM6IHsgRnNUYWJsZUNvbHVtbnNGaWx0ZXIgfSxcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDmjInpkq7phY3nva5cclxuICAgICAqe1xyXG4gICAgICogICBzZWFyY2g6e30sIOafpeivolxyXG4gICAgICogICByZWZyZXNoOnt9LCDliLfmlrBcclxuICAgICAqICAgY29tcGFjdDp7fSwg57Sn5YeR5qih5byPXHJcbiAgICAgKiAgIGV4cG9ydDp7fSwg5a+85Ye6XHJcbiAgICAgKiAgIGNvbHVtbnM6e30g5YiX6K6+572uXHJcbiAgICAgKn1cclxuICAgICAqKi9cclxuICAgIGJ1dHRvbnM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPliY3mmK/lkKbntKflh5HmqKHlvI9cclxuICAgICAqL1xyXG4gICAgY29tcGFjdDoge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiB0cnVlXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDliJfphY3nva5cclxuICAgICAqL1xyXG4gICAgY29sdW1uczoge1xyXG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8VGFibGVDb2x1bW5zUHJvcHM+LFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuS/neWtmOeUqOaIt+WIl+iuvue9rlxyXG4gICAgICog5Lygc3RyaW5n5YiZ6KGo56S65Lyg5YWl57yT5a2Y55qE5Li7a2V5XHJcbiAgICAgKi9cclxuICAgIHN0b3JhZ2U6IHtcclxuICAgICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0sXHJcbiAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaPkuanvVxyXG4gICAgICovXHJcbiAgICBzbG90czoge30sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJforr7nva7phY3nva5cclxuICAgICAqL1xyXG4gICAgY29sdW1uc0ZpbHRlcjoge1xyXG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8YW55PlxyXG4gICAgfVxyXG4gIH0sXHJcbiAgZW1pdHM6IFtcInVwZGF0ZTpjb2x1bW5zXCJdLFxyXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eCkge1xyXG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XHJcbiAgICBjb25zdCBjb2x1bW5zRmlsdGVyUmVmOiBSZWYgPSByZWYoKTtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xyXG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBkZWZhdWx0QnV0dG9uczogQnV0dG9uc1Byb3BzPHZvaWQ+ID0ge1xyXG4gICAgICAgIGNvbHVtbnM6IHtcclxuICAgICAgICAgIGNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbHVtbnNGaWx0ZXJSZWYudmFsdWUuc3RhcnQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBtZXJnZShkZWZhdWx0QnV0dG9ucywgcHJvcHMuYnV0dG9ucyk7XHJcbiAgICAgIC8vIGlmIChkZWZhdWx0QnV0dG9ucy5zZWFyY2gpIHtcclxuICAgICAgLy8gICBkZWZhdWx0QnV0dG9ucy5zZWFyY2gudHlwZSA9IHByb3BzLnNlYXJjaCA/IFwicHJpbWFyeVwiIDogXCJkZWZhdWx0XCI7XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gaWYgKGRlZmF1bHRCdXR0b25zLmNvbXBhY3QpIHtcclxuICAgICAgLy8gICBkZWZhdWx0QnV0dG9ucy5jb21wYWN0LnR5cGUgPSBwcm9wcy5jb21wYWN0ID8gXCJwcmltYXJ5XCIgOiBcImRlZmF1bHRcIjtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgbGV0IHNvcnRBcnI6IEJ1dHRvblByb3BzW10gPSBbXTtcclxuICAgICAgZm9yIChsZXQgZGVmYXVsdEJ1dHRvbnNLZXkgaW4gZGVmYXVsdEJ1dHRvbnMpIHtcclxuICAgICAgICBzb3J0QXJyLnB1c2goe1xyXG4gICAgICAgICAgLi4uZGVmYXVsdEJ1dHRvbnNbZGVmYXVsdEJ1dHRvbnNLZXldLFxyXG4gICAgICAgICAgX2tleTogZGVmYXVsdEJ1dHRvbnNLZXlcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBzb3J0QXJyID0gc29ydEJ5KHNvcnRBcnIsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBzb3J0ZWRCdXR0b25zOiBCdXR0b25zUHJvcHM8dm9pZD4gPSB7fTtcclxuXHJcbiAgICAgIHNvcnRBcnIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGxldCBfa2V5ID0gaXRlbS5fa2V5O1xyXG4gICAgICAgIGRlbGV0ZSBpdGVtLl9rZXk7XHJcbiAgICAgICAgc29ydGVkQnV0dG9uc1tfa2V5XSA9IGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gc29ydGVkQnV0dG9ucztcclxuICAgIH0pO1xyXG4gICAgY29uc3QgcG9wb3ZlclZpc2libGUgPSByZWYoZmFsc2UpO1xyXG4gICAgY29uc3QgaGFuZGxlU2ltcGxlQ2xpY2sgPSAoJGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmICh1aS50eXBlID09PSBcImVsZW1lbnRcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBwb3BvdmVyVmlzaWJsZS52YWx1ZSA9ICFwb3BvdmVyVmlzaWJsZS52YWx1ZTtcclxuICAgIH07XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1aSxcclxuICAgICAgY29sdW1uc0ZpbHRlclJlZixcclxuICAgICAgY29tcHV0ZWRCdXR0b25zLFxyXG4gICAgICBwb3BvdmVyVmlzaWJsZSxcclxuICAgICAgaGFuZGxlU2ltcGxlQ2xpY2tcclxuICAgIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtdG9vbGJhciB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuXHJcbiAgLmZzLWJ1dHRvbiB7XHJcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCIvKiohXG4gKiBTb3J0YWJsZSAxLjE0LjBcbiAqIEBhdXRob3JcdFJ1YmFYYSAgIDx0cmFzaEBydWJheGEub3JnPlxuICogQGF1dGhvclx0b3dlbm0gICAgPG93ZW4yMzM1NUBnbWFpbC5jb20+XG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuXG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSB7XG4gICAgICBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcblxuICB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7XG5cbiAgdmFyIGtleSwgaTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikge1xuICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpO1xufVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gIHJldHVybiBhcnIyO1xufVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG52YXIgdmVyc2lvbiA9IFwiMS4xNC4wXCI7XG5cbmZ1bmN0aW9uIHVzZXJBZ2VudChwYXR0ZXJuKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubmF2aWdhdG9yKSB7XG4gICAgcmV0dXJuICEhIC8qQF9fUFVSRV9fKi9uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKHBhdHRlcm4pO1xuICB9XG59XG5cbnZhciBJRTExT3JMZXNzID0gdXNlckFnZW50KC8oPzpUcmlkZW50LipydlsgOl0/MTFcXC58bXNpZXxpZW1vYmlsZXxXaW5kb3dzIFBob25lKS9pKTtcbnZhciBFZGdlID0gdXNlckFnZW50KC9FZGdlL2kpO1xudmFyIEZpcmVGb3ggPSB1c2VyQWdlbnQoL2ZpcmVmb3gvaSk7XG52YXIgU2FmYXJpID0gdXNlckFnZW50KC9zYWZhcmkvaSkgJiYgIXVzZXJBZ2VudCgvY2hyb21lL2kpICYmICF1c2VyQWdlbnQoL2FuZHJvaWQvaSk7XG52YXIgSU9TID0gdXNlckFnZW50KC9pUChhZHxvZHxob25lKS9pKTtcbnZhciBDaHJvbWVGb3JBbmRyb2lkID0gdXNlckFnZW50KC9jaHJvbWUvaSkgJiYgdXNlckFnZW50KC9hbmRyb2lkL2kpO1xuXG52YXIgY2FwdHVyZU1vZGUgPSB7XG4gIGNhcHR1cmU6IGZhbHNlLFxuICBwYXNzaXZlOiBmYWxzZVxufTtcblxuZnVuY3Rpb24gb24oZWwsIGV2ZW50LCBmbikge1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgIUlFMTFPckxlc3MgJiYgY2FwdHVyZU1vZGUpO1xufVxuXG5mdW5jdGlvbiBvZmYoZWwsIGV2ZW50LCBmbikge1xuICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgIUlFMTFPckxlc3MgJiYgY2FwdHVyZU1vZGUpO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVzKFxuLyoqSFRNTEVsZW1lbnQqL1xuZWwsXG4vKipTdHJpbmcqL1xuc2VsZWN0b3IpIHtcbiAgaWYgKCFzZWxlY3RvcikgcmV0dXJuO1xuICBzZWxlY3RvclswXSA9PT0gJz4nICYmIChzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cmluZygxKSk7XG5cbiAgaWYgKGVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChlbC5tYXRjaGVzKSB7XG4gICAgICAgIHJldHVybiBlbC5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgICAgIH0gZWxzZSBpZiAoZWwubXNNYXRjaGVzU2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVsLm1zTWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIH0gZWxzZSBpZiAoZWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudE9ySG9zdChlbCkge1xuICByZXR1cm4gZWwuaG9zdCAmJiBlbCAhPT0gZG9jdW1lbnQgJiYgZWwuaG9zdC5ub2RlVHlwZSA/IGVsLmhvc3QgOiBlbC5wYXJlbnROb2RlO1xufVxuXG5mdW5jdGlvbiBjbG9zZXN0KFxuLyoqSFRNTEVsZW1lbnQqL1xuZWwsXG4vKipTdHJpbmcqL1xuc2VsZWN0b3IsXG4vKipIVE1MRWxlbWVudCovXG5jdHgsIGluY2x1ZGVDVFgpIHtcbiAgaWYgKGVsKSB7XG4gICAgY3R4ID0gY3R4IHx8IGRvY3VtZW50O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwgJiYgKHNlbGVjdG9yWzBdID09PSAnPicgPyBlbC5wYXJlbnROb2RlID09PSBjdHggJiYgbWF0Y2hlcyhlbCwgc2VsZWN0b3IpIDogbWF0Y2hlcyhlbCwgc2VsZWN0b3IpKSB8fCBpbmNsdWRlQ1RYICYmIGVsID09PSBjdHgpIHtcbiAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWwgPT09IGN0eCkgYnJlYWs7XG4gICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG4gICAgfSB3aGlsZSAoZWwgPSBnZXRQYXJlbnRPckhvc3QoZWwpKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUl9TUEFDRSA9IC9cXHMrL2c7XG5cbmZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGVsLCBuYW1lLCBzdGF0ZSkge1xuICBpZiAoZWwgJiYgbmFtZSkge1xuICAgIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICAgIGVsLmNsYXNzTGlzdFtzdGF0ZSA/ICdhZGQnIDogJ3JlbW92ZSddKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY2xhc3NOYW1lID0gKCcgJyArIGVsLmNsYXNzTmFtZSArICcgJykucmVwbGFjZShSX1NQQUNFLCAnICcpLnJlcGxhY2UoJyAnICsgbmFtZSArICcgJywgJyAnKTtcbiAgICAgIGVsLmNsYXNzTmFtZSA9IChjbGFzc05hbWUgKyAoc3RhdGUgPyAnICcgKyBuYW1lIDogJycpKS5yZXBsYWNlKFJfU1BBQ0UsICcgJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNzcyhlbCwgcHJvcCwgdmFsKSB7XG4gIHZhciBzdHlsZSA9IGVsICYmIGVsLnN0eWxlO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIGlmICh2YWwgPT09IHZvaWQgMCkge1xuICAgICAgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgdmFsID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgJycpO1xuICAgICAgfSBlbHNlIGlmIChlbC5jdXJyZW50U3R5bGUpIHtcbiAgICAgICAgdmFsID0gZWwuY3VycmVudFN0eWxlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvcCA9PT0gdm9pZCAwID8gdmFsIDogdmFsW3Byb3BdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIShwcm9wIGluIHN0eWxlKSAmJiBwcm9wLmluZGV4T2YoJ3dlYmtpdCcpID09PSAtMSkge1xuICAgICAgICBwcm9wID0gJy13ZWJraXQtJyArIHByb3A7XG4gICAgICB9XG5cbiAgICAgIHN0eWxlW3Byb3BdID0gdmFsICsgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gJycgOiAncHgnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF0cml4KGVsLCBzZWxmT25seSkge1xuICB2YXIgYXBwbGllZFRyYW5zZm9ybXMgPSAnJztcblxuICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykge1xuICAgIGFwcGxpZWRUcmFuc2Zvcm1zID0gZWw7XG4gIH0gZWxzZSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHRyYW5zZm9ybSA9IGNzcyhlbCwgJ3RyYW5zZm9ybScpO1xuXG4gICAgICBpZiAodHJhbnNmb3JtICYmIHRyYW5zZm9ybSAhPT0gJ25vbmUnKSB7XG4gICAgICAgIGFwcGxpZWRUcmFuc2Zvcm1zID0gdHJhbnNmb3JtICsgJyAnICsgYXBwbGllZFRyYW5zZm9ybXM7XG4gICAgICB9XG4gICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG5cbiAgICB9IHdoaWxlICghc2VsZk9ubHkgJiYgKGVsID0gZWwucGFyZW50Tm9kZSkpO1xuICB9XG5cbiAgdmFyIG1hdHJpeEZuID0gd2luZG93LkRPTU1hdHJpeCB8fCB3aW5kb3cuV2ViS2l0Q1NTTWF0cml4IHx8IHdpbmRvdy5DU1NNYXRyaXggfHwgd2luZG93Lk1TQ1NTTWF0cml4O1xuICAvKmpzaGludCAtVzA1NiAqL1xuXG4gIHJldHVybiBtYXRyaXhGbiAmJiBuZXcgbWF0cml4Rm4oYXBwbGllZFRyYW5zZm9ybXMpO1xufVxuXG5mdW5jdGlvbiBmaW5kKGN0eCwgdGFnTmFtZSwgaXRlcmF0b3IpIHtcbiAgaWYgKGN0eCkge1xuICAgIHZhciBsaXN0ID0gY3R4LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbiA9IGxpc3QubGVuZ3RoO1xuXG4gICAgaWYgKGl0ZXJhdG9yKSB7XG4gICAgICBmb3IgKDsgaSA8IG47IGkrKykge1xuICAgICAgICBpdGVyYXRvcihsaXN0W2ldLCBpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpIHtcbiAgdmFyIHNjcm9sbGluZ0VsZW1lbnQgPSBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50O1xuXG4gIGlmIChzY3JvbGxpbmdFbGVtZW50KSB7XG4gICAgcmV0dXJuIHNjcm9sbGluZ0VsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBcImJvdW5kaW5nIGNsaWVudCByZWN0XCIgb2YgZ2l2ZW4gZWxlbWVudFxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgICAgICAgICAgICAgICAgICAgICBUaGUgZWxlbWVudCB3aG9zZSBib3VuZGluZ0NsaWVudFJlY3QgaXMgd2FudGVkXG4gKiBAcGFyYW0gIHtbQm9vbGVhbl19IHJlbGF0aXZlVG9Db250YWluaW5nQmxvY2sgIFdoZXRoZXIgdGhlIHJlY3Qgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBjb250YWluaW5nIGJsb2NrIG9mIChpbmNsdWRpbmcpIHRoZSBjb250YWluZXJcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCAgV2hldGhlciB0aGUgcmVjdCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHJlbGF0aXZlIHBhcmVudCBvZiAoaW5jbHVkaW5nKSB0aGUgY29udGFpZW5yXG4gKiBAcGFyYW0gIHtbQm9vbGVhbl19IHVuZG9TY2FsZSAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdGhlIGNvbnRhaW5lcidzIHNjYWxlKCkgc2hvdWxkIGJlIHVuZG9uZVxuICogQHBhcmFtICB7W0hUTUxFbGVtZW50XX0gY29udGFpbmVyICAgICAgICAgICAgICBUaGUgcGFyZW50IHRoZSBlbGVtZW50IHdpbGwgYmUgcGxhY2VkIGluXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBib3VuZGluZ0NsaWVudFJlY3Qgb2YgZWwsIHdpdGggc3BlY2lmaWVkIGFkanVzdG1lbnRzXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRSZWN0KGVsLCByZWxhdGl2ZVRvQ29udGFpbmluZ0Jsb2NrLCByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50LCB1bmRvU2NhbGUsIGNvbnRhaW5lcikge1xuICBpZiAoIWVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiBlbCAhPT0gd2luZG93KSByZXR1cm47XG4gIHZhciBlbFJlY3QsIHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgaGVpZ2h0LCB3aWR0aDtcblxuICBpZiAoZWwgIT09IHdpbmRvdyAmJiBlbC5wYXJlbnROb2RlICYmIGVsICE9PSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCkpIHtcbiAgICBlbFJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0b3AgPSBlbFJlY3QudG9wO1xuICAgIGxlZnQgPSBlbFJlY3QubGVmdDtcbiAgICBib3R0b20gPSBlbFJlY3QuYm90dG9tO1xuICAgIHJpZ2h0ID0gZWxSZWN0LnJpZ2h0O1xuICAgIGhlaWdodCA9IGVsUmVjdC5oZWlnaHQ7XG4gICAgd2lkdGggPSBlbFJlY3Qud2lkdGg7XG4gIH0gZWxzZSB7XG4gICAgdG9wID0gMDtcbiAgICBsZWZ0ID0gMDtcbiAgICBib3R0b20gPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgcmlnaHQgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgfVxuXG4gIGlmICgocmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jayB8fCByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50KSAmJiBlbCAhPT0gd2luZG93KSB7XG4gICAgLy8gQWRqdXN0IGZvciB0cmFuc2xhdGUoKVxuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciB8fCBlbC5wYXJlbnROb2RlOyAvLyBzb2x2ZXMgIzExMjMgKHNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM3OTUzODA2LzYwODgzMTIpXG4gICAgLy8gTm90IG5lZWRlZCBvbiA8PSBJRTExXG5cbiAgICBpZiAoIUlFMTFPckxlc3MpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGNvbnRhaW5lciAmJiBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmIChjc3MoY29udGFpbmVyLCAndHJhbnNmb3JtJykgIT09ICdub25lJyB8fCByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50ICYmIGNzcyhjb250YWluZXIsICdwb3NpdGlvbicpICE9PSAnc3RhdGljJykpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgLy8gU2V0IHJlbGF0aXZlIHRvIGVkZ2VzIG9mIHBhZGRpbmcgYm94IG9mIGNvbnRhaW5lclxuXG4gICAgICAgICAgdG9wIC09IGNvbnRhaW5lclJlY3QudG9wICsgcGFyc2VJbnQoY3NzKGNvbnRhaW5lciwgJ2JvcmRlci10b3Atd2lkdGgnKSk7XG4gICAgICAgICAgbGVmdCAtPSBjb250YWluZXJSZWN0LmxlZnQgKyBwYXJzZUludChjc3MoY29udGFpbmVyLCAnYm9yZGVyLWxlZnQtd2lkdGgnKSk7XG4gICAgICAgICAgYm90dG9tID0gdG9wICsgZWxSZWN0LmhlaWdodDtcbiAgICAgICAgICByaWdodCA9IGxlZnQgKyBlbFJlY3Qud2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuXG4gICAgICB9IHdoaWxlIChjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHVuZG9TY2FsZSAmJiBlbCAhPT0gd2luZG93KSB7XG4gICAgLy8gQWRqdXN0IGZvciBzY2FsZSgpXG4gICAgdmFyIGVsTWF0cml4ID0gbWF0cml4KGNvbnRhaW5lciB8fCBlbCksXG4gICAgICAgIHNjYWxlWCA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmEsXG4gICAgICAgIHNjYWxlWSA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmQ7XG5cbiAgICBpZiAoZWxNYXRyaXgpIHtcbiAgICAgIHRvcCAvPSBzY2FsZVk7XG4gICAgICBsZWZ0IC89IHNjYWxlWDtcbiAgICAgIHdpZHRoIC89IHNjYWxlWDtcbiAgICAgIGhlaWdodCAvPSBzY2FsZVk7XG4gICAgICBib3R0b20gPSB0b3AgKyBoZWlnaHQ7XG4gICAgICByaWdodCA9IGxlZnQgKyB3aWR0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvcDogdG9wLFxuICAgIGxlZnQ6IGxlZnQsXG4gICAgYm90dG9tOiBib3R0b20sXG4gICAgcmlnaHQ6IHJpZ2h0LFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBzaWRlIG9mIGFuIGVsZW1lbnQgaXMgc2Nyb2xsZWQgcGFzdCBhIHNpZGUgb2YgaXRzIHBhcmVudHNcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgZWwgICAgICAgICAgIFRoZSBlbGVtZW50IHdobydzIHNpZGUgYmVpbmcgc2Nyb2xsZWQgb3V0IG9mIHZpZXcgaXMgaW4gcXVlc3Rpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgZWxTaWRlICAgICAgIFNpZGUgb2YgdGhlIGVsZW1lbnQgaW4gcXVlc3Rpb24gKCd0b3AnLCAnbGVmdCcsICdyaWdodCcsICdib3R0b20nKVxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICBwYXJlbnRTaWRlICAgU2lkZSBvZiB0aGUgcGFyZW50IGluIHF1ZXN0aW9uICgndG9wJywgJ2xlZnQnLCAncmlnaHQnLCAnYm90dG9tJylcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICAgICAgIFRoZSBwYXJlbnQgc2Nyb2xsIGVsZW1lbnQgdGhhdCB0aGUgZWwncyBzaWRlIGlzIHNjcm9sbGVkIHBhc3QsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCBlbGVtZW50XG4gKi9cblxuXG5mdW5jdGlvbiBpc1Njcm9sbGVkUGFzdChlbCwgZWxTaWRlLCBwYXJlbnRTaWRlKSB7XG4gIHZhciBwYXJlbnQgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbCwgdHJ1ZSksXG4gICAgICBlbFNpZGVWYWwgPSBnZXRSZWN0KGVsKVtlbFNpZGVdO1xuICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG5cbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIHZhciBwYXJlbnRTaWRlVmFsID0gZ2V0UmVjdChwYXJlbnQpW3BhcmVudFNpZGVdLFxuICAgICAgICB2aXNpYmxlID0gdm9pZCAwO1xuXG4gICAgaWYgKHBhcmVudFNpZGUgPT09ICd0b3AnIHx8IHBhcmVudFNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgdmlzaWJsZSA9IGVsU2lkZVZhbCA+PSBwYXJlbnRTaWRlVmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aXNpYmxlID0gZWxTaWRlVmFsIDw9IHBhcmVudFNpZGVWYWw7XG4gICAgfVxuXG4gICAgaWYgKCF2aXNpYmxlKSByZXR1cm4gcGFyZW50O1xuICAgIGlmIChwYXJlbnQgPT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkgYnJlYWs7XG4gICAgcGFyZW50ID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQocGFyZW50LCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqIEdldHMgbnRoIGNoaWxkIG9mIGVsLCBpZ25vcmluZyBoaWRkZW4gY2hpbGRyZW4sIHNvcnRhYmxlJ3MgZWxlbWVudHMgKGRvZXMgbm90IGlnbm9yZSBjbG9uZSBpZiBpdCdzIHZpc2libGUpXG4gKiBhbmQgbm9uLWRyYWdnYWJsZSBlbGVtZW50c1xuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgICAgIFRoZSBwYXJlbnQgZWxlbWVudFxuICogQHBhcmFtICB7TnVtYmVyfSBjaGlsZE51bSAgICAgIFRoZSBpbmRleCBvZiB0aGUgY2hpbGRcbiAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyAgICAgICBQYXJlbnQgU29ydGFibGUncyBvcHRpb25zXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gICAgICAgICAgVGhlIGNoaWxkIGF0IGluZGV4IGNoaWxkTnVtLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICovXG5cblxuZnVuY3Rpb24gZ2V0Q2hpbGQoZWwsIGNoaWxkTnVtLCBvcHRpb25zLCBpbmNsdWRlRHJhZ0VsKSB7XG4gIHZhciBjdXJyZW50Q2hpbGQgPSAwLFxuICAgICAgaSA9IDAsXG4gICAgICBjaGlsZHJlbiA9IGVsLmNoaWxkcmVuO1xuXG4gIHdoaWxlIChpIDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgaWYgKGNoaWxkcmVuW2ldLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBjaGlsZHJlbltpXSAhPT0gU29ydGFibGUuZ2hvc3QgJiYgKGluY2x1ZGVEcmFnRWwgfHwgY2hpbGRyZW5baV0gIT09IFNvcnRhYmxlLmRyYWdnZWQpICYmIGNsb3Nlc3QoY2hpbGRyZW5baV0sIG9wdGlvbnMuZHJhZ2dhYmxlLCBlbCwgZmFsc2UpKSB7XG4gICAgICBpZiAoY3VycmVudENoaWxkID09PSBjaGlsZE51bSkge1xuICAgICAgICByZXR1cm4gY2hpbGRyZW5baV07XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRDaGlsZCsrO1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBsYXN0IGNoaWxkIGluIHRoZSBlbCwgaWdub3JpbmcgZ2hvc3RFbCBvciBpbnZpc2libGUgZWxlbWVudHMgKGNsb25lcylcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAgICAgICBQYXJlbnQgZWxlbWVudFxuICogQHBhcmFtICB7c2VsZWN0b3J9IHNlbGVjdG9yICAgIEFueSBvdGhlciBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gICAgICAgICAgVGhlIGxhc3QgY2hpbGQsIGlnbm9yaW5nIGdob3N0RWxcbiAqL1xuXG5cbmZ1bmN0aW9uIGxhc3RDaGlsZChlbCwgc2VsZWN0b3IpIHtcbiAgdmFyIGxhc3QgPSBlbC5sYXN0RWxlbWVudENoaWxkO1xuXG4gIHdoaWxlIChsYXN0ICYmIChsYXN0ID09PSBTb3J0YWJsZS5naG9zdCB8fCBjc3MobGFzdCwgJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8IHNlbGVjdG9yICYmICFtYXRjaGVzKGxhc3QsIHNlbGVjdG9yKSkpIHtcbiAgICBsYXN0ID0gbGFzdC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIGxhc3QgfHwgbnVsbDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgYW4gZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudCBmb3IgYSBzZWxlY3RlZCBzZXQgb2ZcbiAqIGVsZW1lbnRzXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWxcbiAqIEBwYXJhbSAge3NlbGVjdG9yfSBzZWxlY3RvclxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5cblxuZnVuY3Rpb24gaW5kZXgoZWwsIHNlbGVjdG9yKSB7XG4gIHZhciBpbmRleCA9IDA7XG5cbiAgaWYgKCFlbCB8fCAhZWwucGFyZW50Tm9kZSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG5cblxuICB3aGlsZSAoZWwgPSBlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgaWYgKGVsLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09ICdURU1QTEFURScgJiYgZWwgIT09IFNvcnRhYmxlLmNsb25lICYmICghc2VsZWN0b3IgfHwgbWF0Y2hlcyhlbCwgc2VsZWN0b3IpKSkge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIHNjcm9sbCBvZmZzZXQgb2YgdGhlIGdpdmVuIGVsZW1lbnQsIGFkZGVkIHdpdGggYWxsIHRoZSBzY3JvbGwgb2Zmc2V0cyBvZiBwYXJlbnQgZWxlbWVudHMuXG4gKiBUaGUgdmFsdWUgaXMgcmV0dXJuZWQgaW4gcmVhbCBwaXhlbHMuXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWxcbiAqIEByZXR1cm4ge0FycmF5fSAgICAgICAgICAgICBPZmZzZXRzIGluIHRoZSBmb3JtYXQgb2YgW2xlZnQsIHRvcF1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0KGVsKSB7XG4gIHZhciBvZmZzZXRMZWZ0ID0gMCxcbiAgICAgIG9mZnNldFRvcCA9IDAsXG4gICAgICB3aW5TY3JvbGxlciA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcblxuICBpZiAoZWwpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgZWxNYXRyaXggPSBtYXRyaXgoZWwpLFxuICAgICAgICAgIHNjYWxlWCA9IGVsTWF0cml4LmEsXG4gICAgICAgICAgc2NhbGVZID0gZWxNYXRyaXguZDtcbiAgICAgIG9mZnNldExlZnQgKz0gZWwuc2Nyb2xsTGVmdCAqIHNjYWxlWDtcbiAgICAgIG9mZnNldFRvcCArPSBlbC5zY3JvbGxUb3AgKiBzY2FsZVk7XG4gICAgfSB3aGlsZSAoZWwgIT09IHdpblNjcm9sbGVyICYmIChlbCA9IGVsLnBhcmVudE5vZGUpKTtcbiAgfVxuXG4gIHJldHVybiBbb2Zmc2V0TGVmdCwgb2Zmc2V0VG9wXTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG9iamVjdCB3aXRoaW4gdGhlIGdpdmVuIGFycmF5XG4gKiBAcGFyYW0gIHtBcnJheX0gYXJyICAgQXJyYXkgdGhhdCBtYXkgb3IgbWF5IG5vdCBob2xkIHRoZSBvYmplY3RcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqICBBbiBvYmplY3QgdGhhdCBoYXMgYSBrZXktdmFsdWUgcGFpciB1bmlxdWUgdG8gYW5kIGlkZW50aWNhbCB0byBhIGtleS12YWx1ZSBwYWlyIGluIHRoZSBvYmplY3QgeW91IHdhbnQgdG8gZmluZFxuICogQHJldHVybiB7TnVtYmVyfSAgICAgIFRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IGluIHRoZSBhcnJheSwgb3IgLTFcbiAqL1xuXG5cbmZ1bmN0aW9uIGluZGV4T2ZPYmplY3QoYXJyLCBvYmopIHtcbiAgZm9yICh2YXIgaSBpbiBhcnIpIHtcbiAgICBpZiAoIWFyci5oYXNPd25Qcm9wZXJ0eShpKSkgY29udGludWU7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkgJiYgb2JqW2tleV0gPT09IGFycltpXVtrZXldKSByZXR1cm4gTnVtYmVyKGkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWwsIGluY2x1ZGVTZWxmKSB7XG4gIC8vIHNraXAgdG8gd2luZG93XG4gIGlmICghZWwgfHwgIWVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkgcmV0dXJuIGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgdmFyIGVsZW0gPSBlbDtcbiAgdmFyIGdvdFNlbGYgPSBmYWxzZTtcblxuICBkbyB7XG4gICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBnZXQgZWxlbSBjc3MgaWYgaXQgaXNuJ3QgZXZlbiBvdmVyZmxvd2luZyBpbiB0aGUgZmlyc3QgcGxhY2UgKHBlcmZvcm1hbmNlKVxuICAgIGlmIChlbGVtLmNsaWVudFdpZHRoIDwgZWxlbS5zY3JvbGxXaWR0aCB8fCBlbGVtLmNsaWVudEhlaWdodCA8IGVsZW0uc2Nyb2xsSGVpZ2h0KSB7XG4gICAgICB2YXIgZWxlbUNTUyA9IGNzcyhlbGVtKTtcblxuICAgICAgaWYgKGVsZW0uY2xpZW50V2lkdGggPCBlbGVtLnNjcm9sbFdpZHRoICYmIChlbGVtQ1NTLm92ZXJmbG93WCA9PSAnYXV0bycgfHwgZWxlbUNTUy5vdmVyZmxvd1ggPT0gJ3Njcm9sbCcpIHx8IGVsZW0uY2xpZW50SGVpZ2h0IDwgZWxlbS5zY3JvbGxIZWlnaHQgJiYgKGVsZW1DU1Mub3ZlcmZsb3dZID09ICdhdXRvJyB8fCBlbGVtQ1NTLm92ZXJmbG93WSA9PSAnc2Nyb2xsJykpIHtcbiAgICAgICAgaWYgKCFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCB8fCBlbGVtID09PSBkb2N1bWVudC5ib2R5KSByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgICAgICBpZiAoZ290U2VsZiB8fCBpbmNsdWRlU2VsZikgcmV0dXJuIGVsZW07XG4gICAgICAgIGdvdFNlbGYgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG5cbiAgfSB3aGlsZSAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSk7XG5cbiAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKGRzdCwgc3JjKSB7XG4gIGlmIChkc3QgJiYgc3JjKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGRzdFtrZXldID0gc3JjW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRzdDtcbn1cblxuZnVuY3Rpb24gaXNSZWN0RXF1YWwocmVjdDEsIHJlY3QyKSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHJlY3QxLnRvcCkgPT09IE1hdGgucm91bmQocmVjdDIudG9wKSAmJiBNYXRoLnJvdW5kKHJlY3QxLmxlZnQpID09PSBNYXRoLnJvdW5kKHJlY3QyLmxlZnQpICYmIE1hdGgucm91bmQocmVjdDEuaGVpZ2h0KSA9PT0gTWF0aC5yb3VuZChyZWN0Mi5oZWlnaHQpICYmIE1hdGgucm91bmQocmVjdDEud2lkdGgpID09PSBNYXRoLnJvdW5kKHJlY3QyLndpZHRoKTtcbn1cblxudmFyIF90aHJvdHRsZVRpbWVvdXQ7XG5cbmZ1bmN0aW9uIHRocm90dGxlKGNhbGxiYWNrLCBtcykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghX3Rocm90dGxlVGltZW91dCkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChfdGhpcywgYXJnc1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjay5hcHBseShfdGhpcywgYXJncyk7XG4gICAgICB9XG5cbiAgICAgIF90aHJvdHRsZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3Rocm90dGxlVGltZW91dCA9IHZvaWQgMDtcbiAgICAgIH0sIG1zKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbmNlbFRocm90dGxlKCkge1xuICBjbGVhclRpbWVvdXQoX3Rocm90dGxlVGltZW91dCk7XG4gIF90aHJvdHRsZVRpbWVvdXQgPSB2b2lkIDA7XG59XG5cbmZ1bmN0aW9uIHNjcm9sbEJ5KGVsLCB4LCB5KSB7XG4gIGVsLnNjcm9sbExlZnQgKz0geDtcbiAgZWwuc2Nyb2xsVG9wICs9IHk7XG59XG5cbmZ1bmN0aW9uIGNsb25lKGVsKSB7XG4gIHZhciBQb2x5bWVyID0gd2luZG93LlBvbHltZXI7XG4gIHZhciAkID0gd2luZG93LmpRdWVyeSB8fCB3aW5kb3cuWmVwdG87XG5cbiAgaWYgKFBvbHltZXIgJiYgUG9seW1lci5kb20pIHtcbiAgICByZXR1cm4gUG9seW1lci5kb20oZWwpLmNsb25lTm9kZSh0cnVlKTtcbiAgfSBlbHNlIGlmICgkKSB7XG4gICAgcmV0dXJuICQoZWwpLmNsb25lKHRydWUpWzBdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbC5jbG9uZU5vZGUodHJ1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0UmVjdChlbCwgcmVjdCkge1xuICBjc3MoZWwsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuICBjc3MoZWwsICd0b3AnLCByZWN0LnRvcCk7XG4gIGNzcyhlbCwgJ2xlZnQnLCByZWN0LmxlZnQpO1xuICBjc3MoZWwsICd3aWR0aCcsIHJlY3Qud2lkdGgpO1xuICBjc3MoZWwsICdoZWlnaHQnLCByZWN0LmhlaWdodCk7XG59XG5cbmZ1bmN0aW9uIHVuc2V0UmVjdChlbCkge1xuICBjc3MoZWwsICdwb3NpdGlvbicsICcnKTtcbiAgY3NzKGVsLCAndG9wJywgJycpO1xuICBjc3MoZWwsICdsZWZ0JywgJycpO1xuICBjc3MoZWwsICd3aWR0aCcsICcnKTtcbiAgY3NzKGVsLCAnaGVpZ2h0JywgJycpO1xufVxuXG52YXIgZXhwYW5kbyA9ICdTb3J0YWJsZScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuZnVuY3Rpb24gQW5pbWF0aW9uU3RhdGVNYW5hZ2VyKCkge1xuICB2YXIgYW5pbWF0aW9uU3RhdGVzID0gW10sXG4gICAgICBhbmltYXRpb25DYWxsYmFja0lkO1xuICByZXR1cm4ge1xuICAgIGNhcHR1cmVBbmltYXRpb25TdGF0ZTogZnVuY3Rpb24gY2FwdHVyZUFuaW1hdGlvblN0YXRlKCkge1xuICAgICAgYW5pbWF0aW9uU3RhdGVzID0gW107XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbmltYXRpb24pIHJldHVybjtcbiAgICAgIHZhciBjaGlsZHJlbiA9IFtdLnNsaWNlLmNhbGwodGhpcy5lbC5jaGlsZHJlbik7XG4gICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoY3NzKGNoaWxkLCAnZGlzcGxheScpID09PSAnbm9uZScgfHwgY2hpbGQgPT09IFNvcnRhYmxlLmdob3N0KSByZXR1cm47XG4gICAgICAgIGFuaW1hdGlvblN0YXRlcy5wdXNoKHtcbiAgICAgICAgICB0YXJnZXQ6IGNoaWxkLFxuICAgICAgICAgIHJlY3Q6IGdldFJlY3QoY2hpbGQpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBmcm9tUmVjdCA9IF9vYmplY3RTcHJlYWQyKHt9LCBhbmltYXRpb25TdGF0ZXNbYW5pbWF0aW9uU3RhdGVzLmxlbmd0aCAtIDFdLnJlY3QpOyAvLyBJZiBhbmltYXRpbmc6IGNvbXBlbnNhdGUgZm9yIGN1cnJlbnQgYW5pbWF0aW9uXG5cblxuICAgICAgICBpZiAoY2hpbGQudGhpc0FuaW1hdGlvbkR1cmF0aW9uKSB7XG4gICAgICAgICAgdmFyIGNoaWxkTWF0cml4ID0gbWF0cml4KGNoaWxkLCB0cnVlKTtcblxuICAgICAgICAgIGlmIChjaGlsZE1hdHJpeCkge1xuICAgICAgICAgICAgZnJvbVJlY3QudG9wIC09IGNoaWxkTWF0cml4LmY7XG4gICAgICAgICAgICBmcm9tUmVjdC5sZWZ0IC09IGNoaWxkTWF0cml4LmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQuZnJvbVJlY3QgPSBmcm9tUmVjdDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgYWRkQW5pbWF0aW9uU3RhdGU6IGZ1bmN0aW9uIGFkZEFuaW1hdGlvblN0YXRlKHN0YXRlKSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMucHVzaChzdGF0ZSk7XG4gICAgfSxcbiAgICByZW1vdmVBbmltYXRpb25TdGF0ZTogZnVuY3Rpb24gcmVtb3ZlQW5pbWF0aW9uU3RhdGUodGFyZ2V0KSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMuc3BsaWNlKGluZGV4T2ZPYmplY3QoYW5pbWF0aW9uU3RhdGVzLCB7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgICB9KSwgMSk7XG4gICAgfSxcbiAgICBhbmltYXRlQWxsOiBmdW5jdGlvbiBhbmltYXRlQWxsKGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGFuaW1hdGlvbkNhbGxiYWNrSWQpO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBhbmltYXRpbmcgPSBmYWxzZSxcbiAgICAgICAgICBhbmltYXRpb25UaW1lID0gMDtcbiAgICAgIGFuaW1hdGlvblN0YXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgdGltZSA9IDAsXG4gICAgICAgICAgICB0YXJnZXQgPSBzdGF0ZS50YXJnZXQsXG4gICAgICAgICAgICBmcm9tUmVjdCA9IHRhcmdldC5mcm9tUmVjdCxcbiAgICAgICAgICAgIHRvUmVjdCA9IGdldFJlY3QodGFyZ2V0KSxcbiAgICAgICAgICAgIHByZXZGcm9tUmVjdCA9IHRhcmdldC5wcmV2RnJvbVJlY3QsXG4gICAgICAgICAgICBwcmV2VG9SZWN0ID0gdGFyZ2V0LnByZXZUb1JlY3QsXG4gICAgICAgICAgICBhbmltYXRpbmdSZWN0ID0gc3RhdGUucmVjdCxcbiAgICAgICAgICAgIHRhcmdldE1hdHJpeCA9IG1hdHJpeCh0YXJnZXQsIHRydWUpO1xuXG4gICAgICAgIGlmICh0YXJnZXRNYXRyaXgpIHtcbiAgICAgICAgICAvLyBDb21wZW5zYXRlIGZvciBjdXJyZW50IGFuaW1hdGlvblxuICAgICAgICAgIHRvUmVjdC50b3AgLT0gdGFyZ2V0TWF0cml4LmY7XG4gICAgICAgICAgdG9SZWN0LmxlZnQgLT0gdGFyZ2V0TWF0cml4LmU7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXQudG9SZWN0ID0gdG9SZWN0O1xuXG4gICAgICAgIGlmICh0YXJnZXQudGhpc0FuaW1hdGlvbkR1cmF0aW9uKSB7XG4gICAgICAgICAgLy8gQ291bGQgYWxzbyBjaGVjayBpZiBhbmltYXRpbmdSZWN0IGlzIGJldHdlZW4gZnJvbVJlY3QgYW5kIHRvUmVjdFxuICAgICAgICAgIGlmIChpc1JlY3RFcXVhbChwcmV2RnJvbVJlY3QsIHRvUmVjdCkgJiYgIWlzUmVjdEVxdWFsKGZyb21SZWN0LCB0b1JlY3QpICYmIC8vIE1ha2Ugc3VyZSBhbmltYXRpbmdSZWN0IGlzIG9uIGxpbmUgYmV0d2VlbiB0b1JlY3QgJiBmcm9tUmVjdFxuICAgICAgICAgIChhbmltYXRpbmdSZWN0LnRvcCAtIHRvUmVjdC50b3ApIC8gKGFuaW1hdGluZ1JlY3QubGVmdCAtIHRvUmVjdC5sZWZ0KSA9PT0gKGZyb21SZWN0LnRvcCAtIHRvUmVjdC50b3ApIC8gKGZyb21SZWN0LmxlZnQgLSB0b1JlY3QubGVmdCkpIHtcbiAgICAgICAgICAgIC8vIElmIHJldHVybmluZyB0byBzYW1lIHBsYWNlIGFzIHN0YXJ0ZWQgZnJvbSBhbmltYXRpb24gYW5kIG9uIHNhbWUgYXhpc1xuICAgICAgICAgICAgdGltZSA9IGNhbGN1bGF0ZVJlYWxUaW1lKGFuaW1hdGluZ1JlY3QsIHByZXZGcm9tUmVjdCwgcHJldlRvUmVjdCwgX3RoaXMub3B0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIGlmIGZyb21SZWN0ICE9IHRvUmVjdDogYW5pbWF0ZVxuXG5cbiAgICAgICAgaWYgKCFpc1JlY3RFcXVhbCh0b1JlY3QsIGZyb21SZWN0KSkge1xuICAgICAgICAgIHRhcmdldC5wcmV2RnJvbVJlY3QgPSBmcm9tUmVjdDtcbiAgICAgICAgICB0YXJnZXQucHJldlRvUmVjdCA9IHRvUmVjdDtcblxuICAgICAgICAgIGlmICghdGltZSkge1xuICAgICAgICAgICAgdGltZSA9IF90aGlzLm9wdGlvbnMuYW5pbWF0aW9uO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLmFuaW1hdGUodGFyZ2V0LCBhbmltYXRpbmdSZWN0LCB0b1JlY3QsIHRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWUpIHtcbiAgICAgICAgICBhbmltYXRpbmcgPSB0cnVlO1xuICAgICAgICAgIGFuaW1hdGlvblRpbWUgPSBNYXRoLm1heChhbmltYXRpb25UaW1lLCB0aW1lKTtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGFyZ2V0LmFuaW1hdGlvblJlc2V0VGltZXIpO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRpb25SZXNldFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0YXJnZXQuYW5pbWF0aW9uVGltZSA9IDA7XG4gICAgICAgICAgICB0YXJnZXQucHJldkZyb21SZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRhcmdldC5mcm9tUmVjdCA9IG51bGw7XG4gICAgICAgICAgICB0YXJnZXQucHJldlRvUmVjdCA9IG51bGw7XG4gICAgICAgICAgICB0YXJnZXQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgICB9LCB0aW1lKTtcbiAgICAgICAgICB0YXJnZXQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gdGltZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjbGVhclRpbWVvdXQoYW5pbWF0aW9uQ2FsbGJhY2tJZCk7XG5cbiAgICAgIGlmICghYW5pbWF0aW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbmltYXRpb25DYWxsYmFja0lkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2soKTtcbiAgICAgICAgfSwgYW5pbWF0aW9uVGltZSk7XG4gICAgICB9XG5cbiAgICAgIGFuaW1hdGlvblN0YXRlcyA9IFtdO1xuICAgIH0sXG4gICAgYW5pbWF0ZTogZnVuY3Rpb24gYW5pbWF0ZSh0YXJnZXQsIGN1cnJlbnRSZWN0LCB0b1JlY3QsIGR1cmF0aW9uKSB7XG4gICAgICBpZiAoZHVyYXRpb24pIHtcbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAnJyk7XG4gICAgICAgIHZhciBlbE1hdHJpeCA9IG1hdHJpeCh0aGlzLmVsKSxcbiAgICAgICAgICAgIHNjYWxlWCA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmEsXG4gICAgICAgICAgICBzY2FsZVkgPSBlbE1hdHJpeCAmJiBlbE1hdHJpeC5kLFxuICAgICAgICAgICAgdHJhbnNsYXRlWCA9IChjdXJyZW50UmVjdC5sZWZ0IC0gdG9SZWN0LmxlZnQpIC8gKHNjYWxlWCB8fCAxKSxcbiAgICAgICAgICAgIHRyYW5zbGF0ZVkgPSAoY3VycmVudFJlY3QudG9wIC0gdG9SZWN0LnRvcCkgLyAoc2NhbGVZIHx8IDEpO1xuICAgICAgICB0YXJnZXQuYW5pbWF0aW5nWCA9ICEhdHJhbnNsYXRlWDtcbiAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1kgPSAhIXRyYW5zbGF0ZVk7XG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlM2QoJyArIHRyYW5zbGF0ZVggKyAncHgsJyArIHRyYW5zbGF0ZVkgKyAncHgsMCknKTtcbiAgICAgICAgdGhpcy5mb3JSZXBhaW50RHVtbXkgPSByZXBhaW50KHRhcmdldCk7IC8vIHJlcGFpbnRcblxuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNpdGlvbicsICd0cmFuc2Zvcm0gJyArIGR1cmF0aW9uICsgJ21zJyArICh0aGlzLm9wdGlvbnMuZWFzaW5nID8gJyAnICsgdGhpcy5vcHRpb25zLmVhc2luZyA6ICcnKSk7XG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlM2QoMCwwLDApJyk7XG4gICAgICAgIHR5cGVvZiB0YXJnZXQuYW5pbWF0ZWQgPT09ICdudW1iZXInICYmIGNsZWFyVGltZW91dCh0YXJnZXQuYW5pbWF0ZWQpO1xuICAgICAgICB0YXJnZXQuYW5pbWF0ZWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNpdGlvbicsICcnKTtcbiAgICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJycpO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRlZCA9IGZhbHNlO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRpbmdYID0gZmFsc2U7XG4gICAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1kgPSBmYWxzZTtcbiAgICAgICAgfSwgZHVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVwYWludCh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldC5vZmZzZXRXaWR0aDtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlUmVhbFRpbWUoYW5pbWF0aW5nUmVjdCwgZnJvbVJlY3QsIHRvUmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGZyb21SZWN0LnRvcCAtIGFuaW1hdGluZ1JlY3QudG9wLCAyKSArIE1hdGgucG93KGZyb21SZWN0LmxlZnQgLSBhbmltYXRpbmdSZWN0LmxlZnQsIDIpKSAvIE1hdGguc3FydChNYXRoLnBvdyhmcm9tUmVjdC50b3AgLSB0b1JlY3QudG9wLCAyKSArIE1hdGgucG93KGZyb21SZWN0LmxlZnQgLSB0b1JlY3QubGVmdCwgMikpICogb3B0aW9ucy5hbmltYXRpb247XG59XG5cbnZhciBwbHVnaW5zID0gW107XG52YXIgZGVmYXVsdHMgPSB7XG4gIGluaXRpYWxpemVCeURlZmF1bHQ6IHRydWVcbn07XG52YXIgUGx1Z2luTWFuYWdlciA9IHtcbiAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KHBsdWdpbikge1xuICAgIC8vIFNldCBkZWZhdWx0IHN0YXRpYyBwcm9wZXJ0aWVzXG4gICAgZm9yICh2YXIgb3B0aW9uIGluIGRlZmF1bHRzKSB7XG4gICAgICBpZiAoZGVmYXVsdHMuaGFzT3duUHJvcGVydHkob3B0aW9uKSAmJiAhKG9wdGlvbiBpbiBwbHVnaW4pKSB7XG4gICAgICAgIHBsdWdpbltvcHRpb25dID0gZGVmYXVsdHNbb3B0aW9uXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGlmIChwLnBsdWdpbk5hbWUgPT09IHBsdWdpbi5wbHVnaW5OYW1lKSB7XG4gICAgICAgIHRocm93IFwiU29ydGFibGU6IENhbm5vdCBtb3VudCBwbHVnaW4gXCIuY29uY2F0KHBsdWdpbi5wbHVnaW5OYW1lLCBcIiBtb3JlIHRoYW4gb25jZVwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgfSxcbiAgcGx1Z2luRXZlbnQ6IGZ1bmN0aW9uIHBsdWdpbkV2ZW50KGV2ZW50TmFtZSwgc29ydGFibGUsIGV2dCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLmV2ZW50Q2FuY2VsZWQgPSBmYWxzZTtcblxuICAgIGV2dC5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5ldmVudENhbmNlbGVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgdmFyIGV2ZW50TmFtZUdsb2JhbCA9IGV2ZW50TmFtZSArICdHbG9iYWwnO1xuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICBpZiAoIXNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSkgcmV0dXJuOyAvLyBGaXJlIGdsb2JhbCBldmVudHMgaWYgaXQgZXhpc3RzIGluIHRoaXMgc29ydGFibGVcblxuICAgICAgaWYgKHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVHbG9iYWxdKSB7XG4gICAgICAgIHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVHbG9iYWxdKF9vYmplY3RTcHJlYWQyKHtcbiAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGVcbiAgICAgICAgfSwgZXZ0KSk7XG4gICAgICB9IC8vIE9ubHkgZmlyZSBwbHVnaW4gZXZlbnQgaWYgcGx1Z2luIGlzIGVuYWJsZWQgaW4gdGhpcyBzb3J0YWJsZSxcbiAgICAgIC8vIGFuZCBwbHVnaW4gaGFzIGV2ZW50IGRlZmluZWRcblxuXG4gICAgICBpZiAoc29ydGFibGUub3B0aW9uc1twbHVnaW4ucGx1Z2luTmFtZV0gJiYgc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdW2V2ZW50TmFtZV0oX29iamVjdFNwcmVhZDIoe1xuICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZVxuICAgICAgICB9LCBldnQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgaW5pdGlhbGl6ZVBsdWdpbnM6IGZ1bmN0aW9uIGluaXRpYWxpemVQbHVnaW5zKHNvcnRhYmxlLCBlbCwgZGVmYXVsdHMsIG9wdGlvbnMpIHtcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgdmFyIHBsdWdpbk5hbWUgPSBwbHVnaW4ucGx1Z2luTmFtZTtcbiAgICAgIGlmICghc29ydGFibGUub3B0aW9uc1twbHVnaW5OYW1lXSAmJiAhcGx1Z2luLmluaXRpYWxpemVCeURlZmF1bHQpIHJldHVybjtcbiAgICAgIHZhciBpbml0aWFsaXplZCA9IG5ldyBwbHVnaW4oc29ydGFibGUsIGVsLCBzb3J0YWJsZS5vcHRpb25zKTtcbiAgICAgIGluaXRpYWxpemVkLnNvcnRhYmxlID0gc29ydGFibGU7XG4gICAgICBpbml0aWFsaXplZC5vcHRpb25zID0gc29ydGFibGUub3B0aW9ucztcbiAgICAgIHNvcnRhYmxlW3BsdWdpbk5hbWVdID0gaW5pdGlhbGl6ZWQ7IC8vIEFkZCBkZWZhdWx0IG9wdGlvbnMgZnJvbSBwbHVnaW5cblxuICAgICAgX2V4dGVuZHMoZGVmYXVsdHMsIGluaXRpYWxpemVkLmRlZmF1bHRzKTtcbiAgICB9KTtcblxuICAgIGZvciAodmFyIG9wdGlvbiBpbiBzb3J0YWJsZS5vcHRpb25zKSB7XG4gICAgICBpZiAoIXNvcnRhYmxlLm9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0aW9uKSkgY29udGludWU7XG4gICAgICB2YXIgbW9kaWZpZWQgPSB0aGlzLm1vZGlmeU9wdGlvbihzb3J0YWJsZSwgb3B0aW9uLCBzb3J0YWJsZS5vcHRpb25zW29wdGlvbl0pO1xuXG4gICAgICBpZiAodHlwZW9mIG1vZGlmaWVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzb3J0YWJsZS5vcHRpb25zW29wdGlvbl0gPSBtb2RpZmllZDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGdldEV2ZW50UHJvcGVydGllczogZnVuY3Rpb24gZ2V0RXZlbnRQcm9wZXJ0aWVzKG5hbWUsIHNvcnRhYmxlKSB7XG4gICAgdmFyIGV2ZW50UHJvcGVydGllcyA9IHt9O1xuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICBpZiAodHlwZW9mIHBsdWdpbi5ldmVudFByb3BlcnRpZXMgIT09ICdmdW5jdGlvbicpIHJldHVybjtcblxuICAgICAgX2V4dGVuZHMoZXZlbnRQcm9wZXJ0aWVzLCBwbHVnaW4uZXZlbnRQcm9wZXJ0aWVzLmNhbGwoc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdLCBuYW1lKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGV2ZW50UHJvcGVydGllcztcbiAgfSxcbiAgbW9kaWZ5T3B0aW9uOiBmdW5jdGlvbiBtb2RpZnlPcHRpb24oc29ydGFibGUsIG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIG1vZGlmaWVkVmFsdWU7XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIC8vIFBsdWdpbiBtdXN0IGV4aXN0IG9uIHRoZSBTb3J0YWJsZVxuICAgICAgaWYgKCFzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0pIHJldHVybjsgLy8gSWYgc3RhdGljIG9wdGlvbiBsaXN0ZW5lciBleGlzdHMgZm9yIHRoaXMgb3B0aW9uLCBjYWxsIGluIHRoZSBjb250ZXh0IG9mIHRoZSBTb3J0YWJsZSdzIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luXG5cbiAgICAgIGlmIChwbHVnaW4ub3B0aW9uTGlzdGVuZXJzICYmIHR5cGVvZiBwbHVnaW4ub3B0aW9uTGlzdGVuZXJzW25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG1vZGlmaWVkVmFsdWUgPSBwbHVnaW4ub3B0aW9uTGlzdGVuZXJzW25hbWVdLmNhbGwoc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGlmaWVkVmFsdWU7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoX3JlZikge1xuICB2YXIgc29ydGFibGUgPSBfcmVmLnNvcnRhYmxlLFxuICAgICAgcm9vdEVsID0gX3JlZi5yb290RWwsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgdGFyZ2V0RWwgPSBfcmVmLnRhcmdldEVsLFxuICAgICAgY2xvbmVFbCA9IF9yZWYuY2xvbmVFbCxcbiAgICAgIHRvRWwgPSBfcmVmLnRvRWwsXG4gICAgICBmcm9tRWwgPSBfcmVmLmZyb21FbCxcbiAgICAgIG9sZEluZGV4ID0gX3JlZi5vbGRJbmRleCxcbiAgICAgIG5ld0luZGV4ID0gX3JlZi5uZXdJbmRleCxcbiAgICAgIG9sZERyYWdnYWJsZUluZGV4ID0gX3JlZi5vbGREcmFnZ2FibGVJbmRleCxcbiAgICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gX3JlZi5uZXdEcmFnZ2FibGVJbmRleCxcbiAgICAgIG9yaWdpbmFsRXZlbnQgPSBfcmVmLm9yaWdpbmFsRXZlbnQsXG4gICAgICBwdXRTb3J0YWJsZSA9IF9yZWYucHV0U29ydGFibGUsXG4gICAgICBleHRyYUV2ZW50UHJvcGVydGllcyA9IF9yZWYuZXh0cmFFdmVudFByb3BlcnRpZXM7XG4gIHNvcnRhYmxlID0gc29ydGFibGUgfHwgcm9vdEVsICYmIHJvb3RFbFtleHBhbmRvXTtcbiAgaWYgKCFzb3J0YWJsZSkgcmV0dXJuO1xuICB2YXIgZXZ0LFxuICAgICAgb3B0aW9ucyA9IHNvcnRhYmxlLm9wdGlvbnMsXG4gICAgICBvbk5hbWUgPSAnb24nICsgbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyKDEpOyAvLyBTdXBwb3J0IGZvciBuZXcgQ3VzdG9tRXZlbnQgZmVhdHVyZVxuXG4gIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgIUlFMTFPckxlc3MgJiYgIUVkZ2UpIHtcbiAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQobmFtZSwge1xuICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldnQuaW5pdEV2ZW50KG5hbWUsIHRydWUsIHRydWUpO1xuICB9XG5cbiAgZXZ0LnRvID0gdG9FbCB8fCByb290RWw7XG4gIGV2dC5mcm9tID0gZnJvbUVsIHx8IHJvb3RFbDtcbiAgZXZ0Lml0ZW0gPSB0YXJnZXRFbCB8fCByb290RWw7XG4gIGV2dC5jbG9uZSA9IGNsb25lRWw7XG4gIGV2dC5vbGRJbmRleCA9IG9sZEluZGV4O1xuICBldnQubmV3SW5kZXggPSBuZXdJbmRleDtcbiAgZXZ0Lm9sZERyYWdnYWJsZUluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXg7XG4gIGV2dC5uZXdEcmFnZ2FibGVJbmRleCA9IG5ld0RyYWdnYWJsZUluZGV4O1xuICBldnQub3JpZ2luYWxFdmVudCA9IG9yaWdpbmFsRXZlbnQ7XG4gIGV2dC5wdWxsTW9kZSA9IHB1dFNvcnRhYmxlID8gcHV0U29ydGFibGUubGFzdFB1dE1vZGUgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIGFsbEV2ZW50UHJvcGVydGllcyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBleHRyYUV2ZW50UHJvcGVydGllcyksIFBsdWdpbk1hbmFnZXIuZ2V0RXZlbnRQcm9wZXJ0aWVzKG5hbWUsIHNvcnRhYmxlKSk7XG5cbiAgZm9yICh2YXIgb3B0aW9uIGluIGFsbEV2ZW50UHJvcGVydGllcykge1xuICAgIGV2dFtvcHRpb25dID0gYWxsRXZlbnRQcm9wZXJ0aWVzW29wdGlvbl07XG4gIH1cblxuICBpZiAocm9vdEVsKSB7XG4gICAgcm9vdEVsLmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgfVxuXG4gIGlmIChvcHRpb25zW29uTmFtZV0pIHtcbiAgICBvcHRpb25zW29uTmFtZV0uY2FsbChzb3J0YWJsZSwgZXZ0KTtcbiAgfVxufVxuXG52YXIgX2V4Y2x1ZGVkID0gW1wiZXZ0XCJdO1xuXG52YXIgcGx1Z2luRXZlbnQgPSBmdW5jdGlvbiBwbHVnaW5FdmVudChldmVudE5hbWUsIHNvcnRhYmxlKSB7XG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fSxcbiAgICAgIG9yaWdpbmFsRXZlbnQgPSBfcmVmLmV2dCxcbiAgICAgIGRhdGEgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICBQbHVnaW5NYW5hZ2VyLnBsdWdpbkV2ZW50LmJpbmQoU29ydGFibGUpKGV2ZW50TmFtZSwgc29ydGFibGUsIF9vYmplY3RTcHJlYWQyKHtcbiAgICBkcmFnRWw6IGRyYWdFbCxcbiAgICBwYXJlbnRFbDogcGFyZW50RWwsXG4gICAgZ2hvc3RFbDogZ2hvc3RFbCxcbiAgICByb290RWw6IHJvb3RFbCxcbiAgICBuZXh0RWw6IG5leHRFbCxcbiAgICBsYXN0RG93bkVsOiBsYXN0RG93bkVsLFxuICAgIGNsb25lRWw6IGNsb25lRWwsXG4gICAgY2xvbmVIaWRkZW46IGNsb25lSGlkZGVuLFxuICAgIGRyYWdTdGFydGVkOiBtb3ZlZCxcbiAgICBwdXRTb3J0YWJsZTogcHV0U29ydGFibGUsXG4gICAgYWN0aXZlU29ydGFibGU6IFNvcnRhYmxlLmFjdGl2ZSxcbiAgICBvcmlnaW5hbEV2ZW50OiBvcmlnaW5hbEV2ZW50LFxuICAgIG9sZEluZGV4OiBvbGRJbmRleCxcbiAgICBvbGREcmFnZ2FibGVJbmRleDogb2xkRHJhZ2dhYmxlSW5kZXgsXG4gICAgbmV3SW5kZXg6IG5ld0luZGV4LFxuICAgIG5ld0RyYWdnYWJsZUluZGV4OiBuZXdEcmFnZ2FibGVJbmRleCxcbiAgICBoaWRlR2hvc3RGb3JUYXJnZXQ6IF9oaWRlR2hvc3RGb3JUYXJnZXQsXG4gICAgdW5oaWRlR2hvc3RGb3JUYXJnZXQ6IF91bmhpZGVHaG9zdEZvclRhcmdldCxcbiAgICBjbG9uZU5vd0hpZGRlbjogZnVuY3Rpb24gY2xvbmVOb3dIaWRkZW4oKSB7XG4gICAgICBjbG9uZUhpZGRlbiA9IHRydWU7XG4gICAgfSxcbiAgICBjbG9uZU5vd1Nob3duOiBmdW5jdGlvbiBjbG9uZU5vd1Nob3duKCkge1xuICAgICAgY2xvbmVIaWRkZW4gPSBmYWxzZTtcbiAgICB9LFxuICAgIGRpc3BhdGNoU29ydGFibGVFdmVudDogZnVuY3Rpb24gZGlzcGF0Y2hTb3J0YWJsZUV2ZW50KG5hbWUpIHtcbiAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBvcmlnaW5hbEV2ZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIGRhdGEpKTtcbn07XG5cbmZ1bmN0aW9uIF9kaXNwYXRjaEV2ZW50KGluZm8pIHtcbiAgZGlzcGF0Y2hFdmVudChfb2JqZWN0U3ByZWFkMih7XG4gICAgcHV0U29ydGFibGU6IHB1dFNvcnRhYmxlLFxuICAgIGNsb25lRWw6IGNsb25lRWwsXG4gICAgdGFyZ2V0RWw6IGRyYWdFbCxcbiAgICByb290RWw6IHJvb3RFbCxcbiAgICBvbGRJbmRleDogb2xkSW5kZXgsXG4gICAgb2xkRHJhZ2dhYmxlSW5kZXg6IG9sZERyYWdnYWJsZUluZGV4LFxuICAgIG5ld0luZGV4OiBuZXdJbmRleCxcbiAgICBuZXdEcmFnZ2FibGVJbmRleDogbmV3RHJhZ2dhYmxlSW5kZXhcbiAgfSwgaW5mbykpO1xufVxuXG52YXIgZHJhZ0VsLFxuICAgIHBhcmVudEVsLFxuICAgIGdob3N0RWwsXG4gICAgcm9vdEVsLFxuICAgIG5leHRFbCxcbiAgICBsYXN0RG93bkVsLFxuICAgIGNsb25lRWwsXG4gICAgY2xvbmVIaWRkZW4sXG4gICAgb2xkSW5kZXgsXG4gICAgbmV3SW5kZXgsXG4gICAgb2xkRHJhZ2dhYmxlSW5kZXgsXG4gICAgbmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgYWN0aXZlR3JvdXAsXG4gICAgcHV0U29ydGFibGUsXG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IGZhbHNlLFxuICAgIGlnbm9yZU5leHRDbGljayA9IGZhbHNlLFxuICAgIHNvcnRhYmxlcyA9IFtdLFxuICAgIHRhcEV2dCxcbiAgICB0b3VjaEV2dCxcbiAgICBsYXN0RHgsXG4gICAgbGFzdER5LFxuICAgIHRhcERpc3RhbmNlTGVmdCxcbiAgICB0YXBEaXN0YW5jZVRvcCxcbiAgICBtb3ZlZCxcbiAgICBsYXN0VGFyZ2V0LFxuICAgIGxhc3REaXJlY3Rpb24sXG4gICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gZmFsc2UsXG4gICAgaXNDaXJjdW1zdGFudGlhbEludmVydCA9IGZhbHNlLFxuICAgIHRhcmdldE1vdmVEaXN0YW5jZSxcbiAgICAvLyBGb3IgcG9zaXRpb25pbmcgZ2hvc3QgYWJzb2x1dGVseVxuZ2hvc3RSZWxhdGl2ZVBhcmVudCxcbiAgICBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbCA9IFtdLFxuICAgIC8vIChsZWZ0LCB0b3ApXG5fc2lsZW50ID0gZmFsc2UsXG4gICAgc2F2ZWRJbnB1dENoZWNrZWQgPSBbXTtcbi8qKiBAY29uc3QgKi9cblxudmFyIGRvY3VtZW50RXhpc3RzID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyxcbiAgICBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSA9IElPUyxcbiAgICBDU1NGbG9hdFByb3BlcnR5ID0gRWRnZSB8fCBJRTExT3JMZXNzID8gJ2Nzc0Zsb2F0JyA6ICdmbG9hdCcsXG4gICAgLy8gVGhpcyB3aWxsIG5vdCBwYXNzIGZvciBJRTksIGJlY2F1c2UgSUU5IERuRCBvbmx5IHdvcmtzIG9uIGFuY2hvcnNcbnN1cHBvcnREcmFnZ2FibGUgPSBkb2N1bWVudEV4aXN0cyAmJiAhQ2hyb21lRm9yQW5kcm9pZCAmJiAhSU9TICYmICdkcmFnZ2FibGUnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgIHN1cHBvcnRDc3NQb2ludGVyRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIWRvY3VtZW50RXhpc3RzKSByZXR1cm47IC8vIGZhbHNlIHdoZW4gPD0gSUUxMVxuXG4gIGlmIChJRTExT3JMZXNzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgneCcpO1xuICBlbC5zdHlsZS5jc3NUZXh0ID0gJ3BvaW50ZXItZXZlbnRzOmF1dG8nO1xuICByZXR1cm4gZWwuc3R5bGUucG9pbnRlckV2ZW50cyA9PT0gJ2F1dG8nO1xufSgpLFxuICAgIF9kZXRlY3REaXJlY3Rpb24gPSBmdW5jdGlvbiBfZGV0ZWN0RGlyZWN0aW9uKGVsLCBvcHRpb25zKSB7XG4gIHZhciBlbENTUyA9IGNzcyhlbCksXG4gICAgICBlbFdpZHRoID0gcGFyc2VJbnQoZWxDU1Mud2lkdGgpIC0gcGFyc2VJbnQoZWxDU1MucGFkZGluZ0xlZnQpIC0gcGFyc2VJbnQoZWxDU1MucGFkZGluZ1JpZ2h0KSAtIHBhcnNlSW50KGVsQ1NTLmJvcmRlckxlZnRXaWR0aCkgLSBwYXJzZUludChlbENTUy5ib3JkZXJSaWdodFdpZHRoKSxcbiAgICAgIGNoaWxkMSA9IGdldENoaWxkKGVsLCAwLCBvcHRpb25zKSxcbiAgICAgIGNoaWxkMiA9IGdldENoaWxkKGVsLCAxLCBvcHRpb25zKSxcbiAgICAgIGZpcnN0Q2hpbGRDU1MgPSBjaGlsZDEgJiYgY3NzKGNoaWxkMSksXG4gICAgICBzZWNvbmRDaGlsZENTUyA9IGNoaWxkMiAmJiBjc3MoY2hpbGQyKSxcbiAgICAgIGZpcnN0Q2hpbGRXaWR0aCA9IGZpcnN0Q2hpbGRDU1MgJiYgcGFyc2VJbnQoZmlyc3RDaGlsZENTUy5tYXJnaW5MZWZ0KSArIHBhcnNlSW50KGZpcnN0Q2hpbGRDU1MubWFyZ2luUmlnaHQpICsgZ2V0UmVjdChjaGlsZDEpLndpZHRoLFxuICAgICAgc2Vjb25kQ2hpbGRXaWR0aCA9IHNlY29uZENoaWxkQ1NTICYmIHBhcnNlSW50KHNlY29uZENoaWxkQ1NTLm1hcmdpbkxlZnQpICsgcGFyc2VJbnQoc2Vjb25kQ2hpbGRDU1MubWFyZ2luUmlnaHQpICsgZ2V0UmVjdChjaGlsZDIpLndpZHRoO1xuXG4gIGlmIChlbENTUy5kaXNwbGF5ID09PSAnZmxleCcpIHtcbiAgICByZXR1cm4gZWxDU1MuZmxleERpcmVjdGlvbiA9PT0gJ2NvbHVtbicgfHwgZWxDU1MuZmxleERpcmVjdGlvbiA9PT0gJ2NvbHVtbi1yZXZlcnNlJyA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gIH1cblxuICBpZiAoZWxDU1MuZGlzcGxheSA9PT0gJ2dyaWQnKSB7XG4gICAgcmV0dXJuIGVsQ1NTLmdyaWRUZW1wbGF0ZUNvbHVtbnMuc3BsaXQoJyAnKS5sZW5ndGggPD0gMSA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gIH1cblxuICBpZiAoY2hpbGQxICYmIGZpcnN0Q2hpbGRDU1NbXCJmbG9hdFwiXSAmJiBmaXJzdENoaWxkQ1NTW1wiZmxvYXRcIl0gIT09ICdub25lJykge1xuICAgIHZhciB0b3VjaGluZ1NpZGVDaGlsZDIgPSBmaXJzdENoaWxkQ1NTW1wiZmxvYXRcIl0gPT09ICdsZWZ0JyA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgcmV0dXJuIGNoaWxkMiAmJiAoc2Vjb25kQ2hpbGRDU1MuY2xlYXIgPT09ICdib3RoJyB8fCBzZWNvbmRDaGlsZENTUy5jbGVhciA9PT0gdG91Y2hpbmdTaWRlQ2hpbGQyKSA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gIH1cblxuICByZXR1cm4gY2hpbGQxICYmIChmaXJzdENoaWxkQ1NTLmRpc3BsYXkgPT09ICdibG9jaycgfHwgZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSAnZmxleCcgfHwgZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSAndGFibGUnIHx8IGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ2dyaWQnIHx8IGZpcnN0Q2hpbGRXaWR0aCA+PSBlbFdpZHRoICYmIGVsQ1NTW0NTU0Zsb2F0UHJvcGVydHldID09PSAnbm9uZScgfHwgY2hpbGQyICYmIGVsQ1NTW0NTU0Zsb2F0UHJvcGVydHldID09PSAnbm9uZScgJiYgZmlyc3RDaGlsZFdpZHRoICsgc2Vjb25kQ2hpbGRXaWR0aCA+IGVsV2lkdGgpID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbn0sXG4gICAgX2RyYWdFbEluUm93Q29sdW1uID0gZnVuY3Rpb24gX2RyYWdFbEluUm93Q29sdW1uKGRyYWdSZWN0LCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCkge1xuICB2YXIgZHJhZ0VsUzFPcHAgPSB2ZXJ0aWNhbCA/IGRyYWdSZWN0LmxlZnQgOiBkcmFnUmVjdC50b3AsXG4gICAgICBkcmFnRWxTMk9wcCA9IHZlcnRpY2FsID8gZHJhZ1JlY3QucmlnaHQgOiBkcmFnUmVjdC5ib3R0b20sXG4gICAgICBkcmFnRWxPcHBMZW5ndGggPSB2ZXJ0aWNhbCA/IGRyYWdSZWN0LndpZHRoIDogZHJhZ1JlY3QuaGVpZ2h0LFxuICAgICAgdGFyZ2V0UzFPcHAgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QubGVmdCA6IHRhcmdldFJlY3QudG9wLFxuICAgICAgdGFyZ2V0UzJPcHAgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QucmlnaHQgOiB0YXJnZXRSZWN0LmJvdHRvbSxcbiAgICAgIHRhcmdldE9wcExlbmd0aCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC53aWR0aCA6IHRhcmdldFJlY3QuaGVpZ2h0O1xuICByZXR1cm4gZHJhZ0VsUzFPcHAgPT09IHRhcmdldFMxT3BwIHx8IGRyYWdFbFMyT3BwID09PSB0YXJnZXRTMk9wcCB8fCBkcmFnRWxTMU9wcCArIGRyYWdFbE9wcExlbmd0aCAvIDIgPT09IHRhcmdldFMxT3BwICsgdGFyZ2V0T3BwTGVuZ3RoIC8gMjtcbn0sXG5cbi8qKlxuICogRGV0ZWN0cyBmaXJzdCBuZWFyZXN0IGVtcHR5IHNvcnRhYmxlIHRvIFggYW5kIFkgcG9zaXRpb24gdXNpbmcgZW1wdHlJbnNlcnRUaHJlc2hvbGQuXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggICAgICBYIHBvc2l0aW9uXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkgICAgICBZIHBvc2l0aW9uXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gICBFbGVtZW50IG9mIHRoZSBmaXJzdCBmb3VuZCBuZWFyZXN0IFNvcnRhYmxlXG4gKi9cbl9kZXRlY3ROZWFyZXN0RW1wdHlTb3J0YWJsZSA9IGZ1bmN0aW9uIF9kZXRlY3ROZWFyZXN0RW1wdHlTb3J0YWJsZSh4LCB5KSB7XG4gIHZhciByZXQ7XG4gIHNvcnRhYmxlcy5zb21lKGZ1bmN0aW9uIChzb3J0YWJsZSkge1xuICAgIHZhciB0aHJlc2hvbGQgPSBzb3J0YWJsZVtleHBhbmRvXS5vcHRpb25zLmVtcHR5SW5zZXJ0VGhyZXNob2xkO1xuICAgIGlmICghdGhyZXNob2xkIHx8IGxhc3RDaGlsZChzb3J0YWJsZSkpIHJldHVybjtcbiAgICB2YXIgcmVjdCA9IGdldFJlY3Qoc29ydGFibGUpLFxuICAgICAgICBpbnNpZGVIb3Jpem9udGFsbHkgPSB4ID49IHJlY3QubGVmdCAtIHRocmVzaG9sZCAmJiB4IDw9IHJlY3QucmlnaHQgKyB0aHJlc2hvbGQsXG4gICAgICAgIGluc2lkZVZlcnRpY2FsbHkgPSB5ID49IHJlY3QudG9wIC0gdGhyZXNob2xkICYmIHkgPD0gcmVjdC5ib3R0b20gKyB0aHJlc2hvbGQ7XG5cbiAgICBpZiAoaW5zaWRlSG9yaXpvbnRhbGx5ICYmIGluc2lkZVZlcnRpY2FsbHkpIHtcbiAgICAgIHJldHVybiByZXQgPSBzb3J0YWJsZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmV0O1xufSxcbiAgICBfcHJlcGFyZUdyb3VwID0gZnVuY3Rpb24gX3ByZXBhcmVHcm91cChvcHRpb25zKSB7XG4gIGZ1bmN0aW9uIHRvRm4odmFsdWUsIHB1bGwpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRvLCBmcm9tLCBkcmFnRWwsIGV2dCkge1xuICAgICAgdmFyIHNhbWVHcm91cCA9IHRvLm9wdGlvbnMuZ3JvdXAubmFtZSAmJiBmcm9tLm9wdGlvbnMuZ3JvdXAubmFtZSAmJiB0by5vcHRpb25zLmdyb3VwLm5hbWUgPT09IGZyb20ub3B0aW9ucy5ncm91cC5uYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiAocHVsbCB8fCBzYW1lR3JvdXApKSB7XG4gICAgICAgIC8vIERlZmF1bHQgcHVsbCB2YWx1ZVxuICAgICAgICAvLyBEZWZhdWx0IHB1bGwgYW5kIHB1dCB2YWx1ZSBpZiBzYW1lIGdyb3VwXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHB1bGwgJiYgdmFsdWUgPT09ICdjbG9uZScpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRvRm4odmFsdWUodG8sIGZyb20sIGRyYWdFbCwgZXZ0KSwgcHVsbCkodG8sIGZyb20sIGRyYWdFbCwgZXZ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvdGhlckdyb3VwID0gKHB1bGwgPyB0byA6IGZyb20pLm9wdGlvbnMuZ3JvdXAubmFtZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgPT09IG90aGVyR3JvdXAgfHwgdmFsdWUuam9pbiAmJiB2YWx1ZS5pbmRleE9mKG90aGVyR3JvdXApID4gLTE7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHZhciBncm91cCA9IHt9O1xuICB2YXIgb3JpZ2luYWxHcm91cCA9IG9wdGlvbnMuZ3JvdXA7XG5cbiAgaWYgKCFvcmlnaW5hbEdyb3VwIHx8IF90eXBlb2Yob3JpZ2luYWxHcm91cCkgIT0gJ29iamVjdCcpIHtcbiAgICBvcmlnaW5hbEdyb3VwID0ge1xuICAgICAgbmFtZTogb3JpZ2luYWxHcm91cFxuICAgIH07XG4gIH1cblxuICBncm91cC5uYW1lID0gb3JpZ2luYWxHcm91cC5uYW1lO1xuICBncm91cC5jaGVja1B1bGwgPSB0b0ZuKG9yaWdpbmFsR3JvdXAucHVsbCwgdHJ1ZSk7XG4gIGdyb3VwLmNoZWNrUHV0ID0gdG9GbihvcmlnaW5hbEdyb3VwLnB1dCk7XG4gIGdyb3VwLnJldmVydENsb25lID0gb3JpZ2luYWxHcm91cC5yZXZlcnRDbG9uZTtcbiAgb3B0aW9ucy5ncm91cCA9IGdyb3VwO1xufSxcbiAgICBfaGlkZUdob3N0Rm9yVGFyZ2V0ID0gZnVuY3Rpb24gX2hpZGVHaG9zdEZvclRhcmdldCgpIHtcbiAgaWYgKCFzdXBwb3J0Q3NzUG9pbnRlckV2ZW50cyAmJiBnaG9zdEVsKSB7XG4gICAgY3NzKGdob3N0RWwsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgfVxufSxcbiAgICBfdW5oaWRlR2hvc3RGb3JUYXJnZXQgPSBmdW5jdGlvbiBfdW5oaWRlR2hvc3RGb3JUYXJnZXQoKSB7XG4gIGlmICghc3VwcG9ydENzc1BvaW50ZXJFdmVudHMgJiYgZ2hvc3RFbCkge1xuICAgIGNzcyhnaG9zdEVsLCAnZGlzcGxheScsICcnKTtcbiAgfVxufTsgLy8gIzExODQgZml4IC0gUHJldmVudCBjbGljayBldmVudCBvbiBmYWxsYmFjayBpZiBkcmFnZ2VkIGJ1dCBpdGVtIG5vdCBjaGFuZ2VkIHBvc2l0aW9uXG5cblxuaWYgKGRvY3VtZW50RXhpc3RzKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGlmIChpZ25vcmVOZXh0Q2xpY2spIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbiAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICYmIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIGlnbm9yZU5leHRDbGljayA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG59XG5cbnZhciBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCA9IGZ1bmN0aW9uIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KGV2dCkge1xuICBpZiAoZHJhZ0VsKSB7XG4gICAgZXZ0ID0gZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dDtcblxuICAgIHZhciBuZWFyZXN0ID0gX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlKGV2dC5jbGllbnRYLCBldnQuY2xpZW50WSk7XG5cbiAgICBpZiAobmVhcmVzdCkge1xuICAgICAgLy8gQ3JlYXRlIGltaXRhdGlvbiBldmVudFxuICAgICAgdmFyIGV2ZW50ID0ge307XG5cbiAgICAgIGZvciAodmFyIGkgaW4gZXZ0KSB7XG4gICAgICAgIGlmIChldnQuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICBldmVudFtpXSA9IGV2dFtpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBldmVudC50YXJnZXQgPSBldmVudC5yb290RWwgPSBuZWFyZXN0O1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQgPSB2b2lkIDA7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24gPSB2b2lkIDA7XG5cbiAgICAgIG5lYXJlc3RbZXhwYW5kb10uX29uRHJhZ092ZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIF9jaGVja091dHNpZGVUYXJnZXRFbCA9IGZ1bmN0aW9uIF9jaGVja091dHNpZGVUYXJnZXRFbChldnQpIHtcbiAgaWYgKGRyYWdFbCkge1xuICAgIGRyYWdFbC5wYXJlbnROb2RlW2V4cGFuZG9dLl9pc091dHNpZGVUaGlzRWwoZXZ0LnRhcmdldCk7XG4gIH1cbn07XG4vKipcbiAqIEBjbGFzcyAgU29ydGFibGVcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgZWxcbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgW29wdGlvbnNdXG4gKi9cblxuXG5mdW5jdGlvbiBTb3J0YWJsZShlbCwgb3B0aW9ucykge1xuICBpZiAoIShlbCAmJiBlbC5ub2RlVHlwZSAmJiBlbC5ub2RlVHlwZSA9PT0gMSkpIHtcbiAgICB0aHJvdyBcIlNvcnRhYmxlOiBgZWxgIG11c3QgYmUgYW4gSFRNTEVsZW1lbnQsIG5vdCBcIi5jb25jYXQoe30udG9TdHJpbmcuY2FsbChlbCkpO1xuICB9XG5cbiAgdGhpcy5lbCA9IGVsOyAvLyByb290IGVsZW1lbnRcblxuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID0gX2V4dGVuZHMoe30sIG9wdGlvbnMpOyAvLyBFeHBvcnQgaW5zdGFuY2VcblxuICBlbFtleHBhbmRvXSA9IHRoaXM7XG4gIHZhciBkZWZhdWx0cyA9IHtcbiAgICBncm91cDogbnVsbCxcbiAgICBzb3J0OiB0cnVlLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBzdG9yZTogbnVsbCxcbiAgICBoYW5kbGU6IG51bGwsXG4gICAgZHJhZ2dhYmxlOiAvXlt1b11sJC9pLnRlc3QoZWwubm9kZU5hbWUpID8gJz5saScgOiAnPionLFxuICAgIHN3YXBUaHJlc2hvbGQ6IDEsXG4gICAgLy8gcGVyY2VudGFnZTsgMCA8PSB4IDw9IDFcbiAgICBpbnZlcnRTd2FwOiBmYWxzZSxcbiAgICAvLyBpbnZlcnQgYWx3YXlzXG4gICAgaW52ZXJ0ZWRTd2FwVGhyZXNob2xkOiBudWxsLFxuICAgIC8vIHdpbGwgYmUgc2V0IHRvIHNhbWUgYXMgc3dhcFRocmVzaG9sZCBpZiBkZWZhdWx0XG4gICAgcmVtb3ZlQ2xvbmVPbkhpZGU6IHRydWUsXG4gICAgZGlyZWN0aW9uOiBmdW5jdGlvbiBkaXJlY3Rpb24oKSB7XG4gICAgICByZXR1cm4gX2RldGVjdERpcmVjdGlvbihlbCwgdGhpcy5vcHRpb25zKTtcbiAgICB9LFxuICAgIGdob3N0Q2xhc3M6ICdzb3J0YWJsZS1naG9zdCcsXG4gICAgY2hvc2VuQ2xhc3M6ICdzb3J0YWJsZS1jaG9zZW4nLFxuICAgIGRyYWdDbGFzczogJ3NvcnRhYmxlLWRyYWcnLFxuICAgIGlnbm9yZTogJ2EsIGltZycsXG4gICAgZmlsdGVyOiBudWxsLFxuICAgIHByZXZlbnRPbkZpbHRlcjogdHJ1ZSxcbiAgICBhbmltYXRpb246IDAsXG4gICAgZWFzaW5nOiBudWxsLFxuICAgIHNldERhdGE6IGZ1bmN0aW9uIHNldERhdGEoZGF0YVRyYW5zZmVyLCBkcmFnRWwpIHtcbiAgICAgIGRhdGFUcmFuc2Zlci5zZXREYXRhKCdUZXh0JywgZHJhZ0VsLnRleHRDb250ZW50KTtcbiAgICB9LFxuICAgIGRyb3BCdWJibGU6IGZhbHNlLFxuICAgIGRyYWdvdmVyQnViYmxlOiBmYWxzZSxcbiAgICBkYXRhSWRBdHRyOiAnZGF0YS1pZCcsXG4gICAgZGVsYXk6IDAsXG4gICAgZGVsYXlPblRvdWNoT25seTogZmFsc2UsXG4gICAgdG91Y2hTdGFydFRocmVzaG9sZDogKE51bWJlci5wYXJzZUludCA/IE51bWJlciA6IHdpbmRvdykucGFyc2VJbnQod2luZG93LmRldmljZVBpeGVsUmF0aW8sIDEwKSB8fCAxLFxuICAgIGZvcmNlRmFsbGJhY2s6IGZhbHNlLFxuICAgIGZhbGxiYWNrQ2xhc3M6ICdzb3J0YWJsZS1mYWxsYmFjaycsXG4gICAgZmFsbGJhY2tPbkJvZHk6IGZhbHNlLFxuICAgIGZhbGxiYWNrVG9sZXJhbmNlOiAwLFxuICAgIGZhbGxiYWNrT2Zmc2V0OiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH0sXG4gICAgc3VwcG9ydFBvaW50ZXI6IFNvcnRhYmxlLnN1cHBvcnRQb2ludGVyICE9PSBmYWxzZSAmJiAnUG9pbnRlckV2ZW50JyBpbiB3aW5kb3cgJiYgIVNhZmFyaSxcbiAgICBlbXB0eUluc2VydFRocmVzaG9sZDogNVxuICB9O1xuICBQbHVnaW5NYW5hZ2VyLmluaXRpYWxpemVQbHVnaW5zKHRoaXMsIGVsLCBkZWZhdWx0cyk7IC8vIFNldCBkZWZhdWx0IG9wdGlvbnNcblxuICBmb3IgKHZhciBuYW1lIGluIGRlZmF1bHRzKSB7XG4gICAgIShuYW1lIGluIG9wdGlvbnMpICYmIChvcHRpb25zW25hbWVdID0gZGVmYXVsdHNbbmFtZV0pO1xuICB9XG5cbiAgX3ByZXBhcmVHcm91cChvcHRpb25zKTsgLy8gQmluZCBhbGwgcHJpdmF0ZSBtZXRob2RzXG5cblxuICBmb3IgKHZhciBmbiBpbiB0aGlzKSB7XG4gICAgaWYgKGZuLmNoYXJBdCgwKSA9PT0gJ18nICYmIHR5cGVvZiB0aGlzW2ZuXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tmbl0gPSB0aGlzW2ZuXS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgfSAvLyBTZXR1cCBkcmFnIG1vZGVcblxuXG4gIHRoaXMubmF0aXZlRHJhZ2dhYmxlID0gb3B0aW9ucy5mb3JjZUZhbGxiYWNrID8gZmFsc2UgOiBzdXBwb3J0RHJhZ2dhYmxlO1xuXG4gIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgIC8vIFRvdWNoIHN0YXJ0IHRocmVzaG9sZCBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBuYXRpdmUgZHJhZ3N0YXJ0IHRocmVzaG9sZFxuICAgIHRoaXMub3B0aW9ucy50b3VjaFN0YXJ0VGhyZXNob2xkID0gMTtcbiAgfSAvLyBCaW5kIGV2ZW50c1xuXG5cbiAgaWYgKG9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICBvbihlbCwgJ3BvaW50ZXJkb3duJywgdGhpcy5fb25UYXBTdGFydCk7XG4gIH0gZWxzZSB7XG4gICAgb24oZWwsICdtb3VzZWRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgICBvbihlbCwgJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgfVxuXG4gIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgIG9uKGVsLCAnZHJhZ292ZXInLCB0aGlzKTtcbiAgICBvbihlbCwgJ2RyYWdlbnRlcicsIHRoaXMpO1xuICB9XG5cbiAgc29ydGFibGVzLnB1c2godGhpcy5lbCk7IC8vIFJlc3RvcmUgc29ydGluZ1xuXG4gIG9wdGlvbnMuc3RvcmUgJiYgb3B0aW9ucy5zdG9yZS5nZXQgJiYgdGhpcy5zb3J0KG9wdGlvbnMuc3RvcmUuZ2V0KHRoaXMpIHx8IFtdKTsgLy8gQWRkIGFuaW1hdGlvbiBzdGF0ZSBtYW5hZ2VyXG5cbiAgX2V4dGVuZHModGhpcywgQW5pbWF0aW9uU3RhdGVNYW5hZ2VyKCkpO1xufVxuXG5Tb3J0YWJsZS5wcm90b3R5cGUgPVxuLyoqIEBsZW5kcyBTb3J0YWJsZS5wcm90b3R5cGUgKi9cbntcbiAgY29uc3RydWN0b3I6IFNvcnRhYmxlLFxuICBfaXNPdXRzaWRlVGhpc0VsOiBmdW5jdGlvbiBfaXNPdXRzaWRlVGhpc0VsKHRhcmdldCkge1xuICAgIGlmICghdGhpcy5lbC5jb250YWlucyh0YXJnZXQpICYmIHRhcmdldCAhPT0gdGhpcy5lbCkge1xuICAgICAgbGFzdFRhcmdldCA9IG51bGw7XG4gICAgfVxuICB9LFxuICBfZ2V0RGlyZWN0aW9uOiBmdW5jdGlvbiBfZ2V0RGlyZWN0aW9uKGV2dCwgdGFyZ2V0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uID09PSAnZnVuY3Rpb24nID8gdGhpcy5vcHRpb25zLmRpcmVjdGlvbi5jYWxsKHRoaXMsIGV2dCwgdGFyZ2V0LCBkcmFnRWwpIDogdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgfSxcbiAgX29uVGFwU3RhcnQ6IGZ1bmN0aW9uIF9vblRhcFN0YXJ0KFxuICAvKiogRXZlbnR8VG91Y2hFdmVudCAqL1xuICBldnQpIHtcbiAgICBpZiAoIWV2dC5jYW5jZWxhYmxlKSByZXR1cm47XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzLFxuICAgICAgICBlbCA9IHRoaXMuZWwsXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIHByZXZlbnRPbkZpbHRlciA9IG9wdGlvbnMucHJldmVudE9uRmlsdGVyLFxuICAgICAgICB0eXBlID0gZXZ0LnR5cGUsXG4gICAgICAgIHRvdWNoID0gZXZ0LnRvdWNoZXMgJiYgZXZ0LnRvdWNoZXNbMF0gfHwgZXZ0LnBvaW50ZXJUeXBlICYmIGV2dC5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJyAmJiBldnQsXG4gICAgICAgIHRhcmdldCA9ICh0b3VjaCB8fCBldnQpLnRhcmdldCxcbiAgICAgICAgb3JpZ2luYWxUYXJnZXQgPSBldnQudGFyZ2V0LnNoYWRvd1Jvb3QgJiYgKGV2dC5wYXRoICYmIGV2dC5wYXRoWzBdIHx8IGV2dC5jb21wb3NlZFBhdGggJiYgZXZ0LmNvbXBvc2VkUGF0aCgpWzBdKSB8fCB0YXJnZXQsXG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuXG4gICAgX3NhdmVJbnB1dENoZWNrZWRTdGF0ZShlbCk7IC8vIERvbid0IHRyaWdnZXIgc3RhcnQgZXZlbnQgd2hlbiBhbiBlbGVtZW50IGlzIGJlZW4gZHJhZ2dlZCwgb3RoZXJ3aXNlIHRoZSBldnQub2xkaW5kZXggYWx3YXlzIHdyb25nIHdoZW4gc2V0IG9wdGlvbi5ncm91cC5cblxuXG4gICAgaWYgKGRyYWdFbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgvbW91c2Vkb3dufHBvaW50ZXJkb3duLy50ZXN0KHR5cGUpICYmIGV2dC5idXR0b24gIT09IDAgfHwgb3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuOyAvLyBvbmx5IGxlZnQgYnV0dG9uIGFuZCBlbmFibGVkXG4gICAgfSAvLyBjYW5jZWwgZG5kIGlmIG9yaWdpbmFsIHRhcmdldCBpcyBjb250ZW50IGVkaXRhYmxlXG5cblxuICAgIGlmIChvcmlnaW5hbFRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gU2FmYXJpIGlnbm9yZXMgZnVydGhlciBldmVudCBoYW5kbGluZyBhZnRlciBtb3VzZWRvd25cblxuXG4gICAgaWYgKCF0aGlzLm5hdGl2ZURyYWdnYWJsZSAmJiBTYWZhcmkgJiYgdGFyZ2V0ICYmIHRhcmdldC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdTRUxFQ1QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gY2xvc2VzdCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlLCBlbCwgZmFsc2UpO1xuXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuYW5pbWF0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobGFzdERvd25FbCA9PT0gdGFyZ2V0KSB7XG4gICAgICAvLyBJZ25vcmluZyBkdXBsaWNhdGUgYGRvd25gXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBkcmFnZ2VkIGVsZW1lbnQgd2l0aGluIGl0cyBwYXJlbnRcblxuXG4gICAgb2xkSW5kZXggPSBpbmRleCh0YXJnZXQpO1xuICAgIG9sZERyYWdnYWJsZUluZGV4ID0gaW5kZXgodGFyZ2V0LCBvcHRpb25zLmRyYWdnYWJsZSk7IC8vIENoZWNrIGZpbHRlclxuXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChmaWx0ZXIuY2FsbCh0aGlzLCBldnQsIHRhcmdldCwgdGhpcykpIHtcbiAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgIHNvcnRhYmxlOiBfdGhpcyxcbiAgICAgICAgICByb290RWw6IG9yaWdpbmFsVGFyZ2V0LFxuICAgICAgICAgIG5hbWU6ICdmaWx0ZXInLFxuICAgICAgICAgIHRhcmdldEVsOiB0YXJnZXQsXG4gICAgICAgICAgdG9FbDogZWwsXG4gICAgICAgICAgZnJvbUVsOiBlbFxuICAgICAgICB9KTtcblxuICAgICAgICBwbHVnaW5FdmVudCgnZmlsdGVyJywgX3RoaXMsIHtcbiAgICAgICAgICBldnQ6IGV2dFxuICAgICAgICB9KTtcbiAgICAgICAgcHJldmVudE9uRmlsdGVyICYmIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47IC8vIGNhbmNlbCBkbmRcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpbHRlcikge1xuICAgICAgZmlsdGVyID0gZmlsdGVyLnNwbGl0KCcsJykuc29tZShmdW5jdGlvbiAoY3JpdGVyaWEpIHtcbiAgICAgICAgY3JpdGVyaWEgPSBjbG9zZXN0KG9yaWdpbmFsVGFyZ2V0LCBjcml0ZXJpYS50cmltKCksIGVsLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKGNyaXRlcmlhKSB7XG4gICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgICAgcm9vdEVsOiBjcml0ZXJpYSxcbiAgICAgICAgICAgIG5hbWU6ICdmaWx0ZXInLFxuICAgICAgICAgICAgdGFyZ2V0RWw6IHRhcmdldCxcbiAgICAgICAgICAgIGZyb21FbDogZWwsXG4gICAgICAgICAgICB0b0VsOiBlbFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGx1Z2luRXZlbnQoJ2ZpbHRlcicsIF90aGlzLCB7XG4gICAgICAgICAgICBldnQ6IGV2dFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICBwcmV2ZW50T25GaWx0ZXIgJiYgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjsgLy8gY2FuY2VsIGRuZFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmhhbmRsZSAmJiAhY2xvc2VzdChvcmlnaW5hbFRhcmdldCwgb3B0aW9ucy5oYW5kbGUsIGVsLCBmYWxzZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFByZXBhcmUgYGRyYWdzdGFydGBcblxuXG4gICAgdGhpcy5fcHJlcGFyZURyYWdTdGFydChldnQsIHRvdWNoLCB0YXJnZXQpO1xuICB9LFxuICBfcHJlcGFyZURyYWdTdGFydDogZnVuY3Rpb24gX3ByZXBhcmVEcmFnU3RhcnQoXG4gIC8qKiBFdmVudCAqL1xuICBldnQsXG4gIC8qKiBUb3VjaCAqL1xuICB0b3VjaCxcbiAgLyoqIEhUTUxFbGVtZW50ICovXG4gIHRhcmdldCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICAgIGVsID0gX3RoaXMuZWwsXG4gICAgICAgIG9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLFxuICAgICAgICBvd25lckRvY3VtZW50ID0gZWwub3duZXJEb2N1bWVudCxcbiAgICAgICAgZHJhZ1N0YXJ0Rm47XG5cbiAgICBpZiAodGFyZ2V0ICYmICFkcmFnRWwgJiYgdGFyZ2V0LnBhcmVudE5vZGUgPT09IGVsKSB7XG4gICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICByb290RWwgPSBlbDtcbiAgICAgIGRyYWdFbCA9IHRhcmdldDtcbiAgICAgIHBhcmVudEVsID0gZHJhZ0VsLnBhcmVudE5vZGU7XG4gICAgICBuZXh0RWwgPSBkcmFnRWwubmV4dFNpYmxpbmc7XG4gICAgICBsYXN0RG93bkVsID0gdGFyZ2V0O1xuICAgICAgYWN0aXZlR3JvdXAgPSBvcHRpb25zLmdyb3VwO1xuICAgICAgU29ydGFibGUuZHJhZ2dlZCA9IGRyYWdFbDtcbiAgICAgIHRhcEV2dCA9IHtcbiAgICAgICAgdGFyZ2V0OiBkcmFnRWwsXG4gICAgICAgIGNsaWVudFg6ICh0b3VjaCB8fCBldnQpLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6ICh0b3VjaCB8fCBldnQpLmNsaWVudFlcbiAgICAgIH07XG4gICAgICB0YXBEaXN0YW5jZUxlZnQgPSB0YXBFdnQuY2xpZW50WCAtIGRyYWdSZWN0LmxlZnQ7XG4gICAgICB0YXBEaXN0YW5jZVRvcCA9IHRhcEV2dC5jbGllbnRZIC0gZHJhZ1JlY3QudG9wO1xuICAgICAgdGhpcy5fbGFzdFggPSAodG91Y2ggfHwgZXZ0KS5jbGllbnRYO1xuICAgICAgdGhpcy5fbGFzdFkgPSAodG91Y2ggfHwgZXZ0KS5jbGllbnRZO1xuICAgICAgZHJhZ0VsLnN0eWxlWyd3aWxsLWNoYW5nZSddID0gJ2FsbCc7XG5cbiAgICAgIGRyYWdTdGFydEZuID0gZnVuY3Rpb24gZHJhZ1N0YXJ0Rm4oKSB7XG4gICAgICAgIHBsdWdpbkV2ZW50KCdkZWxheUVuZGVkJywgX3RoaXMsIHtcbiAgICAgICAgICBldnQ6IGV2dFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgICAgIF90aGlzLl9vbkRyb3AoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBEZWxheWVkIGRyYWcgaGFzIGJlZW4gdHJpZ2dlcmVkXG4gICAgICAgIC8vIHdlIGNhbiByZS1lbmFibGUgdGhlIGV2ZW50czogdG91Y2htb3ZlL21vdXNlbW92ZVxuXG5cbiAgICAgICAgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpO1xuXG4gICAgICAgIGlmICghRmlyZUZveCAmJiBfdGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgICBkcmFnRWwuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgfSAvLyBCaW5kIHRoZSBldmVudHM6IGRyYWdzdGFydC9kcmFnZW5kXG5cblxuICAgICAgICBfdGhpcy5fdHJpZ2dlckRyYWdTdGFydChldnQsIHRvdWNoKTsgLy8gRHJhZyBzdGFydCBldmVudFxuXG5cbiAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgIHNvcnRhYmxlOiBfdGhpcyxcbiAgICAgICAgICBuYW1lOiAnY2hvb3NlJyxcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgfSk7IC8vIENob3NlbiBpdGVtXG5cblxuICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuY2hvc2VuQ2xhc3MsIHRydWUpO1xuICAgICAgfTsgLy8gRGlzYWJsZSBcImRyYWdnYWJsZVwiXG5cblxuICAgICAgb3B0aW9ucy5pZ25vcmUuc3BsaXQoJywnKS5mb3JFYWNoKGZ1bmN0aW9uIChjcml0ZXJpYSkge1xuICAgICAgICBmaW5kKGRyYWdFbCwgY3JpdGVyaWEudHJpbSgpLCBfZGlzYWJsZURyYWdnYWJsZSk7XG4gICAgICB9KTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdkcmFnb3ZlcicsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2htb3ZlJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgX3RoaXMuX29uRHJvcCk7IC8vIE1ha2UgZHJhZ0VsIGRyYWdnYWJsZSAobXVzdCBiZSBiZWZvcmUgZGVsYXkgZm9yIEZpcmVGb3gpXG5cbiAgICAgIGlmIChGaXJlRm94ICYmIHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50b3VjaFN0YXJ0VGhyZXNob2xkID0gNDtcbiAgICAgICAgZHJhZ0VsLmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHBsdWdpbkV2ZW50KCdkZWxheVN0YXJ0JywgdGhpcywge1xuICAgICAgICBldnQ6IGV2dFxuICAgICAgfSk7IC8vIERlbGF5IGlzIGltcG9zc2libGUgZm9yIG5hdGl2ZSBEbkQgaW4gRWRnZSBvciBJRVxuXG4gICAgICBpZiAob3B0aW9ucy5kZWxheSAmJiAoIW9wdGlvbnMuZGVsYXlPblRvdWNoT25seSB8fCB0b3VjaCkgJiYgKCF0aGlzLm5hdGl2ZURyYWdnYWJsZSB8fCAhKEVkZ2UgfHwgSUUxMU9yTGVzcykpKSB7XG4gICAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICAgICAgdGhpcy5fb25Ecm9wKCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gSWYgdGhlIHVzZXIgbW92ZXMgdGhlIHBvaW50ZXIgb3IgbGV0IGdvIHRoZSBjbGljayBvciB0b3VjaFxuICAgICAgICAvLyBiZWZvcmUgdGhlIGRlbGF5IGhhcyBiZWVuIHJlYWNoZWQ6XG4gICAgICAgIC8vIGRpc2FibGUgdGhlIGRlbGF5ZWQgZHJhZ1xuXG5cbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoZW5kJywgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2Vtb3ZlJywgX3RoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaG1vdmUnLCBfdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICAgICAgb3B0aW9ucy5zdXBwb3J0UG9pbnRlciAmJiBvbihvd25lckRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCBfdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICAgICAgX3RoaXMuX2RyYWdTdGFydFRpbWVyID0gc2V0VGltZW91dChkcmFnU3RhcnRGbiwgb3B0aW9ucy5kZWxheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmFnU3RhcnRGbigpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcjogZnVuY3Rpb24gX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcihcbiAgLyoqIFRvdWNoRXZlbnR8UG9pbnRlckV2ZW50ICoqL1xuICBlKSB7XG4gICAgdmFyIHRvdWNoID0gZS50b3VjaGVzID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgIGlmIChNYXRoLm1heChNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy5fbGFzdFgpLCBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy5fbGFzdFkpKSA+PSBNYXRoLmZsb29yKHRoaXMub3B0aW9ucy50b3VjaFN0YXJ0VGhyZXNob2xkIC8gKHRoaXMubmF0aXZlRHJhZ2dhYmxlICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpKSkge1xuICAgICAgdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKCk7XG4gICAgfVxuICB9LFxuICBfZGlzYWJsZURlbGF5ZWREcmFnOiBmdW5jdGlvbiBfZGlzYWJsZURlbGF5ZWREcmFnKCkge1xuICAgIGRyYWdFbCAmJiBfZGlzYWJsZURyYWdnYWJsZShkcmFnRWwpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9kcmFnU3RhcnRUaW1lcik7XG5cbiAgICB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWdFdmVudHMoKTtcbiAgfSxcbiAgX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50czogZnVuY3Rpb24gX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHRoaXMuZWwub3duZXJEb2N1bWVudDtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gIH0sXG4gIF90cmlnZ2VyRHJhZ1N0YXJ0OiBmdW5jdGlvbiBfdHJpZ2dlckRyYWdTdGFydChcbiAgLyoqIEV2ZW50ICovXG4gIGV2dCxcbiAgLyoqIFRvdWNoICovXG4gIHRvdWNoKSB7XG4gICAgdG91Y2ggPSB0b3VjaCB8fCBldnQucG9pbnRlclR5cGUgPT0gJ3RvdWNoJyAmJiBldnQ7XG5cbiAgICBpZiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlIHx8IHRvdWNoKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnN1cHBvcnRQb2ludGVyKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICB9IGVsc2UgaWYgKHRvdWNoKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uKGRyYWdFbCwgJ2RyYWdlbmQnLCB0aGlzKTtcbiAgICAgIG9uKHJvb3RFbCwgJ2RyYWdzdGFydCcsIHRoaXMuX29uRHJhZ1N0YXJ0KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikge1xuICAgICAgICAvLyBUaW1lb3V0IG5lY2Nlc3NhcnkgZm9yIElFOVxuICAgICAgICBfbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHt9XG4gIH0sXG4gIF9kcmFnU3RhcnRlZDogZnVuY3Rpb24gX2RyYWdTdGFydGVkKGZhbGxiYWNrLCBldnQpIHtcblxuICAgIGF3YWl0aW5nRHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIGlmIChyb290RWwgJiYgZHJhZ0VsKSB7XG4gICAgICBwbHVnaW5FdmVudCgnZHJhZ1N0YXJ0ZWQnLCB0aGlzLCB7XG4gICAgICAgIGV2dDogZXZ0XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAnZHJhZ292ZXInLCBfY2hlY2tPdXRzaWRlVGFyZ2V0RWwpO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsgLy8gQXBwbHkgZWZmZWN0XG5cbiAgICAgICFmYWxsYmFjayAmJiB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZHJhZ0NsYXNzLCBmYWxzZSk7XG4gICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgdHJ1ZSk7XG4gICAgICBTb3J0YWJsZS5hY3RpdmUgPSB0aGlzO1xuICAgICAgZmFsbGJhY2sgJiYgdGhpcy5fYXBwZW5kR2hvc3QoKTsgLy8gRHJhZyBzdGFydCBldmVudFxuXG4gICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICBuYW1lOiAnc3RhcnQnLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9udWxsaW5nKCk7XG4gICAgfVxuICB9LFxuICBfZW11bGF0ZURyYWdPdmVyOiBmdW5jdGlvbiBfZW11bGF0ZURyYWdPdmVyKCkge1xuICAgIGlmICh0b3VjaEV2dCkge1xuICAgICAgdGhpcy5fbGFzdFggPSB0b3VjaEV2dC5jbGllbnRYO1xuICAgICAgdGhpcy5fbGFzdFkgPSB0b3VjaEV2dC5jbGllbnRZO1xuXG4gICAgICBfaGlkZUdob3N0Rm9yVGFyZ2V0KCk7XG5cbiAgICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHRvdWNoRXZ0LmNsaWVudFgsIHRvdWNoRXZ0LmNsaWVudFkpO1xuICAgICAgdmFyIHBhcmVudCA9IHRhcmdldDtcblxuICAgICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQuc2hhZG93Um9vdCkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHRvdWNoRXZ0LmNsaWVudFgsIHRvdWNoRXZ0LmNsaWVudFkpO1xuICAgICAgICBpZiAodGFyZ2V0ID09PSBwYXJlbnQpIGJyZWFrO1xuICAgICAgICBwYXJlbnQgPSB0YXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIGRyYWdFbC5wYXJlbnROb2RlW2V4cGFuZG9dLl9pc091dHNpZGVUaGlzRWwodGFyZ2V0KTtcblxuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgaWYgKHBhcmVudFtleHBhbmRvXSkge1xuICAgICAgICAgICAgdmFyIGluc2VydGVkID0gdm9pZCAwO1xuICAgICAgICAgICAgaW5zZXJ0ZWQgPSBwYXJlbnRbZXhwYW5kb10uX29uRHJhZ092ZXIoe1xuICAgICAgICAgICAgICBjbGllbnRYOiB0b3VjaEV2dC5jbGllbnRYLFxuICAgICAgICAgICAgICBjbGllbnRZOiB0b3VjaEV2dC5jbGllbnRZLFxuICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgICAgcm9vdEVsOiBwYXJlbnRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoaW5zZXJ0ZWQgJiYgIXRoaXMub3B0aW9ucy5kcmFnb3ZlckJ1YmJsZSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0YXJnZXQgPSBwYXJlbnQ7IC8vIHN0b3JlIGxhc3QgZWxlbWVudFxuICAgICAgICB9XG4gICAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgICAgICAgd2hpbGUgKHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKTtcbiAgICAgIH1cblxuICAgICAgX3VuaGlkZUdob3N0Rm9yVGFyZ2V0KCk7XG4gICAgfVxuICB9LFxuICBfb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIF9vblRvdWNoTW92ZShcbiAgLyoqVG91Y2hFdmVudCovXG4gIGV2dCkge1xuICAgIGlmICh0YXBFdnQpIHtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGZhbGxiYWNrVG9sZXJhbmNlID0gb3B0aW9ucy5mYWxsYmFja1RvbGVyYW5jZSxcbiAgICAgICAgICBmYWxsYmFja09mZnNldCA9IG9wdGlvbnMuZmFsbGJhY2tPZmZzZXQsXG4gICAgICAgICAgdG91Y2ggPSBldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0LFxuICAgICAgICAgIGdob3N0TWF0cml4ID0gZ2hvc3RFbCAmJiBtYXRyaXgoZ2hvc3RFbCwgdHJ1ZSksXG4gICAgICAgICAgc2NhbGVYID0gZ2hvc3RFbCAmJiBnaG9zdE1hdHJpeCAmJiBnaG9zdE1hdHJpeC5hLFxuICAgICAgICAgIHNjYWxlWSA9IGdob3N0RWwgJiYgZ2hvc3RNYXRyaXggJiYgZ2hvc3RNYXRyaXguZCxcbiAgICAgICAgICByZWxhdGl2ZVNjcm9sbE9mZnNldCA9IFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5ICYmIGdob3N0UmVsYXRpdmVQYXJlbnQgJiYgZ2V0UmVsYXRpdmVTY3JvbGxPZmZzZXQoZ2hvc3RSZWxhdGl2ZVBhcmVudCksXG4gICAgICAgICAgZHggPSAodG91Y2guY2xpZW50WCAtIHRhcEV2dC5jbGllbnRYICsgZmFsbGJhY2tPZmZzZXQueCkgLyAoc2NhbGVYIHx8IDEpICsgKHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID8gcmVsYXRpdmVTY3JvbGxPZmZzZXRbMF0gLSBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbFswXSA6IDApIC8gKHNjYWxlWCB8fCAxKSxcbiAgICAgICAgICBkeSA9ICh0b3VjaC5jbGllbnRZIC0gdGFwRXZ0LmNsaWVudFkgKyBmYWxsYmFja09mZnNldC55KSAvIChzY2FsZVkgfHwgMSkgKyAocmVsYXRpdmVTY3JvbGxPZmZzZXQgPyByZWxhdGl2ZVNjcm9sbE9mZnNldFsxXSAtIGdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsWzFdIDogMCkgLyAoc2NhbGVZIHx8IDEpOyAvLyBvbmx5IHNldCB0aGUgc3RhdHVzIHRvIGRyYWdnaW5nLCB3aGVuIHdlIGFyZSBhY3R1YWxseSBkcmFnZ2luZ1xuXG4gICAgICBpZiAoIVNvcnRhYmxlLmFjdGl2ZSAmJiAhYXdhaXRpbmdEcmFnU3RhcnRlZCkge1xuICAgICAgICBpZiAoZmFsbGJhY2tUb2xlcmFuY2UgJiYgTWF0aC5tYXgoTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMuX2xhc3RYKSwgTWF0aC5hYnModG91Y2guY2xpZW50WSAtIHRoaXMuX2xhc3RZKSkgPCBmYWxsYmFja1RvbGVyYW5jZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uRHJhZ1N0YXJ0KGV2dCwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChnaG9zdEVsKSB7XG4gICAgICAgIGlmIChnaG9zdE1hdHJpeCkge1xuICAgICAgICAgIGdob3N0TWF0cml4LmUgKz0gZHggLSAobGFzdER4IHx8IDApO1xuICAgICAgICAgIGdob3N0TWF0cml4LmYgKz0gZHkgLSAobGFzdER5IHx8IDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdob3N0TWF0cml4ID0ge1xuICAgICAgICAgICAgYTogMSxcbiAgICAgICAgICAgIGI6IDAsXG4gICAgICAgICAgICBjOiAwLFxuICAgICAgICAgICAgZDogMSxcbiAgICAgICAgICAgIGU6IGR4LFxuICAgICAgICAgICAgZjogZHlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNzc01hdHJpeCA9IFwibWF0cml4KFwiLmNvbmNhdChnaG9zdE1hdHJpeC5hLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmIsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguYywgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5kLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmUsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguZiwgXCIpXCIpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgJ3dlYmtpdFRyYW5zZm9ybScsIGNzc01hdHJpeCk7XG4gICAgICAgIGNzcyhnaG9zdEVsLCAnbW96VHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgY3NzKGdob3N0RWwsICdtc1RyYW5zZm9ybScsIGNzc01hdHJpeCk7XG4gICAgICAgIGNzcyhnaG9zdEVsLCAndHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgbGFzdER4ID0gZHg7XG4gICAgICAgIGxhc3REeSA9IGR5O1xuICAgICAgICB0b3VjaEV2dCA9IHRvdWNoO1xuICAgICAgfVxuXG4gICAgICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sXG4gIF9hcHBlbmRHaG9zdDogZnVuY3Rpb24gX2FwcGVuZEdob3N0KCkge1xuICAgIC8vIEJ1ZyBpZiB1c2luZyBzY2FsZSgpOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNjM3MDU4XG4gICAgLy8gTm90IGJlaW5nIGFkanVzdGVkIGZvclxuICAgIGlmICghZ2hvc3RFbCkge1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMub3B0aW9ucy5mYWxsYmFja09uQm9keSA/IGRvY3VtZW50LmJvZHkgOiByb290RWwsXG4gICAgICAgICAgcmVjdCA9IGdldFJlY3QoZHJhZ0VsLCB0cnVlLCBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSwgdHJ1ZSwgY29udGFpbmVyKSxcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zOyAvLyBQb3NpdGlvbiBhYnNvbHV0ZWx5XG5cbiAgICAgIGlmIChQb3NpdGlvbkdob3N0QWJzb2x1dGVseSkge1xuICAgICAgICAvLyBHZXQgcmVsYXRpdmVseSBwb3NpdGlvbmVkIHBhcmVudFxuICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50ID0gY29udGFpbmVyO1xuXG4gICAgICAgIHdoaWxlIChjc3MoZ2hvc3RSZWxhdGl2ZVBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnICYmIGNzcyhnaG9zdFJlbGF0aXZlUGFyZW50LCAndHJhbnNmb3JtJykgPT09ICdub25lJyAmJiBnaG9zdFJlbGF0aXZlUGFyZW50ICE9PSBkb2N1bWVudCkge1xuICAgICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBnaG9zdFJlbGF0aXZlUGFyZW50LnBhcmVudE5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2hvc3RSZWxhdGl2ZVBhcmVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiBnaG9zdFJlbGF0aXZlUGFyZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoZ2hvc3RSZWxhdGl2ZVBhcmVudCA9PT0gZG9jdW1lbnQpIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgICAgICAgcmVjdC50b3AgKz0gZ2hvc3RSZWxhdGl2ZVBhcmVudC5zY3JvbGxUb3A7XG4gICAgICAgICAgcmVjdC5sZWZ0ICs9IGdob3N0UmVsYXRpdmVQYXJlbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50ID0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2hvc3RSZWxhdGl2ZVBhcmVudEluaXRpYWxTY3JvbGwgPSBnZXRSZWxhdGl2ZVNjcm9sbE9mZnNldChnaG9zdFJlbGF0aXZlUGFyZW50KTtcbiAgICAgIH1cblxuICAgICAgZ2hvc3RFbCA9IGRyYWdFbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICB0b2dnbGVDbGFzcyhnaG9zdEVsLCBvcHRpb25zLmdob3N0Q2xhc3MsIGZhbHNlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGdob3N0RWwsIG9wdGlvbnMuZmFsbGJhY2tDbGFzcywgdHJ1ZSk7XG4gICAgICB0b2dnbGVDbGFzcyhnaG9zdEVsLCBvcHRpb25zLmRyYWdDbGFzcywgdHJ1ZSk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3RyYW5zZm9ybScsICcnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnYm94LXNpemluZycsICdib3JkZXItYm94Jyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ21hcmdpbicsIDApO1xuICAgICAgY3NzKGdob3N0RWwsICd0b3AnLCByZWN0LnRvcCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ2xlZnQnLCByZWN0LmxlZnQpO1xuICAgICAgY3NzKGdob3N0RWwsICd3aWR0aCcsIHJlY3Qud2lkdGgpO1xuICAgICAgY3NzKGdob3N0RWwsICdoZWlnaHQnLCByZWN0LmhlaWdodCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ29wYWNpdHknLCAnMC44Jyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3Bvc2l0aW9uJywgUG9zaXRpb25HaG9zdEFic29sdXRlbHkgPyAnYWJzb2x1dGUnIDogJ2ZpeGVkJyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3pJbmRleCcsICcxMDAwMDAnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAncG9pbnRlckV2ZW50cycsICdub25lJyk7XG4gICAgICBTb3J0YWJsZS5naG9zdCA9IGdob3N0RWw7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZ2hvc3RFbCk7IC8vIFNldCB0cmFuc2Zvcm0tb3JpZ2luXG5cbiAgICAgIGNzcyhnaG9zdEVsLCAndHJhbnNmb3JtLW9yaWdpbicsIHRhcERpc3RhbmNlTGVmdCAvIHBhcnNlSW50KGdob3N0RWwuc3R5bGUud2lkdGgpICogMTAwICsgJyUgJyArIHRhcERpc3RhbmNlVG9wIC8gcGFyc2VJbnQoZ2hvc3RFbC5zdHlsZS5oZWlnaHQpICogMTAwICsgJyUnKTtcbiAgICB9XG4gIH0sXG4gIF9vbkRyYWdTdGFydDogZnVuY3Rpb24gX29uRHJhZ1N0YXJ0KFxuICAvKipFdmVudCovXG4gIGV2dCxcbiAgLyoqYm9vbGVhbiovXG4gIGZhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBkYXRhVHJhbnNmZXIgPSBldnQuZGF0YVRyYW5zZmVyO1xuICAgIHZhciBvcHRpb25zID0gX3RoaXMub3B0aW9ucztcbiAgICBwbHVnaW5FdmVudCgnZHJhZ1N0YXJ0JywgdGhpcywge1xuICAgICAgZXZ0OiBldnRcbiAgICB9KTtcblxuICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICB0aGlzLl9vbkRyb3AoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBsdWdpbkV2ZW50KCdzZXR1cENsb25lJywgdGhpcyk7XG5cbiAgICBpZiAoIVNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgIGNsb25lRWwgPSBjbG9uZShkcmFnRWwpO1xuICAgICAgY2xvbmVFbC5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgIGNsb25lRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnJztcblxuICAgICAgdGhpcy5faGlkZUNsb25lKCk7XG5cbiAgICAgIHRvZ2dsZUNsYXNzKGNsb25lRWwsIHRoaXMub3B0aW9ucy5jaG9zZW5DbGFzcywgZmFsc2UpO1xuICAgICAgU29ydGFibGUuY2xvbmUgPSBjbG9uZUVsO1xuICAgIH0gLy8gIzExNDM6IElGcmFtZSBzdXBwb3J0IHdvcmthcm91bmRcblxuXG4gICAgX3RoaXMuY2xvbmVJZCA9IF9uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBwbHVnaW5FdmVudCgnY2xvbmUnLCBfdGhpcyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuO1xuXG4gICAgICBpZiAoIV90aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUpIHtcbiAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShjbG9uZUVsLCBkcmFnRWwpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5faGlkZUNsb25lKCk7XG5cbiAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICBuYW1lOiAnY2xvbmUnXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAhZmFsbGJhY2sgJiYgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBvcHRpb25zLmRyYWdDbGFzcywgdHJ1ZSk7IC8vIFNldCBwcm9wZXIgZHJvcCBldmVudHNcblxuICAgIGlmIChmYWxsYmFjaykge1xuICAgICAgaWdub3JlTmV4dENsaWNrID0gdHJ1ZTtcbiAgICAgIF90aGlzLl9sb29wSWQgPSBzZXRJbnRlcnZhbChfdGhpcy5fZW11bGF0ZURyYWdPdmVyLCA1MCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVuZG8gd2hhdCB3YXMgc2V0IGluIF9wcmVwYXJlRHJhZ1N0YXJ0IGJlZm9yZSBkcmFnIHN0YXJ0ZWRcbiAgICAgIG9mZihkb2N1bWVudCwgJ21vdXNldXAnLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ3RvdWNoZW5kJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIF90aGlzLl9vbkRyb3ApO1xuXG4gICAgICBpZiAoZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIGRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuICAgICAgICBvcHRpb25zLnNldERhdGEgJiYgb3B0aW9ucy5zZXREYXRhLmNhbGwoX3RoaXMsIGRhdGFUcmFuc2ZlciwgZHJhZ0VsKTtcbiAgICAgIH1cblxuICAgICAgb24oZG9jdW1lbnQsICdkcm9wJywgX3RoaXMpOyAvLyAjMTI3NiBmaXg6XG5cbiAgICAgIGNzcyhkcmFnRWwsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlWigwKScpO1xuICAgIH1cblxuICAgIGF3YWl0aW5nRHJhZ1N0YXJ0ZWQgPSB0cnVlO1xuICAgIF90aGlzLl9kcmFnU3RhcnRJZCA9IF9uZXh0VGljayhfdGhpcy5fZHJhZ1N0YXJ0ZWQuYmluZChfdGhpcywgZmFsbGJhY2ssIGV2dCkpO1xuICAgIG9uKGRvY3VtZW50LCAnc2VsZWN0c3RhcnQnLCBfdGhpcyk7XG4gICAgbW92ZWQgPSB0cnVlO1xuXG4gICAgaWYgKFNhZmFyaSkge1xuICAgICAgY3NzKGRvY3VtZW50LmJvZHksICd1c2VyLXNlbGVjdCcsICdub25lJyk7XG4gICAgfVxuICB9LFxuICAvLyBSZXR1cm5zIHRydWUgLSBpZiBubyBmdXJ0aGVyIGFjdGlvbiBpcyBuZWVkZWQgKGVpdGhlciBpbnNlcnRlZCBvciBhbm90aGVyIGNvbmRpdGlvbilcbiAgX29uRHJhZ092ZXI6IGZ1bmN0aW9uIF9vbkRyYWdPdmVyKFxuICAvKipFdmVudCovXG4gIGV2dCkge1xuICAgIHZhciBlbCA9IHRoaXMuZWwsXG4gICAgICAgIHRhcmdldCA9IGV2dC50YXJnZXQsXG4gICAgICAgIGRyYWdSZWN0LFxuICAgICAgICB0YXJnZXRSZWN0LFxuICAgICAgICByZXZlcnQsXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGdyb3VwID0gb3B0aW9ucy5ncm91cCxcbiAgICAgICAgYWN0aXZlU29ydGFibGUgPSBTb3J0YWJsZS5hY3RpdmUsXG4gICAgICAgIGlzT3duZXIgPSBhY3RpdmVHcm91cCA9PT0gZ3JvdXAsXG4gICAgICAgIGNhblNvcnQgPSBvcHRpb25zLnNvcnQsXG4gICAgICAgIGZyb21Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IGFjdGl2ZVNvcnRhYmxlLFxuICAgICAgICB2ZXJ0aWNhbCxcbiAgICAgICAgX3RoaXMgPSB0aGlzLFxuICAgICAgICBjb21wbGV0ZWRGaXJlZCA9IGZhbHNlO1xuXG4gICAgaWYgKF9zaWxlbnQpIHJldHVybjtcblxuICAgIGZ1bmN0aW9uIGRyYWdPdmVyRXZlbnQobmFtZSwgZXh0cmEpIHtcbiAgICAgIHBsdWdpbkV2ZW50KG5hbWUsIF90aGlzLCBfb2JqZWN0U3ByZWFkMih7XG4gICAgICAgIGV2dDogZXZ0LFxuICAgICAgICBpc093bmVyOiBpc093bmVyLFxuICAgICAgICBheGlzOiB2ZXJ0aWNhbCA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCcsXG4gICAgICAgIHJldmVydDogcmV2ZXJ0LFxuICAgICAgICBkcmFnUmVjdDogZHJhZ1JlY3QsXG4gICAgICAgIHRhcmdldFJlY3Q6IHRhcmdldFJlY3QsXG4gICAgICAgIGNhblNvcnQ6IGNhblNvcnQsXG4gICAgICAgIGZyb21Tb3J0YWJsZTogZnJvbVNvcnRhYmxlLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgY29tcGxldGVkOiBjb21wbGV0ZWQsXG4gICAgICAgIG9uTW92ZTogZnVuY3Rpb24gb25Nb3ZlKHRhcmdldCwgYWZ0ZXIpIHtcbiAgICAgICAgICByZXR1cm4gX29uTW92ZShyb290RWwsIGVsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXQsIGdldFJlY3QodGFyZ2V0KSwgZXZ0LCBhZnRlcik7XG4gICAgICAgIH0sXG4gICAgICAgIGNoYW5nZWQ6IGNoYW5nZWRcbiAgICAgIH0sIGV4dHJhKSk7XG4gICAgfSAvLyBDYXB0dXJlIGFuaW1hdGlvbiBzdGF0ZVxuXG5cbiAgICBmdW5jdGlvbiBjYXB0dXJlKCkge1xuICAgICAgZHJhZ092ZXJFdmVudCgnZHJhZ092ZXJBbmltYXRpb25DYXB0dXJlJyk7XG5cbiAgICAgIF90aGlzLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuXG4gICAgICBpZiAoX3RoaXMgIT09IGZyb21Tb3J0YWJsZSkge1xuICAgICAgICBmcm9tU29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgICB9XG4gICAgfSAvLyBSZXR1cm4gaW52b2NhdGlvbiB3aGVuIGRyYWdFbCBpcyBpbnNlcnRlZCAob3IgY29tcGxldGVkKVxuXG5cbiAgICBmdW5jdGlvbiBjb21wbGV0ZWQoaW5zZXJ0aW9uKSB7XG4gICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlckNvbXBsZXRlZCcsIHtcbiAgICAgICAgaW5zZXJ0aW9uOiBpbnNlcnRpb25cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaW5zZXJ0aW9uKSB7XG4gICAgICAgIC8vIENsb25lcyBtdXN0IGJlIGhpZGRlbiBiZWZvcmUgZm9sZGluZyBhbmltYXRpb24gdG8gY2FwdHVyZSBkcmFnUmVjdEFic29sdXRlIHByb3Blcmx5XG4gICAgICAgIGlmIChpc093bmVyKSB7XG4gICAgICAgICAgYWN0aXZlU29ydGFibGUuX2hpZGVDbG9uZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLl9zaG93Q2xvbmUoX3RoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF90aGlzICE9PSBmcm9tU29ydGFibGUpIHtcbiAgICAgICAgICAvLyBTZXQgZ2hvc3QgY2xhc3MgdG8gbmV3IHNvcnRhYmxlJ3MgZ2hvc3QgY2xhc3NcbiAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIHB1dFNvcnRhYmxlID8gcHV0U29ydGFibGUub3B0aW9ucy5naG9zdENsYXNzIDogYWN0aXZlU29ydGFibGUub3B0aW9ucy5naG9zdENsYXNzLCBmYWxzZSk7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBvcHRpb25zLmdob3N0Q2xhc3MsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHB1dFNvcnRhYmxlICE9PSBfdGhpcyAmJiBfdGhpcyAhPT0gU29ydGFibGUuYWN0aXZlKSB7XG4gICAgICAgICAgcHV0U29ydGFibGUgPSBfdGhpcztcbiAgICAgICAgfSBlbHNlIGlmIChfdGhpcyA9PT0gU29ydGFibGUuYWN0aXZlICYmIHB1dFNvcnRhYmxlKSB7XG4gICAgICAgICAgcHV0U29ydGFibGUgPSBudWxsO1xuICAgICAgICB9IC8vIEFuaW1hdGlvblxuXG5cbiAgICAgICAgaWYgKGZyb21Tb3J0YWJsZSA9PT0gX3RoaXMpIHtcbiAgICAgICAgICBfdGhpcy5faWdub3JlV2hpbGVBbmltYXRpbmcgPSB0YXJnZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5hbmltYXRlQWxsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlckFuaW1hdGlvbkNvbXBsZXRlJyk7XG4gICAgICAgICAgX3RoaXMuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID0gbnVsbDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKF90aGlzICE9PSBmcm9tU29ydGFibGUpIHtcbiAgICAgICAgICBmcm9tU29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgICAgICAgIGZyb21Tb3J0YWJsZS5faWdub3JlV2hpbGVBbmltYXRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IC8vIE51bGwgbGFzdFRhcmdldCBpZiBpdCBpcyBub3QgaW5zaWRlIGEgcHJldmlvdXNseSBzd2FwcGVkIGVsZW1lbnRcblxuXG4gICAgICBpZiAodGFyZ2V0ID09PSBkcmFnRWwgJiYgIWRyYWdFbC5hbmltYXRlZCB8fCB0YXJnZXQgPT09IGVsICYmICF0YXJnZXQuYW5pbWF0ZWQpIHtcbiAgICAgICAgbGFzdFRhcmdldCA9IG51bGw7XG4gICAgICB9IC8vIG5vIGJ1YmJsaW5nIGFuZCBub3QgZmFsbGJhY2tcblxuXG4gICAgICBpZiAoIW9wdGlvbnMuZHJhZ292ZXJCdWJibGUgJiYgIWV2dC5yb290RWwgJiYgdGFyZ2V0ICE9PSBkb2N1bWVudCkge1xuICAgICAgICBkcmFnRWwucGFyZW50Tm9kZVtleHBhbmRvXS5faXNPdXRzaWRlVGhpc0VsKGV2dC50YXJnZXQpOyAvLyBEbyBub3QgZGV0ZWN0IGZvciBlbXB0eSBpbnNlcnQgaWYgYWxyZWFkeSBpbnNlcnRlZFxuXG5cbiAgICAgICAgIWluc2VydGlvbiAmJiBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudChldnQpO1xuICAgICAgfVxuXG4gICAgICAhb3B0aW9ucy5kcmFnb3ZlckJ1YmJsZSAmJiBldnQuc3RvcFByb3BhZ2F0aW9uICYmIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybiBjb21wbGV0ZWRGaXJlZCA9IHRydWU7XG4gICAgfSAvLyBDYWxsIHdoZW4gZHJhZ0VsIGhhcyBiZWVuIGluc2VydGVkXG5cblxuICAgIGZ1bmN0aW9uIGNoYW5nZWQoKSB7XG4gICAgICBuZXdJbmRleCA9IGluZGV4KGRyYWdFbCk7XG4gICAgICBuZXdEcmFnZ2FibGVJbmRleCA9IGluZGV4KGRyYWdFbCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuXG4gICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHNvcnRhYmxlOiBfdGhpcyxcbiAgICAgICAgbmFtZTogJ2NoYW5nZScsXG4gICAgICAgIHRvRWw6IGVsLFxuICAgICAgICBuZXdJbmRleDogbmV3SW5kZXgsXG4gICAgICAgIG5ld0RyYWdnYWJsZUluZGV4OiBuZXdEcmFnZ2FibGVJbmRleCxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZXZ0LnByZXZlbnREZWZhdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHRhcmdldCA9IGNsb3Nlc3QodGFyZ2V0LCBvcHRpb25zLmRyYWdnYWJsZSwgZWwsIHRydWUpO1xuICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyJyk7XG4gICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybiBjb21wbGV0ZWRGaXJlZDtcblxuICAgIGlmIChkcmFnRWwuY29udGFpbnMoZXZ0LnRhcmdldCkgfHwgdGFyZ2V0LmFuaW1hdGVkICYmIHRhcmdldC5hbmltYXRpbmdYICYmIHRhcmdldC5hbmltYXRpbmdZIHx8IF90aGlzLl9pZ25vcmVXaGlsZUFuaW1hdGluZyA9PT0gdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gY29tcGxldGVkKGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZ25vcmVOZXh0Q2xpY2sgPSBmYWxzZTtcblxuICAgIGlmIChhY3RpdmVTb3J0YWJsZSAmJiAhb3B0aW9ucy5kaXNhYmxlZCAmJiAoaXNPd25lciA/IGNhblNvcnQgfHwgKHJldmVydCA9IHBhcmVudEVsICE9PSByb290RWwpIC8vIFJldmVydGluZyBpdGVtIGludG8gdGhlIG9yaWdpbmFsIGxpc3RcbiAgICA6IHB1dFNvcnRhYmxlID09PSB0aGlzIHx8ICh0aGlzLmxhc3RQdXRNb2RlID0gYWN0aXZlR3JvdXAuY2hlY2tQdWxsKHRoaXMsIGFjdGl2ZVNvcnRhYmxlLCBkcmFnRWwsIGV2dCkpICYmIGdyb3VwLmNoZWNrUHV0KHRoaXMsIGFjdGl2ZVNvcnRhYmxlLCBkcmFnRWwsIGV2dCkpKSB7XG4gICAgICB2ZXJ0aWNhbCA9IHRoaXMuX2dldERpcmVjdGlvbihldnQsIHRhcmdldCkgPT09ICd2ZXJ0aWNhbCc7XG4gICAgICBkcmFnUmVjdCA9IGdldFJlY3QoZHJhZ0VsKTtcbiAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyVmFsaWQnKTtcbiAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm4gY29tcGxldGVkRmlyZWQ7XG5cbiAgICAgIGlmIChyZXZlcnQpIHtcbiAgICAgICAgcGFyZW50RWwgPSByb290RWw7IC8vIGFjdHVhbGl6YXRpb25cblxuICAgICAgICBjYXB0dXJlKCk7XG5cbiAgICAgICAgdGhpcy5faGlkZUNsb25lKCk7XG5cbiAgICAgICAgZHJhZ092ZXJFdmVudCgncmV2ZXJ0Jyk7XG5cbiAgICAgICAgaWYgKCFTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICAgICAgaWYgKG5leHRFbCkge1xuICAgICAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShkcmFnRWwsIG5leHRFbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbExhc3RDaGlsZCA9IGxhc3RDaGlsZChlbCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuXG4gICAgICBpZiAoIWVsTGFzdENoaWxkIHx8IF9naG9zdElzTGFzdChldnQsIHZlcnRpY2FsLCB0aGlzKSAmJiAhZWxMYXN0Q2hpbGQuYW5pbWF0ZWQpIHtcbiAgICAgICAgLy8gSW5zZXJ0IHRvIGVuZCBvZiBsaXN0XG4gICAgICAgIC8vIElmIGFscmVhZHkgYXQgZW5kIG9mIGxpc3Q6IERvIG5vdCBpbnNlcnRcbiAgICAgICAgaWYgKGVsTGFzdENoaWxkID09PSBkcmFnRWwpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKGZhbHNlKTtcbiAgICAgICAgfSAvLyBpZiB0aGVyZSBpcyBhIGxhc3QgZWxlbWVudCwgaXQgaXMgdGhlIHRhcmdldFxuXG5cbiAgICAgICAgaWYgKGVsTGFzdENoaWxkICYmIGVsID09PSBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgdGFyZ2V0ID0gZWxMYXN0Q2hpbGQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgdGFyZ2V0UmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgdGFyZ2V0UmVjdCwgZXZ0LCAhIXRhcmdldCkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgY2FwdHVyZSgpO1xuICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgcGFyZW50RWwgPSBlbDsgLy8gYWN0dWFsaXphdGlvblxuXG4gICAgICAgICAgY2hhbmdlZCgpO1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZWxMYXN0Q2hpbGQgJiYgX2dob3N0SXNGaXJzdChldnQsIHZlcnRpY2FsLCB0aGlzKSkge1xuICAgICAgICAvLyBJbnNlcnQgdG8gc3RhcnQgb2YgbGlzdFxuICAgICAgICB2YXIgZmlyc3RDaGlsZCA9IGdldENoaWxkKGVsLCAwLCBvcHRpb25zLCB0cnVlKTtcblxuICAgICAgICBpZiAoZmlyc3RDaGlsZCA9PT0gZHJhZ0VsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXQgPSBmaXJzdENoaWxkO1xuICAgICAgICB0YXJnZXRSZWN0ID0gZ2V0UmVjdCh0YXJnZXQpO1xuXG4gICAgICAgIGlmIChfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgdGFyZ2V0UmVjdCwgZXZ0LCBmYWxzZSkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgY2FwdHVyZSgpO1xuICAgICAgICAgIGVsLmluc2VydEJlZm9yZShkcmFnRWwsIGZpcnN0Q2hpbGQpO1xuICAgICAgICAgIHBhcmVudEVsID0gZWw7IC8vIGFjdHVhbGl6YXRpb25cblxuICAgICAgICAgIGNoYW5nZWQoKTtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRhcmdldC5wYXJlbnROb2RlID09PSBlbCkge1xuICAgICAgICB0YXJnZXRSZWN0ID0gZ2V0UmVjdCh0YXJnZXQpO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gMCxcbiAgICAgICAgICAgIHRhcmdldEJlZm9yZUZpcnN0U3dhcCxcbiAgICAgICAgICAgIGRpZmZlcmVudExldmVsID0gZHJhZ0VsLnBhcmVudE5vZGUgIT09IGVsLFxuICAgICAgICAgICAgZGlmZmVyZW50Um93Q29sID0gIV9kcmFnRWxJblJvd0NvbHVtbihkcmFnRWwuYW5pbWF0ZWQgJiYgZHJhZ0VsLnRvUmVjdCB8fCBkcmFnUmVjdCwgdGFyZ2V0LmFuaW1hdGVkICYmIHRhcmdldC50b1JlY3QgfHwgdGFyZ2V0UmVjdCwgdmVydGljYWwpLFxuICAgICAgICAgICAgc2lkZTEgPSB2ZXJ0aWNhbCA/ICd0b3AnIDogJ2xlZnQnLFxuICAgICAgICAgICAgc2Nyb2xsZWRQYXN0VG9wID0gaXNTY3JvbGxlZFBhc3QodGFyZ2V0LCAndG9wJywgJ3RvcCcpIHx8IGlzU2Nyb2xsZWRQYXN0KGRyYWdFbCwgJ3RvcCcsICd0b3AnKSxcbiAgICAgICAgICAgIHNjcm9sbEJlZm9yZSA9IHNjcm9sbGVkUGFzdFRvcCA/IHNjcm9sbGVkUGFzdFRvcC5zY3JvbGxUb3AgOiB2b2lkIDA7XG5cbiAgICAgICAgaWYgKGxhc3RUYXJnZXQgIT09IHRhcmdldCkge1xuICAgICAgICAgIHRhcmdldEJlZm9yZUZpcnN0U3dhcCA9IHRhcmdldFJlY3Rbc2lkZTFdO1xuICAgICAgICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IGZhbHNlO1xuICAgICAgICAgIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQgPSAhZGlmZmVyZW50Um93Q29sICYmIG9wdGlvbnMuaW52ZXJ0U3dhcCB8fCBkaWZmZXJlbnRMZXZlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpcmVjdGlvbiA9IF9nZXRTd2FwRGlyZWN0aW9uKGV2dCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCwgZGlmZmVyZW50Um93Q29sID8gMSA6IG9wdGlvbnMuc3dhcFRocmVzaG9sZCwgb3B0aW9ucy5pbnZlcnRlZFN3YXBUaHJlc2hvbGQgPT0gbnVsbCA/IG9wdGlvbnMuc3dhcFRocmVzaG9sZCA6IG9wdGlvbnMuaW52ZXJ0ZWRTd2FwVGhyZXNob2xkLCBpc0NpcmN1bXN0YW50aWFsSW52ZXJ0LCBsYXN0VGFyZ2V0ID09PSB0YXJnZXQpO1xuICAgICAgICB2YXIgc2libGluZztcblxuICAgICAgICBpZiAoZGlyZWN0aW9uICE9PSAwKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGFyZ2V0IGlzIGJlc2lkZSBkcmFnRWwgaW4gcmVzcGVjdGl2ZSBkaXJlY3Rpb24gKGlnbm9yaW5nIGhpZGRlbiBlbGVtZW50cylcbiAgICAgICAgICB2YXIgZHJhZ0luZGV4ID0gaW5kZXgoZHJhZ0VsKTtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGRyYWdJbmRleCAtPSBkaXJlY3Rpb247XG4gICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50RWwuY2hpbGRyZW5bZHJhZ0luZGV4XTtcbiAgICAgICAgICB9IHdoaWxlIChzaWJsaW5nICYmIChjc3Moc2libGluZywgJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8IHNpYmxpbmcgPT09IGdob3N0RWwpKTtcbiAgICAgICAgfSAvLyBJZiBkcmFnRWwgaXMgYWxyZWFkeSBiZXNpZGUgdGFyZ2V0OiBEbyBub3QgaW5zZXJ0XG5cblxuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAwIHx8IHNpYmxpbmcgPT09IHRhcmdldCkge1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgbGFzdERpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICAgICAgdmFyIG5leHRTaWJsaW5nID0gdGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyxcbiAgICAgICAgICAgIGFmdGVyID0gZmFsc2U7XG4gICAgICAgIGFmdGVyID0gZGlyZWN0aW9uID09PSAxO1xuXG4gICAgICAgIHZhciBtb3ZlVmVjdG9yID0gX29uTW92ZShyb290RWwsIGVsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXQsIHRhcmdldFJlY3QsIGV2dCwgYWZ0ZXIpO1xuXG4gICAgICAgIGlmIChtb3ZlVmVjdG9yICE9PSBmYWxzZSkge1xuICAgICAgICAgIGlmIChtb3ZlVmVjdG9yID09PSAxIHx8IG1vdmVWZWN0b3IgPT09IC0xKSB7XG4gICAgICAgICAgICBhZnRlciA9IG1vdmVWZWN0b3IgPT09IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3NpbGVudCA9IHRydWU7XG4gICAgICAgICAgc2V0VGltZW91dChfdW5zaWxlbnQsIDMwKTtcbiAgICAgICAgICBjYXB0dXJlKCk7XG5cbiAgICAgICAgICBpZiAoYWZ0ZXIgJiYgIW5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBlbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZHJhZ0VsLCBhZnRlciA/IG5leHRTaWJsaW5nIDogdGFyZ2V0KTtcbiAgICAgICAgICB9IC8vIFVuZG8gY2hyb21lJ3Mgc2Nyb2xsIGFkanVzdG1lbnQgKGhhcyBubyBlZmZlY3Qgb24gb3RoZXIgYnJvd3NlcnMpXG5cblxuICAgICAgICAgIGlmIChzY3JvbGxlZFBhc3RUb3ApIHtcbiAgICAgICAgICAgIHNjcm9sbEJ5KHNjcm9sbGVkUGFzdFRvcCwgMCwgc2Nyb2xsQmVmb3JlIC0gc2Nyb2xsZWRQYXN0VG9wLnNjcm9sbFRvcCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFyZW50RWwgPSBkcmFnRWwucGFyZW50Tm9kZTsgLy8gYWN0dWFsaXphdGlvblxuICAgICAgICAgIC8vIG11c3QgYmUgZG9uZSBiZWZvcmUgYW5pbWF0aW9uXG5cbiAgICAgICAgICBpZiAodGFyZ2V0QmVmb3JlRmlyc3RTd2FwICE9PSB1bmRlZmluZWQgJiYgIWlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQpIHtcbiAgICAgICAgICAgIHRhcmdldE1vdmVEaXN0YW5jZSA9IE1hdGguYWJzKHRhcmdldEJlZm9yZUZpcnN0U3dhcCAtIGdldFJlY3QodGFyZ2V0KVtzaWRlMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoYW5nZWQoKTtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbC5jb250YWlucyhkcmFnRWwpKSB7XG4gICAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgX2lnbm9yZVdoaWxlQW5pbWF0aW5nOiBudWxsLFxuICBfb2ZmTW92ZUV2ZW50czogZnVuY3Rpb24gX29mZk1vdmVFdmVudHMoKSB7XG4gICAgb2ZmKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgIG9mZihkb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICBvZmYoZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICBvZmYoZG9jdW1lbnQsICdkcmFnb3ZlcicsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICBvZmYoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICB9LFxuICBfb2ZmVXBFdmVudHM6IGZ1bmN0aW9uIF9vZmZVcEV2ZW50cygpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHRoaXMuZWwub3duZXJEb2N1bWVudDtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAncG9pbnRlcnVwJywgdGhpcy5fb25Ecm9wKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgdGhpcy5fb25Ecm9wKTtcbiAgICBvZmYoZG9jdW1lbnQsICdzZWxlY3RzdGFydCcsIHRoaXMpO1xuICB9LFxuICBfb25Ecm9wOiBmdW5jdGlvbiBfb25Ecm9wKFxuICAvKipFdmVudCovXG4gIGV2dCkge1xuICAgIHZhciBlbCA9IHRoaXMuZWwsXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7IC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGRyYWdnZWQgZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudFxuXG4gICAgbmV3SW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gaW5kZXgoZHJhZ0VsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG4gICAgcGx1Z2luRXZlbnQoJ2Ryb3AnLCB0aGlzLCB7XG4gICAgICBldnQ6IGV2dFxuICAgIH0pO1xuICAgIHBhcmVudEVsID0gZHJhZ0VsICYmIGRyYWdFbC5wYXJlbnROb2RlOyAvLyBHZXQgYWdhaW4gYWZ0ZXIgcGx1Z2luIGV2ZW50XG5cbiAgICBuZXdJbmRleCA9IGluZGV4KGRyYWdFbCk7XG4gICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcblxuICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICB0aGlzLl9udWxsaW5nKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdGluZ0RyYWdTdGFydGVkID0gZmFsc2U7XG4gICAgaXNDaXJjdW1zdGFudGlhbEludmVydCA9IGZhbHNlO1xuICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IGZhbHNlO1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fbG9vcElkKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fZHJhZ1N0YXJ0VGltZXIpO1xuXG4gICAgX2NhbmNlbE5leHRUaWNrKHRoaXMuY2xvbmVJZCk7XG5cbiAgICBfY2FuY2VsTmV4dFRpY2sodGhpcy5fZHJhZ1N0YXJ0SWQpOyAvLyBVbmJpbmQgZXZlbnRzXG5cblxuICAgIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgb2ZmKGRvY3VtZW50LCAnZHJvcCcsIHRoaXMpO1xuICAgICAgb2ZmKGVsLCAnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIH1cblxuICAgIHRoaXMuX29mZk1vdmVFdmVudHMoKTtcblxuICAgIHRoaXMuX29mZlVwRXZlbnRzKCk7XG5cbiAgICBpZiAoU2FmYXJpKSB7XG4gICAgICBjc3MoZG9jdW1lbnQuYm9keSwgJ3VzZXItc2VsZWN0JywgJycpO1xuICAgIH1cblxuICAgIGNzcyhkcmFnRWwsICd0cmFuc2Zvcm0nLCAnJyk7XG5cbiAgICBpZiAoZXZ0KSB7XG4gICAgICBpZiAobW92ZWQpIHtcbiAgICAgICAgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICFvcHRpb25zLmRyb3BCdWJibGUgJiYgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICBnaG9zdEVsICYmIGdob3N0RWwucGFyZW50Tm9kZSAmJiBnaG9zdEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZ2hvc3RFbCk7XG5cbiAgICAgIGlmIChyb290RWwgPT09IHBhcmVudEVsIHx8IHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlICE9PSAnY2xvbmUnKSB7XG4gICAgICAgIC8vIFJlbW92ZSBjbG9uZShzKVxuICAgICAgICBjbG9uZUVsICYmIGNsb25lRWwucGFyZW50Tm9kZSAmJiBjbG9uZUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmVFbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnRWwpIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgICAgb2ZmKGRyYWdFbCwgJ2RyYWdlbmQnLCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9kaXNhYmxlRHJhZ2dhYmxlKGRyYWdFbCk7XG5cbiAgICAgICAgZHJhZ0VsLnN0eWxlWyd3aWxsLWNoYW5nZSddID0gJyc7IC8vIFJlbW92ZSBjbGFzc2VzXG4gICAgICAgIC8vIGdob3N0Q2xhc3MgaXMgYWRkZWQgaW4gZHJhZ1N0YXJ0ZWRcblxuICAgICAgICBpZiAobW92ZWQgJiYgIWF3YWl0aW5nRHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIHB1dFNvcnRhYmxlID8gcHV0U29ydGFibGUub3B0aW9ucy5naG9zdENsYXNzIDogdGhpcy5vcHRpb25zLmdob3N0Q2xhc3MsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgdGhpcy5vcHRpb25zLmNob3NlbkNsYXNzLCBmYWxzZSk7IC8vIERyYWcgc3RvcCBldmVudFxuXG4gICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICBuYW1lOiAndW5jaG9vc2UnLFxuICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgIG5ld0luZGV4OiBudWxsLFxuICAgICAgICAgIG5ld0RyYWdnYWJsZUluZGV4OiBudWxsLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocm9vdEVsICE9PSBwYXJlbnRFbCkge1xuICAgICAgICAgIGlmIChuZXdJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAvLyBBZGQgZXZlbnRcbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgcm9vdEVsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgbmFtZTogJ2FkZCcsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBmcm9tRWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICB9KTsgLy8gUmVtb3ZlIGV2ZW50XG5cblxuICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgICAgbmFtZTogJ3JlbW92ZScsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pOyAvLyBkcmFnIGZyb20gb25lIGxpc3QgYW5kIGRyb3AgaW50byBhbm90aGVyXG5cblxuICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICByb290RWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBuYW1lOiAnc29ydCcsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBmcm9tRWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgICAgbmFtZTogJ3NvcnQnLFxuICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5zYXZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG5ld0luZGV4ICE9PSBvbGRJbmRleCkge1xuICAgICAgICAgICAgaWYgKG5ld0luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgLy8gZHJhZyAmIGRyb3Agd2l0aGluIHRoZSBzYW1lIGxpc3RcbiAgICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICAgIG5hbWU6ICd1cGRhdGUnLFxuICAgICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmFtZTogJ3NvcnQnLFxuICAgICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoU29ydGFibGUuYWN0aXZlKSB7XG4gICAgICAgICAgLyoganNoaW50IGVxbnVsbDp0cnVlICovXG4gICAgICAgICAgaWYgKG5ld0luZGV4ID09IG51bGwgfHwgbmV3SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBuZXdJbmRleCA9IG9sZEluZGV4O1xuICAgICAgICAgICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBvbGREcmFnZ2FibGVJbmRleDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgIG5hbWU6ICdlbmQnLFxuICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICB9KTsgLy8gU2F2ZSBzb3J0aW5nXG5cblxuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fbnVsbGluZygpO1xuICB9LFxuICBfbnVsbGluZzogZnVuY3Rpb24gX251bGxpbmcoKSB7XG4gICAgcGx1Z2luRXZlbnQoJ251bGxpbmcnLCB0aGlzKTtcbiAgICByb290RWwgPSBkcmFnRWwgPSBwYXJlbnRFbCA9IGdob3N0RWwgPSBuZXh0RWwgPSBjbG9uZUVsID0gbGFzdERvd25FbCA9IGNsb25lSGlkZGVuID0gdGFwRXZ0ID0gdG91Y2hFdnQgPSBtb3ZlZCA9IG5ld0luZGV4ID0gbmV3RHJhZ2dhYmxlSW5kZXggPSBvbGRJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4ID0gbGFzdFRhcmdldCA9IGxhc3REaXJlY3Rpb24gPSBwdXRTb3J0YWJsZSA9IGFjdGl2ZUdyb3VwID0gU29ydGFibGUuZHJhZ2dlZCA9IFNvcnRhYmxlLmdob3N0ID0gU29ydGFibGUuY2xvbmUgPSBTb3J0YWJsZS5hY3RpdmUgPSBudWxsO1xuICAgIHNhdmVkSW5wdXRDaGVja2VkLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICBlbC5jaGVja2VkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBzYXZlZElucHV0Q2hlY2tlZC5sZW5ndGggPSBsYXN0RHggPSBsYXN0RHkgPSAwO1xuICB9LFxuICBoYW5kbGVFdmVudDogZnVuY3Rpb24gaGFuZGxlRXZlbnQoXG4gIC8qKkV2ZW50Ki9cbiAgZXZ0KSB7XG4gICAgc3dpdGNoIChldnQudHlwZSkge1xuICAgICAgY2FzZSAnZHJvcCc6XG4gICAgICBjYXNlICdkcmFnZW5kJzpcbiAgICAgICAgdGhpcy5fb25Ecm9wKGV2dCk7XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgICAgIGlmIChkcmFnRWwpIHtcbiAgICAgICAgICB0aGlzLl9vbkRyYWdPdmVyKGV2dCk7XG5cbiAgICAgICAgICBfZ2xvYmFsRHJhZ092ZXIoZXZ0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzZWxlY3RzdGFydCc6XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgdGhlIGl0ZW0gaW50byBhbiBhcnJheSBvZiBzdHJpbmcuXG4gICAqIEByZXR1cm5zIHtTdHJpbmdbXX1cbiAgICovXG4gIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgdmFyIG9yZGVyID0gW10sXG4gICAgICAgIGVsLFxuICAgICAgICBjaGlsZHJlbiA9IHRoaXMuZWwuY2hpbGRyZW4sXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBuID0gY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgZm9yICg7IGkgPCBuOyBpKyspIHtcbiAgICAgIGVsID0gY2hpbGRyZW5baV07XG5cbiAgICAgIGlmIChjbG9zZXN0KGVsLCBvcHRpb25zLmRyYWdnYWJsZSwgdGhpcy5lbCwgZmFsc2UpKSB7XG4gICAgICAgIG9yZGVyLnB1c2goZWwuZ2V0QXR0cmlidXRlKG9wdGlvbnMuZGF0YUlkQXR0cikgfHwgX2dlbmVyYXRlSWQoZWwpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3JkZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNvcnRzIHRoZSBlbGVtZW50cyBhY2NvcmRpbmcgdG8gdGhlIGFycmF5LlxuICAgKiBAcGFyYW0gIHtTdHJpbmdbXX0gIG9yZGVyICBvcmRlciBvZiB0aGUgaXRlbXNcbiAgICovXG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQob3JkZXIsIHVzZUFuaW1hdGlvbikge1xuICAgIHZhciBpdGVtcyA9IHt9LFxuICAgICAgICByb290RWwgPSB0aGlzLmVsO1xuICAgIHRoaXMudG9BcnJheSgpLmZvckVhY2goZnVuY3Rpb24gKGlkLCBpKSB7XG4gICAgICB2YXIgZWwgPSByb290RWwuY2hpbGRyZW5baV07XG5cbiAgICAgIGlmIChjbG9zZXN0KGVsLCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCByb290RWwsIGZhbHNlKSkge1xuICAgICAgICBpdGVtc1tpZF0gPSBlbDtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgICB1c2VBbmltYXRpb24gJiYgdGhpcy5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICBvcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgICAgaWYgKGl0ZW1zW2lkXSkge1xuICAgICAgICByb290RWwucmVtb3ZlQ2hpbGQoaXRlbXNbaWRdKTtcbiAgICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKGl0ZW1zW2lkXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdXNlQW5pbWF0aW9uICYmIHRoaXMuYW5pbWF0ZUFsbCgpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBjdXJyZW50IHNvcnRpbmdcbiAgICovXG4gIHNhdmU6IGZ1bmN0aW9uIHNhdmUoKSB7XG4gICAgdmFyIHN0b3JlID0gdGhpcy5vcHRpb25zLnN0b3JlO1xuICAgIHN0b3JlICYmIHN0b3JlLnNldCAmJiBzdG9yZS5zZXQodGhpcyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCwgZ2V0IHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IgYnkgdGVzdGluZyB0aGUgZWxlbWVudCBpdHNlbGYgYW5kIHRyYXZlcnNpbmcgdXAgdGhyb3VnaCBpdHMgYW5jZXN0b3JzIGluIHRoZSBET00gdHJlZS5cbiAgICogQHBhcmFtICAge0hUTUxFbGVtZW50fSAgZWxcbiAgICogQHBhcmFtICAge1N0cmluZ30gICAgICAgW3NlbGVjdG9yXSAgZGVmYXVsdDogYG9wdGlvbnMuZHJhZ2dhYmxlYFxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGNsb3Nlc3Q6IGZ1bmN0aW9uIGNsb3Nlc3QkMShlbCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbCwgc2VsZWN0b3IgfHwgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSwgdGhpcy5lbCwgZmFsc2UpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXQvZ2V0IG9wdGlvblxuICAgKiBAcGFyYW0gICB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSAgIHsqfSAgICAgIFt2YWx1ZV1cbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBvcHRpb246IGZ1bmN0aW9uIG9wdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiBvcHRpb25zW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbW9kaWZpZWRWYWx1ZSA9IFBsdWdpbk1hbmFnZXIubW9kaWZ5T3B0aW9uKHRoaXMsIG5hbWUsIHZhbHVlKTtcblxuICAgICAgaWYgKHR5cGVvZiBtb2RpZmllZFZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcHRpb25zW25hbWVdID0gbW9kaWZpZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUgPT09ICdncm91cCcpIHtcbiAgICAgICAgX3ByZXBhcmVHcm91cChvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlc3Ryb3lcbiAgICovXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgcGx1Z2luRXZlbnQoJ2Rlc3Ryb3knLCB0aGlzKTtcbiAgICB2YXIgZWwgPSB0aGlzLmVsO1xuICAgIGVsW2V4cGFuZG9dID0gbnVsbDtcbiAgICBvZmYoZWwsICdtb3VzZWRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgICBvZmYoZWwsICd0b3VjaHN0YXJ0JywgdGhpcy5fb25UYXBTdGFydCk7XG4gICAgb2ZmKGVsLCAncG9pbnRlcmRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcblxuICAgIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgb2ZmKGVsLCAnZHJhZ292ZXInLCB0aGlzKTtcbiAgICAgIG9mZihlbCwgJ2RyYWdlbnRlcicsIHRoaXMpO1xuICAgIH0gLy8gUmVtb3ZlIGRyYWdnYWJsZSBhdHRyaWJ1dGVzXG5cblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZWwucXVlcnlTZWxlY3RvckFsbCgnW2RyYWdnYWJsZV0nKSwgZnVuY3Rpb24gKGVsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnYWJsZScpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fb25Ecm9wKCk7XG5cbiAgICB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWdFdmVudHMoKTtcblxuICAgIHNvcnRhYmxlcy5zcGxpY2Uoc29ydGFibGVzLmluZGV4T2YodGhpcy5lbCksIDEpO1xuICAgIHRoaXMuZWwgPSBlbCA9IG51bGw7XG4gIH0sXG4gIF9oaWRlQ2xvbmU6IGZ1bmN0aW9uIF9oaWRlQ2xvbmUoKSB7XG4gICAgaWYgKCFjbG9uZUhpZGRlbikge1xuICAgICAgcGx1Z2luRXZlbnQoJ2hpZGVDbG9uZScsIHRoaXMpO1xuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybjtcbiAgICAgIGNzcyhjbG9uZUVsLCAnZGlzcGxheScsICdub25lJyk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUgJiYgY2xvbmVFbC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGNsb25lRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZUVsKTtcbiAgICAgIH1cblxuICAgICAgY2xvbmVIaWRkZW4gPSB0cnVlO1xuICAgIH1cbiAgfSxcbiAgX3Nob3dDbG9uZTogZnVuY3Rpb24gX3Nob3dDbG9uZShwdXRTb3J0YWJsZSkge1xuICAgIGlmIChwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSAhPT0gJ2Nsb25lJykge1xuICAgICAgdGhpcy5faGlkZUNsb25lKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2xvbmVIaWRkZW4pIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdzaG93Q2xvbmUnLCB0aGlzKTtcbiAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm47IC8vIHNob3cgY2xvbmUgYXQgZHJhZ0VsIG9yIG9yaWdpbmFsIHBvc2l0aW9uXG5cbiAgICAgIGlmIChkcmFnRWwucGFyZW50Tm9kZSA9PSByb290RWwgJiYgIXRoaXMub3B0aW9ucy5ncm91cC5yZXZlcnRDbG9uZSkge1xuICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIGRyYWdFbCk7XG4gICAgICB9IGVsc2UgaWYgKG5leHRFbCkge1xuICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIG5leHRFbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb290RWwuYXBwZW5kQ2hpbGQoY2xvbmVFbCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JvdXAucmV2ZXJ0Q2xvbmUpIHtcbiAgICAgICAgdGhpcy5hbmltYXRlKGRyYWdFbCwgY2xvbmVFbCk7XG4gICAgICB9XG5cbiAgICAgIGNzcyhjbG9uZUVsLCAnZGlzcGxheScsICcnKTtcbiAgICAgIGNsb25lSGlkZGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBfZ2xvYmFsRHJhZ092ZXIoXG4vKipFdmVudCovXG5ldnQpIHtcbiAgaWYgKGV2dC5kYXRhVHJhbnNmZXIpIHtcbiAgICBldnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG4gIH1cblxuICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbn1cblxuZnVuY3Rpb24gX29uTW92ZShmcm9tRWwsIHRvRWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldEVsLCB0YXJnZXRSZWN0LCBvcmlnaW5hbEV2ZW50LCB3aWxsSW5zZXJ0QWZ0ZXIpIHtcbiAgdmFyIGV2dCxcbiAgICAgIHNvcnRhYmxlID0gZnJvbUVsW2V4cGFuZG9dLFxuICAgICAgb25Nb3ZlRm4gPSBzb3J0YWJsZS5vcHRpb25zLm9uTW92ZSxcbiAgICAgIHJldFZhbDsgLy8gU3VwcG9ydCBmb3IgbmV3IEN1c3RvbUV2ZW50IGZlYXR1cmVcblxuICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmICFJRTExT3JMZXNzICYmICFFZGdlKSB7XG4gICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCdtb3ZlJywge1xuICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldnQuaW5pdEV2ZW50KCdtb3ZlJywgdHJ1ZSwgdHJ1ZSk7XG4gIH1cblxuICBldnQudG8gPSB0b0VsO1xuICBldnQuZnJvbSA9IGZyb21FbDtcbiAgZXZ0LmRyYWdnZWQgPSBkcmFnRWw7XG4gIGV2dC5kcmFnZ2VkUmVjdCA9IGRyYWdSZWN0O1xuICBldnQucmVsYXRlZCA9IHRhcmdldEVsIHx8IHRvRWw7XG4gIGV2dC5yZWxhdGVkUmVjdCA9IHRhcmdldFJlY3QgfHwgZ2V0UmVjdCh0b0VsKTtcbiAgZXZ0LndpbGxJbnNlcnRBZnRlciA9IHdpbGxJbnNlcnRBZnRlcjtcbiAgZXZ0Lm9yaWdpbmFsRXZlbnQgPSBvcmlnaW5hbEV2ZW50O1xuICBmcm9tRWwuZGlzcGF0Y2hFdmVudChldnQpO1xuXG4gIGlmIChvbk1vdmVGbikge1xuICAgIHJldFZhbCA9IG9uTW92ZUZuLmNhbGwoc29ydGFibGUsIGV2dCwgb3JpZ2luYWxFdmVudCk7XG4gIH1cblxuICByZXR1cm4gcmV0VmFsO1xufVxuXG5mdW5jdGlvbiBfZGlzYWJsZURyYWdnYWJsZShlbCkge1xuICBlbC5kcmFnZ2FibGUgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gX3Vuc2lsZW50KCkge1xuICBfc2lsZW50ID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIF9naG9zdElzRmlyc3QoZXZ0LCB2ZXJ0aWNhbCwgc29ydGFibGUpIHtcbiAgdmFyIHJlY3QgPSBnZXRSZWN0KGdldENoaWxkKHNvcnRhYmxlLmVsLCAwLCBzb3J0YWJsZS5vcHRpb25zLCB0cnVlKSk7XG4gIHZhciBzcGFjZXIgPSAxMDtcbiAgcmV0dXJuIHZlcnRpY2FsID8gZXZ0LmNsaWVudFggPCByZWN0LmxlZnQgLSBzcGFjZXIgfHwgZXZ0LmNsaWVudFkgPCByZWN0LnRvcCAmJiBldnQuY2xpZW50WCA8IHJlY3QucmlnaHQgOiBldnQuY2xpZW50WSA8IHJlY3QudG9wIC0gc3BhY2VyIHx8IGV2dC5jbGllbnRZIDwgcmVjdC5ib3R0b20gJiYgZXZ0LmNsaWVudFggPCByZWN0LmxlZnQ7XG59XG5cbmZ1bmN0aW9uIF9naG9zdElzTGFzdChldnQsIHZlcnRpY2FsLCBzb3J0YWJsZSkge1xuICB2YXIgcmVjdCA9IGdldFJlY3QobGFzdENoaWxkKHNvcnRhYmxlLmVsLCBzb3J0YWJsZS5vcHRpb25zLmRyYWdnYWJsZSkpO1xuICB2YXIgc3BhY2VyID0gMTA7XG4gIHJldHVybiB2ZXJ0aWNhbCA/IGV2dC5jbGllbnRYID4gcmVjdC5yaWdodCArIHNwYWNlciB8fCBldnQuY2xpZW50WCA8PSByZWN0LnJpZ2h0ICYmIGV2dC5jbGllbnRZID4gcmVjdC5ib3R0b20gJiYgZXZ0LmNsaWVudFggPj0gcmVjdC5sZWZ0IDogZXZ0LmNsaWVudFggPiByZWN0LnJpZ2h0ICYmIGV2dC5jbGllbnRZID4gcmVjdC50b3AgfHwgZXZ0LmNsaWVudFggPD0gcmVjdC5yaWdodCAmJiBldnQuY2xpZW50WSA+IHJlY3QuYm90dG9tICsgc3BhY2VyO1xufVxuXG5mdW5jdGlvbiBfZ2V0U3dhcERpcmVjdGlvbihldnQsIHRhcmdldCwgdGFyZ2V0UmVjdCwgdmVydGljYWwsIHN3YXBUaHJlc2hvbGQsIGludmVydGVkU3dhcFRocmVzaG9sZCwgaW52ZXJ0U3dhcCwgaXNMYXN0VGFyZ2V0KSB7XG4gIHZhciBtb3VzZU9uQXhpcyA9IHZlcnRpY2FsID8gZXZ0LmNsaWVudFkgOiBldnQuY2xpZW50WCxcbiAgICAgIHRhcmdldExlbmd0aCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5oZWlnaHQgOiB0YXJnZXRSZWN0LndpZHRoLFxuICAgICAgdGFyZ2V0UzEgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QudG9wIDogdGFyZ2V0UmVjdC5sZWZ0LFxuICAgICAgdGFyZ2V0UzIgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QuYm90dG9tIDogdGFyZ2V0UmVjdC5yaWdodCxcbiAgICAgIGludmVydCA9IGZhbHNlO1xuXG4gIGlmICghaW52ZXJ0U3dhcCkge1xuICAgIC8vIE5ldmVyIGludmVydCBvciBjcmVhdGUgZHJhZ0VsIHNoYWRvdyB3aGVuIHRhcmdldCBtb3ZlbWVuZXQgY2F1c2VzIG1vdXNlIHRvIG1vdmUgcGFzdCB0aGUgZW5kIG9mIHJlZ3VsYXIgc3dhcFRocmVzaG9sZFxuICAgIGlmIChpc0xhc3RUYXJnZXQgJiYgdGFyZ2V0TW92ZURpc3RhbmNlIDwgdGFyZ2V0TGVuZ3RoICogc3dhcFRocmVzaG9sZCkge1xuICAgICAgLy8gbXVsdGlwbGllZCBvbmx5IGJ5IHN3YXBUaHJlc2hvbGQgYmVjYXVzZSBtb3VzZSB3aWxsIGFscmVhZHkgYmUgaW5zaWRlIHRhcmdldCBieSAoMSAtIHRocmVzaG9sZCkgKiB0YXJnZXRMZW5ndGggLyAyXG4gICAgICAvLyBjaGVjayBpZiBwYXN0IGZpcnN0IGludmVydCB0aHJlc2hvbGQgb24gc2lkZSBvcHBvc2l0ZSBvZiBsYXN0RGlyZWN0aW9uXG4gICAgICBpZiAoIXBhc3RGaXJzdEludmVydFRocmVzaCAmJiAobGFzdERpcmVjdGlvbiA9PT0gMSA/IG1vdXNlT25BeGlzID4gdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyIDogbW91c2VPbkF4aXMgPCB0YXJnZXRTMiAtIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIpKSB7XG4gICAgICAgIC8vIHBhc3QgZmlyc3QgaW52ZXJ0IHRocmVzaG9sZCwgZG8gbm90IHJlc3RyaWN0IGludmVydGVkIHRocmVzaG9sZCB0byBkcmFnRWwgc2hhZG93XG4gICAgICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghcGFzdEZpcnN0SW52ZXJ0VGhyZXNoKSB7XG4gICAgICAgIC8vIGRyYWdFbCBzaGFkb3cgKHRhcmdldCBtb3ZlIGRpc3RhbmNlIHNoYWRvdylcbiAgICAgICAgaWYgKGxhc3REaXJlY3Rpb24gPT09IDEgPyBtb3VzZU9uQXhpcyA8IHRhcmdldFMxICsgdGFyZ2V0TW92ZURpc3RhbmNlIC8vIG92ZXIgZHJhZ0VsIHNoYWRvd1xuICAgICAgICA6IG1vdXNlT25BeGlzID4gdGFyZ2V0UzIgLSB0YXJnZXRNb3ZlRGlzdGFuY2UpIHtcbiAgICAgICAgICByZXR1cm4gLWxhc3REaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludmVydCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlZ3VsYXJcbiAgICAgIGlmIChtb3VzZU9uQXhpcyA+IHRhcmdldFMxICsgdGFyZ2V0TGVuZ3RoICogKDEgLSBzd2FwVGhyZXNob2xkKSAvIDIgJiYgbW91c2VPbkF4aXMgPCB0YXJnZXRTMiAtIHRhcmdldExlbmd0aCAqICgxIC0gc3dhcFRocmVzaG9sZCkgLyAyKSB7XG4gICAgICAgIHJldHVybiBfZ2V0SW5zZXJ0RGlyZWN0aW9uKHRhcmdldCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaW52ZXJ0ID0gaW52ZXJ0IHx8IGludmVydFN3YXA7XG5cbiAgaWYgKGludmVydCkge1xuICAgIC8vIEludmVydCBvZiByZWd1bGFyXG4gICAgaWYgKG1vdXNlT25BeGlzIDwgdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyIHx8IG1vdXNlT25BeGlzID4gdGFyZ2V0UzIgLSB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyKSB7XG4gICAgICByZXR1cm4gbW91c2VPbkF4aXMgPiB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAvIDIgPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG4vKipcbiAqIEdldHMgdGhlIGRpcmVjdGlvbiBkcmFnRWwgbXVzdCBiZSBzd2FwcGVkIHJlbGF0aXZlIHRvIHRhcmdldCBpbiBvcmRlciB0byBtYWtlIGl0XG4gKiBzZWVtIHRoYXQgZHJhZ0VsIGhhcyBiZWVuIFwiaW5zZXJ0ZWRcIiBpbnRvIHRoYXQgZWxlbWVudCdzIHBvc2l0aW9uXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gdGFyZ2V0ICAgICAgIFRoZSB0YXJnZXQgd2hvc2UgcG9zaXRpb24gZHJhZ0VsIGlzIGJlaW5nIGluc2VydGVkIGF0XG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkcmFnRWwgbXVzdCBiZSBzd2FwcGVkXG4gKi9cblxuXG5mdW5jdGlvbiBfZ2V0SW5zZXJ0RGlyZWN0aW9uKHRhcmdldCkge1xuICBpZiAoaW5kZXgoZHJhZ0VsKSA8IGluZGV4KHRhcmdldCkpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cbi8qKlxuICogR2VuZXJhdGUgaWRcbiAqIEBwYXJhbSAgIHtIVE1MRWxlbWVudH0gZWxcbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuZnVuY3Rpb24gX2dlbmVyYXRlSWQoZWwpIHtcbiAgdmFyIHN0ciA9IGVsLnRhZ05hbWUgKyBlbC5jbGFzc05hbWUgKyBlbC5zcmMgKyBlbC5ocmVmICsgZWwudGV4dENvbnRlbnQsXG4gICAgICBpID0gc3RyLmxlbmd0aCxcbiAgICAgIHN1bSA9IDA7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHN1bSArPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuXG4gIHJldHVybiBzdW0udG9TdHJpbmcoMzYpO1xufVxuXG5mdW5jdGlvbiBfc2F2ZUlucHV0Q2hlY2tlZFN0YXRlKHJvb3QpIHtcbiAgc2F2ZWRJbnB1dENoZWNrZWQubGVuZ3RoID0gMDtcbiAgdmFyIGlucHV0cyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7XG4gIHZhciBpZHggPSBpbnB1dHMubGVuZ3RoO1xuXG4gIHdoaWxlIChpZHgtLSkge1xuICAgIHZhciBlbCA9IGlucHV0c1tpZHhdO1xuICAgIGVsLmNoZWNrZWQgJiYgc2F2ZWRJbnB1dENoZWNrZWQucHVzaChlbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX25leHRUaWNrKGZuKSB7XG4gIHJldHVybiBzZXRUaW1lb3V0KGZuLCAwKTtcbn1cblxuZnVuY3Rpb24gX2NhbmNlbE5leHRUaWNrKGlkKSB7XG4gIHJldHVybiBjbGVhclRpbWVvdXQoaWQpO1xufSAvLyBGaXhlZCAjOTczOlxuXG5cbmlmIChkb2N1bWVudEV4aXN0cykge1xuICBvbihkb2N1bWVudCwgJ3RvdWNobW92ZScsIGZ1bmN0aW9uIChldnQpIHtcbiAgICBpZiAoKFNvcnRhYmxlLmFjdGl2ZSB8fCBhd2FpdGluZ0RyYWdTdGFydGVkKSAmJiBldnQuY2FuY2VsYWJsZSkge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9KTtcbn0gLy8gRXhwb3J0IHV0aWxzXG5cblxuU29ydGFibGUudXRpbHMgPSB7XG4gIG9uOiBvbixcbiAgb2ZmOiBvZmYsXG4gIGNzczogY3NzLFxuICBmaW5kOiBmaW5kLFxuICBpczogZnVuY3Rpb24gaXMoZWwsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuICEhY2xvc2VzdChlbCwgc2VsZWN0b3IsIGVsLCBmYWxzZSk7XG4gIH0sXG4gIGV4dGVuZDogZXh0ZW5kLFxuICB0aHJvdHRsZTogdGhyb3R0bGUsXG4gIGNsb3Nlc3Q6IGNsb3Nlc3QsXG4gIHRvZ2dsZUNsYXNzOiB0b2dnbGVDbGFzcyxcbiAgY2xvbmU6IGNsb25lLFxuICBpbmRleDogaW5kZXgsXG4gIG5leHRUaWNrOiBfbmV4dFRpY2ssXG4gIGNhbmNlbE5leHRUaWNrOiBfY2FuY2VsTmV4dFRpY2ssXG4gIGRldGVjdERpcmVjdGlvbjogX2RldGVjdERpcmVjdGlvbixcbiAgZ2V0Q2hpbGQ6IGdldENoaWxkXG59O1xuLyoqXG4gKiBHZXQgdGhlIFNvcnRhYmxlIGluc3RhbmNlIG9mIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50XG4gKiBAcmV0dXJuIHtTb3J0YWJsZXx1bmRlZmluZWR9ICAgICAgICAgVGhlIGluc3RhbmNlIG9mIFNvcnRhYmxlXG4gKi9cblxuU29ydGFibGUuZ2V0ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnRbZXhwYW5kb107XG59O1xuLyoqXG4gKiBNb3VudCBhIHBsdWdpbiB0byBTb3J0YWJsZVxuICogQHBhcmFtICB7Li4uU29ydGFibGVQbHVnaW58U29ydGFibGVQbHVnaW5bXX0gcGx1Z2lucyAgICAgICBQbHVnaW5zIGJlaW5nIG1vdW50ZWRcbiAqL1xuXG5cblNvcnRhYmxlLm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcGx1Z2lucyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBwbHVnaW5zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgaWYgKHBsdWdpbnNbMF0uY29uc3RydWN0b3IgPT09IEFycmF5KSBwbHVnaW5zID0gcGx1Z2luc1swXTtcbiAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICBpZiAoIXBsdWdpbi5wcm90b3R5cGUgfHwgIXBsdWdpbi5wcm90b3R5cGUuY29uc3RydWN0b3IpIHtcbiAgICAgIHRocm93IFwiU29ydGFibGU6IE1vdW50ZWQgcGx1Z2luIG11c3QgYmUgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgbm90IFwiLmNvbmNhdCh7fS50b1N0cmluZy5jYWxsKHBsdWdpbikpO1xuICAgIH1cblxuICAgIGlmIChwbHVnaW4udXRpbHMpIFNvcnRhYmxlLnV0aWxzID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIFNvcnRhYmxlLnV0aWxzKSwgcGx1Z2luLnV0aWxzKTtcbiAgICBQbHVnaW5NYW5hZ2VyLm1vdW50KHBsdWdpbik7XG4gIH0pO1xufTtcbi8qKlxuICogQ3JlYXRlIHNvcnRhYmxlIGluc3RhbmNlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSAgZWxcbiAqIEBwYXJhbSB7T2JqZWN0fSAgICAgIFtvcHRpb25zXVxuICovXG5cblxuU29ydGFibGUuY3JlYXRlID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgU29ydGFibGUoZWwsIG9wdGlvbnMpO1xufTsgLy8gRXhwb3J0XG5cblxuU29ydGFibGUudmVyc2lvbiA9IHZlcnNpb247XG5cbnZhciBhdXRvU2Nyb2xscyA9IFtdLFxuICAgIHNjcm9sbEVsLFxuICAgIHNjcm9sbFJvb3RFbCxcbiAgICBzY3JvbGxpbmcgPSBmYWxzZSxcbiAgICBsYXN0QXV0b1Njcm9sbFgsXG4gICAgbGFzdEF1dG9TY3JvbGxZLFxuICAgIHRvdWNoRXZ0JDEsXG4gICAgcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWw7XG5cbmZ1bmN0aW9uIEF1dG9TY3JvbGxQbHVnaW4oKSB7XG4gIGZ1bmN0aW9uIEF1dG9TY3JvbGwoKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIHNjcm9sbDogdHJ1ZSxcbiAgICAgIGZvcmNlQXV0b1Njcm9sbEZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIHNjcm9sbFNlbnNpdGl2aXR5OiAzMCxcbiAgICAgIHNjcm9sbFNwZWVkOiAxMCxcbiAgICAgIGJ1YmJsZVNjcm9sbDogdHJ1ZVxuICAgIH07IC8vIEJpbmQgYWxsIHByaXZhdGUgbWV0aG9kc1xuXG4gICAgZm9yICh2YXIgZm4gaW4gdGhpcykge1xuICAgICAgaWYgKGZuLmNoYXJBdCgwKSA9PT0gJ18nICYmIHR5cGVvZiB0aGlzW2ZuXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzW2ZuXSA9IHRoaXNbZm5dLmJpbmQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQXV0b1Njcm9sbC5wcm90b3R5cGUgPSB7XG4gICAgZHJhZ1N0YXJ0ZWQ6IGZ1bmN0aW9uIGRyYWdTdGFydGVkKF9yZWYpIHtcbiAgICAgIHZhciBvcmlnaW5hbEV2ZW50ID0gX3JlZi5vcmlnaW5hbEV2ZW50O1xuXG4gICAgICBpZiAodGhpcy5zb3J0YWJsZS5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdkcmFnb3ZlcicsIHRoaXMuX2hhbmRsZUF1dG9TY3JvbGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgICAgICAgIG9uKGRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbmFsRXZlbnQudG91Y2hlcykge1xuICAgICAgICAgIG9uKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQ29tcGxldGVkOiBmdW5jdGlvbiBkcmFnT3ZlckNvbXBsZXRlZChfcmVmMikge1xuICAgICAgdmFyIG9yaWdpbmFsRXZlbnQgPSBfcmVmMi5vcmlnaW5hbEV2ZW50O1xuXG4gICAgICAvLyBGb3Igd2hlbiBidWJibGluZyBpcyBjYW5jZWxlZCBhbmQgdXNpbmcgZmFsbGJhY2sgKGZhbGxiYWNrICd0b3VjaG1vdmUnIGFsd2F5cyByZWFjaGVkKVxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZHJhZ092ZXJCdWJibGUgJiYgIW9yaWdpbmFsRXZlbnQucm9vdEVsKSB7XG4gICAgICAgIHRoaXMuX2hhbmRsZUF1dG9TY3JvbGwob3JpZ2luYWxFdmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKCkge1xuICAgICAgaWYgKHRoaXMuc29ydGFibGUubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIG9mZihkb2N1bWVudCwgJ2RyYWdvdmVyJywgdGhpcy5faGFuZGxlQXV0b1Njcm9sbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvZmYoZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIG9mZihkb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIG9mZihkb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICB9XG5cbiAgICAgIGNsZWFyUG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwoKTtcbiAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgIGNhbmNlbFRocm90dGxlKCk7XG4gICAgfSxcbiAgICBudWxsaW5nOiBmdW5jdGlvbiBudWxsaW5nKCkge1xuICAgICAgdG91Y2hFdnQkMSA9IHNjcm9sbFJvb3RFbCA9IHNjcm9sbEVsID0gc2Nyb2xsaW5nID0gcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgPSBsYXN0QXV0b1Njcm9sbFggPSBsYXN0QXV0b1Njcm9sbFkgPSBudWxsO1xuICAgICAgYXV0b1Njcm9sbHMubGVuZ3RoID0gMDtcbiAgICB9LFxuICAgIF9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGw6IGZ1bmN0aW9uIF9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwoZXZ0KSB7XG4gICAgICB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKGV2dCwgdHJ1ZSk7XG4gICAgfSxcbiAgICBfaGFuZGxlQXV0b1Njcm9sbDogZnVuY3Rpb24gX2hhbmRsZUF1dG9TY3JvbGwoZXZ0LCBmYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHggPSAoZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCkuY2xpZW50WCxcbiAgICAgICAgICB5ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFksXG4gICAgICAgICAgZWxlbSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgICB0b3VjaEV2dCQxID0gZXZ0OyAvLyBJRSBkb2VzIG5vdCBzZWVtIHRvIGhhdmUgbmF0aXZlIGF1dG9zY3JvbGwsXG4gICAgICAvLyBFZGdlJ3MgYXV0b3Njcm9sbCBzZWVtcyB0b28gY29uZGl0aW9uYWwsXG4gICAgICAvLyBNQUNPUyBTYWZhcmkgZG9lcyBub3QgaGF2ZSBhdXRvc2Nyb2xsLFxuICAgICAgLy8gRmlyZWZveCBhbmQgQ2hyb21lIGFyZSBnb29kXG5cbiAgICAgIGlmIChmYWxsYmFjayB8fCB0aGlzLm9wdGlvbnMuZm9yY2VBdXRvU2Nyb2xsRmFsbGJhY2sgfHwgRWRnZSB8fCBJRTExT3JMZXNzIHx8IFNhZmFyaSkge1xuICAgICAgICBhdXRvU2Nyb2xsKGV2dCwgdGhpcy5vcHRpb25zLCBlbGVtLCBmYWxsYmFjayk7IC8vIExpc3RlbmVyIGZvciBwb2ludGVyIGVsZW1lbnQgY2hhbmdlXG5cbiAgICAgICAgdmFyIG9nRWxlbVNjcm9sbGVyID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKHNjcm9sbGluZyAmJiAoIXBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsIHx8IHggIT09IGxhc3RBdXRvU2Nyb2xsWCB8fCB5ICE9PSBsYXN0QXV0b1Njcm9sbFkpKSB7XG4gICAgICAgICAgcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgJiYgY2xlYXJQb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCgpOyAvLyBEZXRlY3QgZm9yIHBvaW50ZXIgZWxlbSBjaGFuZ2UsIGVtdWxhdGluZyBuYXRpdmUgRG5EIGJlaGF2aW91clxuXG4gICAgICAgICAgcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbmV3RWxlbSA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSksIHRydWUpO1xuXG4gICAgICAgICAgICBpZiAobmV3RWxlbSAhPT0gb2dFbGVtU2Nyb2xsZXIpIHtcbiAgICAgICAgICAgICAgb2dFbGVtU2Nyb2xsZXIgPSBuZXdFbGVtO1xuICAgICAgICAgICAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF1dG9TY3JvbGwoZXZ0LCBfdGhpcy5vcHRpb25zLCBuZXdFbGVtLCBmYWxsYmFjayk7XG4gICAgICAgICAgfSwgMTApO1xuICAgICAgICAgIGxhc3RBdXRvU2Nyb2xsWCA9IHg7XG4gICAgICAgICAgbGFzdEF1dG9TY3JvbGxZID0geTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgRG5EIGlzIGVuYWJsZWQgKGFuZCBicm93c2VyIGhhcyBnb29kIGF1dG9zY3JvbGxpbmcpLCBmaXJzdCBhdXRvc2Nyb2xsIHdpbGwgYWxyZWFkeSBzY3JvbGwsIHNvIGdldCBwYXJlbnQgYXV0b3Njcm9sbCBvZiBmaXJzdCBhdXRvc2Nyb2xsXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1YmJsZVNjcm9sbCB8fCBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbGVtLCB0cnVlKSA9PT0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpKSB7XG4gICAgICAgICAgY2xlYXJBdXRvU2Nyb2xscygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dG9TY3JvbGwoZXZ0LCB0aGlzLm9wdGlvbnMsIGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsZW0sIGZhbHNlKSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzKEF1dG9TY3JvbGwsIHtcbiAgICBwbHVnaW5OYW1lOiAnc2Nyb2xsJyxcbiAgICBpbml0aWFsaXplQnlEZWZhdWx0OiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhckF1dG9TY3JvbGxzKCkge1xuICBhdXRvU2Nyb2xscy5mb3JFYWNoKGZ1bmN0aW9uIChhdXRvU2Nyb2xsKSB7XG4gICAgY2xlYXJJbnRlcnZhbChhdXRvU2Nyb2xsLnBpZCk7XG4gIH0pO1xuICBhdXRvU2Nyb2xscyA9IFtdO1xufVxuXG5mdW5jdGlvbiBjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKCkge1xuICBjbGVhckludGVydmFsKHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKTtcbn1cblxudmFyIGF1dG9TY3JvbGwgPSB0aHJvdHRsZShmdW5jdGlvbiAoZXZ0LCBvcHRpb25zLCByb290RWwsIGlzRmFsbGJhY2spIHtcbiAgLy8gQnVnOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD01MDU1MjFcbiAgaWYgKCFvcHRpb25zLnNjcm9sbCkgcmV0dXJuO1xuICB2YXIgeCA9IChldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KS5jbGllbnRYLFxuICAgICAgeSA9IChldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KS5jbGllbnRZLFxuICAgICAgc2VucyA9IG9wdGlvbnMuc2Nyb2xsU2Vuc2l0aXZpdHksXG4gICAgICBzcGVlZCA9IG9wdGlvbnMuc2Nyb2xsU3BlZWQsXG4gICAgICB3aW5TY3JvbGxlciA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgdmFyIHNjcm9sbFRoaXNJbnN0YW5jZSA9IGZhbHNlLFxuICAgICAgc2Nyb2xsQ3VzdG9tRm47IC8vIE5ldyBzY3JvbGwgcm9vdCwgc2V0IHNjcm9sbEVsXG5cbiAgaWYgKHNjcm9sbFJvb3RFbCAhPT0gcm9vdEVsKSB7XG4gICAgc2Nyb2xsUm9vdEVsID0gcm9vdEVsO1xuICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICBzY3JvbGxFbCA9IG9wdGlvbnMuc2Nyb2xsO1xuICAgIHNjcm9sbEN1c3RvbUZuID0gb3B0aW9ucy5zY3JvbGxGbjtcblxuICAgIGlmIChzY3JvbGxFbCA9PT0gdHJ1ZSkge1xuICAgICAgc2Nyb2xsRWwgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChyb290RWwsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYXllcnNPdXQgPSAwO1xuICB2YXIgY3VycmVudFBhcmVudCA9IHNjcm9sbEVsO1xuXG4gIGRvIHtcbiAgICB2YXIgZWwgPSBjdXJyZW50UGFyZW50LFxuICAgICAgICByZWN0ID0gZ2V0UmVjdChlbCksXG4gICAgICAgIHRvcCA9IHJlY3QudG9wLFxuICAgICAgICBib3R0b20gPSByZWN0LmJvdHRvbSxcbiAgICAgICAgbGVmdCA9IHJlY3QubGVmdCxcbiAgICAgICAgcmlnaHQgPSByZWN0LnJpZ2h0LFxuICAgICAgICB3aWR0aCA9IHJlY3Qud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IHJlY3QuaGVpZ2h0LFxuICAgICAgICBjYW5TY3JvbGxYID0gdm9pZCAwLFxuICAgICAgICBjYW5TY3JvbGxZID0gdm9pZCAwLFxuICAgICAgICBzY3JvbGxXaWR0aCA9IGVsLnNjcm9sbFdpZHRoLFxuICAgICAgICBzY3JvbGxIZWlnaHQgPSBlbC5zY3JvbGxIZWlnaHQsXG4gICAgICAgIGVsQ1NTID0gY3NzKGVsKSxcbiAgICAgICAgc2Nyb2xsUG9zWCA9IGVsLnNjcm9sbExlZnQsXG4gICAgICAgIHNjcm9sbFBvc1kgPSBlbC5zY3JvbGxUb3A7XG5cbiAgICBpZiAoZWwgPT09IHdpblNjcm9sbGVyKSB7XG4gICAgICBjYW5TY3JvbGxYID0gd2lkdGggPCBzY3JvbGxXaWR0aCAmJiAoZWxDU1Mub3ZlcmZsb3dYID09PSAnYXV0bycgfHwgZWxDU1Mub3ZlcmZsb3dYID09PSAnc2Nyb2xsJyB8fCBlbENTUy5vdmVyZmxvd1ggPT09ICd2aXNpYmxlJyk7XG4gICAgICBjYW5TY3JvbGxZID0gaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0ICYmIChlbENTUy5vdmVyZmxvd1kgPT09ICdhdXRvJyB8fCBlbENTUy5vdmVyZmxvd1kgPT09ICdzY3JvbGwnIHx8IGVsQ1NTLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FuU2Nyb2xsWCA9IHdpZHRoIDwgc2Nyb2xsV2lkdGggJiYgKGVsQ1NTLm92ZXJmbG93WCA9PT0gJ2F1dG8nIHx8IGVsQ1NTLm92ZXJmbG93WCA9PT0gJ3Njcm9sbCcpO1xuICAgICAgY2FuU2Nyb2xsWSA9IGhlaWdodCA8IHNjcm9sbEhlaWdodCAmJiAoZWxDU1Mub3ZlcmZsb3dZID09PSAnYXV0bycgfHwgZWxDU1Mub3ZlcmZsb3dZID09PSAnc2Nyb2xsJyk7XG4gICAgfVxuXG4gICAgdmFyIHZ4ID0gY2FuU2Nyb2xsWCAmJiAoTWF0aC5hYnMocmlnaHQgLSB4KSA8PSBzZW5zICYmIHNjcm9sbFBvc1ggKyB3aWR0aCA8IHNjcm9sbFdpZHRoKSAtIChNYXRoLmFicyhsZWZ0IC0geCkgPD0gc2VucyAmJiAhIXNjcm9sbFBvc1gpO1xuICAgIHZhciB2eSA9IGNhblNjcm9sbFkgJiYgKE1hdGguYWJzKGJvdHRvbSAtIHkpIDw9IHNlbnMgJiYgc2Nyb2xsUG9zWSArIGhlaWdodCA8IHNjcm9sbEhlaWdodCkgLSAoTWF0aC5hYnModG9wIC0geSkgPD0gc2VucyAmJiAhIXNjcm9sbFBvc1kpO1xuXG4gICAgaWYgKCFhdXRvU2Nyb2xsc1tsYXllcnNPdXRdKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBsYXllcnNPdXQ7IGkrKykge1xuICAgICAgICBpZiAoIWF1dG9TY3JvbGxzW2ldKSB7XG4gICAgICAgICAgYXV0b1Njcm9sbHNbaV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ4ICE9IHZ4IHx8IGF1dG9TY3JvbGxzW2xheWVyc091dF0udnkgIT0gdnkgfHwgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5lbCAhPT0gZWwpIHtcbiAgICAgIGF1dG9TY3JvbGxzW2xheWVyc091dF0uZWwgPSBlbDtcbiAgICAgIGF1dG9TY3JvbGxzW2xheWVyc091dF0udnggPSB2eDtcbiAgICAgIGF1dG9TY3JvbGxzW2xheWVyc091dF0udnkgPSB2eTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5waWQpO1xuXG4gICAgICBpZiAodnggIT0gMCB8fCB2eSAhPSAwKSB7XG4gICAgICAgIHNjcm9sbFRoaXNJbnN0YW5jZSA9IHRydWU7XG4gICAgICAgIC8qIGpzaGludCBsb29wZnVuYzp0cnVlICovXG5cbiAgICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5waWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gZW11bGF0ZSBkcmFnIG92ZXIgZHVyaW5nIGF1dG9zY3JvbGwgKGZhbGxiYWNrKSwgZW11bGF0aW5nIG5hdGl2ZSBEbkQgYmVoYXZpb3VyXG4gICAgICAgICAgaWYgKGlzRmFsbGJhY2sgJiYgdGhpcy5sYXllciA9PT0gMCkge1xuICAgICAgICAgICAgU29ydGFibGUuYWN0aXZlLl9vblRvdWNoTW92ZSh0b3VjaEV2dCQxKTsgLy8gVG8gbW92ZSBnaG9zdCBpZiBpdCBpcyBwb3NpdGlvbmVkIGFic29sdXRlbHlcblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBzY3JvbGxPZmZzZXRZID0gYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0udnkgPyBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eSAqIHNwZWVkIDogMDtcbiAgICAgICAgICB2YXIgc2Nyb2xsT2Zmc2V0WCA9IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ4ID8gYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0udnggKiBzcGVlZCA6IDA7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHNjcm9sbEN1c3RvbUZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAoc2Nyb2xsQ3VzdG9tRm4uY2FsbChTb3J0YWJsZS5kcmFnZ2VkLnBhcmVudE5vZGVbZXhwYW5kb10sIHNjcm9sbE9mZnNldFgsIHNjcm9sbE9mZnNldFksIGV2dCwgdG91Y2hFdnQkMSwgYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0uZWwpICE9PSAnY29udGludWUnKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzY3JvbGxCeShhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS5lbCwgc2Nyb2xsT2Zmc2V0WCwgc2Nyb2xsT2Zmc2V0WSk7XG4gICAgICAgIH0uYmluZCh7XG4gICAgICAgICAgbGF5ZXI6IGxheWVyc091dFxuICAgICAgICB9KSwgMjQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxheWVyc091dCsrO1xuICB9IHdoaWxlIChvcHRpb25zLmJ1YmJsZVNjcm9sbCAmJiBjdXJyZW50UGFyZW50ICE9PSB3aW5TY3JvbGxlciAmJiAoY3VycmVudFBhcmVudCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGN1cnJlbnRQYXJlbnQsIGZhbHNlKSkpO1xuXG4gIHNjcm9sbGluZyA9IHNjcm9sbFRoaXNJbnN0YW5jZTsgLy8gaW4gY2FzZSBhbm90aGVyIGZ1bmN0aW9uIGNhdGNoZXMgc2Nyb2xsaW5nIGFzIGZhbHNlIGluIGJldHdlZW4gd2hlbiBpdCBpcyBub3Rcbn0sIDMwKTtcblxudmFyIGRyb3AgPSBmdW5jdGlvbiBkcm9wKF9yZWYpIHtcbiAgdmFyIG9yaWdpbmFsRXZlbnQgPSBfcmVmLm9yaWdpbmFsRXZlbnQsXG4gICAgICBwdXRTb3J0YWJsZSA9IF9yZWYucHV0U29ydGFibGUsXG4gICAgICBkcmFnRWwgPSBfcmVmLmRyYWdFbCxcbiAgICAgIGFjdGl2ZVNvcnRhYmxlID0gX3JlZi5hY3RpdmVTb3J0YWJsZSxcbiAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCA9IF9yZWYuZGlzcGF0Y2hTb3J0YWJsZUV2ZW50LFxuICAgICAgaGlkZUdob3N0Rm9yVGFyZ2V0ID0gX3JlZi5oaWRlR2hvc3RGb3JUYXJnZXQsXG4gICAgICB1bmhpZGVHaG9zdEZvclRhcmdldCA9IF9yZWYudW5oaWRlR2hvc3RGb3JUYXJnZXQ7XG4gIGlmICghb3JpZ2luYWxFdmVudCkgcmV0dXJuO1xuICB2YXIgdG9Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IGFjdGl2ZVNvcnRhYmxlO1xuICBoaWRlR2hvc3RGb3JUYXJnZXQoKTtcbiAgdmFyIHRvdWNoID0gb3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBvcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA/IG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBvcmlnaW5hbEV2ZW50O1xuICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZKTtcbiAgdW5oaWRlR2hvc3RGb3JUYXJnZXQoKTtcblxuICBpZiAodG9Tb3J0YWJsZSAmJiAhdG9Tb3J0YWJsZS5lbC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50KCdzcGlsbCcpO1xuICAgIHRoaXMub25TcGlsbCh7XG4gICAgICBkcmFnRWw6IGRyYWdFbCxcbiAgICAgIHB1dFNvcnRhYmxlOiBwdXRTb3J0YWJsZVxuICAgIH0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBSZXZlcnQoKSB7fVxuXG5SZXZlcnQucHJvdG90eXBlID0ge1xuICBzdGFydEluZGV4OiBudWxsLFxuICBkcmFnU3RhcnQ6IGZ1bmN0aW9uIGRyYWdTdGFydChfcmVmMikge1xuICAgIHZhciBvbGREcmFnZ2FibGVJbmRleCA9IF9yZWYyLm9sZERyYWdnYWJsZUluZGV4O1xuICAgIHRoaXMuc3RhcnRJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4O1xuICB9LFxuICBvblNwaWxsOiBmdW5jdGlvbiBvblNwaWxsKF9yZWYzKSB7XG4gICAgdmFyIGRyYWdFbCA9IF9yZWYzLmRyYWdFbCxcbiAgICAgICAgcHV0U29ydGFibGUgPSBfcmVmMy5wdXRTb3J0YWJsZTtcbiAgICB0aGlzLnNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuXG4gICAgaWYgKHB1dFNvcnRhYmxlKSB7XG4gICAgICBwdXRTb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFNpYmxpbmcgPSBnZXRDaGlsZCh0aGlzLnNvcnRhYmxlLmVsLCB0aGlzLnN0YXJ0SW5kZXgsIHRoaXMub3B0aW9ucyk7XG5cbiAgICBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgIHRoaXMuc29ydGFibGUuZWwuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgbmV4dFNpYmxpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvcnRhYmxlLmVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgfVxuXG4gICAgdGhpcy5zb3J0YWJsZS5hbmltYXRlQWxsKCk7XG5cbiAgICBpZiAocHV0U29ydGFibGUpIHtcbiAgICAgIHB1dFNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICB9XG4gIH0sXG4gIGRyb3A6IGRyb3Bcbn07XG5cbl9leHRlbmRzKFJldmVydCwge1xuICBwbHVnaW5OYW1lOiAncmV2ZXJ0T25TcGlsbCdcbn0pO1xuXG5mdW5jdGlvbiBSZW1vdmUoKSB7fVxuXG5SZW1vdmUucHJvdG90eXBlID0ge1xuICBvblNwaWxsOiBmdW5jdGlvbiBvblNwaWxsKF9yZWY0KSB7XG4gICAgdmFyIGRyYWdFbCA9IF9yZWY0LmRyYWdFbCxcbiAgICAgICAgcHV0U29ydGFibGUgPSBfcmVmNC5wdXRTb3J0YWJsZTtcbiAgICB2YXIgcGFyZW50U29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCB0aGlzLnNvcnRhYmxlO1xuICAgIHBhcmVudFNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIGRyYWdFbC5wYXJlbnROb2RlICYmIGRyYWdFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRyYWdFbCk7XG4gICAgcGFyZW50U29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICB9LFxuICBkcm9wOiBkcm9wXG59O1xuXG5fZXh0ZW5kcyhSZW1vdmUsIHtcbiAgcGx1Z2luTmFtZTogJ3JlbW92ZU9uU3BpbGwnXG59KTtcblxudmFyIGxhc3RTd2FwRWw7XG5cbmZ1bmN0aW9uIFN3YXBQbHVnaW4oKSB7XG4gIGZ1bmN0aW9uIFN3YXAoKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIHN3YXBDbGFzczogJ3NvcnRhYmxlLXN3YXAtaGlnaGxpZ2h0J1xuICAgIH07XG4gIH1cblxuICBTd2FwLnByb3RvdHlwZSA9IHtcbiAgICBkcmFnU3RhcnQ6IGZ1bmN0aW9uIGRyYWdTdGFydChfcmVmKSB7XG4gICAgICB2YXIgZHJhZ0VsID0gX3JlZi5kcmFnRWw7XG4gICAgICBsYXN0U3dhcEVsID0gZHJhZ0VsO1xuICAgIH0sXG4gICAgZHJhZ092ZXJWYWxpZDogZnVuY3Rpb24gZHJhZ092ZXJWYWxpZChfcmVmMikge1xuICAgICAgdmFyIGNvbXBsZXRlZCA9IF9yZWYyLmNvbXBsZXRlZCxcbiAgICAgICAgICB0YXJnZXQgPSBfcmVmMi50YXJnZXQsXG4gICAgICAgICAgb25Nb3ZlID0gX3JlZjIub25Nb3ZlLFxuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlID0gX3JlZjIuYWN0aXZlU29ydGFibGUsXG4gICAgICAgICAgY2hhbmdlZCA9IF9yZWYyLmNoYW5nZWQsXG4gICAgICAgICAgY2FuY2VsID0gX3JlZjIuY2FuY2VsO1xuICAgICAgaWYgKCFhY3RpdmVTb3J0YWJsZS5vcHRpb25zLnN3YXApIHJldHVybjtcbiAgICAgIHZhciBlbCA9IHRoaXMuc29ydGFibGUuZWwsXG4gICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGVsKSB7XG4gICAgICAgIHZhciBwcmV2U3dhcEVsID0gbGFzdFN3YXBFbDtcblxuICAgICAgICBpZiAob25Nb3ZlKHRhcmdldCkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3ModGFyZ2V0LCBvcHRpb25zLnN3YXBDbGFzcywgdHJ1ZSk7XG4gICAgICAgICAgbGFzdFN3YXBFbCA9IHRhcmdldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0U3dhcEVsID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2U3dhcEVsICYmIHByZXZTd2FwRWwgIT09IGxhc3RTd2FwRWwpIHtcbiAgICAgICAgICB0b2dnbGVDbGFzcyhwcmV2U3dhcEVsLCBvcHRpb25zLnN3YXBDbGFzcywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZWQoKTtcbiAgICAgIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgIGNhbmNlbCgpO1xuICAgIH0sXG4gICAgZHJvcDogZnVuY3Rpb24gZHJvcChfcmVmMykge1xuICAgICAgdmFyIGFjdGl2ZVNvcnRhYmxlID0gX3JlZjMuYWN0aXZlU29ydGFibGUsXG4gICAgICAgICAgcHV0U29ydGFibGUgPSBfcmVmMy5wdXRTb3J0YWJsZSxcbiAgICAgICAgICBkcmFnRWwgPSBfcmVmMy5kcmFnRWw7XG4gICAgICB2YXIgdG9Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IHRoaXMuc29ydGFibGU7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIGxhc3RTd2FwRWwgJiYgdG9nZ2xlQ2xhc3MobGFzdFN3YXBFbCwgb3B0aW9ucy5zd2FwQ2xhc3MsIGZhbHNlKTtcblxuICAgICAgaWYgKGxhc3RTd2FwRWwgJiYgKG9wdGlvbnMuc3dhcCB8fCBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5vcHRpb25zLnN3YXApKSB7XG4gICAgICAgIGlmIChkcmFnRWwgIT09IGxhc3RTd2FwRWwpIHtcbiAgICAgICAgICB0b1NvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgICAgIGlmICh0b1NvcnRhYmxlICE9PSBhY3RpdmVTb3J0YWJsZSkgYWN0aXZlU29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgICAgICAgc3dhcE5vZGVzKGRyYWdFbCwgbGFzdFN3YXBFbCk7XG4gICAgICAgICAgdG9Tb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gICAgICAgICAgaWYgKHRvU29ydGFibGUgIT09IGFjdGl2ZVNvcnRhYmxlKSBhY3RpdmVTb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIG51bGxpbmc6IGZ1bmN0aW9uIG51bGxpbmcoKSB7XG4gICAgICBsYXN0U3dhcEVsID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcyhTd2FwLCB7XG4gICAgcGx1Z2luTmFtZTogJ3N3YXAnLFxuICAgIGV2ZW50UHJvcGVydGllczogZnVuY3Rpb24gZXZlbnRQcm9wZXJ0aWVzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3dhcEl0ZW06IGxhc3RTd2FwRWxcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc3dhcE5vZGVzKG4xLCBuMikge1xuICB2YXIgcDEgPSBuMS5wYXJlbnROb2RlLFxuICAgICAgcDIgPSBuMi5wYXJlbnROb2RlLFxuICAgICAgaTEsXG4gICAgICBpMjtcbiAgaWYgKCFwMSB8fCAhcDIgfHwgcDEuaXNFcXVhbE5vZGUobjIpIHx8IHAyLmlzRXF1YWxOb2RlKG4xKSkgcmV0dXJuO1xuICBpMSA9IGluZGV4KG4xKTtcbiAgaTIgPSBpbmRleChuMik7XG5cbiAgaWYgKHAxLmlzRXF1YWxOb2RlKHAyKSAmJiBpMSA8IGkyKSB7XG4gICAgaTIrKztcbiAgfVxuXG4gIHAxLmluc2VydEJlZm9yZShuMiwgcDEuY2hpbGRyZW5baTFdKTtcbiAgcDIuaW5zZXJ0QmVmb3JlKG4xLCBwMi5jaGlsZHJlbltpMl0pO1xufVxuXG52YXIgbXVsdGlEcmFnRWxlbWVudHMgPSBbXSxcbiAgICBtdWx0aURyYWdDbG9uZXMgPSBbXSxcbiAgICBsYXN0TXVsdGlEcmFnU2VsZWN0LFxuICAgIC8vIGZvciBzZWxlY3Rpb24gd2l0aCBtb2RpZmllciBrZXkgZG93biAoU0hJRlQpXG5tdWx0aURyYWdTb3J0YWJsZSxcbiAgICBpbml0aWFsRm9sZGluZyA9IGZhbHNlLFxuICAgIC8vIEluaXRpYWwgbXVsdGktZHJhZyBmb2xkIHdoZW4gZHJhZyBzdGFydGVkXG5mb2xkaW5nID0gZmFsc2UsXG4gICAgLy8gRm9sZGluZyBhbnkgb3RoZXIgdGltZVxuZHJhZ1N0YXJ0ZWQgPSBmYWxzZSxcbiAgICBkcmFnRWwkMSxcbiAgICBjbG9uZXNGcm9tUmVjdCxcbiAgICBjbG9uZXNIaWRkZW47XG5cbmZ1bmN0aW9uIE11bHRpRHJhZ1BsdWdpbigpIHtcbiAgZnVuY3Rpb24gTXVsdGlEcmFnKHNvcnRhYmxlKSB7XG4gICAgLy8gQmluZCBhbGwgcHJpdmF0ZSBtZXRob2RzXG4gICAgZm9yICh2YXIgZm4gaW4gdGhpcykge1xuICAgICAgaWYgKGZuLmNoYXJBdCgwKSA9PT0gJ18nICYmIHR5cGVvZiB0aGlzW2ZuXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzW2ZuXSA9IHRoaXNbZm5dLmJpbmQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNvcnRhYmxlLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgIG9uKGRvY3VtZW50LCAncG9pbnRlcnVwJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbihkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICBvbihkb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgIH1cblxuICAgIG9uKGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuX2NoZWNrS2V5RG93bik7XG4gICAgb24oZG9jdW1lbnQsICdrZXl1cCcsIHRoaXMuX2NoZWNrS2V5VXApO1xuICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICBzZWxlY3RlZENsYXNzOiAnc29ydGFibGUtc2VsZWN0ZWQnLFxuICAgICAgbXVsdGlEcmFnS2V5OiBudWxsLFxuICAgICAgc2V0RGF0YTogZnVuY3Rpb24gc2V0RGF0YShkYXRhVHJhbnNmZXIsIGRyYWdFbCkge1xuICAgICAgICB2YXIgZGF0YSA9ICcnO1xuXG4gICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggJiYgbXVsdGlEcmFnU29ydGFibGUgPT09IHNvcnRhYmxlKSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCwgaSkge1xuICAgICAgICAgICAgZGF0YSArPSAoIWkgPyAnJyA6ICcsICcpICsgbXVsdGlEcmFnRWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRhID0gZHJhZ0VsLnRleHRDb250ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVRyYW5zZmVyLnNldERhdGEoJ1RleHQnLCBkYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgTXVsdGlEcmFnLnByb3RvdHlwZSA9IHtcbiAgICBtdWx0aURyYWdLZXlEb3duOiBmYWxzZSxcbiAgICBpc011bHRpRHJhZzogZmFsc2UsXG4gICAgZGVsYXlTdGFydEdsb2JhbDogZnVuY3Rpb24gZGVsYXlTdGFydEdsb2JhbChfcmVmKSB7XG4gICAgICB2YXIgZHJhZ2dlZCA9IF9yZWYuZHJhZ0VsO1xuICAgICAgZHJhZ0VsJDEgPSBkcmFnZ2VkO1xuICAgIH0sXG4gICAgZGVsYXlFbmRlZDogZnVuY3Rpb24gZGVsYXlFbmRlZCgpIHtcbiAgICAgIHRoaXMuaXNNdWx0aURyYWcgPSB+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSk7XG4gICAgfSxcbiAgICBzZXR1cENsb25lOiBmdW5jdGlvbiBzZXR1cENsb25lKF9yZWYyKSB7XG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmMi5zb3J0YWJsZSxcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmMi5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdWx0aURyYWdFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtdWx0aURyYWdDbG9uZXMucHVzaChjbG9uZShtdWx0aURyYWdFbGVtZW50c1tpXSkpO1xuICAgICAgICBtdWx0aURyYWdDbG9uZXNbaV0uc29ydGFibGVJbmRleCA9IG11bHRpRHJhZ0VsZW1lbnRzW2ldLnNvcnRhYmxlSW5kZXg7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lc1tpXS5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzW2ldLnN0eWxlWyd3aWxsLWNoYW5nZSddID0gJyc7XG4gICAgICAgIHRvZ2dsZUNsYXNzKG11bHRpRHJhZ0Nsb25lc1tpXSwgdGhpcy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHNbaV0gPT09IGRyYWdFbCQxICYmIHRvZ2dsZUNsYXNzKG11bHRpRHJhZ0Nsb25lc1tpXSwgdGhpcy5vcHRpb25zLmNob3NlbkNsYXNzLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHNvcnRhYmxlLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBjbG9uZTogZnVuY3Rpb24gY2xvbmUoX3JlZjMpIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWYzLnNvcnRhYmxlLFxuICAgICAgICAgIHJvb3RFbCA9IF9yZWYzLnJvb3RFbCxcbiAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQgPSBfcmVmMy5kaXNwYXRjaFNvcnRhYmxlRXZlbnQsXG4gICAgICAgICAgY2FuY2VsID0gX3JlZjMuY2FuY2VsO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG5cbiAgICAgIGlmICghdGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlKSB7XG4gICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggJiYgbXVsdGlEcmFnU29ydGFibGUgPT09IHNvcnRhYmxlKSB7XG4gICAgICAgICAgaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKHRydWUsIHJvb3RFbCk7XG4gICAgICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50KCdjbG9uZScpO1xuICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBzaG93Q2xvbmU6IGZ1bmN0aW9uIHNob3dDbG9uZShfcmVmNCkge1xuICAgICAgdmFyIGNsb25lTm93U2hvd24gPSBfcmVmNC5jbG9uZU5vd1Nob3duLFxuICAgICAgICAgIHJvb3RFbCA9IF9yZWY0LnJvb3RFbCxcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmNC5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgIGluc2VydE11bHRpRHJhZ0Nsb25lcyhmYWxzZSwgcm9vdEVsKTtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICBjc3MoY2xvbmUsICdkaXNwbGF5JywgJycpO1xuICAgICAgfSk7XG4gICAgICBjbG9uZU5vd1Nob3duKCk7XG4gICAgICBjbG9uZXNIaWRkZW4gPSBmYWxzZTtcbiAgICAgIGNhbmNlbCgpO1xuICAgIH0sXG4gICAgaGlkZUNsb25lOiBmdW5jdGlvbiBoaWRlQ2xvbmUoX3JlZjUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWY1LnNvcnRhYmxlLFxuICAgICAgICAgIGNsb25lTm93SGlkZGVuID0gX3JlZjUuY2xvbmVOb3dIaWRkZW4sXG4gICAgICAgICAgY2FuY2VsID0gX3JlZjUuY2FuY2VsO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG4gICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgY3NzKGNsb25lLCAnZGlzcGxheScsICdub25lJyk7XG5cbiAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUgJiYgY2xvbmUucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGNsb25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNsb25lTm93SGlkZGVuKCk7XG4gICAgICBjbG9uZXNIaWRkZW4gPSB0cnVlO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBkcmFnU3RhcnRHbG9iYWw6IGZ1bmN0aW9uIGRyYWdTdGFydEdsb2JhbChfcmVmNikge1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjYuc29ydGFibGU7XG5cbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZyAmJiBtdWx0aURyYWdTb3J0YWJsZSkge1xuICAgICAgICBtdWx0aURyYWdTb3J0YWJsZS5tdWx0aURyYWcuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG4gICAgICB9XG5cbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4ID0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICB9KTsgLy8gU29ydCBtdWx0aS1kcmFnIGVsZW1lbnRzXG5cbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzID0gbXVsdGlEcmFnRWxlbWVudHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5zb3J0YWJsZUluZGV4IC0gYi5zb3J0YWJsZUluZGV4O1xuICAgICAgfSk7XG4gICAgICBkcmFnU3RhcnRlZCA9IHRydWU7XG4gICAgfSxcbiAgICBkcmFnU3RhcnRlZDogZnVuY3Rpb24gZHJhZ1N0YXJ0ZWQoX3JlZjcpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmNy5zb3J0YWJsZTtcbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZykgcmV0dXJuO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNvcnQpIHtcbiAgICAgICAgLy8gQ2FwdHVyZSByZWN0cyxcbiAgICAgICAgLy8gaGlkZSBtdWx0aSBkcmFnIGVsZW1lbnRzIChieSBwb3NpdGlvbmluZyB0aGVtIGFic29sdXRlKSxcbiAgICAgICAgLy8gc2V0IG11bHRpIGRyYWcgZWxlbWVudHMgcmVjdHMgdG8gZHJhZ1JlY3QsXG4gICAgICAgIC8vIHNob3cgbXVsdGkgZHJhZyBlbGVtZW50cyxcbiAgICAgICAgLy8gYW5pbWF0ZSB0byByZWN0cyxcbiAgICAgICAgLy8gdW5zZXQgcmVjdHMgJiByZW1vdmUgZnJvbSBET01cbiAgICAgICAgc29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICAgICAgICAgIGNzcyhtdWx0aURyYWdFbGVtZW50LCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCQxLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgICAgICAgICBzZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQsIGRyYWdSZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgICBpbml0aWFsRm9sZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc29ydGFibGUuYW5pbWF0ZUFsbChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgICAgICAgaW5pdGlhbEZvbGRpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAoX3RoaXMyLm9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgdW5zZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IC8vIFJlbW92ZSBhbGwgYXV4aWxpYXJ5IG11bHRpZHJhZyBpdGVtcyBmcm9tIGVsLCBpZiBzb3J0aW5nIGVuYWJsZWRcblxuXG4gICAgICAgIGlmIChfdGhpczIub3B0aW9ucy5zb3J0KSB7XG4gICAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBkcmFnT3ZlcjogZnVuY3Rpb24gZHJhZ092ZXIoX3JlZjgpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBfcmVmOC50YXJnZXQsXG4gICAgICAgICAgY29tcGxldGVkID0gX3JlZjguY29tcGxldGVkLFxuICAgICAgICAgIGNhbmNlbCA9IF9yZWY4LmNhbmNlbDtcblxuICAgICAgaWYgKGZvbGRpbmcgJiYgfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YodGFyZ2V0KSkge1xuICAgICAgICBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJldmVydDogZnVuY3Rpb24gcmV2ZXJ0KF9yZWY5KSB7XG4gICAgICB2YXIgZnJvbVNvcnRhYmxlID0gX3JlZjkuZnJvbVNvcnRhYmxlLFxuICAgICAgICAgIHJvb3RFbCA9IF9yZWY5LnJvb3RFbCxcbiAgICAgICAgICBzb3J0YWJsZSA9IF9yZWY5LnNvcnRhYmxlLFxuICAgICAgICAgIGRyYWdSZWN0ID0gX3JlZjkuZHJhZ1JlY3Q7XG5cbiAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFNldHVwIHVuZm9sZCBhbmltYXRpb25cbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgIHNvcnRhYmxlLmFkZEFuaW1hdGlvblN0YXRlKHtcbiAgICAgICAgICAgIHRhcmdldDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICAgIHJlY3Q6IGZvbGRpbmcgPyBnZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpIDogZHJhZ1JlY3RcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB1bnNldFJlY3QobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudC5mcm9tUmVjdCA9IGRyYWdSZWN0O1xuICAgICAgICAgIGZyb21Tb3J0YWJsZS5yZW1vdmVBbmltYXRpb25TdGF0ZShtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgICAgICAgaW5zZXJ0TXVsdGlEcmFnRWxlbWVudHMoIXRoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSwgcm9vdEVsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQ29tcGxldGVkOiBmdW5jdGlvbiBkcmFnT3ZlckNvbXBsZXRlZChfcmVmMTApIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWYxMC5zb3J0YWJsZSxcbiAgICAgICAgICBpc093bmVyID0gX3JlZjEwLmlzT3duZXIsXG4gICAgICAgICAgaW5zZXJ0aW9uID0gX3JlZjEwLmluc2VydGlvbixcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IF9yZWYxMC5hY3RpdmVTb3J0YWJsZSxcbiAgICAgICAgICBwYXJlbnRFbCA9IF9yZWYxMC5wYXJlbnRFbCxcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYxMC5wdXRTb3J0YWJsZTtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBpZiAoaW5zZXJ0aW9uKSB7XG4gICAgICAgIC8vIENsb25lcyBtdXN0IGJlIGhpZGRlbiBiZWZvcmUgZm9sZGluZyBhbmltYXRpb24gdG8gY2FwdHVyZSBkcmFnUmVjdEFic29sdXRlIHByb3Blcmx5XG4gICAgICAgIGlmIChpc093bmVyKSB7XG4gICAgICAgICAgYWN0aXZlU29ydGFibGUuX2hpZGVDbG9uZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5pdGlhbEZvbGRpbmcgPSBmYWxzZTsgLy8gSWYgbGVhdmluZyBzb3J0OmZhbHNlIHJvb3QsIG9yIGFscmVhZHkgZm9sZGluZyAtIEZvbGQgdG8gbmV3IGxvY2F0aW9uXG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0aW9uICYmIG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEgJiYgKGZvbGRpbmcgfHwgIWlzT3duZXIgJiYgIWFjdGl2ZVNvcnRhYmxlLm9wdGlvbnMuc29ydCAmJiAhcHV0U29ydGFibGUpKSB7XG4gICAgICAgICAgLy8gRm9sZDogU2V0IGFsbCBtdWx0aSBkcmFnIGVsZW1lbnRzJ3MgcmVjdHMgdG8gZHJhZ0VsJ3MgcmVjdCB3aGVuIG11bHRpLWRyYWcgZWxlbWVudHMgYXJlIGludmlzaWJsZVxuICAgICAgICAgIHZhciBkcmFnUmVjdEFic29sdXRlID0gZ2V0UmVjdChkcmFnRWwkMSwgZmFsc2UsIHRydWUsIHRydWUpO1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgICAgICAgICAgc2V0UmVjdChtdWx0aURyYWdFbGVtZW50LCBkcmFnUmVjdEFic29sdXRlKTsgLy8gTW92ZSBlbGVtZW50KHMpIHRvIGVuZCBvZiBwYXJlbnRFbCBzbyB0aGF0IGl0IGRvZXMgbm90IGludGVyZmVyZSB3aXRoIG11bHRpLWRyYWcgY2xvbmVzIGluc2VydGlvbiBpZiB0aGV5IGFyZSBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gd2hpbGUgZm9sZGluZywgYW5kIHNvIHRoYXQgd2UgY2FuIGNhcHR1cmUgdGhlbSBhZ2FpbiBiZWNhdXNlIG9sZCBzb3J0YWJsZSB3aWxsIG5vIGxvbmdlciBiZSBmcm9tU29ydGFibGVcblxuICAgICAgICAgICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9sZGluZyA9IHRydWU7XG4gICAgICAgIH0gLy8gQ2xvbmVzIG11c3QgYmUgc2hvd24gKGFuZCBjaGVjayB0byByZW1vdmUgbXVsdGkgZHJhZ3MpIGFmdGVyIGZvbGRpbmcgd2hlbiBpbnRlcmZlcmluZyBtdWx0aURyYWdFbGVtZW50cyBhcmUgbW92ZWQgb3V0XG5cblxuICAgICAgICBpZiAoIWlzT3duZXIpIHtcbiAgICAgICAgICAvLyBPbmx5IHJlbW92ZSBpZiBub3QgZm9sZGluZyAoZm9sZGluZyB3aWxsIHJlbW92ZSB0aGVtIGFueXdheXMpXG4gICAgICAgICAgaWYgKCFmb2xkaW5nKSB7XG4gICAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgY2xvbmVzSGlkZGVuQmVmb3JlID0gY2xvbmVzSGlkZGVuO1xuXG4gICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5fc2hvd0Nsb25lKHNvcnRhYmxlKTsgLy8gVW5mb2xkIGFuaW1hdGlvbiBmb3IgY2xvbmVzIGlmIHNob3dpbmcgZnJvbSBoaWRkZW5cblxuXG4gICAgICAgICAgICBpZiAoYWN0aXZlU29ydGFibGUub3B0aW9ucy5hbmltYXRpb24gJiYgIWNsb25lc0hpZGRlbiAmJiBjbG9uZXNIaWRkZW5CZWZvcmUpIHtcbiAgICAgICAgICAgICAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlU29ydGFibGUuYWRkQW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBjbG9uZSxcbiAgICAgICAgICAgICAgICAgIHJlY3Q6IGNsb25lc0Zyb21SZWN0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2xvbmUuZnJvbVJlY3QgPSBjbG9uZXNGcm9tUmVjdDtcbiAgICAgICAgICAgICAgICBjbG9uZS50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWN0aXZlU29ydGFibGUuX3Nob3dDbG9uZShzb3J0YWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkcmFnT3ZlckFuaW1hdGlvbkNhcHR1cmU6IGZ1bmN0aW9uIGRyYWdPdmVyQW5pbWF0aW9uQ2FwdHVyZShfcmVmMTEpIHtcbiAgICAgIHZhciBkcmFnUmVjdCA9IF9yZWYxMS5kcmFnUmVjdCxcbiAgICAgICAgICBpc093bmVyID0gX3JlZjExLmlzT3duZXIsXG4gICAgICAgICAgYWN0aXZlU29ydGFibGUgPSBfcmVmMTEuYWN0aXZlU29ydGFibGU7XG4gICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYWN0aXZlU29ydGFibGUub3B0aW9ucy5hbmltYXRpb24gJiYgIWlzT3duZXIgJiYgYWN0aXZlU29ydGFibGUubXVsdGlEcmFnLmlzTXVsdGlEcmFnKSB7XG4gICAgICAgIGNsb25lc0Zyb21SZWN0ID0gX2V4dGVuZHMoe30sIGRyYWdSZWN0KTtcbiAgICAgICAgdmFyIGRyYWdNYXRyaXggPSBtYXRyaXgoZHJhZ0VsJDEsIHRydWUpO1xuICAgICAgICBjbG9uZXNGcm9tUmVjdC50b3AgLT0gZHJhZ01hdHJpeC5mO1xuICAgICAgICBjbG9uZXNGcm9tUmVjdC5sZWZ0IC09IGRyYWdNYXRyaXguZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQW5pbWF0aW9uQ29tcGxldGU6IGZ1bmN0aW9uIGRyYWdPdmVyQW5pbWF0aW9uQ29tcGxldGUoKSB7XG4gICAgICBpZiAoZm9sZGluZykge1xuICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKF9yZWYxMikge1xuICAgICAgdmFyIGV2dCA9IF9yZWYxMi5vcmlnaW5hbEV2ZW50LFxuICAgICAgICAgIHJvb3RFbCA9IF9yZWYxMi5yb290RWwsXG4gICAgICAgICAgcGFyZW50RWwgPSBfcmVmMTIucGFyZW50RWwsXG4gICAgICAgICAgc29ydGFibGUgPSBfcmVmMTIuc29ydGFibGUsXG4gICAgICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50ID0gX3JlZjEyLmRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICAgICAgICBvbGRJbmRleCA9IF9yZWYxMi5vbGRJbmRleCxcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYxMi5wdXRTb3J0YWJsZTtcbiAgICAgIHZhciB0b1NvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgdGhpcy5zb3J0YWJsZTtcbiAgICAgIGlmICghZXZ0KSByZXR1cm47XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICBjaGlsZHJlbiA9IHBhcmVudEVsLmNoaWxkcmVuOyAvLyBNdWx0aS1kcmFnIHNlbGVjdGlvblxuXG4gICAgICBpZiAoIWRyYWdTdGFydGVkKSB7XG4gICAgICAgIGlmIChvcHRpb25zLm11bHRpRHJhZ0tleSAmJiAhdGhpcy5tdWx0aURyYWdLZXlEb3duKSB7XG4gICAgICAgICAgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCQxLCBvcHRpb25zLnNlbGVjdGVkQ2xhc3MsICF+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSkpO1xuXG4gICAgICAgIGlmICghfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZHJhZ0VsJDEpKSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMucHVzaChkcmFnRWwkMSk7XG4gICAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgICAgICByb290RWw6IHJvb3RFbCxcbiAgICAgICAgICAgIG5hbWU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgdGFyZ2V0RWw6IGRyYWdFbCQxLFxuICAgICAgICAgICAgb3JpZ2luYWxFdnQ6IGV2dFxuICAgICAgICAgIH0pOyAvLyBNb2RpZmllciBhY3RpdmF0ZWQsIHNlbGVjdCBmcm9tIGxhc3QgdG8gZHJhZ0VsXG5cbiAgICAgICAgICBpZiAoZXZ0LnNoaWZ0S2V5ICYmIGxhc3RNdWx0aURyYWdTZWxlY3QgJiYgc29ydGFibGUuZWwuY29udGFpbnMobGFzdE11bHRpRHJhZ1NlbGVjdCkpIHtcbiAgICAgICAgICAgIHZhciBsYXN0SW5kZXggPSBpbmRleChsYXN0TXVsdGlEcmFnU2VsZWN0KSxcbiAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleChkcmFnRWwkMSk7XG5cbiAgICAgICAgICAgIGlmICh+bGFzdEluZGV4ICYmIH5jdXJyZW50SW5kZXggJiYgbGFzdEluZGV4ICE9PSBjdXJyZW50SW5kZXgpIHtcbiAgICAgICAgICAgICAgLy8gTXVzdCBpbmNsdWRlIGxhc3RNdWx0aURyYWdTZWxlY3QgKHNlbGVjdCBpdCksIGluIGNhc2UgbW9kaWZpZWQgc2VsZWN0aW9uIGZyb20gbm8gc2VsZWN0aW9uXG4gICAgICAgICAgICAgIC8vIChidXQgcHJldmlvdXMgc2VsZWN0aW9uIGV4aXN0ZWQpXG4gICAgICAgICAgICAgIHZhciBuLCBpO1xuXG4gICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPiBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpID0gbGFzdEluZGV4O1xuICAgICAgICAgICAgICAgIG4gPSBjdXJyZW50SW5kZXg7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSA9IGN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgICAgICBuID0gbGFzdEluZGV4ICsgMTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGNoaWxkcmVuW2ldKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgdG9nZ2xlQ2xhc3MoY2hpbGRyZW5baV0sIG9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMucHVzaChjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgICAgICAgICAgICByb290RWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgICAgICAgdGFyZ2V0RWw6IGNoaWxkcmVuW2ldLFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdnQ6IGV2dFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhc3RNdWx0aURyYWdTZWxlY3QgPSBkcmFnRWwkMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHRvU29ydGFibGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc3BsaWNlKG11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZHJhZ0VsJDEpLCAxKTtcbiAgICAgICAgICBsYXN0TXVsdGlEcmFnU2VsZWN0ID0gbnVsbDtcbiAgICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICAgICAgbmFtZTogJ2Rlc2VsZWN0JyxcbiAgICAgICAgICAgIHRhcmdldEVsOiBkcmFnRWwkMSxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZ0OiBldnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBNdWx0aS1kcmFnIGRyb3BcblxuXG4gICAgICBpZiAoZHJhZ1N0YXJ0ZWQgJiYgdGhpcy5pc011bHRpRHJhZykge1xuICAgICAgICBmb2xkaW5nID0gZmFsc2U7IC8vIERvIG5vdCBcInVuZm9sZFwiIGFmdGVyIGFyb3VuZCBkcmFnRWwgaWYgcmV2ZXJ0ZWRcblxuICAgICAgICBpZiAoKHBhcmVudEVsW2V4cGFuZG9dLm9wdGlvbnMuc29ydCB8fCBwYXJlbnRFbCAhPT0gcm9vdEVsKSAmJiBtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdmFyIGRyYWdSZWN0ID0gZ2V0UmVjdChkcmFnRWwkMSksXG4gICAgICAgICAgICAgIG11bHRpRHJhZ0luZGV4ID0gaW5kZXgoZHJhZ0VsJDEsICc6bm90KC4nICsgdGhpcy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MgKyAnKScpO1xuICAgICAgICAgIGlmICghaW5pdGlhbEZvbGRpbmcgJiYgb3B0aW9ucy5hbmltYXRpb24pIGRyYWdFbCQxLnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgdG9Tb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcblxuICAgICAgICAgIGlmICghaW5pdGlhbEZvbGRpbmcpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICAgICAgICBkcmFnRWwkMS5mcm9tUmVjdCA9IGRyYWdSZWN0O1xuICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudC50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgIT09IGRyYWdFbCQxKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgcmVjdCA9IGZvbGRpbmcgPyBnZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpIDogZHJhZ1JlY3Q7XG4gICAgICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LmZyb21SZWN0ID0gcmVjdDsgLy8gUHJlcGFyZSB1bmZvbGQgYW5pbWF0aW9uXG5cbiAgICAgICAgICAgICAgICAgIHRvU29ydGFibGUuYWRkQW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG11bHRpRHJhZ0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Q6IHJlY3RcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IC8vIE11bHRpIGRyYWcgZWxlbWVudHMgYXJlIG5vdCBuZWNlc3NhcmlseSByZW1vdmVkIGZyb20gdGhlIERPTSBvbiBkcm9wLCBzbyB0byByZWluc2VydFxuICAgICAgICAgICAgLy8gcHJvcGVybHkgdGhleSBtdXN0IGFsbCBiZSByZW1vdmVkXG5cblxuICAgICAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuW211bHRpRHJhZ0luZGV4XSkge1xuICAgICAgICAgICAgICAgIHBhcmVudEVsLmluc2VydEJlZm9yZShtdWx0aURyYWdFbGVtZW50LCBjaGlsZHJlblttdWx0aURyYWdJbmRleF0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmVudEVsLmFwcGVuZENoaWxkKG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbXVsdGlEcmFnSW5kZXgrKztcbiAgICAgICAgICAgIH0pOyAvLyBJZiBpbml0aWFsIGZvbGRpbmcgaXMgZG9uZSwgdGhlIGVsZW1lbnRzIG1heSBoYXZlIGNoYW5nZWQgcG9zaXRpb24gYmVjYXVzZSB0aGV5IGFyZSBub3dcbiAgICAgICAgICAgIC8vIHVuZm9sZGluZyBhcm91bmQgZHJhZ0VsLCBldmVuIHRob3VnaCBkcmFnRWwgbWF5IG5vdCBoYXZlIGhpcyBpbmRleCBjaGFuZ2VkLCBzbyB1cGRhdGUgZXZlbnRcbiAgICAgICAgICAgIC8vIG11c3QgYmUgZmlyZWQgaGVyZSBhcyBTb3J0YWJsZSB3aWxsIG5vdC5cblxuICAgICAgICAgICAgaWYgKG9sZEluZGV4ID09PSBpbmRleChkcmFnRWwkMSkpIHtcbiAgICAgICAgICAgICAgdmFyIHVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQuc29ydGFibGVJbmRleCAhPT0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgIHVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50KCd1cGRhdGUnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gTXVzdCBiZSBkb25lIGFmdGVyIGNhcHR1cmluZyBpbmRpdmlkdWFsIHJlY3RzIChzY3JvbGwgYmFyKVxuXG5cbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICB1bnNldFJlY3QobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdG9Tb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHRvU29ydGFibGU7XG4gICAgICB9IC8vIFJlbW92ZSBjbG9uZXMgaWYgbmVjZXNzYXJ5XG5cblxuICAgICAgaWYgKHJvb3RFbCA9PT0gcGFyZW50RWwgfHwgcHV0U29ydGFibGUgJiYgcHV0U29ydGFibGUubGFzdFB1dE1vZGUgIT09ICdjbG9uZScpIHtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgY2xvbmUucGFyZW50Tm9kZSAmJiBjbG9uZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBudWxsaW5nR2xvYmFsOiBmdW5jdGlvbiBudWxsaW5nR2xvYmFsKCkge1xuICAgICAgdGhpcy5pc011bHRpRHJhZyA9IGRyYWdTdGFydGVkID0gZmFsc2U7XG4gICAgICBtdWx0aURyYWdDbG9uZXMubGVuZ3RoID0gMDtcbiAgICB9LFxuICAgIGRlc3Ryb3lHbG9iYWw6IGZ1bmN0aW9uIGRlc3Ryb3lHbG9iYWwoKSB7XG4gICAgICB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZygpO1xuXG4gICAgICBvZmYoZG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICBvZmYoZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICBvZmYoZG9jdW1lbnQsICdrZXlkb3duJywgdGhpcy5fY2hlY2tLZXlEb3duKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ2tleXVwJywgdGhpcy5fY2hlY2tLZXlVcCk7XG4gICAgfSxcbiAgICBfZGVzZWxlY3RNdWx0aURyYWc6IGZ1bmN0aW9uIF9kZXNlbGVjdE11bHRpRHJhZyhldnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZHJhZ1N0YXJ0ZWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZHJhZ1N0YXJ0ZWQpIHJldHVybjsgLy8gT25seSBkZXNlbGVjdCBpZiBzZWxlY3Rpb24gaXMgaW4gdGhpcyBzb3J0YWJsZVxuXG4gICAgICBpZiAobXVsdGlEcmFnU29ydGFibGUgIT09IHRoaXMuc29ydGFibGUpIHJldHVybjsgLy8gT25seSBkZXNlbGVjdCBpZiB0YXJnZXQgaXMgbm90IGl0ZW0gaW4gdGhpcyBzb3J0YWJsZVxuXG4gICAgICBpZiAoZXZ0ICYmIGNsb3Nlc3QoZXZ0LnRhcmdldCwgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSwgdGhpcy5zb3J0YWJsZS5lbCwgZmFsc2UpKSByZXR1cm47IC8vIE9ubHkgZGVzZWxlY3QgaWYgbGVmdCBjbGlja1xuXG4gICAgICBpZiAoZXZ0ICYmIGV2dC5idXR0b24gIT09IDApIHJldHVybjtcblxuICAgICAgd2hpbGUgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICB2YXIgZWwgPSBtdWx0aURyYWdFbGVtZW50c1swXTtcbiAgICAgICAgdG9nZ2xlQ2xhc3MoZWwsIHRoaXMub3B0aW9ucy5zZWxlY3RlZENsYXNzLCBmYWxzZSk7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnNoaWZ0KCk7XG4gICAgICAgIGRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLnNvcnRhYmxlLFxuICAgICAgICAgIHJvb3RFbDogdGhpcy5zb3J0YWJsZS5lbCxcbiAgICAgICAgICBuYW1lOiAnZGVzZWxlY3QnLFxuICAgICAgICAgIHRhcmdldEVsOiBlbCxcbiAgICAgICAgICBvcmlnaW5hbEV2dDogZXZ0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgX2NoZWNrS2V5RG93bjogZnVuY3Rpb24gX2NoZWNrS2V5RG93bihldnQpIHtcbiAgICAgIGlmIChldnQua2V5ID09PSB0aGlzLm9wdGlvbnMubXVsdGlEcmFnS2V5KSB7XG4gICAgICAgIHRoaXMubXVsdGlEcmFnS2V5RG93biA9IHRydWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBfY2hlY2tLZXlVcDogZnVuY3Rpb24gX2NoZWNrS2V5VXAoZXZ0KSB7XG4gICAgICBpZiAoZXZ0LmtleSA9PT0gdGhpcy5vcHRpb25zLm11bHRpRHJhZ0tleSkge1xuICAgICAgICB0aGlzLm11bHRpRHJhZ0tleURvd24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcyhNdWx0aURyYWcsIHtcbiAgICAvLyBTdGF0aWMgbWV0aG9kcyAmIHByb3BlcnRpZXNcbiAgICBwbHVnaW5OYW1lOiAnbXVsdGlEcmFnJyxcbiAgICB1dGlsczoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3RzIHRoZSBwcm92aWRlZCBtdWx0aS1kcmFnIGl0ZW1cbiAgICAgICAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAgICBUaGUgZWxlbWVudCB0byBiZSBzZWxlY3RlZFxuICAgICAgICovXG4gICAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChlbCkge1xuICAgICAgICB2YXIgc29ydGFibGUgPSBlbC5wYXJlbnROb2RlW2V4cGFuZG9dO1xuICAgICAgICBpZiAoIXNvcnRhYmxlIHx8ICFzb3J0YWJsZS5vcHRpb25zLm11bHRpRHJhZyB8fCB+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihlbCkpIHJldHVybjtcblxuICAgICAgICBpZiAobXVsdGlEcmFnU29ydGFibGUgJiYgbXVsdGlEcmFnU29ydGFibGUgIT09IHNvcnRhYmxlKSB7XG4gICAgICAgICAgbXVsdGlEcmFnU29ydGFibGUubXVsdGlEcmFnLl9kZXNlbGVjdE11bHRpRHJhZygpO1xuXG4gICAgICAgICAgbXVsdGlEcmFnU29ydGFibGUgPSBzb3J0YWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRvZ2dsZUNsYXNzKGVsLCBzb3J0YWJsZS5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIHRydWUpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5wdXNoKGVsKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGVzZWxlY3RzIHRoZSBwcm92aWRlZCBtdWx0aS1kcmFnIGl0ZW1cbiAgICAgICAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAgICBUaGUgZWxlbWVudCB0byBiZSBkZXNlbGVjdGVkXG4gICAgICAgKi9cbiAgICAgIGRlc2VsZWN0OiBmdW5jdGlvbiBkZXNlbGVjdChlbCkge1xuICAgICAgICB2YXIgc29ydGFibGUgPSBlbC5wYXJlbnROb2RlW2V4cGFuZG9dLFxuICAgICAgICAgICAgaW5kZXggPSBtdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGVsKTtcbiAgICAgICAgaWYgKCFzb3J0YWJsZSB8fCAhc29ydGFibGUub3B0aW9ucy5tdWx0aURyYWcgfHwgIX5pbmRleCkgcmV0dXJuO1xuICAgICAgICB0b2dnbGVDbGFzcyhlbCwgc29ydGFibGUub3B0aW9ucy5zZWxlY3RlZENsYXNzLCBmYWxzZSk7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBldmVudFByb3BlcnRpZXM6IGZ1bmN0aW9uIGV2ZW50UHJvcGVydGllcygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgb2xkSW5kaWNpZXMgPSBbXSxcbiAgICAgICAgICBuZXdJbmRpY2llcyA9IFtdO1xuICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICBvbGRJbmRpY2llcy5wdXNoKHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50OiBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgIGluZGV4OiBtdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXhcbiAgICAgICAgfSk7IC8vIG11bHRpRHJhZ0VsZW1lbnRzIHdpbGwgYWxyZWFkeSBiZSBzb3J0ZWQgaWYgZm9sZGluZ1xuXG4gICAgICAgIHZhciBuZXdJbmRleDtcblxuICAgICAgICBpZiAoZm9sZGluZyAmJiBtdWx0aURyYWdFbGVtZW50ICE9PSBkcmFnRWwkMSkge1xuICAgICAgICAgIG5ld0luZGV4ID0gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9sZGluZykge1xuICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCwgJzpub3QoLicgKyBfdGhpczMub3B0aW9ucy5zZWxlY3RlZENsYXNzICsgJyknKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdJbmRleCA9IGluZGV4KG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3SW5kaWNpZXMucHVzaCh7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICBpbmRleDogbmV3SW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGl0ZW1zOiBfdG9Db25zdW1hYmxlQXJyYXkobXVsdGlEcmFnRWxlbWVudHMpLFxuICAgICAgICBjbG9uZXM6IFtdLmNvbmNhdChtdWx0aURyYWdDbG9uZXMpLFxuICAgICAgICBvbGRJbmRpY2llczogb2xkSW5kaWNpZXMsXG4gICAgICAgIG5ld0luZGljaWVzOiBuZXdJbmRpY2llc1xuICAgICAgfTtcbiAgICB9LFxuICAgIG9wdGlvbkxpc3RlbmVyczoge1xuICAgICAgbXVsdGlEcmFnS2V5OiBmdW5jdGlvbiBtdWx0aURyYWdLZXkoa2V5KSB7XG4gICAgICAgIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdjdHJsJykge1xuICAgICAgICAgIGtleSA9ICdDb250cm9sJztcbiAgICAgICAgfSBlbHNlIGlmIChrZXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGtleSA9IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHIoMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluc2VydE11bHRpRHJhZ0VsZW1lbnRzKGNsb25lc0luc2VydGVkLCByb290RWwpIHtcbiAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCwgaSkge1xuICAgIHZhciB0YXJnZXQgPSByb290RWwuY2hpbGRyZW5bbXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4ICsgKGNsb25lc0luc2VydGVkID8gTnVtYmVyKGkpIDogMCldO1xuXG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShtdWx0aURyYWdFbGVtZW50LCB0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByb290RWwuYXBwZW5kQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogSW5zZXJ0IG11bHRpLWRyYWcgY2xvbmVzXG4gKiBAcGFyYW0gIHtbQm9vbGVhbl19IGVsZW1lbnRzSW5zZXJ0ZWQgIFdoZXRoZXIgdGhlIG11bHRpLWRyYWcgZWxlbWVudHMgYXJlIGluc2VydGVkXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gcm9vdEVsXG4gKi9cblxuXG5mdW5jdGlvbiBpbnNlcnRNdWx0aURyYWdDbG9uZXMoZWxlbWVudHNJbnNlcnRlZCwgcm9vdEVsKSB7XG4gIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSwgaSkge1xuICAgIHZhciB0YXJnZXQgPSByb290RWwuY2hpbGRyZW5bY2xvbmUuc29ydGFibGVJbmRleCArIChlbGVtZW50c0luc2VydGVkID8gTnVtYmVyKGkpIDogMCldO1xuXG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShjbG9uZSwgdGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpIHtcbiAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgIG11bHRpRHJhZ0VsZW1lbnQucGFyZW50Tm9kZSAmJiBtdWx0aURyYWdFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gIH0pO1xufVxuXG5Tb3J0YWJsZS5tb3VudChuZXcgQXV0b1Njcm9sbFBsdWdpbigpKTtcblNvcnRhYmxlLm1vdW50KFJlbW92ZSwgUmV2ZXJ0KTtcblxuZXhwb3J0IGRlZmF1bHQgU29ydGFibGU7XG5leHBvcnQgeyBNdWx0aURyYWdQbHVnaW4gYXMgTXVsdGlEcmFnLCBTb3J0YWJsZSwgU3dhcFBsdWdpbiBhcyBTd2FwIH07XG4iLCJ2YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZGVmUHJvcHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcztcbnZhciBfX2dldE93blByb3BEZXNjcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzO1xudmFyIF9fZ2V0T3duUHJvcFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19wcm9wSXNFbnVtID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX3NwcmVhZFZhbHVlcyA9IChhLCBiKSA9PiB7XG4gIGZvciAodmFyIHByb3AgaW4gYiB8fCAoYiA9IHt9KSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoYiwgcHJvcCkpXG4gICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gIGlmIChfX2dldE93blByb3BTeW1ib2xzKVxuICAgIGZvciAodmFyIHByb3Agb2YgX19nZXRPd25Qcm9wU3ltYm9scyhiKSkge1xuICAgICAgaWYgKF9fcHJvcElzRW51bS5jYWxsKGIsIHByb3ApKVxuICAgICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gICAgfVxuICByZXR1cm4gYTtcbn07XG52YXIgX19zcHJlYWRQcm9wcyA9IChhLCBiKSA9PiBfX2RlZlByb3BzKGEsIF9fZ2V0T3duUHJvcERlc2NzKGIpKTtcbmltcG9ydCBTb3J0YWJsZSBmcm9tIFwic29ydGFibGVqc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUNvbXBvbmVudCwgVHJhbnNpdGlvbkdyb3VwLCBkZWZpbmVDb21wb25lbnQsIGgsIG5leHRUaWNrIH0gZnJvbSBcInZ1ZVwiO1xuZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlKSB7XG4gIGlmIChub2RlLnBhcmVudEVsZW1lbnQgIT09IG51bGwpIHtcbiAgICBub2RlLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc2VydE5vZGVBdChmYXRoZXJOb2RlLCBub2RlLCBwb3NpdGlvbikge1xuICBjb25zdCByZWZOb2RlID0gcG9zaXRpb24gPT09IDAgPyBmYXRoZXJOb2RlLmNoaWxkcmVuWzBdIDogZmF0aGVyTm9kZS5jaGlsZHJlbltwb3NpdGlvbiAtIDFdLm5leHRTaWJsaW5nO1xuICBmYXRoZXJOb2RlLmluc2VydEJlZm9yZShub2RlLCByZWZOb2RlKTtcbn1cbmZ1bmN0aW9uIGdldENvbnNvbGUoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5jb25zb2xlO1xuICB9XG4gIHJldHVybiBnbG9iYWwuY29uc29sZTtcbn1cbmNvbnN0IGNvbnNvbGUkMSA9IGdldENvbnNvbGUoKTtcbmZ1bmN0aW9uIGNhY2hlZChmbikge1xuICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gZnVuY3Rpb24gY2FjaGVkRm4oc3RyKSB7XG4gICAgY29uc3QgaGl0ID0gY2FjaGVbc3RyXTtcbiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSk7XG4gIH07XG59XG5jb25zdCByZWdleCA9IC8tKFxcdykvZztcbmNvbnN0IGNhbWVsaXplID0gY2FjaGVkKChzdHIpID0+IHN0ci5yZXBsYWNlKHJlZ2V4LCAoXywgYykgPT4gYy50b1VwcGVyQ2FzZSgpKSk7XG5jb25zdCBtYW5hZ2VBbmRFbWl0JDEgPSBbXCJTdGFydFwiLCBcIkFkZFwiLCBcIlJlbW92ZVwiLCBcIlVwZGF0ZVwiLCBcIkVuZFwiXTtcbmNvbnN0IGVtaXQkMSA9IFtcIkNob29zZVwiLCBcIlVuY2hvb3NlXCIsIFwiU29ydFwiLCBcIkZpbHRlclwiLCBcIkNsb25lXCJdO1xuY29uc3QgbWFuYWdlJDEgPSBbXCJNb3ZlXCJdO1xuY29uc3QgZXZlbnRIYW5kbGVyTmFtZXMgPSBbbWFuYWdlJDEsIG1hbmFnZUFuZEVtaXQkMSwgZW1pdCQxXS5mbGF0TWFwKChldmVudHMyKSA9PiBldmVudHMyKS5tYXAoKGV2dCkgPT4gYG9uJHtldnR9YCk7XG5jb25zdCBldmVudHMgPSB7XG4gIG1hbmFnZTogbWFuYWdlJDEsXG4gIG1hbmFnZUFuZEVtaXQ6IG1hbmFnZUFuZEVtaXQkMSxcbiAgZW1pdDogZW1pdCQxXG59O1xuZnVuY3Rpb24gaXNSZWFkT25seShldmVudE5hbWUpIHtcbiAgcmV0dXJuIGV2ZW50SGFuZGxlck5hbWVzLmluZGV4T2YoZXZlbnROYW1lKSAhPT0gLTE7XG59XG5jb25zdCB0YWdzID0gW1xuICBcImFcIixcbiAgXCJhYmJyXCIsXG4gIFwiYWRkcmVzc1wiLFxuICBcImFyZWFcIixcbiAgXCJhcnRpY2xlXCIsXG4gIFwiYXNpZGVcIixcbiAgXCJhdWRpb1wiLFxuICBcImJcIixcbiAgXCJiYXNlXCIsXG4gIFwiYmRpXCIsXG4gIFwiYmRvXCIsXG4gIFwiYmxvY2txdW90ZVwiLFxuICBcImJvZHlcIixcbiAgXCJiclwiLFxuICBcImJ1dHRvblwiLFxuICBcImNhbnZhc1wiLFxuICBcImNhcHRpb25cIixcbiAgXCJjaXRlXCIsXG4gIFwiY29kZVwiLFxuICBcImNvbFwiLFxuICBcImNvbGdyb3VwXCIsXG4gIFwiZGF0YVwiLFxuICBcImRhdGFsaXN0XCIsXG4gIFwiZGRcIixcbiAgXCJkZWxcIixcbiAgXCJkZXRhaWxzXCIsXG4gIFwiZGZuXCIsXG4gIFwiZGlhbG9nXCIsXG4gIFwiZGl2XCIsXG4gIFwiZGxcIixcbiAgXCJkdFwiLFxuICBcImVtXCIsXG4gIFwiZW1iZWRcIixcbiAgXCJmaWVsZHNldFwiLFxuICBcImZpZ2NhcHRpb25cIixcbiAgXCJmaWd1cmVcIixcbiAgXCJmb290ZXJcIixcbiAgXCJmb3JtXCIsXG4gIFwiaDFcIixcbiAgXCJoMlwiLFxuICBcImgzXCIsXG4gIFwiaDRcIixcbiAgXCJoNVwiLFxuICBcImg2XCIsXG4gIFwiaGVhZFwiLFxuICBcImhlYWRlclwiLFxuICBcImhncm91cFwiLFxuICBcImhyXCIsXG4gIFwiaHRtbFwiLFxuICBcImlcIixcbiAgXCJpZnJhbWVcIixcbiAgXCJpbWdcIixcbiAgXCJpbnB1dFwiLFxuICBcImluc1wiLFxuICBcImtiZFwiLFxuICBcImxhYmVsXCIsXG4gIFwibGVnZW5kXCIsXG4gIFwibGlcIixcbiAgXCJsaW5rXCIsXG4gIFwibWFpblwiLFxuICBcIm1hcFwiLFxuICBcIm1hcmtcIixcbiAgXCJtYXRoXCIsXG4gIFwibWVudVwiLFxuICBcIm1lbnVpdGVtXCIsXG4gIFwibWV0YVwiLFxuICBcIm1ldGVyXCIsXG4gIFwibmF2XCIsXG4gIFwibm9zY3JpcHRcIixcbiAgXCJvYmplY3RcIixcbiAgXCJvbFwiLFxuICBcIm9wdGdyb3VwXCIsXG4gIFwib3B0aW9uXCIsXG4gIFwib3V0cHV0XCIsXG4gIFwicFwiLFxuICBcInBhcmFtXCIsXG4gIFwicGljdHVyZVwiLFxuICBcInByZVwiLFxuICBcInByb2dyZXNzXCIsXG4gIFwicVwiLFxuICBcInJiXCIsXG4gIFwicnBcIixcbiAgXCJydFwiLFxuICBcInJ0Y1wiLFxuICBcInJ1YnlcIixcbiAgXCJzXCIsXG4gIFwic2FtcFwiLFxuICBcInNjcmlwdFwiLFxuICBcInNlY3Rpb25cIixcbiAgXCJzZWxlY3RcIixcbiAgXCJzbG90XCIsXG4gIFwic21hbGxcIixcbiAgXCJzb3VyY2VcIixcbiAgXCJzcGFuXCIsXG4gIFwic3Ryb25nXCIsXG4gIFwic3R5bGVcIixcbiAgXCJzdWJcIixcbiAgXCJzdW1tYXJ5XCIsXG4gIFwic3VwXCIsXG4gIFwic3ZnXCIsXG4gIFwidGFibGVcIixcbiAgXCJ0Ym9keVwiLFxuICBcInRkXCIsXG4gIFwidGVtcGxhdGVcIixcbiAgXCJ0ZXh0YXJlYVwiLFxuICBcInRmb290XCIsXG4gIFwidGhcIixcbiAgXCJ0aGVhZFwiLFxuICBcInRpbWVcIixcbiAgXCJ0aXRsZVwiLFxuICBcInRyXCIsXG4gIFwidHJhY2tcIixcbiAgXCJ1XCIsXG4gIFwidWxcIixcbiAgXCJ2YXJcIixcbiAgXCJ2aWRlb1wiLFxuICBcIndiclwiXG5dO1xuZnVuY3Rpb24gaXNIdG1sVGFnKG5hbWUpIHtcbiAgcmV0dXJuIHRhZ3MuaW5jbHVkZXMobmFtZSk7XG59XG5mdW5jdGlvbiBpc1RyYW5zaXRpb24obmFtZSkge1xuICByZXR1cm4gW1widHJhbnNpdGlvbi1ncm91cFwiLCBcIlRyYW5zaXRpb25Hcm91cFwiXS5pbmNsdWRlcyhuYW1lKTtcbn1cbmZ1bmN0aW9uIGlzSHRtbEF0dHJpYnV0ZSh2YWx1ZSkge1xuICByZXR1cm4gW1wiaWRcIiwgXCJjbGFzc1wiLCBcInJvbGVcIiwgXCJzdHlsZVwiXS5pbmNsdWRlcyh2YWx1ZSkgfHwgdmFsdWUuc3RhcnRzV2l0aChcImRhdGEtXCIpIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCJhcmlhLVwiKSB8fCB2YWx1ZS5zdGFydHNXaXRoKFwib25cIik7XG59XG5mdW5jdGlvbiBwcm9qZWN0KGVudHJpZXMpIHtcbiAgcmV0dXJuIGVudHJpZXMucmVkdWNlKChyZXMsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIHJlcztcbiAgfSwge30pO1xufVxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50QXR0cmlidXRlcyh7ICRhdHRycywgY29tcG9uZW50RGF0YSA9IHt9IH0pIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IHByb2plY3QoT2JqZWN0LmVudHJpZXMoJGF0dHJzKS5maWx0ZXIoKFtrZXksIF9dKSA9PiBpc0h0bWxBdHRyaWJ1dGUoa2V5KSkpO1xuICByZXR1cm4gX19zcHJlYWRWYWx1ZXMoX19zcHJlYWRWYWx1ZXMoe30sIGF0dHJpYnV0ZXMpLCBjb21wb25lbnREYXRhKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNvcnRhYmxlT3B0aW9uKHsgJGF0dHJzLCBjYWxsQmFja0J1aWxkZXIgfSkge1xuICBjb25zdCBvcHRpb25zID0gcHJvamVjdChnZXRWYWxpZFNvcnRhYmxlRW50cmllcygkYXR0cnMpKTtcbiAgT2JqZWN0LmVudHJpZXMoY2FsbEJhY2tCdWlsZGVyKS5mb3JFYWNoKChbZXZlbnRUeXBlLCBldmVudEJ1aWxkZXJdKSA9PiB7XG4gICAgZXZlbnRzW2V2ZW50VHlwZV0uZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgIG9wdGlvbnNbYG9uJHtldmVudH1gXSA9IGV2ZW50QnVpbGRlcihldmVudCk7XG4gICAgfSk7XG4gIH0pO1xuICBjb25zdCBkcmFnZ2FibGUgPSBgW2RhdGEtZHJhZ2dhYmxlXSR7b3B0aW9ucy5kcmFnZ2FibGUgfHwgXCJcIn1gO1xuICByZXR1cm4gX19zcHJlYWRQcm9wcyhfX3NwcmVhZFZhbHVlcyh7fSwgb3B0aW9ucyksIHtcbiAgICBkcmFnZ2FibGVcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRWYWxpZFNvcnRhYmxlRW50cmllcyh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXModmFsdWUpLmZpbHRlcigoW2tleSwgX10pID0+ICFpc0h0bWxBdHRyaWJ1dGUoa2V5KSkubWFwKChba2V5LCB2YWx1ZTJdKSA9PiBbY2FtZWxpemUoa2V5KSwgdmFsdWUyXSkuZmlsdGVyKChba2V5LCBfXSkgPT4gIWlzUmVhZE9ubHkoa2V5KSk7XG59XG5jb25zdCBnZXRIdG1sRWxlbWVudEZyb21Ob2RlID0gKG5vZGUpID0+IHtcbiAgY29uc3QgZWwgPSBub2RlLmVsIHx8IEFycmF5LmlzQXJyYXkobm9kZS5jaGlsZHJlbikgJiYgbm9kZS5jaGlsZHJlblswXS5lbC5wYXJlbnROb2RlO1xuICBpZiAoIWVsKSB7XG4gICAgY29uc29sZS5lcnJvcihcIlxcdTRGN0ZcXHU3NTI4IHRyYW5zaXRpb24tZ3JvdXAgLCBcXHU5NzAwXFx1ODk4MVxcdTU3MjhzbG90XFx1NEUyRHRlbXBsYXRlXFx1NTE4NVxcdTgxRjNcXHU1QzExMlxcdTVDNDJodG1sXFx1NjgwN1xcdTdCN0VcIik7XG4gIH1cbiAgcmV0dXJuIGVsIHx8IHt9O1xufTtcbmNvbnN0IGFkZENvbnRleHQgPSAoZG9tRWxlbWVudCwgY29udGV4dCkgPT4gZG9tRWxlbWVudC5fX2RyYWdnYWJsZV9jb250ZXh0ID0gY29udGV4dDtcbmNvbnN0IGdldENvbnRleHQgPSAoZG9tRWxlbWVudCkgPT4gZG9tRWxlbWVudC5fX2RyYWdnYWJsZV9jb250ZXh0O1xuY2xhc3MgQ29tcG9uZW50U3RydWN0dXJlIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG5vZGVzOiB7IGhlYWRlciwgZGVmYXVsdDogZGVmYXVsdE5vZGVzLCBmb290ZXIgfSxcbiAgICByb290LFxuICAgIHJlYWxMaXN0XG4gIH0pIHtcbiAgICB0aGlzLmRlZmF1bHROb2RlcyA9IGRlZmF1bHROb2RlcztcbiAgICB0aGlzLmNoaWxkcmVuID0gWy4uLmhlYWRlciwgLi4uZGVmYXVsdE5vZGVzLCAuLi5mb290ZXJdO1xuICAgIHRoaXMuZXh0ZXJuYWxDb21wb25lbnQgPSByb290LmV4dGVybmFsQ29tcG9uZW50O1xuICAgIHRoaXMucm9vdFRyYW5zaXRpb24gPSByb290LnRyYW5zaXRpb247XG4gICAgdGhpcy50YWcgPSByb290LnRhZztcbiAgICB0aGlzLnJlYWxMaXN0ID0gcmVhbExpc3Q7XG4gIH1cbiAgZ2V0IF9pc1Jvb3RDb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZXJuYWxDb21wb25lbnQgfHwgdGhpcy5yb290VHJhbnNpdGlvbjtcbiAgfVxuICByZW5kZXIoaDIsIGF0dHJpYnV0ZXMpIHtcbiAgICBjb25zdCB7IHRhZywgY2hpbGRyZW4sIF9pc1Jvb3RDb21wb25lbnQgfSA9IHRoaXM7XG4gICAgY29uc3Qgb3B0aW9uID0gIV9pc1Jvb3RDb21wb25lbnQgPyBjaGlsZHJlbiA6IHsgZGVmYXVsdDogKCkgPT4gY2hpbGRyZW4gfTtcbiAgICByZXR1cm4gaDIodGFnLCBhdHRyaWJ1dGVzLCBvcHRpb24pO1xuICB9XG4gIHVwZGF0ZWQoKSB7XG4gICAgY29uc3QgeyBkZWZhdWx0Tm9kZXMsIHJlYWxMaXN0IH0gPSB0aGlzO1xuICAgIGRlZmF1bHROb2Rlcy5mb3JFYWNoKChub2RlLCBpbmRleCkgPT4ge1xuICAgICAgYWRkQ29udGV4dChnZXRIdG1sRWxlbWVudEZyb21Ob2RlKG5vZGUpLCB7XG4gICAgICAgIGVsZW1lbnQ6IHJlYWxMaXN0W2luZGV4XSxcbiAgICAgICAgaW5kZXhcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGdldFVuZGVybHlpbmdWbShkb21FbGVtZW50KSB7XG4gICAgcmV0dXJuIGdldENvbnRleHQoZG9tRWxlbWVudCk7XG4gIH1cbiAgZ2V0Vm1JbmRleEZyb21Eb21JbmRleChkb21JbmRleCwgZWxlbWVudCkge1xuICAgIGNvbnN0IHsgZGVmYXVsdE5vZGVzIH0gPSB0aGlzO1xuICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBkZWZhdWx0Tm9kZXM7XG4gICAgY29uc3QgZG9tQ2hpbGRyZW4gPSBlbGVtZW50LmNoaWxkcmVuO1xuICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBkb21DaGlsZHJlbi5pdGVtKGRvbUluZGV4KTtcbiAgICBpZiAoZG9tRWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQoZG9tRWxlbWVudCk7XG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiBjb250ZXh0LmluZGV4O1xuICAgIH1cbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgZmlyc3REb21MaXN0RWxlbWVudCA9IGdldEh0bWxFbGVtZW50RnJvbU5vZGUoZGVmYXVsdE5vZGVzWzBdKTtcbiAgICBjb25zdCBpbmRleEZpcnN0RG9tTGlzdEVsZW1lbnQgPSBbLi4uZG9tQ2hpbGRyZW5dLmZpbmRJbmRleCgoZWxlbWVudDIpID0+IGVsZW1lbnQyID09PSBmaXJzdERvbUxpc3RFbGVtZW50KTtcbiAgICByZXR1cm4gZG9tSW5kZXggPCBpbmRleEZpcnN0RG9tTGlzdEVsZW1lbnQgPyAwIDogbGVuZ3RoO1xuICB9XG59XG5mdW5jdGlvbiBnZXRTbG90KHNsb3RzLCBrZXkpIHtcbiAgY29uc3Qgc2xvdFZhbHVlID0gc2xvdHNba2V5XTtcbiAgcmV0dXJuIHNsb3RWYWx1ZSA/IHNsb3RWYWx1ZSgpIDogW107XG59XG5mdW5jdGlvbiBjb21wdXRlTm9kZXMoeyAkc2xvdHMsIHJlYWxMaXN0LCBnZXRLZXkgfSkge1xuICBjb25zdCBub3JtYWxpemVkTGlzdCA9IHJlYWxMaXN0IHx8IFtdO1xuICBjb25zdCBbaGVhZGVyLCBmb290ZXJdID0gW1wiaGVhZGVyXCIsIFwiZm9vdGVyXCJdLm1hcCgobmFtZSkgPT4gZ2V0U2xvdCgkc2xvdHMsIG5hbWUpKTtcbiAgY29uc3QgeyBpdGVtIH0gPSAkc2xvdHM7XG4gIGlmICghaXRlbSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImRyYWdnYWJsZSBlbGVtZW50IG11c3QgaGF2ZSBhbiBpdGVtIHNsb3RcIik7XG4gIH1cbiAgY29uc3QgZGVmYXVsdE5vZGVzID0gbm9ybWFsaXplZExpc3QuZmxhdE1hcCgoZWxlbWVudCwgaW5kZXgpID0+IGl0ZW0oeyBlbGVtZW50LCBpbmRleCB9KS5tYXAoKG5vZGUpID0+IHtcbiAgICBub2RlLmtleSA9IGdldEtleShlbGVtZW50KTtcbiAgICBub2RlLnByb3BzID0gX19zcHJlYWRQcm9wcyhfX3NwcmVhZFZhbHVlcyh7fSwgbm9kZS5wcm9wcyB8fCB7fSksIHsgXCJkYXRhLWRyYWdnYWJsZVwiOiB0cnVlIH0pO1xuICAgIHJldHVybiBub2RlO1xuICB9KSk7XG4gIGlmIChkZWZhdWx0Tm9kZXMubGVuZ3RoICE9PSBub3JtYWxpemVkTGlzdC5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJdGVtIHNsb3QgbXVzdCBoYXZlIG9ubHkgb25lIGNoaWxkXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgaGVhZGVyLFxuICAgIGZvb3RlcixcbiAgICBkZWZhdWx0OiBkZWZhdWx0Tm9kZXNcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFJvb3RJbmZvcm1hdGlvbih0YWcpIHtcbiAgY29uc3QgdHJhbnNpdGlvbiA9IGlzVHJhbnNpdGlvbih0YWcpO1xuICBjb25zdCBleHRlcm5hbENvbXBvbmVudCA9ICFpc0h0bWxUYWcodGFnKSAmJiAhdHJhbnNpdGlvbjtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2l0aW9uLFxuICAgIGV4dGVybmFsQ29tcG9uZW50LFxuICAgIHRhZzogZXh0ZXJuYWxDb21wb25lbnQgPyByZXNvbHZlQ29tcG9uZW50KHRhZykgOiB0cmFuc2l0aW9uID8gVHJhbnNpdGlvbkdyb3VwIDogdGFnXG4gIH07XG59XG5mdW5jdGlvbiBjb21wdXRlQ29tcG9uZW50U3RydWN0dXJlKHsgJHNsb3RzLCB0YWcsIHJlYWxMaXN0LCBnZXRLZXkgfSkge1xuICBjb25zdCBub2RlcyA9IGNvbXB1dGVOb2Rlcyh7ICRzbG90cywgcmVhbExpc3QsIGdldEtleSB9KTtcbiAgY29uc3Qgcm9vdCA9IGdldFJvb3RJbmZvcm1hdGlvbih0YWcpO1xuICByZXR1cm4gbmV3IENvbXBvbmVudFN0cnVjdHVyZSh7IG5vZGVzLCByb290LCByZWFsTGlzdCB9KTtcbn1cbmZ1bmN0aW9uIGVtaXQoZXZ0TmFtZSwgZXZ0RGF0YSkge1xuICBuZXh0VGljaygoKSA9PiB0aGlzLiRlbWl0KGV2dE5hbWUudG9Mb3dlckNhc2UoKSwgZXZ0RGF0YSkpO1xufVxuZnVuY3Rpb24gbWFuYWdlKGV2dE5hbWUpIHtcbiAgcmV0dXJuIChldnREYXRhLCBvcmlnaW5hbEVsZW1lbnQpID0+IHtcbiAgICBpZiAodGhpcy5yZWFsTGlzdCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXNbYG9uRHJhZyR7ZXZ0TmFtZX1gXShldnREYXRhLCBvcmlnaW5hbEVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIG1hbmFnZUFuZEVtaXQoZXZ0TmFtZSkge1xuICBjb25zdCBkZWxlZ2F0ZUNhbGxCYWNrID0gbWFuYWdlLmNhbGwodGhpcywgZXZ0TmFtZSk7XG4gIHJldHVybiAoZXZ0RGF0YSwgb3JpZ2luYWxFbGVtZW50KSA9PiB7XG4gICAgZGVsZWdhdGVDYWxsQmFjay5jYWxsKHRoaXMsIGV2dERhdGEsIG9yaWdpbmFsRWxlbWVudCk7XG4gICAgZW1pdC5jYWxsKHRoaXMsIGV2dE5hbWUsIGV2dERhdGEpO1xuICB9O1xufVxubGV0IGRyYWdnaW5nRWxlbWVudCA9IG51bGw7XG5jb25zdCBwcm9wcyA9IHtcbiAgbGlzdDoge1xuICAgIHR5cGU6IEFycmF5LFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBkZWZhdWx0OiBudWxsXG4gIH0sXG4gIG1vZGVsVmFsdWU6IHtcbiAgICB0eXBlOiBBcnJheSxcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgZGVmYXVsdDogbnVsbFxuICB9LFxuICBpdGVtS2V5OiB7XG4gICAgdHlwZTogW1N0cmluZywgRnVuY3Rpb25dLFxuICAgIHJlcXVpcmVkOiB0cnVlXG4gIH0sXG4gIGNsb25lOiB7XG4gICAgdHlwZTogRnVuY3Rpb24sXG4gICAgZGVmYXVsdDogKG9yaWdpbmFsKSA9PiB7XG4gICAgICByZXR1cm4gb3JpZ2luYWw7XG4gICAgfVxuICB9LFxuICB0YWc6IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgZGVmYXVsdDogXCJkaXZcIlxuICB9LFxuICBtb3ZlOiB7XG4gICAgdHlwZTogRnVuY3Rpb24sXG4gICAgZGVmYXVsdDogbnVsbFxuICB9LFxuICBjb21wb25lbnREYXRhOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBkZWZhdWx0OiBudWxsXG4gIH1cbn07XG5jb25zdCBlbWl0cyA9IFtcbiAgXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLFxuICBcImNoYW5nZVwiLFxuICAuLi5bLi4uZXZlbnRzLm1hbmFnZUFuZEVtaXQsIC4uLmV2ZW50cy5lbWl0XS5tYXAoKGV2dCkgPT4gZXZ0LnRvTG93ZXJDYXNlKCkpXG5dO1xuY29uc3QgZHJhZ2dhYmxlQ29tcG9uZW50ID0gZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJkcmFnZ2FibGVcIixcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcbiAgcHJvcHMsXG4gIGVtaXRzLFxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogZmFsc2VcbiAgICB9O1xuICB9LFxuICByZW5kZXIoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZXJyb3IgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHsgJHNsb3RzLCAkYXR0cnMsIHRhZywgY29tcG9uZW50RGF0YSwgcmVhbExpc3QsIGdldEtleSB9ID0gdGhpcztcbiAgICAgIGNvbnN0IGNvbXBvbmVudFN0cnVjdHVyZSA9IGNvbXB1dGVDb21wb25lbnRTdHJ1Y3R1cmUoe1xuICAgICAgICAkc2xvdHMsXG4gICAgICAgIHRhZyxcbiAgICAgICAgcmVhbExpc3QsXG4gICAgICAgIGdldEtleVxuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbXBvbmVudFN0cnVjdHVyZSA9IGNvbXBvbmVudFN0cnVjdHVyZTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBnZXRDb21wb25lbnRBdHRyaWJ1dGVzKHsgJGF0dHJzLCBjb21wb25lbnREYXRhIH0pO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudFN0cnVjdHVyZS5yZW5kZXIoaCwgYXR0cmlidXRlcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgICAgIHJldHVybiBoKFwicHJlXCIsIHsgc3R5bGU6IHsgY29sb3I6IFwicmVkXCIgfSB9LCBlcnIuc3RhY2spO1xuICAgIH1cbiAgfSxcbiAgY3JlYXRlZCgpIHtcbiAgICBpZiAodGhpcy5saXN0ICE9PSBudWxsICYmIHRoaXMubW9kZWxWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29uc29sZSQxLmVycm9yKFwibW9kZWxWYWx1ZSBhbmQgbGlzdCBwcm9wcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlISBQbGVhc2Ugc2V0IG9uZSBvciBhbm90aGVyLlwiKTtcbiAgICB9XG4gIH0sXG4gIG1vdW50ZWQoKSB7XG4gICAgaWYgKHRoaXMuZXJyb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyAkYXR0cnMsICRlbCwgY29tcG9uZW50U3RydWN0dXJlIH0gPSB0aGlzO1xuICAgIGNvbXBvbmVudFN0cnVjdHVyZS51cGRhdGVkKCk7XG4gICAgY29uc3Qgc29ydGFibGVPcHRpb25zID0gY3JlYXRlU29ydGFibGVPcHRpb24oe1xuICAgICAgJGF0dHJzLFxuICAgICAgY2FsbEJhY2tCdWlsZGVyOiB7XG4gICAgICAgIG1hbmFnZUFuZEVtaXQ6IChldmVudCkgPT4gbWFuYWdlQW5kRW1pdC5jYWxsKHRoaXMsIGV2ZW50KSxcbiAgICAgICAgZW1pdDogKGV2ZW50KSA9PiBlbWl0LmJpbmQodGhpcywgZXZlbnQpLFxuICAgICAgICBtYW5hZ2U6IChldmVudCkgPT4gbWFuYWdlLmNhbGwodGhpcywgZXZlbnQpXG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0RG9tRWxlbWVudCA9ICRlbC5ub2RlVHlwZSA9PT0gMSA/ICRlbCA6ICRlbC5wYXJlbnRFbGVtZW50O1xuICAgIHRoaXMuX3NvcnRhYmxlID0gbmV3IFNvcnRhYmxlKHRhcmdldERvbUVsZW1lbnQsIHNvcnRhYmxlT3B0aW9ucyk7XG4gICAgdGhpcy50YXJnZXREb21FbGVtZW50ID0gdGFyZ2V0RG9tRWxlbWVudDtcbiAgICB0YXJnZXREb21FbGVtZW50Ll9fZHJhZ2dhYmxlX2NvbXBvbmVudF9fID0gdGhpcztcbiAgfSxcbiAgdXBkYXRlZCgpIHtcbiAgICB0aGlzLmNvbXBvbmVudFN0cnVjdHVyZS51cGRhdGVkKCk7XG4gIH0sXG4gIGJlZm9yZVVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMuX3NvcnRhYmxlICE9PSB2b2lkIDApXG4gICAgICB0aGlzLl9zb3J0YWJsZS5kZXN0cm95KCk7XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgcmVhbExpc3QoKSB7XG4gICAgICBjb25zdCB7IGxpc3QgfSA9IHRoaXM7XG4gICAgICByZXR1cm4gbGlzdCA/IGxpc3QgOiB0aGlzLm1vZGVsVmFsdWU7XG4gICAgfSxcbiAgICBnZXRLZXkoKSB7XG4gICAgICBjb25zdCB7IGl0ZW1LZXkgfSA9IHRoaXM7XG4gICAgICBpZiAodHlwZW9mIGl0ZW1LZXkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlbUtleTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoZWxlbWVudCkgPT4gZWxlbWVudFtpdGVtS2V5XTtcbiAgICB9XG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgJGF0dHJzOiB7XG4gICAgICBoYW5kbGVyKG5ld09wdGlvblZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgX3NvcnRhYmxlIH0gPSB0aGlzO1xuICAgICAgICBpZiAoIV9zb3J0YWJsZSlcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGdldFZhbGlkU29ydGFibGVFbnRyaWVzKG5ld09wdGlvblZhbHVlKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBfc29ydGFibGUub3B0aW9uKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBkZWVwOiB0cnVlXG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgZ2V0VW5kZXJseWluZ1ZtKGRvbUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFN0cnVjdHVyZS5nZXRVbmRlcmx5aW5nVm0oZG9tRWxlbWVudCkgfHwgbnVsbDtcbiAgICB9LFxuICAgIGdldFVuZGVybHlpbmdQb3RlbmNpYWxEcmFnZ2FibGVDb21wb25lbnQoaHRtRWxlbWVudCkge1xuICAgICAgcmV0dXJuIGh0bUVsZW1lbnQuX19kcmFnZ2FibGVfY29tcG9uZW50X187XG4gICAgfSxcbiAgICBlbWl0Q2hhbmdlcyhldnQpIHtcbiAgICAgIG5leHRUaWNrKCgpID0+IHRoaXMuJGVtaXQoXCJjaGFuZ2VcIiwgZXZ0KSk7XG4gICAgfSxcbiAgICBhbHRlckxpc3Qob25MaXN0KSB7XG4gICAgICBpZiAodGhpcy5saXN0KSB7XG4gICAgICAgIG9uTGlzdCh0aGlzLmxpc3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdMaXN0ID0gWy4uLnRoaXMubW9kZWxWYWx1ZV07XG4gICAgICBvbkxpc3QobmV3TGlzdCk7XG4gICAgICB0aGlzLiRlbWl0KFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgbmV3TGlzdCk7XG4gICAgfSxcbiAgICBzcGxpY2VMaXN0KCkge1xuICAgICAgY29uc3Qgc3BsaWNlTGlzdCA9IChsaXN0KSA9PiBsaXN0LnNwbGljZSguLi5hcmd1bWVudHMpO1xuICAgICAgdGhpcy5hbHRlckxpc3Qoc3BsaWNlTGlzdCk7XG4gICAgfSxcbiAgICB1cGRhdGVQb3NpdGlvbihvbGRJbmRleCwgbmV3SW5kZXgpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZVBvc2l0aW9uID0gKGxpc3QpID0+IGxpc3Quc3BsaWNlKG5ld0luZGV4LCAwLCBsaXN0LnNwbGljZShvbGRJbmRleCwgMSlbMF0pO1xuICAgICAgdGhpcy5hbHRlckxpc3QodXBkYXRlUG9zaXRpb24pO1xuICAgIH0sXG4gICAgZ2V0UmVsYXRlZENvbnRleHRGcm9tTW92ZUV2ZW50KHsgdG8sIHJlbGF0ZWQgfSkge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5nZXRVbmRlcmx5aW5nUG90ZW5jaWFsRHJhZ2dhYmxlQ29tcG9uZW50KHRvKTtcbiAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiB7IGNvbXBvbmVudCB9O1xuICAgICAgfVxuICAgICAgY29uc3QgbGlzdCA9IGNvbXBvbmVudC5yZWFsTGlzdDtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IGxpc3QsIGNvbXBvbmVudCB9O1xuICAgICAgaWYgKHRvICE9PSByZWxhdGVkICYmIGxpc3QpIHtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBjb21wb25lbnQuZ2V0VW5kZXJseWluZ1ZtKHJlbGF0ZWQpIHx8IHt9O1xuICAgICAgICByZXR1cm4gX19zcHJlYWRWYWx1ZXMoX19zcHJlYWRWYWx1ZXMoe30sIGRlc3RpbmF0aW9uKSwgY29udGV4dCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9LFxuICAgIGdldFZtSW5kZXhGcm9tRG9tSW5kZXgoZG9tSW5kZXgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFN0cnVjdHVyZS5nZXRWbUluZGV4RnJvbURvbUluZGV4KGRvbUluZGV4LCB0aGlzLnRhcmdldERvbUVsZW1lbnQpO1xuICAgIH0sXG4gICAgb25EcmFnU3RhcnQoZXZ0KSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSB0aGlzLmdldFVuZGVybHlpbmdWbShldnQuaXRlbSk7XG4gICAgICBldnQuaXRlbS5fdW5kZXJseWluZ192bV8gPSB0aGlzLmNsb25lKHRoaXMuY29udGV4dC5lbGVtZW50KTtcbiAgICAgIGRyYWdnaW5nRWxlbWVudCA9IGV2dC5pdGVtO1xuICAgIH0sXG4gICAgb25EcmFnQWRkKGV2dCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGV2dC5pdGVtLl91bmRlcmx5aW5nX3ZtXztcbiAgICAgIGlmIChlbGVtZW50ID09PSB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVtb3ZlTm9kZShldnQuaXRlbSk7XG4gICAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuZ2V0Vm1JbmRleEZyb21Eb21JbmRleChldnQubmV3SW5kZXgpO1xuICAgICAgdGhpcy5zcGxpY2VMaXN0KG5ld0luZGV4LCAwLCBlbGVtZW50KTtcbiAgICAgIGNvbnN0IGFkZGVkID0geyBlbGVtZW50LCBuZXdJbmRleCB9O1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlcyh7IGFkZGVkIH0pO1xuICAgIH0sXG4gICAgb25EcmFnUmVtb3ZlKGV2dCkge1xuICAgICAgaW5zZXJ0Tm9kZUF0KHRoaXMuJGVsLCBldnQuaXRlbSwgZXZ0Lm9sZEluZGV4KTtcbiAgICAgIGlmIChldnQucHVsbE1vZGUgPT09IFwiY2xvbmVcIikge1xuICAgICAgICByZW1vdmVOb2RlKGV2dC5jbG9uZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaW5kZXg6IG9sZEluZGV4LCBlbGVtZW50IH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICB0aGlzLnNwbGljZUxpc3Qob2xkSW5kZXgsIDEpO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHsgZWxlbWVudCwgb2xkSW5kZXggfTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZXMoeyByZW1vdmVkIH0pO1xuICAgIH0sXG4gICAgb25EcmFnVXBkYXRlKGV2dCkge1xuICAgICAgcmVtb3ZlTm9kZShldnQuaXRlbSk7XG4gICAgICBpbnNlcnROb2RlQXQoZXZ0LmZyb20sIGV2dC5pdGVtLCBldnQub2xkSW5kZXgpO1xuICAgICAgY29uc3Qgb2xkSW5kZXggPSB0aGlzLmNvbnRleHQuaW5kZXg7XG4gICAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuZ2V0Vm1JbmRleEZyb21Eb21JbmRleChldnQubmV3SW5kZXgpO1xuICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbihvbGRJbmRleCwgbmV3SW5kZXgpO1xuICAgICAgY29uc3QgbW92ZWQgPSB7IGVsZW1lbnQ6IHRoaXMuY29udGV4dC5lbGVtZW50LCBvbGRJbmRleCwgbmV3SW5kZXggfTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZXMoeyBtb3ZlZCB9KTtcbiAgICB9LFxuICAgIGNvbXB1dGVGdXR1cmVJbmRleChyZWxhdGVkQ29udGV4dCwgZXZ0KSB7XG4gICAgICBpZiAoIXJlbGF0ZWRDb250ZXh0LmVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBjb25zdCBkb21DaGlsZHJlbiA9IFsuLi5ldnQudG8uY2hpbGRyZW5dLmZpbHRlcigoZWwpID0+IGVsLnN0eWxlW1wiZGlzcGxheVwiXSAhPT0gXCJub25lXCIpO1xuICAgICAgY29uc3QgY3VycmVudERvbUluZGV4ID0gZG9tQ2hpbGRyZW4uaW5kZXhPZihldnQucmVsYXRlZCk7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXggPSByZWxhdGVkQ29udGV4dC5jb21wb25lbnQuZ2V0Vm1JbmRleEZyb21Eb21JbmRleChjdXJyZW50RG9tSW5kZXgpO1xuICAgICAgY29uc3QgZHJhZ2dlZEluTGlzdCA9IGRvbUNoaWxkcmVuLmluZGV4T2YoZHJhZ2dpbmdFbGVtZW50KSAhPT0gLTE7XG4gICAgICByZXR1cm4gZHJhZ2dlZEluTGlzdCB8fCAhZXZ0LndpbGxJbnNlcnRBZnRlciA/IGN1cnJlbnRJbmRleCA6IGN1cnJlbnRJbmRleCArIDE7XG4gICAgfSxcbiAgICBvbkRyYWdNb3ZlKGV2dCwgb3JpZ2luYWxFdmVudCkge1xuICAgICAgY29uc3QgeyBtb3ZlLCByZWFsTGlzdCB9ID0gdGhpcztcbiAgICAgIGlmICghbW92ZSB8fCAhcmVhbExpc3QpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxhdGVkQ29udGV4dCA9IHRoaXMuZ2V0UmVsYXRlZENvbnRleHRGcm9tTW92ZUV2ZW50KGV2dCk7XG4gICAgICBjb25zdCBmdXR1cmVJbmRleCA9IHRoaXMuY29tcHV0ZUZ1dHVyZUluZGV4KHJlbGF0ZWRDb250ZXh0LCBldnQpO1xuICAgICAgY29uc3QgZHJhZ2dlZENvbnRleHQgPSBfX3NwcmVhZFByb3BzKF9fc3ByZWFkVmFsdWVzKHt9LCB0aGlzLmNvbnRleHQpLCB7XG4gICAgICAgIGZ1dHVyZUluZGV4XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNlbmRFdmVudCA9IF9fc3ByZWFkUHJvcHMoX19zcHJlYWRWYWx1ZXMoe30sIGV2dCksIHtcbiAgICAgICAgcmVsYXRlZENvbnRleHQsXG4gICAgICAgIGRyYWdnZWRDb250ZXh0XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtb3ZlKHNlbmRFdmVudCwgb3JpZ2luYWxFdmVudCk7XG4gICAgfSxcbiAgICBvbkRyYWdFbmQoKSB7XG4gICAgICBkcmFnZ2luZ0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufSk7XG5leHBvcnQgeyBkcmFnZ2FibGVDb21wb25lbnQgYXMgZGVmYXVsdCB9O1xuIiwiPHRlbXBsYXRlPlxyXG4gIDxjb21wb25lbnQgOmlzPVwidWkuYnV0dG9uR3JvdXAubmFtZVwiIGNsYXNzPVwiZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyXCI+XHJcbiAgICA8ZnMtYnV0dG9uXHJcbiAgICAgIHYtZm9yPVwib3B0aW9uIG9mIG9wdGlvbnNcIlxyXG4gICAgICA6a2V5PVwib3B0aW9uLmljb25cIlxyXG4gICAgICA6dHlwZT1cIm1vZGVsVmFsdWUgPT09IG9wdGlvbi52YWx1ZSA/ICdwcmltYXJ5JyA6ICdkZWZhdWx0J1wiXHJcbiAgICAgIDppY29uPVwib3B0aW9uLmljb25cIlxyXG4gICAgICBzaXplPVwic21hbGxcIlxyXG4gICAgICBAY2xpY2s9XCJzdWJtaXQob3B0aW9uLnZhbHVlKVwiXHJcbiAgICAvPlxyXG4gIDwvY29tcG9uZW50PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgcmVmIH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi8uLi8uLi91c2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc1RhYmxlQ29sdW1uc0ZpeGVkQ29udHJvbGxlclwiLFxyXG4gIHByb3BzOiB7XHJcbiAgICBtb2RlbFZhbHVlOiB7XHJcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgfSxcclxuICBlbWl0czogW1widXBkYXRlOm1vZGVsVmFsdWVcIiwgXCJjaGFuZ2VcIl0sXHJcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xyXG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdmFsdWU6IFwibGVmdFwiLFxyXG4gICAgICAgICAgaWNvbjogdWkuaWNvbnMubGVmdCAvLyAnZWwtaWNvbi1hcnJvdy1sZWZ0J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdmFsdWU6IGZhbHNlLFxyXG4gICAgICAgICAgaWNvbjogdWkuaWNvbnMuY2xvc2UgLy8gJ2VsLWljb24tY2xvc2UnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB2YWx1ZTogXCJyaWdodFwiLFxyXG4gICAgICAgICAgaWNvbjogdWkuaWNvbnMucmlnaHQgLy8gJ2VsLWljb24tYXJyb3ctcmlnaHQnXHJcbiAgICAgICAgfVxyXG4gICAgICBdO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZnVuY3Rpb24gc3VibWl0KHZhbHVlOiBhbnkpIHtcclxuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCB2YWx1ZSk7XHJcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpLFxyXG4gICAgICBvcHRpb25zLFxyXG4gICAgICBzdWJtaXRcclxuICAgIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlciB7XHJcbiAgLmZzLWJ1dHRvbiB7XHJcbiAgICBwYWRkaW5nOiAycHggIWltcG9ydGFudDtcclxuICAgIGZvbnQtc2l6ZTogMTBweDtcclxuICAgIG1pbi1oZWlnaHQ6IGF1dG87XHJcbiAgfVxyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8Y29tcG9uZW50IDppcz1cInVpLmJ1dHRvbkdyb3VwLm5hbWVcIiBjbGFzcz1cImZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlclwiPlxyXG4gICAgPGZzLWJ1dHRvblxyXG4gICAgICB2LWZvcj1cIm9wdGlvbiBvZiBvcHRpb25zXCJcclxuICAgICAgOmtleT1cIm9wdGlvbi5pY29uXCJcclxuICAgICAgOnR5cGU9XCJtb2RlbFZhbHVlID09PSBvcHRpb24udmFsdWUgPyAncHJpbWFyeScgOiAnZGVmYXVsdCdcIlxyXG4gICAgICA6aWNvbj1cIm9wdGlvbi5pY29uXCJcclxuICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgQGNsaWNrPVwic3VibWl0KG9wdGlvbi52YWx1ZSlcIlxyXG4gICAgLz5cclxuICA8L2NvbXBvbmVudD5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIHJlZiB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdXNlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNUYWJsZUNvbHVtbnNGaXhlZENvbnRyb2xsZXJcIixcclxuICBwcm9wczoge1xyXG4gICAgbW9kZWxWYWx1ZToge1xyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgZW1pdHM6IFtcInVwZGF0ZTptb2RlbFZhbHVlXCIsIFwiY2hhbmdlXCJdLFxyXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgICBjb25zdCBvcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHZhbHVlOiBcImxlZnRcIixcclxuICAgICAgICAgIGljb246IHVpLmljb25zLmxlZnQgLy8gJ2VsLWljb24tYXJyb3ctbGVmdCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHZhbHVlOiBmYWxzZSxcclxuICAgICAgICAgIGljb246IHVpLmljb25zLmNsb3NlIC8vICdlbC1pY29uLWNsb3NlJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdmFsdWU6IFwicmlnaHRcIixcclxuICAgICAgICAgIGljb246IHVpLmljb25zLnJpZ2h0IC8vICdlbC1pY29uLWFycm93LXJpZ2h0J1xyXG4gICAgICAgIH1cclxuICAgICAgXTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIHN1Ym1pdCh2YWx1ZTogYW55KSB7XHJcbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgdmFsdWUpO1xyXG4gICAgICBjdHguZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1aSxcclxuICAgICAgb3B0aW9ucyxcclxuICAgICAgc3VibWl0XHJcbiAgICB9O1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi5mcy10YWJsZS1jb2x1bW5zLWZpeGVkLWNvbnRyb2xsZXIge1xyXG4gIC5mcy1idXR0b24ge1xyXG4gICAgcGFkZGluZzogMnB4ICFpbXBvcnRhbnQ7XHJcbiAgICBmb250LXNpemU6IDEwcHg7XHJcbiAgICBtaW4taGVpZ2h0OiBhdXRvO1xyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRyYWdnYWJsZSA6bGlzdD1cImNvbHVtbnNcIiBpdGVtLWtleT1cImtleVwiIDptb3ZlPVwib25EcmFnZ2FibGVNb3ZlXCI+XHJcbiAgICA8dGVtcGxhdGUgI2l0ZW09XCJ7IGVsZW1lbnQsIGluZGV4IH1cIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICB2LXNob3c9XCJvcmlnaW5hbENvbHVtbnNNYXBbZWxlbWVudC5fX2tleV0/Ll9fc2hvdyAhPT0gZmFsc2VcIlxyXG4gICAgICAgICAgOnRpdGxlPVwiYnVpbGRUZXh0KGVsZW1lbnQpXCJcclxuICAgICAgICAgIGNsYXNzPVwiY29tcG9uZW50LS1saXN0LWl0ZW1cIlxyXG4gICAgICAgICAgZmxleD1cIm1haW46anVzdGlmeSBjcm9zczpjZW50ZXJcIlxyXG4gICAgICAgICAgOmk9XCJpbmRleFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgICA6aXM9XCJ1aS5jaGVja2JveC5uYW1lXCJcclxuICAgICAgICAgICAgOlt1aS5jaGVja2JveC5tb2RlbFZhbHVlXT1cImVsZW1lbnQuc2hvd1wiXHJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cIm9yaWdpbmFsQ29sdW1uc01hcFtlbGVtZW50Ll9fa2V5XT8uX19kaXNhYmxlZCA9PT0gdHJ1ZVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiaXRlbS1sYWJlbFwiXHJcbiAgICAgICAgICAgIDp0aXRsZT1cImJ1aWxkVGV4dChlbGVtZW50KVwiXHJcbiAgICAgICAgICAgIEBbYnVpbGRVcGRhdGVLZXkodWkuY2hlY2tib3gubW9kZWxWYWx1ZSldPVwidXBkYXRlQ2hlY2tlZChlbGVtZW50KVwiXHJcbiAgICAgICAgICAgIEBjaGFuZ2U9XCJvbkNoZWNrQ2hhbmdlZFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGJ1aWxkVGV4dChlbGVtZW50KSB9fVxyXG4gICAgICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1yaWdodFwiPlxyXG4gICAgICAgICAgICA8ZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyXHJcbiAgICAgICAgICAgICAgdi1pZj1cImlzUm9vdFwiXHJcbiAgICAgICAgICAgICAgdi1tb2RlbD1cImVsZW1lbnQuZml4ZWRcIlxyXG4gICAgICAgICAgICAgIGZsZXgtYm94PVwiMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkMi1tci0xMFwiXHJcbiAgICAgICAgICAgICAgQGNoYW5nZT1cImZpeGVkQ2hhbmdlKGluZGV4LCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGRpdiBmbGV4LWJveD1cIjBcIiBjbGFzcz1cImNvbXBvbmVudC0tbGlzdC1pdGVtLWhhbmRsZSBoYW5kbGVcIj5cclxuICAgICAgICAgICAgICA8ZnMtaWNvbiA6aWNvbj1cInVpLmljb25zLnNvcnRcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMjBweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyBib3JkZXItbGVmdDogMXB4IHNvbGlkICNlZWVcIj5cclxuICAgICAgICAgIDxmcy1jb2x1bW5zLWZpbHRlci1uZXN0LWxpc3RcclxuICAgICAgICAgICAgdi1pZj1cImVsZW1lbnQuY2hpbGRyZW5cIlxyXG4gICAgICAgICAgICA6Y29sdW1ucz1cImVsZW1lbnQuY2hpbGRyZW5cIlxyXG4gICAgICAgICAgICBAY2hlY2stY2hhbmdlZD1cIm9uQ2hlY2tDaGFuZ2VkXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICA8L2RyYWdnYWJsZT5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuLy/kuI3opoHliKBcclxuLy9AdHMtaWdub3JlXHJcbmltcG9ydCBkcmFnZ2FibGUgZnJvbSBcInZ1ZWRyYWdnYWJsZS1lc1wiO1xyXG5pbXBvcnQgRnNUYWJsZUNvbHVtbnNGaXhlZENvbnRyb2xsZXIgZnJvbSBcIi4vZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyL2luZGV4LnZ1ZVwiO1xyXG5pbXBvcnQgeyBDb2x1bW5zRmlsdGVyQ29udGV4dCwgQ29sdW1uc0ZpbHRlckl0ZW0sIENvbHVtbnNGaWx0ZXJQcm92aWRlS2V5IH0gZnJvbSBcIi4uLy4uLy4uL2RcIjtcclxuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCJAZmFzdC1jcnVkL3VpLWludGVyZmFjZVwiO1xyXG5cclxuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuY29uc3QgZW1pdHMgPSBkZWZpbmVFbWl0cyhbXCJjaGVjay1jaGFuZ2VkXCIsIFwiZml4ZWQtY2hhbmdlZFwiXSk7XHJcbnR5cGUgTmVzdExpc3RQcm9wcyA9IHtcclxuICBjb2x1bW5zOiBDb2x1bW5zRmlsdGVySXRlbVtdO1xyXG4gIGlzUm9vdD86IGJvb2xlYW47XHJcbn07XHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKGRlZmluZVByb3BzPE5lc3RMaXN0UHJvcHM+KCksIHtcclxuICBpc1Jvb3Q6IGZhbHNlXHJcbn0pO1xyXG5jb25zdCB7IG9yaWdpbmFsQ29sdW1ucywgY3VycmVudENvbHVtbnMsIG9yaWdpbmFsQ29sdW1uc01hcCwgdGV4dCwgYWN0aXZlIH0gPVxyXG4gIGluamVjdDxDb2x1bW5zRmlsdGVyQ29udGV4dD4oQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXkpO1xyXG5mdW5jdGlvbiBidWlsZFRleHQoZWxlbWVudDogYW55KSB7XHJcbiAgcmV0dXJuIGVsZW1lbnQuX190aXRsZSB8fCBlbGVtZW50LmxhYmVsIHx8IGVsZW1lbnQudGl0bGUgfHwgZWxlbWVudC5rZXkgfHwgdGV4dC52YWx1ZS51bm5hbWVkO1xyXG59XHJcblxyXG5mdW5jdGlvbiBvbkRyYWdnYWJsZU1vdmUoZTogYW55KSB7XHJcbiAgY29uc3QgZHJhZ2VkID0gZS5kcmFnZ2VkQ29udGV4dC5lbGVtZW50O1xyXG4gIGNvbnN0IHRhcmdldCA9IGUucmVsYXRlZENvbnRleHQuZWxlbWVudDtcclxuICBjb25zdCBzb3J0ZWQ6IENvbHVtbnNGaWx0ZXJJdGVtW10gPSBbXTtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgY3VycmVudENvbHVtbnMudmFsdWUpIHtcclxuICAgIGlmIChpdGVtLmtleSA9PT0gZHJhZ2VkLmtleSkge1xyXG4gICAgICBzb3J0ZWQucHVzaCh0YXJnZXQpO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtLmtleSA9PT0gdGFyZ2V0LmtleSkge1xyXG4gICAgICBzb3J0ZWQucHVzaChkcmFnZWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc29ydGVkLnB1c2goaXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8v55yLa2V555qE5o6S5YiX5piv5ZCm5q2j5bi4XHJcbiAgbGV0IGxlZnRJbmRleCA9IDA7XHJcbiAgbGV0IHJpZ2h0SW5kZXggPSBzb3J0ZWQubGVuZ3RoIC0gMTtcclxuICBsZXQgbWluTm90SW5kZXggPSBzb3J0ZWQubGVuZ3RoIC0gMTtcclxuICBsZXQgbWF4Tm90SW5kZXggPSAwO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjb25zdCBpdGVtID0gc29ydGVkW2ldO1xyXG4gICAgaWYgKGl0ZW0uZml4ZWQgPT09IFwibGVmdFwiKSB7XHJcbiAgICAgIGxlZnRJbmRleCA9IGk7XHJcbiAgICB9IGVsc2UgaWYgKGl0ZW0uZml4ZWQgPT09IFwicmlnaHRcIikge1xyXG4gICAgICByaWdodEluZGV4ID0gcmlnaHRJbmRleCA+IGkgPyBpIDogcmlnaHRJbmRleDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1pbk5vdEluZGV4ID0gbWluTm90SW5kZXggPiBpID8gaSA6IG1pbk5vdEluZGV4O1xyXG4gICAgICBtYXhOb3RJbmRleCA9IG1heE5vdEluZGV4IDwgaSA/IGkgOiBtYXhOb3RJbmRleDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChtaW5Ob3RJbmRleCA8IGxlZnRJbmRleCB8fCBtYXhOb3RJbmRleCA+IHJpZ2h0SW5kZXgpIHtcclxuICAgIC8vdWkubWVzc2FnZS5lcnJvcihcIumdnmZpeGVk5a2X5q615LiN5b6X6LaK6L+HZml4ZWTlrZfmrrXnmoTpobrluo9cIik7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcbmZ1bmN0aW9uIGJ1aWxkVXBkYXRlS2V5KGtleSkge1xyXG4gIHJldHVybiBcInVwZGF0ZTpcIiArIGtleTtcclxufVxyXG5cclxuZnVuY3Rpb24gZmluZEZyb21UcmVlKHRyZWU6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gIGZvciAoY29uc3QgaXRlbSBvZiB0cmVlKSB7XHJcbiAgICBpZiAoaXRlbS5rZXkgPT09IGtleSkge1xyXG4gICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZpbmRGcm9tVHJlZShpdGVtLmNoaWxkcmVuLCBrZXkpO1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5mdW5jdGlvbiB1cGRhdGVDaGVja2VkKGVsZW1lbnQ6IGFueSkge1xyXG4gIGVsZW1lbnQuc2hvdyA9ICFlbGVtZW50LnNob3c7XHJcbiAgLy/nuqfogZTpgInkuK3lkozlj5bmtohcclxuXHJcbiAgZnVuY3Rpb24gdXBkYXRlQ2hpbGRyZW4oZWxlbWVudDogYW55KSB7XHJcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikge1xyXG4gICAgICBlbGVtZW50LmNoaWxkcmVuLmZvckVhY2goKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5fX3Nob3cgfHwgZS5fX2Rpc2FibGVkKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGUuc2hvdyA9IGVsZW1lbnQuc2hvdztcclxuICAgICAgICB1cGRhdGVDaGlsZHJlbihlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHVwZGF0ZUNoaWxkcmVuKGVsZW1lbnQpO1xyXG5cclxuICBmdW5jdGlvbiB1cGRhdGVQYXJlbnQoZWxlbWVudCkge1xyXG4gICAgaWYgKGVsZW1lbnQuX19wYXJlbnQpIHtcclxuICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5fX3BhcmVudDtcclxuICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgIHBhcmVudC5zaG93ID0gcGFyZW50LmNoaWxkcmVuLmZpbHRlcigoZTogYW55KSA9PiBlLl9fc2hvdyAmJiBlLnNob3cgPT09IHRydWUpLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgdXBkYXRlUGFyZW50KHBhcmVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgdXBkYXRlUGFyZW50KGVsZW1lbnQpO1xyXG59XHJcbmZ1bmN0aW9uIG9uQ2hlY2tDaGFuZ2VkKCkge1xyXG4gIGVtaXRzKFwiY2hlY2stY2hhbmdlZFwiKTtcclxufVxyXG5mdW5jdGlvbiBmaXhlZENoYW5nZShpbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KSB7XHJcbiAgZW1pdHMoXCJmaXhlZC1jaGFuZ2VkXCIsIGluZGV4LCB2YWx1ZSk7XHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8Y29tcG9uZW50XHJcbiAgICA6aXM9XCJ1aS5kcmF3ZXIubmFtZVwiXHJcbiAgICBjbGFzcz1cImZzLWNvbHVtbnMtZmlsdGVyLWxheW91dC1kZWZhdWx0XCJcclxuICAgIDp0aXRsZT1cInRleHQudGl0bGVcIlxyXG4gICAgdi1iaW5kPVwiZHJhd2VyQmluZFwiXHJcbiAgICBhcHBlbmQtdG8tYm9keVxyXG4gID5cclxuICAgIDxjb21wb25lbnRcclxuICAgICAgOmlzPVwidWkuZHJhd2VyLmhhc0NvbnRlbnRXcmFwIHx8ICdkaXYnXCJcclxuICAgICAgY2xhc3M9XCJmcy1kcmF3ZXItd3JhcHBlciBmcy10YWJsZS1jb2x1bW5zLWZpbHRlclwiXHJcbiAgICAgIDp0aXRsZT1cInRleHQudGl0bGVcIlxyXG4gICAgPlxyXG4gICAgICA8Y29tcG9uZW50IDppcz1cInVpLmNhcmQubmFtZVwiIHNoYWRvdz1cIm5ldmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC0tbGlzdFwiPlxyXG4gICAgICAgICAgPGRpdiBrZXk9XCJfX2ZpcnN0X19cIiBjbGFzcz1cImNvbXBvbmVudC0tbGlzdC1pdGVtXCIgZmxleD1cIm1haW46anVzdGlmeSBjcm9zczpjZW50ZXJcIj5cclxuICAgICAgICAgICAgPHNwYW4gOnNwYW49XCIxMlwiPlxyXG4gICAgICAgICAgICAgIDwhLS0g5YWo6YCJIOWPjemAiSAtLT5cclxuICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmNoZWNrYm94Lm5hbWVcIiA6aW5kZXRlcm1pbmF0ZT1cImlzSW5kZXRlcm1pbmF0ZVwiIHYtYmluZD1cImNoZWNrQWxsQmluZFwiPlxyXG4gICAgICAgICAgICAgICAge3sgc2hvd0xlbmd0aCB9fSAvIHt7IGFsbExlbmd0aCB9fVxyXG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eyB0ZXh0LmZpeGVkIH19IC8ge3sgdGV4dC5vcmRlciB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxmcy1jb2x1bW5zLWZpbHRlci1uZXN0LWxpc3RcclxuICAgICAgICAgICAgOmNvbHVtbnM9XCJjdXJyZW50Q29sdW1uc1wiXHJcbiAgICAgICAgICAgIDppcy1yb290PVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIEBjaGVjay1jaGFuZ2VkPVwiYWxsQ2hlY2tlZFVwZGF0ZVwiXHJcbiAgICAgICAgICAgIEBmaXhlZC1jaGFuZ2VkPVwiZml4ZWRDaGFuZ2VcIlxyXG4gICAgICAgICAgPjwvZnMtY29sdW1ucy1maWx0ZXItbmVzdC1saXN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgPHNsb3QgbmFtZT1cImJ1dHRvbnNcIj48L3Nsb3Q+XHJcbiAgICA8L2NvbXBvbmVudD5cclxuICA8L2NvbXBvbmVudD5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgbGFuZz1cInRzXCIgc2V0dXA+XHJcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG4vL+S4jeimgeWIoFxyXG4vL0B0cy1pZ25vcmVcclxuaW1wb3J0IGRyYWdnYWJsZSBmcm9tIFwidnVlZHJhZ2dhYmxlLWVzXCI7XHJcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uLy4uL3VzZVwiO1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgaW5qZWN0LCByZWYsIHdhdGNoIH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyBDb2x1bW5zRmlsdGVyUHJvdmlkZUtleSwgQ29sdW1uc0ZpbHRlckNvbnRleHQsIENvbHVtbnNGaWx0ZXJDb250YWluZXJQcm9wcyB9IGZyb20gXCIuLi8uLi8uLi9kL1wiO1xyXG5pbXBvcnQgRnNDb2x1bW5zRmlsdGVyTmVzdExpc3QgZnJvbSBcIi4vZnMtY29sdW1ucy1maWx0ZXItbmVzdC1saXN0LnZ1ZVwiO1xyXG5cclxuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuXHJcbmNvbnN0IHsgb3JpZ2luYWxDb2x1bW5zLCBjdXJyZW50Q29sdW1ucywgdGV4dCwgYWN0aXZlIH0gPSBpbmplY3Q8Q29sdW1uc0ZpbHRlckNvbnRleHQ+KENvbHVtbnNGaWx0ZXJQcm92aWRlS2V5KTtcclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczxDb2x1bW5zRmlsdGVyQ29udGFpbmVyUHJvcHM+KCk7XHJcbmNvbnN0IGRyYXdlckJpbmQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIG1lcmdlKFxyXG4gICAge1xyXG4gICAgICBbdWkuZHJhd2VyLnZpc2libGVdOiBhY3RpdmUudmFsdWUsXHJcbiAgICAgIFtcIm9uVXBkYXRlOlwiICsgdWkuZHJhd2VyLnZpc2libGVdOiAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgYWN0aXZlLnZhbHVlID0gZTtcclxuICAgICAgfSxcclxuICAgICAgW3VpLmRyYXdlci53aWR0aF06IHByb3BzLndpZHRoIHx8IFwiNDAwcHhcIlxyXG4gICAgfSxcclxuICAgIHByb3BzLmRyYXdlclxyXG4gICk7XHJcbn0pO1xyXG5cclxuY29uc3QgY2hlY2tBbGwgPSByZWYoZmFsc2UpO1xyXG4vLyDlhajpgInlkozlj43pgInlj5HnlJ/lj5jljJbml7bop6blj5FcclxuZnVuY3Rpb24gb25DaGVja0FsbENoYW5nZSh2YWx1ZTogYW55KSB7XHJcbiAgY2hlY2tBbGwudmFsdWUgPSB2YWx1ZTtcclxuICBjdXJyZW50Q29sdW1ucy52YWx1ZSA9IGN1cnJlbnRDb2x1bW5zLnZhbHVlLm1hcCgoZTogYW55KSA9PiB7XHJcbiAgICBpZiAoIWUuX19zaG93IHx8IGUuX19kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm4gZTtcclxuICAgIH1cclxuICAgIGUuc2hvdyA9IHZhbHVlO1xyXG4gICAgcmV0dXJuIGU7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmNvbnN0IGNoZWNrQWxsQmluZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgW3VpLmNoZWNrYm94Lm1vZGVsVmFsdWVdOiBjaGVja0FsbC52YWx1ZSxcclxuICAgIFtcIm9uVXBkYXRlOlwiICsgdWkuY2hlY2tib3gubW9kZWxWYWx1ZV06ICh2OiBhbnkpID0+IHtcclxuICAgICAgb25DaGVja0FsbENoYW5nZSh2KTtcclxuICAgIH1cclxuICB9O1xyXG59KTtcclxuXHJcbmNvbnN0IHNob3dMZW5ndGggPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIGN1cnJlbnRDb2x1bW5zLnZhbHVlLmZpbHRlcigoZTogYW55KSA9PiBlLl9fc2hvdyAmJiBlLnNob3cgPT09IHRydWUpLmxlbmd0aDtcclxufSk7XHJcbmNvbnN0IGFsbExlbmd0aCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gY3VycmVudENvbHVtbnMudmFsdWUuZmlsdGVyKChlOiBhbnkpID0+IGUuX19zaG93KS5sZW5ndGg7XHJcbn0pO1xyXG5jb25zdCBpc0luZGV0ZXJtaW5hdGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIHNob3dMZW5ndGgudmFsdWUgPiAwICYmIHNob3dMZW5ndGgudmFsdWUgPCBhbGxMZW5ndGgudmFsdWU7XHJcbn0pO1xyXG5cclxud2F0Y2goXHJcbiAgKCkgPT4ge1xyXG4gICAgY3VycmVudENvbHVtbnMudmFsdWU7XHJcbiAgfSxcclxuICAoKSA9PiB7XHJcbiAgICBhbGxDaGVja2VkVXBkYXRlKCk7XHJcbiAgfSxcclxuICB7IGltbWVkaWF0ZTogdHJ1ZSB9XHJcbik7XHJcblxyXG4vLyBmaXhlZCDlj5jljJbml7bop6blj5FcclxuZnVuY3Rpb24gZml4ZWRDaGFuZ2UoaW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSkge1xyXG4gIGlmICh2YWx1ZSkge1xyXG4gICAgY3VycmVudENvbHVtbnMudmFsdWVbaW5kZXhdLnNob3cgPSB0cnVlO1xyXG4gIH1cclxuICBpZiAodmFsdWUgPT09IFwibGVmdFwiKSB7XHJcbiAgICBjdXJyZW50Q29sdW1ucy52YWx1ZS51bnNoaWZ0KGN1cnJlbnRDb2x1bW5zLnZhbHVlLnNwbGljZShpbmRleCwgMSlbMF0pO1xyXG4gIH1cclxuICBpZiAodmFsdWUgPT09IFwicmlnaHRcIikge1xyXG4gICAgY3VycmVudENvbHVtbnMudmFsdWUucHVzaChjdXJyZW50Q29sdW1ucy52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpWzBdKTtcclxuICB9XHJcbiAgYWxsQ2hlY2tlZFVwZGF0ZSgpO1xyXG59XHJcbmZ1bmN0aW9uIGFsbENoZWNrZWRVcGRhdGUoKSB7XHJcbiAgY2hlY2tBbGwudmFsdWUgPSBzaG93TGVuZ3RoLnZhbHVlID09PSBhbGxMZW5ndGgudmFsdWU7XHJcbn1cclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLWJ0bnNcIj5cclxuICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxyXG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGJ1dHRvbnNcIiA6a2V5PVwiaW5kZXhcIj5cclxuICAgICAgICA8ZnMtYnV0dG9uIHYtaWY9XCJpdGVtLnNob3dcIiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrPVwiaXRlbS5fY2xpY2soJGV2ZW50KVwiIC8+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8L2NvbXBvbmVudD5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc1NlYXJjaEJ1dHRvbnNcIixcclxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxyXG4gIHByb3BzOiB7XHJcbiAgICBidXR0b25zOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfVxyXG4gIH0sXHJcbiAgc2V0dXAoKSB7XHJcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG4gICAgcmV0dXJuIHsgdWkgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1idG5zXCI+XHJcbiAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIj5cclxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBidXR0b25zXCIgOmtleT1cImluZGV4XCI+XHJcbiAgICAgICAgPGZzLWJ1dHRvbiB2LWlmPVwiaXRlbS5zaG93XCIgdi1iaW5kPVwiaXRlbVwiIEBjbGljaz1cIml0ZW0uX2NsaWNrKCRldmVudClcIiAvPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC9jb21wb25lbnQ+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNTZWFyY2hCdXR0b25zXCIsXHJcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcclxuICBwcm9wczoge1xyXG4gICAgYnV0dG9uczoge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH1cclxuICB9LFxyXG4gIHNldHVwKCkge1xyXG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuICAgIHJldHVybiB7IHVpIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoIGZzLXNlYXJjaC12MlwiPlxyXG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jb2xsYXBzZVRyYW5zaXRpb24ubmFtZVwiPlxyXG4gICAgICA8Y29tcG9uZW50XHJcbiAgICAgICAgOmlzPVwidWkuZm9ybS5uYW1lXCJcclxuICAgICAgICByZWY9XCJzZWFyY2hGb3JtUmVmXCJcclxuICAgICAgICA6bW9kZWw9XCJmb3JtRGF0YVwiXHJcbiAgICAgICAgb25zdWJtaXQ9XCJldmVudC5wcmV2ZW50RGVmYXVsdCgpO1wiXHJcbiAgICAgICAgdi1iaW5kPVwib3B0aW9uc1wiXHJcbiAgICAgICAgOnJ1bGVzPVwiY29tcHV0ZWRSdWxlc1wiXHJcbiAgICAgICAgY2xhc3M9XCJmcy1zZWFyY2gtZm9ybVwiXHJcbiAgICAgID5cclxuICAgICAgICA8Y29tcG9uZW50XHJcbiAgICAgICAgICA6aXM9XCJjb250YWluZXI/LmlzIHx8ICdmcy1zZWFyY2gtbGF5b3V0LWRlZmF1bHQnXCJcclxuICAgICAgICAgIHYtaWY9XCJzaG93ICE9PSBmYWxzZVwiXHJcbiAgICAgICAgICB2LWJpbmQ9XCJjb250YWluZXJcIlxyXG4gICAgICAgICAgOmNvbHVtbnM9XCJjb21wdXRlZENvbHVtbnNcIlxyXG4gICAgICAgICAgOmdldC1jb250ZXh0LWZuPVwiZ2V0Q29udGV4dEZuXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8dGVtcGxhdGUgI3NlYXJjaC1idXR0b25zPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNvbXB1dGVkQnV0dG9uc1wiIDprZXk9XCJpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgPGZzLWJ1dHRvbiB2LWlmPVwiaXRlbS5zaG93ICE9PSBmYWxzZVwiIHYtYmluZD1cIml0ZW1cIiBAY2xpY2s9XCJpdGVtLl9jbGljaygpXCIgLz5cclxuICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzbG90c1snc2VhcmNoLWxlZnQnXVwiICNzZWFyY2gtbGVmdD5cclxuICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtbGVmdCddXCIgOnNjb3BlPVwiZ2V0Q29udGV4dEZuKClcIiAvPlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2xvdHNbJ3NlYXJjaC1taWRkbGUnXVwiICNzZWFyY2gtbWlkZGxlPlxyXG4gICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1taWRkbGUnXVwiIDpzY29wZT1cImdldENvbnRleHRGbigpXCIgLz5cclxuICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cInNsb3RzWydzZWFyY2gtcmlnaHQnXVwiICNzZWFyY2gtcmlnaHQ+XHJcbiAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLXJpZ2h0J11cIiA6c2NvcGU9XCJnZXRDb250ZXh0Rm4oKVwiIC8+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICA8L2NvbXBvbmVudD5cclxuICAgIDwvY29tcG9uZW50PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBsYW5nPVwidHN4XCI+XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCByZWFjdGl2ZSwgcmVmLCBSZWYsIHVucmVmLCB3YXRjaCB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgZm9yRWFjaCwgY2xvbmVEZWVwLCBlYWNoLCBrZXlzLCB1bnNldCwgc2V0LCBzb3J0QnksIGVudHJpZXMsIGRlYm91bmNlLCBnZXQgYXMgTG9kYXNoR2V0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5pbXBvcnQgeyB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtY29tcHV0ZVwiO1xyXG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xyXG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuLi8uLi91dGlscy91dGlsLmxvZ1wiO1xyXG5pbXBvcnQgRnNTZWFyY2hCdXR0b25zIGZyb20gXCIuL2J1dHRvbnMudnVlXCI7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xyXG5pbXBvcnQge1xyXG4gIEJ1dHRvbnNQcm9wcyxcclxuICBTZWFyY2hFdmVudENvbnRleHQsXHJcbiAgU2VhcmNoSXRlbVByb3BzLFxyXG4gIFR5cGVNYXAsXHJcbiAgVmFsdWVDaGFuZ2VDb250ZXh0LFxyXG4gIFZhbHVlQ2hhbmdlSGFuZGxlXHJcbn0gZnJvbSBcIi4uLy4uL2RcIjtcclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS11aVwiO1xyXG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLW1lcmdlXCI7XHJcblxyXG4vKipcclxuICog5p+l6K+i5qGG57uE5Lu2XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNTZWFyY2hcIixcclxuICBjb21wb25lbnRzOiB7IEZzU2VhcmNoQnV0dG9ucyB9LFxyXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5biD5bGA5a655ZmoXHJcbiAgICAgKi9cclxuICAgIGNvbnRhaW5lcjoge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+afpeivouadoeS7tlxyXG4gICAgICog54K55Ye76YeN572u77yM5Lya6YeN572u5oiQ6K+l5p2h5Lu2XHJcbiAgICAgKi9cclxuICAgIGluaXRpYWxGb3JtOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5qCh6aqM5ZCO55qE5p+l6K+i6KGo5Y2V5pWw5o2uXHJcbiAgICAgKi9cclxuICAgIHZhbGlkYXRlZEZvcm06IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDooajljZXlj4LmlbBcclxuICAgICAqIOaUr+aMgWVsLWZvcm0gfCBhLWZvcm3nmoTlsZ7mgKdcclxuICAgICAqL1xyXG4gICAgb3B0aW9uczoge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOafpeivouWtl+autemFjee9rlxyXG4gICAgICovXHJcbiAgICBjb2x1bW5zOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5oyJ6ZKu6YWN572uLOWPr+S7peagueaNrm9yZGVy5o6S5bqPXHJcbiAgICAgKiBge3NlYXJjaDp7Li4uRnNCdXR0b259LHJlc2V0OnsuLi5Gc0J1dHRvbn19YFxyXG4gICAgICovXHJcbiAgICBidXR0b25zOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog54K55Ye76YeN572u5ZCO5piv5ZCm56uL5Y2z6Kem5Y+R5p+l6K+iXHJcbiAgICAgKi9cclxuICAgIHNlYXJjaEFmdGVyUmVzZXQ6IHtcclxuICAgICAgdHlwZTogQm9vbGVhbixcclxuICAgICAgZGVmYXVsdDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5byA5ZCv6Ieq5Yqo5p+l6K+iXHJcbiAgICAgKi9cclxuICAgIGF1dG9TZWFyY2g6IHtcclxuICAgICAgdHlwZTogQm9vbGVhbixcclxuICAgICAgZGVmYXVsdDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog6Ieq5Yqo5p+l6K+i77yM6Ziy5oqW6K6+572uXHJcbiAgICAgKiDkvKBmYWxzZeWImeWFs+mXreiHquWKqOafpeivolxyXG4gICAgICovXHJcbiAgICBkZWJvdW5jZToge1xyXG4gICAgICB0eXBlOiBbQm9vbGVhbiwgT2JqZWN0XSxcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmj5Lmp71cclxuICAgICAqL1xyXG4gICAgc2xvdHM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5pi+56S65p+l6K+i5qGGXHJcbiAgICAgKi9cclxuICAgIHNob3c6IHtcclxuICAgICAgdHlwZTogQm9vbGVhbixcclxuICAgICAgZGVmYXVsdDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5ZCv55So5qCh6aqMXHJcbiAgICAgKi9cclxuICAgIHZhbGlkYXRlOiB7XHJcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5Lu75oSP5YC85Y+Y5YyW5bCx6Kem5Y+R5qCh6aqMXHJcbiAgICAgKi9cclxuICAgIHZhbGlkYXRlT25DaGFuZ2U6IHtcclxuICAgICAgZGVmYXVsdDogdHJ1ZSxcclxuICAgICAgdHlwZTogQm9vbGVhblxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5YiX55qE5a695bqm6K6+572u77yMc3Bhbj14eFxyXG4gICAgICovXHJcbiAgICBjb2w6IHt9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog57uf5LiA5a2X5q6155qEZm9ybUl0ZW3lsZ7mgKdcclxuICAgICAqL1xyXG4gICAgZm9ybUl0ZW06IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH1cclxuICB9LFxyXG4gIGVtaXRzOiBbXHJcbiAgICAvKipcclxuICAgICAqIOafpeivouS6i+S7tlxyXG4gICAgICoqL1xyXG4gICAgXCJzZWFyY2hcIixcclxuICAgIC8qKlxyXG4gICAgICog5p+l6K+i5LqL5Lu277yM5q2k5LqL5Lu25L6b57O757uf6LCD55SoXHJcbiAgICAgKi9cclxuICAgIFwiX3NlYXJjaFwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiDph43nva7kuovku7bvvIzkvpvnlKjmiLfkvb/nlKhcclxuICAgICAqKi9cclxuICAgIFwicmVzZXRcIixcclxuICAgIC8qKlxyXG4gICAgICog6YeN572u5LqL5Lu277yM5q2k5LqL5Lu25L6b57O757uf6LCD55SoXHJcbiAgICAgKi9cclxuICAgIFwiX3Jlc2V0XCIsXHJcbiAgICAvKipcclxuICAgICAqIOagoemqjOWksei0peS6i+S7tlxyXG4gICAgICovXHJcbiAgICBcInZhbGlkYXRlLWVycm9yXCIsXHJcbiAgICAvKipcclxuICAgICAqIOagoemqjOWQjueahOihqOWNleaVsOaNruWPmOWMllxyXG4gICAgICovXHJcbiAgICBcInVwZGF0ZTp2YWxpZGF0ZWRGb3JtXCJcclxuICBdLFxyXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eDogYW55KSB7XHJcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcclxuICAgIGNvbnN0IGRvTWVyZ2UgPSBtZXJnZTtcclxuICAgIGNvbnN0IHsgZG9Db21wdXRlZCwgQXN5bmNDb21wdXRlVmFsdWUsIENvbXB1dGVWYWx1ZSB9ID0gdXNlQ29tcHV0ZSgpO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxyXG4gICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS52YWx1ZSAhPSBudWxsICYmIChpdGVtLnZhbHVlIGluc3RhbmNlb2YgQXN5bmNDb21wdXRlVmFsdWUgfHwgaXRlbS52YWx1ZSBpbnN0YW5jZW9mIENvbXB1dGVWYWx1ZSkpIHtcclxuICAgICAgICBsb2dnZXIud2FybihcInNlYXJjaC52YWx1ZemFjee9ruS4jeaUr+aMgUNvbXB1dGVWYWx1ZS9Bc3luY0NvbXB1dGXnsbvlnovnmoTliqjmgIHorqHnrpdcIik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxGb3JtKCk6IGFueSB7XHJcbiAgICAgIC8v6buY6K6k5YC8XHJcbiAgICAgIGNvbnN0IGZvcm06IGFueSA9IHt9O1xyXG5cclxuICAgICAgZm9yRWFjaChwcm9wcy5jb2x1bW5zLCAoY29sdW1uLCBrZXkpID0+IHtcclxuICAgICAgICBpZiAoY29sdW1uLnZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGVmVmFsdWUgPSB1bnJlZihjb2x1bW4udmFsdWUpO1xyXG4gICAgICAgIGlmIChkZWZWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbi5zaG93ICE9PSBmYWxzZSAmJiBjb2x1bW4uY29tcG9uZW50Py5zaG93ICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgLy/pu5jorqTlgLxcclxuICAgICAgICAgIGZvcm1ba2V5XSA9IGRlZlZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gY2xvbmVEZWVwKG1lcmdlKHt9LCBwcm9wcy5pbml0aWFsRm9ybSwgZm9ybSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZvcm1EYXRhID0gcmVhY3RpdmUoY3JlYXRlSW5pdGlhbEZvcm0oKSk7XHJcblxyXG4gICAgbGV0IGF1dG9TZWFyY2g6IGFueSA9IG51bGw7XHJcblxyXG4gICAgY29uc3QgY29tcHV0ZWRDb2x1bW5zOiBSZWY8VHlwZU1hcDxTZWFyY2hJdGVtUHJvcHM+PiA9IGRvQ29tcHV0ZWQoXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICByZXR1cm4gcHJvcHMuY29sdW1ucztcclxuICAgICAgfSxcclxuICAgICAgZ2V0Q29udGV4dEZuLFxyXG4gICAgICBudWxsLFxyXG4gICAgICAoY29sdW1uczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSBjbG9uZURlZXAocHJvcHMuZm9ybUl0ZW0gfHwge30pO1xyXG4gICAgICAgIGZvckVhY2goY29sdW1ucywgKGl0ZW0pID0+IHtcclxuICAgICAgICAgIG1lcmdlKGl0ZW0sIGZvcm1JdGVtLCBpdGVtKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBjb2x1bW5zID0gbWVyZ2UoZm9ybUl0ZW0sIGNvbHVtbnMpO1xyXG4gICAgICAgIGlmICghcHJvcHMudmFsaWRhdGUpIHtcclxuICAgICAgICAgIC8v5aaC5p6c5YWz6ZetdmFsaWRhdGXliJnljrvmjolydWxlc1xyXG4gICAgICAgICAgZm9yRWFjaChjb2x1bW5zLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgaXRlbS5ydWxlcztcclxuICAgICAgICAgICAgZGVsZXRlIGl0ZW0ucnVsZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDlkIjlubZjb2xcclxuICAgICAgICBpZiAocHJvcHMuY29sKSB7XHJcbiAgICAgICAgICBmb3JFYWNoKGNvbHVtbnMsICh2KSA9PiB7XHJcbiAgICAgICAgICAgIHYuY29sID0gbWVyZ2Uoe30sIHByb3BzLmNvbCwgdi5jb2wpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2NlbGxSZW5kZXJcclxuICAgICAgICBmb3JFYWNoKGNvbHVtbnMsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBpdGVtLl9jZWxsUmVuZGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gY2VsbFJlbmRlcihpdGVtKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8v5a2X5q615o6S5bqPXHJcbiAgICAgICAgbGV0IHNvcnRBcnI6IFNlYXJjaEl0ZW1Qcm9wc1tdID0gW107XHJcbiAgICAgICAgZm9yRWFjaChjb2x1bW5zLCAodiwga2V5KSA9PiB7XHJcbiAgICAgICAgICB2Ll9rZXkgPSBrZXk7XHJcbiAgICAgICAgICBzb3J0QXJyLnB1c2godik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc29ydEFyciA9IHNvcnRCeShzb3J0QXJyLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3Qgc29ydGVkQ29sdW1uczoge1xyXG4gICAgICAgICAgW2tleTogc3RyaW5nXTogU2VhcmNoSXRlbVByb3BzO1xyXG4gICAgICAgIH0gPSB7fTtcclxuXHJcbiAgICAgICAgc29ydEFyci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBsZXQgX2tleSA9IGl0ZW0uX2tleTtcclxuICAgICAgICAgIGRlbGV0ZSBpdGVtLl9rZXk7XHJcbiAgICAgICAgICBzb3J0ZWRDb2x1bW5zW19rZXldID0gaXRlbTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gc29ydGVkQ29sdW1ucztcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBmdW5jdGlvbiBvbkZvcm1WYWxpZGF0ZWQoKSB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRlZEZvcm0gPSBjbG9uZURlZXAoZm9ybURhdGEpO1xyXG4gICAgICBjdHguZW1pdChcInVwZGF0ZTp2YWxpZGF0ZWRGb3JtXCIsIHZhbGlkYXRlZEZvcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIHdhdGNoKFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHByb3BzLnZhbGlkYXRlZEZvcm07XHJcbiAgICAgIH0sXHJcbiAgICAgICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybURhdGEpIHtcclxuICAgICAgICAgIGRlbGV0ZSBmb3JtRGF0YVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBtZXJnZShmb3JtRGF0YSwgdmFsdWUgfHwge30pO1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgZGVlcDogdHJ1ZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGdldCA9IChmb3JtOiBhbnksIGtleTogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBMb2Rhc2hHZXQoZm9ybSwga2V5KTtcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gc3BsaXRLZXkoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgaWYgKGtleSA9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChrZXkuaW5kZXhPZihcIi5cIikgPj0gMCkge1xyXG4gICAgICAgIHJldHVybiBrZXkuc3BsaXQoXCIuXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY29uc3QgZGVib3VuY2VWYWxpZGF0ZSA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcclxuICAgIC8vICAgaWYgKGF3YWl0IGRvVmFsaWRhdGUoKSkge1xyXG4gICAgLy8gICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9LCA1MDApO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNlbGxSZW5kZXIoaXRlbTogYW55KSB7XHJcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xyXG5cclxuICAgICAgYXN5bmMgZnVuY3Rpb24gX29uVXBkYXRlTW9kZWxWYWx1ZSgkZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIC8vIGF3YWl0IGRlYm91bmNlVmFsaWRhdGUoKTtcclxuICAgICAgICBvblZhbHVlQ2hhbmdlZCgkZXZlbnQsIGl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBfb25JbnB1dCgpIHtcclxuICAgICAgICBvbklucHV0KGl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBvbktleXVwKGl0ZW06IGFueSwga2V5OiBhbnkpIHtcclxuICAgICAgICBpZiAoa2V5LmNvZGUgPT09IFwiRW50ZXJcIikge1xyXG4gICAgICAgICAgaWYgKGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgIT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgZG9TZWFyY2goKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBkZWZhdWx0U2xvdDogYW55ID0gbnVsbDtcclxuICAgICAgaWYgKHByb3BzLnNsb3RzW1wic2VhcmNoX1wiICsga2V5XSkge1xyXG4gICAgICAgIGRlZmF1bHRTbG90ID0gPGZzLXNsb3QtcmVuZGVyIHNsb3RzPXtwcm9wcy5zbG90c1tcInNlYXJjaF9cIiArIGtleV19IHNjb3BlPXtidWlsZEZpZWxkQ29udGV4dChrZXkpfSAvPjtcclxuICAgICAgfSBlbHNlIGlmIChpdGVtLnJlbmRlcikge1xyXG4gICAgICAgIGRlZmF1bHRTbG90ID0gPGZzLXJlbmRlciByZW5kZXItZnVuYz17aXRlbS5yZW5kZXJ9IHNjb3BlPXtidWlsZEZpZWxkQ29udGV4dChrZXkpfSAvPjtcclxuICAgICAgfSBlbHNlIGlmIChpdGVtLmNvbXBvbmVudCAmJiBpdGVtLmNvbXBvbmVudC5zaG93ICE9PSBmYWxzZSkge1xyXG4gICAgICAgIGRlZmF1bHRTbG90ID0gKFxyXG4gICAgICAgICAgPGZzLWNvbXBvbmVudC1yZW5kZXJcclxuICAgICAgICAgICAgcmVmPXsodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbXBvbmVudFJlbmRlclJlZnMudmFsdWVba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICBtb2RlbC12YWx1ZT17Z2V0KGZvcm1EYXRhLCBrZXkpfVxyXG4gICAgICAgICAgICBvbktleXVwPXsoJGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBvbktleXVwKGl0ZW0sICRldmVudCk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIHsuLi5pdGVtLmNvbXBvbmVudH1cclxuICAgICAgICAgICAgc2NvcGU9e2J1aWxkRmllbGRDb250ZXh0KGtleSl9XHJcbiAgICAgICAgICAgIG9uVXBkYXRlOm1vZGVsVmFsdWU9e19vblVwZGF0ZU1vZGVsVmFsdWV9XHJcbiAgICAgICAgICAgIG9uSW5wdXQ9e19vbklucHV0fVxyXG4gICAgICAgICAgICBvbkNvbXBvc2l0aW9uc3RhcnQ9eygpID0+IHtcclxuICAgICAgICAgICAgICBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIG9uQ29tcG9zaXRpb25lbmQ9eygpID0+IHtcclxuICAgICAgICAgICAgICBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzcGxpdGVkS2V5ID0gc3BsaXRLZXkoa2V5KTtcclxuXHJcbiAgICAgIHJldHVybiB1aS5mb3JtSXRlbS5yZW5kZXIoe1xyXG4gICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgbGFiZWw6IGl0ZW0udGl0bGUsXHJcbiAgICAgICAgICBbdWkuZm9ybUl0ZW0ucHJvcF06IHNwbGl0ZWRLZXksXHJcbiAgICAgICAgICBwYXRoOiBrZXksXHJcbiAgICAgICAgICBydWxlUGF0aDoga2V5XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzbG90czoge1xyXG4gICAgICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRTbG90O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VhcmNoRm9ybVJlZiA9IHJlZigpO1xyXG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XHJcbiAgICBjb25zdCBjb21wb25lbnRSZW5kZXJSZWZzOiBSZWYgPSByZWYoe30pO1xyXG5cclxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudFJlbmRlclJlZihrZXk6IHN0cmluZykge1xyXG4gICAgICByZXR1cm4gY29tcG9uZW50UmVuZGVyUmVmcy52YWx1ZVtrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudFJlZihrZXk6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgIHJldHVybiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5KT8uZ2V0VGFyZ2V0UmVmKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Q29udGV4dEZuKCk6IFNlYXJjaEV2ZW50Q29udGV4dCB7XHJcbiAgICAgIHJldHVybiB7IGZvcm06IGZvcm1EYXRhLCB2YWxpZGF0ZWRGb3JtOiBwcm9wcy52YWxpZGF0ZWRGb3JtLCBnZXRDb21wb25lbnRSZWYsIGRvU2VhcmNoLCBkb1Jlc2V0LCBkb1ZhbGlkYXRlIH07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gYnVpbGRGaWVsZENvbnRleHQoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgcmV0dXJuIHsgLi4uZ2V0Q29udGV4dEZuKCksIGtleSwgdmFsdWU6IGdldChmb3JtRGF0YSwga2V5KSB9O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvVmFsaWRhdGUoc2lsZW50OiBib29sZWFuID0gZmFsc2UsIHRyaWdnZXI6IHN0cmluZyA9IFwic2VhcmNoXCIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAocHJvcHMudmFsaWRhdGUpIHtcclxuICAgICAgICAgIGF3YWl0IHVpLmZvcm0udmFsaWRhdGVXcmFwKHNlYXJjaEZvcm1SZWYudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcclxuICAgICAgICAgIGN0eC5lbWl0KFwidmFsaWRhdGUtZXJyb3JcIiwgeyAuLi5nZXRDb250ZXh0Rm4oKSwgZXJyb3I6IGUsIHRyaWdnZXIgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmdW5jdGlvbiBkb1NlYXJjaCgpIHtcclxuICAgICAgaWYgKGF1dG9TZWFyY2gpIHtcclxuICAgICAgICAvLyDpmLLmipbmn6Xor6Llj5bmtohcclxuICAgICAgICBhdXRvU2VhcmNoLmNhbmNlbCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYXdhaXQgZG9WYWxpZGF0ZSgpKSB7XHJcbiAgICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XHJcbiAgICAgICAgYXdhaXQgbmV4dFRpY2soKTtcclxuICAgICAgICBjdHguZW1pdChcIl9zZWFyY2hcIiwgZ2V0Q29udGV4dEZuKCkpO1xyXG4gICAgICAgIGN0eC5lbWl0KFwic2VhcmNoXCIsIGdldENvbnRleHRGbigpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvUmVzZXQoKSB7XHJcbiAgICAgIC8vIHVpLmZvcm0ucmVzZXRXcmFwKHNlYXJjaEZvcm1SZWYudmFsdWUsIHsgZm9ybSwgaW5pdGlhbEZvcm06IGNyZWF0ZUluaXRpYWxGb3JtKCkgfSk7XHJcbiAgICAgIGNvbnN0IGluaXRpYWxGb3JtID0gY3JlYXRlSW5pdGlhbEZvcm0oKTtcclxuICAgICAgY29uc3QgZW50cmllc1JldCA9IGVudHJpZXMoZm9ybURhdGEpO1xyXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXNSZXQpIHtcclxuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBnZXQoaW5pdGlhbEZvcm0sIGVudHJ5WzBdKTtcclxuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgIHVuc2V0KGZvcm1EYXRhLCBlbnRyeVswXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNldChmb3JtRGF0YSwgZW50cnlbMF0sIGluaXRpYWxWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYXdhaXQgZG9WYWxpZGF0ZSgpKSB7XHJcbiAgICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XHJcbiAgICAgICAgYXdhaXQgbmV4dFRpY2soKTtcclxuICAgICAgICBpZiAocHJvcHMucmVzZXQpIHtcclxuICAgICAgICAgIHByb3BzLnJlc2V0KGdldENvbnRleHRGbigpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g6KGo5Y2V6YeN572u5LqL5Lu2XHJcbiAgICAgICAgY3R4LmVtaXQoXCJfcmVzZXRcIiwgZ2V0Q29udGV4dEZuKCkpO1xyXG4gICAgICAgIGN0eC5lbWl0KFwicmVzZXRcIiwgZ2V0Q29udGV4dEZuKCkpO1xyXG4gICAgICAgIGlmIChwcm9wcy5zZWFyY2hBZnRlclJlc2V0KSB7XHJcbiAgICAgICAgICBkb1NlYXJjaCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkQnV0dG9ucyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgY29uc3QgYnRuczogYW55ID0gW107XHJcbiAgICAgIGNvbnN0IGRlZkJ0bk9wdGlvbnM6IEJ1dHRvbnNQcm9wczxTZWFyY2hFdmVudENvbnRleHQ+ID0ge1xyXG4gICAgICAgIHNlYXJjaDoge1xyXG4gICAgICAgICAgc2hvdzogdHJ1ZSxcclxuICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgICAgICAgY2xpY2s6IChjb250ZXh0OiBTZWFyY2hFdmVudENvbnRleHQpID0+IHtcclxuICAgICAgICAgICAgZG9TZWFyY2goKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvcmRlcjogMSxcclxuICAgICAgICAgIHRleHQ6IHQoXCJmcy5zZWFyY2guc2VhcmNoLnRleHRcIikgLy8gJ+afpeivoicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXNldDoge1xyXG4gICAgICAgICAgc2hvdzogdHJ1ZSxcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgICAgICAgIGNsaWNrOiAoY29udGV4dDogU2VhcmNoRXZlbnRDb250ZXh0KSA9PiB7XHJcbiAgICAgICAgICAgIGRvUmVzZXQoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB0ZXh0OiB0KFwiZnMuc2VhcmNoLnJlc2V0LnRleHRcIiksIC8vICfph43nva4nLFxyXG4gICAgICAgICAgb3JkZXI6IDJcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIG1lcmdlKGRlZkJ0bk9wdGlvbnMsIHByb3BzLmJ1dHRvbnMpO1xyXG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGVmQnRuT3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGJ0biA9IGRlZkJ0bk9wdGlvbnNba2V5XTtcclxuICAgICAgICBidG4uX2NsaWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgYnRuLmNsaWNrKGdldENvbnRleHRGbigpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGJ0bnMucHVzaChidG4pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBidG5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGJ0bnM7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmdW5jdGlvbiBpbml0QXV0b1NlYXJjaCgpIHtcclxuICAgICAgaWYgKHByb3BzLmF1dG9TZWFyY2ggPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOaehOW7uumYsuaKluafpeivouWHveaVsFxyXG4gICAgICBpZiAocHJvcHMuZGVib3VuY2UgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IHdhaXQgPSBwcm9wcy5kZWJvdW5jZT8ud2FpdCB8fCA1MDA7XHJcbiAgICAgICAgYXV0b1NlYXJjaCA9IGRlYm91bmNlKGRvU2VhcmNoLCB3YWl0LCBwcm9wcy5kZWJvdW5jZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0QXV0b1NlYXJjaCgpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGdldEZvcm0oKSB7XHJcbiAgICAgIHJldHVybiBmb3JtRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRWYWxpZGF0ZWRGb3JtKCkge1xyXG4gICAgICByZXR1cm4gcHJvcHMudmFsaWRhdGVkRm9ybTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiuvue9rmZvcm3lgLxcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gc2V0Rm9ybShuZXdGb3JtOiBhbnksIG1lcmdlID0gdHJ1ZSkge1xyXG4gICAgICBpZiAoIW1lcmdlKSB7XHJcbiAgICAgICAgZWFjaChrZXlzKGZvcm1EYXRhKSwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGRlbGV0ZSBmb3JtRGF0YVtpdGVtXTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBkb01lcmdlKGZvcm1EYXRhLCBuZXdGb3JtKTtcclxuICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5wdXRFdmVudERpc2FibGVkID0gcmVmKGZhbHNlKTtcclxuXHJcbiAgICBjb25zdCBkb0F1dG9TZWFyY2ggPSAoKSA9PiB7XHJcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImRvIGF1dG8gc2VhcmNoLGlucHV0RXZlbnREaXNhYmxlZDpcIiwgaW5wdXRFdmVudERpc2FibGVkLnZhbHVlKTtcclxuICAgICAgaWYgKGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSAhPT0gdHJ1ZSAmJiBhdXRvU2VhcmNoKSB7XHJcbiAgICAgICAgLy8g6Ziy5oqW5p+l6K+iXHJcbiAgICAgICAgYXV0b1NlYXJjaCgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IG9uSW5wdXQgPSAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSBcImlucHV0XCIpIHtcclxuICAgICAgICBkb0F1dG9TZWFyY2goKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8vIOi+k+WFpeazleebkeWQrFxyXG4gICAgY29uc3QgY2hhbmdlSW5wdXRFdmVudERpc2FibGVkID0gKGRpc2FibGVkOiBib29sZWFuKSA9PiB7XHJcbiAgICAgIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSA9IGRpc2FibGVkO1xyXG4gICAgICBjb25zb2xlLmxvZyhcImNoYW5nZUlucHV0RXZlbnREaXNhYmxlZDpcIiwgZGlzYWJsZWQpO1xyXG4gICAgfTtcclxuXHJcbiAgICBhc3luYyBmdW5jdGlvbiBvblZhbHVlQ2hhbmdlZCh2YWx1ZTogYW55LCBpdGVtOiBTZWFyY2hJdGVtUHJvcHMpIHtcclxuICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXk7XHJcbiAgICAgIHNldChmb3JtRGF0YSwga2V5LCB2YWx1ZSk7XHJcblxyXG4gICAgICBjb25zdCBzaWxlbnQgPSBwcm9wcy52YWxpZGF0ZU9uQ2hhbmdlU2lsZW50O1xyXG4gICAgICAvLyBpZiAocHJvcHMudmFsaWRhdGVPbkNoYW5nZSAmJiAoYXdhaXQgZG9WYWxpZGF0ZShzaWxlbnQsIFwiY2hhbmdlXCIpKSkge1xyXG4gICAgICAvLyAgIG9uRm9ybVZhbGlkYXRlZCgpO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICBpZiAoaXRlbS52YWx1ZUNoYW5nZSkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybURhdGFba2V5XTtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBnZXRDb21wb25lbnRSZWYoa2V5KTtcclxuICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZTogVmFsdWVDaGFuZ2VIYW5kbGUgPVxyXG4gICAgICAgICAgaXRlbS52YWx1ZUNoYW5nZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gaXRlbS52YWx1ZUNoYW5nZSA6IGl0ZW0udmFsdWVDaGFuZ2UuaGFuZGxlO1xyXG4gICAgICAgIGNvbnN0IHNjb3BlID0gZ2V0Q29udGV4dEZuKCk7XHJcbiAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2VDb250ZXh0OiBWYWx1ZUNoYW5nZUNvbnRleHQgPSB7XHJcbiAgICAgICAgICBpbmRleDogMCxcclxuICAgICAgICAgIHJvdzogc2NvcGUuZm9ybSxcclxuICAgICAgICAgIGZvcm06IHNjb3BlLmZvcm0sXHJcbiAgICAgICAgICAuLi5zY29wZSxcclxuICAgICAgICAgIGtleSxcclxuICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgY29tcG9uZW50UmVmLFxyXG4gICAgICAgICAgaW1tZWRpYXRlOiBmYWxzZSxcclxuICAgICAgICAgIGdldENvbXBvbmVudFJlZixcclxuICAgICAgICAgIG1vZGU6IFwic2VhcmNoXCJcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhbHVlQ2hhbmdlKHZhbHVlQ2hhbmdlQ29udGV4dCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gVE9ETyDnlLHkuo52YWxpZGF0ZWRGb3JtIOWPkeWwhOWHuuWOu+WQju+8jOS8muabtOaWsGZvcm1EYXRh55qE5pWw5o2u77yM5omA5Lul6KaB5pS+5ZyodmFsdWVDaGFuZ2XlkI7pnaIs5LiN54S25Lya5q275b6q546vXHJcbiAgICAgIGlmIChwcm9wcy52YWxpZGF0ZU9uQ2hhbmdlICYmIChhd2FpdCBkb1ZhbGlkYXRlKHNpbGVudCwgXCJjaGFuZ2VcIikpKSB7XHJcbiAgICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc29sZS5sb2coXCJpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyOlwiLCBpdGVtLCBpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUpO1xyXG4gICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PSBudWxsIHx8IGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IHRydWUgfHwgaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJjaGFuZ2VcIikge1xyXG4gICAgICAgIGRvQXV0b1NlYXJjaCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29tcHV0ZWRSdWxlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgaWYgKCFwcm9wcy52YWxpZGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcHJvcHMub3B0aW9ucy5ydWxlcztcclxuICAgIH0pO1xyXG5cclxuICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZ2V0LFxyXG4gICAgICB1aSxcclxuICAgICAgb25WYWx1ZUNoYW5nZWQsXHJcbiAgICAgIGRvVmFsaWRhdGUsXHJcbiAgICAgIGRvU2VhcmNoLFxyXG4gICAgICBkb1Jlc2V0LFxyXG4gICAgICBmb3JtRGF0YSxcclxuICAgICAgY29tcG9uZW50UmVuZGVyUmVmcyxcclxuICAgICAgZ2V0Q29tcG9uZW50UmVuZGVyUmVmLFxyXG4gICAgICBnZXRDb21wb25lbnRSZWYsXHJcbiAgICAgIGdldEZvcm0sXHJcbiAgICAgIGdldFZhbGlkYXRlZEZvcm0sXHJcbiAgICAgIHNldEZvcm0sXHJcbiAgICAgIHNlYXJjaEZvcm1SZWYsXHJcbiAgICAgIG9uSW5wdXQsXHJcbiAgICAgIGlucHV0RXZlbnREaXNhYmxlZCxcclxuICAgICAgY2hhbmdlSW5wdXRFdmVudERpc2FibGVkLFxyXG4gICAgICBjb21wdXRlZENvbHVtbnMsXHJcbiAgICAgIGNvbXB1dGVkQnV0dG9ucyxcclxuICAgICAgY29tcHV0ZWRSdWxlcyxcclxuICAgICAgYnVpbGRGaWVsZENvbnRleHQsXHJcbiAgICAgIGdldENvbnRleHRGblxyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi5mcy1zZWFyY2gge1xyXG4gICYuZnMtc2VhcmNoLXYyIHtcclxuICAgIC8vZGlzcGxheTogZmxleDtcclxuICAgIC8vZmxleC13cmFwOiBub3dyYXA7XHJcbiAgICAuZnMtc2VhcmNoLWJ1dHRvbnMge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgfVxyXG4gICAgLnNlYXJjaC1sZWZ0IHtcclxuICAgIH1cclxuXHJcbiAgICAuc2VhcmNoLXJpZ2h0IHtcclxuICAgICAgZmxleDogMTtcclxuICAgIH1cclxuXHJcbiAgICAuYW50LWZvcm0taW5saW5lIHtcclxuICAgICAgZmxleC13cmFwOiB3cmFwO1xyXG4gICAgfVxyXG5cclxuICAgIC5mcy1zZWFyY2gtZm9ybSB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcclxuXHJcbiAgICAgIC5hbnQtcGlja2VyLFxyXG4gICAgICAuYW50LXNlbGVjdCxcclxuICAgICAgLm4tZGF0ZS1waWNrZXIsXHJcbiAgICAgIC5lbC1zZWxlY3QsXHJcbiAgICAgIC5lbC1kYXRlLWVkaXRvciB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5lbC1yYW5nZS1lZGl0b3IuZWwtaW5wdXRfX3dyYXBwZXIge1xyXG4gICAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5hbnQtYnRuLWxvYWRpbmctaWNvbiB7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBtYXJnaW4tbGVmdDogMnB4O1xyXG4gICAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmLmVsLWZvcm0tLWxhYmVsLXRvcCB7XHJcbiAgICAgICAgLmVsLWZvcm0taXRlbSB7XHJcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5lbC1mb3JtLWl0ZW0ge1xyXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcclxuICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmLmVsLWZvcm0tLWlubGluZSB7XHJcbiAgICAgICAgLmVsLWlucHV0IHtcclxuICAgICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLmVsLWZvcm0taXRlbV9fY29udGVudCB7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLmZzLXNlYXJjaC1jb2wge1xyXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgIC8vIGFudGR2XHJcbiAgICAgIC5hbnQtZm9ybS1pdGVtLWV4cGxhaW4sXHJcbiAgICAgIC5lbC1mb3JtLWl0ZW1fX2Vycm9yIHtcclxuICAgICAgICBmbG9hdDogbGVmdDtcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgYm90dG9tOiAzcHg7XHJcbiAgICAgICAgcmlnaHQ6IDhweDtcclxuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxuICAgICAgICB0b3A6IGF1dG87XHJcbiAgICAgICAgbGVmdDogYXV0bztcclxuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5lbC1mb3JtLWl0ZW1fX2Vycm9yIHtcclxuICAgICAgICBib3R0b206IDEwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICY6aG92ZXIge1xyXG4gICAgICAgIC5hbnQtZm9ybS1pdGVtLWV4cGxhaW4sXHJcbiAgICAgICAgLmVsLWZvcm0taXRlbV9fZXJyb3Ige1xyXG4gICAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC5uLWZvcm0taXRlbS1ibGFuayB7XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgKG1heC13aWR0aDogNTc1cHgpIHtcclxuICAuZnMtc2VhcmNoIHtcclxuICAgIC5mcy1zZWFyY2gtZm9ybSB7XHJcbiAgICAgIC5mcy1zZWFyY2gtY29sIHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgZmxleDogMTAwJTtcclxuICAgICAgICAvL2FudGR2XHJcbiAgICAgICAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xyXG4gICAgICAgICAgd2lkdGg6IDEyMHB4O1xyXG4gICAgICAgICAgZmxleDogbm9uZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLmFudC1mb3JtLWl0ZW0tY29udHJvbCB7XHJcbiAgICAgICAgICBmbGV4OiAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaCBmcy1zZWFyY2gtdjJcIj5cclxuICAgIDxjb21wb25lbnQgOmlzPVwidWkuY29sbGFwc2VUcmFuc2l0aW9uLm5hbWVcIj5cclxuICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgIDppcz1cInVpLmZvcm0ubmFtZVwiXHJcbiAgICAgICAgcmVmPVwic2VhcmNoRm9ybVJlZlwiXHJcbiAgICAgICAgOm1vZGVsPVwiZm9ybURhdGFcIlxyXG4gICAgICAgIG9uc3VibWl0PVwiZXZlbnQucHJldmVudERlZmF1bHQoKTtcIlxyXG4gICAgICAgIHYtYmluZD1cIm9wdGlvbnNcIlxyXG4gICAgICAgIDpydWxlcz1cImNvbXB1dGVkUnVsZXNcIlxyXG4gICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLWZvcm1cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgOmlzPVwiY29udGFpbmVyPy5pcyB8fCAnZnMtc2VhcmNoLWxheW91dC1kZWZhdWx0J1wiXHJcbiAgICAgICAgICB2LWlmPVwic2hvdyAhPT0gZmFsc2VcIlxyXG4gICAgICAgICAgdi1iaW5kPVwiY29udGFpbmVyXCJcclxuICAgICAgICAgIDpjb2x1bW5zPVwiY29tcHV0ZWRDb2x1bW5zXCJcclxuICAgICAgICAgIDpnZXQtY29udGV4dC1mbj1cImdldENvbnRleHRGblwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHRlbXBsYXRlICNzZWFyY2gtYnV0dG9ucz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1idXR0b25zXCI+XHJcbiAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjb21wdXRlZEJ1dHRvbnNcIiA6a2V5PVwiaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIDxmcy1idXR0b24gdi1pZj1cIml0ZW0uc2hvdyAhPT0gZmFsc2VcIiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrPVwiaXRlbS5fY2xpY2soKVwiIC8+XHJcbiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2xvdHNbJ3NlYXJjaC1sZWZ0J11cIiAjc2VhcmNoLWxlZnQ+XHJcbiAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLWxlZnQnXVwiIDpzY29wZT1cImdldENvbnRleHRGbigpXCIgLz5cclxuICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cInNsb3RzWydzZWFyY2gtbWlkZGxlJ11cIiAjc2VhcmNoLW1pZGRsZT5cclxuICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtbWlkZGxlJ11cIiA6c2NvcGU9XCJnZXRDb250ZXh0Rm4oKVwiIC8+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzbG90c1snc2VhcmNoLXJpZ2h0J11cIiAjc2VhcmNoLXJpZ2h0PlxyXG4gICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1yaWdodCddXCIgOnNjb3BlPVwiZ2V0Q29udGV4dEZuKClcIiAvPlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICA8L2NvbXBvbmVudD5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgbGFuZz1cInRzeFwiPlxyXG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBuZXh0VGljaywgcmVhY3RpdmUsIHJlZiwgUmVmLCB1bnJlZiwgd2F0Y2ggfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IGZvckVhY2gsIGNsb25lRGVlcCwgZWFjaCwga2V5cywgdW5zZXQsIHNldCwgc29ydEJ5LCBlbnRyaWVzLCBkZWJvdW5jZSwgZ2V0IGFzIExvZGFzaEdldCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcclxuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcclxuaW1wb3J0IGxvZ2dlciBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5sb2dcIjtcclxuaW1wb3J0IEZzU2VhcmNoQnV0dG9ucyBmcm9tIFwiLi9idXR0b25zLnZ1ZVwiO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcclxuaW1wb3J0IHtcclxuICBCdXR0b25zUHJvcHMsXHJcbiAgU2VhcmNoRXZlbnRDb250ZXh0LFxyXG4gIFNlYXJjaEl0ZW1Qcm9wcyxcclxuICBUeXBlTWFwLFxyXG4gIFZhbHVlQ2hhbmdlQ29udGV4dCxcclxuICBWYWx1ZUNoYW5nZUhhbmRsZVxyXG59IGZyb20gXCIuLi8uLi9kXCI7XHJcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtdWlcIjtcclxuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1tZXJnZVwiO1xyXG5cclxuLyoqXHJcbiAqIOafpeivouahhue7hOS7tlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzU2VhcmNoXCIsXHJcbiAgY29tcG9uZW50czogeyBGc1NlYXJjaEJ1dHRvbnMgfSxcclxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxyXG4gIHByb3BzOiB7XHJcbiAgICAvKipcclxuICAgICAqIOW4g+WxgOWuueWZqFxyXG4gICAgICovXHJcbiAgICBjb250YWluZXI6IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDliJ3lp4vmn6Xor6LmnaHku7ZcclxuICAgICAqIOeCueWHu+mHjee9ru+8jOS8mumHjee9ruaIkOivpeadoeS7tlxyXG4gICAgICovXHJcbiAgICBpbml0aWFsRm9ybToge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOagoemqjOWQjueahOafpeivouihqOWNleaVsOaNrlxyXG4gICAgICovXHJcbiAgICB2YWxpZGF0ZWRGb3JtOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog6KGo5Y2V5Y+C5pWwXHJcbiAgICAgKiDmlK/mjIFlbC1mb3JtIHwgYS1mb3Jt55qE5bGe5oCnXHJcbiAgICAgKi9cclxuICAgIG9wdGlvbnM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmn6Xor6LlrZfmrrXphY3nva5cclxuICAgICAqL1xyXG4gICAgY29sdW1uczoge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaMiemSrumFjee9rizlj6/ku6XmoLnmja5vcmRlcuaOkuW6j1xyXG4gICAgICogYHtzZWFyY2g6ey4uLkZzQnV0dG9ufSxyZXNldDp7Li4uRnNCdXR0b259fWBcclxuICAgICAqL1xyXG4gICAgYnV0dG9uczoge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOeCueWHu+mHjee9ruWQjuaYr+WQpueri+WNs+inpuWPkeafpeivolxyXG4gICAgICovXHJcbiAgICBzZWFyY2hBZnRlclJlc2V0OiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuW8gOWQr+iHquWKqOafpeivolxyXG4gICAgICovXHJcbiAgICBhdXRvU2VhcmNoOiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOiHquWKqOafpeivou+8jOmYsuaKluiuvue9rlxyXG4gICAgICog5LygZmFsc2XliJnlhbPpl63oh6rliqjmn6Xor6JcclxuICAgICAqL1xyXG4gICAgZGVib3VuY2U6IHtcclxuICAgICAgdHlwZTogW0Jvb2xlYW4sIE9iamVjdF0sXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5o+S5qe9XHJcbiAgICAgKi9cclxuICAgIHNsb3RzOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuaYvuekuuafpeivouahhlxyXG4gICAgICovXHJcbiAgICBzaG93OiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuWQr+eUqOagoemqjFxyXG4gICAgICovXHJcbiAgICB2YWxpZGF0ZToge1xyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuS7u+aEj+WAvOWPmOWMluWwseinpuWPkeagoemqjFxyXG4gICAgICovXHJcbiAgICB2YWxpZGF0ZU9uQ2hhbmdlOiB7XHJcbiAgICAgIGRlZmF1bHQ6IHRydWUsXHJcbiAgICAgIHR5cGU6IEJvb2xlYW5cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOWIl+eahOWuveW6puiuvue9ru+8jHNwYW49eHhcclxuICAgICAqL1xyXG4gICAgY29sOiB7fSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOe7n+S4gOWtl+auteeahGZvcm1JdGVt5bGe5oCnXHJcbiAgICAgKi9cclxuICAgIGZvcm1JdGVtOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgfSxcclxuICBlbWl0czogW1xyXG4gICAgLyoqXHJcbiAgICAgKiDmn6Xor6Lkuovku7ZcclxuICAgICAqKi9cclxuICAgIFwic2VhcmNoXCIsXHJcbiAgICAvKipcclxuICAgICAqIOafpeivouS6i+S7tu+8jOatpOS6i+S7tuS+m+ezu+e7n+iwg+eUqFxyXG4gICAgICovXHJcbiAgICBcIl9zZWFyY2hcIixcclxuICAgIC8qKlxyXG4gICAgICog6YeN572u5LqL5Lu277yM5L6b55So5oi35L2/55SoXHJcbiAgICAgKiovXHJcbiAgICBcInJlc2V0XCIsXHJcbiAgICAvKipcclxuICAgICAqIOmHjee9ruS6i+S7tu+8jOatpOS6i+S7tuS+m+ezu+e7n+iwg+eUqFxyXG4gICAgICovXHJcbiAgICBcIl9yZXNldFwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiDmoKHpqozlpLHotKXkuovku7ZcclxuICAgICAqL1xyXG4gICAgXCJ2YWxpZGF0ZS1lcnJvclwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiDmoKHpqozlkI7nmoTooajljZXmlbDmja7lj5jljJZcclxuICAgICAqL1xyXG4gICAgXCJ1cGRhdGU6dmFsaWRhdGVkRm9ybVwiXHJcbiAgXSxcclxuICBzZXR1cChwcm9wczogYW55LCBjdHg6IGFueSkge1xyXG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XHJcbiAgICBjb25zdCBkb01lcmdlID0gbWVyZ2U7XHJcbiAgICBjb25zdCB7IGRvQ29tcHV0ZWQsIEFzeW5jQ29tcHV0ZVZhbHVlLCBDb21wdXRlVmFsdWUgfSA9IHVzZUNvbXB1dGUoKTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2V0dXAtcHJvcHMtZGVzdHJ1Y3R1cmVcclxuICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0udmFsdWUgIT0gbnVsbCAmJiAoaXRlbS52YWx1ZSBpbnN0YW5jZW9mIEFzeW5jQ29tcHV0ZVZhbHVlIHx8IGl0ZW0udmFsdWUgaW5zdGFuY2VvZiBDb21wdXRlVmFsdWUpKSB7XHJcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJzZWFyY2gudmFsdWXphY3nva7kuI3mlK/mjIFDb21wdXRlVmFsdWUvQXN5bmNDb21wdXRl57G75Z6L55qE5Yqo5oCB6K6h566XXCIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBmdW5jdGlvbiBjcmVhdGVJbml0aWFsRm9ybSgpOiBhbnkge1xyXG4gICAgICAvL+m7mOiupOWAvFxyXG4gICAgICBjb25zdCBmb3JtOiBhbnkgPSB7fTtcclxuXHJcbiAgICAgIGZvckVhY2gocHJvcHMuY29sdW1ucywgKGNvbHVtbiwga2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbHVtbi52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRlZlZhbHVlID0gdW5yZWYoY29sdW1uLnZhbHVlKTtcclxuICAgICAgICBpZiAoZGVmVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uc2hvdyAhPT0gZmFsc2UgJiYgY29sdW1uLmNvbXBvbmVudD8uc2hvdyAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgIC8v6buY6K6k5YC8XHJcbiAgICAgICAgICBmb3JtW2tleV0gPSBkZWZWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIGNsb25lRGVlcChtZXJnZSh7fSwgcHJvcHMuaW5pdGlhbEZvcm0sIGZvcm0pKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IHJlYWN0aXZlKGNyZWF0ZUluaXRpYWxGb3JtKCkpO1xyXG5cclxuICAgIGxldCBhdXRvU2VhcmNoOiBhbnkgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkQ29sdW1uczogUmVmPFR5cGVNYXA8U2VhcmNoSXRlbVByb3BzPj4gPSBkb0NvbXB1dGVkKFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHByb3BzLmNvbHVtbnM7XHJcbiAgICAgIH0sXHJcbiAgICAgIGdldENvbnRleHRGbixcclxuICAgICAgbnVsbCxcclxuICAgICAgKGNvbHVtbnM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZvcm1JdGVtID0gY2xvbmVEZWVwKHByb3BzLmZvcm1JdGVtIHx8IHt9KTtcclxuICAgICAgICBmb3JFYWNoKGNvbHVtbnMsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBtZXJnZShpdGVtLCBmb3JtSXRlbSwgaXRlbSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gY29sdW1ucyA9IG1lcmdlKGZvcm1JdGVtLCBjb2x1bW5zKTtcclxuICAgICAgICBpZiAoIXByb3BzLnZhbGlkYXRlKSB7XHJcbiAgICAgICAgICAvL+WmguaenOWFs+mXrXZhbGlkYXRl5YiZ5Y675o6JcnVsZXNcclxuICAgICAgICAgIGZvckVhY2goY29sdW1ucywgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIGl0ZW0ucnVsZXM7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtLnJ1bGU7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5ZCI5bm2Y29sXHJcbiAgICAgICAgaWYgKHByb3BzLmNvbCkge1xyXG4gICAgICAgICAgZm9yRWFjaChjb2x1bW5zLCAodikgPT4ge1xyXG4gICAgICAgICAgICB2LmNvbCA9IG1lcmdlKHt9LCBwcm9wcy5jb2wsIHYuY29sKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jZWxsUmVuZGVyXHJcbiAgICAgICAgZm9yRWFjaChjb2x1bW5zLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgaXRlbS5fY2VsbFJlbmRlciA9ICgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGNlbGxSZW5kZXIoaXRlbSk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvL+Wtl+auteaOkuW6j1xyXG4gICAgICAgIGxldCBzb3J0QXJyOiBTZWFyY2hJdGVtUHJvcHNbXSA9IFtdO1xyXG4gICAgICAgIGZvckVhY2goY29sdW1ucywgKHYsIGtleSkgPT4ge1xyXG4gICAgICAgICAgdi5fa2V5ID0ga2V5O1xyXG4gICAgICAgICAgc29ydEFyci5wdXNoKHYpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiBpdGVtLm9yZGVyID8/IENvbnN0YW50cy5vcmRlckRlZmF1bHQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNvcnRlZENvbHVtbnM6IHtcclxuICAgICAgICAgIFtrZXk6IHN0cmluZ106IFNlYXJjaEl0ZW1Qcm9wcztcclxuICAgICAgICB9ID0ge307XHJcblxyXG4gICAgICAgIHNvcnRBcnIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgbGV0IF9rZXkgPSBpdGVtLl9rZXk7XHJcbiAgICAgICAgICBkZWxldGUgaXRlbS5fa2V5O1xyXG4gICAgICAgICAgc29ydGVkQ29sdW1uc1tfa2V5XSA9IGl0ZW07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHNvcnRlZENvbHVtbnM7XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgZnVuY3Rpb24gb25Gb3JtVmFsaWRhdGVkKCkge1xyXG4gICAgICBjb25zdCB2YWxpZGF0ZWRGb3JtID0gY2xvbmVEZWVwKGZvcm1EYXRhKTtcclxuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6dmFsaWRhdGVkRm9ybVwiLCB2YWxpZGF0ZWRGb3JtKTtcclxuICAgIH1cclxuXHJcbiAgICB3YXRjaChcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBwcm9wcy52YWxpZGF0ZWRGb3JtO1xyXG4gICAgICB9LFxyXG4gICAgICAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm1EYXRhKSB7XHJcbiAgICAgICAgICBkZWxldGUgZm9ybURhdGFba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWVyZ2UoZm9ybURhdGEsIHZhbHVlIHx8IHt9KTtcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGRlZXA6IHRydWVcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBnZXQgPSAoZm9ybTogYW55LCBrZXk6IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4gTG9kYXNoR2V0KGZvcm0sIGtleSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIHNwbGl0S2V5KGtleTogc3RyaW5nKSB7XHJcbiAgICAgIGlmIChrZXkgPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoa2V5LmluZGV4T2YoXCIuXCIpID49IDApIHtcclxuICAgICAgICByZXR1cm4ga2V5LnNwbGl0KFwiLlwiKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbnN0IGRlYm91bmNlVmFsaWRhdGUgPSBkZWJvdW5jZShhc3luYyAoKSA9PiB7XHJcbiAgICAvLyAgIGlmIChhd2FpdCBkb1ZhbGlkYXRlKCkpIHtcclxuICAgIC8vICAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSwgNTAwKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjZWxsUmVuZGVyKGl0ZW06IGFueSkge1xyXG4gICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcclxuXHJcbiAgICAgIGFzeW5jIGZ1bmN0aW9uIF9vblVwZGF0ZU1vZGVsVmFsdWUoJGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAvLyBhd2FpdCBkZWJvdW5jZVZhbGlkYXRlKCk7XHJcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQoJGV2ZW50LCBpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZnVuY3Rpb24gX29uSW5wdXQoKSB7XHJcbiAgICAgICAgb25JbnB1dChpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZnVuY3Rpb24gb25LZXl1cChpdGVtOiBhbnksIGtleTogYW55KSB7XHJcbiAgICAgICAgaWYgKGtleS5jb2RlID09PSBcIkVudGVyXCIpIHtcclxuICAgICAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyICE9IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGRvU2VhcmNoKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZGVmYXVsdFNsb3Q6IGFueSA9IG51bGw7XHJcbiAgICAgIGlmIChwcm9wcy5zbG90c1tcInNlYXJjaF9cIiArIGtleV0pIHtcclxuICAgICAgICBkZWZhdWx0U2xvdCA9IDxmcy1zbG90LXJlbmRlciBzbG90cz17cHJvcHMuc2xvdHNbXCJzZWFyY2hfXCIgKyBrZXldfSBzY29wZT17YnVpbGRGaWVsZENvbnRleHQoa2V5KX0gLz47XHJcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5yZW5kZXIpIHtcclxuICAgICAgICBkZWZhdWx0U2xvdCA9IDxmcy1yZW5kZXIgcmVuZGVyLWZ1bmM9e2l0ZW0ucmVuZGVyfSBzY29wZT17YnVpbGRGaWVsZENvbnRleHQoa2V5KX0gLz47XHJcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5jb21wb25lbnQgJiYgaXRlbS5jb21wb25lbnQuc2hvdyAhPT0gZmFsc2UpIHtcclxuICAgICAgICBkZWZhdWx0U2xvdCA9IChcclxuICAgICAgICAgIDxmcy1jb21wb25lbnQtcmVuZGVyXHJcbiAgICAgICAgICAgIHJlZj17KHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBjb21wb25lbnRSZW5kZXJSZWZzLnZhbHVlW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgbW9kZWwtdmFsdWU9e2dldChmb3JtRGF0YSwga2V5KX1cclxuICAgICAgICAgICAgb25LZXl1cD17KCRldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgb25LZXl1cChpdGVtLCAkZXZlbnQpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICB7Li4uaXRlbS5jb21wb25lbnR9XHJcbiAgICAgICAgICAgIHNjb3BlPXtidWlsZEZpZWxkQ29udGV4dChrZXkpfVxyXG4gICAgICAgICAgICBvblVwZGF0ZTptb2RlbFZhbHVlPXtfb25VcGRhdGVNb2RlbFZhbHVlfVxyXG4gICAgICAgICAgICBvbklucHV0PXtfb25JbnB1dH1cclxuICAgICAgICAgICAgb25Db21wb3NpdGlvbnN0YXJ0PXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY2hhbmdlSW5wdXRFdmVudERpc2FibGVkKHRydWUpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICBvbkNvbXBvc2l0aW9uZW5kPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY2hhbmdlSW5wdXRFdmVudERpc2FibGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc3BsaXRlZEtleSA9IHNwbGl0S2V5KGtleSk7XHJcblxyXG4gICAgICByZXR1cm4gdWkuZm9ybUl0ZW0ucmVuZGVyKHtcclxuICAgICAgICBwcm9wczoge1xyXG4gICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgIGxhYmVsOiBpdGVtLnRpdGxlLFxyXG4gICAgICAgICAgW3VpLmZvcm1JdGVtLnByb3BdOiBzcGxpdGVkS2V5LFxyXG4gICAgICAgICAgcGF0aDoga2V5LFxyXG4gICAgICAgICAgcnVsZVBhdGg6IGtleVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2xvdHM6IHtcclxuICAgICAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0U2xvdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlYXJjaEZvcm1SZWYgPSByZWYoKTtcclxuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVuZGVyUmVmczogUmVmID0gcmVmKHt9KTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZnMudmFsdWVba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoa2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50UmVuZGVyUmVmKGtleSk/LmdldFRhcmdldFJlZigpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldENvbnRleHRGbigpOiBTZWFyY2hFdmVudENvbnRleHQge1xyXG4gICAgICByZXR1cm4geyBmb3JtOiBmb3JtRGF0YSwgdmFsaWRhdGVkRm9ybTogcHJvcHMudmFsaWRhdGVkRm9ybSwgZ2V0Q29tcG9uZW50UmVmLCBkb1NlYXJjaCwgZG9SZXNldCwgZG9WYWxpZGF0ZSB9O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGJ1aWxkRmllbGRDb250ZXh0KGtleTogc3RyaW5nKSB7XHJcbiAgICAgIHJldHVybiB7IC4uLmdldENvbnRleHRGbigpLCBrZXksIHZhbHVlOiBnZXQoZm9ybURhdGEsIGtleSkgfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmdW5jdGlvbiBkb1ZhbGlkYXRlKHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLCB0cmlnZ2VyOiBzdHJpbmcgPSBcInNlYXJjaFwiKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHByb3BzLnZhbGlkYXRlKSB7XHJcbiAgICAgICAgICBhd2FpdCB1aS5mb3JtLnZhbGlkYXRlV3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIGlmICghc2lsZW50KSB7XHJcbiAgICAgICAgICBjdHguZW1pdChcInZhbGlkYXRlLWVycm9yXCIsIHsgLi4uZ2V0Q29udGV4dEZuKCksIGVycm9yOiBlLCB0cmlnZ2VyIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZnVuY3Rpb24gZG9TZWFyY2goKSB7XHJcbiAgICAgIGlmIChhdXRvU2VhcmNoKSB7XHJcbiAgICAgICAgLy8g6Ziy5oqW5p+l6K+i5Y+W5raIXHJcbiAgICAgICAgYXV0b1NlYXJjaC5jYW5jZWwoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGF3YWl0IGRvVmFsaWRhdGUoKSkge1xyXG4gICAgICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xyXG4gICAgICAgIGF3YWl0IG5leHRUaWNrKCk7XHJcbiAgICAgICAgY3R4LmVtaXQoXCJfc2VhcmNoXCIsIGdldENvbnRleHRGbigpKTtcclxuICAgICAgICBjdHguZW1pdChcInNlYXJjaFwiLCBnZXRDb250ZXh0Rm4oKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmdW5jdGlvbiBkb1Jlc2V0KCkge1xyXG4gICAgICAvLyB1aS5mb3JtLnJlc2V0V3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlLCB7IGZvcm0sIGluaXRpYWxGb3JtOiBjcmVhdGVJbml0aWFsRm9ybSgpIH0pO1xyXG4gICAgICBjb25zdCBpbml0aWFsRm9ybSA9IGNyZWF0ZUluaXRpYWxGb3JtKCk7XHJcbiAgICAgIGNvbnN0IGVudHJpZXNSZXQgPSBlbnRyaWVzKGZvcm1EYXRhKTtcclxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzUmV0KSB7XHJcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gZ2V0KGluaXRpYWxGb3JtLCBlbnRyeVswXSk7XHJcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICB1bnNldChmb3JtRGF0YSwgZW50cnlbMF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXQoZm9ybURhdGEsIGVudHJ5WzBdLCBpbml0aWFsVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGF3YWl0IGRvVmFsaWRhdGUoKSkge1xyXG4gICAgICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xyXG4gICAgICAgIGF3YWl0IG5leHRUaWNrKCk7XHJcbiAgICAgICAgaWYgKHByb3BzLnJlc2V0KSB7XHJcbiAgICAgICAgICBwcm9wcy5yZXNldChnZXRDb250ZXh0Rm4oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOihqOWNlemHjee9ruS6i+S7tlxyXG4gICAgICAgIGN0eC5lbWl0KFwiX3Jlc2V0XCIsIGdldENvbnRleHRGbigpKTtcclxuICAgICAgICBjdHguZW1pdChcInJlc2V0XCIsIGdldENvbnRleHRGbigpKTtcclxuICAgICAgICBpZiAocHJvcHMuc2VhcmNoQWZ0ZXJSZXNldCkge1xyXG4gICAgICAgICAgZG9TZWFyY2goKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb21wdXRlZEJ1dHRvbnMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGJ0bnM6IGFueSA9IFtdO1xyXG4gICAgICBjb25zdCBkZWZCdG5PcHRpb25zOiBCdXR0b25zUHJvcHM8U2VhcmNoRXZlbnRDb250ZXh0PiA9IHtcclxuICAgICAgICBzZWFyY2g6IHtcclxuICAgICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICB0eXBlOiBcInByaW1hcnlcIixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgICAgICAgIGNsaWNrOiAoY29udGV4dDogU2VhcmNoRXZlbnRDb250ZXh0KSA9PiB7XHJcbiAgICAgICAgICAgIGRvU2VhcmNoKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb3JkZXI6IDEsXHJcbiAgICAgICAgICB0ZXh0OiB0KFwiZnMuc2VhcmNoLnNlYXJjaC50ZXh0XCIpIC8vICfmn6Xor6InLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzZXQ6IHtcclxuICAgICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICAgICAgICBjbGljazogKGNvbnRleHQ6IFNlYXJjaEV2ZW50Q29udGV4dCkgPT4ge1xyXG4gICAgICAgICAgICBkb1Jlc2V0KCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdGV4dDogdChcImZzLnNlYXJjaC5yZXNldC50ZXh0XCIpLCAvLyAn6YeN572uJyxcclxuICAgICAgICAgIG9yZGVyOiAyXHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBtZXJnZShkZWZCdG5PcHRpb25zLCBwcm9wcy5idXR0b25zKTtcclxuICAgICAgZm9yIChsZXQga2V5IGluIGRlZkJ0bk9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBidG4gPSBkZWZCdG5PcHRpb25zW2tleV07XHJcbiAgICAgICAgYnRuLl9jbGljayA9ICgpID0+IHtcclxuICAgICAgICAgIGJ0bi5jbGljayhnZXRDb250ZXh0Rm4oKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBidG5zLnB1c2goYnRuKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYnRucy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBidG5zO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZnVuY3Rpb24gaW5pdEF1dG9TZWFyY2goKSB7XHJcbiAgICAgIGlmIChwcm9wcy5hdXRvU2VhcmNoID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICAvLyDmnoTlu7rpmLLmipbmn6Xor6Llh73mlbBcclxuICAgICAgaWYgKHByb3BzLmRlYm91bmNlICE9PSBmYWxzZSkge1xyXG4gICAgICAgIGxldCB3YWl0ID0gcHJvcHMuZGVib3VuY2U/LndhaXQgfHwgNTAwO1xyXG4gICAgICAgIGF1dG9TZWFyY2ggPSBkZWJvdW5jZShkb1NlYXJjaCwgd2FpdCwgcHJvcHMuZGVib3VuY2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdEF1dG9TZWFyY2goKTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRGb3JtKCkge1xyXG4gICAgICByZXR1cm4gZm9ybURhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0VmFsaWRhdGVkRm9ybSgpIHtcclxuICAgICAgcmV0dXJuIHByb3BzLnZhbGlkYXRlZEZvcm07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDorr7nva5mb3Jt5YC8XHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIHNldEZvcm0obmV3Rm9ybTogYW55LCBtZXJnZSA9IHRydWUpIHtcclxuICAgICAgaWYgKCFtZXJnZSkge1xyXG4gICAgICAgIGVhY2goa2V5cyhmb3JtRGF0YSksIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBkZWxldGUgZm9ybURhdGFbaXRlbV07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZG9NZXJnZShmb3JtRGF0YSwgbmV3Rm9ybSk7XHJcbiAgICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGlucHV0RXZlbnREaXNhYmxlZCA9IHJlZihmYWxzZSk7XHJcblxyXG4gICAgY29uc3QgZG9BdXRvU2VhcmNoID0gKCkgPT4ge1xyXG4gICAgICBsb2dnZXIuZGVidWcoXCJkbyBhdXRvIHNlYXJjaCxpbnB1dEV2ZW50RGlzYWJsZWQ6XCIsIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSk7XHJcbiAgICAgIGlmIChpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUgIT09IHRydWUgJiYgYXV0b1NlYXJjaCkge1xyXG4gICAgICAgIC8vIOmYsuaKluafpeivolxyXG4gICAgICAgIGF1dG9TZWFyY2goKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBvbklucHV0ID0gKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJpbnB1dFwiKSB7XHJcbiAgICAgICAgZG9BdXRvU2VhcmNoKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICAvLyDovpPlhaXms5Xnm5HlkKxcclxuICAgIGNvbnN0IGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCA9IChkaXNhYmxlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgICBpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUgPSBkaXNhYmxlZDtcclxuICAgICAgY29uc29sZS5sb2coXCJjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQ6XCIsIGRpc2FibGVkKTtcclxuICAgIH07XHJcblxyXG4gICAgYXN5bmMgZnVuY3Rpb24gb25WYWx1ZUNoYW5nZWQodmFsdWU6IGFueSwgaXRlbTogU2VhcmNoSXRlbVByb3BzKSB7XHJcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xyXG4gICAgICBzZXQoZm9ybURhdGEsIGtleSwgdmFsdWUpO1xyXG5cclxuICAgICAgY29uc3Qgc2lsZW50ID0gcHJvcHMudmFsaWRhdGVPbkNoYW5nZVNpbGVudDtcclxuICAgICAgLy8gaWYgKHByb3BzLnZhbGlkYXRlT25DaGFuZ2UgJiYgKGF3YWl0IGRvVmFsaWRhdGUoc2lsZW50LCBcImNoYW5nZVwiKSkpIHtcclxuICAgICAgLy8gICBvbkZvcm1WYWxpZGF0ZWQoKTtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgaWYgKGl0ZW0udmFsdWVDaGFuZ2UpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1EYXRhW2tleV07XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gZ2V0Q29tcG9uZW50UmVmKGtleSk7XHJcbiAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2U6IFZhbHVlQ2hhbmdlSGFuZGxlID1cclxuICAgICAgICAgIGl0ZW0udmFsdWVDaGFuZ2UgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGl0ZW0udmFsdWVDaGFuZ2UgOiBpdGVtLnZhbHVlQ2hhbmdlLmhhbmRsZTtcclxuICAgICAgICBjb25zdCBzY29wZSA9IGdldENvbnRleHRGbigpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlQ29udGV4dDogVmFsdWVDaGFuZ2VDb250ZXh0ID0ge1xyXG4gICAgICAgICAgaW5kZXg6IDAsXHJcbiAgICAgICAgICByb3c6IHNjb3BlLmZvcm0sXHJcbiAgICAgICAgICBmb3JtOiBzY29wZS5mb3JtLFxyXG4gICAgICAgICAgLi4uc2NvcGUsXHJcbiAgICAgICAgICBrZXksXHJcbiAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgIGNvbXBvbmVudFJlZixcclxuICAgICAgICAgIGltbWVkaWF0ZTogZmFsc2UsXHJcbiAgICAgICAgICBnZXRDb21wb25lbnRSZWYsXHJcbiAgICAgICAgICBtb2RlOiBcInNlYXJjaFwiXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YWx1ZUNoYW5nZSh2YWx1ZUNoYW5nZUNvbnRleHQpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIFRPRE8g55Sx5LqOdmFsaWRhdGVkRm9ybSDlj5HlsITlh7rljrvlkI7vvIzkvJrmm7TmlrBmb3JtRGF0YeeahOaVsOaNru+8jOaJgOS7peimgeaUvuWcqHZhbHVlQ2hhbmdl5ZCO6Z2iLOS4jeeEtuS8muatu+W+queOr1xyXG4gICAgICBpZiAocHJvcHMudmFsaWRhdGVPbkNoYW5nZSAmJiAoYXdhaXQgZG9WYWxpZGF0ZShzaWxlbnQsIFwiY2hhbmdlXCIpKSkge1xyXG4gICAgICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiaXRlbS5hdXRvU2VhcmNoVHJpZ2dlcjpcIiwgaXRlbSwgaW5wdXRFdmVudERpc2FibGVkLnZhbHVlKTtcclxuICAgICAgaWYgKGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT0gbnVsbCB8fCBpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSB0cnVlIHx8IGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IFwiY2hhbmdlXCIpIHtcclxuICAgICAgICBkb0F1dG9TZWFyY2goKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkUnVsZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGlmICghcHJvcHMudmFsaWRhdGUpIHtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHByb3BzLm9wdGlvbnMucnVsZXM7XHJcbiAgICB9KTtcclxuXHJcbiAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGdldCxcclxuICAgICAgdWksXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkLFxyXG4gICAgICBkb1ZhbGlkYXRlLFxyXG4gICAgICBkb1NlYXJjaCxcclxuICAgICAgZG9SZXNldCxcclxuICAgICAgZm9ybURhdGEsXHJcbiAgICAgIGNvbXBvbmVudFJlbmRlclJlZnMsXHJcbiAgICAgIGdldENvbXBvbmVudFJlbmRlclJlZixcclxuICAgICAgZ2V0Q29tcG9uZW50UmVmLFxyXG4gICAgICBnZXRGb3JtLFxyXG4gICAgICBnZXRWYWxpZGF0ZWRGb3JtLFxyXG4gICAgICBzZXRGb3JtLFxyXG4gICAgICBzZWFyY2hGb3JtUmVmLFxyXG4gICAgICBvbklucHV0LFxyXG4gICAgICBpbnB1dEV2ZW50RGlzYWJsZWQsXHJcbiAgICAgIGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCxcclxuICAgICAgY29tcHV0ZWRDb2x1bW5zLFxyXG4gICAgICBjb21wdXRlZEJ1dHRvbnMsXHJcbiAgICAgIGNvbXB1dGVkUnVsZXMsXHJcbiAgICAgIGJ1aWxkRmllbGRDb250ZXh0LFxyXG4gICAgICBnZXRDb250ZXh0Rm5cclxuICAgIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtc2VhcmNoIHtcclxuICAmLmZzLXNlYXJjaC12MiB7XHJcbiAgICAvL2Rpc3BsYXk6IGZsZXg7XHJcbiAgICAvL2ZsZXgtd3JhcDogbm93cmFwO1xyXG4gICAgLmZzLXNlYXJjaC1idXR0b25zIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgIH1cclxuICAgIC5zZWFyY2gtbGVmdCB7XHJcbiAgICB9XHJcblxyXG4gICAgLnNlYXJjaC1yaWdodCB7XHJcbiAgICAgIGZsZXg6IDE7XHJcbiAgICB9XHJcblxyXG4gICAgLmFudC1mb3JtLWlubGluZSB7XHJcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcclxuICAgIH1cclxuXHJcbiAgICAuZnMtc2VhcmNoLWZvcm0ge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XHJcblxyXG4gICAgICAuYW50LXBpY2tlcixcclxuICAgICAgLmFudC1zZWxlY3QsXHJcbiAgICAgIC5uLWRhdGUtcGlja2VyLFxyXG4gICAgICAuZWwtc2VsZWN0LFxyXG4gICAgICAuZWwtZGF0ZS1lZGl0b3Ige1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAuZWwtcmFuZ2UtZWRpdG9yLmVsLWlucHV0X193cmFwcGVyIHtcclxuICAgICAgICBwYWRkaW5nOiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAuYW50LWJ0bi1sb2FkaW5nLWljb24ge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDJweDtcclxuICAgICAgICBtYXJnaW4tcmlnaHQ6IDJweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJi5lbC1mb3JtLS1sYWJlbC10b3Age1xyXG4gICAgICAgIC5lbC1mb3JtLWl0ZW0ge1xyXG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAuZWwtZm9ybS1pdGVtIHtcclxuICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7XHJcbiAgICAgICAgbWFyZ2luLXRvcDogNHB4O1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgJi5lbC1mb3JtLS1pbmxpbmUge1xyXG4gICAgICAgIC5lbC1pbnB1dCB7XHJcbiAgICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5lbC1mb3JtLWl0ZW1fX2NvbnRlbnQge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC5mcy1zZWFyY2gtY29sIHtcclxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICAvLyBhbnRkdlxyXG4gICAgICAuYW50LWZvcm0taXRlbS1leHBsYWluLFxyXG4gICAgICAuZWwtZm9ybS1pdGVtX19lcnJvciB7XHJcbiAgICAgICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICAgIGJvdHRvbTogM3B4O1xyXG4gICAgICAgIHJpZ2h0OiA4cHg7XHJcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XHJcbiAgICAgICAgdG9wOiBhdXRvO1xyXG4gICAgICAgIGxlZnQ6IGF1dG87XHJcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAuZWwtZm9ybS1pdGVtX19lcnJvciB7XHJcbiAgICAgICAgYm90dG9tOiAxMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmOmhvdmVyIHtcclxuICAgICAgICAuYW50LWZvcm0taXRlbS1leHBsYWluLFxyXG4gICAgICAgIC5lbC1mb3JtLWl0ZW1fX2Vycm9yIHtcclxuICAgICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAubi1mb3JtLWl0ZW0tYmxhbmsge1xyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIChtYXgtd2lkdGg6IDU3NXB4KSB7XHJcbiAgLmZzLXNlYXJjaCB7XHJcbiAgICAuZnMtc2VhcmNoLWZvcm0ge1xyXG4gICAgICAuZnMtc2VhcmNoLWNvbCB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGZsZXg6IDEwMCU7XHJcbiAgICAgICAgLy9hbnRkdlxyXG4gICAgICAgIC5hbnQtZm9ybS1pdGVtLWxhYmVsIHtcclxuICAgICAgICAgIHdpZHRoOiAxMjBweDtcclxuICAgICAgICAgIGZsZXg6IG5vbmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wge1xyXG4gICAgICAgICAgZmxleDogMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuPC9zdHlsZT5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxjb21wb25lbnQgOmlzPVwidWkuY29sbGFwc2VUcmFuc2l0aW9uLm5hbWVcIj5cclxuICAgIDxkaXYgdi1pZj1cInNob3cgIT09IGZhbHNlXCIgY2xhc3M9XCJmcy1zZWFyY2hcIiA6Y2xhc3M9XCJ7ICdmcy1zZWFyY2gtbXVsdGktbGluZSc6IGNvbXB1dGVkSXNNdWx0aUxpbmUgfVwiPlxyXG4gICAgICA8Y29tcG9uZW50XHJcbiAgICAgICAgOmlzPVwidWkuZm9ybS5uYW1lXCJcclxuICAgICAgICByZWY9XCJzZWFyY2hGb3JtUmVmXCJcclxuICAgICAgICA6bW9kZWw9XCJmb3JtXCJcclxuICAgICAgICB2LWJpbmQ9XCJvcHRpb25zXCJcclxuICAgICAgICA6cnVsZXM9XCJjb21wdXRlZFJ1bGVzXCJcclxuICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1mb3JtXCJcclxuICAgICAgICBAY29tcG9zaXRpb25zdGFydD1cImNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCh0cnVlKVwiXHJcbiAgICAgICAgQGNvbXBvc2l0aW9uZW5kPVwiY2hhbmdlSW5wdXRFdmVudERpc2FibGVkKGZhbHNlKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWJveFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1tYWluXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1jb2x1bW5zXCJcclxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7ICdmcy1zZWFyY2gtY29sbGFwc2UnOiBjb2xsYXBzZSB9XCJcclxuICAgICAgICAgICAgICA6c3R5bGU9XCJ7IGhlaWdodDogY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQgfVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCIgcmVmPVwiY29sdW1uc1Jvd1JlZlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwic2xvdHNbJ3NlYXJjaC1sZWZ0J11cIiBjbGFzcz1cImZzLXNlYXJjaC1jb2xcIj5cclxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtbGVmdCddXCIgOnNjb3BlPVwic2VhcmNoRXZlbnRDb250ZXh0UmVmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBrZXkpIGluIGNvbXB1dGVkQ29sdW1uc1wiIDprZXk9XCJrZXlcIj5cclxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJjb21wdXRlZENvbE5hbWVcIiB2LWlmPVwiaXRlbS5zaG93ID09PSB0cnVlXCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sXCIgdi1iaW5kPVwiaXRlbS5jb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIiB2LWJpbmQ9XCJpdGVtXCIgOlt1aS5mb3JtSXRlbS5wcm9wXT1cImtleVwiIDpsYWJlbD1cIml0ZW0udGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2xvdHNbJ3NlYXJjaF8nICsga2V5XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaF8nICsga2V5XVwiIDpzY29wZT1cInsgLi4uc2VhcmNoRXZlbnRDb250ZXh0UmVmLCBrZXkgfVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZzLWNvbXBvbmVudC1yZW5kZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2LWlmPVwiaXRlbS5jb21wb25lbnQgJiYgaXRlbS5jb21wb25lbnQuc2hvdyAhPT0gZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDpyZWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlbmRlclJlZnNbaXRlbS5rZXldID0gZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDptb2RlbC12YWx1ZT1cImdldChmb3JtLCBrZXkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2LWJpbmQ9XCJpdGVtLmNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOnNjb3BlPVwic2VhcmNoRXZlbnRDb250ZXh0UmVmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwib25WYWx1ZUNoYW5nZWQoJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlucHV0PVwib25JbnB1dChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwic2xvdHNbJ3NlYXJjaC1taWRkbGUnXVwiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtbWlkZGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLW1pZGRsZSddXCIgOnNjb3BlPVwic2VhcmNoRXZlbnRDb250ZXh0UmVmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxmcy1zZWFyY2gtYnV0dG9ucyB2LWlmPVwiIWNvbXB1dGVkSXNNdWx0aUxpbmVcIiA6YnV0dG9ucz1cImNvbXB1dGVkQnV0dG9uc1wiPjwvZnMtc2VhcmNoLWJ1dHRvbnM+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJzbG90c1snc2VhcmNoLXJpZ2h0J11cIiBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLXJpZ2h0J11cIiA6c2NvcGU9XCJzZWFyY2hFdmVudENvbnRleHRSZWZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGZzLXNlYXJjaC1idXR0b25zIHYtaWY9XCJjb21wdXRlZElzTXVsdGlMaW5lXCIgOmJ1dHRvbnM9XCJjb21wdXRlZEJ1dHRvbnNcIj48L2ZzLXNlYXJjaC1idXR0b25zPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiB2LWlmPVwiY29tcHV0ZWRJc011bHRpTGluZVwiIGNsYXNzPVwiZnMtc2VhcmNoLWFjdGlvblwiPlxyXG4gICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIj5cclxuICAgICAgICAgICAgICA8ZnMtYnV0dG9uIDppY29uPVwiY29sbGFwc2UgPyB1aS5pY29ucy5jYXJldFVwIDogdWkuaWNvbnMuY2FyZXREb3duXCIgQGNsaWNrPVwidG9nZ2xlQ29sbGFwc2VcIiAvPlxyXG4gICAgICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2NvbXBvbmVudD5cclxuICAgIDwvZGl2PlxyXG4gIDwvY29tcG9uZW50PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIG9uTW91bnRlZCwgcmVhY3RpdmUsIHJlZiwgUmVmLCB1bnJlZiB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgZWFjaCwgZm9yRWFjaCwgc29ydEJ5LCBlbnRyaWVzLCB1bnNldCwgc2V0LCBrZXlzLCBnZXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCB7IHVzZUNvbXB1dGUgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1jb21wdXRlXCI7XHJcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XHJcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwubG9nXCI7XHJcbmltcG9ydCBGc1NlYXJjaEJ1dHRvbnMgZnJvbSBcIi4vYnV0dG9ucy52dWVcIjtcclxuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IEJ1dHRvbnNQcm9wcywgU2VhcmNoRXZlbnRDb250ZXh0LCBTZWFyY2hJdGVtUHJvcHMgfSBmcm9tIFwiLi4vLi4vZFwiO1xyXG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLXVpXCI7XHJcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtbWVyZ2VcIjtcclxuXHJcbi8qKlxyXG4gKiDmn6Xor6LmoYbnu4Tku7ZcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc1NlYXJjaFYxXCIsXHJcbiAgY29tcG9uZW50czogeyBGc1NlYXJjaEJ1dHRvbnMgfSxcclxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxyXG4gIHByb3BzOiB7XHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+afpeivouadoeS7tlxyXG4gICAgICog54K55Ye76YeN572u77yM5Lya6YeN572u5oiQ6K+l5p2h5Lu2XHJcbiAgICAgKi9cclxuICAgIGluaXRpYWxGb3JtOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog6KGo5Y2V5Y+C5pWwXHJcbiAgICAgKiDmlK/mjIFlbC1mb3JtIHwgYS1mb3Jt55qE5bGe5oCnXHJcbiAgICAgKi9cclxuICAgIG9wdGlvbnM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmn6Xor6LlrZfmrrXphY3nva5cclxuICAgICAqL1xyXG4gICAgY29sdW1uczoge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIHRhYnNcclxuICAgICAqIHsgc2hvdyAsIG9wdGlvbnMsa2V5LCBkZWZhdWx0fVxyXG4gICAgICovXHJcbiAgICB0YWJzOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5oyJ6ZKu6YWN572uLOWPr+S7peagueaNrm9yZGVy5o6S5bqPXHJcbiAgICAgKiB7c2VhcmNoOnsuLi5Gc0J1dHRvbn0scmVzZXQ6ey4uLkZzQnV0dG9ufX1cclxuICAgICAqL1xyXG4gICAgYnV0dG9uczoge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOeCueWHu+mHjee9ruWQjuaYr+WQpueri+WNs+inpuWPkeafpeivolxyXG4gICAgICovXHJcbiAgICBzZWFyY2hBZnRlclJlc2V0OiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuW8gOWQr+iHquWKqOafpeivolxyXG4gICAgICovXHJcbiAgICBhdXRvU2VhcmNoOiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOiHquWKqOafpeivou+8jOmYsuaKluiuvue9rlxyXG4gICAgICog5LygZmFsc2XliJnlhbPpl63oh6rliqjmn6Xor6JcclxuICAgICAqL1xyXG4gICAgZGVib3VuY2U6IHtcclxuICAgICAgdHlwZTogW0Jvb2xlYW4sIE9iamVjdF0sXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5o+S5qe9XHJcbiAgICAgKi9cclxuICAgIHNsb3RzOiB7XHJcbiAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmmK/lkKbmmL7npLrmn6Xor6LmoYZcclxuICAgICAqL1xyXG4gICAgc2hvdzoge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiB0cnVlXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmmK/lkKblkK/nlKjmoKHpqoxcclxuICAgICAqL1xyXG4gICAgdmFsaWRhdGU6IHtcclxuICAgICAgZGVmYXVsdDogZmFsc2VcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOW4g+WxgCwgc2luZ2xlLWxpbmUg5Y2V6KGM77yMIG11bHRpLWxpbmUg5aSa6KGM77yI5pSv5oyB5bGV5byA5pS26LW377yJXHJcbiAgICAgKi9cclxuICAgIGxheW91dDoge1xyXG4gICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgIGRlZmF1bHQ6IFwic2luZ2xlLWxpbmVcIlxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5YiX55qE5a695bqm6K6+572u77yMc3Bhbj14eFxyXG4gICAgICovXHJcbiAgICBjb2w6IHt9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5oqY5Y+gXHJcbiAgICAgKi9cclxuICAgIGNvbGxhcHNlOiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgfSxcclxuICBlbWl0czogW1xyXG4gICAgLyoqXHJcbiAgICAgKiDmn6Xor6Lkuovku7ZcclxuICAgICAqKi9cclxuICAgIFwic2VhcmNoXCIsXHJcbiAgICAvKipcclxuICAgICAqIOmHjee9ruS6i+S7tlxyXG4gICAgICoqL1xyXG4gICAgXCJyZXNldFwiLFxyXG4gICAgXCJjb2xsYXBzZVwiLFxyXG4gICAgXCJ1cGRhdGU6Y29sbGFwc2VcIlxyXG4gIF0sXHJcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xyXG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuICAgIC8vIOW8guatpXNldHVw6ZyA6KaB5pS+5Zyo56ys5LiA5LiqYXdhaXTkuYvliY1cclxuICAgIC8vIG9uTW91bnRlZCBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC5cclxuICAgIC8v5Li65ZWl5Lya5pyJ6L+Z5Liq6K2m5ZGKXHJcbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xyXG4gICAgICBpZiAoY29tcHV0ZWRJc011bHRpTGluZS52YWx1ZSAmJiBjb2x1bW5zUm93UmVmLnZhbHVlKSB7XHJcbiAgICAgICAgY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA9IGNvbHVtbnNSb3dSZWYudmFsdWUuJGVsLm9mZnNldEhlaWdodDtcclxuICAgICAgICBjb25zdCBjb2x1bW5zTGlzdCA9IGNvbHVtbnNSb3dSZWYudmFsdWUuJGVsLmNoaWxkcmVuO1xyXG4gICAgICAgIGlmIChjb2x1bW5zTGlzdCAmJiBjb2x1bW5zTGlzdC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZSA9IGNvbHVtbnNMaXN0WzFdLm9mZnNldEhlaWdodCArIDI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgYXV0b1NlYXJjaDogYW55ID0gbnVsbDtcclxuICAgIGZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxGb3JtKCkge1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgcmV0dXJuIGNsb25lRGVlcChwcm9wcy5pbml0aWFsRm9ybSB8fCB7fSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmb3JtID0gcmVhY3RpdmUoY3JlYXRlSW5pdGlhbEZvcm0oKSk7XHJcbiAgICBjb25zdCB7IGRvQ29tcHV0ZWQsIEFzeW5jQ29tcHV0ZVZhbHVlIH0gPSB1c2VDb21wdXRlKCk7XHJcbiAgICAvL0B0cy1pZ25vcmVcclxuICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0udmFsdWUgIT0gbnVsbCAmJiBpdGVtLnZhbHVlIGluc3RhbmNlb2YgQXN5bmNDb21wdXRlVmFsdWUpIHtcclxuICAgICAgICBsb2dnZXIud2FybihcInNlYXJjaC52YWx1ZemFjee9ruS4jeaUr+aMgUFzeW5jQ29tcHV0Zeexu+Wei+eahOWKqOaAgeiuoeeul1wiKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xyXG4gICAgY29uc3QgZG9NZXJnZSA9IG1lcmdlO1xyXG4gICAgY29uc3QgY29tcHV0ZWRDb2x1bW5zID0gZG9Db21wdXRlZChcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIHJldHVybiBwcm9wcy5jb2x1bW5zO1xyXG4gICAgICB9LFxyXG4gICAgICBnZXRDb250ZXh0Rm4sXHJcbiAgICAgIG51bGwsXHJcbiAgICAgICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIGlmICghcHJvcHMudmFsaWRhdGUpIHtcclxuICAgICAgICAgIC8v5aaC5p6c5YWz6ZetdmFsaWRhdGXliJnljrvmjolydWxlc1xyXG4gICAgICAgICAgZm9yRWFjaCh2YWx1ZSwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIGl0ZW0ucnVsZXM7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5ZCI5bm2Y29sXHJcbiAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgaWYgKHByb3BzLmNvbCkge1xyXG4gICAgICAgICAgZm9yRWFjaCh2YWx1ZSwgKHYpID0+IHtcclxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgIHYuY29sID0gbWVyZ2Uoe30sIHByb3BzLmNvbCwgdi5jb2wpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL+Wtl+auteaOkuW6j1xyXG4gICAgICAgIGxldCBzb3J0QXJyOiBTZWFyY2hJdGVtUHJvcHNbXSA9IFtdO1xyXG4gICAgICAgIGZvckVhY2godmFsdWUsICh2LCBrZXkpID0+IHtcclxuICAgICAgICAgIHYuX2tleSA9IGtleTtcclxuICAgICAgICAgIHNvcnRBcnIucHVzaCh2KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzb3J0QXJyID0gc29ydEJ5KHNvcnRBcnIsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gaXRlbS5vcmRlciA/PyBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBzb3J0ZWRDb2x1bW5zOiB7XHJcbiAgICAgICAgICBba2V5OiBzdHJpbmddOiBTZWFyY2hJdGVtUHJvcHM7XHJcbiAgICAgICAgfSA9IHt9O1xyXG5cclxuICAgICAgICBzb3J0QXJyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGxldCBfa2V5ID0gaXRlbS5fa2V5O1xyXG4gICAgICAgICAgZGVsZXRlIGl0ZW0uX2tleTtcclxuICAgICAgICAgIHNvcnRlZENvbHVtbnNbX2tleV0gPSBpdGVtO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBzb3J0ZWRDb2x1bW5zO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIC8v6buY6K6k5YC8XHJcbiAgICBmb3JFYWNoKGNvbXB1dGVkQ29sdW1ucy52YWx1ZSwgKGNvbHVtbiwga2V5KSA9PiB7XHJcbiAgICAgIGlmIChjb2x1bW4udmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBkZWZWYWx1ZSA9IHVucmVmKGNvbHVtbi52YWx1ZSk7XHJcbiAgICAgIGlmIChkZWZWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbi5zaG93ICE9PSBmYWxzZSAmJiBjb2x1bW4uY29tcG9uZW50Py5zaG93ICE9PSBmYWxzZSkge1xyXG4gICAgICAgIC8v6buY6K6k5YC8XHJcbiAgICAgICAgZm9ybVtrZXldID0gZGVmVmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgY29uc3Qgc2VhcmNoRm9ybVJlZiA9IHJlZigpO1xyXG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XHJcbiAgICBjb25zdCBjb21wb25lbnRSZW5kZXJSZWZzOiBSZWYgPSByZWYoe30pO1xyXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVuZGVyUmVmKGtleTogc3RyaW5nKSB7XHJcbiAgICAgIHJldHVybiBjb21wb25lbnRSZW5kZXJSZWZzLnZhbHVlW2tleV07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGtleTogc3RyaW5nKTogYW55IHtcclxuICAgICAgcmV0dXJuIGdldENvbXBvbmVudFJlbmRlclJlZihrZXkpPy4kcmVmcz8udGFyZ2V0UmVmO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldENvbnRleHRGbigpOiBTZWFyY2hFdmVudENvbnRleHQge1xyXG4gICAgICByZXR1cm4geyBmb3JtLCB2YWxpZGF0ZWRGb3JtOiBmb3JtLCBnZXRDb21wb25lbnRSZWYsIGRvVmFsaWRhdGU6IG51bGwgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWFyY2hFdmVudENvbnRleHRSZWY6IFJlZjxTZWFyY2hFdmVudENvbnRleHQ+ID0gcmVmKGdldENvbnRleHRGbigpKTtcclxuXHJcbiAgICBhc3luYyBmdW5jdGlvbiBkb1NlYXJjaCgpIHtcclxuICAgICAgaWYgKGF1dG9TZWFyY2gpIHtcclxuICAgICAgICAvLyDpmLLmipbmn6Xor6Llj5bmtohcclxuICAgICAgICBhdXRvU2VhcmNoLmNhbmNlbCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB2YWxpZCA9IGF3YWl0IHVpLmZvcm0udmFsaWRhdGVXcmFwKHNlYXJjaEZvcm1SZWYudmFsdWUpO1xyXG4gICAgICBpZiAodmFsaWQpIHtcclxuICAgICAgICBjdHguZW1pdChcInNlYXJjaFwiLCBzZWFyY2hFdmVudENvbnRleHRSZWYudmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHVpLm1lc3NhZ2UuZXJyb3Ioe1xyXG4gICAgICAgICAgbWVzc2FnZTogdChcImZzLnNlYXJjaC5lcnJvci5tZXNzYWdlXCIpXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZG9SZXNldCgpIHtcclxuICAgICAgLy8gdWkuZm9ybS5yZXNldFdyYXAoc2VhcmNoRm9ybVJlZi52YWx1ZSwgeyBmb3JtLCBpbml0aWFsRm9ybTogY3JlYXRlSW5pdGlhbEZvcm0oKSB9KTtcclxuICAgICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xyXG4gICAgICBjb25zdCBlbnRyaWVzUmV0ID0gZW50cmllcyhmb3JtKTtcclxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzUmV0KSB7XHJcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gZ2V0KGluaXRpYWxGb3JtLCBlbnRyeVswXSk7XHJcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICB1bnNldChmb3JtLCBlbnRyeVswXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNldChmb3JtLCBlbnRyeVswXSwgaW5pdGlhbFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIGlmIChwcm9wcy5yZXNldCkge1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIHByb3BzLnJlc2V0KHNlYXJjaEV2ZW50Q29udGV4dFJlZi52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g6KGo5Y2V6YeN572u5LqL5Lu2XHJcbiAgICAgIGN0eC5lbWl0KFwicmVzZXRcIiwgZ2V0Q29udGV4dEZuKCkpO1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgaWYgKHByb3BzLnNlYXJjaEFmdGVyUmVzZXQpIHtcclxuICAgICAgICBuZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgICBkb1NlYXJjaCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb21wdXRlZEJ1dHRvbnMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGJ0bnM6IGFueSA9IFtdO1xyXG4gICAgICBjb25zdCBkZWZCdG5PcHRpb25zOiBCdXR0b25zUHJvcHM8U2VhcmNoRXZlbnRDb250ZXh0PiA9IHtcclxuICAgICAgICBzZWFyY2g6IHtcclxuICAgICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICB0eXBlOiBcInByaW1hcnlcIixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICAgIGNsaWNrOiAoY29udGV4dDogU2VhcmNoRXZlbnRDb250ZXh0KSA9PiB7XHJcbiAgICAgICAgICAgIGRvU2VhcmNoKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb3JkZXI6IDEsXHJcbiAgICAgICAgICB0ZXh0OiB0KFwiZnMuc2VhcmNoLnNlYXJjaC50ZXh0XCIpIC8vICfmn6Xor6InLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzZXQ6IHtcclxuICAgICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICBjbGljazogKGNvbnRleHQ6IFNlYXJjaEV2ZW50Q29udGV4dCkgPT4ge1xyXG4gICAgICAgICAgICBkb1Jlc2V0KCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdGV4dDogdChcImZzLnNlYXJjaC5yZXNldC50ZXh0XCIpLCAvLyAn6YeN572uJyxcclxuICAgICAgICAgIG9yZGVyOiAyXHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgbWVyZ2UoZGVmQnRuT3B0aW9ucywgcHJvcHMuYnV0dG9ucyk7XHJcbiAgICAgIGZvciAobGV0IGtleSBpbiBkZWZCdG5PcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgYnRuID0gZGVmQnRuT3B0aW9uc1trZXldO1xyXG4gICAgICAgIGJ0bi5fY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICBidG4uY2xpY2soZ2V0Q29udGV4dEZuKCkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgYnRucy5wdXNoKGJ0bik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGJ0bnMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gYS5vcmRlciAtIGIub3JkZXI7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gYnRucztcclxuICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIGluaXRBdXRvU2VhcmNoKCkge1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgaWYgKHByb3BzLmF1dG9TZWFyY2ggPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOaehOW7uumYsuaKluafpeivouWHveaVsFxyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgaWYgKHByb3BzLmRlYm91bmNlICE9PSBmYWxzZSkge1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIGxldCB3YWl0ID0gcHJvcHMuZGVib3VuY2U/LndhaXQgfHwgNTAwO1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIGF1dG9TZWFyY2ggPSBkZWJvdW5jZShkb1NlYXJjaCwgd2FpdCwgcHJvcHMuZGVib3VuY2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdEF1dG9TZWFyY2goKTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRGb3JtKCkge1xyXG4gICAgICByZXR1cm4gZm9ybTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiuvue9rmZvcm3lgLxcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gc2V0Rm9ybShuZXdGb3JtOiBhbnksIG1lcmdlID0gdHJ1ZSkge1xyXG4gICAgICBpZiAoIW1lcmdlKSB7XHJcbiAgICAgICAgZWFjaChrZXlzKGZvcm0pLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgZGVsZXRlIGZvcm1baXRlbV07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZG9NZXJnZShmb3JtLCBuZXdGb3JtKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbnB1dEV2ZW50RGlzYWJsZWQgPSByZWYoZmFsc2UpO1xyXG5cclxuICAgIGNvbnN0IGRvQXV0b1NlYXJjaCA9ICgpID0+IHtcclxuICAgICAgbG9nZ2VyLmRlYnVnKFwiZG8gYXV0byBzZWFyY2gsaW5wdXRFdmVudERpc2FibGVkOlwiLCBpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUpO1xyXG4gICAgICBpZiAoaW5wdXRFdmVudERpc2FibGVkLnZhbHVlICE9PSB0cnVlICYmIGF1dG9TZWFyY2gpIHtcclxuICAgICAgICAvLyDpmLLmipbmn6Xor6JcclxuICAgICAgICBhdXRvU2VhcmNoKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgb25JbnB1dCA9IChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IFwiaW5wdXRcIikge1xyXG4gICAgICAgIGRvQXV0b1NlYXJjaCgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgLy8g6L6T5YWl5rOV55uR5ZCsXHJcbiAgICBjb25zdCBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQgPSAoZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgaW5wdXRFdmVudERpc2FibGVkLnZhbHVlID0gZGlzYWJsZWQ7XHJcbiAgICAgIGRvQXV0b1NlYXJjaCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBvblZhbHVlQ2hhbmdlZCh2YWx1ZTogYW55LCBpdGVtOiBTZWFyY2hJdGVtUHJvcHMpIHtcclxuICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXk7XHJcbiAgICAgIHNldChmb3JtLCBrZXksIHZhbHVlKTtcclxuICAgICAgaWYgKGl0ZW0udmFsdWVDaGFuZ2UpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1ba2V5XTtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBnZXRDb21wb25lbnRSZWYoa2V5KTtcclxuICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZSA9IGl0ZW0udmFsdWVDaGFuZ2UgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGl0ZW0udmFsdWVDaGFuZ2UgOiBpdGVtLnZhbHVlQ2hhbmdlLmhhbmRsZTtcclxuICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICB2YWx1ZUNoYW5nZSh7IGtleSwgdmFsdWUsIGNvbXBvbmVudFJlZiwgLi4uZ2V0Q29udGV4dEZuKCksIGltbWlkaWF0ZTogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT0gbnVsbCB8fCBpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSB0cnVlIHx8IGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IFwiY2hhbmdlXCIpIHtcclxuICAgICAgICBkb0F1dG9TZWFyY2goKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkUnVsZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICBpZiAoIXByb3BzLnZhbGlkYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICByZXR1cm4gcHJvcHMub3B0aW9ucy5ydWxlcztcclxuICAgIH0pO1xyXG5cclxuICAgIC8vLS0tLS3lpJrooYzmqKHlvI/mipjlj6BcclxuXHJcbiAgICBjb25zdCBjb2x1bW5zUm93UmVmID0gcmVmKCk7XHJcbiAgICBjb25zdCBjb2x1bW5zQm94SGVpZ2h0UmVmID0gcmVmKDApO1xyXG4gICAgY29uc3QgY29sdW1uc0xpbmVIZWlnaHRSZWYgPSByZWYoMCk7XHJcblxyXG4gICAgY29uc3QgdG9nZ2xlQ29sbGFwc2UgPSAoKSA9PiB7XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICBjdHguZW1pdChcInVwZGF0ZTpjb2xsYXBzZVwiLCAhcHJvcHMuY29sbGFwc2UpO1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgY3R4LmVtaXQoXCJjb2xsYXBzZVwiLCAhcHJvcHMuY29sbGFwc2UpO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZENvbE5hbWUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICBpZiAocHJvcHMubGF5b3V0ID09PSBcIm11bHRpLWxpbmVcIikge1xyXG4gICAgICAgIHJldHVybiB1aS5jb2wubmFtZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gXCJkaXZcIjtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgY29tcHV0ZWRJc011bHRpTGluZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIHJldHVybiBwcm9wcy5sYXlvdXQgPT09IFwibXVsdGktbGluZVwiO1xyXG4gICAgICAvL+S4jeimgei/meS4qu+8jOS8muatu+W+queOr++8jCAmJiBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID4gY29sdW1uc0xpbmVIZWlnaHRSZWYudmFsdWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZENvbHVtbkJveEhlaWdodCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgaWYgKCFjb21wdXRlZElzTXVsdGlMaW5lLnZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiYXV0b1wiO1xyXG4gICAgICB9XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICBpZiAocHJvcHMuY29sbGFwc2UpIHtcclxuICAgICAgICByZXR1cm4gY29sdW1uc0xpbmVIZWlnaHRSZWYudmFsdWUgPyBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZSArIFwicHhcIiA6IFwiXCI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgPyBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlICsgXCJweFwiIDogXCJcIjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZ2V0OiAoZm9ybTogYW55LCBrZXk6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBnZXQoZm9ybSwga2V5KTtcclxuICAgICAgfSxcclxuICAgICAgdWksXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkLFxyXG4gICAgICBkb1NlYXJjaCxcclxuICAgICAgZG9SZXNldCxcclxuICAgICAgZm9ybSxcclxuICAgICAgY29tcG9uZW50UmVuZGVyUmVmcyxcclxuICAgICAgZ2V0Q29tcG9uZW50UmVuZGVyUmVmLFxyXG4gICAgICBnZXRDb21wb25lbnRSZWYsXHJcbiAgICAgIGdldEZvcm0sXHJcbiAgICAgIHNldEZvcm0sXHJcbiAgICAgIHNlYXJjaEZvcm1SZWYsXHJcbiAgICAgIG9uSW5wdXQsXHJcbiAgICAgIGlucHV0RXZlbnREaXNhYmxlZCxcclxuICAgICAgY2hhbmdlSW5wdXRFdmVudERpc2FibGVkLFxyXG4gICAgICBjb21wdXRlZENvbHVtbnMsXHJcbiAgICAgIGNvbXB1dGVkQnV0dG9ucyxcclxuICAgICAgY29tcHV0ZWRSdWxlcyxcclxuICAgICAgY29sdW1uc1Jvd1JlZixcclxuICAgICAgY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQsXHJcbiAgICAgIGNvbXB1dGVkQ29sTmFtZSxcclxuICAgICAgY29tcHV0ZWRJc011bHRpTGluZSxcclxuICAgICAgdG9nZ2xlQ29sbGFwc2UsXHJcbiAgICAgIHNlYXJjaEV2ZW50Q29udGV4dFJlZlxyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi5mcy1zZWFyY2gge1xyXG4gIC8vZGlzcGxheTogZmxleDtcclxuICAvL2ZsZXgtd3JhcDogbm93cmFwO1xyXG4gIC5zZWFyY2gtbGVmdCB7XHJcbiAgfVxyXG4gIC5zZWFyY2gtcmlnaHQge1xyXG4gICAgZmxleDogMTtcclxuICB9XHJcbiAgLmFudC1mb3JtLWlubGluZSB7XHJcbiAgICBmbGV4LXdyYXA6IHdyYXA7XHJcbiAgfVxyXG4gIC5mcy1zZWFyY2gtZm9ybSB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGZsZXgtd3JhcDogd3JhcDtcclxuICAgIC8vJiA+ICoge1xyXG4gICAgLy8gIG1hcmdpbi1ib3R0b206IDRweDtcclxuICAgIC8vICBtYXJnaW4tdG9wOiA0cHg7XHJcbiAgICAvLyAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xyXG4gICAgLy99XHJcblxyXG4gICAgLmZzLXNlYXJjaC1ib3gge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAuZnMtc2VhcmNoLW1haW4ge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLmZzLXNlYXJjaC1jb2wge1xyXG4gICAgICAmID4gKiB7XHJcbiAgICAgICAgbWFyZ2luOiAwcHggNXB4O1xyXG4gICAgICB9XHJcbiAgICAgIG1hcmdpbjogMXB4IDA7XHJcbiAgICAgICY6Zmlyc3QtY2hpbGQge1xyXG4gICAgICAgIC8vIG1hcmdpbi1sZWZ0OiAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLmVsLWZvcm0taXRlbSB7XHJcbiAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcclxuICAgICAgbWFyZ2luLXRvcDogNHB4O1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC5lbC1mb3JtLS1pbmxpbmUge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC5lbC1mb3JtLWl0ZW1fX2NvbnRlbnQge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLmZzLXNlYXJjaC1idG5zIHtcclxuICAgIC5mcy1idXR0b24ge1xyXG4gICAgICBtYXJnaW4tcmlnaHQ6IDVweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICYuZnMtc2VhcmNoLW11bHRpLWxpbmUge1xyXG4gICAgLmZzLXNlYXJjaC1ib3gge1xyXG4gICAgICAuZnMtc2VhcmNoLW1haW4ge1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgICAgLmZzLXNlYXJjaC1jb2x1bW5zIHtcclxuICAgICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICAgIG92ZXJmbG93LXk6IGhpZGRlbjtcclxuICAgICAgICAgIC8vIHRyYW5zaXRpb246IGFsbCAwLjNzIGxpbmVhcjtcclxuICAgICAgICAgIC8vIHdpbGwtY2hhbmdlOiBoZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC5mcy1zZWFyY2gtYnRucyB7XHJcbiAgICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgICAgICAgIG1hcmdpbi10b3A6IDRweDtcclxuICAgICAgICAgIC5lbC1mb3JtLWl0ZW1fX2NvbnRlbnQge1xyXG4gICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAubi1mb3JtLWl0ZW0tYmxhbmsge1xyXG4gICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC5mcy1zZWFyY2gtYWN0aW9uIHtcclxuICAgICAgLmFudC1mb3JtLWl0ZW0ge1xyXG4gICAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4uZnMtc2VhcmNoIHtcclxuICAubi1mb3JtLWl0ZW0tYmxhbmsge1xyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jb2xsYXBzZVRyYW5zaXRpb24ubmFtZVwiPlxyXG4gICAgPGRpdiB2LWlmPVwic2hvdyAhPT0gZmFsc2VcIiBjbGFzcz1cImZzLXNlYXJjaFwiIDpjbGFzcz1cInsgJ2ZzLXNlYXJjaC1tdWx0aS1saW5lJzogY29tcHV0ZWRJc011bHRpTGluZSB9XCI+XHJcbiAgICAgIDxjb21wb25lbnRcclxuICAgICAgICA6aXM9XCJ1aS5mb3JtLm5hbWVcIlxyXG4gICAgICAgIHJlZj1cInNlYXJjaEZvcm1SZWZcIlxyXG4gICAgICAgIDptb2RlbD1cImZvcm1cIlxyXG4gICAgICAgIHYtYmluZD1cIm9wdGlvbnNcIlxyXG4gICAgICAgIDpydWxlcz1cImNvbXB1dGVkUnVsZXNcIlxyXG4gICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLWZvcm1cIlxyXG4gICAgICAgIEBjb21wb3NpdGlvbnN0YXJ0PVwiY2hhbmdlSW5wdXRFdmVudERpc2FibGVkKHRydWUpXCJcclxuICAgICAgICBAY29tcG9zaXRpb25lbmQ9XCJjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQoZmFsc2UpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtYm94XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLW1haW5cIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLWNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgJ2ZzLXNlYXJjaC1jb2xsYXBzZSc6IGNvbGxhcHNlIH1cIlxyXG4gICAgICAgICAgICAgIDpzdHlsZT1cInsgaGVpZ2h0OiBjb21wdXRlZENvbHVtbkJveEhlaWdodCB9XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiByZWY9XCJjb2x1bW5zUm93UmVmXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJzbG90c1snc2VhcmNoLWxlZnQnXVwiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1sZWZ0J11cIiA6c2NvcGU9XCJzZWFyY2hFdmVudENvbnRleHRSZWZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGtleSkgaW4gY29tcHV0ZWRDb2x1bW5zXCIgOmtleT1cImtleVwiPlxyXG4gICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cImNvbXB1dGVkQ29sTmFtZVwiIHYtaWY9XCJpdGVtLnNob3cgPT09IHRydWVcIiBjbGFzcz1cImZzLXNlYXJjaC1jb2xcIiB2LWJpbmQ9XCJpdGVtLmNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiIHYtYmluZD1cIml0ZW1cIiA6W3VpLmZvcm1JdGVtLnByb3BdPVwia2V5XCIgOmxhYmVsPVwiaXRlbS50aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzbG90c1snc2VhcmNoXycgKyBrZXldXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoXycgKyBrZXldXCIgOnNjb3BlPVwieyAuLi5zZWFyY2hFdmVudENvbnRleHRSZWYsIGtleSB9XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZnMtY29tcG9uZW50LXJlbmRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHYtaWY9XCJpdGVtLmNvbXBvbmVudCAmJiBpdGVtLmNvbXBvbmVudC5zaG93ICE9PSBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOnJlZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UmVuZGVyUmVmc1tpdGVtLmtleV0gPSBlbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOm1vZGVsLXZhbHVlPVwiZ2V0KGZvcm0sIGtleSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHYtYmluZD1cIml0ZW0uY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6c2NvcGU9XCJzZWFyY2hFdmVudENvbnRleHRSZWZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJvblZhbHVlQ2hhbmdlZCgkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaW5wdXQ9XCJvbklucHV0KGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJzbG90c1snc2VhcmNoLW1pZGRsZSddXCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1taWRkbGVcIj5cclxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtbWlkZGxlJ11cIiA6c2NvcGU9XCJzZWFyY2hFdmVudENvbnRleHRSZWZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGZzLXNlYXJjaC1idXR0b25zIHYtaWY9XCIhY29tcHV0ZWRJc011bHRpTGluZVwiIDpidXR0b25zPVwiY29tcHV0ZWRCdXR0b25zXCI+PC9mcy1zZWFyY2gtYnV0dG9ucz5cclxuICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cInNsb3RzWydzZWFyY2gtcmlnaHQnXVwiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtcmlnaHQnXVwiIDpzY29wZT1cInNlYXJjaEV2ZW50Q29udGV4dFJlZlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZnMtc2VhcmNoLWJ1dHRvbnMgdi1pZj1cImNvbXB1dGVkSXNNdWx0aUxpbmVcIiA6YnV0dG9ucz1cImNvbXB1dGVkQnV0dG9uc1wiPjwvZnMtc2VhcmNoLWJ1dHRvbnM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IHYtaWY9XCJjb21wdXRlZElzTXVsdGlMaW5lXCIgY2xhc3M9XCJmcy1zZWFyY2gtYWN0aW9uXCI+XHJcbiAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxyXG4gICAgICAgICAgICAgIDxmcy1idXR0b24gOmljb249XCJjb2xsYXBzZSA/IHVpLmljb25zLmNhcmV0VXAgOiB1aS5pY29ucy5jYXJldERvd25cIiBAY2xpY2s9XCJ0b2dnbGVDb2xsYXBzZVwiIC8+XHJcbiAgICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9jb21wb25lbnQ+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBuZXh0VGljaywgb25Nb3VudGVkLCByZWFjdGl2ZSwgcmVmLCBSZWYsIHVucmVmIH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyBlYWNoLCBmb3JFYWNoLCBzb3J0QnksIGVudHJpZXMsIHVuc2V0LCBzZXQsIGtleXMsIGdldCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcclxuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcclxuaW1wb3J0IGxvZ2dlciBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5sb2dcIjtcclxuaW1wb3J0IEZzU2VhcmNoQnV0dG9ucyBmcm9tIFwiLi9idXR0b25zLnZ1ZVwiO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgQnV0dG9uc1Byb3BzLCBTZWFyY2hFdmVudENvbnRleHQsIFNlYXJjaEl0ZW1Qcm9wcyB9IGZyb20gXCIuLi8uLi9kXCI7XHJcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtdWlcIjtcclxuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1tZXJnZVwiO1xyXG5cclxuLyoqXHJcbiAqIOafpeivouahhue7hOS7tlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzU2VhcmNoVjFcIixcclxuICBjb21wb25lbnRzOiB7IEZzU2VhcmNoQnV0dG9ucyB9LFxyXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5p+l6K+i5p2h5Lu2XHJcbiAgICAgKiDngrnlh7vph43nva7vvIzkvJrph43nva7miJDor6XmnaHku7ZcclxuICAgICAqL1xyXG4gICAgaW5pdGlhbEZvcm06IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDooajljZXlj4LmlbBcclxuICAgICAqIOaUr+aMgWVsLWZvcm0gfCBhLWZvcm3nmoTlsZ7mgKdcclxuICAgICAqL1xyXG4gICAgb3B0aW9uczoge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOafpeivouWtl+autemFjee9rlxyXG4gICAgICovXHJcbiAgICBjb2x1bW5zOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogdGFic1xyXG4gICAgICogeyBzaG93ICwgb3B0aW9ucyxrZXksIGRlZmF1bHR9XHJcbiAgICAgKi9cclxuICAgIHRhYnM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmjInpkq7phY3nva4s5Y+v5Lul5qC55o2ub3JkZXLmjpLluo9cclxuICAgICAqIHtzZWFyY2g6ey4uLkZzQnV0dG9ufSxyZXNldDp7Li4uRnNCdXR0b259fVxyXG4gICAgICovXHJcbiAgICBidXR0b25zOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog54K55Ye76YeN572u5ZCO5piv5ZCm56uL5Y2z6Kem5Y+R5p+l6K+iXHJcbiAgICAgKi9cclxuICAgIHNlYXJjaEFmdGVyUmVzZXQ6IHtcclxuICAgICAgdHlwZTogQm9vbGVhbixcclxuICAgICAgZGVmYXVsdDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5byA5ZCv6Ieq5Yqo5p+l6K+iXHJcbiAgICAgKi9cclxuICAgIGF1dG9TZWFyY2g6IHtcclxuICAgICAgdHlwZTogQm9vbGVhbixcclxuICAgICAgZGVmYXVsdDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog6Ieq5Yqo5p+l6K+i77yM6Ziy5oqW6K6+572uXHJcbiAgICAgKiDkvKBmYWxzZeWImeWFs+mXreiHquWKqOafpeivolxyXG4gICAgICovXHJcbiAgICBkZWJvdW5jZToge1xyXG4gICAgICB0eXBlOiBbQm9vbGVhbiwgT2JqZWN0XSxcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmj5Lmp71cclxuICAgICAqL1xyXG4gICAgc2xvdHM6IHtcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuaYvuekuuafpeivouahhlxyXG4gICAgICovXHJcbiAgICBzaG93OiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuWQr+eUqOagoemqjFxyXG4gICAgICovXHJcbiAgICB2YWxpZGF0ZToge1xyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5biD5bGALCBzaW5nbGUtbGluZSDljZXooYzvvIwgbXVsdGktbGluZSDlpJrooYzvvIjmlK/mjIHlsZXlvIDmlLbotbfvvIlcclxuICAgICAqL1xyXG4gICAgbGF5b3V0OiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogXCJzaW5nbGUtbGluZVwiXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDliJfnmoTlrr3luqborr7nva7vvIxzcGFuPXh4XHJcbiAgICAgKi9cclxuICAgIGNvbDoge30sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmK/lkKbmipjlj6BcclxuICAgICAqL1xyXG4gICAgY29sbGFwc2U6IHtcclxuICAgICAgdHlwZTogQm9vbGVhbixcclxuICAgICAgZGVmYXVsdDogZmFsc2VcclxuICAgIH1cclxuICB9LFxyXG4gIGVtaXRzOiBbXHJcbiAgICAvKipcclxuICAgICAqIOafpeivouS6i+S7tlxyXG4gICAgICoqL1xyXG4gICAgXCJzZWFyY2hcIixcclxuICAgIC8qKlxyXG4gICAgICog6YeN572u5LqL5Lu2XHJcbiAgICAgKiovXHJcbiAgICBcInJlc2V0XCIsXHJcbiAgICBcImNvbGxhcHNlXCIsXHJcbiAgICBcInVwZGF0ZTpjb2xsYXBzZVwiXHJcbiAgXSxcclxuICBzZXR1cChwcm9wcywgY3R4KSB7XHJcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG4gICAgLy8g5byC5q2lc2V0dXDpnIDopoHmlL7lnKjnrKzkuIDkuKphd2FpdOS5i+WJjVxyXG4gICAgLy8gb25Nb3VudGVkIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLlxyXG4gICAgLy/kuLrllaXkvJrmnInov5nkuKrorablkYpcclxuICAgIG9uTW91bnRlZCgoKSA9PiB7XHJcbiAgICAgIGlmIChjb21wdXRlZElzTXVsdGlMaW5lLnZhbHVlICYmIGNvbHVtbnNSb3dSZWYudmFsdWUpIHtcclxuICAgICAgICBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID0gY29sdW1uc1Jvd1JlZi52YWx1ZS4kZWwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbnNMaXN0ID0gY29sdW1uc1Jvd1JlZi52YWx1ZS4kZWwuY2hpbGRyZW47XHJcbiAgICAgICAgaWYgKGNvbHVtbnNMaXN0ICYmIGNvbHVtbnNMaXN0Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgIGNvbHVtbnNMaW5lSGVpZ2h0UmVmLnZhbHVlID0gY29sdW1uc0xpc3RbMV0ub2Zmc2V0SGVpZ2h0ICsgMjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBhdXRvU2VhcmNoOiBhbnkgPSBudWxsO1xyXG4gICAgZnVuY3Rpb24gY3JlYXRlSW5pdGlhbEZvcm0oKSB7XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICByZXR1cm4gY2xvbmVEZWVwKHByb3BzLmluaXRpYWxGb3JtIHx8IHt9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGZvcm0gPSByZWFjdGl2ZShjcmVhdGVJbml0aWFsRm9ybSgpKTtcclxuICAgIGNvbnN0IHsgZG9Db21wdXRlZCwgQXN5bmNDb21wdXRlVmFsdWUgfSA9IHVzZUNvbXB1dGUoKTtcclxuICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS52YWx1ZSAhPSBudWxsICYmIGl0ZW0udmFsdWUgaW5zdGFuY2VvZiBBc3luY0NvbXB1dGVWYWx1ZSkge1xyXG4gICAgICAgIGxvZ2dlci53YXJuKFwic2VhcmNoLnZhbHVl6YWN572u5LiN5pSv5oyBQXN5bmNDb21wdXRl57G75Z6L55qE5Yqo5oCB6K6h566XXCIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XHJcbiAgICBjb25zdCBkb01lcmdlID0gbWVyZ2U7XHJcbiAgICBjb25zdCBjb21wdXRlZENvbHVtbnMgPSBkb0NvbXB1dGVkKFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgcmV0dXJuIHByb3BzLmNvbHVtbnM7XHJcbiAgICAgIH0sXHJcbiAgICAgIGdldENvbnRleHRGbixcclxuICAgICAgbnVsbCxcclxuICAgICAgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgaWYgKCFwcm9wcy52YWxpZGF0ZSkge1xyXG4gICAgICAgICAgLy/lpoLmnpzlhbPpl612YWxpZGF0ZeWImeWOu+aOiXJ1bGVzXHJcbiAgICAgICAgICBmb3JFYWNoKHZhbHVlLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgaXRlbS5ydWxlcztcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDlkIjlubZjb2xcclxuICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICBpZiAocHJvcHMuY29sKSB7XHJcbiAgICAgICAgICBmb3JFYWNoKHZhbHVlLCAodikgPT4ge1xyXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgICAgdi5jb2wgPSBtZXJnZSh7fSwgcHJvcHMuY29sLCB2LmNvbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8v5a2X5q615o6S5bqPXHJcbiAgICAgICAgbGV0IHNvcnRBcnI6IFNlYXJjaEl0ZW1Qcm9wc1tdID0gW107XHJcbiAgICAgICAgZm9yRWFjaCh2YWx1ZSwgKHYsIGtleSkgPT4ge1xyXG4gICAgICAgICAgdi5fa2V5ID0ga2V5O1xyXG4gICAgICAgICAgc29ydEFyci5wdXNoKHYpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiBpdGVtLm9yZGVyID8/IENvbnN0YW50cy5vcmRlckRlZmF1bHQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNvcnRlZENvbHVtbnM6IHtcclxuICAgICAgICAgIFtrZXk6IHN0cmluZ106IFNlYXJjaEl0ZW1Qcm9wcztcclxuICAgICAgICB9ID0ge307XHJcblxyXG4gICAgICAgIHNvcnRBcnIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgbGV0IF9rZXkgPSBpdGVtLl9rZXk7XHJcbiAgICAgICAgICBkZWxldGUgaXRlbS5fa2V5O1xyXG4gICAgICAgICAgc29ydGVkQ29sdW1uc1tfa2V5XSA9IGl0ZW07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHNvcnRlZENvbHVtbnM7XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgLy/pu5jorqTlgLxcclxuICAgIGZvckVhY2goY29tcHV0ZWRDb2x1bW5zLnZhbHVlLCAoY29sdW1uLCBrZXkpID0+IHtcclxuICAgICAgaWYgKGNvbHVtbi52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGRlZlZhbHVlID0gdW5yZWYoY29sdW1uLnZhbHVlKTtcclxuICAgICAgaWYgKGRlZlZhbHVlICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLnNob3cgIT09IGZhbHNlICYmIGNvbHVtbi5jb21wb25lbnQ/LnNob3cgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgLy/pu5jorqTlgLxcclxuICAgICAgICBmb3JtW2tleV0gPSBkZWZWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBzZWFyY2hGb3JtUmVmID0gcmVmKCk7XHJcbiAgICBjb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcclxuICAgIGNvbnN0IGNvbXBvbmVudFJlbmRlclJlZnM6IFJlZiA9IHJlZih7fSk7XHJcbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZnMudmFsdWVba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoa2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50UmVuZGVyUmVmKGtleSk/LiRyZWZzPy50YXJnZXRSZWY7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Q29udGV4dEZuKCk6IFNlYXJjaEV2ZW50Q29udGV4dCB7XHJcbiAgICAgIHJldHVybiB7IGZvcm0sIHZhbGlkYXRlZEZvcm06IGZvcm0sIGdldENvbXBvbmVudFJlZiwgZG9WYWxpZGF0ZTogbnVsbCB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlYXJjaEV2ZW50Q29udGV4dFJlZjogUmVmPFNlYXJjaEV2ZW50Q29udGV4dD4gPSByZWYoZ2V0Q29udGV4dEZuKCkpO1xyXG5cclxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvU2VhcmNoKCkge1xyXG4gICAgICBpZiAoYXV0b1NlYXJjaCkge1xyXG4gICAgICAgIC8vIOmYsuaKluafpeivouWPlua2iFxyXG4gICAgICAgIGF1dG9TZWFyY2guY2FuY2VsKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHZhbGlkID0gYXdhaXQgdWkuZm9ybS52YWxpZGF0ZVdyYXAoc2VhcmNoRm9ybVJlZi52YWx1ZSk7XHJcbiAgICAgIGlmICh2YWxpZCkge1xyXG4gICAgICAgIGN0eC5lbWl0KFwic2VhcmNoXCIsIHNlYXJjaEV2ZW50Q29udGV4dFJlZi52YWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdWkubWVzc2FnZS5lcnJvcih7XHJcbiAgICAgICAgICBtZXNzYWdlOiB0KFwiZnMuc2VhcmNoLmVycm9yLm1lc3NhZ2VcIilcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkb1Jlc2V0KCkge1xyXG4gICAgICAvLyB1aS5mb3JtLnJlc2V0V3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlLCB7IGZvcm0sIGluaXRpYWxGb3JtOiBjcmVhdGVJbml0aWFsRm9ybSgpIH0pO1xyXG4gICAgICBjb25zdCBpbml0aWFsRm9ybSA9IGNyZWF0ZUluaXRpYWxGb3JtKCk7XHJcbiAgICAgIGNvbnN0IGVudHJpZXNSZXQgPSBlbnRyaWVzKGZvcm0pO1xyXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXNSZXQpIHtcclxuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBnZXQoaW5pdGlhbEZvcm0sIGVudHJ5WzBdKTtcclxuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgIHVuc2V0KGZvcm0sIGVudHJ5WzBdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2V0KGZvcm0sIGVudHJ5WzBdLCBpbml0aWFsVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgaWYgKHByb3BzLnJlc2V0KSB7XHJcbiAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgcHJvcHMucmVzZXQoc2VhcmNoRXZlbnRDb250ZXh0UmVmLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDooajljZXph43nva7kuovku7ZcclxuICAgICAgY3R4LmVtaXQoXCJyZXNldFwiLCBnZXRDb250ZXh0Rm4oKSk7XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICBpZiAocHJvcHMuc2VhcmNoQWZ0ZXJSZXNldCkge1xyXG4gICAgICAgIG5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgIGRvU2VhcmNoKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGNvbXB1dGVkQnV0dG9ucyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgY29uc3QgYnRuczogYW55ID0gW107XHJcbiAgICAgIGNvbnN0IGRlZkJ0bk9wdGlvbnM6IEJ1dHRvbnNQcm9wczxTZWFyY2hFdmVudENvbnRleHQ+ID0ge1xyXG4gICAgICAgIHNlYXJjaDoge1xyXG4gICAgICAgICAgc2hvdzogdHJ1ZSxcclxuICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgY2xpY2s6IChjb250ZXh0OiBTZWFyY2hFdmVudENvbnRleHQpID0+IHtcclxuICAgICAgICAgICAgZG9TZWFyY2goKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvcmRlcjogMSxcclxuICAgICAgICAgIHRleHQ6IHQoXCJmcy5zZWFyY2guc2VhcmNoLnRleHRcIikgLy8gJ+afpeivoicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXNldDoge1xyXG4gICAgICAgICAgc2hvdzogdHJ1ZSxcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICAgIGNsaWNrOiAoY29udGV4dDogU2VhcmNoRXZlbnRDb250ZXh0KSA9PiB7XHJcbiAgICAgICAgICAgIGRvUmVzZXQoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB0ZXh0OiB0KFwiZnMuc2VhcmNoLnJlc2V0LnRleHRcIiksIC8vICfph43nva4nLFxyXG4gICAgICAgICAgb3JkZXI6IDJcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICBtZXJnZShkZWZCdG5PcHRpb25zLCBwcm9wcy5idXR0b25zKTtcclxuICAgICAgZm9yIChsZXQga2V5IGluIGRlZkJ0bk9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBidG4gPSBkZWZCdG5PcHRpb25zW2tleV07XHJcbiAgICAgICAgYnRuLl9jbGljayA9ICgpID0+IHtcclxuICAgICAgICAgIGJ0bi5jbGljayhnZXRDb250ZXh0Rm4oKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBidG5zLnB1c2goYnRuKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYnRucy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBidG5zO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZnVuY3Rpb24gaW5pdEF1dG9TZWFyY2goKSB7XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICBpZiAocHJvcHMuYXV0b1NlYXJjaCA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgLy8g5p6E5bu66Ziy5oqW5p+l6K+i5Ye95pWwXHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICBpZiAocHJvcHMuZGVib3VuY2UgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgbGV0IHdhaXQgPSBwcm9wcy5kZWJvdW5jZT8ud2FpdCB8fCA1MDA7XHJcbiAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgYXV0b1NlYXJjaCA9IGRlYm91bmNlKGRvU2VhcmNoLCB3YWl0LCBwcm9wcy5kZWJvdW5jZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0QXV0b1NlYXJjaCgpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGdldEZvcm0oKSB7XHJcbiAgICAgIHJldHVybiBmb3JtO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K6+572uZm9ybeWAvFxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBzZXRGb3JtKG5ld0Zvcm06IGFueSwgbWVyZ2UgPSB0cnVlKSB7XHJcbiAgICAgIGlmICghbWVyZ2UpIHtcclxuICAgICAgICBlYWNoKGtleXMoZm9ybSksIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBkZWxldGUgZm9ybVtpdGVtXTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBkb01lcmdlKGZvcm0sIG5ld0Zvcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGlucHV0RXZlbnREaXNhYmxlZCA9IHJlZihmYWxzZSk7XHJcblxyXG4gICAgY29uc3QgZG9BdXRvU2VhcmNoID0gKCkgPT4ge1xyXG4gICAgICBsb2dnZXIuZGVidWcoXCJkbyBhdXRvIHNlYXJjaCxpbnB1dEV2ZW50RGlzYWJsZWQ6XCIsIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSk7XHJcbiAgICAgIGlmIChpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUgIT09IHRydWUgJiYgYXV0b1NlYXJjaCkge1xyXG4gICAgICAgIC8vIOmYsuaKluafpeivolxyXG4gICAgICAgIGF1dG9TZWFyY2goKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBvbklucHV0ID0gKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJpbnB1dFwiKSB7XHJcbiAgICAgICAgZG9BdXRvU2VhcmNoKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICAvLyDovpPlhaXms5Xnm5HlkKxcclxuICAgIGNvbnN0IGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCA9IChkaXNhYmxlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgICBpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUgPSBkaXNhYmxlZDtcclxuICAgICAgZG9BdXRvU2VhcmNoKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIG9uVmFsdWVDaGFuZ2VkKHZhbHVlOiBhbnksIGl0ZW06IFNlYXJjaEl0ZW1Qcm9wcykge1xyXG4gICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcclxuICAgICAgc2V0KGZvcm0sIGtleSwgdmFsdWUpO1xyXG4gICAgICBpZiAoaXRlbS52YWx1ZUNoYW5nZSkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybVtrZXldO1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGdldENvbXBvbmVudFJlZihrZXkpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlID0gaXRlbS52YWx1ZUNoYW5nZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gaXRlbS52YWx1ZUNoYW5nZSA6IGl0ZW0udmFsdWVDaGFuZ2UuaGFuZGxlO1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIHZhbHVlQ2hhbmdlKHsga2V5LCB2YWx1ZSwgY29tcG9uZW50UmVmLCAuLi5nZXRDb250ZXh0Rm4oKSwgaW1taWRpYXRlOiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PSBudWxsIHx8IGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IHRydWUgfHwgaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJjaGFuZ2VcIikge1xyXG4gICAgICAgIGRvQXV0b1NlYXJjaCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29tcHV0ZWRSdWxlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIGlmICghcHJvcHMudmFsaWRhdGUpIHtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH1cclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIHJldHVybiBwcm9wcy5vcHRpb25zLnJ1bGVzO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8tLS0tLeWkmuihjOaooeW8j+aKmOWPoFxyXG5cclxuICAgIGNvbnN0IGNvbHVtbnNSb3dSZWYgPSByZWYoKTtcclxuICAgIGNvbnN0IGNvbHVtbnNCb3hIZWlnaHRSZWYgPSByZWYoMCk7XHJcbiAgICBjb25zdCBjb2x1bW5zTGluZUhlaWdodFJlZiA9IHJlZigwKTtcclxuXHJcbiAgICBjb25zdCB0b2dnbGVDb2xsYXBzZSA9ICgpID0+IHtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOmNvbGxhcHNlXCIsICFwcm9wcy5jb2xsYXBzZSk7XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICBjdHguZW1pdChcImNvbGxhcHNlXCIsICFwcm9wcy5jb2xsYXBzZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkQ29sTmFtZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIGlmIChwcm9wcy5sYXlvdXQgPT09IFwibXVsdGktbGluZVwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHVpLmNvbC5uYW1lO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBcImRpdlwiO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBjb21wdXRlZElzTXVsdGlMaW5lID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgcmV0dXJuIHByb3BzLmxheW91dCA9PT0gXCJtdWx0aS1saW5lXCI7XHJcbiAgICAgIC8v5LiN6KaB6L+Z5Liq77yM5Lya5q275b6q546v77yMICYmIGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgPiBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBpZiAoIWNvbXB1dGVkSXNNdWx0aUxpbmUudmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gXCJhdXRvXCI7XHJcbiAgICAgIH1cclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIGlmIChwcm9wcy5jb2xsYXBzZSkge1xyXG4gICAgICAgIHJldHVybiBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZSA/IGNvbHVtbnNMaW5lSGVpZ2h0UmVmLnZhbHVlICsgXCJweFwiIDogXCJcIjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA/IGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgKyBcInB4XCIgOiBcIlwiO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBnZXQ6IChmb3JtOiBhbnksIGtleTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldChmb3JtLCBrZXkpO1xyXG4gICAgICB9LFxyXG4gICAgICB1aSxcclxuICAgICAgb25WYWx1ZUNoYW5nZWQsXHJcbiAgICAgIGRvU2VhcmNoLFxyXG4gICAgICBkb1Jlc2V0LFxyXG4gICAgICBmb3JtLFxyXG4gICAgICBjb21wb25lbnRSZW5kZXJSZWZzLFxyXG4gICAgICBnZXRDb21wb25lbnRSZW5kZXJSZWYsXHJcbiAgICAgIGdldENvbXBvbmVudFJlZixcclxuICAgICAgZ2V0Rm9ybSxcclxuICAgICAgc2V0Rm9ybSxcclxuICAgICAgc2VhcmNoRm9ybVJlZixcclxuICAgICAgb25JbnB1dCxcclxuICAgICAgaW5wdXRFdmVudERpc2FibGVkLFxyXG4gICAgICBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQsXHJcbiAgICAgIGNvbXB1dGVkQ29sdW1ucyxcclxuICAgICAgY29tcHV0ZWRCdXR0b25zLFxyXG4gICAgICBjb21wdXRlZFJ1bGVzLFxyXG4gICAgICBjb2x1bW5zUm93UmVmLFxyXG4gICAgICBjb21wdXRlZENvbHVtbkJveEhlaWdodCxcclxuICAgICAgY29tcHV0ZWRDb2xOYW1lLFxyXG4gICAgICBjb21wdXRlZElzTXVsdGlMaW5lLFxyXG4gICAgICB0b2dnbGVDb2xsYXBzZSxcclxuICAgICAgc2VhcmNoRXZlbnRDb250ZXh0UmVmXHJcbiAgICB9O1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLXNlYXJjaCB7XHJcbiAgLy9kaXNwbGF5OiBmbGV4O1xyXG4gIC8vZmxleC13cmFwOiBub3dyYXA7XHJcbiAgLnNlYXJjaC1sZWZ0IHtcclxuICB9XHJcbiAgLnNlYXJjaC1yaWdodCB7XHJcbiAgICBmbGV4OiAxO1xyXG4gIH1cclxuICAuYW50LWZvcm0taW5saW5lIHtcclxuICAgIGZsZXgtd3JhcDogd3JhcDtcclxuICB9XHJcbiAgLmZzLXNlYXJjaC1mb3JtIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgZmxleC13cmFwOiB3cmFwO1xyXG4gICAgLy8mID4gKiB7XHJcbiAgICAvLyAgbWFyZ2luLWJvdHRvbTogNHB4O1xyXG4gICAgLy8gIG1hcmdpbi10b3A6IDRweDtcclxuICAgIC8vICBtYXJnaW4tcmlnaHQ6IDEwcHg7XHJcbiAgICAvL31cclxuXHJcbiAgICAuZnMtc2VhcmNoLWJveCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIC5mcy1zZWFyY2gtbWFpbiB7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAuZnMtc2VhcmNoLWNvbCB7XHJcbiAgICAgICYgPiAqIHtcclxuICAgICAgICBtYXJnaW46IDBweCA1cHg7XHJcbiAgICAgIH1cclxuICAgICAgbWFyZ2luOiAxcHggMDtcclxuICAgICAgJjpmaXJzdC1jaGlsZCB7XHJcbiAgICAgICAgLy8gbWFyZ2luLWxlZnQ6IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAuZWwtZm9ybS1pdGVtIHtcclxuICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xyXG4gICAgICBtYXJnaW4tdG9wOiA0cHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLmVsLWZvcm0tLWlubGluZSB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLmVsLWZvcm0taXRlbV9fY29udGVudCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAuZnMtc2VhcmNoLWJ0bnMge1xyXG4gICAgLmZzLWJ1dHRvbiB7XHJcbiAgICAgIG1hcmdpbi1yaWdodDogNXB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJi5mcy1zZWFyY2gtbXVsdGktbGluZSB7XHJcbiAgICAuZnMtc2VhcmNoLWJveCB7XHJcbiAgICAgIC5mcy1zZWFyY2gtbWFpbiB7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICAuZnMtc2VhcmNoLWNvbHVtbnMge1xyXG4gICAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgICAgb3ZlcmZsb3cteTogaGlkZGVuO1xyXG4gICAgICAgICAgLy8gdHJhbnNpdGlvbjogYWxsIDAuM3MgbGluZWFyO1xyXG4gICAgICAgICAgLy8gd2lsbC1jaGFuZ2U6IGhlaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLmZzLXNlYXJjaC1idG5zIHtcclxuICAgICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgICAgICAgbWFyZ2luLXRvcDogNHB4O1xyXG4gICAgICAgICAgLmVsLWZvcm0taXRlbV9fY29udGVudCB7XHJcbiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC5uLWZvcm0taXRlbS1ibGFuayB7XHJcbiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLmZzLXNlYXJjaC1hY3Rpb24ge1xyXG4gICAgICAuYW50LWZvcm0taXRlbSB7XHJcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi5mcy1zZWFyY2gge1xyXG4gIC5uLWZvcm0taXRlbS1ibGFuayB7XHJcbiAgfVxyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWxheW91dC1kZWZhdWx0XCIgOmNsYXNzPVwieyAnZnMtc2VhcmNoLW11bHRpLWxpbmUnOiBjb21wdXRlZElzTXVsdGlMaW5lIH1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtYm94XCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1tYWluXCJcclxuICAgICAgICA6Y2xhc3M9XCJ7ICdmcy1zZWFyY2gtY29sbGFwc2UnOiBjb2xsYXBzZSB9XCJcclxuICAgICAgICA6c3R5bGU9XCJ7IG1heEhlaWdodDogY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQgfVwiXHJcbiAgICAgID5cclxuICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCIgcmVmPVwiY29sdW1uc1Jvd1JlZlwiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbHVtbnNcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtc2xvdFwiPlxyXG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoLWxlZnRcIj48L3Nsb3Q+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8IS0tIOafpeivouWtl+autXJlbmRlcu+8jOmcgOimgeWumuS5iXByb3BzLmNvbHVtbnMgLS0+XHJcbiAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwga2V5KSBvZiBjb2x1bW5zXCIgOmtleT1cImtleVwiPlxyXG4gICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmNvbC5uYW1lXCIgdi1pZj1cIml0ZW0uc2hvd1wiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbFwiIHYtYmluZD1cIm1lcmdlQ29sKGl0ZW0uY29sKVwiPlxyXG4gICAgICAgICAgICAgIDxmcy1yZW5kZXIgOnJlbmRlci1mdW5jPVwiaXRlbS5fY2VsbFJlbmRlclwiIDpzY29wZT1cImdldENvbnRleHRGbigpXCIgLz5cclxuICAgICAgICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1zbG90XCI+XHJcbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2gtbWlkZGxlXCI+PC9zbG90PlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgICA6aXM9XCJ1aS5jb2wubmFtZVwiXHJcbiAgICAgICAgICAgIHYtaWY9XCIhY29tcHV0ZWRJc011bHRpTGluZVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtYnV0dG9ucy1ncm91cFwiXHJcbiAgICAgICAgICAgIHYtYmluZD1cIm1lcmdlQ29sKGFjdGlvbj8uY29sKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiIDpbdWkuZm9ybUl0ZW0ubGFiZWxdPVwiYWN0aW9uPy5sYWJlbFwiPlxyXG4gICAgICAgICAgICAgIDwhLS0g5p+l6K+i5oyJ6ZKu5o+S5qe9LS0+XHJcbiAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaC1idXR0b25zXCIgdi1iaW5kPVwiZ2V0Q29udGV4dEZuKClcIj48L3Nsb3Q+XHJcbiAgICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLXNsb3RcIj5cclxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaC1yaWdodFwiIHYtYmluZD1cImdldENvbnRleHRGbigpXCI+PC9zbG90PlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiB2LWlmPVwiY29tcHV0ZWRJc011bHRpTGluZVwiIGNsYXNzPVwiZnMtc2VhcmNoLWJ1dHRvbnMtZ3JvdXAgZnMtc2VhcmNoLW11bHRpLWxpbmUtYnV0dG9uc1wiPlxyXG4gICAgICAgIDwhLS0g5aSa6KGM5qih5byP5pe255qE5p+l6K+i5oyJ6ZKuLS0+XHJcbiAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaC1idXR0b25zXCI+PC9zbG90PlxyXG4gICAgICAgIDxmcy1idXR0b25cclxuICAgICAgICAgIHYtaWY9XCJjb2xsYXBzZUJ1dHRvbj8uc2hvdyAhPT0gZmFsc2VcIlxyXG4gICAgICAgICAgOmljb249XCJjb2xsYXBzZSA/IHVpLmljb25zLmNhcmV0RG93biA6IHVpLmljb25zLmNhcmV0VXBcIlxyXG4gICAgICAgICAgOnRleHQ9XCJcclxuICAgICAgICAgICAgY29sbGFwc2VcclxuICAgICAgICAgICAgICA/IHQoJ2ZzLnNlYXJjaC5jb250YWluZXIuY29sbGFwc2VCdXR0b24udGV4dC5leHBhbmQnKVxyXG4gICAgICAgICAgICAgIDogdCgnZnMuc2VhcmNoLmNvbnRhaW5lci5jb2xsYXBzZUJ1dHRvbi50ZXh0LmNvbGxhcHNlJylcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICB2LWJpbmQ9XCJjb2xsYXBzZUJ1dHRvblwiXHJcbiAgICAgICAgICBAY2xpY2s9XCJ0b2dnbGVDb2xsYXBzZVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIG9uTW91bnRlZCwgcmVmIH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc1NlYXJjaExheW91dERlZmF1bHRcIixcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDmmK/lkKbmlLbnvKlcclxuICAgICAqL1xyXG4gICAgY29sbGFwc2U6IHtcclxuICAgICAgdHlwZTogQm9vbGVhbixcclxuICAgICAgZGVmYXVsdDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5bGV5byA5oyJ6ZKuXHJcbiAgICAgKi9cclxuICAgIGNvbGxhcHNlQnV0dG9uOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuXHJcbiAgICBhY3Rpb246IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDluIPlsYDmqKHlvI9cclxuICAgICAqL1xyXG4gICAgbGF5b3V0OiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogXCJzaW5nbGUtbGluZVwiXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmn6Xor6LlrZfmrrXliJfooajvvIzlj6/ku6Xnsr7nu4bljJboh6rlrprkuYnmn6Xor6LlrZfmrrXluIPlsYBcclxuICAgICAqL1xyXG4gICAgY29sdW1uczoge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOm7mOiupOeahGNvbOmFjee9rlxyXG4gICAgICovXHJcbiAgICBjb2w6IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5p+l6K+i5LiK5LiL5paHXHJcbiAgICAgKi9cclxuICAgIGdldENvbnRleHRGbjoge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvblxyXG4gICAgfVxyXG4gIH0sXHJcbiAgZW1pdHM6IFtcInVwZGF0ZTpjb2xsYXBzZVwiLCBcImNvbGxhcHNlXCJdLFxyXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgICBjb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcclxuICAgIGNvbnN0IGNvbHVtbnNSb3dSZWYgPSByZWYoKTtcclxuICAgIGNvbnN0IGNvbXB1dGVkSXNNdWx0aUxpbmUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiBwcm9wcy5sYXlvdXQgPT09IFwibXVsdGktbGluZVwiO1xyXG4gICAgICAvL+S4jeimgei/meS4qu+8jOS8muatu+W+queOr++8jCAmJiBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID4gY29sdW1uc0xpbmVIZWlnaHRSZWYudmFsdWU7XHJcbiAgICB9KTtcclxuICAgIG9uTW91bnRlZCgoKSA9PiB7XHJcbiAgICAgIGlmIChjb21wdXRlZElzTXVsdGlMaW5lLnZhbHVlICYmIGNvbHVtbnNSb3dSZWYudmFsdWUpIHtcclxuICAgICAgICBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID0gY29sdW1uc1Jvd1JlZi52YWx1ZS4kZWwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZENvbHVtbkJveEhlaWdodCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgaWYgKCFjb21wdXRlZElzTXVsdGlMaW5lLnZhbHVlIHx8ICFwcm9wcy5jb2xsYXBzZSkge1xyXG4gICAgICAgIHJldHVybiBcImF1dG9cIjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA/IGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgKyBcInB4XCIgOiBcIlwiO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY29sdW1uc0JveEhlaWdodFJlZiA9IHJlZigwKTtcclxuXHJcbiAgICBjb25zdCB0b2dnbGVDb2xsYXBzZSA9ICgpID0+IHtcclxuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6Y29sbGFwc2VcIiwgIXByb3BzLmNvbGxhcHNlKTtcclxuICAgICAgY3R4LmVtaXQoXCJjb2xsYXBzZVwiLCAhcHJvcHMuY29sbGFwc2UpO1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBtZXJnZUNvbChjb2w6IGFueSkge1xyXG4gICAgICByZXR1cm4gbWVyZ2Uoe30sIHByb3BzLmNvbCwgY29sKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1aSxcclxuICAgICAgY29sdW1uc1Jvd1JlZixcclxuICAgICAgY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQsXHJcbiAgICAgIGNvbXB1dGVkSXNNdWx0aUxpbmUsXHJcbiAgICAgIHRvZ2dsZUNvbGxhcHNlLFxyXG4gICAgICBtZXJnZUNvbCxcclxuICAgICAgdFxyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi5mcy1zZWFyY2gtbGF5b3V0LWRlZmF1bHQge1xyXG4gIHdpZHRoOiAxMDAlO1xyXG5cclxuICAuZnMtc2VhcmNoLWJveCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG5cclxuICAgIC5mcy1zZWFyY2gtbWFpbiB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBoZWlnaHQ6IGF1dG87XHJcblxyXG4gICAgICAuYW50LWZvcm0taXRlbS1jb250cm9sIHtcclxuICAgICAgICB3aWR0aDogNTAlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAuZnMtc2VhcmNoLWNvbHVtbnMge1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICBwYWRkaW5nOiA0cHggMCA0cHggMDtcclxuXHJcbiAgICAgICAgLmZzLXNlYXJjaC1jb2wge1xyXG4gICAgICAgICAgbWluLXdpZHRoOiAxODBweDtcclxuICAgICAgICAgICYuZnMtc2VhcmNoLXNsb3Qge1xyXG4gICAgICAgICAgICBtaW4td2lkdGg6IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAmID4gKiB7XHJcbiAgICAgICAgICAgIG1hcmdpbjogMHB4IDRweDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBtYXJnaW46IDRweCAwO1xyXG5cclxuICAgICAgICAgICY6Zmlyc3QtY2hpbGQge1xyXG4gICAgICAgICAgICAvLyBtYXJnaW4tbGVmdDogMDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAuYW50LWZvcm0taXRlbS1sYWJlbCB7XHJcbiAgICAgICAgICAgIG1heC13aWR0aDogNTAlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC5hbnQtaW5wdXQtbnVtYmVyLFxyXG4gICAgICAgICAgLmFudC1waWNrZXIsXHJcbiAgICAgICAgICAuZWwtaW5wdXQtbnVtYmVyLFxyXG4gICAgICAgICAgLmVsLWNhc2NhZGVyLFxyXG4gICAgICAgICAgLmVsLWRhdGUtZWRpdG9yLFxyXG4gICAgICAgICAgLm4tc2VsZWN0LFxyXG4gICAgICAgICAgLm4tZGF0ZS1waWNrZXIsXHJcbiAgICAgICAgICAubi1pbnB1dC1udW1iZXIge1xyXG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2ljb24ge1xyXG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogMTBweDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2Nsb3NlLWljb24ge1xyXG4gICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAuZnMtc2VhcmNoLWJ1dHRvbnMtZ3JvdXAge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcblxyXG4gICAgLmZzLWJ1dHRvbiB7XHJcbiAgICAgIG1hcmdpbjogMCAycHggMCAycHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmLmZzLXNlYXJjaC1tdWx0aS1saW5lIHtcclxuICAgIC5mcy1zZWFyY2gtYm94IHtcclxuICAgICAgLmZzLXNlYXJjaC1tYWluIHtcclxuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMC4ycyBlYXNlO1xyXG4gICAgICAgICYuZnMtc2VhcmNoLWNvbGxhcHNlIHtcclxuICAgICAgICAgIG1heC1oZWlnaHQ6IDQycHggIWltcG9ydGFudDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAuYW50LWZvcm0taXRlbSB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAuYW50LWZvcm0tcm93IHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgfVxyXG4gICAgICAuYW50LWZvcm0taXRlbS1yb3cge1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICB9XHJcbiAgICAgIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wge1xyXG4gICAgICAgIGZsZXg6IDE7XHJcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgICAgICB3aWR0aDogYXV0bztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1sYXlvdXQtZGVmYXVsdFwiIDpjbGFzcz1cInsgJ2ZzLXNlYXJjaC1tdWx0aS1saW5lJzogY29tcHV0ZWRJc011bHRpTGluZSB9XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWJveFwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJmcy1zZWFyY2gtbWFpblwiXHJcbiAgICAgICAgOmNsYXNzPVwieyAnZnMtc2VhcmNoLWNvbGxhcHNlJzogY29sbGFwc2UgfVwiXHJcbiAgICAgICAgOnN0eWxlPVwieyBtYXhIZWlnaHQ6IGNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0IH1cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yb3cubmFtZVwiIHJlZj1cImNvbHVtbnNSb3dSZWZcIiBjbGFzcz1cImZzLXNlYXJjaC1jb2x1bW5zXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLXNsb3RcIj5cclxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaC1sZWZ0XCI+PC9zbG90PlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPCEtLSDmn6Xor6LlrZfmrrVyZW5kZXLvvIzpnIDopoHlrprkuYlwcm9wcy5jb2x1bW5zIC0tPlxyXG4gICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGtleSkgb2YgY29sdW1uc1wiIDprZXk9XCJrZXlcIj5cclxuICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jb2wubmFtZVwiIHYtaWY9XCJpdGVtLnNob3dcIiBjbGFzcz1cImZzLXNlYXJjaC1jb2xcIiB2LWJpbmQ9XCJtZXJnZUNvbChpdGVtLmNvbClcIj5cclxuICAgICAgICAgICAgICA8ZnMtcmVuZGVyIDpyZW5kZXItZnVuYz1cIml0ZW0uX2NlbGxSZW5kZXJcIiA6c2NvcGU9XCJnZXRDb250ZXh0Rm4oKVwiIC8+XHJcbiAgICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtc2xvdFwiPlxyXG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoLW1pZGRsZVwiPjwvc2xvdD5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxjb21wb25lbnRcclxuICAgICAgICAgICAgOmlzPVwidWkuY29sLm5hbWVcIlxyXG4gICAgICAgICAgICB2LWlmPVwiIWNvbXB1dGVkSXNNdWx0aUxpbmVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLWJ1dHRvbnMtZ3JvdXBcIlxyXG4gICAgICAgICAgICB2LWJpbmQ9XCJtZXJnZUNvbChhY3Rpb24/LmNvbClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIiA6W3VpLmZvcm1JdGVtLmxhYmVsXT1cImFjdGlvbj8ubGFiZWxcIj5cclxuICAgICAgICAgICAgICA8IS0tIOafpeivouaMiemSruaPkuanvS0tPlxyXG4gICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2gtYnV0dG9uc1wiIHYtYmluZD1cImdldENvbnRleHRGbigpXCI+PC9zbG90PlxyXG4gICAgICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1zbG90XCI+XHJcbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2gtcmlnaHRcIiB2LWJpbmQ9XCJnZXRDb250ZXh0Rm4oKVwiPjwvc2xvdD5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgdi1pZj1cImNvbXB1dGVkSXNNdWx0aUxpbmVcIiBjbGFzcz1cImZzLXNlYXJjaC1idXR0b25zLWdyb3VwIGZzLXNlYXJjaC1tdWx0aS1saW5lLWJ1dHRvbnNcIj5cclxuICAgICAgICA8IS0tIOWkmuihjOaooeW8j+aXtueahOafpeivouaMiemSri0tPlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2gtYnV0dG9uc1wiPjwvc2xvdD5cclxuICAgICAgICA8ZnMtYnV0dG9uXHJcbiAgICAgICAgICB2LWlmPVwiY29sbGFwc2VCdXR0b24/LnNob3cgIT09IGZhbHNlXCJcclxuICAgICAgICAgIDppY29uPVwiY29sbGFwc2UgPyB1aS5pY29ucy5jYXJldERvd24gOiB1aS5pY29ucy5jYXJldFVwXCJcclxuICAgICAgICAgIDp0ZXh0PVwiXHJcbiAgICAgICAgICAgIGNvbGxhcHNlXHJcbiAgICAgICAgICAgICAgPyB0KCdmcy5zZWFyY2guY29udGFpbmVyLmNvbGxhcHNlQnV0dG9uLnRleHQuZXhwYW5kJylcclxuICAgICAgICAgICAgICA6IHQoJ2ZzLnNlYXJjaC5jb250YWluZXIuY29sbGFwc2VCdXR0b24udGV4dC5jb2xsYXBzZScpXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgdi1iaW5kPVwiY29sbGFwc2VCdXR0b25cIlxyXG4gICAgICAgICAgQGNsaWNrPVwidG9nZ2xlQ29sbGFwc2VcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBvbk1vdW50ZWQsIHJlZiB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNTZWFyY2hMYXlvdXREZWZhdWx0XCIsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5pS257ypXHJcbiAgICAgKi9cclxuICAgIGNvbGxhcHNlOiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOWxleW8gOaMiemSrlxyXG4gICAgICovXHJcbiAgICBjb2xsYXBzZUJ1dHRvbjoge1xyXG4gICAgICB0eXBlOiBPYmplY3RcclxuICAgIH0sXHJcblxyXG4gICAgYWN0aW9uOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5biD5bGA5qih5byPXHJcbiAgICAgKi9cclxuICAgIGxheW91dDoge1xyXG4gICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgIGRlZmF1bHQ6IFwic2luZ2xlLWxpbmVcIlxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5p+l6K+i5a2X5q615YiX6KGo77yM5Y+v5Lul57K+57uG5YyW6Ieq5a6a5LmJ5p+l6K+i5a2X5q615biD5bGAXHJcbiAgICAgKi9cclxuICAgIGNvbHVtbnM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDpu5jorqTnmoRjb2zphY3nva5cclxuICAgICAqL1xyXG4gICAgY29sOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdFxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluafpeivouS4iuS4i+aWh1xyXG4gICAgICovXHJcbiAgICBnZXRDb250ZXh0Rm46IHtcclxuICAgICAgdHlwZTogRnVuY3Rpb25cclxuICAgIH1cclxuICB9LFxyXG4gIGVtaXRzOiBbXCJ1cGRhdGU6Y29sbGFwc2VcIiwgXCJjb2xsYXBzZVwiXSxcclxuICBzZXR1cChwcm9wcywgY3R4KSB7XHJcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XHJcbiAgICBjb25zdCBjb2x1bW5zUm93UmVmID0gcmVmKCk7XHJcbiAgICBjb25zdCBjb21wdXRlZElzTXVsdGlMaW5lID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4gcHJvcHMubGF5b3V0ID09PSBcIm11bHRpLWxpbmVcIjtcclxuICAgICAgLy/kuI3opoHov5nkuKrvvIzkvJrmrbvlvqrnjq/vvIwgJiYgY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA+IGNvbHVtbnNMaW5lSGVpZ2h0UmVmLnZhbHVlO1xyXG4gICAgfSk7XHJcbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xyXG4gICAgICBpZiAoY29tcHV0ZWRJc011bHRpTGluZS52YWx1ZSAmJiBjb2x1bW5zUm93UmVmLnZhbHVlKSB7XHJcbiAgICAgICAgY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA9IGNvbHVtbnNSb3dSZWYudmFsdWUuJGVsLm9mZnNldEhlaWdodDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGlmICghY29tcHV0ZWRJc011bHRpTGluZS52YWx1ZSB8fCAhcHJvcHMuY29sbGFwc2UpIHtcclxuICAgICAgICByZXR1cm4gXCJhdXRvXCI7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgPyBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlICsgXCJweFwiIDogXCJcIjtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbnNCb3hIZWlnaHRSZWYgPSByZWYoMCk7XHJcblxyXG4gICAgY29uc3QgdG9nZ2xlQ29sbGFwc2UgPSAoKSA9PiB7XHJcbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOmNvbGxhcHNlXCIsICFwcm9wcy5jb2xsYXBzZSk7XHJcbiAgICAgIGN0eC5lbWl0KFwiY29sbGFwc2VcIiwgIXByb3BzLmNvbGxhcHNlKTtcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gbWVyZ2VDb2woY29sOiBhbnkpIHtcclxuICAgICAgcmV0dXJuIG1lcmdlKHt9LCBwcm9wcy5jb2wsIGNvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdWksXHJcbiAgICAgIGNvbHVtbnNSb3dSZWYsXHJcbiAgICAgIGNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0LFxyXG4gICAgICBjb21wdXRlZElzTXVsdGlMaW5lLFxyXG4gICAgICB0b2dnbGVDb2xsYXBzZSxcclxuICAgICAgbWVyZ2VDb2wsXHJcbiAgICAgIHRcclxuICAgIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtc2VhcmNoLWxheW91dC1kZWZhdWx0IHtcclxuICB3aWR0aDogMTAwJTtcclxuXHJcbiAgLmZzLXNlYXJjaC1ib3gge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuXHJcbiAgICAuZnMtc2VhcmNoLW1haW4ge1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgaGVpZ2h0OiBhdXRvO1xyXG5cclxuICAgICAgLmFudC1mb3JtLWl0ZW0tY29udHJvbCB7XHJcbiAgICAgICAgd2lkdGg6IDUwJTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmZzLXNlYXJjaC1jb2x1bW5zIHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgcGFkZGluZzogNHB4IDAgNHB4IDA7XHJcblxyXG4gICAgICAgIC5mcy1zZWFyY2gtY29sIHtcclxuICAgICAgICAgIG1pbi13aWR0aDogMTgwcHg7XHJcbiAgICAgICAgICAmLmZzLXNlYXJjaC1zbG90IHtcclxuICAgICAgICAgICAgbWluLXdpZHRoOiAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgJiA+ICoge1xyXG4gICAgICAgICAgICBtYXJnaW46IDBweCA0cHg7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbWFyZ2luOiA0cHggMDtcclxuXHJcbiAgICAgICAgICAmOmZpcnN0LWNoaWxkIHtcclxuICAgICAgICAgICAgLy8gbWFyZ2luLWxlZnQ6IDA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xyXG4gICAgICAgICAgICBtYXgtd2lkdGg6IDUwJTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAuYW50LWlucHV0LW51bWJlcixcclxuICAgICAgICAgIC5hbnQtcGlja2VyLFxyXG4gICAgICAgICAgLmVsLWlucHV0LW51bWJlcixcclxuICAgICAgICAgIC5lbC1jYXNjYWRlcixcclxuICAgICAgICAgIC5lbC1kYXRlLWVkaXRvcixcclxuICAgICAgICAgIC5uLXNlbGVjdCxcclxuICAgICAgICAgIC5uLWRhdGUtcGlja2VyLFxyXG4gICAgICAgICAgLm4taW5wdXQtbnVtYmVyIHtcclxuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAuZWwtZGF0ZS1lZGl0b3IgLmVsLXJhbmdlX19pY29uIHtcclxuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAuZWwtZGF0ZS1lZGl0b3IgLmVsLXJhbmdlX19jbG9zZS1pY29uIHtcclxuICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLmZzLXNlYXJjaC1idXR0b25zLWdyb3VwIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cclxuICAgIC5mcy1idXR0b24ge1xyXG4gICAgICBtYXJnaW46IDAgMnB4IDAgMnB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJi5mcy1zZWFyY2gtbXVsdGktbGluZSB7XHJcbiAgICAuZnMtc2VhcmNoLWJveCB7XHJcbiAgICAgIC5mcy1zZWFyY2gtbWFpbiB7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuMnMgZWFzZTtcclxuICAgICAgICAmLmZzLXNlYXJjaC1jb2xsYXBzZSB7XHJcbiAgICAgICAgICBtYXgtaGVpZ2h0OiA0MnB4ICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLmFudC1mb3JtLWl0ZW0ge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgLmFudC1mb3JtLXJvdyB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIH1cclxuICAgICAgLmFudC1mb3JtLWl0ZW0tcm93IHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgfVxyXG4gICAgICAuYW50LWZvcm0taXRlbS1jb250cm9sIHtcclxuICAgICAgICBmbGV4OiAxO1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgICAgd2lkdGg6IGF1dG87XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuPC9zdHlsZT5cclxuIiwiPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCBhcyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc1RhYnNGaWx0ZXJcIixcclxuICBpbmhlcml0QXR0cnM6IGZhbHNlXHJcbn0pO1xuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLXRhYnMtZmlsdGVyXCI+XHJcbiAgICA8Y29tcG9uZW50IDppcz1cInVpLnRhYnMubmFtZVwiIHYtYmluZD1cImJpbmRpbmdcIj5cclxuICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgIDppcz1cInVpLnRhYlBhbmUubmFtZVwiXHJcbiAgICAgICAgdi1pZj1cImRlZmF1bHRPcHRpb24uc2hvd1wiXHJcbiAgICAgICAgOlt1aS50YWJQYW5lLmtleV09XCJfX0RFRkFVTFRfX1wiXHJcbiAgICAgICAgOlt1aS50YWJQYW5lLnRhYl09XCJkZWZhdWx0T3B0aW9uLmxhYmVsXCJcclxuICAgICAgLz5cclxuICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgIDppcz1cInVpLnRhYlBhbmUubmFtZVwiXHJcbiAgICAgICAgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIG9mIG9wdGlvbnNcIlxyXG4gICAgICAgIDprZXk9XCJpbmRleFwiXHJcbiAgICAgICAgOlt1aS50YWJQYW5lLmtleV09XCJnZXRWYWx1ZShpdGVtKVwiXHJcbiAgICAgICAgOlt1aS50YWJQYW5lLnRhYl09XCJnZXRMYWJlbChpdGVtKVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2NvbXBvbmVudD5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIiBzZXR1cD5cclxuaW1wb3J0IHsgY29tcHV0ZWQsIHVzZUF0dHJzIH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyB1c2VNZXJnZSwgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XHJcbjtcclxuXHJcbnR5cGUgVGFic0ZpbHRlckRlZmF1bHRPcHRpb24gPSB7IHNob3c/OiBib29sZWFuOyB2YWx1ZT86IGFueTsgbGFiZWw/OiBzdHJpbmcgfTtcclxudHlwZSBUYWJzRmlsdGVyT3B0aW9uID0geyB2YWx1ZTogYW55OyBsYWJlbDogc3RyaW5nOyBba2V5OiBzdHJpbmddOiBhbnkgfTtcclxuaW50ZXJmYWNlIFRhYnNGaWx0ZXJQcm9wcyB7XHJcbiAgbmFtZTogc3RyaW5nOyAvL+afpeivouWtl+auteeahGtleSxzZWFyY2jlj4LmlbBrZXlcclxuICBzaG93PzogYm9vbGVhbjtcclxuICBkZWZhdWx0T3B0aW9uPzogVGFic0ZpbHRlckRlZmF1bHRPcHRpb247XHJcbiAgb3B0aW9uczogVGFic0ZpbHRlck9wdGlvbltdO1xyXG4gIG1vZGVsVmFsdWU6IGFueTtcclxuICB2YWx1ZT86IHN0cmluZztcclxuICBsYWJlbD86IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgYXR0cnMgPSB1c2VBdHRycygpO1xyXG5jb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xyXG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhkZWZpbmVQcm9wczxUYWJzRmlsdGVyUHJvcHM+KCksIHtcclxuICBzaG93OiBmYWxzZSxcclxuICB2YWx1ZTogXCJ2YWx1ZVwiLFxyXG4gIGxhYmVsOiBcImxhYmVsXCIsXHJcbiAgZGVmYXVsdE9wdGlvbjogdW5kZWZpbmVkLFxyXG4gIG9wdGlvbnM6ICgpID0+IHtcclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcbn0pO1xyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBkZWYgPSB7XHJcbiAgICBzaG93OiB0cnVlLFxyXG4gICAgdmFsdWU6IG51bGwsXHJcbiAgICBsYWJlbDogdChcImZzLnNlYXJjaC50YWJzLmFsbFwiKVxyXG4gIH0gYXMgVGFic0ZpbHRlckRlZmF1bHRPcHRpb247XHJcbiAgcmV0dXJuIG1lcmdlKGRlZiwgcHJvcHMuZGVmYXVsdE9wdGlvbiB8fCB7fSk7XHJcbn0pO1xyXG5cclxuY29uc3QgX19ERUZBVUxUX18gPSBcIl9kZWZhdWx0X2tleV9cIjtcclxuY29uc3QgYmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCB2YWx1ZSA9XHJcbiAgICBwcm9wcy5tb2RlbFZhbHVlID09IG51bGwgfHwgcHJvcHMubW9kZWxWYWx1ZSA9PT0gZGVmYXVsdE9wdGlvbi52YWx1ZS52YWx1ZSA/IF9fREVGQVVMVF9fIDogcHJvcHMubW9kZWxWYWx1ZTtcclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogXCJjYXJkXCIsXHJcbiAgICAuLi5hdHRycyxcclxuICAgIFt1aS50YWJzLm1vZGVsVmFsdWVdOiB2YWx1ZSxcclxuICAgIFtcIm9uVXBkYXRlOlwiICsgdWkudGFicy5tb2RlbFZhbHVlXTogb25VcGRhdGVBY3RpdmVLZXlcclxuICB9O1xyXG59KTtcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0cyhbXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCBcImNoYW5nZVwiXSk7XHJcblxyXG5mdW5jdGlvbiBvblVwZGF0ZUFjdGl2ZUtleSh2YWx1ZTogYW55KSB7XHJcbiAgaWYgKF9fREVGQVVMVF9fID09PSB2YWx1ZSkge1xyXG4gICAgdmFsdWUgPSBkZWZhdWx0T3B0aW9uLnZhbHVlLnZhbHVlO1xyXG4gIH1cclxuICBjb25zdCBvbGRWYWx1ZSA9IHByb3BzLm1vZGVsVmFsdWU7XHJcbiAgZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcclxuICBpZiAob2xkVmFsdWUgIT09IHZhbHVlKSB7XHJcbiAgICBlbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFZhbHVlKG9wdGlvbjogVGFic0ZpbHRlck9wdGlvbikge1xyXG4gIHJldHVybiBvcHRpb25bcHJvcHMudmFsdWVdO1xyXG59XHJcbmZ1bmN0aW9uIGdldExhYmVsKG9wdGlvbjogVGFic0ZpbHRlck9wdGlvbikge1xyXG4gIHJldHVybiBvcHRpb25bcHJvcHMubGFiZWxdO1xyXG59XHJcblxyXG5jb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG5jb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cclxuLmZzLXRhYnMtZmlsdGVyIHtcclxuICBtYXJnaW46IDA7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgLy93aWR0aDogMTAwJTtcclxuICAuYW50LXRhYnMgPiAuYW50LXRhYnMtbmF2LFxyXG4gIC5hbnQtdGFicyA+IGRpdiA+IC5hbnQtdGFicy1uYXYge1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcclxuICB9XHJcblxyXG4gIC5lbC10YWJzLS1jYXJkID4gLmVsLXRhYnNfX2hlYWRlciB7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xyXG4gIH1cclxuXHJcbiAgLm4tdGFiLXBhbmUge1xyXG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IGFzIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi8gX19NQUNST1NfZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzSWNvblNlbGVjdG9yXCJcclxufSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZnMtaWNvbi1zZWxlY3RvclwiPlxyXG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5pbnB1dC5uYW1lXCIgdi1iaW5kPVwiaW5wdXRCaW5kaW5nXCIgY2xhc3M9XCJmcy1pY29uLXNlbGVjdG9yLXNlYXJjaFwiIEBjbGljaz1cImhhbmRsZU9wZW5cIj5cclxuICAgICAgPHRlbXBsYXRlICNwcmVmaXg+XHJcbiAgICAgICAgPGZzLWljb24gdi1pZj1cIm1vZGVsVmFsdWVcIiBjbGFzcz1cImZzLWljb24tc2VsZWN0b3ItaW5wdXQtcHJlZml4XCIgOmljb249XCJtb2RlbFZhbHVlXCI+PC9mcy1pY29uPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC9jb21wb25lbnQ+XHJcblxyXG4gICAgPGRpdiB2LWlmPVwiZGlhbG9nT3BlbmVkXCIgY2xhc3M9XCJmcy1pY29uLXNlbGVjdG9yLWRpYWxvZ1wiPlxyXG4gICAgICA8Y29tcG9uZW50IDppcz1cInVpLmRpYWxvZy5uYW1lXCIgcHJlc2V0PVwiZGlhbG9nXCIgdGl0bGU9XCLpgInmi6nlm77moIdcIiB2LWJpbmQ9XCJjb21wdXRlZERpYWxvZ1wiIDpmb290ZXI9XCJudWxsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWljb24tc2VsZWN0b3ItZGlhbG9nLWNvbnRlbnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLXRhYnMtYm94IG10LTEwXCI+XHJcbiAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkudGFicy5uYW1lXCIgdi1iaW5kPVwiY29tcHV0ZVRhYnNcIiB0eXBlPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkudGFiUGFuZS5uYW1lXCIga2V5PVwiYWxsXCIgOlt1aS50YWJQYW5lLmtleV09XCInYWxsJ1wiIDpbdWkudGFiUGFuZS50YWJdPVwiJ+WFqOmDqCdcIj5cclxuICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgICAgICAgICA8Y29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICA6aXM9XCJ1aS50YWJQYW5lLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgdi1mb3I9XCJzZXQgb2YgaWNvblNldHNcIlxyXG4gICAgICAgICAgICAgICAgOmtleT1cInNldFwiXHJcbiAgICAgICAgICAgICAgICA6W3VpLnRhYlBhbmUua2V5XT1cInNldFwiXHJcbiAgICAgICAgICAgICAgICA6W3VpLnRhYlBhbmUudGFiXT1cInNldFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgICAgICA8L2NvbXBvbmVudD5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYm94XCI+XHJcbiAgICAgICAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgOmlzPVwidWkuaW5wdXQubmFtZVwiXHJcbiAgICAgICAgICAgICAgICB2LW1vZGVsOlt1aS5pbnB1dC5tb2RlbFZhbHVlXT1cInNlYXJjaEtleVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIuaQnOe0ouWbvuaghywg5Y+M5Ye76YCJ5oupXCJcclxuICAgICAgICAgICAgICAgIEBrZXlkb3duLmVudGVyPVwiaGFuZGxlU2VhcmNoXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI3N1ZmZpeD5cclxuICAgICAgICAgICAgICAgICAgPGZzLWJ1dHRvbiB0eXBlPVwicHJpbWFyeVwiIHNpemU9XCJzbWFsbFwiIDppY29uPVwidWkuaWNvbnMuc2VhcmNoXCIgQGNsaWNrPVwiaGFuZGxlU2VhcmNoXCI+PC9mcy1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1zZWxlY3RcIj5cclxuICAgICAgICAgICAgICAgIOWbvuagh+minOiJsu+8mlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICB2LWZvcj1cImNvbG9ySXRlbSBpbiBjb2xvcnNcIlxyXG4gICAgICAgICAgICAgICAgICA6a2V5PVwiY29sb3JJdGVtXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2xvci1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgOmNsYXNzPVwieyBhY3RpdmU6IGNvbG9ySXRlbSA9PT0gY3VycmVudENvbG9yIH1cIlxyXG4gICAgICAgICAgICAgICAgICA6c3R5bGU9XCJ7IGJhY2tncm91bmRDb2xvcjogY29sb3JJdGVtIH1cIlxyXG4gICAgICAgICAgICAgICAgICBAY2xpY2s9XCJoYW5kbGVDb2xvckNoYW5nZShjb2xvckl0ZW0pXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAge3sgY29sb3JJdGVtID8gXCJcIiA6IFwi5pegXCIgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICA6aXM9XCJ1aS5pbnB1dC5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwcHhcIlxyXG4gICAgICAgICAgICAgICAgICA6aWNvbj1cInVpLmljb25zLnNlYXJjaFwiXHJcbiAgICAgICAgICAgICAgICAgIDpbdWkuaW5wdXQubW9kZWxWYWx1ZV09XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBAaW5wdXQ9XCJoYW5kbGVDb2xvckNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgID48L2NvbXBvbmVudD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIHYtZm9yPVwiaWNvbiBpbiBwYWdlci5yZWNvcmRzXCJcclxuICAgICAgICAgICAgICAgICAgOmtleT1cImljb25cIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24taXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgIDpjbGFzcz1cInsgYWN0aXZlOiBpY29uID09PSBjdXJyZW50SWNvbiB9XCJcclxuICAgICAgICAgICAgICAgICAgOnRpdGxlPVwiaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgIEBjbGljaz1cImhhbmRsZUljb25TZWxlY3QoaWNvbiwgZmFsc2UpXCJcclxuICAgICAgICAgICAgICAgICAgQGRibGNsaWNrPVwiaGFuZGxlSWNvblNlbGVjdChpY29uLCB0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxmcy1pY29uIDppY29uPVwiY3VycmVudENvbG9yID8gYCR7aWNvbn06JHtjdXJyZW50Q29sb3J9YCA6IGljb25cIiBjbGFzcz1cInRleHQtMnhsXCI+PC9mcy1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkLW1vcmVcIj5cclxuICAgICAgICAgICAgICAgIDxmcy1sb2FkaW5nIHYtaWY9XCJwYWdlci5sb2FkaW5nXCIgOmxvYWRpbmc9XCJwYWdlci5sb2FkaW5nXCIgdGV4dD1cIuWKoOi9veS4rVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHYtZWxzZS1pZj1cInBhZ2VyLnRvdGFsID09IG51bGwgfHwgcGFnZXIudG90YWwgPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2PuaaguaXoOaVsOaNrjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHYtZWxzZS1pZj1cInBhZ2VyLnRvdGFsID4gcGFnZXIuc3RhcnQgKyBwYWdlci5saW1pdFwiIEBjbGljaz1cImxvYWRNb3JlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXY+5Yqg6L295pu05aSaPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXJcIj5cclxuICAgICAgICAgICAgICA8ZnMtYnV0dG9uIHR5cGU9XCJwcmltYXJ5XCIgQGNsaWNrPVwib25Db25maXJtXCI+56Gu5a6aPC9mcy1idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiIHNldHVwPlxyXG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCJAZmFzdC1jcnVkL3VpLWludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyByZWYsIHVzZUF0dHJzLCBSZWYsIGNvbXB1dGVkIH0gZnJvbSBcInZ1ZVwiO1xyXG5cclxuO1xyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFtcInVwZGF0ZTptb2RlbFZhbHVlXCJdKTtcclxuY29uc3QgZGVmYXVsdExpbWl0ID0gMTM2O1xyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICBtb2RlbFZhbHVlOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiBcIlwiXHJcbiAgfSxcclxuICBkaWFsb2c6IHtcclxuICAgIHR5cGU6IE9iamVjdCxcclxuICAgIGRlZmF1bHQ6ICgpID0+ICh7fSlcclxuICB9LFxyXG4gIHRhYnM6IHtcclxuICAgIHR5cGU6IE9iamVjdCxcclxuICAgIGRlZmF1bHQ6ICgpID0+ICh7fSlcclxuICB9LFxyXG4gIC8vIOmZkOWItuavj+mhteaYvuekuuaVsOmHj1xyXG4gIGxpbWl0OiB7XHJcbiAgICB0eXBlOiBOdW1iZXIsXHJcbiAgICBkZWZhdWx0OiAxMzZcclxuICB9LFxyXG4gIGljb25TZXRzOiB7XHJcbiAgICB0eXBlOiBBcnJheTxzdHJpbmc+LFxyXG4gICAgZGVmYXVsdDogKCkgPT4gW1xyXG4gICAgICBcImxvZ29zXCIsXHJcbiAgICAgIFwiZmEtYnJhbmRzXCIsXHJcbiAgICAgIFwiZmEtc29saWRcIixcclxuICAgICAgXCJmYS1yZWd1bGFyXCIsXHJcbiAgICAgIFwiY2FyYm9uXCIsXHJcbiAgICAgIFwiaW9uXCIsXHJcbiAgICAgIFwiYW50LWRlc2lnblwiLFxyXG4gICAgICBcIm1kaVwiLFxyXG4gICAgICBcInR3ZW1vamlcIixcclxuICAgICAgXCJzdmctc3Bpbm5lcnNcIlxyXG4gICAgXVxyXG4gIH0sXHJcbiAgYXBpUHJvdmlkZXI6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIGRlZmF1bHQ6IFwiaHR0cHM6Ly9hcGkuaWNvbmlmeS5kZXNpZ25cIlxyXG4gIH0sXHJcbiAgY29sb3JzOiB7XHJcbiAgICB0eXBlOiBBcnJheTxzdHJpbmc+LFxyXG4gICAgZGVmYXVsdDogKCkgPT4gW1xyXG4gICAgICBcIlwiLFxyXG4gICAgICBcIiMwMDdBRkZcIixcclxuICAgICAgXCIjMzRDNzU5XCIsXHJcbiAgICAgIFwiI0ZGOTUwMFwiLFxyXG4gICAgICBcIiNGRjNCMzBcIixcclxuICAgICAgXCIjRkZDQzAwXCIsXHJcbiAgICAgIFwiIzQyNDI0MlwiLFxyXG4gICAgICBcIiM4RThFOTNcIixcclxuICAgICAgXCIjQUY1MkRFXCIsXHJcbiAgICAgIFwiIzVBQzhGQVwiLFxyXG4gICAgICBcIiNBMjg0NUVcIlxyXG4gICAgXVxyXG4gIH1cclxufSk7XHJcbmNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcblxyXG5jb25zdCBkaWFsb2dPcGVuZWQgPSByZWYoZmFsc2UpO1xyXG5jb25zdCBjb21wdXRlZERpYWxvZyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgd2lkdGg6IDEwMjQsXHJcbiAgICBzdHlsZToge1xyXG4gICAgICB3aWR0aDogXCIxMDI0cHhcIlxyXG4gICAgfSxcclxuICAgIC4uLnByb3BzLmRpYWxvZyxcclxuICAgIFt1aS5kaWFsb2cudmlzaWJsZV06IGRpYWxvZ09wZW5lZC52YWx1ZSxcclxuICAgIFtgb25VcGRhdGU6JHt1aS5kaWFsb2cudmlzaWJsZX1gXTogKHZhbDogYm9vbGVhbikgPT4ge1xyXG4gICAgICBkaWFsb2dPcGVuZWQudmFsdWUgPSB2YWw7XHJcbiAgICB9XHJcbiAgfTtcclxufSk7XHJcblxyXG5jb25zdCBmb3JtSXRlbUNvbnRleHQgPSB1aS5mb3JtSXRlbS5pbmplY3RGb3JtSXRlbUNvbnRleHQoKTtcclxuY29uc3QgaW5wdXRCaW5kaW5nID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICAuLi5hdHRycyxcclxuICAgIFt1aS5pbnB1dC5tb2RlbFZhbHVlXTogcHJvcHMubW9kZWxWYWx1ZSxcclxuICAgIFtgb25VcGRhdGU6JHt1aS5pbnB1dC5tb2RlbFZhbHVlfWBdOiAodmFsOiBzdHJpbmcpID0+IHtcclxuICAgICAgZW1pdENoYW5nZSh2YWwpO1xyXG4gICAgfVxyXG4gIH07XHJcbn0pO1xyXG5cclxuY29uc3QgZW1pdENoYW5nZSA9ICh2YWw6IHN0cmluZykgPT4ge1xyXG4gIGVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCB2YWwpO1xyXG4gIGZvcm1JdGVtQ29udGV4dD8ub25DaGFuZ2UoKTtcclxufTtcclxuXHJcbmNvbnN0IGhhbmRsZU9wZW4gPSAoKSA9PiB7XHJcbiAgZGlhbG9nT3BlbmVkLnZhbHVlID0gdHJ1ZTtcclxuICBpZiAocHJvcHMuaWNvblNldHMubGVuZ3RoID4gMCAmJiBwYWdlci52YWx1ZS5yZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgb25UYWJDaGFuZ2UocHJvcHMuaWNvblNldHNbMF0gYXMgc3RyaW5nKTtcclxuICB9XHJcbiAgLy/liJ3lp4vljJZ2YWx1ZVxyXG4gIGNvbnN0IGFyciA9IHByb3BzLm1vZGVsVmFsdWU/LnNwbGl0KFwiOlwiKSB8fCBbXTtcclxuICBpZiAoYXJyLmxlbmd0aCA+PSAyKSB7XHJcbiAgICBjdXJyZW50SWNvbi52YWx1ZSA9IGFyclswXSArIFwiOlwiICsgYXJyWzFdO1xyXG4gICAgY3VycmVudENvbG9yLnZhbHVlID0gYXJyWzJdO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjdXJyZW50SWNvbi52YWx1ZSA9IHByb3BzLm1vZGVsVmFsdWU7XHJcbiAgICBjdXJyZW50Q29sb3IudmFsdWUgPSBcIlwiO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGF0dHJzID0gdXNlQXR0cnMoKTtcclxuXHJcbmNvbnN0IGFwaSA9IHtcclxuICBhc3luYyBnZXRDb2xsZWN0aW9ucygpIHtcclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3Byb3BzLmFwaVByb3ZpZGVyfS9jb2xsZWN0aW9uc2ApO1xyXG4gICAgcmV0dXJuIGF3YWl0IHJlcy5qc29uKCk7XHJcbiAgfSxcclxuICBhc3luYyBnZXRJY29ucyhwcmVmaXg6IHN0cmluZykge1xyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMuYXBpUHJvdmlkZXJ9L2NvbGxlY3Rpb24/cHJlZml4PSR7cHJlZml4fWApO1xyXG4gICAgcmV0dXJuIGF3YWl0IHJlcy5qc29uKCk7XHJcbiAgfSxcclxuICBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZywgcGFnZXI6IGFueSkge1xyXG4gICAgY29uc3Qgc3RhcnQgPSBwYWdlci5zdGFydCA/PyAwO1xyXG4gICAgY29uc3QgbGltaXQgPSBwYWdlci5saW1pdCA/PyA1MDtcclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3Byb3BzLmFwaVByb3ZpZGVyfS9zZWFyY2g/cXVlcnk9JHtxdWVyeX0mc3RhcnQ9JHtzdGFydH0mbGltaXQ9JHtsaW1pdH1gKTtcclxuICAgIHJldHVybiBhd2FpdCByZXMuanNvbigpO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGljb25TdG9yZTogUmVmID0gcmVmKHt9KTtcclxuXHJcbmNvbnN0IGxvYWRJY29uU2V0ID0gYXN5bmMgKHByZWZpeDogc3RyaW5nKSA9PiB7XHJcbiAgbGV0IHNldHMgPSBpY29uU3RvcmUudmFsdWVbcHJlZml4XTtcclxuICBpZiAoIXNldHMpIHtcclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaS5nZXRJY29ucyhwcmVmaXgpO1xyXG4gICAgY29uc3QgdW5jYXRlZ29yaWVzID0gcmVzLnVuY2F0ZWdvcml6ZWQgPz8gW107XHJcbiAgICBjb25zdCBjYXRlZ29yaWVzID0gcmVzLmNhdGVnb3JpZXMgPz8gW107XHJcbiAgICBzZXRzID0gdW5jYXRlZ29yaWVzO1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gY2F0ZWdvcmllcykge1xyXG4gICAgICBzZXRzID0gc2V0cy5jb25jYXQoY2F0ZWdvcmllc1trZXldKTtcclxuICAgIH1cclxuICAgIHNldHMgPSBzZXRzLm1hcCgoaXRlbTogYW55KSA9PiBgJHtwcmVmaXh9OiR7aXRlbX1gKTtcclxuICAgIGljb25TdG9yZS52YWx1ZVtwcmVmaXhdID0gc2V0cztcclxuICB9XHJcbiAgcmV0dXJuIHNldHM7XHJcbn07XHJcblxyXG5jb25zdCBzZWFyY2hLZXkgPSByZWYoXCJcIik7XHJcbmNvbnN0IHRhYktleSA9IHJlZihcImFsbFwiKTtcclxuY29uc3Qgb25UYWJDaGFuZ2UgPSAoa2V5OiBzdHJpbmcpID0+IHtcclxuICB0YWJLZXkudmFsdWUgPSBrZXk7XHJcbiAgc2VhcmNoS2V5LnZhbHVlID0gXCJcIjtcclxuICByZXNldFBhZ2VyKCk7XHJcbiAgaGFuZGxlU2VhcmNoKCk7XHJcbn07XHJcblxyXG5jb25zdCByZXNldFBhZ2VyID0gKCkgPT4ge1xyXG4gIHBhZ2VyLnZhbHVlLnN0YXJ0ID0gMDtcclxuICBwYWdlci52YWx1ZS5yZWNvcmRzID0gW107XHJcbiAgcGFnZXIudmFsdWUudG90YWwgPSAwO1xyXG4gIHBhZ2VyLnZhbHVlLmxpbWl0ID0gcHJvcHMubGltaXQgPz8gZGVmYXVsdExpbWl0O1xyXG59O1xyXG5cclxuY29uc3QgcGFnZXIgPSByZWYoe1xyXG4gIGxvYWRpbmc6IGZhbHNlLFxyXG4gIHN0YXJ0OiAwLFxyXG4gIGxpbWl0OiBwcm9wcy5saW1pdCA/PyBkZWZhdWx0TGltaXQsXHJcbiAgdG90YWw6IG51bGwsXHJcbiAgcXVlcnk6IFwiXCIsXHJcbiAgcmVjb3JkczogW11cclxufSk7XHJcblxyXG5jb25zdCBoYW5kbGVTZWFyY2ggPSBhc3luYyAoKSA9PiB7XHJcbiAgaWYgKHBhZ2VyLnZhbHVlLmxvYWRpbmcpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgaWYgKHBhZ2VyLnZhbHVlLnF1ZXJ5ICE9PSBzZWFyY2hLZXkudmFsdWUpIHtcclxuICAgIC8v6YeN572uc3RhcnRcclxuICAgIHJlc2V0UGFnZXIoKTtcclxuICB9XHJcblxyXG4gIHBhZ2VyLnZhbHVlLmxvYWRpbmcgPSB0cnVlO1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCBkb1NlYXJjaCgpO1xyXG4gICAgcGFnZXIudmFsdWUucmVjb3JkcyA9IHBhZ2VyLnZhbHVlLnJlY29yZHMuY29uY2F0KHJlcy5pY29ucyk7XHJcbiAgICBwYWdlci52YWx1ZS50b3RhbCA9IHJlcy50b3RhbDtcclxuICAgIHBhZ2VyLnZhbHVlLmxpbWl0ID0gcmVzLmxpbWl0O1xyXG4gICAgcGFnZXIudmFsdWUucXVlcnkgPSBzZWFyY2hLZXkudmFsdWU7XHJcbiAgfSBmaW5hbGx5IHtcclxuICAgIHBhZ2VyLnZhbHVlLmxvYWRpbmcgPSBmYWxzZTtcclxuICB9XHJcbn07XHJcblxyXG5hc3luYyBmdW5jdGlvbiBkb1NlYXJjaCgpIHtcclxuICBpZiAodGFiS2V5LnZhbHVlID09PSBcImFsbFwiKSB7XHJcbiAgICBpZiAoIXNlYXJjaEtleS52YWx1ZSkge1xyXG4gICAgICB1aS5ub3RpZmljYXRpb24ud2FybihcIuivt+i+k+WFpeaQnOe0ouWFs+mUruWtl1wiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IGFwaS5zZWFyY2goc2VhcmNoS2V5LnZhbHVlLCBwYWdlci52YWx1ZSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBhd2FpdCBnZXRQYWdlckZyb21JY29uU2V0KHRhYktleS52YWx1ZSk7XHJcbiAgfVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBnZXRQYWdlckZyb21JY29uU2V0KHByZWZpeDogc3RyaW5nKSB7XHJcbiAgY29uc3QgaWNvbnMgPSBhd2FpdCBsb2FkSWNvblNldChwcmVmaXgpO1xyXG4gIGxldCBmaWx0ZXJzID0gaWNvbnM7XHJcbiAgaWYgKHNlYXJjaEtleS52YWx1ZSkge1xyXG4gICAgZmlsdGVycyA9IGljb25zLmZpbHRlcigoaWNvbjogc3RyaW5nKSA9PiBpY29uLmluY2x1ZGVzKHNlYXJjaEtleS52YWx1ZSkpO1xyXG4gIH1cclxuICBsZXQgZW5kID0gcGFnZXIudmFsdWUuc3RhcnQgKyBwYWdlci52YWx1ZS5saW1pdDtcclxuICBpZiAoZW5kID4gZmlsdGVycy5sZW5ndGgpIHtcclxuICAgIGVuZCA9IGZpbHRlcnMubGVuZ3RoO1xyXG4gIH1cclxuICBjb25zdCBwYWdlckljb25zID0gZmlsdGVycy5zbGljZShwYWdlci52YWx1ZS5zdGFydCwgZW5kKTtcclxuICByZXR1cm4ge1xyXG4gICAgaWNvbnM6IHBhZ2VySWNvbnMsXHJcbiAgICB0b3RhbDogZmlsdGVycy5sZW5ndGgsXHJcbiAgICBsaW1pdDogcGFnZXIudmFsdWUubGltaXQsXHJcbiAgICBzdGFydDogcGFnZXIudmFsdWUuc3RhcnRcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBjdXJyZW50SWNvbiA9IHJlZihcIlwiKTtcclxuY29uc3QgY3VycmVudENvbG9yID0gcmVmKFwiXCIpO1xyXG5jb25zdCBoYW5kbGVJY29uU2VsZWN0ID0gKGljb246IHN0cmluZywgY29uZmlybSA9IGZhbHNlKSA9PiB7XHJcbiAgY3VycmVudEljb24udmFsdWUgPSBpY29uO1xyXG4gIGlmIChjb25maXJtKSB7XHJcbiAgICBvbkNvbmZpcm0oKTtcclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBvbkNvbmZpcm0gPSAoKSA9PiB7XHJcbiAgZGlhbG9nT3BlbmVkLnZhbHVlID0gZmFsc2U7XHJcbiAgbGV0IHZhbHVlID0gY3VycmVudEljb24udmFsdWU7XHJcbiAgaWYgKGN1cnJlbnRDb2xvci52YWx1ZSkge1xyXG4gICAgdmFsdWUgPSB2YWx1ZSArIFwiOlwiICsgY3VycmVudENvbG9yLnZhbHVlO1xyXG4gIH1cclxuICBlbWl0Q2hhbmdlKHZhbHVlKTtcclxufTtcclxuXHJcbmNvbnN0IGhhbmRsZUNvbG9yQ2hhbmdlID0gKGNvbG9yOiBzdHJpbmcpID0+IHtcclxuICBjdXJyZW50Q29sb3IudmFsdWUgPSBjb2xvcjtcclxufTtcclxuXHJcbmNvbnN0IGxvYWRNb3JlID0gYXN5bmMgKCkgPT4ge1xyXG4gIHBhZ2VyLnZhbHVlLnN0YXJ0ICs9IHBhZ2VyLnZhbHVlLmxpbWl0O1xyXG4gIGF3YWl0IGhhbmRsZVNlYXJjaCgpO1xyXG59O1xyXG5cclxuY29uc3QgY29tcHV0ZVRhYnMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIC4uLnByb3BzLnRhYnMsXHJcbiAgICBbdWkudGFicy5tb2RlbFZhbHVlXTogdGFiS2V5LnZhbHVlLFxyXG4gICAgW2BvblVwZGF0ZToke3VpLnRhYnMubW9kZWxWYWx1ZX1gXTogb25UYWJDaGFuZ2VcclxuICB9O1xyXG59KTtcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtaWNvbi1zZWxlY3RvciB7XHJcbiAgLmZzLWljb24tc2VsZWN0b3ItaW5wdXQtcHJlZml4IHtcclxuICAgIGZvbnQtc2l6ZTogMThweDtcclxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xyXG4gIH1cclxufVxyXG4uZnMtaWNvbi1zZWxlY3Rvci1kaWFsb2ctY29udGVudCB7XHJcbiAgLmljb24tdGFicy1ib3gge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBtaW4taGVpZ2h0OiA1MDBweDtcclxuICAgIG1heC1oZWlnaHQ6IDYwdmg7XHJcblxyXG4gICAgLnNlYXJjaC1ib3gge1xyXG4gICAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogNXB4O1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuXHJcbiAgICAgIC5zZWFyY2gtaW5wdXQge1xyXG4gICAgICAgIHdpZHRoOiAyMDBweDtcclxuICAgICAgICBwYWRkaW5nOiAwIDVweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmNvbG9yLXNlbGVjdCB7XHJcbiAgICAgICAgZmxleDogMTtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIGdhcDogNXB4O1xyXG4gICAgICAgIC5jb2xvci1pdGVtIHtcclxuICAgICAgICAgIHdpZHRoOiAzMHB4O1xyXG4gICAgICAgICAgaGVpZ2h0OiAzMHB4O1xyXG4gICAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICAgICAgYm9yZGVyOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XHJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgICAgJjpob3ZlciB7XHJcbiAgICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICNhMmY3ZmY7XHJcbiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggI2EyZjdmZjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAmLmFjdGl2ZSB7XHJcbiAgICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICM0MDllZmY7XHJcbiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggIzQwOWVmZjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAubG9hZC1tb3JlIHtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgcGFkZGluZzogMTBweDtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLmZvb3RlciB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogZW5kO1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgfVxyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIC5pY29uLWNvbnRhaW5lciB7XHJcbiAgICAgIG1hcmdpbi10b3A6IDEwcHg7XHJcbiAgICAgIGZsZXg6IDE7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcclxuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2U0ZTdlZDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgICAuaWNvbi1saXN0IHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcclxuICAgICAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgICAgIC5pY29uLWl0ZW0ge1xyXG4gICAgICAgICAgd2lkdGg6IDUwcHg7XHJcbiAgICAgICAgICBoZWlnaHQ6IDUwcHg7XHJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XHJcbiAgICAgICAgICBtYXJnaW46IDJweDtcclxuICAgICAgICAgICYuYWN0aXZlIHtcclxuICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzQwOWVmZjtcclxuICAgICAgICAgICAgLy9zaGFkb3dcclxuICAgICAgICAgICAgYm94LXNoYWRvdzogMCAwIDVweCAjNDA5ZWZmO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgJjpob3ZlciB7XHJcbiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM2Y2IzZjg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC5mcy1pY29uIHtcclxuICAgICAgICAgIGZvbnQtc2l6ZTogMzBweDtcclxuICAgICAgICAgIG1heC13aWR0aDogOTYlO1xyXG4gICAgICAgICAgbWF4LWhlaWdodDogOTYlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yYWRpb0dyb3VwLm5hbWVcIiBAY2hhbmdlPVwib25TZWxlY3RlZENoYW5nZVwiPlxyXG4gICAgPGNvbXBvbmVudFxyXG4gICAgICA6aXM9XCJjb21wdXRlZFJhZGlvTmFtZVwiXHJcbiAgICAgIHYtZm9yPVwiaXRlbSBvZiBjb21wdXRlZE9wdGlvbnNcIlxyXG4gICAgICByZWY9XCJyYWRpb1JlZlwiXHJcbiAgICAgIDprZXk9XCJnZXRWYWx1ZShpdGVtKVwiXHJcbiAgICAgIDpbdWkucmFkaW8udmFsdWVdPVwiZ2V0VmFsdWUoaXRlbSlcIlxyXG4gICAgICB2LWJpbmQ9XCJvcHRpb25Qcm9wc1wiXHJcbiAgICA+XHJcbiAgICAgIHt7IGdldExhYmVsKGl0ZW0pIH19XHJcbiAgICA8L2NvbXBvbmVudD5cclxuICA8L2NvbXBvbmVudD5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcclxuaW1wb3J0IHsgdWlDb250ZXh0IH0gZnJvbSBcIi4uLy4uL3VpXCI7XHJcbmltcG9ydCB7IHJlZiwgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcbi8qKlxyXG4gKiDlrZflhbjljZXpgInmoYZcclxuICog5pSv5oyBZWwtcmFkaW8tZ3JvdXB8YS1yYWRpby1ncm91cOeahOWPguaVsFxyXG4gKlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzRGljdFJhZGlvXCIsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5pWw5o2u5a2X5YW46YWN572uXHJcbiAgICAgKi9cclxuICAgIGRpY3Q6IHt9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDlj6/pgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcclxuICAgICAqL1xyXG4gICAgb3B0aW9uczogeyB0eXBlOiBBcnJheSB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmFkaW/nu4Tku7blkI3np7BcclxuICAgICAqIGFudGR25L2/55SoYnV0dG9u5qC35byP55qE5pe25YCZ5pyJ55SoXHJcbiAgICAgKiDljbPlsIblup/lvIMs6K+35L2/55Sob3B0aW9uTmFtZVxyXG4gICAgICovXHJcbiAgICByYWRpb05hbWU6IHt9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YCJ6aG555qE57uE5Lu25ZCN56ewXHJcbiAgICAgKi9cclxuICAgIG9wdGlvbk5hbWU6IHtcclxuICAgICAgdHlwZTogU3RyaW5nXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YCJ6aG555qE5bGe5oCnXHJcbiAgICAgKi9cclxuICAgIG9wdGlvblByb3BzOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOi9rOaNokRpY3REYXRhXHJcbiAgICAgKi9cclxuICAgIHRyYW5zZm9ybURpY3REYXRhOiB7XHJcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH1cclxuICB9LFxyXG4gIGVtaXRzOiBbXHJcbiAgICAvKipcclxuICAgICAqIOWtl+WFuOaVsOaNruWPmOWMluS6i+S7tlxyXG4gICAgICovXHJcbiAgICBcImRpY3QtY2hhbmdlXCIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgInkuK3lgLzlj5jljJbkuovku7bvvIzlj6/ku6Xojrflj5bliLDlvZPliY3pgInkuK3nmoRvcHRpb27lr7nosaFcclxuICAgICAqL1xyXG4gICAgXCJzZWxlY3RlZC1jaGFuZ2VcIixcclxuICAgIC8qKlxyXG4gICAgICog5YC85Y+Y5YyW5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIFwiY2hhbmdlXCJcclxuICBdLFxyXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eDogYW55KSB7XHJcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG5cclxuICAgIGlmIChwcm9wcy5yYWRpb05hbWUpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwi5Y+C5pWwcmFkaW9OYW1l5Y2z5bCG5bqf5byD77yM6K+35pS55oiQb3B0aW9uTmFtZVwiKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbXB1dGVkUmFkaW9OYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4gcHJvcHMub3B0aW9uTmFtZSA/PyBwcm9wcy5yYWRpb05hbWUgPz8gdWkucmFkaW8ubmFtZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCB1c2VkRGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCwgdWkucmFkaW9Hcm91cC5tb2RlbFZhbHVlKTtcclxuICAgIGNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IHVzZWREaWN0LmNyZWF0ZUNvbXB1dGVkT3B0aW9ucygpO1xyXG5cclxuICAgIGNvbnN0IG9uU2VsZWN0ZWRDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBjdHguZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XHJcbiAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50YXJnZXQpIHtcclxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRhcmdldC52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xyXG4gICAgICBpZiAoZGljdCAmJiBkaWN0LmRhdGFNYXAgJiYgZGljdC5kYXRhTWFwW3ZhbHVlXSkge1xyXG4gICAgICAgIGNvbnN0IG9wdCA9IGRpY3QuZGF0YU1hcFt2YWx1ZV07XHJcbiAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgb3B0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBudWxsKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1aSxcclxuICAgICAgY29tcHV0ZWRSYWRpb05hbWUsXHJcbiAgICAgIC4uLnVzZWREaWN0LFxyXG4gICAgICBjb21wdXRlZE9wdGlvbnMsXHJcbiAgICAgIG9uU2VsZWN0ZWRDaGFuZ2VcclxuICAgIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8Y29tcG9uZW50IDppcz1cInVpLnJhZGlvR3JvdXAubmFtZVwiIEBjaGFuZ2U9XCJvblNlbGVjdGVkQ2hhbmdlXCI+XHJcbiAgICA8Y29tcG9uZW50XHJcbiAgICAgIDppcz1cImNvbXB1dGVkUmFkaW9OYW1lXCJcclxuICAgICAgdi1mb3I9XCJpdGVtIG9mIGNvbXB1dGVkT3B0aW9uc1wiXHJcbiAgICAgIHJlZj1cInJhZGlvUmVmXCJcclxuICAgICAgOmtleT1cImdldFZhbHVlKGl0ZW0pXCJcclxuICAgICAgOlt1aS5yYWRpby52YWx1ZV09XCJnZXRWYWx1ZShpdGVtKVwiXHJcbiAgICAgIHYtYmluZD1cIm9wdGlvblByb3BzXCJcclxuICAgID5cclxuICAgICAge3sgZ2V0TGFiZWwoaXRlbSkgfX1cclxuICAgIDwvY29tcG9uZW50PlxyXG4gIDwvY29tcG9uZW50PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyB1c2VEaWN0IH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtZGljdFwiO1xyXG5pbXBvcnQgeyB1aUNvbnRleHQgfSBmcm9tIFwiLi4vLi4vdWlcIjtcclxuaW1wb3J0IHsgcmVmLCBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcclxuLyoqXHJcbiAqIOWtl+WFuOWNlemAieahhlxyXG4gKiDmlK/mjIFlbC1yYWRpby1ncm91cHxhLXJhZGlvLWdyb3Vw55qE5Y+C5pWwXHJcbiAqXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNEaWN0UmFkaW9cIixcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDmlbDmja7lrZflhbjphY3nva5cclxuICAgICAqL1xyXG4gICAgZGljdDoge30sXHJcbiAgICAvKipcclxuICAgICAqIOWPr+mAiemhue+8jOavlGRpY3QuZGF0YeS8mOWFiOe6p+mrmFxyXG4gICAgICovXHJcbiAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5IH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByYWRpb+e7hOS7tuWQjeensFxyXG4gICAgICogYW50ZHbkvb/nlKhidXR0b27moLflvI/nmoTml7blgJnmnInnlKhcclxuICAgICAqIOWNs+WwhuW6n+W8gyzor7fkvb/nlKhvcHRpb25OYW1lXHJcbiAgICAgKi9cclxuICAgIHJhZGlvTmFtZToge30sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgInpobnnmoTnu4Tku7blkI3np7BcclxuICAgICAqL1xyXG4gICAgb3B0aW9uTmFtZToge1xyXG4gICAgICB0eXBlOiBTdHJpbmdcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgInpobnnmoTlsZ7mgKdcclxuICAgICAqL1xyXG4gICAgb3B0aW9uUHJvcHM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog6L2s5o2iRGljdERhdGFcclxuICAgICAqL1xyXG4gICAgdHJhbnNmb3JtRGljdERhdGE6IHtcclxuICAgICAgdHlwZTogRnVuY3Rpb24sXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfVxyXG4gIH0sXHJcbiAgZW1pdHM6IFtcclxuICAgIC8qKlxyXG4gICAgICog5a2X5YW45pWw5o2u5Y+Y5YyW5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIFwiZGljdC1jaGFuZ2VcIixcclxuXHJcbiAgICAvKipcclxuICAgICAqIOmAieS4reWAvOWPmOWMluS6i+S7tu+8jOWPr+S7peiOt+WPluWIsOW9k+WJjemAieS4reeahG9wdGlvbuWvueixoVxyXG4gICAgICovXHJcbiAgICBcInNlbGVjdGVkLWNoYW5nZVwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiDlgLzlj5jljJbkuovku7ZcclxuICAgICAqL1xyXG4gICAgXCJjaGFuZ2VcIlxyXG4gIF0sXHJcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcblxyXG4gICAgaWYgKHByb3BzLnJhZGlvTmFtZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCLlj4LmlbByYWRpb05hbWXljbPlsIblup/lvIPvvIzor7fmlLnmiJBvcHRpb25OYW1lXCIpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29tcHV0ZWRSYWRpb05hbWUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiBwcm9wcy5vcHRpb25OYW1lID8/IHByb3BzLnJhZGlvTmFtZSA/PyB1aS5yYWRpby5uYW1lO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IHVzZWREaWN0ID0gdXNlRGljdChwcm9wcywgY3R4LCB1aS5yYWRpb0dyb3VwLm1vZGVsVmFsdWUpO1xyXG4gICAgY29uc3QgY29tcHV0ZWRPcHRpb25zID0gdXNlZERpY3QuY3JlYXRlQ29tcHV0ZWRPcHRpb25zKCk7XHJcblxyXG4gICAgY29uc3Qgb25TZWxlY3RlZENoYW5nZSA9ICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcclxuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRhcmdldCkge1xyXG4gICAgICAgIHZhbHVlID0gdmFsdWUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XHJcbiAgICAgIGlmIChkaWN0ICYmIGRpY3QuZGF0YU1hcCAmJiBkaWN0LmRhdGFNYXBbdmFsdWVdKSB7XHJcbiAgICAgICAgY29uc3Qgb3B0ID0gZGljdC5kYXRhTWFwW3ZhbHVlXTtcclxuICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBvcHQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpLFxyXG4gICAgICBjb21wdXRlZFJhZGlvTmFtZSxcclxuICAgICAgLi4udXNlZERpY3QsXHJcbiAgICAgIGNvbXB1dGVkT3B0aW9ucyxcclxuICAgICAgb25TZWxlY3RlZENoYW5nZVxyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuIiwiPHNjcmlwdCBsYW5nPVwidHN4XCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgYXMgX19NQUNST1NfZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qLyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNEaWN0U2VsZWN0XCJcclxufSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cclxuICA8cmVuZGVyPjwvcmVuZGVyPlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IGxhbmc9XCJ0c3hcIiBzZXR1cD5cclxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgcmVmLCByZXNvbHZlRHluYW1pY0NvbXBvbmVudCwgdXNlQXR0cnMgfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XHJcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XHJcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xyXG5cclxuLyoqXHJcbiAqIOWtl+WFuOmAieaLqeahhlxyXG4gKiDmlK/mjIFlbC1zZWxlY3R8YS1zZWxlY3TnmoTlsZ7mgKfphY3nva5cclxuICovXHJcblxyXG47XHJcblxyXG50eXBlIFByb3BzVHlwZSA9IHtcclxuICAvKipcclxuICAgKiDlrZflhbhcclxuICAgKi9cclxuICBkaWN0PzogYW55O1xyXG4gIC8qKlxyXG4gICAqIOWPr+mAiemhue+8jOavlGRpY3QuZGF0YeS8mOWFiOe6p+mrmFxyXG4gICAqL1xyXG4gIG9wdGlvbnM/OiBhbnlbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogc2VsZWN057uE5Lu255qE5o+S5qe9XHJcbiAgICovXHJcbiAgc2xvdHM/OiBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIOiHquWumuS5iWxhYmVs55qEcmVuZGVy5pa55rOVXHJcbiAgICovXHJcbiAgcmVuZGVyTGFiZWw/OiAoaXRlbTogYW55KSA9PiBhbnk7XHJcbiAgLyoqXHJcbiAgICog6L2s5o2iRGljdERhdGFcclxuICAgKi9cclxuICB0cmFuc2Zvcm1EaWN0RGF0YT86IChpdGVtOiBhbnkpID0+IGFueTtcclxufTtcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8UHJvcHNUeXBlPigpO1xyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoW1wiZGljdC1jaGFuZ2VcIiwgXCJzZWxlY3RlZC1jaGFuZ2VcIiwgXCJjaGFuZ2VcIl0pO1xyXG5cclxuY29uc3Qgc2VsZWN0UmVmID0gcmVmKCk7XHJcbmNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xyXG5jb25zdCBjb21wdXRlZFBsYWNlaG9sZGVyID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIC8vIEB0cy1pZ25vcmVcclxuICByZXR1cm4gcHJvcHMucGxhY2Vob2xkZXIgfHwgdChcImZzLmNvbXBvbmVudC5zZWxlY3QucGxhY2Vob2xkZXJcIik7XHJcbn0pO1xyXG5cclxuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuY29uc3QgYXR0cnMgPSB1c2VBdHRycygpO1xyXG5jb25zdCBjdHggPSB7XHJcbiAgZW1pdCxcclxuICBhdHRyc1xyXG59O1xyXG5jb25zdCB1c2VkRGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCwgdWkuc2VsZWN0Lm1vZGVsVmFsdWUpO1xyXG5jb25zdCBjb21wdXRlZE9wdGlvbnMgPSB1c2VkRGljdC5jcmVhdGVDb21wdXRlZE9wdGlvbnMoKTtcclxuY29uc3QgZmllbGROYW1lc0JpbmRlciA9IHJlZigpO1xyXG5pZiAocHJvcHMuZGljdCkge1xyXG4gIGZpZWxkTmFtZXNCaW5kZXIudmFsdWUgPSB1aS5zZWxlY3QuZmllbGROYW1lcyh7XHJcbiAgICB2YWx1ZTogcHJvcHMuZGljdC52YWx1ZSxcclxuICAgIGxhYmVsOiBwcm9wcy5kaWN0LmxhYmVsXHJcbiAgfSk7XHJcbn1cclxuXHJcbmNvbnN0IG9uU2VsZWN0ZWRDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xyXG4gIGVtaXQoXCJjaGFuZ2VcIiwgdmFsdWUpO1xyXG4gIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XHJcbiAgLy/lpoLmnpzmmK/mlbDnu4RcclxuICBpZiAodmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgY29uc3Qgb3B0cyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCB2IG9mIHZhbHVlKSB7XHJcbiAgICAgIGlmIChkaWN0ICYmIGRpY3QuZGF0YU1hcCAmJiBkaWN0LmRhdGFNYXBbdl0pIHtcclxuICAgICAgICBvcHRzLnB1c2goZGljdC5kYXRhTWFwW3ZdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBvcHRzKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGlmIChkaWN0ICYmIGRpY3QuZGF0YU1hcCAmJiBkaWN0LmRhdGFNYXBbdmFsdWVdKSB7XHJcbiAgICBjb25zdCBvcHQgPSBkaWN0LmRhdGFNYXBbdmFsdWVdO1xyXG4gICAgZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBvcHQpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBlbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIG51bGwpO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IHRlbXBTbG90cyA9IGRlZmluZVNsb3RzKCk7XHJcblxyXG5kZWZpbmVFeHBvc2Uoe1xyXG4gIHNlbGVjdFJlZixcclxuICBjb21wdXRlZFBsYWNlaG9sZGVyLFxyXG4gIC4uLnVzZWREaWN0LFxyXG4gIGNvbXB1dGVkT3B0aW9ucyxcclxuICBvblNlbGVjdGVkQ2hhbmdlXHJcbn0pO1xyXG5cclxuY29uc3QgcmVuZGVyID0gKCkgPT4ge1xyXG4gIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgY29uc3Qgc2VsZWN0Q29tcCA9IHJlc29sdmVEeW5hbWljQ29tcG9uZW50KHVpLnNlbGVjdC5uYW1lKTtcclxuICBjb25zdCB2TW9kZWwgPSB1aS5zZWxlY3QubW9kZWxWYWx1ZTtcclxuICBpZiAodWkub3B0aW9uLm5hbWUgPT0gbnVsbCkge1xyXG4gICAgLy9uYWl2ZSB1aVxyXG4gICAgLy/ku6VvcHRpb25z5Y+C5pWw5L2c5Li6b3B0aW9uc1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbXB1dGVkT3B0aW9ucy52YWx1ZSB8fCBbXTtcclxuICAgIGNvbnN0IGJpbmRpbmc6IGFueSA9IHtcclxuICAgICAgW2BvblVwZGF0ZToke3ZNb2RlbH1gXTogKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLiRlbWl0KGBvblVwZGF0ZToke3ZNb2RlbH1gLCB2YWx1ZSk7XHJcbiAgICAgICAgb25TZWxlY3RlZENoYW5nZSh2YWx1ZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIC4uLmF0dHJzXHJcbiAgICB9O1xyXG4gICAgY29uc3QgdGhpc1Nsb3RzID0ge1xyXG4gICAgICAuLi50ZW1wU2xvdHMsXHJcbiAgICAgIC4uLnByb3BzLnNsb3RzXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgPHNlbGVjdENvbXBcclxuICAgICAgICByZWY9e1wic2VsZWN0UmVmXCJ9XHJcbiAgICAgICAgcGxhY2Vob2xkZXI9e2NvbXB1dGVkUGxhY2Vob2xkZXIudmFsdWV9XHJcbiAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cclxuICAgICAgICB7Li4uZmllbGROYW1lc0JpbmRlci52YWx1ZX1cclxuICAgICAgICByZW5kZXJMYWJlbD17cHJvcHMucmVuZGVyTGFiZWx9XHJcbiAgICAgICAgdi1zbG90cz17dGhpc1Nsb3RzfVxyXG4gICAgICAgIHsuLi5iaW5kaW5nfVxyXG4gICAgICAvPlxyXG4gICAgKTtcclxuICB9XHJcbiAgLy8gb3B0aW9ucyDkuLrlrZDnu4Tku7ZcclxuICBjb25zdCBvcHRpb25zID0gW107XHJcbiAgY29uc3Qgb3B0aW9uQ29tcCA9IHJlc29sdmVEeW5hbWljQ29tcG9uZW50KHVpLm9wdGlvbi5uYW1lKTtcclxuICBjb25zdCBjb3MgPSBjb21wdXRlZE9wdGlvbnMudmFsdWUgfHwgW107XHJcbiAgZm9yIChjb25zdCBpdGVtIG9mIGNvcykge1xyXG4gICAgY29uc3Qgb3B0aW9uID0gKFxyXG4gICAgICA8b3B0aW9uQ29tcCB7Li4uaXRlbX0gdmFsdWU9e3VzZWREaWN0LmdldFZhbHVlKGl0ZW0pfSBsYWJlbD17dXNlZERpY3QuZ2V0TGFiZWwoaXRlbSl9PlxyXG4gICAgICAgIHtwcm9wcy5yZW5kZXJMYWJlbCA/IHByb3BzLnJlbmRlckxhYmVsKGl0ZW0pIDogdXNlZERpY3QuZ2V0TGFiZWwoaXRlbSl9XHJcbiAgICAgIDwvb3B0aW9uQ29tcD5cclxuICAgICk7XHJcbiAgICBvcHRpb25zLnB1c2gob3B0aW9uKTtcclxuICB9XHJcbiAgY29uc3QgdGhpc1Nsb3RzID0ge1xyXG4gICAgZGVmYXVsdDogKCkgPT4gb3B0aW9ucyxcclxuICAgIC4uLnRlbXBTbG90cyxcclxuICAgIC4uLnByb3BzLnNsb3RzXHJcbiAgfTtcclxuICByZXR1cm4gKFxyXG4gICAgPHNlbGVjdENvbXBcclxuICAgICAgcmVmPXtcInNlbGVjdFJlZlwifVxyXG4gICAgICBwbGFjZWhvbGRlcj17Y29tcHV0ZWRQbGFjZWhvbGRlci52YWx1ZX1cclxuICAgICAgdi1zbG90cz17dGhpc1Nsb3RzfVxyXG4gICAgICBvbkNoYW5nZT17b25TZWxlY3RlZENoYW5nZX1cclxuICAgICAgey4uLmF0dHJzfVxyXG4gICAgLz5cclxuICApO1xyXG59O1xyXG48L3NjcmlwdD5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi5hbnQtc2VsZWN0LW11bHRpcGxlIHtcclxuICBtaW4td2lkdGg6IDEwMHB4O1xyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3BhbiBjbGFzcz1cImZzLXZhbHVlcy1mb3JtYXRcIj5cclxuICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXRlbVJlbmRlclwiPlxyXG4gICAgICA8ZnMtcmVuZGVyIHYtZm9yPVwiaXRlbSBpbiB2aXNpYmxlVmFsdWVJdGVtc1wiIDprZXk9XCJnZXRWYWx1ZShpdGVtKVwiIDpyZW5kZXItZnVuYz1cIml0ZW1SZW5kZXJcIiA6c2NvcGU9XCJpdGVtXCIgLz5cclxuICAgICAgPHNwYW4gdi1pZj1cImhpZGRlblZhbHVlQ291bnQgPiAwXCI+K3t7IGhpZGRlblZhbHVlQ291bnQgfX08L3NwYW4+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPHRlbXBsYXRlIHYtZWxzZS1pZj1cInR5cGUgPT09ICd0ZXh0J1wiPlxyXG4gICAgICA8c3BhbiB2LWZvcj1cIml0ZW0gaW4gdmlzaWJsZVZhbHVlSXRlbXNcIiA6a2V5PVwiZ2V0VmFsdWUoaXRlbSlcIiBAY2xpY2s9XCJkb0NsaWNrKGl0ZW0pXCI+e3sgZ2V0TGFiZWwoaXRlbSkgfX08L3NwYW4+XHJcbiAgICAgIDxzcGFuIHYtaWY9XCJoaWRkZW5WYWx1ZUNvdW50ID4gMFwiPit7eyBoaWRkZW5WYWx1ZUNvdW50IH19PC9zcGFuPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gdmlzaWJsZVZhbHVlSXRlbXNcIiA6a2V5PVwiZ2V0VmFsdWUoaXRlbSlcIj5cclxuICAgICAgICA8Y29tcG9uZW50XHJcbiAgICAgICAgICA6aXM9XCJ1aS50YWcubmFtZVwiXHJcbiAgICAgICAgICBjbGFzcz1cImZzLXRhZ1wiXHJcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxyXG4gICAgICAgICAgOmNsb3NhYmxlPVwiY2xvc2FibGVcIlxyXG4gICAgICAgICAgdi1iaW5kPVwiaXRlbVwiXHJcbiAgICAgICAgICA6aWNvbj1cIm51bGxcIlxyXG4gICAgICAgICAgOm5hbWU9XCJudWxsXCJcclxuICAgICAgICAgIEBjbG9zZT1cImRvQ2xvc2UoaW5kZXgsIGl0ZW0pXCJcclxuICAgICAgICAgIEBjbGljaz1cImRvQ2xpY2soaXRlbSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXRlbS5pY29uXCI+XHJcbiAgICAgICAgICAgIDxmcy1pY29uIDppY29uPVwiaXRlbS5pY29uXCIgOnNwaW49XCJpdGVtLmljb25TcGluXCIgY2xhc3M9XCJmcy10YWctaWNvblwiIC8+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAge3sgZ2V0TGFiZWwoaXRlbSkgfX1cclxuICAgICAgICA8L2NvbXBvbmVudD5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPGNvbXBvbmVudCB2LWlmPVwiaGlkZGVuVmFsdWVDb3VudCA+IDBcIiA6aXM9XCJ1aS50YWcubmFtZVwiIGNsYXNzPVwiZnMtdGFnXCIgc2l6ZT1cInNtYWxsXCIgOmNsb3NhYmxlPVwiZmFsc2VcIj5cclxuICAgICAgICAre3sgaGlkZGVuVmFsdWVDb3VudCB9fVxyXG4gICAgICA8L2NvbXBvbmVudD5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgPC9zcGFuPlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgZm9yRWFjaCwgb21pdCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgUmVmIH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyB1c2VEaWN0IH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtZGljdFwiO1xyXG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcclxuZnVuY3Rpb24gZ2V0SGFzaENvZGUoc3RyOiBzdHJpbmcpIHtcclxuICBpZiAoc3RyID09IG51bGwpIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgc3RyID0gSlNPTi5zdHJpbmdpZnkoc3RyKTtcclxuICB9XHJcbiAgbGV0IGhhc2ggPSAwO1xyXG4gIGxldCBpO1xyXG4gIGxldCBjaHI7XHJcbiAgbGV0IGxlbjtcclxuICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGhhc2g7XHJcbiAgZm9yIChpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICBjaHIgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBjaHI7XHJcbiAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxyXG4gIH1cclxuICByZXR1cm4gTWF0aC5hYnMoaGFzaCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJ1aWxkQXJyYXlWYWx1ZShwcm9wczogYW55KSB7XHJcbiAgbGV0IHZhbHVlQXJyID0gW107XHJcbiAgaWYgKHR5cGVvZiBwcm9wcy5tb2RlbFZhbHVlID09PSBcInN0cmluZ1wiICYmIHByb3BzLm11bHRpcGxlICYmIHByb3BzLnNlcGFyYXRvciAhPSBudWxsICYmIHByb3BzLnNlcGFyYXRvciAhPT0gXCJcIikge1xyXG4gICAgdmFsdWVBcnIgPSBwcm9wcy5tb2RlbFZhbHVlLnNwbGl0KHByb3BzLnNlcGFyYXRvcik7XHJcbiAgfSBlbHNlIGlmIChwcm9wcy5tb2RlbFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgIC8vIOacrOadpeWwseaYr+aVsOe7hOeahFxyXG4gICAgdmFsdWVBcnIgPSBwcm9wcy5tb2RlbFZhbHVlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB2YWx1ZUFyciA9IFtwcm9wcy5tb2RlbFZhbHVlXTtcclxuICB9XHJcbiAgcmV0dXJuIHZhbHVlQXJyO1xyXG59XHJcblxyXG4vKipcclxuICogdmFsdWXmoLzlvI/ljJblsZXnpLrnu4Tku7ZcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc1ZhbHVlc0Zvcm1hdFwiLFxyXG4gIHByb3BzOiB7XHJcbiAgICAvKipcclxuICAgICAqIOWAvFxyXG4gICAgICovXHJcbiAgICBtb2RlbFZhbHVlOiB7fSxcclxuICAgIC8qKlxyXG4gICAgICog5a2X5YW46YWN572uXHJcbiAgICAgKi9cclxuICAgIGRpY3Q6IHt9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmmK/lkKblpJrpgIlcclxuICAgICAqL1xyXG4gICAgbXVsdGlwbGU6IHsgZGVmYXVsdDogdHJ1ZSB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDliIbpmpTnrKY8YnIvPlxyXG4gICAgICog5aSa6YCJ5pe277yM5aaC5p6cdmFsdWXkuLpzdHJpbmfvvIzliJnku6Xor6XliIbpmpTnrKbliIblibLmiJDlpJrkuKrlsZXnpLo8YnIvPlxyXG4gICAgICog5Lyg5YWl56m65a2X56ym5Liy77yM6KGo56S65LiN5YiG5YmyPGJyLz5cclxuICAgICAqL1xyXG4gICAgc2VwYXJhdG9yOiB7IGRlZmF1bHQ6IFwiLFwiIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpopzoibJcclxuICAgICAqIGVsZW1lbnQ944CQYXV0bywgcHJpbWFyeSwgc3VjY2Vzcywgd2FybmluZywgZGFuZ2VyICxpbmZv44CRXHJcbiAgICAgKiBhbnRkdj3jgJBhdXRvLCBwcmltYXJ5LCBzdWNjZXNzLCBibHVlLHJlZCwuLi7jgJFcclxuICAgICAqIOmFjee9rmF1dG/vvIzliJnoh6rliqjmoLnmja52YWx1ZeWAvGhhc2hjb2Rl5YiG6YWN6aKc6Imy5YC8XHJcbiAgICAgKi9cclxuICAgIGNvbG9yOiB7fSxcclxuICAgIC8qKlxyXG4gICAgICog5pWI5p6c77yI5LuFZWxlbWVudO+8iVxyXG4gICAgICoqL1xyXG4gICAgZWZmZWN0OiB7fSxcclxuICAgIC8qKlxyXG4gICAgICog6Ieq5Yqo5p+T6Imy6aKc6Imy5YC85YiX6KGoXHJcbiAgICAgKi9cclxuICAgIGF1dG9Db2xvcnM6IHtcclxuICAgICAgdHlwZTogQXJyYXlcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOiHquWKqOS4u+mimOWIl+ihqO+8iOS7hWVsZW1lbnTvvIlcclxuICAgICAqIOOAkCBsaWdodCwgcGxhaW4g44CRXHJcbiAgICAgKi9cclxuICAgIGF1dG9FZmZlY3RzOiB7XHJcbiAgICAgIHR5cGU6IEFycmF5XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmmL7npLrnsbvlnovvvJrjgJB0ZXh0LCB0YWfjgJFcclxuICAgICAqL1xyXG4gICAgdHlwZToge1xyXG4gICAgICBkZWZhdWx0OiBcInRhZ1wiXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDlgLznmoTnsbvlnovvvIzjgJAgdmFsdWUgfCBvYmplY3TjgJFcclxuICAgICAqL1xyXG4gICAgdmFsdWVUeXBlOiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZ1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5b2TdmFsdWXlgLzkuI3lnKjlrZflhbjkuK3ml7bpu5jorqTmmL7npLrnmoTmlofmnKxcclxuICAgICAqL1xyXG4gICAgZGVmYXVsdExhYmVsOiB7fSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIGxhYmVs6Ieq5a6a5LmJcmVuZGVyXHJcbiAgICAgKi9cclxuICAgIGxhYmVsRm9ybWF0dGVyOiB7XHJcbiAgICAgIHR5cGU6IEZ1bmN0aW9uXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDoh6rlrprkuYnpgInpoblyZW5kZXJcclxuICAgICAqL1xyXG4gICAgaXRlbVJlbmRlcjoge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOacgOWkmuaYvuekuueahOmAiemhueaVsOmHj++8jOi2heWHuumDqOWIhuaYvuekuuS4uiArTlxyXG4gICAgICovXHJcbiAgICBtYXhWaXNpYmxlOiB7XHJcbiAgICAgIHR5cGU6IE51bWJlclxyXG4gICAgfSxcclxuXHJcbiAgICBjbG9zYWJsZToge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgZW1pdHM6IFtcImNsaWNrXCIsIFwiZGljdC1jaGFuZ2VcIiwgXCJjbG9zZVwiLCBcInVwZGF0ZTptb2RlbFZhbHVlXCJdLFxyXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAvLyB0cmFjZS50cmFjZShcInZhbHVlcy1mb3JtYXRcIik7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcInZhbHVlcy1mb3JtYXQgaW5pdFwiLCBwcm9wcy5tb2RlbFZhbHVlKTtcclxuICAgIC8vY29uc3QgZGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCk7XHJcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG4gICAgY29uc3QgQ09MT1JfTElTVCA9IHVpLnRhZy5jb2xvcnM7XHJcbiAgICBjb25zdCBFRkZFQ1RfTElTVCA9IFtcInBsYWluXCIsIFwibGlnaHRcIl07XHJcblxyXG4gICAgY29uc3QgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgpO1xyXG4gICAgY29uc3QgeyBnZXRDb2xvciwgZ2V0VmFsdWUsIHJlbW92ZVByb3BWYWx1ZSB9ID0gdXNlZERpY3Q7XHJcbiAgICB1c2VkRGljdC53YXRjaFZhbHVlKCk7XHJcbiAgICBmdW5jdGlvbiBzZXRDb2xvcihwcm9wczogYW55LCBpdGVtOiBhbnkpIHtcclxuICAgICAgaWYgKCFpdGVtLmVmZmVjdCAmJiBwcm9wcy5lZmZlY3QpIHtcclxuICAgICAgICBpdGVtLmVmZmVjdCA9IHByb3BzLmVmZmVjdDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB0eXBlS2V5ID0gdWkudGFnLnR5cGU7XHJcbiAgICAgIGNvbnN0IGNvbG9yID0gZ2V0Q29sb3IoaXRlbSk7XHJcbiAgICAgIGlmIChjb2xvciAhPSBudWxsKSB7XHJcbiAgICAgICAgLy/lpoLmnpzlt7Lnu4/phY3nva7kuoZjb2xvclxyXG4gICAgICAgIGlmICh0eXBlb2YgY29sb3IgIT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL+WwhuWOn+acieeahGNvbG9y5a2X5q615Yig5o6J77yM6YG/5YWNbmFpdmUgY29sb3LmiqXplJlcclxuICAgICAgICByZW1vdmVQcm9wVmFsdWUoaXRlbSwgXCJjb2xvclwiKTtcclxuICAgICAgICBpdGVtW3R5cGVLZXldID0gY29sb3I7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm9wcy5jb2xvciA9PT0gXCJhdXRvXCIpIHtcclxuICAgICAgICBjb25zdCBoYXNoY29kZSA9IGdldEhhc2hDb2RlKGdldFZhbHVlKGl0ZW0pKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImhhc2hjb2RlXCIsIGdldFZhbHVlKGl0ZW0pLCBoYXNoY29kZSk7XHJcbiAgICAgICAgY29uc3QgY29sb3JzID0gcHJvcHMuYXV0b0NvbG9ycyA/IHByb3BzLmF1dG9Db2xvcnMgOiBDT0xPUl9MSVNUO1xyXG4gICAgICAgIGl0ZW1bdHlwZUtleV0gPSBjb2xvcnNbaGFzaGNvZGUgJSBjb2xvcnMubGVuZ3RoXTtcclxuICAgICAgICBjb25zdCBlZmZlY3RzID0gcHJvcHMuYXV0b0VmZmVjdHMgPyBwcm9wcy5hdXRvRWZmZWN0cyA6IEVGRkVDVF9MSVNUO1xyXG4gICAgICAgIGl0ZW0uZWZmZWN0ID0gZWZmZWN0c1tNYXRoLmZsb29yKGhhc2hjb2RlIC8gY29sb3JzLmxlbmd0aCkgJSBlZmZlY3RzLmxlbmd0aF07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaXRlbVt0eXBlS2V5XSA9IHByb3BzLmNvbG9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29tcHV0ZWRWYWx1ZUl0ZW1zOiBSZWY8YW55W10+ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBpZiAocHJvcHMudmFsdWVUeXBlID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgaWYgKHByb3BzLm1vZGVsVmFsdWUgJiYgIUFycmF5LmlzQXJyYXkocHJvcHMubW9kZWxWYWx1ZSkpIHtcclxuICAgICAgICAgIHJldHVybiBbcHJvcHMubW9kZWxWYWx1ZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9wcy5tb2RlbFZhbHVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xyXG4gICAgICBpZiAocHJvcHMubW9kZWxWYWx1ZSA9PSBudWxsIHx8IHByb3BzLm1vZGVsVmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdmFsdWVBcnIgPSBidWlsZEFycmF5VmFsdWUocHJvcHMpO1xyXG5cclxuICAgICAgbGV0IG9wdGlvbnMgPSBbXTtcclxuXHJcbiAgICAgIGNvbnN0IHZhbHVlUHJvcCA9IHByb3BzLmRpY3Q/LnZhbHVlIHx8IFwidmFsdWVcIjtcclxuICAgICAgY29uc3QgbGFiZWxQcm9wID0gcHJvcHMuZGljdD8ubGFiZWwgfHwgXCJsYWJlbFwiO1xyXG5cclxuICAgICAgaWYgKGRpY3QpIHtcclxuICAgICAgICBvcHRpb25zID0gZGljdC5nZXROb2Rlc0Zyb21EYXRhTWFwKHZhbHVlQXJyKTtcclxuICAgICAgICAvL+iuvue9rum7mOiupGxhYmVsXHJcbiAgICAgICAgZm9yRWFjaChvcHRpb25zLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW1bbGFiZWxQcm9wXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGl0ZW1bbGFiZWxQcm9wXSA9IHByb3BzLmRlZmF1bHRMYWJlbCB8fCBpdGVtW3ZhbHVlUHJvcF07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIGZvckVhY2godmFsdWVBcnIsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG4gICAgICAgICAgICBvcHRpb25zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvcHRpb25zLnB1c2goe1xyXG4gICAgICAgICAgICAgIFt2YWx1ZVByb3BdOiBpdGVtLFxyXG4gICAgICAgICAgICAgIFtsYWJlbFByb3BdOiBpdGVtXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBjb2xvcmZ1bE9wdGlvbnM6IGFueSA9IFtdO1xyXG4gICAgICBmb3JFYWNoKG9wdGlvbnMsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgY29sb3JmdWxPcHRpb25zLnB1c2gob21pdChpdGVtLCBcImNoaWxkcmVuXCIpKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGZvckVhY2goY29sb3JmdWxPcHRpb25zLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgIHNldENvbG9yKHByb3BzLCBpdGVtKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBjb2xvcmZ1bE9wdGlvbnM7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHZpc2libGVWYWx1ZUl0ZW1zID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICBpZiAocHJvcHMubWF4VmlzaWJsZSA9PSBudWxsIHx8IHByb3BzLm1heFZpc2libGUgPCAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbXB1dGVkVmFsdWVJdGVtcy52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29tcHV0ZWRWYWx1ZUl0ZW1zLnZhbHVlLnNsaWNlKDAsIHByb3BzLm1heFZpc2libGUpO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBoaWRkZW5WYWx1ZUNvdW50ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4gY29tcHV0ZWRWYWx1ZUl0ZW1zLnZhbHVlLmxlbmd0aCAtIHZpc2libGVWYWx1ZUl0ZW1zLnZhbHVlLmxlbmd0aDtcclxuICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIGRvQ2xpY2soaXRlbTogYW55KSB7XHJcbiAgICAgIGN0eC5lbWl0KFwiY2xpY2tcIiwgeyBpdGVtOiBpdGVtIH0pO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gZG9DbG9zZShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpIHtcclxuICAgICAgY3R4LmVtaXQoXCJjbG9zZVwiLCB7IGl0ZW0sIGluZGV4IH0pO1xyXG4gICAgICBjb25zdCBuZXdWYWx1ZXM6IGFueVtdID0gW107XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcHV0ZWRWYWx1ZUl0ZW1zLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGkgIT09IGluZGV4KSB7XHJcbiAgICAgICAgICBuZXdWYWx1ZXMucHVzaChnZXRWYWx1ZShjb21wdXRlZFZhbHVlSXRlbXMudmFsdWVbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCBuZXdWYWx1ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpLFxyXG4gICAgICAuLi51c2VkRGljdCxcclxuICAgICAgZG9DbGljayxcclxuICAgICAgY29tcHV0ZWRWYWx1ZUl0ZW1zLFxyXG4gICAgICB2aXNpYmxlVmFsdWVJdGVtcyxcclxuICAgICAgaGlkZGVuVmFsdWVDb3VudCxcclxuICAgICAgZG9DbG9zZVxyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XHJcbi5mcy12YWx1ZXMtZm9ybWF0IC5mcy10YWcge1xyXG4gIG1hcmdpbjogMnB4O1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxuICAuZnMtdGFnLWljb24ge1xyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPHNwYW4gY2xhc3M9XCJmcy12YWx1ZXMtZm9ybWF0XCI+XHJcbiAgICA8dGVtcGxhdGUgdi1pZj1cIml0ZW1SZW5kZXJcIj5cclxuICAgICAgPGZzLXJlbmRlciB2LWZvcj1cIml0ZW0gaW4gdmlzaWJsZVZhbHVlSXRlbXNcIiA6a2V5PVwiZ2V0VmFsdWUoaXRlbSlcIiA6cmVuZGVyLWZ1bmM9XCJpdGVtUmVuZGVyXCIgOnNjb3BlPVwiaXRlbVwiIC8+XHJcbiAgICAgIDxzcGFuIHYtaWY9XCJoaWRkZW5WYWx1ZUNvdW50ID4gMFwiPit7eyBoaWRkZW5WYWx1ZUNvdW50IH19PC9zcGFuPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJ0eXBlID09PSAndGV4dCdcIj5cclxuICAgICAgPHNwYW4gdi1mb3I9XCJpdGVtIGluIHZpc2libGVWYWx1ZUl0ZW1zXCIgOmtleT1cImdldFZhbHVlKGl0ZW0pXCIgQGNsaWNrPVwiZG9DbGljayhpdGVtKVwiPnt7IGdldExhYmVsKGl0ZW0pIH19PC9zcGFuPlxyXG4gICAgICA8c3BhbiB2LWlmPVwiaGlkZGVuVmFsdWVDb3VudCA+IDBcIj4re3sgaGlkZGVuVmFsdWVDb3VudCB9fTwvc3Bhbj5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIHZpc2libGVWYWx1ZUl0ZW1zXCIgOmtleT1cImdldFZhbHVlKGl0ZW0pXCI+XHJcbiAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgOmlzPVwidWkudGFnLm5hbWVcIlxyXG4gICAgICAgICAgY2xhc3M9XCJmcy10YWdcIlxyXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgIDpjbG9zYWJsZT1cImNsb3NhYmxlXCJcclxuICAgICAgICAgIHYtYmluZD1cIml0ZW1cIlxyXG4gICAgICAgICAgOmljb249XCJudWxsXCJcclxuICAgICAgICAgIDpuYW1lPVwibnVsbFwiXHJcbiAgICAgICAgICBAY2xvc2U9XCJkb0Nsb3NlKGluZGV4LCBpdGVtKVwiXHJcbiAgICAgICAgICBAY2xpY2s9XCJkb0NsaWNrKGl0ZW0pXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cIml0ZW0uaWNvblwiPlxyXG4gICAgICAgICAgICA8ZnMtaWNvbiA6aWNvbj1cIml0ZW0uaWNvblwiIDpzcGluPVwiaXRlbS5pY29uU3BpblwiIGNsYXNzPVwiZnMtdGFnLWljb25cIiAvPlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIHt7IGdldExhYmVsKGl0ZW0pIH19XHJcbiAgICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDxjb21wb25lbnQgdi1pZj1cImhpZGRlblZhbHVlQ291bnQgPiAwXCIgOmlzPVwidWkudGFnLm5hbWVcIiBjbGFzcz1cImZzLXRhZ1wiIHNpemU9XCJzbWFsbFwiIDpjbG9zYWJsZT1cImZhbHNlXCI+XHJcbiAgICAgICAgK3t7IGhpZGRlblZhbHVlQ291bnQgfX1cclxuICAgICAgPC9jb21wb25lbnQ+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gIDwvc3Bhbj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGZvckVhY2gsIG9taXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIFJlZiB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcbmZ1bmN0aW9uIGdldEhhc2hDb2RlKHN0cjogc3RyaW5nKSB7XHJcbiAgaWYgKHN0ciA9PSBudWxsKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcbiAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHtcclxuICAgIHN0ciA9IEpTT04uc3RyaW5naWZ5KHN0cik7XHJcbiAgfVxyXG4gIGxldCBoYXNoID0gMDtcclxuICBsZXQgaTtcclxuICBsZXQgY2hyO1xyXG4gIGxldCBsZW47XHJcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHJldHVybiBoYXNoO1xyXG4gIGZvciAoaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgY2hyID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgY2hyO1xyXG4gICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcclxuICB9XHJcbiAgcmV0dXJuIE1hdGguYWJzKGhhc2gpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBidWlsZEFycmF5VmFsdWUocHJvcHM6IGFueSkge1xyXG4gIGxldCB2YWx1ZUFyciA9IFtdO1xyXG4gIGlmICh0eXBlb2YgcHJvcHMubW9kZWxWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBwcm9wcy5tdWx0aXBsZSAmJiBwcm9wcy5zZXBhcmF0b3IgIT0gbnVsbCAmJiBwcm9wcy5zZXBhcmF0b3IgIT09IFwiXCIpIHtcclxuICAgIHZhbHVlQXJyID0gcHJvcHMubW9kZWxWYWx1ZS5zcGxpdChwcm9wcy5zZXBhcmF0b3IpO1xyXG4gIH0gZWxzZSBpZiAocHJvcHMubW9kZWxWYWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAvLyDmnKzmnaXlsLHmmK/mlbDnu4TnmoRcclxuICAgIHZhbHVlQXJyID0gcHJvcHMubW9kZWxWYWx1ZTtcclxuICB9IGVsc2Uge1xyXG4gICAgdmFsdWVBcnIgPSBbcHJvcHMubW9kZWxWYWx1ZV07XHJcbiAgfVxyXG4gIHJldHVybiB2YWx1ZUFycjtcclxufVxyXG5cclxuLyoqXHJcbiAqIHZhbHVl5qC85byP5YyW5bGV56S657uE5Lu2XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNWYWx1ZXNGb3JtYXRcIixcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDlgLxcclxuICAgICAqL1xyXG4gICAgbW9kZWxWYWx1ZToge30sXHJcbiAgICAvKipcclxuICAgICAqIOWtl+WFuOmFjee9rlxyXG4gICAgICovXHJcbiAgICBkaWN0OiB7fSxcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5aSa6YCJXHJcbiAgICAgKi9cclxuICAgIG11bHRpcGxlOiB7IGRlZmF1bHQ6IHRydWUgfSxcclxuICAgIC8qKlxyXG4gICAgICog5YiG6ZqU56ymPGJyLz5cclxuICAgICAqIOWkmumAieaXtu+8jOWmguaenHZhbHVl5Li6c3RyaW5n77yM5YiZ5Lul6K+l5YiG6ZqU56ym5YiG5Ymy5oiQ5aSa5Liq5bGV56S6PGJyLz5cclxuICAgICAqIOS8oOWFpeepuuWtl+espuS4su+8jOihqOekuuS4jeWIhuWJsjxici8+XHJcbiAgICAgKi9cclxuICAgIHNlcGFyYXRvcjogeyBkZWZhdWx0OiBcIixcIiB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6aKc6ImyXHJcbiAgICAgKiBlbGVtZW50PeOAkGF1dG8sIHByaW1hcnksIHN1Y2Nlc3MsIHdhcm5pbmcsIGRhbmdlciAsaW5mb+OAkVxyXG4gICAgICogYW50ZHY944CQYXV0bywgcHJpbWFyeSwgc3VjY2VzcywgYmx1ZSxyZWQsLi4u44CRXHJcbiAgICAgKiDphY3nva5hdXRv77yM5YiZ6Ieq5Yqo5qC55o2udmFsdWXlgLxoYXNoY29kZeWIhumFjeminOiJsuWAvFxyXG4gICAgICovXHJcbiAgICBjb2xvcjoge30sXHJcbiAgICAvKipcclxuICAgICAqIOaViOaenO+8iOS7hWVsZW1lbnTvvIlcclxuICAgICAqKi9cclxuICAgIGVmZmVjdDoge30sXHJcbiAgICAvKipcclxuICAgICAqIOiHquWKqOafk+iJsuminOiJsuWAvOWIl+ihqFxyXG4gICAgICovXHJcbiAgICBhdXRvQ29sb3JzOiB7XHJcbiAgICAgIHR5cGU6IEFycmF5XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDoh6rliqjkuLvpopjliJfooajvvIjku4VlbGVtZW5077yJXHJcbiAgICAgKiDjgJAgbGlnaHQsIHBsYWluIOOAkVxyXG4gICAgICovXHJcbiAgICBhdXRvRWZmZWN0czoge1xyXG4gICAgICB0eXBlOiBBcnJheVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5pi+56S657G75Z6L77ya44CQdGV4dCwgdGFn44CRXHJcbiAgICAgKi9cclxuICAgIHR5cGU6IHtcclxuICAgICAgZGVmYXVsdDogXCJ0YWdcIlxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog5YC855qE57G75Z6L77yM44CQIHZhbHVlIHwgb2JqZWN044CRXHJcbiAgICAgKi9cclxuICAgIHZhbHVlVHlwZToge1xyXG4gICAgICB0eXBlOiBTdHJpbmdcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOW9k3ZhbHVl5YC85LiN5Zyo5a2X5YW45Lit5pe26buY6K6k5pi+56S655qE5paH5pysXHJcbiAgICAgKi9cclxuICAgIGRlZmF1bHRMYWJlbDoge30sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBsYWJlbOiHquWumuS5iXJlbmRlclxyXG4gICAgICovXHJcbiAgICBsYWJlbEZvcm1hdHRlcjoge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvblxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog6Ieq5a6a5LmJ6YCJ6aG5cmVuZGVyXHJcbiAgICAgKi9cclxuICAgIGl0ZW1SZW5kZXI6IHtcclxuICAgICAgdHlwZTogRnVuY3Rpb25cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmnIDlpJrmmL7npLrnmoTpgInpobnmlbDph4/vvIzotoXlh7rpg6jliIbmmL7npLrkuLogK05cclxuICAgICAqL1xyXG4gICAgbWF4VmlzaWJsZToge1xyXG4gICAgICB0eXBlOiBOdW1iZXJcclxuICAgIH0sXHJcblxyXG4gICAgY2xvc2FibGU6IHtcclxuICAgICAgdHlwZTogQm9vbGVhbixcclxuICAgICAgZGVmYXVsdDogZmFsc2VcclxuICAgIH1cclxuICB9LFxyXG4gIGVtaXRzOiBbXCJjbGlja1wiLCBcImRpY3QtY2hhbmdlXCIsIFwiY2xvc2VcIiwgXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiXSxcclxuICBzZXR1cChwcm9wczogYW55LCBjdHg6IGFueSkge1xyXG4gICAgLy8gdHJhY2UudHJhY2UoXCJ2YWx1ZXMtZm9ybWF0XCIpO1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJ2YWx1ZXMtZm9ybWF0IGluaXRcIiwgcHJvcHMubW9kZWxWYWx1ZSk7XHJcbiAgICAvL2NvbnN0IGRpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgpO1xyXG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuICAgIGNvbnN0IENPTE9SX0xJU1QgPSB1aS50YWcuY29sb3JzO1xyXG4gICAgY29uc3QgRUZGRUNUX0xJU1QgPSBbXCJwbGFpblwiLCBcImxpZ2h0XCJdO1xyXG5cclxuICAgIGNvbnN0IHVzZWREaWN0ID0gdXNlRGljdChwcm9wcywgY3R4KTtcclxuICAgIGNvbnN0IHsgZ2V0Q29sb3IsIGdldFZhbHVlLCByZW1vdmVQcm9wVmFsdWUgfSA9IHVzZWREaWN0O1xyXG4gICAgdXNlZERpY3Qud2F0Y2hWYWx1ZSgpO1xyXG4gICAgZnVuY3Rpb24gc2V0Q29sb3IocHJvcHM6IGFueSwgaXRlbTogYW55KSB7XHJcbiAgICAgIGlmICghaXRlbS5lZmZlY3QgJiYgcHJvcHMuZWZmZWN0KSB7XHJcbiAgICAgICAgaXRlbS5lZmZlY3QgPSBwcm9wcy5lZmZlY3Q7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdHlwZUtleSA9IHVpLnRhZy50eXBlO1xyXG4gICAgICBjb25zdCBjb2xvciA9IGdldENvbG9yKGl0ZW0pO1xyXG4gICAgICBpZiAoY29sb3IgIT0gbnVsbCkge1xyXG4gICAgICAgIC8v5aaC5p6c5bey57uP6YWN572u5LqGY29sb3JcclxuICAgICAgICBpZiAodHlwZW9mIGNvbG9yICE9IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/lsIbljp/mnInnmoRjb2xvcuWtl+auteWIoOaOie+8jOmBv+WFjW5haXZlIGNvbG9y5oql6ZSZXHJcbiAgICAgICAgcmVtb3ZlUHJvcFZhbHVlKGl0ZW0sIFwiY29sb3JcIik7XHJcbiAgICAgICAgaXRlbVt0eXBlS2V5XSA9IGNvbG9yO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJvcHMuY29sb3IgPT09IFwiYXV0b1wiKSB7XHJcbiAgICAgICAgY29uc3QgaGFzaGNvZGUgPSBnZXRIYXNoQ29kZShnZXRWYWx1ZShpdGVtKSk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJoYXNoY29kZVwiLCBnZXRWYWx1ZShpdGVtKSwgaGFzaGNvZGUpO1xyXG4gICAgICAgIGNvbnN0IGNvbG9ycyA9IHByb3BzLmF1dG9Db2xvcnMgPyBwcm9wcy5hdXRvQ29sb3JzIDogQ09MT1JfTElTVDtcclxuICAgICAgICBpdGVtW3R5cGVLZXldID0gY29sb3JzW2hhc2hjb2RlICUgY29sb3JzLmxlbmd0aF07XHJcbiAgICAgICAgY29uc3QgZWZmZWN0cyA9IHByb3BzLmF1dG9FZmZlY3RzID8gcHJvcHMuYXV0b0VmZmVjdHMgOiBFRkZFQ1RfTElTVDtcclxuICAgICAgICBpdGVtLmVmZmVjdCA9IGVmZmVjdHNbTWF0aC5mbG9vcihoYXNoY29kZSAvIGNvbG9ycy5sZW5ndGgpICUgZWZmZWN0cy5sZW5ndGhdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGl0ZW1bdHlwZUtleV0gPSBwcm9wcy5jb2xvcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkVmFsdWVJdGVtczogUmVmPGFueVtdPiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgaWYgKHByb3BzLnZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgIGlmIChwcm9wcy5tb2RlbFZhbHVlICYmICFBcnJheS5pc0FycmF5KHByb3BzLm1vZGVsVmFsdWUpKSB7XHJcbiAgICAgICAgICByZXR1cm4gW3Byb3BzLm1vZGVsVmFsdWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJvcHMubW9kZWxWYWx1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZGljdCA9IHVzZWREaWN0LmdldERpY3QoKTtcclxuICAgICAgaWYgKHByb3BzLm1vZGVsVmFsdWUgPT0gbnVsbCB8fCBwcm9wcy5tb2RlbFZhbHVlID09PSBcIlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZhbHVlQXJyID0gYnVpbGRBcnJheVZhbHVlKHByb3BzKTtcclxuXHJcbiAgICAgIGxldCBvcHRpb25zID0gW107XHJcblxyXG4gICAgICBjb25zdCB2YWx1ZVByb3AgPSBwcm9wcy5kaWN0Py52YWx1ZSB8fCBcInZhbHVlXCI7XHJcbiAgICAgIGNvbnN0IGxhYmVsUHJvcCA9IHByb3BzLmRpY3Q/LmxhYmVsIHx8IFwibGFiZWxcIjtcclxuXHJcbiAgICAgIGlmIChkaWN0KSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IGRpY3QuZ2V0Tm9kZXNGcm9tRGF0YU1hcCh2YWx1ZUFycik7XHJcbiAgICAgICAgLy/orr7nva7pu5jorqRsYWJlbFxyXG4gICAgICAgIGZvckVhY2gob3B0aW9ucywgKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtW2xhYmVsUHJvcF0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpdGVtW2xhYmVsUHJvcF0gPSBwcm9wcy5kZWZhdWx0TGFiZWwgfHwgaXRlbVt2YWx1ZVByb3BdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG9wdGlvbnMgPSBbXTtcclxuICAgICAgICBmb3JFYWNoKHZhbHVlQXJyLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBPYmplY3QpIHtcclxuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgICBbdmFsdWVQcm9wXTogaXRlbSxcclxuICAgICAgICAgICAgICBbbGFiZWxQcm9wXTogaXRlbVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgY29sb3JmdWxPcHRpb25zOiBhbnkgPSBbXTtcclxuICAgICAgZm9yRWFjaChvcHRpb25zLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbG9yZnVsT3B0aW9ucy5wdXNoKG9taXQoaXRlbSwgXCJjaGlsZHJlblwiKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBmb3JFYWNoKGNvbG9yZnVsT3B0aW9ucywgKGl0ZW0pID0+IHtcclxuICAgICAgICBzZXRDb2xvcihwcm9wcywgaXRlbSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gY29sb3JmdWxPcHRpb25zO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCB2aXNpYmxlVmFsdWVJdGVtcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgaWYgKHByb3BzLm1heFZpc2libGUgPT0gbnVsbCB8fCBwcm9wcy5tYXhWaXNpYmxlIDwgMCkge1xyXG4gICAgICAgIHJldHVybiBjb21wdXRlZFZhbHVlSXRlbXMudmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNvbXB1dGVkVmFsdWVJdGVtcy52YWx1ZS5zbGljZSgwLCBwcm9wcy5tYXhWaXNpYmxlKTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgaGlkZGVuVmFsdWVDb3VudCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgcmV0dXJuIGNvbXB1dGVkVmFsdWVJdGVtcy52YWx1ZS5sZW5ndGggLSB2aXNpYmxlVmFsdWVJdGVtcy52YWx1ZS5sZW5ndGg7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmdW5jdGlvbiBkb0NsaWNrKGl0ZW06IGFueSkge1xyXG4gICAgICBjdHguZW1pdChcImNsaWNrXCIsIHsgaXRlbTogaXRlbSB9KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGRvQ2xvc2UoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSB7XHJcbiAgICAgIGN0eC5lbWl0KFwiY2xvc2VcIiwgeyBpdGVtLCBpbmRleCB9KTtcclxuICAgICAgY29uc3QgbmV3VmFsdWVzOiBhbnlbXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXB1dGVkVmFsdWVJdGVtcy52YWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmIChpICE9PSBpbmRleCkge1xyXG4gICAgICAgICAgbmV3VmFsdWVzLnB1c2goZ2V0VmFsdWUoY29tcHV0ZWRWYWx1ZUl0ZW1zLnZhbHVlW2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgbmV3VmFsdWVzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1aSxcclxuICAgICAgLi4udXNlZERpY3QsXHJcbiAgICAgIGRvQ2xpY2ssXHJcbiAgICAgIGNvbXB1dGVkVmFsdWVJdGVtcyxcclxuICAgICAgdmlzaWJsZVZhbHVlSXRlbXMsXHJcbiAgICAgIGhpZGRlblZhbHVlQ291bnQsXHJcbiAgICAgIGRvQ2xvc2VcclxuICAgIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtdmFsdWVzLWZvcm1hdCAuZnMtdGFnIHtcclxuICBtYXJnaW46IDJweDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgLmZzLXRhZy1pY29uIHtcclxuICB9XHJcbn1cclxuPC9zdHlsZT5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxzcGFuPlxyXG4gICAgPHRlbXBsYXRlIHYtaWY9XCJjb21wdXRlZE11bHRpcGxlXCI+XHJcbiAgICAgIDxkaXYgdi1mb3I9XCIoTGFiZWxzLCBJbmRleCkgaW4gbXVsdGlwbGVMYWJlbHNcIiA6a2V5PVwiSW5kZXhcIj5cclxuICAgICAgICA8c3BhbiB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gTGFiZWxzXCIgOmtleT1cImluZGV4XCI+XHJcbiAgICAgICAgICA8c3BhbiB2LWlmPVwiaW5kZXggIT09IDBcIj4gLyA8L3NwYW4+XHJcbiAgICAgICAgICA8c3Bhbj57eyBnZXRMYWJlbChpdGVtKSB9fTwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgIDxzcGFuIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBsYWJlbHNcIiA6a2V5PVwiaW5kZXhcIj5cclxuICAgICAgICA8c3BhbiB2LWlmPVwiaW5kZXggIT09IDBcIj4gLyA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4+e3sgZ2V0TGFiZWwoaXRlbSkgfX08L3NwYW4+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgPC9zcGFuPlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcclxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcclxuLyoqXHJcbiAqIOe6p+iBlOaVsOaNruagvOW8j+WMluWxleekuue7hOS7tlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzRGljdENhc2NhZGVyRm9ybWF0XCIsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICogICDlgLw8YnIvPlxyXG4gICAgICogICDljZXpgInml7YgJzEsMiwzJyDmiJYgWzEsMiwzXTxici8+XHJcbiAgICAgKiAgIOWkmumAiVtbMSwyLDNdLFs0LDUsNl1dPGJyLz5cclxuICAgICAqL1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgbW9kZWxWYWx1ZToge1xyXG4gICAgICB0eXBlOiBbU3RyaW5nLCBBcnJheV0sXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcclxuICAgICAgcmVxdWlyZTogdHJ1ZVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogIHZhbHVl55qE5YiG6ZqU56ymPGJyLz5cclxuICAgICAqICDlpJrpgInml7bvvIzlpoLmnpx2YWx1ZeS4unN0cmluZ++8jOWImeS7peivpeWIhumalOespuWIhuWJsuaIkOWkmuS4quWxleekujxici8+XHJcbiAgICAgKiAg5Lyg5YWl56m65a2X56ym5Liy77yM6KGo56S65LiN5YiG5YmyPGJyLz5cclxuICAgICAqL1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgc2VwYXJhdG9yOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogXCIsXCIsIHJlcXVpcmU6IGZhbHNlIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuWkmumAiVxyXG4gICAgICovXHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBtdWx0aXBsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDmlbDmja7lrZflhbhcclxuICAgICAqL1xyXG4gICAgZGljdDoge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcclxuICAgICAgcmVxdWlyZTogZmFsc2VcclxuICAgIH1cclxuICB9IGFzIGFueSxcclxuICBlbWl0czogW1wiZGljdC1jaGFuZ2VcIl0sXHJcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xyXG4gICAgY29uc3QgZGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCk7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBpZiAocHJvcHMuZGljdD8uZ2V0Tm9kZXNCeVZhbHVlcykge1xyXG4gICAgICBkaWN0LndhdGNoVmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb21wdXRlZE11bHRpcGxlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHJldHVybiBwcm9wcy5tdWx0aXBsZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLmRpY3QsXHJcbiAgICAgIGNvbXB1dGVkTXVsdGlwbGVcclxuICAgIH07XHJcbiAgfSxcclxuICBkYXRhKCkge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH0sXHJcbiAgY29tcHV0ZWQ6IHtcclxuICAgIGxhYmVscygpIHtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBpZiAodGhpcy5tb2RlbFZhbHVlID09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH1cclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICByZXR1cm4gdGhpcy5idWlsZFZhbHVlSXRlbSh0aGlzLm1vZGVsVmFsdWUpO1xyXG4gICAgfSxcclxuICAgIG11bHRpcGxlTGFiZWxzKCkge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGlmICh0aGlzLm1vZGVsVmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhcnIgPSBbXTtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5tb2RlbFZhbHVlKSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGFyci5wdXNoKHRoaXMuYnVpbGRWYWx1ZUl0ZW0oaXRlbSkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhcnI7XHJcbiAgICB9XHJcbiAgfSxcclxuICBtZXRob2RzOiB7XHJcbiAgICBnZXRWYWx1ZUFycih2YWx1ZXM6IGFueSkge1xyXG4gICAgICBpZiAodmFsdWVzID09IG51bGwpIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgICAgIHZhbHVlcyA9IFtdO1xyXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMubW9kZWxWYWx1ZSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiBpdGVtKSB7XHJcbiAgICAgICAgICAgICAgdmFsdWVzLnB1c2goc3ViKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICB2YWx1ZXMgPSB0aGlzLm1vZGVsVmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgYXJyID0gbnVsbDtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBpZiAodHlwZW9mIHZhbHVlcyA9PT0gXCJzdHJpbmdcIiAmJiAhdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnNlcGFyYXRvciAhPSBudWxsICYmIHRoaXMuc2VwYXJhdG9yICE9PSBcIlwiKSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGFyciA9IHZhbHVlcy5zcGxpdCh0aGlzLnNlcGFyYXRvcik7XHJcbiAgICAgIH0gZWxzZSBpZiAodmFsdWVzIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICBhcnIgPSB2YWx1ZXM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXJyID0gW3ZhbHVlc107XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFycjtcclxuICAgIH0sXHJcbiAgICBidWlsZFZhbHVlSXRlbSh2YWx1ZXM6IGFueSkge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0VmFsdWVBcnIodmFsdWVzKTtcclxuXHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgY29uc3QgZGljdCA9IHRoaXMuZ2V0RGljdCgpO1xyXG4gICAgICBpZiAoZGljdCkge1xyXG4gICAgICAgIHJldHVybiBkaWN0LmdldE5vZGVzRnJvbURhdGFNYXAoYXJyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPHNwYW4+XHJcbiAgICA8dGVtcGxhdGUgdi1pZj1cImNvbXB1dGVkTXVsdGlwbGVcIj5cclxuICAgICAgPGRpdiB2LWZvcj1cIihMYWJlbHMsIEluZGV4KSBpbiBtdWx0aXBsZUxhYmVsc1wiIDprZXk9XCJJbmRleFwiPlxyXG4gICAgICAgIDxzcGFuIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBMYWJlbHNcIiA6a2V5PVwiaW5kZXhcIj5cclxuICAgICAgICAgIDxzcGFuIHYtaWY9XCJpbmRleCAhPT0gMFwiPiAvIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuPnt7IGdldExhYmVsKGl0ZW0pIH19PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPHRlbXBsYXRlIHYtZWxzZT5cclxuICAgICAgPHNwYW4gdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGxhYmVsc1wiIDprZXk9XCJpbmRleFwiPlxyXG4gICAgICAgIDxzcGFuIHYtaWY9XCJpbmRleCAhPT0gMFwiPiAvIDwvc3Bhbj5cclxuICAgICAgICA8c3Bhbj57eyBnZXRMYWJlbChpdGVtKSB9fTwvc3Bhbj5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICA8L3NwYW4+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyB1c2VEaWN0IH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtZGljdFwiO1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xyXG4vKipcclxuICog57qn6IGU5pWw5o2u5qC85byP5YyW5bGV56S657uE5Lu2XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNEaWN0Q2FzY2FkZXJGb3JtYXRcIixcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiAgIOWAvDxici8+XHJcbiAgICAgKiAgIOWNlemAieaXtiAnMSwyLDMnIOaIliBbMSwyLDNdPGJyLz5cclxuICAgICAqICAg5aSa6YCJW1sxLDIsM10sWzQsNSw2XV08YnIvPlxyXG4gICAgICovXHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBtb2RlbFZhbHVlOiB7XHJcbiAgICAgIHR5cGU6IFtTdHJpbmcsIEFycmF5XSxcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkLFxyXG4gICAgICByZXF1aXJlOiB0cnVlXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiAgdmFsdWXnmoTliIbpmpTnrKY8YnIvPlxyXG4gICAgICogIOWkmumAieaXtu+8jOWmguaenHZhbHVl5Li6c3RyaW5n77yM5YiZ5Lul6K+l5YiG6ZqU56ym5YiG5Ymy5oiQ5aSa5Liq5bGV56S6PGJyLz5cclxuICAgICAqICDkvKDlhaXnqbrlrZfnrKbkuLLvvIzooajnpLrkuI3liIblibI8YnIvPlxyXG4gICAgICovXHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBzZXBhcmF0b3I6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBcIixcIiwgcmVxdWlyZTogZmFsc2UgfSxcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5aSa6YCJXHJcbiAgICAgKi9cclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIG11bHRpcGxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXHJcbiAgICAvKipcclxuICAgICAqIOaVsOaNruWtl+WFuFxyXG4gICAgICovXHJcbiAgICBkaWN0OiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkLFxyXG4gICAgICByZXF1aXJlOiBmYWxzZVxyXG4gICAgfVxyXG4gIH0gYXMgYW55LFxyXG4gIGVtaXRzOiBbXCJkaWN0LWNoYW5nZVwiXSxcclxuICBzZXR1cChwcm9wcywgY3R4KSB7XHJcbiAgICBjb25zdCBkaWN0ID0gdXNlRGljdChwcm9wcywgY3R4KTtcclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIGlmIChwcm9wcy5kaWN0Py5nZXROb2Rlc0J5VmFsdWVzKSB7XHJcbiAgICAgIGRpY3Qud2F0Y2hWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkTXVsdGlwbGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgcmV0dXJuIHByb3BzLm11bHRpcGxlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uZGljdCxcclxuICAgICAgY29tcHV0ZWRNdWx0aXBsZVxyXG4gICAgfTtcclxuICB9LFxyXG4gIGRhdGEoKSB7XHJcbiAgICByZXR1cm4ge307XHJcbiAgfSxcclxuICBjb21wdXRlZDoge1xyXG4gICAgbGFiZWxzKCkge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGlmICh0aGlzLm1vZGVsVmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkVmFsdWVJdGVtKHRoaXMubW9kZWxWYWx1ZSk7XHJcbiAgICB9LFxyXG4gICAgbXVsdGlwbGVMYWJlbHMoKSB7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgaWYgKHRoaXMubW9kZWxWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFyciA9IFtdO1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLm1vZGVsVmFsdWUpIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgYXJyLnB1c2godGhpcy5idWlsZFZhbHVlSXRlbShpdGVtKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFycjtcclxuICAgIH1cclxuICB9LFxyXG4gIG1ldGhvZHM6IHtcclxuICAgIGdldFZhbHVlQXJyKHZhbHVlczogYW55KSB7XHJcbiAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgdmFsdWVzID0gW107XHJcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5tb2RlbFZhbHVlKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIGl0ZW0pIHtcclxuICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzdWIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgIHZhbHVlcyA9IHRoaXMubW9kZWxWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBhcnIgPSBudWxsO1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGlmICh0eXBlb2YgdmFsdWVzID09PSBcInN0cmluZ1wiICYmICF0aGlzLm11bHRpcGxlICYmIHRoaXMuc2VwYXJhdG9yICE9IG51bGwgJiYgdGhpcy5zZXBhcmF0b3IgIT09IFwiXCIpIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgYXJyID0gdmFsdWVzLnNwbGl0KHRoaXMuc2VwYXJhdG9yKTtcclxuICAgICAgfSBlbHNlIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgIGFyciA9IHZhbHVlcztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhcnIgPSBbdmFsdWVzXTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYXJyO1xyXG4gICAgfSxcclxuICAgIGJ1aWxkVmFsdWVJdGVtKHZhbHVlczogYW55KSB7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgY29uc3QgYXJyID0gdGhpcy5nZXRWYWx1ZUFycih2YWx1ZXMpO1xyXG5cclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBjb25zdCBkaWN0ID0gdGhpcy5nZXREaWN0KCk7XHJcbiAgICAgIGlmIChkaWN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGRpY3QuZ2V0Tm9kZXNGcm9tRGF0YU1hcChhcnIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8Y29tcG9uZW50XHJcbiAgICA6aXM9XCJ1aS5jYXNjYWRlci5uYW1lXCJcclxuICAgIHJlZj1cImNhc2NhZGVyUmVmXCJcclxuICAgIDpvcHRpb25zPVwiY29tcHV0ZWRPcHRpb25zXCJcclxuICAgIHYtYmluZD1cImZpZWxkTmFtZXNCaW5kZXJcIlxyXG4gICAgQGNoYW5nZT1cIm9uU2VsZWN0Q2hhbmdlXCJcclxuICA+XHJcbiAgICA8dGVtcGxhdGUgdi1mb3I9XCIodmFsdWUsIGtleSkgb2YgbWVyZ2VkU2xvdHNcIiA6a2V5PVwia2V5XCIgI1trZXldPVwic2NvcGVcIj5cclxuICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInZhbHVlXCIgOnNjb3BlPVwic2NvcGVcIiAvPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICA8L2NvbXBvbmVudD5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIFByb3BUeXBlLCByZWYsIFNsb3QgfSBmcm9tIFwidnVlXCI7XHJcbi8qKlxyXG4gKiDlrZflhbjnuqfogZTnu4Tku7ZcclxuICog5pSv5oyBZWwtY2FzY2FkZXJ8YS1jYXNjYWRlcue7hOS7tueahOWPguaVsFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzRGljdENhc2NhZGVyXCIsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5a2X5YW46YWN572uXHJcbiAgICAgKi9cclxuICAgIGRpY3Q6IHt9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDpgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcclxuICAgICAqL1xyXG4gICAgb3B0aW9uczogeyB0eXBlOiBBcnJheSB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDovazmjaJEaWN0RGF0YVxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm1EaWN0RGF0YToge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvbixcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDnuqfogZTpgInmi6nlmajmj5Lmp73vvIzmqKHmnb/mj5Lmp73lkIzlkI3ml7bkvJjlhYhcclxuICAgICAqL1xyXG4gICAgc2xvdHM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPFJlY29yZDxzdHJpbmcsIFNsb3Q+PixcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG4gIGVtaXRzOiBbXHJcbiAgICAvKipcclxuICAgICAqIOWtl+WFuOaVsOaNruWPmOWMluS6i+S7tlxyXG4gICAgICovXHJcbiAgICBcImRpY3QtY2hhbmdlXCIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgInkuK3lgLzlj5jljJbkuovku7bvvIzlj6/ku6Xojrflj5bliLDlvZPliY3pgInkuK3nmoRvcHRpb27lr7nosaFcclxuICAgICAqL1xyXG4gICAgXCJzZWxlY3RlZC1jaGFuZ2VcIixcclxuICAgIC8qKlxyXG4gICAgICog5YC85Y+Y5YyW5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIFwiY2hhbmdlXCJcclxuICBdLFxyXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcclxuICAgIGNvbnN0IGNhc2NhZGVyUmVmID0gcmVmKCk7XHJcbiAgICBjb25zdCBkaWN0VXNlUmV0ID0gdXNlRGljdChwcm9wcywgY3R4KTtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgICBjb25zdCBmaWVsZE5hbWVzQmluZGVyID0gcmVmKCk7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBpZiAocHJvcHMuZGljdCkge1xyXG4gICAgICBmaWVsZE5hbWVzQmluZGVyLnZhbHVlID0gdWkuY2FzY2FkZXIuZmllbGROYW1lcyh7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHZhbHVlOiBwcm9wcy5kaWN0LnZhbHVlLFxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBsYWJlbDogcHJvcHMuZGljdC5sYWJlbCxcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgY2hpbGRyZW46IHByb3BzLmRpY3QuY2hpbGRyZW5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb21wdXRlZE9wdGlvbnMgPSBkaWN0VXNlUmV0LmNyZWF0ZUNvbXB1dGVkT3B0aW9ucygpO1xyXG4gICAgY29uc3QgbWVyZ2VkU2xvdHMgPSBjb21wdXRlZCgoKSA9PiAoeyAuLi5wcm9wcy5zbG90cywgLi4uY3R4LnNsb3RzIH0pKTtcclxuXHJcbiAgICBmdW5jdGlvbiBvblNlbGVjdENoYW5nZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGRpY3QgPSBkaWN0VXNlUmV0LmdldERpY3QoKTtcclxuICAgICAgICBpZiAoZGljdCAmJiBkaWN0LmRhdGFNYXApIHtcclxuICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdmFsdWUpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3B0ID0gZGljdC5kYXRhTWFwW2l0ZW1dO1xyXG4gICAgICAgICAgICBpZiAob3B0KSB7XHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb25zLnB1c2gob3B0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgc2VsZWN0ZWRPcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgbnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpLFxyXG4gICAgICBjYXNjYWRlclJlZixcclxuICAgICAgLi4uZGljdFVzZVJldCxcclxuICAgICAgZmllbGROYW1lc0JpbmRlcixcclxuICAgICAgY29tcHV0ZWRPcHRpb25zLFxyXG4gICAgICBtZXJnZWRTbG90cyxcclxuICAgICAgb25TZWxlY3RDaGFuZ2VcclxuICAgIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8Y29tcG9uZW50XHJcbiAgICA6aXM9XCJ1aS5jYXNjYWRlci5uYW1lXCJcclxuICAgIHJlZj1cImNhc2NhZGVyUmVmXCJcclxuICAgIDpvcHRpb25zPVwiY29tcHV0ZWRPcHRpb25zXCJcclxuICAgIHYtYmluZD1cImZpZWxkTmFtZXNCaW5kZXJcIlxyXG4gICAgQGNoYW5nZT1cIm9uU2VsZWN0Q2hhbmdlXCJcclxuICA+XHJcbiAgICA8dGVtcGxhdGUgdi1mb3I9XCIodmFsdWUsIGtleSkgb2YgbWVyZ2VkU2xvdHNcIiA6a2V5PVwia2V5XCIgI1trZXldPVwic2NvcGVcIj5cclxuICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInZhbHVlXCIgOnNjb3BlPVwic2NvcGVcIiAvPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICA8L2NvbXBvbmVudD5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIFByb3BUeXBlLCByZWYsIFNsb3QgfSBmcm9tIFwidnVlXCI7XHJcbi8qKlxyXG4gKiDlrZflhbjnuqfogZTnu4Tku7ZcclxuICog5pSv5oyBZWwtY2FzY2FkZXJ8YS1jYXNjYWRlcue7hOS7tueahOWPguaVsFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzRGljdENhc2NhZGVyXCIsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5a2X5YW46YWN572uXHJcbiAgICAgKi9cclxuICAgIGRpY3Q6IHt9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDpgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcclxuICAgICAqL1xyXG4gICAgb3B0aW9uczogeyB0eXBlOiBBcnJheSB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDovazmjaJEaWN0RGF0YVxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm1EaWN0RGF0YToge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvbixcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDnuqfogZTpgInmi6nlmajmj5Lmp73vvIzmqKHmnb/mj5Lmp73lkIzlkI3ml7bkvJjlhYhcclxuICAgICAqL1xyXG4gICAgc2xvdHM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPFJlY29yZDxzdHJpbmcsIFNsb3Q+PixcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG4gIGVtaXRzOiBbXHJcbiAgICAvKipcclxuICAgICAqIOWtl+WFuOaVsOaNruWPmOWMluS6i+S7tlxyXG4gICAgICovXHJcbiAgICBcImRpY3QtY2hhbmdlXCIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgInkuK3lgLzlj5jljJbkuovku7bvvIzlj6/ku6Xojrflj5bliLDlvZPliY3pgInkuK3nmoRvcHRpb27lr7nosaFcclxuICAgICAqL1xyXG4gICAgXCJzZWxlY3RlZC1jaGFuZ2VcIixcclxuICAgIC8qKlxyXG4gICAgICog5YC85Y+Y5YyW5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIFwiY2hhbmdlXCJcclxuICBdLFxyXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcclxuICAgIGNvbnN0IGNhc2NhZGVyUmVmID0gcmVmKCk7XHJcbiAgICBjb25zdCBkaWN0VXNlUmV0ID0gdXNlRGljdChwcm9wcywgY3R4KTtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgICBjb25zdCBmaWVsZE5hbWVzQmluZGVyID0gcmVmKCk7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBpZiAocHJvcHMuZGljdCkge1xyXG4gICAgICBmaWVsZE5hbWVzQmluZGVyLnZhbHVlID0gdWkuY2FzY2FkZXIuZmllbGROYW1lcyh7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHZhbHVlOiBwcm9wcy5kaWN0LnZhbHVlLFxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBsYWJlbDogcHJvcHMuZGljdC5sYWJlbCxcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgY2hpbGRyZW46IHByb3BzLmRpY3QuY2hpbGRyZW5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb21wdXRlZE9wdGlvbnMgPSBkaWN0VXNlUmV0LmNyZWF0ZUNvbXB1dGVkT3B0aW9ucygpO1xyXG4gICAgY29uc3QgbWVyZ2VkU2xvdHMgPSBjb21wdXRlZCgoKSA9PiAoeyAuLi5wcm9wcy5zbG90cywgLi4uY3R4LnNsb3RzIH0pKTtcclxuXHJcbiAgICBmdW5jdGlvbiBvblNlbGVjdENoYW5nZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGRpY3QgPSBkaWN0VXNlUmV0LmdldERpY3QoKTtcclxuICAgICAgICBpZiAoZGljdCAmJiBkaWN0LmRhdGFNYXApIHtcclxuICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdmFsdWUpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3B0ID0gZGljdC5kYXRhTWFwW2l0ZW1dO1xyXG4gICAgICAgICAgICBpZiAob3B0KSB7XHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb25zLnB1c2gob3B0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgc2VsZWN0ZWRPcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgbnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpLFxyXG4gICAgICBjYXNjYWRlclJlZixcclxuICAgICAgLi4uZGljdFVzZVJldCxcclxuICAgICAgZmllbGROYW1lc0JpbmRlcixcclxuICAgICAgY29tcHV0ZWRPcHRpb25zLFxyXG4gICAgICBtZXJnZWRTbG90cyxcclxuICAgICAgb25TZWxlY3RDaGFuZ2VcclxuICAgIH07XHJcbiAgfVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8Y29tcG9uZW50IDppcz1cInVpLmNoZWNrYm94R3JvdXAubmFtZVwiIEBjaGFuZ2U9XCJvblNlbGVjdGVkQ2hhbmdlXCI+XHJcbiAgICA8Y29tcG9uZW50XHJcbiAgICAgIDppcz1cIm9wdGlvbk5hbWUgfHwgdWkuY2hlY2tib3gubmFtZVwiXHJcbiAgICAgIHYtZm9yPVwiaXRlbSBvZiBjb21wdXRlZE9wdGlvbnNcIlxyXG4gICAgICByZWY9XCJjaGVja2JveFJlZlwiXHJcbiAgICAgIDprZXk9XCJnZXRWYWx1ZShpdGVtKVwiXHJcbiAgICAgIDpbdWkuY2hlY2tib3gudmFsdWVdPVwiZ2V0VmFsdWUoaXRlbSlcIlxyXG4gICAgICB2LWJpbmQ9XCJvcHRpb25Qcm9wc1wiXHJcbiAgICAgID57eyBnZXRMYWJlbChpdGVtKSB9fTwvY29tcG9uZW50XHJcbiAgICA+XHJcbiAgPC9jb21wb25lbnQ+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XHJcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcblxyXG4vKipcclxuICog5a2X5YW4Y2hlY2tib3hcclxuICog5pSv5oyBZWwtY2hlY2tib3h8YS1jaGVja2JveOWPguaVsFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzRGljdENoZWNrYm94XCIsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5a2X5YW4XHJcbiAgICAgKi9cclxuICAgIGRpY3Q6IHt9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDpgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcclxuICAgICAqL1xyXG4gICAgb3B0aW9uczogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogdW5kZWZpbmVkLCByZXF1aXJlOiBmYWxzZSB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YCJ6aG555qE57uE5Lu25ZCN56ewXHJcbiAgICAgKi9cclxuICAgIG9wdGlvbk5hbWU6IHtcclxuICAgICAgdHlwZTogU3RyaW5nXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YCJ6aG555qE5bGe5oCnXHJcbiAgICAgKi9cclxuICAgIG9wdGlvblByb3BzOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIOi9rOaNokRpY3REYXRhXHJcbiAgICAgKi9cclxuICAgIHRyYW5zZm9ybURpY3REYXRhOiB7XHJcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxyXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICAgIH1cclxuICB9LFxyXG4gIGVtaXRzOiBbXHJcbiAgICAvKipcclxuICAgICAqIOWtl+WFuOaVsOaNruWPmOWMluS6i+S7tlxyXG4gICAgICovXHJcbiAgICBcImRpY3QtY2hhbmdlXCIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgInkuK3lgLzlj5jljJbkuovku7bvvIzlj6/ku6Xojrflj5bliLDlvZPliY3pgInkuK3nmoRvcHRpb27lr7nosaFcclxuICAgICAqL1xyXG4gICAgXCJzZWxlY3RlZC1jaGFuZ2VcIixcclxuICAgIC8qKlxyXG4gICAgICog5YC85Y+Y5YyW5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIFwiY2hhbmdlXCJcclxuICBdLFxyXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgICBsZXQgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgsIHVpLmNoZWNrYm94R3JvdXAubW9kZWxWYWx1ZSk7XHJcbiAgICBjb25zdCBjb21wdXRlZE9wdGlvbnMgPSB1c2VkRGljdC5jcmVhdGVDb21wdXRlZE9wdGlvbnMoKTtcclxuICAgIGNvbnN0IG9uU2VsZWN0ZWRDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBjdHguZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XHJcbiAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZE9wdGlvbnMgPSBbXTtcclxuICAgICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xyXG4gICAgICAgIGlmIChkaWN0ICYmIGRpY3QuZGF0YU1hcCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB2YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBvcHQgPSBkaWN0LmRhdGFNYXBbaXRlbV07XHJcbiAgICAgICAgICAgIGlmIChvcHQpIHtcclxuICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbnMucHVzaChvcHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBzZWxlY3RlZE9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBudWxsKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1aSxcclxuICAgICAgLi4udXNlZERpY3QsXHJcbiAgICAgIGNvbXB1dGVkT3B0aW9ucyxcclxuICAgICAgb25TZWxlY3RlZENoYW5nZVxyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxjb21wb25lbnQgOmlzPVwidWkuY2hlY2tib3hHcm91cC5uYW1lXCIgQGNoYW5nZT1cIm9uU2VsZWN0ZWRDaGFuZ2VcIj5cclxuICAgIDxjb21wb25lbnRcclxuICAgICAgOmlzPVwib3B0aW9uTmFtZSB8fCB1aS5jaGVja2JveC5uYW1lXCJcclxuICAgICAgdi1mb3I9XCJpdGVtIG9mIGNvbXB1dGVkT3B0aW9uc1wiXHJcbiAgICAgIHJlZj1cImNoZWNrYm94UmVmXCJcclxuICAgICAgOmtleT1cImdldFZhbHVlKGl0ZW0pXCJcclxuICAgICAgOlt1aS5jaGVja2JveC52YWx1ZV09XCJnZXRWYWx1ZShpdGVtKVwiXHJcbiAgICAgIHYtYmluZD1cIm9wdGlvblByb3BzXCJcclxuICAgICAgPnt7IGdldExhYmVsKGl0ZW0pIH19PC9jb21wb25lbnRcclxuICAgID5cclxuICA8L2NvbXBvbmVudD5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcclxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcclxuXHJcbi8qKlxyXG4gKiDlrZflhbhjaGVja2JveFxyXG4gKiDmlK/mjIFlbC1jaGVja2JveHxhLWNoZWNrYm945Y+C5pWwXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNEaWN0Q2hlY2tib3hcIixcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDlrZflhbhcclxuICAgICAqL1xyXG4gICAgZGljdDoge30sXHJcbiAgICAvKipcclxuICAgICAqIOmAiemhue+8jOavlGRpY3QuZGF0YeS8mOWFiOe6p+mrmFxyXG4gICAgICovXHJcbiAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiB1bmRlZmluZWQsIHJlcXVpcmU6IGZhbHNlIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgInpobnnmoTnu4Tku7blkI3np7BcclxuICAgICAqL1xyXG4gICAgb3B0aW9uTmFtZToge1xyXG4gICAgICB0eXBlOiBTdHJpbmdcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgInpobnnmoTlsZ7mgKdcclxuICAgICAqL1xyXG4gICAgb3B0aW9uUHJvcHM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICog6L2s5o2iRGljdERhdGFcclxuICAgICAqL1xyXG4gICAgdHJhbnNmb3JtRGljdERhdGE6IHtcclxuICAgICAgdHlwZTogRnVuY3Rpb24sXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfVxyXG4gIH0sXHJcbiAgZW1pdHM6IFtcclxuICAgIC8qKlxyXG4gICAgICog5a2X5YW45pWw5o2u5Y+Y5YyW5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIFwiZGljdC1jaGFuZ2VcIixcclxuXHJcbiAgICAvKipcclxuICAgICAqIOmAieS4reWAvOWPmOWMluS6i+S7tu+8jOWPr+S7peiOt+WPluWIsOW9k+WJjemAieS4reeahG9wdGlvbuWvueixoVxyXG4gICAgICovXHJcbiAgICBcInNlbGVjdGVkLWNoYW5nZVwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiDlgLzlj5jljJbkuovku7ZcclxuICAgICAqL1xyXG4gICAgXCJjaGFuZ2VcIlxyXG4gIF0sXHJcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xyXG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcclxuICAgIGxldCB1c2VkRGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCwgdWkuY2hlY2tib3hHcm91cC5tb2RlbFZhbHVlKTtcclxuICAgIGNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IHVzZWREaWN0LmNyZWF0ZUNvbXB1dGVkT3B0aW9ucygpO1xyXG4gICAgY29uc3Qgb25TZWxlY3RlZENoYW5nZSA9ICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XHJcbiAgICAgICAgaWYgKGRpY3QgJiYgZGljdC5kYXRhTWFwKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdCA9IGRpY3QuZGF0YU1hcFtpdGVtXTtcclxuICAgICAgICAgICAgaWYgKG9wdCkge1xyXG4gICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9ucy5wdXNoKG9wdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIHNlbGVjdGVkT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpLFxyXG4gICAgICAuLi51c2VkRGljdCxcclxuICAgICAgY29tcHV0ZWRPcHRpb25zLFxyXG4gICAgICBvblNlbGVjdGVkQ2hhbmdlXHJcbiAgICB9O1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGNvbXBvbmVudCA6aXM9XCJ1aS5zd2l0Y2gubmFtZVwiIHJlZj1cInN3aXRjaFJlZlwiIHYtYmluZD1cImJpbmRpbmdcIiAvPlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyB1c2VEaWN0IH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtZGljdFwiO1xyXG5pbXBvcnQgeyB1aUNvbnRleHQgfSBmcm9tIFwiLi4vLi4vdWlcIjtcclxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBQcm9wVHlwZSB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgRGljdE9wdGlvbnMsIHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xyXG5cclxuLyoqXHJcbiAqIOWtl+WFuOW8gOWFs1xyXG4gKiDmlK/mjIFlbC1zd2l0Y2h8YS1zd2l0Y2jnmoTlsZ7mgKdcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc0RpY3RTd2l0Y2hcIixcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDlrZflhbjnrKzkuIDkuKrkuLrlvIDlkK9cclxuICAgICAqIOesrOS6jOS4quS4uuWFs+mXrVxyXG4gICAgICovXHJcbiAgICBkaWN0OiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCBhcyBQcm9wVHlwZTxEaWN0T3B0aW9uczxhbnk+PlxyXG4gICAgfSxcclxuICAgIG9wdGlvbnM6IHt9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDovazmjaJEaWN0RGF0YVxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm1EaWN0RGF0YToge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvbixcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgfSBhcyBhbnksXHJcbiAgZW1pdHM6IFtcImRpY3QtY2hhbmdlXCJdLFxyXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgICBsZXQgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgsIHVpLnN3aXRjaC5tb2RlbFZhbHVlKTtcclxuICAgIGNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IHVzZWREaWN0LmNyZWF0ZUNvbXB1dGVkT3B0aW9ucygpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdWksXHJcbiAgICAgIC4uLnVzZWREaWN0LFxyXG4gICAgICBjb21wdXRlZE9wdGlvbnNcclxuICAgIH07XHJcbiAgfSxcclxuICBjb21wdXRlZDoge1xyXG4gICAgX2FjdGl2ZSgpIHtcclxuICAgICAgaWYgKHRoaXMuY29tcHV0ZWRPcHRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlZE9wdGlvbnNbMF07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfSxcclxuICAgIF9pbkFjdGl2ZSgpIHtcclxuICAgICAgaWYgKHRoaXMuY29tcHV0ZWRPcHRpb25zLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlZE9wdGlvbnNbMV07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfSxcclxuICAgIGJpbmRpbmcoKSB7XHJcbiAgICAgIGNvbnN0IHVpID0gdWlDb250ZXh0LmdldCgpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBbdWkuc3dpdGNoLmFjdGl2ZVRleHRdOiB0aGlzLl9hY3RpdmVbdGhpcy5kaWN0Py5sYWJlbCB8fCBcImxhYmVsXCJdLFxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBbdWkuc3dpdGNoLmluYWN0aXZlVGV4dF06IHRoaXMuX2luQWN0aXZlW3RoaXMuZGljdD8ubGFiZWwgfHwgXCJsYWJlbFwiXSxcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgW3VpLnN3aXRjaC5hY3RpdmVDb2xvcl06IHRoaXMuX2FjdGl2ZVt0aGlzLmRpY3Q/LmNvbG9yIHx8IFwiY29sb3JcIl0sXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIFt1aS5zd2l0Y2guaW5hY3RpdmVDb2xvcl06IHRoaXMuX2luQWN0aXZlW3RoaXMuZGljdD8uY29sb3IgfHwgXCJjb2xvclwiXSxcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgW3VpLnN3aXRjaC5hY3RpdmVWYWx1ZV06IHRoaXMuX2FjdGl2ZVt0aGlzLmRpY3Q/LnZhbHVlIHx8IFwidmFsdWVcIl0sXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIFt1aS5zd2l0Y2guaW5hY3RpdmVWYWx1ZV06IHRoaXMuX2luQWN0aXZlW3RoaXMuZGljdD8udmFsdWUgfHwgXCJ2YWx1ZVwiXVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PiIsIjx0ZW1wbGF0ZT5cclxuICA8c3Bhbj57eyBkb0Zvcm1hdCB9fTwvc3Bhbj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIjtcclxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xyXG4vKipcclxuICog5pel5pyf5qC85byP5YyW5bGV56S657uE5Lu2XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xyXG4gIG5hbWU6IFwiRnNEYXRlRm9ybWF0XCIsXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5pel5pyf5pe26Ze05YC877yM5pSv5oyBbG9uZyxzdHJpbmcsZGF0Zeetie+8jOeUsWRheWpz6L2s5YyWXHJcbiAgICAgKi9cclxuICAgIG1vZGVsVmFsdWU6IHsgcmVxdWlyZWQ6IGZhbHNlIH0sXHJcbiAgICAvKipcclxuICAgICAqICDovpPlhaXmoLzlvI/ljJbvvIzkuI3kvKDliJnnlLFkYXlqc+iHquWKqOi9rOWMllxyXG4gICAgICovXHJcbiAgICB2YWx1ZUZvcm1hdDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IHVuZGVmaW5lZCwgcmVxdWlyZWQ6IGZhbHNlIH0sXHJcbiAgICAvKipcclxuICAgICAqICDovpPlh7rmoLzlvI/ljJZcclxuICAgICAqL1xyXG4gICAgZm9ybWF0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogXCJZWVlZLU1NLUREIEhIOm1tOnNzXCIsIHJlcXVpcmVkOiBmYWxzZSB9XHJcbiAgfSxcclxuICBkYXRhKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaXRlbToge31cclxuICAgIH07XHJcbiAgfSxcclxuICBjb21wdXRlZDoge1xyXG4gICAgZG9Gb3JtYXQoKSB7XHJcbiAgICAgIGlmICh0aGlzLm1vZGVsVmFsdWUgPT0gbnVsbCB8fCB0aGlzLm1vZGVsVmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgICAgfVxyXG4gICAgICBsZXQgZGF0ZSA9IG51bGw7XHJcbiAgICAgIGlmICh0aGlzLnZhbHVlRm9ybWF0ICE9IG51bGwpIHtcclxuICAgICAgICBkYXRlID0gZGF5anModGhpcy5tb2RlbFZhbHVlLCB0aGlzLnZhbHVlRm9ybWF0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkYXRlID0gZGF5anModGhpcy5tb2RlbFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZGF0ZS5mb3JtYXQodGhpcy5mb3JtYXQpO1xyXG4gICAgfVxyXG4gIH0gYXMgYW55LFxyXG4gIGNyZWF0ZWQoKSB7fSxcclxuICBtZXRob2RzOiB7fVxyXG59KTtcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8Y29tcG9uZW50XHJcbiAgICA6aXM9XCJ1aS50cmVlU2VsZWN0Lm5hbWVcIlxyXG4gICAgcmVmPVwidHJlZVJlZlwiXHJcbiAgICA6W3VpLnRyZWVTZWxlY3Qub3B0aW9uc109XCJjb21wdXRlZE9wdGlvbnNcIlxyXG4gICAgOnBsYWNlaG9sZGVyPVwiY29tcHV0ZWRQbGFjZWhvbGRlclwiXHJcbiAgICB2LWJpbmQ9XCJjb21wdXRlZEJpbmRpbmdcIlxyXG4gICAgQGNoYW5nZT1cIm9uU2VsZWN0ZWRDaGFuZ2VcIlxyXG4gID5cclxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIih2YWx1ZSwga2V5KSBvZiBzbG90c1wiIDprZXk9XCJrZXlcIiAjW2tleV09XCJzY29wZVwiPlxyXG4gICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwidmFsdWVcIiA6c2NvcGU9XCJzY29wZVwiPjwvZnMtc2xvdC1yZW5kZXI+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gIDwvY29tcG9uZW50PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCByZWYgfSBmcm9tIFwidnVlXCI7XHJcbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XHJcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XHJcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xyXG5cclxuLyoqXHJcbiAqIOWtl+WFuOagkemAieaLqee7hOS7tlxyXG4gKiDmlK/mjIEgYS10cmVlLXNlbGVjdCDlj4LmlbBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XHJcbiAgbmFtZTogXCJGc0RpY3RUcmVlXCIsXHJcbiAgY29tcG9uZW50czoge30sXHJcbiAgcHJvcHM6IHtcclxuICAgIC8qKlxyXG4gICAgICog5pWw5o2u5a2X5YW4XHJcbiAgICAgKi9cclxuICAgIGRpY3Q6IHt9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDlj6/pgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcclxuICAgICAqL1xyXG4gICAgb3B0aW9uczogeyB0eXBlOiBBcnJheSB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBwbGFjZWhvbGRlclxyXG4gICAgICovXHJcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcgfSxcclxuICAgIC8qKlxyXG4gICAgICog6L2s5o2iRGljdERhdGFcclxuICAgICAqL1xyXG4gICAgdHJhbnNmb3JtRGljdERhdGE6IHtcclxuICAgICAgdHlwZTogRnVuY3Rpb24sXHJcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gICAgfVxyXG4gIH0sXHJcbiAgZW1pdHM6IFtcclxuICAgIC8qKlxyXG4gICAgICog5a2X5YW45pWw5o2u5Y+Y5YyW5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIFwiZGljdC1jaGFuZ2VcIixcclxuXHJcbiAgICAvKipcclxuICAgICAqIOmAieS4reWAvOWPmOWMluS6i+S7tu+8jOWPr+S7peiOt+WPluWIsOW9k+WJjemAieS4reeahG9wdGlvbuWvueixoVxyXG4gICAgICovXHJcbiAgICBcInNlbGVjdGVkLWNoYW5nZVwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiDlgLzlj5jljJbkuovku7ZcclxuICAgICAqL1xyXG4gICAgXCJjaGFuZ2VcIlxyXG4gIF0sXHJcbiAgLy8gcmVuZGVyICgpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLnJlbmRlckZ1bmMoeyBkYXRhOiB0aGlzLmRhdGEsIGRhdGFNYXA6IHRoaXMuZGF0YU1hcCwgc2NvcGU6IHRoaXMuc2NvcGUsIGF0dHJzOiB0aGlzLiRhdHRycyB9KVxyXG4gIC8vIH0sXHJcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xyXG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XHJcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xyXG4gICAgY29uc3QgY29tcHV0ZWRQbGFjZWhvbGRlciA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgcmV0dXJuIHByb3BzLnBsYWNlaG9sZGVyIHx8IHQoXCJmcy5jb21wb25lbnQuc2VsZWN0LnBsYWNlaG9sZGVyXCIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IHVzZWREaWN0ID0gdXNlRGljdChwcm9wcywgY3R4KTtcclxuXHJcbiAgICBjb25zdCBzbG90cyA9IGN0eC5zbG90cztcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZE9wdGlvbnMgPSB1c2VkRGljdC5jcmVhdGVDb21wdXRlZE9wdGlvbnMoKTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZEJpbmRpbmcgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XHJcbiAgICAgIHJldHVybiB1aS50cmVlU2VsZWN0LmJ1aWxkT3B0aW9uS2V5c05hbWVCaW5kaW5nKHtcclxuICAgICAgICBsYWJlbDogZGljdC5sYWJlbCxcclxuICAgICAgICB2YWx1ZTogZGljdC52YWx1ZSxcclxuICAgICAgICBjaGlsZHJlbjogZGljdC5jaGlsZHJlblxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IG9uU2VsZWN0ZWRDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBjdHguZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XHJcbiAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XHJcbiAgICAgICAgaWYgKGRpY3QgJiYgZGljdC5kYXRhTWFwKSB7XHJcbiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb25zID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdmFsdWUpIHtcclxuICAgICAgICAgICAgICBjb25zdCBvcHQgPSBkaWN0LmRhdGFNYXBbaXRlbV07XHJcbiAgICAgICAgICAgICAgaWYgKG9wdCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb25zLnB1c2gob3B0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgc2VsZWN0ZWRPcHRpb25zKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIGRpY3QuZGF0YU1hcFt2YWx1ZV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBudWxsKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB0cmVlUmVmID0gcmVmKCk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1aSxcclxuICAgICAgY29tcHV0ZWRCaW5kaW5nLFxyXG4gICAgICBjb21wdXRlZFBsYWNlaG9sZGVyLFxyXG4gICAgICAuLi51c2VkRGljdCxcclxuICAgICAgY29tcHV0ZWRPcHRpb25zLFxyXG4gICAgICBvblNlbGVjdGVkQ2hhbmdlLFxyXG4gICAgICBzbG90cyxcclxuICAgICAgdHJlZVJlZlxyXG4gICAgfTtcclxuICB9XHJcbn0pO1xyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxjb21wb25lbnRcclxuICAgIDppcz1cInVpLnRyZWVTZWxlY3QubmFtZVwiXHJcbiAgICByZWY9XCJ0cmVlUmVmXCJcclxuICAgIDpbdWkudHJlZVNlbGVjdC5vcHRpb25zXT1cImNvbXB1dGVkT3B0aW9uc1wiXHJcbiAgICA6cGxhY2Vob2xkZXI9XCJjb21wdXRlZFBsYWNlaG9sZGVyXCJcclxuICAgIHYtYmluZD1cImNvbXB1dGVkQmluZGluZ1wiXHJcbiAgICBAY2hhbmdlPVwib25TZWxlY3RlZENoYW5nZVwiXHJcbiAgPlxyXG4gICAgPHRlbXBsYXRlIHYtZm9yPVwiKHZhbHVlLCBrZXkpIG9mIHNsb3RzXCIgOmtleT1cImtleVwiICNba2V5XT1cInNjb3BlXCI+XHJcbiAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJ2YWx1ZVwiIDpzY29wZT1cInNjb3BlXCI+PC9mcy1zbG90LXJlbmRlcj5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgPC9jb21wb25lbnQ+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIHJlZiB9IGZyb20gXCJ2dWVcIjtcclxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcclxuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcclxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcblxyXG4vKipcclxuICog5a2X5YW45qCR6YCJ5oup57uE5Lu2XHJcbiAqIOaUr+aMgSBhLXRyZWUtc2VsZWN0IOWPguaVsFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcclxuICBuYW1lOiBcIkZzRGljdFRyZWVcIixcclxuICBjb21wb25lbnRzOiB7fSxcclxuICBwcm9wczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiDmlbDmja7lrZflhbhcclxuICAgICAqL1xyXG4gICAgZGljdDoge30sXHJcbiAgICAvKipcclxuICAgICAqIOWPr+mAiemhue+8jOavlGRpY3QuZGF0YeS8mOWFiOe6p+mrmFxyXG4gICAgICovXHJcbiAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5IH0sXHJcbiAgICAvKipcclxuICAgICAqIHBsYWNlaG9sZGVyXHJcbiAgICAgKi9cclxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZyB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiDovazmjaJEaWN0RGF0YVxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm1EaWN0RGF0YToge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvbixcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgfSxcclxuICBlbWl0czogW1xyXG4gICAgLyoqXHJcbiAgICAgKiDlrZflhbjmlbDmja7lj5jljJbkuovku7ZcclxuICAgICAqL1xyXG4gICAgXCJkaWN0LWNoYW5nZVwiLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YCJ5Lit5YC85Y+Y5YyW5LqL5Lu277yM5Y+v5Lul6I635Y+W5Yiw5b2T5YmN6YCJ5Lit55qEb3B0aW9u5a+56LGhXHJcbiAgICAgKi9cclxuICAgIFwic2VsZWN0ZWQtY2hhbmdlXCIsXHJcbiAgICAvKipcclxuICAgICAqIOWAvOWPmOWMluS6i+S7tlxyXG4gICAgICovXHJcbiAgICBcImNoYW5nZVwiXHJcbiAgXSxcclxuICAvLyByZW5kZXIgKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMucmVuZGVyRnVuYyh7IGRhdGE6IHRoaXMuZGF0YSwgZGF0YU1hcDogdGhpcy5kYXRhTWFwLCBzY29wZTogdGhpcy5zY29wZSwgYXR0cnM6IHRoaXMuJGF0dHJzIH0pXHJcbiAgLy8gfSxcclxuICBzZXR1cChwcm9wcywgY3R4KSB7XHJcbiAgICBjb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcclxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbiAgICBjb25zdCBjb21wdXRlZFBsYWNlaG9sZGVyID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4gcHJvcHMucGxhY2Vob2xkZXIgfHwgdChcImZzLmNvbXBvbmVudC5zZWxlY3QucGxhY2Vob2xkZXJcIik7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgpO1xyXG5cclxuICAgIGNvbnN0IHNsb3RzID0gY3R4LnNsb3RzO1xyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IHVzZWREaWN0LmNyZWF0ZUNvbXB1dGVkT3B0aW9ucygpO1xyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkQmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgY29uc3QgZGljdCA9IHVzZWREaWN0LmdldERpY3QoKTtcclxuICAgICAgcmV0dXJuIHVpLnRyZWVTZWxlY3QuYnVpbGRPcHRpb25LZXlzTmFtZUJpbmRpbmcoe1xyXG4gICAgICAgIGxhYmVsOiBkaWN0LmxhYmVsLFxyXG4gICAgICAgIHZhbHVlOiBkaWN0LnZhbHVlLFxyXG4gICAgICAgIGNoaWxkcmVuOiBkaWN0LmNoaWxkcmVuXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgb25TZWxlY3RlZENoYW5nZSA9ICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgY29uc3QgZGljdCA9IHVzZWREaWN0LmdldERpY3QoKTtcclxuICAgICAgICBpZiAoZGljdCAmJiBkaWN0LmRhdGFNYXApIHtcclxuICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZE9wdGlvbnMgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG9wdCA9IGRpY3QuZGF0YU1hcFtpdGVtXTtcclxuICAgICAgICAgICAgICBpZiAob3B0KSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbnMucHVzaChvcHQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBzZWxlY3RlZE9wdGlvbnMpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgZGljdC5kYXRhTWFwW3ZhbHVlXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHRyZWVSZWYgPSByZWYoKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpLFxyXG4gICAgICBjb21wdXRlZEJpbmRpbmcsXHJcbiAgICAgIGNvbXB1dGVkUGxhY2Vob2xkZXIsXHJcbiAgICAgIC4uLnVzZWREaWN0LFxyXG4gICAgICBjb21wdXRlZE9wdGlvbnMsXHJcbiAgICAgIG9uU2VsZWN0ZWRDaGFuZ2UsXHJcbiAgICAgIHNsb3RzLFxyXG4gICAgICB0cmVlUmVmXHJcbiAgICB9O1xyXG4gIH1cclxufSk7XHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZzLXRhYmxlLXNlbGVjdFwiPlxyXG4gICAgPHRlbXBsYXRlIHYtaWY9XCIhc2xvdHM/LmRlZmF1bHQgJiYgIXZpZXdNb2RlXCI+XHJcbiAgICAgIDxmcy1kaWN0LXNlbGVjdFxyXG4gICAgICAgIHJlZj1cImRpY3RTZWxlY3RSZWZcIlxyXG4gICAgICAgIHYtYmluZD1cImNvbXB1dGVkU2VsZWN0XCJcclxuICAgICAgICA6b3Blbj1cImZhbHNlXCJcclxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgOnJlYWRvbmx5PVwicmVhZG9ubHlcIlxyXG4gICAgICAgIDpkaWN0PVwiZGljdFwiXHJcbiAgICAgICAgQGNsaWNrPVwib3BlblRhYmxlU2VsZWN0XCJcclxuICAgICAgLz5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8c2xvdCB2LWJpbmQ9XCJzY29wZVJlZlwiPjwvc2xvdD5cclxuICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0uc2tpcFZhbGlkYXRpb25XcmFwcGVyXCI+XHJcbiAgICAgIDxmcy1mb3JtLXdyYXBwZXIgcmVmPVwiZm9ybVdyYXBwZXJSZWZcIiB2LWJpbmQ9XCJmb3JtV3JhcHBlck9wdGlvbnNcIiBAY2xvc2VkPVwib25DbG9zZVwiIEBvcGVuPVwib25PcGVuXCI+XHJcbiAgICAgICAgPHRlbXBsYXRlICNmb3JtLWJvZHktdG9wPlxyXG4gICAgICAgICAgPGRpdiB2LWlmPVwiZGlhbG9nT3BlbiB8fCBkZXN0cm95T25DbG9zZSA9PT0gZmFsc2VcIiA6c3R5bGU9XCJ7IHdpZHRoOiAnMTAwJScsIGhlaWdodDogaGVpZ2h0IHx8ICc3MHZoJyB9XCI+XHJcbiAgICAgICAgICAgIDxmcy1jcnVkIHJlZj1cImNydWRSZWZcIiB2LWJpbmQ9XCJjcnVkQmluZGluZ1wiPlxyXG4gICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyLXRvcD5cclxuICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cInNob3dDdXJyZW50ICE9PSBmYWxzZSAmJiAhdmlld01vZGVcIiBjbGFzcz1cImZzLXRhYmxlLXNlbGVjdC1jdXJyZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHQoXCJmcy5leHRlbmRzLnRhYmxlU2VsZWN0LmN1cnJlbnRcIikgfX3vvJpcclxuICAgICAgICAgICAgICAgICAgPGZzLXZhbHVlcy1mb3JtYXRcclxuICAgICAgICAgICAgICAgICAgICByZWY9XCJ2YWx1ZXNGb3JtYXRSZWZcIlxyXG4gICAgICAgICAgICAgICAgICAgIHYtbW9kZWw9XCJzZWxlY3RlZFJvd0tleXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIDpkaWN0PVwiZGljdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgOmNsb3NhYmxlPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdi1iaW5kPVwiY29tcHV0ZWRWYWx1ZXNGb3JtYXRcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9mcy12YWx1ZXMtZm9ybWF0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9mcy1jcnVkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPC9mcy1mb3JtLXdyYXBwZXI+XHJcbiAgICAgIDwhLS0gICAgICA8Y29tcG9uZW50IDppcz1cInVpLmRpYWxvZy5uYW1lXCIgdi1tb2RlbDpbdWkuZGlhbG9nLnZpc2libGVdPVwiZGlhbG9nT3BlblwiIHYtYmluZD1cImNvbXB1dGVkRGlhbG9nQmluZGluZ1wiPi0tPlxyXG4gICAgICA8IS0tICAgICAgICA8dGVtcGxhdGUgI1t1aS5kaWFsb2cuZm9vdGVyU2xvdE5hbWVdPi0tPlxyXG4gICAgICA8IS0tICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuYnV0dG9uLm5hbWVcIiB2LWlmPVwiIXZpZXdNb2RlXCIgQGNsaWNrPVwiZGlhbG9nT3BlbiA9IGZhbHNlXCI+5Y+W5raIPC9jb21wb25lbnQ+LS0+XHJcbiAgICAgIDwhLS0gICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5idXR0b24ubmFtZVwiIHR5cGU9XCJwcmltYXJ5XCIgQGNsaWNrPVwib25Pa1wiPuehruiupDwvY29tcG9uZW50Pi0tPlxyXG4gICAgICA8IS0tICAgICAgICA8L3RlbXBsYXRlPi0tPlxyXG4gICAgICA8IS0tICAgICAgPC9jb21wb25lbnQ+LS0+XHJcbiAgICA8L2NvbXBvbmVudD5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHN4XCIgc2V0dXA+XHJcbmltcG9ydCB7IERpY3QsIHVzZUNvbXB1dGUsIHVzZUZzQXN5bmMsIHVzZUZzUmVmLCB1c2VNZXJnZSwgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBuZXh0VGljaywgcmVmLCBSZWYsIHdhdGNoIH0gZnJvbSBcInZ1ZVwiO1xyXG5pbXBvcnQgeyBDcmVhdGVDcnVkT3B0aW9ucywgRHluYW1pY2FsbHlDcnVkT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9kXCI7XHJcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XHJcblxyXG50eXBlIEZzVGFibGVTZWxlY3RQcm9wcyA9IHtcclxuICAvKipcclxuICAgKiBtb2RlbFZhbHVlXHJcbiAgICovXHJcbiAgbW9kZWxWYWx1ZTogYW55O1xyXG4gIC8qKlxyXG4gICAqIGNydWRPcHRpb25z5Yib5bu65pa55rOVXHJcbiAgICovXHJcbiAgY3JlYXRlQ3J1ZE9wdGlvbnM6IENyZWF0ZUNydWRPcHRpb25zO1xyXG4gIC8qKlxyXG4gICAqIGNydWRPcHRpb25zIOimhueblumFjee9rlxyXG4gICAqL1xyXG4gIGNydWRPcHRpb25zT3ZlcnJpZGU/OiBEeW5hbWljYWxseUNydWRPcHRpb25zO1xyXG5cclxuICAvKipcclxuICAgKiDmiZPlvIDlr7nor53moYbliY3vvIzlj6/ku6Xkv67mlLnphY3nva5cclxuICAgKiBAcGFyYW0gb3B0aW9uc1xyXG4gICAqL1xyXG4gIGJlZm9yZU9wZW4/OiAob3B0aW9uczoge1xyXG4gICAgY3J1ZE9wdGlvbnM6IER5bmFtaWNhbGx5Q3J1ZE9wdGlvbnM7XHJcbiAgICBzZWxlY3RlZFJvd0tleXM6IGFueTtcclxuICAgIG9wZW46IGFueTtcclxuICAgIG9wZW5lZDogYW55O1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55O1xyXG4gIH0pID0+IFByb21pc2U8dm9pZD47XHJcbiAgLyoqXHJcbiAgICog5pWw5o2u5a2X5YW4XHJcbiAgICog5b+F6aCI6YWN572uYGdldE5vZGVzQnlWYWx1ZXNg5Y+C5pWwLOS9oOmcgOimgeWunueOsO+8muagueaNrmlk5YiX6KGo5ZCR5ZCO5Y+w6K+35rGC5aSa6KGM5pWw5o2u5bm26L+U5ZueXHJcbiAgICogYGRpY3QudmFsdWXlv4XpobvkuI50YWJsZS5yb3dLZXnkuIDoh7RgXHJcbiAgICovXHJcbiAgZGljdDogRGljdDtcclxuICAvKipcclxuICAgKiDpgInmi6nmoYYgZnMtZGljdC1zZWxlY3TphY3nva5cclxuICAgKi9cclxuICBzZWxlY3Q/OiBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIOaYr+WQpuaYvuekuumAieaLqeahhlxyXG4gICAqIOacieaXtuWAmeS9oOWPquaYr+aDs+imgemCo+S4qumAieaLqeeahERpYWxvZ++8jOmCo+S5iOS9oOWPr+S7pemakOiXj3NlbGVjdO+8jOeEtuWQjuiHquWumuS5iea/gOa0u+aWueW8j1xyXG4gICAqL1xyXG4gIHNob3dTZWxlY3Q/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIOWvueivneahhumFjee9rlxyXG4gICAqL1xyXG4gIGRpYWxvZz86IGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICog5a+56K+d5qGG5Lit5piv5ZCm5pi+56S65b2T5YmN6YCJ5Lit5YC8XHJcbiAgICovXHJcbiAgc2hvd0N1cnJlbnQ/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIOW9k+WJjemAieS4reWAvCBmcy12YWx1ZXMtZm9ybWF057uE5Lu2IOmFjee9rlxyXG4gICAqL1xyXG4gIHZhbHVlc0Zvcm1hdD86IGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogY3J1ZOmrmOW6plxyXG4gICAqL1xyXG4gIGhlaWdodD86IHN0cmluZztcclxuICAvKipcclxuICAgKiDmmK/lkKblpJrpgIlcclxuICAgKi9cclxuICBtdWx0aXBsZT86IGJvb2xlYW47IC8v5Y2V6YCJ6L+Y5piv5aSa6YCJXHJcbiAgLyoqXHJcbiAgICog6Leo6aG16YCJ5LitXHJcbiAgICovXHJcbiAgY3Jvc3NQYWdlPzogYm9vbGVhbjsgLy/ot6jpobXpgInkuK1cclxuXHJcbiAgLyoqXHJcbiAgICog5Y+v6YCJLGVsZW1lbnQtcGx1c+W/heS8oFxyXG4gICAqL1xyXG4gIHJvd0tleT86IHN0cmluZztcclxuXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG5cclxuICByZWFkb25seT86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIOWAvOexu+Wei1xyXG4gICAqL1xyXG4gIHZhbHVlVHlwZT86IFwidmFsdWVcIiB8IFwib2JqZWN0XCI7XHJcblxyXG4gIC8qKlxyXG4gICAqIOaYr+WQpuafpeeci+aooeW8j1xyXG4gICAqL1xyXG4gIHZpZXdNb2RlPzogYm9vbGVhbjtcclxuICAvKipcclxuICAgKiDmn6XnnIvmqKHlvI/kuIvmmK/lkKbop6blj5FjaGFuZ2Xkuovku7ZcclxuICAgKi9cclxuICBlbWl0T25WaWV3TW9kZWw/OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiB0YWJsZeaYr+WQpui3n+maj+eql+WPo+WFs+mXreiAjOmUgOavgVxyXG4gICAqL1xyXG4gIGRlc3Ryb3lPbkNsb3NlPzogYm9vbGVhbjtcclxufTtcclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoZGVmaW5lUHJvcHM8RnNUYWJsZVNlbGVjdFByb3BzPigpLCB7XHJcbiAgY3Jvc3NQYWdlOiB0cnVlLFxyXG4gIHJvd0tleTogdW5kZWZpbmVkLFxyXG4gIGRpc2FibGVkOiBmYWxzZSxcclxuICByZWFkb25seTogZmFsc2UsXHJcbiAgaGVpZ2h0OiB1bmRlZmluZWQsXHJcbiAgdmFsdWVzRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgZGlhbG9nOiB1bmRlZmluZWQsXHJcbiAgc2VsZWN0OiB1bmRlZmluZWQsXHJcbiAgY3J1ZE9wdGlvbnNPdmVycmlkZTogdW5kZWZpbmVkLFxyXG4gIHZhbHVlVHlwZTogXCJ2YWx1ZVwiLFxyXG4gIHNob3dTZWxlY3Q6IHRydWUsXHJcbiAgc2hvd0N1cnJlbnQ6IHRydWUsXHJcbiAgdmlld01vZGU6IGZhbHNlLFxyXG4gIGVtaXRPblZpZXdNb2RlbDogdHJ1ZSxcclxuICBkZXN0cm95T25DbG9zZTogdHJ1ZSxcclxuICAvKipcclxuICAgKiBjcmVhdGVDcnVkT3B0aW9uc+aWueazleaYr+WQjOatpei/mOaYr+W8guatpVxyXG4gICAqL1xyXG4gIElzU3luY0NyZWF0ZTogZmFsc2VcclxufSk7XHJcblxyXG5jb25zdCBzbG90cyA9IGRlZmluZVNsb3RzPHtcclxuICAvKipgXHJcbiAgICog6buY6K6k5o+S5qe9XHJcbiAgICogYGBganNcclxuICAgKiBzY29wZSA9IHtcclxuICAgKiAgLy/mmK/lkKblt7LmiZPlvIBcclxuICAgKiAgb3BlbmVkOmJvb2xlYW4sXHJcbiAgICogIC8v5omT5byA5pa55rOVXHJcbiAgICogIG9wZW46KCk9PnZvaWRcclxuICAgKiB9XHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZGVmYXVsdDogYW55O1xyXG59PigpO1xyXG5cclxuY29uc3QgZW1pdHMgPSBkZWZpbmVFbWl0cyhbXHJcbiAgXCJjaGFuZ2VcIixcclxuICBcInVwZGF0ZTptb2RlbFZhbHVlXCIsXHJcbiAgLyog6YCJ5Lit6KGM5Y+Y5YyW5LqL5Lu2ICovXHJcbiAgXCJzZWxlY3RlZC1jaGFuZ2VcIixcclxuICAvKuWvueivneahhuWNs+WwhuWFs+mXrSovXHJcbiAgXCJkaWFsb2ctY2xvc2VcIixcclxuICAvKuWvueivneahhuW3suWFs+mXrSovXHJcbiAgXCJkaWFsb2ctY2xvc2VkXCIsXHJcbiAgLyrlr7nor53moYblhbPpl60qL1xyXG4gIFwiY2xvc2VcIixcclxuICAvKuWvueivneahhuaJk+W8gCovXHJcbiAgXCJvcGVuXCJcclxuXSk7XHJcbmNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XHJcbmNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xyXG5jb25zdCBkaWN0U2VsZWN0UmVmID0gcmVmKCk7XHJcbmNvbnN0IHZhbHVlc0Zvcm1hdFJlZiA9IHJlZigpO1xyXG5jb25zdCBkaWFsb2dPcGVuID0gcmVmKGZhbHNlKTtcclxuXHJcbmZ1bmN0aW9uIG9uQ2xvc2UoKSB7XHJcbiAgZGlhbG9nT3Blbi52YWx1ZSA9IGZhbHNlO1xyXG4gIGVtaXRzKFwiY2xvc2VcIiwgZ2V0U2NvcGVDb250ZXh0KCkpO1xyXG59XHJcbmZ1bmN0aW9uIG9uT3BlbigpIHtcclxuICBkaWFsb2dPcGVuLnZhbHVlID0gdHJ1ZTtcclxuICBlbWl0cyhcIm9wZW5cIiwgZ2V0U2NvcGVDb250ZXh0KCkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9zZSgpIHtcclxuICBvbkNsb3NlKCk7XHJcbn1cclxuXHJcbmNvbnN0IHsgY3J1ZFJlZiwgY3J1ZEJpbmRpbmcsIGNydWRFeHBvc2UgfSA9IHVzZUZzUmVmKCk7XHJcblxyXG5mdW5jdGlvbiBpbml0U2VsZWN0ZWRLZXlzKG1vZGVsVmFsdWU6IGFueSkge1xyXG4gIGlmIChtb2RlbFZhbHVlID09IG51bGwgfHwgKEFycmF5LmlzQXJyYXkobW9kZWxWYWx1ZSkgJiYgbW9kZWxWYWx1ZS5sZW5ndGggPT0gMCkpIHtcclxuICAgIHNlbGVjdGVkUm93S2V5cy52YWx1ZSA9IFtdO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcclxuICAgICAgc2VsZWN0ZWRSb3dLZXlzLnZhbHVlID0gbW9kZWxWYWx1ZSB8fCBbXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbGVjdGVkUm93S2V5cy52YWx1ZSA9IFttb2RlbFZhbHVlXTtcclxuICAgIH1cclxuICAgIGlmIChwcm9wcy52YWx1ZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgc2VsZWN0ZWRSb3dLZXlzLnZhbHVlID0gc2VsZWN0ZWRSb3dLZXlzLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBwcm9wcy5kaWN0LmdldFZhbHVlKGl0ZW0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGZvcm1XcmFwcGVyUmVmID0gcmVmKCk7XHJcbmNvbnN0IGZvcm1XcmFwcGVyT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgd3JhcHBlcjoge31cclxuICB9O1xyXG59KTtcclxuXHJcbmNvbnN0IG9wZW5UYWJsZVNlbGVjdCA9IGFzeW5jIChvcGVuT3B0aW9uczogeyBjcnVkT3B0aW9ucz86IER5bmFtaWNhbGx5Q3J1ZE9wdGlvbnM7IGNvbnRleHQ/OiBhbnkgfSA9IHt9KSA9PiB7XHJcbiAgaWYgKHByb3BzLmRpc2FibGVkIHx8IHByb3BzLnJlYWRvbmx5IHx8IHByb3BzLnNlbGVjdD8uZGlzYWJsZWQgfHwgcHJvcHMuc2VsZWN0Py5yZWFkb25seSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBpZiAocHJvcHMuZGljdCA9PSBudWxsKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCLlv4XpobvphY3nva5kaWN077yM5LiU5b+F6aG76YWN572uZGljdC5nZXROb2Rlc0J5VmFsdWVzXCIpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgcmV0ID0gYXdhaXQgdXNlRnNBc3luYyh7XHJcbiAgICBjcnVkQmluZGluZyxcclxuICAgIGNydWRSZWYsXHJcbiAgICBjcmVhdGVDcnVkT3B0aW9uczogcHJvcHMuY3JlYXRlQ3J1ZE9wdGlvbnMsXHJcbiAgICBjcnVkT3B0aW9uc092ZXJyaWRlOiBidWlsZE1lcmdlZENydWRPcHRpb25zKCksXHJcbiAgICBjb250ZXh0OiB7XHJcbiAgICAgIHQsXHJcbiAgICAgIHVpLFxyXG4gICAgICAuLi5vcGVuT3B0aW9ucz8uY29udGV4dFxyXG4gICAgfSxcclxuICAgIGNydWRFeHBvc2VcclxuICB9KTtcclxuXHJcbiAgaW5pdFNlbGVjdGVkS2V5cyhwcm9wcy5tb2RlbFZhbHVlKTtcclxuICBpZiAocHJvcHMuYmVmb3JlT3Blbikge1xyXG4gICAgYXdhaXQgcHJvcHMuYmVmb3JlT3Blbih7XHJcbiAgICAgIGNydWRPcHRpb25zOiBvcGVuT3B0aW9ucz8uY3J1ZE9wdGlvbnMsXHJcbiAgICAgIC4uLmdldFNjb3BlQ29udGV4dCgpXHJcbiAgICB9KTtcclxuICB9XHJcbiAgaWYgKG9wZW5PcHRpb25zKSB7XHJcbiAgICByZXQuYXBwZW5kQ3J1ZE9wdGlvbnMob3Blbk9wdGlvbnM/LmNydWRPcHRpb25zKTtcclxuICB9XHJcbiAgY29uc3Qgd3JhcHBlck9wdGlvbnMgPSBtZXJnZShcclxuICAgIHtcclxuICAgICAgd3JhcHBlcjoge1xyXG4gICAgICAgIHRpdGxlOiBwcm9wcy52aWV3TW9kZSA/IHQoXCJmcy5leHRlbmRzLnRhYmxlU2VsZWN0LnZpZXdcIikgOiB0KFwiZnMuZXh0ZW5kcy50YWJsZVNlbGVjdC5zZWxlY3RcIiksXHJcbiAgICAgICAgd2lkdGg6IFwiODAlXCIsXHJcbiAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxyXG4gICAgICAgIGlzOiB1aS5kaWFsb2cubmFtZSxcclxuICAgICAgICBmb290ZXI6IGZhbHNlLFxyXG4gICAgICAgIC4uLnVpLmZvcm1XcmFwcGVyLmJ1aWxkSW5pdEJpbmQodWkuZGlhbG9nLm5hbWUpLFxyXG4gICAgICAgIGJ1dHRvbnM6IHtcclxuICAgICAgICAgIHJlc2V0OiB7XHJcbiAgICAgICAgICAgIHNob3c6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY2FuY2VsOiB7XHJcbiAgICAgICAgICAgIHRleHQ6IHQoXCJmcy5leHRlbmRzLnRhYmxlU2VsZWN0LmNhbmNlbFwiKSxcclxuICAgICAgICAgICAgYXN5bmMgY2xpY2soKSB7XHJcbiAgICAgICAgICAgICAgZm9ybVdyYXBwZXJSZWYudmFsdWUuY2xvc2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9rOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxyXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMuZXh0ZW5kcy50YWJsZVNlbGVjdC5va1wiKSxcclxuICAgICAgICAgICAgYXN5bmMgY2xpY2soKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgb25PaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB3cmFwcGVyOiBwcm9wcy5kaWFsb2dcclxuICAgIH1cclxuICApO1xyXG4gIGZvcm1XcmFwcGVyUmVmLnZhbHVlLm9wZW4od3JhcHBlck9wdGlvbnMpO1xyXG5cclxuICBhd2FpdCBuZXh0VGljaygpO1xyXG4gIGF3YWl0IGNydWRFeHBvc2UuZG9SZWZyZXNoKCk7XHJcbiAgcmV0dXJuIHJldDtcclxufTtcclxuXHJcbmNvbnN0IGNvbXB1dGVkVmFsdWVzRm9ybWF0ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICBtYXhWaXNpYmxlOiAzLFxyXG4gICAgLi4ucHJvcHMudmFsdWVzRm9ybWF0XHJcbiAgfTtcclxufSk7XHJcblxyXG5jb25zdCBjb21wdXRlZFNlbGVjdCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCB1cGRhdGVLZXkgPSBgb25VcGRhdGU6JHt1aS5zZWxlY3QubW9kZWxWYWx1ZX1gO1xyXG5cclxuICBsZXQgdmFsdWUgPSBwcm9wcy5tb2RlbFZhbHVlO1xyXG4gIGlmIChwcm9wcy52YWx1ZVR5cGUgPT09IFwib2JqZWN0XCIgJiYgcHJvcHMubW9kZWxWYWx1ZSkge1xyXG4gICAgaWYgKHByb3BzLm11bHRpcGxlKSB7XHJcbiAgICAgIHZhbHVlID0gcHJvcHMubW9kZWxWYWx1ZS5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBwcm9wcy5kaWN0LmdldFZhbHVlKGl0ZW0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZhbHVlID0gcHJvcHMuZGljdC5nZXRWYWx1ZShwcm9wcy5tb2RlbFZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHtcclxuICAgIFt1aS5zZWxlY3QubW9kZWxWYWx1ZV06IHZhbHVlLFxyXG4gICAgW3VwZGF0ZUtleV06ICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgIGVtaXRzKFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgdmFsdWUpO1xyXG4gICAgfSxcclxuICAgIFt1aS5zZWxlY3QuY2xlYXJhYmxlXTogdHJ1ZSxcclxuICAgIC4uLnVpLnNlbGVjdC5idWlsZE11bHRpQmluZGluZyhwcm9wcy5tdWx0aXBsZSksXHJcbiAgICBzaG93OiBmYWxzZSxcclxuICAgIC4uLnByb3BzLnNlbGVjdFxyXG4gIH07XHJcbn0pO1xyXG5cclxud2F0Y2goXHJcbiAgKCkgPT4ge1xyXG4gICAgcmV0dXJuIHByb3BzLm1vZGVsVmFsdWU7XHJcbiAgfSxcclxuICBhc3luYyAodmFsdWUpID0+IHtcclxuICAgIGlmICh2YWx1ZSA9PT0gc2VsZWN0ZWRSb3dLZXlzLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGluaXRTZWxlY3RlZEtleXModmFsdWUpO1xyXG4gICAgYXdhaXQgbmV4dFRpY2soKTtcclxuICAgIGF3YWl0IHByb3BzLmRpY3QuYXBwZW5kQnlWYWx1ZXMoc2VsZWN0ZWRSb3dLZXlzLnZhbHVlKTtcclxuICAgIC8vIGRpY3RTZWxlY3RSZWYudmFsdWUucmVsb2FkRGljdCgpO1xyXG4gIH1cclxuKTtcclxuY29uc3Qgc2VsZWN0ZWRSb3dLZXlzOiBSZWY8YW55W10+ID0gcmVmKFtdKTtcclxuXHJcbmZ1bmN0aW9uIGdldFJvd0tleSgpIHtcclxuICByZXR1cm4gcHJvcHMucm93S2V5IHx8IGNydWRCaW5kaW5nLnZhbHVlLnRhYmxlLnJvd0tleSB8fCBcImlkXCI7XHJcbn1cclxuY29uc3QgcmVmcmVzaGluZyA9IHJlZihmYWxzZSk7XHJcblxyXG5mdW5jdGlvbiBidWlsZE1lcmdlZENydWRPcHRpb25zKCkge1xyXG4gIGxldCB0YWJsZUNJID0gdWkudGFibGU7XHJcbiAgaWYgKGNydWRCaW5kaW5nLnZhbHVlPy50YWJsZT8udGFibGVWZXJzaW9uID09PSBcInYyXCIpIHtcclxuICAgIHRhYmxlQ0kgPSB1aS50YWJsZVYyO1xyXG4gIH1cclxuICBsZXQgc2VsZWN0aW9uT3B0aW9ucyA9IHRhYmxlQ0kuYnVpbGRTZWxlY3Rpb25DcnVkT3B0aW9ucyh7XHJcbiAgICBjcm9zc1BhZ2U6IHByb3BzLmNyb3NzUGFnZSxcclxuICAgIHNlbGVjdE9uQ2xpY2tSb3c6IHRydWUsXHJcbiAgICBnZXRSb3dLZXksXHJcbiAgICBnZXRQYWdlRGF0YSgpIHtcclxuICAgICAgcmV0dXJuIGNydWRCaW5kaW5nLnZhbHVlLmRhdGE7XHJcbiAgICB9LFxyXG4gICAgdXNlQ29tcHV0ZTogdXNlQ29tcHV0ZSxcclxuICAgIG11bHRpcGxlOiBwcm9wcy5tdWx0aXBsZSxcclxuICAgIHNlbGVjdGVkUm93S2V5cyxcclxuICAgIG9uU2VsZWN0ZWRLZXlzQ2hhbmdlZDogYXN5bmMgKGNoYW5nZWQpID0+IHtcclxuICAgICAgc2VsZWN0ZWRSb3dLZXlzLnZhbHVlID0gWy4uLmNoYW5nZWRdO1xyXG4gICAgICBhd2FpdCBuZXh0VGljaygpO1xyXG4gICAgICBhd2FpdCBwcm9wcy5kaWN0LmFwcGVuZEJ5VmFsdWVzKHNlbGVjdGVkUm93S2V5cy52YWx1ZSk7XHJcbiAgICAgIC8vIGlmICh2YWx1ZXNGb3JtYXRSZWYudmFsdWUpIHtcclxuICAgICAgLy8gICB2YWx1ZXNGb3JtYXRSZWYudmFsdWUucmVsb2FkRGljdCgpO1xyXG4gICAgICAvLyB9XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgY29uc3QgY3J1ZE9wdGlvbnMgPSB7XHJcbiAgICB0YWJsZToge1xyXG4gICAgICBhc3luYyBvblJlZnJlc2hlZCgpIHtcclxuICAgICAgICBpZiAodGFibGVDSS5zZXRTZWxlY3RlZFJvd3MpIHtcclxuICAgICAgICAgIHJlZnJlc2hpbmcudmFsdWUgPSB0cnVlO1xyXG4gICAgICAgICAgYXdhaXQgbmV4dFRpY2soKTtcclxuICAgICAgICAgIGF3YWl0IG5leHRUaWNrKCk7XHJcbiAgICAgICAgICBjb25zdCBiYXNlVGFibGVSZWYgPSBjcnVkRXhwb3NlLmdldEJhc2VUYWJsZVJlZigpO1xyXG4gICAgICAgICAgdGFibGVDSS5zZXRTZWxlY3RlZFJvd3Moe1xyXG4gICAgICAgICAgICBnZXRSb3dLZXksXHJcbiAgICAgICAgICAgIG11bHRpcGxlOiBwcm9wcy5tdWx0aXBsZSxcclxuICAgICAgICAgICAgdGFibGVSZWY6IGJhc2VUYWJsZVJlZixcclxuICAgICAgICAgICAgc2VsZWN0ZWRSb3dLZXlzXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJlZnJlc2hpbmcudmFsdWUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG4gIHJldHVybiBtZXJnZShjcnVkT3B0aW9ucywgc2VsZWN0aW9uT3B0aW9ucywgcHJvcHMuY3J1ZE9wdGlvbnNPdmVycmlkZSk7XHJcbn1cclxuXHJcbmNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBvbk9rKCkge1xyXG4gIGlmIChwcm9wcy5kaWN0LmxvYWRpbmcpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgbGV0IHZhbHVlID0gbnVsbDtcclxuICBsZXQgcm93cyA9IG51bGw7XHJcbiAgaWYgKHNlbGVjdGVkUm93S2V5cy52YWx1ZT8ubGVuZ3RoID4gMCkge1xyXG4gICAgdmFsdWUgPSBbLi4uc2VsZWN0ZWRSb3dLZXlzLnZhbHVlXTtcclxuXHJcbiAgICByb3dzID0gdmFsdWUubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgIHJldHVybiBwcm9wcy5kaWN0LmdldERpY3RNYXAoKVtpdGVtXTtcclxuICAgIH0pO1xyXG4gICAgaWYgKHByb3BzLnZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICB2YWx1ZSA9IHJvd3M7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHByb3BzLm11bHRpcGxlICE9PSB0cnVlICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgdmFsdWUgPSB2YWx1ZVswXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmICghcHJvcHMudmlld01vZGUgfHwgcHJvcHMuZW1pdE9uVmlld01vZGVsKSB7XHJcbiAgICAvL+mdnnZpZXfmqKHlvI/kuIvvvIzpnIDopoHmm7TmlrB2YWx1ZVxyXG4gICAgZW1pdHMoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCB2YWx1ZSk7XHJcbiAgICBlbWl0cyhcImNoYW5nZVwiLCB2YWx1ZSk7XHJcbiAgICBlbWl0cyhcInNlbGVjdGVkLWNoYW5nZVwiLCByb3dzKTtcclxuICB9XHJcbiAgbGV0IHNjb3BlID0ge1xyXG4gICAgdmFsdWUsXHJcbiAgICByb3dzLFxyXG4gICAgc2VsZWN0ZWRSb3dLZXlzOiBzZWxlY3RlZFJvd0tleXMudmFsdWVcclxuICB9O1xyXG4gIGVtaXRzKFwiZGlhbG9nLWNsb3NlXCIsIHNjb3BlKTtcclxuICBhd2FpdCBuZXh0VGljaygpO1xyXG4gIGF3YWl0IGZvcm1XcmFwcGVyUmVmLnZhbHVlLmNsb3NlKCk7XHJcbiAgZW1pdHMoXCJkaWFsb2ctY2xvc2VkXCIsIHNjb3BlKTtcclxufVxyXG5cclxuY29uc3QgZ2V0U2NvcGVDb250ZXh0ID0gKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICBvcGVuZWQ6IGRpYWxvZ09wZW4sXHJcbiAgICBvcGVuOiBvcGVuVGFibGVTZWxlY3QsXHJcbiAgICBzZWxlY3RlZFJvd0tleXMsXHJcbiAgICBkaWN0U2VsZWN0UmVmLFxyXG4gICAgdmFsdWVzRm9ybWF0UmVmLFxyXG4gICAgY3J1ZFJlZixcclxuICAgIGNydWRCaW5kaW5nLFxyXG4gICAgY3J1ZEV4cG9zZSxcclxuICAgIGNsb3NlXHJcbiAgfTtcclxufTtcclxuXHJcbmNvbnN0IHNjb3BlUmVmID0gcmVmKGdldFNjb3BlQ29udGV4dCgpKTtcclxuZGVmaW5lRXhwb3NlKHNjb3BlUmVmLnZhbHVlKTtcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtdGFibGUtc2VsZWN0IHtcclxuICB3aWR0aDogMTAwJTtcclxuICAuZWwtZGlhbG9nX19ib2R5IHtcclxuICAgIHBhZGRpbmctdG9wOiAwO1xyXG4gICAgcGFkZGluZy1ib3R0b206IDA7XHJcbiAgfVxyXG59XHJcbi5mcy10YWJsZS1zZWxlY3QtY3VycmVudCB7XHJcbiAgLy9ib3JkZXI6IDFweCBzb2xpZCAjZWVlO1xyXG4gIC8vYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gIHBhZGRpbmc6IDEwcHggMDtcclxufVxyXG48L3N0eWxlPlxyXG4iLCI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IGFzIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi8gX19NQUNST1NfZGVmaW5lQ29tcG9uZW50KHtcclxuICAvKipcclxuICAgKiDlj6/nvJbovpHpgInmi6nlmahcclxuICAgKi9cclxuICBuYW1lOiBcIkZzRWRpdGFibGVTZWxlY3RcIlxyXG59KTtcbjwvc2NyaXB0PlxuPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJmcy1lZGl0YWJsZS1zZWxlY3RcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RcIj5cclxuICAgICAgPGZzLWRpY3Qtc2VsZWN0IDp2YWx1ZT1cIm1vZGVsVmFsdWVcIiA6ZGljdD1cImRpY3RcIiB2LWJpbmQ9XCJkaWN0U2VsZWN0XCIgQHVwZGF0ZTp2YWx1ZT1cImRvVXBkYXRlXCI+PC9mcy1kaWN0LXNlbGVjdD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxmcy10YWJsZS1zZWxlY3RcclxuICAgICAgY2xhc3M9XCJ0YWJsZS1zZWxlY3RcIlxyXG4gICAgICA6bW9kZWwtdmFsdWU9XCJtb2RlbFZhbHVlXCJcclxuICAgICAgOmRpY3Q9XCJkaWN0XCJcclxuICAgICAgOmRlc3Ryb3ktb24tY2xvc2U9XCJmYWxzZVwiXHJcbiAgICAgIGhlaWdodD1cIjQwMHB4XCJcclxuICAgICAgdi1iaW5kPVwidGFibGVTZWxlY3RcIlxyXG4gICAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwiZG9VcGRhdGVcIlxyXG4gICAgICBAZGlhbG9nLWNsb3NlZD1cImRvUmVmcmVzaFwiXHJcbiAgICA+XHJcbiAgICAgIDx0ZW1wbGF0ZSAjZGVmYXVsdD1cInNjb3BlXCI+XHJcbiAgICAgICAgPGZzLWJ1dHRvbiB0eXBlPVwicHJpbWFyeVwiIGljb249XCJhbnQtZGVzaWduOmVkaXQtb3V0bGluZWRcIiB2LWJpbmQ9XCJidXR0b25cIiBAY2xpY2s9XCJzY29wZS5vcGVuXCI+PC9mcy1idXR0b24+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8L2ZzLXRhYmxlLXNlbGVjdD5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIC8qKlxyXG4gICAqIOWAvFxyXG4gICAqL1xyXG4gIG1vZGVsVmFsdWU/OiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICog5pWw5o2u5a2X5YW4XHJcbiAgICovXHJcbiAgZGljdDogYW55O1xyXG4gIC8qKlxyXG4gICAqIHRhYmxlLXNlbGVjdOWPguaVsFxyXG4gICAqL1xyXG4gIHRhYmxlU2VsZWN0OiBhbnk7XHJcbiAgLyoqXHJcbiAgICogZGljdC1zZWxlY3Tlj4LmlbBcclxuICAgKi9cclxuICBkaWN0U2VsZWN0PzogYW55O1xyXG4gIC8qKlxyXG4gICAqIOaMiemSruWPguaVsFxyXG4gICAqL1xyXG4gIGJ1dHRvbj86IGFueTtcclxufT4oKTtcclxuXHJcbjtcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0cyhbXHJcbiAgLyoqXHJcbiAgICog5YWz6Zet5a+56K+d5qGG5pe26Kem5Y+RXHJcbiAgICovXHJcbiAgXCJyZWZyZXNoXCIsXHJcbiAgXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiXHJcbl0pO1xyXG5mdW5jdGlvbiBkb1JlZnJlc2goKSB7XHJcbiAgZW1pdChcInJlZnJlc2hcIik7XHJcbiAgcHJvcHMuZGljdD8ucmVsb2FkRGljdCgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkb1VwZGF0ZSh2YWx1ZTogYW55KSB7XHJcbiAgZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcclxufVxyXG48L3NjcmlwdD5cclxuXHJcbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxyXG4uZnMtZWRpdGFibGUtc2VsZWN0IHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG5cclxuICAuc2VsZWN0IHtcclxuICAgIGZsZXg6IDE7XHJcbiAgfVxyXG4gIC50YWJsZS1zZWxlY3Qge1xyXG4gICAgZmxleDogMDtcclxuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XHJcbiAgfVxyXG59XHJcbjwvc3R5bGU+XHJcbiIsbnVsbF0sIm5hbWVzIjpbImdldENhbGxlckluZm8iLCJfYSIsImJsYW5rIiwiYXJncyIsImxvZ0luZm8iLCJsb2dXYXJuIiwibG9nRXJyb3IiLCJlcnJvciIsIndhcm4iLCJpbmZvIiwiZGVidWciLCJjYWxsZXJJbmZvIiwibG9nIiwiY2FsbGVyIiwibG9nZ2VyIiwic2V0TG9nZ2VyIiwib3B0cyIsImxldmVsIiwiaXNFbXB0eSIsInZhbHVlIiwiaXNBbGxFbXB0eSIsInZhbHVlcyIsImhhc0VtcHR5IiwiU3RyaW5nVXRpbHMiLCJ0cmFjZSIsIm5hbWUiLCJlbmFibGUiLCJjcmVhdGVBc3luY0NvbXBvbmVudCIsImVzIiwiZGVmaW5lQXN5bmNDb21wb25lbnQiLCJyZXRyeSIsImZhaWwiLCJhdHRlbXB0cyIsImluc3RhbGxBc3luY0NvbXBvbmVudCIsImFwcCIsIm9wdGlvbnMiLCJhc3luY0NvbXBvbmVudCIsImluc3RhbGxBc3luY0NvbXBvbmVudHMiLCJtb2R1bGVzIiwiZXhjbHVkZXMiLCJwaWNrTmFtZUV4cCIsInRyYW5zZm9ybSIsImltcG9ydHMiLCJ0cmFuc2Zvcm1Gcm9tR2xvYiIsImZvckVhY2giLCJpdGVtIiwia2V5IiwiaW5zdGFsbFN5bmNDb21wb25lbnRzIiwiY29tcG9uZW50cyIsInJlc3VsdCIsImNhbWVsQ2FzZSIsInVwcGVyRmlyc3QiLCJsb2FkQXN5bmNDb21wb25lbnRGcm9tR2xvYiIsIm1hcCIsImxvYWRDb21wb25lbnRGcm9tR2xvYiIsInZpdGUiLCJUYWJsZVN0b3JlIiwiX19wdWJsaWNGaWVsZCIsInRhYmxlTmFtZSIsInByZWZpeCIsInRhYmxlSWQiLCJzYXZlZCIsInRhYmxlIiwiJHJvdXRlIiwia2V5VHlwZSIsInJ4QXJySW5kZXgiLCJyeFZhck5hbWUiLCJyeFF1b3QiLCJqb2luUGF0aHMiLCJwYXRocyIsImFjYyIsInAiLCJnZXRQYXRoVG9TdHJpbmciLCJfIiwicGF0aFRvU3RyaW5nIiwicGF0aCIsInByZWZpeGVzIiwidHlwZSIsImhhcyIsImlzT2JqZWN0IiwiZ2V0SXRlcmF0ZSIsIml0ZXJhdGUiLCJvYmoiLCJjYWxsYmFjayIsImJyb2tlbiIsImJyZWFrSXQiLCJkZXNjcmliZVZhbHVlIiwicGFyZW50IiwiY3AiLCJpIiwiY2hpbGRyZW4iLCJjb250ZXh0UmVhZGVyIiwiQ29udGV4dFJlYWRlciIsImVyciIsInNjcCIsImdldEVsZW1lbnRzIiwiZ2V0T3duQ2hpbGRyZW4iLCJjaGlsZHJlblBhdGgiLCJzdHJDaGlsZHJlblBhdGgiLCJzdHJDaGlsZFBhdGhQcmVmaXgiLCJyZXMiLCJ2YWwiLCJzdHJDaGlsZFBhdGgiLCJwYXRoRm9ybWF0U3RyaW5nIiwiY2hpbGRLZXkiLCJhZnRlckl0ZXJhdGUiLCJjdXJQYXJlbnQiLCJpc09iamVjdEVtcHR5Iiwib3duUHJvcGVydGllc09ubHkiLCJnZXRFYWNoRGVlcCIsImVhY2hEZWVwIiwiaWRlbnRpdHkiLCJtZXJnZSIsImlzU3RyaW5nIiwidG9QYXRoIiwiZm9yRWFjaERlZXAiLCJkZWVwZGFzaCIsImRhc2giLCJyZWYiLCJza2lwcyIsImtleXMiLCJwQXR0cnMiLCJjb3B5VG9DbGlwYm9hcmRUcmFkaXRpb25hbCIsInRleHQiLCJ0ZXh0QXJlYSIsInN1Y2Nlc3NmdWwiLCJjb3B5VG9DbGlwYm9hcmQiLCJyZWFkRnJvbUNsaXBib2FyZFRyYWRpdGlvbmFsIiwicmVzb2x2ZSIsInJlamVjdCIsInJlYWRUb0NsaXBib2FyZCIsIm1lbW9yeUNsaXBib2FyZCIsInJlYWN0aXZlIiwiY29weVRvTWVtb3J5IiwicmVhZFRvTWVtb3J5IiwiY2xlYXJNZW1vcnlDbGlwYm9hcmQiLCJ1dGlscyIsInN0cmluZ3MiLCJzdG9yZSIsImNsaXBib2FyZCIsImRlZmF1bHRDcnVkT3B0aW9ucyIsImN0eCIsImNydWRPcHRpb25zUmVmIiwiY3QiLCJjb21wdXRlZCIsInVpIiwidWlDb250ZXh0IiwidHJpZ2dlciIsImZvcm0iLCJfYiIsImNsaXBib2FyZERhdGEiLCJlIiwiZG9DbG9zZSIsInJlc2V0Iiwic3VibWl0IiwidG90YWwiLCJhbnRkdkNvbHNwYW4iLCJsYWJlbFNwYW4iLCJhc3Npc3QiLCJ1c2VVaSIsImJ1dHRvbiIsImNhc2NhZGVyIiwiemhDTiIsImVuIiwidCIsImdldCIsImFyZyIsImluZGV4IiwiSTE4biIsImluc3RhbmNlIiwibG9jYWxlcyIsIm1lc3NhZ2UiLCJmc0Nsb25lIiwiY2xvbmVEZWVwIiwiaTE4biIsInVzZUkxOG4iLCJtb2R1bGUiLCJ0aGlzIiwibiIsInIiLCJzIiwiYSIsImRheWpzIiwiYWR2YW5jZWRGb3JtYXQiLCJkb0Zvcm1hdCIsImRhdGUiLCJmb3JtYXQiLCJkYXRlRm9ybWF0dGVyIiwiZGF0ZXJhbmdlRm9ybWF0dGVyIiwiZGF0ZXRpbWVyYW5nZUZvcm1hdHRlciIsImYiLCJvIiwidSIsImQiLCJ3ZWVrZGF5IiwibG9jYWxlRGF0YSIsIndlZWtPZlllYXIiLCJkYXRlJDEiLCJidWlsZERhdGVWYWx1ZSIsInNjb3BlIiwicm93IiwiZWwiLCJpY29uIiwibnVtYmVyJDEiLCJwaG9uZSIsImNvbHVtbiIsInJldCIsInNlbGVjdCIsInRyZWUiLCJ0eXBlTGlzdCIsImRlZmF1bHRUeXBlQ3JlYXRvcnMiLCJkZWZhdWx0VHlwZXMiLCJnZXRUeXBlcyIsImdldFR5cGUiLCJhZGRUeXBlcyIsIm5ld1R5cGVzIiwidHlwZXMkMSIsImNyZWF0b3IiLCJfc2ZjX21haW4kRCIsImRlZmluZUNvbXBvbmVudCIsInBhZ2VSZWYiLCJvbk1vdW50ZWQiLCJfaG9pc3RlZF8xIiwiX2hvaXN0ZWRfMiIsIl9ob2lzdGVkXzQiLCIkc2xvdHMiLCJfY3R4IiwiX2NhY2hlIiwiJHByb3BzIiwiJHNldHVwIiwiJGRhdGEiLCIkb3B0aW9ucyIsIl9vcGVuQmxvY2siLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX2NyZWF0ZUNvbW1lbnRWTm9kZSIsIl9jcmVhdGVFbGVtZW50Vk5vZGUiLCJfaG9pc3RlZF8zIiwiaXNVbk1lcmdlYWJsZSIsInNyY1ZhbHVlIiwiVW5NZXJnZWFibGUiLCJpc1JlZiIsImlzU2hhbGxvdyIsImlzVW5DbG9uZWFibGUiLCJ0YXJnZXQiLCJzb3VyY2VzIiwiY3VzdG9taXplciIsIm9ialZhbHVlIiwiaXNBcnJheSIsImZvdW5kIiwibWVyZ2VXaXRoIiwiY2xvbmVEZWVwV2l0aCIsIlVuTWVyZ2VhYmxlJDEiLCJjbG9uZWFibGUiLCJ1c2VNZXJnZSIsImlzQXN5bmNDb21wdXRlIiwiQXN5bmNDb21wdXRlVmFsdWUiLCJpc1N5bmNDb21wdXRlIiwiQ29tcHV0ZVZhbHVlIiwiZmluZENvbXB1dGVWYWx1ZXMiLCJpc0FzeW5jIiwiZm91bmRNYXAiLCJjaGVja0Z1bmMiLCJjb250ZXh0IiwiZXhjbHVkZSIsImRvQXN5bmNDb21wdXRlIiwiZGVwZW5kQXN5bmNWYWx1ZXMiLCJnZXRDb250ZXh0Rm4iLCJhc3luY1ZhbHVlTWFwIiwic2V0QXN5bmNDb21wdXRlVmFsdWUiLCJhc3luY1ZhbHVlc01hcCIsInZhbHVlUmVmIiwic2V0IiwiZG9Db21wdXRlZCIsImdldFRhcmdldEZ1bmMiLCJ1c2VyQ29tcHV0ZWRGbiIsImRlcGVuZFZhbHVlcyIsImFzeW5jQ291bnQiLCJzeW5jQ291bnQiLCJjb21wdXRlRm4iLCJjb21wdXRlIiwiYXN5bmNGbiIsImRlZmF1bHRWYWx1ZSIsImFzeW5jUmVmIiwiY29tcHV0ZWRWYWx1ZSIsIndhdGNoIiwiYXN5bmNDb21wdXRlIiwidXNlQ29tcHV0ZSIsIkNvbnN0YW50cyIsIm1lcmdlQ29sdW1uUGx1Z2lucyIsInJlZ2lzdGVyTWVyZ2VDb2x1bW5QbHVnaW4iLCJwbHVnaW4iLCJyZW1vdmUiLCJwdXNoIiwic29ydCIsImIiLCJvcmRlciIsIm1lcmdlQ29sdW1uRGljdCIsImRpY3QiLCJjb21wb25lbnQiLCJzaGFsbG93UmVhY3RpdmUiLCJtZXJnZUNvbHVtblR5cGUiLCJ0eXBlQ2hhaW4iLCJBcnJheSIsImJhc2UiLCJ0eXBlT3B0aW9ucyIsInR5cGVzIiwibWVyZ2VQbHVnaW5zIiwiaGFuZGxlIiwiY29sdW1uUHJvcHMiLCJjcnVkT3B0aW9ucyIsInNldHRpbmdzIiwidmlld0Zvcm1Vc2VDZWxsQ29tcG9uZW50Iiwidmlld0Zvcm1Db2x1bW4iLCJpbmNsdWRlcyIsInJlbmRlciIsIl9jcmVhdGVWTm9kZSIsInZpZXdGb3JtIiwiYWRkRm9ybSIsInJ1bGVzIiwicnVsZSIsImVkaXRGb3JtIiwic2VhcmNoIiwibWVyZ2VQbHVnaW4iLCJzZXR1cE9wdGlvbnNDb2x1bW5zIiwiY29sdW1ucyIsInVzZXJPcHRpb25zIiwiaW5pdGVkQ29sdW1ucyIsImJ1aWxkT3B0aW9uc0NvbHVtbnNGbGF0TWFwIiwiYnVpbGRUYWJsZUNvbHVtbnNGbGF0TWFwIiwiYnVpbGRUYWJsZUNvbHVtbiIsImNvbFRlbXBsYXRlIiwidGFibGVDb2x1bW4iLCJ0aXRsZSIsImRlZmF1bHRBbGlnbmFibGUiLCJhbGlnbiIsInNvcnRhYmxlIiwiYnVpbGRUYWJsZUNvbHVtbnMiLCJ3cmFwcGVyQ3VzdG9tQ29tcG9uZW50Iiwic2hhbGxvd1JlZiIsInRhYmxlQ29sdW1ucyIsImRvQ29sdW1uc1NvcnQiLCJmaXhTcGVjaWFsQ29sdW1uc0ZpeGVkIiwibGlzdCIsInNvbWUiLCJmaXhlZCIsImRvQXJyYXlTb3J0IiwiYXJyIiwic29ydEJ5Iiwib3JkZXJEZWZhdWx0Iiwic2l6ZSIsImNvbHVtbnNBcnIiLCJjb2x1bW5zTWFwIiwiYnVpbGRGb3JtQ29sdW1ucyIsImNvbHVtbnNGbGF0TWFwIiwiZm9ybVR5cGUiLCJmb3JtQ29sdW1ucyIsImZvcm1Db2x1bW4iLCJidWlsZEZvcm0iLCJiYXNlT3B0aW9ucyIsIm9uQ29tcGxldGUiLCJidWlsZFNlYXJjaEZvcm0iLCJzZWFyY2hDb2x1bW5zIiwiZm9ybUNvbHVtbnNGb3JTZWFyY2giLCJjb3B5UHJvcHMiLCJzZWFyY2hDb3B5Rm9ybVByb3BzIiwiY29weUZyb21Db21wb3NpdGlvbkNvbHVtbiIsImZpZWxkIiwiY29tbW9uIiwiZGVmIiwicGljayIsImJ1aWxkRm9ybU9wdGlvbnMiLCJtb2RlIiwiZGVmYXVsdE9wdGlvbnMiLCJjb21tb25PcHRpb25zIiwiY3J1ZEV4cG9zZSIsImJ1aWxkQ29sdW1ucyIsInRvb2xiYXIiLCJjb2x1bW5zRmlsdGVyIiwib3JpZ2luYWxDb2x1bW5zIiwiZGlzYWJsZWQiLCJlZGl0YWJsZSIsImZvckVhY2hUYWJsZUNvbHVtbnMiLCJmb3JFYWNoQ29sdW1ucyIsInVzZUNvbHVtbnMiLCJzZWVkIiwiRnNGb3JtV3JhcHBlckxpc3QiLCJjcmVhdGVGb3JtV3JhcHBlciIsImlkIiwiY29udGFpbmVyIiwidk5vZGUiLCJjcmVhdGVWTm9kZSIsIkZzRm9ybVdyYXBwZXIiLCJ2bSIsInVzZUZvcm1XcmFwcGVyIiwicGQiLCJpbmplY3QiLCJvcGVuRGlhbG9nIiwib3BlbkNydWRGb3JtRGlhbG9nIiwiZm9ybU9wdGlvbnMiLCJkb01lcmdlIiwidXNlRWRpdGFibGUiLCJwcm9wcyIsImNydWRCaW5kaW5nIiwiX2MiLCJjdXN0b21Sb3dIYW5kbGVBY3RpdmUiLCJfZCIsIl9lIiwib25FbmFibGVkIiwiZWRpdGFibGVPcHRzIiwiZWRpdGFibGVJZCIsImVkaXRhYmxlUm93IiwiaXNBZGQiLCJzZXREYXRhIiwicm93RGF0YSIsImRhdGEiLCJ1c2VFeHBvc2UiLCJjcnVkUmVmIiwiZm9ybVdyYXBwZXJQcm92aWRlciIsImNoZWNrQ3J1ZFJlZiIsImNoZWNrQ3J1ZEJpbmRpbmdSZWYiLCJmb3JtV3JhcHBlclJlZiIsImZvcm1SZWYiLCJyZWNvcmRzIiwidG9SYXciLCJ2YWx1ZUJ1aWxkZXJDb2x1bW5zIiwiY29sIiwicGFnZVF1ZXJ5IiwicGFnZSIsInNlYXJjaEZvcm1EYXRhIiwicXVlcnkiLCJ1c2VyUGFnZVF1ZXJ5IiwidXNlclBhZ2VSZXMiLCJkaXNhYmxlTG9hZGluZyIsInVucmVmIiwicGFnZVJlcyIsImN1cnJlbnRQYWdlIiwicGFnZVNpemUiLCJmc1RhYmxlUmVmIiwibm8iLCJ0YWJsZVJlZiIsInJvd0tleSIsInJlbW92ZUJpbmRpbmciLCJpc0xvY2FsIiwicmVtb3ZlU2NvcGUiLCJmb3JtT3B0cyIsInh4Rm9ybSIsImxvYWRGc0V4cG9ydFV0aWwiLCJlYWNoIiwibG9hZEZzSW1wb3J0VXRpbCIsImRlZmF1bHREYXRhRm9ybWF0dGVyIiwib3JpZ2luYWxSb3ciLCJub2RlcyIsImxhYmVsIiwibm9kZSIsImV4cG9ydFRhYmxlIiwiZXhwb3J0Q29sIiwiZXhwb3J0VXRpbCIsIm9yaWdpbmFsRGF0YSIsInNlYXJjaFBhcmFtcyIsImNsb25lIiwibWFwcGluZyIsImV4cE9wdHMiLCJpbXBvcnRUYWJsZSIsImltcG9ydERhdGEiLCJpc0VkaXRhYmxlIiwiY3J1ZE9wdGlvbnNQbHVnaW5zIiwicmVnaXN0ZXJDcnVkT3B0aW9uc1BsdWdpbiIsImdldENydWRPcHRpb25zUGx1Z2luIiwic2VsZWN0aW9uIiwiZ2V0Um93S2V5IiwidGFibGVDSSIsImNoYW5nZWQiLCJzZWxlY3RlZFJvd0tleXMiLCJuZXh0VGljayIsIm1vYmlsZUFkYXB0b3IiLCJyb3dIYW5kbGUiLCJidXR0b25zIiwibmV3QnV0dG9ucyIsImJ1dHRvbnNLZXkiLCJ3aWR0aFJlZiIsInVzZUNydWQiLCJleHBvc2UiLCJkb1JlZnJlc2giLCJkb1ZhbHVlUmVzb2x2ZSIsInVzZVBhZ2luYXRpb24iLCJjdXJyZW50IiwidXNlRm9ybVN1Ym1pdCIsInVzZVJvd0hhbmRsZSIsInVzZVNlYXJjaCIsImJhc2VUYWJsZVJlZiIsInVzZVRhYnMiLCJmb3JtRGF0YSIsInVzZVRvb2xiYXIiLCJleHBvcnRpbmciLCJleHBvcnRPcHRpb25zIiwib3JpZ2luYWwiLCJ1cGRhdGVDb2x1bW5zIiwib2xkIiwib2xkQ29sdW1uIiwibmV3Q29sdW1uIiwibmV3Q29sdW1ucyIsInVzZVRhYmxlIiwic29ydENoYW5nZSIsImlzU2VydmVyU29ydCIsInByb3AiLCJhc2MiLCJvbGRTb3J0IiwidXNlQWN0aW9uYmFyIiwiYWN0aXZlUm93cyIsImFmdGVyVXNlQ3J1ZCIsImJpbmRpbmdzIiwicmVidWlsZENydWRCaW5kaW5ncyIsImlucHV0T3B0cyIsInVzZXJPcHRzIiwicGx1Z2lucyIsInBsdWciLCJiZWZvcmUiLCJwbHVnaW5PcHRpb25zIiwicmVzZXRDcnVkT3B0aW9ucyIsImFwcGVuZENydWRPcHRpb25zIiwib3Zlck9wdGlvbnMiLCJuZXdPcHRpb25zIiwiYXBwZW5kQ3J1ZEJpbmRpbmciLCJ1c2VGc0ltcGwiLCJjcmVhdGVDcnVkT3B0aW9ucyIsImNydWRFeHBvc2VSZWYiLCJjcmVhdGVDcnVkT3B0aW9uc1JldCIsImluaXRDcnVkIiwidXNlQ3J1ZFByb3BzIiwidXNlQ3J1ZFJldCIsInVzZUZzIiwidXNlRnNBc3luYyIsInVzZUZzUmVmIiwidXNlRGljdCIsInZNb2RlbCIsImNyZWF0ZUNvbXB1dGVkT3B0aW9ucyIsIm9wdGlvbiIsImdldFZhbHVlIiwiZ2V0TGFiZWwiLCJnZXREaWN0IiwiZ2V0U2NvcGUiLCJnZXRDdXJyZW50U2NvcGUiLCJwcm94eSIsImdldEN1cnJlbnRJbnN0YW5jZSIsImxvYWREaWN0IiwicmVsb2FkIiwicmVsb2FkRGljdCIsImNsZWFyRGljdCIsIndhdGNoVmFsdWUiLCJnZXREaWN0RGF0YSIsImdldFByb3BWYWx1ZSIsImF0dHIiLCJyZW1vdmVQcm9wVmFsdWUiLCJnZXRDaGlsZHJlbiIsInBlcmYiLCJ3YXJuZWQiLCJQUk9DRVNTIiwiZW1pdFdhcm5pbmciLCJtc2ciLCJjb2RlIiwiZm4iLCJBQyIsIkFTIiwid2FybkFDUG9seWZpbGwiLCJyZWFzb24iLCJwcmludEFDUG9seWZpbGxXYXJuaW5nIiwic2hvdWxkV2FybiIsImlzUG9zSW50IiwiZ2V0VWludEFycmF5IiwibWF4IiwiWmVyb0FycmF5IiwiX1N0YWNrIiwiSGVhcENscyIsIl9fcHJpdmF0ZUdldCIsIl9jb25zdHJ1Y3RpbmciLCJfX3ByaXZhdGVTZXQiLCJfX3ByaXZhdGVBZGQiLCJTdGFjayIsIl9MUlVDYWNoZSIsIl9pbml0aWFsaXplVFRMVHJhY2tpbmciLCJfaW5pdGlhbGl6ZVNpemVUcmFja2luZyIsIl9pbmRleGVzIiwiX3JpbmRleGVzIiwiX2lzVmFsaWRJbmRleCIsIl9ldmljdCIsIl9iYWNrZ3JvdW5kRmV0Y2giLCJfaXNCYWNrZ3JvdW5kRmV0Y2giLCJfY29ubmVjdCIsIl9tb3ZlVG9UYWlsIiwiX2RlbGV0ZSIsIl9jbGVhciIsIl9tYXgiLCJfbWF4U2l6ZSIsIl9kaXNwb3NlIiwiX2Rpc3Bvc2VBZnRlciIsIl9mZXRjaE1ldGhvZCIsIl9tZW1vTWV0aG9kIiwiX3NpemUiLCJfY2FsY3VsYXRlZFNpemUiLCJfa2V5TWFwIiwiX2tleUxpc3QiLCJfdmFsTGlzdCIsIl9uZXh0IiwiX3ByZXYiLCJfaGVhZCIsIl90YWlsIiwiX2ZyZWUiLCJfZGlzcG9zZWQiLCJfc2l6ZXMiLCJfc3RhcnRzIiwiX3R0bHMiLCJfaGFzRGlzcG9zZSIsIl9oYXNGZXRjaE1ldGhvZCIsIl9oYXNEaXNwb3NlQWZ0ZXIiLCJfdXBkYXRlSXRlbUFnZSIsIl9zdGF0dXNUVEwiLCJfc2V0SXRlbVRUTCIsIl9pc1N0YWxlIiwiX3JlbW92ZUl0ZW1TaXplIiwiX2kiLCJfYWRkSXRlbVNpemUiLCJfcyIsIl9zdCIsIl9yZXF1aXJlU2l6ZSIsIl9rIiwiX3YiLCJzaXplQ2FsY3VsYXRpb24iLCJ0dGwiLCJ0dGxSZXNvbHV0aW9uIiwidHRsQXV0b3B1cmdlIiwidXBkYXRlQWdlT25HZXQiLCJ1cGRhdGVBZ2VPbkhhcyIsImFsbG93U3RhbGUiLCJkaXNwb3NlIiwiZGlzcG9zZUFmdGVyIiwibm9EaXNwb3NlT25TZXQiLCJub1VwZGF0ZVRUTCIsIm1heFNpemUiLCJtYXhFbnRyeVNpemUiLCJmZXRjaE1ldGhvZCIsIm1lbW9NZXRob2QiLCJub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24iLCJub0RlbGV0ZU9uU3RhbGVHZXQiLCJhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiIsImFsbG93U3RhbGVPbkZldGNoQWJvcnQiLCJpZ25vcmVGZXRjaEFib3J0IiwiVWludEFycmF5IiwiX19wcml2YXRlTWV0aG9kIiwiaW5pdGlhbGl6ZVNpemVUcmFja2luZ19mbiIsImluaXRpYWxpemVUVExUcmFja2luZ19mbiIsImMiLCJpc0JhY2tncm91bmRGZXRjaF9mbiIsImsiLCJiYWNrZ3JvdW5kRmV0Y2hfZm4iLCJtb3ZlVG9UYWlsX2ZuIiwiaW5kZXhlc19mbiIsInJpbmRleGVzX2ZuIiwiZ2V0T3B0aW9ucyIsInYiLCJ0aGlzcCIsImRlbGV0ZWQiLCJkZWxldGVfZm4iLCJlbnRyeSIsInN0YXJ0IiwicmVtYWluIiwiYWdlIiwic2V0T3B0aW9ucyIsInN0YXR1cyIsImV2aWN0X2ZuIiwiX19wcml2YXRlV3JhcHBlciIsIm9sZFZhbCIsIm9sZFZhbHVlIiwiZHQiLCJ0YXNrIiwiaGFzT3B0aW9ucyIsInBlZWtPcHRpb25zIiwiZmV0Y2hPcHRpb25zIiwiZm9yY2VSZWZyZXNoIiwic2lnbmFsIiwic3RhbGUiLCJpc1N0YWxlIiwic3RhbGVWYWwiLCJtZW1vT3B0aW9ucyIsInZ2IiwiZmV0Y2hpbmciLCJjbGVhcl9mbiIsInR0bHMiLCJzdGFydHMiLCJjYWNoZWROb3ciLCJnZXROb3ciLCJzaXplcyIsImlzVmFsaWRJbmRleF9mbiIsImZyZWUiLCJoZWFkIiwiYWMiLCJmZXRjaE9wdHMiLCJjYiIsInVwZGF0ZUNhY2hlIiwiYWJvcnRlZCIsImlnbm9yZUFib3J0IiwiZmV0Y2hGYWlsIiwiYmYiLCJlYiIsImVyIiwiYWxsb3dTdGFsZUFib3J0ZWQiLCJub0RlbGV0ZSIsInBjYWxsIiwicmVqIiwiZm1wIiwiY29ubmVjdF9mbiIsInBpIiwibmkiLCJMUlVDYWNoZSIsIkRpY3RHbG9iYWxDYWNoZSIsInNldERpY3RSZXF1ZXN0IiwicmVxdWVzdCIsImRpY3RSZXF1ZXN0IiwiRGljdCIsImNhY2hlS2V5IiwiY2FjaGVkIiwiY2FsbCIsIm5vdGlmeSIsInRvRmV0Y2hWYWx1ZXMiLCJnZXRGcm9tUmVtb3RlIiwidXJsIiwibWF5YmVBcnIiLCJkaWN0RGF0YSIsImNvbmZpZyIsInVzZURpY3REZWZpbmUiLCJ1c2VUeXBlcyIsImRyYWdNb2RhbEZvckFudGR2IiwiZGlhbG9nRWwiLCJkaWFsb2dIZWFkZXJFbCIsImRyYWdEb20iLCJzdHkiLCJYIiwiWSIsInN0eUwiLCJzdHlUIiwibCIsImRyYWdNb2RhbEZvck5haXZlIiwiZHJhZ01vZGFsIiwidXNlRHJhZyIsIkdsb2JhbENvbmZpZyIsIl9zZmNfbWFpbiRDIiwiY29tcHV0ZWRJbm5lclN0eWxlIiwiY29tcHV0ZWRCb2R5U3R5bGUiLCJfc2ZjX3JlbmRlciIsIl9ub3JtYWxpemVTdHlsZSIsIl9yZW5kZXJTbG90IiwiX3NmY19tYWluJEIiLCJfY29tcG9uZW50X2ZzX2NvbnRhaW5lciIsIl9yZXNvbHZlQ29tcG9uZW50IiwiX2NyZWF0ZUJsb2NrIiwiX3dpdGhDdHgiLCJfaG9pc3RlZF81IiwiX3NmY19tYWluJEEiLCJnZXRDcnVkQmluZGluZyIsInNlYXJjaFNob3ciLCJjYXJkQ29tcG9uZW50TmFtZSIsIl9yZXNvbHZlRHluYW1pY0NvbXBvbmVudCIsIl9pc1Nsb3QiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsIl9pc1ZOb2RlIiwiaW5oZXJpdEF0dHJzIiwiU3RyaW5nIiwiZGVmYXVsdCIsInJlcXVpcmVkIiwiRnVuY3Rpb24iLCJpY29uUmlnaHQiLCJjaXJjbGUiLCJCb29sZWFuIiwidG9vbHRpcCIsInVuZGVmaW5lZCIsImJhZGdlIiwiYnV0dG9uUHJvcHMiLCJjbGFzc05hbWUiLCJsb2FkaW5nIiwiZW1pdHMiLCJzZXR1cCIsImxvYWRpbmdSZWYiLCJjb21wdXRlZExvYWRpbmciLCJpY29uUmVuZGVyIiwiaWNvbkNsYXNzIiwiX21lcmdlUHJvcHMiLCJyZW5kZXJCdG4iLCJpc0ljb25TbG90IiwiaXNJY29uUHJvcCIsImljb25Qcm9wIiwic2xvdHMiLCJpc0NpcmNsZSIsImJ1dHRvbkNvbXAiLCJyZXNvbHZlRHluYW1pY0NvbXBvbmVudCIsIm9uQ2xpY2siLCIkZXZlbnQiLCJlbWl0IiwiYnRuUHJvcHMiLCJjbGFzcyIsIm9taXQiLCJhdHRycyIsImgiLCJvcmlnaW5SZW5kZXJCdG4iLCJiYWRnZUNvbXAiLCJfc2xvdCIsInRvb2x0aXBDb21wIiwiY29tcHV0ZVRvb2x0aXBQcm9wcyIsInRyaWdnZXJTbG90TmFtZSIsInJlcXVpcmUiLCJiYXNlVXJsIiwiY29tcHV0ZWRSZW5kZXJGdW5jIiwiaW5kZXhPZiIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwic3R5bGUiLCJ3aWR0aCIsImhlaWdodCIsIkljb25Db21wIiwic3BsaXQiLCJjb2xvciIsImxlbmd0aCIsImlzQ29tcG9uZW50IiwiX3NmY19tYWluJHoiLCJJY29uIiwiX25vcm1hbGl6ZUNsYXNzIiwiX3NmY19tYWluJHkiLCJzeW1ib2xJZCIsImdldFN0eWxlIiwic3BpbiIsIl9zZmNfbWFpbiR4IiwiY29tcGFjdCIsImxhYmVsQXR0cnMiLCJfY3JlYXRlVGV4dFZOb2RlIiwiX3RvRGlzcGxheVN0cmluZyIsIl9fZGVmYXVsdF9fIiwiX19NQUNST1NfZGVmaW5lQ29tcG9uZW50IiwiX19wcm9wcyIsIl9jb21wb25lbnRfZnNfaWNvbiIsIl91bnJlZiIsIl9zZmNfbWFpbiR2IiwibWVyZ2VFdmVudEhhbmRsZXMiLCJldmVudE5hbWUiLCJldmVudHMiLCJldmVudCIsImh0bWxUYWdzIiwibW9kZWxWYWx1ZSIsIm9uIiwidW5kZWZpbmVUb051bGwiLCJwcm92aWRlIiwidGFyZ2V0UmVmIiwiYWxsQXR0cnMiLCJ0cmltIiwibnVtYmVyIiwib25VcGRhdGVNb2RlbFZhbHVlTmFtZSIsInRtcCIsIk51bWJlciIsImlzTmFOIiwiaGFuZGxlciIsImNoaWxkcmVuUmVuZGVyIiwiY3JlYXRlQ2hpbGRyZW4iLCJjb21wdXRlZElucHV0Q29tcCIsImNvbnNvbGUiLCJpbnB1dCIsImlzQXN5bmNDb21wb25lbnQiLCJpbnB1dENvbXAiLCJyZXNvbHZlQ29tcG9uZW50IiwiY2hpbGRyZW5SZW5kZXJlZCIsImdldFRhcmdldFJlZiIsImdldFRhcmdldFJlZkFzeW5jIiwiZ2V0VGFyZ2V0UmVmU3luYyIsIlByb21pc2UiLCJnZXRUYXJnZXRSZWZEZWxheSIsImNvdW50Iiwic2V0VGltZW91dCIsIkVycm9yIiwibWVyZ2VkIiwibWVyZ2VQcm9wcyIsImZ1bmN0aW9uYWwiLCJyZW5kZXJGdW5jIiwiX3NmY19tYWluJHUiLCJjcmVhdGVJbml0aWFsRm9ybSIsImRlZlZhbHVlIiwiaW5pdGlhbEZvcm0iLCJzZXRGb3JtRGF0YSIsImdldENvbXBvbmVudFJlZiIsImNvbXB1dGVkQ29sdW1ucyIsImRvVmFsdWVCdWlsZGVyIiwiZ2V0Rm9ybURhdGEiLCJ2YWx1ZUNoYW5nZSIsImRvVmFsdWVDaGFuZ2UiLCJtZXJnZUNvbCIsImJ1aWxkSXRlbVNjb3BlIiwiZm9ybUl0ZW1SZWZzIiwiZ2V0Rm9ybUl0ZW1SZWYiLCJncm91cEFjdGl2ZUtleSIsImdyb3VwSXRlbSIsImNvbXB1dGVkR3JvdXAiLCJncm91cCIsImdyb3VwZWRLZXlzIiwid3JhcHBlciIsImNvbXB1dGVkRGVmYXVsdENvbHVtbnMiLCJnZXRGb3JtUmVmIiwiZW50cmllc1JldCIsImVudHJpZXMiLCJpbml0aWFsVmFsdWUiLCJ1bnNldCIsInZhbGlkUmVmIiwiZXJyb3JzUmVmIiwiZmlsbEdyb3VwRXJyb3IiLCJmaWVsZEVycm9ycyIsInZhbGlkYXRlIiwidmFsaWRhdGVTY29wZSIsInZhbGlkYXRlRXJyb3JzIiwic3VibWl0U2NvcGUiLCJmb3JtSXRlbVNob3ciLCJncm91cEl0ZW1TaG93IiwibmV3VmFsIiwiaXNEaXJ0eSIsImFmdGVyIiwibWVyZ2VkU2xvdHMiLCJkaXNwbGF5IiwiX0ZyYWdtZW50IiwiX3JlbmRlckxpc3QiLCJoZWxwZXIiLCJncm91cEtleSIsIl9jcmVhdGVTbG90cyIsIl9jb21wb25lbnRfZnNfZm9ybV9pdGVtX2NvbCIsInNsb3ROYW1lIiwiX2NvbXBvbmVudF9mc19yZW5kZXIiLCJfc2ZjX21haW4kdCIsIkZzUmVuZGVyIiwiY29tcG9uZW50UmVuZGVyUmVmIiwic2NvcGVGdW5jIiwidXBkYXRlTW9kZWxWYWx1ZSIsImNvbXB1dGVkSXRlbSIsImNvbXB1dGVkSGVscGVyUG9zaXRpb24iLCJjb21wdXRlZEhlbHBlclRvb2x0aXAiLCJjb21wdXRlZEtleSIsImNvbXB1dGVkTGFiZWwiLCJjb21wdXRlZExhYmVsSXNSZW5kZXIiLCJfY29tcG9uZW50X2ZzX2NvbXBvbmVudF9yZW5kZXIiLCJfbm9ybWFsaXplUHJvcHMiLCJfaG9pc3RlZF82IiwiZm9ybVNsb3QiLCJfaG9pc3RlZF83IiwiX2NvbXBvbmVudF9mc19zbG90X3JlbmRlciIsIl9jb21wb25lbnRfZnNfZm9ybV9oZWxwZXIiLCJ1c2VBdHRycyIsImZvcm1JdGVtUmVmIiwiX19leHBvc2UiLCJfY29tcG9uZW50X2ZzX2Zvcm1faXRlbSIsIl9zZmNfbWFpbiRyIiwiaW5uZXIiLCJpbm5lcldyYXBwZXIiLCJ6SW5kZXgiLCJmb3JtV3JhcHBlck9wZW4iLCJmb3JtV3JhcHBlcklzIiwiZm9ybVdyYXBwZXJCaW5kIiwiZm9ybVdyYXBwZXJPcHRzIiwiZW1pdE9uQ2xvc2VkIiwiZW1pdE9uT3BlbmVkIiwiYmVmb3JlQ2xvc2VDdXN0b20iLCJmb3JtV3JhcHBlcklkIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwiZm9ybVdyYXBwZXJJZENsYXNzIiwiZm9ybVdyYXBwZXJTbG90cyIsImJ1aWxkRXZlbnQiLCJjbG9zZSIsIm9uQ2xvc2VkIiwib25PcGVuZWQiLCJvcGVuIiwiZnVsbHNjcmVlbkVuYWJsZWQiLCJmdWxsc2NyZWVuIiwiY29tcHV0ZWRCdXR0b25zIiwib25WYWx1ZUNoYW5nZSIsImlubmVyQmluZCIsIndyYXBwZXJCaW5kUmVmIiwiZm9ybU9wdGlvbnNSZWYiLCJ0b2dnbGVGdWxsc2NyZWVuIiwib25PcGVuIiwiaXMiLCJjdXN0b21DbGFzc0tleSIsImZvcm1XcmFwcGVyIiwiY3VzdG9tQ2xhc3MiLCJiZWZvcmVDbG9zZSIsImRvU2F2ZVJlbWluZCIsInNhdmVSZW1pbmQiLCJuZWVkU2F2ZSIsIm1lc3NhZ2VCb3giLCJjb25maXJtIiwiY29uZmlybUJ1dHRvblRleHQiLCJjYW5jZWxCdXR0b25UZXh0Iiwicm91dGUiLCJ1c2VSb3V0ZSIsImRyYWZ0U3RvcmUiLCJnZXREcmFmdFN0b3JlIiwic2F2ZURyYWZ0IiwiJHJvdXRlciIsImRvU2F2ZURyYWZ0IiwidXBkYXRlVGFibGVWYWx1ZSIsImNsZWFyRHJhZnQiLCJjbGVhclRhYmxlVmFsdWUiLCJsb2FkRHJhZnQiLCJkcmFmdCIsImdldFRhYmxlVmFsdWUiLCJtZXJnZUZvcm0iLCJzYXZlZERyYWZ0IiwiZWxlbWVudEJlZm9yZUNsb3NlRml4IiwiZG9uZSIsImRyYWdnYWJsZSIsImRyYWdlbmFibGVkIiwiZ2V0TW9kYWwiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJnZXRDb21wdXRlQ29udGV4dCIsImNvbXB1dGVkQ3VzdG9tQnV0dG9ucyIsImRlZkJ0bnMiLCJjYW5jZWwiLCJvayIsImJ1dHRvbnNBcnIiLCJjbGljayIsImV4cG9zZWQiLCJlbmRzV2l0aCIsImJ1aWxkSW5uZXJCaW5kIiwiZ2V0SW5uZXJXcmFwcGVyIiwiaW5uZXJDb250YWluZXJTZWxlY3RvciIsImNsYXNzTGlzdCIsImFkZCIsInVzZVNsb3RzIiwiX3Nsb3RzIiwic2xvdHNSZW5kZXIiLCJfc2VsZiIsInRpdGxlU2xvdE5hbWUiLCJmdWxsU2NyZWVuSWNvbiIsImljb25zIiwiZnVsbFNjcmVlbiIsInVuRnVsbFNjcmVlbiIsInNob3ciLCJfd2l0aERpcmVjdGl2ZXMiLCJfcmVzb2x2ZURpcmVjdGl2ZSIsImZvb3RlclByb3BzIiwiaGFzQ29udGVudFdyYXAiLCJjb250ZW50V3JhcCIsInN1YkNoaWxkcmVuIiwiY29udGVudFdyYXBDb21wIiwiY29udGVudFByb3BzIiwidmlzaWJsZSIsInZDbG9zZWQiLCJidWlsZE9uQ2xvc2VkQmluZCIsInZDdXN0b21DbGFzcyIsInZGdWxsU2NyZWVuIiwidlN0eWxlIiwiZm9ybVdyYXBwZXJDb21wIiwiZm9ybVdyYXBwZXJMaXN0IiwiZm9ybVdyYXBwZXJDb250ZXh0IiwibGF5b3V0U2xvdE5hbWVzIiwibm9ybWFsaXplQ3J1ZFNsb3RzIiwibm9ybWFsaXplZFNsb3RzIiwibm9ybWFsaXplZEtleSIsIm1lcmdlQ3J1ZFNsb3RzIiwiY29uZmlndXJlZFNsb3RzIiwidGVtcGxhdGVTbG90cyIsImZpbHRlckNydWRTbG90cyIsImtleVByZWZpeCIsImZpbHRlcmVkU2xvdHMiLCJ1c2VQcm92aWRlcnMiLCJzZWFyY2hSZWYiLCJnZXRTZWFyY2hSZWYiLCJnZXRTZWFyY2hGb3JtRGF0YSIsImdldFNlYXJjaFZhbGlkYXRlZEZvcm1EYXRhIiwic2V0U2VhcmNoRm9ybURhdGEiLCJzZWFyY2hSZXQiLCJkZWZhdWx0VGFicyIsIl9nIiwiX2YiLCJ1c2VGaXhlZEhlaWdodCIsImNvbnRhaW5lclJlZiIsIm1heEhlaWdodFJlZiIsImNvbXB1dGVCb2R5SGVpZ2h0IiwidGFibGVEb20iLCJoZWFkRG9tIiwidGFibGVIZWlnaHQiLCJoZWFkSGVpZ2h0IiwidXRpbExvZyIsIndhdGNoQm9keUhlaWdodENoYW5nZSIsInRhYmxlV3JhcHBlckRvbSIsInRvb2xiYXJSZWYiLCJ0YWJsZVByb3BSZWYiLCJ0b1JlZiIsImNvbXB1dGVkVGFibGUiLCJmaXhlZEhlaWdodCIsImNvbXB1dGVkVG9vbGJhciIsImNvbXB1dGVkQ2VsbFNsb3RzIiwiY29tcHV0ZWRGb3JtU2xvdHMiLCJjb21wdXRlZFNlYXJjaFNsb3RzIiwiY29tcHV0ZWRUb29sYmFyU2xvdHMiLCJjb21wdXRlZENsYXNzIiwiY2xhenoiLCJpbm5lcldyYXBwZXJSZWYiLCJpc0Zvcm1Jbm5lciIsIl9zZmNfbWFpbiRwIiwidGFicyIsIl9jb21wb25lbnRfZnNfYWN0aW9uYmFyIiwiX2d1YXJkUmVhY3RpdmVQcm9wcyIsIl9jb21wb25lbnRfZnNfdGFic19maWx0ZXIiLCJ0YWJzQmluZGluZyIsIl9jb21wb25lbnRfZnNfdGFibGUiLCJfc2ZjX21haW4kbyIsInNjb3BlUmVmIiwiZG9DbGljayIsInBpY2tlZFByb3BzIiwiY29tcHV0ZVByb3BzIiwiY29tcHV0ZWRIYW5kbGVCdG5zIiwibWVyZ2VkQnRucyIsImJ0bnMiLCJjb21wdXRlZERyb3Bkb3duQXRMZWFzdCIsImlzRHJvcGRvd25CdG4iLCJoYXNEcm9wZG93bkJ0biIsImRvRHJvcGRvd25JdGVtQ2xpY2siLCJidG4iLCJjb21wdXRlZERyb3Bkb3duQmluZGluZyIsImJpbmRpbmciLCJfY29tcG9uZW50X2ZzX2J1dHRvbiIsIl9leHRlbmRzIiwic291cmNlIiwiX2luaGVyaXRzTG9vc2UiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJfc2V0UHJvdG90eXBlT2YiLCJfZ2V0UHJvdG90eXBlT2YiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiX2NvbnN0cnVjdCIsIlBhcmVudCIsIkNsYXNzIiwiQ29uc3RydWN0b3IiLCJfaXNOYXRpdmVGdW5jdGlvbiIsIl93cmFwTmF0aXZlU3VwZXIiLCJXcmFwcGVyIiwiZm9ybWF0UmVnRXhwIiwid2FybmluZyIsImVycm9ycyIsImNvbnZlcnRGaWVsZHNFcnJvciIsImZpZWxkcyIsInRlbXBsYXRlIiwiX2xlbiIsIl9rZXkiLCJsZW4iLCJzdHIiLCJ4IiwiaXNOYXRpdmVTdHJpbmdUeXBlIiwiaXNFbXB0eVZhbHVlIiwiYXN5bmNQYXJhbGxlbEFycmF5IiwiZnVuYyIsInJlc3VsdHMiLCJhcnJMZW5ndGgiLCJhc3luY1NlcmlhbEFycmF5IiwibmV4dCIsImZsYXR0ZW5PYmpBcnIiLCJvYmpBcnIiLCJBc3luY1ZhbGlkYXRpb25FcnJvciIsIl9FcnJvciIsIl90aGlzIiwiYXN5bmNNYXAiLCJfcGVuZGluZyIsImZsYXR0ZW5BcnIiLCJmaXJzdEZpZWxkcyIsIm9iakFycktleXMiLCJvYmpBcnJMZW5ndGgiLCJwZW5kaW5nIiwiaXNFcnJvck9iaiIsImNvbXBsZW1lbnRFcnJvciIsIm9lIiwiZmllbGRWYWx1ZSIsImRlZXBNZXJnZSIsInJlcXVpcmVkJDEiLCJ3aGl0ZXNwYWNlIiwidXJsUmVnIiwiZ2V0VXJsUmVnZXgiLCJ3b3JkIiwidjQiLCJ2NnNlZyIsInY2IiwidjQ2RXhhY3QiLCJ2NGV4YWN0IiwidjZleGFjdCIsImlwIiwicHJvdG9jb2wiLCJhdXRoIiwiaXB2NCIsImlwdjYiLCJob3N0IiwiZG9tYWluIiwidGxkIiwicG9ydCIsInJlZ2V4IiwicGF0dGVybiQyIiwidHlwZSQxIiwiY3VzdG9tIiwicnVsZVR5cGUiLCJyYW5nZSIsIm1pbiIsInNwUmVnZXhwIiwibnVtIiwiRU5VTSQxIiwiZW51bWVyYWJsZSQxIiwicGF0dGVybiQxIiwiX3BhdHRlcm4iLCJzdHJpbmciLCJtZXRob2QiLCJfYm9vbGVhbiIsInJlZ2V4cCIsImludGVnZXIiLCJmbG9hdEZuIiwiYXJyYXkiLCJvYmplY3QiLCJFTlVNIiwiZW51bWVyYWJsZSIsInBhdHRlcm4iLCJkYXRlT2JqZWN0IiwiYW55IiwidmFsaWRhdG9ycyIsIm5ld01lc3NhZ2VzIiwiY2xvbmVkIiwibWVzc2FnZXMiLCJTY2hlbWEiLCJkZXNjcmlwdG9yIiwiX3Byb3RvIiwiX21lc3NhZ2VzIiwic291cmNlXyIsIm9jIiwiX3RoaXMyIiwiY29tcGxldGUiLCJfZXJyb3JzIiwibWVzc2FnZXMkMSIsInNlcmllcyIsInoiLCJlcnJvckZpZWxkcyIsImRvSXQiLCJkZWVwIiwiYWRkRnVsbEZpZWxkIiwic2NoZW1hIiwiZXJyb3JMaXN0IiwiZmlsbGVkRXJyb3JzIiwiZmllbGRzU2NoZW1hIiwicGFyZWRGaWVsZHNTY2hlbWEiLCJmaWVsZFNjaGVtYSIsImZpZWxkU2NoZW1hTGlzdCIsImVycnMiLCJmaW5hbEVycm9ycyIsIm1lc3NhZ2VJbmRleCIsInZhbGlkYXRvciIsImNyZWF0ZVZhbGlkYXRvciIsImVkaXRhYmxlQ2VsbHMiLCJjdXJEZXNjIiwiZWFjaFRyZWUiLCJ1c2VUYWJsZURhdGEiLCJnZXREYXRhIiwidGFibGVEYXRhIiwiZWRpdGFibGVSb3dzIiwiZ2V0SWRGcm9tUm93IiwiZ2V0RWRpdGFibGVJZEZyb21Sb3ciLCJlZGl0YWJsZUVhY2hSb3dzIiwiY2VsbHMiLCJlZGl0YWJsZUVhY2hDZWxscyIsImNlbGwiLCJjcmVhdGVFZGl0YWJsZUNlbGwiLCJ0YWJsZVJvdyIsInNldFZhbHVlIiwidXBkYXRlQ2VsbCIsInNob3dBY3Rpb24iLCJlbmFibGVkIiwiZm9ybUl0ZW0iLCJzZXREZWZhdWx0VmFsdWUiLCJyb3dLZXlWYWx1ZSIsImNyZWF0ZUVkaXRhYmxlUm93IiwiZG9TYXZlIiwibmV3Um93Iiwic2F2ZVJvdyIsInAzIiwiY2hpbGQiLCJuZXh0RWRpdGFibGVJZCIsImVkaXRhYmxlSWRHZW4iLCJzZXR1cEVkaXRhYmxlIiwidG1wUm93cyIsImZvck93biIsImJ1aWxkVGhpbkRhdGEiLCJ0aGluRGF0YSIsInRoaW5Sb3ciLCJvbGRUaGluRGF0YSIsImdldEVkaXRhYmxlQ2VsbCIsImFjdGl2ZSIsImluYWN0aXZlIiwic2F2ZUVhY2giLCJjYW5jZWxBbGwiLCJwZXJzaXN0IiwicmVzdW1lIiwiaGFzRGlydHkiLCJkaXJ0eSIsImFkZEluZGV4Iiwic2V0RGVmYXVsdEZvcm0iLCJmb3JtQ29sdW1uQ29uZmlncyIsImFkZFJvdyIsImdldEVkaXRhYmxlUm93IiwicmVtb3ZlVGFibGVSb3dCeUVkaXRhYmxlSWQiLCJyZW1vdmVSb3ciLCJhY3RpdmVDb2xzIiwiY29scyIsImdldEFjdGl2ZVJvd3MiLCJyb3dzIiwiaGFzRXJyb3IiLCJyZW1vdmVEYXRhRWRpdGFibGVJZCIsImdldENsZWFuVGFibGVEYXRhIiwidXNlQ29tcG9uZW50UmVmUHJvdmlkZXIiLCJjb21wb25lbnRzUmVmIiwiZ2V0dGVyIiwic2V0dGVyIiwiY29uZGl0aW9uYWxSZW5kZXIiLCJjb21wdXRlZENvbXBvbmVudCIsImNvbXB1dGVkUHJvcHNDb21wb25lbnQiLCJjb21wdXRlZFRpdGxlIiwic2hvd1RpdGxlIiwiY29tcHV0ZWRDZWxsQ29udGVudFJlbmRlciIsInNsb3QiLCJsYXN0UmVuZGVyIiwiY2VsbENvbnRlbnRSZW5kZXIiLCJtYXRjaCIsImZvcm1hdHRlciIsImNlbGxSZW5kZXIiLCJGc0NvbXBvbmVudFJlbmRlciIsInRvb2x0aXBQcm9wcyIsInRvb2x0aXBTbG90cyIsImNvbnRlbnQiLCJjb2x1bW5LZXkiLCJlZGl0YWJsZUNlbGwiLCJyZWFkb25seSIsImNvbXB1dGVkRm9ybSIsImdldEZvcm1SZWZGdW5jIiwiZ2V0Rm9ybSIsImNvbXB1dGVkSXNFZGl0YWJsZSIsImVkaXRpbmdVcGRhdGUiLCJvblN1Ym1pdCIsInNhdmUiLCJvbkNhbmNlbCIsImlzQ2hhbmdlZCIsImVkaXQiLCJpbnB1dENvbXBvbmVudCIsImlzRWRpdGluZyIsImFjdGl2ZVRyaWdnZXIiLCJzdWJtaXRPbkVudGVyIiwibWV0aG9kcyIsIiRyZWZzIiwidGFyZ2V0SW5wdXRSZWYiLCJidWlsZFRhYmxlU2xvdHMiLCJzb3J0ZWRDb2x1bW5zIiwicmVuZGVyUm93SGFuZGxlIiwicmVuZGVyQ2VsbENvbXBvbmVudCIsInJlbmRlckNvbnRleHQiLCJjb21wb25lbnREZWZpbmVzIiwidGFibGVDb21wIiwidGFibGVDb2x1bW5Db21wIiwidGFibGVDb2x1bW5Hcm91cENvbXAiLCJ0YWJsZVNsb3RzIiwiYnVpbGRDb2x1bW4iLCJjZWxsU2xvdHMiLCJjb2x1bW5TbG90cyIsImNlbGxTbG90TmFtZSIsImN1cnJlbnRUYWJsZUNvbHVtbkNvbXAiLCJzdWJDb2x1bW5zIiwic3ViQ29sdW1uIiwid2l0aEN0eCIsIm5ld0l0ZW0iLCJyb3dIYW5kbGVTbG90cyIsInRhYmxlVmVyc2lvbiIsInRhYmxlVjIiLCJfcGFyZW50IiwiZGF0YUluZGV4IiwiY2hpbGRPcHRpb25zIiwiY3VzdG9tUmVuZGVyIiwicmVuZGVyTWV0aG9kIiwibmV3Q29sIiwicmVidWlsZFJlbmRlclNjb3BlIiwiY29tcG9uZW50UmVmcyIsImNlbGxSZWYiLCJjdXJyZW50UmVmIiwidGFibGVDb2x1bW5DSSIsInRhYmxlQ29sdW1uVjIiLCJzY3JvbGxUbyIsInRvcCIsImVkaXRhYmxlV3JhcCIsIm9uUm93SGFuZGxlIiwib25DaGFuZ2UiLCJvblNvcnRDaGFuZ2UiLCJzb3J0ZXIiLCJvbkZpbHRlckNoYW5nZSIsImZpbHRlcnMiLCJvblBhZ2luYXRpb24iLCJidWJibGVVcCIsInJvd0hhbmRsZVNsb3RzTmFtZSIsIkZzUm93SGFuZGxlIiwibmV3U2NvcGUiLCJzZXRSZWYiLCJyb3dSZWZzIiwiRnNFZGl0YWJsZUNlbGwiLCJGc0NlbGwiLCJyZW5kZXJNb2RlIiwiZGF0YVNvdXJjZSIsImNvbXB1dGVkQmluZGluZyIsInRhYmxlQ29sdW1uR3JvdXAiLCJjb21wdXRlZFRhYmxlU2xvdHMiLCJ0YWJsZVJlbmRlciIsInZMb2FkaW5nIiwicmVzb2x2ZURpcmVjdGl2ZSIsIndpdGhEaXJlY3RpdmVzIiwiY29tcHV0ZWRGbGF0Q29sdW1ucyIsImZsYXRDb2x1bW5zIiwiZmxhdENvbHVtbnNGbiIsImNvbXB1dGVkTXVsdGlIZWFkZXJzIiwiYnVpbGRNdWx0aUhlYWRlcnNCaW5kIiwidHJlZUNvbHVtbnMiLCJiaW5kIiwiaXNGbGF0IiwiY29sdW1uc0lzRmxhdCIsImNyZWF0ZVRhYmxlSW5zdGFuY2UiLCJfX2VtaXQiLCJzaG93U3VibWl0QWN0aW9uIiwic2hvd0NhbmNlbEFjdGlvbiIsImRvU3VibWl0IiwiZG9DYW5jZWwiLCJvbktleWRvd24iLCJnZXRWYWxpZGF0ZUVycm9yTWVzc2FnZSIsIl9zZmNfbWFpbiRtIiwic29ydEFyciIsInNvcnRlZEJ1dHRvbnMiLCJTZXRGb3JtRGF0YU9wdGlvbnMiLCJDb2x1bW5zRmlsdGVyUHJvdmlkZUtleSIsInRyYW5zZm9ybUNvbHVtbnNUcmVlIiwiY3VycmVudENvbHVtbnMiLCJvcmlnaW5hbENvbHVtbnNNYXAiLCJfdGV4dCIsIl9fa2V5cyIsImJ1aWxkQ29sdW1uRmlsdGVySXRlbSIsInRyYW5zZm9ybVRvVGFibGVDb2x1bW5zIiwic2V0Q3VycmVudFZhbHVlIiwiZG9fc2F2ZSIsImNsZWFyVGhpc1N0b3JhZ2UiLCJub1NhdmUiLCJzYXZlT3B0aW9uc1RvU3RvcmFnZSIsImRvRW1pdCIsImNvbXB1dGVkT3JpZ2luYWxDb2x1bW5zIiwic2ltcGxlU3VibWl0Iiwic2ltcGxlUmVzZXQiLCJzdG9yYWdlVGFibGVTdG9yZSIsImdldFN0b3JhZ2VUYWJsZSIsInJlbW90ZVN0b3JhZ2UiLCJzdG9yZWRPcHRpb25zIiwiZ2V0T3B0aW9uc0Zyb21TdG9yYWdlIiwiZ2V0Q29sdW1uc0hhc2giLCJoYXNoIiwiaW5pdCIsInN0b3JlSGFzaCIsInVwZGF0ZSIsImNoYW5nZSIsImJ1aWxkVGV4dCIsImVsZW1lbnQiLCJfdlNob3ciLCJfc2ZjX21haW4kayIsIkZzVGFibGVDb2x1bW5zRmlsdGVyIiwiY29sdW1uc0ZpbHRlclJlZiIsImRlZmF1bHRCdXR0b25zIiwiZGVmYXVsdEJ1dHRvbnNLZXkiLCJwb3BvdmVyVmlzaWJsZSIsInN0b3JhZ2UiLCJvd25LZXlzIiwiZW51bWVyYWJsZU9ubHkiLCJzeW1ib2xzIiwic3ltIiwiX29iamVjdFNwcmVhZDIiLCJfZGVmaW5lUHJvcGVydHkiLCJfdHlwZW9mIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJleGNsdWRlZCIsInNvdXJjZUtleXMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJzb3VyY2VTeW1ib2xLZXlzIiwidmVyc2lvbiIsInVzZXJBZ2VudCIsIklFMTFPckxlc3MiLCJFZGdlIiwiRmlyZUZveCIsIlNhZmFyaSIsIklPUyIsIkNocm9tZUZvckFuZHJvaWQiLCJjYXB0dXJlTW9kZSIsIm9mZiIsIm1hdGNoZXMiLCJzZWxlY3RvciIsImdldFBhcmVudE9ySG9zdCIsImNsb3Nlc3QiLCJpbmNsdWRlQ1RYIiwiUl9TUEFDRSIsInRvZ2dsZUNsYXNzIiwic3RhdGUiLCJjc3MiLCJtYXRyaXgiLCJzZWxmT25seSIsImFwcGxpZWRUcmFuc2Zvcm1zIiwibWF0cml4Rm4iLCJmaW5kIiwidGFnTmFtZSIsIml0ZXJhdG9yIiwiZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCIsInNjcm9sbGluZ0VsZW1lbnQiLCJnZXRSZWN0IiwicmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jayIsInJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQiLCJ1bmRvU2NhbGUiLCJlbFJlY3QiLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiLCJjb250YWluZXJSZWN0IiwiZWxNYXRyaXgiLCJzY2FsZVgiLCJzY2FsZVkiLCJpc1Njcm9sbGVkUGFzdCIsImVsU2lkZSIsInBhcmVudFNpZGUiLCJnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudCIsImVsU2lkZVZhbCIsInBhcmVudFNpZGVWYWwiLCJnZXRDaGlsZCIsImNoaWxkTnVtIiwiaW5jbHVkZURyYWdFbCIsImN1cnJlbnRDaGlsZCIsIlNvcnRhYmxlIiwibGFzdENoaWxkIiwibGFzdCIsImdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0Iiwib2Zmc2V0TGVmdCIsIm9mZnNldFRvcCIsIndpblNjcm9sbGVyIiwiaW5kZXhPZk9iamVjdCIsImluY2x1ZGVTZWxmIiwiZWxlbSIsImdvdFNlbGYiLCJlbGVtQ1NTIiwiZXh0ZW5kIiwiZHN0Iiwic3JjIiwiaXNSZWN0RXF1YWwiLCJyZWN0MSIsInJlY3QyIiwiX3Rocm90dGxlVGltZW91dCIsInRocm90dGxlIiwibXMiLCJjYW5jZWxUaHJvdHRsZSIsInNjcm9sbEJ5IiwieSIsIlBvbHltZXIiLCIkIiwiZXhwYW5kbyIsIkFuaW1hdGlvblN0YXRlTWFuYWdlciIsImFuaW1hdGlvblN0YXRlcyIsImFuaW1hdGlvbkNhbGxiYWNrSWQiLCJmcm9tUmVjdCIsImNoaWxkTWF0cml4IiwiYW5pbWF0aW5nIiwiYW5pbWF0aW9uVGltZSIsInRpbWUiLCJ0b1JlY3QiLCJwcmV2RnJvbVJlY3QiLCJwcmV2VG9SZWN0IiwiYW5pbWF0aW5nUmVjdCIsInRhcmdldE1hdHJpeCIsImNhbGN1bGF0ZVJlYWxUaW1lIiwiY3VycmVudFJlY3QiLCJkdXJhdGlvbiIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwicmVwYWludCIsImRlZmF1bHRzIiwiUGx1Z2luTWFuYWdlciIsImV2dCIsImV2ZW50TmFtZUdsb2JhbCIsInBsdWdpbk5hbWUiLCJpbml0aWFsaXplZCIsIm1vZGlmaWVkIiwiZXZlbnRQcm9wZXJ0aWVzIiwibW9kaWZpZWRWYWx1ZSIsImRpc3BhdGNoRXZlbnQiLCJfcmVmIiwicm9vdEVsIiwidGFyZ2V0RWwiLCJjbG9uZUVsIiwidG9FbCIsImZyb21FbCIsIm9sZEluZGV4IiwibmV3SW5kZXgiLCJvbGREcmFnZ2FibGVJbmRleCIsIm5ld0RyYWdnYWJsZUluZGV4Iiwib3JpZ2luYWxFdmVudCIsInB1dFNvcnRhYmxlIiwiZXh0cmFFdmVudFByb3BlcnRpZXMiLCJvbk5hbWUiLCJhbGxFdmVudFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJwbHVnaW5FdmVudCIsImRyYWdFbCIsInBhcmVudEVsIiwiZ2hvc3RFbCIsIm5leHRFbCIsImxhc3REb3duRWwiLCJjbG9uZUhpZGRlbiIsIm1vdmVkIiwiX2hpZGVHaG9zdEZvclRhcmdldCIsIl91bmhpZGVHaG9zdEZvclRhcmdldCIsIl9kaXNwYXRjaEV2ZW50IiwiYWN0aXZlR3JvdXAiLCJhd2FpdGluZ0RyYWdTdGFydGVkIiwiaWdub3JlTmV4dENsaWNrIiwic29ydGFibGVzIiwidGFwRXZ0IiwidG91Y2hFdnQiLCJsYXN0RHgiLCJsYXN0RHkiLCJ0YXBEaXN0YW5jZUxlZnQiLCJ0YXBEaXN0YW5jZVRvcCIsImxhc3RUYXJnZXQiLCJsYXN0RGlyZWN0aW9uIiwicGFzdEZpcnN0SW52ZXJ0VGhyZXNoIiwiaXNDaXJjdW1zdGFudGlhbEludmVydCIsInRhcmdldE1vdmVEaXN0YW5jZSIsImdob3N0UmVsYXRpdmVQYXJlbnQiLCJnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbCIsIl9zaWxlbnQiLCJzYXZlZElucHV0Q2hlY2tlZCIsImRvY3VtZW50RXhpc3RzIiwiUG9zaXRpb25HaG9zdEFic29sdXRlbHkiLCJDU1NGbG9hdFByb3BlcnR5Iiwic3VwcG9ydERyYWdnYWJsZSIsInN1cHBvcnRDc3NQb2ludGVyRXZlbnRzIiwiX2RldGVjdERpcmVjdGlvbiIsImVsQ1NTIiwiZWxXaWR0aCIsImNoaWxkMSIsImNoaWxkMiIsImZpcnN0Q2hpbGRDU1MiLCJzZWNvbmRDaGlsZENTUyIsImZpcnN0Q2hpbGRXaWR0aCIsInNlY29uZENoaWxkV2lkdGgiLCJ0b3VjaGluZ1NpZGVDaGlsZDIiLCJfZHJhZ0VsSW5Sb3dDb2x1bW4iLCJkcmFnUmVjdCIsInRhcmdldFJlY3QiLCJ2ZXJ0aWNhbCIsImRyYWdFbFMxT3BwIiwiZHJhZ0VsUzJPcHAiLCJkcmFnRWxPcHBMZW5ndGgiLCJ0YXJnZXRTMU9wcCIsInRhcmdldFMyT3BwIiwidGFyZ2V0T3BwTGVuZ3RoIiwiX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlIiwidGhyZXNob2xkIiwicmVjdCIsImluc2lkZUhvcml6b250YWxseSIsImluc2lkZVZlcnRpY2FsbHkiLCJfcHJlcGFyZUdyb3VwIiwidG9GbiIsInB1bGwiLCJ0byIsImZyb20iLCJzYW1lR3JvdXAiLCJvdGhlckdyb3VwIiwib3JpZ2luYWxHcm91cCIsIm5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50IiwibmVhcmVzdCIsIl9jaGVja091dHNpZGVUYXJnZXRFbCIsImRhdGFUcmFuc2ZlciIsInByZXZlbnRPbkZpbHRlciIsInRvdWNoIiwib3JpZ2luYWxUYXJnZXQiLCJmaWx0ZXIiLCJfc2F2ZUlucHV0Q2hlY2tlZFN0YXRlIiwiY3JpdGVyaWEiLCJvd25lckRvY3VtZW50IiwiZHJhZ1N0YXJ0Rm4iLCJfZGlzYWJsZURyYWdnYWJsZSIsIl9uZXh0VGljayIsImZhbGxiYWNrIiwiaW5zZXJ0ZWQiLCJmYWxsYmFja1RvbGVyYW5jZSIsImZhbGxiYWNrT2Zmc2V0IiwiZ2hvc3RNYXRyaXgiLCJyZWxhdGl2ZVNjcm9sbE9mZnNldCIsImR4IiwiZHkiLCJjc3NNYXRyaXgiLCJyZXZlcnQiLCJhY3RpdmVTb3J0YWJsZSIsImlzT3duZXIiLCJjYW5Tb3J0IiwiZnJvbVNvcnRhYmxlIiwiY29tcGxldGVkRmlyZWQiLCJkcmFnT3ZlckV2ZW50IiwiZXh0cmEiLCJjb21wbGV0ZWQiLCJfb25Nb3ZlIiwiY2FwdHVyZSIsImluc2VydGlvbiIsImVsTGFzdENoaWxkIiwiX2dob3N0SXNMYXN0IiwiX2dob3N0SXNGaXJzdCIsImZpcnN0Q2hpbGQiLCJkaXJlY3Rpb24iLCJ0YXJnZXRCZWZvcmVGaXJzdFN3YXAiLCJkaWZmZXJlbnRMZXZlbCIsImRpZmZlcmVudFJvd0NvbCIsInNpZGUxIiwic2Nyb2xsZWRQYXN0VG9wIiwic2Nyb2xsQmVmb3JlIiwiX2dldFN3YXBEaXJlY3Rpb24iLCJzaWJsaW5nIiwiZHJhZ0luZGV4IiwibmV4dFNpYmxpbmciLCJtb3ZlVmVjdG9yIiwiX3Vuc2lsZW50IiwiX2NhbmNlbE5leHRUaWNrIiwiX2dsb2JhbERyYWdPdmVyIiwiX2dlbmVyYXRlSWQiLCJ1c2VBbmltYXRpb24iLCJpdGVtcyIsIndpbGxJbnNlcnRBZnRlciIsIm9uTW92ZUZuIiwicmV0VmFsIiwic3BhY2VyIiwic3dhcFRocmVzaG9sZCIsImludmVydGVkU3dhcFRocmVzaG9sZCIsImludmVydFN3YXAiLCJpc0xhc3RUYXJnZXQiLCJtb3VzZU9uQXhpcyIsInRhcmdldExlbmd0aCIsInRhcmdldFMxIiwidGFyZ2V0UzIiLCJpbnZlcnQiLCJfZ2V0SW5zZXJ0RGlyZWN0aW9uIiwic3VtIiwicm9vdCIsImlucHV0cyIsImlkeCIsImF1dG9TY3JvbGxzIiwic2Nyb2xsRWwiLCJzY3JvbGxSb290RWwiLCJzY3JvbGxpbmciLCJsYXN0QXV0b1Njcm9sbFgiLCJsYXN0QXV0b1Njcm9sbFkiLCJ0b3VjaEV2dCQxIiwicG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwiLCJBdXRvU2Nyb2xsUGx1Z2luIiwiQXV0b1Njcm9sbCIsIl9yZWYyIiwiY2xlYXJQb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCIsImNsZWFyQXV0b1Njcm9sbHMiLCJhdXRvU2Nyb2xsIiwib2dFbGVtU2Nyb2xsZXIiLCJuZXdFbGVtIiwiaXNGYWxsYmFjayIsInNlbnMiLCJzcGVlZCIsInNjcm9sbFRoaXNJbnN0YW5jZSIsInNjcm9sbEN1c3RvbUZuIiwibGF5ZXJzT3V0IiwiY3VycmVudFBhcmVudCIsImNhblNjcm9sbFgiLCJjYW5TY3JvbGxZIiwic2Nyb2xsV2lkdGgiLCJzY3JvbGxIZWlnaHQiLCJzY3JvbGxQb3NYIiwic2Nyb2xsUG9zWSIsInZ4IiwidnkiLCJzY3JvbGxPZmZzZXRZIiwic2Nyb2xsT2Zmc2V0WCIsImRyb3AiLCJkaXNwYXRjaFNvcnRhYmxlRXZlbnQiLCJoaWRlR2hvc3RGb3JUYXJnZXQiLCJ1bmhpZGVHaG9zdEZvclRhcmdldCIsInRvU29ydGFibGUiLCJSZXZlcnQiLCJfcmVmMyIsIlJlbW92ZSIsIl9yZWY0IiwicGFyZW50U29ydGFibGUiLCJfX2RlZlByb3AiLCJfX2RlZlByb3BzIiwiX19nZXRPd25Qcm9wRGVzY3MiLCJfX2dldE93blByb3BTeW1ib2xzIiwiX19oYXNPd25Qcm9wIiwiX19wcm9wSXNFbnVtIiwiX19kZWZOb3JtYWxQcm9wIiwiX19zcHJlYWRWYWx1ZXMiLCJfX3NwcmVhZFByb3BzIiwicmVtb3ZlTm9kZSIsImluc2VydE5vZGVBdCIsImZhdGhlck5vZGUiLCJwb3NpdGlvbiIsInJlZk5vZGUiLCJnZXRDb25zb2xlIiwiY29uc29sZSQxIiwiY2FjaGUiLCJjYW1lbGl6ZSIsIm1hbmFnZUFuZEVtaXQkMSIsImVtaXQkMSIsIm1hbmFnZSQxIiwiZXZlbnRIYW5kbGVyTmFtZXMiLCJldmVudHMyIiwiaXNSZWFkT25seSIsInRhZ3MiLCJpc0h0bWxUYWciLCJpc1RyYW5zaXRpb24iLCJpc0h0bWxBdHRyaWJ1dGUiLCJwcm9qZWN0IiwiZ2V0Q29tcG9uZW50QXR0cmlidXRlcyIsIiRhdHRycyIsImNvbXBvbmVudERhdGEiLCJhdHRyaWJ1dGVzIiwiY3JlYXRlU29ydGFibGVPcHRpb24iLCJjYWxsQmFja0J1aWxkZXIiLCJnZXRWYWxpZFNvcnRhYmxlRW50cmllcyIsImV2ZW50VHlwZSIsImV2ZW50QnVpbGRlciIsInZhbHVlMiIsImdldEh0bWxFbGVtZW50RnJvbU5vZGUiLCJhZGRDb250ZXh0IiwiZG9tRWxlbWVudCIsImdldENvbnRleHQiLCJDb21wb25lbnRTdHJ1Y3R1cmUiLCJoZWFkZXIiLCJkZWZhdWx0Tm9kZXMiLCJmb290ZXIiLCJyZWFsTGlzdCIsImgyIiwidGFnIiwiX2lzUm9vdENvbXBvbmVudCIsImRvbUluZGV4IiwiZG9tQ2hpbGRyZW4iLCJmaXJzdERvbUxpc3RFbGVtZW50IiwiaW5kZXhGaXJzdERvbUxpc3RFbGVtZW50IiwiZWxlbWVudDIiLCJnZXRTbG90Iiwic2xvdFZhbHVlIiwiY29tcHV0ZU5vZGVzIiwiZ2V0S2V5Iiwibm9ybWFsaXplZExpc3QiLCJnZXRSb290SW5mb3JtYXRpb24iLCJ0cmFuc2l0aW9uIiwiZXh0ZXJuYWxDb21wb25lbnQiLCJUcmFuc2l0aW9uR3JvdXAiLCJjb21wdXRlQ29tcG9uZW50U3RydWN0dXJlIiwiZXZ0TmFtZSIsImV2dERhdGEiLCJtYW5hZ2UiLCJvcmlnaW5hbEVsZW1lbnQiLCJtYW5hZ2VBbmRFbWl0IiwiZGVsZWdhdGVDYWxsQmFjayIsImRyYWdnaW5nRWxlbWVudCIsImRyYWdnYWJsZUNvbXBvbmVudCIsImNvbXBvbmVudFN0cnVjdHVyZSIsIiRlbCIsInNvcnRhYmxlT3B0aW9ucyIsInRhcmdldERvbUVsZW1lbnQiLCJpdGVtS2V5IiwibmV3T3B0aW9uVmFsdWUiLCJfc29ydGFibGUiLCJodG1FbGVtZW50Iiwib25MaXN0IiwibmV3TGlzdCIsInNwbGljZUxpc3QiLCJ1cGRhdGVQb3NpdGlvbiIsInJlbGF0ZWQiLCJkZXN0aW5hdGlvbiIsImFkZGVkIiwicmVtb3ZlZCIsInJlbGF0ZWRDb250ZXh0IiwiY3VycmVudERvbUluZGV4IiwiY3VycmVudEluZGV4IiwibW92ZSIsImZ1dHVyZUluZGV4IiwiZHJhZ2dlZENvbnRleHQiLCJzZW5kRXZlbnQiLCJfc2ZjX21haW4kaiIsIm9uRHJhZ2dhYmxlTW92ZSIsImRyYWdlZCIsInNvcnRlZCIsImxlZnRJbmRleCIsInJpZ2h0SW5kZXgiLCJtaW5Ob3RJbmRleCIsIm1heE5vdEluZGV4IiwiYnVpbGRVcGRhdGVLZXkiLCJ1cGRhdGVDaGVja2VkIiwidXBkYXRlQ2hpbGRyZW4iLCJ1cGRhdGVQYXJlbnQiLCJvbkNoZWNrQ2hhbmdlZCIsImZpeGVkQ2hhbmdlIiwiRnNUYWJsZUNvbHVtbnNGaXhlZENvbnRyb2xsZXIiLCJfY29tcG9uZW50X2ZzX2NvbHVtbnNfZmlsdGVyX25lc3RfbGlzdCIsImRyYXdlckJpbmQiLCJjaGVja0FsbCIsIm9uQ2hlY2tBbGxDaGFuZ2UiLCJjaGVja0FsbEJpbmQiLCJzaG93TGVuZ3RoIiwiYWxsTGVuZ3RoIiwiaXNJbmRldGVybWluYXRlIiwiYWxsQ2hlY2tlZFVwZGF0ZSIsIkZzQ29sdW1uc0ZpbHRlck5lc3RMaXN0IiwiX3NmY19tYWluJGciLCJGc1NlYXJjaEJ1dHRvbnMiLCJ2YWxpZGF0ZWRGb3JtIiwic2VhcmNoQWZ0ZXJSZXNldCIsImF1dG9TZWFyY2giLCJkZWJvdW5jZSIsInZhbGlkYXRlT25DaGFuZ2UiLCJfY2VsbFJlbmRlciIsIm9uRm9ybVZhbGlkYXRlZCIsIkxvZGFzaEdldCIsInNwbGl0S2V5IiwiX29uVXBkYXRlTW9kZWxWYWx1ZSIsIm9uVmFsdWVDaGFuZ2VkIiwiX29uSW5wdXQiLCJvbklucHV0Iiwib25LZXl1cCIsImF1dG9TZWFyY2hUcmlnZ2VyIiwiZG9TZWFyY2giLCJkZWZhdWx0U2xvdCIsImJ1aWxkRmllbGRDb250ZXh0IiwiY29tcG9uZW50UmVuZGVyUmVmcyIsIm9uQ29tcG9zaXRpb25zdGFydCIsImNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCIsIm9uQ29tcG9zaXRpb25lbmQiLCJzcGxpdGVkS2V5IiwicnVsZVBhdGgiLCJzZWFyY2hGb3JtUmVmIiwiZ2V0Q29tcG9uZW50UmVuZGVyUmVmIiwiZG9SZXNldCIsImRvVmFsaWRhdGUiLCJzaWxlbnQiLCJ2YWxpZGF0ZVdyYXAiLCJkZWZCdG5PcHRpb25zIiwiX2NsaWNrIiwiaW5pdEF1dG9TZWFyY2giLCJ3YWl0IiwiZ2V0VmFsaWRhdGVkRm9ybSIsInNldEZvcm0iLCJuZXdGb3JtIiwiaW5wdXRFdmVudERpc2FibGVkIiwiZG9BdXRvU2VhcmNoIiwidmFsaWRhdGVPbkNoYW5nZVNpbGVudCIsImNvbXBvbmVudFJlZiIsInZhbHVlQ2hhbmdlQ29udGV4dCIsImltbWVkaWF0ZSIsImNvbXB1dGVkUnVsZXMiLCJfc2ZjX21haW4kZSIsImNvbXB1dGVkSXNNdWx0aUxpbmUiLCJjb2x1bW5zUm93UmVmIiwiY29sdW1uc0JveEhlaWdodFJlZiIsImNvbHVtbnNMaXN0IiwiY29sdW1uc0xpbmVIZWlnaHRSZWYiLCJzZWFyY2hFdmVudENvbnRleHRSZWYiLCJ0b2dnbGVDb2xsYXBzZSIsImNvbXB1dGVkQ29sTmFtZSIsImNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0IiwiX2NvbXBvbmVudF9mc19zZWFyY2hfYnV0dG9ucyIsImNvbGxhcHNlIiwiX3NmY19tYWluJGQiLCJjb2xsYXBzZUJ1dHRvbiIsImRlZmF1bHRPcHRpb24iLCJfX0RFRkFVTFRfXyIsIm9uVXBkYXRlQWN0aXZlS2V5IiwiZGVmYXVsdExpbWl0IiwiZGlhbG9nT3BlbmVkIiwiY29tcHV0ZWREaWFsb2ciLCJmb3JtSXRlbUNvbnRleHQiLCJpbnB1dEJpbmRpbmciLCJlbWl0Q2hhbmdlIiwiaGFuZGxlT3BlbiIsInBhZ2VyIiwib25UYWJDaGFuZ2UiLCJjdXJyZW50SWNvbiIsImN1cnJlbnRDb2xvciIsImFwaSIsImxpbWl0IiwiaWNvblN0b3JlIiwibG9hZEljb25TZXQiLCJzZXRzIiwidW5jYXRlZ29yaWVzIiwiY2F0ZWdvcmllcyIsInNlYXJjaEtleSIsInRhYktleSIsInJlc2V0UGFnZXIiLCJoYW5kbGVTZWFyY2giLCJnZXRQYWdlckZyb21JY29uU2V0IiwiZW5kIiwiaGFuZGxlSWNvblNlbGVjdCIsIm9uQ29uZmlybSIsImhhbmRsZUNvbG9yQ2hhbmdlIiwibG9hZE1vcmUiLCJjb21wdXRlVGFicyIsImNvbG9ySXRlbSIsIl9ob2lzdGVkXzgiLCJfaG9pc3RlZF85IiwiX2hvaXN0ZWRfMTEiLCJfY29tcG9uZW50X2ZzX2xvYWRpbmciLCJfaG9pc3RlZF8xMiIsIl9ob2lzdGVkXzEzIiwiX3NmY19tYWluJGEiLCJjb21wdXRlZFJhZGlvTmFtZSIsInVzZWREaWN0IiwiY29tcHV0ZWRPcHRpb25zIiwib3B0Iiwib3B0aW9uUHJvcHMiLCJzZWxlY3RSZWYiLCJjb21wdXRlZFBsYWNlaG9sZGVyIiwicGxhY2Vob2xkZXIiLCJmaWVsZE5hbWVzQmluZGVyIiwiZmllbGROYW1lcyIsIm9uU2VsZWN0ZWRDaGFuZ2UiLCJkYXRhTWFwIiwidGVtcFNsb3RzIiwiX3VzZVNsb3RzIiwic2VsZWN0Q29tcCIsIiRlbWl0IiwidGhpc1Nsb3RzIiwicmVuZGVyTGFiZWwiLCJvcHRpb25Db21wIiwiY29zIiwiZ2V0SGFzaENvZGUiLCJjaHIiLCJidWlsZEFycmF5VmFsdWUiLCJ2YWx1ZUFyciIsIl9zZmNfbWFpbiQ4IiwiQ09MT1JfTElTVCIsIkVGRkVDVF9MSVNUIiwiZ2V0Q29sb3IiLCJzZXRDb2xvciIsInR5cGVLZXkiLCJoYXNoY29kZSIsImNvbG9ycyIsImVmZmVjdHMiLCJjb21wdXRlZFZhbHVlSXRlbXMiLCJ2YWx1ZVByb3AiLCJsYWJlbFByb3AiLCJjb2xvcmZ1bE9wdGlvbnMiLCJ2aXNpYmxlVmFsdWVJdGVtcyIsImhpZGRlblZhbHVlQ291bnQiLCJuZXdWYWx1ZXMiLCJfc2ZjX21haW4kNyIsImNvbXB1dGVkTXVsdGlwbGUiLCJzdWIiLCJMYWJlbHMiLCJJbmRleCIsIl9zZmNfbWFpbiQ2IiwiY2FzY2FkZXJSZWYiLCJkaWN0VXNlUmV0Iiwib25TZWxlY3RDaGFuZ2UiLCJzZWxlY3RlZE9wdGlvbnMiLCJfc2ZjX21haW4kNSIsIl9zZmNfbWFpbiQ0IiwiX3NmY19tYWluJDMiLCJfc2ZjX21haW4kMiIsInRyZWVSZWYiLCJkaWN0U2VsZWN0UmVmIiwidmFsdWVzRm9ybWF0UmVmIiwiZGlhbG9nT3BlbiIsIm9uQ2xvc2UiLCJnZXRTY29wZUNvbnRleHQiLCJpbml0U2VsZWN0ZWRLZXlzIiwibXVsdGlwbGUiLCJ2YWx1ZVR5cGUiLCJmb3JtV3JhcHBlck9wdGlvbnMiLCJvcGVuVGFibGVTZWxlY3QiLCJvcGVuT3B0aW9ucyIsImNydWRPcHRpb25zT3ZlcnJpZGUiLCJidWlsZE1lcmdlZENydWRPcHRpb25zIiwiYmVmb3JlT3BlbiIsIndyYXBwZXJPcHRpb25zIiwidmlld01vZGUiLCJkaWFsb2ciLCJidWlsZEluaXRCaW5kIiwib25PayIsImNvbXB1dGVkVmFsdWVzRm9ybWF0IiwibWF4VmlzaWJsZSIsInZhbHVlc0Zvcm1hdCIsImNvbXB1dGVkU2VsZWN0IiwidXBkYXRlS2V5IiwiY2xlYXJhYmxlIiwiYnVpbGRNdWx0aUJpbmRpbmciLCJhcHBlbmRCeVZhbHVlcyIsInJlZnJlc2hpbmciLCJzZWxlY3Rpb25PcHRpb25zIiwiYnVpbGRTZWxlY3Rpb25DcnVkT3B0aW9ucyIsImNyb3NzUGFnZSIsInNlbGVjdE9uQ2xpY2tSb3ciLCJnZXRQYWdlRGF0YSIsIm9uU2VsZWN0ZWRLZXlzQ2hhbmdlZCIsIm9uUmVmcmVzaGVkIiwic2V0U2VsZWN0ZWRSb3dzIiwiZ2V0QmFzZVRhYmxlUmVmIiwiZ2V0RGljdE1hcCIsImVtaXRPblZpZXdNb2RlbCIsIm9wZW5lZCIsIl9jb21wb25lbnRfZnNfZGljdF9zZWxlY3QiLCJza2lwVmFsaWRhdGlvbldyYXBwZXIiLCJfY29tcG9uZW50X2ZzX2Zvcm1fd3JhcHBlciIsImRlc3Ryb3lPbkNsb3NlIiwiX2NvbXBvbmVudF9mc19jcnVkIiwic2hvd0N1cnJlbnQiLCJfY29tcG9uZW50X2ZzX3ZhbHVlc19mb3JtYXQiLCJjbG9zYWJsZSIsImRvVXBkYXRlIiwiX2NvbXBvbmVudF9mc190YWJsZV9zZWxlY3QiLCJGYXN0Q3J1ZCIsImN1c3RvbUNvbXBvbmVudHMiLCJjb20iLCJwcmludFdhcm5pbmdMb2dnZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxTQUFTQSxLQUFhOztBQUVwQixVQUFPQyxJQURHLElBQUksUUFDTCxVQUFGLGdCQUFBQSxFQUFTLE1BQU07QUFBQSxHQUFNO0FBQzlCO0FBRUEsTUFBTUMsS0FBUSxJQUFJQyxNQUFlO0FBQUE7QUFFakMsU0FBU0MsTUFBV0QsR0FBUztBQUczQixVQUFRLElBQU8sTUFBTSxNQUFNLFNBQVM7QUFDdEM7QUFDQSxTQUFTRSxNQUFXRixHQUFTO0FBR25CLFVBQUEsS0FBSyxNQUFNLE1BQU0sU0FBUztBQUNwQztBQUNBLFNBQVNHLE1BQVlILEdBQVM7QUFHcEIsVUFBQSxNQUFNLE1BQU0sTUFBTSxTQUFTO0FBQ3JDO0FBQ0EsTUFBTUksS0FBUSxJQUFJSixN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QSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFB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
|