var Xi = Object.defineProperty; var Qi = (e, t, n) => t in e ? Xi(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n; var ae = (e, t, n) => (Qi(e, typeof t != "symbol" ? t + "" : t, n), n), tr = (e, t, n) => { if (!t.has(e)) throw TypeError("Cannot " + n); }; var g = (e, t, n) => (tr(e, t, "read from private field"), n ? n.call(e) : t.get(e)), pe = (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) => (tr(e, t, "write to private field"), o ? o.call(e, n) : t.set(e, n), n); var bo = (e, t, n, o) => ({ set _(r) { fe(e, t, r, n); }, get _() { return g(e, t, o); } }), ee = (e, t, n) => (tr(e, t, "access private method"), n); import { uiContext as qe, useUi as we } from "@fast-crud/ui-interface"; import { computed as M, onRenderTriggered as Ji, defineAsyncComponent as Zi, defineComponent as le, ref as K, onMounted as _n, openBlock as w, createElementBlock as j, renderSlot as re, createCommentVNode as oe, createElementVNode as te, isRef as Mo, watch as it, isShallow as es, shallowReactive as Bo, createVNode as x, reactive as yn, shallowRef as ts, inject as jn, render as ns, toRaw as Ln, unref as q, nextTick as Be, getCurrentInstance as Go, normalizeStyle as to, resolveComponent as G, createBlock as I, withCtx as B, resolveDynamicComponent as H, isVNode as xr, h as vr, mergeProps as z, normalizeClass as St, createTextVNode as Vt, toDisplayString as We, provide as sn, markRaw as os, Fragment as be, renderList as Te, createSlots as Lr, normalizeProps as xe, useAttrs as Xo, useSlots as qr, toRef as la, guardReactiveProps as Lt, withModifiers as rs, resolveDirective as as, withDirectives as Hr, vShow as ja, TransitionGroup as is, toHandlerKey as ss, withKeys as ls } from "vue"; import { forEach as Y, camelCase as Na, upperFirst as us, merge as ho, isString as br, toPath as cs, identity as ds, cloneDeep as dt, get as st, mergeWith as fs, cloneDeepWith as hs, isArray as jo, set as tt, remove as xa, size as ms, sortBy as Cn, pick as La, includes as ps, each as bt, map as gs, omit as wn, entries as zr, unset as No, forOwn as vs, toString as bs, debounce as ys, keys as qa } from "lodash-es"; import et from "dayjs"; import { Icon as ws } from "@iconify/vue"; import { useRoute as Ha } from "vue-router"; const no = { commonOptions(e) { return {}; }, defaultOptions(e) { const { t } = e, n = (r) => M(() => t(r)), o = qe.get(); return { settings: { plugins: { mobile: { enabled: !0, props: { isMobile: M(() => window.innerWidth < 768) } } } }, mode: {}, status: {}, search: { container: { is: "fs-search-layout-default", collapse: !0, col: { span: 4 } }, formItem: { wrapperCol: { style: { // width: "50%" } } }, options: { ...o.form.inlineLayout, // n-form 是否显示校验反馈 showFeedback: !1 }, onValidateError({ trigger: r }) { r === "search" && o.notification.error({ message: t("fs.search.error.message") }); }, collapse: !0, show: !0, buttons: { search: { className: { "fs-search-btn-search": !0 }, icon: o.icons.search }, reset: { className: { "fs-search-btn-reset": !0 }, icon: o.icons.refresh } } }, form: { 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: o.dialog.name, ...o.formWrapper.buildWidthBind(o.dialog.name, "960px"), ...o.formWrapper.buildInitBind(o.dialog.name), dragenabled: !0, destroyOnClose: !0, ...o.dialog.footer(), buttons: { cancel: { text: n("fs.form.cancel"), order: 1, click: ({ doClose: r }) => { r(); } }, reset: { text: n("fs.form.reset"), order: 1, click: ({ reset: r }) => { r(); } }, ok: { text: n("fs.form.ok"), order: 1, type: "primary", click: async ({ submit: r }) => { await r(); } } } } }, addForm: { mode: "add", wrapper: { title: n("fs.addForm.title") } }, editForm: { mode: "edit", wrapper: { title: n("fs.editForm.title") } }, viewForm: { mode: "view", wrapper: { title: n("fs.viewForm.title"), buttons: { reset: { show: !1 }, cancel: { show: !1 } } } }, rowHandle: { width: 250, title: n("fs.rowHandle.title"), order: 1e3, dropdown: { // 操作列折叠 more: { text: null, type: "primary", icon: o.icons.more } } }, pagination: { background: !0, pageSize: 20, [o.pagination.currentPage]: 1, [o.pagination.total]: 1, pageSizes: [5, 10, 20, 50], layout: "total, sizes, prev, pager, next, jumper", showSizeChanger: !0, showQuickJumper: !0, showSizePicker: !0, showTotal: (r) => t("fs.pagination.showTotal", [r]) //antdv }, table: { show: !0, height: "100%", rowKey: o.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", text: n("fs.actionbar.add") } } } }; } }; function _s() { var t; return (t = new Error().stack) == null ? void 0 : t.split(` `)[3]; } const qt = (...e) => { }; function yr(...e) { console.log.apply(this, arguments); } function Cs(...e) { console.warn.apply(this, arguments); } function Ss(...e) { console.error.apply(this, arguments); } const Fs = (...e) => { Ss("%c [error]", "font-weight: 600;", ...e); }, Rs = (...e) => { Cs("%c [warn]", "font-weight: 600;", ...e); }, ua = (...e) => { yr("%c [info]", "font-weight: 600;", ...e); }, Ds = (...e) => { if (!console.log) return; const t = _s(); { const n = ["%c [debug]", "font-weight: 600;", ...e]; yr(...n); const o = ["%c " + t, "color:#999"]; yr(...o); } }, ce = { debug: qt, info: qt, warn: qt, error: qt, log: qt }; function ks(e = {}) { const t = (e == null ? void 0 : e.level) || "info"; switch (ce.debug = qt, ce.info = qt, ce.warn = qt, ce.error = qt, ce.log = qt, t) { case "debug": ce.debug = Ds; case "info": ce.info = ua, ce.log = ua; case "warn": ce.warn = Rs; case "error": ce.error = Fs; break; } } ks(); function $s(e) { return e == null || e === ""; } function Os(...e) { for (const t of e) if (!(t == null || t === "")) return !1; return !1; } function Es(...e) { for (const t of e) if (t == null || t === "") return !0; return !1; } const Wr = { isEmpty: $s, isAllEmpty: Os, hasEmpty: Es }; function Ts(e, t = !1) { t && Ji((n) => { n.key, n.target, n.type; }); } function Ur(e) { return Zi({ loader: e, onError(t, n, o, r) { console.error("load error", t), t.message.match(/fetch/) && r <= 3 ? n() : o(); } }); } function Is(e, t, n, o) { const r = Ur(n); e.component(t, r, o); } function As(e, t, n, o, r) { const a = mo(t, o, r); Y(a, (i, s) => { n && n.indexOf(s) != -1 || Is(e, s, i, null); }); } function Vs(e, t, n, o, r) { const a = mo(t, o, r); Y(a, (i, s) => { n && n.indexOf(s) || e.component(s, i.default); }); } function mo(e, t, n) { const o = {}; return t == null && (t = /.*\/(.+).(vue|jsx|tsx)/), Y(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 s = i[1]; s = Na(s), s = us(s), n && (r = n(r)), o[s] = r; }), o; } function Ps(e) { const t = mo(e), n = {}; return Y(t, (o, r) => { n[r] = Ur(o); }), n; } function Ms(e) { const t = mo(e), n = {}; return Y(t, (o, r) => { n[r] = o.default; }), n; } const Bs = { transformFromGlob: mo, installAsyncComponents: As, installSyncComponents: Vs, createAsyncComponent: Ur, loadAsyncComponentFromGlob: Ps, loadComponentFromGlob: Ms }; class Kr { constructor(t) { ae(this, "remoteStorage"); ae(this, "$router"); ae(this, "tableName"); ae(this, "keyType"); ae(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 js = /\D/, Ns = /^[a-zA-Z_$]+([\w_$]*)$/, xs = /"/g; function ca(...e) { return e.reduce((t, n) => t ? !n || n.startsWith("[") ? `${t}${n}` : `${t}.${n}` : n, ""); } function za(e) { function t(n, ...o) { if (o = o.filter((r) => r !== void 0), e.isString(n)) return ca(...o, n); if (Array.isArray(n)) return o = ca(...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 ? js.test(a) ? Ns.test(a) ? r ? `${r}.${a}` : `${r}${a}` : `${r}["${a.replace(xs, '\\"')}"]` : `${r}[${a}]` : `${r}[""]`; }, o); } return t; } za.notChainable = !0; const Ls = /^[a-zA-Z_$]+([\w_$]*)$/, qs = /"/g, Wa = Object.prototype.hasOwnProperty; function Hs(e) { const t = typeof e; return e != null && (t == "object" || t == "function"); } function zs(e) { const t = za(e); function n(a) { const { options: i, obj: s, callback: u } = a; i.pathFormatArray = i.pathFormat == "array", a.depth = 0; let l = !1; const c = () => (l = !0, !1); for (; a && !l; ) { if (!a.inited) { if (a.inited = !0, a.info = fa(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), v = fa(h, i.ownPropertiesOnly); v.isEmpty || a.children.push([d, i.strChildrenPath[f], h, v]); }), 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 da(s, i, c); d.setItem(a, !1); try { a.res = u(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 (l) break; a.res !== !1 && !l && !a.isCircular && a.info.isObject && (i.childrenPath !== void 0 && (a.depth || !i.rootIsChildren) ? (a.childrenItems = [], a.children.length && a.children.forEach(([d, f, h, v]) => { a.childrenItems = [ ...a.childrenItems, ...v.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 da(s, i, c); d.setItem(a, !0); try { u(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, s, u, l) { let c; s.pathFormatArray || (c = a.strPath || "", l && c && !l.startsWith("[") && (c += "."), c += l || ""); const d = []; for (let f = 0; f < i.length; f++) { const h = i[f]; if (h === void 0 && !(f in i)) continue; let v; const p = !s.pathFormatArray; p && (v = `${c}[${f}]`), d.push({ value: h, key: f + "", path: [...a.path || [], ...u, f + ""], strPath: v, depth: a.depth + 1, parent: { value: a.value, key: a.key, path: p ? a.strPath : a.path, parent: a.parent, depth: a.depth, info: a.info }, childrenPath: u.length && u || void 0, strChildrenPath: l || void 0 }); } return d; } function r(a, i, s, u, l) { let c; s.pathFormatArray || (c = a.strPath || "", l && c && !l.startsWith("[") && (c += "."), c += l || ""); const d = [], f = !s.pathFormatArray; for (const h in i) { if (s.ownPropertiesOnly && !Wa.call(i, h)) continue; let v; f && (Ls.test(h) ? c ? v = `${c}.${h}` : v = `${h}` : v = `${c}["${h.replace(qs, '\\"')}"]`), d.push({ value: i[h], key: h, path: [...a.path || [], ...u, h], strPath: v, 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: u.length && u || void 0, strChildrenPath: l || void 0 }); } return d; } } class da { constructor(t, n, o) { ae(this, "_item"); ae(this, "obj"); ae(this, "_options"); ae(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 Ws(e, t) { for (const n in e) if (!t || Wa.call(e, n)) return !1; return !0; } function fa(e, t) { const n = { isObject: Hs(e) }; return n.isArray = n.isObject && Array.isArray(e), n.isEmpty = n.isArray ? !e.length : n.isObject ? Ws(e, t) : !0, n; } function Us(e) { const t = zs(e); function n(o, r, a) { if (r === void 0 && (r = ds), a = ho({ 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)), !br(a.childrenPath) && !Array.isArray(a.childrenPath)) throw Error("childrenPath can be string or array"); br(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] = cs(a.strChildrenPath[i]); } return t({ value: o, callback: r, options: a, obj: o }), o; } return n; } const Ks = Us({ isString: br }), Ua = { forEachDeep: Ks }, Ys = { /** * 重构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; } }, _t = { logger: ce, strings: Wr, trace: Ts, vite: Bs, store: Kr, deepdash: Ua, dash: Ys }; function nr(e, t) { return e.type !== "antdv" ? {} : { labelCol: { span: t }, wrapperCol: { span: 23 - t } }; } function Gs() { const { ui: e } = we(); return { colspan: { //跨列 form: { col: { span: 24 }, ...nr(e, 2) } }, colspan3: { //跨列 form: { col: { span: 24 }, ...nr(e, 3) } }, colspan4: { //跨列 form: { col: { span: 24 }, ...nr(e, 4) } } }; } const Xs = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: Gs }, Symbol.toStringTag, { value: "Module" })); function Qs() { const e = qe.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 Js = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: Qs }, Symbol.toStringTag, { value: "Module" })); function Zs() { const e = qe.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 el = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: Zs }, Symbol.toStringTag, { value: "Module" })), Ka = { 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: "保存" } }, 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: "查询表单校验失败" } }, pagination: { showTotal: "共 {0} 条" }, date: { formatter: { to: "至" } }, extends: { tableSelect: { view: "查看", select: "选择", ok: "确定", cancel: "取消" }, 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: "还有文件正在上传,请等待上传完成,或删除它" } } } }, tl = { 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" } }, 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: "export" }, columns: { title: "columns set" } }, search: { container: { collapseButton: { text: { collapse: "collapse", expand: "expand" } } }, search: { text: "search" }, reset: { text: "reset" }, error: { message: "form valid error" } }, pagination: { showTotal: "Total {0} items" }, date: { formatter: { to: "to" } }, extends: { tableSelect: { view: "view", select: "select" }, 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 nl(e, t) { let n = st(Ka, e); return n == null ? e : t instanceof Array ? (Y(t, (o, r) => { n = n.replace("{" + r + "}", o); }), n) : n.replace("{n}", t); } class ol { constructor() { ae(this, "vueI18nInstance", null); } t(t, n) { return nl(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 = dt(r.fs || {}); t.mergeLocaleMessage(o, { fs: Ka.fs }), t.mergeLocaleMessage(o, { fs: a }); } else if (o.startsWith("en")) { const r = t.getLocaleMessage(o), a = dt(r.fs || {}); t.mergeLocaleMessage(o, { fs: tl.fs }), t.mergeLocaleMessage(o, { fs: a }); } ce.debug("i18n", t.getLocaleMessage(o)); } this.vueI18nInstance = t; } } const Do = new ol(); function lt() { return Do.vueI18nInstance != null ? { // @ts-ignore t: Do.vueI18nInstance.t } : { t: Do.t }; } var Qo = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; function Jo(e) { return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e; } var Ya = { exports: {} }; (function(e, t) { (function(n, o) { e.exports = o(); })(Qo, function() { return function(n, o) { var r = o.prototype, a = r.format; r.format = function(i) { var s = this, u = this.$locale(); if (!this.isValid()) return a.bind(this)(i); var l = 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((s.$M + 1) / 3); case "Do": return u.ordinal(s.$D); case "gggg": return s.weekYear(); case "GGGG": return s.isoWeekYear(); case "wo": return u.ordinal(s.week(), "W"); case "w": case "ww": return l.s(s.week(), d === "w" ? 1 : 2, "0"); case "W": case "WW": return l.s(s.isoWeek(), d === "W" ? 1 : 2, "0"); case "k": case "kk": return l.s(String(s.$H === 0 ? 24 : s.$H), d === "k" ? 1 : 2, "0"); case "X": return Math.floor(s.$d.getTime() / 1e3); case "x": return s.$d.getTime(); case "z": return "[" + s.offsetName() + "]"; case "zzz": return "[" + s.offsetName("long") + "]"; default: return d; } }); return a.bind(this)(c); }; }; }); })(Ya); var rl = Ya.exports; const al = /* @__PURE__ */ Jo(rl); et.extend(al); function or(e, t) { if (!Wr.isEmpty(e)) return et(e).format(t); } function Ga(e, t = "YYYY-MM-DD HH:mm:ss") { if (e != null && e instanceof Array && e.length > 1) { if (Wr.hasEmpty(e)) return; const { t: n } = lt(); return `${or(e[0], t)} ${n("fs.date.formatter.to")} ${or(e[1], t)}`; } return or(e, t); } function il(e) { const { value: t } = e; return Ga(t, "YYYY-MM-DD"); } function sl(e) { const { value: t } = e; return Ga(t, "YYYY-MM-DD HH:mm:ss"); } var Xa = { exports: {} }; (function(e, t) { (function(n, o) { e.exports = o(); })(Qo, function() { var n = "week", o = "year"; return function(r, a, i) { var s = a.prototype; s.week = function(u) { if (u === void 0 && (u = null), u !== null) return this.add(7 * (u - this.week()), "day"); var l = this.$locale().yearStart || 1; if (this.month() === 11 && this.date() > 25) { var c = i(this).startOf(o).add(1, o).date(l), d = i(this).endOf(n); if (c.isBefore(d)) return 1; } var f = i(this).startOf(o).date(l).startOf(n).subtract(1, "millisecond"), h = this.diff(f, n, !0); return h < 0 ? i(this).startOf("week").week() : Math.ceil(h); }, s.weeks = function(u) { return u === void 0 && (u = null), this.week(u); }; }; }); })(Xa); var ll = Xa.exports; const ul = /* @__PURE__ */ Jo(ll); var Qa = { exports: {} }; (function(e, t) { (function(n, o) { e.exports = o(); })(Qo, function() { return function(n, o) { o.prototype.weekday = function(r) { var a = this.$locale().weekStart || 0, i = this.$W, s = (i < a ? i + 7 : i) - a; return this.$utils().u(r) ? s : this.subtract(s, "day").add(r, "day"); }; }; }); })(Qa); var cl = Qa.exports; const dl = /* @__PURE__ */ Jo(cl); var Ja = { exports: {} }; (function(e, t) { (function(n, o) { e.exports = o(); })(Qo, function() { return function(n, o, r) { var a = o.prototype, i = function(d) { return d && (d.indexOf ? d : d.s); }, s = function(d, f, h, v, p) { var y = d.name ? d : d.$locale(), b = i(y[f]), R = i(y[h]), D = b || R.map(function(T) { return T.slice(0, v); }); if (!p) return D; var $ = y.weekStart; return D.map(function(T, E) { return D[(E + ($ || 0)) % 7]; }); }, u = function() { return r.Ls[r.locale()]; }, l = function(d, f) { return d.formats[f] || function(h) { return h.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function(v, p, y) { return p || y.slice(1); }); }(d.formats[f.toUpperCase()]); }, c = function() { var d = this; return { months: function(f) { return f ? f.format("MMMM") : s(d, "months"); }, monthsShort: function(f) { return f ? f.format("MMM") : s(d, "monthsShort", "months", 3); }, firstDayOfWeek: function() { return d.$locale().weekStart || 0; }, weekdays: function(f) { return f ? f.format("dddd") : s(d, "weekdays"); }, weekdaysMin: function(f) { return f ? f.format("dd") : s(d, "weekdaysMin", "weekdays", 2); }, weekdaysShort: function(f) { return f ? f.format("ddd") : s(d, "weekdaysShort", "weekdays", 3); }, longDateFormat: function(f) { return l(d.$locale(), f); }, meridiem: this.$locale().meridiem, ordinal: this.$locale().ordinal }; }; a.localeData = function() { return c.bind(this)(); }, r.localeData = function() { var d = u(); 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 l(d, f); }, meridiem: d.meridiem, ordinal: d.ordinal }; }, r.months = function() { return s(u(), "months"); }, r.monthsShort = function() { return s(u(), "monthsShort", "months", 3); }, r.weekdays = function(d) { return s(u(), "weekdays", null, null, d); }, r.weekdaysShort = function(d) { return s(u(), "weekdaysShort", "weekdays", 3, d); }, r.weekdaysMin = function(d) { return s(u(), "weekdaysMin", "weekdays", 2, d); }; }; }); })(Ja); var fl = Ja.exports; const hl = /* @__PURE__ */ Jo(fl); et.extend(dl); et.extend(hl); et.extend(ul); function ml() { const e = qe.get(); function t(o) { const { row: r, key: a, value: i } = o; i != null && (e.type === "naive" ? r[a] = et(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: il }, valueBuilder({ row: o, key: r, value: a }) { a != null && Array.isArray(a) && a.length === 2 && a != null && (e.type === "naive" ? o[r] = [et(a[0]).valueOf(), et(a[1]).valueOf()] : o[r] = [et(a[0]), et(a[1])]); } }, datetimerange: { form: { component: { ...e.datePicker.buildDateType("datetimerange"), vModel: e.datePicker.modelValue } }, column: { width: 340, formatter: sl }, valueBuilder({ row: o, key: r, value: a }) { a != null && Array.isArray(a) && a.length === 2 && (e.type === "naive" ? o[r] = [et(a[0]).valueOf(), et(a[1]).valueOf()] : o[r] = [et(a[0]), et(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 pl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: ml }, Symbol.toStringTag, { value: "Module" })); function gl() { const { ui: e } = we(); 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 vl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: gl }, Symbol.toStringTag, { value: "Module" })); function bl() { return { icon: { form: { component: { name: "fs-icon-selector", vModel: "modelValue", [qe.get().input.clearable]: !0 } }, column: { component: { name: "fs-icon", vModel: "icon", style: "font-size:18px" } } } }; } const yl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: bl }, Symbol.toStringTag, { value: "Module" })); function wl() { const e = qe.get(); return { number: { form: { component: { // el-input-number,a-input-number name: e.number.name, vModel: e.modelValue } } } }; } const _l = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: wl }, Symbol.toStringTag, { value: "Module" })); function Cl() { 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 Sl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: Cl }, Symbol.toStringTag, { value: "Module" })); function Fl() { const e = qe.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 Rl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: Fl }, Symbol.toStringTag, { value: "Module" })); function Dl() { const e = qe.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 kl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: Dl }, Symbol.toStringTag, { value: "Module" })); function $l() { const e = qe.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 Ol = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: $l }, Symbol.toStringTag, { value: "Module" })), El = /* @__PURE__ */ Object.assign({ "./list/assist.ts": Xs, "./list/button.ts": Js, "./list/cascader.ts": el, "./list/date.ts": pl, "./list/el.ts": vl, "./list/icon.ts": yl, "./list/number.ts": _l, "./list/phone.ts": Sl, "./list/select.ts": Rl, "./list/text.ts": kl, "./list/tree.ts": Ol }), Za = []; Y(El, (e) => { Za.push(e.default); }); const oo = {}; function Tl() { return oo; } function Il(e) { return oo[e]; } function Al(e) { for (const t in e) oo[t] = e[t]; } const $n = { getType: Il, addTypes: Al, getTypes: Tl, install() { for (const e of Za) Y(e(), (t, n) => { oo[n] = t; }); ce.debug("types installed:", oo); } }, Vl = le({ name: "FsPage", setup() { const e = K(); return _n(() => { window.getComputedStyle(e.value.parentNode).getPropertyValue("position") !== "relative" && _t.logger.warn( "fs-page父节点的position建议为relative,因为fs-page为相对定位(position:absolute),如果样式没有异常,你可以忽略此警告" ); }), { pageRef: e }; } }); const Oe = (e, t) => { const n = e.__vccOpts || e; for (const [o, r] of t) n[o] = r; return n; }, Pl = { ref: "pageRef", class: "fs-page" }, Ml = { key: 0, class: "fs-page-header" }, Bl = { class: "fs-page-content" }, jl = { key: 1, class: "fs-page-footer" }; function Nl(e, t, n, o, r, a) { return w(), j("div", Pl, [ e.$slots.header != null ? (w(), j("div", Ml, [ re(e.$slots, "header") ])) : oe("", !0), te("div", Bl, [ re(e.$slots, "default") ]), e.$slots.footer != null ? (w(), j("div", jl, [ re(e.$slots, "footer") ])) : oe("", !0) ], 512); } const xl = /* @__PURE__ */ Oe(Vl, [["render", Nl]]); function wr(e) { return e != null && (e instanceof ei || Mo(e)); } function ha(e) { return wr(e) && !e.cloneable; } function Ll(e, ...t) { function n(r, a) { if (a != null && (jo(r) || wr(a))) return a; } let o = null; for (const r of t) wr(r) && (o = r); return o || fs(e, ...t, n); } function ql(e) { if (ha(e)) return e; function t(n) { if (ha(n)) return n; } return hs(e, t); } let ei = class { constructor() { ae(this, "cloneable", !1); } setCloneable(t) { this.cloneable = t; } }; function $e() { return { merge: Ll, cloneDeep: ql, UnMergeable: ei }; } const { cloneDeep: Hl } = $e(); function zl(e) { return e instanceof Yr; } function Wl(e) { return e instanceof Zo; } function ma(e, t, n) { const o = {}; if (e == null) return o; const r = n ? zl : Wl; return Ua.forEachDeep(e, (a, i, s, u) => { if (a == null) return !1; if (r(a)) { const l = u.path; if (t) { for (const c of t) if (typeof c == "string") { if (l.startsWith(c)) return !1; } else if (c instanceof RegExp && c.test(l)) return !0; } return o[l] = a, !1; } return !es(a); }, { // https://deepdash.io/#eachdeep-foreachdeep checkCircular: !0 }), o; } function Ul(e, t) { if (e == null || Object.keys(e).length <= 0) return null; const n = {}; return Y(e, (o, r) => { n[r] = o.buildAsyncRef(t); }), n; } function Kl(e, t) { t == null || Object.keys(t).length <= 0 || Y(t, (n, o) => { tt(e, o, n.value == null ? null : n.value); }); } function Yl(e, t, n, o) { const r = M(() => { const s = e(); return ma(s, n, !1); }), a = M(() => { const s = e(); return ma(s, n, !0); }), i = Ul(a.value, t); return M(() => { let s = e(); const u = Object.keys(a.value).length, l = Object.keys(r.value).length; if (u > 0 || l > 0) { if (s = Hl(s), l > 0) { const c = t ? t() : {}; Y(r.value, (d, f) => { tt(s, f, d.computeFn(c)); }); } u > 0 && Kl(s, i); } return o ? o(s) : s; }); } class Zo { constructor(t) { ae(this, "computeFn"); this.computeFn = t; } } function Gl(e) { return new Zo(e); } class Yr { constructor(t) { ae(this, "watch"); ae(this, "asyncFn"); ae(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 = M(() => this.watch ? this.watch(t()) : null); return it(() => o.value, async (r) => { n.value = await this.asyncFn(r, t()); }, { immediate: !0 }), n; } } function Xl(e) { return new Yr(e); } function Pt() { return { ComputeValue: Zo, compute: Gl, AsyncComputeValue: Yr, asyncCompute: Xl, doComputed: Yl }; } const ln = { orderDefault: 1 }, { merge: At, cloneDeep: Ut } = $e(), qn = []; function ti(e) { xa(qn, (t) => t.name === e.name), qn.push(e), qn.sort((t, n) => t.order - n.order), ce.debug("mergeColumnPlugin register success: current:", e, "registered:", qn); } function Ql(e) { var t, n; if (e.dict) { if ((t = e.column) != null && t.component) { const o = Bo(Ut(e.dict)); o.cloneable && (o.cloneable = !1), e.column.component.dict = At(o, e.column.component.dict); } if ((n = e.form) != null && n.component) { const o = Bo(Ut(e.dict)); o.cloneable && (o.cloneable = !1), e.form.component.dict = At(o, e.form.component.dict); } } return e; } function Jl(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 = $n.getType(o); r && At(n, r); } return e = At(n, e), e; } const Nn = []; Nn.push({ name: "type", handle: Jl, order: -2 }); Nn.push({ name: "dict", handle: Ql, order: -1 }); Nn.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 = (i) => { const { value: s } = i; return x("span", null, [s]); }), At(e, { viewForm: o }), e; } }); Nn.push({ name: "NaiveFormRuleFix", order: 10, handle: (e = {}, t = {}) => { var o, r, a, i, s; const { ui: n } = we(); 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), (s = e.search) != null && s.rules && (e.search.rule = e.search.rules)), e; } }); Nn.push({ name: "DefaultOrder", order: 0, handle: (e = {}, t = {}, n) => (st(e, "column.order") == null && tt(e, "column.order", n), st(e, "form.order") == null && tt(e, "form.order", n), e) }); for (const e of Nn) ti(e); function Gr(e, t) { const n = {}; let o = 0; return Y(e, (r, a) => { if (r.key = a, r.children) r.children = Gr(r.children, t); else for (const i of qn) r = i.handle(r, t, o); n[a] = r, o++; }), n; } function Xr(e = {}, t) { return Y(t, (n, o) => { n.children ? Xr(e, n.children) : e[o] = n; }), e; } function Qr(e = {}, t) { return Y(t, (n, o) => { n.children ? Qr(e, n.children) : e[o] = n; }), e; } function Zl(e) { const t = e, n = t.column || {}; return n.title == null && (n.title = t.title), n.key = t.key, t.children && (n.children = oi(t.children)), ni(n), yn(n); } function ni(e) { var t; e && (t = e.component) != null && t.name && typeof e.component.name != "string" && (Mo(e.component.name) || (e.component.name = ts(e.component.name))); } function oi(e) { let t = {}; return Y(e, (n, o) => { t[o] = Zl(n); }), t = Jr(t), t; } function eu(e) { return Cn(e, (t) => t.order ?? ln.orderDefault); } function Jr(e) { const t = []; for (const r in e) { const a = e[r]; a.key = r, a.children && ms(a.children) > 0 && (a.children = Jr(a.children)), t.push(a); } const n = eu(t), o = {}; for (const r of n) o[r.key] = r; return o; } function ri(e, t) { const n = {}; return Y(e, (o) => { const r = Ut(o[t]) || {}; t === "form" && r.title == null && (r.title = o.title), r.key = o.key, n[o.key] = r, ni(r); }), n; } function Hn(e, t, n, o) { const r = ri(n, t), a = At(Ut(e.form), e[t], { columns: r }); return o && o(a), a; } function tu(e, t = "search", n) { var s; const o = ri(n, t), r = {}, a = ((s = e.settings) == null ? void 0 : s.searchCopyFormProps) ?? ["component", "valueChange", "title", "key", "label", "render"]; function i(u, l, c) { if (ps(a, c) && e.columns[l]) { const f = e.columns[l][c]; f && (u[c] = f); } } return Y(Ut(e.form.columns), (u, l) => { const c = {}; i(c, l, "valueResolve"), i(c, l, "valueBuilder"), r[l] = At(c, La(u, a)); }), At({ columns: r }, { columns: o }, e.search); } function nu(e, t, n = "form") { const { t: o } = lt(), { merge: r } = $e(); t = t || {}; const a = r(no.defaultOptions({ t: o }), no.commonOptions({ crudOptions: e, context: t, crudExpose: null }), e), i = Gr(Ut(a.columns), a), s = Xr({}, i), u = n === "form" ? "form" : `${n}Form`; return Hn(a, u, s); } function ou(e) { Y(e.columns, (o, r) => { o.key = r; }); const t = Gr(Ut(e.columns), e); e.columns = t; const n = Xr({}, t); return e.table.columns = oi(Ut(t)), e.table.columnsMap = Qr({}, e.table.columns), At(e.toolbar, { columnsFilter: { originalColumns: Ut(e.table.columns) } }), e.form = Hn(e, "form", n), e.addForm = Hn(e, "addForm", n), e.editForm = Hn(e, "editForm", n), e.viewForm = Hn(e, "viewForm", n, (o) => { Y(o.columns, (r) => { r.component || (r.component = {}), r.component.disabled = !0; }); }), e.search = tu(e, "search", n), e.table.editable && (e.table.editable.addForm = At(e.addForm.columns, e.table.editable.addForm), e.table.editable.editForm = At(e.editForm.columns, e.table.editable.editForm)), e; } function _r(e, t) { Y(e, (n, o) => { n.key || (n.key = o), n.children ? _r(n.children, t) : t(n, o); }); } function xo(e, t) { Y(e, (n, o) => { n.key || (n.key = o), n.children ? xo(n.children, t) : t(n, o); }); } function Zr() { return { buildFormOptions: nu, buildColumns: ou, registerMergeColumnPlugin: ti, forEachColumns: xo, doColumnsSort: Jr }; } let ru = 0; const rr = {}; async function au(e) { const t = e.id || `${ru++}`, n = document.createElement("div"); return new Promise((o, r) => { let a = rr[t]; a != null && (a.vm.exposed.open(e), o(a)); const i = x(ro, { id: t, onClosed() { e.id || delete rr[t]; } }); i.appContext = ro._context, ns(i, n), document.body.appendChild(n); const u = i.component; a = { id: t, vNode: i, vm: u, props: i.component.props }, rr[t] = a, a.vm.exposed.open(e), o(a.vm.exposed); }); } function iu() { let e = null; try { e = jn("use:form:wrapper", () => { })(); } catch (o) { ce.warn("cant inject use:form:wrapper,建议在App.vue中使用组件包裹", o); } let t = null; e == null ? t = async (o) => await au(o) : t = async (o) => await e.open(o); async function n(o) { const { buildFormOptions: r } = Zr(), a = r(o.crudOptions, o.context); return await t(a); } return { openDialog: t, openCrudFormDialog: n }; } const { merge: ai } = $e(), su = ai; function lu(e) { const { crudExpose: t } = e, { crudBinding: n } = t; we(), lt(); const { merge: o } = $e(); it(() => { var a, i, s; return (s = (i = (a = n.value) == null ? void 0 : a.table) == null ? void 0 : i.editable) == null ? void 0 : s.enabled; }, (a) => { var s, u, l, c, d; const i = (l = (u = (s = n.value) == null ? void 0 : s.table) == null ? void 0 : u.editable) == null ? void 0 : l.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 s = n.value.table.editable; o(s, { enabled: !0 }, a), i && i({ editable: s }); }, /** * 禁用编辑 */ 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, s; return (s = (i = t.getTableRef()) == null ? void 0 : i.editable) == null ? void 0 : s.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 s = r.getEditableRow(i); await s.save({ async doSave(u) { var h, v; const { isAdd: l, row: c, setData: d } = u, f = c; if (((v = (h = n.value) == null ? void 0 : h.mode) == null ? void 0 : v.name) !== "local") try { if (s.loading = !0, l) { const p = await n.value.request.addRequest({ form: f }); d(p); } else await n.value.request.editRequest({ form: f, row: f }); } finally { s.loading = !1; } } }); }, async doCancelRow(a) { let i = a.editableId; i || (i = a.row[n.value.table.editable.rowKey]); const s = r.getEditableRow(i); if (s.isAdd) { r.removeRow(i); return; } s.cancel(); }, async doRemoveRow(a) { let i = a.editableId; i || (i = a.row[n.value.table.editable.rowKey]); const s = r.getEditableRow(i); return await t.doRemove(a, { async handle() { return s.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 ii(e) { const { crudRef: t, crudBinding: n } = e, { ui: o } = we(), { t: r } = lt(), a = iu(); function i() { t.value == null && ce.warn("crudRef还未初始化,请在onMounted之后调用"); } function s() { n.value == null && ce.warn("crudBinding还未初始化,请在useFs或useCrud之后调用"); } const u = { crudRef: t, crudBinding: n, getFormWrapperRef() { return t.value.formWrapperRef; }, getFormRef: () => { const l = u.getFormWrapperRef(); if (l == null || (l == null ? void 0 : l.formRef) == null) { ce.error("当前无法获取FormRef,请在编辑对话框已打开的状态下调用此方法,如果是在打开对话框时调用,可以尝试先nextTick"); return; } return l == null ? void 0 : l.formRef; }, getFormData: () => { const l = u.getFormRef(); return l == null ? void 0 : l.getFormData(); }, setFormData: (l, c) => { var d; (d = u.getFormRef()) == null || d.setFormData(l, c); }, getFormComponentRef(l, c = !1) { const d = u.getFormRef(); return d == null ? void 0 : d.getComponentRef(l, c); }, doValueBuilder(l, c) { c == null && (c = Ln(n.value.columns)), ce.debug("doValueBuilder ,columns=", c); const d = []; xo(c, (f) => { f.valueBuilder != null && d.push(f); }), d.length !== 0 && (Y(l, (f, h) => { Y(d, (v) => { v.valueBuilder({ value: f[v.key], row: f, form: f, index: h, key: v.key, column: v }); }), f.children && jo(f.children) && u.doValueBuilder(f.children, c); }), ce.debug("valueBuilder success:", l)); }, doValueResolve({ form: l }, c) { c == null && (c = Ln(n.value.columns)); const d = []; xo(c, (f) => { f.valueResolve != null && d.push(f); }), d.length !== 0 && (ce.debug("doValueResolve ,columns=", c), Y(d, (f) => { const h = f.key; f.valueResolve({ value: l[h], row: l, form: l, key: h, column: f }); }), ce.debug("valueResolve success:", l)); }, doSearchValidate() { u.getSearchRef().doValidate(); }, getSearchFormData() { return n.value.search.validatedForm; }, getSearchValidatedFormData() { return n.value.search.validatedForm; }, /** * {form,mergeForm} */ setSearchFormData(l) { if (t.value && t.value.setSearchFormData({ form: l.form, mergeForm: l.mergeForm }), l.mergeForm === !1) for (const d in n.value.search.validatedForm) delete n.value.search.validatedForm[d]; const { merge: c } = $e(); c(n.value.search.validatedForm, l.form), l.triggerSearch && u.doRefresh(); }, /** * 获取search组件ref */ getSearchRef() { var l; return i(), (l = t.value) == null ? void 0 : l.getSearchRef(); }, buildPageQuery(l) { var p, y; const c = l.page; let d = l.form; d == null && (d = dt(u.getSearchValidatedFormData()) || {}, (y = (p = n.value) == null ? void 0 : p.search) != null && y.columns && u.doValueResolve({ form: d }, Ln(n.value.search.columns))); let f = l.sort; f == null && (f = n.value.table.sort || {}); const h = { page: c, form: d, sort: f }; let v = h; return n.value.request.transformQuery && (v = n.value.request.transformQuery(h)), v; }, async search(l, c = {}) { const d = u.buildPageQuery(l); let f; const h = q(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 v = f; return n.value.request.transformRes && (v = n.value.request.transformRes({ res: f, query: d })), v.records && u.doValueBuilder(v.records), v; }, getPage() { let l = { currentPage: 1, pageSize: 10 }; return n.value.pagination && (l = { currentPage: n.value.pagination[o.pagination.currentPage], pageSize: n.value.pagination.pageSize }), l; }, async doRefresh(l) { var y, b; if (n.value.request.pageRequest == null) return; ce.debug("do refresh:", l), n.value.pagination && l != null && l.goFirstPage && (n.value.pagination[o.pagination.currentPage] = 1); const c = u.getPage(), d = await u.search({ page: c }, { silence: l == null ? void 0 : l.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: v } = d, { records: p } = d; if (p == null || !(p instanceof Array) || v == 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 = p, n.value.pagination && (n.value.pagination[o.pagination.currentPage] = f, n.value.pagination.pageSize = h, n.value.pagination[o.pagination.total] = v || p.length), (l == null ? void 0 : l.scrollTop) ?? n.value.table.scrollTopOnRefreshed) { const R = u.getTableRef(); R == null || R.scrollTo(0); } (b = (y = n.value) == null ? void 0 : y.table) != null && b.onRefreshed && n.value.table.onRefreshed({ data: p }); }, /** * 获取toolbar组件Ref */ getToolbarRef: () => t.value.toolbarRef, /** * 获取列设置组件Ref */ getColumnsFilterRef: () => u.getToolbarRef().columnsFilterRef, /** * 获取列设置的原始列配置Ref * 可以修改列设置的原始配置 */ getColumnsFilterOriginalColumnsRef: () => u.getColumnsFilterRef().original, /** * 获取列设置的列配置Ref * 可以动态修改列设置每列的配置 */ getColumnsFilterColumnsRef: () => u.getColumnsFilterRef().columns, doPageTurn(l) { n.value.pagination[o.pagination.currentPage] = l; }, /** * * @param opts = { * form * goFirstPage =true * mergeForm=false * } */ async doSearch(l) { ce.debug("do search:", l), l = ai({ goFirstPage: !0 }, l), l.goFirstPage && u.doPageTurn(1), l.form && t.value && u.setSearchFormData({ form: l.form, mergeForm: l.mergeForm, refWarning: !1, triggerSearch: !1 }), await u.doRefresh(); }, /** * 获取FsTable实例 */ getTableRef() { var l; return i(), (l = t.value) == null ? void 0 : l.tableRef; }, /** * 获取x-Table实例 */ getBaseTableRef() { const l = this.getTableRef(); if (l == null) { ce.warn("fs-table还未挂载"); return; } return l.tableRef; }, /** * 获取表格数据 */ getTableData() { return s(), n.value.data; }, setTableData(l) { s(), n.value.data = l; }, insertTableRow(l, c) { s(), n.value.data.splice(l, 0, c); }, updateTableRow(l, c, d = !0) { d ? n.value.data[l] = su(n.value.data[l], c) : n.value.data[l] = c; }, removeTableRow(l) { s(), n.value.data.splice(l, 1); }, removeTableRowByRowKey: (l, c) => { s(), c == null && (c = n.value.data); for (let d = 0; d < c.length; d++) { const f = c[d]; if (f[n.value.table.rowKey] === l) return c.splice(d, 1), !0; if (f.children && jo(f.children) && u.removeTableRowByRowKey(l, f.children)) return !0; } }, getTableDataRow(l) { const c = u.getTableData(); if (c == null) throw new Error("table data is not init"); if (c.length <= l) throw new Error("index over array length"); return c[l]; }, /** * 选择某一行 * @param index * @param row */ doSelectCurrentRow({ row: l }) { u.getTableRef().value.setCurrentRow(l); }, /** * 删除行按钮 * @param context * @param opts */ async doRemove(l, c) { var p; const d = n.value.table.remove ?? c ?? {}; if ((c == null ? void 0 : c.noConfirm) !== !0) try { d.confirmFn ? await d.confirmFn(l) : 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(l); return; } let f = null; const h = ((p = n.value.mode) == null ? void 0 : p.name) === "local"; if (c != null && c.handle ? f = await c.handle(l) : h ? u.removeTableRow(l == null ? void 0 : l.index) : f = await n.value.request.delRequest(l), f === !1) return; const v = { ...l, res: f }; if (d.afterRemove && await d.afterRemove(v) === !1) return !1; d.showSuccessNotification !== !1 && o.notification.success(r("fs.rowHandle.remove.success")), h || d.refreshTable !== !1 && await u.doRefresh({ scrollTop: !1 }), d.onRemoved && await d.onRemoved({ ...l, res: f }); }, /** * * 打开表单对话框 * @param formOpts ={mode, initialForm: row, index,...formOptions} */ async openDialog(l) { if (l.newInstance === !0 && a) return await a.openDialog(l); const c = this.getFormWrapperRef(); return c.open(l), c; }, async _openDialog(l, c, d) { var y, b; const { merge: f } = $e(); let h = c.row || c[o.tableColumn.row]; delete c.row, h == null && c.index != null && (h = u.getTableDataRow(c.index)), (b = (y = n.value) == null ? void 0 : y.request) != null && b.infoRequest && (h = await n.value.request.infoRequest({ mode: l, row: h })); const v = { mode: l }, p = Ln(n.value[l + "Form"]); return f(v, p, { initialForm: h }, c, d), await this.openDialog(v); }, async openAdd(l, c = {}) { return this._openDialog("add", l, c); }, async openEdit(l, c = {}) { return this._openDialog("edit", l, c); }, async openView(l, c = {}) { return this._openDialog("view", l, c); }, async openCopy(l, c = {}) { return this._openDialog("add", l, c); }, editable: void 0 }; return u.editable = lu({ crudExpose: u }), { expose: u, crudExpose: u }; } async function uu() { const e = await /* @__PURE__ */ Object.assign({ "./lib/index.ts": () => import("./index-88684a06.mjs") }); let t = null; return bt(e, (o) => { t = o; }), (await t()).exportUtil; } async function cu() { const e = await /* @__PURE__ */ Object.assign({ "./lib/index.ts": () => import("./index-88684a06.mjs") }); let t = null; return bt(e, (o) => { t = o; }), (await t()).importUtil; } function du({ 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 s = a.getNodesFromDataMap(r); if (s != null && s.length > 0) { const u = gs(s, (l) => a.getLabel(l) || a.getValue(l)).join("|"); u != null && u !== "" && (t[n] = u); } } return t; } async function fu(e, t = {}) { if (t.server) { const l = e.getPage(), c = e.buildPageQuery({ page: l }); await t.server(c); return; } const n = e.crudBinding; let o = t.columns; o == null && (o = [], bt(n.value.table.columnsMap, (l) => { if (!(t.columnFilter && t.columnFilter(l) === !1) && !(t.onlyShow && q(l.show) === !1) && l.exportable !== !1 && l.key !== "_index") { const c = { key: l.key, title: l.title }; o.push(c); } })); for (const l of o) { const c = n.value.table.columnsMap[l.key]; l.columnProps = c || {}, t.columnBuilder && t.columnBuilder({ col: l }); } const { merge: r } = $e(), a = await uu(), i = []; let s = n.value.data; if (t.dataFrom === "search") { const l = r({ page: { currentPage: 1, pageSize: 99999999 } }, n.value.toolbar.export.searchParams); s = (await e.search(l, { silence: !0 })).records; } for (const l of s) { const c = dt(l); bt(o, (d) => { const f = d.columnProps, h = { row: c, originalRow: l, key: d.key, col: f, exportCol: d }; t.autoUseDictLabel !== !1 && du(h), t.dataFormatter && t.dataFormatter(h); }), i.push(c); } const u = r({ columns: o, data: i, filename: "table", noHeader: !1, separator: ",", quoted: !1 //每项数据是否加引号 }, { ...t }); t.fileType === "excel" ? await a.excel(u) : await a.csv(u); } async function up(e, t) { const o = await (await cu()).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 si = {}; function li(e, t, n = {}) { si[e] = { handle: t, opts: n }; } function hu(e) { return si[e]; } li("rowSelection", (e, t, n) => { const r = t.crudExpose.crudBinding; function a() { return r.value.table.rowKey || "id"; } const { ui: i } = we(); if (!e) { ce.warn("请配置settings.plugins.rowSelection.props参数"); return; } let s = i.table; return (n == null ? void 0 : n.table.tableVersion) == "v2" && (s = i.tableV2), s.buildSelectionCrudOptions({ crossPage: e.crossPage, getRowKey: a, getPageData() { return r.value.data; }, useCompute: () => Pt(), selectionFixed: e.selectionFixed, multiple: e.multiple, selectedRowKeys: e.selectedRowKeys, onSelectedKeysChanged: async (u) => { const l = e.selectedRowKeys instanceof Function ? e.selectedRowKeys() : e.selectedRowKeys; l.value = [...u], await Be(), e.onSelectedChanged && e.onSelectedChanged(l.value); } }); }, { before: !0, order: -2 }); li("mobile", (e, t, n) => { const o = n.rowHandle, r = o.buttons; let a = {}; for (const s in r) { const u = r[s]; Mo(u.dropdown) ? a = u : a[s] = { ...u, dropdown: M(() => e.isMobile.value ? !0 : u.dropdown) }; } let i = o.width; return (i == null || !Mo(i)) && (i = M(() => { var s; return e.isMobile.value ? ((s = e == null ? void 0 : e.rowHandle) == null ? void 0 : s.width) || 60 : o.width || 250; })), { rowHandle: { width: i, buttons: a } }; }, { before: !1, order: -2 }); const { merge: Xt } = $e(); function mu(e) { e.context == null && (e.context = {}); const t = qe.get(), { t: n } = lt(), o = (F) => M(() => n(F)); let r = e.crudOptions; const a = e.expose || e.crudExpose; if (!a) throw new Error("crudExpose不能为空,请给useCrud传入{crudExpose}参数"); const i = a, { crudBinding: s } = i, { doRefresh: u, doValueResolve: l } = i; function c() { return { pagination: { ...t.pagination.onChange({ setCurrentPage(V) { s.value.pagination[t.pagination.currentPage] = V; }, setPageSize(V) { s.value.pagination.pageSize = V, s.value.pagination[t.pagination.currentPage] = 1; }, async doAfterChange() { return await u(); } }) } }; } function d() { return { form: { async doSubmit(F) { var V, ne, L, A; if (F.mode === "edit") if (l(F), ((V = r.mode) == null ? void 0 : V.name) === "local") i.updateTableRow(F.index, F.form, r.mode.isMergeWhenUpdate); else return (ne = s.value.request) != null && ne.editRequest || ce.warn("request.editRequest 未定义,无法保存"), await s.value.request.editRequest(F); else if (F.mode === "add") if (l(F), ((L = r.mode) == null ? void 0 : L.name) === "local") { const k = r.mode.isAppendWhenAdd ? i.getTableData().length : 0; i.insertTableRow(k, F.form); } else return (A = s.value.request) != null && A.addRequest || ce.warn("request.addRequest 未定义,无法保存"), await s.value.request.addRequest(F); }, async onSuccess({ mode: F }) { F === "edit" ? await u({ scrollTop: !1 }) : F === "add" ? await u({ scrollTop: !0, goFirstPage: !0 }) : await u(); } } }; } function f() { return { rowHandle: { buttons: { remove: { click: async (F) => { F.row = F[t.tableColumn.row], await i.doRemove(F); } }, copy: { show: !1, click: async (F) => { F.row = F[t.tableColumn.row], await i.openCopy({ row: F.row, index: F.index }); } }, edit: { click: async (F) => { F.row = F[t.tableColumn.row], await i.openEdit({ row: F.row, index: F.index }); } }, view: { click: async (F) => { F.row = F[t.tableColumn.row], await i.openView({ row: F.row, index: F.index }); } } } } }; } function h() { return { search: { buttons: { search: { loading: M(() => { var F, V; return (V = (F = s.value) == null ? void 0 : F.table) == null ? void 0 : V.loading; }) } }, on_reset() { s.value.table.sort = {}, _r(s.value.table.columns, (V) => { V.sortOrder = !1; }); const F = a.getBaseTableRef(); F != null && F.clearSort && F.clearSort(); }, on_search() { a.doRefresh({ goFirstPage: !0 }); }, "onUpdate:form": (F) => { s.value.search.form = F; }, "onUpdate:validatedForm": (F) => { s.value.search.validatedForm = F; }, "onUpdate:collapse": (F) => { s.value.search.collapse = F; }, container: { collapse: !0, "onUpdate:collapse": (F) => { s.value.search.container.collapse = F; } } } }; } function v() { return { tabs: {}, onTabChange(F) { a.setSearchFormData({ form: F, mergeForm: !0 }), u(); } }; } function p() { const F = K(!1); return { toolbar: { buttons: { refresh: { type: "primary", icon: t.icons.refresh, title: o("fs.toolbar.refresh.title"), order: 1, circle: !0, click: async () => { await a.doRefresh({ scrollTop: !1 }); } }, search: { type: M(() => s.value.search.show !== !1 ? "primary" : "default"), icon: t.icons.search, title: o("fs.toolbar.search.title"), order: 2, circle: !0, click: () => { s.value.search.show = !s.value.search.show; } }, compact: { type: M(() => s.value.toolbar.compact ? "primary" : "default"), icon: t.icons.compact, title: o("fs.toolbar.compact.title"), order: 3, circle: !0, click: () => { s.value.toolbar.compact = !s.value.toolbar.compact; } }, export: { show: !0, type: "primary", icon: t.icons.export, order: 4, loading: F, title: o("fs.toolbar.export.title"), circle: !0, click: async () => { F.value = !0; try { await fu(a, s.value.toolbar.export); } finally { F.value = !1; } } }, columns: { type: "primary", icon: t.icons.columnsFilter, title: o("fs.toolbar.columns.title"), circle: !0, order: 5 } }, "onUpdate:columns"(V) { const ne = s.value.table.columns; function L(k, N) { const J = {}; return Y(N, (ue) => { const Z = k[ue.key]; if (Z) { if (Z.columnSetShow === !1) { J[ue.key] = Z; return; } delete Z.order; const Se = Xt({ ...Z }, ue); J[ue.key] = Se, Z.children && (Se.children = L(Z.children, ue.children)); } }), J; } const A = L(ne, V); s.value.table.columns = A, s.value.table.columnsMap = Qr({}, A); } } }; } function y() { return { table: { onSortChange(F) { const { isServerSort: V, prop: ne, asc: L, order: A } = F; _r(s.value.table.columns, (N) => { N.key === ne ? N.sortOrder = A : N.sortOrder = !1; }); const k = s.value.table.sort; s.value.table.sort = V ? { prop: ne, order: A, asc: L } : null, (V || k != null) && i.doRefresh(); } } }; } function b() { return { actionbar: { buttons: { add: { click() { i.openAdd({}); } } } } }; } function R() { const { compute: F } = Pt(); 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 (V) => { const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey]; await i.editable.doRemoveRow({ editableId: A, row: L }); } } }, editRow: { edit: { text: "编辑", loading: F((V) => { const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey], k = i.editable.getEditableRow(A); return !!(k != null && k.loading); }), click: async (V) => { var k; const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey]; if (s.value.table.editable.exclusive) { const N = i.editable.getActiveRows(); Y(N, (J) => { s.value.table.editable.exclusiveEffect === "save" ? i.editable.doSaveRow({ row: J.rowData }) : i.editable.doCancelRow({ row: J.rowData }); }); } (k = i.editable.getEditableRow(A)) == null || k.active(); }, show: F((V) => { var k, N; const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey]; return !((N = (k = i.editable) == null ? void 0 : k.getEditableRow(A)) != null && N.isEditing); }) }, save: { text: "保存", loading: !1, click: async (V) => { const { index: ne, row: L } = V; await i.editable.doSaveRow({ row: L }); }, show: F((V) => { var k, N; const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey]; return !!((N = (k = i.editable) == null ? void 0 : k.getEditableRow(A)) != null && N.isEditing); }) }, cancel: { text: "取消", click: async (V) => { var A; const { index: ne, row: L } = V; await ((A = i.editable) == null ? void 0 : A.doCancelRow({ row: L })); }, show: F((V) => { var k, N; const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey]; return !!((N = (k = i.editable) == null ? void 0 : k.getEditableRow(A)) != null && N.isEditing); }) }, remove: { text: "删除", ...t.button.colors("danger"), click: async (V) => { var k; const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey]; await ((k = i.editable) == null ? void 0 : k.doRemoveRow({ row: L, editableId: A })); } } } } } }; } const { cloneDeep: D } = $e(); function $(F) { F.search.validatedForm = D(F.search.initialForm); } function T(F) { let V = D(F); const ne = no.commonOptions(e), L = no.defaultOptions({ t: n }); r = Xt({}, L, ne, V); const A = q(r.settings); if (A) { const ue = q(A.plugins); Y(ue, (Z, Se) => { if (Z.enabled === !1) return; let ke = Z.handle, m = {}; if (ke == null) { const S = hu(Se); S != null && (ke = S.handle, m = S.opts); } if (ke == null) return; const C = Z.before ?? m.before, _ = ke(Z.props, e, r); C !== !1 ? V = Xt(_, V) : V = Xt(V, _); }); } const k = Xt(L, c(), d(), f(), h(), v(), p(), y(), b(), R(), ne, V), { buildColumns: N } = Zr(), J = N(k); return $(J), J; } function E(F) { s.value = T(F), ce.info("fast-crud inited, crudBinding=", s.value); } function P(F) { const V = Xt({}, r, F); return E(V), r = V, V; } E(r); function W(F) { Xt(s.value, F); } return { appendCrudOptions: P, resetCrudOptions: E, appendCrudBinding: W, rebuildCrudBindings: T }; } function ui(e) { const { createCrudOptions: t, crudExposeRef: n } = e, o = e.crudRef || K(), r = e.crudBinding || K({}); let a = e.crudExpose; a || (a = ii({ 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 s = t({ ...e, crudExpose: a, expose: a, context: i }); function u(l) { const c = { crudExpose: a, ...l, context: i }; Xt(l.crudOptions, e.crudOptionsOverride); const d = mu(c); return { ...l, ...d, crudRef: o, crudExpose: a, crudBinding: r, context: i }; } return s instanceof Promise ? s.then((l) => u(l)) : u(s); } function cp(e) { return ui(e); } function pu(e) { return ui(e); } function gu() { const e = K(), t = K(), n = {}, { crudExpose: o } = ii({ crudBinding: t, crudRef: e }); return { crudRef: e, crudBinding: t, context: n, crudExpose: o }; } function un(e, t, n = "modelValue") { const o = qe.get(); let r = e.dict; r && r.prototype && (r.clear(), r = Bo(dt(e.dict)), r.cloneable = !1, r.clear()); function a() { return M(() => { let E = []; if (e.options ? E = e.options : r && r.data != null && (r.data instanceof Array || _t.logger.warn("dict.data类型错误,期望为数组,实际:", r.data), E = r.data, e.transformDictData && (E = e.transformDictData(dt(r.data)))), o.type === "naive") { const P = []; for (const W of E) P.push({ ...W, value: R(W), label: $(W) }); return P; } return E; }); } function i() { return r; } const s = jn("get:scope", function() { }); function u() { const E = e[n] || t.attrs[n]; return { ...s(), componentRef: l, value: E }; } const { proxy: l } = Go(), c = async (E = !1) => { if (!r) return; if (r.getNodesByValues) { const W = u(); if (W.value == null) return; let F = W.value; Array.isArray(W.value) || (F = [W.value]), await r.appendByValues(F); return; } if (r.loading) return; const P = u(); if (E) { await r.reloadDict(P); return; } await r.loadDict(P); }; c(); const d = async () => { await c(!0); }, f = () => { r && r.clear(); }, h = () => { r != null && (!r.prototype && !r.cloneable || it(() => e[n], () => { d(); })); }; (() => { it(() => r == null ? void 0 : r.data, () => { const E = u(); t.attrs.onDictChange, t.emit("dict-change", { dict: r, ...E }); }, { immediate: !0 }); })(); const p = () => { var E; return (E = i()) == null ? void 0 : E.data; }, y = (E, P) => { let W = P; return i() && (W = i()[P]), E[W]; }, b = (E, P) => { let W = P; i() && (W = i()[P]), delete E[W]; }, R = (E) => y(E, "value"), D = (E) => y(E, "children"), $ = (E) => { if (e.labelFormatter) return e.labelFormatter(E); const P = y(E, "label"); return P == null ? "" : String(P); }; return { createComputedOptions: a, loadDict: c, reloadDict: d, clearDict: f, getDictData: p, getDict: i, watchValue: h, getValue: R, getLabel: $, getChildren: D, getColor: (E) => y(E, "color"), removePropValue: b, curDict: r }; } const Sn = typeof performance == "object" && performance && typeof performance.now == "function" ? performance : Date, ci = /* @__PURE__ */ new Set(), Cr = typeof process == "object" && process ? process : {}, di = (e, t, n, o) => { typeof Cr.emitWarning == "function" ? Cr.emitWarning(e, t, n, o) : console.error(`[${n}] ${t}: ${e}`); }; let Lo = globalThis.AbortController, pa = globalThis.AbortSignal; var Ba; if (typeof Lo > "u") { pa = class { constructor() { ae(this, "onabort"); ae(this, "_onabort", []); ae(this, "reason"); ae(this, "aborted", !1); } addEventListener(o, r) { this._onabort.push(r); } }, Lo = class { constructor() { ae(this, "signal", new pa()); 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 = ((Ba = Cr.env) == null ? void 0 : Ba.LRU_CACHE_IGNORE_AC_WARNING) !== "1"; const t = () => { e && (e = !1, di("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 vu = (e) => !ci.has(e), Qt = (e) => e && e === Math.floor(e) && e > 0 && isFinite(e), fi = (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 ? ko : null : null; class ko extends Array { constructor(t) { super(t), this.fill(0); } } var Tn; const mn = class mn { constructor(t, n) { ae(this, "heap"); ae(this, "length"); if (!g(mn, Tn)) throw new TypeError("instantiate Stack using Stack.create(n)"); this.heap = new n(t), this.length = 0; } static create(t) { const n = fi(t); if (!n) return []; fe(mn, Tn, !0); const o = new mn(t, n); return fe(mn, Tn, !1), o; } push(t) { this.heap[this.length++] = t; } pop() { return this.heap[--this.length]; } }; Tn = new WeakMap(), // private constructor pe(mn, Tn, !1); let Sr = mn; var Rt, mt, Dt, kt, In, An, Ue, $t, ze, Ae, ge, rt, pt, Ze, Ge, Ot, Xe, Et, Tt, gt, It, on, at, io, Rr, gn, Wt, so, vt, Yo, hi, vn, Vn, lo, jt, Jt, Nt, Zt, uo, Dr, Zm, Pn, $o, Mn, Oo, Ee, Ie, co, kr, bn, zn, xt, en, fo, $r; const ra = class ra { constructor(t) { pe(this, io); pe(this, Yo); pe(this, jt); pe(this, Nt); pe(this, uo); pe(this, Pn); pe(this, Mn); pe(this, Ee); pe(this, co); pe(this, bn); pe(this, xt); pe(this, fo); // options that cannot be changed without disaster pe(this, Rt, void 0); pe(this, mt, void 0); pe(this, Dt, void 0); pe(this, kt, void 0); pe(this, In, void 0); pe(this, An, void 0); /** * {@link LRUCache.OptionsBase.ttl} */ ae(this, "ttl"); /** * {@link LRUCache.OptionsBase.ttlResolution} */ ae(this, "ttlResolution"); /** * {@link LRUCache.OptionsBase.ttlAutopurge} */ ae(this, "ttlAutopurge"); /** * {@link LRUCache.OptionsBase.updateAgeOnGet} */ ae(this, "updateAgeOnGet"); /** * {@link LRUCache.OptionsBase.updateAgeOnHas} */ ae(this, "updateAgeOnHas"); /** * {@link LRUCache.OptionsBase.allowStale} */ ae(this, "allowStale"); /** * {@link LRUCache.OptionsBase.noDisposeOnSet} */ ae(this, "noDisposeOnSet"); /** * {@link LRUCache.OptionsBase.noUpdateTTL} */ ae(this, "noUpdateTTL"); /** * {@link LRUCache.OptionsBase.maxEntrySize} */ ae(this, "maxEntrySize"); /** * {@link LRUCache.OptionsBase.sizeCalculation} */ ae(this, "sizeCalculation"); /** * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} */ ae(this, "noDeleteOnFetchRejection"); /** * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} */ ae(this, "noDeleteOnStaleGet"); /** * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} */ ae(this, "allowStaleOnFetchAbort"); /** * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} */ ae(this, "allowStaleOnFetchRejection"); /** * {@link LRUCache.OptionsBase.ignoreFetchAbort} */ ae(this, "ignoreFetchAbort"); // computed properties pe(this, Ue, void 0); pe(this, $t, void 0); pe(this, ze, void 0); pe(this, Ae, void 0); pe(this, ge, void 0); pe(this, rt, void 0); pe(this, pt, void 0); pe(this, Ze, void 0); pe(this, Ge, void 0); pe(this, Ot, void 0); pe(this, Xe, void 0); pe(this, Et, void 0); pe(this, Tt, void 0); pe(this, gt, void 0); pe(this, It, void 0); pe(this, on, void 0); pe(this, at, void 0); // conditionally set private methods related to TTL pe(this, gn, () => { }); pe(this, Wt, () => { }); pe(this, so, () => { }); /* c8 ignore stop */ pe(this, vt, () => !1); pe(this, vn, (t) => { }); pe(this, Vn, (t, n, o) => { }); pe(this, lo, (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`. */ ae(this, Zm, "LRUCache"); const { max: n = 0, ttl: o, ttlResolution: r = 1, ttlAutopurge: a, updateAgeOnGet: i, updateAgeOnHas: s, allowStale: u, dispose: l, disposeAfter: c, noDisposeOnSet: d, noUpdateTTL: f, maxSize: h = 0, maxEntrySize: v = 0, sizeCalculation: p, fetchMethod: y, memoMethod: b, noDeleteOnFetchRejection: R, noDeleteOnStaleGet: D, allowStaleOnFetchRejection: $, allowStaleOnFetchAbort: T, ignoreFetchAbort: E } = t; if (n !== 0 && !Qt(n)) throw new TypeError("max option must be a nonnegative integer"); const P = n ? fi(n) : Array; if (!P) throw new Error("invalid max value: " + n); if (fe(this, Rt, n), fe(this, mt, h), this.maxEntrySize = v || g(this, mt), this.sizeCalculation = p, this.sizeCalculation) { if (!g(this, mt) && !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 (b !== void 0 && typeof b != "function") throw new TypeError("memoMethod must be a function if defined"); if (fe(this, An, b), y !== void 0 && typeof y != "function") throw new TypeError("fetchMethod must be a function if specified"); if (fe(this, In, y), fe(this, on, !!y), fe(this, ze, /* @__PURE__ */ new Map()), fe(this, Ae, new Array(n).fill(void 0)), fe(this, ge, new Array(n).fill(void 0)), fe(this, rt, new P(n)), fe(this, pt, new P(n)), fe(this, Ze, 0), fe(this, Ge, 0), fe(this, Ot, Sr.create(n)), fe(this, Ue, 0), fe(this, $t, 0), typeof l == "function" && fe(this, Dt, l), typeof c == "function" ? (fe(this, kt, c), fe(this, Xe, [])) : (fe(this, kt, void 0), fe(this, Xe, void 0)), fe(this, It, !!g(this, Dt)), fe(this, at, !!g(this, kt)), this.noDisposeOnSet = !!d, this.noUpdateTTL = !!f, this.noDeleteOnFetchRejection = !!R, this.allowStaleOnFetchRejection = !!$, this.allowStaleOnFetchAbort = !!T, this.ignoreFetchAbort = !!E, this.maxEntrySize !== 0) { if (g(this, mt) !== 0 && !Qt(g(this, mt))) 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"); ee(this, Yo, hi).call(this); } if (this.allowStale = !!u, this.noDeleteOnStaleGet = !!D, this.updateAgeOnGet = !!i, this.updateAgeOnHas = !!s, 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"); ee(this, io, Rr).call(this); } if (g(this, Rt) === 0 && this.ttl === 0 && g(this, mt) === 0) throw new TypeError("At least one of max, maxSize, or ttl is required"); if (!this.ttlAutopurge && !g(this, Rt) && !g(this, mt)) { const W = "LRU_CACHE_UNBOUNDED"; vu(W) && (ci.add(W), di("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.", "UnboundedCacheWarning", W, ra)); } } /** * 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: g(t, Tt), ttls: g(t, gt), sizes: g(t, Et), keyMap: g(t, ze), keyList: g(t, Ae), valList: g(t, ge), next: g(t, rt), prev: g(t, pt), get head() { return g(t, Ze); }, get tail() { return g(t, Ge); }, free: g(t, Ot), // methods isBackgroundFetch: (n) => { var o; return ee(o = t, Ee, Ie).call(o, n); }, backgroundFetch: (n, o, r, a) => { var i; return ee(i = t, Mn, Oo).call(i, n, o, r, a); }, moveToTail: (n) => { var o; return ee(o = t, bn, zn).call(o, n); }, indexes: (n) => { var o; return ee(o = t, jt, Jt).call(o, n); }, rindexes: (n) => { var o; return ee(o = t, Nt, Zt).call(o, n); }, isStale: (n) => { var o; return g(o = t, vt).call(o, n); } }; } // Protected read-only members /** * {@link LRUCache.OptionsBase.max} (read-only) */ get max() { return g(this, Rt); } /** * {@link LRUCache.OptionsBase.maxSize} (read-only) */ get maxSize() { return g(this, mt); } /** * The total computed size of items in the cache (read-only) */ get calculatedSize() { return g(this, $t); } /** * The number of items stored in the cache (read-only) */ get size() { return g(this, Ue); } /** * {@link LRUCache.OptionsBase.fetchMethod} (read-only) */ get fetchMethod() { return g(this, In); } get memoMethod() { return g(this, An); } /** * {@link LRUCache.OptionsBase.dispose} (read-only) */ get dispose() { return g(this, Dt); } /** * {@link LRUCache.OptionsBase.disposeAfter} (read-only) */ get disposeAfter() { return g(this, kt); } /** * 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 g(this, ze).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 ee(this, jt, Jt).call(this)) g(this, ge)[t] !== void 0 && g(this, Ae)[t] !== void 0 && !ee(this, Ee, Ie).call(this, g(this, ge)[t]) && (yield [g(this, Ae)[t], g(this, ge)[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 ee(this, Nt, Zt).call(this)) g(this, ge)[t] !== void 0 && g(this, Ae)[t] !== void 0 && !ee(this, Ee, Ie).call(this, g(this, ge)[t]) && (yield [g(this, Ae)[t], g(this, ge)[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 ee(this, jt, Jt).call(this)) { const n = g(this, Ae)[t]; n !== void 0 && !ee(this, Ee, Ie).call(this, g(this, ge)[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 ee(this, Nt, Zt).call(this)) { const n = g(this, Ae)[t]; n !== void 0 && !ee(this, Ee, Ie).call(this, g(this, ge)[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 ee(this, jt, Jt).call(this)) g(this, ge)[t] !== void 0 && !ee(this, Ee, Ie).call(this, g(this, ge)[t]) && (yield g(this, ge)[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 ee(this, Nt, Zt).call(this)) g(this, ge)[t] !== void 0 && !ee(this, Ee, Ie).call(this, g(this, ge)[t]) && (yield g(this, ge)[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 ee(this, jt, Jt).call(this)) { const r = g(this, ge)[o], a = ee(this, Ee, Ie).call(this, r) ? r.__staleWhileFetching : r; if (a !== void 0 && t(a, g(this, Ae)[o], this)) return this.get(g(this, Ae)[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 ee(this, jt, Jt).call(this)) { const r = g(this, ge)[o], a = ee(this, Ee, Ie).call(this, r) ? r.__staleWhileFetching : r; a !== void 0 && t.call(n, a, g(this, Ae)[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 ee(this, Nt, Zt).call(this)) { const r = g(this, ge)[o], a = ee(this, Ee, Ie).call(this, r) ? r.__staleWhileFetching : r; a !== void 0 && t.call(n, a, g(this, Ae)[o], this); } } /** * Delete any stale entries. Returns true if anything was removed, * false otherwise. */ purgeStale() { let t = !1; for (const n of ee(this, Nt, Zt).call(this, { allowStale: !0 })) g(this, vt).call(this, n) && (ee(this, xt, en).call(this, g(this, Ae)[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 = g(this, ze).get(t); if (n === void 0) return; const o = g(this, ge)[n], r = ee(this, Ee, Ie).call(this, o) ? o.__staleWhileFetching : o; if (r === void 0) return; const a = { value: r }; if (g(this, gt) && g(this, Tt)) { const i = g(this, gt)[n], s = g(this, Tt)[n]; if (i && s) { const u = i - (Sn.now() - s); a.ttl = u, a.start = Date.now(); } } return g(this, Et) && (a.size = g(this, Et)[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 ee(this, jt, Jt).call(this, { allowStale: !0 })) { const o = g(this, Ae)[n], r = g(this, ge)[n], a = ee(this, Ee, Ie).call(this, r) ? r.__staleWhileFetching : r; if (a === void 0 || o === void 0) continue; const i = { value: a }; if (g(this, gt) && g(this, Tt)) { i.ttl = g(this, gt)[n]; const s = Sn.now() - g(this, Tt)[n]; i.start = Math.floor(Date.now() - s); } g(this, Et) && (i.size = g(this, Et)[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 = Sn.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, v, p, y; if (n === void 0) return this.delete(t), this; const { ttl: r = this.ttl, start: a, noDisposeOnSet: i = this.noDisposeOnSet, sizeCalculation: s = this.sizeCalculation, status: u } = o; let { noUpdateTTL: l = this.noUpdateTTL } = o; const c = g(this, lo).call(this, t, n, o.size || 0, s); if (this.maxEntrySize && c > this.maxEntrySize) return u && (u.set = "miss", u.maxEntrySizeExceeded = !0), ee(this, xt, en).call(this, t, "set"), this; let d = g(this, Ue) === 0 ? void 0 : g(this, ze).get(t); if (d === void 0) d = g(this, Ue) === 0 ? g(this, Ge) : g(this, Ot).length !== 0 ? g(this, Ot).pop() : g(this, Ue) === g(this, Rt) ? ee(this, Pn, $o).call(this, !1) : g(this, Ue), g(this, Ae)[d] = t, g(this, ge)[d] = n, g(this, ze).set(t, d), g(this, rt)[g(this, Ge)] = d, g(this, pt)[d] = g(this, Ge), fe(this, Ge, d), bo(this, Ue)._++, g(this, Vn).call(this, d, c, u), u && (u.set = "add"), l = !1; else { ee(this, bn, zn).call(this, d); const b = g(this, ge)[d]; if (n !== b) { if (g(this, on) && ee(this, Ee, Ie).call(this, b)) { b.__abortController.abort(new Error("replaced")); const { __staleWhileFetching: R } = b; R !== void 0 && !i && (g(this, It) && ((f = g(this, Dt)) == null || f.call(this, R, t, "set")), g(this, at) && ((h = g(this, Xe)) == null || h.push([R, t, "set"]))); } else i || (g(this, It) && ((v = g(this, Dt)) == null || v.call(this, b, t, "set")), g(this, at) && ((p = g(this, Xe)) == null || p.push([b, t, "set"]))); if (g(this, vn).call(this, d), g(this, Vn).call(this, d, c, u), g(this, ge)[d] = n, u) { u.set = "replace"; const R = b && ee(this, Ee, Ie).call(this, b) ? b.__staleWhileFetching : b; R !== void 0 && (u.oldValue = R); } } else u && (u.set = "update"); } if (r !== 0 && !g(this, gt) && ee(this, io, Rr).call(this), g(this, gt) && (l || g(this, so).call(this, d, r, a), u && g(this, Wt).call(this, u, d)), !i && g(this, at) && g(this, Xe)) { const b = g(this, Xe); let R; for (; R = b == null ? void 0 : b.shift(); ) (y = g(this, kt)) == null || y.call(this, ...R); } return this; } /** * Evict the least recently used item, returning its value or * `undefined` if cache is empty. */ pop() { var t; try { for (; g(this, Ue); ) { const n = g(this, ge)[g(this, Ze)]; if (ee(this, Pn, $o).call(this, !0), ee(this, Ee, Ie).call(this, n)) { if (n.__staleWhileFetching) return n.__staleWhileFetching; } else if (n !== void 0) return n; } } finally { if (g(this, at) && g(this, Xe)) { const n = g(this, Xe); let o; for (; o = n == null ? void 0 : n.shift(); ) (t = g(this, kt)) == 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 = g(this, ze).get(t); if (a !== void 0) { const i = g(this, ge)[a]; if (ee(this, Ee, Ie).call(this, i) && i.__staleWhileFetching === void 0) return !1; if (g(this, vt).call(this, a)) r && (r.has = "stale", g(this, Wt).call(this, r, a)); else return o && g(this, gn).call(this, a), r && (r.has = "hit", g(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 = g(this, ze).get(t); if (r === void 0 || !o && g(this, vt).call(this, r)) return; const a = g(this, ge)[r]; return ee(this, Ee, 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: s = this.noDisposeOnSet, size: u = 0, sizeCalculation: l = this.sizeCalculation, noUpdateTTL: c = this.noUpdateTTL, // fetch exclusive options noDeleteOnFetchRejection: d = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection: f = this.allowStaleOnFetchRejection, ignoreFetchAbort: h = this.ignoreFetchAbort, allowStaleOnFetchAbort: v = this.allowStaleOnFetchAbort, context: p, forceRefresh: y = !1, status: b, signal: R } = n; if (!g(this, on)) return b && (b.fetch = "get"), this.get(t, { allowStale: o, updateAgeOnGet: r, noDeleteOnStaleGet: a, status: b }); const D = { allowStale: o, updateAgeOnGet: r, noDeleteOnStaleGet: a, ttl: i, noDisposeOnSet: s, size: u, sizeCalculation: l, noUpdateTTL: c, noDeleteOnFetchRejection: d, allowStaleOnFetchRejection: f, allowStaleOnFetchAbort: v, ignoreFetchAbort: h, status: b, signal: R }; let $ = g(this, ze).get(t); if ($ === void 0) { b && (b.fetch = "miss"); const T = ee(this, Mn, Oo).call(this, t, $, D, p); return T.__returned = T; } else { const T = g(this, ge)[$]; if (ee(this, Ee, Ie).call(this, T)) { const V = o && T.__staleWhileFetching !== void 0; return b && (b.fetch = "inflight", V && (b.returnedStale = !0)), V ? T.__staleWhileFetching : T.__returned = T; } const E = g(this, vt).call(this, $); if (!y && !E) return b && (b.fetch = "hit"), ee(this, bn, zn).call(this, $), r && g(this, gn).call(this, $), b && g(this, Wt).call(this, b, $), T; const P = ee(this, Mn, Oo).call(this, t, $, D, p), F = P.__staleWhileFetching !== void 0 && o; return b && (b.fetch = E ? "stale" : "refresh", F && E && (b.returnedStale = !0)), F ? P.__staleWhileFetching : P.__returned = P; } } 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 = g(this, An); if (!o) throw new Error("no memoMethod provided to constructor"); const { context: r, forceRefresh: a, ...i } = n, s = this.get(t, i); if (!a && s !== void 0) return s; const u = o(t, s, { options: i, context: r }); return this.set(t, u, i), u; } /** * 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, s = g(this, ze).get(t); if (s !== void 0) { const u = g(this, ge)[s], l = ee(this, Ee, Ie).call(this, u); return i && g(this, Wt).call(this, i, s), g(this, vt).call(this, s) ? (i && (i.get = "stale"), l ? (i && o && u.__staleWhileFetching !== void 0 && (i.returnedStale = !0), o ? u.__staleWhileFetching : void 0) : (a || ee(this, xt, en).call(this, t, "expire"), i && o && (i.returnedStale = !0), o ? u : void 0)) : (i && (i.get = "hit"), l ? u.__staleWhileFetching : (ee(this, bn, zn).call(this, s), r && g(this, gn).call(this, s), u)); } else i && (i.get = "miss"); } /** * Deletes a key out of the cache. * * Returns true if the key was deleted, false otherwise. */ delete(t) { return ee(this, xt, en).call(this, t, "delete"); } /** * Clear the cache entirely, throwing away all values. */ clear() { return ee(this, fo, $r).call(this, "delete"); } }; Zm = Symbol.toStringTag, Rt = new WeakMap(), mt = new WeakMap(), Dt = new WeakMap(), kt = new WeakMap(), In = new WeakMap(), An = new WeakMap(), Ue = new WeakMap(), $t = new WeakMap(), ze = new WeakMap(), Ae = new WeakMap(), ge = new WeakMap(), rt = new WeakMap(), pt = new WeakMap(), Ze = new WeakMap(), Ge = new WeakMap(), Ot = new WeakMap(), Xe = new WeakMap(), Et = new WeakMap(), Tt = new WeakMap(), gt = new WeakMap(), It = new WeakMap(), on = new WeakMap(), at = new WeakMap(), io = new WeakSet(), Rr = function() { const t = new ko(g(this, Rt)), n = new ko(g(this, Rt)); fe(this, gt, t), fe(this, Tt, n), fe(this, so, (a, i, s = Sn.now()) => { if (n[a] = i !== 0 ? s : 0, t[a] = i, i !== 0 && this.ttlAutopurge) { const u = setTimeout(() => { g(this, vt).call(this, a) && ee(this, xt, en).call(this, g(this, Ae)[a], "expire"); }, i + 1); u.unref && u.unref(); } }), fe(this, gn, (a) => { n[a] = t[a] !== 0 ? Sn.now() : 0; }), fe(this, Wt, (a, i) => { if (t[i]) { const s = t[i], u = n[i]; if (!s || !u) return; a.ttl = s, a.start = u, a.now = o || r(); const l = a.now - u; a.remainingTTL = s - l; } }); let o = 0; const r = () => { const a = Sn.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 = g(this, ze).get(a); if (i === void 0) return 0; const s = t[i], u = n[i]; if (!s || !u) return 1 / 0; const l = (o || r()) - u; return s - l; }, fe(this, vt, (a) => { const i = n[a], s = t[a]; return !!s && !!i && (o || r()) - i > s; }); }, gn = new WeakMap(), Wt = new WeakMap(), so = new WeakMap(), vt = new WeakMap(), Yo = new WeakSet(), hi = function() { const t = new ko(g(this, Rt)); fe(this, $t, 0), fe(this, Et, t), fe(this, vn, (n) => { fe(this, $t, g(this, $t) - t[n]), t[n] = 0; }), fe(this, lo, (n, o, r, a) => { if (ee(this, Ee, 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, Vn, (n, o, r) => { if (t[n] = o, g(this, mt)) { const a = g(this, mt) - t[n]; for (; g(this, $t) > a; ) ee(this, Pn, $o).call(this, !0); } fe(this, $t, g(this, $t) + t[n]), r && (r.entrySize = o, r.totalCalculatedSize = g(this, $t)); }); }, vn = new WeakMap(), Vn = new WeakMap(), lo = new WeakMap(), jt = new WeakSet(), Jt = function* ({ allowStale: t = this.allowStale } = {}) { if (g(this, Ue)) for (let n = g(this, Ge); !(!ee(this, uo, Dr).call(this, n) || ((t || !g(this, vt).call(this, n)) && (yield n), n === g(this, Ze))); ) n = g(this, pt)[n]; }, Nt = new WeakSet(), Zt = function* ({ allowStale: t = this.allowStale } = {}) { if (g(this, Ue)) for (let n = g(this, Ze); !(!ee(this, uo, Dr).call(this, n) || ((t || !g(this, vt).call(this, n)) && (yield n), n === g(this, Ge))); ) n = g(this, rt)[n]; }, uo = new WeakSet(), Dr = function(t) { return t !== void 0 && g(this, ze).get(g(this, Ae)[t]) === t; }, Pn = new WeakSet(), $o = function(t) { var a, i; const n = g(this, Ze), o = g(this, Ae)[n], r = g(this, ge)[n]; return g(this, on) && ee(this, Ee, Ie).call(this, r) ? r.__abortController.abort(new Error("evicted")) : (g(this, It) || g(this, at)) && (g(this, It) && ((a = g(this, Dt)) == null || a.call(this, r, o, "evict")), g(this, at) && ((i = g(this, Xe)) == null || i.push([r, o, "evict"]))), g(this, vn).call(this, n), t && (g(this, Ae)[n] = void 0, g(this, ge)[n] = void 0, g(this, Ot).push(n)), g(this, Ue) === 1 ? (fe(this, Ze, fe(this, Ge, 0)), g(this, Ot).length = 0) : fe(this, Ze, g(this, rt)[n]), g(this, ze).delete(o), bo(this, Ue)._--, n; }, Mn = new WeakSet(), Oo = function(t, n, o, r) { const a = n === void 0 ? void 0 : g(this, ge)[n]; if (ee(this, Ee, Ie).call(this, a)) return a; const i = new Lo(), { signal: s } = o; s == null || s.addEventListener("abort", () => i.abort(s.reason), { signal: i.signal }); const u = { signal: i.signal, options: o, context: r }, l = (p, y = !1) => { const { aborted: b } = i.signal, R = o.ignoreFetchAbort && p !== void 0; if (o.status && (b && !y ? (o.status.fetchAborted = !0, o.status.fetchError = i.signal.reason, R && (o.status.fetchAbortIgnored = !0)) : o.status.fetchResolved = !0), b && !R && !y) return d(i.signal.reason); const D = h; return g(this, ge)[n] === h && (p === void 0 ? D.__staleWhileFetching ? g(this, ge)[n] = D.__staleWhileFetching : ee(this, xt, en).call(this, t, "fetch") : (o.status && (o.status.fetchUpdated = !0), this.set(t, p, u.options))), p; }, c = (p) => (o.status && (o.status.fetchRejected = !0, o.status.fetchError = p), d(p)), d = (p) => { const { aborted: y } = i.signal, b = y && o.allowStaleOnFetchAbort, R = b || o.allowStaleOnFetchRejection, D = R || o.noDeleteOnFetchRejection, $ = h; if (g(this, ge)[n] === h && (!D || $.__staleWhileFetching === void 0 ? ee(this, xt, en).call(this, t, "fetch") : b || (g(this, ge)[n] = $.__staleWhileFetching)), R) return o.status && $.__staleWhileFetching !== void 0 && (o.status.returnedStale = !0), $.__staleWhileFetching; if ($.__returned === $) throw p; }, f = (p, y) => { var R; const b = (R = g(this, In)) == null ? void 0 : R.call(this, t, a, u); b && b instanceof Promise && b.then((D) => p(D === void 0 ? void 0 : D), y), i.signal.addEventListener("abort", () => { (!o.ignoreFetchAbort || o.allowStaleOnFetchAbort) && (p(void 0), o.allowStaleOnFetchAbort && (p = (D) => l(D, !0))); }); }; o.status && (o.status.fetchDispatched = !0); const h = new Promise(f).then(l, c), v = Object.assign(h, { __abortController: i, __staleWhileFetching: a, __returned: void 0 }); return n === void 0 ? (this.set(t, v, { ...u.options, status: void 0 }), n = g(this, ze).get(t)) : g(this, ge)[n] = v, v; }, Ee = new WeakSet(), Ie = function(t) { if (!g(this, on)) return !1; const n = t; return !!n && n instanceof Promise && n.hasOwnProperty("__staleWhileFetching") && n.__abortController instanceof Lo; }, co = new WeakSet(), kr = function(t, n) { g(this, pt)[n] = t, g(this, rt)[t] = n; }, bn = new WeakSet(), zn = function(t) { t !== g(this, Ge) && (t === g(this, Ze) ? fe(this, Ze, g(this, rt)[t]) : ee(this, co, kr).call(this, g(this, pt)[t], g(this, rt)[t]), ee(this, co, kr).call(this, g(this, Ge), t), fe(this, Ge, t)); }, xt = new WeakSet(), en = function(t, n) { var r, a, i, s; let o = !1; if (g(this, Ue) !== 0) { const u = g(this, ze).get(t); if (u !== void 0) if (o = !0, g(this, Ue) === 1) ee(this, fo, $r).call(this, n); else { g(this, vn).call(this, u); const l = g(this, ge)[u]; if (ee(this, Ee, Ie).call(this, l) ? l.__abortController.abort(new Error("deleted")) : (g(this, It) || g(this, at)) && (g(this, It) && ((r = g(this, Dt)) == null || r.call(this, l, t, n)), g(this, at) && ((a = g(this, Xe)) == null || a.push([l, t, n]))), g(this, ze).delete(t), g(this, Ae)[u] = void 0, g(this, ge)[u] = void 0, u === g(this, Ge)) fe(this, Ge, g(this, pt)[u]); else if (u === g(this, Ze)) fe(this, Ze, g(this, rt)[u]); else { const c = g(this, pt)[u]; g(this, rt)[c] = g(this, rt)[u]; const d = g(this, rt)[u]; g(this, pt)[d] = g(this, pt)[u]; } bo(this, Ue)._--, g(this, Ot).push(u); } } if (g(this, at) && ((i = g(this, Xe)) != null && i.length)) { const u = g(this, Xe); let l; for (; l = u == null ? void 0 : u.shift(); ) (s = g(this, kt)) == null || s.call(this, ...l); } return o; }, fo = new WeakSet(), $r = function(t) { var n, o, r; for (const a of ee(this, Nt, Zt).call(this, { allowStale: !0 })) { const i = g(this, ge)[a]; if (ee(this, Ee, Ie).call(this, i)) i.__abortController.abort(new Error("deleted")); else { const s = g(this, Ae)[a]; g(this, It) && ((n = g(this, Dt)) == null || n.call(this, i, s, t)), g(this, at) && ((o = g(this, Xe)) == null || o.push([i, s, t])); } } if (g(this, ze).clear(), g(this, ge).fill(void 0), g(this, Ae).fill(void 0), g(this, gt) && g(this, Tt) && (g(this, gt).fill(0), g(this, Tt).fill(0)), g(this, Et) && g(this, Et).fill(0), fe(this, Ze, 0), fe(this, Ge, 0), g(this, Ot).length = 0, fe(this, $t, 0), fe(this, Ue, 0), g(this, at) && g(this, Xe)) { const a = g(this, Xe); let i; for (; i = a == null ? void 0 : a.shift(); ) (r = g(this, kt)) == null || r.call(this, ...i); } }; let Fr = ra; const yo = new Fr({ max: 500, maxSize: 5e3, ttl: 1e3 * 60 * 30, sizeCalculation: (e, t) => 1 }), { UnMergeable: bu } = $e(); function yu(e) { mi = e; } let mi = async (e) => (ce.warn("请配置 app.use(FsCrud,{dictRequest:(context)=>{ 你的字典请求方法 }})"), []); class pi extends bu { //loadDict成功后的通知 constructor(n) { super(); ae(this, "cache", !1); // 获取到结果是否进行全局缓存 ae(this, "prototype", !1); // 是否原型配置 ae(this, "immediate", !0); //是否立即请求 ae(this, "url"); ae(this, "getData"); ae(this, "value", "value"); ae(this, "label", "label"); ae(this, "labelBuilder"); ae(this, "children", "children"); ae(this, "color", "color"); ae(this, "isTree", !1); ae(this, "_data", null); ae(this, "originalData"); ae(this, "dataMap", {}); ae(this, "loading", !1); ae(this, "custom", {}); ae(this, "getNodesByValues"); ae(this, "onReady"); ae(this, "notifies", []); ae(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, ho(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 = yo.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 && yo.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 && (Y(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 (Y(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 mi({ url: a, dict: this }); return Array.isArray(i) ? i : []; }; else return []; if (this.cache && r) { let i = yo.get(r); if (i == null) i = { loaded: !1, loading: !0, data: void 0, callback: [] }, yo.set(r, i); else { if (i.loaded) return i.data; if (i.loading) return new Promise((s) => { const u = (l) => { s(l); }; i.callback.push(u); }); } try { i.loaded = !1, i.loading = !0; let s = await o(); s = s || [], s instanceof Array || ce.warn("dict data 格式有误,期望格式为数组,实际格式为:", s), i.data = s, i.loaded = !0, i.loading = !1; for (const u of i.callback) u(s); return i.callback = [], s; } catch (s) { i.loading = !1, i.loaded = !1, ce.error("load dict error:", s); } } 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) { Y(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 []; jo(n) || (n = [n]); const o = []; return Y(n, (r) => { const a = this.dataMap[r]; a ? o.push(a) : o.push({ [this.value]: r }); }), o; } } function wu(e) { const t = Bo(new pi(e)); return !t.prototype && t.immediate && t.loadDict(), t; } function _u() { return { dict: wu, setDictRequest: yu, Dict: pi }; } function hp() { return { addTypes: $n.addTypes, getType: $n.getType, getTypes: $n.getTypes, install: $n.install }; } async function Cu(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 s = i.clientX, u = i.clientY; o.style.transform = "translate(0px, 0px)"; let l, c; a.left.includes("%") ? (l = +document.body.clientWidth * (+a.left.replace(/%/g, "") / 100), c = +document.body.clientHeight * (+a.top.replace(/%/g, "") / 100)) : (l = +a.left.replace(/px/g, ""), c = +a.top.replace(/px/g, ""), c = c === 0 ? 100 : c), document.onmousemove = function(d) { const f = d.clientX - s, h = d.clientY - u; o.style.left = `${f + l}px`, o.style.top = `${h + c}px`; }, document.onmouseup = function(d) { document.onmousemove = null, document.onmouseup = null; }; }; } async function Su(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 s = i.clientX, u = i.clientY; o.style.transform = "translate(0px, 0px)"; let l, c; a.left.includes("%") ? (l = +document.body.clientWidth * (+a.left.replace(/%/g, "") / 100), c = +document.body.clientHeight * (+a.top.replace(/%/g, "") / 100)) : (l = +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 - s, h = d.clientY - u; o.style.left = `${f + l}px`, o.style.top = `${h + c}px`; }, document.onmouseup = function(d) { document.onmousemove = null, document.onmouseup = null; }; }; } async function Fu(e) { const { ui: t } = we(); t.type === "antdv" ? await Cu(e) : t.type === "element" || await Su(e); } function Ru() { return { dragModal: Fu }; } const Du = { logger: { off: { tableColumns: !1 } } }, ku = le({ name: "FsContainer", props: { /** * 是否固定高度 */ fixedHeight: { type: Boolean, default: !0 }, /** * body的样式 */ bodyStyle: { type: Object, default: () => ({}) }, /** * inner的样式 */ innerStyle: { type: Object, default: () => ({}) } }, setup(e, t) { const { merge: n } = $e(), o = M(() => e.fixedHeight === !1 ? n({ position: "relative" }, e.innerStyle) : e.innerStyle), r = M(() => e.fixedHeight === !1 ? n({ flex: "unset" }, e.bodyStyle) : e.bodyStyle); return { computedInnerStyle: o, computedBodyStyle: r }; } }); const $u = { class: "fs-container" }, Ou = { class: "box" }, Eu = { class: "header" }, Tu = { class: "footer" }; function Iu(e, t, n, o, r, a) { return w(), j("div", $u, [ te("div", Ou, [ te("div", { class: "inner", style: to(e.computedInnerStyle) }, [ te("div", Eu, [ re(e.$slots, "header") ]), te("div", { class: "body", style: to(e.computedBodyStyle) }, [ re(e.$slots, "default") ], 4), te("div", Tu, [ re(e.$slots, "footer") ]) ], 4) ]), re(e.$slots, "box") ]); } const Au = /* @__PURE__ */ Oe(ku, [["render", Iu]]), Vu = le({ name: "FsLayoutDefault" }); const Pu = { class: "fs-crud-header" }, Mu = { class: "fs-header-top" }, Bu = { class: "fs-header-middle" }, ju = { class: "fs-header-bottom" }, Nu = { class: "fs-crud-footer" }; function xu(e, t, n, o, r, a) { const i = G("fs-container"); return w(), I(i, { class: "fs-layout-default" }, { header: B(() => [ te("div", Pu, [ te("div", Mu, [ re(e.$slots, "header-top") ]), re(e.$slots, "search"), te("div", Bu, [ re(e.$slots, "header-middle") ]), re(e.$slots, "actionbar"), re(e.$slots, "toolbar"), te("div", ju, [ re(e.$slots, "header-bottom") ]), re(e.$slots, "tabs") ]) ]), footer: B(() => [ te("div", Nu, [ re(e.$slots, "footer-top"), re(e.$slots, "pagination"), re(e.$slots, "footer-bottom") ]) ]), default: B(() => [ re(e.$slots, "default"), re(e.$slots, "table"), re(e.$slots, "form") ]), _: 3 }); } const Lu = /* @__PURE__ */ Oe(Vu, [["render", xu]]), qu = le({ name: "FsLayoutCard", setup() { const e = jn("get:crudBinding"), t = M(() => { var r, a; return e == null ? !0 : (a = (r = e()) == null ? void 0 : r.search) == null ? void 0 : a.show; }), { ui: n } = we(), o = K(n.card.name); return { searchShow: t, cardComponentName: o }; } }); const Hu = { class: "fs-header-top" }, zu = { class: "fs-header-bottom" }, Wu = { class: "top-bar" }, Uu = { class: "top-bar" }, Ku = { class: "fs-crud-footer" }; function Yu(e, t, n, o, r, a) { const i = G("fs-container"); return w(), I(i, { class: "fs-layout-card" }, { header: B(() => [ te("div", Hu, [ re(e.$slots, "header-top") ]), e.searchShow ? (w(), I(H(e.cardComponentName), { key: 0 }, { default: B(() => [ re(e.$slots, "search") ]), _: 3 })) : oe("", !0), te("div", zu, [ re(e.$slots, "header-bottom") ]) ]), default: B(() => [ x(i, null, { header: B(() => [ re(e.$slots, "tabs") ]), default: B(() => [ (w(), I(H(e.cardComponentName), { class: "fs-layout-card-body" }, { title: B(() => [ te("div", Wu, [ re(e.$slots, "actionbar"), re(e.$slots, "toolbar") ]) ]), header: B(() => [ te("div", Uu, [ re(e.$slots, "actionbar"), re(e.$slots, "toolbar") ]) ]), default: B(() => [ x(i, null, { footer: B(() => [ te("div", Ku, [ re(e.$slots, "footer-top"), re(e.$slots, "pagination"), re(e.$slots, "footer-bottom") ]) ]), default: B(() => [ re(e.$slots, "default"), re(e.$slots, "table"), re(e.$slots, "form") ]), _: 3 }) ]), _: 3 })) ]), _: 3 }) ]), _: 3 }); } const Gu = /* @__PURE__ */ Oe(qu, [["render", Yu]]); function Xu(e) { return typeof e == "function" || Object.prototype.toString.call(e) === "[object Object]" && !xr(e); } const Qu = /* @__PURE__ */ le({ 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 }, /** * x-button的配置,当x-button的配置与fs-button的配置有冲突时可以配置在此处 * 比如:n-button的text */ buttonProps: { type: Object, default: void 0 }, className: {} }, setup(e, t) { const { ui: n } = we(), { merge: o } = $e(), r = (l, c = "fs-button-icon") => { if (l != null) return typeof l == "string" ? x(G("fs-icon"), { icon: l, class: c }, null) : typeof l == "function" ? l() : x(G("fs-icon"), z(l, { class: c }), null); }, a = () => { const l = e.icon, c = e.iconRight, d = n.type !== "element", f = !d; let h; const v = { ...t.slots }; (l && !d && !f || t.slots.default || e.text || c) && (v.default = () => { const R = []; return l && !d && !f && R.push(r(l)), t.slots.default && R.push(t.slots.default()), e.text && R.push(e.text), c && R.push(r(c, "fs-button-icon-right")), R; }), l && (d && !v.icon ? v.icon = () => r(l) : f && !v.icon && (h = r(l))); const p = e.circle ? n.button.circle : {}, y = H(n.button.name), b = o({ ...p, //icon, class: { "fs-button": !0, "is-thin": !e.text && !t.slots.default } }, { class: e.className, ...t.attrs, ...e.buttonProps }); return h && (b.icon = h), vr(y, b, v); }; if (!e.tooltip) return a; const i = H(n.tooltip.name), s = M(() => wn(e.tooltip, "slots")), u = n.tooltip.trigger; return () => { var c; const l = { ...(c = e.tooltip) == null ? void 0 : c.slots, [u]: a }; return x(i, s.value, Xu(l) ? l : { default: () => [l] }); }; } }), Ju = /* @__PURE__ */ le({ name: "FsIcon", inheritAttrs: !1, props: { /** * icon名称 */ icon: { type: String, default: void 0, require: !0 } }, setup(e, t) { const { ui: n } = we(), o = M(() => { var a; if (e.icon && ((a = e.icon) == null ? void 0 : a.indexOf(":")) >= 0) { if (e.icon.startsWith("svg:")) { const s = H("FsIconSvg"); return () => { const u = e.icon.replace("svg:", ""); return x(s, z({ class: "fs-icon", icon: u }, t.attrs), null); }; } const i = H("FsIconify"); return () => x(i, z({ class: "fs-icon", icon: e.icon }, t.attrs), null); } const r = H(e.icon); return typeof r == "string" ? () => x("span", { title: "error icon name" }, [r]) : n.icon.isComponent ? () => x(r, z({ class: "fs-icon" }, t.attrs), null) : () => x(G("el-icon"), z({ class: "fs-icon" }, t.attrs), { default: () => [x(r, null, null)] }); }); return () => o.value(); } }), Zu = le({ name: "FsIconify", components: { Icon: ws }, props: { /** * 图标名称 */ icon: { type: String }, /** * 旋转 */ spin: { type: Boolean, default: !1 } }, setup(e, t) { return { iconifyRef: K(null) }; } }); function ec(e, t, n, o, r, a) { const i = G("Icon"); return w(), j("span", { class: St(["fs-iconify", { "fs-iconify-spin": e.spin }]) }, [ x(i, { ref: "iconifyRef", icon: e.icon, inline: !0 }, null, 8, ["icon"]) ], 2); } const tc = /* @__PURE__ */ Oe(Zu, [["render", ec]]), nc = le({ name: "FsSvgIcon", props: { icon: { type: String, required: !0 }, size: { type: [Number, String], default: 16 }, spin: { type: Boolean, default: !1 } }, setup(e) { const t = M(() => `#${e.icon}`), n = M(() => { const { size: o } = e; let r = `${o}`; return r = `${r.replace("px", "")}px`, { width: r, height: r }; }); return { symbolId: t, getStyle: n }; } }); const oc = { class: "fs-icon-svg-content", "aria-hidden": "true" }, rc = ["xlink:href"]; function ac(e, t, n, o, r, a) { return w(), j("span", { class: St(["fs-icon-svg", e.spin && "fs-icon-spin"]) }, [ (w(), j("svg", oc, [ te("use", { "xlink:href": e.symbolId }, null, 8, rc) ])) ], 2); } const ic = /* @__PURE__ */ Oe(nc, [["render", ac]]), sc = le({ name: "FsLabel", props: { label: { type: String, default: "" }, labelAttrs: { type: Object, default: () => ({}) }, contentAttrs: { type: Object, default: () => ({}) } } }); const lc = { class: "fs-label" }; function uc(e, t, n, o, r, a) { return w(), j("div", lc, [ te("div", z({ class: "label" }, e.labelAttrs), [ Vt(We(e.label) + " ", 1), re(e.$slots, "label") ], 16), te("div", z({ class: "content" }, e.contentAttrs), [ re(e.$slots, "default") ], 16) ]); } const cc = /* @__PURE__ */ Oe(sc, [["render", uc]]), dc = { key: 0, class: "fs-loading" }, fc = { key: 0 }, hc = le({ name: "FsLoading" }), mc = /* @__PURE__ */ le({ ...hc, props: { loading: { type: Boolean }, icon: {}, text: {} }, setup(e) { const { ui: t } = we(); return (n, o) => { const r = G("fs-icon"); return n.loading ? (w(), j("div", dc, [ x(r, { class: "fs-icon-spin", icon: n.icon ?? q(t).icons.refresh }, null, 8, ["icon"]), n.text ? (w(), j("span", fc, We(n.text), 1)) : oe("", !0) ])) : oe("", !0); }; } }); const pc = le({ name: "FsBox" }), gc = { class: "fs-box" }; function vc(e, t, n, o, r, a) { return w(), j("div", gc, [ re(e.$slots, "default") ]); } const bc = /* @__PURE__ */ Oe(pc, [["render", vc]]); function yc(e) { return typeof e == "function" || Object.prototype.toString.call(e) === "[object Object]" && !xr(e); } function ga(e, t) { if (e[t] instanceof Array) { const n = e[t]; e[t] = (o) => { for (const r of n) r(o); }; } } const wc = ["div", "span", "a", "p", "pre", "li", "ol", "ul"], _c = /* @__PURE__ */ le({ 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) { _t.trace("fs-component-render"); const { ui: n } = we(), { merge: o } = $e(); sn("get:scope", () => e.scope), _n(() => { t.emit("mounted", e.scope); }); const r = K(), a = M(() => { 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 v = e.modelValue ?? (n.type === "antdv" ? void 0 : null), p = "onUpdate:" + h.name, y = { ref: r, // scope: props.scope, // fix element display false bug [h.name]: v, [p]: (R) => { if (R && (h.trim && (R = R.trim()), h.number)) { const D = Number(R); isNaN(D) || (R = D); } h.transform && (R = h.transform(R)), R === void 0 && e.undefineToNull && (R = null), t.emit("update:modelValue", R); }, ...e.props }, b = { ...e.events, ...e.on }; return Y(b, (R, D) => { const $ = R; D.startsWith("on") || (D = Na("on_" + D)), y[D] = (T) => $({ ...e.scope, $event: T }); }), y; }), i = () => { const h = {}, v = (p, y) => { p instanceof Function ? h[y] = (b) => p({ ...e.scope, scope: b }) : h[y] = () => p; }; return Y(e.children, v), Y(e.slots, v), h; }, s = M(() => { const h = { isAsyncComponent: !1, component: q(e.name) || n.input.name }; let v = h.component; return wc.includes(v) || (typeof v == "string" && (v = G(v)), (v == null ? void 0 : v.name) === "AsyncComponentWrapper" && (h.isAsyncComponent = !0)), h.component = v, h; }), u = i; function l() { return s.value.isAsyncComponent ? d() : c(); } function c() { return r.value; } async function d() { const h = c(); return h ?? new Promise((v, p) => { f(v, p, 0); }); } function f(h, v, p) { setTimeout(() => { const y = c(); if (y != null) { h(y); return; } if (p++, p > 20) { v(new Error("异步组件加载超时")); return; } f(h, v, p); }, 200); } return t.expose({ props: e, getTargetRefSync: c, getTargetRef: l, getTargetRefAsync: d }), () => { let h; const v = z(a.value, t.attrs); if (ga(v, "onChange"), ga(v, "onBlur"), e.render) return e.render({ ...e.scope, attrs: v }); const p = os(s.value.component); return x(p, v, yc(h = u()) ? h : { default: () => [h] }); }; } }), Cc = /* @__PURE__ */ le({ name: "FsSlotRender", inheritAttrs: !1, props: { /** * 插槽 */ slots: { type: Function }, /** * 上下文 */ scope: { type: Object } }, setup(e) { return _t.trace("fs-slot-render"), () => e.slots(e.scope); } }), gi = /* @__PURE__ */ le({ name: "FsRender", functional: !0, props: { renderFunc: { type: Function }, scope: { type: Object } }, setup() { _t.trace("fs-render"); }, render() { return this.renderFunc(this.scope); } }), Sc = le({ 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 m, C; const { merge: n } = $e(), { ui: o } = we(), { AsyncComputeValue: r, doComputed: a } = Pt(), i = K(), s = yn({}), { proxy: u } = Go(); _t.trace("fs-form"), bt(e.columns, (_) => { _.value != null && (_.value instanceof r || _.value instanceof Zo) && ce.warn("form.value配置不支持Compute/AsyncCompute类型的动态计算"); }); function l() { const _ = {}; return bt(e.columns, (S, O) => { const Q = q(S.value); Q !== void 0 && tt(_, O, Q); }), n(_, dt(e.initialForm)), _; } const c = l(); y(c); const d = M(() => ({ row: c, form: s, index: e.index, mode: e.mode || "add", attrs: t.attrs, getComponentRef: E })); function f() { return d.value; } const h = M(() => e.columns); function v(_) { _ != null && bt(e.columns, (S, O) => { let Q = st(_, O); S.valueBuilder && S.valueBuilder({ value: Q, key: O, row: c, form: _, index: e.index, mode: e.mode }); }); } function p() { return s; } function y(_, S = {}) { if (v(_), S.mergeForm === !1) for (const Q in s) delete s[Q]; n(s, _); const { valueChange: O } = S; O && Y(e.columns, (Q, se) => { const ie = s[se]; D(se, ie); }); } function b(..._) { return n({}, e.col, ..._); } function R(_) { return { key: _.key, ...d.value }; } function D(_, S) { const O = { key: _, value: S, formRef: u, ...d.value, immediate: !1 }; t.emit("value-change", O); let Q = e.columns[_].valueChange; Q && (Q instanceof Function ? Q(O) : Q.handle && Q.handle(O)); } const $ = K({}); function T(_) { return $.value[_].getFormItemRef(); } function E(_, S = !1) { var O; return (O = T(_)) == null ? void 0 : O.getComponentRef(S); } const P = K([]); Y((m = e.group) == null ? void 0 : m.groups, (_, S) => { _.collapsed !== !0 && P.value.push(S); }), ((C = e.group) == null ? void 0 : C.groupType) === "tabs" && (P.value = P.value.length > 0 ? P.value[0] : null); const W = a( () => e.group, f, null, (_ = {}) => { const S = {}; Y(_ == null ? void 0 : _.groups, (se, ie) => { Y(se.columns, (de) => { if (h.value[de] == null) { _t.logger.warn("无效的分组字段:" + de); return; } S[de] = ie; }); }); const O = _.groupType; let Q = { parent: o.collapse.name, child: o.collapseItem.name }; return O === "tabs" && (Q.parent = o.tabs.name, Q.child = o.tabPane.name), n( { wrapper: Q, groupedKeys: S }, _ ); } ), F = M(() => { const _ = []; return Y(h.value, (S, O) => { var se, ie; const Q = dt(e.formItem || {}); S = n(Q, S), S.key = O, S.order == null && (S.order = ln.orderDefault), (((se = W.value) == null ? void 0 : se.groupedKeys) == null || ((ie = W.value) == null ? void 0 : ie.groupedKeys[O]) == null) && _.push(S), S.col = b(S.col); }), _.sort((S, O) => S.order - O.order), _; }); function V() { return i.value; } async function ne() { const _ = l(), S = zr(s); for (const O of S) { const Q = st(_, O[0]); Q == null ? No(s, O[0]) : tt(s, O[0], Q); } e.doReset && await e.doReset(d.value), t.emit("reset"); } const L = K(), A = K({}); function k(_) { var S, O; if ((S = W.value) != null && S.groupedKeys) for (let Q in _) { const se = (O = W.value) == null ? void 0 : O.groupedKeys[Q]; se != null && (_["group." + se] = !0); } } async function N() { const _ = { ...d.value, form: s }; if (_.mode !== "view") { if (e.beforeValidate && await e.beforeValidate(_) === !1) return !1; try { A.value = {}, await o.form.validateWrap(i.value), L.value = !0; } catch (S) { L.value = !1; const O = o.form.transformValidateErrors(S); throw k(O), A.value = O, t.emit("validationError", d.value), S; } } } async function J() { await N(); const _ = dt(Ln(s)), S = { ...d.value, form: _ }; if (ce.debug("form submit", JSON.stringify(s)), bt(e.columns, (O, Q) => { let se = st(_, Q); O.valueResolve && O.valueResolve({ value: se, key: Q, ...S }); }), e.beforeSubmit && await e.beforeSubmit(S) === !1) return !1; if (bt(e.columns, (O, Q) => { O.submit === !1 ? No(_, Q) : O.submit === !0 && tt(_, Q, _[Q]); }), e.doSubmit) { const O = await e.doSubmit(S); if (S.res = O, O === !1) return !1; } return t.emit("submit", S), e.afterSubmit && await e.afterSubmit(S) === !1 ? !1 : (t.emit("success", S), S); } _n(() => { Y(h.value, (_, S) => { if (_.valueChange == null) return; let O = _.valueChange; if (O && O.immediate === !0 && O.handle) { const Q = { key: S, value: s[S], formRef: u, ...d.value, immediate: !0 }; O.handle && O.handle(Q); } }); }); function ue(_) { return !!(_ && q(_.show) !== !1); } function Z(_) { if (!_.columns || q(_.show) === !1) return !1; for (let S of _.columns) { if (h.value[S] == null) continue; if (ue(h.value[S])) return !0; } return !1; } e.watch && it( () => s, (_, S) => { e.watch && e.watch(d.value); }, { deep: !0, immediate: !0 } ); function Se() { const _ = JSON.stringify(c), S = JSON.stringify(s); return _ !== S; } const ke = M(() => n({}, e.slots, t.slots)); return t.emit("init", d.value), { get: (_, S) => st(_, S), set: (_, S, O) => { tt(_, S, O), D(S, O); }, ui: o, validRef: L, errorsRef: A, formRef: i, computedColumns: h, computedDefaultColumns: F, submit: J, reset: ne, getFormRef: V, scope: d, buildItemScope: R, groupActiveKey: P, form: s, formItemRefs: $, getFormData: p, setFormData: y, getComponentRef: E, mergeCol: b, validate: N, computedGroup: W, getContextFn: f, formItemShow: ue, groupItemShow: Z, isDirty: Se, mergedSlots: ke }; } }); function Fc(e, t, n, o, r, a) { const i = G("fs-form-item-col"), s = G("fs-render"); return w(), I(H(e.ui.form.name), { ref: "formRef", class: St(["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(() => [ (w(), I(H(e.ui.row.name), z({ class: "fs-row" }, e.row), { default: B(() => [ (w(!0), j(be, null, Te(e.computedDefaultColumns, (u) => (w(), I(i, { key: u == null ? void 0 : u.key, ref_for: !0, ref: (l) => { l && (e.formItemRefs[u.key] = l); }, col: e.mergeCol(u.col), item: u, helper: e.helper, "model-value": e.get(e.form, u.key), slots: e.mergedSlots["form_" + u.key], "get-context-fn": e.getContextFn, "onUpdate:modelValue": (l) => e.set(e.form, u.key, l) }, null, 8, ["col", "item", "helper", "model-value", "slots", "get-context-fn", "onUpdate:modelValue"]))), 128)) ]), _: 1 }, 16)), e.computedGroup.wrapper ? (w(), I(H(e.computedGroup.wrapper.parent), z({ key: 0, [e.ui.collapse.modelValue]: e.groupActiveKey, ["onUpdate:" + e.ui.collapse.modelValue]: t[0] || (t[0] = (u) => e.groupActiveKey = u), style: { width: "100%" } }, e.computedGroup), { default: B(() => [ (w(!0), j(be, null, Te(e.computedGroup.groups, (u, l) => (w(), j(be, { key: l }, [ e.groupItemShow(u) ? (w(), I(H(e.computedGroup.wrapper.child), z({ key: 0, [e.ui.collapse.keyName || ""]: l }, { ref_for: !0 }, u, { class: { "fs-form-group-error": e.errorsRef["group." + l] } }), Lr({ default: B(() => [ (w(), I(H(e.ui.row.name), z({ class: "fs-row" }, { ref_for: !0 }, e.row), { default: B(() => [ (w(!0), j(be, null, Te(u.columns, (c) => (w(), j(be, { key: c }, [ e.computedColumns[c] ? (w(), I(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"])) : oe("", !0) ], 64))), 128)) ]), _: 2 }, 1040)) ]), _: 2 }, [ Te(u.slots, (c, d) => ({ name: d, fn: B((f) => [ x(s, { "render-func": c, scope: { ...f, hasError: e.errorsRef["group." + l] } }, null, 8, ["render-func", "scope"]) ]) })) ]), 1040, ["class"])) : oe("", !0) ], 64))), 128)) ]), _: 1 }, 16)) : oe("", !0) ]), _: 1 }, 8, ["class", "model"]); } const Rc = /* @__PURE__ */ Oe(Sc, [["render", Fc]]), Dc = le({ name: "FsFormItem", components: { FsRender: gi }, 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 } = we(), { merge: o } = $e(), r = K(); _t.trace("fs-form-item"); const a = () => { const p = e.getContextFn ? e.getContextFn() : {}; return { value: e.modelValue, key: e.item.key, ...p }; }; function i(p) { t.emit("update:modelValue", p); } function s(p = !1) { var y, b; return p ? (y = r.value) == null ? void 0 : y.getTargetRefAsync() : (b = r.value) == null ? void 0 : b.getTargetRef(); } const u = M(() => { const p = { ...e.item }; return delete p.title, delete p.label, p; }), l = M(() => { var p, y, b; return ((y = (p = e.item) == null ? void 0 : p.helper) == null ? void 0 : y.position) || ((b = e.helper) == null ? void 0 : b.position); }), c = M(() => { var p, y; return o({}, (p = e.item.helper) == null ? void 0 : p.tooltip, (y = e.helper) == null ? void 0 : y.tooltip); }), d = M(() => { if (e.item != null) return e.item.key.indexOf(".") >= 0 ? e.item.key.split(".") : e.item.key; }), f = M(() => e.item.label || e.item.title), h = M(() => f.value instanceof Function); return { ui: n, updateModelValue: i, scopeFunc: a, getComponentRef: s, componentRenderRef: r, computedHelperPosition: l, computedHelperTooltip: c, computedKey: d, computedLabelIsRender: h, computedLabel: f, computedLabelRender: () => f.value(a()), computedItem: u }; } }); const kc = { key: 0, class: "fs-form-item-label-text" }, $c = ["title"], Oc = { class: "fs-form-helper-tooltip" }, Ec = { class: "fs-form-item-label-icon" }, Tc = { class: "fs-form-item-content" }, Ic = { class: "fs-form-item-render" }, Ac = { class: "fs-form-item-component" }; function Vc(e, t, n, o, r, a) { const i = G("fs-render"), s = G("fs-form-helper"), u = G("fs-icon"), l = G("fs-slot-render"), c = G("fs-component-render"); return e.computedItem ? (w(), I(H(e.ui.formItem.name), z({ 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 ? (w(), j("span", kc, [ x(i, { "render-func": e.computedLabelRender }, null, 8, ["render-func"]) ])) : (w(), j("span", { key: 1, class: "fs-form-item-label-text", title: e.computedLabel }, We(e.computedLabel), 9, $c)), e.computedItem.helper && e.computedHelperPosition === "label" ? (w(), I(H(e.ui.tooltip.name), xe(z({ key: 2 }, e.computedHelperTooltip)), { [e.ui.tooltip.content]: B(() => [ te("span", Oc, [ x(s, { helper: e.computedItem.helper, scope: e.scopeFunc() }, null, 8, ["helper", "scope"]) ]) ]), [e.ui.tooltip.trigger]: B(() => [ te("span", Ec, [ x(u, { class: "fs-form-item-label-icon-inner", icon: e.ui.icons.question }, null, 8, ["icon"]) ]) ]), _: 2 }, 1040)) : oe("", !0) ]), default: B(() => { var d; return [ te("div", Tc, [ e.computedItem.topRender ? (w(), I(i, { key: 0, "render-func": e.computedItem.topRender, scope: e.scopeFunc() }, null, 8, ["render-func", "scope"])) : oe("", !0), te("div", Ic, [ e.computedItem.prefixRender ? (w(), I(i, { key: 0, "render-func": e.computedItem.prefixRender, scope: e.scopeFunc() }, null, 8, ["render-func", "scope"])) : oe("", !0), te("div", Ac, [ e.formSlot ? (w(), I(l, { key: 0, slots: e.formSlot, scope: e.scopeFunc() }, null, 8, ["slots", "scope"])) : ((d = e.computedItem.component) == null ? void 0 : d.show) !== !1 ? (w(), j(be, { key: 1 }, [ e.computedItem.conditionalRender && e.computedItem.conditionalRender.match && e.computedItem.conditionalRender.match(e.scopeFunc()) ? (w(), I(i, { key: 0, "render-func": e.computedItem.conditionalRender.render, scope: e.scopeFunc() }, null, 8, ["render-func", "scope"])) : e.computedItem.render ? (w(), I(i, { key: 1, "render-func": e.computedItem.render, scope: e.scopeFunc() }, null, 8, ["render-func", "scope"])) : (w(), I(c, z({ 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)) : oe("", !0) ]), e.computedItem.suffixRender ? (w(), I(i, { key: 1, "render-func": e.computedItem.suffixRender, scope: e.scopeFunc() }, null, 8, ["render-func", "scope"])) : oe("", !0) ]), e.computedItem.bottomRender ? (w(), I(i, { key: 1, "render-func": e.computedItem.bottomRender, scope: e.scopeFunc() }, null, 8, ["render-func", "scope"])) : oe("", !0), e.computedItem.helper && e.computedHelperPosition !== "label" ? (w(), I(s, { key: 2, helper: e.computedItem.helper, scope: e.scopeFunc() }, null, 8, ["helper", "scope"])) : oe("", !0) ]) ]; }), _: 1 }, 16, ["path", "rule-path"])) : oe("", !0); } const Pc = /* @__PURE__ */ Oe(Dc, [["render", Vc]]), Mc = /* @__PURE__ */ le({ __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 } = we(), o = e, { doComputed: r } = Pt(), a = r( () => o.item, () => o.getContextFn() ), i = Xo(), s = K(); function u() { return s.value; } return t({ getFormItemRef: u }), (l, c) => { var f; const d = G("fs-form-item"); return q(a) && q(a).show !== !1 ? (w(), I(H(q(n).col.name), z({ key: 0, class: "fs-col" }, q(ho)(e.col, (f = q(a)) == null ? void 0 : f.col)), { default: B(() => { var h; return [ q(a) && ((h = q(a)) == null ? void 0 : h.blank) !== !0 ? (w(), I(d, z({ key: 0, ref_key: "formItemRef", ref: s, item: q(a), "form-slot": e.slots, "get-context-fn": e.getContextFn, helper: e.helper }, q(i)), null, 16, ["item", "form-slot", "get-context-fn", "helper"])) : oe("", !0) ]; }), _: 1 }, 16)) : oe("", !0); }; } }); const Bc = le({ name: "FsFormHelper", props: { /** * 帮助说明, text: 说明文字, render: function(scope) 自定义渲染 */ helper: { type: [ /** * text: 说明文字, * render: function , 自定义render */ Object, /** * 说明文本 */ String ] }, scope: {} }, setup(e) { _t.trace("fs-form-item"); } }); const jc = { class: "fs-form-helper" }, Nc = { key: 0 }, xc = { key: 2 }; function Lc(e, t, n, o, r, a) { const i = G("fs-render"); return w(), j("div", jc, [ typeof e.helper == "string" ? (w(), j("pre", Nc, We(e.helper), 1)) : e.helper.render ? (w(), I(i, { key: 1, "render-func": e.helper.render, scope: e.scope }, null, 8, ["render-func", "scope"])) : e.helper.text ? (w(), j("pre", xc, We(e.helper.text), 1)) : oe("", !0) ]); } const qc = /* @__PURE__ */ Oe(Bc, [["render", Lc]]); function Hc(e) { return typeof e == "function" || Object.prototype.toString.call(e) === "[object Object]" && !xr(e); } const ro = /* @__PURE__ */ le({ 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 Le; _t.trace("fs-form-wrapper"); const { t: n } = lt(), { merge: o } = $e(), r = K(!1), a = K(), i = K(), s = K(), u = K(), l = K(), c = K(!1), d = K(), f = K(), h = K(), v = K(), p = e.id || Math.floor(Math.random() * 1e6) + "", y = "fs-form-wrapper_" + p, b = K({}); function R() { var X; return { formWrapperId: p, formWrapperIdClass: y, close: A, doClose: k, onClosed: N, onOpened: J, open: D, title: v, fullscreenEnabled: se, fullscreen: Q, formWrapperIs: a, formWrapperOpen: r, formWrapperBind: s, computedButtons: O, onValueChange: ue, innerBind: _e, formWrapperSlots: b, wrapper: s.value, options: i.value, formRef: l.value, form: ke(), wrapperBindRef: s, formOptionsRef: i, setFormData: m, getFormData: ke, reset: Se, loading: c, toggleFullscreen: ie, submit: Z, mode: (X = i.value) == null ? void 0 : X.mode }; } const D = async (X) => { var ut; const { wrapper: ye } = X; ye.onOpen && ye.onOpen(X), v.value = q(ye.title), a.value = X.wrapper.is, u.value = ye; const Me = de.formWrapper.customClass(a.value), Re = `fs-form-wrapper ${y} ${ye[Me] || ""} `; return s.value = { ...wn(ye, "title", "onOpen", "onClosed", "onOpened", "is", "inner", "beforeClose"), [Me]: Re }, i.value = { ...wn(X, "wrapper", "slots"), slots: { ...e.slots, ...X.slots, ...t.slots } }, b.value = { ...e.slots, ...(ut = X.wrapper) == null ? void 0 : ut.slots, ...t.slots }, t.emit("open", R()), d.value = () => { ye.onClosed && ye.onClosed(R()); }, f.value = () => { ye.onOpened && ye.onOpened(R()); }, h.value = ye.beforeClose, ye.fullscreen != null && (Q.value = ye.fullscreen), t.emit("inner-change", !!u.value.inner), await Be(), r.value = !0, await Be(), J(), R(); }; async function $() { var Me; const X = u.value.saveRemind; if (((Me = l.value) == null ? void 0 : Me.isDirty()) && X) { let Re = !1; if (X instanceof Function) Re = await X(); 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") }), Re = !0; } catch { Re = !1; } Re && await Z(); } } const T = Ha(); let E = null; function P() { return u.value.saveDraft ? (E == null && (E = new Kr({ $router: T, tableName: "addFormDraft", keyType: e.id || "0" })), E) : null; } async function W() { var Re; const X = u.value.saveDraft, ye = (Re = l.value) == null ? void 0 : Re.isDirty(), Me = i.value.mode == "add"; return ye && X && Me ? (await P().updateTableValue(ke()), !0) : !1; } async function F() { const X = P(); X && await X.clearTableValue(); } async function V() { const X = P(); if (X) { const ye = await X.getTableValue(); ye && m(ye, { mergeForm: !0 }); } } async function ne() { let X = !1; return u.value.saveDraft && (X = await W()), h.value && h.value(R()) == !1 ? !1 : (X || await $(), !0); } const L = M(() => de.type == "element" ? { beforeClose: (X) => { k(); } } : {}), A = async () => { r.value = !1; }, k = async () => await ne() == !1 ? !1 : (A(), !0), N = () => { d.value && d.value(), t.emit("closed"), i.value = null; }, J = () => { if (u.value.saveDraft && V(), t.emit("opened"), f.value && f.value(), s.value.draggable || s.value.dragenabled) { const { dragModal: X } = Ru(); X({ getModal: () => document.querySelector(`.${y}`) }); } }, ue = (X) => { t.emit("value-change", X); }; async function Z() { c.value = !0; try { if (await l.value.submit() === !1) return; await F(), A(); } finally { c.value = !1; } } async function Se() { await l.value.reset(); } function ke() { var X; return (X = l.value) == null ? void 0 : X.getFormData(); } function m(X, ye) { var Me; (Me = l.value) == null || Me.setFormData(X, ye); } const { doComputed: C } = Pt(); function _() { var X, ye, Me; return { row: (X = i.value) == null ? void 0 : X.initialForm, form: ke(), index: (ye = i.value) == null ? void 0 : ye.index, mode: (Me = i.value) == null ? void 0 : Me.mode, attrs: i.value, getComponentRef(...Re) { var ut; (ut = l.value) == null || ut.getComponentRef(...Re); } }; } const S = C(() => { var X; return (X = s.value) == null ? void 0 : X.buttons; }, _), O = M(() => { const X = { cancel: {}, reset: {}, ok: { loading: c.value } }, ye = o(X, S.value), Me = []; return Y(ye, (Re, ut) => { Re.key = ut, Me.push(Re), Re.onClick == null && Re.click != null && (Re.onClick = () => { Re.click(R()); }); }), Cn(Me, (Re) => Re.order ?? ln.orderDefault); }); _n(async () => { e.options != null && await D(e.options), t.emit("mounted", Go().exposed); }); const Q = K(!1), se = M(() => { var X; return !((X = a.value) != null && X.endsWith("drawer")); }); function ie() { Q.value = !Q.value; } const de = qe.get(), _e = M(() => u.value.inner ? de.formWrapper.buildInnerBind({ getInnerWrapper() { if (u.value.innerContainerSelector) { const X = document.querySelector(u.value.innerContainerSelector); if (X) return X.classList.add("fs-form-inner-wrapper"), X; console.error(`找不到选择器为${u.value.innerContainerSelector}的元素`); } return e.innerWrapper; } }) : {}); t.expose({ formWrapperId: p, formWrapperIdClass: y, close: A, doClose: k, onClosed: N, onOpened: J, open: D, title: v, fullscreenEnabled: se, fullscreen: Q, toggleFullscreen: ie, formOptions: i, formWrapperIs: a, formWrapperOpen: r, formWrapperBind: s, formRef: l, submit: Z, reset: Se, computedButtons: O, loading: c, getFormData: ke, setFormData: m, onValueChange: ue, innerBind: _e, formWrapperSlots: b, form: ke(), wrapperBindRef: s, formOptionsRef: i, mode: (Le = i.value) == null ? void 0 : Le.mode }); const Pe = qr(); return () => { if (!s.value) return null; const X = qe.get(); let ye = {}; const Me = { ...Pe, ...b.value }, Re = (Mt, cn, nt = Me) => nt[Mt] ? nt[Mt](cn) : null, ut = a.value || "el-dialog"; if (i.value) { const { index: Mt, mode: cn } = i.value || {}, nt = { _self: this, index: Mt, mode: cn, getFormData: ke }; ye = { [X.formWrapper.titleSlotName]: () => { let xn = null; return se.value && (xn = x(G("fs-icon"), { class: "fs-fullscreen-icon", onClick: ie, icon: Q.value ? X.icons.fullScreen : X.icons.unFullScreen }, null)), x("div", { class: "fs-form-header" }, [x("div", { class: "fs-form-header-left" }, [Re("form-header-left", nt), v.value, Re("form-header-right", nt)]), x("div", { class: "fs-form-header-action" }, [Re("form-header-action-left", nt), xn, Re("form-header-action-right", nt)])]); }, default: () => { const xn = []; return Y(O.value, (sa) => { sa.show !== !1 && xn.push(x(G("fs-button"), sa, null)); }), x("div", { class: "fs-form-wrapper-body" }, [x("div", { class: "fs-form-body" }, [Re("form-body-top", nt), x("div", { class: "fs-form-content" }, [Re("form-body-left", nt), x(G("fs-form"), z({ ref: l }, i.value, { onValueChange: ue }), null), Re("form-body-right", nt)]), Re("form-body-bottom", nt)]), x("div", { class: "fs-form-footer-btns" }, [Re("form-footer-left", nt), xn, Re("form-footer-right", nt)])]); } }; } if (X.formWrapper.hasContentWrap) { const Mt = X.formWrapper.hasContentWrap(ut), cn = ye; if (Mt) { const nt = H(Mt); ye = { default: () => x(nt, null, Hc(cn) ? cn : { default: () => [cn] }) }; } } const aa = X.formWrapper.visible, Hi = { [aa]: r.value, ["onUpdate:" + aa]: async (Mt) => { if (Mt === !1 && r.value) return await k(); r.value = Mt; } }, zi = X.formWrapper.buildOnClosedBind(ut, N), ia = X.formWrapper.customClass(ut), Wi = `${Q.value ? "fs-fullscreen" : ""} ${s.value[ia] || ""}`, Ui = { [ia]: Wi }, Ki = { fullscreen: Q.value }, Yi = { zIndex: s.value.zIndex || e.zIndex }, Gi = H(ut); return x(Gi, z(s.value, Ui, Hi, zi, Ki, _e.value, Yi, L.value), ye); }; } }), zc = le({ name: "FsFormProvider" }), Wc = /* @__PURE__ */ le({ ...zc, setup(e) { const t = K({}); return sn("use:form:wrapper", () => ({ open(n) { const o = n.id || Math.floor(Math.random() * 1e6) + ""; return new Promise((r, a) => { t.value[o] = { id: o, // zIndex: getMaxZIndex() + 1, async onMounted(i) { await i.open(n), r(i); }, onClosed() { n.id || delete t.value[o]; } }; }); } })), (n, o) => (w(), j(be, null, [ re(n.$slots, "default"), (w(!0), j(be, null, Te(t.value, (r) => (w(), I(q(ro), z({ key: r.id }, { ref_for: !0 }, r), null, 16))), 128)) ], 64)); } }); _t.trace("fs-table"); function Uc(e, t) { sn("get:columns", () => e.table.columns), sn("update:columns", (n) => { t.emit("update:columns", n); }), sn("get:crudBinding", () => e); } function Kc(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: s, mergeForm: u = !1 }) { n.value && n.value.setForm(s, u); } return { searchRef: n, getSearchRef: o, getSearchFormData: r, setSearchFormData: i, getSearchValidatedFormData: a }; } function Yc(e, t, n) { return { tabsBinding: M(() => { var r, a, i, s, u, l, c; if (t.tabs && t.tabs.show && t.tabs.name) { let d = null; const f = { ...t.tabs }; return (r = t.search) != null && r.columns && ((s = (i = (a = t.search) == null ? void 0 : a.columns[t.tabs.name]) == null ? void 0 : i.component) != null && s.dict) && (d = (c = (l = (u = t.search) == null ? void 0 : u.columns[t.tabs.name]) == null ? void 0 : l.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 wo(e, t) { if (!e) return {}; const n = {}; return Y(e, (o, r) => { r.startsWith(t) && (n[r] = o); }), n; } function Gc(e, t, { tableRef: n, containerRef: o }) { var l; const r = qe.get(); let a = r.table; if (((l = e.table) == null ? void 0 : l.tableVersion) === "v2" && (a = r.tableV2), a.hasMaxHeight(e.table)) return {}; if (!a.fixedHeaderNeedComputeBodyHeight) return {}; const i = K(null); function s() { var v; const c = (v = n == null ? void 0 : n.value) == null ? void 0 : v.$el; if (c == null || c.querySelector == null) 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 u() { 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(v) { ce.debug("table resized", v), v.length > 0 && v[0].contentRect.height > 0 && (s(), setTimeout(() => { s(); }, 200), setTimeout(() => { s(); }, 500)); }).observe(d); } return _n(async () => { await Be(), await Be(), u(); }), { maxHeightRef: i, computeBodyHeight: s }; } function Xc(e, t) { const n = qe.get(), o = K(), r = K(), a = K(), { maxHeightRef: i, computeBodyHeight: s } = Gc(e, t, { tableRef: o, containerRef: a }), { merge: u } = $e(), l = la(e, "table"), c = M(() => { var P; let T = {}; if ((i == null ? void 0 : i.value) != null) { let W = n.table; ((P = e.table) == null ? void 0 : P.tableVersion) === "v2" && (W = n.tableV2), T = W.buildMaxHeight(i.value); } const E = _t.dash.omit(l, "loading", "columns", "columnsMap"); return u(T, { ...t.attrs, ...E }); }), d = la(e, "toolbar"), f = M(() => wo(t.slots, "cell")), h = M(() => wo(t.slots, "form")), v = M(() => wo(t.slots, "search")), p = M(() => wo(t.slots, "toolbar")), y = K(), b = M(() => { const T = { compact: e.toolbar.compact !== !1 }; return e.customClass && (T[e.customClass] = !0), T; }), R = K(), D = K(!1); return { tableRef: o, containerRef: a, toolbarRef: r, computedTable: c, computedToolbar: d, computedCellSlots: f, formWrapperRef: y, isFormInner: D, onFormInnerChange: (T) => { D.value = T; }, computedFormSlots: h, computedSearchSlots: v, computedToolbarSlots: p, computeBodyHeight: s, computedClass: b, innerWrapperRef: R }; } const Qc = le({ 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 {}; } }, /** * 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 } = we(); Uc(e, t); const o = Kc(), r = Yc(o, e, t), a = Xc(e, t); return { ui: n, ...o, ...a, ...r }; } }); const Jc = { class: "fs-crud-search" }, Zc = { key: 0, class: "fs-crud-actionbar" }, ed = { key: 0, class: "fs-crud-toolbar" }, td = { class: "fs-crud-pagination" }, nd = { class: "fs-pagination-left" }, od = { class: "fs-pagination" }, rd = { class: "fs-pagination-right" }; function ad(e, t, n, o, r, a) { var d; const i = G("fs-actionbar"), s = G("fs-toolbar"), u = G("fs-tabs-filter"), l = G("fs-table"), c = G("fs-form-wrapper"); return w(), I(H(((d = e.container) == null ? void 0 : d.is) || "fs-layout-default"), z({ ref: "containerRef", class: "fs-crud-container" }, e.container, { class: e.computedClass }), { "header-top": B(() => [ re(e.$slots, "header-top") ]), "header-bottom": B(() => [ re(e.$slots, "header-bottom") ]), "header-middle": B(() => [ re(e.$slots, "header-middle") ]), search: B(() => [ te("div", Jc, [ (w(), I(H(e.search.is || "fs-search"), z({ ref: "searchRef" }, e.search, { slots: e.computedSearchSlots }), null, 16, ["slots"])) ]) ]), actionbar: B(() => [ e.actionbar && e.actionbar.show !== !1 ? (w(), j("div", Zc, [ re(e.$slots, "actionbar-left"), x(i, xe(Lt(e.actionbar)), null, 16), re(e.$slots, "actionbar-right") ])) : oe("", !0) ]), toolbar: B(() => [ e.toolbar && e.toolbar.show !== !1 ? (w(), j("div", ed, [ re(e.$slots, "toolbar-left"), x(s, z({ ref: "toolbarRef" }, e.toolbar, { slots: e.computedToolbarSlots, columns: e.table.columns }), null, 16, ["slots", "columns"]), re(e.$slots, "toolbar-right") ])) : oe("", !0) ]), tabs: B(() => [ e.tabsBinding.show ? (w(), I(u, z({ key: 0, ref: "tabsRef", class: "fs-tabs" }, e.tabsBinding), null, 16)) : oe("", !0) ]), table: B(() => [ x(l, z({ 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(() => [ te("div", { ref: "innerWrapperRef", class: St(["fs-form-wrapper-container", { "fs-form-inner-wrapper": e.isFormInner }]) }, [ x(c, { ref: "formWrapperRef", slots: e.computedFormSlots, "inner-wrapper": e.innerWrapperRef, onInnerChange: e.onFormInnerChange, onValueChange: t[0] || (t[0] = (f) => e.$emit("form-value-change", f)) }, null, 8, ["slots", "inner-wrapper", "onInnerChange"]) ], 2) ]), pagination: B(() => [ te("div", td, [ te("div", nd, [ re(e.$slots, "pagination-left") ]), te("div", od, [ e.pagination.show !== !1 ? (w(), I(H(e.ui.pagination.name), xe(z({ key: 0 }, e.pagination)), null, 16)) : oe("", !0) ]), te("div", rd, [ re(e.$slots, "pagination-right") ]) ]) ]), "footer-top": B(() => [ re(e.$slots, "footer-top") ]), "footer-bottom": B(() => [ re(e.$slots, "footer-bottom") ]), default: B(() => [ re(e.$slots, "default") ]), _: 3 }, 16, ["class"]); } const id = /* @__PURE__ */ Oe(Qc, [["render", ad]]), sd = le({ 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 } = we(), { merge: o } = $e(), { t: r } = lt(), a = M(() => ({ ...e.scope, row: e.scope[n.tableColumn.row], index: e.scope[n.tableColumn.index] })), i = (y) => { const b = e.scope[n.tableColumn.index], R = e.scope[n.tableColumn.row], D = { key: y.key, row: R, btn: y, index: b, ...e.scope }; if (y.click) return y.click(D); t.emit("handle", D); }, { doComputed: s } = Pt(), u = M(() => ({ dropdown: e.dropdown, buttons: e.buttons, active: e.active, group: e.group })), l = s( () => u.value, () => { const y = e.scope[n.tableColumn.index], b = e.scope[n.tableColumn.row]; return { ...e.scope, index: y, row: b }; } ), c = M(() => { let y = null; if (l.value.active == null || l.value.active === "default") { const R = { view: { key: "view", text: r("fs.rowHandle.view.text"), title: r("fs.rowHandle.view.text") }, copy: { key: "copy", text: r("fs.rowHandle.copy.text"), title: r("fs.rowHandle.copy.text") }, edit: { key: "edit", type: "primary", text: r("fs.rowHandle.edit.text"), title: r("fs.rowHandle.edit.text") }, remove: { key: "remove", ...n.button.colors("danger"), text: r("fs.rowHandle.remove.text"), title: r("fs.rowHandle.remove.text") } }; y = o(R, l.value.buttons); } else y = l.value.group[l.value.active]; const b = []; return Y(y, (R, D) => { R.key = D, R.show !== !1 && b.push(R); }), Cn(b, (R) => R.order ?? ln.orderDefault); }), d = M(() => l.value.dropdown == null || l.value.dropdown.atLeast == null || l.value.dropdown.atLeast <= 0 || c.value.length <= l.value.dropdown.atLeast ? 0 : l.value.dropdown.atLeast || 0); function f(y, b) { return y.dropdown === !0 || d.value > 0 && d.value < b; } const h = M(() => { let y = 0; for (const b of c.value) { if (f(b, y)) return !0; y++; } return !1; }); function v(y) { for (let b of c.value) if (y === b.key) { i(b); return; } } const p = M(() => { const y = {}; if (n.dropdown.renderMode !== "slot") { const b = c.value, R = []; Y(b, (D, $) => { D.show !== !1 && f(D, $) && R.push({ [n.dropdown.value]: D.key, [n.dropdown.label]: D.text, title: D.title }); }), y.options = R; } return { ...wn(e.dropdown, "more", "atLeast"), ...n.dropdown.command(v), ...y }; }); return { ui: n, hasDropdownBtn: h, computedHandleBtns: c, doDropdownItemClick: v, computedDropdownAtLeast: d, doClick: i, isDropdownBtn: f, scopeRef: a, computedDropdownBinding: p }; } }); const ld = { class: "fs-row-handle" }, ud = { key: 0, class: "row-handle-btn fs-handle-row-dropdown" }; function cd(e, t, n, o, r, a) { const i = G("fs-render"), s = G("fs-button"), u = G("fs-icon"); return w(), j("div", ld, [ re(e.$slots, "cell-rowHandle-left", xe(Lt(e.scopeRef))), (w(!0), j(be, null, Te(e.computedHandleBtns, (l, c) => (w(), j(be, { key: c }, [ l.show !== !1 && !e.isDropdownBtn(l, c) ? (w(), j(be, { key: 0 }, [ l.render ? (w(), I(i, { key: 0, "render-func": l.render, scope: e.scopeRef }, null, 8, ["render-func", "scope"])) : (w(), I(s, z({ key: 1, class: "row-handle-btn" }, { ref_for: !0 }, l, { onClick: rs((d) => e.doClick(l), ["stop"]) }), null, 16, ["onClick"])) ], 64)) : oe("", !0) ], 64))), 128)), re(e.$slots, "cell-rowHandle-middle", xe(Lt(e.scope))), e.hasDropdownBtn ? (w(), j("span", ud, [ (w(), I(H(e.ui.dropdown.name), xe(Lt(e.computedDropdownBinding)), { [e.ui.dropdown.slotName]: B(() => [ e.ui.dropdown.renderMode === "slot" ? (w(), I(H(e.ui.dropdownMenu.name), xe(z({ key: 0 }, e.ui.dropdownMenu.command(e.doDropdownItemClick))), { default: B(() => [ (w(!0), j(be, null, Te(e.computedHandleBtns, (l, c) => (w(), j(be, { key: c }, [ l.show !== !1 && e.isDropdownBtn(l, c) ? (w(), I(H(e.ui.dropdownItem.name), z({ key: 0, [e.ui.dropdownItem.command || ""]: l.key }, { ref_for: !0 }, l.dropdownItem, { disabled: l.disabled }), { default: B(() => [ te("div", z({ class: "fs-row-handle-dropdown-item" }, { ref_for: !0 }, l), [ l.icon ? (w(), I(u, { key: 0, icon: l.icon }, null, 8, ["icon"])) : oe("", !0), Vt(" " + We(l.text || l.title), 1) ], 16) ]), _: 2 }, 1040, ["disabled"])) : oe("", !0) ], 64))), 128)) ]), _: 1 }, 16)) : oe("", !0) ]), default: B(() => [ x(s, xe(Lt(e.dropdown.more)), null, 16) ]), _: 2 }, 1040)) ])) : oe("", !0), re(e.$slots, "cell-rowHandle-right", xe(Lt(e.scope))) ]); } const dd = /* @__PURE__ */ Oe(sd, [["render", cd]]); function pn() { return pn = 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; }, pn.apply(this, arguments); } function fd(e, t) { e.prototype = Object.create(t.prototype), e.prototype.constructor = e, ao(e, t); } function Or(e) { return Or = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(n) { return n.__proto__ || Object.getPrototypeOf(n); }, Or(e); } function ao(e, t) { return ao = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(o, r) { return o.__proto__ = r, o; }, ao(e, t); } function hd() { 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 Eo(e, t, n) { return hd() ? Eo = Reflect.construct.bind() : Eo = function(r, a, i) { var s = [null]; s.push.apply(s, a); var u = Function.bind.apply(r, s), l = new u(); return i && ao(l, i.prototype), l; }, Eo.apply(null, arguments); } function md(e) { return Function.toString.call(e).indexOf("[native code]") !== -1; } function Er(e) { var t = typeof Map == "function" ? /* @__PURE__ */ new Map() : void 0; return Er = function(o) { if (o === null || !md(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 Eo(o, arguments, Or(this).constructor); } return r.prototype = Object.create(o.prototype, { constructor: { value: r, enumerable: !1, writable: !0, configurable: !0 } }), ao(r, o); }, Er(e); } var pd = /%[sdj%]/g, vi = function() { }; typeof process < "u" && process.env && process.env.NODE_ENV !== "production" && typeof window < "u" && typeof document < "u" && (vi = 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 Tr(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 wt(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(pd, function(s) { if (s === "%%") return "%"; if (r >= a) return s; switch (s) { 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 s; } }); return i; } return e; } function gd(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 || gd(t) && typeof e == "string" && !e); } function vd(e, t, n) { var o = [], r = 0, a = e.length; function i(s) { o.push.apply(o, s || []), r++, r === a && n(o); } e.forEach(function(s) { t(s, i); }); } function va(e, t, n) { var o = 0, r = e.length; function a(i) { if (i && i.length) { n(i); return; } var s = o; o = o + 1, s < r ? t(e[s], a) : n([]); } a([]); } function bd(e) { var t = []; return Object.keys(e).forEach(function(n) { t.push.apply(t, e[n] || []); }), t; } var ba = /* @__PURE__ */ function(e) { fd(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__ */ Er(Error)); function yd(e, t, n, o, r) { if (t.first) { var a = new Promise(function(f, h) { var v = function(b) { return o(b), b.length ? h(new ba(b, Tr(b))) : f(r); }, p = bd(e); va(p, n, v); }); return a.catch(function(f) { return f; }), a; } var i = t.firstFields === !0 ? Object.keys(e) : t.firstFields || [], s = Object.keys(e), u = s.length, l = 0, c = [], d = new Promise(function(f, h) { var v = function(y) { if (c.push.apply(c, y), l++, l === u) return o(c), c.length ? h(new ba(c, Tr(c))) : f(r); }; s.length || (o(c), f(r)), s.forEach(function(p) { var y = e[p]; i.indexOf(p) !== -1 ? va(y, n, v) : vd(y, n, v); }); }); return d.catch(function(f) { return f; }), d; } function wd(e) { return !!(e && e.message !== void 0); } function _d(e, t) { for (var n = e, o = 0; o < t.length; o++) { if (n == null) return n; n = n[t[o]]; } return n; } function ya(e, t) { return function(n) { var o; return e.fullFields ? o = _d(t, e.fullFields) : o = t[n.field || e.fullField], wd(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 wa(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] = pn({}, e[n], o) : e[n] = o; } } return e; } var bi = function(t, n, o, r, a, i) { t.required && (!o.hasOwnProperty(t.field) || Ye(n, i || t.type)) && r.push(wt(a.messages.required, t.fullField)); }, Cd = function(t, n, o, r, a) { (/^\s+$/.test(n) || n === "") && r.push(wt(a.messages.whitespace, t.fullField)); }, _o, Sd = function() { if (_o) return _o; var e = "[a-fA-F\\d:]", t = function($) { return $ && $.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 + "$"), s = new RegExp("^" + r + "$"), u = function($) { return $ && $.exact ? a : new RegExp("(?:" + t($) + n + t($) + ")|(?:" + t($) + r + t($) + ")", "g"); }; u.v4 = function(D) { return D && D.exact ? i : new RegExp("" + t(D) + n + t(D), "g"); }, u.v6 = function(D) { return D && D.exact ? s : new RegExp("" + t(D) + r + t(D), "g"); }; var l = "(?:(?:[a-z]+:)?//)", c = "(?:\\S+(?::\\S*)?@)?", d = u.v4().source, f = u.v6().source, h = "(?:(?:[a-z\\u00a1-\\uffff0-9][-_]*)*[a-z\\u00a1-\\uffff0-9]+)", v = "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*", p = "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))", y = "(?::\\d{2,5})?", b = '(?:[/?#][^\\s"]*)?', R = "(?:" + l + "|www\\.)" + c + "(?:localhost|" + d + "|" + f + "|" + h + v + p + ")" + y + b; return _o = new RegExp("(?:^" + R + "$)", "i"), _o; }, _a = { // 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 }, Wn = { integer: function(t) { return Wn.number(t) && parseInt(t, 10) === t; }, float: function(t) { return Wn.number(t) && !Wn.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" && !Wn.array(t); }, method: function(t) { return typeof t == "function"; }, email: function(t) { return typeof t == "string" && t.length <= 320 && !!t.match(_a.email); }, url: function(t) { return typeof t == "string" && t.length <= 2048 && !!t.match(Sd()); }, hex: function(t) { return typeof t == "string" && !!t.match(_a.hex); } }, Fd = function(t, n, o, r, a) { if (t.required && n === void 0) { bi(t, n, o, r, a); return; } var i = ["integer", "float", "array", "regexp", "object", "method", "email", "number", "date", "url", "hex"], s = t.type; i.indexOf(s) > -1 ? Wn[s](n) || r.push(wt(a.messages.types[s], t.fullField, t.type)) : s && typeof n !== t.type && r.push(wt(a.messages.types[s], t.fullField, t.type)); }, Rd = function(t, n, o, r, a) { var i = typeof t.len == "number", s = typeof t.min == "number", u = typeof t.max == "number", l = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, c = n, d = null, f = typeof n == "number", h = typeof n == "string", v = Array.isArray(n); if (f ? d = "number" : h ? d = "string" : v && (d = "array"), !d) return !1; v && (c = n.length), h && (c = n.replace(l, "_").length), i ? c !== t.len && r.push(wt(a.messages[d].len, t.fullField, t.len)) : s && !u && c < t.min ? r.push(wt(a.messages[d].min, t.fullField, t.min)) : u && !s && c > t.max ? r.push(wt(a.messages[d].max, t.fullField, t.max)) : s && u && (c < t.min || c > t.max) && r.push(wt(a.messages[d].range, t.fullField, t.min, t.max)); }, Fn = "enum", Dd = function(t, n, o, r, a) { t[Fn] = Array.isArray(t[Fn]) ? t[Fn] : [], t[Fn].indexOf(n) === -1 && r.push(wt(a.messages[Fn], t.fullField, t[Fn].join(", "))); }, kd = function(t, n, o, r, a) { if (t.pattern) { if (t.pattern instanceof RegExp) t.pattern.lastIndex = 0, t.pattern.test(n) || r.push(wt(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(wt(a.messages.pattern.mismatch, t.fullField, n, t.pattern)); } } }, Ce = { required: bi, whitespace: Cd, type: Fd, range: Rd, enum: Dd, pattern: kd }, $d = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (Ye(n, "string") && !t.required) return o(); Ce.required(t, n, r, i, a, "string"), Ye(n, "string") || (Ce.type(t, n, r, i, a), Ce.range(t, n, r, i, a), Ce.pattern(t, n, r, i, a), t.whitespace === !0 && Ce.whitespace(t, n, r, i, a)); } o(i); }, Od = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (Ye(n) && !t.required) return o(); Ce.required(t, n, r, i, a), n !== void 0 && Ce.type(t, n, r, i, a); } o(i); }, Ed = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (n === "" && (n = void 0), Ye(n) && !t.required) return o(); Ce.required(t, n, r, i, a), n !== void 0 && (Ce.type(t, n, r, i, a), Ce.range(t, n, r, i, a)); } o(i); }, Td = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (Ye(n) && !t.required) return o(); Ce.required(t, n, r, i, a), n !== void 0 && Ce.type(t, n, r, i, a); } o(i); }, Id = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (Ye(n) && !t.required) return o(); Ce.required(t, n, r, i, a), Ye(n) || Ce.type(t, n, r, i, a); } o(i); }, Ad = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (Ye(n) && !t.required) return o(); Ce.required(t, n, r, i, a), n !== void 0 && (Ce.type(t, n, r, i, a), Ce.range(t, n, r, i, a)); } o(i); }, Vd = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (Ye(n) && !t.required) return o(); Ce.required(t, n, r, i, a), n !== void 0 && (Ce.type(t, n, r, i, a), Ce.range(t, n, r, i, a)); } o(i); }, Pd = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (n == null && !t.required) return o(); Ce.required(t, n, r, i, a, "array"), n != null && (Ce.type(t, n, r, i, a), Ce.range(t, n, r, i, a)); } o(i); }, Md = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (Ye(n) && !t.required) return o(); Ce.required(t, n, r, i, a), n !== void 0 && Ce.type(t, n, r, i, a); } o(i); }, Bd = "enum", jd = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (Ye(n) && !t.required) return o(); Ce.required(t, n, r, i, a), n !== void 0 && Ce[Bd](t, n, r, i, a); } o(i); }, Nd = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (Ye(n, "string") && !t.required) return o(); Ce.required(t, n, r, i, a), Ye(n, "string") || Ce.pattern(t, n, r, i, a); } o(i); }, xd = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (Ye(n, "date") && !t.required) return o(); if (Ce.required(t, n, r, i, a), !Ye(n, "date")) { var u; n instanceof Date ? u = n : u = new Date(n), Ce.type(t, u, r, i, a), u && Ce.range(t, u.getTime(), r, i, a); } } o(i); }, Ld = function(t, n, o, r, a) { var i = [], s = Array.isArray(n) ? "array" : typeof n; Ce.required(t, n, r, i, a, s), o(i); }, ar = function(t, n, o, r, a) { var i = t.type, s = [], u = t.required || !t.required && r.hasOwnProperty(t.field); if (u) { if (Ye(n, i) && !t.required) return o(); Ce.required(t, n, r, s, a, i), Ye(n, i) || Ce.type(t, n, r, s, a); } o(s); }, qd = function(t, n, o, r, a) { var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field); if (s) { if (Ye(n) && !t.required) return o(); Ce.required(t, n, r, i, a); } o(i); }, Gn = { string: $d, method: Od, number: Ed, boolean: Td, regexp: Id, integer: Ad, float: Vd, array: Pd, object: Md, enum: jd, pattern: Nd, date: xd, url: ar, hex: ar, email: ar, required: Ld, any: qd }; function Ir() { 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 Ar = Ir(), po = /* @__PURE__ */ function() { function e(n) { this.rules = null, this._messages = Ar, 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 = wa(Ir(), o)), this._messages; }, t.validate = function(o, r, a) { var i = this; r === void 0 && (r = {}), a === void 0 && (a = function() { }); var s = o, u = r, l = a; if (typeof u == "function" && (l = u, u = {}), !this.rules || Object.keys(this.rules).length === 0) return l && l(null, s), Promise.resolve(s); function c(p) { var y = [], b = {}; function R($) { if (Array.isArray($)) { var T; y = (T = y).concat.apply(T, $); } else y.push($); } for (var D = 0; D < p.length; D++) R(p[D]); y.length ? (b = Tr(y), l(y, b)) : l(null, s); } if (u.messages) { var d = this.messages(); d === Ar && (d = Ir()), wa(d, u.messages), u.messages = d; } else u.messages = this.messages(); var f = {}, h = u.keys || Object.keys(this.rules); h.forEach(function(p) { var y = i.rules[p], b = s[p]; y.forEach(function(R) { var D = R; typeof D.transform == "function" && (s === o && (s = pn({}, s)), b = s[p] = D.transform(b)), typeof D == "function" ? D = { validator: D } : D = pn({}, D), D.validator = i.getValidationMethod(D), D.validator && (D.field = p, D.fullField = D.fullField || p, D.type = i.getType(D), f[p] = f[p] || [], f[p].push({ rule: D, value: b, source: s, field: p })); }); }); var v = {}; return yd(f, u, function(p, y) { var b = p.rule, R = (b.type === "object" || b.type === "array") && (typeof b.fields == "object" || typeof b.defaultField == "object"); R = R && (b.required || !b.required && p.value), b.field = p.field; function D(E, P) { return pn({}, P, { fullField: b.fullField + "." + E, fullFields: b.fullFields ? [].concat(b.fullFields, [E]) : [E] }); } function $(E) { E === void 0 && (E = []); var P = Array.isArray(E) ? E : [E]; !u.suppressWarning && P.length && e.warning("async-validator:", P), P.length && b.message !== void 0 && (P = [].concat(b.message)); var W = P.map(ya(b, s)); if (u.first && W.length) return v[b.field] = 1, y(W); if (!R) y(W); else { if (b.required && !p.value) return b.message !== void 0 ? W = [].concat(b.message).map(ya(b, s)) : u.error && (W = [u.error(b, wt(u.messages.required, b.field))]), y(W); var F = {}; b.defaultField && Object.keys(p.value).map(function(L) { F[L] = b.defaultField; }), F = pn({}, F, p.rule.fields); var V = {}; Object.keys(F).forEach(function(L) { var A = F[L], k = Array.isArray(A) ? A : [A]; V[L] = k.map(D.bind(null, L)); }); var ne = new e(V); ne.messages(u.messages), p.rule.options && (p.rule.options.messages = u.messages, p.rule.options.error = u.error), ne.validate(p.value, p.rule.options || u, function(L) { var A = []; W && W.length && A.push.apply(A, W), L && L.length && A.push.apply(A, L), y(A.length ? A : null); }); } } var T; if (b.asyncValidator) T = b.asyncValidator(b, p.value, $, p.source, u); else if (b.validator) { try { T = b.validator(b, p.value, $, p.source, u); } catch (E) { console.error == null || console.error(E), u.suppressValidatorError || setTimeout(function() { throw E; }, 0), $(E.message); } T === !0 ? $() : T === !1 ? $(typeof b.message == "function" ? b.message(b.fullField || b.field) : b.message || (b.fullField || b.field) + " fails") : T instanceof Array ? $(T) : T instanceof Error && $(T.message); } T && T.then && T.then(function() { return $(); }, function(E) { return $(E); }); }, function(p) { c(p); }, s); }, t.getType = function(o) { if (o.type === void 0 && o.pattern instanceof RegExp && (o.type = "pattern"), typeof o.validator != "function" && o.type && !Gn.hasOwnProperty(o.type)) throw new Error(wt("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" ? Gn.required : Gn[this.getType(o)] || void 0; }, e; }(); po.register = function(t, n) { if (typeof n != "function") throw new Error("Cannot register a validator by type, validator is not a function"); Gn[t] = n; }; po.warning = vi; po.messages = Ar; po.validators = Gn; function Hd(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 s = 0; s < a.length; s++) { const u = a[s]; i[u] || (i[u] = { type: "object", fields: {} }), s == a.length - 1 ? i[u] = r : i = i[u].fields; } } return new po(t); } function Vr(e, t) { Y(e, (n) => { n.children ? Vr(n.children, t) : t(n); }); } function zd(e, t) { const n = qe.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 Wd(e, t, n) { const o = zd(e, n), r = yn([]); function a(m) { return typeof e.rowKey == "string" ? m[e.rowKey] : e.rowKey(m); } function i(m) { return m[e.editable.rowKey]; } function s(m) { for (const C in r) { const _ = r[C], S = _.cells, O = _.rowData; if (m({ rowData: O, row: _, cells: S }) === "break") return; } } function u(m) { s(({ rowData: C, row: _, cells: S }) => { Y(S, (O, Q) => { m({ rowData: C, row: _, cells: S, cell: O, key: Q }); }); }); } const { merge: l } = $e(), c = M(() => l({ enabled: !1, //模式,free,row,cell mode: "free", rowKey: "id", addForm: {}, editForm: {}, //是否排他式激活,激活一个,其他自动提交或取消 exclusive: !0, //排他式激活时,其他的效果,cancel,save exclusiveEffect: "cancel", //激活触发方式,onClick,onDbClick activeTrigger: "onClick", //默认激活 activeDefault: !1, isEditable(m) { return !0; } }, e.editable)); function d(m, C, _, S) { function O(_e) { return st(m, _e); } function Q(_e, Pe) { tt(m, _e, Pe); } const se = M(() => { var _e; return ((_e = S.editable) == null ? void 0 : _e.updateCell) || c.value.updateCell; }), ie = M(() => { var _e; return ((_e = S.editable) == null ? void 0 : _e.showAction) || c.value.showAction; }), de = yn({ mode: _ < 0 ? "add" : "edit", oldValue: void 0, newValue: void 0, loading: !1, isEditing: c.value.activeDefault, activeTrigger: c.value.activeTrigger, column: S, updateCell: se, showAction: ie, isEditable: () => { var Le; let _e = (Le = S == null ? void 0 : S.editable) == null ? void 0 : Le.disabled; _e instanceof Function && (_e = _e({ column: S, editableId: _, row: m })); let Pe = null; return _e != null && (Pe = !_e), Pe ?? (c.value.isEditable({ editableId: _, key: C, row: m }) || !1); }, isChanged: () => de.newValue !== de.oldValue, getForm: () => { let _e = c.value[de.mode + "Form"]; return _e == null && (_e = c.value.editForm), _e[C]; }, active: (_e = {}) => { (_e.exclusive ?? c.value.exclusive) && ((_e.exclusiveEffect ?? c.value.exclusiveEffect) === "save" ? $() : T()), de.isEditing = !0, de.oldValue = O(C); const Le = c.value.editForm[C]; Le && ne(Le, m); }, inactive: () => { de.isEditing = !1, de.newValue = O(C); }, resume: () => { de.isEditing && (de.isEditing = !1, Q(C, de.oldValue), delete de.newValue, delete de.oldValue); }, cancel: () => { de.resume(); }, persist: () => { de.isEditing = !1, delete de.newValue, delete de.oldValue; }, save: async () => { const _e = q(de.updateCell); if (!_e) { ce.warn("没有配置table.editable.updateCell方法,无法保存,相关文档:http://fast-crud.docmirror.cn/api/crud-options/table.html#editable"); return; } de.loading = !0; try { const Pe = await _e({ editableId: _, row: m, key: C, value: O(C) }), Le = m[c.value.rowKey]; (Le == null || Le <= 0) && ((Pe && Pe[c.value.rowKey]) == null ? ce.error(`对于添加的行,updateCell方法需要返回{'id':value},如果你配置了别的rowKey,需要返回{[rowKey]:id}。 当前返回值:${JSON.stringify(Pe)}`) : m[c.value.rowKey] = Pe[c.value.rowKey]), de.persist(); } finally { de.loading = !1; } } }); return de; } function f(m, C) { const _ = {}; Vr(e.columns, (ie) => { _[ie.key] = d(C, ie.key, m, ie); }); const S = M(() => Hd(_)), O = a(C), Q = O == null || O < 0, se = yn({ isAdd: Q, rowData: C, editableId: m, isEditing: !1, loading: !1, cells: _, validator: S, inactive: () => { se.isEditing = !1, Y(se.cells, (ie) => { ie.isEditing && ie.inactive(); }); }, active: () => { se.isEditing = !0, Y(se.cells, (ie) => { ie.active({ exclusive: !1 }); }); }, persist: () => { se.isEditing = !1, se.inactive(), delete se.isAdd, Y(se.cells, (ie) => { ie.persist(); }); }, resume: () => { se.isEditing = !1, Y(se.cells, (ie) => { ie.resume(); }); }, cancel: () => { se.resume(); }, validate: async (ie) => { try { return Y(se.cells, (de, _e) => { de.validateErrors = []; }), ie == null && (ie = se.rowData), await se.validator.validate(ie), !0; } catch (de) { const { errors: _e, fields: Pe } = de; return Y(Pe, (Le, X) => { const ye = se.cells[X]; ye && (ye.validateErrors = Le); }), Pe; } }, getRowData: () => { const ie = dt(se.rowData); return delete ie[e.editable.rowKey], delete ie.children, ie; }, save: async (ie) => { const { doSave: de } = ie, _e = se.rowData, { merge: Pe } = $e(); if (await se.validate() !== !0) return; function X(Me) { Me && (a(Me) == null && console.error("保存接口没有返回rowKey,无法更新该行的id,newRow:", Me), Pe(_e, Me)); } se.loading = !0; const ye = se.getRowData(); try { await de({ isAdd: se.isAdd, row: ye, setData: X }), se.persist(); } finally { se.loading = !1; } } }); if (it(() => C, async (ie, de, _e) => { await se.validate(); }, { deep: !0 }), C.children && C.children.length > 0) for (const ie of C.children) { ie[e.editable.rowKey] || (ie[e.editable.rowKey] = v()); const de = ie[e.editable.rowKey]; r[de] = f(de, ie); } return Q && se.active(), se; } let h = 0; function v() { return h++, h; } function p(m) { m == null && (m = o.getData()); const C = Object.assign({}, r); vs(r, (_, S) => { delete r[S]; }), Y(m, (_) => { _[e.editable.rowKey] || (_[e.editable.rowKey] = v()); const S = _[e.editable.rowKey]; C[S] ? r[S] = C[S] : r[S] = f(S, _); }), c.value.onSetup && c.value.onSetup(); } function y(m) { const C = e.editable.rowKey, _ = []; for (const S of m) { const O = { [C]: S[C] }; S.children && S.children.length && (O.children = y(S.children)), _.push(O); } return _; } it(() => { const m = e.data; let C = []; return m != null && m instanceof Array && (C = y(m)), JSON.stringify(C); }, (m, C) => { c.value.enabled && p(e.data); }, { immediate: !0 }), it(() => c.value.enabled, (m) => { var C; m && (((C = o.getData()) == null ? void 0 : C.length) > 0 && p(), c.value.onEnabled && c.value.onEnabled({ ...c.value })); }, { immediate: !0 }), it(() => c.value.mode, () => { c.value.onEnabled && c.value.onEnabled({ ...c.value }); }); function b(m, C) { var _; if (C != null) return (_ = r[m]) == null ? void 0 : _.cells[C]; } function R(m = {}) { u(({ cell: C }) => { C.active({ ...m, exclusive: !1 }); }); } function D() { u(({ cell: m }) => { m.isEditing && m.inactive(); }); } async function $() { u(({ cell: m }) => { m.isEditing && m.save(); }); } function T() { u(({ cell: m }) => { m.isEditing && m.cancel(); }); } function E() { D(), s(({ row: m }) => { delete m.isAdd; }), u(({ cell: m }) => { delete m.newValue, delete m.oldValue; }); } function P() { u(({ cell: m }) => { m.resume(); }); } function W() { let m = !1; return s(({ cells: C }) => { Y(C, (_) => { if (_.isChanged()) return m = !0, "break"; }); }), m; } let F = 0; function V(m, C) { Vr(m, (_) => { ne(_, C); }); } function ne(m, C) { const _ = st(C, m.key), S = q(m.value); S != null && _ == null && tt(C, m.key, S); } async function L(m = { row: void 0, active: !0 }) { let C = m.row || { [c.value.rowKey]: --F, [e.rowKey]: F }; if (V(c.value.addForm, C), m.addRowFunc) { const _ = await m.addRowFunc({ row: m.row }); _ && (C = _); } else if (e.editable.addRow) { const _ = await e.editable.addRow(o.getData(), C); _ && (C = _); } else o.unshift(C); if (m.active ?? e.editable.activeDefault) { await Be(); const _ = i(C), S = J(_); S && S.active(); } } function A(m, C) { for (let _ = 0; _ < C.length; _++) { const S = C[_]; if (i(S) === m) return xa(C, S), !0; if (S.children && S.children.length > 0 && A(m, S.children)) return; } return !1; } function k(m) { delete r[m], A(m, o.getData()); } function N(m) { const { cols: C } = m; s(({ cells: _ }) => { Y(C, (S) => { _[S].active({ ...m, exclusive: !1 }); }); }); } function J(m) { return r[m]; } function ue() { const m = []; return s(({ row: C }) => { C.isEditing && m.push(C); }), m; } async function Z() { const m = {}; let C = !1; for (const _ in r) { const S = r[_], O = await S.validate(); O != !0 && (m[S.editableId] = O, C = !0); } return C ? m : !0; } function Se(m) { for (const C of m) delete C[e.editable.rowKey], C.children && C.children.length > 0 && Se(C.children); return m; } function ke(m) { return m == null && (m = dt(o.getData())), m == null ? [] : Se(m); } return { editable: { options: c, setupEditable: p, inactive: D, active: R, persist: E, saveEach: $, cancelAll: T, resume: P, addRow: L, removeRow: k, getEditableRow: J, activeCols: N, hasDirty: W, getEditableCell: b, eachRows: s, eachCells: u, validate: Z, getCleanTableData: ke, getActiveRows: ue } }; } function Ud(e) { const t = (o, r) => st(e, `value[${o}].${r}`); sn("componentRef:get", t); const n = (o, r, a) => tt(e, `value[${o}].${r}`, a); return sn("componentRef:set", n), { getter: t, setter: n }; } function Kd({ props: e, ui: t, sortedColumns: n, renderRowHandle: o, renderCellComponent: r }) { H(t.table.name); const a = H(t.tableColumn.name), i = H(t.tableColumnGroup.name); t.tableColumn; const s = {}, u = (l) => { const c = { ...l.columnSlots }, d = "cell_" + l.key; let f = a; if (l.children) c.default = () => { const v = []; return Y(l.children, (p) => { p.show !== !1 && v.push(u(p)); }), v; }, f = i; else if (l.type != null) { ce.debug("cell render column.type:", l.type); const v = e.cellSlots && e.cellSlots[d]; v && (c.default = v); } else c.default = (v) => r(l, v); const h = { ...l }; return delete h.children, x(f, z({ ref: "tableColumnRef" }, h, { label: l.title, prop: l.key, dataIndex: l.key }), c); }; return s.default = () => { var c; const l = []; if (Y(n, (d) => { d.show !== !1 && l.push(u(d)); }), e.rowHandle && e.rowHandle.show !== !1) { const d = { default: o, ...(c = e.rowHandle) == null ? void 0 : c.columnSlots }; l.push(x(a, z({ ref: "tableColumnRef" }, e.rowHandle, { label: e.rowHandle.title, prop: e.rowHandle.key || "rowHandle" }), d)); } return l; }, e.slots && Y(e.slots, (l, c) => { s[c] = l; }), s; } function yi(e, t) { var c; const { props: n, renderRowHandle: o, renderCellComponent: r, sortedColumns: a } = e, { ui: i } = we(), s = a ?? {}, u = []; let l = i.table; n.tableVersion === "v2" && (l = i.tableV2); for (const d in s) { const f = s[d]; if (f.show === !1) continue; const h = { ...f }; if (h._parent = t, h.dataIndex = f.key, u.push(h), f.children != null) { const p = { ...e, sortedColumns: f.children }; delete p.renderRowHandle, h.children = yi(p, h); } else if (f.type == null) { const p = h[l.renderMethod], y = { ...h }; delete y[l.renderMethod], p ? h[l.renderMethod] = (b, R, D) => { const $ = l.rebuildRenderScope(b, R, D); return p($, () => r(y, $)); } : h[l.renderMethod] = (b, R, D) => { const $ = l.rebuildRenderScope(b, R, D); return r(y, $); }; } } if (o && ((c = n.rowHandle) == null ? void 0 : c.show) !== !1) { const d = { key: "_rowHandle", ...n.rowHandle }; d[l.renderMethod] = (f, h, v) => { const p = l.rebuildRenderScope(f, h, v); return o(p); }, u.push(d); } return ce.debug("table columns:", u), u; } const Yd = /* @__PURE__ */ le({ 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) { _t.trace("fs-table"); const n = K(), o = K([]); Ud(o); const r = (F, V) => { if (!V || F == null || F > o.value.length) return; const L = o.value[F][V]; return L == null ? void 0 : L.getTargetRef(); }, { ui: a } = we(), i = Go(); it(() => e.data, (F) => { t.emit("data-change", { data: F }); }); let s = a.table, u = a.tableColumn; e.tableVersion === "v2" && (s = a.tableV2, u = a.tableColumnV2); function l(F = 0) { s.scrollTo({ top: F, tableRef: n, fsTableRef: i }); } const c = H(s.name), d = Wd(e, t, n), f = (F, V) => { const ne = V[u.row], L = ne, A = V[u.index]; return V.index = A, { ...V, key: F.key, value: st(ne, F.key), row: ne, form: L, getComponentRef: (k) => r(A, k) }; }; function h(F) { t.emit("row-handle", F); } const v = s.onChange({ onSortChange: (F) => { t.emit("sort-change", F); }, onFilterChange: (F) => { t.emit("filter-change", F); }, onPagination: () => { }, bubbleUp: (F) => { F(t.attrs); } }), p = (F) => { F.index = F[u.index]; const V = "cell-rowHandle", ne = {}; if (e.cellSlots) for (const L in e.cellSlots) L.startsWith(V) && (ne[L] = e.cellSlots[L]); return x(G("fs-row-handle"), z(e.rowHandle, { scope: F, onHandle: h }), ne); }, y = (F, V) => { var Se, ke, m, C, _, S, O, Q, se, ie, de, _e; const ne = "cell_" + F.key, L = V.row = V[u.row], A = { modelValue: st(V[u.row], F.key), "onUpdate:modelValue": (Pe) => { var X; tt(V[u.row], F.key, Pe); const Le = f(F, V); t.emit("value-change", Le), F.valueChange && (F.valueChange instanceof Function ? F.valueChange(Le) : (X = F.valueChange) == null || X.handle(Le)); } }, k = (Pe) => { const Le = V[u.index], X = F.key; let ye = o.value[Le]; ye == null && (o.value[Le] = ye = {}), ye[X] = Pe; }, N = V[u.index], J = L[(Se = e.editable) == null ? void 0 : Se.rowKey], ue = e.cellSlots && e.cellSlots[ne], Z = f(F, V); if (((C = (m = (ke = d.editable) == null ? void 0 : ke.options) == null ? void 0 : m.value) == null ? void 0 : C.enabled) === !0) { const Pe = d.editable.getEditableCell(J, F.key); return x(G("fs-editable-cell"), z({ ref: k, key: F.key, columnKey: F.key, index: N, editableId: J, item: F, editableCell: Pe, editableOpts: (S = (_ = d.editable) == null ? void 0 : _.options) == null ? void 0 : S.value, scope: Z, slots: ue, disabled: (se = (Q = (O = d.editable) == null ? void 0 : O.options) == null ? void 0 : Q.value) == null ? void 0 : se.disabled, readonly: (_e = (de = (ie = d.editable) == null ? void 0 : ie.options) == null ? void 0 : de.value) == null ? void 0 : _e.readonly }, A), null); } else return x(G("fs-cell"), z({ ref: k, key: F.key, item: F, scope: Z, slots: ue }, A, { conditionalRender: e.conditionalRender }), null); }, { expose: b } = t; b({ tableRef: n, componentRefs: o, getComponentRef: r, ...d, scrollTo: l }); const { doColumnsSort: R } = Zr(), D = s.renderMode, $ = M(() => ({ [s.data]: e.data })), { merge: T, cloneDeep: E } = $e(), P = M(() => { let F = e.rowKey; return a.type === "naive" && typeof e.rowKey == "string" && (F = (V) => V[e.rowKey]), T({ rowKey: F }, t.attrs, v); }), W = M(() => R(E(e.columns))); if (D === "slot") { const F = M(() => Kd({ props: e, ui: a, sortedColumns: W.value, renderRowHandle: p, renderCellComponent: y })); return () => { if (e.show === !1) return; const V = x(c, z({ ref: n, loading: e.loading }, P.value, $.value), F.value); if (typeof s.vLoading == "string") { const ne = as(s.vLoading); return Hr(V, [[ne, e.loading]]); } return V; }; } else { const F = M(() => yi({ props: e, ctx: t, ui: a, getContextFn: f, sortedColumns: W.value, componentRefs: o, renderRowHandle: p, renderCellComponent: y, columns: e.columns })), V = M(() => { const L = []; function A(k) { k.forEach((N) => { N.children ? A(N.children) : L.push(N); }); } return A(F.value), L; }), ne = M(() => s.buildMultiHeadersBind ? s.buildMultiHeadersBind({ treeColumns: F.value, flatColumns: V.value }) : { bind: {}, slots: {} }); return () => { var N; if (e.show === !1) return; const L = { ...e.slots, ...(N = ne.value) == null ? void 0 : N.slots }, A = s.columnsIsFlat, k = (J = {}) => { var ue; return x(c, z({ ref: n, loading: e.loading }, P.value, { columns: A ? V.value : F.value }, $.value, (ue = ne.value) == null ? void 0 : ue.bind, J), L); }; if (e.tableVersion === "v2" && a.type === "element") { const J = { default({ width: ue, height: Z }) { return k({ width: ue, height: Z }); } }; return x(G("el-auto-resizer"), null, J); } return k(); }; } } }), Gd = /* @__PURE__ */ le({ name: "FsCell", props: { item: {}, /** * scope */ scope: { default() { return {}; } }, /** * 插槽 */ slots: {}, /** * 条件渲染,符合条件的情况下优先渲染 */ conditionalRender: { type: Object } }, setup(e, t) { const { doComputed: n } = Pt(), { ui: o } = we(), i = n(() => e.item.component, () => e.scope), s = K(); function u() { return s.value.getTargetRef(); } t.expose({ getTargetRef: u, targetRef: s }); const l = M(() => { let f = e.item.showTitle; const h = e.scope.value; return f === !0 && (f = h), f; }), c = M(() => (h) => x("span", { class: "fs-cell", title: l.value }, [h])), d = () => { var y, b; const f = e.scope.value, h = c.value, v = { ...e.scope, props: e.item }, p = e.item.conditionalRender ?? e.conditionalRender; if (p && p.match && p.match(v)) return h(p.render(v)); if (e.slots) return h(e.slots(v)); if (e.item.formatter) return h(e.item.formatter(v)); if (e.item.cellRender) return h(e.item.cellRender(v)); if (e.item.render) console.warn("column.render 配置已废弃,请使用column.cellRender代替"); else return (y = i.value) != null && y.name ? ((b = i.value) == null ? void 0 : b.show) === !1 ? void 0 : x(G("fs-component-render"), z({ title: l.value, ref: s }, i.value, { scope: v }), null) : h(bs(f)); }; if (e.item.tooltip) { const f = H(o.tooltip.name); return () => { let h = {}, v = {}; typeof e.item.tooltip == "object" ? (h = wn(e.item.tooltip, "slots"), v = { ...e.item.tooltip.slots }) : v[o.tooltip.content] = () => e.item.tooltip === !0 ? l.value ?? e.scope.value : typeof e.item.tooltip == "function" ? e.item.tooltip() : e.item.tooltip; const p = { ...v, [o.tooltip.trigger]: () => d() }; return x(f, h, p); }; } else return d; } }), Xd = /* @__PURE__ */ le({ name: "FsEditableCell", inheritAttrs: !1, props: { /** * 组件配置 */ item: {}, scope: {}, index: {}, editableId: {}, columnKey: {}, editableCell: { type: Object }, editableOpts: { type: Object }, slots: {}, disabled: {}, readonly: {} }, setup(e, t) { qe.get(); const { doComputed: n } = Pt(); if (e.index === -1) return () => { }; const r = n(() => { var h; return (h = e.editableCell) == null ? void 0 : h.getForm(); }, () => e.scope), a = M(() => { 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 s() { var h; if (((h = e.editableOpts) == null ? void 0 : h.mode) === "free") { await e.editableCell.persist(); return; } await e.editableCell.save(); } function u() { e.editableCell.cancel(); } const l = M(() => { var h, v; return (((h = e.editableOpts) == null ? void 0 : h.mode) === "cell" || ((v = e.editableOpts) == null ? void 0 : v.mode) === "free") && e.editableCell.showAction !== !1; }), c = M(() => e.editableCell.isChanged && e.editableCell.isChanged()), d = () => e.scope, f = { default: () => x(G("fs-cell"), z({ ref: "targetRef", item: e.item, scope: e.scope, slots: e.slots }, t.attrs), null), edit: () => { var v, p; let h = null; return (v = e.editableCell) != null && v.isEditing && (r.value.blank === !1 || ((p = r.value.component) == null ? void 0 : p.show) === !1 ? h = null : r.value.conditionalRender && r.value.conditionalRender.match && r.value.conditionalRender.match(d()) ? h = x(G("fs-render"), z({ "render-func": r.value.conditionalRender.render, scope: d() }, t.attrs), null) : r.value.render ? h = x(G("fs-render"), z({ "render-func": r.value.render, scope: d() }, t.attrs), null) : h = x(G("fs-component-render"), z({ ref: "targetInputRef" }, r.value.component, t.attrs, { scope: e.scope }), null)), h; } }; return () => { var p; if (!a.value || e.disabled || e.readonly) return x(G("fs-cell"), z({ ref: "targetRef", item: e.item, scope: e.scope }, t.attrs), null); const h = e.editableCell, v = l.value ? (p = e.editableOpts) == null ? void 0 : p.activeTrigger : !1; return x(G("fs-editable"), { ref: "editableRef", class: "fs-editable-cell", editing: h == null ? void 0 : h.isEditing, showAction: l.value, dirty: c.value, "onUpdate:editing": i, onSubmit: s, onCancel: u, loading: h == null ? void 0 : h.loading, trigger: v, 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; } } }), Qd = { class: "fs-editable" }, Jd = { class: "fs-editable-input" }, Zd = { key: 0, class: "fs-editable-dirty" }, ef = { key: 0, class: "fs-editable-action fs-editable-icon" }, tf = { class: "fs-editable-input" }, nf = { class: "fs-editable-action" }, of = { class: "error-icon" }, rf = /* @__PURE__ */ le({ __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, default: !0 }, validateErrors: { default: () => [] } }, emits: ["update:editing", "submit", "cancel"], setup(e, { emit: t }) { const n = e, { ui: o } = we(), r = t, a = M(() => n.trigger ? { [n.trigger]: () => { r("update:editing", !0); } } : {}); function i() { r("submit"); } function s() { r("cancel"); } function u() { var c; return ((c = n.validateErrors) == null ? void 0 : c.length) > 0; } function l() { var c, d; if (((c = n.validateErrors) == null ? void 0 : c.length) !== 0) return (d = n.validateErrors) == null ? void 0 : d.map((f) => f.message).join(","); } return (c, d) => { const f = G("fs-icon"); return w(), j("div", Qd, [ !c.editing || c.disabled ? (w(), j("div", z({ key: 0, class: "fs-editable-inner fs-editable-pointer" }, a.value), [ te("div", Jd, [ c.dirty ? (w(), j("div", Zd)) : oe("", !0), re(c.$slots, "default") ]), c.trigger && !c.disabled ? (w(), j("div", ef, [ x(f, { icon: q(o).icons.edit }, null, 8, ["icon"]) ])) : oe("", !0) ], 16)) : (w(), j("div", { key: 1, class: St(["fs-editable-inner", { "fs-validate-error": u() }]) }, [ te("div", tf, [ re(c.$slots, "edit") ]), te("div", nf, [ (w(), I(H(q(o).tooltip.name), null, { [q(o).tooltip.content]: B(() => [ te("span", of, We(l()), 1) ]), [q(o).tooltip.trigger]: B(() => [ x(f, { class: St({ hidden: !u(), "error-icon": !0 }), size: "mini", icon: q(o).icons.info }, null, 8, ["class", "icon"]) ]), _: 2 }, 1024)), c.showAction ? (w(), j(be, { key: 0 }, [ c.loading ? (w(), I(f, { key: 0, size: "mini", spin: !0, icon: q(o).icons.refresh }, null, 8, ["icon"])) : (w(), I(f, { key: 1, size: "mini", icon: q(o).icons.check, onClick: i }, null, 8, ["icon"])), x(f, { class: St({ hidden: c.loading }), size: "mini", icon: q(o).icons.close, onClick: s }, null, 8, ["class", "icon"]) ], 64)) : oe("", !0) ]) ], 2)) ]); }; } }); const af = le({ name: "FsActionbar", props: { /** * 按钮配置 * { * add:{ * ...FsButton, * show:true * }, * custom:{...} * } */ buttons: {} }, emits: ["action"], setup(e, t) { function n(r, a, i) { const s = { key: r, btn: a, $event: i }; if (a.click) { a.click(s); return; } if (a.onClick) { a.onClick(s); return; } t.emit("action", s); } const o = M(() => { let r = []; for (let i in e.buttons) r.push({ // @ts-ignore ...e.buttons[i], _key: i }); r = Cn(r, (i) => i.order ?? ln.orderDefault); const a = {}; return r.forEach((i) => { let s = i._key; delete i._key, a[s] = i; }), a; }); return { onClick: n, computedButtons: o }; } }); const sf = { class: "fs-actionbar" }; function lf(e, t, n, o, r, a) { const i = G("fs-button"); return w(), j("div", sf, [ (w(!0), j(be, null, Te(e.computedButtons, (s, u) => (w(), j(be, { key: u }, [ s.show !== !1 ? (w(), I(i, z({ key: 0, ref_for: !0 }, s, { onClick: (l) => e.onClick(u, s, l) }), null, 16, ["onClick"])) : oe("", !0) ], 64))), 128)) ]); } const uf = /* @__PURE__ */ Oe(af, [["render", lf]]); class mp { constructor() { /** * 是否执行valueChange */ ae(this, "valueChange"); ae(this, "mergeForm"); } } const ea = "ColumnsFilterContext", cf = /* @__PURE__ */ le({ __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 } = lt(), i = qe.get(), s = K(!1), u = () => { s.value = !0; }, l = M(() => R(o.originalColumns)), c = K([]), d = M(() => { const m = {}; return p(l.value, (C) => { m[C.__key] = C; }), m; }), { merge: f, cloneDeep: h } = $e(), v = M(() => { const m = { 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(m, o.text), m; }); function p(m, C) { if (m) if (Array.isArray(m)) for (const _ of m) C(_), _.children && p(_.children, C); else for (const _ in m) { const S = m[_]; C(S), S.children && p(S.children, C); } } function y(m) { return { key: m.key, title: m.title, fixed: m.fixed ?? !1, show: m.show ?? !0, __show: m.columnSetShow !== !1, __disabled: m.columnSetDisabled ?? !1 }; } function b(m) { const C = {}; return Y(m, (_) => { const S = wn(_, "children", "__show", "__disabled", "__parent", "__key"); _.children && _.children.length > 0 && (S.children = b(_.children)), C[_.key] = S; }), C; } function R(m, C) { const _ = []; return Y(m, (S) => { const O = y(S); O.__parent = C, O.__key = `${(C == null ? void 0 : C.key) || ""}.${S.key}`, _.push(O), S.children && (O.children = R(S.children, O)); }), _; } function D(m) { c.value = R(m); } async function $() { c.value = R(o.originalColumns), await T(!0), await J(), r("reset"); } async function T(m = !1) { m || await k(c.value); const C = h(c.value); return p(C, (_) => { _ && (delete _.__disabled, delete _.__show, delete _.__parent, delete _.__key); }), V(C), s.value = !1, C; } async function E(m = !1) { const C = await T(m); r("submit", { columns: C }); } const P = M(() => o.originalColumns); sn(ea, { originalColumns: P, originalColumnsMap: d, currentColumns: c, text: v, active: s, submit: E, reset: $ }); async function W() { await E(!1), r("update:show", !1); } async function F() { await $(), r("update:show", !1); } function V(m) { r("update:columns", b(m)); } const ne = jn("get:crudBinding", () => ({ id: "" })), L = K(); function A() { const m = typeof o.storage == "object" ? o.storage : null, C = typeof o.storage == "string" ? o.storage : ""; if (L.value == null) { const _ = Ha(); L.value = new Kr({ $router: _, tableName: "columnsFilter", keyType: C, remoteStorage: m }); } return L.value.id = ne().id, L.value; } async function k(m) { if (o.storage === !1) return; const C = h(m); p(C, (_) => { delete _.__parent; }), await A().updateTableValue(C); } async function N() { if (o.storage !== !1) return await A().getTableValue(); } async function J() { await A().clearTableValue(); } function ue(m) { const C = []; p(m, (S) => { const O = La(S, "key", "__show", "__disabled"); C.push(JSON.stringify(O)); }), C.sort(); let _ = ""; for (const S of C) _ += S; return _; } it( () => o.columns, (m) => { D(m); } ); const Z = async () => { D(o.columns); const m = await N(); if (m) { const C = ue(m); if (ue(l.value) !== C) return; c.value = m, await Be(), await E(!0); } }; async function Se(m) { await m(c), await T(); } it( () => l.value, async (m) => { await Z(); }, { immediate: !0 } ), t({ start: u, save: T, update: Se, original: l, columns: c }); function ke(m) { return m.label || m.title || m.key || v.value.unnamed; } return (m, C) => { var S; const _ = G("fs-button"); return m.mode === "simple" ? (w(), j(be, { key: 0 }, [ (w(), I(H(q(i).row.name), { class: "fs-table-columns-filter-simple" }, { default: B(() => [ (w(!0), j(be, null, Te(c.value, (O, Q) => { var se; return Hr((w(), I(H(q(i).col.name), { key: Q, span: 6 }, { default: B(() => { var ie; return [ (w(), I(H(q(i).checkbox.name), xe({ [q(i).checkbox.modelValue]: O.show, ["onUpdate:" + q(i).checkbox.modelValue]: (de) => O.show = de, disabled: ((ie = l.value[O.key]) == null ? void 0 : ie.__disabled) === !0, class: "item-label", title: ke(O) }), { default: B(() => [ Vt(We(ke(O)), 1) ]), _: 2 }, 1040, ["disabled", "title"])) ]; }), _: 2 }, 1024)), [ [ja, ((se = l.value[O.key]) == null ? void 0 : se.__show) !== !1] ]); }), 128)) ]), _: 1 })), (w(), I(H(q(i).divider.name))), (w(), I(H(q(i).row.name), null, { default: B(() => [ x(_, { style: { "margin-right": "5px" }, type: "primary", icon: q(i).icons.check, text: v.value.confirm, onClick: C[0] || (C[0] = (O) => W()) }, null, 8, ["icon", "text"]), x(_, { icon: q(i).icons.refresh, text: v.value.reset, onClick: F }, null, 8, ["icon", "text"]) ]), _: 1 })) ], 64)) : (w(), I(H(((S = m.container) == null ? void 0 : S.is) || "fs-columns-filter-layout-default"), xe(z({ key: 1 }, m.container)), { buttons: B(() => [ (w(), I(H(q(i).row.name), { class: "fs-drawer-footer", gutter: 10 }, { default: B(() => [ (w(), I(H(q(i).col.name), { span: 12 }, { default: B(() => [ x(_, { icon: q(i).icons.refresh, text: v.value.reset, block: "", onClick: $ }, null, 8, ["icon", "text"]) ]), _: 1 })), (w(), I(H(q(i).col.name), { span: 12 }, { default: B(() => [ x(_, { type: "primary", icon: q(i).icons.check, text: v.value.confirm, block: "", onClick: C[1] || (C[1] = (O) => E(!1)) }, null, 8, ["icon", "text"]) ]), _: 1 })) ]), _: 1 })) ]), _: 1 }, 16)); }; } }); const df = le({ name: "FsToolbar", components: { FsTableColumnsFilter: cf }, 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) { lt(); const n = K(), { ui: o } = we(), { merge: r } = $e(), a = M(() => { const u = { columns: { click: () => { n.value.start(); } } }; r(u, e.buttons); let l = []; for (let d in u) l.push({ ...u[d], _key: d }); l = Cn(l, (d) => d.order ?? ln.orderDefault); const c = {}; return l.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: () => { o.type !== "element" && (i.value = !i.value); } }; } }); const ff = { class: "fs-toolbar" }; function hf(e, t, n, o, r, a) { var s; const i = G("fs-button"); return w(), j("div", ff, [ (w(!0), j(be, null, Te(e.computedButtons, (u, l) => { var c; return w(), j(be, { key: l }, [ u.show !== !1 ? (w(), j(be, { key: 0 }, [ l === "columns" && e.columnsFilter && ((c = e.columnsFilter) == null ? void 0 : c.mode) === "simple" ? (w(), I(H(e.ui.popover.name), xe({ 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(() => [ x(i, z({ ref_for: !0 }, u, { onClick: e.handleSimpleClick }), null, 16, ["onClick"]) ]), [e.ui.popover.contentSlotName]: B(() => [ e.columns ? (w(), I(H(e.columnsFilter.is || "fs-table-columns-filter"), z({ 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"])) : oe("", !0) ]), _: 2 }, 1040)) : (w(), I(i, z({ key: 1, ref_for: !0 }, u, { onClick: (d) => u.click() }), null, 16, ["onClick"])) ], 64)) : oe("", !0) ], 64); }), 128)), e.columns && ((s = e.columnsFilter) == null ? void 0 : s.mode) !== "simple" ? (w(), I(H(e.columnsFilter.is || "fs-table-columns-filter"), z({ key: 0, ref: "columnsFilterRef", storage: e.storage }, e.columnsFilter, { columns: e.columns, "onUpdate:columns": t[3] || (t[3] = (u) => e.$emit("update:columns", u)) }), null, 16, ["storage", "columns"])) : oe("", !0) ]); } const mf = /* @__PURE__ */ Oe(df, [["render", hf]]); /**! * Sortable 1.14.0 * @author RubaXa * @author owenm * @license MIT */ function Ca(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 zt(e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t] != null ? arguments[t] : {}; t % 2 ? Ca(Object(n), !0).forEach(function(o) { pf(e, o, n[o]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Ca(Object(n)).forEach(function(o) { Object.defineProperty(e, o, Object.getOwnPropertyDescriptor(n, o)); }); } return e; } function To(e) { "@babel/helpers - typeof"; return typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? To = function(t) { return typeof t; } : To = function(t) { return t && typeof Symbol == "function" && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t; }, To(e); } function pf(e, t, n) { return t in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } function Yt() { return Yt = 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; }, Yt.apply(this, arguments); } function gf(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 vf(e, t) { if (e == null) return {}; var n = gf(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 bf = "1.14.0"; function Kt(e) { if (typeof window < "u" && window.navigator) return !!/* @__PURE__ */ navigator.userAgent.match(e); } var Gt = Kt(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i), go = Kt(/Edge/i), Sa = Kt(/firefox/i), Xn = Kt(/safari/i) && !Kt(/chrome/i) && !Kt(/android/i), wi = Kt(/iP(ad|od|hone)/i), yf = Kt(/chrome/i) && Kt(/android/i), _i = { capture: !1, passive: !1 }; function De(e, t, n) { e.addEventListener(t, n, !Gt && _i); } function Fe(e, t, n) { e.removeEventListener(t, n, !Gt && _i); } function qo(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 wf(e) { return e.host && e !== document && e.host.nodeType ? e.host : e.parentNode; } function Bt(e, t, n, o) { if (e) { n = n || document; do { if (t != null && (t[0] === ">" ? e.parentNode === n && qo(e, t) : qo(e, t)) || o && e === n) return e; if (e === n) break; } while (e = wf(e)); } return null; } var Fa = /\s+/g; function ft(e, t, n) { if (e && t) if (e.classList) e.classList[n ? "add" : "remove"](t); else { var o = (" " + e.className + " ").replace(Fa, " ").replace(" " + t + " ", " "); e.className = (o + (n ? " " + t : "")).replace(Fa, " "); } } function he(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 En(e, t) { var n = ""; if (typeof e == "string") n = e; else do { var o = he(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 Ci(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 Ht() { var e = document.scrollingElement; return e || document.documentElement; } function Ke(e, t, n, o, r) { if (!(!e.getBoundingClientRect && e !== window)) { var a, i, s, u, l, c, d; if (e !== window && e.parentNode && e !== Ht() ? (a = e.getBoundingClientRect(), i = a.top, s = a.left, u = a.bottom, l = a.right, c = a.height, d = a.width) : (i = 0, s = 0, u = window.innerHeight, l = window.innerWidth, c = window.innerHeight, d = window.innerWidth), (t || n) && e !== window && (r = r || e.parentNode, !Gt)) do if (r && r.getBoundingClientRect && (he(r, "transform") !== "none" || n && he(r, "position") !== "static")) { var f = r.getBoundingClientRect(); i -= f.top + parseInt(he(r, "border-top-width")), s -= f.left + parseInt(he(r, "border-left-width")), u = i + a.height, l = s + a.width; break; } while (r = r.parentNode); if (o && e !== window) { var h = En(r || e), v = h && h.a, p = h && h.d; h && (i /= p, s /= v, d /= v, c /= p, u = i + c, l = s + d); } return { top: i, left: s, bottom: u, right: l, width: d, height: c }; } } function Ra(e, t, n) { for (var o = rn(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 === Ht()) break; o = rn(o, !1); } return !1; } function Bn(e, t, n, o) { for (var r = 0, a = 0, i = e.children; a < i.length; ) { if (i[a].style.display !== "none" && i[a] !== me.ghost && (o || i[a] !== me.dragged) && Bt(i[a], n.draggable, e, !1)) { if (r === t) return i[a]; r++; } a++; } return null; } function ta(e, t) { for (var n = e.lastElementChild; n && (n === me.ghost || he(n, "display") === "none" || t && !qo(n, t)); ) n = n.previousElementSibling; return n || null; } function Ct(e, t) { var n = 0; if (!e || !e.parentNode) return -1; for (; e = e.previousElementSibling; ) e.nodeName.toUpperCase() !== "TEMPLATE" && e !== me.clone && (!t || qo(e, t)) && n++; return n; } function Da(e) { var t = 0, n = 0, o = Ht(); if (e) do { var r = En(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 _f(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 rn(e, t) { if (!e || !e.getBoundingClientRect) return Ht(); var n = e, o = !1; do if (n.clientWidth < n.scrollWidth || n.clientHeight < n.scrollHeight) { var r = he(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 Ht(); if (o || t) return n; o = !0; } } while (n = n.parentNode); return Ht(); } function Cf(e, t) { if (e && t) for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); return e; } function ir(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 Qn; function Si(e, t) { return function() { if (!Qn) { var n = arguments, o = this; n.length === 1 ? e.call(o, n[0]) : e.apply(o, n), Qn = setTimeout(function() { Qn = void 0; }, t); } }; } function Sf() { clearTimeout(Qn), Qn = void 0; } function Fi(e, t, n) { e.scrollLeft += t, e.scrollTop += n; } function Ri(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 yt = "Sortable" + (/* @__PURE__ */ new Date()).getTime(); function Ff() { var e = [], t; return { captureAnimationState: function() { if (e = [], !!this.options.animation) { var o = [].slice.call(this.el.children); o.forEach(function(r) { if (!(he(r, "display") === "none" || r === me.ghost)) { e.push({ target: r, rect: Ke(r) }); var a = zt({}, e[e.length - 1].rect); if (r.thisAnimationDuration) { var i = En(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(_f(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(s) { var u = 0, l = s.target, c = l.fromRect, d = Ke(l), f = l.prevFromRect, h = l.prevToRect, v = s.rect, p = En(l, !0); p && (d.top -= p.f, d.left -= p.e), l.toRect = d, l.thisAnimationDuration && ir(f, d) && !ir(c, d) && // Make sure animatingRect is on line between toRect & fromRect (v.top - d.top) / (v.left - d.left) === (c.top - d.top) / (c.left - d.left) && (u = Df(v, f, h, r.options)), ir(d, c) || (l.prevFromRect = c, l.prevToRect = d, u || (u = r.options.animation), r.animate(l, v, d, u)), u && (a = !0, i = Math.max(i, u), clearTimeout(l.animationResetTimer), l.animationResetTimer = setTimeout(function() { l.animationTime = 0, l.prevFromRect = null, l.fromRect = null, l.prevToRect = null, l.thisAnimationDuration = null; }, u), l.thisAnimationDuration = u); }), clearTimeout(t), a ? t = setTimeout(function() { typeof o == "function" && o(); }, i) : typeof o == "function" && o(), e = []; }, animate: function(o, r, a, i) { if (i) { he(o, "transition", ""), he(o, "transform", ""); var s = En(this.el), u = s && s.a, l = s && s.d, c = (r.left - a.left) / (u || 1), d = (r.top - a.top) / (l || 1); o.animatingX = !!c, o.animatingY = !!d, he(o, "transform", "translate3d(" + c + "px," + d + "px,0)"), this.forRepaintDummy = Rf(o), he(o, "transition", "transform " + i + "ms" + (this.options.easing ? " " + this.options.easing : "")), he(o, "transform", "translate3d(0,0,0)"), typeof o.animated == "number" && clearTimeout(o.animated), o.animated = setTimeout(function() { he(o, "transition", ""), he(o, "transform", ""), o.animated = !1, o.animatingX = !1, o.animatingY = !1; }, i); } } }; } function Rf(e) { return e.offsetWidth; } function Df(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 Rn = [], sr = { initializeByDefault: !0 }, vo = { mount: function(t) { for (var n in sr) sr.hasOwnProperty(n) && !(n in t) && (t[n] = sr[n]); Rn.forEach(function(o) { if (o.pluginName === t.pluginName) throw "Sortable: Cannot mount plugin ".concat(t.pluginName, " more than once"); }), Rn.push(t); }, pluginEvent: function(t, n, o) { var r = this; this.eventCanceled = !1, o.cancel = function() { r.eventCanceled = !0; }; var a = t + "Global"; Rn.forEach(function(i) { n[i.pluginName] && (n[i.pluginName][a] && n[i.pluginName][a](zt({ sortable: n }, o)), n.options[i.pluginName] && n[i.pluginName][t] && n[i.pluginName][t](zt({ sortable: n }, o))); }); }, initializePlugins: function(t, n, o, r) { Rn.forEach(function(s) { var u = s.pluginName; if (!(!t.options[u] && !s.initializeByDefault)) { var l = new s(t, n, t.options); l.sortable = t, l.options = t.options, t[u] = l, Yt(o, l.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 Rn.forEach(function(r) { typeof r.eventProperties == "function" && Yt(o, r.eventProperties.call(n[r.pluginName], t)); }), o; }, modifyOption: function(t, n, o) { var r; return Rn.forEach(function(a) { t[a.pluginName] && a.optionListeners && typeof a.optionListeners[n] == "function" && (r = a.optionListeners[n].call(t[a.pluginName], o)); }), r; } }; function kf(e) { var t = e.sortable, n = e.rootEl, o = e.name, r = e.targetEl, a = e.cloneEl, i = e.toEl, s = e.fromEl, u = e.oldIndex, l = e.newIndex, c = e.oldDraggableIndex, d = e.newDraggableIndex, f = e.originalEvent, h = e.putSortable, v = e.extraEventProperties; if (t = t || n && n[yt], !!t) { var p, y = t.options, b = "on" + o.charAt(0).toUpperCase() + o.substr(1); window.CustomEvent && !Gt && !go ? p = new CustomEvent(o, { bubbles: !0, cancelable: !0 }) : (p = document.createEvent("Event"), p.initEvent(o, !0, !0)), p.to = i || n, p.from = s || n, p.item = r || n, p.clone = a, p.oldIndex = u, p.newIndex = l, p.oldDraggableIndex = c, p.newDraggableIndex = d, p.originalEvent = f, p.pullMode = h ? h.lastPutMode : void 0; var R = zt(zt({}, v), vo.getEventProperties(o, t)); for (var D in R) p[D] = R[D]; n && n.dispatchEvent(p), y[b] && y[b].call(t, p); } } var $f = ["evt"], ct = function(t, n) { var o = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, r = o.evt, a = vf(o, $f); vo.pluginEvent.bind(me)(t, n, zt({ dragEl: U, parentEl: je, ghostEl: ve, rootEl: Ve, nextEl: hn, lastDownEl: Io, cloneEl: Ne, cloneHidden: nn, dragStarted: Un, putSortable: Qe, activeSortable: me.active, originalEvent: r, oldIndex: On, oldDraggableIndex: Jn, newIndex: ht, newDraggableIndex: tn, hideGhostForTarget: Oi, unhideGhostForTarget: Ei, cloneNowHidden: function() { nn = !0; }, cloneNowShown: function() { nn = !1; }, dispatchSortableEvent: function(s) { ot({ sortable: n, name: s, originalEvent: r }); } }, a)); }; function ot(e) { kf(zt({ putSortable: Qe, cloneEl: Ne, targetEl: U, rootEl: Ve, oldIndex: On, oldDraggableIndex: Jn, newIndex: ht, newDraggableIndex: tn }, e)); } var U, je, ve, Ve, hn, Io, Ne, nn, On, ht, Jn, tn, Co, Qe, kn = !1, Ho = !1, zo = [], dn, Ft, lr, ur, ka, $a, Un, Dn, Zn, eo = !1, So = !1, Ao, Je, cr = [], Pr = !1, Wo = [], er = typeof document < "u", Fo = wi, Oa = go || Gt ? "cssFloat" : "float", Of = er && !yf && !wi && "draggable" in document.createElement("div"), Di = function() { if (er) { if (Gt) return !1; var e = document.createElement("x"); return e.style.cssText = "pointer-events:auto", e.style.pointerEvents === "auto"; } }(), ki = function(t, n) { var o = he(t), r = parseInt(o.width) - parseInt(o.paddingLeft) - parseInt(o.paddingRight) - parseInt(o.borderLeftWidth) - parseInt(o.borderRightWidth), a = Bn(t, 0, n), i = Bn(t, 1, n), s = a && he(a), u = i && he(i), l = s && parseInt(s.marginLeft) + parseInt(s.marginRight) + Ke(a).width, c = u && parseInt(u.marginLeft) + parseInt(u.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 && s.float && s.float !== "none") { var d = s.float === "left" ? "left" : "right"; return i && (u.clear === "both" || u.clear === d) ? "vertical" : "horizontal"; } return a && (s.display === "block" || s.display === "flex" || s.display === "table" || s.display === "grid" || l >= r && o[Oa] === "none" || i && o[Oa] === "none" && l + c > r) ? "vertical" : "horizontal"; }, Ef = function(t, n, o) { var r = o ? t.left : t.top, a = o ? t.right : t.bottom, i = o ? t.width : t.height, s = o ? n.left : n.top, u = o ? n.right : n.bottom, l = o ? n.width : n.height; return r === s || a === u || r + i / 2 === s + l / 2; }, Tf = function(t, n) { var o; return zo.some(function(r) { var a = r[yt].options.emptyInsertThreshold; if (!(!a || ta(r))) { var i = Ke(r), s = t >= i.left - a && t <= i.right + a, u = n >= i.top - a && n <= i.bottom + a; if (s && u) return o = r; } }), o; }, $i = function(t) { function n(a, i) { return function(s, u, l, c) { var d = s.options.group.name && u.options.group.name && s.options.group.name === u.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(s, u, l, c), i)(s, u, l, c); var f = (i ? s : u).options.group.name; return a === !0 || typeof a == "string" && a === f || a.join && a.indexOf(f) > -1; }; } var o = {}, r = t.group; (!r || To(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; }, Oi = function() { !Di && ve && he(ve, "display", "none"); }, Ei = function() { !Di && ve && he(ve, "display", ""); }; er && document.addEventListener("click", function(e) { if (Ho) return e.preventDefault(), e.stopPropagation && e.stopPropagation(), e.stopImmediatePropagation && e.stopImmediatePropagation(), Ho = !1, !1; }, !0); var fn = function(t) { if (U) { t = t.touches ? t.touches[0] : t; var n = Tf(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[yt]._onDragOver(o); } } }, If = function(t) { U && U.parentNode[yt]._isOutsideThisEl(t.target); }; function me(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 = Yt({}, t), e[yt] = 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 ki(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, s) { i.setData("Text", s.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: me.supportPointer !== !1 && "PointerEvent" in window && !Xn, emptyInsertThreshold: 5 }; vo.initializePlugins(this, e, n); for (var o in n) !(o in t) && (t[o] = n[o]); $i(t); for (var r in this) r.charAt(0) === "_" && typeof this[r] == "function" && (this[r] = this[r].bind(this)); this.nativeDraggable = t.forceFallback ? !1 : Of, 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)), zo.push(this.el), t.store && t.store.get && this.sort(t.store.get(this) || []), Yt(this, Ff()); } me.prototype = /** @lends Sortable.prototype */ { constructor: me, _isOutsideThisEl: function(t) { !this.el.contains(t) && t !== this.el && (Dn = 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, s = t.touches && t.touches[0] || t.pointerType && t.pointerType === "touch" && t, u = (s || t).target, l = t.target.shadowRoot && (t.path && t.path[0] || t.composedPath && t.composedPath()[0]) || u, c = r.filter; if (xf(o), !U && !(/mousedown|pointerdown/.test(i) && t.button !== 0 || r.disabled) && !l.isContentEditable && !(!this.nativeDraggable && Xn && u && u.tagName.toUpperCase() === "SELECT") && (u = Bt(u, r.draggable, o, !1), !(u && u.animated) && Io !== u)) { if (On = Ct(u), Jn = Ct(u, r.draggable), typeof c == "function") { if (c.call(this, t, u, this)) { ot({ sortable: n, rootEl: l, name: "filter", targetEl: u, 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 = Bt(l, d.trim(), o, !1), d) return ot({ sortable: n, rootEl: d, name: "filter", targetEl: u, fromEl: o, toEl: o }), ct("filter", n, { evt: t }), !0; }), c)) { a && t.cancelable && t.preventDefault(); return; } r.handle && !Bt(l, r.handle, o, !1) || this._prepareDragStart(t, s, u); } } }, _prepareDragStart: function(t, n, o) { var r = this, a = r.el, i = r.options, s = a.ownerDocument, u; if (o && !U && o.parentNode === a) { var l = Ke(o); if (Ve = a, U = o, je = U.parentNode, hn = U.nextSibling, Io = o, Co = i.group, me.dragged = U, dn = { target: U, clientX: (n || t).clientX, clientY: (n || t).clientY }, ka = dn.clientX - l.left, $a = dn.clientY - l.top, this._lastX = (n || t).clientX, this._lastY = (n || t).clientY, U.style["will-change"] = "all", u = function() { if (ct("delayEnded", r, { evt: t }), me.eventCanceled) { r._onDrop(); return; } r._disableDelayedDragEvents(), !Sa && r.nativeDraggable && (U.draggable = !0), r._triggerDragStart(t, n), ot({ sortable: r, name: "choose", originalEvent: t }), ft(U, i.chosenClass, !0); }, i.ignore.split(",").forEach(function(c) { Ci(U, c.trim(), dr); }), De(s, "dragover", fn), De(s, "mousemove", fn), De(s, "touchmove", fn), De(s, "mouseup", r._onDrop), De(s, "touchend", r._onDrop), De(s, "touchcancel", r._onDrop), Sa && this.nativeDraggable && (this.options.touchStartThreshold = 4, U.draggable = !0), ct("delayStart", this, { evt: t }), i.delay && (!i.delayOnTouchOnly || n) && (!this.nativeDraggable || !(go || Gt))) { if (me.eventCanceled) { this._onDrop(); return; } De(s, "mouseup", r._disableDelayedDrag), De(s, "touchend", r._disableDelayedDrag), De(s, "touchcancel", r._disableDelayedDrag), De(s, "mousemove", r._delayedDragTouchMoveHandler), De(s, "touchmove", r._delayedDragTouchMoveHandler), i.supportPointer && De(s, "pointermove", r._delayedDragTouchMoveHandler), r._dragStartTimer = setTimeout(u, i.delay); } else u(); } }, _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 && dr(U), clearTimeout(this._dragStartTimer), this._disableDelayedDragEvents(); }, _disableDelayedDragEvents: function() { var t = this.el.ownerDocument; Fe(t, "mouseup", this._disableDelayedDrag), Fe(t, "touchend", this._disableDelayedDrag), Fe(t, "touchcancel", this._disableDelayedDrag), Fe(t, "mousemove", this._delayedDragTouchMoveHandler), Fe(t, "touchmove", this._delayedDragTouchMoveHandler), Fe(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(Ve, "dragstart", this._onDragStart)); try { document.selection ? Vo(function() { document.selection.empty(); }) : window.getSelection().removeAllRanges(); } catch { } }, _dragStarted: function(t, n) { if (kn = !1, Ve && U) { ct("dragStarted", this, { evt: n }), this.nativeDraggable && De(document, "dragover", If); var o = this.options; !t && ft(U, o.dragClass, !1), ft(U, o.ghostClass, !0), me.active = this, t && this._appendGhost(), ot({ sortable: this, name: "start", originalEvent: n }); } else this._nulling(); }, _emulateDragOver: function() { if (Ft) { this._lastX = Ft.clientX, this._lastY = Ft.clientY, Oi(); 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[yt]._isOutsideThisEl(t), n) do { if (n[yt]) { var o = void 0; if (o = n[yt]._onDragOver({ clientX: Ft.clientX, clientY: Ft.clientY, target: t, rootEl: n }), o && !this.options.dragoverBubble) break; } t = n; } while (n = n.parentNode); Ei(); } }, _onTouchMove: function(t) { if (dn) { var n = this.options, o = n.fallbackTolerance, r = n.fallbackOffset, a = t.touches ? t.touches[0] : t, i = ve && En(ve, !0), s = ve && i && i.a, u = ve && i && i.d, l = Fo && Je && Da(Je), c = (a.clientX - dn.clientX + r.x) / (s || 1) + (l ? l[0] - cr[0] : 0) / (s || 1), d = (a.clientY - dn.clientY + r.y) / (u || 1) + (l ? l[1] - cr[1] : 0) / (u || 1); if (!me.active && !kn) { if (o && Math.max(Math.abs(a.clientX - this._lastX), Math.abs(a.clientY - this._lastY)) < o) return; this._onDragStart(t, !0); } if (ve) { i ? (i.e += c - (lr || 0), i.f += d - (ur || 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, ")"); he(ve, "webkitTransform", f), he(ve, "mozTransform", f), he(ve, "msTransform", f), he(ve, "transform", f), lr = c, ur = d, Ft = a; } t.cancelable && t.preventDefault(); } }, _appendGhost: function() { if (!ve) { var t = this.options.fallbackOnBody ? document.body : Ve, n = Ke(U, !0, Fo, !0, t), o = this.options; if (Fo) { for (Je = t; he(Je, "position") === "static" && he(Je, "transform") === "none" && Je !== document; ) Je = Je.parentNode; Je !== document.body && Je !== document.documentElement ? (Je === document && (Je = Ht()), n.top += Je.scrollTop, n.left += Je.scrollLeft) : Je = Ht(), cr = Da(Je); } ve = U.cloneNode(!0), ft(ve, o.ghostClass, !1), ft(ve, o.fallbackClass, !0), ft(ve, o.dragClass, !0), he(ve, "transition", ""), he(ve, "transform", ""), he(ve, "box-sizing", "border-box"), he(ve, "margin", 0), he(ve, "top", n.top), he(ve, "left", n.left), he(ve, "width", n.width), he(ve, "height", n.height), he(ve, "opacity", "0.8"), he(ve, "position", Fo ? "absolute" : "fixed"), he(ve, "zIndex", "100000"), he(ve, "pointerEvents", "none"), me.ghost = ve, t.appendChild(ve), he(ve, "transform-origin", ka / parseInt(ve.style.width) * 100 + "% " + $a / parseInt(ve.style.height) * 100 + "%"); } }, _onDragStart: function(t, n) { var o = this, r = t.dataTransfer, a = o.options; if (ct("dragStart", this, { evt: t }), me.eventCanceled) { this._onDrop(); return; } ct("setupClone", this), me.eventCanceled || (Ne = Ri(U), Ne.draggable = !1, Ne.style["will-change"] = "", this._hideClone(), ft(Ne, this.options.chosenClass, !1), me.clone = Ne), o.cloneId = Vo(function() { ct("clone", o), !me.eventCanceled && (o.options.removeCloneOnHide || Ve.insertBefore(Ne, U), o._hideClone(), ot({ sortable: o, name: "clone" })); }), !n && ft(U, a.dragClass, !0), n ? (Ho = !0, o._loopId = setInterval(o._emulateDragOver, 50)) : (Fe(document, "mouseup", o._onDrop), Fe(document, "touchend", o._onDrop), Fe(document, "touchcancel", o._onDrop), r && (r.effectAllowed = "move", a.setData && a.setData.call(o, r, U)), De(document, "drop", o), he(U, "transform", "translateZ(0)")), kn = !0, o._dragStartId = Vo(o._dragStarted.bind(o, n, t)), De(document, "selectstart", o), Un = !0, Xn && he(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, s = this.options, u = s.group, l = me.active, c = Co === u, d = s.sort, f = Qe || l, h, v = this, p = !1; if (Pr) return; function y(Z, Se) { ct(Z, v, zt({ evt: t, isOwner: c, axis: h ? "vertical" : "horizontal", revert: i, dragRect: r, targetRect: a, canSort: d, fromSortable: f, target: o, completed: R, onMove: function(m, C) { return Ro(Ve, n, U, r, m, Ke(m), t, C); }, changed: D }, Se)); } function b() { y("dragOverAnimationCapture"), v.captureAnimationState(), v !== f && f.captureAnimationState(); } function R(Z) { return y("dragOverCompleted", { insertion: Z }), Z && (c ? l._hideClone() : l._showClone(v), v !== f && (ft(U, Qe ? Qe.options.ghostClass : l.options.ghostClass, !1), ft(U, s.ghostClass, !0)), Qe !== v && v !== me.active ? Qe = v : v === me.active && Qe && (Qe = null), f === v && (v._ignoreWhileAnimating = o), v.animateAll(function() { y("dragOverAnimationComplete"), v._ignoreWhileAnimating = null; }), v !== f && (f.animateAll(), f._ignoreWhileAnimating = null)), (o === U && !U.animated || o === n && !o.animated) && (Dn = null), !s.dragoverBubble && !t.rootEl && o !== document && (U.parentNode[yt]._isOutsideThisEl(t.target), !Z && fn(t)), !s.dragoverBubble && t.stopPropagation && t.stopPropagation(), p = !0; } function D() { ht = Ct(U), tn = Ct(U, s.draggable), ot({ sortable: v, name: "change", toEl: n, newIndex: ht, newDraggableIndex: tn, originalEvent: t }); } if (t.preventDefault !== void 0 && t.cancelable && t.preventDefault(), o = Bt(o, s.draggable, n, !0), y("dragOver"), me.eventCanceled) return p; if (U.contains(t.target) || o.animated && o.animatingX && o.animatingY || v._ignoreWhileAnimating === o) return R(!1); if (Ho = !1, l && !s.disabled && (c ? d || (i = je !== Ve) : Qe === this || (this.lastPutMode = Co.checkPull(this, l, U, t)) && u.checkPut(this, l, U, t))) { if (h = this._getDirection(t, o) === "vertical", r = Ke(U), y("dragOverValid"), me.eventCanceled) return p; if (i) return je = Ve, b(), this._hideClone(), y("revert"), me.eventCanceled || (hn ? Ve.insertBefore(U, hn) : Ve.appendChild(U)), R(!0); var $ = ta(n, s.draggable); if (!$ || Mf(t, h, this) && !$.animated) { if ($ === U) return R(!1); if ($ && n === t.target && (o = $), o && (a = Ke(o)), Ro(Ve, n, U, r, o, a, t, !!o) !== !1) return b(), n.appendChild(U), je = n, D(), R(!0); } else if ($ && Pf(t, h, this)) { var T = Bn(n, 0, s, !0); if (T === U) return R(!1); if (o = T, a = Ke(o), Ro(Ve, n, U, r, o, a, t, !1) !== !1) return b(), n.insertBefore(U, T), je = n, D(), R(!0); } else if (o.parentNode === n) { a = Ke(o); var E = 0, P, W = U.parentNode !== n, F = !Ef(U.animated && U.toRect || r, o.animated && o.toRect || a, h), V = h ? "top" : "left", ne = Ra(o, "top", "top") || Ra(U, "top", "top"), L = ne ? ne.scrollTop : void 0; Dn !== o && (P = a[V], eo = !1, So = !F && s.invertSwap || W), E = Bf(t, o, a, h, F ? 1 : s.swapThreshold, s.invertedSwapThreshold == null ? s.swapThreshold : s.invertedSwapThreshold, So, Dn === o); var A; if (E !== 0) { var k = Ct(U); do k -= E, A = je.children[k]; while (A && (he(A, "display") === "none" || A === ve)); } if (E === 0 || A === o) return R(!1); Dn = o, Zn = E; var N = o.nextElementSibling, J = !1; J = E === 1; var ue = Ro(Ve, n, U, r, o, a, t, J); if (ue !== !1) return (ue === 1 || ue === -1) && (J = ue === 1), Pr = !0, setTimeout(Vf, 30), b(), J && !N ? n.appendChild(U) : o.parentNode.insertBefore(U, J ? N : o), ne && Fi(ne, 0, L - ne.scrollTop), je = U.parentNode, P !== void 0 && !So && (Ao = Math.abs(P - Ke(o)[V])), D(), R(!0); } if (n.contains(U)) return R(!1); } return !1; }, _ignoreWhileAnimating: null, _offMoveEvents: function() { Fe(document, "mousemove", this._onTouchMove), Fe(document, "touchmove", this._onTouchMove), Fe(document, "pointermove", this._onTouchMove), Fe(document, "dragover", fn), Fe(document, "mousemove", fn), Fe(document, "touchmove", fn); }, _offUpEvents: function() { var t = this.el.ownerDocument; Fe(t, "mouseup", this._onDrop), Fe(t, "touchend", this._onDrop), Fe(t, "pointerup", this._onDrop), Fe(t, "touchcancel", this._onDrop), Fe(document, "selectstart", this); }, _onDrop: function(t) { var n = this.el, o = this.options; if (ht = Ct(U), tn = Ct(U, o.draggable), ct("drop", this, { evt: t }), je = U && U.parentNode, ht = Ct(U), tn = Ct(U, o.draggable), me.eventCanceled) { this._nulling(); return; } kn = !1, So = !1, eo = !1, clearInterval(this._loopId), clearTimeout(this._dragStartTimer), Mr(this.cloneId), Mr(this._dragStartId), this.nativeDraggable && (Fe(document, "drop", this), Fe(n, "dragstart", this._onDragStart)), this._offMoveEvents(), this._offUpEvents(), Xn && he(document.body, "user-select", ""), he(U, "transform", ""), t && (Un && (t.cancelable && t.preventDefault(), !o.dropBubble && t.stopPropagation()), ve && ve.parentNode && ve.parentNode.removeChild(ve), (Ve === je || Qe && Qe.lastPutMode !== "clone") && Ne && Ne.parentNode && Ne.parentNode.removeChild(Ne), U && (this.nativeDraggable && Fe(U, "dragend", this), dr(U), U.style["will-change"] = "", Un && !kn && ft(U, Qe ? Qe.options.ghostClass : this.options.ghostClass, !1), ft(U, this.options.chosenClass, !1), ot({ sortable: this, name: "unchoose", toEl: je, newIndex: null, newDraggableIndex: null, originalEvent: t }), Ve !== je ? (ht >= 0 && (ot({ rootEl: je, name: "add", toEl: je, fromEl: Ve, originalEvent: t }), ot({ sortable: this, name: "remove", toEl: je, originalEvent: t }), ot({ rootEl: je, name: "sort", toEl: je, fromEl: Ve, originalEvent: t }), ot({ sortable: this, name: "sort", toEl: je, originalEvent: t })), Qe && Qe.save()) : ht !== On && ht >= 0 && (ot({ sortable: this, name: "update", toEl: je, originalEvent: t }), ot({ sortable: this, name: "sort", toEl: je, originalEvent: t })), me.active && ((ht == null || ht === -1) && (ht = On, tn = Jn), ot({ sortable: this, name: "end", toEl: je, originalEvent: t }), this.save()))), this._nulling(); }, _nulling: function() { ct("nulling", this), Ve = U = je = ve = hn = Ne = Io = nn = dn = Ft = Un = ht = tn = On = Jn = Dn = Zn = Qe = Co = me.dragged = me.ghost = me.clone = me.active = null, Wo.forEach(function(t) { t.checked = !0; }), Wo.length = lr = ur = 0; }, handleEvent: function(t) { switch (t.type) { case "drop": case "dragend": this._onDrop(t); break; case "dragenter": case "dragover": U && (this._onDragOver(t), Af(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], Bt(n, i.draggable, this.el, !1) && t.push(n.getAttribute(i.dataIdAttr) || Nf(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 s = r.children[i]; Bt(s, this.options.draggable, r, !1) && (o[a] = s); }, 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 Bt(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 = vo.modifyOption(this, t, n); typeof r < "u" ? o[t] = r : o[t] = n, t === "group" && $i(o); }, /** * Destroy */ destroy: function() { ct("destroy", this); var t = this.el; t[yt] = null, Fe(t, "mousedown", this._onTapStart), Fe(t, "touchstart", this._onTapStart), Fe(t, "pointerdown", this._onTapStart), this.nativeDraggable && (Fe(t, "dragover", this), Fe(t, "dragenter", this)), Array.prototype.forEach.call(t.querySelectorAll("[draggable]"), function(n) { n.removeAttribute("draggable"); }), this._onDrop(), this._disableDelayedDragEvents(), zo.splice(zo.indexOf(this.el), 1), this.el = t = null; }, _hideClone: function() { if (!nn) { if (ct("hideClone", this), me.eventCanceled) return; he(Ne, "display", "none"), this.options.removeCloneOnHide && Ne.parentNode && Ne.parentNode.removeChild(Ne), nn = !0; } }, _showClone: function(t) { if (t.lastPutMode !== "clone") { this._hideClone(); return; } if (nn) { if (ct("showClone", this), me.eventCanceled) return; U.parentNode == Ve && !this.options.group.revertClone ? Ve.insertBefore(Ne, U) : hn ? Ve.insertBefore(Ne, hn) : Ve.appendChild(Ne), this.options.group.revertClone && this.animate(U, Ne), he(Ne, "display", ""), nn = !1; } } }; function Af(e) { e.dataTransfer && (e.dataTransfer.dropEffect = "move"), e.cancelable && e.preventDefault(); } function Ro(e, t, n, o, r, a, i, s) { var u, l = e[yt], c = l.options.onMove, d; return window.CustomEvent && !Gt && !go ? u = new CustomEvent("move", { bubbles: !0, cancelable: !0 }) : (u = document.createEvent("Event"), u.initEvent("move", !0, !0)), u.to = t, u.from = e, u.dragged = n, u.draggedRect = o, u.related = r || t, u.relatedRect = a || Ke(t), u.willInsertAfter = s, u.originalEvent = i, e.dispatchEvent(u), c && (d = c.call(l, u, i)), d; } function dr(e) { e.draggable = !1; } function Vf() { Pr = !1; } function Pf(e, t, n) { var o = Ke(Bn(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 Mf(e, t, n) { var o = Ke(ta(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 Bf(e, t, n, o, r, a, i, s) { var u = o ? e.clientY : e.clientX, l = o ? n.height : n.width, c = o ? n.top : n.left, d = o ? n.bottom : n.right, f = !1; if (!i) { if (s && Ao < l * r) { if (!eo && (Zn === 1 ? u > c + l * a / 2 : u < d - l * a / 2) && (eo = !0), eo) f = !0; else if (Zn === 1 ? u < c + Ao : u > d - Ao) return -Zn; } else if (u > c + l * (1 - r) / 2 && u < d - l * (1 - r) / 2) return jf(t); } return f = f || i, f && (u < c + l * a / 2 || u > d - l * a / 2) ? u > c + l / 2 ? 1 : -1 : 0; } function jf(e) { return Ct(U) < Ct(e) ? 1 : -1; } function Nf(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 xf(e) { Wo.length = 0; for (var t = e.getElementsByTagName("input"), n = t.length; n--; ) { var o = t[n]; o.checked && Wo.push(o); } } function Vo(e) { return setTimeout(e, 0); } function Mr(e) { return clearTimeout(e); } er && De(document, "touchmove", function(e) { (me.active || kn) && e.cancelable && e.preventDefault(); }); me.utils = { on: De, off: Fe, css: he, find: Ci, is: function(t, n) { return !!Bt(t, n, t, !1); }, extend: Cf, throttle: Si, closest: Bt, toggleClass: ft, clone: Ri, index: Ct, nextTick: Vo, cancelNextTick: Mr, detectDirection: ki, getChild: Bn }; me.get = function(e) { return e[yt]; }; me.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 && (me.utils = zt(zt({}, me.utils), o.utils)), vo.mount(o); }); }; me.create = function(e, t) { return new me(e, t); }; me.version = bf; var He = [], Kn, Br, jr = !1, fr, hr, Uo, Yn; function Lf() { 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 ? Fe(document, "dragover", this._handleAutoScroll) : (Fe(document, "pointermove", this._handleFallbackAutoScroll), Fe(document, "touchmove", this._handleFallbackAutoScroll), Fe(document, "mousemove", this._handleFallbackAutoScroll)), Ea(), Po(), Sf(); }, nulling: function() { Uo = Br = Kn = jr = Yn = fr = hr = null, He.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, s = document.elementFromPoint(a, i); if (Uo = n, o || this.options.forceAutoScrollFallback || go || Gt || Xn) { mr(n, this.options, s, o); var u = rn(s, !0); jr && (!Yn || a !== fr || i !== hr) && (Yn && Ea(), Yn = setInterval(function() { var l = rn(document.elementFromPoint(a, i), !0); l !== u && (u = l, Po()), mr(n, r.options, l, o); }, 10), fr = a, hr = i); } else { if (!this.options.bubbleScroll || rn(s, !0) === Ht()) { Po(); return; } mr(n, this.options, rn(s, !1), !1); } } }, Yt(e, { pluginName: "scroll", initializeByDefault: !0 }); } function Po() { He.forEach(function(e) { clearInterval(e.pid); }), He = []; } function Ea() { clearInterval(Yn); } var mr = Si(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, s = t.scrollSpeed, u = Ht(), l = !1, c; Br !== n && (Br = n, Po(), Kn = t.scroll, c = t.scrollFn, Kn === !0 && (Kn = rn(n, !0))); var d = 0, f = Kn; do { var h = f, v = Ke(h), p = v.top, y = v.bottom, b = v.left, R = v.right, D = v.width, $ = v.height, T = void 0, E = void 0, P = h.scrollWidth, W = h.scrollHeight, F = he(h), V = h.scrollLeft, ne = h.scrollTop; h === u ? (T = D < P && (F.overflowX === "auto" || F.overflowX === "scroll" || F.overflowX === "visible"), E = $ < W && (F.overflowY === "auto" || F.overflowY === "scroll" || F.overflowY === "visible")) : (T = D < P && (F.overflowX === "auto" || F.overflowX === "scroll"), E = $ < W && (F.overflowY === "auto" || F.overflowY === "scroll")); var L = T && (Math.abs(R - r) <= i && V + D < P) - (Math.abs(b - r) <= i && !!V), A = E && (Math.abs(y - a) <= i && ne + $ < W) - (Math.abs(p - a) <= i && !!ne); if (!He[d]) for (var k = 0; k <= d; k++) He[k] || (He[k] = {}); (He[d].vx != L || He[d].vy != A || He[d].el !== h) && (He[d].el = h, He[d].vx = L, He[d].vy = A, clearInterval(He[d].pid), (L != 0 || A != 0) && (l = !0, He[d].pid = setInterval((function() { o && this.layer === 0 && me.active._onTouchMove(Uo); var N = He[this.layer].vy ? He[this.layer].vy * s : 0, J = He[this.layer].vx ? He[this.layer].vx * s : 0; typeof c == "function" && c.call(me.dragged.parentNode[yt], J, N, e, Uo, He[this.layer].el) !== "continue" || Fi(He[this.layer].el, J, N); }).bind({ layer: d }), 24))), d++; } while (t.bubbleScroll && f !== u && (f = rn(f, !1))); jr = l; } }, 30), Ti = function(t) { var n = t.originalEvent, o = t.putSortable, r = t.dragEl, a = t.activeSortable, i = t.dispatchSortableEvent, s = t.hideGhostForTarget, u = t.unhideGhostForTarget; if (n) { var l = o || a; s(); var c = n.changedTouches && n.changedTouches.length ? n.changedTouches[0] : n, d = document.elementFromPoint(c.clientX, c.clientY); u(), l && !l.el.contains(d) && (i("spill"), this.onSpill({ dragEl: r, putSortable: o })); } }; function na() { } na.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 = Bn(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: Ti }; Yt(na, { pluginName: "revertOnSpill" }); function oa() { } oa.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: Ti }; Yt(oa, { pluginName: "removeOnSpill" }); me.mount(new Lf()); me.mount(oa, na); var qf = Object.defineProperty, Hf = Object.defineProperties, zf = Object.getOwnPropertyDescriptors, Ta = Object.getOwnPropertySymbols, Wf = Object.prototype.hasOwnProperty, Uf = Object.prototype.propertyIsEnumerable, Ia = (e, t, n) => t in e ? qf(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n, an = (e, t) => { for (var n in t || (t = {})) Wf.call(t, n) && Ia(e, n, t[n]); if (Ta) for (var n of Ta(t)) Uf.call(t, n) && Ia(e, n, t[n]); return e; }, Ko = (e, t) => Hf(e, zf(t)); function pr(e) { e.parentElement !== null && e.parentElement.removeChild(e); } function Aa(e, t, n) { const o = n === 0 ? e.children[0] : e.children[n - 1].nextSibling; e.insertBefore(t, o); } function Kf() { return typeof window < "u" ? window.console : global.console; } const Yf = Kf(); function Gf(e) { const t = /* @__PURE__ */ Object.create(null); return function(o) { return t[o] || (t[o] = e(o)); }; } const Xf = /-(\w)/g, Qf = Gf((e) => e.replace(Xf, (t, n) => n.toUpperCase())), Ii = ["Start", "Add", "Remove", "Update", "End"], Ai = ["Choose", "Unchoose", "Sort", "Filter", "Clone"], Vi = ["Move"], Jf = [Vi, Ii, Ai].flatMap((e) => e).map((e) => `on${e}`), Nr = { manage: Vi, manageAndEmit: Ii, emit: Ai }; function Zf(e) { return Jf.indexOf(e) !== -1; } const eh = [ "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 th(e) { return eh.includes(e); } function nh(e) { return ["transition-group", "TransitionGroup"].includes(e); } function Pi(e) { return ["id", "class", "role", "style"].includes(e) || e.startsWith("data-") || e.startsWith("aria-") || e.startsWith("on"); } function Mi(e) { return e.reduce((t, [n, o]) => (t[n] = o, t), {}); } function oh({ $attrs: e, componentData: t = {} }) { const n = Mi(Object.entries(e).filter(([o, r]) => Pi(o))); return an(an({}, n), t); } function rh({ $attrs: e, callBackBuilder: t }) { const n = Mi(Bi(e)); Object.entries(t).forEach(([r, a]) => { Nr[r].forEach((i) => { n[`on${i}`] = a(i); }); }); const o = `[data-draggable]${n.draggable || ""}`; return Ko(an({}, n), { draggable: o }); } function Bi(e) { return Object.entries(e).filter(([t, n]) => !Pi(t)).map(([t, n]) => [Qf(t), n]).filter(([t, n]) => !Zf(t)); } const Va = (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 || {}; }, ah = (e, t) => e.__draggable_context = t, Pa = (e) => e.__draggable_context; class ih { 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) => { ah(Va(o), { element: n[r], index: r }); }); } getUnderlyingVm(t) { return Pa(t); } getVmIndexFromDomIndex(t, n) { const { defaultNodes: o } = this, { length: r } = o, a = n.children, i = a.item(t); if (i === null) return r; const s = Pa(i); if (s) return s.index; if (r === 0) return 0; const u = Va(o[0]), l = [...a].findIndex((c) => c === u); return t < l ? 0 : r; } } function sh(e, t) { const n = e[t]; return n ? n() : []; } function lh({ $slots: e, realList: t, getKey: n }) { const o = t || [], [r, a] = ["header", "footer"].map((u) => sh(e, u)), { item: i } = e; if (!i) throw new Error("draggable element must have an item slot"); const s = o.flatMap((u, l) => i({ element: u, index: l }).map((c) => (c.key = n(u), c.props = Ko(an({}, c.props || {}), { "data-draggable": !0 }), c))); if (s.length !== o.length) throw new Error("Item slot must have only one child"); return { header: r, footer: a, default: s }; } function uh(e) { const t = nh(e), n = !th(e) && !t; return { transition: t, externalComponent: n, tag: n ? G(e) : t ? is : e }; } function ch({ $slots: e, tag: t, realList: n, getKey: o }) { const r = lh({ $slots: e, realList: n, getKey: o }), a = uh(t); return new ih({ nodes: r, root: a, realList: n }); } function ji(e, t) { Be(() => this.$emit(e.toLowerCase(), t)); } function Ni(e) { return (t, n) => { if (this.realList !== null) return this[`onDrag${e}`](t, n); }; } function dh(e) { const t = Ni.call(this, e); return (n, o) => { t.call(this, n, o), ji.call(this, e, n); }; } let gr = null; const fh = { 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 } }, hh = [ "update:modelValue", "change", ...[...Nr.manageAndEmit, ...Nr.emit].map((e) => e.toLowerCase()) ], mh = le({ name: "draggable", inheritAttrs: !1, props: fh, emits: hh, data() { return { error: !1 }; }, render() { try { this.error = !1; const { $slots: e, $attrs: t, tag: n, componentData: o, realList: r, getKey: a } = this, i = ch({ $slots: e, tag: n, realList: r, getKey: a }); this.componentStructure = i; const s = oh({ $attrs: t, componentData: o }); return i.render(vr, s); } catch (e) { return this.error = !0, vr("pre", { style: { color: "red" } }, e.stack); } }, created() { this.list !== null && this.modelValue !== null && Yf.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 = rh({ $attrs: e, callBackBuilder: { manageAndEmit: (a) => dh.call(this, a), emit: (a) => ji.bind(this, a), manage: (a) => Ni.call(this, a) } }), r = t.nodeType === 1 ? t : t.parentElement; this._sortable = new me(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 && Bi(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 an(an({}, 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), gr = e.item; }, onDragAdd(e) { const t = e.item._underlying_vm_; if (t === void 0) return; pr(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 (Aa(this.$el, e.item, e.oldIndex), e.pullMode === "clone") { pr(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) { pr(e.item), Aa(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(gr) !== -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 = Ko(an({}, this.context), { futureIndex: a }), s = Ko(an({}, e), { relatedContext: r, draggedContext: i }); return n(s, t); }, onDragEnd() { gr = null; } } }), ph = le({ name: "FsTableColumnsFixedController", props: { modelValue: { default: !1 } }, emits: ["update:modelValue", "change"], setup(e, t) { const { ui: n } = we(), o = M(() => [ { 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 gh(e, t, n, o, r, a) { const i = G("fs-button"); return w(), I(H(e.ui.buttonGroup.name), { class: "fs-table-columns-fixed-controller" }, { default: B(() => [ (w(!0), j(be, null, Te(e.options, (s) => (w(), I(i, { key: s.icon, type: e.modelValue === s.value ? "primary" : "default", icon: s.icon, size: "small", onClick: (u) => e.submit(s.value) }, null, 8, ["type", "icon", "onClick"]))), 128)) ]), _: 1 }); } const xi = /* @__PURE__ */ Oe(ph, [["render", gh]]), vh = ["title", "i"], bh = { class: "item-right" }, yh = { "flex-box": "0", class: "component--list-item-handle handle" }, wh = { style: { "margin-left": "20px", "padding-left": "10px", "border-left": "1px solid #eee" } }, Li = /* @__PURE__ */ le({ __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 } = we(), o = t, { originalColumns: r, currentColumns: a, originalColumnsMap: i, text: s, active: u } = jn(ea); function l(p) { return p.label || p.title || p.key || s.value.unnamed; } function c(p) { const y = p.draggedContext.element, b = p.relatedContext.element, R = []; for (const P of a.value) P.key === y.key ? R.push(b) : P.key === b.key ? R.push(y) : R.push(P); let D = 0, $ = R.length - 1, T = R.length - 1, E = 0; for (let P = 0; P < R.length; P++) { const W = R[P]; W.fixed === "left" ? D = P : W.fixed === "right" ? $ = $ > P ? P : $ : (T = T > P ? P : T, E = E < P ? P : E); } if (T < D || E > $) return !1; } function d(p) { return "update:" + p; } function f(p) { p.show = !p.show; function y(R) { R.children && R.children.forEach((D) => { !D.__show || D.__disabled || (D.show = R.show, y(D)); }); } y(p); function b(R) { if (R.__parent) { const D = R.__parent; D && (D.show = D.children.filter(($) => $.__show && $.show === !0).length > 0, b(D)); } } b(p); } function h() { o("check-changed"); } function v(p, y) { o("fixed-changed", p, y); } return (p, y) => { const b = G("fs-icon"), R = G("fs-columns-filter-nest-list", !0); return w(), I(q(mh), { list: p.columns, "item-key": "key", move: c }, { item: B(({ element: D, index: $ }) => { var T, E; return [ te("div", null, [ Hr(te("div", { title: l(D), class: "component--list-item", flex: "main:justify cross:center", i: $ }, [ (w(), I(H(q(n).checkbox.name), z({ [q(n).checkbox.modelValue || ""]: D.show, disabled: ((T = q(i)[D.__key]) == null ? void 0 : T.__disabled) === !0, class: "item-label", title: l(D) }, { [ss(d(q(n).checkbox.modelValue))]: (P) => f(D) }, { onChange: h }), { default: B(() => [ Vt(We(l(D)), 1) ]), _: 2 }, 1040, ["disabled", "title"])), te("div", bh, [ p.isRoot ? (w(), I(xi, { key: 0, modelValue: D.fixed, "onUpdate:modelValue": (P) => D.fixed = P, "flex-box": "0", class: "d2-mr-10", onChange: (P) => v($, P) }, null, 8, ["modelValue", "onUpdate:modelValue", "onChange"])) : oe("", !0), te("div", yh, [ x(b, { icon: q(n).icons.sort }, null, 8, ["icon"]) ]) ]) ], 8, vh), [ [ja, ((E = q(i)[D.__key]) == null ? void 0 : E.__show) !== !1] ]), te("div", wh, [ D.children ? (w(), I(R, { key: 0, columns: D.children, onCheckChanged: h }, null, 8, ["columns"])) : oe("", !0) ]) ]) ]; }), _: 1 }, 8, ["list"]); }; } }), _h = { class: "component--list" }, Ch = { key: "__first__", class: "component--list-item", flex: "main:justify cross:center" }, Sh = { span: 12 }, Fh = { class: "title" }, Rh = /* @__PURE__ */ le({ __name: "fs-columns-filter-layout-default", props: { width: {}, drawer: {} }, setup(e) { const { ui: t } = we(), { originalColumns: n, currentColumns: o, text: r, active: a } = jn(ea), i = e, s = M(() => ho( { [t.drawer.visible]: a.value, ["onUpdate:" + t.drawer.visible]: (y) => { a.value = y; }, [t.drawer.width]: i.width || "400px" }, i.drawer )), u = K(!1); function l(y) { u.value = y, o.value = o.value.map((b) => (!b.__show || b.__disabled || (b.show = y), b)); } const c = M(() => ({ [t.checkbox.modelValue]: u.value, ["onUpdate:" + t.checkbox.modelValue]: (y) => { l(y); } })), d = M(() => o.value.filter((y) => y.__show && y.show === !0).length), f = M(() => o.value.filter((y) => y.__show).length), h = M(() => d.value > 0 && d.value < f.value); it( () => { o.value; }, () => { p(); }, { immediate: !0 } ); function v(y, b) { b && (o.value[y].show = !0), b === "left" && o.value.unshift(o.value.splice(y, 1)[0]), b === "right" && o.value.push(o.value.splice(y, 1)[0]), p(); } function p() { u.value = d.value === f.value; } return (y, b) => (w(), I(H(q(t).drawer.name), z({ class: "fs-columns-filter-layout-default", title: q(r).title }, s.value, { "append-to-body": "" }), { default: B(() => [ (w(), I(H(q(t).drawer.hasContentWrap || "div"), { class: "fs-drawer-wrapper fs-table-columns-filter", title: q(r).title }, { default: B(() => [ (w(), I(H(q(t).card.name), { shadow: "never" }, { default: B(() => [ te("div", _h, [ te("div", Ch, [ te("span", Sh, [ (w(), I(H(q(t).checkbox.name), z({ indeterminate: h.value }, c.value), { default: B(() => [ Vt(We(d.value) + " / " + We(f.value), 1) ]), _: 1 }, 16, ["indeterminate"])) ]), te("span", Fh, We(q(r).fixed) + " / " + We(q(r).order), 1) ]), x(Li, { columns: q(o), "is-root": !0, onCheckChanged: p, onFixedChanged: v }, null, 8, ["columns"]) ]) ]), _: 1 })), re(y.$slots, "buttons") ]), _: 3 }, 8, ["title"])) ]), _: 3 }, 16, ["title"])); } }), Dh = le({ name: "FsSearchButtons", inheritAttrs: !1, props: { buttons: { type: Object } }, setup() { const { ui: e } = we(); return { ui: e }; } }), kh = { class: "fs-search-col fs-search-btns" }; function $h(e, t, n, o, r, a) { const i = G("fs-button"); return w(), j("div", kh, [ (w(), I(H(e.ui.formItem.name), null, { default: B(() => [ (w(!0), j(be, null, Te(e.buttons, (s, u) => (w(), j(be, { key: u }, [ s.show ? (w(), I(i, z({ key: 0, ref_for: !0 }, s, { onClick: (l) => s._click() }), null, 16, ["onClick"])) : oe("", !0) ], 64))), 128)) ]), _: 1 })) ]); } const qi = /* @__PURE__ */ Oe(Dh, [["render", $h]]), Oh = /* @__PURE__ */ le({ name: "FsSearch", components: { FsSearchButtons: qi }, 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 } = we(), { merge: o } = $e(), r = o, { doComputed: a, AsyncComputeValue: i, ComputeValue: s } = Pt(); bt(e.columns, (m) => { m.value != null && (m.value instanceof i || m.value instanceof s) && ce.warn("search.value配置不支持ComputeValue/AsyncCompute类型的动态计算"); }); function u() { const m = {}; return Y(e.columns, (C, _) => { var O; if (C.value === void 0) return; const S = q(C.value); S !== void 0 && C.show !== !1 && ((O = C.component) == null ? void 0 : O.show) !== !1 && (m[_] = S); }), dt(o({}, e.initialForm, m)); } const l = yn(u()); let c = null; const d = a(() => e.columns, T, null, (m) => { const C = dt(e.formItem || {}); Y(m, (O) => { o(O, C, O); }), e.validate || Y(m, (O) => { delete O.rules, delete O.rule; }), e.col && Y(m, (O) => { O.col = o({}, e.col, O.col); }), Y(m, (O) => { O._cellRender = () => p(O); }); let _ = []; Y(m, (O, Q) => { O._key = Q, _.push(O); }), _ = Cn(_, (O) => O.order ?? ln.orderDefault); const S = {}; return _.forEach((O) => { let Q = O._key; delete O._key, S[Q] = O; }), S; }); function f() { const m = dt(l); t.emit("update:validatedForm", m); } it(() => e.validatedForm, (m) => { for (const C in l) delete l[C]; o(l, m || {}); }, { deep: !0 }); const h = (m, C) => st(m, C); function v(m) { if (m != null) return m.indexOf(".") >= 0 ? m.split(".") : m; } function p(m) { const C = m.key; async function _(ie) { Se(ie, m); } function S() { ue(m); } function O(ie, de) { de.code === "Enter" && ie.autoSearchTrigger === "enter" && W(); } let Q = null; e.slots["search_" + C] ? Q = x(G("fs-slot-render"), { slots: e.slots["search_" + C], scope: E(C) }, null) : m.render ? Q = x(G("fs-render"), { "render-func": m.render, scope: E(C) }, null) : m.component && m.component.show !== !1 && (Q = x(G("fs-component-render"), z({ ref: (ie) => { R.value[C] = ie; }, "model-value": h(l, C), onKeyup: (ie) => { O(m, ie); } }, m.component, { scope: E(C), "onUpdate:modelValue": _, onInput: S }), null)); const se = v(C); return n.formItem.render({ props: { ...m, label: m.title, [n.formItem.prop]: se, path: C, rulePath: C }, slots: { default() { return Q; } } }); } const y = K(), { t: b } = lt(), R = K({}); function D(m) { return R.value[m]; } function $(m) { var C; return (C = D(m)) == null ? void 0 : C.getTargetRef(); } function T() { return { form: l, validatedForm: e.validatedForm, getComponentRef: $, doSearch: W, doReset: F, doValidate: P }; } function E(m) { return { ...T(), key: m, value: h(l, m) }; } async function P(m = !1, C = "search") { try { return e.validate && await n.form.validateWrap(y.value), !0; } catch (_) { return m || t.emit("validate-error", { ...T(), error: _, trigger: C }), !1; } } async function W() { c && c.cancel(), await P() && (f(), await Be(), t.emit("_search", T()), t.emit("search", T())); } async function F() { const m = u(), C = zr(l); for (const _ of C) { const S = h(m, _[0]); S == null ? No(l, _[0]) : tt(l, _[0], S); } await P() && (f(), await Be(), e.reset && e.reset(T()), t.emit("_reset", T()), t.emit("reset", T()), e.searchAfterReset && W()); } const V = M(() => { const m = [], C = { search: { show: !0, type: "primary", disabled: !1, // eslint-disable-next-line @typescript-eslint/no-unused-vars click: (_) => { W(); }, order: 1, text: b("fs.search.search.text") // '查询', }, reset: { show: !0, disabled: !1, // eslint-disable-next-line @typescript-eslint/no-unused-vars click: (_) => { F(); }, text: b("fs.search.reset.text"), // '重置', order: 2 } }; o(C, e.buttons); for (let _ in C) { const S = C[_]; S._click = () => { S.click(T()); }, m.push(S); } return m.sort((_, S) => _.order - S.order), m; }); function ne() { var m; if (e.autoSearch !== !1 && e.debounce !== !1) { let C = ((m = e.debounce) == null ? void 0 : m.wait) || 500; c = ys(W, C, e.debounce); } } ne(); function L() { return l; } function A() { return e.validatedForm; } function k(m, C = !0) { C || bt(qa(l), (_) => { delete l[_]; }), r(l, m), f(); } const N = K(!1), J = () => { ce.debug("do auto search,inputEventDisabled:", N.value), N.value !== !0 && c && c(); }, ue = (m) => { m.autoSearchTrigger === "input" && J(); }, Z = (m) => { N.value = m, J(); }; async function Se(m, C) { const _ = C.key; tt(l, _, m); const S = e.validateOnChangeSilent; if (C.valueChange) { const O = C.key, Q = l[O], se = $(O), ie = C.valueChange instanceof Function ? C.valueChange : C.valueChange.handle, de = T(), _e = { index: 0, row: de.form, form: de.form, ...de, key: O, value: Q, componentRef: se, immediate: !1, getComponentRef: $, mode: "search" }; ie(_e); } e.validateOnChange && await P(S, "change") && f(), (C.autoSearchTrigger == null || C.autoSearchTrigger === !0 || C.autoSearchTrigger === "change") && J(); } const ke = M(() => e.validate ? e.options.rules : []); return f(), { get: h, ui: n, onValueChanged: Se, doValidate: P, doSearch: W, doReset: F, formData: l, componentRenderRefs: R, getComponentRenderRef: D, getComponentRef: $, getForm: L, getValidatedForm: A, setForm: k, searchFormRef: y, onInput: ue, inputEventDisabled: N, changeInputEventDisabled: Z, computedColumns: d, computedButtons: V, computedRules: ke, buildFieldContext: E, getContextFn: T }; } }); const Eh = { class: "fs-search fs-search-v2" }, Th = { class: "fs-search-buttons" }; function Ih(e, t, n, o, r, a) { const i = G("fs-button"), s = G("fs-slot-render"); return w(), j("div", Eh, [ (w(), I(H(e.ui.collapseTransition.name), null, { default: B(() => [ (w(), I(H(e.ui.form.name), z({ ref: "searchFormRef", model: e.formData, onsubmit: "event.preventDefault();" }, e.options, { rules: e.computedRules, class: "fs-search-form", onCompositionstart: t[0] || (t[0] = (u) => e.changeInputEventDisabled(!0)), onCompositionend: t[1] || (t[1] = (u) => e.changeInputEventDisabled(!1)) }), { default: B(() => { var u; return [ e.show !== !1 ? (w(), I(H(((u = e.container) == null ? void 0 : u.is) || "fs-search-layout-default"), z({ key: 0 }, e.container, { columns: e.computedColumns, "get-context-fn": e.getContextFn }), Lr({ "search-buttons": B(() => [ te("div", Th, [ (w(!0), j(be, null, Te(e.computedButtons, (l, c) => (w(), j(be, { key: c }, [ l.show !== !1 ? (w(), I(i, z({ key: 0, ref_for: !0 }, l, { onClick: (d) => l._click() }), null, 16, ["onClick"])) : oe("", !0) ], 64))), 128)) ]) ]), _: 2 }, [ e.slots["search-left"] ? { name: "search-left", fn: B(() => [ x(s, { 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(() => [ x(s, { 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(() => [ x(s, { slots: e.slots["search-right"], scope: e.getContextFn() }, null, 8, ["slots", "scope"]) ]), key: "2" } : void 0 ]), 1040, ["columns", "get-context-fn"])) : oe("", !0) ]; }), _: 1 }, 16, ["model", "rules"])) ]), _: 1 })) ]); } const Ah = /* @__PURE__ */ Oe(Oh, [["render", Ih]]), Vh = le({ name: "FsSearchV1", components: { FsSearchButtons: qi }, 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 } = we(); _n(() => { if (Se.value && k.value) { N.value = k.value.$el.offsetHeight; const m = k.value.$el.children; m && m.length > 1 && (J.value = m[1].offsetHeight + 2); } }); let o = null; function r() { return cloneDeep(e.initialForm || {}); } const a = yn(r()), { doComputed: i, AsyncComputeValue: s } = Pt(); bt(e.columns, (m) => { m.value != null && m.value instanceof s && ce.warn("search.value配置不支持AsyncCompute类型的动态计算"); }); const { merge: u } = $e(), l = u, c = i( () => e.columns, y, null, (m) => { e.validate || Y(m, (S) => { delete S.rules; }), e.col && Y(m, (S) => { S.col = u({}, e.col, S.col); }); let C = []; Y(m, (S, O) => { S._key = O, C.push(S); }), C = Cn(C, (S) => S.order ?? ln.orderDefault); const _ = {}; return C.forEach((S) => { let O = S._key; delete S._key, _[O] = S; }), _; } ); Y(c.value, (m, C) => { var S; if (m.value === void 0) return; const _ = q(m.value); _ !== void 0 && m.show !== !1 && ((S = m.component) == null ? void 0 : S.show) !== !1 && (a[C] = _); }); const d = K(), { t: f } = lt(), h = K({}); function v(m) { return h.value[m]; } function p(m) { var C, _; return (_ = (C = v(m)) == null ? void 0 : C.$refs) == null ? void 0 : _.targetRef; } function y() { return { form: a, validatedForm: a, getComponentRef: p, doValidate: null }; } const b = K(y()); async function R() { if (o && o.cancel(), await n.form.validateWrap(d.value)) t.emit("search", b.value); else return n.message.error({ message: f("fs.search.error.message") }), !1; } function D() { const m = r(), C = zr(a); for (const _ of C) { const S = st(m, _[0]); S == null ? No(a, _[0]) : tt(a, _[0], S); } e.reset && e.reset(b.value), t.emit("reset", y()), e.searchAfterReset && Be(() => { R(); }); } const $ = M(() => { const m = [], C = { search: { show: !0, type: "primary", disabled: !1, click: (_) => { R(); }, order: 1, text: f("fs.search.search.text") // '查询', }, reset: { show: !0, disabled: !1, click: (_) => { D(); }, text: f("fs.search.reset.text"), // '重置', order: 2 } }; u(C, e.buttons); for (let _ in C) { const S = C[_]; S._click = () => { S.click(y()); }, m.push(S); } return m.sort((_, S) => _.order - S.order), m; }); function T() { var m; if (e.autoSearch !== !1 && e.debounce !== !1) { let C = ((m = e.debounce) == null ? void 0 : m.wait) || 500; o = debounce(R, C, e.debounce); } } T(); function E() { return a; } function P(m, C = !0) { C || bt(qa(a), (_) => { delete a[_]; }), l(a, m); } const W = K(!1), F = () => { ce.debug("do auto search,inputEventDisabled:", W.value), W.value !== !0 && o && o(); }, V = (m) => { m.autoSearchTrigger === "input" && F(); }, ne = (m) => { W.value = m, F(); }; function L(m, C) { const _ = C.key; if (tt(a, _, m), C.valueChange) { const S = C.key, O = a[S], Q = p(S); (C.valueChange instanceof Function ? C.valueChange : C.valueChange.handle)({ key: S, value: O, componentRef: Q, ...y(), immidiate: !1 }); } (C.autoSearchTrigger == null || C.autoSearchTrigger === !0 || C.autoSearchTrigger === "change") && F(); } const A = M(() => e.validate ? e.options.rules : []), k = K(), N = K(0), J = K(0), ue = () => { t.emit("update:collapse", !e.collapse), t.emit("collapse", !e.collapse); }, Z = M(() => e.layout === "multi-line" ? n.col.name : "div"), Se = M(() => e.layout === "multi-line"), ke = M(() => Se.value ? e.collapse ? J.value ? J.value + "px" : "" : N.value ? N.value + "px" : "" : "auto"); return { get: (m, C) => st(m, C), ui: n, onValueChanged: L, doSearch: R, doReset: D, form: a, componentRenderRefs: h, getComponentRenderRef: v, getComponentRef: p, getForm: E, setForm: P, searchFormRef: d, onInput: V, inputEventDisabled: W, changeInputEventDisabled: ne, computedColumns: c, computedButtons: $, computedRules: A, columnsRowRef: k, computedColumnBoxHeight: ke, computedColName: Z, computedIsMultiLine: Se, toggleCollapse: ue, searchEventContextRef: b }; } }); const Ph = { class: "fs-search-box" }, Mh = { class: "fs-search-main" }, Bh = { key: 0, class: "fs-search-col" }, jh = { key: 1, class: "fs-search-col fs-search-middle" }, Nh = { key: 3, class: "fs-search-col fs-search-right" }, xh = { key: 0, class: "fs-search-action" }; function Lh(e, t, n, o, r, a) { const i = G("fs-slot-render"), s = G("fs-component-render"), u = G("fs-search-buttons"), l = G("fs-button"); return w(), I(H(e.ui.collapseTransition.name), null, { default: B(() => [ e.show !== !1 ? (w(), j("div", { key: 0, class: St(["fs-search", { "fs-search-multi-line": e.computedIsMultiLine }]) }, [ (w(), I(H(e.ui.form.name), z({ 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(() => [ te("div", Ph, [ te("div", Mh, [ te("div", { class: St(["fs-search-columns", { "fs-search-collapse": e.collapse }]), style: to({ height: e.computedColumnBoxHeight }) }, [ (w(), I(H(e.ui.row.name), { ref: "columnsRowRef" }, { default: B(() => [ e.slots["search-left"] ? (w(), j("div", Bh, [ (w(), I(H(e.ui.formItem.name), null, { default: B(() => [ x(i, { slots: e.slots["search-left"], scope: e.searchEventContextRef }, null, 8, ["slots", "scope"]) ]), _: 1 })) ])) : oe("", !0), (w(!0), j(be, null, Te(e.computedColumns, (c, d) => (w(), j(be, { key: d }, [ c.show === !0 ? (w(), I(H(e.computedColName), z({ key: 0, class: "fs-search-col" }, { ref_for: !0 }, c.col), { default: B(() => [ (w(), I(H(e.ui.formItem.name), z({ ref_for: !0 }, c, { [e.ui.formItem.prop || ""]: d, label: c.title }), { default: B(() => [ e.slots["search_" + d] ? (w(), I(i, { key: 0, slots: e.slots["search_" + d], scope: { ...e.searchEventContextRef, key: d } }, null, 8, ["slots", "scope"])) : (w(), j(be, { key: 1 }, [ c.component && c.component.show !== !1 ? (w(), I(s, z({ 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"])) : oe("", !0) ], 64)) ]), _: 2 }, 1040, ["label"])) ]), _: 2 }, 1040)) : oe("", !0) ], 64))), 128)), e.slots["search-middle"] ? (w(), j("div", jh, [ (w(), I(H(e.ui.formItem.name), null, { default: B(() => [ x(i, { slots: e.slots["search-middle"], scope: e.searchEventContextRef }, null, 8, ["slots", "scope"]) ]), _: 1 })) ])) : oe("", !0), e.computedIsMultiLine ? oe("", !0) : (w(), I(u, { key: 2, buttons: e.computedButtons }, null, 8, ["buttons"])), e.slots["search-right"] ? (w(), j("div", Nh, [ (w(), I(H(e.ui.formItem.name), null, { default: B(() => [ x(i, { slots: e.slots["search-right"], scope: e.searchEventContextRef }, null, 8, ["slots", "scope"]) ]), _: 1 })) ])) : oe("", !0) ]), _: 1 }, 512)) ], 6), e.computedIsMultiLine ? (w(), I(u, { key: 0, buttons: e.computedButtons }, null, 8, ["buttons"])) : oe("", !0) ]), e.computedIsMultiLine ? (w(), j("div", xh, [ (w(), I(H(e.ui.formItem.name), null, { default: B(() => [ x(l, { icon: e.collapse ? e.ui.icons.caretUp : e.ui.icons.caretDown, onClick: e.toggleCollapse }, null, 8, ["icon", "onClick"]) ]), _: 1 })) ])) : oe("", !0) ]) ]), _: 1 }, 16, ["model", "rules"])) ], 2)) : oe("", !0) ]), _: 1 }); } const qh = /* @__PURE__ */ Oe(Vh, [["render", Lh]]), Hh = le({ 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 } = we(), { t: o } = lt(), r = K(), a = M(() => e.layout === "multi-line"); _n(() => { a.value && r.value && (s.value = r.value.$el.offsetHeight); }); const i = M(() => !a.value || !e.collapse ? "auto" : s.value ? s.value + "px" : ""), s = K(0), u = () => { t.emit("update:collapse", !e.collapse), t.emit("collapse", !e.collapse); }; function l(c) { return ho({}, e.col, c); } return { ui: n, columnsRowRef: r, computedColumnBoxHeight: i, computedIsMultiLine: a, toggleCollapse: u, mergeCol: l, t: o }; } }); const zh = { class: "fs-search-box" }, Wh = { class: "fs-search-col fs-search-slot" }, Uh = { class: "fs-search-col fs-search-slot" }, Kh = { class: "fs-search-col fs-search-slot" }, Yh = { key: 0, class: "fs-search-buttons-group fs-search-multi-line-buttons" }; function Gh(e, t, n, o, r, a) { var u; const i = G("fs-render"), s = G("fs-button"); return w(), j("div", { class: St(["fs-search-layout-default", { "fs-search-multi-line": e.computedIsMultiLine }]) }, [ te("div", zh, [ te("div", { class: St(["fs-search-main", { "fs-search-collapse": e.collapse }]), style: to({ maxHeight: e.computedColumnBoxHeight }) }, [ (w(), I(H(e.ui.row.name), { ref: "columnsRowRef", class: "fs-search-columns" }, { default: B(() => { var l; return [ te("span", Wh, [ re(e.$slots, "search-left") ]), (w(!0), j(be, null, Te(e.columns, (c, d) => (w(), j(be, { key: d }, [ c.show ? (w(), I(H(e.ui.col.name), z({ key: 0, class: "fs-search-col" }, { ref_for: !0 }, e.mergeCol(c.col)), { default: B(() => [ x(i, { "render-func": c._cellRender, scope: e.getContextFn() }, null, 8, ["render-func", "scope"]) ]), _: 2 }, 1040)) : oe("", !0) ], 64))), 128)), te("span", Uh, [ re(e.$slots, "search-middle") ]), e.computedIsMultiLine ? oe("", !0) : (w(), I(H(e.ui.col.name), z({ key: 0, class: "fs-search-col fs-search-buttons-group" }, e.mergeCol((l = e.action) == null ? void 0 : l.col)), { default: B(() => { var c; return [ (w(), I(H(e.ui.formItem.name), xe({ [e.ui.formItem.label || ""]: (c = e.action) == null ? void 0 : c.label }), { default: B(() => [ re(e.$slots, "search-buttons", xe(Lt(e.getContextFn()))) ]), _: 3 }, 16)) ]; }), _: 3 }, 16)), te("span", Kh, [ re(e.$slots, "search-right", xe(Lt(e.getContextFn()))) ]) ]; }), _: 3 }, 512)) ], 6), e.computedIsMultiLine ? (w(), j("div", Yh, [ re(e.$slots, "search-buttons"), ((u = e.collapseButton) == null ? void 0 : u.show) !== !1 ? (w(), I(s, z({ 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"])) : oe("", !0) ])) : oe("", !0) ]) ], 2); } const Xh = /* @__PURE__ */ Oe(Hh, [["render", Gh]]), Qh = { class: "fs-tabs-filter" }, Jh = le({ name: "FsTabsFilter", inheritAttrs: !1 }), Zh = /* @__PURE__ */ le({ ...Jh, 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 = Xo(), { merge: o } = $e(), r = e, a = M(() => o({ show: !0, value: null, label: "全部" }, r.defaultOption || {})), i = "_default_key_", s = M(() => { const h = r.modelValue == null || r.modelValue === a.value.value ? i : r.modelValue; return { type: "card", ...n, [f.tabs.modelValue]: h, ["onUpdate:" + f.tabs.modelValue]: l }; }), u = t; function l(h) { i === h && (h = a.value.value); const v = r.modelValue; u("update:modelValue", h), v !== h && u("change", h); } function c(h) { return h[r.value]; } function d(h) { return h[r.label]; } const { ui: f } = we(); return (h, v) => (w(), j("div", Qh, [ (w(), I(H(q(f).tabs.name), xe(Lt(s.value)), { default: B(() => [ a.value.show ? (w(), I(H(q(f).tabPane.name), xe({ key: 0, [q(f).tabPane.key || ""]: i, [q(f).tabPane.tab || ""]: a.value.label }), null, 16)) : oe("", !0), (w(!0), j(be, null, Te(h.options, (p, y) => (w(), I(H(q(f).tabPane.name), xe({ key: y, [q(f).tabPane.key || ""]: c(p), [q(f).tabPane.tab || ""]: d(p) }), null, 16))), 128)) ]), _: 1 }, 16)) ])); } }); const em = { class: "fs-icon-selector" }, tm = { key: 0, class: "fs-icon-selector-dialog" }, nm = { class: "fs-icon-selector-dialog-content mb-4" }, om = { class: "icon-tabs-box mt-10 mb-10" }, rm = { class: "icon-container" }, am = { class: "icon-list" }, im = ["title", "onClick", "onDblclick"], sm = { class: "load-more" }, lm = { key: 1 }, um = { class: "footer" }, cm = le({ name: "FsIconSelector" }), dm = /* @__PURE__ */ le({ ...cm, props: { modelValue: { type: String, default: "" }, dialog: { type: Object, default: () => ({}) }, tabs: { type: Object, default: () => ({}) }, // 限制每页显示数量 limit: { type: Number, default: 136 }, iconSets: { type: Array, default: () => ["carbon", "ion", "ant-design", "fa-solid", "fa-brands", "fa-regular", "mdi"] }, apiProvider: { type: String, default: "https://api.iconify.design" } }, emits: ["update:modelValue"], setup(e, { emit: t }) { const n = t, o = 136, r = e, { ui: a } = we(), i = K(!1), s = M(() => ({ width: 1024, style: { width: "1024px" }, ...r.dialog, [a.dialog.visible]: i.value, [`onUpdate:${a.dialog.visible}`]: (A) => { i.value = A; } })), u = a.formItem.injectFormItemContext(), l = M(() => ({ ...f, [a.input.modelValue]: r.modelValue, [`onUpdate:${a.input.modelValue}`]: (A) => { c(A); } })), c = (A) => { n("update:modelValue", A), u == null || u.onChange(); }, d = () => { i.value = !0, r.iconSets.length > 0 && $.value.records.length === 0 && R(r.iconSets[0]); }, f = Xo(), h = { async getCollections() { return await (await fetch(`${r.apiProvider}/collections`)).json(); }, async getIcons(A) { return await (await fetch(`${r.apiProvider}/collection?prefix=${A}`)).json(); }, async search(A, k) { const N = k.start ?? 0, J = k.limit ?? 50; return await (await fetch(`${r.apiProvider}/search?query=${A}&start=${N}&limit=${J}`)).json(); } }, v = K({}), p = async (A) => { let k = v.value[A]; if (!k) { const N = await h.getIcons(A), J = N.uncategorized ?? [], ue = N.categories ?? []; k = J; for (const Z in ue) k = k.concat(ue[Z]); k = k.map((Z) => `${A}:${Z}`), v.value[A] = k; } return k; }, y = K(""), b = K("all"), R = (A) => { b.value = A, y.value = "", D(), T(); }, D = () => { $.value.start = 0, $.value.records = [], $.value.total = 0, $.value.limit = r.limit ?? o; }, $ = K({ loading: !1, start: 0, limit: r.limit ?? o, total: null, query: "", records: [] }), T = async () => { if (!$.value.loading) { $.value.query !== y.value && D(), $.value.loading = !0; try { const A = await E(); $.value.records = $.value.records.concat(A.icons), $.value.total = A.total, $.value.limit = A.limit, $.value.query = y.value; } finally { $.value.loading = !1; } } }; async function E() { if (b.value === "all") { if (!y.value) { a.notification.warn("请输入搜索关键字"); return; } return await h.search(y.value, $.value); } else return await P(b.value); } async function P(A) { const k = await p(A); let N = k; y.value && (N = k.filter((Z) => Z.includes(y.value))); let J = $.value.start + $.value.limit; return J > N.length && (J = N.length), { icons: N.slice($.value.start, J), total: N.length, limit: $.value.limit, start: $.value.start }; } const W = K(r.modelValue), F = (A, k = !1) => { W.value = A, k && V(); }, V = () => { i.value = !1, c(W.value); }, ne = async () => { $.value.start += $.value.limit, await T(); }, L = M(() => ({ ...r.tabs, [a.tabs.modelValue]: b.value, [`onUpdate:${a.tabs.modelValue}`]: R })); return (A, k) => { const N = G("fs-icon"), J = G("fs-button"), ue = G("fs-loading"); return w(), j("div", em, [ (w(), I(H(q(a).input.name), z(l.value, { onClick: d }), { prefix: B(() => [ e.modelValue ? (w(), I(N, { key: 0, class: "fs-icon-selector-input-prefix", icon: e.modelValue }, null, 8, ["icon"])) : oe("", !0) ]), _: 1 }, 16)), i.value ? (w(), j("div", tm, [ (w(), I(H(q(a).dialog.name), z({ preset: "dialog" }, s.value, { footer: null }), { [q(a).dialog.titleSlotName]: B(() => [ x(N, { icon: "icon-select", class: "mr-2" }), k[1] || (k[1] = Vt(" 选择图标 ", -1)) ]), default: B(() => [ te("div", nm, [ te("div", om, [ (w(), I(H(q(a).tabs.name), z(L.value, { type: "card" }), { default: B(() => [ (w(), I(H(q(a).tabPane.name), xe({ key: "all", [q(a).tabPane.key || ""]: "all", [q(a).tabPane.tab || ""]: "全部" }), null, 16)), (w(!0), j(be, null, Te(e.iconSets, (Z) => (w(), I(H(q(a).tabPane.name), xe({ key: Z, [q(a).tabPane.key || ""]: Z, [q(a).tabPane.tab || ""]: Z }), null, 16))), 128)) ]), _: 1 }, 16)), (w(), I(H(q(a).input.name), xe({ [q(a).input.modelValue]: y.value, ["onUpdate:" + q(a).input.modelValue]: k[0] || (k[0] = (Z) => y.value = Z), class: "ml-2", placeholder: "搜索图标, 双击选择", onKeydown: ls(T, ["enter"]) }), { suffix: B(() => [ x(J, { type: "primary", size: "small", icon: q(a).icons.search, onClick: T }, null, 8, ["icon"]) ]), _: 1 }, 16)), te("div", rm, [ te("div", am, [ (w(!0), j(be, null, Te($.value.records, (Z) => (w(), j("div", { key: Z, class: St(["icon-item", { active: Z === W.value }]), title: Z, onClick: (Se) => F(Z, !1), onDblclick: (Se) => F(Z, !0) }, [ x(N, { icon: Z, class: "text-2xl" }, null, 8, ["icon"]) ], 42, im))), 128)) ]), te("div", sm, [ $.value.loading ? (w(), I(ue, { key: 0, loading: $.value.loading, text: "加载中" }, null, 8, ["loading"])) : $.value.total == null || $.value.total == 0 ? (w(), j("div", lm, k[2] || (k[2] = [ te("div", null, "暂无数据", -1) ]))) : $.value.total > $.value.start + $.value.limit ? (w(), j("div", { key: 2, onClick: ne }, k[3] || (k[3] = [ te("div", null, "加载更多", -1) ]))) : oe("", !0) ]) ]), te("div", um, [ x(J, { type: "primary", onClick: V }, { default: B(() => k[4] || (k[4] = [ Vt("确定", -1) ])), _: 1, __: [4] }) ]) ]) ]) ]), _: 2 }, 1040)) ])) : oe("", !0) ]); }; } }); const fm = le({ 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 } = we(); e.radioName && console.warn("参数radioName即将废弃,请改成optionName"); const o = M(() => e.optionName ?? e.radioName ?? n.radio.name); let r = un(e, t, n.radioGroup.modelValue); const a = r.createComputedOptions(); return { ui: n, computedRadioName: o, ...r, computedOptions: a, onSelectedChange: (s) => { t.emit("change", s), s && s.target && (s = s.target.value); const u = r.getDict(); if (u && u.dataMap && u.dataMap[s]) { const l = u.dataMap[s]; t.emit("selected-change", l); } else t.emit("selected-change", null); } }; } }); function hm(e, t, n, o, r, a) { return w(), I(H(e.ui.radioGroup.name), { onChange: e.onSelectedChange }, { default: B(() => [ (w(!0), j(be, null, Te(e.computedOptions, (i) => (w(), I(H(e.computedRadioName), z({ ref_for: !0, ref: "radioRef", key: e.getValue(i), [e.ui.radio.value || ""]: e.getValue(i) }, { ref_for: !0 }, e.optionProps), { default: B(() => [ Vt(We(e.getLabel(i)), 1) ]), _: 2 }, 1040))), 128)) ]), _: 1 }, 40, ["onChange"]); } const mm = /* @__PURE__ */ Oe(fm, [["render", hm]]), pm = le({ name: "FsDictSelect" }), gm = /* @__PURE__ */ le({ ...pm, 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 } = lt(), s = M(() => o.placeholder || i("fs.component.select.placeholder")), { ui: u } = we(), l = Xo(), d = un(o, { emit: r, attrs: l }, u.select.modelValue), f = d.createComputedOptions(), h = (y) => { r("change", y); const b = d.getDict(); if (y && Array.isArray(y) && y.length > 0) { const R = []; for (const D of y) b && b.dataMap && b.dataMap[D] && R.push(b.dataMap[D]); r("selected-change", R); return; } if (b && b.dataMap && b.dataMap[y]) { const R = b.dataMap[y]; r("selected-change", R); } else r("selected-change", null); }, v = qr(); t({ selectRef: a, computedPlaceholder: s, ...d, computedOptions: f, onSelectedChange: h }); const p = () => { const { ui: y } = we(), b = H(y.select.name), R = y.select.modelValue; if (y.option.name == null) { const P = f.value || [], W = { [`onUpdate:${R}`]: (V) => { this.$emit(`onUpdate:${R}`, V), h(V); }, ...l }, F = { ...v, ...o.slots }; return x(b, z({ ref: "selectRef", placeholder: s.value, options: P, renderLabel: o.renderLabel }, W), F); } const D = [], $ = H(y.option.name), T = f.value || []; for (const P of T) { const W = x($, z(P, { value: d.getValue(P), label: d.getLabel(P) }), { default: () => [o.renderLabel ? o.renderLabel(P) : d.getLabel(P)] }); D.push(W); } const E = { default: () => D, ...v, ...o.slots }; return x(b, z({ ref: "selectRef", placeholder: s.value, onChange: h }, l), E); }; return (y, b) => (w(), I(p)); } }); function vm(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 bm(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 ym = le({ name: "FsValuesFormat", props: { /** * 值 */ modelValue: {}, /** * 字典配置 */ dict: {}, /** * 是否多选 */ multiple: { default: !0 }, /** * 分隔符
* 多选时,如果value为string,则以该分隔符分割成多个展示
* 传入空字符串,表示不分割
*/ 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 }, closable: { type: Boolean, default: !1 } }, emits: ["click", "dict-change", "close", "update:modelValue"], setup(e, t) { const { ui: n } = we(), o = n.tag.colors, r = ["plain", "light"], a = un(e, t), { getColor: i, getValue: s, removePropValue: u } = a; a.watchValue(); function l(h, v) { !v.effect && h.effect && (v.effect = h.effect); const p = n.tag.type, y = i(v); if (y != null) { if (typeof y != "string") return; u(v, "color"), v[p] = y; return; } if (h.color === "auto") { const b = vm(s(v)); s(v); const R = h.autoColors ? h.autoColors : o; v[p] = R[b % R.length]; const D = h.autoEffects ? h.autoEffects : r; v.effect = D[Math.floor(b / R.length) % D.length]; } else v[p] = h.color; } const c = M(() => { var D, $; if (e.valueType === "object") return e.modelValue && !Array.isArray(e.modelValue) ? [e.modelValue] : e.modelValue; const h = a.getDict(); if (e.modelValue == null || e.modelValue === "") return []; const v = bm(e); let p = []; const y = ((D = e.dict) == null ? void 0 : D.value) || "value", b = (($ = e.dict) == null ? void 0 : $.label) || "label"; h ? (p = h.getNodesFromDataMap(v), Y(p, (T) => { T[b] == null && (T[b] = e.defaultLabel || T[y]); })) : (p = [], Y(v, (T) => { T instanceof Object ? p.push(T) : p.push({ [y]: T, [b]: T }); })); const R = []; return Y(p, (T) => { R.push(wn(T, "children")); }), Y(R, (T) => { l(e, T); }), R; }); function d(h) { t.emit("click", { item: h }); } function f(h, v) { t.emit("close", { item: v, index: h }); const p = []; for (let y = 0; y < c.value.length; y++) y !== h && p.push(s(c.value[y])); t.emit("update:modelValue", p); } return { ui: n, ...a, doClick: d, computedValueItems: c, doClose: f }; } }); const wm = { class: "fs-values-format" }, _m = ["onClick"]; function Cm(e, t, n, o, r, a) { const i = G("fs-render"), s = G("fs-icon"); return w(), j("span", wm, [ e.itemRender ? (w(!0), j(be, { key: 0 }, Te(e.computedValueItems, (u) => (w(), I(i, { key: e.getValue(u), "render-func": e.itemRender, scope: u }, null, 8, ["render-func", "scope"]))), 128)) : e.type === "text" ? (w(!0), j(be, { key: 1 }, Te(e.computedValueItems, (u) => (w(), j("span", { key: e.getValue(u), onClick: (l) => e.doClick(u) }, We(e.getLabel(u)), 9, _m))), 128)) : (w(!0), j(be, { key: 2 }, Te(e.computedValueItems, (u, l) => (w(), I(H(e.ui.tag.name), z({ key: e.getValue(u), class: "fs-tag", size: "small", closable: e.closable }, { ref_for: !0 }, u, { icon: null, name: null, onClose: (c) => e.doClose(l, u), onClick: (c) => e.doClick(u) }), { default: B(() => [ u.icon ? (w(), I(s, { key: 0, icon: u.icon, spin: u.iconSpin, class: "fs-tag-icon" }, null, 8, ["icon", "spin"])) : oe("", !0), Vt(" " + We(e.getLabel(u)), 1) ]), _: 2 }, 1040, ["closable", "onClose", "onClick"]))), 128)) ]); } const Sm = /* @__PURE__ */ Oe(ym, [["render", Cm]]), Fm = le({ name: "FsDictCascaderFormat", props: { /** * 值
* 单选时 '1,2,3' 或 [1,2,3]
* 多选[[1,2,3],[4,5,6]]
*/ // @ts-ignore modelValue: { type: [String, Array], default: void 0, require: !0 }, /** * value的分隔符
* 多选时,如果value为string,则以该分隔符分割成多个展示
* 传入空字符串,表示不分割
*/ // @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 = un(e, t); (r = e.dict) != null && r.getNodesByValues && n.watchValue(); const o = M(() => 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); } } }), Rm = { key: 0 }, Dm = { key: 0 }; function km(e, t, n, o, r, a) { return w(), j("span", null, [ e.computedMultiple ? (w(!0), j(be, { key: 0 }, Te(e.multipleLabels, (i, s) => (w(), j("div", { key: s }, [ (w(!0), j(be, null, Te(i, (u, l) => (w(), j("span", { key: l }, [ l !== 0 ? (w(), j("span", Rm, " / ")) : oe("", !0), te("span", null, We(e.getLabel(u)), 1) ]))), 128)) ]))), 128)) : (w(!0), j(be, { key: 1 }, Te(e.labels, (i, s) => (w(), j("span", { key: s }, [ s !== 0 ? (w(), j("span", Dm, " / ")) : oe("", !0), te("span", null, We(e.getLabel(i)), 1) ]))), 128)) ]); } const $m = /* @__PURE__ */ Oe(Fm, [["render", km]]), Om = le({ name: "FsDictCascader", props: { /** * 字典配置 */ dict: {}, /** * 选项,比dict.data优先级高 */ options: { type: Array }, /** * 转换DictData */ transformDictData: { type: Function, default: void 0 } }, emits: [ /** * 字典数据变化事件 */ "dict-change", /** * 选中值变化事件,可以获取到当前选中的option对象 */ "selected-change", /** * 值变化事件 */ "change" ], setup(e, t) { const n = K(), o = un(e, t), { ui: r } = we(), 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(); function s(u) { if (t.emit("change", u), u) { let l = []; const c = o.getDict(); if (c && c.dataMap) { for (let d of u) { const f = c.dataMap[d]; f && l.push(f); } t.emit("selected-change", l); } } else t.emit("selected-change", null); } return { ui: r, cascaderRef: n, ...o, fieldNamesBinder: a, computedOptions: i, onSelectChange: s }; } }); function Em(e, t, n, o, r, a) { return w(), I(H(e.ui.cascader.name), z({ ref: "cascaderRef", options: e.computedOptions }, e.fieldNamesBinder, { onChange: e.onSelectChange }), null, 16, ["options", "onChange"]); } const Tm = /* @__PURE__ */ Oe(Om, [["render", Em]]), Im = le({ 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 } = we(); let o = un(e, t, n.checkboxGroup.modelValue); const r = o.createComputedOptions(); return { ui: n, ...o, computedOptions: r, onSelectedChange: (i) => { if (t.emit("change", i), i) { let s = []; const u = o.getDict(); if (u && u.dataMap) { for (let l of i) { const c = u.dataMap[l]; c && s.push(c); } t.emit("selected-change", s); } } else t.emit("selected-change", null); } }; } }); function Am(e, t, n, o, r, a) { return w(), I(H(e.ui.checkboxGroup.name), { onChange: e.onSelectedChange }, { default: B(() => [ (w(!0), j(be, null, Te(e.computedOptions, (i) => (w(), I(H(e.optionName || e.ui.checkbox.name), z({ ref_for: !0, ref: "checkboxRef", key: e.getValue(i), [e.ui.checkbox.value || ""]: e.getValue(i) }, { ref_for: !0 }, e.optionProps), { default: B(() => [ Vt(We(e.getLabel(i)), 1) ]), _: 2 }, 1040))), 128)) ]), _: 1 }, 40, ["onChange"]); } const Vm = /* @__PURE__ */ Oe(Im, [["render", Am]]), Pm = le({ name: "FsDictSwitch", props: { /** * 字典第一个为开启 * 第二个为关闭 */ dict: { type: Object }, options: {}, /** * 转换DictData */ transformDictData: { type: Function, default: void 0 } }, emits: ["dict-change"], setup(e, t) { const { ui: n } = we(); let o = un(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 = qe.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 Mm(e, t, n, o, r, a) { return w(), I(H(e.ui.switch.name), z({ ref: "switchRef" }, e.binding), null, 16); } const Bm = /* @__PURE__ */ Oe(Pm, [["render", Mm]]), jm = le({ 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 = et(this.modelValue, this.valueFormat) : e = et(this.modelValue), e.format(this.format); } }, created() { }, methods: {} }); function Nm(e, t, n, o, r, a) { return w(), j("span", null, We(e.doFormat), 1); } const xm = /* @__PURE__ */ Oe(jm, [["render", Nm]]), Lm = le({ 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 } = lt(), { ui: o } = we(), r = M(() => e.placeholder || n("fs.component.select.placeholder")); let a = un(e, t); const i = t.slots, s = a.createComputedOptions(), u = M(() => { const d = a.getDict(); return o.treeSelect.buildOptionKeysNameBinding({ label: d.label, value: d.value, children: d.children }); }), l = (d) => { if (t.emit("change", d), d) { const f = a.getDict(); if (f && f.dataMap) if (d instanceof Array) { let h = []; for (let v of d) { const p = f.dataMap[v]; p && h.push(p); } 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: u, computedPlaceholder: r, ...a, computedOptions: s, onSelectedChange: l, slots: i, treeRef: c }; } }); function qm(e, t, n, o, r, a) { const i = G("fs-slot-render"); return w(), I(H(e.ui.treeSelect.name), z({ ref: "treeRef", [e.ui.treeSelect.options || ""]: e.computedOptions, placeholder: e.computedPlaceholder }, e.computedBinding, { onChange: e.onSelectedChange }), Lr({ _: 2 }, [ Te(e.slots, (s, u) => ({ name: u, fn: B((l) => [ x(i, { slots: s, scope: l }, null, 8, ["slots", "scope"]) ]) })) ]), 1040, ["placeholder", "onChange"]); } const Hm = /* @__PURE__ */ Oe(Lm, [["render", qm]]), zm = { class: "fs-table-select" }, Wm = { key: 0, class: "fs-table-select-current" }, Um = /* @__PURE__ */ le({ __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" ], setup(e, { expose: t, emit: n }) { const o = e, r = qr(), a = n, { ui: i } = we(), { t: s } = lt(), u = K(), l = K(), c = K(!1); function d() { c.value = !1; } function f() { c.value = !0; } const { crudRef: h, crudBinding: v, crudExpose: p } = gu(); function y(k) { k == null || Array.isArray(k) && k.length == 0 ? E.value = [] : (o.multiple ? E.value = k || [] : E.value = [k], o.valueType === "object" && (E.value = E.value.map((N) => o.dict.getValue(N)))); } const b = K(), R = M(() => ({ wrapper: {} })), D = async (k = {}) => { var ue, Z; if (o.disabled || o.readonly || (ue = o.select) != null && ue.disabled || (Z = o.select) != null && Z.readonly) return; if (o.dict == null) throw new Error("必须配置dict,且必须配置dict.getNodesByValues"); const N = await pu({ crudBinding: v, crudRef: h, createCrudOptions: o.createCrudOptions, crudOptionsOverride: F(), context: { t: s, ui: i, ...k == null ? void 0 : k.context }, crudExpose: p }); y(o.modelValue), o.beforeOpen && await o.beforeOpen({ crudOptions: k == null ? void 0 : k.crudOptions, ...L() }), k && N.appendCrudOptions(k == null ? void 0 : k.crudOptions); const J = V({ wrapper: { title: o.viewMode ? s("fs.extends.tableSelect.view") : s("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: s("fs.extends.tableSelect.cancel"), async click() { b.value.close(); } }, ok: { type: "primary", text: s("fs.extends.tableSelect.ok"), async click() { await ne(); } } } } }, { wrapper: o.dialog }); return b.value.open(J), await Be(), await p.doRefresh(), N; }, $ = M(() => ({ ...o.valuesFormat })), T = M(() => { const k = `onUpdate:${i.select.modelValue}`; let N = o.modelValue; return o.valueType === "object" && o.modelValue && (o.multiple ? N = o.modelValue.map((J) => o.dict.getValue(J)) : N = o.dict.getValue(o.modelValue)), { [i.select.modelValue]: N, [k]: (J) => { a("update:modelValue", J); }, [i.select.clearable]: !0, ...i.select.buildMultiBinding(o.multiple), show: !1, ...o.select }; }); it(() => o.modelValue, async (k) => { k !== E.value && (y(k), await Be(), await o.dict.appendByValues(E.value)); }); const E = K([]); function P() { return o.rowKey || v.value.table.rowKey || "id"; } const W = K(!1); function F() { var ue, Z; let k = i.table; ((Z = (ue = v.value) == null ? void 0 : ue.table) == null ? void 0 : Z.tableVersion) === "v2" && (k = i.tableV2); let N = k.buildSelectionCrudOptions({ crossPage: o.crossPage, selectOnClickRow: !0, getRowKey: P, getPageData() { return v.value.data; }, useCompute: Pt, multiple: o.multiple, selectedRowKeys: E, onSelectedKeysChanged: async (Se) => { E.value = [...Se], await Be(), await o.dict.appendByValues(E.value); } }); return V({ table: { async onRefreshed() { if (k.setSelectedRows) { W.value = !0, await Be(), await Be(); const Se = p.getBaseTableRef(); k.setSelectedRows({ getRowKey: P, multiple: o.multiple, tableRef: Se, selectedRowKeys: E }), W.value = !1; } } } }, N, o.crudOptionsOverride); } const { merge: V } = $e(); async function ne() { var ue; if (o.dict.loading) return; let k = null, N = null; ((ue = E.value) == null ? void 0 : ue.length) > 0 && (k = [...E.value], N = k.map((Z) => o.dict.getDictMap()[Z]), o.valueType === "object" && (k = N), o.multiple !== !0 && k.length > 0 && (k = k[0])), (!o.viewMode || o.emitOnViewModel) && (a("update:modelValue", k), a("change", k), a("selected-change", N)); let J = { value: k, rows: N, selectedRowKeys: E.value }; a("dialog-close", J), await Be(), await b.value.close(), c.value, a("dialog-closed", J); } const L = () => ({ opened: c, open: D, selectedRowKeys: E, dictSelectRef: u, valuesFormatRef: l, crudRef: h, crudBinding: v, crudExpose: p }), A = K(L()); return t(A.value), (k, N) => { const J = G("fs-dict-select"), ue = G("fs-values-format"), Z = G("fs-crud"), Se = G("fs-form-wrapper"); return w(), j("div", zm, [!(r != null && r.default) && !k.viewMode ? (w(), I(J, z({ key: 0, ref_key: "dictSelectRef", ref: u }, T.value, { open: !1, disabled: k.disabled, readonly: k.readonly, dict: k.dict, onClick: D }), null, 16, ["disabled", "readonly", "dict"])) : oe("", !0), re(k.$slots, "default", xe(Lt(A.value))), (w(), I(H(q(i).formItem.skipValidationWrapper), null, { default: B(() => [x(Se, z({ ref_key: "formWrapperRef", ref: b }, R.value, { onClosed: d, onOpen: f }), { "form-body-top": B(() => [c.value || k.destroyOnClose === !1 ? (w(), j("div", { key: 0, style: to({ width: "100%", height: k.height || "70vh" }) }, [x(Z, z({ ref_key: "crudRef", ref: h }, q(v)), { "header-top": B(() => [k.showCurrent !== !1 && !k.viewMode ? (w(), j("div", Wm, [N[1] || (N[1] = Vt(" 当前选中: ", -1)), x(ue, z({ ref_key: "valuesFormatRef", ref: l, modelValue: E.value, "onUpdate:modelValue": N[0] || (N[0] = (ke) => E.value = ke), dict: k.dict, closable: !0 }, $.value), null, 16, ["modelValue", "dict"])])) : oe("", !0)]), _: 1 }, 16)], 4)) : oe("", !0)]), _: 1 }, 16)]), _: 1 }))]); }; } }); const Km = { class: "fs-editable-select" }, Ym = { class: "select" }, Gm = le({ /** * 可编辑选择器 */ name: "FsEditableSelect" }), Xm = /* @__PURE__ */ le({ ...Gm, 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, s) => { const u = G("fs-dict-select"), l = G("fs-button"), c = G("fs-table-select"); return w(), j("div", Km, [ te("div", Ym, [ x(u, z({ value: i.modelValue, dict: i.dict }, i.dictSelect, { "onUpdate:value": a }), null, 16, ["value", "dict"]) ]), x(c, z({ class: "table-select", "model-value": i.modelValue, dict: i.dict, "destroy-on-close": !1, height: "400px" }, i.tableSelect, { "onUpdate:modelValue": a, onDialogClosed: r }), { default: B((d) => [ x(l, z({ type: "primary", icon: "ant-design:edit-outlined" }, i.button, { onClick: d.open }), null, 16, ["onClick"]) ]), _: 1 }, 16, ["model-value", "dict"]) ]); }; } }); const Ma = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, FsActionbar: uf, FsBox: bc, FsButton: Qu, FsCell: Gd, FsColumnsFilterLayoutDefault: Rh, FsComponentRender: _c, FsContainer: Au, FsCrud: id, FsDateFormat: xm, FsDictCascader: Tm, FsDictCascaderFormat: $m, FsDictCheckbox: Vm, FsDictRadio: mm, FsDictSelect: gm, FsDictSwitch: Bm, FsDictTree: Hm, FsEditable: rf, FsEditableCell: Xd, FsEditableSelect: Xm, FsForm: Rc, FsFormHelper: qc, FsFormItem: Pc, FsFormItemCol: Mc, FsFormProvider: Wc, FsFormWrapper: ro, FsIcon: Ju, FsIconSelector: dm, FsIconSvg: ic, FsIconify: tc, FsLabel: cc, FsLayoutCard: Gu, FsLayoutDefault: Lu, FsLoading: mc, FsPage: xl, FsRender: gi, FsRowHandle: dd, FsSearch: Ah, FsSearchLayoutDefault: Xh, FsSearchV1: qh, FsSlotRender: Cc, FsTable: Yd, FsTableColumnsFixedController: xi, FsTableSelect: Um, FsTabsFilter: Zh, FsToolbar: mf, FsValuesFormat: Sm, fsColumnsFilterNestList: Li }, Symbol.toStringTag, { value: "Module" })), { setDictRequest: Qm } = _u(), pp = { install(e, t = {}) { t.ui && qe.set(t.ui); const { merge: n } = $e(); t.commonOptions && (no.commonOptions = t.commonOptions), t.dictRequest && Qm(t.dictRequest), t.i18n && Do.setVueI18n(t.i18n); const o = t.customComponents || {}; for (const r in Ma) { const a = o[r] || Ma[r]; e.component(r, a); } ro._context = e._context, $n.install(), e.config.globalProperties.$fsui = qe.get(), n(Du.logger, t.logger), Jm(t.logger); } }; function Jm(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 { id as $, Yr as A, li as B, Zo as C, pi as D, hu as E, pp as F, Du as G, xl as H, Au as I, Lu as J, Gu as K, _c as L, Cc as M, gi as N, Qu as O, Ju as P, tc as Q, ic as R, dm as S, cc as T, Rc as U, Pc as V, Mc as W, qc as X, ro as Y, Wc as Z, mc as _, lt as a, Yd as a0, Gd as a1, Xd as a2, rf as a3, dd as a4, Ah as a5, qh as a6, Xh as a7, Zh as a8, uf as a9, mf as aa, Rh as ab, Li as ac, xi as ad, mm as ae, gm as af, Sm as ag, $m as ah, Tm as ai, Vm as aj, Bm as ak, xm as al, bc as am, Hm as an, Um as ao, Xm as ap, mp as aq, ea as ar, uu as as, cu as at, fu as au, up as av, mu as b, Qo as c, cp as d, pu as e, gu as f, Jo as g, Gl as h, Xl as i, Pt as j, un as k, wu as l, _u as m, hp as n, ii as o, $e as p, Qr as q, ti as r, ks as s, _r as t, _t as u, xo as v, Zr as w, Ru as x, iu as y, si as z }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtODYxNGY0ODQubWpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXNlL2RlZmF1bHQtY3J1ZC1vcHRpb25zLnRzIiwiLi4vLi4vc3JjL3V0aWxzL3V0aWwubG9nLnRzIiwiLi4vLi4vc3JjL3V0aWxzL3V0aWwuc3RyaW5nLnRzIiwiLi4vLi4vc3JjL3V0aWxzL3V0aWwudHJhY2UudHMiLCIuLi8uLi9zcmMvdXRpbHMvdXRpbC52aXRlLnRzIiwiLi4vLi4vc3JjL3V0aWxzL3V0aWwuc3RvcmUudHMiLCIuLi8uLi9zcmMvdXRpbHMvZGVlcGRhc2gvcHJpdmF0ZS9nZXRQYXRoVG9TdHJpbmcudHMiLCIuLi8uLi9zcmMvdXRpbHMvZGVlcGRhc2gvcHJpdmF0ZS9nZXRJdGVyYXRlLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2RlZXBkYXNoL2dldC1lYWNoLWRlZXAudHMiLCIuLi8uLi9zcmMvdXRpbHMvZGVlcGRhc2gvaW5kZXgudHMiLCIuLi8uLi9zcmMvdXRpbHMvdXRpbC5kYXNoLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2luZGV4LnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvYXNzaXN0LnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvYnV0dG9uLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvY2FzY2FkZXIudHMiLCIuLi8uLi9zcmMvbG9jYWxlL2xhbmcvemgtY24udHMiLCIuLi8uLi9zcmMvbG9jYWxlL2xhbmcvZW4udHMiLCIuLi8uLi9zcmMvbG9jYWxlL2luZGV4LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2RheWpzQDEuMTEuMTMvbm9kZV9tb2R1bGVzL2RheWpzL3BsdWdpbi9hZHZhbmNlZEZvcm1hdC5qcyIsIi4uLy4uL3NyYy90eXBlcy9mdW5jdGlvbnMudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xMy9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3dlZWtPZlllYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xMy9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3dlZWtkYXkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xMy9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL2xvY2FsZURhdGEuanMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC9kYXRlLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvZWwudHMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC9pY29uLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvbnVtYmVyLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvcGhvbmUudHMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC9zZWxlY3QudHMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC90ZXh0LnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvdHJlZS50cyIsIi4uLy4uL3NyYy90eXBlcy9pbmRleC50cyIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1wYWdlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1wYWdlLnZ1ZSIsIi4uLy4uL3NyYy91c2UvdXNlLW1lcmdlLnRzIiwiLi4vLi4vc3JjL3VzZS91c2UtY29tcHV0ZS50cyIsIi4uLy4uL3NyYy91dGlscy91dGlsLmNvbnN0YW50cy50cyIsIi4uLy4uL3NyYy91c2UvdXNlLWNvbHVtbnMudHN4IiwiLi4vLi4vc3JjL3VzZS91c2UtZm9ybS50cyIsIi4uLy4uL3NyYy91c2UvdXNlLWV4cG9zZS50cyIsIi4uLy4uL3NyYy9saWIvZnMtZXhwb3J0L2luZGV4LnRzIiwiLi4vLi4vc3JjL3VzZS91c2UtcGx1Z2lucy50cyIsIi4uLy4uL3NyYy91c2UvdXNlLWNydWQudHMiLCIuLi8uLi9zcmMvdXNlL3VzZS1kaWN0LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xydS1jYWNoZUAxMC40LjMvbm9kZV9tb2R1bGVzL2xydS1jYWNoZS9kaXN0L2VzbS9pbmRleC5qcyIsIi4uLy4uL3NyYy91c2UvdXNlLWRpY3QtZGVmaW5lLnRzIiwiLi4vLi4vc3JjL3VzZS91c2UtdHlwZXMudHMiLCIuLi8uLi9zcmMvdXNlL3VzZS1kcmFnLnRzIiwiLi4vLi4vc3JjL3VzZS9jb25maWcudHMiLCIuLi9zcmMvY29tcG9uZW50cy9jb250YWluZXIvZnMtY29udGFpbmVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1jb250YWluZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY29udGFpbmVyL2ZzLWxheW91dC1kZWZhdWx0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1sYXlvdXQtZGVmYXVsdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb250YWluZXIvZnMtbGF5b3V0LWNhcmQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY29udGFpbmVyL2ZzLWxheW91dC1jYXJkLnZ1ZSIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2Jhc2ljL2ZzLWJ1dHRvbi50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1pY29uLnRzeCIsIi4uL3NyYy9jb21wb25lbnRzL2Jhc2ljL2ZzLWljb25pZnkudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvYmFzaWMvZnMtaWNvbmlmeS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1pY29uLXN2Zy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1pY29uLXN2Zy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1sYWJlbC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1sYWJlbC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1sb2FkaW5nLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Jhc2ljL2ZzLWJveC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1ib3gudnVlIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvcmVuZGVyL2ZzLWNvbXBvbmVudC1yZW5kZXIudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvcmVuZGVyL2ZzLXNsb3QtcmVuZGVyLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL3JlbmRlci9mcy1yZW5kZXIudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9mcy1mb3JtLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtZm9ybS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taXRlbS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taXRlbS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taXRlbS1jb2wudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9mcy1mb3JtLWhlbHBlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taGVscGVyLnZ1ZSIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtZm9ybS13cmFwcGVyLnRzeCIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtZm9ybS1wcm92aWRlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9mcy1jcnVkLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2ZzLWNydWQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9mcy1yb3ctaGFuZGxlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtcm93LWhhbmRsZS52dWUiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vYXN5bmMtdmFsaWRhdG9yQDQuMi41L25vZGVfbW9kdWxlcy9hc3luYy12YWxpZGF0b3IvZGlzdC13ZWIvaW5kZXguanMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9jcnVkL2VkaXRhYmxlL3ZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2NydWQvZWRpdGFibGUvdXNlLWVkaXRhYmxlLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC91c2UvcHJvdmlkZXIudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLXRhYmxlLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtY2VsbC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9jcnVkL2VkaXRhYmxlL2ZzLWVkaXRhYmxlLWNlbGwudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9lZGl0YWJsZS9mcy1lZGl0YWJsZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9hY3Rpb25iYXIvaW5kZXgudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvYWN0aW9uYmFyL2luZGV4LnZ1ZSIsIi4uLy4uL3NyYy9kL2V4cG9zZS50cyIsIi4uLy4uL3NyYy9kL2NvbHVtbnMtZmlsdGVyLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvdG9vbGJhci9mcy10YWJsZS1jb2x1bW5zLWZpbHRlci9pbmRleC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy90b29sYmFyL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvaW5kZXgudnVlIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3NvcnRhYmxlanNAMS4xNC4wL25vZGVfbW9kdWxlcy9zb3J0YWJsZWpzL21vZHVsYXIvc29ydGFibGUuZXNtLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Z1ZWRyYWdnYWJsZS1lc0A0LjEuMV92dWVAMy41LjE4X3R5cGVzY3JpcHRANS4xLjZfL25vZGVfbW9kdWxlcy92dWVkcmFnZ2FibGUtZXMvZGlzdC9pbmRleC5lcy5qcyIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvZnMtY29sdW1ucy1maWx0ZXItbmVzdC1saXN0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvZnMtY29sdW1ucy1maWx0ZXItbGF5b3V0LWRlZmF1bHQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL2J1dHRvbnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL2J1dHRvbnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9pbmRleC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9zZWFyY2gvc2VhcmNoX3YxLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9zZWFyY2hfdjEudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL2xheW91dC1kZWZhdWx0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9sYXlvdXQtZGVmYXVsdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9zZWFyY2gvdGFicy1maWx0ZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1pY29uLXNlbGVjdG9yL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1yYWRpby52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtcmFkaW8udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LXNlbGVjdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLXZhbHVlcy1mb3JtYXQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy12YWx1ZXMtZm9ybWF0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1jYXNjYWRlci1mb3JtYXQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LWNhc2NhZGVyLWZvcm1hdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtY2FzY2FkZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LWNhc2NhZGVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1jaGVja2JveC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtY2hlY2tib3gudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LXN3aXRjaC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRhdGUtZm9ybWF0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC10cmVlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC10cmVlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtdGFibGUtc2VsZWN0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZWRpdGFibGUtc2VsZWN0LnZ1ZSIsIi4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTooZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOmV8fHNlbGYpLmRheWpzX3BsdWdpbl9hZHZhbmNlZEZvcm1hdD10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIHI9dC5wcm90b3R5cGUsbj1yLmZvcm1hdDtyLmZvcm1hdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLHI9dGhpcy4kbG9jYWxlKCk7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBuLmJpbmQodGhpcykoZSk7dmFyIHM9dGhpcy4kdXRpbHMoKSxhPShlfHxcIllZWVktTU0tRERUSEg6bW06c3NaXCIpLnJlcGxhY2UoL1xcWyhbXlxcXV0rKV18UXx3b3x3d3x3fFdXfFd8enp6fHp8Z2dnZ3xHR0dHfERvfFh8eHxrezEsMn18Uy9nLChmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZVwiUVwiOnJldHVybiBNYXRoLmNlaWwoKHQuJE0rMSkvMyk7Y2FzZVwiRG9cIjpyZXR1cm4gci5vcmRpbmFsKHQuJEQpO2Nhc2VcImdnZ2dcIjpyZXR1cm4gdC53ZWVrWWVhcigpO2Nhc2VcIkdHR0dcIjpyZXR1cm4gdC5pc29XZWVrWWVhcigpO2Nhc2VcIndvXCI6cmV0dXJuIHIub3JkaW5hbCh0LndlZWsoKSxcIldcIik7Y2FzZVwid1wiOmNhc2VcInd3XCI6cmV0dXJuIHMucyh0LndlZWsoKSxcIndcIj09PWU/MToyLFwiMFwiKTtjYXNlXCJXXCI6Y2FzZVwiV1dcIjpyZXR1cm4gcy5zKHQuaXNvV2VlaygpLFwiV1wiPT09ZT8xOjIsXCIwXCIpO2Nhc2VcImtcIjpjYXNlXCJra1wiOnJldHVybiBzLnMoU3RyaW5nKDA9PT10LiRIPzI0OnQuJEgpLFwia1wiPT09ZT8xOjIsXCIwXCIpO2Nhc2VcIlhcIjpyZXR1cm4gTWF0aC5mbG9vcih0LiRkLmdldFRpbWUoKS8xZTMpO2Nhc2VcInhcIjpyZXR1cm4gdC4kZC5nZXRUaW1lKCk7Y2FzZVwielwiOnJldHVyblwiW1wiK3Qub2Zmc2V0TmFtZSgpK1wiXVwiO2Nhc2VcInp6elwiOnJldHVyblwiW1wiK3Qub2Zmc2V0TmFtZShcImxvbmdcIikrXCJdXCI7ZGVmYXVsdDpyZXR1cm4gZX19KSk7cmV0dXJuIG4uYmluZCh0aGlzKShhKX19fSkpOyIsbnVsbCwiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5kYXlqc19wbHVnaW5fd2Vla09mWWVhcj10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9XCJ3ZWVrXCIsdD1cInllYXJcIjtyZXR1cm4gZnVuY3Rpb24oaSxuLHIpe3ZhciBmPW4ucHJvdG90eXBlO2Yud2Vlaz1mdW5jdGlvbihpKXtpZih2b2lkIDA9PT1pJiYoaT1udWxsKSxudWxsIT09aSlyZXR1cm4gdGhpcy5hZGQoNyooaS10aGlzLndlZWsoKSksXCJkYXlcIik7dmFyIG49dGhpcy4kbG9jYWxlKCkueWVhclN0YXJ0fHwxO2lmKDExPT09dGhpcy5tb250aCgpJiZ0aGlzLmRhdGUoKT4yNSl7dmFyIGY9cih0aGlzKS5zdGFydE9mKHQpLmFkZCgxLHQpLmRhdGUobikscz1yKHRoaXMpLmVuZE9mKGUpO2lmKGYuaXNCZWZvcmUocykpcmV0dXJuIDF9dmFyIGE9cih0aGlzKS5zdGFydE9mKHQpLmRhdGUobikuc3RhcnRPZihlKS5zdWJ0cmFjdCgxLFwibWlsbGlzZWNvbmRcIiksbz10aGlzLmRpZmYoYSxlLCEwKTtyZXR1cm4gbzwwP3IodGhpcykuc3RhcnRPZihcIndlZWtcIikud2VlaygpOk1hdGguY2VpbChvKX0sZi53ZWVrcz1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bnVsbCksdGhpcy53ZWVrKGUpfX19KSk7IiwiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5kYXlqc19wbHVnaW5fd2Vla2RheT10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dC5wcm90b3R5cGUud2Vla2RheT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnR8fDAsaT10aGlzLiRXLG49KGk8dD9pKzc6aSktdDtyZXR1cm4gdGhpcy4kdXRpbHMoKS51KGUpP246dGhpcy5zdWJ0cmFjdChuLFwiZGF5XCIpLmFkZChlLFwiZGF5XCIpfX19KSk7IiwiIWZ1bmN0aW9uKG4sZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KG49XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczpufHxzZWxmKS5kYXlqc19wbHVnaW5fbG9jYWxlRGF0YT1lKCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGZ1bmN0aW9uKG4sZSx0KXt2YXIgcj1lLnByb3RvdHlwZSxvPWZ1bmN0aW9uKG4pe3JldHVybiBuJiYobi5pbmRleE9mP246bi5zKX0sdT1mdW5jdGlvbihuLGUsdCxyLHUpe3ZhciBpPW4ubmFtZT9uOm4uJGxvY2FsZSgpLGE9byhpW2VdKSxzPW8oaVt0XSksZj1hfHxzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIG4uc2xpY2UoMCxyKX0pKTtpZighdSlyZXR1cm4gZjt2YXIgZD1pLndlZWtTdGFydDtyZXR1cm4gZi5tYXAoKGZ1bmN0aW9uKG4sZSl7cmV0dXJuIGZbKGUrKGR8fDApKSU3XX0pKX0saT1mdW5jdGlvbigpe3JldHVybiB0LkxzW3QubG9jYWxlKCldfSxhPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG4uZm9ybWF0c1tlXXx8ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvKFxcW1teXFxdXStdKXwoTU1NTXxNTXxERHxkZGRkKS9nLChmdW5jdGlvbihuLGUsdCl7cmV0dXJuIGV8fHQuc2xpY2UoMSl9KSl9KG4uZm9ybWF0c1tlLnRvVXBwZXJDYXNlKCldKX0scz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJue21vbnRoczpmdW5jdGlvbihlKXtyZXR1cm4gZT9lLmZvcm1hdChcIk1NTU1cIik6dShuLFwibW9udGhzXCIpfSxtb250aHNTaG9ydDpmdW5jdGlvbihlKXtyZXR1cm4gZT9lLmZvcm1hdChcIk1NTVwiKTp1KG4sXCJtb250aHNTaG9ydFwiLFwibW9udGhzXCIsMyl9LGZpcnN0RGF5T2ZXZWVrOmZ1bmN0aW9uKCl7cmV0dXJuIG4uJGxvY2FsZSgpLndlZWtTdGFydHx8MH0sd2Vla2RheXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/ZS5mb3JtYXQoXCJkZGRkXCIpOnUobixcIndlZWtkYXlzXCIpfSx3ZWVrZGF5c01pbjpmdW5jdGlvbihlKXtyZXR1cm4gZT9lLmZvcm1hdChcImRkXCIpOnUobixcIndlZWtkYXlzTWluXCIsXCJ3ZWVrZGF5c1wiLDIpfSx3ZWVrZGF5c1Nob3J0OmZ1bmN0aW9uKGUpe3JldHVybiBlP2UuZm9ybWF0KFwiZGRkXCIpOnUobixcIndlZWtkYXlzU2hvcnRcIixcIndlZWtkYXlzXCIsMyl9LGxvbmdEYXRlRm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiBhKG4uJGxvY2FsZSgpLGUpfSxtZXJpZGllbTp0aGlzLiRsb2NhbGUoKS5tZXJpZGllbSxvcmRpbmFsOnRoaXMuJGxvY2FsZSgpLm9yZGluYWx9fTtyLmxvY2FsZURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gcy5iaW5kKHRoaXMpKCl9LHQubG9jYWxlRGF0YT1mdW5jdGlvbigpe3ZhciBuPWkoKTtyZXR1cm57Zmlyc3REYXlPZldlZWs6ZnVuY3Rpb24oKXtyZXR1cm4gbi53ZWVrU3RhcnR8fDB9LHdlZWtkYXlzOmZ1bmN0aW9uKCl7cmV0dXJuIHQud2Vla2RheXMoKX0sd2Vla2RheXNTaG9ydDpmdW5jdGlvbigpe3JldHVybiB0LndlZWtkYXlzU2hvcnQoKX0sd2Vla2RheXNNaW46ZnVuY3Rpb24oKXtyZXR1cm4gdC53ZWVrZGF5c01pbigpfSxtb250aHM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5tb250aHMoKX0sbW9udGhzU2hvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5tb250aHNTaG9ydCgpfSxsb25nRGF0ZUZvcm1hdDpmdW5jdGlvbihlKXtyZXR1cm4gYShuLGUpfSxtZXJpZGllbTpuLm1lcmlkaWVtLG9yZGluYWw6bi5vcmRpbmFsfX0sdC5tb250aHM9ZnVuY3Rpb24oKXtyZXR1cm4gdShpKCksXCJtb250aHNcIil9LHQubW9udGhzU2hvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdShpKCksXCJtb250aHNTaG9ydFwiLFwibW9udGhzXCIsMyl9LHQud2Vla2RheXM9ZnVuY3Rpb24obil7cmV0dXJuIHUoaSgpLFwid2Vla2RheXNcIixudWxsLG51bGwsbil9LHQud2Vla2RheXNTaG9ydD1mdW5jdGlvbihuKXtyZXR1cm4gdShpKCksXCJ3ZWVrZGF5c1Nob3J0XCIsXCJ3ZWVrZGF5c1wiLDMsbil9LHQud2Vla2RheXNNaW49ZnVuY3Rpb24obil7cmV0dXJuIHUoaSgpLFwid2Vla2RheXNNaW5cIixcIndlZWtkYXlzXCIsMixuKX19fSkpOyIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIjx0ZW1wbGF0ZT5cbiAgPGRpdiByZWY9XCJwYWdlUmVmXCIgY2xhc3M9XCJmcy1wYWdlXCI+XG4gICAgPGRpdiB2LWlmPVwiJHNsb3RzLmhlYWRlciAhPSBudWxsXCIgY2xhc3M9XCJmcy1wYWdlLWhlYWRlclwiPlxuICAgICAgPHNsb3QgbmFtZT1cImhlYWRlclwiPjwvc2xvdD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdlLWNvbnRlbnRcIj5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHYtaWY9XCIkc2xvdHMuZm9vdGVyICE9IG51bGxcIiBjbGFzcz1cImZzLXBhZ2UtZm9vdGVyXCI+XG4gICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyXCI+PC9zbG90PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIG9uTW91bnRlZCwgcmVmLCBSZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1BhZ2VcIixcbiAgc2V0dXAoKSB7XG4gICAgY29uc3QgcGFnZVJlZjogUmVmID0gcmVmKCk7XG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhZ2VSZWYudmFsdWUucGFyZW50Tm9kZSk7XG4gICAgICBjb25zdCBwb3NpdGlvblZhbHVlID0gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoXCJwb3NpdGlvblwiKTtcbiAgICAgIGlmIChwb3NpdGlvblZhbHVlICE9PSBcInJlbGF0aXZlXCIpIHtcbiAgICAgICAgdXRpbHMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgXCJmcy1wYWdl54i26IqC54K555qEcG9zaXRpb27lu7rorq7kuLpyZWxhdGl2ZSzlm6DkuLpmcy1wYWdl5Li655u45a+55a6a5L2N77yIcG9zaXRpb246YWJzb2x1dGXvvInvvIzlpoLmnpzmoLflvI/msqHmnInlvILluLjvvIzkvaDlj6/ku6Xlv73nlaXmraTorablkYpcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlUmVmXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtcGFnZSB7XG4gIHdpZHRoOiAxMDAlO1xuICB0b3A6IDA7XG4gIGJvdHRvbTogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG4gIC5mcy1wYWdlLWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICAgID4gLnRpdGxlIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBqdXN0aWZ5LXNlbGY6IGZsZXgtc3RhcnQ7XG4gICAgICBwYWRkaW5nOiAxOHB4O1xuICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICBjb2xvcjogIzQ0NDtcblxuICAgICAgLnN1YiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY29sb3I6IGdyYXk7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xuICAgICAgICBmb250LXdlaWdodDogbGlnaHRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgPiAubW9yZSB7XG4gICAgICBqdXN0aWZ5LXNlbGY6IGZsZXgtZW5kO1xuICAgICAgbWFyZ2luLXJpZ2h0OiAxOHB4O1xuICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICB9XG4gIH1cbiAgLmZzLXBhZ2UtY29udGVudCB7XG4gICAgZmxleDogMTtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiByZWY9XCJwYWdlUmVmXCIgY2xhc3M9XCJmcy1wYWdlXCI+XG4gICAgPGRpdiB2LWlmPVwiJHNsb3RzLmhlYWRlciAhPSBudWxsXCIgY2xhc3M9XCJmcy1wYWdlLWhlYWRlclwiPlxuICAgICAgPHNsb3QgbmFtZT1cImhlYWRlclwiPjwvc2xvdD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdlLWNvbnRlbnRcIj5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHYtaWY9XCIkc2xvdHMuZm9vdGVyICE9IG51bGxcIiBjbGFzcz1cImZzLXBhZ2UtZm9vdGVyXCI+XG4gICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyXCI+PC9zbG90PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIG9uTW91bnRlZCwgcmVmLCBSZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1BhZ2VcIixcbiAgc2V0dXAoKSB7XG4gICAgY29uc3QgcGFnZVJlZjogUmVmID0gcmVmKCk7XG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhZ2VSZWYudmFsdWUucGFyZW50Tm9kZSk7XG4gICAgICBjb25zdCBwb3NpdGlvblZhbHVlID0gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoXCJwb3NpdGlvblwiKTtcbiAgICAgIGlmIChwb3NpdGlvblZhbHVlICE9PSBcInJlbGF0aXZlXCIpIHtcbiAgICAgICAgdXRpbHMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgXCJmcy1wYWdl54i26IqC54K555qEcG9zaXRpb27lu7rorq7kuLpyZWxhdGl2ZSzlm6DkuLpmcy1wYWdl5Li655u45a+55a6a5L2N77yIcG9zaXRpb246YWJzb2x1dGXvvInvvIzlpoLmnpzmoLflvI/msqHmnInlvILluLjvvIzkvaDlj6/ku6Xlv73nlaXmraTorablkYpcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlUmVmXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtcGFnZSB7XG4gIHdpZHRoOiAxMDAlO1xuICB0b3A6IDA7XG4gIGJvdHRvbTogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG4gIC5mcy1wYWdlLWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICAgID4gLnRpdGxlIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBqdXN0aWZ5LXNlbGY6IGZsZXgtc3RhcnQ7XG4gICAgICBwYWRkaW5nOiAxOHB4O1xuICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICBjb2xvcjogIzQ0NDtcblxuICAgICAgLnN1YiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY29sb3I6IGdyYXk7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xuICAgICAgICBmb250LXdlaWdodDogbGlnaHRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgPiAubW9yZSB7XG4gICAgICBqdXN0aWZ5LXNlbGY6IGZsZXgtZW5kO1xuICAgICAgbWFyZ2luLXJpZ2h0OiAxOHB4O1xuICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICB9XG4gIH1cbiAgLmZzLXBhZ2UtY29udGVudCB7XG4gICAgZmxleDogMTtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgfVxufVxuPC9zdHlsZT5cbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiLyoqXG4gKiBAbW9kdWxlIExSVUNhY2hlXG4gKi9cbmNvbnN0IHBlcmYgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgcGVyZm9ybWFuY2UgJiZcbiAgICB0eXBlb2YgcGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nXG4gICAgPyBwZXJmb3JtYW5jZVxuICAgIDogRGF0ZTtcbmNvbnN0IHdhcm5lZCA9IG5ldyBTZXQoKTtcbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuY29uc3QgUFJPQ0VTUyA9ICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgISFwcm9jZXNzID8gcHJvY2VzcyA6IHt9KTtcbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuY29uc3QgZW1pdFdhcm5pbmcgPSAobXNnLCB0eXBlLCBjb2RlLCBmbikgPT4ge1xuICAgIHR5cGVvZiBQUk9DRVNTLmVtaXRXYXJuaW5nID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gUFJPQ0VTUy5lbWl0V2FybmluZyhtc2csIHR5cGUsIGNvZGUsIGZuKVxuICAgICAgICA6IGNvbnNvbGUuZXJyb3IoYFske2NvZGV9XSAke3R5cGV9OiAke21zZ31gKTtcbn07XG5sZXQgQUMgPSBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlcjtcbmxldCBBUyA9IGdsb2JhbFRoaXMuQWJvcnRTaWduYWw7XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbmlmICh0eXBlb2YgQUMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy9AdHMtaWdub3JlXG4gICAgQVMgPSBjbGFzcyBBYm9ydFNpZ25hbCB7XG4gICAgICAgIG9uYWJvcnQ7XG4gICAgICAgIF9vbmFib3J0ID0gW107XG4gICAgICAgIHJlYXNvbjtcbiAgICAgICAgYWJvcnRlZCA9IGZhbHNlO1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKF8sIGZuKSB7XG4gICAgICAgICAgICB0aGlzLl9vbmFib3J0LnB1c2goZm4pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBBQyA9IGNsYXNzIEFib3J0Q29udHJvbGxlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgd2FybkFDUG9seWZpbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWwgPSBuZXcgQVMoKTtcbiAgICAgICAgYWJvcnQocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaWduYWwuYWJvcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMuc2lnbmFsLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5zaWduYWwuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGZvciAoY29uc3QgZm4gb2YgdGhpcy5zaWduYWwuX29uYWJvcnQpIHtcbiAgICAgICAgICAgICAgICBmbihyZWFzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zaWduYWwub25hYm9ydD8uKHJlYXNvbik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCBwcmludEFDUG9seWZpbGxXYXJuaW5nID0gUFJPQ0VTUy5lbnY/LkxSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORyAhPT0gJzEnO1xuICAgIGNvbnN0IHdhcm5BQ1BvbHlmaWxsID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXByaW50QUNQb2x5ZmlsbFdhcm5pbmcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHByaW50QUNQb2x5ZmlsbFdhcm5pbmcgPSBmYWxzZTtcbiAgICAgICAgZW1pdFdhcm5pbmcoJ0Fib3J0Q29udHJvbGxlciBpcyBub3QgZGVmaW5lZC4gSWYgdXNpbmcgbHJ1LWNhY2hlIGluICcgK1xuICAgICAgICAgICAgJ25vZGUgMTQsIGxvYWQgYW4gQWJvcnRDb250cm9sbGVyIHBvbHlmaWxsIGZyb20gdGhlICcgK1xuICAgICAgICAgICAgJ2Bub2RlLWFib3J0LWNvbnRyb2xsZXJgIHBhY2thZ2UuIEEgbWluaW1hbCBwb2x5ZmlsbCBpcyAnICtcbiAgICAgICAgICAgICdwcm92aWRlZCBmb3IgdXNlIGJ5IExSVUNhY2hlLmZldGNoKCksIGJ1dCBpdCBzaG91bGQgbm90IGJlICcgK1xuICAgICAgICAgICAgJ3JlbGllZCB1cG9uIGluIG90aGVyIGNvbnRleHRzIChlZywgcGFzc2luZyBpdCB0byBvdGhlciBBUElzIHRoYXQgJyArXG4gICAgICAgICAgICAndXNlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBtaWdodCBoYXZlIHVuZGVzaXJhYmxlIGVmZmVjdHMpLiAnICtcbiAgICAgICAgICAgICdZb3UgbWF5IGRpc2FibGUgdGhpcyB3aXRoIExSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORz0xIGluIHRoZSBlbnYuJywgJ05PX0FCT1JUX0NPTlRST0xMRVInLCAnRU5PVFNVUCcsIHdhcm5BQ1BvbHlmaWxsKTtcbiAgICB9O1xufVxuLyogYzggaWdub3JlIHN0b3AgKi9cbmNvbnN0IHNob3VsZFdhcm4gPSAoY29kZSkgPT4gIXdhcm5lZC5oYXMoY29kZSk7XG5jb25zdCBUWVBFID0gU3ltYm9sKCd0eXBlJyk7XG5jb25zdCBpc1Bvc0ludCA9IChuKSA9PiBuICYmIG4gPT09IE1hdGguZmxvb3IobikgJiYgbiA+IDAgJiYgaXNGaW5pdGUobik7XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbi8vIFRoaXMgaXMgYSBsaXR0bGUgYml0IHJpZGljdWxvdXMsIHRiaC5cbi8vIFRoZSBtYXhpbXVtIGFycmF5IGxlbmd0aCBpcyAyXjMyLTEgb3IgdGhlcmVhYm91dHMgb24gbW9zdCBKUyBpbXBscy5cbi8vIEFuZCB3ZWxsIGJlZm9yZSB0aGF0IHBvaW50LCB5b3UncmUgY2FjaGluZyB0aGUgZW50aXJlIHdvcmxkLCBJIG1lYW4sXG4vLyB0aGF0J3MgfjMyR0Igb2YganVzdCBpbnRlZ2VycyBmb3IgdGhlIG5leHQvcHJldiBsaW5rcywgcGx1cyB3aGF0ZXZlclxuLy8gZWxzZSB0byBob2xkIHRoYXQgbWFueSBrZXlzIGFuZCB2YWx1ZXMuICBKdXN0IGZpbGxpbmcgdGhlIG1lbW9yeSB3aXRoXG4vLyB6ZXJvZXMgYXQgaW5pdCB0aW1lIGlzIGJydXRhbCB3aGVuIHlvdSBnZXQgdGhhdCBiaWcuXG4vLyBCdXQgd2h5IG5vdCBiZSBjb21wbGV0ZT9cbi8vIE1heWJlIGluIHRoZSBmdXR1cmUsIHRoZXNlIGxpbWl0cyB3aWxsIGhhdmUgZXhwYW5kZWQuXG5jb25zdCBnZXRVaW50QXJyYXkgPSAobWF4KSA9PiAhaXNQb3NJbnQobWF4KVxuICAgID8gbnVsbFxuICAgIDogbWF4IDw9IE1hdGgucG93KDIsIDgpXG4gICAgICAgID8gVWludDhBcnJheVxuICAgICAgICA6IG1heCA8PSBNYXRoLnBvdygyLCAxNilcbiAgICAgICAgICAgID8gVWludDE2QXJyYXlcbiAgICAgICAgICAgIDogbWF4IDw9IE1hdGgucG93KDIsIDMyKVxuICAgICAgICAgICAgICAgID8gVWludDMyQXJyYXlcbiAgICAgICAgICAgICAgICA6IG1heCA8PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuICAgICAgICAgICAgICAgICAgICA/IFplcm9BcnJheVxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4vKiBjOCBpZ25vcmUgc3RvcCAqL1xuY2xhc3MgWmVyb0FycmF5IGV4dGVuZHMgQXJyYXkge1xuICAgIGNvbnN0cnVjdG9yKHNpemUpIHtcbiAgICAgICAgc3VwZXIoc2l6ZSk7XG4gICAgICAgIHRoaXMuZmlsbCgwKTtcbiAgICB9XG59XG5jbGFzcyBTdGFjayB7XG4gICAgaGVhcDtcbiAgICBsZW5ndGg7XG4gICAgLy8gcHJpdmF0ZSBjb25zdHJ1Y3RvclxuICAgIHN0YXRpYyAjY29uc3RydWN0aW5nID0gZmFsc2U7XG4gICAgc3RhdGljIGNyZWF0ZShtYXgpIHtcbiAgICAgICAgY29uc3QgSGVhcENscyA9IGdldFVpbnRBcnJheShtYXgpO1xuICAgICAgICBpZiAoIUhlYXBDbHMpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIFN0YWNrLiNjb25zdHJ1Y3RpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBzID0gbmV3IFN0YWNrKG1heCwgSGVhcENscyk7XG4gICAgICAgIFN0YWNrLiNjb25zdHJ1Y3RpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG1heCwgSGVhcENscykge1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKCFTdGFjay4jY29uc3RydWN0aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnN0YW50aWF0ZSBTdGFjayB1c2luZyBTdGFjay5jcmVhdGUobiknKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB0aGlzLmhlYXAgPSBuZXcgSGVhcENscyhtYXgpO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIHB1c2gobikge1xuICAgICAgICB0aGlzLmhlYXBbdGhpcy5sZW5ndGgrK10gPSBuO1xuICAgIH1cbiAgICBwb3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXBbLS10aGlzLmxlbmd0aF07XG4gICAgfVxufVxuLyoqXG4gKiBEZWZhdWx0IGV4cG9ydCwgdGhlIHRoaW5nIHlvdSdyZSB1c2luZyB0aGlzIG1vZHVsZSB0byBnZXQuXG4gKlxuICogVGhlIGBLYCBhbmQgYFZgIHR5cGVzIGRlZmluZSB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlcywgcmVzcGVjdGl2ZWx5LiBUaGVcbiAqIG9wdGlvbmFsIGBGQ2AgdHlwZSBkZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBgY29udGV4dGAgb2JqZWN0IHBhc3NlZCB0b1xuICogYGNhY2hlLmZldGNoKClgIGFuZCBgY2FjaGUubWVtbygpYC5cbiAqXG4gKiBLZXlzIGFuZCB2YWx1ZXMgKiptdXN0IG5vdCoqIGJlIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBBbGwgcHJvcGVydGllcyBmcm9tIHRoZSBvcHRpb25zIG9iamVjdCAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIGBtYXhgLFxuICogYG1heFNpemVgLCBgZmV0Y2hNZXRob2RgLCBgbWVtb01ldGhvZGAsIGBkaXNwb3NlYCBhbmQgYGRpc3Bvc2VBZnRlcmApIGFyZVxuICogYWRkZWQgYXMgbm9ybWFsIHB1YmxpYyBtZW1iZXJzLiAoVGhlIGxpc3RlZCBvcHRpb25zIGFyZSByZWFkLW9ubHkgZ2V0dGVycy4pXG4gKlxuICogQ2hhbmdpbmcgYW55IG9mIHRoZXNlIHdpbGwgYWx0ZXIgdGhlIGRlZmF1bHRzIGZvciBzdWJzZXF1ZW50IG1ldGhvZCBjYWxscy5cbiAqL1xuZXhwb3J0IGNsYXNzIExSVUNhY2hlIHtcbiAgICAvLyBvcHRpb25zIHRoYXQgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dCBkaXNhc3RlclxuICAgICNtYXg7XG4gICAgI21heFNpemU7XG4gICAgI2Rpc3Bvc2U7XG4gICAgI2Rpc3Bvc2VBZnRlcjtcbiAgICAjZmV0Y2hNZXRob2Q7XG4gICAgI21lbW9NZXRob2Q7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnR0bH1cbiAgICAgKi9cbiAgICB0dGw7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnR0bFJlc29sdXRpb259XG4gICAgICovXG4gICAgdHRsUmVzb2x1dGlvbjtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudHRsQXV0b3B1cmdlfVxuICAgICAqL1xuICAgIHR0bEF1dG9wdXJnZTtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudXBkYXRlQWdlT25HZXR9XG4gICAgICovXG4gICAgdXBkYXRlQWdlT25HZXQ7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnVwZGF0ZUFnZU9uSGFzfVxuICAgICAqL1xuICAgIHVwZGF0ZUFnZU9uSGFzO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlfVxuICAgICAqL1xuICAgIGFsbG93U3RhbGU7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vRGlzcG9zZU9uU2V0fVxuICAgICAqL1xuICAgIG5vRGlzcG9zZU9uU2V0O1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5ub1VwZGF0ZVRUTH1cbiAgICAgKi9cbiAgICBub1VwZGF0ZVRUTDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UubWF4RW50cnlTaXplfVxuICAgICAqL1xuICAgIG1heEVudHJ5U2l6ZTtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uuc2l6ZUNhbGN1bGF0aW9ufVxuICAgICAqL1xuICAgIHNpemVDYWxjdWxhdGlvbjtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9EZWxldGVPbkZldGNoUmVqZWN0aW9ufVxuICAgICAqL1xuICAgIG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9EZWxldGVPblN0YWxlR2V0fVxuICAgICAqL1xuICAgIG5vRGVsZXRlT25TdGFsZUdldDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydH1cbiAgICAgKi9cbiAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0O1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbn1cbiAgICAgKi9cbiAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbjtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuaWdub3JlRmV0Y2hBYm9ydH1cbiAgICAgKi9cbiAgICBpZ25vcmVGZXRjaEFib3J0O1xuICAgIC8vIGNvbXB1dGVkIHByb3BlcnRpZXNcbiAgICAjc2l6ZTtcbiAgICAjY2FsY3VsYXRlZFNpemU7XG4gICAgI2tleU1hcDtcbiAgICAja2V5TGlzdDtcbiAgICAjdmFsTGlzdDtcbiAgICAjbmV4dDtcbiAgICAjcHJldjtcbiAgICAjaGVhZDtcbiAgICAjdGFpbDtcbiAgICAjZnJlZTtcbiAgICAjZGlzcG9zZWQ7XG4gICAgI3NpemVzO1xuICAgICNzdGFydHM7XG4gICAgI3R0bHM7XG4gICAgI2hhc0Rpc3Bvc2U7XG4gICAgI2hhc0ZldGNoTWV0aG9kO1xuICAgICNoYXNEaXNwb3NlQWZ0ZXI7XG4gICAgLyoqXG4gICAgICogRG8gbm90IGNhbGwgdGhpcyBtZXRob2QgdW5sZXNzIHlvdSBuZWVkIHRvIGluc3BlY3QgdGhlXG4gICAgICogaW5uZXIgd29ya2luZ3Mgb2YgdGhlIGNhY2hlLiAgSWYgYW55dGhpbmcgcmV0dXJuZWQgYnkgdGhpc1xuICAgICAqIG9iamVjdCBpcyBtb2RpZmllZCBpbiBhbnkgd2F5LCBzdHJhbmdlIGJyZWFrYWdlIG1heSBvY2N1ci5cbiAgICAgKlxuICAgICAqIFRoZXNlIGZpZWxkcyBhcmUgcHJpdmF0ZSBmb3IgYSByZWFzb24hXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgdW5zYWZlRXhwb3NlSW50ZXJuYWxzKGMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8vIHByb3BlcnRpZXNcbiAgICAgICAgICAgIHN0YXJ0czogYy4jc3RhcnRzLFxuICAgICAgICAgICAgdHRsczogYy4jdHRscyxcbiAgICAgICAgICAgIHNpemVzOiBjLiNzaXplcyxcbiAgICAgICAgICAgIGtleU1hcDogYy4ja2V5TWFwLFxuICAgICAgICAgICAga2V5TGlzdDogYy4ja2V5TGlzdCxcbiAgICAgICAgICAgIHZhbExpc3Q6IGMuI3ZhbExpc3QsXG4gICAgICAgICAgICBuZXh0OiBjLiNuZXh0LFxuICAgICAgICAgICAgcHJldjogYy4jcHJldixcbiAgICAgICAgICAgIGdldCBoZWFkKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjLiNoZWFkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCB0YWlsKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjLiN0YWlsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZyZWU6IGMuI2ZyZWUsXG4gICAgICAgICAgICAvLyBtZXRob2RzXG4gICAgICAgICAgICBpc0JhY2tncm91bmRGZXRjaDogKHApID0+IGMuI2lzQmFja2dyb3VuZEZldGNoKHApLFxuICAgICAgICAgICAgYmFja2dyb3VuZEZldGNoOiAoaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpID0+IGMuI2JhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgY29udGV4dCksXG4gICAgICAgICAgICBtb3ZlVG9UYWlsOiAoaW5kZXgpID0+IGMuI21vdmVUb1RhaWwoaW5kZXgpLFxuICAgICAgICAgICAgaW5kZXhlczogKG9wdGlvbnMpID0+IGMuI2luZGV4ZXMob3B0aW9ucyksXG4gICAgICAgICAgICByaW5kZXhlczogKG9wdGlvbnMpID0+IGMuI3JpbmRleGVzKG9wdGlvbnMpLFxuICAgICAgICAgICAgaXNTdGFsZTogKGluZGV4KSA9PiBjLiNpc1N0YWxlKGluZGV4KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gUHJvdGVjdGVkIHJlYWQtb25seSBtZW1iZXJzXG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm1heH0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgbWF4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWF4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UubWF4U2l6ZX0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgbWF4U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21heFNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjb21wdXRlZCBzaXplIG9mIGl0ZW1zIGluIHRoZSBjYWNoZSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBjYWxjdWxhdGVkU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NhbGN1bGF0ZWRTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIHN0b3JlZCBpbiB0aGUgY2FjaGUgKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgZmV0Y2hNZXRob2QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZXRjaE1ldGhvZDtcbiAgICB9XG4gICAgZ2V0IG1lbW9NZXRob2QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNtZW1vTWV0aG9kO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZGlzcG9zZX0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgZGlzcG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5kaXNwb3NlQWZ0ZXJ9IChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IGRpc3Bvc2VBZnRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VBZnRlcjtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IG1heCA9IDAsIHR0bCwgdHRsUmVzb2x1dGlvbiA9IDEsIHR0bEF1dG9wdXJnZSwgdXBkYXRlQWdlT25HZXQsIHVwZGF0ZUFnZU9uSGFzLCBhbGxvd1N0YWxlLCBkaXNwb3NlLCBkaXNwb3NlQWZ0ZXIsIG5vRGlzcG9zZU9uU2V0LCBub1VwZGF0ZVRUTCwgbWF4U2l6ZSA9IDAsIG1heEVudHJ5U2l6ZSA9IDAsIHNpemVDYWxjdWxhdGlvbiwgZmV0Y2hNZXRob2QsIG1lbW9NZXRob2QsIG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiwgbm9EZWxldGVPblN0YWxlR2V0LCBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiwgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCwgaWdub3JlRmV0Y2hBYm9ydCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChtYXggIT09IDAgJiYgIWlzUG9zSW50KG1heCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heCBvcHRpb24gbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBVaW50QXJyYXkgPSBtYXggPyBnZXRVaW50QXJyYXkobWF4KSA6IEFycmF5O1xuICAgICAgICBpZiAoIVVpbnRBcnJheSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCB2YWx1ZTogJyArIG1heCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jbWF4ID0gbWF4O1xuICAgICAgICB0aGlzLiNtYXhTaXplID0gbWF4U2l6ZTtcbiAgICAgICAgdGhpcy5tYXhFbnRyeVNpemUgPSBtYXhFbnRyeVNpemUgfHwgdGhpcy4jbWF4U2l6ZTtcbiAgICAgICAgdGhpcy5zaXplQ2FsY3VsYXRpb24gPSBzaXplQ2FsY3VsYXRpb247XG4gICAgICAgIGlmICh0aGlzLnNpemVDYWxjdWxhdGlvbikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLiNtYXhTaXplICYmICF0aGlzLm1heEVudHJ5U2l6ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Nhbm5vdCBzZXQgc2l6ZUNhbGN1bGF0aW9uIHdpdGhvdXQgc2V0dGluZyBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNpemVDYWxjdWxhdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemVDYWxjdWxhdGlvbiBzZXQgdG8gbm9uLWZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lbW9NZXRob2QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIG1lbW9NZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21lbW9NZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIGlmIGRlZmluZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNtZW1vTWV0aG9kID0gbWVtb01ldGhvZDtcbiAgICAgICAgaWYgKGZldGNoTWV0aG9kICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBmZXRjaE1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmV0Y2hNZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIGlmIHNwZWNpZmllZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2ZldGNoTWV0aG9kID0gZmV0Y2hNZXRob2Q7XG4gICAgICAgIHRoaXMuI2hhc0ZldGNoTWV0aG9kID0gISFmZXRjaE1ldGhvZDtcbiAgICAgICAgdGhpcy4ja2V5TWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLiNrZXlMaXN0ID0gbmV3IEFycmF5KG1heCkuZmlsbCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLiN2YWxMaXN0ID0gbmV3IEFycmF5KG1heCkuZmlsbCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLiNuZXh0ID0gbmV3IFVpbnRBcnJheShtYXgpO1xuICAgICAgICB0aGlzLiNwcmV2ID0gbmV3IFVpbnRBcnJheShtYXgpO1xuICAgICAgICB0aGlzLiNoZWFkID0gMDtcbiAgICAgICAgdGhpcy4jdGFpbCA9IDA7XG4gICAgICAgIHRoaXMuI2ZyZWUgPSBTdGFjay5jcmVhdGUobWF4KTtcbiAgICAgICAgdGhpcy4jc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplID0gMDtcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlID0gZGlzcG9zZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2VBZnRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyID0gZGlzcG9zZUFmdGVyO1xuICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2hhc0Rpc3Bvc2UgPSAhIXRoaXMuI2Rpc3Bvc2U7XG4gICAgICAgIHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciA9ICEhdGhpcy4jZGlzcG9zZUFmdGVyO1xuICAgICAgICB0aGlzLm5vRGlzcG9zZU9uU2V0ID0gISFub0Rpc3Bvc2VPblNldDtcbiAgICAgICAgdGhpcy5ub1VwZGF0ZVRUTCA9ICEhbm9VcGRhdGVUVEw7XG4gICAgICAgIHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gISFub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgICAgIHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24gPSAhIWFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uO1xuICAgICAgICB0aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQgPSAhIWFsbG93U3RhbGVPbkZldGNoQWJvcnQ7XG4gICAgICAgIHRoaXMuaWdub3JlRmV0Y2hBYm9ydCA9ICEhaWdub3JlRmV0Y2hBYm9ydDtcbiAgICAgICAgLy8gTkI6IG1heEVudHJ5U2l6ZSBpcyBzZXQgdG8gbWF4U2l6ZSBpZiBpdCdzIHNldFxuICAgICAgICBpZiAodGhpcy5tYXhFbnRyeVNpemUgIT09IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNtYXhTaXplICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLiNtYXhTaXplKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXhTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQb3NJbnQodGhpcy5tYXhFbnRyeVNpemUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jaW5pdGlhbGl6ZVNpemVUcmFja2luZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb3dTdGFsZSA9ICEhYWxsb3dTdGFsZTtcbiAgICAgICAgdGhpcy5ub0RlbGV0ZU9uU3RhbGVHZXQgPSAhIW5vRGVsZXRlT25TdGFsZUdldDtcbiAgICAgICAgdGhpcy51cGRhdGVBZ2VPbkdldCA9ICEhdXBkYXRlQWdlT25HZXQ7XG4gICAgICAgIHRoaXMudXBkYXRlQWdlT25IYXMgPSAhIXVwZGF0ZUFnZU9uSGFzO1xuICAgICAgICB0aGlzLnR0bFJlc29sdXRpb24gPVxuICAgICAgICAgICAgaXNQb3NJbnQodHRsUmVzb2x1dGlvbikgfHwgdHRsUmVzb2x1dGlvbiA9PT0gMFxuICAgICAgICAgICAgICAgID8gdHRsUmVzb2x1dGlvblxuICAgICAgICAgICAgICAgIDogMTtcbiAgICAgICAgdGhpcy50dGxBdXRvcHVyZ2UgPSAhIXR0bEF1dG9wdXJnZTtcbiAgICAgICAgdGhpcy50dGwgPSB0dGwgfHwgMDtcbiAgICAgICAgaWYgKHRoaXMudHRsKSB7XG4gICAgICAgICAgICBpZiAoIWlzUG9zSW50KHRoaXMudHRsKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3R0bCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVUVExUcmFja2luZygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvIG5vdCBhbGxvdyBjb21wbGV0ZWx5IHVuYm91bmRlZCBjYWNoZXNcbiAgICAgICAgaWYgKHRoaXMuI21heCA9PT0gMCAmJiB0aGlzLnR0bCA9PT0gMCAmJiB0aGlzLiNtYXhTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBdCBsZWFzdCBvbmUgb2YgbWF4LCBtYXhTaXplLCBvciB0dGwgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHRsQXV0b3B1cmdlICYmICF0aGlzLiNtYXggJiYgIXRoaXMuI21heFNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSAnTFJVX0NBQ0hFX1VOQk9VTkRFRCc7XG4gICAgICAgICAgICBpZiAoc2hvdWxkV2Fybihjb2RlKSkge1xuICAgICAgICAgICAgICAgIHdhcm5lZC5hZGQoY29kZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gJ1RUTCBjYWNoaW5nIHdpdGhvdXQgdHRsQXV0b3B1cmdlLCBtYXgsIG9yIG1heFNpemUgY2FuICcgK1xuICAgICAgICAgICAgICAgICAgICAncmVzdWx0IGluIHVuYm91bmRlZCBtZW1vcnkgY29uc3VtcHRpb24uJztcbiAgICAgICAgICAgICAgICBlbWl0V2FybmluZyhtc2csICdVbmJvdW5kZWRDYWNoZVdhcm5pbmcnLCBjb2RlLCBMUlVDYWNoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbXMgbGVmdCBpbiB0aGUgaXRlbSdzIFRUTC4gSWYgaXRlbSBpcyBub3QgaW4gY2FjaGUsXG4gICAgICogcmV0dXJucyBgMGAuIFJldHVybnMgYEluZmluaXR5YCBpZiBpdGVtIGlzIGluIGNhY2hlIHdpdGhvdXQgYSBkZWZpbmVkIFRUTC5cbiAgICAgKi9cbiAgICBnZXRSZW1haW5pbmdUVEwoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNrZXlNYXAuaGFzKGtleSkgPyBJbmZpbml0eSA6IDA7XG4gICAgfVxuICAgICNpbml0aWFsaXplVFRMVHJhY2tpbmcoKSB7XG4gICAgICAgIGNvbnN0IHR0bHMgPSBuZXcgWmVyb0FycmF5KHRoaXMuI21heCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0cyA9IG5ldyBaZXJvQXJyYXkodGhpcy4jbWF4KTtcbiAgICAgICAgdGhpcy4jdHRscyA9IHR0bHM7XG4gICAgICAgIHRoaXMuI3N0YXJ0cyA9IHN0YXJ0cztcbiAgICAgICAgdGhpcy4jc2V0SXRlbVRUTCA9IChpbmRleCwgdHRsLCBzdGFydCA9IHBlcmYubm93KCkpID0+IHtcbiAgICAgICAgICAgIHN0YXJ0c1tpbmRleF0gPSB0dGwgIT09IDAgPyBzdGFydCA6IDA7XG4gICAgICAgICAgICB0dGxzW2luZGV4XSA9IHR0bDtcbiAgICAgICAgICAgIGlmICh0dGwgIT09IDAgJiYgdGhpcy50dGxBdXRvcHVyZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc1N0YWxlKGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKHRoaXMuI2tleUxpc3RbaW5kZXhdLCAnZXhwaXJlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB0dGwgKyAxKTtcbiAgICAgICAgICAgICAgICAvLyB1bnJlZigpIG5vdCBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3Jtc1xuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgICAgIGlmICh0LnVucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHQudW5yZWYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jdXBkYXRlSXRlbUFnZSA9IGluZGV4ID0+IHtcbiAgICAgICAgICAgIHN0YXJ0c1tpbmRleF0gPSB0dGxzW2luZGV4XSAhPT0gMCA/IHBlcmYubm93KCkgOiAwO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzdGF0dXNUVEwgPSAoc3RhdHVzLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR0bHNbaW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHRsID0gdHRsc1tpbmRleF07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICAgICAgaWYgKCF0dGwgfHwgIXN0YXJ0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgc3RhdHVzLnR0bCA9IHR0bDtcbiAgICAgICAgICAgICAgICBzdGF0dXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgICAgICAgICBzdGF0dXMubm93ID0gY2FjaGVkTm93IHx8IGdldE5vdygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFnZSA9IHN0YXR1cy5ub3cgLSBzdGFydDtcbiAgICAgICAgICAgICAgICBzdGF0dXMucmVtYWluaW5nVFRMID0gdHRsIC0gYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBkZWJvdW5jZSBjYWxscyB0byBwZXJmLm5vdygpIHRvIDFzIHNvIHdlJ3JlIG5vdCBoaXR0aW5nXG4gICAgICAgIC8vIHRoYXQgY29zdGx5IGNhbGwgcmVwZWF0ZWRseS5cbiAgICAgICAgbGV0IGNhY2hlZE5vdyA9IDA7XG4gICAgICAgIGNvbnN0IGdldE5vdyA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBwZXJmLm5vdygpO1xuICAgICAgICAgICAgaWYgKHRoaXMudHRsUmVzb2x1dGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICBjYWNoZWROb3cgPSBuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBzZXRUaW1lb3V0KCgpID0+IChjYWNoZWROb3cgPSAwKSwgdGhpcy50dGxSZXNvbHV0aW9uKTtcbiAgICAgICAgICAgICAgICAvLyBub3QgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXNcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICBpZiAodC51bnJlZikge1xuICAgICAgICAgICAgICAgICAgICB0LnVucmVmKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRSZW1haW5pbmdUVEwgPSBrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHRsID0gdHRsc1tpbmRleF07XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHN0YXJ0c1tpbmRleF07XG4gICAgICAgICAgICBpZiAoIXR0bCB8fCAhc3RhcnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhZ2UgPSAoY2FjaGVkTm93IHx8IGdldE5vdygpKSAtIHN0YXJ0O1xuICAgICAgICAgICAgcmV0dXJuIHR0bCAtIGFnZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jaXNTdGFsZSA9IGluZGV4ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBzdGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgdCA9IHR0bHNbaW5kZXhdO1xuICAgICAgICAgICAgcmV0dXJuICEhdCAmJiAhIXMgJiYgKGNhY2hlZE5vdyB8fCBnZXROb3coKSkgLSBzID4gdDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gY29uZGl0aW9uYWxseSBzZXQgcHJpdmF0ZSBtZXRob2RzIHJlbGF0ZWQgdG8gVFRMXG4gICAgI3VwZGF0ZUl0ZW1BZ2UgPSAoKSA9PiB7IH07XG4gICAgI3N0YXR1c1RUTCA9ICgpID0+IHsgfTtcbiAgICAjc2V0SXRlbVRUTCA9ICgpID0+IHsgfTtcbiAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICNpc1N0YWxlID0gKCkgPT4gZmFsc2U7XG4gICAgI2luaXRpYWxpemVTaXplVHJhY2tpbmcoKSB7XG4gICAgICAgIGNvbnN0IHNpemVzID0gbmV3IFplcm9BcnJheSh0aGlzLiNtYXgpO1xuICAgICAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuI3NpemVzID0gc2l6ZXM7XG4gICAgICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplID0gaW5kZXggPT4ge1xuICAgICAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgLT0gc2l6ZXNbaW5kZXhdO1xuICAgICAgICAgICAgc2l6ZXNbaW5kZXhdID0gMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jcmVxdWlyZVNpemUgPSAoaywgdiwgc2l6ZSwgc2l6ZUNhbGN1bGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAvLyBwcm92aXNpb25hbGx5IGFjY2VwdCBiYWNrZ3JvdW5kIGZldGNoZXMuXG4gICAgICAgICAgICAvLyBhY3R1YWwgdmFsdWUgc2l6ZSB3aWxsIGJlIGNoZWNrZWQgd2hlbiB0aGV5IHJldHVybi5cbiAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1Bvc0ludChzaXplKSkge1xuICAgICAgICAgICAgICAgIGlmIChzaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzaXplQ2FsY3VsYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemVDYWxjdWxhdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzaXplID0gc2l6ZUNhbGN1bGF0aW9uKHYsIGspO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUG9zSW50KHNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHNpemUgdmFsdWUgKG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcikuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1doZW4gbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUgaXMgdXNlZCwgc2l6ZUNhbGN1bGF0aW9uICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ29yIHNpemUgbXVzdCBiZSBzZXQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI2FkZEl0ZW1TaXplID0gKGluZGV4LCBzaXplLCBzdGF0dXMpID0+IHtcbiAgICAgICAgICAgIHNpemVzW2luZGV4XSA9IHNpemU7XG4gICAgICAgICAgICBpZiAodGhpcy4jbWF4U2l6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB0aGlzLiNtYXhTaXplIC0gc2l6ZXNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLiNjYWxjdWxhdGVkU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZXZpY3QodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgKz0gc2l6ZXNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5lbnRyeVNpemUgPSBzaXplO1xuICAgICAgICAgICAgICAgIHN0YXR1cy50b3RhbENhbGN1bGF0ZWRTaXplID0gdGhpcy4jY2FsY3VsYXRlZFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgICNyZW1vdmVJdGVtU2l6ZSA9IF9pID0+IHsgfTtcbiAgICAjYWRkSXRlbVNpemUgPSAoX2ksIF9zLCBfc3QpID0+IHsgfTtcbiAgICAjcmVxdWlyZVNpemUgPSAoX2ssIF92LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pID0+IHtcbiAgICAgICAgaWYgKHNpemUgfHwgc2l6ZUNhbGN1bGF0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcbiAgICAqI2luZGV4ZXMoeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgICAgICBpZiAodGhpcy4jc2l6ZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuI3RhaWw7IHRydWU7KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLiNpc1ZhbGlkSW5kZXgoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd1N0YWxlIHx8ICF0aGlzLiNpc1N0YWxlKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpID09PSB0aGlzLiNoZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuI3ByZXZbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICojcmluZGV4ZXMoeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgICAgICBpZiAodGhpcy4jc2l6ZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuI2hlYWQ7IHRydWU7KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLiNpc1ZhbGlkSW5kZXgoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd1N0YWxlIHx8ICF0aGlzLiNpc1N0YWxlKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpID09PSB0aGlzLiN0YWlsKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuI25leHRbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICNpc1ZhbGlkSW5kZXgoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIChpbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0aGlzLiNrZXlNYXAuZ2V0KHRoaXMuI2tleUxpc3RbaW5kZXhdKSA9PT0gaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgYFtrZXksIHZhbHVlXWAgcGFpcnMsXG4gICAgICogaW4gb3JkZXIgZnJvbSBtb3N0IHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqZW50cmllcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbExpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIFt0aGlzLiNrZXlMaXN0W2ldLCB0aGlzLiN2YWxMaXN0W2ldXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZlcnNlIG9yZGVyIHZlcnNpb24gb2Yge0BsaW5rIExSVUNhY2hlLmVudHJpZXN9XG4gICAgICpcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgYFtrZXksIHZhbHVlXWAgcGFpcnMsXG4gICAgICogaW4gb3JkZXIgZnJvbSBsZWFzdCByZWNlbnRseSB1c2VkIHRvIG1vc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqcmVudHJpZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jdmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgdGhpcy4ja2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgW3RoaXMuI2tleUxpc3RbaV0sIHRoaXMuI3ZhbExpc3RbaV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGdlbmVyYXRvciB5aWVsZGluZyB0aGUga2V5cyBpbiB0aGUgY2FjaGUsXG4gICAgICogaW4gb3JkZXIgZnJvbSBtb3N0IHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqa2V5cygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaV07XG4gICAgICAgICAgICBpZiAoayAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZlcnNlIG9yZGVyIHZlcnNpb24gb2Yge0BsaW5rIExSVUNhY2hlLmtleXN9XG4gICAgICpcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIGtleXMgaW4gdGhlIGNhY2hlLFxuICAgICAqIGluIG9yZGVyIGZyb20gbGVhc3QgcmVjZW50bHkgdXNlZCB0byBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKnJrZXlzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaV07XG4gICAgICAgICAgICBpZiAoayAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIHZhbHVlcyBpbiB0aGUgY2FjaGUsXG4gICAgICogaW4gb3JkZXIgZnJvbSBtb3N0IHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqdmFsdWVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludmVyc2Ugb3JkZXIgdmVyc2lvbiBvZiB7QGxpbmsgTFJVQ2FjaGUudmFsdWVzfVxuICAgICAqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSB2YWx1ZXMgaW4gdGhlIGNhY2hlLFxuICAgICAqIGluIG9yZGVyIGZyb20gbGVhc3QgcmVjZW50bHkgdXNlZCB0byBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKnJ2YWx1ZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGluZyBvdmVyIHRoZSBjYWNoZSBpdHNlbGYgeWllbGRzIHRoZSBzYW1lIHJlc3VsdHMgYXNcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuZW50cmllc31cbiAgICAgKi9cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIFN0cmluZyB2YWx1ZSB0aGF0IGlzIHVzZWQgaW4gdGhlIGNyZWF0aW9uIG9mIHRoZSBkZWZhdWx0IHN0cmluZ1xuICAgICAqIGRlc2NyaXB0aW9uIG9mIGFuIG9iamVjdC4gQ2FsbGVkIGJ5IHRoZSBidWlsdC1pbiBtZXRob2RcbiAgICAgKiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gICAgICovXG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnTFJVQ2FjaGUnO1xuICAgIC8qKlxuICAgICAqIEZpbmQgYSB2YWx1ZSBmb3Igd2hpY2ggdGhlIHN1cHBsaWVkIGZuIG1ldGhvZCByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLFxuICAgICAqIHNpbWlsYXIgdG8gYEFycmF5LmZpbmQoKWAuIGZuIGlzIGNhbGxlZCBhcyBgZm4odmFsdWUsIGtleSwgY2FjaGUpYC5cbiAgICAgKi9cbiAgICBmaW5kKGZuLCBnZXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZm4odmFsdWUsIHRoaXMuI2tleUxpc3RbaV0sIHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuI2tleUxpc3RbaV0sIGdldE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIG9uIGVhY2ggaXRlbSBpbiB0aGUgY2FjaGUsIGluIG9yZGVyIGZyb20gbW9zdFxuICAgICAqIHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKlxuICAgICAqIGBmbmAgaXMgY2FsbGVkIGFzIGBmbih2YWx1ZSwga2V5LCBjYWNoZSlgLlxuICAgICAqXG4gICAgICogSWYgYHRoaXNwYCBpcyBwcm92aWRlZCwgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGB0aGlzYC1jb250ZXh0IG9mXG4gICAgICogdGhlIHByb3ZpZGVkIG9iamVjdCwgb3IgdGhlIGNhY2hlIGlmIG5vIGB0aGlzcGAgb2JqZWN0IGlzIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogRG9lcyBub3QgdXBkYXRlIGFnZSBvciByZWNlbnR5IG9mIHVzZSwgb3IgaXRlcmF0ZSBvdmVyIHN0YWxlIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmb3JFYWNoKGZuLCB0aGlzcCA9IHRoaXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmbi5jYWxsKHRoaXNwLCB2YWx1ZSwgdGhpcy4ja2V5TGlzdFtpXSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMge0BsaW5rIExSVUNhY2hlLmZvckVhY2h9IGJ1dCBpdGVtcyBhcmUgaXRlcmF0ZWQgb3ZlciBpblxuICAgICAqIHJldmVyc2Ugb3JkZXIuICAoaWUsIGxlc3MgcmVjZW50bHkgdXNlZCBpdGVtcyBhcmUgaXRlcmF0ZWQgb3ZlciBmaXJzdC4pXG4gICAgICovXG4gICAgcmZvckVhY2goZm4sIHRoaXNwID0gdGhpcykge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmbi5jYWxsKHRoaXNwLCB2YWx1ZSwgdGhpcy4ja2V5TGlzdFtpXSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIGFueSBzdGFsZSBlbnRyaWVzLiBSZXR1cm5zIHRydWUgaWYgYW55dGhpbmcgd2FzIHJlbW92ZWQsXG4gICAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1cmdlU3RhbGUoKSB7XG4gICAgICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpc1N0YWxlKGkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKHRoaXMuI2tleUxpc3RbaV0sICdleHBpcmUnKTtcbiAgICAgICAgICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsZXRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBleHRlbmRlZCBpbmZvIGFib3V0IGEgZ2l2ZW4gZW50cnksIHRvIGdldCBpdHMgdmFsdWUsIHNpemUsIGFuZFxuICAgICAqIFRUTCBpbmZvIHNpbXVsdGFuZW91c2x5LiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBrZXkgaXMgbm90IHByZXNlbnQuXG4gICAgICpcbiAgICAgKiBVbmxpa2Uge0BsaW5rIExSVUNhY2hlI2R1bXB9LCB3aGljaCBpcyBkZXNpZ25lZCB0byBiZSBwb3J0YWJsZSBhbmQgc3Vydml2ZVxuICAgICAqIHNlcmlhbGl6YXRpb24sIHRoZSBgc3RhcnRgIHZhbHVlIGlzIGFsd2F5cyB0aGUgY3VycmVudCB0aW1lc3RhbXAsIGFuZCB0aGVcbiAgICAgKiBgdHRsYCBpcyBhIGNhbGN1bGF0ZWQgcmVtYWluaW5nIHRpbWUgdG8gbGl2ZSAobmVnYXRpdmUgaWYgZXhwaXJlZCkuXG4gICAgICpcbiAgICAgKiBBbHdheXMgcmV0dXJucyBzdGFsZSB2YWx1ZXMsIGlmIHRoZWlyIGluZm8gaXMgZm91bmQgaW4gdGhlIGNhY2hlLCBzbyBiZVxuICAgICAqIHN1cmUgdG8gY2hlY2sgZm9yIGV4cGlyYXRpb25zIChpZSwgYSBuZWdhdGl2ZSB7QGxpbmsgTFJVQ2FjaGUuRW50cnkjdHRsfSlcbiAgICAgKiBpZiByZWxldmFudC5cbiAgICAgKi9cbiAgICBpbmZvKGtleSkge1xuICAgICAgICBjb25zdCBpID0gdGhpcy4ja2V5TWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoaSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgOiB2O1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0geyB2YWx1ZSB9O1xuICAgICAgICBpZiAodGhpcy4jdHRscyAmJiB0aGlzLiNzdGFydHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHR0bCA9IHRoaXMuI3R0bHNbaV07XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuI3N0YXJ0c1tpXTtcbiAgICAgICAgICAgIGlmICh0dGwgJiYgc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1haW4gPSB0dGwgLSAocGVyZi5ub3coKSAtIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICBlbnRyeS50dGwgPSByZW1haW47XG4gICAgICAgICAgICAgICAgZW50cnkuc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzaXplcykge1xuICAgICAgICAgICAgZW50cnkuc2l6ZSA9IHRoaXMuI3NpemVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIGFycmF5IG9mIFtrZXksIHtAbGluayBMUlVDYWNoZS5FbnRyeX1dIHR1cGxlcyB3aGljaCBjYW4gYmVcbiAgICAgKiBwYXNzZWQgdG8ge0BsaW5rIExSTFVDYWNoZSNsb2FkfS5cbiAgICAgKlxuICAgICAqIFRoZSBgc3RhcnRgIGZpZWxkcyBhcmUgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlIGBEYXRlLm5vdygpYFxuICAgICAqIHRpbWVzdGFtcCwgZXZlbiBpZiBgcGVyZm9ybWFuY2Uubm93KClgIGlzIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIFN0YWxlIGVudHJpZXMgYXJlIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgYGR1bXBgLCBldmVuIGlmXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGV9IGlzIGZhbHNlLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyByZXR1cm5zIGFuIGFjdHVhbCBhcnJheSwgbm90IGEgZ2VuZXJhdG9yLCBzbyBpdCBjYW4gYmUgbW9yZVxuICAgICAqIGVhc2lseSBwYXNzZWQgYXJvdW5kLlxuICAgICAqL1xuICAgIGR1bXAoKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuI2tleUxpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgICAgICA6IHY7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0geyB2YWx1ZSB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuI3R0bHMgJiYgdGhpcy4jc3RhcnRzKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudHRsID0gdGhpcy4jdHRsc1tpXTtcbiAgICAgICAgICAgICAgICAvLyBhbHdheXMgZHVtcCB0aGUgc3RhcnQgcmVsYXRpdmUgdG8gYSBwb3J0YWJsZSB0aW1lc3RhbXBcbiAgICAgICAgICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgICAgICAgICBjb25zdCBhZ2UgPSBwZXJmLm5vdygpIC0gdGhpcy4jc3RhcnRzW2ldO1xuICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC0gYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLiNzaXplcykge1xuICAgICAgICAgICAgICAgIGVudHJ5LnNpemUgPSB0aGlzLiNzaXplc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyci51bnNoaWZ0KFtrZXksIGVudHJ5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXQgdGhlIGNhY2hlIGFuZCBsb2FkIGluIHRoZSBpdGVtcyBpbiBlbnRyaWVzIGluIHRoZSBvcmRlciBsaXN0ZWQuXG4gICAgICpcbiAgICAgKiBUaGUgc2hhcGUgb2YgdGhlIHJlc3VsdGluZyBjYWNoZSBtYXkgYmUgZGlmZmVyZW50IGlmIHRoZSBzYW1lIG9wdGlvbnMgYXJlXG4gICAgICogbm90IHVzZWQgaW4gYm90aCBjYWNoZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYHN0YXJ0YCBmaWVsZHMgYXJlIGFzc3VtZWQgdG8gYmUgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlXG4gICAgICogYERhdGUubm93KClgIHRpbWVzdGFtcCwgZXZlbiBpZiBgcGVyZm9ybWFuY2Uubm93KClgIGlzIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBsb2FkKGFycikge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIGFycikge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgLy8gZW50cnkuc3RhcnQgaXMgYSBwb3J0YWJsZSB0aW1lc3RhbXAsIGJ1dCB3ZSBtYXkgYmUgdXNpbmdcbiAgICAgICAgICAgICAgICAvLyBub2RlJ3MgcGVyZm9ybWFuY2Uubm93KCksIHNvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0LCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gd2UgZ2V0IHRoZSBpbnRlbmRlZCByZW1haW5pbmcgVFRMLCBubyBtYXR0ZXIgaG93IGxvbmcgaXQnc1xuICAgICAgICAgICAgICAgIC8vIGJlZW4gb24gaWNlLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaXQncyBvayBmb3IgdGhpcyB0byBiZSBhIGJpdCBzbG93LCBpdCdzIGEgcmFyZSBvcGVyYXRpb24uXG4gICAgICAgICAgICAgICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGVudHJ5LnN0YXJ0O1xuICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0ID0gcGVyZi5ub3coKSAtIGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgZW50cnkudmFsdWUsIGVudHJ5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSB2YWx1ZSB0byB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBOb3RlOiBpZiBgdW5kZWZpbmVkYCBpcyBzcGVjaWZpZWQgYXMgYSB2YWx1ZSwgdGhpcyBpcyBhbiBhbGlhcyBmb3JcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUjZGVsZXRlfVxuICAgICAqXG4gICAgICogRmllbGRzIG9uIHRoZSB7QGxpbmsgTFJVQ2FjaGUuU2V0T3B0aW9uc30gb3B0aW9ucyBwYXJhbSB3aWxsIG92ZXJyaWRlXG4gICAgICogdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMgZm9yIHRoZSBzY29wZVxuICAgICAqIG9mIHRoaXMgc2luZ2xlIGBzZXQoKWAgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogSWYgYHN0YXJ0YCBpcyBwcm92aWRlZCwgdGhlbiB0aGF0IHdpbGwgc2V0IHRoZSBlZmZlY3RpdmUgc3RhcnRcbiAgICAgKiB0aW1lIGZvciB0aGUgVFRMIGNhbGN1bGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBtdXN0IGJlIGEgcHJldmlvdXNcbiAgICAgKiB2YWx1ZSBvZiBgcGVyZm9ybWFuY2Uubm93KClgIGlmIHN1cHBvcnRlZCwgb3IgYSBwcmV2aW91cyB2YWx1ZSBvZlxuICAgICAqIGBEYXRlLm5vdygpYCBpZiBub3QuXG4gICAgICpcbiAgICAgKiBPcHRpb25zIG9iamVjdCBtYXkgYWxzbyBpbmNsdWRlIGBzaXplYCwgd2hpY2ggd2lsbCBwcmV2ZW50XG4gICAgICogY2FsbGluZyB0aGUgYHNpemVDYWxjdWxhdGlvbmAgZnVuY3Rpb24gYW5kIGp1c3QgdXNlIHRoZSBzcGVjaWZpZWRcbiAgICAgKiBudW1iZXIgaWYgaXQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBhbmQgYG5vRGlzcG9zZU9uU2V0YCB3aGljaFxuICAgICAqIHdpbGwgcHJldmVudCBjYWxsaW5nIGEgYGRpc3Bvc2VgIGZ1bmN0aW9uIGluIHRoZSBjYXNlIG9mXG4gICAgICogb3ZlcndyaXRlcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBgc2l6ZWAgKG9yIHJldHVybiB2YWx1ZSBvZiBgc2l6ZUNhbGN1bGF0aW9uYCkgZm9yIGEgZ2l2ZW5cbiAgICAgKiBlbnRyeSBpcyBncmVhdGVyIHRoYW4gYG1heEVudHJ5U2l6ZWAsIHRoZW4gdGhlIGl0ZW0gd2lsbCBub3QgYmVcbiAgICAgKiBhZGRlZCB0byB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBXaWxsIHVwZGF0ZSB0aGUgcmVjZW5jeSBvZiB0aGUgZW50cnkuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgdmFsdWUgaXMgYHVuZGVmaW5lZGAsIHRoZW4gdGhpcyBpcyBhbiBhbGlhcyBmb3JcbiAgICAgKiBgY2FjaGUuZGVsZXRlKGtleSlgLiBgdW5kZWZpbmVkYCBpcyBuZXZlciBzdG9yZWQgaW4gdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIHNldChrLCB2LCBzZXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGUoayk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHR0bCA9IHRoaXMudHRsLCBzdGFydCwgbm9EaXNwb3NlT25TZXQgPSB0aGlzLm5vRGlzcG9zZU9uU2V0LCBzaXplQ2FsY3VsYXRpb24gPSB0aGlzLnNpemVDYWxjdWxhdGlvbiwgc3RhdHVzLCB9ID0gc2V0T3B0aW9ucztcbiAgICAgICAgbGV0IHsgbm9VcGRhdGVUVEwgPSB0aGlzLm5vVXBkYXRlVFRMIH0gPSBzZXRPcHRpb25zO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy4jcmVxdWlyZVNpemUoaywgdiwgc2V0T3B0aW9ucy5zaXplIHx8IDAsIHNpemVDYWxjdWxhdGlvbik7XG4gICAgICAgIC8vIGlmIHRoZSBpdGVtIGRvZXNuJ3QgZml0LCBkb24ndCBkbyBhbnl0aGluZ1xuICAgICAgICAvLyBOQjogbWF4RW50cnlTaXplIHNldCB0byBtYXhTaXplIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKHRoaXMubWF4RW50cnlTaXplICYmIHNpemUgPiB0aGlzLm1heEVudHJ5U2l6ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQgPSAnbWlzcyc7XG4gICAgICAgICAgICAgICAgc3RhdHVzLm1heEVudHJ5U2l6ZUV4Y2VlZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhhdmUgdG8gZGVsZXRlLCBpbiBjYXNlIHNvbWV0aGluZyBpcyB0aGVyZSBhbHJlYWR5LlxuICAgICAgICAgICAgdGhpcy4jZGVsZXRlKGssICdzZXQnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuI3NpemUgPT09IDAgPyB1bmRlZmluZWQgOiB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gYWRkaXRpb25cbiAgICAgICAgICAgIGluZGV4ID0gKHRoaXMuI3NpemUgPT09IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMuI3RhaWxcbiAgICAgICAgICAgICAgICA6IHRoaXMuI2ZyZWUubGVuZ3RoICE9PSAwXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy4jZnJlZS5wb3AoKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuI3NpemUgPT09IHRoaXMuI21heFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLiNldmljdChmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy4jc2l6ZSk7XG4gICAgICAgICAgICB0aGlzLiNrZXlMaXN0W2luZGV4XSA9IGs7XG4gICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IHY7XG4gICAgICAgICAgICB0aGlzLiNrZXlNYXAuc2V0KGssIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuI25leHRbdGhpcy4jdGFpbF0gPSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMuI3ByZXZbaW5kZXhdID0gdGhpcy4jdGFpbDtcbiAgICAgICAgICAgIHRoaXMuI3RhaWwgPSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMuI3NpemUrKztcbiAgICAgICAgICAgIHRoaXMuI2FkZEl0ZW1TaXplKGluZGV4LCBzaXplLCBzdGF0dXMpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICBzdGF0dXMuc2V0ID0gJ2FkZCc7XG4gICAgICAgICAgICBub1VwZGF0ZVRUTCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gdXBkYXRlXG4gICAgICAgICAgICB0aGlzLiNtb3ZlVG9UYWlsKGluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbCA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHYgIT09IG9sZFZhbCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNGZXRjaE1ldGhvZCAmJiB0aGlzLiNpc0JhY2tncm91bmRGZXRjaChvbGRWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZFZhbC5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ3JlcGxhY2VkJykpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IF9fc3RhbGVXaGlsZUZldGNoaW5nOiBzIH0gPSBvbGRWYWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzICE9PSB1bmRlZmluZWQgJiYgIW5vRGlzcG9zZU9uU2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2U/LihzLCBrLCAnc2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW3MsIGssICdzZXQnXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIW5vRGlzcG9zZU9uU2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4ob2xkVmFsLCBrLCAnc2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW29sZFZhbCwgaywgJ3NldCddKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLiNyZW1vdmVJdGVtU2l6ZShpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jYWRkSXRlbVNpemUoaW5kZXgsIHNpemUsIHN0YXR1cyk7XG4gICAgICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSB2O1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldCA9ICdyZXBsYWNlJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBvbGRWYWwgJiYgdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2gob2xkVmFsKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBvbGRWYWwuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogb2xkVmFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5vbGRWYWx1ZSA9IG9sZFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQgPSAndXBkYXRlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHRsICE9PSAwICYmICF0aGlzLiN0dGxzKSB7XG4gICAgICAgICAgICB0aGlzLiNpbml0aWFsaXplVFRMVHJhY2tpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jdHRscykge1xuICAgICAgICAgICAgaWYgKCFub1VwZGF0ZVRUTCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI3NldEl0ZW1UVEwoaW5kZXgsIHR0bCwgc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFub0Rpc3Bvc2VPblNldCAmJiB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgJiYgdGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWQ7XG4gICAgICAgICAgICBsZXQgdGFzaztcbiAgICAgICAgICAgIHdoaWxlICgodGFzayA9IGR0Py5zaGlmdCgpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmljdCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtLCByZXR1cm5pbmcgaXRzIHZhbHVlIG9yXG4gICAgICogYHVuZGVmaW5lZGAgaWYgY2FjaGUgaXMgZW1wdHkuXG4gICAgICovXG4gICAgcG9wKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuI3NpemUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLiN2YWxMaXN0W3RoaXMuI2hlYWRdO1xuICAgICAgICAgICAgICAgIHRoaXMuI2V2aWN0KHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuX19zdGFsZVdoaWxlRmV0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwuX19zdGFsZVdoaWxlRmV0Y2hpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHQgPSB0aGlzLiNkaXNwb3NlZDtcbiAgICAgICAgICAgICAgICBsZXQgdGFzaztcbiAgICAgICAgICAgICAgICB3aGlsZSAoKHRhc2sgPSBkdD8uc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyPy4oLi4udGFzayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICNldmljdChmcmVlKSB7XG4gICAgICAgIGNvbnN0IGhlYWQgPSB0aGlzLiNoZWFkO1xuICAgICAgICBjb25zdCBrID0gdGhpcy4ja2V5TGlzdFtoZWFkXTtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaGVhZF07XG4gICAgICAgIGlmICh0aGlzLiNoYXNGZXRjaE1ldGhvZCAmJiB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2V2aWN0ZWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy4jaGFzRGlzcG9zZSB8fCB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHYsIGssICdldmljdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFt2LCBrLCAnZXZpY3QnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcmVtb3ZlSXRlbVNpemUoaGVhZCk7XG4gICAgICAgIC8vIGlmIHdlIGFyZW4ndCBhYm91dCB0byB1c2UgdGhlIGluZGV4LCB0aGVuIG51bGwgdGhlc2Ugb3V0XG4gICAgICAgIGlmIChmcmVlKSB7XG4gICAgICAgICAgICB0aGlzLiNrZXlMaXN0W2hlYWRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtoZWFkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuI2ZyZWUucHVzaChoZWFkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc2l6ZSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI3RhaWwgPSAwO1xuICAgICAgICAgICAgdGhpcy4jZnJlZS5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI25leHRbaGVhZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4ja2V5TWFwLmRlbGV0ZShrKTtcbiAgICAgICAgdGhpcy4jc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaGVhZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBrZXkgaXMgaW4gdGhlIGNhY2hlLCB3aXRob3V0IHVwZGF0aW5nIHRoZSByZWNlbmN5IG9mIHVzZS5cbiAgICAgKiBXaWxsIHJldHVybiBmYWxzZSBpZiB0aGUgaXRlbSBpcyBzdGFsZSwgZXZlbiB0aG91Z2ggaXQgaXMgdGVjaG5pY2FsbHlcbiAgICAgKiBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBDaGVjayBpZiBhIGtleSBpcyBpbiB0aGUgY2FjaGUsIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHJlY2VuY3kgb2ZcbiAgICAgKiB1c2UuIEFnZSBpcyB1cGRhdGVkIGlmIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkhhc30gaXMgc2V0XG4gICAgICogdG8gYHRydWVgIGluIGVpdGhlciB0aGUgb3B0aW9ucyBvciB0aGUgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBXaWxsIHJldHVybiBgZmFsc2VgIGlmIHRoZSBpdGVtIGlzIHN0YWxlLCBldmVuIHRob3VnaCBpdCBpcyB0ZWNobmljYWxseSBpblxuICAgICAqIHRoZSBjYWNoZS4gVGhlIGRpZmZlcmVuY2UgY2FuIGJlIGRldGVybWluZWQgKGlmIGl0IG1hdHRlcnMpIGJ5IHVzaW5nIGFcbiAgICAgKiBgc3RhdHVzYCBhcmd1bWVudCwgYW5kIGluc3BlY3RpbmcgdGhlIGBoYXNgIGZpZWxkLlxuICAgICAqXG4gICAgICogV2lsbCBub3QgdXBkYXRlIGl0ZW0gYWdlIHVubGVzc1xuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkhhc30gaXMgc2V0LlxuICAgICAqL1xuICAgIGhhcyhrLCBoYXNPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyB1cGRhdGVBZ2VPbkhhcyA9IHRoaXMudXBkYXRlQWdlT25IYXMsIHN0YXR1cyB9ID0gaGFzT3B0aW9ucztcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpICYmXG4gICAgICAgICAgICAgICAgdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLiNpc1N0YWxlKGluZGV4KSkge1xuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVBZ2VPbkhhcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiN1cGRhdGVJdGVtQWdlKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuaGFzID0gJ2hpdCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuaGFzID0gJ3N0YWxlJztcbiAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBzdGF0dXMuaGFzID0gJ21pc3MnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlrZSB7QGxpbmsgTFJVQ2FjaGUjZ2V0fSBidXQgZG9lc24ndCB1cGRhdGUgcmVjZW5jeSBvciBkZWxldGUgc3RhbGVcbiAgICAgKiBpdGVtcy5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGl0ZW0gaXMgc3RhbGUsIHVubGVzc1xuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlfSBpcyBzZXQuXG4gICAgICovXG4gICAgcGVlayhrLCBwZWVrT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0gcGVla09wdGlvbnM7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICghYWxsb3dTdGFsZSAmJiB0aGlzLiNpc1N0YWxlKGluZGV4KSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgIC8vIGVpdGhlciBzdGFsZSBhbmQgYWxsb3dlZCwgb3IgZm9yY2luZyBhIHJlZnJlc2ggb2Ygbm9uLXN0YWxlIHZhbHVlXG4gICAgICAgIHJldHVybiB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiB2O1xuICAgIH1cbiAgICAjYmFja2dyb3VuZEZldGNoKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHYgPSBpbmRleCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWMgPSBuZXcgQUMoKTtcbiAgICAgICAgY29uc3QgeyBzaWduYWwgfSA9IG9wdGlvbnM7XG4gICAgICAgIC8vIHdoZW4vaWYgb3VyIEFDIHNpZ25hbHMsIHRoZW4gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlaXJzLlxuICAgICAgICBzaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gYWMuYWJvcnQoc2lnbmFsLnJlYXNvbiksIHtcbiAgICAgICAgICAgIHNpZ25hbDogYWMuc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZmV0Y2hPcHRzID0ge1xuICAgICAgICAgICAgc2lnbmFsOiBhYy5zaWduYWwsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2IgPSAodiwgdXBkYXRlQ2FjaGUgPSBmYWxzZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhYm9ydGVkIH0gPSBhYy5zaWduYWw7XG4gICAgICAgICAgICBjb25zdCBpZ25vcmVBYm9ydCA9IG9wdGlvbnMuaWdub3JlRmV0Y2hBYm9ydCAmJiB2ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hBYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hFcnJvciA9IGFjLnNpZ25hbC5yZWFzb247XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVBYm9ydClcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoQWJvcnRJZ25vcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhYm9ydGVkICYmICFpZ25vcmVBYm9ydCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2hGYWlsKGFjLnNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWl0aGVyIHdlIGRpZG4ndCBhYm9ydCwgYW5kIGFyZSBzdGlsbCBoZXJlLCBvciB3ZSBkaWQsIGFuZCBpZ25vcmVkXG4gICAgICAgICAgICBjb25zdCBiZiA9IHA7XG4gICAgICAgICAgICBpZiAodGhpcy4jdmFsTGlzdFtpbmRleF0gPT09IHApIHtcbiAgICAgICAgICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiZi5fX3N0YWxlV2hpbGVGZXRjaGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZShrLCAnZmV0Y2gnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoaywgdiwgZmV0Y2hPcHRzLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlYiA9IChlcikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hFcnJvciA9IGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZldGNoRmFpbChlcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZldGNoRmFpbCA9IChlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhYm9ydGVkIH0gPSBhYy5zaWduYWw7XG4gICAgICAgICAgICBjb25zdCBhbGxvd1N0YWxlQWJvcnRlZCA9IGFib3J0ZWQgJiYgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0O1xuICAgICAgICAgICAgY29uc3QgYWxsb3dTdGFsZSA9IGFsbG93U3RhbGVBYm9ydGVkIHx8IG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgICAgICAgICBjb25zdCBub0RlbGV0ZSA9IGFsbG93U3RhbGUgfHwgb3B0aW9ucy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgICAgICAgICBjb25zdCBiZiA9IHA7XG4gICAgICAgICAgICBpZiAodGhpcy4jdmFsTGlzdFtpbmRleF0gPT09IHApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhbGxvdyBzdGFsZSBvbiBmZXRjaCByZWplY3Rpb25zLCB0aGVuIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXRcbiAgICAgICAgICAgICAgICAvLyB0aGUgc3RhbGUgdmFsdWUgaXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUgd2hlbiB0aGUgZmV0Y2ggZmFpbHMuXG4gICAgICAgICAgICAgICAgY29uc3QgZGVsID0gIW5vRGVsZXRlIHx8IGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGRlbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNkZWxldGUoaywgJ2ZldGNoJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFhbGxvd1N0YWxlQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCByZXBsYWNlIHRoZSAqcHJvbWlzZSogd2l0aCB0aGUgc3RhbGUgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSBkb25lIHdpdGggdGhlIHByb21pc2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICAgICAgLy8gbGVhdmUgaXQgdW50b3VjaGVkIGlmIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIGFuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFib3J0ZWQgYmFja2dyb3VuZCBmZXRjaCB0aGF0IGhhc24ndCB5ZXQgcmV0dXJuZWQuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsbG93U3RhbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMgJiYgYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmYuX19yZXR1cm5lZCA9PT0gYmYpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGNhbGwgPSAocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZtcCA9IHRoaXMuI2ZldGNoTWV0aG9kPy4oaywgdiwgZmV0Y2hPcHRzKTtcbiAgICAgICAgICAgIGlmIChmbXAgJiYgZm1wIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIGZtcC50aGVuKHYgPT4gcmVzKHYgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHYpLCByZWopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWdub3JlZCwgd2UgZ28gdW50aWwgd2UgZmluaXNoLCByZWdhcmRsZXNzLlxuICAgICAgICAgICAgLy8gZGVmZXIgY2hlY2sgdW50aWwgd2UgYXJlIGFjdHVhbGx5IGFib3J0aW5nLFxuICAgICAgICAgICAgLy8gc28gZmV0Y2hNZXRob2QgY2FuIG92ZXJyaWRlLlxuICAgICAgICAgICAgYWMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVGZXRjaEFib3J0IHx8XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCkge1xuICAgICAgICAgICAgICAgICAgICByZXModW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBpdCBldmVudHVhbGx5IHJlc29sdmVzLCB1cGRhdGUgdGhlIGNhY2hlLlxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB2ID0+IGNiKHYsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zLnN0YXR1cylcbiAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoRGlzcGF0Y2hlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZShwY2FsbCkudGhlbihjYiwgZWIpO1xuICAgICAgICBjb25zdCBiZiA9IE9iamVjdC5hc3NpZ24ocCwge1xuICAgICAgICAgICAgX19hYm9ydENvbnRyb2xsZXI6IGFjLFxuICAgICAgICAgICAgX19zdGFsZVdoaWxlRmV0Y2hpbmc6IHYsXG4gICAgICAgICAgICBfX3JldHVybmVkOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gaW50ZXJuYWwsIGRvbid0IGV4cG9zZSBzdGF0dXMuXG4gICAgICAgICAgICB0aGlzLnNldChrLCBiZiwgeyAuLi5mZXRjaE9wdHMub3B0aW9ucywgc3RhdHVzOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IGJmO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZjtcbiAgICB9XG4gICAgI2lzQmFja2dyb3VuZEZldGNoKHApIHtcbiAgICAgICAgaWYgKCF0aGlzLiNoYXNGZXRjaE1ldGhvZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgYiA9IHA7XG4gICAgICAgIHJldHVybiAoISFiICYmXG4gICAgICAgICAgICBiIGluc3RhbmNlb2YgUHJvbWlzZSAmJlxuICAgICAgICAgICAgYi5oYXNPd25Qcm9wZXJ0eSgnX19zdGFsZVdoaWxlRmV0Y2hpbmcnKSAmJlxuICAgICAgICAgICAgYi5fX2Fib3J0Q29udHJvbGxlciBpbnN0YW5jZW9mIEFDKTtcbiAgICB9XG4gICAgYXN5bmMgZmV0Y2goaywgZmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBcbiAgICAgICAgLy8gZ2V0IG9wdGlvbnNcbiAgICAgICAgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSwgdXBkYXRlQWdlT25HZXQgPSB0aGlzLnVwZGF0ZUFnZU9uR2V0LCBub0RlbGV0ZU9uU3RhbGVHZXQgPSB0aGlzLm5vRGVsZXRlT25TdGFsZUdldCwgXG4gICAgICAgIC8vIHNldCBvcHRpb25zXG4gICAgICAgIHR0bCA9IHRoaXMudHRsLCBub0Rpc3Bvc2VPblNldCA9IHRoaXMubm9EaXNwb3NlT25TZXQsIHNpemUgPSAwLCBzaXplQ2FsY3VsYXRpb24gPSB0aGlzLnNpemVDYWxjdWxhdGlvbiwgbm9VcGRhdGVUVEwgPSB0aGlzLm5vVXBkYXRlVFRMLCBcbiAgICAgICAgLy8gZmV0Y2ggZXhjbHVzaXZlIG9wdGlvbnNcbiAgICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gdGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sIGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uID0gdGhpcy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiwgaWdub3JlRmV0Y2hBYm9ydCA9IHRoaXMuaWdub3JlRmV0Y2hBYm9ydCwgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCwgY29udGV4dCwgZm9yY2VSZWZyZXNoID0gZmFsc2UsIHN0YXR1cywgc2lnbmFsLCB9ID0gZmV0Y2hPcHRpb25zO1xuICAgICAgICBpZiAoIXRoaXMuI2hhc0ZldGNoTWV0aG9kKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdnZXQnO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGssIHtcbiAgICAgICAgICAgICAgICBhbGxvd1N0YWxlLFxuICAgICAgICAgICAgICAgIHVwZGF0ZUFnZU9uR2V0LFxuICAgICAgICAgICAgICAgIG5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgYWxsb3dTdGFsZSxcbiAgICAgICAgICAgIHVwZGF0ZUFnZU9uR2V0LFxuICAgICAgICAgICAgbm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgICAgICAgdHRsLFxuICAgICAgICAgICAgbm9EaXNwb3NlT25TZXQsXG4gICAgICAgICAgICBzaXplLFxuICAgICAgICAgICAgc2l6ZUNhbGN1bGF0aW9uLFxuICAgICAgICAgICAgbm9VcGRhdGVUVEwsXG4gICAgICAgICAgICBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICAgICAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbixcbiAgICAgICAgICAgIGFsbG93U3RhbGVPbkZldGNoQWJvcnQsXG4gICAgICAgICAgICBpZ25vcmVGZXRjaEFib3J0LFxuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICBzdGF0dXMuZmV0Y2ggPSAnbWlzcyc7XG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy4jYmFja2dyb3VuZEZldGNoKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KTtcbiAgICAgICAgICAgIHJldHVybiAocC5fX3JldHVybmVkID0gcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpbiBjYWNoZSwgbWF5YmUgYWxyZWFkeSBmZXRjaGluZ1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhbGUgPSBhbGxvd1N0YWxlICYmIHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdpbmZsaWdodCc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWxlID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6ICh2Ll9fcmV0dXJuZWQgPSB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHdlIGZvcmNlIGEgcmVmcmVzaCwgdGhhdCBtZWFucyBkbyBOT1Qgc2VydmUgdGhlIGNhY2hlZCB2YWx1ZSxcbiAgICAgICAgICAgIC8vIHVubGVzcyB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiByZWZyZXNoaW5nIHRoZSBjYWNoZS5cbiAgICAgICAgICAgIGNvbnN0IGlzU3RhbGUgPSB0aGlzLiNpc1N0YWxlKGluZGV4KTtcbiAgICAgICAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmICFpc1N0YWxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmZldGNoID0gJ2hpdCc7XG4gICAgICAgICAgICAgICAgdGhpcy4jbW92ZVRvVGFpbChpbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUFnZU9uR2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UoaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBvaywgaXQgaXMgc3RhbGUgb3IgYSBmb3JjZWQgcmVmcmVzaCwgYW5kIG5vdCBhbHJlYWR5IGZldGNoaW5nLlxuICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgY2FjaGUuXG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy4jYmFja2dyb3VuZEZldGNoKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IGhhc1N0YWxlID0gcC5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3Qgc3RhbGVWYWwgPSBoYXNTdGFsZSAmJiBhbGxvd1N0YWxlO1xuICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9IGlzU3RhbGUgPyAnc3RhbGUnIDogJ3JlZnJlc2gnO1xuICAgICAgICAgICAgICAgIGlmIChzdGFsZVZhbCAmJiBpc1N0YWxlKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhbGVWYWwgPyBwLl9fc3RhbGVXaGlsZUZldGNoaW5nIDogKHAuX19yZXR1cm5lZCA9IHApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGZvcmNlRmV0Y2goaywgZmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgdiA9IGF3YWl0IHRoaXMuZmV0Y2goaywgZmV0Y2hPcHRpb25zKTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmV0Y2goKSByZXR1cm5lZCB1bmRlZmluZWQnKTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIG1lbW8oaywgbWVtb09wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBtZW1vTWV0aG9kID0gdGhpcy4jbWVtb01ldGhvZDtcbiAgICAgICAgaWYgKCFtZW1vTWV0aG9kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIG1lbW9NZXRob2QgcHJvdmlkZWQgdG8gY29uc3RydWN0b3InKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGNvbnRleHQsIGZvcmNlUmVmcmVzaCwgLi4ub3B0aW9ucyB9ID0gbWVtb09wdGlvbnM7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLmdldChrLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgdiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNvbnN0IHZ2ID0gbWVtb01ldGhvZChrLCB2LCB7XG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0KGssIHZ2LCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHZ2O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB2YWx1ZSBmcm9tIHRoZSBjYWNoZS4gV2lsbCB1cGRhdGUgdGhlIHJlY2VuY3kgb2YgdGhlIGNhY2hlXG4gICAgICogZW50cnkgZm91bmQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgZ2V0KCkgd2lsbCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZ2V0KGssIGdldE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUsIHVwZGF0ZUFnZU9uR2V0ID0gdGhpcy51cGRhdGVBZ2VPbkdldCwgbm9EZWxldGVPblN0YWxlR2V0ID0gdGhpcy5ub0RlbGV0ZU9uU3RhbGVHZXQsIHN0YXR1cywgfSA9IGdldE9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBmZXRjaGluZyA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzU3RhbGUoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmdldCA9ICdzdGFsZSc7XG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlIG9ubHkgaWYgbm90IGFuIGluLWZsaWdodCBiYWNrZ3JvdW5kIGZldGNoXG4gICAgICAgICAgICAgICAgaWYgKCFmZXRjaGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vRGVsZXRlT25TdGFsZUdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKGssICdleHBpcmUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYmIGFsbG93U3RhbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd1N0YWxlID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1N0YWxlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93U3RhbGUgPyB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0ID0gJ2hpdCc7XG4gICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgY3VycmVudGx5IGZldGNoaW5nIGl0LCB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIGl0IHlldFxuICAgICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHN0YWxlLCB3aGljaCBtZWFucyB0aGlzIGlzbid0IGEgc3RhbGVXaGlsZVJlZmV0Y2hpbmcuXG4gICAgICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgc3RhbGUsIGFuZCBmZXRjaGluZywgQU5EIGhhcyBhIF9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUsIHRoZW4gdGhhdCBtZWFucyB0aGUgdXNlciBmZXRjaGVkIHdpdGgge2ZvcmNlUmVmcmVzaDp0cnVlfSxcbiAgICAgICAgICAgICAgICAvLyBzbyBpdCdzIHNhZmUgdG8gcmV0dXJuIHRoYXQgdmFsdWUuXG4gICAgICAgICAgICAgICAgaWYgKGZldGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jbW92ZVRvVGFpbChpbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUFnZU9uR2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UoaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBzdGF0dXMuZ2V0ID0gJ21pc3MnO1xuICAgICAgICB9XG4gICAgfVxuICAgICNjb25uZWN0KHAsIG4pIHtcbiAgICAgICAgdGhpcy4jcHJldltuXSA9IHA7XG4gICAgICAgIHRoaXMuI25leHRbcF0gPSBuO1xuICAgIH1cbiAgICAjbW92ZVRvVGFpbChpbmRleCkge1xuICAgICAgICAvLyBpZiB0YWlsIGFscmVhZHksIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgLy8gaWYgaGVhZCwgbW92ZSBoZWFkIHRvIG5leHRbaW5kZXhdXG4gICAgICAgIC8vIGVsc2VcbiAgICAgICAgLy8gICBtb3ZlIG5leHRbcHJldltpbmRleF1dIHRvIG5leHRbaW5kZXhdIChoZWFkIGhhcyBubyBwcmV2KVxuICAgICAgICAvLyAgIG1vdmUgcHJldltuZXh0W2luZGV4XV0gdG8gcHJldltpbmRleF1cbiAgICAgICAgLy8gcHJldltpbmRleF0gPSB0YWlsXG4gICAgICAgIC8vIG5leHRbdGFpbF0gPSBpbmRleFxuICAgICAgICAvLyB0YWlsID0gaW5kZXhcbiAgICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLiN0YWlsKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuI2hlYWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNoZWFkID0gdGhpcy4jbmV4dFtpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb25uZWN0KHRoaXMuI3ByZXZbaW5kZXhdLCB0aGlzLiNuZXh0W2luZGV4XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNjb25uZWN0KHRoaXMuI3RhaWwsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuI3RhaWwgPSBpbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGEga2V5IG91dCBvZiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGtleSB3YXMgZGVsZXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGRlbGV0ZShrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWxldGUoaywgJ2RlbGV0ZScpO1xuICAgIH1cbiAgICAjZGVsZXRlKGssIHJlYXNvbikge1xuICAgICAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy4jc2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jc2l6ZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNjbGVhcihyZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcmVtb3ZlSXRlbVNpemUoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2RlbGV0ZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy4jaGFzRGlzcG9zZSB8fCB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHYsIGssIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW3YsIGssIHJlYXNvbl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2tleU1hcC5kZWxldGUoayk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaW5kZXhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLiN0YWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiN0YWlsID0gdGhpcy4jcHJldltpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuI2hlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2hlYWQgPSB0aGlzLiNuZXh0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpID0gdGhpcy4jcHJldltpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNuZXh0W3BpXSA9IHRoaXMuI25leHRbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmkgPSB0aGlzLiNuZXh0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3ByZXZbbmldID0gdGhpcy4jcHJldltpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jc2l6ZS0tO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNmcmVlLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWQ7XG4gICAgICAgICAgICBsZXQgdGFzaztcbiAgICAgICAgICAgIHdoaWxlICgodGFzayA9IGR0Py5zaGlmdCgpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWxldGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgY2FjaGUgZW50aXJlbHksIHRocm93aW5nIGF3YXkgYWxsIHZhbHVlcy5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NsZWFyKCdkZWxldGUnKTtcbiAgICB9XG4gICAgI2NsZWFyKHJlYXNvbikge1xuICAgICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHRoaXMuI3JpbmRleGVzKHsgYWxsb3dTdGFsZTogdHJ1ZSB9KSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2RlbGV0ZWQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0gdGhpcy4ja2V5TGlzdFtpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHYsIGssIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW3YsIGssIHJlYXNvbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNrZXlNYXAuY2xlYXIoKTtcbiAgICAgICAgdGhpcy4jdmFsTGlzdC5maWxsKHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuI2tleUxpc3QuZmlsbCh1bmRlZmluZWQpO1xuICAgICAgICBpZiAodGhpcy4jdHRscyAmJiB0aGlzLiNzdGFydHMpIHtcbiAgICAgICAgICAgIHRoaXMuI3R0bHMuZmlsbCgwKTtcbiAgICAgICAgICAgIHRoaXMuI3N0YXJ0cy5maWxsKDApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzaXplcykge1xuICAgICAgICAgICAgdGhpcy4jc2l6ZXMuZmlsbCgwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNoZWFkID0gMDtcbiAgICAgICAgdGhpcy4jdGFpbCA9IDA7XG4gICAgICAgIHRoaXMuI2ZyZWUubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgPSAwO1xuICAgICAgICB0aGlzLiNzaXplID0gMDtcbiAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciAmJiB0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgY29uc3QgZHQgPSB0aGlzLiNkaXNwb3NlZDtcbiAgICAgICAgICAgIGxldCB0YXNrO1xuICAgICAgICAgICAgd2hpbGUgKCh0YXNrID0gZHQ/LnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyPy4oLi4udGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLG51bGwsbnVsbCxudWxsLG51bGwsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbm5lclwiIDpzdHlsZT1cImNvbXB1dGVkSW5uZXJTdHlsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgPCEtLSBoZWFkZXIgLS0+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlclwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib2R5XCIgOnN0eWxlPVwiY29tcHV0ZWRCb2R5U3R5bGVcIj5cbiAgICAgICAgICA8IS0tIGJvZHksIOmrmOW6puiHqumAguW6lCAtLT5cbiAgICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XG4gICAgICAgICAgPCEtLSBmb290ZXIgLS0+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImZvb3RlclwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8c2xvdCBuYW1lPVwiYm94XCI+PC9zbG90PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIGNvbXB1dGVkIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG4vKipcbiAqIGNydWTnmoTlrrnlmajvvIzmoLnmja7lpJbpg6jpq5jluqboh6rpgILlupRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0NvbnRhaW5lclwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaYr+WQpuWbuuWumumrmOW6plxuICAgICAqL1xuICAgIGZpeGVkSGVpZ2h0OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogYm9keeeahOagt+W8j1xuICAgICAqL1xuICAgIGJvZHlTdHlsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBpbm5lcueahOagt+W8j1xuICAgICAqL1xuICAgIGlubmVyU3R5bGU6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgY29tcHV0ZWRJbm5lclN0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKHByb3BzLmZpeGVkSGVpZ2h0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbWVyZ2UoeyBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiIH0sIHByb3BzLmlubmVyU3R5bGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BzLmlubmVyU3R5bGU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZEJvZHlTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChwcm9wcy5maXhlZEhlaWdodCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKHsgZmxleDogXCJ1bnNldFwiIH0sIHByb3BzLmJvZHlTdHlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMuYm9keVN0eWxlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXB1dGVkSW5uZXJTdHlsZSxcbiAgICAgIGNvbXB1dGVkQm9keVN0eWxlXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtY29udGFpbmVyIHtcbiAgJi5jb21wYWN0IHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG4gIHBhZGRpbmc6IDAgMjBweDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAuYm94IHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBmbGV4OiAxO1xuICAgIC5pbm5lciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHRvcDogMDtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgLmhlYWRlciB7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuICAgICAgLmJvZHkge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgfVxuICAgICAgLmZvb3RlciB7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbm5lclwiIDpzdHlsZT1cImNvbXB1dGVkSW5uZXJTdHlsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgPCEtLSBoZWFkZXIgLS0+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlclwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib2R5XCIgOnN0eWxlPVwiY29tcHV0ZWRCb2R5U3R5bGVcIj5cbiAgICAgICAgICA8IS0tIGJvZHksIOmrmOW6puiHqumAguW6lCAtLT5cbiAgICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XG4gICAgICAgICAgPCEtLSBmb290ZXIgLS0+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImZvb3RlclwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8c2xvdCBuYW1lPVwiYm94XCI+PC9zbG90PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIGNvbXB1dGVkIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG4vKipcbiAqIGNydWTnmoTlrrnlmajvvIzmoLnmja7lpJbpg6jpq5jluqboh6rpgILlupRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0NvbnRhaW5lclwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaYr+WQpuWbuuWumumrmOW6plxuICAgICAqL1xuICAgIGZpeGVkSGVpZ2h0OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogYm9keeeahOagt+W8j1xuICAgICAqL1xuICAgIGJvZHlTdHlsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBpbm5lcueahOagt+W8j1xuICAgICAqL1xuICAgIGlubmVyU3R5bGU6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgY29tcHV0ZWRJbm5lclN0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKHByb3BzLmZpeGVkSGVpZ2h0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbWVyZ2UoeyBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiIH0sIHByb3BzLmlubmVyU3R5bGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BzLmlubmVyU3R5bGU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZEJvZHlTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChwcm9wcy5maXhlZEhlaWdodCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKHsgZmxleDogXCJ1bnNldFwiIH0sIHByb3BzLmJvZHlTdHlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMuYm9keVN0eWxlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXB1dGVkSW5uZXJTdHlsZSxcbiAgICAgIGNvbXB1dGVkQm9keVN0eWxlXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtY29udGFpbmVyIHtcbiAgJi5jb21wYWN0IHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG4gIHBhZGRpbmc6IDAgMjBweDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAuYm94IHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBmbGV4OiAxO1xuICAgIC5pbm5lciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHRvcDogMDtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgLmhlYWRlciB7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuICAgICAgLmJvZHkge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgfVxuICAgICAgLmZvb3RlciB7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGZzLWNvbnRhaW5lciBjbGFzcz1cImZzLWxheW91dC1kZWZhdWx0XCI+XG4gICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY3J1ZC1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci10b3BcIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLXRvcFwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2hcIj48L3Nsb3Q+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItbWlkZGxlXCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci1taWRkbGVcIj48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c2xvdCBuYW1lPVwiYWN0aW9uYmFyXCI+PC9zbG90PlxuICAgICAgICA8c2xvdCBuYW1lPVwidG9vbGJhclwiPjwvc2xvdD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci1ib3R0b21cIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0YWJzXCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDwhLS0g6buY6K6k5o+S5qe9IC0tPlxuICAgIDxzbG90Pjwvc2xvdD5cbiAgICA8IS0tIHRhYmxlIC0tPlxuICAgIDxzbG90IG5hbWU9XCJ0YWJsZVwiPjwvc2xvdD5cblxuICAgIDxzbG90IG5hbWU9XCJmb3JtXCI+IDwvc2xvdD5cblxuICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWNydWQtZm9vdGVyXCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItdG9wXCI+PC9zbG90PlxuICAgICAgICA8c2xvdCBuYW1lPVwicGFnaW5hdGlvblwiPjwvc2xvdD5cbiAgICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuICA8L2ZzLWNvbnRhaW5lcj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG4vKipcbiAqIOm7mOiupOW4g+WxgFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzTGF5b3V0RGVmYXVsdFwiXG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1sYXlvdXQtZGVmYXVsdCB7XG4gIC5mcy10YWJzLWZpbHRlciB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGZzLWNvbnRhaW5lciBjbGFzcz1cImZzLWxheW91dC1kZWZhdWx0XCI+XG4gICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY3J1ZC1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci10b3BcIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLXRvcFwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2hcIj48L3Nsb3Q+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItbWlkZGxlXCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci1taWRkbGVcIj48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c2xvdCBuYW1lPVwiYWN0aW9uYmFyXCI+PC9zbG90PlxuICAgICAgICA8c2xvdCBuYW1lPVwidG9vbGJhclwiPjwvc2xvdD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci1ib3R0b21cIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0YWJzXCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDwhLS0g6buY6K6k5o+S5qe9IC0tPlxuICAgIDxzbG90Pjwvc2xvdD5cbiAgICA8IS0tIHRhYmxlIC0tPlxuICAgIDxzbG90IG5hbWU9XCJ0YWJsZVwiPjwvc2xvdD5cblxuICAgIDxzbG90IG5hbWU9XCJmb3JtXCI+IDwvc2xvdD5cblxuICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWNydWQtZm9vdGVyXCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItdG9wXCI+PC9zbG90PlxuICAgICAgICA8c2xvdCBuYW1lPVwicGFnaW5hdGlvblwiPjwvc2xvdD5cbiAgICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuICA8L2ZzLWNvbnRhaW5lcj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG4vKipcbiAqIOm7mOiupOW4g+WxgFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzTGF5b3V0RGVmYXVsdFwiXG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1sYXlvdXQtZGVmYXVsdCB7XG4gIC5mcy10YWJzLWZpbHRlciB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGZzLWNvbnRhaW5lciBjbGFzcz1cImZzLWxheW91dC1jYXJkXCI+XG4gICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtaGVhZGVyLXRvcFwiPlxuICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLXRvcFwiPjwvc2xvdD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGNvbXBvbmVudCA6aXM9XCJjYXJkQ29tcG9uZW50TmFtZVwiIHYtaWY9XCJzZWFyY2hTaG93XCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2hcIj48L3Nsb3Q+XG4gICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItYm90dG9tXCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItYm90dG9tXCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDxmcy1jb250YWluZXI+XG4gICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgPHNsb3QgbmFtZT1cInRhYnNcIj48L3Nsb3Q+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgICAgPGNvbXBvbmVudCA6aXM9XCJjYXJkQ29tcG9uZW50TmFtZVwiIGNsYXNzPVwiZnMtbGF5b3V0LWNhcmQtYm9keVwiPlxuICAgICAgICA8dGVtcGxhdGUgI3RpdGxlPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtYmFyXCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwiYWN0aW9uYmFyXCI+PC9zbG90PlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInRvb2xiYXJcIj48L3Nsb3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtYmFyXCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwiYWN0aW9uYmFyXCI+PC9zbG90PlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInRvb2xiYXJcIj48L3Nsb3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDxmcy1jb250YWluZXI+XG4gICAgICAgICAgPCEtLSDpu5jorqTmj5Lmp70gLS0+XG4gICAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgICAgIDwhLS0gdGFibGUgLS0+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInRhYmxlXCI+PC9zbG90PlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJmb3JtXCI+PC9zbG90PlxuICAgICAgICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNydWQtZm9vdGVyXCI+XG4gICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItdG9wXCI+PC9zbG90PlxuICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwicGFnaW5hdGlvblwiPjwvc2xvdD5cbiAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L2ZzLWNvbnRhaW5lcj5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvZnMtY29udGFpbmVyPlxuICA8L2ZzLWNvbnRhaW5lcj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBpbmplY3QsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtdWlcIjtcbi8qKlxuICogY2FyZOW4g+WxgFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzTGF5b3V0Q2FyZFwiLFxuICBzZXR1cCgpIHtcbiAgICBjb25zdCBnZXRDcnVkQmluZGluZyA9IGluamVjdChcImdldDpjcnVkQmluZGluZ1wiKTtcbiAgICBjb25zdCBzZWFyY2hTaG93ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKGdldENydWRCaW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4gZ2V0Q3J1ZEJpbmRpbmcoKT8uc2VhcmNoPy5zaG93O1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcblxuICAgIGNvbnN0IGNhcmRDb21wb25lbnROYW1lID0gcmVmKHVpLmNhcmQubmFtZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlYXJjaFNob3csXG4gICAgICBjYXJkQ29tcG9uZW50TmFtZVxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWxheW91dC1jYXJkIHtcbiAgJiA+IC5ib3ggPiAuaW5uZXIgPiAuaGVhZGVyIHtcbiAgICBtYXJnaW46IDEwcHggMTBweCA1cHggMTBweDtcbiAgfVxuICAmID4gLmJveCA+IC5pbm5lciA+IC5ib2R5IHtcbiAgICBtYXJnaW46IDVweCAxMHB4IDEwcHggMTBweDtcbiAgfVxuICAudG9wLWJhciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIH1cbiAgLmZzLWNvbnRhaW5lciB7XG4gICAgcGFkZGluZzogMDtcbiAgICAuYm94IHtcbiAgICAgIC5pbm5lciB7XG4gICAgICAgIC5oZWFkZXIge1xuICAgICAgICAgIC5hbnQtY2FyZC1ib2R5IHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDE0cHg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC5mcy1sYXlvdXQtY2FyZC1ib2R5IHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG4gICAgLmFudC1jYXJkLWhlYWQge1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgIHBhZGRpbmc6IDBweDtcbiAgICAgIC5hbnQtY2FyZC1oZWFkLXRpdGxlIHtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZWwtY2FyZF9faGVhZGVyIHtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuXG4gICAgLm4tY2FyZC1oZWFkZXIge1xuICAgICAgcGFkZGluZzogMHB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7XG4gICAgfVxuICAgIC5uLWNhcmRfX2NvbnRlbnQge1xuICAgICAgcGFkZGluZzogMTBweDtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC1hY3Rpb25iYXIge1xuICAgICAgbWFyZ2luOiAxMHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICAgIC5mcy1jcnVkLXRvb2xiYXIge1xuICAgICAgbWFyZ2luOiAxMHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuXG4gICAgLmFudC1jYXJkLWJvZHkge1xuICAgICAgZmxleDogMTtcbiAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgfVxuICAgIC5lbC1jYXJkX19ib2R5IHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgIH1cbiAgfVxuXG4gIC5mcy10YWJzLWZpbHRlciB7XG4gICAgbWFyZ2luLWJvdHRvbTogLTFweDtcbiAgICAubi10YWJzIC5uLXRhYnMtbmF2Lm4tdGFicy1uYXYtLWNhcmQtdHlwZSAubi10YWJzLXRhYiB7XG4gICAgICAmLm4tdGFicy10YWItLWFjdGl2ZSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgICB9XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmNjA7XG4gICAgfVxuXG4gICAgLmVsLXRhYnMtLWNhcmQgPiAuZWwtdGFic19faGVhZGVyIC5lbC10YWJzX19pdGVtIHtcbiAgICAgICYuaXMtYWN0aXZlIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICAgIH1cbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY4MDtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxmcy1jb250YWluZXIgY2xhc3M9XCJmcy1sYXlvdXQtY2FyZFwiPlxuICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci10b3BcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci10b3BcIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjb21wb25lbnQgOmlzPVwiY2FyZENvbXBvbmVudE5hbWVcIiB2LWlmPVwic2VhcmNoU2hvd1wiPlxuICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoXCI+PC9zbG90PlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtaGVhZGVyLWJvdHRvbVwiPlxuICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8ZnMtY29udGFpbmVyPlxuICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0YWJzXCI+PC9zbG90PlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDxjb21wb25lbnQgOmlzPVwiY2FyZENvbXBvbmVudE5hbWVcIiBjbGFzcz1cImZzLWxheW91dC1jYXJkLWJvZHlcIj5cbiAgICAgICAgPHRlbXBsYXRlICN0aXRsZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLWJhclwiPlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cImFjdGlvbmJhclwiPjwvc2xvdD5cbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyXCI+PC9zbG90PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLWJhclwiPlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cImFjdGlvbmJhclwiPjwvc2xvdD5cbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyXCI+PC9zbG90PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8ZnMtY29udGFpbmVyPlxuICAgICAgICAgIDwhLS0g6buY6K6k5o+S5qe9IC0tPlxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgICAgICA8IS0tIHRhYmxlIC0tPlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJ0YWJsZVwiPjwvc2xvdD5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiZm9ybVwiPjwvc2xvdD5cbiAgICAgICAgICA8dGVtcGxhdGUgI2Zvb3Rlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLWZvb3RlclwiPlxuICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyLXRvcFwiPjwvc2xvdD5cbiAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cInBhZ2luYXRpb25cIj48L3Nsb3Q+XG4gICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItYm90dG9tXCI+PC9zbG90PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9mcy1jb250YWluZXI+XG4gICAgICA8L2NvbXBvbmVudD5cbiAgICA8L2ZzLWNvbnRhaW5lcj5cbiAgPC9mcy1jb250YWluZXI+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgaW5qZWN0LCByZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLXVpXCI7XG4vKipcbiAqIGNhcmTluIPlsYBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0xheW91dENhcmRcIixcbiAgc2V0dXAoKSB7XG4gICAgY29uc3QgZ2V0Q3J1ZEJpbmRpbmcgPSBpbmplY3QoXCJnZXQ6Y3J1ZEJpbmRpbmdcIik7XG4gICAgY29uc3Qgc2VhcmNoU2hvdyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChnZXRDcnVkQmluZGluZyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIGdldENydWRCaW5kaW5nKCk/LnNlYXJjaD8uc2hvdztcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG5cbiAgICBjb25zdCBjYXJkQ29tcG9uZW50TmFtZSA9IHJlZih1aS5jYXJkLm5hbWUpO1xuICAgIHJldHVybiB7XG4gICAgICBzZWFyY2hTaG93LFxuICAgICAgY2FyZENvbXBvbmVudE5hbWVcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1sYXlvdXQtY2FyZCB7XG4gICYgPiAuYm94ID4gLmlubmVyID4gLmhlYWRlciB7XG4gICAgbWFyZ2luOiAxMHB4IDEwcHggNXB4IDEwcHg7XG4gIH1cbiAgJiA+IC5ib3ggPiAuaW5uZXIgPiAuYm9keSB7XG4gICAgbWFyZ2luOiA1cHggMTBweCAxMHB4IDEwcHg7XG4gIH1cbiAgLnRvcC1iYXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICB9XG4gIC5mcy1jb250YWluZXIge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgLmJveCB7XG4gICAgICAuaW5uZXIge1xuICAgICAgICAuaGVhZGVyIHtcbiAgICAgICAgICAuYW50LWNhcmQtYm9keSB7XG4gICAgICAgICAgICBwYWRkaW5nOiAxNHB4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAuZnMtbGF5b3V0LWNhcmQtYm9keSB7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgIC5hbnQtY2FyZC1oZWFkIHtcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICBwYWRkaW5nOiAwcHg7XG4gICAgICAuYW50LWNhcmQtaGVhZC10aXRsZSB7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmVsLWNhcmRfX2hlYWRlciB7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgIH1cblxuICAgIC5uLWNhcmQtaGVhZGVyIHtcbiAgICAgIHBhZGRpbmc6IDBweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlO1xuICAgIH1cbiAgICAubi1jYXJkX19jb250ZW50IHtcbiAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtYWN0aW9uYmFyIHtcbiAgICAgIG1hcmdpbjogMTBweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cbiAgICAuZnMtY3J1ZC10b29sYmFyIHtcbiAgICAgIG1hcmdpbjogMTBweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cblxuICAgIC5hbnQtY2FyZC1ib2R5IHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgIH1cbiAgICAuZWwtY2FyZF9fYm9keSB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgcGFkZGluZzogMTBweDtcbiAgICB9XG4gIH1cblxuICAuZnMtdGFicy1maWx0ZXIge1xuICAgIG1hcmdpbi1ib3R0b206IC0xcHg7XG4gICAgLm4tdGFicyAubi10YWJzLW5hdi5uLXRhYnMtbmF2LS1jYXJkLXR5cGUgLm4tdGFicy10YWIge1xuICAgICAgJi5uLXRhYnMtdGFiLS1hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgICAgfVxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjYwO1xuICAgIH1cblxuICAgIC5lbC10YWJzLS1jYXJkID4gLmVsLXRhYnNfX2hlYWRlciAuZWwtdGFic19faXRlbSB7XG4gICAgICAmLmlzLWFjdGl2ZSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgICB9XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmODA7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIixudWxsLG51bGwsIjx0ZW1wbGF0ZT5cbiAgPHNwYW4gY2xhc3M9XCJmcy1pY29uaWZ5XCIgOmNsYXNzPVwieyAnZnMtaWNvbmlmeS1zcGluJzogc3BpbiB9XCI+XG4gICAgPEljb24gcmVmPVwiaWNvbmlmeVJlZlwiIDppY29uPVwiaWNvblwiIDppbmxpbmU9XCJ0cnVlXCIgLz5cbiAgPC9zcGFuPlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCBvbk1vdW50ZWQsIHJlZiwgdW5yZWYsIHdhdGNoIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgSWNvbiB9IGZyb20gXCJAaWNvbmlmeS92dWVcIjtcbi8qKlxuICogaWNvbmlmeSDmjInpnIDliqDovb3lm77moIfnu4Tku7ZcbiAqIGh0dHBzOi8vaWNvbmlmeS5kZXNpZ24vaWNvbi1zZXRzL2lvbi9cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0ljb25pZnlcIixcbiAgY29tcG9uZW50czogeyBJY29uIH0sXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5Zu+5qCH5ZCN56ewXG4gICAgICovXG4gICAgaWNvbjoge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDml4vovaxcbiAgICAgKi9cbiAgICBzcGluOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCBpY29uaWZ5UmVmID0gcmVmKG51bGwpO1xuICAgIHJldHVybiB7IGljb25pZnlSZWYgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWljb25pZnkge1xuICAvL2Rpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAmLXNwaW4ge1xuICAgIHN2ZyB7XG4gICAgICBhbmltYXRpb246IGZzTG9hZGluZ0NpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XG4gICAgfVxuICB9XG5cbiAgJi5mcy1pY29uIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIGZzTG9hZGluZ0NpcmNsZSB7XG4gIGZyb20ge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG4gIHRvIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICB9XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyBmc0xvYWRpbmdDaXJjbGUge1xuICBmcm9tIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgfVxuICB0byB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxufVxuXG4vL3NwYW4uaWNvbmlmeSB7XG4vLyAgZGlzcGxheTogYmxvY2s7XG4vLyAgbWluLXdpZHRoOiAxZW07XG4vLyAgbWluLWhlaWdodDogMWVtO1xuLy8gIC8vIGJhY2tncm91bmQtY29sb3I6IEBpY29uaWZ5LWJnLWNvbG9yO1xuLy8gIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4vL31cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxzcGFuIGNsYXNzPVwiZnMtaWNvbmlmeVwiIDpjbGFzcz1cInsgJ2ZzLWljb25pZnktc3Bpbic6IHNwaW4gfVwiPlxuICAgIDxJY29uIHJlZj1cImljb25pZnlSZWZcIiA6aWNvbj1cImljb25cIiA6aW5saW5lPVwidHJ1ZVwiIC8+XG4gIDwvc3Bhbj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBuZXh0VGljaywgb25Nb3VudGVkLCByZWYsIHVucmVmLCB3YXRjaCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IEljb24gfSBmcm9tIFwiQGljb25pZnkvdnVlXCI7XG4vKipcbiAqIGljb25pZnkg5oyJ6ZyA5Yqg6L295Zu+5qCH57uE5Lu2XG4gKiBodHRwczovL2ljb25pZnkuZGVzaWduL2ljb24tc2V0cy9pb24vXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNJY29uaWZ5XCIsXG4gIGNvbXBvbmVudHM6IHsgSWNvbiB9LFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOWbvuagh+WQjeensFxuICAgICAqL1xuICAgIGljb246IHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgIH0sXG4gICAgLyoqXG4gICAgICog5peL6L2sXG4gICAgICovXG4gICAgc3Bpbjoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgaWNvbmlmeVJlZiA9IHJlZihudWxsKTtcbiAgICByZXR1cm4geyBpY29uaWZ5UmVmIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1pY29uaWZ5IHtcbiAgLy9kaXNwbGF5OiBpbmxpbmUtZmxleCAhaW1wb3J0YW50O1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgJi1zcGluIHtcbiAgICBzdmcge1xuICAgICAgYW5pbWF0aW9uOiBmc0xvYWRpbmdDaXJjbGUgMXMgaW5maW5pdGUgbGluZWFyO1xuICAgIH1cbiAgfVxuXG4gICYuZnMtaWNvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBmc0xvYWRpbmdDaXJjbGUge1xuICBmcm9tIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgfVxuICB0byB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgZnNMb2FkaW5nQ2lyY2xlIHtcbiAgZnJvbSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gIH1cbiAgdG8ge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gIH1cbn1cblxuLy9zcGFuLmljb25pZnkge1xuLy8gIGRpc3BsYXk6IGJsb2NrO1xuLy8gIG1pbi13aWR0aDogMWVtO1xuLy8gIG1pbi1oZWlnaHQ6IDFlbTtcbi8vICAvLyBiYWNrZ3JvdW5kLWNvbG9yOiBAaWNvbmlmeS1iZy1jb2xvcjtcbi8vICBib3JkZXItcmFkaXVzOiAxMDAlO1xuLy99XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8c3BhbiA6Y2xhc3M9XCJbJ2ZzLWljb24tc3ZnJywgc3BpbiAmJiAnZnMtaWNvbi1zcGluJ11cIj5cbiAgICA8c3ZnIGNsYXNzPVwiZnMtaWNvbi1zdmctY29udGVudFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgPHVzZSA6eGxpbms6aHJlZj1cInN5bWJvbElkXCI+PC91c2U+XG4gICAgPC9zdmc+XG4gIDwvc3Bhbj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHR5cGUgeyBDU1NQcm9wZXJ0aWVzIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBjb21wdXRlZCB9IGZyb20gXCJ2dWVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1N2Z0ljb25cIixcbiAgcHJvcHM6IHtcbiAgICBpY29uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgc2l6ZToge1xuICAgICAgdHlwZTogW051bWJlciwgU3RyaW5nXSxcbiAgICAgIGRlZmF1bHQ6IDE2XG4gICAgfSxcbiAgICBzcGluOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHNldHVwKHByb3BzKSB7XG4gICAgY29uc3Qgc3ltYm9sSWQgPSBjb21wdXRlZCgoKSA9PiBgIyR7cHJvcHMuaWNvbn1gKTtcblxuICAgIGNvbnN0IGdldFN0eWxlID0gY29tcHV0ZWQoKCk6IENTU1Byb3BlcnRpZXMgPT4ge1xuICAgICAgY29uc3QgeyBzaXplIH0gPSBwcm9wcztcbiAgICAgIGxldCBzID0gYCR7c2l6ZX1gO1xuICAgICAgcyA9IGAke3MucmVwbGFjZShcInB4XCIsIFwiXCIpfXB4YDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiBzLFxuICAgICAgICBoZWlnaHQ6IHNcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3ltYm9sSWQsIGdldFN0eWxlIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1pY29uLXN2ZyB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgJi5mcy1pY29uLXNwaW4ge1xuICAgIGFuaW1hdGlvbjogbG9hZGluZ0NpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XG4gIH1cblxuICAuZnMtaWNvbi1zdmctY29udGVudCB7XG4gICAgd2lkdGg6IDFlbTtcbiAgICBoZWlnaHQ6IDFlbTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTVlbTtcbiAgICBmaWxsOiBjdXJyZW50Q29sb3I7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPHNwYW4gOmNsYXNzPVwiWydmcy1pY29uLXN2ZycsIHNwaW4gJiYgJ2ZzLWljb24tc3BpbiddXCI+XG4gICAgPHN2ZyBjbGFzcz1cImZzLWljb24tc3ZnLWNvbnRlbnRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDx1c2UgOnhsaW5rOmhyZWY9XCJzeW1ib2xJZFwiPjwvdXNlPlxuICAgIDwvc3ZnPlxuICA8L3NwYW4+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB0eXBlIHsgQ1NTUHJvcGVydGllcyB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgY29tcHV0ZWQgfSBmcm9tIFwidnVlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNTdmdJY29uXCIsXG4gIHByb3BzOiB7XG4gICAgaWNvbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIHNpemU6IHtcbiAgICAgIHR5cGU6IFtOdW1iZXIsIFN0cmluZ10sXG4gICAgICBkZWZhdWx0OiAxNlxuICAgIH0sXG4gICAgc3Bpbjoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBzZXR1cChwcm9wcykge1xuICAgIGNvbnN0IHN5bWJvbElkID0gY29tcHV0ZWQoKCkgPT4gYCMke3Byb3BzLmljb259YCk7XG5cbiAgICBjb25zdCBnZXRTdHlsZSA9IGNvbXB1dGVkKCgpOiBDU1NQcm9wZXJ0aWVzID0+IHtcbiAgICAgIGNvbnN0IHsgc2l6ZSB9ID0gcHJvcHM7XG4gICAgICBsZXQgcyA9IGAke3NpemV9YDtcbiAgICAgIHMgPSBgJHtzLnJlcGxhY2UoXCJweFwiLCBcIlwiKX1weGA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogcyxcbiAgICAgICAgaGVpZ2h0OiBzXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiB7IHN5bWJvbElkLCBnZXRTdHlsZSB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtaWNvbi1zdmcge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICYuZnMtaWNvbi1zcGluIHtcbiAgICBhbmltYXRpb246IGxvYWRpbmdDaXJjbGUgMXMgaW5maW5pdGUgbGluZWFyO1xuICB9XG5cbiAgLmZzLWljb24tc3ZnLWNvbnRlbnQge1xuICAgIHdpZHRoOiAxZW07XG4gICAgaGVpZ2h0OiAxZW07XG4gICAgdmVydGljYWwtYWxpZ246IC0wLjE1ZW07XG4gICAgZmlsbDogY3VycmVudENvbG9yO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy1sYWJlbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJsYWJlbFwiIHYtYmluZD1cImxhYmVsQXR0cnNcIj5cbiAgICAgIHt7IGxhYmVsIH19XG4gICAgICA8c2xvdCBuYW1lPVwibGFiZWxcIj48L3Nsb3Q+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIiB2LWJpbmQ9XCJjb250ZW50QXR0cnNcIj5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcblxuLyoqXG4gKiBsYWJlbOe7hOS7tlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzTGFiZWxcIixcbiAgcHJvcHM6IHtcbiAgICBsYWJlbDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogXCJcIlxuICAgIH0sXG4gICAgbGFiZWxBdHRyczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4gKHt9KVxuICAgIH0sXG4gICAgY29udGVudEF0dHJzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe30pXG4gICAgfVxuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtbGFiZWwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAubGFiZWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgIG1pbi13aWR0aDogMTAwcHg7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgfVxuICAuY29udGVudCB7XG4gICAgZmxleDogMTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIG1pbi13aWR0aDogMTAwcHg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWxhYmVsXCI+XG4gICAgPGRpdiBjbGFzcz1cImxhYmVsXCIgdi1iaW5kPVwibGFiZWxBdHRyc1wiPlxuICAgICAge3sgbGFiZWwgfX1cbiAgICAgIDxzbG90IG5hbWU9XCJsYWJlbFwiPjwvc2xvdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiIHYtYmluZD1cImNvbnRlbnRBdHRyc1wiPlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuXG4vKipcbiAqIGxhYmVs57uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNMYWJlbFwiLFxuICBwcm9wczoge1xuICAgIGxhYmVsOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcIlwiXG4gICAgfSxcbiAgICBsYWJlbEF0dHJzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe30pXG4gICAgfSxcbiAgICBjb250ZW50QXR0cnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7fSlcbiAgICB9XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1sYWJlbCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIC5sYWJlbCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICB9XG4gIC5jb250ZW50IHtcbiAgICBmbGV4OiAxO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCBhcyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNMb2FkaW5nXCJcbn0pO1xuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG4gIDxkaXYgdi1pZj1cImxvYWRpbmdcIiBjbGFzcz1cImZzLWxvYWRpbmdcIj5cbiAgICA8ZnMtaWNvbiBjbGFzcz1cImZzLWljb24tc3BpblwiIDppY29uPVwiaWNvbiA/PyB1aS5pY29ucy5yZWZyZXNoXCI+PC9mcy1pY29uPlxuICAgIDxzcGFuIHYtaWY9XCJ0ZXh0XCI+e3sgdGV4dCB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuXG47XG5jb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICBpY29uPzogc3RyaW5nO1xuICB0ZXh0Pzogc3RyaW5nO1xufT4oKTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtbG9hZGluZyB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAuZnMtaWNvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHdpZHRoOiA5MCU7XG4gICAgaGVpZ2h0OiA5MCU7XG4gICAgbWF4LXdpZHRoOiA1MHB4O1xuICAgIG1heC1oZWlnaHQ6IDUwcHg7XG4gICAgJi5mcy1pY29uLXNwaW4ge1xuICAgICAgc3ZnIHtcbiAgICAgICAgYW5pbWF0aW9uOiBmcy1sb2FkaW5nLWNpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQC13ZWJraXQta2V5ZnJhbWVzIGZzLWxvYWRpbmctY2lyY2xlIHtcbiAgICBmcm9tIHtcbiAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgIH1cbiAgICB0byB7XG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWJveFwiPlxuICAgIDxzbG90Pjwvc2xvdD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcblxuLyoqXG4gKiDljZXnuq/nmoTljIXoo7nkuIDkuKrlrZDnu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0JveFwiXG59KTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtYm94XCI+XG4gICAgPHNsb3Q+PC9zbG90PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuXG4vKipcbiAqIOWNlee6r+eahOWMheijueS4gOS4quWtkOe7hOS7tlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQm94XCJcbn0pO1xuPC9zY3JpcHQ+XG4iLG51bGwsbnVsbCxudWxsLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnRcbiAgICA6aXM9XCJ1aS5mb3JtLm5hbWVcIlxuICAgIHJlZj1cImZvcm1SZWZcIlxuICAgIGNsYXNzPVwiZnMtZm9ybVwiXG4gICAgOmNsYXNzPVwie1xuICAgICAgJ2ZzLWZvcm0tZ3JpZCc6IGRpc3BsYXkgPT09ICdncmlkJyxcbiAgICAgICdmcy1mb3JtLWZsZXgnOiBkaXNwbGF5ID09PSAnZmxleCcsXG4gICAgICAnZnMtZm9ybS1pbnZhbGlkJzogdmFsaWRSZWYgPT09IGZhbHNlXG4gICAgfVwiXG4gICAgb25zdWJtaXQ9XCJldmVudC5wcmV2ZW50RGVmYXVsdCgpO1wiXG4gICAgOm1vZGVsPVwiZm9ybVwiXG4gID5cbiAgICA8IS0tIHJvdyAtLT5cbiAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCIgY2xhc3M9XCJmcy1yb3dcIiB2LWJpbmQ9XCJyb3dcIj5cbiAgICAgIDwhLS0gY29sIC0tPlxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiaXRlbSBpbiBjb21wdXRlZERlZmF1bHRDb2x1bW5zXCIgOmtleT1cIml0ZW0/LmtleVwiPlxuICAgICAgICA8ZnMtZm9ybS1pdGVtLWNvbFxuICAgICAgICAgIDpyZWY9XCJcbiAgICAgICAgICAgIChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgIGZvcm1JdGVtUmVmc1tpdGVtLmtleV0gPSBlbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIFwiXG4gICAgICAgICAgOmNvbD1cIm1lcmdlQ29sKGl0ZW0uY29sKVwiXG4gICAgICAgICAgOml0ZW09XCJpdGVtXCJcbiAgICAgICAgICA6aGVscGVyPVwiaGVscGVyXCJcbiAgICAgICAgICA6bW9kZWwtdmFsdWU9XCJnZXQoZm9ybSwgaXRlbS5rZXkpXCJcbiAgICAgICAgICA6c2xvdHM9XCJtZXJnZWRTbG90c1snZm9ybV8nICsgaXRlbS5rZXldXCJcbiAgICAgICAgICA6Z2V0LWNvbnRleHQtZm49XCJnZXRDb250ZXh0Rm5cIlxuICAgICAgICAgIEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJzZXQoZm9ybSwgaXRlbS5rZXksICRldmVudClcIlxuICAgICAgICAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2NvbXBvbmVudD5cbiAgICA8Y29tcG9uZW50XG4gICAgICA6aXM9XCJjb21wdXRlZEdyb3VwLndyYXBwZXIucGFyZW50XCJcbiAgICAgIHYtaWY9XCJjb21wdXRlZEdyb3VwLndyYXBwZXJcIlxuICAgICAgdi1tb2RlbDpbdWkuY29sbGFwc2UubW9kZWxWYWx1ZV09XCJncm91cEFjdGl2ZUtleVwiXG4gICAgICBzdHlsZT1cIndpZHRoOiAxMDAlXCJcbiAgICAgIHYtYmluZD1cImNvbXB1dGVkR3JvdXBcIlxuICAgID5cbiAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihncm91cEl0ZW0sIGdyb3VwS2V5KSBvZiBjb21wdXRlZEdyb3VwLmdyb3Vwc1wiIDprZXk9XCJncm91cEtleVwiPlxuICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgOmlzPVwiY29tcHV0ZWRHcm91cC53cmFwcGVyLmNoaWxkXCJcbiAgICAgICAgICB2LWlmPVwiZ3JvdXBJdGVtU2hvdyhncm91cEl0ZW0pXCJcbiAgICAgICAgICA6W3VpLmNvbGxhcHNlLmtleU5hbWVdPVwiZ3JvdXBLZXlcIlxuICAgICAgICAgIHYtYmluZD1cImdyb3VwSXRlbVwiXG4gICAgICAgICAgOmNsYXNzPVwieyAnZnMtZm9ybS1ncm91cC1lcnJvcic6IGVycm9yc1JlZlsnZ3JvdXAuJyArIGdyb3VwS2V5XSB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBzbG90TmFtZSkgb2YgZ3JvdXBJdGVtLnNsb3RzXCIgOmtleT1cInNsb3ROYW1lXCIgI1tzbG90TmFtZV09XCJzY29wZVwiPlxuICAgICAgICAgICAgPGZzLXJlbmRlciA6cmVuZGVyLWZ1bmM9XCJpdGVtXCIgOnNjb3BlPVwieyAuLi5zY29wZSwgaGFzRXJyb3I6IGVycm9yc1JlZlsnZ3JvdXAuJyArIGdyb3VwS2V5XSB9XCIgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgIDwhLS0gcm93IC0tPlxuICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiBjbGFzcz1cImZzLXJvd1wiIHYtYmluZD1cInJvd1wiPlxuICAgICAgICAgICAgPCEtLSBjb2wgLS0+XG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCJrZXkgaW4gZ3JvdXBJdGVtLmNvbHVtbnNcIiA6a2V5PVwia2V5XCI+XG4gICAgICAgICAgICAgIDxmcy1mb3JtLWl0ZW0tY29sXG4gICAgICAgICAgICAgICAgdi1pZj1cImNvbXB1dGVkQ29sdW1uc1trZXldXCJcbiAgICAgICAgICAgICAgICA6cmVmPVwiXG4gICAgICAgICAgICAgICAgICAoZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtSXRlbVJlZnNba2V5XSA9IGVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA6Y29sPVwibWVyZ2VDb2woY29tcHV0ZWRDb2x1bW5zW2tleV0uY29sKVwiXG4gICAgICAgICAgICAgICAgOml0ZW09XCJjb21wdXRlZENvbHVtbnNba2V5XVwiXG4gICAgICAgICAgICAgICAgOm1vZGVsLXZhbHVlPVwiZ2V0KGZvcm0sIGtleSlcIlxuICAgICAgICAgICAgICAgIDpzbG90cz1cIm1lcmdlZFNsb3RzWydmb3JtXycgKyBrZXldXCJcbiAgICAgICAgICAgICAgICA6Z2V0LWNvbnRleHQtZm49XCJnZXRDb250ZXh0Rm5cIlxuICAgICAgICAgICAgICAgIDpoZWxwZXI9XCJoZWxwZXJcIlxuICAgICAgICAgICAgICAgIEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJzZXQoZm9ybSwga2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2NvbXBvbmVudD5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHtcbiAgY29tcHV0ZWQsXG4gIGRlZmluZUNvbXBvbmVudCxcbiAgZ2V0Q3VycmVudEluc3RhbmNlLFxuICBvbk1vdW50ZWQsXG4gIHJlYWN0aXZlLFxuICBSZWYsXG4gIHJlZixcbiAgdG9SYXcsXG4gIHVucmVmLFxuICBVbndyYXBOZXN0ZWRSZWZzLFxuICB3YXRjaFxufSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBlYWNoLCBzZXQsIGNsb25lRGVlcCwgZW50cmllcywgZ2V0LCB1bnNldCwgZm9yRWFjaCwgbWVyZ2UgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBDb21wdXRlVmFsdWUsIHVzZUNvbXB1dGUgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1jb21wdXRlXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuLi8uLi91dGlscy91dGlsLmxvZ1wiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1tZXJnZVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBGb3JtU2NvcGVDb250ZXh0LCBTZXRGb3JtRGF0YU9wdGlvbnMsIHVzZVVpLCB1dGlscyB9IGZyb20gXCIuLi8uLi9pbmRleFwiO1xuXG4vKipcbiAqIOmFjee9ruWMlueahOihqOWNlee7hOS7tlxuICog5pq06Zyy55qE5pa55rOV77yaXG4gKiByZWYuc3VibWl0KCkgPSDmj5DkuqTooajljZVcbiAqIHJlZi5yZXNldCgpID0g6YeN572u6KGo5Y2VXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNGb3JtXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5Yid5aeL6KGo5Y2V5pWw5o2uXG4gICAgICoqL1xuICAgIGluaXRpYWxGb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlrZfmrrXmqKHniYhcbiAgICAgKiB7XG4gICAgICogICBrZXk6e1xuICAgICAqICAgICB0aXRsZTogXCLlrZfmrrXlkI3np7BcIixcbiAgICAgKiAgICAgY29tcG9uZW50OntcbiAgICAgKiAgICAgICBuYW1lOlwi57uE5Lu25ZCN56ewXCJcbiAgICAgKiAgICAgICAuLi7nu4Tku7blj4LmlbBcbiAgICAgKiAgICAgfVxuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiAqL1xuICAgIGNvbHVtbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5a2X5q615YiG57uEXG4gICAgICoge1xuICAgICAqICAgdHlwZToneHh4JywgLy/liIbnu4TlsZXnpLrnsbvlnotcbiAgICAgKiAgIGdyb3Vwczp7IC8v5YiG57uE5pWw5o2uXG4gICAgICogICAgIGdyb3VwS2V5OnsgdGl0bGU6J3h4eCcsY29sdW1uczpbJ2ZpZWxkS2V5JywnZmllbGRLZXknXX1cbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICovXG4gICAgZ3JvdXA6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6YeN572u6KGo5Y2V5ZCO55qE5pON5L2cXG4gICAgICovXG4gICAgZG9SZXNldDoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOeCueWHu+S/neWtmOaMiemSru+8jOihqOWNleagoemqjOWJjeaJp+ihjOaTjeS9nO+8iGFzeW5j77yJXG4gICAgICovXG4gICAgYmVmb3JlVmFsaWRhdGU6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDooajljZXmoKHpqozlrozlrozmiJDlkI7vvIzmj5DkuqTliY3lpITnkIbvvIhhc3luY++8iVxuICAgICAqL1xuICAgIGJlZm9yZVN1Ym1pdDoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOeCueWHu+S/neWtmOaMiemSruaXtuaJp+ihjOaTjeS9nO+8iGFzeW5j77yJXG4gICAgICovXG4gICAgZG9TdWJtaXQ6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDooajljZXmj5DkuqTlkI7lpITnkIbvvIhhc3luY++8iVxuICAgICAqL1xuICAgIGFmdGVyU3VibWl0OiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5o+S5qe95YaF5a65XG4gICAgICovXG4gICAgc2xvdHM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5biD5bGA5pa55byP44CQZmxleHxncmlk44CRXG4gICAgICovXG4gICAgZGlzcGxheToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogXCJmbGV4XCIgLy8gZmxleFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5bqP5Y+377yM57yW6L6R5pe25Lya5Lyg5YWlXG4gICAgICovXG4gICAgaW5kZXg6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5qih5byPIFthZGQsZWRpdCx2aWV3LOiHquWumuS5iV1cbiAgICAgKi9cbiAgICBtb2RlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGEtcm936YWN572uXG4gICAgICovXG4gICAgcm93OiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGVsLWNvbHxhLWNvbOmFjee9ru+8jOWPr+mFjee9rui3qOWIl1xuICAgICAqL1xuICAgIGNvbDoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBmb3JtSXRlbeeahOWFrOWFsemFjee9rlxuICAgICAqL1xuICAgIGZvcm1JdGVtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGhlbHBlcuS9jee9ru+8mntwb3NpdGlvbjonbGFiZWwnfVxuICAgICAqL1xuICAgIGhlbHBlcjoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcblxuICAgIHdhdGNoOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJyZXNldFwiLCBcInN1Ym1pdFwiLCBcInN1Y2Nlc3NcIiwgXCJ2YWxpZGF0aW9uRXJyb3JcIiwgXCJ2YWx1ZS1jaGFuZ2VcIiwgXCJpbml0XCJdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgQXN5bmNDb21wdXRlVmFsdWUsIGRvQ29tcHV0ZWQgfSA9IHVzZUNvbXB1dGUoKTtcbiAgICBjb25zdCBmb3JtUmVmID0gcmVmKCk7XG4gICAgY29uc3QgZm9ybTogVW53cmFwTmVzdGVkUmVmczxhbnk+ID0gcmVhY3RpdmUoe30pO1xuICAgIGNvbnN0IHsgcHJveHkgfSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuXG4gICAgdXRpbHMudHJhY2UoXCJmcy1mb3JtXCIpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxuICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgaWYgKGl0ZW0udmFsdWUgIT0gbnVsbCAmJiAoaXRlbS52YWx1ZSBpbnN0YW5jZW9mIEFzeW5jQ29tcHV0ZVZhbHVlIHx8IGl0ZW0udmFsdWUgaW5zdGFuY2VvZiBDb21wdXRlVmFsdWUpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiZm9ybS52YWx1ZemFjee9ruS4jeaUr+aMgUNvbXB1dGUvQXN5bmNDb21wdXRl57G75Z6L55qE5Yqo5oCB6K6h566XXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxGb3JtKCkge1xuICAgICAgY29uc3QgZm9ybSA9IHt9O1xuICAgICAgLy8g5Yid5aeL5pWw5o2u6LWL5YC8XG4gICAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtOiBhbnksIGtleTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZlZhbHVlID0gdW5yZWYoaXRlbS52YWx1ZSk7XG4gICAgICAgIGlmIChkZWZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0KGZvcm0sIGtleSwgZGVmVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG1lcmdlKGZvcm0sIGNsb25lRGVlcChwcm9wcy5pbml0aWFsRm9ybSkpO1xuICAgICAgcmV0dXJuIGZvcm07XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xuICAgIHNldEZvcm1EYXRhKGluaXRpYWxGb3JtKTtcblxuICAgIGNvbnN0IHNjb3BlOiBSZWY8Rm9ybVNjb3BlQ29udGV4dD4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByb3c6IGluaXRpYWxGb3JtLFxuICAgICAgICBmb3JtLFxuICAgICAgICBpbmRleDogcHJvcHMuaW5kZXgsXG4gICAgICAgIG1vZGU6IHByb3BzLm1vZGUgfHwgXCJhZGRcIixcbiAgICAgICAgYXR0cnM6IGN0eC5hdHRycyxcbiAgICAgICAgZ2V0Q29tcG9uZW50UmVmXG4gICAgICB9IGFzIEZvcm1TY29wZUNvbnRleHQ7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBnZXRDb250ZXh0Rm4oKSB7XG4gICAgICByZXR1cm4gc2NvcGUudmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLmNvbHVtbnM7XG4gICAgfSk7XG4gICAgLy9mb3JtLnZhbHVlQnVpbGRlclxuXG4gICAgZnVuY3Rpb24gZG9WYWx1ZUJ1aWxkZXIoZm9ybTogYW55KSB7XG4gICAgICBpZiAoZm9ybSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gZ2V0KGZvcm0sIGtleSk7XG4gICAgICAgIGlmIChpdGVtLnZhbHVlQnVpbGRlcikge1xuICAgICAgICAgIGl0ZW0udmFsdWVCdWlsZGVyKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcm93OiBpbml0aWFsRm9ybSxcbiAgICAgICAgICAgIGZvcm0sXG4gICAgICAgICAgICBpbmRleDogcHJvcHMuaW5kZXgsXG4gICAgICAgICAgICBtb2RlOiBwcm9wcy5tb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEZvcm1EYXRhKCkge1xuICAgICAgcmV0dXJuIGZvcm07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldEZvcm1EYXRhKGZvcm1EYXRhOiBhbnksIG9wdGlvbnM6IFNldEZvcm1EYXRhT3B0aW9ucyA9IHt9KSB7XG4gICAgICBkb1ZhbHVlQnVpbGRlcihmb3JtRGF0YSk7XG5cbiAgICAgIGlmIChvcHRpb25zLm1lcmdlRm9ybSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybSkge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1lcmdlKGZvcm0sIGZvcm1EYXRhKTtcbiAgICAgIGNvbnN0IHsgdmFsdWVDaGFuZ2UgfSA9IG9wdGlvbnM7XG4gICAgICBpZiAodmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgZm9yRWFjaChwcm9wcy5jb2x1bW5zLCAoY29sdW1uOiBhbnksIGtleTogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtW2tleV07XG4gICAgICAgICAgZG9WYWx1ZUNoYW5nZShrZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VDb2woLi4uY29sOiBhbnkpIHtcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuY29sLCAuLi5jb2wpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJ1aWxkSXRlbVNjb3BlKGl0ZW06IGFueSk6IEZvcm1TY29wZUNvbnRleHQge1xuICAgICAgcmV0dXJuIHsga2V5OiBpdGVtLmtleSwgLi4uc2NvcGUudmFsdWUgfTtcbiAgICB9XG5cbiAgICAvLyBkb1ZhbHVlQnVpbGRlcihmb3JtKTtcblxuICAgIC8vIHdhdGNoKFxuICAgIC8vICAgKCkgPT4gcHJvcHMuaW5pdGlhbEZvcm0sXG4gICAgLy8gICAoKSA9PiB7XG4gICAgLy8gICAgIHNldEZvcm1EYXRhKGNyZWF0ZUluaXRpYWxGb3JtKCksIHsgbWVyZ2VGb3JtOiBmYWxzZSB9KTtcbiAgICAvLyAgIH1cbiAgICAvLyApO1xuXG4gICAgZnVuY3Rpb24gZG9WYWx1ZUNoYW5nZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgY29uc3QgZXZlbnQgPSB7IGtleSwgdmFsdWUsIGZvcm1SZWY6IHByb3h5LCAuLi5zY29wZS52YWx1ZSwgaW1tZWRpYXRlOiBmYWxzZSB9O1xuICAgICAgY3R4LmVtaXQoXCJ2YWx1ZS1jaGFuZ2VcIiwgZXZlbnQpO1xuICAgICAgbGV0IHZhbHVlQ2hhbmdlID0gcHJvcHMuY29sdW1uc1trZXldLnZhbHVlQ2hhbmdlO1xuICAgICAgaWYgKHZhbHVlQ2hhbmdlKSB7XG4gICAgICAgIGlmICh2YWx1ZUNoYW5nZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgdmFsdWVDaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlQ2hhbmdlLmhhbmRsZSkge1xuICAgICAgICAgIHZhbHVlQ2hhbmdlLmhhbmRsZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmb3JtSXRlbVJlZnM6IFJlZiA9IHJlZih7fSk7XG5cbiAgICBmdW5jdGlvbiBnZXRGb3JtSXRlbVJlZihrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGZvcm1JdGVtUmVmcy52YWx1ZVtrZXldLmdldEZvcm1JdGVtUmVmKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGtleTogc3RyaW5nLCBpc0FzeW5jID0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBnZXRGb3JtSXRlbVJlZihrZXkpPy5nZXRDb21wb25lbnRSZWYoaXNBc3luYyk7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBBY3RpdmVLZXkgPSByZWYoW10pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxuICAgIGZvckVhY2gocHJvcHMuZ3JvdXA/Lmdyb3VwcywgKGdyb3VwSXRlbTogYW55LCBrZXk6IGFueSkgPT4ge1xuICAgICAgaWYgKGdyb3VwSXRlbS5jb2xsYXBzZWQgIT09IHRydWUpIHtcbiAgICAgICAgZ3JvdXBBY3RpdmVLZXkudmFsdWUucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2V0dXAtcHJvcHMtZGVzdHJ1Y3R1cmVcbiAgICBpZiAocHJvcHMuZ3JvdXA/Lmdyb3VwVHlwZSA9PT0gXCJ0YWJzXCIpIHtcbiAgICAgIGdyb3VwQWN0aXZlS2V5LnZhbHVlID0gZ3JvdXBBY3RpdmVLZXkudmFsdWUubGVuZ3RoID4gMCA/IGdyb3VwQWN0aXZlS2V5LnZhbHVlWzBdIDogbnVsbDtcbiAgICB9XG5cbiAgICAvL+aehOW7uuWIhue7hOaVsOaNrlxuICAgIGNvbnN0IGNvbXB1dGVkR3JvdXAgPSBkb0NvbXB1dGVkKFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvcHMuZ3JvdXA7XG4gICAgICB9LFxuICAgICAgZ2V0Q29udGV4dEZuLFxuICAgICAgbnVsbCxcbiAgICAgIChncm91cCA9IHt9KSA9PiB7XG4gICAgICAgIC8v5om+5Ye65rKh5pyJ5re75Yqg6L+b5YiG57uE55qE5a2X5q61XG4gICAgICAgIGNvbnN0IGdyb3VwZWRLZXlzOiBhbnkgPSB7fTtcbiAgICAgICAgZm9yRWFjaChncm91cD8uZ3JvdXBzLCAoZ3JvdXBJdGVtOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgZm9yRWFjaChncm91cEl0ZW0uY29sdW1ucywgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbXB1dGVkQ29sdW1ucy52YWx1ZVtpdGVtXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHV0aWxzLmxvZ2dlci53YXJuKFwi5peg5pWI55qE5YiG57uE5a2X5q6177yaXCIgKyBpdGVtKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JvdXBlZEtleXNbaXRlbV0gPSBrZXk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHR5cGUgPSBncm91cC5ncm91cFR5cGU7XG4gICAgICAgIGxldCB3cmFwcGVyID0ge1xuICAgICAgICAgIHBhcmVudDogdWkuY29sbGFwc2UubmFtZSxcbiAgICAgICAgICBjaGlsZDogdWkuY29sbGFwc2VJdGVtLm5hbWVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGUgPT09IFwidGFic1wiKSB7XG4gICAgICAgICAgd3JhcHBlci5wYXJlbnQgPSB1aS50YWJzLm5hbWU7XG4gICAgICAgICAgd3JhcHBlci5jaGlsZCA9IHVpLnRhYlBhbmUubmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAge1xuICAgICAgICAgICAgd3JhcHBlcixcbiAgICAgICAgICAgIGdyb3VwZWRLZXlzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBncm91cFxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBjb21wdXRlZERlZmF1bHRDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgY29sdW1uczogYW55ID0gW107XG4gICAgICAvL2RlZmF1bHQgY29sdW1uc+aOkuW6j1xuICAgICAgZm9yRWFjaChjb21wdXRlZENvbHVtbnMudmFsdWUsICh2YWx1ZTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gY2xvbmVEZWVwKHByb3BzLmZvcm1JdGVtIHx8IHt9KTtcbiAgICAgICAgdmFsdWUgPSBtZXJnZShpdGVtLCB2YWx1ZSk7XG4gICAgICAgIHZhbHVlLmtleSA9IGtleTtcbiAgICAgICAgaWYgKHZhbHVlLm9yZGVyID09IG51bGwpIHtcbiAgICAgICAgICB2YWx1ZS5vcmRlciA9IENvbnN0YW50cy5vcmRlckRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXB1dGVkR3JvdXAudmFsdWU/Lmdyb3VwZWRLZXlzID09IG51bGwgfHwgY29tcHV0ZWRHcm91cC52YWx1ZT8uZ3JvdXBlZEtleXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgY29sdW1ucy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZS5jb2wgPSBtZXJnZUNvbCh2YWx1ZS5jb2wpO1xuICAgICAgfSk7XG4gICAgICAvL+aOkuW6j1xuICAgICAgY29sdW1ucy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gYS5vcmRlciAtIGIub3JkZXI7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBnZXRGb3JtUmVmKCkge1xuICAgICAgcmV0dXJuIGZvcm1SZWYudmFsdWU7XG4gICAgfVxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgLy8gdWkuZm9ybS5yZXNldFdyYXAoZm9ybVJlZi52YWx1ZSwgeyBmb3JtLCBpbml0aWFsRm9ybTogY3JlYXRlSW5pdGlhbEZvcm0oKSB9KTtcbiAgICAgIGNvbnN0IGluaXRpYWxGb3JtID0gY3JlYXRlSW5pdGlhbEZvcm0oKTtcbiAgICAgIGNvbnN0IGVudHJpZXNSZXQgPSBlbnRyaWVzKGZvcm0pO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzUmV0KSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IGdldChpbml0aWFsRm9ybSwgZW50cnlbMF0pO1xuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICB1bnNldChmb3JtLCBlbnRyeVswXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0KGZvcm0sIGVudHJ5WzBdLCBpbml0aWFsVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5kb1Jlc2V0KSB7XG4gICAgICAgIGF3YWl0IHByb3BzLmRvUmVzZXQoc2NvcGUudmFsdWUpO1xuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJyZXNldFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZFJlZjogUmVmID0gcmVmKCk7XG4gICAgY29uc3QgZXJyb3JzUmVmOiBSZWYgPSByZWYoe30pO1xuXG4gICAgZnVuY3Rpb24gZmlsbEdyb3VwRXJyb3IoZmllbGRFcnJvcnM6IGFueSkge1xuICAgICAgaWYgKCFjb21wdXRlZEdyb3VwLnZhbHVlPy5ncm91cGVkS2V5cykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZmllbGRFcnJvcnMpIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBjb21wdXRlZEdyb3VwLnZhbHVlPy5ncm91cGVkS2V5c1trZXldO1xuICAgICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkge1xuICAgICAgICAgIGZpZWxkRXJyb3JzW1wiZ3JvdXAuXCIgKyBncm91cF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gICAgICBjb25zdCB2YWxpZGF0ZVNjb3BlID0geyAuLi5zY29wZS52YWx1ZSwgZm9ybSB9O1xuICAgICAgaWYgKHZhbGlkYXRlU2NvcGUubW9kZSA9PT0gXCJ2aWV3XCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmJlZm9yZVZhbGlkYXRlKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IHByb3BzLmJlZm9yZVZhbGlkYXRlKHZhbGlkYXRlU2NvcGUpO1xuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBlcnJvcnNSZWYudmFsdWUgPSB7fTtcbiAgICAgICAgYXdhaXQgdWkuZm9ybS52YWxpZGF0ZVdyYXAoZm9ybVJlZi52YWx1ZSk7XG4gICAgICAgIHZhbGlkUmVmLnZhbHVlID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICB2YWxpZFJlZi52YWx1ZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCB2YWxpZGF0ZUVycm9ycyA9IHVpLmZvcm0udHJhbnNmb3JtVmFsaWRhdGVFcnJvcnMoZSk7XG4gICAgICAgIGZpbGxHcm91cEVycm9yKHZhbGlkYXRlRXJyb3JzKTtcbiAgICAgICAgZXJyb3JzUmVmLnZhbHVlID0gdmFsaWRhdGVFcnJvcnM7XG4gICAgICAgIGN0eC5lbWl0KFwidmFsaWRhdGlvbkVycm9yXCIsIHNjb3BlLnZhbHVlKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gc3VibWl0KCkge1xuICAgICAgYXdhaXQgdmFsaWRhdGUoKTtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gY2xvbmVEZWVwKHRvUmF3KGZvcm0pKTtcbiAgICAgIGNvbnN0IHN1Ym1pdFNjb3BlID0geyAuLi5zY29wZS52YWx1ZSwgZm9ybTogZm9ybURhdGEgfTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImZvcm0gc3VibWl0XCIsIEpTT04uc3RyaW5naWZ5KGZvcm0pKTtcbiAgICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gZ2V0KGZvcm1EYXRhLCBrZXkpO1xuICAgICAgICBpZiAoaXRlbS52YWx1ZVJlc29sdmUpIHtcbiAgICAgICAgICBpdGVtLnZhbHVlUmVzb2x2ZSh7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIC4uLnN1Ym1pdFNjb3BlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocHJvcHMuYmVmb3JlU3VibWl0KSB7XG4gICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IHByb3BzLmJlZm9yZVN1Ym1pdChzdWJtaXRTY29wZSk7XG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8v56e76Zmk5LiN5YWB6K645o+Q5Lqk55qE5a2X5q61XG4gICAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnN1Ym1pdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB1bnNldChmb3JtRGF0YSwga2V5KTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnN1Ym1pdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIC8v6K6+572u5by65Yi25o+Q5Lqk55qE5a2X5q61XG4gICAgICAgICAgc2V0KGZvcm1EYXRhLCBrZXksIGZvcm1EYXRhW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHByb3BzLmRvU3VibWl0KSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHByb3BzLmRvU3VibWl0KHN1Ym1pdFNjb3BlKTtcbiAgICAgICAgc3VibWl0U2NvcGUucmVzID0gcmVzO1xuICAgICAgICBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJzdWJtaXRcIiwgc3VibWl0U2NvcGUpO1xuICAgICAgaWYgKHByb3BzLmFmdGVyU3VibWl0KSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBwcm9wcy5hZnRlclN1Ym1pdChzdWJtaXRTY29wZSk7XG4gICAgICAgIGlmIChzdWNjZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJzdWNjZXNzXCIsIHN1Ym1pdFNjb3BlKTtcblxuICAgICAgcmV0dXJuIHN1Ym1pdFNjb3BlO1xuICAgIH1cblxuICAgIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgICAvLyBpbW1lZGlhdGUgdmFsdWVDaGFuZ2Xop6blj5FcbiAgICAgIGZvckVhY2goY29tcHV0ZWRDb2x1bW5zLnZhbHVlLCAoaXRlbTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoaXRlbS52YWx1ZUNoYW5nZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWx1ZUNoYW5nZSA9IGl0ZW0udmFsdWVDaGFuZ2U7XG4gICAgICAgIGlmICh2YWx1ZUNoYW5nZSAmJiB2YWx1ZUNoYW5nZS5pbW1lZGlhdGUgPT09IHRydWUgJiYgdmFsdWVDaGFuZ2UuaGFuZGxlKSB7XG4gICAgICAgICAgY29uc3QgZXZlbnQgPSB7IGtleSwgdmFsdWU6IGZvcm1ba2V5XSwgZm9ybVJlZjogcHJveHksIC4uLnNjb3BlLnZhbHVlLCBpbW1lZGlhdGU6IHRydWUgfTtcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2UuaGFuZGxlKSB7XG4gICAgICAgICAgICB2YWx1ZUNoYW5nZS5oYW5kbGUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBmb3JtSXRlbVNob3coaXRlbTogYW55KSB7XG4gICAgICBpZiAoaXRlbSAmJiB1bnJlZihpdGVtLnNob3cpICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ3JvdXBJdGVtU2hvdyhncm91cEl0ZW06IGFueSkge1xuICAgICAgaWYgKCFncm91cEl0ZW0uY29sdW1ucykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodW5yZWYoZ3JvdXBJdGVtLnNob3cpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGtleSBvZiBncm91cEl0ZW0uY29sdW1ucykge1xuICAgICAgICBpZiAoY29tcHV0ZWRDb2x1bW5zLnZhbHVlW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzRmllbGRTaG93ID0gZm9ybUl0ZW1TaG93KGNvbXB1dGVkQ29sdW1ucy52YWx1ZVtrZXldKTtcbiAgICAgICAgaWYgKGlzRmllbGRTaG93KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMud2F0Y2gpIHtcbiAgICAgIHdhdGNoKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZvcm07XG4gICAgICAgIH0sXG4gICAgICAgIChuZXdWYWwsIG9sZFZhbCkgPT4ge1xuICAgICAgICAgIGlmIChwcm9wcy53YXRjaCkge1xuICAgICAgICAgICAgcHJvcHMud2F0Y2goc2NvcGUudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgICAgaW1tZWRpYXRlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEaXJ0eSgpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IEpTT04uc3RyaW5naWZ5KGluaXRpYWxGb3JtKTtcbiAgICAgIGNvbnN0IGFmdGVyID0gSlNPTi5zdHJpbmdpZnkoZm9ybSk7XG4gICAgICByZXR1cm4gYmVmb3JlICE9PSBhZnRlcjtcbiAgICB9XG5cbiAgICBjb25zdCBtZXJnZWRTbG90cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuc2xvdHMsIGN0eC5zbG90cyk7XG4gICAgfSk7XG5cbiAgICBjdHguZW1pdChcImluaXRcIiwgc2NvcGUudmFsdWUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdldDogKGZvcm06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldChmb3JtLCBrZXkpO1xuICAgICAgfSxcbiAgICAgIHNldDogKGZvcm06IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgc2V0KGZvcm0sIGtleSwgdmFsdWUpO1xuICAgICAgICBkb1ZhbHVlQ2hhbmdlKGtleSwgdmFsdWUpO1xuICAgICAgfSxcbiAgICAgIHVpLFxuICAgICAgdmFsaWRSZWYsXG4gICAgICBlcnJvcnNSZWYsXG4gICAgICBmb3JtUmVmLFxuICAgICAgY29tcHV0ZWRDb2x1bW5zLFxuICAgICAgY29tcHV0ZWREZWZhdWx0Q29sdW1ucyxcbiAgICAgIHN1Ym1pdCxcbiAgICAgIHJlc2V0LFxuICAgICAgZ2V0Rm9ybVJlZixcbiAgICAgIHNjb3BlLFxuICAgICAgYnVpbGRJdGVtU2NvcGUsXG4gICAgICBncm91cEFjdGl2ZUtleSxcbiAgICAgIGZvcm0sXG4gICAgICBmb3JtSXRlbVJlZnMsXG4gICAgICBnZXRGb3JtRGF0YSxcbiAgICAgIHNldEZvcm1EYXRhLFxuICAgICAgZ2V0Q29tcG9uZW50UmVmLFxuICAgICAgbWVyZ2VDb2wsXG4gICAgICB2YWxpZGF0ZSxcbiAgICAgIGNvbXB1dGVkR3JvdXAsXG4gICAgICBnZXRDb250ZXh0Rm4sXG4gICAgICBmb3JtSXRlbVNob3csXG4gICAgICBncm91cEl0ZW1TaG93LFxuICAgICAgaXNEaXJ0eSxcbiAgICAgIG1lcmdlZFNsb3RzXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtZm9ybSB7XG4gIC5lbC1jb2xsYXBzZS1pdGVtX19jb250ZW50IHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgIHBhZGRpbmctbGVmdDogMzBweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAzMHB4O1xuICB9XG5cbiAgLmZzLWZvcm0taW52YWxpZCB7XG4gIH1cblxuICAuZnMtZm9ybS1pdGVtLWNvbXBvbmVudCB7XG4gICAgLmFudC1waWNrZXIsXG4gICAgLmFudC1pbnB1dC1hZmZpeC13cmFwcGVyLFxuICAgIC5hbnQtaW5wdXQtbnVtYmVyLFxuICAgIC5lbC1jYXNjYWRlcixcbiAgICAuZWwtZGF0ZS1lZGl0b3IsXG4gICAgLmVsLWlucHV0LW51bWJlcixcbiAgICAuZWwtaW5wdXQsXG4gICAgPiAuZWwtc2VsZWN0LFxuICAgID4gLm4tc2VsZWN0LFxuICAgIC5uLWRhdGUtcGlja2VyLFxuICAgIC5uLWlucHV0LW51bWJlciB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZWwtZGF0ZS1lZGl0b3IgLmVsLXJhbmdlX19pY29uIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIH1cbiAgICAuZWwtZGF0ZS1lZGl0b3IgLmVsLXJhbmdlX19jbG9zZS1pY29uIHtcbiAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICB9XG5cbiAgICAuZWwtcmFuZ2UtZWRpdG9yLmVsLWlucHV0X193cmFwcGVyIHtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuICB9XG5cbiAgLy8uZWwtZGF0ZS1lZGl0b3IuZWwtaW5wdXRfX3dyYXBwZXIge1xuICAvLyAgd2lkdGg6IDEwMCU7XG4gIC8vfVxufVxuXG4uZnMtZm9ybS1ncmlkIHtcbiAgLmZzLXJvdyB7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDUwJSA1MCU7XG4gICAgLy8gZ2FwOiAwIDIwcHg7IC8v5YiX6Ze06LedIDIwcHhcbiAgICAuZnMtY29sIHtcbiAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cblxuICAgIC8vIGFudGR2XG4gICAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xuICAgICAgd2lkdGg6IDEwMHB4O1xuICAgICAgZmxleDogbm9uZTtcbiAgICAgIG1heC13aWR0aDogbm9uZTtcbiAgICB9XG4gICAgLmFudC1mb3JtLWl0ZW0tY29udHJvbC13cmFwcGVyIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBtYXgtd2lkdGg6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgLy8gZWxlbWVudFxuICAuZWwtcm93OjphZnRlcixcbiAgLmVsLXJvdzo6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG4uZnMtZm9ybS1mbGV4IHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgLmZzLXJvdyB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XG4gIC5mcy1mb3JtLWZsZXgge1xuICAgIC5mcy1yb3cge1xuICAgICAgLmZzLWNvbCB7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGZsZXg6IDAgMCAxMDAlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNTc1cHgpIHtcbiAgLmZzLWZvcm0tZmxleCB7XG4gICAgLmZzLXJvdyB7XG4gICAgICAuZnMtY29sIHtcbiAgICAgICAgLy8uYW50LWZvcm0taXRlbS1sYWJlbCB7XG4gICAgICAgIC8vICBmbGV4OiBub25lO1xuICAgICAgICAvL31cbiAgICAgICAgLy8uYW50LWZvcm0taXRlbSAuYW50LWZvcm0taXRlbS1jb250cm9sIHtcbiAgICAgICAgLy8gIGZsZXg6IDE7XG4gICAgICAgIC8vICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICAgIC8vfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cInVpLmZvcm0ubmFtZVwiXG4gICAgcmVmPVwiZm9ybVJlZlwiXG4gICAgY2xhc3M9XCJmcy1mb3JtXCJcbiAgICA6Y2xhc3M9XCJ7XG4gICAgICAnZnMtZm9ybS1ncmlkJzogZGlzcGxheSA9PT0gJ2dyaWQnLFxuICAgICAgJ2ZzLWZvcm0tZmxleCc6IGRpc3BsYXkgPT09ICdmbGV4JyxcbiAgICAgICdmcy1mb3JtLWludmFsaWQnOiB2YWxpZFJlZiA9PT0gZmFsc2VcbiAgICB9XCJcbiAgICBvbnN1Ym1pdD1cImV2ZW50LnByZXZlbnREZWZhdWx0KCk7XCJcbiAgICA6bW9kZWw9XCJmb3JtXCJcbiAgPlxuICAgIDwhLS0gcm93IC0tPlxuICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiBjbGFzcz1cImZzLXJvd1wiIHYtYmluZD1cInJvd1wiPlxuICAgICAgPCEtLSBjb2wgLS0+XG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCJpdGVtIGluIGNvbXB1dGVkRGVmYXVsdENvbHVtbnNcIiA6a2V5PVwiaXRlbT8ua2V5XCI+XG4gICAgICAgIDxmcy1mb3JtLWl0ZW0tY29sXG4gICAgICAgICAgOnJlZj1cIlxuICAgICAgICAgICAgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgZm9ybUl0ZW1SZWZzW2l0ZW0ua2V5XSA9IGVsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXCJcbiAgICAgICAgICA6Y29sPVwibWVyZ2VDb2woaXRlbS5jb2wpXCJcbiAgICAgICAgICA6aXRlbT1cIml0ZW1cIlxuICAgICAgICAgIDpoZWxwZXI9XCJoZWxwZXJcIlxuICAgICAgICAgIDptb2RlbC12YWx1ZT1cImdldChmb3JtLCBpdGVtLmtleSlcIlxuICAgICAgICAgIDpzbG90cz1cIm1lcmdlZFNsb3RzWydmb3JtXycgKyBpdGVtLmtleV1cIlxuICAgICAgICAgIDpnZXQtY29udGV4dC1mbj1cImdldENvbnRleHRGblwiXG4gICAgICAgICAgQHVwZGF0ZTptb2RlbC12YWx1ZT1cInNldChmb3JtLCBpdGVtLmtleSwgJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvY29tcG9uZW50PlxuICAgIDxjb21wb25lbnRcbiAgICAgIDppcz1cImNvbXB1dGVkR3JvdXAud3JhcHBlci5wYXJlbnRcIlxuICAgICAgdi1pZj1cImNvbXB1dGVkR3JvdXAud3JhcHBlclwiXG4gICAgICB2LW1vZGVsOlt1aS5jb2xsYXBzZS5tb2RlbFZhbHVlXT1cImdyb3VwQWN0aXZlS2V5XCJcbiAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCVcIlxuICAgICAgdi1iaW5kPVwiY29tcHV0ZWRHcm91cFwiXG4gICAgPlxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGdyb3VwSXRlbSwgZ3JvdXBLZXkpIG9mIGNvbXB1dGVkR3JvdXAuZ3JvdXBzXCIgOmtleT1cImdyb3VwS2V5XCI+XG4gICAgICAgIDxjb21wb25lbnRcbiAgICAgICAgICA6aXM9XCJjb21wdXRlZEdyb3VwLndyYXBwZXIuY2hpbGRcIlxuICAgICAgICAgIHYtaWY9XCJncm91cEl0ZW1TaG93KGdyb3VwSXRlbSlcIlxuICAgICAgICAgIDpbdWkuY29sbGFwc2Uua2V5TmFtZV09XCJncm91cEtleVwiXG4gICAgICAgICAgdi1iaW5kPVwiZ3JvdXBJdGVtXCJcbiAgICAgICAgICA6Y2xhc3M9XCJ7ICdmcy1mb3JtLWdyb3VwLWVycm9yJzogZXJyb3JzUmVmWydncm91cC4nICsgZ3JvdXBLZXldIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIHNsb3ROYW1lKSBvZiBncm91cEl0ZW0uc2xvdHNcIiA6a2V5PVwic2xvdE5hbWVcIiAjW3Nsb3ROYW1lXT1cInNjb3BlXCI+XG4gICAgICAgICAgICA8ZnMtcmVuZGVyIDpyZW5kZXItZnVuYz1cIml0ZW1cIiA6c2NvcGU9XCJ7IC4uLnNjb3BlLCBoYXNFcnJvcjogZXJyb3JzUmVmWydncm91cC4nICsgZ3JvdXBLZXldIH1cIiAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPCEtLSByb3cgLS0+XG4gICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yb3cubmFtZVwiIGNsYXNzPVwiZnMtcm93XCIgdi1iaW5kPVwicm93XCI+XG4gICAgICAgICAgICA8IS0tIGNvbCAtLT5cbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cImtleSBpbiBncm91cEl0ZW0uY29sdW1uc1wiIDprZXk9XCJrZXlcIj5cbiAgICAgICAgICAgICAgPGZzLWZvcm0taXRlbS1jb2xcbiAgICAgICAgICAgICAgICB2LWlmPVwiY29tcHV0ZWRDb2x1bW5zW2tleV1cIlxuICAgICAgICAgICAgICAgIDpyZWY9XCJcbiAgICAgICAgICAgICAgICAgIChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1JdGVtUmVmc1trZXldID0gZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIDpjb2w9XCJtZXJnZUNvbChjb21wdXRlZENvbHVtbnNba2V5XS5jb2wpXCJcbiAgICAgICAgICAgICAgICA6aXRlbT1cImNvbXB1dGVkQ29sdW1uc1trZXldXCJcbiAgICAgICAgICAgICAgICA6bW9kZWwtdmFsdWU9XCJnZXQoZm9ybSwga2V5KVwiXG4gICAgICAgICAgICAgICAgOnNsb3RzPVwibWVyZ2VkU2xvdHNbJ2Zvcm1fJyArIGtleV1cIlxuICAgICAgICAgICAgICAgIDpnZXQtY29udGV4dC1mbj1cImdldENvbnRleHRGblwiXG4gICAgICAgICAgICAgICAgOmhlbHBlcj1cImhlbHBlclwiXG4gICAgICAgICAgICAgICAgQHVwZGF0ZTptb2RlbC12YWx1ZT1cInNldChmb3JtLCBrZXksICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvY29tcG9uZW50PlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQge1xuICBjb21wdXRlZCxcbiAgZGVmaW5lQ29tcG9uZW50LFxuICBnZXRDdXJyZW50SW5zdGFuY2UsXG4gIG9uTW91bnRlZCxcbiAgcmVhY3RpdmUsXG4gIFJlZixcbiAgcmVmLFxuICB0b1JhdyxcbiAgdW5yZWYsXG4gIFVud3JhcE5lc3RlZFJlZnMsXG4gIHdhdGNoXG59IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IGVhY2gsIHNldCwgY2xvbmVEZWVwLCBlbnRyaWVzLCBnZXQsIHVuc2V0LCBmb3JFYWNoLCBtZXJnZSB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IENvbXB1dGVWYWx1ZSwgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwubG9nXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLW1lcmdlXCI7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcbmltcG9ydCB7IEZvcm1TY29wZUNvbnRleHQsIFNldEZvcm1EYXRhT3B0aW9ucywgdXNlVWksIHV0aWxzIH0gZnJvbSBcIi4uLy4uL2luZGV4XCI7XG5cbi8qKlxuICog6YWN572u5YyW55qE6KGo5Y2V57uE5Lu2XG4gKiDmmrTpnLLnmoTmlrnms5XvvJpcbiAqIHJlZi5zdWJtaXQoKSA9IOaPkOS6pOihqOWNlVxuICogcmVmLnJlc2V0KCkgPSDph43nva7ooajljZVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0Zvcm1cIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDliJ3lp4vooajljZXmlbDmja5cbiAgICAgKiovXG4gICAgaW5pdGlhbEZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWtl+auteaooeeJiFxuICAgICAqIHtcbiAgICAgKiAgIGtleTp7XG4gICAgICogICAgIHRpdGxlOiBcIuWtl+auteWQjeensFwiLFxuICAgICAqICAgICBjb21wb25lbnQ6e1xuICAgICAqICAgICAgIG5hbWU6XCLnu4Tku7blkI3np7BcIlxuICAgICAqICAgICAgIC4uLue7hOS7tuWPguaVsFxuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqICovXG4gICAgY29sdW1uczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlrZfmrrXliIbnu4RcbiAgICAgKiB7XG4gICAgICogICB0eXBlOid4eHgnLCAvL+WIhue7hOWxleekuuexu+Wei1xuICAgICAqICAgZ3JvdXBzOnsgLy/liIbnu4TmlbDmja5cbiAgICAgKiAgICAgZ3JvdXBLZXk6eyB0aXRsZToneHh4Jyxjb2x1bW5zOlsnZmllbGRLZXknLCdmaWVsZEtleSddfVxuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKi9cbiAgICBncm91cDoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDph43nva7ooajljZXlkI7nmoTmk43kvZxcbiAgICAgKi9cbiAgICBkb1Jlc2V0OiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog54K55Ye75L+d5a2Y5oyJ6ZKu77yM6KGo5Y2V5qCh6aqM5YmN5omn6KGM5pON5L2c77yIYXN5bmPvvIlcbiAgICAgKi9cbiAgICBiZWZvcmVWYWxpZGF0ZToge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOWNleagoemqjOWujOWujOaIkOWQju+8jOaPkOS6pOWJjeWkhOeQhu+8iGFzeW5j77yJXG4gICAgICovXG4gICAgYmVmb3JlU3VibWl0OiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog54K55Ye75L+d5a2Y5oyJ6ZKu5pe25omn6KGM5pON5L2c77yIYXN5bmPvvIlcbiAgICAgKi9cbiAgICBkb1N1Ym1pdDoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOWNleaPkOS6pOWQjuWkhOeQhu+8iGFzeW5j77yJXG4gICAgICovXG4gICAgYWZ0ZXJTdWJtaXQ6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmj5Lmp73lhoXlrrlcbiAgICAgKi9cbiAgICBzbG90czoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDluIPlsYDmlrnlvI/jgJBmbGV4fGdyaWTjgJFcbiAgICAgKi9cbiAgICBkaXNwbGF5OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcImZsZXhcIiAvLyBmbGV4XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDluo/lj7fvvIznvJbovpHml7bkvJrkvKDlhaVcbiAgICAgKi9cbiAgICBpbmRleDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmqKHlvI8gW2FkZCxlZGl0LHZpZXcs6Ieq5a6a5LmJXVxuICAgICAqL1xuICAgIG1vZGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICogYS1yb3fphY3nva5cbiAgICAgKi9cbiAgICByb3c6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICogZWwtY29sfGEtY29s6YWN572u77yM5Y+v6YWN572u6Leo5YiXXG4gICAgICovXG4gICAgY29sOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGZvcm1JdGVt55qE5YWs5YWx6YWN572uXG4gICAgICovXG4gICAgZm9ybUl0ZW06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICogaGVscGVy5L2N572u77yae3Bvc2l0aW9uOidsYWJlbCd9XG4gICAgICovXG4gICAgaGVscGVyOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuXG4gICAgd2F0Y2g6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcInJlc2V0XCIsIFwic3VibWl0XCIsIFwic3VjY2Vzc1wiLCBcInZhbGlkYXRpb25FcnJvclwiLCBcInZhbHVlLWNoYW5nZVwiLCBcImluaXRcIl0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgeyBBc3luY0NvbXB1dGVWYWx1ZSwgZG9Db21wdXRlZCB9ID0gdXNlQ29tcHV0ZSgpO1xuICAgIGNvbnN0IGZvcm1SZWYgPSByZWYoKTtcbiAgICBjb25zdCBmb3JtOiBVbndyYXBOZXN0ZWRSZWZzPGFueT4gPSByZWFjdGl2ZSh7fSk7XG4gICAgY29uc3QgeyBwcm94eSB9ID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cbiAgICB1dGlscy50cmFjZShcImZzLWZvcm1cIik7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNldHVwLXByb3BzLWRlc3RydWN0dXJlXG4gICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55KSA9PiB7XG4gICAgICBpZiAoaXRlbS52YWx1ZSAhPSBudWxsICYmIChpdGVtLnZhbHVlIGluc3RhbmNlb2YgQXN5bmNDb21wdXRlVmFsdWUgfHwgaXRlbS52YWx1ZSBpbnN0YW5jZW9mIENvbXB1dGVWYWx1ZSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJmb3JtLnZhbHVl6YWN572u5LiN5pSv5oyBQ29tcHV0ZS9Bc3luY0NvbXB1dGXnsbvlnovnmoTliqjmgIHorqHnrpdcIik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gY3JlYXRlSW5pdGlhbEZvcm0oKSB7XG4gICAgICBjb25zdCBmb3JtID0ge307XG4gICAgICAvLyDliJ3lp4vmlbDmja7otYvlgLxcbiAgICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZGVmVmFsdWUgPSB1bnJlZihpdGVtLnZhbHVlKTtcbiAgICAgICAgaWYgKGRlZlZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzZXQoZm9ybSwga2V5LCBkZWZWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbWVyZ2UoZm9ybSwgY2xvbmVEZWVwKHByb3BzLmluaXRpYWxGb3JtKSk7XG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWFsRm9ybSA9IGNyZWF0ZUluaXRpYWxGb3JtKCk7XG4gICAgc2V0Rm9ybURhdGEoaW5pdGlhbEZvcm0pO1xuXG4gICAgY29uc3Qgc2NvcGU6IFJlZjxGb3JtU2NvcGVDb250ZXh0PiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJvdzogaW5pdGlhbEZvcm0sXG4gICAgICAgIGZvcm0sXG4gICAgICAgIGluZGV4OiBwcm9wcy5pbmRleCxcbiAgICAgICAgbW9kZTogcHJvcHMubW9kZSB8fCBcImFkZFwiLFxuICAgICAgICBhdHRyczogY3R4LmF0dHJzLFxuICAgICAgICBnZXRDb21wb25lbnRSZWZcbiAgICAgIH0gYXMgRm9ybVNjb3BlQ29udGV4dDtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGdldENvbnRleHRGbigpIHtcbiAgICAgIHJldHVybiBzY29wZS52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMuY29sdW1ucztcbiAgICB9KTtcbiAgICAvL2Zvcm0udmFsdWVCdWlsZGVyXG5cbiAgICBmdW5jdGlvbiBkb1ZhbHVlQnVpbGRlcihmb3JtOiBhbnkpIHtcbiAgICAgIGlmIChmb3JtID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55LCBrZXk6IGFueSkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBnZXQoZm9ybSwga2V5KTtcbiAgICAgICAgaWYgKGl0ZW0udmFsdWVCdWlsZGVyKSB7XG4gICAgICAgICAgaXRlbS52YWx1ZUJ1aWxkZXIoe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICByb3c6IGluaXRpYWxGb3JtLFxuICAgICAgICAgICAgZm9ybSxcbiAgICAgICAgICAgIGluZGV4OiBwcm9wcy5pbmRleCxcbiAgICAgICAgICAgIG1vZGU6IHByb3BzLm1vZGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Rm9ybURhdGEoKSB7XG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0Rm9ybURhdGEoZm9ybURhdGE6IGFueSwgb3B0aW9uczogU2V0Rm9ybURhdGFPcHRpb25zID0ge30pIHtcbiAgICAgIGRvVmFsdWVCdWlsZGVyKGZvcm1EYXRhKTtcblxuICAgICAgaWYgKG9wdGlvbnMubWVyZ2VGb3JtID09PSBmYWxzZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtKSB7XG4gICAgICAgICAgZGVsZXRlIGZvcm1ba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWVyZ2UoZm9ybSwgZm9ybURhdGEpO1xuICAgICAgY29uc3QgeyB2YWx1ZUNoYW5nZSB9ID0gb3B0aW9ucztcbiAgICAgIGlmICh2YWx1ZUNoYW5nZSkge1xuICAgICAgICBmb3JFYWNoKHByb3BzLmNvbHVtbnMsIChjb2x1bW46IGFueSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1ba2V5XTtcbiAgICAgICAgICBkb1ZhbHVlQ2hhbmdlKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUNvbCguLi5jb2w6IGFueSkge1xuICAgICAgcmV0dXJuIG1lcmdlKHt9LCBwcm9wcy5jb2wsIC4uLmNvbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnVpbGRJdGVtU2NvcGUoaXRlbTogYW55KTogRm9ybVNjb3BlQ29udGV4dCB7XG4gICAgICByZXR1cm4geyBrZXk6IGl0ZW0ua2V5LCAuLi5zY29wZS52YWx1ZSB9O1xuICAgIH1cblxuICAgIC8vIGRvVmFsdWVCdWlsZGVyKGZvcm0pO1xuXG4gICAgLy8gd2F0Y2goXG4gICAgLy8gICAoKSA9PiBwcm9wcy5pbml0aWFsRm9ybSxcbiAgICAvLyAgICgpID0+IHtcbiAgICAvLyAgICAgc2V0Rm9ybURhdGEoY3JlYXRlSW5pdGlhbEZvcm0oKSwgeyBtZXJnZUZvcm06IGZhbHNlIH0pO1xuICAgIC8vICAgfVxuICAgIC8vICk7XG5cbiAgICBmdW5jdGlvbiBkb1ZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICBjb25zdCBldmVudCA9IHsga2V5LCB2YWx1ZSwgZm9ybVJlZjogcHJveHksIC4uLnNjb3BlLnZhbHVlLCBpbW1lZGlhdGU6IGZhbHNlIH07XG4gICAgICBjdHguZW1pdChcInZhbHVlLWNoYW5nZVwiLCBldmVudCk7XG4gICAgICBsZXQgdmFsdWVDaGFuZ2UgPSBwcm9wcy5jb2x1bW5zW2tleV0udmFsdWVDaGFuZ2U7XG4gICAgICBpZiAodmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgaWYgKHZhbHVlQ2hhbmdlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICB2YWx1ZUNoYW5nZShldmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVDaGFuZ2UuaGFuZGxlKSB7XG4gICAgICAgICAgdmFsdWVDaGFuZ2UuaGFuZGxlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvcm1JdGVtUmVmczogUmVmID0gcmVmKHt9KTtcblxuICAgIGZ1bmN0aW9uIGdldEZvcm1JdGVtUmVmKGtleTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZm9ybUl0ZW1SZWZzLnZhbHVlW2tleV0uZ2V0Rm9ybUl0ZW1SZWYoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoa2V5OiBzdHJpbmcsIGlzQXN5bmMgPSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGdldEZvcm1JdGVtUmVmKGtleSk/LmdldENvbXBvbmVudFJlZihpc0FzeW5jKTtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cEFjdGl2ZUtleSA9IHJlZihbXSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNldHVwLXByb3BzLWRlc3RydWN0dXJlXG4gICAgZm9yRWFjaChwcm9wcy5ncm91cD8uZ3JvdXBzLCAoZ3JvdXBJdGVtOiBhbnksIGtleTogYW55KSA9PiB7XG4gICAgICBpZiAoZ3JvdXBJdGVtLmNvbGxhcHNlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBncm91cEFjdGl2ZUtleS52YWx1ZS5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxuICAgIGlmIChwcm9wcy5ncm91cD8uZ3JvdXBUeXBlID09PSBcInRhYnNcIikge1xuICAgICAgZ3JvdXBBY3RpdmVLZXkudmFsdWUgPSBncm91cEFjdGl2ZUtleS52YWx1ZS5sZW5ndGggPiAwID8gZ3JvdXBBY3RpdmVLZXkudmFsdWVbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIC8v5p6E5bu65YiG57uE5pWw5o2uXG4gICAgY29uc3QgY29tcHV0ZWRHcm91cCA9IGRvQ29tcHV0ZWQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9wcy5ncm91cDtcbiAgICAgIH0sXG4gICAgICBnZXRDb250ZXh0Rm4sXG4gICAgICBudWxsLFxuICAgICAgKGdyb3VwID0ge30pID0+IHtcbiAgICAgICAgLy/mib7lh7rmsqHmnInmt7vliqDov5vliIbnu4TnmoTlrZfmrrVcbiAgICAgICAgY29uc3QgZ3JvdXBlZEtleXM6IGFueSA9IHt9O1xuICAgICAgICBmb3JFYWNoKGdyb3VwPy5ncm91cHMsIChncm91cEl0ZW06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBmb3JFYWNoKGdyb3VwSXRlbS5jb2x1bW5zLCAoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcHV0ZWRDb2x1bW5zLnZhbHVlW2l0ZW1dID09IG51bGwpIHtcbiAgICAgICAgICAgICAgdXRpbHMubG9nZ2VyLndhcm4oXCLml6DmlYjnmoTliIbnu4TlrZfmrrXvvJpcIiArIGl0ZW0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cGVkS2V5c1tpdGVtXSA9IGtleTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdHlwZSA9IGdyb3VwLmdyb3VwVHlwZTtcbiAgICAgICAgbGV0IHdyYXBwZXIgPSB7XG4gICAgICAgICAgcGFyZW50OiB1aS5jb2xsYXBzZS5uYW1lLFxuICAgICAgICAgIGNoaWxkOiB1aS5jb2xsYXBzZUl0ZW0ubmFtZVxuICAgICAgICB9O1xuICAgICAgICBpZiAodHlwZSA9PT0gXCJ0YWJzXCIpIHtcbiAgICAgICAgICB3cmFwcGVyLnBhcmVudCA9IHVpLnRhYnMubmFtZTtcbiAgICAgICAgICB3cmFwcGVyLmNoaWxkID0gdWkudGFiUGFuZS5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3cmFwcGVyLFxuICAgICAgICAgICAgZ3JvdXBlZEtleXNcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdyb3VwXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IGNvbXB1dGVkRGVmYXVsdENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5zOiBhbnkgPSBbXTtcbiAgICAgIC8vZGVmYXVsdCBjb2x1bW5z5o6S5bqPXG4gICAgICBmb3JFYWNoKGNvbXB1dGVkQ29sdW1ucy52YWx1ZSwgKHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBjbG9uZURlZXAocHJvcHMuZm9ybUl0ZW0gfHwge30pO1xuICAgICAgICB2YWx1ZSA9IG1lcmdlKGl0ZW0sIHZhbHVlKTtcbiAgICAgICAgdmFsdWUua2V5ID0ga2V5O1xuICAgICAgICBpZiAodmFsdWUub3JkZXIgPT0gbnVsbCkge1xuICAgICAgICAgIHZhbHVlLm9yZGVyID0gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHV0ZWRHcm91cC52YWx1ZT8uZ3JvdXBlZEtleXMgPT0gbnVsbCB8fCBjb21wdXRlZEdyb3VwLnZhbHVlPy5ncm91cGVkS2V5c1trZXldID09IG51bGwpIHtcbiAgICAgICAgICBjb2x1bW5zLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlLmNvbCA9IG1lcmdlQ29sKHZhbHVlLmNvbCk7XG4gICAgICB9KTtcbiAgICAgIC8v5o6S5bqPXG4gICAgICBjb2x1bW5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGdldEZvcm1SZWYoKSB7XG4gICAgICByZXR1cm4gZm9ybVJlZi52YWx1ZTtcbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAvLyB1aS5mb3JtLnJlc2V0V3JhcChmb3JtUmVmLnZhbHVlLCB7IGZvcm0sIGluaXRpYWxGb3JtOiBjcmVhdGVJbml0aWFsRm9ybSgpIH0pO1xuICAgICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xuICAgICAgY29uc3QgZW50cmllc1JldCA9IGVudHJpZXMoZm9ybSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXNSZXQpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gZ2V0KGluaXRpYWxGb3JtLCBlbnRyeVswXSk7XG4gICAgICAgIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIHVuc2V0KGZvcm0sIGVudHJ5WzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXQoZm9ybSwgZW50cnlbMF0sIGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmRvUmVzZXQpIHtcbiAgICAgICAgYXdhaXQgcHJvcHMuZG9SZXNldChzY29wZS52YWx1ZSk7XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcInJlc2V0XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkUmVmOiBSZWYgPSByZWYoKTtcbiAgICBjb25zdCBlcnJvcnNSZWY6IFJlZiA9IHJlZih7fSk7XG5cbiAgICBmdW5jdGlvbiBmaWxsR3JvdXBFcnJvcihmaWVsZEVycm9yczogYW55KSB7XG4gICAgICBpZiAoIWNvbXB1dGVkR3JvdXAudmFsdWU/Lmdyb3VwZWRLZXlzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGtleSBpbiBmaWVsZEVycm9ycykge1xuICAgICAgICBjb25zdCBncm91cCA9IGNvbXB1dGVkR3JvdXAudmFsdWU/Lmdyb3VwZWRLZXlzW2tleV07XG4gICAgICAgIGlmIChncm91cCAhPSBudWxsKSB7XG4gICAgICAgICAgZmllbGRFcnJvcnNbXCJncm91cC5cIiArIGdyb3VwXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlU2NvcGUgPSB7IC4uLnNjb3BlLnZhbHVlLCBmb3JtIH07XG4gICAgICBpZiAodmFsaWRhdGVTY29wZS5tb2RlID09PSBcInZpZXdcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuYmVmb3JlVmFsaWRhdGUpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgcHJvcHMuYmVmb3JlVmFsaWRhdGUodmFsaWRhdGVTY29wZSk7XG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGVycm9yc1JlZi52YWx1ZSA9IHt9O1xuICAgICAgICBhd2FpdCB1aS5mb3JtLnZhbGlkYXRlV3JhcChmb3JtUmVmLnZhbHVlKTtcbiAgICAgICAgdmFsaWRSZWYudmFsdWUgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHZhbGlkUmVmLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlRXJyb3JzID0gdWkuZm9ybS50cmFuc2Zvcm1WYWxpZGF0ZUVycm9ycyhlKTtcbiAgICAgICAgZmlsbEdyb3VwRXJyb3IodmFsaWRhdGVFcnJvcnMpO1xuICAgICAgICBlcnJvcnNSZWYudmFsdWUgPSB2YWxpZGF0ZUVycm9ycztcbiAgICAgICAgY3R4LmVtaXQoXCJ2YWxpZGF0aW9uRXJyb3JcIiwgc2NvcGUudmFsdWUpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBmdW5jdGlvbiBzdWJtaXQoKSB7XG4gICAgICBhd2FpdCB2YWxpZGF0ZSgpO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBjbG9uZURlZXAodG9SYXcoZm9ybSkpO1xuICAgICAgY29uc3Qgc3VibWl0U2NvcGUgPSB7IC4uLnNjb3BlLnZhbHVlLCBmb3JtOiBmb3JtRGF0YSB9O1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiZm9ybSBzdWJtaXRcIiwgSlNPTi5zdHJpbmdpZnkoZm9ybSkpO1xuICAgICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBnZXQoZm9ybURhdGEsIGtleSk7XG4gICAgICAgIGlmIChpdGVtLnZhbHVlUmVzb2x2ZSkge1xuICAgICAgICAgIGl0ZW0udmFsdWVSZXNvbHZlKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgLi4uc3VibWl0U2NvcGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChwcm9wcy5iZWZvcmVTdWJtaXQpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgcHJvcHMuYmVmb3JlU3VibWl0KHN1Ym1pdFNjb3BlKTtcbiAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy/np7vpmaTkuI3lhYHorrjmj5DkuqTnmoTlrZfmrrVcbiAgICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uc3VibWl0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHVuc2V0KGZvcm1EYXRhLCBrZXkpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uc3VibWl0ID09PSB0cnVlKSB7XG4gICAgICAgICAgLy/orr7nva7lvLrliLbmj5DkuqTnmoTlrZfmrrVcbiAgICAgICAgICBzZXQoZm9ybURhdGEsIGtleSwgZm9ybURhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocHJvcHMuZG9TdWJtaXQpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcHJvcHMuZG9TdWJtaXQoc3VibWl0U2NvcGUpO1xuICAgICAgICBzdWJtaXRTY29wZS5yZXMgPSByZXM7XG4gICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcInN1Ym1pdFwiLCBzdWJtaXRTY29wZSk7XG4gICAgICBpZiAocHJvcHMuYWZ0ZXJTdWJtaXQpIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IHByb3BzLmFmdGVyU3VibWl0KHN1Ym1pdFNjb3BlKTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcInN1Y2Nlc3NcIiwgc3VibWl0U2NvcGUpO1xuXG4gICAgICByZXR1cm4gc3VibWl0U2NvcGU7XG4gICAgfVxuXG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIC8vIGltbWVkaWF0ZSB2YWx1ZUNoYW5nZeinpuWPkVxuICAgICAgZm9yRWFjaChjb21wdXRlZENvbHVtbnMudmFsdWUsIChpdGVtOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnZhbHVlQ2hhbmdlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlQ2hhbmdlID0gaXRlbS52YWx1ZUNoYW5nZTtcbiAgICAgICAgaWYgKHZhbHVlQ2hhbmdlICYmIHZhbHVlQ2hhbmdlLmltbWVkaWF0ZSA9PT0gdHJ1ZSAmJiB2YWx1ZUNoYW5nZS5oYW5kbGUpIHtcbiAgICAgICAgICBjb25zdCBldmVudCA9IHsga2V5LCB2YWx1ZTogZm9ybVtrZXldLCBmb3JtUmVmOiBwcm94eSwgLi4uc2NvcGUudmFsdWUsIGltbWVkaWF0ZTogdHJ1ZSB9O1xuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZS5oYW5kbGUpIHtcbiAgICAgICAgICAgIHZhbHVlQ2hhbmdlLmhhbmRsZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGZvcm1JdGVtU2hvdyhpdGVtOiBhbnkpIHtcbiAgICAgIGlmIChpdGVtICYmIHVucmVmKGl0ZW0uc2hvdykgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBncm91cEl0ZW1TaG93KGdyb3VwSXRlbTogYW55KSB7XG4gICAgICBpZiAoIWdyb3VwSXRlbS5jb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh1bnJlZihncm91cEl0ZW0uc2hvdykgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQga2V5IG9mIGdyb3VwSXRlbS5jb2x1bW5zKSB7XG4gICAgICAgIGlmIChjb21wdXRlZENvbHVtbnMudmFsdWVba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNGaWVsZFNob3cgPSBmb3JtSXRlbVNob3coY29tcHV0ZWRDb2x1bW5zLnZhbHVlW2tleV0pO1xuICAgICAgICBpZiAoaXNGaWVsZFNob3cpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy53YXRjaCkge1xuICAgICAgd2F0Y2goXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gZm9ybTtcbiAgICAgICAgfSxcbiAgICAgICAgKG5ld1ZhbCwgb2xkVmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHByb3BzLndhdGNoKSB7XG4gICAgICAgICAgICBwcm9wcy53YXRjaChzY29wZS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgICBpbW1lZGlhdGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RpcnR5KCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gSlNPTi5zdHJpbmdpZnkoaW5pdGlhbEZvcm0pO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBKU09OLnN0cmluZ2lmeShmb3JtKTtcbiAgICAgIHJldHVybiBiZWZvcmUgIT09IGFmdGVyO1xuICAgIH1cblxuICAgIGNvbnN0IG1lcmdlZFNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIG1lcmdlKHt9LCBwcm9wcy5zbG90cywgY3R4LnNsb3RzKTtcbiAgICB9KTtcblxuICAgIGN0eC5lbWl0KFwiaW5pdFwiLCBzY29wZS52YWx1ZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0OiAoZm9ybTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0KGZvcm0sIGtleSk7XG4gICAgICB9LFxuICAgICAgc2V0OiAoZm9ybTogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBzZXQoZm9ybSwga2V5LCB2YWx1ZSk7XG4gICAgICAgIGRvVmFsdWVDaGFuZ2Uoa2V5LCB2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgdWksXG4gICAgICB2YWxpZFJlZixcbiAgICAgIGVycm9yc1JlZixcbiAgICAgIGZvcm1SZWYsXG4gICAgICBjb21wdXRlZENvbHVtbnMsXG4gICAgICBjb21wdXRlZERlZmF1bHRDb2x1bW5zLFxuICAgICAgc3VibWl0LFxuICAgICAgcmVzZXQsXG4gICAgICBnZXRGb3JtUmVmLFxuICAgICAgc2NvcGUsXG4gICAgICBidWlsZEl0ZW1TY29wZSxcbiAgICAgIGdyb3VwQWN0aXZlS2V5LFxuICAgICAgZm9ybSxcbiAgICAgIGZvcm1JdGVtUmVmcyxcbiAgICAgIGdldEZvcm1EYXRhLFxuICAgICAgc2V0Rm9ybURhdGEsXG4gICAgICBnZXRDb21wb25lbnRSZWYsXG4gICAgICBtZXJnZUNvbCxcbiAgICAgIHZhbGlkYXRlLFxuICAgICAgY29tcHV0ZWRHcm91cCxcbiAgICAgIGdldENvbnRleHRGbixcbiAgICAgIGZvcm1JdGVtU2hvdyxcbiAgICAgIGdyb3VwSXRlbVNob3csXG4gICAgICBpc0RpcnR5LFxuICAgICAgbWVyZ2VkU2xvdHNcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1mb3JtIHtcbiAgLmVsLWNvbGxhcHNlLWl0ZW1fX2NvbnRlbnQge1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgcGFkZGluZy1sZWZ0OiAzMHB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDMwcHg7XG4gIH1cblxuICAuZnMtZm9ybS1pbnZhbGlkIHtcbiAgfVxuXG4gIC5mcy1mb3JtLWl0ZW0tY29tcG9uZW50IHtcbiAgICAuYW50LXBpY2tlcixcbiAgICAuYW50LWlucHV0LWFmZml4LXdyYXBwZXIsXG4gICAgLmFudC1pbnB1dC1udW1iZXIsXG4gICAgLmVsLWNhc2NhZGVyLFxuICAgIC5lbC1kYXRlLWVkaXRvcixcbiAgICAuZWwtaW5wdXQtbnVtYmVyLFxuICAgIC5lbC1pbnB1dCxcbiAgICA+IC5lbC1zZWxlY3QsXG4gICAgPiAubi1zZWxlY3QsXG4gICAgLm4tZGF0ZS1waWNrZXIsXG4gICAgLm4taW5wdXQtbnVtYmVyIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cblxuICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2ljb24ge1xuICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgfVxuICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2Nsb3NlLWljb24ge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgIH1cblxuICAgIC5lbC1yYW5nZS1lZGl0b3IuZWwtaW5wdXRfX3dyYXBwZXIge1xuICAgICAgcGFkZGluZzogMDtcbiAgICB9XG4gIH1cblxuICAvLy5lbC1kYXRlLWVkaXRvci5lbC1pbnB1dF9fd3JhcHBlciB7XG4gIC8vICB3aWR0aDogMTAwJTtcbiAgLy99XG59XG5cbi5mcy1mb3JtLWdyaWQge1xuICAuZnMtcm93IHtcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNTAlIDUwJTtcbiAgICAvLyBnYXA6IDAgMjBweDsgLy/liJfpl7Tot50gMjBweFxuICAgIC5mcy1jb2wge1xuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLy8gYW50ZHZcbiAgICAuYW50LWZvcm0taXRlbS1sYWJlbCB7XG4gICAgICB3aWR0aDogMTAwcHg7XG4gICAgICBmbGV4OiBub25lO1xuICAgICAgbWF4LXdpZHRoOiBub25lO1xuICAgIH1cbiAgICAuYW50LWZvcm0taXRlbS1jb250cm9sLXdyYXBwZXIge1xuICAgICAgZmxleDogMTtcbiAgICAgIG1heC13aWR0aDogbm9uZTtcbiAgICB9XG4gIH1cblxuICAvLyBlbGVtZW50XG4gIC5lbC1yb3c6OmFmdGVyLFxuICAuZWwtcm93OjpiZWZvcmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cbi5mcy1mb3JtLWZsZXgge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcbiAgZmxleC13cmFwOiB3cmFwO1xuICAuZnMtcm93IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcbiAgLmZzLWZvcm0tZmxleCB7XG4gICAgLmZzLXJvdyB7XG4gICAgICAuZnMtY29sIHtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgZmxleDogMCAwIDEwMCU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA1NzVweCkge1xuICAuZnMtZm9ybS1mbGV4IHtcbiAgICAuZnMtcm93IHtcbiAgICAgIC5mcy1jb2wge1xuICAgICAgICAvLy5hbnQtZm9ybS1pdGVtLWxhYmVsIHtcbiAgICAgICAgLy8gIGZsZXg6IG5vbmU7XG4gICAgICAgIC8vfVxuICAgICAgICAvLy5hbnQtZm9ybS1pdGVtIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wge1xuICAgICAgICAvLyAgZmxleDogMTtcbiAgICAgICAgLy8gIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgLy99XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50XG4gICAgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiXG4gICAgdi1pZj1cImNvbXB1dGVkSXRlbVwiXG4gICAgY2xhc3M9XCJmcy1mb3JtLWl0ZW1cIlxuICAgIDpbdWkuZm9ybUl0ZW0ucHJvcF09XCJjb21wdXRlZEtleVwiXG4gICAgdi1iaW5kPVwiY29tcHV0ZWRJdGVtXCJcbiAgICA6cGF0aD1cImNvbXB1dGVkSXRlbS5rZXlcIlxuICAgIDpydWxlLXBhdGg9XCJjb21wdXRlZEl0ZW0ua2V5XCJcbiAgPlxuICAgIDx0ZW1wbGF0ZSAjbGFiZWw+XG4gICAgICA8c3BhbiB2LWlmPVwiY29tcHV0ZWRMYWJlbElzUmVuZGVyXCIgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tbGFiZWwtdGV4dFwiPlxuICAgICAgICA8ZnMtcmVuZGVyIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkTGFiZWxSZW5kZXJcIj48L2ZzLXJlbmRlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIHYtZWxzZSBjbGFzcz1cImZzLWZvcm0taXRlbS1sYWJlbC10ZXh0XCIgOnRpdGxlPVwiY29tcHV0ZWRMYWJlbFwiPlxuICAgICAgICB7eyBjb21wdXRlZExhYmVsIH19XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxjb21wb25lbnRcbiAgICAgICAgOmlzPVwidWkudG9vbHRpcC5uYW1lXCJcbiAgICAgICAgdi1pZj1cImNvbXB1dGVkSXRlbS5oZWxwZXIgJiYgY29tcHV0ZWRIZWxwZXJQb3NpdGlvbiA9PT0gJ2xhYmVsJ1wiXG4gICAgICAgIHYtYmluZD1cImNvbXB1dGVkSGVscGVyVG9vbHRpcFwiXG4gICAgICA+XG4gICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnRvb2x0aXAuY29udGVudF0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy1mb3JtLWhlbHBlci10b29sdGlwXCI+XG4gICAgICAgICAgICA8ZnMtZm9ybS1oZWxwZXIgOmhlbHBlcj1cImNvbXB1dGVkSXRlbS5oZWxwZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8dGVtcGxhdGUgI1t1aS50b29sdGlwLnRyaWdnZXJdPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtZm9ybS1pdGVtLWxhYmVsLWljb25cIj5cbiAgICAgICAgICAgIDxmcy1pY29uIGNsYXNzPVwiZnMtZm9ybS1pdGVtLWxhYmVsLWljb24taW5uZXJcIiA6aWNvbj1cInVpLmljb25zLnF1ZXN0aW9uXCI+PC9mcy1pY29uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPGRpdiBjbGFzcz1cImZzLWZvcm0taXRlbS1jb250ZW50XCI+XG4gICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJjb21wdXRlZEl0ZW0udG9wUmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLnRvcFJlbmRlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tcmVuZGVyXCI+XG4gICAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS5wcmVmaXhSZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0ucHJlZml4UmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1pdGVtLWNvbXBvbmVudFwiPlxuICAgICAgICAgIDxmcy1zbG90LXJlbmRlciB2LWlmPVwiZm9ybVNsb3RcIiA6c2xvdHM9XCJmb3JtU2xvdFwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwiY29tcHV0ZWRJdGVtLmNvbXBvbmVudD8uc2hvdyAhPT0gZmFsc2VcIj5cbiAgICAgICAgICAgIDxmcy1yZW5kZXJcbiAgICAgICAgICAgICAgdi1pZj1cIlxuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXRlbS5jb25kaXRpb25hbFJlbmRlciAmJlxuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXRlbS5jb25kaXRpb25hbFJlbmRlci5tYXRjaCAmJlxuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXRlbS5jb25kaXRpb25hbFJlbmRlci5tYXRjaChzY29wZUZ1bmMoKSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLmNvbmRpdGlvbmFsUmVuZGVyLnJlbmRlclwiXG4gICAgICAgICAgICAgIDpzY29wZT1cInNjb3BlRnVuYygpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZnMtcmVuZGVyIHYtZWxzZS1pZj1cImNvbXB1dGVkSXRlbS5yZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0ucmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgICAgICAgPGZzLWNvbXBvbmVudC1yZW5kZXJcbiAgICAgICAgICAgICAgdi1lbHNlXG4gICAgICAgICAgICAgIHJlZj1cImNvbXBvbmVudFJlbmRlclJlZlwiXG4gICAgICAgICAgICAgIHYtYmluZD1cImNvbXB1dGVkSXRlbS5jb21wb25lbnRcIlxuICAgICAgICAgICAgICA6bW9kZWwtdmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICAgICAgICAgICAgOnNjb3BlPVwic2NvcGVGdW5jKClcIlxuICAgICAgICAgICAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwidXBkYXRlTW9kZWxWYWx1ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJjb21wdXRlZEl0ZW0uc3VmZml4UmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLnN1ZmZpeFJlbmRlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGZzLXJlbmRlciB2LWlmPVwiY29tcHV0ZWRJdGVtLmJvdHRvbVJlbmRlclwiIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS5ib3R0b21SZW5kZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICA8dGVtcGxhdGUgdi1pZj1cImNvbXB1dGVkSXRlbS5oZWxwZXIgJiYgY29tcHV0ZWRIZWxwZXJQb3NpdGlvbiAhPT0gJ2xhYmVsJ1wiPlxuICAgICAgICA8ZnMtZm9ybS1oZWxwZXIgOmhlbHBlcj1cImNvbXB1dGVkSXRlbS5oZWxwZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvZGl2PlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgcmVmLCBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBSZWYsIFByb3BUeXBlIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IEZzUmVuZGVyIGZyb20gXCIuLi9yZW5kZXIvZnMtcmVuZGVyLmpzXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSwgdXNlVWksIHVzZUNvbXB1dGUgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIGZvcm0taXRlbee7hOS7tuWwgeijhVxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRm9ybUl0ZW1cIixcbiAgY29tcG9uZW50czogeyBGc1JlbmRlciB9LFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOihqOWNleWtl+auteWAvCh2LW1vZGVsKVxuICAgICAqL1xuICAgIG1vZGVsVmFsdWU6IHt9LFxuICAgIC8qKlxuICAgICAqIOWtl+autemFjee9rlxuICAgICAqL1xuICAgIGl0ZW06IHtcbiAgICAgIHR5cGU6IE9iamVjdCBhcyBQcm9wVHlwZTxhbnk+LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlrZfmrrXnu4Tku7bmj5Lmp71cbiAgICAgKi9cbiAgICBmb3JtU2xvdDoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIGdldENvbnRleHRGbjoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIGhlbHBlcjoge1xuICAgICAgdHlwZTogW1N0cmluZywgT2JqZWN0XVxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcInVwZGF0ZTptb2RlbFZhbHVlXCJdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlbmRlclJlZiA9IHJlZigpO1xuXG4gICAgY29uc3QgeyBkb0NvbXB1dGVkIH0gPSB1c2VDb21wdXRlKCk7XG5cbiAgICB1dGlscy50cmFjZShcImZzLWZvcm0taXRlbVwiKTtcbiAgICAvLyBjb25zdCBzY29wZUNvbXB1dGVkOiBSZWY8U2NvcGVDb250ZXh0PiA9IGNvbXB1dGVkKCgpID0+IHt9KTtcblxuICAgIGNvbnN0IHNjb3BlRnVuYyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHNjb3BlID0gcHJvcHMuZ2V0Q29udGV4dEZuID8gcHJvcHMuZ2V0Q29udGV4dEZuKCkgOiB7fTtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBwcm9wcy5tb2RlbFZhbHVlLCBrZXk6IHByb3BzLml0ZW0ua2V5LCAuLi5zY29wZSB9O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVNb2RlbFZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgdmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoaXNBc3luYyA9IGZhbHNlKSB7XG4gICAgICBpZiAoaXNBc3luYykge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50UmVuZGVyUmVmLnZhbHVlPy5nZXRUYXJnZXRSZWZBc3luYygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZi52YWx1ZT8uZ2V0VGFyZ2V0UmVmKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRJdGVtID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0ge1xuICAgICAgICAuLi5wcm9wcy5pdGVtXG4gICAgICB9O1xuICAgICAgZGVsZXRlIHJlcy50aXRsZTtcbiAgICAgIGRlbGV0ZSByZXMubGFiZWw7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29tcHV0ZWRIZWxwZXJQb3NpdGlvbiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBwcm9wcy5pdGVtPy5oZWxwZXI/LnBvc2l0aW9uIHx8IChwcm9wcy5oZWxwZXIgYXMgYW55KT8ucG9zaXRpb247XG4gICAgfSk7XG4gICAgY29uc3QgY29tcHV0ZWRIZWxwZXJUb29sdGlwID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIG1lcmdlKHt9LCBwcm9wcy5pdGVtLmhlbHBlcj8udG9vbHRpcCwgKHByb3BzLmhlbHBlciBhcyBhbnkpPy50b29sdGlwKTtcbiAgICB9KTtcbiAgICBjb25zdCBjb21wdXRlZEtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChwcm9wcy5pdGVtID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLml0ZW0ua2V5LmluZGV4T2YoXCIuXCIpID49IDApIHtcbiAgICAgICAgcmV0dXJuIHByb3BzLml0ZW0ua2V5LnNwbGl0KFwiLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wcy5pdGVtLmtleTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkTGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMuaXRlbS5sYWJlbCB8fCBwcm9wcy5pdGVtLnRpdGxlO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbXB1dGVkTGFiZWxJc1JlbmRlciA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBjb21wdXRlZExhYmVsLnZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZExhYmVsUmVuZGVyID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIGNvbXB1dGVkTGFiZWwudmFsdWUoc2NvcGVGdW5jKCkpO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICB1cGRhdGVNb2RlbFZhbHVlLFxuICAgICAgc2NvcGVGdW5jLFxuICAgICAgZ2V0Q29tcG9uZW50UmVmLFxuICAgICAgY29tcG9uZW50UmVuZGVyUmVmLFxuICAgICAgY29tcHV0ZWRIZWxwZXJQb3NpdGlvbixcbiAgICAgIGNvbXB1dGVkSGVscGVyVG9vbHRpcCxcbiAgICAgIGNvbXB1dGVkS2V5LFxuICAgICAgY29tcHV0ZWRMYWJlbElzUmVuZGVyLFxuICAgICAgY29tcHV0ZWRMYWJlbCxcbiAgICAgIGNvbXB1dGVkTGFiZWxSZW5kZXIsXG4gICAgICBjb21wdXRlZEl0ZW1cbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1mb3JtLWl0ZW0ge1xuICAuYW50LWZvcm0taXRlbS1sYWJlbCB7XG4gICAgLy9saW5lLWhlaWdodDogMTtcbiAgICAuZnMtZm9ybS1pdGVtLWxhYmVsLXRleHQge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cbiAgfVxuICAuZWwtZm9ybS1pdGVtIHtcbiAgICAuZnMtZm9ybS1pdGVtLWxhYmVsLWljb24ge1xuICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICBoZWlnaHQ6IGluaGVyaXQ7XG4gICAgfVxuICB9XG4gIC5mcy1mb3JtLWl0ZW0tbGFiZWwtaWNvbiB7XG4gICAgbWFyZ2luOiAwIDJweDtcbiAgICAuZnMtZm9ybS1pdGVtLWxhYmVsLWljb24taW5uZXIge1xuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgICBoZWlnaHQ6IGluaGVyaXQ7XG4gICAgfVxuICB9XG4gIC5mcy1mb3JtLWl0ZW0tY29udGVudCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZsZXg6IDE7XG4gICAgLmZzLWZvcm0taXRlbS1yZW5kZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgICAuZnMtZm9ybS1pdGVtLWNvbXBvbmVudCB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi5mcy1mb3JtLWhlbHBlci10b29sdGlwIHtcbiAgLmZzLWZvcm0taGVscGVyIHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIlxuICAgIHYtaWY9XCJjb21wdXRlZEl0ZW1cIlxuICAgIGNsYXNzPVwiZnMtZm9ybS1pdGVtXCJcbiAgICA6W3VpLmZvcm1JdGVtLnByb3BdPVwiY29tcHV0ZWRLZXlcIlxuICAgIHYtYmluZD1cImNvbXB1dGVkSXRlbVwiXG4gICAgOnBhdGg9XCJjb21wdXRlZEl0ZW0ua2V5XCJcbiAgICA6cnVsZS1wYXRoPVwiY29tcHV0ZWRJdGVtLmtleVwiXG4gID5cbiAgICA8dGVtcGxhdGUgI2xhYmVsPlxuICAgICAgPHNwYW4gdi1pZj1cImNvbXB1dGVkTGFiZWxJc1JlbmRlclwiIGNsYXNzPVwiZnMtZm9ybS1pdGVtLWxhYmVsLXRleHRcIj5cbiAgICAgICAgPGZzLXJlbmRlciA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZExhYmVsUmVuZGVyXCI+PC9mcy1yZW5kZXI+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiB2LWVsc2UgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tbGFiZWwtdGV4dFwiIDp0aXRsZT1cImNvbXB1dGVkTGFiZWxcIj5cbiAgICAgICAge3sgY29tcHV0ZWRMYWJlbCB9fVxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8Y29tcG9uZW50XG4gICAgICAgIDppcz1cInVpLnRvb2x0aXAubmFtZVwiXG4gICAgICAgIHYtaWY9XCJjb21wdXRlZEl0ZW0uaGVscGVyICYmIGNvbXB1dGVkSGVscGVyUG9zaXRpb24gPT09ICdsYWJlbCdcIlxuICAgICAgICB2LWJpbmQ9XCJjb21wdXRlZEhlbHBlclRvb2x0aXBcIlxuICAgICAgPlxuICAgICAgICA8dGVtcGxhdGUgI1t1aS50b29sdGlwLmNvbnRlbnRdPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtZm9ybS1oZWxwZXItdG9vbHRpcFwiPlxuICAgICAgICAgICAgPGZzLWZvcm0taGVscGVyIDpoZWxwZXI9XCJjb21wdXRlZEl0ZW0uaGVscGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPHRlbXBsYXRlICNbdWkudG9vbHRpcC50cmlnZ2VyXT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLWZvcm0taXRlbS1sYWJlbC1pY29uXCI+XG4gICAgICAgICAgICA8ZnMtaWNvbiBjbGFzcz1cImZzLWZvcm0taXRlbS1sYWJlbC1pY29uLWlubmVyXCIgOmljb249XCJ1aS5pY29ucy5xdWVzdGlvblwiPjwvZnMtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L2NvbXBvbmVudD5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tY29udGVudFwiPlxuICAgICAgPGZzLXJlbmRlciB2LWlmPVwiY29tcHV0ZWRJdGVtLnRvcFJlbmRlclwiIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS50b3BSZW5kZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1pdGVtLXJlbmRlclwiPlxuICAgICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJjb21wdXRlZEl0ZW0ucHJlZml4UmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLnByZWZpeFJlbmRlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWZvcm0taXRlbS1jb21wb25lbnRcIj5cbiAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cImZvcm1TbG90XCIgOnNsb3RzPVwiZm9ybVNsb3RcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZS1pZj1cImNvbXB1dGVkSXRlbS5jb21wb25lbnQ/LnNob3cgIT09IGZhbHNlXCI+XG4gICAgICAgICAgICA8ZnMtcmVuZGVyXG4gICAgICAgICAgICAgIHYtaWY9XCJcbiAgICAgICAgICAgICAgICBjb21wdXRlZEl0ZW0uY29uZGl0aW9uYWxSZW5kZXIgJiZcbiAgICAgICAgICAgICAgICBjb21wdXRlZEl0ZW0uY29uZGl0aW9uYWxSZW5kZXIubWF0Y2ggJiZcbiAgICAgICAgICAgICAgICBjb21wdXRlZEl0ZW0uY29uZGl0aW9uYWxSZW5kZXIubWF0Y2goc2NvcGVGdW5jKCkpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS5jb25kaXRpb25hbFJlbmRlci5yZW5kZXJcIlxuICAgICAgICAgICAgICA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGZzLXJlbmRlciB2LWVsc2UtaWY9XCJjb21wdXRlZEl0ZW0ucmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLnJlbmRlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgICAgICAgIDxmcy1jb21wb25lbnQtcmVuZGVyXG4gICAgICAgICAgICAgIHYtZWxzZVxuICAgICAgICAgICAgICByZWY9XCJjb21wb25lbnRSZW5kZXJSZWZcIlxuICAgICAgICAgICAgICB2LWJpbmQ9XCJjb21wdXRlZEl0ZW0uY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgOm1vZGVsLXZhbHVlPVwibW9kZWxWYWx1ZVwiXG4gICAgICAgICAgICAgIDpzY29wZT1cInNjb3BlRnVuYygpXCJcbiAgICAgICAgICAgICAgQHVwZGF0ZTptb2RlbC12YWx1ZT1cInVwZGF0ZU1vZGVsVmFsdWVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGZzLXJlbmRlciB2LWlmPVwiY29tcHV0ZWRJdGVtLnN1ZmZpeFJlbmRlclwiIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS5zdWZmaXhSZW5kZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS5ib3R0b21SZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0uYm90dG9tUmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJjb21wdXRlZEl0ZW0uaGVscGVyICYmIGNvbXB1dGVkSGVscGVyUG9zaXRpb24gIT09ICdsYWJlbCdcIj5cbiAgICAgICAgPGZzLWZvcm0taGVscGVyIDpoZWxwZXI9XCJjb21wdXRlZEl0ZW0uaGVscGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHJlZiwgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgUmVmLCBQcm9wVHlwZSB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCBGc1JlbmRlciBmcm9tIFwiLi4vcmVuZGVyL2ZzLXJlbmRlci5qc1wiO1xuaW1wb3J0IHsgdXNlTWVyZ2UsIHVzZVVpLCB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBmb3JtLWl0ZW3nu4Tku7blsIHoo4VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0Zvcm1JdGVtXCIsXG4gIGNvbXBvbmVudHM6IHsgRnNSZW5kZXIgfSxcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDooajljZXlrZfmrrXlgLwodi1tb2RlbClcbiAgICAgKi9cbiAgICBtb2RlbFZhbHVlOiB7fSxcbiAgICAvKipcbiAgICAgKiDlrZfmrrXphY3nva5cbiAgICAgKi9cbiAgICBpdGVtOiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8YW55PixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5a2X5q6157uE5Lu25o+S5qe9XG4gICAgICovXG4gICAgZm9ybVNsb3Q6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICBnZXRDb250ZXh0Rm46IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICBoZWxwZXI6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE9iamVjdF1cbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiXSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgICBjb25zdCBjb21wb25lbnRSZW5kZXJSZWYgPSByZWYoKTtcblxuICAgIGNvbnN0IHsgZG9Db21wdXRlZCB9ID0gdXNlQ29tcHV0ZSgpO1xuXG4gICAgdXRpbHMudHJhY2UoXCJmcy1mb3JtLWl0ZW1cIik7XG4gICAgLy8gY29uc3Qgc2NvcGVDb21wdXRlZDogUmVmPFNjb3BlQ29udGV4dD4gPSBjb21wdXRlZCgoKSA9PiB7fSk7XG5cbiAgICBjb25zdCBzY29wZUZ1bmMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IHByb3BzLmdldENvbnRleHRGbiA/IHByb3BzLmdldENvbnRleHRGbigpIDoge307XG4gICAgICByZXR1cm4geyB2YWx1ZTogcHJvcHMubW9kZWxWYWx1ZSwga2V5OiBwcm9wcy5pdGVtLmtleSwgLi4uc2NvcGUgfTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdXBkYXRlTW9kZWxWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICBjdHguZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGlzQXN5bmMgPSBmYWxzZSkge1xuICAgICAgaWYgKGlzQXN5bmMpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZi52YWx1ZT8uZ2V0VGFyZ2V0UmVmQXN5bmMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21wb25lbnRSZW5kZXJSZWYudmFsdWU/LmdldFRhcmdldFJlZigpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXB1dGVkSXRlbSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgLi4ucHJvcHMuaXRlbVxuICAgICAgfTtcbiAgICAgIGRlbGV0ZSByZXMudGl0bGU7XG4gICAgICBkZWxldGUgcmVzLmxhYmVsO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkSGVscGVyUG9zaXRpb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMuaXRlbT8uaGVscGVyPy5wb3NpdGlvbiB8fCAocHJvcHMuaGVscGVyIGFzIGFueSk/LnBvc2l0aW9uO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbXB1dGVkSGVscGVyVG9vbHRpcCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuaXRlbS5oZWxwZXI/LnRvb2x0aXAsIChwcm9wcy5oZWxwZXIgYXMgYW55KT8udG9vbHRpcCk7XG4gICAgfSk7XG4gICAgY29uc3QgY29tcHV0ZWRLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAocHJvcHMuaXRlbSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5pdGVtLmtleS5pbmRleE9mKFwiLlwiKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBwcm9wcy5pdGVtLmtleS5zcGxpdChcIi5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMuaXRlbS5rZXk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZExhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLml0ZW0ubGFiZWwgfHwgcHJvcHMuaXRlbS50aXRsZTtcbiAgICB9KTtcbiAgICBjb25zdCBjb21wdXRlZExhYmVsSXNSZW5kZXIgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gY29tcHV0ZWRMYWJlbC52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29tcHV0ZWRMYWJlbFJlbmRlciA9ICgpID0+IHtcbiAgICAgIHJldHVybiBjb21wdXRlZExhYmVsLnZhbHVlKHNjb3BlRnVuYygpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgdXBkYXRlTW9kZWxWYWx1ZSxcbiAgICAgIHNjb3BlRnVuYyxcbiAgICAgIGdldENvbXBvbmVudFJlZixcbiAgICAgIGNvbXBvbmVudFJlbmRlclJlZixcbiAgICAgIGNvbXB1dGVkSGVscGVyUG9zaXRpb24sXG4gICAgICBjb21wdXRlZEhlbHBlclRvb2x0aXAsXG4gICAgICBjb21wdXRlZEtleSxcbiAgICAgIGNvbXB1dGVkTGFiZWxJc1JlbmRlcixcbiAgICAgIGNvbXB1dGVkTGFiZWwsXG4gICAgICBjb21wdXRlZExhYmVsUmVuZGVyLFxuICAgICAgY29tcHV0ZWRJdGVtXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtZm9ybS1pdGVtIHtcbiAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xuICAgIC8vbGluZS1oZWlnaHQ6IDE7XG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC10ZXh0IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG4gIH1cbiAgLmVsLWZvcm0taXRlbSB7XG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC1pY29uIHtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgIH1cbiAgfVxuICAuZnMtZm9ybS1pdGVtLWxhYmVsLWljb24ge1xuICAgIG1hcmdpbjogMCAycHg7XG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC1pY29uLWlubmVyIHtcbiAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgIH1cbiAgfVxuICAuZnMtZm9ybS1pdGVtLWNvbnRlbnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBmbGV4OiAxO1xuICAgIC5mcy1mb3JtLWl0ZW0tcmVuZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgICAgLmZzLWZvcm0taXRlbS1jb21wb25lbnQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4uZnMtZm9ybS1oZWxwZXItdG9vbHRpcCB7XG4gIC5mcy1mb3JtLWhlbHBlciB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnRcbiAgICA6aXM9XCJ1aS5jb2wubmFtZVwiXG4gICAgdi1pZj1cImNvbXB1dGVkSXRlbSAmJiBjb21wdXRlZEl0ZW0uc2hvdyAhPT0gZmFsc2VcIlxuICAgIGNsYXNzPVwiZnMtY29sXCJcbiAgICB2LWJpbmQ9XCJtZXJnZShjb2wsIGNvbXB1dGVkSXRlbT8uY29sKVwiXG4gID5cbiAgICA8ZnMtZm9ybS1pdGVtXG4gICAgICB2LWlmPVwiY29tcHV0ZWRJdGVtICYmIGNvbXB1dGVkSXRlbT8uYmxhbmsgIT09IHRydWVcIlxuICAgICAgcmVmPVwiZm9ybUl0ZW1SZWZcIlxuICAgICAgOml0ZW09XCJjb21wdXRlZEl0ZW1cIlxuICAgICAgOmZvcm0tc2xvdD1cInNsb3RzXCJcbiAgICAgIDpnZXQtY29udGV4dC1mbj1cImdldENvbnRleHRGblwiXG4gICAgICA6aGVscGVyPVwiaGVscGVyXCJcbiAgICAgIHYtYmluZD1cImF0dHJzXCJcbiAgICAvPlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiIHNldHVwPlxuaW1wb3J0IHsgdXNlQXR0cnMsIGRlZmluZVByb3BzLCBQcm9wVHlwZSwgcmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiQGZhc3QtY3J1ZC91aS1pbnRlcmZhY2VcIjtcbmNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcbiAgLyoqXG4gICAqIOWtl+autemFjee9rlxuICAgKi9cbiAgaXRlbToge1xuICAgIHR5cGU6IE9iamVjdCBhcyBQcm9wVHlwZTxhbnk+LFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICB9LFxuICAvKipcbiAgICog5a2X5q6157uE5Lu25o+S5qe9XG4gICAqL1xuICBzbG90czoge1xuICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICB9LFxuICBnZXRDb250ZXh0Rm46IHtcbiAgICB0eXBlOiBGdW5jdGlvbixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgfSxcbiAgY29sOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH0sXG4gIGhlbHBlcjoge1xuICAgIHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gIH1cbn0pO1xuY29uc3QgeyBkb0NvbXB1dGVkIH0gPSB1c2VDb21wdXRlKCk7XG5jb25zdCBjb21wdXRlZEl0ZW0gPSBkb0NvbXB1dGVkKFxuICAoKSA9PiB7XG4gICAgcmV0dXJuIHByb3BzLml0ZW07XG4gIH0sXG4gICgpID0+IHtcbiAgICByZXR1cm4gcHJvcHMuZ2V0Q29udGV4dEZuKCk7XG4gIH1cbik7XG5cbmNvbnN0IGF0dHJzID0gdXNlQXR0cnMoKTtcbmNvbnN0IGZvcm1JdGVtUmVmID0gcmVmKCk7XG5mdW5jdGlvbiBnZXRGb3JtSXRlbVJlZigpIHtcbiAgcmV0dXJuIGZvcm1JdGVtUmVmLnZhbHVlO1xufVxuXG5kZWZpbmVFeHBvc2Uoe1xuICBnZXRGb3JtSXRlbVJlZlxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtZm9ybS1pdGVtLWNvbCB7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1oZWxwZXJcIj5cbiAgICA8cHJlIHYtaWY9XCJ0eXBlb2YgaGVscGVyID09PSAnc3RyaW5nJ1wiPnt7IGhlbHBlciB9fTwvcHJlPlxuICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJoZWxwZXIucmVuZGVyXCI+XG4gICAgICA8ZnMtcmVuZGVyIDpyZW5kZXItZnVuYz1cImhlbHBlci5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZVwiIC8+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8cHJlIHYtZWxzZS1pZj1cImhlbHBlci50ZXh0XCI+e3sgaGVscGVyLnRleHQgfX08L3ByZT5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB1dGlscyBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcblxuLyoqXG4gKiDooajljZXlrZfmrrXluK7liqnor7TmmI7nu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0Zvcm1IZWxwZXJcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDluK7liqnor7TmmI4sIHRleHQ6IOivtOaYjuaWh+WtlywgcmVuZGVyOiBmdW5jdGlvbihzY29wZSkg6Ieq5a6a5LmJ5riy5p+TXG4gICAgICovXG4gICAgaGVscGVyOiB7XG4gICAgICB0eXBlOiBbXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0ZXh0OiDor7TmmI7mloflrZcsXG4gICAgICAgICAqIHJlbmRlcjogZnVuY3Rpb24gLCDoh6rlrprkuYlyZW5kZXJcbiAgICAgICAgICovXG4gICAgICAgIE9iamVjdCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOivtOaYjuaWh+acrFxuICAgICAgICAgKi9cbiAgICAgICAgU3RyaW5nXG4gICAgICBdXG4gICAgfSxcbiAgICBzY29wZToge31cbiAgfSxcbiAgc2V0dXAocHJvcHMpIHtcbiAgICB1dGlscy50cmFjZShcImZzLWZvcm0taXRlbVwiKTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWZvcm0taGVscGVyIHtcbiAgY29sb3I6ICM3ZTdlN2U7XG4gIGxpbmUtaGVpZ2h0OiAxLjM7XG4gIG1hcmdpbi10b3A6IDRweDtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuXG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgcHJlIHtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAgIG1hcmdpbi1ib3R0b206IDBweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWZvcm0taGVscGVyXCI+XG4gICAgPHByZSB2LWlmPVwidHlwZW9mIGhlbHBlciA9PT0gJ3N0cmluZydcIj57eyBoZWxwZXIgfX08L3ByZT5cbiAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwiaGVscGVyLnJlbmRlclwiPlxuICAgICAgPGZzLXJlbmRlciA6cmVuZGVyLWZ1bmM9XCJoZWxwZXIucmVuZGVyXCIgOnNjb3BlPVwic2NvcGVcIiAvPlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHByZSB2LWVsc2UtaWY9XCJoZWxwZXIudGV4dFwiPnt7IGhlbHBlci50ZXh0IH19PC9wcmU+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5cbi8qKlxuICog6KGo5Y2V5a2X5q615biu5Yqp6K+05piO57uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNGb3JtSGVscGVyXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5biu5Yqp6K+05piOLCB0ZXh0OiDor7TmmI7mloflrZcsIHJlbmRlcjogZnVuY3Rpb24oc2NvcGUpIOiHquWumuS5iea4suafk1xuICAgICAqL1xuICAgIGhlbHBlcjoge1xuICAgICAgdHlwZTogW1xuICAgICAgICAvKipcbiAgICAgICAgICogdGV4dDog6K+05piO5paH5a2XLFxuICAgICAgICAgKiByZW5kZXI6IGZ1bmN0aW9uICwg6Ieq5a6a5LmJcmVuZGVyXG4gICAgICAgICAqL1xuICAgICAgICBPYmplY3QsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDor7TmmI7mlofmnKxcbiAgICAgICAgICovXG4gICAgICAgIFN0cmluZ1xuICAgICAgXVxuICAgIH0sXG4gICAgc2NvcGU6IHt9XG4gIH0sXG4gIHNldHVwKHByb3BzKSB7XG4gICAgdXRpbHMudHJhY2UoXCJmcy1mb3JtLWl0ZW1cIik7XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1mb3JtLWhlbHBlciB7XG4gIGNvbG9yOiAjN2U3ZTdlO1xuICBsaW5lLWhlaWdodDogMS4zO1xuICBtYXJnaW4tdG9wOiA0cHg7XG4gIG1hcmdpbi1ib3R0b206IDZweDtcblxuICBmb250LXNpemU6IDEycHg7XG4gIHByZSB7XG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgICBtYXJnaW4tYm90dG9tOiAwcHg7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLG51bGwsIjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgYXMgX19NQUNST1NfZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qLyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRm9ybVByb3ZpZGVyXCJcbn0pO1xuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG4gIDxzbG90Pjwvc2xvdD5cbiAgPGZzLWZvcm0td3JhcHBlciB2LWZvcj1cIml0ZW0gb2YgZm9ybVdyYXBwZXJMaXN0XCIgOmtleT1cIml0ZW0uaWRcIiB2LWJpbmQ9XCJpdGVtXCIgLz5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBwcm92aWRlLCBSZWYsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCBGc0Zvcm1XcmFwcGVyIGZyb20gXCIuL2ZzLWZvcm0td3JhcHBlci5qc1wiO1xuaW1wb3J0IHsgT3BlbkRpYWxvZ1Byb3BzIH0gZnJvbSBcIi4uLy4uL2RcIjtcblxuO1xuXG5jb25zdCBmb3JtV3JhcHBlckxpc3Q6IFJlZiA9IHJlZih7fSk7XG5cbmZ1bmN0aW9uIGdldE1heFpJbmRleCgpOiBudW1iZXIge1xuICBsZXQgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiKlwiKTtcbiAgbGV0IG1heFppbmRleCA9IDEwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG1heFppbmRleCA9IE1hdGgubWF4KG1heFppbmRleCwgZWxlbWVudHNbaV0uc3R5bGUuekluZGV4IHx8IDApO1xuICB9XG4gIHJldHVybiBtYXhaaW5kZXg7XG59XG5cbnByb3ZpZGUoXCJ1c2U6Zm9ybTp3cmFwcGVyXCIsICgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvcGVuKG9wdHM6IE9wZW5EaWFsb2dQcm9wcykge1xuICAgICAgY29uc3QgaWQgPSBvcHRzLmlkIHx8IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApICsgXCJcIjtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGZvcm1XcmFwcGVyTGlzdC52YWx1ZVtpZF0gPSB7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgLy8gekluZGV4OiBnZXRNYXhaSW5kZXgoKSArIDEsXG4gICAgICAgICAgYXN5bmMgb25Nb3VudGVkKGluc3RhbmNlOiBhbnkpIHtcbiAgICAgICAgICAgIGF3YWl0IGluc3RhbmNlLm9wZW4ob3B0cyk7XG4gICAgICAgICAgICByZXNvbHZlKGluc3RhbmNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ2xvc2VkKCkge1xuICAgICAgICAgICAgaWYgKCFvcHRzLmlkKSB7XG4gICAgICAgICAgICAgIC8v5aaC5p6c5LiN5piv5Zu65a6aaWTvvIzliJnlhbPpl63lkI7plIDmr4FcbiAgICAgICAgICAgICAgZGVsZXRlIGZvcm1XcmFwcGVyTGlzdC52YWx1ZVtpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufSk7XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cImNvbnRhaW5lcj8uaXMgfHwgJ2ZzLWxheW91dC1kZWZhdWx0J1wiXG4gICAgcmVmPVwiY29udGFpbmVyUmVmXCJcbiAgICBjbGFzcz1cImZzLWNydWQtY29udGFpbmVyXCJcbiAgICB2LWJpbmQ9XCJjb250YWluZXJcIlxuICAgIDpjbGFzcz1cImNvbXB1dGVkQ2xhc3NcIlxuICA+XG4gICAgPHNsb3Q+PC9zbG90PlxuXG4gICAgPHRlbXBsYXRlICNoZWFkZXItdG9wPlxuICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci10b3BcIj48L3Nsb3Q+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgI2hlYWRlci1ib3R0b20+XG4gICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSAjaGVhZGVyLW1pZGRsZT5cbiAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItbWlkZGxlXCI+PC9zbG90PlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgI3NlYXJjaD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLXNlYXJjaFwiPlxuICAgICAgICA8Y29tcG9uZW50IDppcz1cInNlYXJjaC5pcyB8fCAnZnMtc2VhcmNoJ1wiIHJlZj1cInNlYXJjaFJlZlwiIHYtYmluZD1cInNlYXJjaFwiIDpzbG90cz1cImNvbXB1dGVkU2VhcmNoU2xvdHNcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjYWN0aW9uYmFyPlxuICAgICAgPGRpdiB2LWlmPVwiYWN0aW9uYmFyICYmIGFjdGlvbmJhci5zaG93ICE9PSBmYWxzZVwiIGNsYXNzPVwiZnMtY3J1ZC1hY3Rpb25iYXJcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cImFjdGlvbmJhci1sZWZ0XCI+PC9zbG90PlxuICAgICAgICA8ZnMtYWN0aW9uYmFyIHYtYmluZD1cImFjdGlvbmJhclwiIC8+XG4gICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25iYXItcmlnaHRcIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICN0b29sYmFyPlxuICAgICAgPGRpdiB2LWlmPVwidG9vbGJhciAmJiB0b29sYmFyLnNob3cgIT09IGZhbHNlXCIgY2xhc3M9XCJmcy1jcnVkLXRvb2xiYXJcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cInRvb2xiYXItbGVmdFwiPjwvc2xvdD5cbiAgICAgICAgPGZzLXRvb2xiYXIgcmVmPVwidG9vbGJhclJlZlwiIHYtYmluZD1cInRvb2xiYXJcIiA6c2xvdHM9XCJjb21wdXRlZFRvb2xiYXJTbG90c1wiIDpjb2x1bW5zPVwidGFibGUuY29sdW1uc1wiIC8+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyLXJpZ2h0XCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgI3RhYnM+XG4gICAgICA8ZnMtdGFicy1maWx0ZXIgdi1pZj1cInRhYnNCaW5kaW5nLnNob3dcIiByZWY9XCJ0YWJzUmVmXCIgY2xhc3M9XCJmcy10YWJzXCIgdi1iaW5kPVwidGFic0JpbmRpbmdcIiAvPlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlICN0YWJsZT5cbiAgICAgIDxmcy10YWJsZVxuICAgICAgICByZWY9XCJ0YWJsZVJlZlwiXG4gICAgICAgIGNsYXNzPVwiZnMtY3J1ZC10YWJsZVwiXG4gICAgICAgIHYtYmluZD1cImNvbXB1dGVkVGFibGVcIlxuICAgICAgICA6Y29sdW1ucz1cInRhYmxlLmNvbHVtbnNcIlxuICAgICAgICA6bG9hZGluZz1cInRhYmxlLmxvYWRpbmdcIlxuICAgICAgICA6cm93LWhhbmRsZT1cInJvd0hhbmRsZVwiXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgIDpjZWxsLXNsb3RzPVwiY29tcHV0ZWRDZWxsU2xvdHNcIlxuICAgICAgLz5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICNmb3JtPlxuICAgICAgPGRpdiByZWY9XCJpbm5lcldyYXBwZXJSZWZcIiBjbGFzcz1cImZzLWZvcm0td3JhcHBlci1jb250YWluZXJcIiA6Y2xhc3M9XCJ7ICdmcy1mb3JtLWlubmVyLXdyYXBwZXInOiBpc0Zvcm1Jbm5lciB9XCI+XG4gICAgICAgIDxmcy1mb3JtLXdyYXBwZXJcbiAgICAgICAgICByZWY9XCJmb3JtV3JhcHBlclJlZlwiXG4gICAgICAgICAgOnNsb3RzPVwiY29tcHV0ZWRGb3JtU2xvdHNcIlxuICAgICAgICAgIDppbm5lci13cmFwcGVyPVwiaW5uZXJXcmFwcGVyUmVmXCJcbiAgICAgICAgICBAaW5uZXItY2hhbmdlPVwib25Gb3JtSW5uZXJDaGFuZ2VcIlxuICAgICAgICAgIEB2YWx1ZS1jaGFuZ2U9XCIkZW1pdCgnZm9ybS12YWx1ZS1jaGFuZ2UnLCAkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPCEtLSDnvJbovpHlr7nor53moYYgLS0+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICNwYWdpbmF0aW9uPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWNydWQtcGFnaW5hdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcGFnaW5hdGlvbi1sZWZ0XCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInBhZ2luYXRpb24tbGVmdFwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdpbmF0aW9uXCI+XG4gICAgICAgICAgPCEtLSBwYWdpbmF0aW9uLmN1cnJlbnRQYWdlIOWmguaenOS4uuepuu+8jCBlbGVtZW505Lya5Ye66K2m5ZGKIC0tPlxuICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucGFnaW5hdGlvbi5uYW1lXCIgdi1pZj1cInBhZ2luYXRpb24uc2hvdyAhPT0gZmFsc2VcIiB2LWJpbmQ9XCJwYWdpbmF0aW9uXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdpbmF0aW9uLXJpZ2h0XCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInBhZ2luYXRpb24tcmlnaHRcIj48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjZm9vdGVyLXRvcD5cbiAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItdG9wXCI+PC9zbG90PlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlICNmb290ZXItYm90dG9tPlxuICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCBvbk1vdW50ZWQsIFByb3BUeXBlLCBwcm92aWRlLCByZWYsIFNldHVwQ29udGV4dCwgdG9SZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgdWlDb250ZXh0IH0gZnJvbSBcIi4uL3VpXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi91c2UvdXNlLW1lcmdlXCI7XG5pbXBvcnQgdXRpbExvZyBmcm9tIFwiLi4vdXRpbHMvdXRpbC5sb2dcIjtcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uL3V0aWxzL3V0aWwubG9nXCI7XG5pbXBvcnQgeyBSb3dTZWxlY3Rpb25Qcm9wcywgU2V0U2VhcmNoRm9ybURhdGFQcm9wcyB9IGZyb20gXCIuLi9kXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi91c2VcIjtcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbnV0aWxzLnRyYWNlKFwiZnMtdGFibGVcIik7XG5jb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuXG5mdW5jdGlvbiB1c2VQcm92aWRlcnMocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcbiAgcHJvdmlkZShcImdldDpjb2x1bW5zXCIsICgpID0+IHtcbiAgICByZXR1cm4gcHJvcHMudGFibGUuY29sdW1ucztcbiAgfSk7XG4gIHByb3ZpZGUoXCJ1cGRhdGU6Y29sdW1uc1wiLCAoY29sdW1uczogYW55KSA9PiB7XG4gICAgY3R4LmVtaXQoXCJ1cGRhdGU6Y29sdW1uc1wiLCBjb2x1bW5zKTtcbiAgfSk7XG5cbiAgcHJvdmlkZShcImdldDpjcnVkQmluZGluZ1wiLCAoKSA9PiB7XG4gICAgcmV0dXJuIHByb3BzO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXNlU2VhcmNoKHByb3BzOiBhbnksIGN0eDogU2V0dXBDb250ZXh0KSB7XG4gIGNvbnN0IHNlYXJjaFJlZiA9IHJlZigpO1xuICBjb25zdCBnZXRTZWFyY2hSZWYgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHNlYXJjaFJlZi52YWx1ZTtcbiAgfTtcblxuICBjb25zdCBnZXRTZWFyY2hGb3JtRGF0YSA9ICgpID0+IHtcbiAgICBpZiAoc2VhcmNoUmVmLnZhbHVlKSB7XG4gICAgICByZXR1cm4gc2VhcmNoUmVmLnZhbHVlLmdldEZvcm0oKTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oXCLor7fkvb/nlKhleHBvc2UuZ2V0U2VhcmNoRm9ybURhdGHku6Pmm79cIik7XG4gICAgcmV0dXJuIHt9O1xuICB9O1xuXG4gIGNvbnN0IGdldFNlYXJjaFZhbGlkYXRlZEZvcm1EYXRhID0gKCkgPT4ge1xuICAgIGlmIChzZWFyY2hSZWYudmFsdWUpIHtcbiAgICAgIHJldHVybiBzZWFyY2hSZWYudmFsdWUuZ2V0VmFsaWRhdGVkRm9ybSgpO1xuICAgIH1cbiAgICBsb2dnZXIud2FybihcIuivt+S9v+eUqGV4cG9zZS5nZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YeS7o+abv1wiKTtcbiAgICByZXR1cm4ge307XG4gIH07XG5cbiAgLyoqXG4gICAqIOiuvue9rmZvcm3lgLxcbiAgICogQHBhcmFtIGZvcm0gZm9ybeWvueixoVxuICAgKiBAcGFyYW0gb3B0cyA9IHtcbiAgICogICAgaXNNZXJnZTpmYWxzZSDmmK/lkKbkuI7ljp/mnIlmb3Jt5YC85ZCI5bm2LFxuICAgKiB9XG4gICAqL1xuICBmdW5jdGlvbiBzZXRTZWFyY2hGb3JtRGF0YSh7IGZvcm0sIG1lcmdlRm9ybSA9IGZhbHNlIH06IFNldFNlYXJjaEZvcm1EYXRhUHJvcHMpIHtcbiAgICBpZiAoc2VhcmNoUmVmLnZhbHVlKSB7XG4gICAgICBzZWFyY2hSZWYudmFsdWUuc2V0Rm9ybShmb3JtLCBtZXJnZUZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VhcmNoUmVmLFxuICAgIGdldFNlYXJjaFJlZixcbiAgICBnZXRTZWFyY2hGb3JtRGF0YSxcbiAgICBzZXRTZWFyY2hGb3JtRGF0YSxcbiAgICBnZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YVxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VUYWJzKHNlYXJjaFJldDogYW55LCBwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCkge1xuICBjb25zdCB0YWJzQmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAocHJvcHMudGFicyAmJiBwcm9wcy50YWJzLnNob3cgJiYgcHJvcHMudGFicy5uYW1lKSB7XG4gICAgICBsZXQgZGljdCA9IG51bGw7XG4gICAgICBjb25zdCBkZWZhdWx0VGFicyA9IHsgLi4ucHJvcHMudGFicyB9O1xuICAgICAgaWYgKHByb3BzLnNlYXJjaD8uY29sdW1ucyAmJiBwcm9wcy5zZWFyY2g/LmNvbHVtbnNbcHJvcHMudGFicy5uYW1lXT8uY29tcG9uZW50Py5kaWN0KSB7XG4gICAgICAgIGRpY3QgPSBwcm9wcy5zZWFyY2g/LmNvbHVtbnNbcHJvcHMudGFicy5uYW1lXT8uY29tcG9uZW50Py5kaWN0O1xuICAgICAgICBpZiAoZGVmYXVsdFRhYnMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIGRlZmF1bHRUYWJzLnZhbHVlID0gZGljdC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdFRhYnMubGFiZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGRlZmF1bHRUYWJzLmxhYmVsID0gZGljdC5sYWJlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdFRhYnMub3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgZGVmYXVsdFRhYnMub3B0aW9ucyA9IGRpY3QuZGF0YSB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWZhdWx0VGFicyxcbiAgICAgICAgbW9kZWxWYWx1ZTogcHJvcHMuc2VhcmNoLnZhbGlkYXRlZEZvcm0gJiYgcHJvcHMuc2VhcmNoLnZhbGlkYXRlZEZvcm1bcHJvcHMudGFicy5uYW1lXSxcbiAgICAgICAgXCJvblVwZGF0ZTptb2RlbFZhbHVlXCI6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgY3R4LmVtaXQoXCJ0YWItY2hhbmdlXCIsIHsgW3Byb3BzLnRhYnMubmFtZV06IHZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2hvdzogZmFsc2VcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICB0YWJzQmluZGluZ1xuICB9O1xufVxuXG5mdW5jdGlvbiBzbG90RmlsdGVyKGN0eFNsb3RzOiBhbnksIGtleVByZWZpeDogc3RyaW5nKSB7XG4gIGlmICghY3R4U2xvdHMpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgY29uc3Qgc2xvdHM6IGFueSA9IHt9O1xuICBmb3JFYWNoKGN0eFNsb3RzLCAodmFsdWUsIGtleSkgPT4ge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChrZXlQcmVmaXgpKSB7XG4gICAgICBzbG90c1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHNsb3RzO1xufVxuXG5mdW5jdGlvbiB1c2VGaXhlZEhlaWdodChwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCwgeyB0YWJsZVJlZiwgY29udGFpbmVyUmVmIH06IGFueSkge1xuICBjb25zdCB1aSA9IHVpQ29udGV4dC5nZXQoKTtcbiAgbGV0IHRhYmxlQ0kgPSB1aS50YWJsZTtcbiAgaWYgKHByb3BzLnRhYmxlPy50YWJsZVZlcnNpb24gPT09IFwidjJcIikge1xuICAgIHRhYmxlQ0kgPSB1aS50YWJsZVYyO1xuICB9XG4gIGlmICh0YWJsZUNJLmhhc01heEhlaWdodChwcm9wcy50YWJsZSkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKCF0YWJsZUNJLmZpeGVkSGVhZGVyTmVlZENvbXB1dGVCb2R5SGVpZ2h0KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGNvbnN0IG1heEhlaWdodFJlZiA9IHJlZihudWxsKTtcblxuICBmdW5jdGlvbiBjb21wdXRlQm9keUhlaWdodCgpIHtcbiAgICBjb25zdCB0YWJsZURvbSA9IHRhYmxlUmVmPy52YWx1ZT8uJGVsO1xuICAgIGlmICh0YWJsZURvbSA9PSBudWxsIHx8IHRhYmxlRG9tLnF1ZXJ5U2VsZWN0b3IgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoZWFkRG9tID0gdGFibGVEb20ucXVlcnlTZWxlY3Rvcih0YWJsZUNJLmhlYWRlckRvbVNlbGVjdG9yKTtcbiAgICBpZiAoaGVhZERvbSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlSGVpZ2h0ID0gdGFibGVEb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIGNvbnN0IGhlYWRIZWlnaHQgPSBoZWFkRG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBtYXhIZWlnaHRSZWYudmFsdWUgPSB0YWJsZUhlaWdodCAtIGhlYWRIZWlnaHQgLSAyICsgKHByb3BzLnRhYmxlLm1heEhlaWdodEFkanVzdCB8fCAwKTtcblxuICAgIHV0aWxMb2cuZGVidWcoXCJ0YWJsZSBtYXggaGVpZ2h0IHJlY29tcHV0ZWQgXCIsIG1heEhlaWdodFJlZi52YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiB3YXRjaEJvZHlIZWlnaHRDaGFuZ2UoKSB7XG4gICAgY29uc3QgdGFibGVEb20gPSB0YWJsZVJlZj8udmFsdWU/LiRlbDtcbiAgICBpZiAodGFibGVEb20gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZVdyYXBwZXJEb20gPSB0YWJsZURvbS5wYXJlbnROb2RlO1xuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICAgIHV0aWxMb2cuZGVidWcoXCJ0YWJsZSByZXNpemVkXCIsIGVudHJpZXMpO1xuICAgICAgLy8g5q+P5qyh6KKr6KeC5rWL55qE5YWD57Sg5bC65a+45Y+R55Sf5pS55Y+Y6L+Z6YeM6YO95Lya5omn6KGMXG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIGVudHJpZXNbMF0uY29udGVudFJlY3QuaGVpZ2h0ID4gMCkge1xuICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUodGFibGVXcmFwcGVyRG9tKTsgLy8g6KeC5rWLRE9N5YWD57SgXG4gIH1cblxuICBvbk1vdW50ZWQoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICB3YXRjaEJvZHlIZWlnaHRDaGFuZ2UoKTtcbiAgfSk7XG4gIHJldHVybiB7IG1heEhlaWdodFJlZiwgY29tcHV0ZUJvZHlIZWlnaHQgfTtcbn1cblxuZnVuY3Rpb24gdXNlVGFibGUocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcbiAgY29uc3QgdWkgPSB1aUNvbnRleHQuZ2V0KCk7XG4gIGNvbnN0IHRhYmxlUmVmID0gcmVmKCk7XG4gIGNvbnN0IHRvb2xiYXJSZWYgPSByZWYoKTtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gcmVmKCk7XG4gIGNvbnN0IHsgbWF4SGVpZ2h0UmVmLCBjb21wdXRlQm9keUhlaWdodCB9ID0gdXNlRml4ZWRIZWlnaHQocHJvcHMsIGN0eCwgeyB0YWJsZVJlZiwgY29udGFpbmVyUmVmIH0pO1xuICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICBjb25zdCB0YWJsZVByb3BSZWYgPSB0b1JlZihwcm9wcywgXCJ0YWJsZVwiKTtcbiAgY29uc3QgY29tcHV0ZWRUYWJsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAvLyBhbnRkdiBuYWl2ZSDpq5jluqboh6rpgILlupTvvIwg5aaC5p6c55So5oi35pyJ6YWN572uc2Nyb2xs77yM5YiZ5LyY5YWI5L2/55So55So5oi36YWN572u55qEXG4gICAgbGV0IGZpeGVkSGVpZ2h0ID0ge307XG4gICAgaWYgKG1heEhlaWdodFJlZj8udmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHRhYmxlQ0kgPSB1aS50YWJsZTtcbiAgICAgIGlmIChwcm9wcy50YWJsZT8udGFibGVWZXJzaW9uID09PSBcInYyXCIpIHtcbiAgICAgICAgdGFibGVDSSA9IHVpLnRhYmxlVjI7XG4gICAgICB9XG4gICAgICBmaXhlZEhlaWdodCA9IHRhYmxlQ0kuYnVpbGRNYXhIZWlnaHQobWF4SGVpZ2h0UmVmLnZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgcEF0dHJzID0gdXRpbHMuZGFzaC5vbWl0KHRhYmxlUHJvcFJlZiwgXCJsb2FkaW5nXCIsIFwiY29sdW1uc1wiLCBcImNvbHVtbnNNYXBcIik7XG5cbiAgICByZXR1cm4gbWVyZ2UoZml4ZWRIZWlnaHQsIHsgLi4uY3R4LmF0dHJzLCAuLi5wQXR0cnMgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IGNvbXB1dGVkVG9vbGJhciA9IHRvUmVmKHByb3BzLCBcInRvb2xiYXJcIik7XG5cbiAgY29uc3QgY29tcHV0ZWRDZWxsU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHNsb3RGaWx0ZXIoY3R4LnNsb3RzLCBcImNlbGxcIik7XG4gIH0pO1xuXG4gIGNvbnN0IGNvbXB1dGVkRm9ybVNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBzbG90RmlsdGVyKGN0eC5zbG90cywgXCJmb3JtXCIpO1xuICB9KTtcbiAgY29uc3QgY29tcHV0ZWRTZWFyY2hTbG90cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gc2xvdEZpbHRlcihjdHguc2xvdHMsIFwic2VhcmNoXCIpO1xuICB9KTtcbiAgY29uc3QgY29tcHV0ZWRUb29sYmFyU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHNsb3RGaWx0ZXIoY3R4LnNsb3RzLCBcInRvb2xiYXJcIik7XG4gIH0pO1xuXG4gIGNvbnN0IGZvcm1XcmFwcGVyUmVmID0gcmVmKCk7XG5cbiAgY29uc3QgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjbGF6ejogYW55ID0geyBjb21wYWN0OiBwcm9wcy50b29sYmFyLmNvbXBhY3QgIT09IGZhbHNlIH07XG4gICAgaWYgKHByb3BzLmN1c3RvbUNsYXNzKSB7XG4gICAgICBjbGF6eltwcm9wcy5jdXN0b21DbGFzc10gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gY2xheno7XG4gIH0pO1xuXG4gIGNvbnN0IGlubmVyV3JhcHBlclJlZiA9IHJlZigpO1xuXG4gIGNvbnN0IGlzRm9ybUlubmVyID0gcmVmKGZhbHNlKTtcbiAgY29uc3Qgb25Gb3JtSW5uZXJDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgIGlzRm9ybUlubmVyLnZhbHVlID0gdmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICB0YWJsZVJlZixcbiAgICBjb250YWluZXJSZWYsXG4gICAgdG9vbGJhclJlZixcbiAgICBjb21wdXRlZFRhYmxlLFxuICAgIGNvbXB1dGVkVG9vbGJhcixcbiAgICBjb21wdXRlZENlbGxTbG90cyxcbiAgICBmb3JtV3JhcHBlclJlZixcbiAgICBpc0Zvcm1Jbm5lcixcbiAgICBvbkZvcm1Jbm5lckNoYW5nZSxcbiAgICBjb21wdXRlZEZvcm1TbG90cyxcbiAgICBjb21wdXRlZFNlYXJjaFNsb3RzLFxuICAgIGNvbXB1dGVkVG9vbGJhclNsb3RzLFxuICAgIGNvbXB1dGVCb2R5SGVpZ2h0LFxuICAgIGNvbXB1dGVkQ2xhc3MsXG4gICAgaW5uZXJXcmFwcGVyUmVmXG4gIH07XG59XG5cbi8qKlxuICogZnMtY3J1ZFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQ3J1ZFwiLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOihqOagvGlkXG4gICAgICovXG4gICAgaWQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IFwiXCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOagvOmFjee9ru+8jOingUZzVGFibGVcbiAgICAgKi9cbiAgICB0YWJsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6KGo5qC85pWw5o2uXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9yZXF1aXJlLWRlZmF1bHQtcHJvcFxuICAgIGRhdGE6IHtcbiAgICAgIHR5cGU6IEFycmF5XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmk43kvZzliJfphY3nva7vvIzop4FGc1Jvd0hhbmRsZVxuICAgICAqL1xuICAgIHJvd0hhbmRsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5p+l6K+i5qGG6YWN572u77yM6KeBRnNTZWFyY2hcbiAgICAgKi9cbiAgICBzZWFyY2g6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW3peWFt+adoemFjee9ru+8jOingUZzVG9vbGJhclxuICAgICAqL1xuICAgIHRvb2xiYXI6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWKqOS9nOadoemFjee9ru+8jOingUZzQWN0aW9uYmFyXG4gICAgICovXG4gICAgYWN0aW9uYmFyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiB0YWJzIGZpbHRlclxuICAgICAqL1xuICAgIHRhYnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOa3u+WKoOihqOWNleWvueivneahhumFjee9ru+8jOingUZzRm9ybVdyYXBwZXJcbiAgICAgKi9cbiAgICBhZGRGb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDnvJbovpHooajljZXlr7nor53moYbphY3nva7vvIzop4FGc0Zvcm1XcmFwcGVyXG4gICAgICovXG4gICAgZWRpdEZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOafpeeci+ihqOWNleWvueivneahhumFjee9ru+8jOingUZzRm9ybVdyYXBwZXJcbiAgICAgKi9cbiAgICB2aWV3Rm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog57+76aG16YWN572uLOaUr+aMgWVsLXBhZ2luYXRpb258YS1wYWdpbmF0aW9u6YWN572uXG4gICAgICovXG4gICAgcGFnaW5hdGlvbjoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHsgc2hvdzogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWuueWZqOmFjee9ru+8jOingUZzQ29udGFpbmVyXG4gICAgICovXG4gICAgY29udGFpbmVyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGNydWTljIXoo7nlrrnlmajnmoRjbGFzc1xuICAgICAqL1xuICAgIGN1c3RvbUNsYXNzOiB7fSxcbiAgICAvKipcbiAgICAgKiDkuI3opoHkvKDliLBmcy10YWJsZeWOu1xuICAgICAqL1xuICAgIGZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5Y+v6YCJ5oupXG4gICAgICovXG4gICAgc2VsZWN0aW9uOiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8Um93U2VsZWN0aW9uUHJvcHM+LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHsgc2hvdzogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJ1cGRhdGU6c2VhcmNoXCIsIFwidXBkYXRlOmNvbXBhY3RcIiwgXCJ1cGRhdGU6Y29sdW1uc1wiLCBcImZvcm0tdmFsdWUtY2hhbmdlXCIsIFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgXCJ0YWItY2hhbmdlXCJdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHg6IGFueSkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgdXNlUHJvdmlkZXJzKHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHNlYXJjaCA9IHVzZVNlYXJjaChwcm9wcywgY3R4KTtcbiAgICBjb25zdCB0YWJzID0gdXNlVGFicyhzZWFyY2gsIHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHRhYmxlID0gdXNlVGFibGUocHJvcHMsIGN0eCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgLi4uc2VhcmNoLFxuICAgICAgLi4udGFibGUsXG4gICAgICAuLi50YWJzXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLy/kvZzkuLrmlbDmja7ooajmoLzkvb/nlKjnmoTpooTorr7moLflvI/vvIzpmpDol49mb290ZXLvvIzooajmoLzpq5jluqbnoo7orrDlvZXmlbDlop7liqDogIzlop7liqBcbi5mcy1jcnVkLWFzLXRhYmxlIHtcbiAgbWluLWhlaWdodDogMCAhaW1wb3J0YW50O1xuICBoZWlnaHQ6IHVuc2V0O1xuXG4gIC5mcy1jcnVkLWZvb3RlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC5ib3ggLmlubmVyIHtcbiAgICBwb3NpdGlvbjogc3RhdGljO1xuICB9XG59XG5cbi5mcy1jcnVkLWNvbnRhaW5lciB7XG4gIG1pbi1oZWlnaHQ6IDMwMHB4O1xuXG4gICYuY29tcGFjdCB7XG4gICAgLmVsLXRhYmxlLS1ib3JkZXIge1xuICAgICAgYm9yZGVyLWxlZnQ6IDA7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtaGVhZGVyIHtcbiAgICAgIHBhZGRpbmctbGVmdDogMTBweDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtZm9vdGVyIHtcbiAgICAgIHBhZGRpbmctbGVmdDogMTBweDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gICAgfVxuICB9XG5cbiAgLmZzLWNydWQtaGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIHBhZGRpbmc6IDEwcHggMDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG5cbiAgICAuZnMtaGVhZGVyLXRvcCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC1zZWFyY2gge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBncmlkLWNvbHVtbjogc3BhbiAyO1xuICAgICAgcGFkZGluZy1ib3R0b206IDVweDtcbiAgICB9XG5cbiAgICAuZnMtaGVhZGVyLW1pZGRsZSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZnMtaGVhZGVyLWJvdHRvbSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC1hY3Rpb25iYXIge1xuICAgICAgLy8gcGFkZGluZy10b3A6IDVweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4OiAxMDAwMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBtaW4td2lkdGg6IDFweDtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC10b29sYmFyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgIGZsZXg6IDE7XG4gICAgfVxuICB9XG5cbiAgLmZzLWNydWQtdGFibGUge1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC5mcy1jcnVkLWZvb3RlciB7XG4gICAgcGFkZGluZzogMTBweCAwO1xuXG4gICAgLmZzLWNydWQtcGFnaW5hdGlvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgICAgLmZzLXBhZ2luYXRpb24tbGVmdCB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgIH1cblxuICAgICAgLmZzLXBhZ2luYXRpb24tcmlnaHQge1xuICAgICAgICBmbGV4OiAwO1xuICAgICAgfVxuXG4gICAgICAuZnMtcGFnaW5hdGlvbiB7XG4gICAgICAgIGZsZXg6IDE7XG5cbiAgICAgICAgLmFudC1wYWdpbmF0aW9uLW9wdGlvbnMge1xuICAgICAgICAgIC5hbnQtc2VsZWN0IHtcbiAgICAgICAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC5lbC1wYWdpbmF0aW9uIHtcbiAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICAgICAgcGFkZGluZy1yaWdodDogMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuZnMtcGFnaW5hdGlvbi1yaWdodCB7XG4gICAgICAgIGZsZXg6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAuZnMtY3J1ZC1jb250YWluZXIge1xuICAgIC5ib2R5IHtcbiAgICAgIG92ZXJmbG93LXk6IHVuc2V0ICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC5hbnQtdGFibGUtYm9keSB7XG4gICAgICBtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC5uLWRhdGEtdGFibGUtYmFzZS10YWJsZS1ib2R5IHtcbiAgICAgIG1heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtaGVhZGVyIC5mcy1jcnVkLWFjdGlvbmJhciB7XG4gICAgICBmbGV4OiB1bnNldCAhaW1wb3J0YW50O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMnB4O1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cImNvbnRhaW5lcj8uaXMgfHwgJ2ZzLWxheW91dC1kZWZhdWx0J1wiXG4gICAgcmVmPVwiY29udGFpbmVyUmVmXCJcbiAgICBjbGFzcz1cImZzLWNydWQtY29udGFpbmVyXCJcbiAgICB2LWJpbmQ9XCJjb250YWluZXJcIlxuICAgIDpjbGFzcz1cImNvbXB1dGVkQ2xhc3NcIlxuICA+XG4gICAgPHNsb3Q+PC9zbG90PlxuXG4gICAgPHRlbXBsYXRlICNoZWFkZXItdG9wPlxuICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci10b3BcIj48L3Nsb3Q+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgI2hlYWRlci1ib3R0b20+XG4gICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSAjaGVhZGVyLW1pZGRsZT5cbiAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItbWlkZGxlXCI+PC9zbG90PlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgI3NlYXJjaD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLXNlYXJjaFwiPlxuICAgICAgICA8Y29tcG9uZW50IDppcz1cInNlYXJjaC5pcyB8fCAnZnMtc2VhcmNoJ1wiIHJlZj1cInNlYXJjaFJlZlwiIHYtYmluZD1cInNlYXJjaFwiIDpzbG90cz1cImNvbXB1dGVkU2VhcmNoU2xvdHNcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjYWN0aW9uYmFyPlxuICAgICAgPGRpdiB2LWlmPVwiYWN0aW9uYmFyICYmIGFjdGlvbmJhci5zaG93ICE9PSBmYWxzZVwiIGNsYXNzPVwiZnMtY3J1ZC1hY3Rpb25iYXJcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cImFjdGlvbmJhci1sZWZ0XCI+PC9zbG90PlxuICAgICAgICA8ZnMtYWN0aW9uYmFyIHYtYmluZD1cImFjdGlvbmJhclwiIC8+XG4gICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25iYXItcmlnaHRcIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICN0b29sYmFyPlxuICAgICAgPGRpdiB2LWlmPVwidG9vbGJhciAmJiB0b29sYmFyLnNob3cgIT09IGZhbHNlXCIgY2xhc3M9XCJmcy1jcnVkLXRvb2xiYXJcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cInRvb2xiYXItbGVmdFwiPjwvc2xvdD5cbiAgICAgICAgPGZzLXRvb2xiYXIgcmVmPVwidG9vbGJhclJlZlwiIHYtYmluZD1cInRvb2xiYXJcIiA6c2xvdHM9XCJjb21wdXRlZFRvb2xiYXJTbG90c1wiIDpjb2x1bW5zPVwidGFibGUuY29sdW1uc1wiIC8+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyLXJpZ2h0XCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgI3RhYnM+XG4gICAgICA8ZnMtdGFicy1maWx0ZXIgdi1pZj1cInRhYnNCaW5kaW5nLnNob3dcIiByZWY9XCJ0YWJzUmVmXCIgY2xhc3M9XCJmcy10YWJzXCIgdi1iaW5kPVwidGFic0JpbmRpbmdcIiAvPlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlICN0YWJsZT5cbiAgICAgIDxmcy10YWJsZVxuICAgICAgICByZWY9XCJ0YWJsZVJlZlwiXG4gICAgICAgIGNsYXNzPVwiZnMtY3J1ZC10YWJsZVwiXG4gICAgICAgIHYtYmluZD1cImNvbXB1dGVkVGFibGVcIlxuICAgICAgICA6Y29sdW1ucz1cInRhYmxlLmNvbHVtbnNcIlxuICAgICAgICA6bG9hZGluZz1cInRhYmxlLmxvYWRpbmdcIlxuICAgICAgICA6cm93LWhhbmRsZT1cInJvd0hhbmRsZVwiXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgIDpjZWxsLXNsb3RzPVwiY29tcHV0ZWRDZWxsU2xvdHNcIlxuICAgICAgLz5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICNmb3JtPlxuICAgICAgPGRpdiByZWY9XCJpbm5lcldyYXBwZXJSZWZcIiBjbGFzcz1cImZzLWZvcm0td3JhcHBlci1jb250YWluZXJcIiA6Y2xhc3M9XCJ7ICdmcy1mb3JtLWlubmVyLXdyYXBwZXInOiBpc0Zvcm1Jbm5lciB9XCI+XG4gICAgICAgIDxmcy1mb3JtLXdyYXBwZXJcbiAgICAgICAgICByZWY9XCJmb3JtV3JhcHBlclJlZlwiXG4gICAgICAgICAgOnNsb3RzPVwiY29tcHV0ZWRGb3JtU2xvdHNcIlxuICAgICAgICAgIDppbm5lci13cmFwcGVyPVwiaW5uZXJXcmFwcGVyUmVmXCJcbiAgICAgICAgICBAaW5uZXItY2hhbmdlPVwib25Gb3JtSW5uZXJDaGFuZ2VcIlxuICAgICAgICAgIEB2YWx1ZS1jaGFuZ2U9XCIkZW1pdCgnZm9ybS12YWx1ZS1jaGFuZ2UnLCAkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPCEtLSDnvJbovpHlr7nor53moYYgLS0+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICNwYWdpbmF0aW9uPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWNydWQtcGFnaW5hdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcGFnaW5hdGlvbi1sZWZ0XCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInBhZ2luYXRpb24tbGVmdFwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdpbmF0aW9uXCI+XG4gICAgICAgICAgPCEtLSBwYWdpbmF0aW9uLmN1cnJlbnRQYWdlIOWmguaenOS4uuepuu+8jCBlbGVtZW505Lya5Ye66K2m5ZGKIC0tPlxuICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucGFnaW5hdGlvbi5uYW1lXCIgdi1pZj1cInBhZ2luYXRpb24uc2hvdyAhPT0gZmFsc2VcIiB2LWJpbmQ9XCJwYWdpbmF0aW9uXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdpbmF0aW9uLXJpZ2h0XCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInBhZ2luYXRpb24tcmlnaHRcIj48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjZm9vdGVyLXRvcD5cbiAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItdG9wXCI+PC9zbG90PlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlICNmb290ZXItYm90dG9tPlxuICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCBvbk1vdW50ZWQsIFByb3BUeXBlLCBwcm92aWRlLCByZWYsIFNldHVwQ29udGV4dCwgdG9SZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgdWlDb250ZXh0IH0gZnJvbSBcIi4uL3VpXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi91c2UvdXNlLW1lcmdlXCI7XG5pbXBvcnQgdXRpbExvZyBmcm9tIFwiLi4vdXRpbHMvdXRpbC5sb2dcIjtcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uL3V0aWxzL3V0aWwubG9nXCI7XG5pbXBvcnQgeyBSb3dTZWxlY3Rpb25Qcm9wcywgU2V0U2VhcmNoRm9ybURhdGFQcm9wcyB9IGZyb20gXCIuLi9kXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi91c2VcIjtcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbnV0aWxzLnRyYWNlKFwiZnMtdGFibGVcIik7XG5jb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuXG5mdW5jdGlvbiB1c2VQcm92aWRlcnMocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcbiAgcHJvdmlkZShcImdldDpjb2x1bW5zXCIsICgpID0+IHtcbiAgICByZXR1cm4gcHJvcHMudGFibGUuY29sdW1ucztcbiAgfSk7XG4gIHByb3ZpZGUoXCJ1cGRhdGU6Y29sdW1uc1wiLCAoY29sdW1uczogYW55KSA9PiB7XG4gICAgY3R4LmVtaXQoXCJ1cGRhdGU6Y29sdW1uc1wiLCBjb2x1bW5zKTtcbiAgfSk7XG5cbiAgcHJvdmlkZShcImdldDpjcnVkQmluZGluZ1wiLCAoKSA9PiB7XG4gICAgcmV0dXJuIHByb3BzO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXNlU2VhcmNoKHByb3BzOiBhbnksIGN0eDogU2V0dXBDb250ZXh0KSB7XG4gIGNvbnN0IHNlYXJjaFJlZiA9IHJlZigpO1xuICBjb25zdCBnZXRTZWFyY2hSZWYgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHNlYXJjaFJlZi52YWx1ZTtcbiAgfTtcblxuICBjb25zdCBnZXRTZWFyY2hGb3JtRGF0YSA9ICgpID0+IHtcbiAgICBpZiAoc2VhcmNoUmVmLnZhbHVlKSB7XG4gICAgICByZXR1cm4gc2VhcmNoUmVmLnZhbHVlLmdldEZvcm0oKTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oXCLor7fkvb/nlKhleHBvc2UuZ2V0U2VhcmNoRm9ybURhdGHku6Pmm79cIik7XG4gICAgcmV0dXJuIHt9O1xuICB9O1xuXG4gIGNvbnN0IGdldFNlYXJjaFZhbGlkYXRlZEZvcm1EYXRhID0gKCkgPT4ge1xuICAgIGlmIChzZWFyY2hSZWYudmFsdWUpIHtcbiAgICAgIHJldHVybiBzZWFyY2hSZWYudmFsdWUuZ2V0VmFsaWRhdGVkRm9ybSgpO1xuICAgIH1cbiAgICBsb2dnZXIud2FybihcIuivt+S9v+eUqGV4cG9zZS5nZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YeS7o+abv1wiKTtcbiAgICByZXR1cm4ge307XG4gIH07XG5cbiAgLyoqXG4gICAqIOiuvue9rmZvcm3lgLxcbiAgICogQHBhcmFtIGZvcm0gZm9ybeWvueixoVxuICAgKiBAcGFyYW0gb3B0cyA9IHtcbiAgICogICAgaXNNZXJnZTpmYWxzZSDmmK/lkKbkuI7ljp/mnIlmb3Jt5YC85ZCI5bm2LFxuICAgKiB9XG4gICAqL1xuICBmdW5jdGlvbiBzZXRTZWFyY2hGb3JtRGF0YSh7IGZvcm0sIG1lcmdlRm9ybSA9IGZhbHNlIH06IFNldFNlYXJjaEZvcm1EYXRhUHJvcHMpIHtcbiAgICBpZiAoc2VhcmNoUmVmLnZhbHVlKSB7XG4gICAgICBzZWFyY2hSZWYudmFsdWUuc2V0Rm9ybShmb3JtLCBtZXJnZUZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VhcmNoUmVmLFxuICAgIGdldFNlYXJjaFJlZixcbiAgICBnZXRTZWFyY2hGb3JtRGF0YSxcbiAgICBzZXRTZWFyY2hGb3JtRGF0YSxcbiAgICBnZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YVxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VUYWJzKHNlYXJjaFJldDogYW55LCBwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCkge1xuICBjb25zdCB0YWJzQmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAocHJvcHMudGFicyAmJiBwcm9wcy50YWJzLnNob3cgJiYgcHJvcHMudGFicy5uYW1lKSB7XG4gICAgICBsZXQgZGljdCA9IG51bGw7XG4gICAgICBjb25zdCBkZWZhdWx0VGFicyA9IHsgLi4ucHJvcHMudGFicyB9O1xuICAgICAgaWYgKHByb3BzLnNlYXJjaD8uY29sdW1ucyAmJiBwcm9wcy5zZWFyY2g/LmNvbHVtbnNbcHJvcHMudGFicy5uYW1lXT8uY29tcG9uZW50Py5kaWN0KSB7XG4gICAgICAgIGRpY3QgPSBwcm9wcy5zZWFyY2g/LmNvbHVtbnNbcHJvcHMudGFicy5uYW1lXT8uY29tcG9uZW50Py5kaWN0O1xuICAgICAgICBpZiAoZGVmYXVsdFRhYnMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIGRlZmF1bHRUYWJzLnZhbHVlID0gZGljdC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdFRhYnMubGFiZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGRlZmF1bHRUYWJzLmxhYmVsID0gZGljdC5sYWJlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdFRhYnMub3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgZGVmYXVsdFRhYnMub3B0aW9ucyA9IGRpY3QuZGF0YSB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWZhdWx0VGFicyxcbiAgICAgICAgbW9kZWxWYWx1ZTogcHJvcHMuc2VhcmNoLnZhbGlkYXRlZEZvcm0gJiYgcHJvcHMuc2VhcmNoLnZhbGlkYXRlZEZvcm1bcHJvcHMudGFicy5uYW1lXSxcbiAgICAgICAgXCJvblVwZGF0ZTptb2RlbFZhbHVlXCI6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgY3R4LmVtaXQoXCJ0YWItY2hhbmdlXCIsIHsgW3Byb3BzLnRhYnMubmFtZV06IHZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2hvdzogZmFsc2VcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICB0YWJzQmluZGluZ1xuICB9O1xufVxuXG5mdW5jdGlvbiBzbG90RmlsdGVyKGN0eFNsb3RzOiBhbnksIGtleVByZWZpeDogc3RyaW5nKSB7XG4gIGlmICghY3R4U2xvdHMpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgY29uc3Qgc2xvdHM6IGFueSA9IHt9O1xuICBmb3JFYWNoKGN0eFNsb3RzLCAodmFsdWUsIGtleSkgPT4ge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChrZXlQcmVmaXgpKSB7XG4gICAgICBzbG90c1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHNsb3RzO1xufVxuXG5mdW5jdGlvbiB1c2VGaXhlZEhlaWdodChwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCwgeyB0YWJsZVJlZiwgY29udGFpbmVyUmVmIH06IGFueSkge1xuICBjb25zdCB1aSA9IHVpQ29udGV4dC5nZXQoKTtcbiAgbGV0IHRhYmxlQ0kgPSB1aS50YWJsZTtcbiAgaWYgKHByb3BzLnRhYmxlPy50YWJsZVZlcnNpb24gPT09IFwidjJcIikge1xuICAgIHRhYmxlQ0kgPSB1aS50YWJsZVYyO1xuICB9XG4gIGlmICh0YWJsZUNJLmhhc01heEhlaWdodChwcm9wcy50YWJsZSkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKCF0YWJsZUNJLmZpeGVkSGVhZGVyTmVlZENvbXB1dGVCb2R5SGVpZ2h0KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGNvbnN0IG1heEhlaWdodFJlZiA9IHJlZihudWxsKTtcblxuICBmdW5jdGlvbiBjb21wdXRlQm9keUhlaWdodCgpIHtcbiAgICBjb25zdCB0YWJsZURvbSA9IHRhYmxlUmVmPy52YWx1ZT8uJGVsO1xuICAgIGlmICh0YWJsZURvbSA9PSBudWxsIHx8IHRhYmxlRG9tLnF1ZXJ5U2VsZWN0b3IgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoZWFkRG9tID0gdGFibGVEb20ucXVlcnlTZWxlY3Rvcih0YWJsZUNJLmhlYWRlckRvbVNlbGVjdG9yKTtcbiAgICBpZiAoaGVhZERvbSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlSGVpZ2h0ID0gdGFibGVEb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIGNvbnN0IGhlYWRIZWlnaHQgPSBoZWFkRG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBtYXhIZWlnaHRSZWYudmFsdWUgPSB0YWJsZUhlaWdodCAtIGhlYWRIZWlnaHQgLSAyICsgKHByb3BzLnRhYmxlLm1heEhlaWdodEFkanVzdCB8fCAwKTtcblxuICAgIHV0aWxMb2cuZGVidWcoXCJ0YWJsZSBtYXggaGVpZ2h0IHJlY29tcHV0ZWQgXCIsIG1heEhlaWdodFJlZi52YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiB3YXRjaEJvZHlIZWlnaHRDaGFuZ2UoKSB7XG4gICAgY29uc3QgdGFibGVEb20gPSB0YWJsZVJlZj8udmFsdWU/LiRlbDtcbiAgICBpZiAodGFibGVEb20gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZVdyYXBwZXJEb20gPSB0YWJsZURvbS5wYXJlbnROb2RlO1xuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICAgIHV0aWxMb2cuZGVidWcoXCJ0YWJsZSByZXNpemVkXCIsIGVudHJpZXMpO1xuICAgICAgLy8g5q+P5qyh6KKr6KeC5rWL55qE5YWD57Sg5bC65a+45Y+R55Sf5pS55Y+Y6L+Z6YeM6YO95Lya5omn6KGMXG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIGVudHJpZXNbMF0uY29udGVudFJlY3QuaGVpZ2h0ID4gMCkge1xuICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUodGFibGVXcmFwcGVyRG9tKTsgLy8g6KeC5rWLRE9N5YWD57SgXG4gIH1cblxuICBvbk1vdW50ZWQoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICB3YXRjaEJvZHlIZWlnaHRDaGFuZ2UoKTtcbiAgfSk7XG4gIHJldHVybiB7IG1heEhlaWdodFJlZiwgY29tcHV0ZUJvZHlIZWlnaHQgfTtcbn1cblxuZnVuY3Rpb24gdXNlVGFibGUocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcbiAgY29uc3QgdWkgPSB1aUNvbnRleHQuZ2V0KCk7XG4gIGNvbnN0IHRhYmxlUmVmID0gcmVmKCk7XG4gIGNvbnN0IHRvb2xiYXJSZWYgPSByZWYoKTtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gcmVmKCk7XG4gIGNvbnN0IHsgbWF4SGVpZ2h0UmVmLCBjb21wdXRlQm9keUhlaWdodCB9ID0gdXNlRml4ZWRIZWlnaHQocHJvcHMsIGN0eCwgeyB0YWJsZVJlZiwgY29udGFpbmVyUmVmIH0pO1xuICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICBjb25zdCB0YWJsZVByb3BSZWYgPSB0b1JlZihwcm9wcywgXCJ0YWJsZVwiKTtcbiAgY29uc3QgY29tcHV0ZWRUYWJsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAvLyBhbnRkdiBuYWl2ZSDpq5jluqboh6rpgILlupTvvIwg5aaC5p6c55So5oi35pyJ6YWN572uc2Nyb2xs77yM5YiZ5LyY5YWI5L2/55So55So5oi36YWN572u55qEXG4gICAgbGV0IGZpeGVkSGVpZ2h0ID0ge307XG4gICAgaWYgKG1heEhlaWdodFJlZj8udmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHRhYmxlQ0kgPSB1aS50YWJsZTtcbiAgICAgIGlmIChwcm9wcy50YWJsZT8udGFibGVWZXJzaW9uID09PSBcInYyXCIpIHtcbiAgICAgICAgdGFibGVDSSA9IHVpLnRhYmxlVjI7XG4gICAgICB9XG4gICAgICBmaXhlZEhlaWdodCA9IHRhYmxlQ0kuYnVpbGRNYXhIZWlnaHQobWF4SGVpZ2h0UmVmLnZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgcEF0dHJzID0gdXRpbHMuZGFzaC5vbWl0KHRhYmxlUHJvcFJlZiwgXCJsb2FkaW5nXCIsIFwiY29sdW1uc1wiLCBcImNvbHVtbnNNYXBcIik7XG5cbiAgICByZXR1cm4gbWVyZ2UoZml4ZWRIZWlnaHQsIHsgLi4uY3R4LmF0dHJzLCAuLi5wQXR0cnMgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IGNvbXB1dGVkVG9vbGJhciA9IHRvUmVmKHByb3BzLCBcInRvb2xiYXJcIik7XG5cbiAgY29uc3QgY29tcHV0ZWRDZWxsU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHNsb3RGaWx0ZXIoY3R4LnNsb3RzLCBcImNlbGxcIik7XG4gIH0pO1xuXG4gIGNvbnN0IGNvbXB1dGVkRm9ybVNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBzbG90RmlsdGVyKGN0eC5zbG90cywgXCJmb3JtXCIpO1xuICB9KTtcbiAgY29uc3QgY29tcHV0ZWRTZWFyY2hTbG90cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gc2xvdEZpbHRlcihjdHguc2xvdHMsIFwic2VhcmNoXCIpO1xuICB9KTtcbiAgY29uc3QgY29tcHV0ZWRUb29sYmFyU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHNsb3RGaWx0ZXIoY3R4LnNsb3RzLCBcInRvb2xiYXJcIik7XG4gIH0pO1xuXG4gIGNvbnN0IGZvcm1XcmFwcGVyUmVmID0gcmVmKCk7XG5cbiAgY29uc3QgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjbGF6ejogYW55ID0geyBjb21wYWN0OiBwcm9wcy50b29sYmFyLmNvbXBhY3QgIT09IGZhbHNlIH07XG4gICAgaWYgKHByb3BzLmN1c3RvbUNsYXNzKSB7XG4gICAgICBjbGF6eltwcm9wcy5jdXN0b21DbGFzc10gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gY2xheno7XG4gIH0pO1xuXG4gIGNvbnN0IGlubmVyV3JhcHBlclJlZiA9IHJlZigpO1xuXG4gIGNvbnN0IGlzRm9ybUlubmVyID0gcmVmKGZhbHNlKTtcbiAgY29uc3Qgb25Gb3JtSW5uZXJDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgIGlzRm9ybUlubmVyLnZhbHVlID0gdmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICB0YWJsZVJlZixcbiAgICBjb250YWluZXJSZWYsXG4gICAgdG9vbGJhclJlZixcbiAgICBjb21wdXRlZFRhYmxlLFxuICAgIGNvbXB1dGVkVG9vbGJhcixcbiAgICBjb21wdXRlZENlbGxTbG90cyxcbiAgICBmb3JtV3JhcHBlclJlZixcbiAgICBpc0Zvcm1Jbm5lcixcbiAgICBvbkZvcm1Jbm5lckNoYW5nZSxcbiAgICBjb21wdXRlZEZvcm1TbG90cyxcbiAgICBjb21wdXRlZFNlYXJjaFNsb3RzLFxuICAgIGNvbXB1dGVkVG9vbGJhclNsb3RzLFxuICAgIGNvbXB1dGVCb2R5SGVpZ2h0LFxuICAgIGNvbXB1dGVkQ2xhc3MsXG4gICAgaW5uZXJXcmFwcGVyUmVmXG4gIH07XG59XG5cbi8qKlxuICogZnMtY3J1ZFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQ3J1ZFwiLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOihqOagvGlkXG4gICAgICovXG4gICAgaWQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IFwiXCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOagvOmFjee9ru+8jOingUZzVGFibGVcbiAgICAgKi9cbiAgICB0YWJsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6KGo5qC85pWw5o2uXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9yZXF1aXJlLWRlZmF1bHQtcHJvcFxuICAgIGRhdGE6IHtcbiAgICAgIHR5cGU6IEFycmF5XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmk43kvZzliJfphY3nva7vvIzop4FGc1Jvd0hhbmRsZVxuICAgICAqL1xuICAgIHJvd0hhbmRsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5p+l6K+i5qGG6YWN572u77yM6KeBRnNTZWFyY2hcbiAgICAgKi9cbiAgICBzZWFyY2g6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW3peWFt+adoemFjee9ru+8jOingUZzVG9vbGJhclxuICAgICAqL1xuICAgIHRvb2xiYXI6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWKqOS9nOadoemFjee9ru+8jOingUZzQWN0aW9uYmFyXG4gICAgICovXG4gICAgYWN0aW9uYmFyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiB0YWJzIGZpbHRlclxuICAgICAqL1xuICAgIHRhYnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOa3u+WKoOihqOWNleWvueivneahhumFjee9ru+8jOingUZzRm9ybVdyYXBwZXJcbiAgICAgKi9cbiAgICBhZGRGb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDnvJbovpHooajljZXlr7nor53moYbphY3nva7vvIzop4FGc0Zvcm1XcmFwcGVyXG4gICAgICovXG4gICAgZWRpdEZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOafpeeci+ihqOWNleWvueivneahhumFjee9ru+8jOingUZzRm9ybVdyYXBwZXJcbiAgICAgKi9cbiAgICB2aWV3Rm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog57+76aG16YWN572uLOaUr+aMgWVsLXBhZ2luYXRpb258YS1wYWdpbmF0aW9u6YWN572uXG4gICAgICovXG4gICAgcGFnaW5hdGlvbjoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHsgc2hvdzogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWuueWZqOmFjee9ru+8jOingUZzQ29udGFpbmVyXG4gICAgICovXG4gICAgY29udGFpbmVyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGNydWTljIXoo7nlrrnlmajnmoRjbGFzc1xuICAgICAqL1xuICAgIGN1c3RvbUNsYXNzOiB7fSxcbiAgICAvKipcbiAgICAgKiDkuI3opoHkvKDliLBmcy10YWJsZeWOu1xuICAgICAqL1xuICAgIGZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5Y+v6YCJ5oupXG4gICAgICovXG4gICAgc2VsZWN0aW9uOiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8Um93U2VsZWN0aW9uUHJvcHM+LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHsgc2hvdzogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJ1cGRhdGU6c2VhcmNoXCIsIFwidXBkYXRlOmNvbXBhY3RcIiwgXCJ1cGRhdGU6Y29sdW1uc1wiLCBcImZvcm0tdmFsdWUtY2hhbmdlXCIsIFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgXCJ0YWItY2hhbmdlXCJdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHg6IGFueSkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgdXNlUHJvdmlkZXJzKHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHNlYXJjaCA9IHVzZVNlYXJjaChwcm9wcywgY3R4KTtcbiAgICBjb25zdCB0YWJzID0gdXNlVGFicyhzZWFyY2gsIHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHRhYmxlID0gdXNlVGFibGUocHJvcHMsIGN0eCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgLi4uc2VhcmNoLFxuICAgICAgLi4udGFibGUsXG4gICAgICAuLi50YWJzXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLy/kvZzkuLrmlbDmja7ooajmoLzkvb/nlKjnmoTpooTorr7moLflvI/vvIzpmpDol49mb290ZXLvvIzooajmoLzpq5jluqbnoo7orrDlvZXmlbDlop7liqDogIzlop7liqBcbi5mcy1jcnVkLWFzLXRhYmxlIHtcbiAgbWluLWhlaWdodDogMCAhaW1wb3J0YW50O1xuICBoZWlnaHQ6IHVuc2V0O1xuXG4gIC5mcy1jcnVkLWZvb3RlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC5ib3ggLmlubmVyIHtcbiAgICBwb3NpdGlvbjogc3RhdGljO1xuICB9XG59XG5cbi5mcy1jcnVkLWNvbnRhaW5lciB7XG4gIG1pbi1oZWlnaHQ6IDMwMHB4O1xuXG4gICYuY29tcGFjdCB7XG4gICAgLmVsLXRhYmxlLS1ib3JkZXIge1xuICAgICAgYm9yZGVyLWxlZnQ6IDA7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtaGVhZGVyIHtcbiAgICAgIHBhZGRpbmctbGVmdDogMTBweDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtZm9vdGVyIHtcbiAgICAgIHBhZGRpbmctbGVmdDogMTBweDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gICAgfVxuICB9XG5cbiAgLmZzLWNydWQtaGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIHBhZGRpbmc6IDEwcHggMDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG5cbiAgICAuZnMtaGVhZGVyLXRvcCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC1zZWFyY2gge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBncmlkLWNvbHVtbjogc3BhbiAyO1xuICAgICAgcGFkZGluZy1ib3R0b206IDVweDtcbiAgICB9XG5cbiAgICAuZnMtaGVhZGVyLW1pZGRsZSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZnMtaGVhZGVyLWJvdHRvbSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC1hY3Rpb25iYXIge1xuICAgICAgLy8gcGFkZGluZy10b3A6IDVweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4OiAxMDAwMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBtaW4td2lkdGg6IDFweDtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC10b29sYmFyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgIGZsZXg6IDE7XG4gICAgfVxuICB9XG5cbiAgLmZzLWNydWQtdGFibGUge1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC5mcy1jcnVkLWZvb3RlciB7XG4gICAgcGFkZGluZzogMTBweCAwO1xuXG4gICAgLmZzLWNydWQtcGFnaW5hdGlvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgICAgLmZzLXBhZ2luYXRpb24tbGVmdCB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgIH1cblxuICAgICAgLmZzLXBhZ2luYXRpb24tcmlnaHQge1xuICAgICAgICBmbGV4OiAwO1xuICAgICAgfVxuXG4gICAgICAuZnMtcGFnaW5hdGlvbiB7XG4gICAgICAgIGZsZXg6IDE7XG5cbiAgICAgICAgLmFudC1wYWdpbmF0aW9uLW9wdGlvbnMge1xuICAgICAgICAgIC5hbnQtc2VsZWN0IHtcbiAgICAgICAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC5lbC1wYWdpbmF0aW9uIHtcbiAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICAgICAgcGFkZGluZy1yaWdodDogMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuZnMtcGFnaW5hdGlvbi1yaWdodCB7XG4gICAgICAgIGZsZXg6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAuZnMtY3J1ZC1jb250YWluZXIge1xuICAgIC5ib2R5IHtcbiAgICAgIG92ZXJmbG93LXk6IHVuc2V0ICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC5hbnQtdGFibGUtYm9keSB7XG4gICAgICBtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC5uLWRhdGEtdGFibGUtYmFzZS10YWJsZS1ib2R5IHtcbiAgICAgIG1heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtaGVhZGVyIC5mcy1jcnVkLWFjdGlvbmJhciB7XG4gICAgICBmbGV4OiB1bnNldCAhaW1wb3J0YW50O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMnB4O1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLXJvdy1oYW5kbGVcIj5cbiAgICA8c2xvdCBuYW1lPVwiY2VsbC1yb3dIYW5kbGUtbGVmdFwiIHYtYmluZD1cInNjb3BlUmVmXCI+PC9zbG90PlxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gY29tcHV0ZWRIYW5kbGVCdG5zXCIgOmtleT1cImluZGV4XCI+XG4gICAgICA8dGVtcGxhdGUgdi1pZj1cIml0ZW0uc2hvdyAhPT0gZmFsc2UgJiYgIWlzRHJvcGRvd25CdG4oaXRlbSwgaW5kZXgpXCI+XG4gICAgICAgIDxmcy1yZW5kZXIgdi1pZj1cIml0ZW0ucmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiaXRlbS5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZVJlZlwiIC8+XG4gICAgICAgIDxmcy1idXR0b24gdi1lbHNlIGNsYXNzPVwicm93LWhhbmRsZS1idG5cIiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrLnN0b3A9XCJkb0NsaWNrKGl0ZW0pXCIgLz5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8c2xvdCBuYW1lPVwiY2VsbC1yb3dIYW5kbGUtbWlkZGxlXCIgdi1iaW5kPVwic2NvcGVcIj48L3Nsb3Q+XG4gICAgPCEtLSDkuIvmi4nmjInpkq7oj5zljZUgLS0+XG4gICAgPHNwYW4gdi1pZj1cImhhc0Ryb3Bkb3duQnRuXCIgY2xhc3M9XCJyb3ctaGFuZGxlLWJ0biBmcy1oYW5kbGUtcm93LWRyb3Bkb3duXCI+XG4gICAgICA8Y29tcG9uZW50IDppcz1cInVpLmRyb3Bkb3duLm5hbWVcIiB2LWJpbmQ9XCJjb21wdXRlZERyb3Bkb3duQmluZGluZ1wiPlxuICAgICAgICA8ZnMtYnV0dG9uIHYtYmluZD1cImRyb3Bkb3duLm1vcmVcIiAvPlxuICAgICAgICA8dGVtcGxhdGUgI1t1aS5kcm9wZG93bi5zbG90TmFtZV0+XG4gICAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgICAgOmlzPVwidWkuZHJvcGRvd25NZW51Lm5hbWVcIlxuICAgICAgICAgICAgdi1pZj1cInVpLmRyb3Bkb3duLnJlbmRlck1vZGUgPT09ICdzbG90J1wiXG4gICAgICAgICAgICB2LWJpbmQ9XCJ1aS5kcm9wZG93bk1lbnUuY29tbWFuZChkb0Ryb3Bkb3duSXRlbUNsaWNrKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjb21wdXRlZEhhbmRsZUJ0bnNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIDppcz1cInVpLmRyb3Bkb3duSXRlbS5uYW1lXCJcbiAgICAgICAgICAgICAgICB2LWlmPVwiaXRlbS5zaG93ICE9PSBmYWxzZSAmJiBpc0Ryb3Bkb3duQnRuKGl0ZW0sIGluZGV4KVwiXG4gICAgICAgICAgICAgICAgOlt1aS5kcm9wZG93bkl0ZW0uY29tbWFuZF09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgdi1iaW5kPVwiaXRlbS5kcm9wZG93bkl0ZW1cIlxuICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLXJvdy1oYW5kbGUtZHJvcGRvd24taXRlbVwiIHYtYmluZD1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICAgIDxmcy1pY29uIHYtaWY9XCJpdGVtLmljb25cIiA6aWNvbj1cIml0ZW0uaWNvblwiIC8+IHt7IGl0ZW0udGV4dCB8fCBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvc3Bhbj5cbiAgICA8c2xvdCBuYW1lPVwiY2VsbC1yb3dIYW5kbGUtcmlnaHRcIiB2LWJpbmQ9XCJzY29wZVwiPjwvc2xvdD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBmb3JFYWNoLCBzb3J0QnksIG9taXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS11aVwiO1xuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgQnV0dG9uUHJvcHMsIFNjb3BlQ29udGV4dCB9IGZyb20gXCIuLi8uLi9kXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi91c2VcIjtcblxuLyoqXG4gKiDmk43kvZzliJfphY3nva5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1Jvd0hhbmRsZVwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaMiemSruaKmOWPoOmFjee9rlxuICAgICAqL1xuICAgIGRyb3Bkb3duOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaMiemSrumFjee9rlxuICAgICAqIHtcbiAgICAgKiAgIHZpZXc6ey4uLkZzQnV0dG9uLGNsaWNrOkZ1bmN0aW9uLG9yZGVyOjF9LFxuICAgICAqICAgZWRpdDp7Li4uRnNCdXR0b24sY2xpY2s6RnVuY3Rpb24sb3JkZXI6Mn0sXG4gICAgICogICByZW1vdmU6ey4uLkZzQnV0dG9uLGNsaWNrOkZ1bmN0aW9uLG9yZGVyOjN9LFxuICAgICAqICAgLi4u6Ieq5a6a5LmJXG4gICAgICogfVxuICAgICAqL1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5oyJ6ZKu5YiG57uELOS4iumdoueahGJ1dHRvbnPkuLrpu5jorqTliIbnu4RcbiAgICAgKiAge1xuICAgICAqICAgIGdyb3VwS2V5OntidXR0b25LZXk6e30sYnV0dG9uS2V5Mjp7fX1cbiAgICAgKiAgfVxuICAgICAqL1xuICAgIGdyb3VwOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW9k+WJjea/gOa0u+WIhue7hFxuICAgICAqL1xuICAgIGFjdGl2ZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIHNjb3BlXG4gICAgICovXG4gICAgc2NvcGU6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcImhhbmRsZVwiXSxcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuXG4gICAgY29uc3Qgc2NvcGVSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wcm9wcy5zY29wZSxcbiAgICAgICAgcm93OiBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5yb3ddLFxuICAgICAgICBpbmRleDogcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4uaW5kZXhdXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IGRvQ2xpY2sgPSAoaXRlbTogYW55KSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLmluZGV4XTtcbiAgICAgIGNvbnN0IHJvdyA9IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLnJvd107XG4gICAgICBjb25zdCBlOiBTY29wZUNvbnRleHQgPSB7IGtleTogaXRlbS5rZXksIHJvdywgYnRuOiBpdGVtLCBpbmRleCwgLi4ucHJvcHMuc2NvcGUgfTtcbiAgICAgIGlmIChpdGVtLmNsaWNrKSB7XG4gICAgICAgIHJldHVybiBpdGVtLmNsaWNrKGUpO1xuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJoYW5kbGVcIiwgZSk7XG4gICAgfTtcbiAgICBjb25zdCB7IGRvQ29tcHV0ZWQgfSA9IHVzZUNvbXB1dGUoKTtcbiAgICBjb25zdCBwaWNrZWRQcm9wcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRyb3Bkb3duOiBwcm9wcy5kcm9wZG93bixcbiAgICAgICAgYnV0dG9uczogcHJvcHMuYnV0dG9ucyxcbiAgICAgICAgYWN0aXZlOiBwcm9wcy5hY3RpdmUsXG4gICAgICAgIGdyb3VwOiBwcm9wcy5ncm91cFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBjb21wdXRlUHJvcHMgPSBkb0NvbXB1dGVkKFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXR1cm4gcGlja2VkUHJvcHMudmFsdWU7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLmluZGV4XTtcbiAgICAgICAgY29uc3Qgcm93ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4ucm93XTtcbiAgICAgICAgcmV0dXJuIHsgLi4ucHJvcHMuc2NvcGUsIGluZGV4LCByb3cgfTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy9jb25zdCBjb21wdXRlUHJvcHMgPSB7IHZhbHVlOiBwcm9wcyB9O1xuICAgIGNvbnN0IGNvbXB1dGVkSGFuZGxlQnRucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGxldCBtZXJnZWRCdG5zID0gbnVsbDtcbiAgICAgIGlmIChjb21wdXRlUHJvcHMudmFsdWUuYWN0aXZlID09IG51bGwgfHwgY29tcHV0ZVByb3BzLnZhbHVlLmFjdGl2ZSA9PT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgY29uc3QgZGVmQnRucyA9IHtcbiAgICAgICAgICB2aWV3OiB7XG4gICAgICAgICAgICBrZXk6IFwidmlld1wiLFxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS52aWV3LnRleHRcIiksXG4gICAgICAgICAgICB0aXRsZTogdChcImZzLnJvd0hhbmRsZS52aWV3LnRleHRcIilcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvcHk6IHtcbiAgICAgICAgICAgIGtleTogXCJjb3B5XCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMucm93SGFuZGxlLmNvcHkudGV4dFwiKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KFwiZnMucm93SGFuZGxlLmNvcHkudGV4dFwiKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZWRpdDoge1xuICAgICAgICAgICAga2V5OiBcImVkaXRcIixcbiAgICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS5lZGl0LnRleHRcIiksXG4gICAgICAgICAgICB0aXRsZTogdChcImZzLnJvd0hhbmRsZS5lZGl0LnRleHRcIilcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlbW92ZToge1xuICAgICAgICAgICAga2V5OiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgLi4udWkuYnV0dG9uLmNvbG9ycyhcImRhbmdlclwiKSxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJmcy5yb3dIYW5kbGUucmVtb3ZlLnRleHRcIiksXG4gICAgICAgICAgICB0aXRsZTogdChcImZzLnJvd0hhbmRsZS5yZW1vdmUudGV4dFwiKVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbWVyZ2VkQnRucyA9IG1lcmdlKGRlZkJ0bnMsIGNvbXB1dGVQcm9wcy52YWx1ZS5idXR0b25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lcmdlZEJ0bnMgPSBjb21wdXRlUHJvcHMudmFsdWUuZ3JvdXBbY29tcHV0ZVByb3BzLnZhbHVlLmFjdGl2ZV07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ0bnM6IEJ1dHRvblByb3BzW10gPSBbXTtcbiAgICAgIGZvckVhY2gobWVyZ2VkQnRucywgKGl0ZW0sIGtleSkgPT4ge1xuICAgICAgICBpdGVtLmtleSA9IGtleTtcbiAgICAgICAgaWYgKGl0ZW0uc2hvdyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnRucy5wdXNoKGl0ZW0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzb3J0QnkoYnRucywgKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29tcHV0ZWREcm9wZG93bkF0TGVhc3QgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93biA9PSBudWxsIHx8XG4gICAgICAgIGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93bi5hdExlYXN0ID09IG51bGwgfHxcbiAgICAgICAgY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3QgPD0gMCB8fFxuICAgICAgICBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWUubGVuZ3RoIDw9IGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93bi5hdExlYXN0XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3QgfHwgMDtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpc0Ryb3Bkb3duQnRuKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgaWYgKGl0ZW0uZHJvcGRvd24gPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY29tcHV0ZWREcm9wZG93bkF0TGVhc3QudmFsdWUgPiAwICYmIGNvbXB1dGVkRHJvcGRvd25BdExlYXN0LnZhbHVlIDwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGhhc0Ryb3Bkb3duQnRuID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWUpIHtcbiAgICAgICAgY29uc3QgaXMgPSBpc0Ryb3Bkb3duQnRuKGl0ZW0sIGluZGV4KTtcbiAgICAgICAgaWYgKGlzKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGRvRHJvcGRvd25JdGVtQ2xpY2soJGV2ZW50OiBhbnkpIHtcbiAgICAgIGZvciAobGV0IGJ0biBvZiBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWUpIHtcbiAgICAgICAgaWYgKCRldmVudCA9PT0gYnRuLmtleSkge1xuICAgICAgICAgIGRvQ2xpY2soYnRuKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZERyb3Bkb3duQmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IGJpbmRpbmc6IGFueSA9IHt9O1xuICAgICAgaWYgKHVpLmRyb3Bkb3duLnJlbmRlck1vZGUgIT09IFwic2xvdFwiKSB7XG4gICAgICAgIC8vIG5haXZlIOmAmui/h29wdGlvbnPphY3nva7mnaXmmL7npLrlrZDpoblcbiAgICAgICAgY29uc3QgYnRucyA9IGNvbXB1dGVkSGFuZGxlQnRucy52YWx1ZTtcbiAgICAgICAgY29uc3Qgb3B0czogQnV0dG9uUHJvcHNbXSA9IFtdO1xuICAgICAgICBmb3JFYWNoKGJ0bnMsICh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodmFsdWUuc2hvdyAhPT0gZmFsc2UgJiYgaXNEcm9wZG93bkJ0bih2YWx1ZSwgaW5kZXgpKSB7XG4gICAgICAgICAgICBvcHRzLnB1c2goe1xuICAgICAgICAgICAgICBbdWkuZHJvcGRvd24udmFsdWVdOiB2YWx1ZS5rZXksXG4gICAgICAgICAgICAgIFt1aS5kcm9wZG93bi5sYWJlbF06IHZhbHVlLnRleHQsXG4gICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZS50aXRsZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYmluZGluZy5vcHRpb25zID0gb3B0cztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm9taXQocHJvcHMuZHJvcGRvd24sIFwibW9yZVwiLCBcImF0TGVhc3RcIiksXG4gICAgICAgIC4uLnVpLmRyb3Bkb3duLmNvbW1hbmQoZG9Ecm9wZG93bkl0ZW1DbGljayksXG4gICAgICAgIC4uLmJpbmRpbmdcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICBoYXNEcm9wZG93bkJ0bixcbiAgICAgIGNvbXB1dGVkSGFuZGxlQnRucyxcbiAgICAgIGRvRHJvcGRvd25JdGVtQ2xpY2ssXG4gICAgICBjb21wdXRlZERyb3Bkb3duQXRMZWFzdCxcbiAgICAgIGRvQ2xpY2ssXG4gICAgICBpc0Ryb3Bkb3duQnRuLFxuICAgICAgc2NvcGVSZWYsXG4gICAgICBjb21wdXRlZERyb3Bkb3duQmluZGluZ1xuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXJvdy1oYW5kbGUge1xuICAvLyBkaXNwbGF5OiBmbGV4IDsgLy8g6L+Z6YeM5LiN6IO955SoZmxleO+8jOWQpuWImeS8muegtOWdj2FsaWduOmNlbnRlcumFjee9rlxuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAuZWwtYnV0dG9uICsgLmVsLWJ1dHRvbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDJweDtcbiAgfVxuICAmID4gKiB7XG4gICAgbWFyZ2luOiAycHg7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxuICAuZnMtcm93LWhhbmRsZS1kcm9wZG93bi1pdGVtIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgLm4tYnV0dG9uIHtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIG1hcmdpbjogMnB4O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtcm93LWhhbmRsZVwiPlxuICAgIDxzbG90IG5hbWU9XCJjZWxsLXJvd0hhbmRsZS1sZWZ0XCIgdi1iaW5kPVwic2NvcGVSZWZcIj48L3Nsb3Q+XG4gICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjb21wdXRlZEhhbmRsZUJ0bnNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXRlbS5zaG93ICE9PSBmYWxzZSAmJiAhaXNEcm9wZG93bkJ0bihpdGVtLCBpbmRleClcIj5cbiAgICAgICAgPGZzLXJlbmRlciB2LWlmPVwiaXRlbS5yZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJpdGVtLnJlbmRlclwiIDpzY29wZT1cInNjb3BlUmVmXCIgLz5cbiAgICAgICAgPGZzLWJ1dHRvbiB2LWVsc2UgY2xhc3M9XCJyb3ctaGFuZGxlLWJ0blwiIHYtYmluZD1cIml0ZW1cIiBAY2xpY2suc3RvcD1cImRvQ2xpY2soaXRlbSlcIiAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDxzbG90IG5hbWU9XCJjZWxsLXJvd0hhbmRsZS1taWRkbGVcIiB2LWJpbmQ9XCJzY29wZVwiPjwvc2xvdD5cbiAgICA8IS0tIOS4i+aLieaMiemSruiPnOWNlSAtLT5cbiAgICA8c3BhbiB2LWlmPVwiaGFzRHJvcGRvd25CdG5cIiBjbGFzcz1cInJvdy1oYW5kbGUtYnRuIGZzLWhhbmRsZS1yb3ctZHJvcGRvd25cIj5cbiAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZHJvcGRvd24ubmFtZVwiIHYtYmluZD1cImNvbXB1dGVkRHJvcGRvd25CaW5kaW5nXCI+XG4gICAgICAgIDxmcy1idXR0b24gdi1iaW5kPVwiZHJvcGRvd24ubW9yZVwiIC8+XG4gICAgICAgIDx0ZW1wbGF0ZSAjW3VpLmRyb3Bkb3duLnNsb3ROYW1lXT5cbiAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICA6aXM9XCJ1aS5kcm9wZG93bk1lbnUubmFtZVwiXG4gICAgICAgICAgICB2LWlmPVwidWkuZHJvcGRvd24ucmVuZGVyTW9kZSA9PT0gJ3Nsb3QnXCJcbiAgICAgICAgICAgIHYtYmluZD1cInVpLmRyb3Bkb3duTWVudS5jb21tYW5kKGRvRHJvcGRvd25JdGVtQ2xpY2spXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNvbXB1dGVkSGFuZGxlQnRuc1wiIDprZXk9XCJpbmRleFwiPlxuICAgICAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICAgICAgOmlzPVwidWkuZHJvcGRvd25JdGVtLm5hbWVcIlxuICAgICAgICAgICAgICAgIHYtaWY9XCJpdGVtLnNob3cgIT09IGZhbHNlICYmIGlzRHJvcGRvd25CdG4oaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgICAgICA6W3VpLmRyb3Bkb3duSXRlbS5jb21tYW5kXT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgICAgICB2LWJpbmQ9XCJpdGVtLmRyb3Bkb3duSXRlbVwiXG4gICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LWhhbmRsZS1kcm9wZG93bi1pdGVtXCIgdi1iaW5kPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgPGZzLWljb24gdi1pZj1cIml0ZW0uaWNvblwiIDppY29uPVwiaXRlbS5pY29uXCIgLz4ge3sgaXRlbS50ZXh0IHx8IGl0ZW0udGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgPC9zcGFuPlxuICAgIDxzbG90IG5hbWU9XCJjZWxsLXJvd0hhbmRsZS1yaWdodFwiIHYtYmluZD1cInNjb3BlXCI+PC9zbG90PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IGZvckVhY2gsIHNvcnRCeSwgb21pdCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLXVpXCI7XG5pbXBvcnQgeyB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtY29tcHV0ZVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBCdXR0b25Qcm9wcywgU2NvcGVDb250ZXh0IH0gZnJvbSBcIi4uLy4uL2RcIjtcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuXG4vKipcbiAqIOaTjeS9nOWIl+mFjee9rlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzUm93SGFuZGxlXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5oyJ6ZKu5oqY5Y+g6YWN572uXG4gICAgICovXG4gICAgZHJvcGRvd246IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uXG4gICAgICoge1xuICAgICAqICAgdmlldzp7Li4uRnNCdXR0b24sY2xpY2s6RnVuY3Rpb24sb3JkZXI6MX0sXG4gICAgICogICBlZGl0OnsuLi5Gc0J1dHRvbixjbGljazpGdW5jdGlvbixvcmRlcjoyfSxcbiAgICAgKiAgIHJlbW92ZTp7Li4uRnNCdXR0b24sY2xpY2s6RnVuY3Rpb24sb3JkZXI6M30sXG4gICAgICogICAuLi7oh6rlrprkuYlcbiAgICAgKiB9XG4gICAgICovXG4gICAgYnV0dG9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmjInpkq7liIbnu4Qs5LiK6Z2i55qEYnV0dG9uc+S4uum7mOiupOWIhue7hFxuICAgICAqICB7XG4gICAgICogICAgZ3JvdXBLZXk6e2J1dHRvbktleTp7fSxidXR0b25LZXkyOnt9fVxuICAgICAqICB9XG4gICAgICovXG4gICAgZ3JvdXA6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5b2T5YmN5r+A5rS75YiG57uEXG4gICAgICovXG4gICAgYWN0aXZlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIlxuICAgIH0sXG4gICAgLyoqXG4gICAgICogc2NvcGVcbiAgICAgKi9cbiAgICBzY29wZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBlbWl0czogW1wiaGFuZGxlXCJdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHgpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG5cbiAgICBjb25zdCBzY29wZVJlZiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByb3BzLnNjb3BlLFxuICAgICAgICByb3c6IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLnJvd10sXG4gICAgICAgIGluZGV4OiBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5pbmRleF1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3QgZG9DbGljayA9IChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4uaW5kZXhdO1xuICAgICAgY29uc3Qgcm93ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4ucm93XTtcbiAgICAgIGNvbnN0IGU6IFNjb3BlQ29udGV4dCA9IHsga2V5OiBpdGVtLmtleSwgcm93LCBidG46IGl0ZW0sIGluZGV4LCAuLi5wcm9wcy5zY29wZSB9O1xuICAgICAgaWYgKGl0ZW0uY2xpY2spIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uY2xpY2soZSk7XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcImhhbmRsZVwiLCBlKTtcbiAgICB9O1xuICAgIGNvbnN0IHsgZG9Db21wdXRlZCB9ID0gdXNlQ29tcHV0ZSgpO1xuICAgIGNvbnN0IHBpY2tlZFByb3BzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZHJvcGRvd246IHByb3BzLmRyb3Bkb3duLFxuICAgICAgICBidXR0b25zOiBwcm9wcy5idXR0b25zLFxuICAgICAgICBhY3RpdmU6IHByb3BzLmFjdGl2ZSxcbiAgICAgICAgZ3JvdXA6IHByb3BzLmdyb3VwXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbXB1dGVQcm9wcyA9IGRvQ29tcHV0ZWQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBwaWNrZWRQcm9wcy52YWx1ZTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4uaW5kZXhdO1xuICAgICAgICBjb25zdCByb3cgPSBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5yb3ddO1xuICAgICAgICByZXR1cm4geyAuLi5wcm9wcy5zY29wZSwgaW5kZXgsIHJvdyB9O1xuICAgICAgfVxuICAgICk7XG5cbiAgICAvL2NvbnN0IGNvbXB1dGVQcm9wcyA9IHsgdmFsdWU6IHByb3BzIH07XG4gICAgY29uc3QgY29tcHV0ZWRIYW5kbGVCdG5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgbGV0IG1lcmdlZEJ0bnMgPSBudWxsO1xuICAgICAgaWYgKGNvbXB1dGVQcm9wcy52YWx1ZS5hY3RpdmUgPT0gbnVsbCB8fCBjb21wdXRlUHJvcHMudmFsdWUuYWN0aXZlID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICBjb25zdCBkZWZCdG5zID0ge1xuICAgICAgICAgIHZpZXc6IHtcbiAgICAgICAgICAgIGtleTogXCJ2aWV3XCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMucm93SGFuZGxlLnZpZXcudGV4dFwiKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KFwiZnMucm93SGFuZGxlLnZpZXcudGV4dFwiKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29weToge1xuICAgICAgICAgICAga2V5OiBcImNvcHlcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJmcy5yb3dIYW5kbGUuY29weS50ZXh0XCIpLFxuICAgICAgICAgICAgdGl0bGU6IHQoXCJmcy5yb3dIYW5kbGUuY29weS50ZXh0XCIpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlZGl0OiB7XG4gICAgICAgICAgICBrZXk6IFwiZWRpdFwiLFxuICAgICAgICAgICAgdHlwZTogXCJwcmltYXJ5XCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMucm93SGFuZGxlLmVkaXQudGV4dFwiKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KFwiZnMucm93SGFuZGxlLmVkaXQudGV4dFwiKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVtb3ZlOiB7XG4gICAgICAgICAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICAuLi51aS5idXR0b24uY29sb3JzKFwiZGFuZ2VyXCIpLFxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS5yZW1vdmUudGV4dFwiKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KFwiZnMucm93SGFuZGxlLnJlbW92ZS50ZXh0XCIpXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBtZXJnZWRCdG5zID0gbWVyZ2UoZGVmQnRucywgY29tcHV0ZVByb3BzLnZhbHVlLmJ1dHRvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVyZ2VkQnRucyA9IGNvbXB1dGVQcm9wcy52YWx1ZS5ncm91cFtjb21wdXRlUHJvcHMudmFsdWUuYWN0aXZlXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnRuczogQnV0dG9uUHJvcHNbXSA9IFtdO1xuICAgICAgZm9yRWFjaChtZXJnZWRCdG5zLCAoaXRlbSwga2V5KSA9PiB7XG4gICAgICAgIGl0ZW0ua2V5ID0ga2V5O1xuICAgICAgICBpZiAoaXRlbS5zaG93ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBidG5zLnB1c2goaXRlbSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNvcnRCeShidG5zLCAoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5vcmRlciA/PyBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZERyb3Bkb3duQXRMZWFzdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duID09IG51bGwgfHxcbiAgICAgICAgY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3QgPT0gbnVsbCB8fFxuICAgICAgICBjb21wdXRlUHJvcHMudmFsdWUuZHJvcGRvd24uYXRMZWFzdCA8PSAwIHx8XG4gICAgICAgIGNvbXB1dGVkSGFuZGxlQnRucy52YWx1ZS5sZW5ndGggPD0gY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3RcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21wdXRlUHJvcHMudmFsdWUuZHJvcGRvd24uYXRMZWFzdCB8fCAwO1xuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzRHJvcGRvd25CdG4oaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICBpZiAoaXRlbS5kcm9wZG93biA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wdXRlZERyb3Bkb3duQXRMZWFzdC52YWx1ZSA+IDAgJiYgY29tcHV0ZWREcm9wZG93bkF0TGVhc3QudmFsdWUgPCBpbmRleCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaGFzRHJvcGRvd25CdG4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbXB1dGVkSGFuZGxlQnRucy52YWx1ZSkge1xuICAgICAgICBjb25zdCBpcyA9IGlzRHJvcGRvd25CdG4oaXRlbSwgaW5kZXgpO1xuICAgICAgICBpZiAoaXMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZG9Ecm9wZG93bkl0ZW1DbGljaygkZXZlbnQ6IGFueSkge1xuICAgICAgZm9yIChsZXQgYnRuIG9mIGNvbXB1dGVkSGFuZGxlQnRucy52YWx1ZSkge1xuICAgICAgICBpZiAoJGV2ZW50ID09PSBidG4ua2V5KSB7XG4gICAgICAgICAgZG9DbGljayhidG4pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXB1dGVkRHJvcGRvd25CaW5kaW5nID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgYmluZGluZzogYW55ID0ge307XG4gICAgICBpZiAodWkuZHJvcGRvd24ucmVuZGVyTW9kZSAhPT0gXCJzbG90XCIpIHtcbiAgICAgICAgLy8gbmFpdmUg6YCa6L+Hb3B0aW9uc+mFjee9ruadpeaYvuekuuWtkOmhuVxuICAgICAgICBjb25zdCBidG5zID0gY29tcHV0ZWRIYW5kbGVCdG5zLnZhbHVlO1xuICAgICAgICBjb25zdCBvcHRzOiBCdXR0b25Qcm9wc1tdID0gW107XG4gICAgICAgIGZvckVhY2goYnRucywgKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmICh2YWx1ZS5zaG93ICE9PSBmYWxzZSAmJiBpc0Ryb3Bkb3duQnRuKHZhbHVlLCBpbmRleCkpIHtcbiAgICAgICAgICAgIG9wdHMucHVzaCh7XG4gICAgICAgICAgICAgIFt1aS5kcm9wZG93bi52YWx1ZV06IHZhbHVlLmtleSxcbiAgICAgICAgICAgICAgW3VpLmRyb3Bkb3duLmxhYmVsXTogdmFsdWUudGV4dCxcbiAgICAgICAgICAgICAgdGl0bGU6IHZhbHVlLnRpdGxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBiaW5kaW5nLm9wdGlvbnMgPSBvcHRzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub21pdChwcm9wcy5kcm9wZG93biwgXCJtb3JlXCIsIFwiYXRMZWFzdFwiKSxcbiAgICAgICAgLi4udWkuZHJvcGRvd24uY29tbWFuZChkb0Ryb3Bkb3duSXRlbUNsaWNrKSxcbiAgICAgICAgLi4uYmluZGluZ1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIGhhc0Ryb3Bkb3duQnRuLFxuICAgICAgY29tcHV0ZWRIYW5kbGVCdG5zLFxuICAgICAgZG9Ecm9wZG93bkl0ZW1DbGljayxcbiAgICAgIGNvbXB1dGVkRHJvcGRvd25BdExlYXN0LFxuICAgICAgZG9DbGljayxcbiAgICAgIGlzRHJvcGRvd25CdG4sXG4gICAgICBzY29wZVJlZixcbiAgICAgIGNvbXB1dGVkRHJvcGRvd25CaW5kaW5nXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtcm93LWhhbmRsZSB7XG4gIC8vIGRpc3BsYXk6IGZsZXggOyAvLyDov5nph4zkuI3og73nlKhmbGV477yM5ZCm5YiZ5Lya56C05Z2PYWxpZ246Y2VudGVy6YWN572uXG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIC5lbC1idXR0b24gKyAuZWwtYnV0dG9uIHtcbiAgICBtYXJnaW4tbGVmdDogMnB4O1xuICB9XG4gICYgPiAqIHtcbiAgICBtYXJnaW46IDJweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG4gIC5mcy1yb3ctaGFuZGxlLWRyb3Bkb3duLWl0ZW0ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gIH1cblxuICAubi1idXR0b24ge1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgbWFyZ2luOiAycHg7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcblxuICBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO1xuICB9O1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICB0cnkge1xuICAgIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSkge1xuICAgIF9jb25zdHJ1Y3QgPSBSZWZsZWN0LmNvbnN0cnVjdC5iaW5kKCk7XG4gIH0gZWxzZSB7XG4gICAgX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgICAgdmFyIGEgPSBbbnVsbF07XG4gICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSBGdW5jdGlvbi5iaW5kLmFwcGx5KFBhcmVudCwgYSk7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAgIGlmIChDbGFzcykgX3NldFByb3RvdHlwZU9mKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2NvbnN0cnVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVGdW5jdGlvbihmbikge1xuICByZXR1cm4gRnVuY3Rpb24udG9TdHJpbmcuY2FsbChmbikuaW5kZXhPZihcIltuYXRpdmUgY29kZV1cIikgIT09IC0xO1xufVxuXG5mdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gIHZhciBfY2FjaGUgPSB0eXBlb2YgTWFwID09PSBcImZ1bmN0aW9uXCIgPyBuZXcgTWFwKCkgOiB1bmRlZmluZWQ7XG5cbiAgX3dyYXBOYXRpdmVTdXBlciA9IGZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHtcbiAgICBpZiAoQ2xhc3MgPT09IG51bGwgfHwgIV9pc05hdGl2ZUZ1bmN0aW9uKENsYXNzKSkgcmV0dXJuIENsYXNzO1xuXG4gICAgaWYgKHR5cGVvZiBDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBfY2FjaGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChfY2FjaGUuaGFzKENsYXNzKSkgcmV0dXJuIF9jYWNoZS5nZXQoQ2xhc3MpO1xuXG4gICAgICBfY2FjaGUuc2V0KENsYXNzLCBXcmFwcGVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXcmFwcGVyKCkge1xuICAgICAgcmV0dXJuIF9jb25zdHJ1Y3QoQ2xhc3MsIGFyZ3VtZW50cywgX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yKTtcbiAgICB9XG5cbiAgICBXcmFwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogV3JhcHBlcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKFdyYXBwZXIsIENsYXNzKTtcbiAgfTtcblxuICByZXR1cm4gX3dyYXBOYXRpdmVTdXBlcihDbGFzcyk7XG59XG5cbi8qIGVzbGludCBuby1jb25zb2xlOjAgKi9cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xudmFyIHdhcm5pbmcgPSBmdW5jdGlvbiB3YXJuaW5nKCkge307IC8vIGRvbid0IHByaW50IHdhcm5pbmcgbWVzc2FnZSB3aGVuIGluIHByb2R1Y3Rpb24gZW52IG9yIG5vZGUgcnVudGltZVxuXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICB3YXJuaW5nID0gZnVuY3Rpb24gd2FybmluZyh0eXBlLCBlcnJvcnMpIHtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUud2FybiAmJiB0eXBlb2YgQVNZTkNfVkFMSURBVE9SX05PX1dBUk5JTkcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoZXJyb3JzLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ3N0cmluZyc7XG4gICAgICB9KSkge1xuICAgICAgICBjb25zb2xlLndhcm4odHlwZSwgZXJyb3JzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGaWVsZHNFcnJvcihlcnJvcnMpIHtcbiAgaWYgKCFlcnJvcnMgfHwgIWVycm9ycy5sZW5ndGgpIHJldHVybiBudWxsO1xuICB2YXIgZmllbGRzID0ge307XG4gIGVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgIHZhciBmaWVsZCA9IGVycm9yLmZpZWxkO1xuICAgIGZpZWxkc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdIHx8IFtdO1xuICAgIGZpZWxkc1tmaWVsZF0ucHVzaChlcnJvcik7XG4gIH0pO1xuICByZXR1cm4gZmllbGRzO1xufVxuZnVuY3Rpb24gZm9ybWF0KHRlbXBsYXRlKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHZhciBpID0gMDtcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuXG4gIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdGVtcGxhdGUuYXBwbHkobnVsbCwgYXJncyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnc3RyaW5nJykge1xuICAgIHZhciBzdHIgPSB0ZW1wbGF0ZS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24gKHgpIHtcbiAgICAgIGlmICh4ID09PSAnJSUnKSB7XG4gICAgICAgIHJldHVybiAnJSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpID49IGxlbikge1xuICAgICAgICByZXR1cm4geDtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh4KSB7XG4gICAgICAgIGNhc2UgJyVzJzpcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG5cbiAgICAgICAgY2FzZSAnJWQnOlxuICAgICAgICAgIHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcblxuICAgICAgICBjYXNlICclaic6XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4geDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgcmV0dXJuIHRlbXBsYXRlO1xufVxuXG5mdW5jdGlvbiBpc05hdGl2ZVN0cmluZ1R5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ3VybCcgfHwgdHlwZSA9PT0gJ2hleCcgfHwgdHlwZSA9PT0gJ2VtYWlsJyB8fCB0eXBlID09PSAnZGF0ZScgfHwgdHlwZSA9PT0gJ3BhdHRlcm4nO1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5VmFsdWUodmFsdWUsIHR5cGUpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSAnYXJyYXknICYmIEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc05hdGl2ZVN0cmluZ1R5cGUodHlwZSkgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhdmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYXN5bmNQYXJhbGxlbEFycmF5KGFyciwgZnVuYywgY2FsbGJhY2spIHtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIHRvdGFsID0gMDtcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGg7XG5cbiAgZnVuY3Rpb24gY291bnQoZXJyb3JzKSB7XG4gICAgcmVzdWx0cy5wdXNoLmFwcGx5KHJlc3VsdHMsIGVycm9ycyB8fCBbXSk7XG4gICAgdG90YWwrKztcblxuICAgIGlmICh0b3RhbCA9PT0gYXJyTGVuZ3RoKSB7XG4gICAgICBjYWxsYmFjayhyZXN1bHRzKTtcbiAgICB9XG4gIH1cblxuICBhcnIuZm9yRWFjaChmdW5jdGlvbiAoYSkge1xuICAgIGZ1bmMoYSwgY291bnQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXN5bmNTZXJpYWxBcnJheShhcnIsIGZ1bmMsIGNhbGxiYWNrKSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIG5leHQoZXJyb3JzKSB7XG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoKSB7XG4gICAgICBjYWxsYmFjayhlcnJvcnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBvcmlnaW5hbCA9IGluZGV4O1xuICAgIGluZGV4ID0gaW5kZXggKyAxO1xuXG4gICAgaWYgKG9yaWdpbmFsIDwgYXJyTGVuZ3RoKSB7XG4gICAgICBmdW5jKGFycltvcmlnaW5hbF0sIG5leHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayhbXSk7XG4gICAgfVxuICB9XG5cbiAgbmV4dChbXSk7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5PYmpBcnIob2JqQXJyKSB7XG4gIHZhciByZXQgPSBbXTtcbiAgT2JqZWN0LmtleXMob2JqQXJyKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgcmV0LnB1c2guYXBwbHkocmV0LCBvYmpBcnJba10gfHwgW10pO1xuICB9KTtcbiAgcmV0dXJuIHJldDtcbn1cblxudmFyIEFzeW5jVmFsaWRhdGlvbkVycm9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRXJyb3IpIHtcbiAgX2luaGVyaXRzTG9vc2UoQXN5bmNWYWxpZGF0aW9uRXJyb3IsIF9FcnJvcik7XG5cbiAgZnVuY3Rpb24gQXN5bmNWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLCBmaWVsZHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9FcnJvci5jYWxsKHRoaXMsICdBc3luYyBWYWxpZGF0aW9uIEVycm9yJykgfHwgdGhpcztcbiAgICBfdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgX3RoaXMuZmllbGRzID0gZmllbGRzO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBBc3luY1ZhbGlkYXRpb25FcnJvcjtcbn0oIC8qI19fUFVSRV9fKi9fd3JhcE5hdGl2ZVN1cGVyKEVycm9yKSk7XG5mdW5jdGlvbiBhc3luY01hcChvYmpBcnIsIG9wdGlvbiwgZnVuYywgY2FsbGJhY2ssIHNvdXJjZSkge1xuICBpZiAob3B0aW9uLmZpcnN0KSB7XG4gICAgdmFyIF9wZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiBuZXh0KGVycm9ycykge1xuICAgICAgICBjYWxsYmFjayhlcnJvcnMpO1xuICAgICAgICByZXR1cm4gZXJyb3JzLmxlbmd0aCA/IHJlamVjdChuZXcgQXN5bmNWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLCBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKSkpIDogcmVzb2x2ZShzb3VyY2UpO1xuICAgICAgfTtcblxuICAgICAgdmFyIGZsYXR0ZW5BcnIgPSBmbGF0dGVuT2JqQXJyKG9iakFycik7XG4gICAgICBhc3luY1NlcmlhbEFycmF5KGZsYXR0ZW5BcnIsIGZ1bmMsIG5leHQpO1xuICAgIH0pO1xuXG4gICAgX3BlbmRpbmdbXCJjYXRjaFwiXShmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIGU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3BlbmRpbmc7XG4gIH1cblxuICB2YXIgZmlyc3RGaWVsZHMgPSBvcHRpb24uZmlyc3RGaWVsZHMgPT09IHRydWUgPyBPYmplY3Qua2V5cyhvYmpBcnIpIDogb3B0aW9uLmZpcnN0RmllbGRzIHx8IFtdO1xuICB2YXIgb2JqQXJyS2V5cyA9IE9iamVjdC5rZXlzKG9iakFycik7XG4gIHZhciBvYmpBcnJMZW5ndGggPSBvYmpBcnJLZXlzLmxlbmd0aDtcbiAgdmFyIHRvdGFsID0gMDtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIG5leHQgPSBmdW5jdGlvbiBuZXh0KGVycm9ycykge1xuICAgICAgcmVzdWx0cy5wdXNoLmFwcGx5KHJlc3VsdHMsIGVycm9ycyk7XG4gICAgICB0b3RhbCsrO1xuXG4gICAgICBpZiAodG90YWwgPT09IG9iakFyckxlbmd0aCkge1xuICAgICAgICBjYWxsYmFjayhyZXN1bHRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHMubGVuZ3RoID8gcmVqZWN0KG5ldyBBc3luY1ZhbGlkYXRpb25FcnJvcihyZXN1bHRzLCBjb252ZXJ0RmllbGRzRXJyb3IocmVzdWx0cykpKSA6IHJlc29sdmUoc291cmNlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKCFvYmpBcnJLZXlzLmxlbmd0aCkge1xuICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgICByZXNvbHZlKHNvdXJjZSk7XG4gICAgfVxuXG4gICAgb2JqQXJyS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBhcnIgPSBvYmpBcnJba2V5XTtcblxuICAgICAgaWYgKGZpcnN0RmllbGRzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcbiAgICAgICAgYXN5bmNTZXJpYWxBcnJheShhcnIsIGZ1bmMsIG5leHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXN5bmNQYXJhbGxlbEFycmF5KGFyciwgZnVuYywgbmV4dCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBwZW5kaW5nW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZTtcbiAgfSk7XG4gIHJldHVybiBwZW5kaW5nO1xufVxuXG5mdW5jdGlvbiBpc0Vycm9yT2JqKG9iaikge1xuICByZXR1cm4gISEob2JqICYmIG9iai5tZXNzYWdlICE9PSB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZSh2YWx1ZSwgcGF0aCkge1xuICB2YXIgdiA9IHZhbHVlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGlmICh2ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHY7XG4gICAgfVxuXG4gICAgdiA9IHZbcGF0aFtpXV07XG4gIH1cblxuICByZXR1cm4gdjtcbn1cblxuZnVuY3Rpb24gY29tcGxlbWVudEVycm9yKHJ1bGUsIHNvdXJjZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKG9lKSB7XG4gICAgdmFyIGZpZWxkVmFsdWU7XG5cbiAgICBpZiAocnVsZS5mdWxsRmllbGRzKSB7XG4gICAgICBmaWVsZFZhbHVlID0gZ2V0VmFsdWUoc291cmNlLCBydWxlLmZ1bGxGaWVsZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZFZhbHVlID0gc291cmNlW29lLmZpZWxkIHx8IHJ1bGUuZnVsbEZpZWxkXTtcbiAgICB9XG5cbiAgICBpZiAoaXNFcnJvck9iaihvZSkpIHtcbiAgICAgIG9lLmZpZWxkID0gb2UuZmllbGQgfHwgcnVsZS5mdWxsRmllbGQ7XG4gICAgICBvZS5maWVsZFZhbHVlID0gZmllbGRWYWx1ZTtcbiAgICAgIHJldHVybiBvZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdHlwZW9mIG9lID09PSAnZnVuY3Rpb24nID8gb2UoKSA6IG9lLFxuICAgICAgZmllbGRWYWx1ZTogZmllbGRWYWx1ZSxcbiAgICAgIGZpZWxkOiBvZS5maWVsZCB8fCBydWxlLmZ1bGxGaWVsZFxuICAgIH07XG4gIH07XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCBzb3VyY2UpIHtcbiAgaWYgKHNvdXJjZSkge1xuICAgIGZvciAodmFyIHMgaW4gc291cmNlKSB7XG4gICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KHMpKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtzXTtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGFyZ2V0W3NdID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRhcmdldFtzXSA9IF9leHRlbmRzKHt9LCB0YXJnZXRbc10sIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRbc10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbnZhciByZXF1aXJlZCQxID0gZnVuY3Rpb24gcmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCB0eXBlKSB7XG4gIGlmIChydWxlLnJlcXVpcmVkICYmICghc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpIHx8IGlzRW1wdHlWYWx1ZSh2YWx1ZSwgdHlwZSB8fCBydWxlLnR5cGUpKSkge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnJlcXVpcmVkLCBydWxlLmZ1bGxGaWVsZCkpO1xuICB9XG59O1xuXG4vKipcbiAqICBSdWxlIGZvciB2YWxpZGF0aW5nIHdoaXRlc3BhY2UuXG4gKlxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXG4gKiAgQHBhcmFtIGVycm9ycyBBbiBhcnJheSBvZiBlcnJvcnMgdGhhdCB0aGlzIHJ1bGUgbWF5IGFkZFxuICogIHZhbGlkYXRpb24gZXJyb3JzIHRvLlxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gKi9cblxudmFyIHdoaXRlc3BhY2UgPSBmdW5jdGlvbiB3aGl0ZXNwYWNlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICBpZiAoL15cXHMrJC8udGVzdCh2YWx1ZSkgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMud2hpdGVzcGFjZSwgcnVsZS5mdWxsRmllbGQpKTtcbiAgfVxufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2tldnZhL3VybC1yZWdleC9ibG9iL21hc3Rlci9pbmRleC5qc1xudmFyIHVybFJlZztcbnZhciBnZXRVcmxSZWdleCA9IChmdW5jdGlvbiAoKSB7XG4gIGlmICh1cmxSZWcpIHtcbiAgICByZXR1cm4gdXJsUmVnO1xuICB9XG5cbiAgdmFyIHdvcmQgPSAnW2EtZkEtRlxcXFxkOl0nO1xuXG4gIHZhciBiID0gZnVuY3Rpb24gYihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5pbmNsdWRlQm91bmRhcmllcyA/IFwiKD86KD88PVxcXFxzfF4pKD89XCIgKyB3b3JkICsgXCIpfCg/PD1cIiArIHdvcmQgKyBcIikoPz1cXFxcc3wkKSlcIiA6ICcnO1xuICB9O1xuXG4gIHZhciB2NCA9ICcoPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKD86XFxcXC4oPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKXszfSc7XG4gIHZhciB2NnNlZyA9ICdbYS1mQS1GXFxcXGRdezEsNH0nO1xuICB2YXIgdjYgPSAoXCJcXG4oPzpcXG4oPzpcIiArIHY2c2VnICsgXCI6KXs3fSg/OlwiICsgdjZzZWcgKyBcInw6KXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxOjI6Mzo0OjU6Njo3OjogIDE6MjozOjQ6NTo2Ojc6OFxcbig/OlwiICsgdjZzZWcgKyBcIjopezZ9KD86XCIgKyB2NCArIFwifDpcIiArIHY2c2VnICsgXCJ8Oil8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxOjI6Mzo0OjU6Njo6ICAgIDE6MjozOjQ6NTo2Ojo4ICAgMToyOjM6NDo1OjY6OjggIDE6MjozOjQ6NTo2OjoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7NX0oPzo6XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsMn18Oil8ICAgICAgICAgICAgICAgICAgIC8vIDE6MjozOjQ6NTo6ICAgICAgMToyOjM6NDo1Ojo3OjggICAxOjI6Mzo0OjU6OjggICAgMToyOjM6NDo1Ojo3OjEuMi4zLjRcXG4oPzpcIiArIHY2c2VnICsgXCI6KXs0fSg/Oig/OjpcIiArIHY2c2VnICsgXCIpezAsMX06XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsM318Oil8IC8vIDE6MjozOjQ6OiAgICAgICAgMToyOjM6NDo6Njo3OjggICAxOjI6Mzo0Ojo4ICAgICAgMToyOjM6NDo6Njo3OjEuMi4zLjRcXG4oPzpcIiArIHY2c2VnICsgXCI6KXszfSg/Oig/OjpcIiArIHY2c2VnICsgXCIpezAsMn06XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsNH18Oil8IC8vIDE6MjozOjogICAgICAgICAgMToyOjM6OjU6Njo3OjggICAxOjI6Mzo6OCAgICAgICAgMToyOjM6OjU6Njo3OjEuMi4zLjRcXG4oPzpcIiArIHY2c2VnICsgXCI6KXsyfSg/Oig/OjpcIiArIHY2c2VnICsgXCIpezAsM306XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsNX18Oil8IC8vIDE6Mjo6ICAgICAgICAgICAgMToyOjo0OjU6Njo3OjggICAxOjI6OjggICAgICAgICAgMToyOjo0OjU6Njo3OjEuMi4zLjRcXG4oPzpcIiArIHY2c2VnICsgXCI6KXsxfSg/Oig/OjpcIiArIHY2c2VnICsgXCIpezAsNH06XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsNn18Oil8IC8vIDE6OiAgICAgICAgICAgICAgMTo6Mzo0OjU6Njo3OjggICAxOjo4ICAgICAgICAgICAgMTo6Mzo0OjU6Njo3OjEuMi4zLjRcXG4oPzo6KD86KD86OlwiICsgdjZzZWcgKyBcIil7MCw1fTpcIiArIHY0ICsgXCJ8KD86OlwiICsgdjZzZWcgKyBcIil7MSw3fXw6KSkgICAgICAgICAgICAgLy8gOjoyOjM6NDo1OjY6Nzo4ICA6OjI6Mzo0OjU6Njo3OjggIDo6OCAgICAgICAgICAgICA6OjEuMi4zLjRcXG4pKD86JVswLTlhLXpBLVpdezEsfSk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJWV0aDAgICAgICAgICAgICAlMVxcblwiKS5yZXBsYWNlKC9cXHMqXFwvXFwvLiokL2dtLCAnJykucmVwbGFjZSgvXFxuL2csICcnKS50cmltKCk7IC8vIFByZS1jb21waWxlIG9ubHkgdGhlIGV4YWN0IHJlZ2V4ZXMgYmVjYXVzZSBhZGRpbmcgYSBnbG9iYWwgZmxhZyBtYWtlIHJlZ2V4ZXMgc3RhdGVmdWxcblxuICB2YXIgdjQ2RXhhY3QgPSBuZXcgUmVnRXhwKFwiKD86XlwiICsgdjQgKyBcIiQpfCg/Ol5cIiArIHY2ICsgXCIkKVwiKTtcbiAgdmFyIHY0ZXhhY3QgPSBuZXcgUmVnRXhwKFwiXlwiICsgdjQgKyBcIiRcIik7XG4gIHZhciB2NmV4YWN0ID0gbmV3IFJlZ0V4cChcIl5cIiArIHY2ICsgXCIkXCIpO1xuXG4gIHZhciBpcCA9IGZ1bmN0aW9uIGlwKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmV4YWN0ID8gdjQ2RXhhY3QgOiBuZXcgUmVnRXhwKFwiKD86XCIgKyBiKG9wdGlvbnMpICsgdjQgKyBiKG9wdGlvbnMpICsgXCIpfCg/OlwiICsgYihvcHRpb25zKSArIHY2ICsgYihvcHRpb25zKSArIFwiKVwiLCAnZycpO1xuICB9O1xuXG4gIGlwLnY0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmV4YWN0ID8gdjRleGFjdCA6IG5ldyBSZWdFeHAoXCJcIiArIGIob3B0aW9ucykgKyB2NCArIGIob3B0aW9ucyksICdnJyk7XG4gIH07XG5cbiAgaXAudjYgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuZXhhY3QgPyB2NmV4YWN0IDogbmV3IFJlZ0V4cChcIlwiICsgYihvcHRpb25zKSArIHY2ICsgYihvcHRpb25zKSwgJ2cnKTtcbiAgfTtcblxuICB2YXIgcHJvdG9jb2wgPSBcIig/Oig/OlthLXpdKzopPy8vKVwiO1xuICB2YXIgYXV0aCA9ICcoPzpcXFxcUysoPzo6XFxcXFMqKT9AKT8nO1xuICB2YXIgaXB2NCA9IGlwLnY0KCkuc291cmNlO1xuICB2YXIgaXB2NiA9IGlwLnY2KCkuc291cmNlO1xuICB2YXIgaG9zdCA9IFwiKD86KD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldWy1fXSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspXCI7XG4gIHZhciBkb21haW4gPSBcIig/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKlwiO1xuICB2YXIgdGxkID0gXCIoPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmXXsyLH0pKVwiO1xuICB2YXIgcG9ydCA9ICcoPzo6XFxcXGR7Miw1fSk/JztcbiAgdmFyIHBhdGggPSAnKD86Wy8/I11bXlxcXFxzXCJdKik/JztcbiAgdmFyIHJlZ2V4ID0gXCIoPzpcIiArIHByb3RvY29sICsgXCJ8d3d3XFxcXC4pXCIgKyBhdXRoICsgXCIoPzpsb2NhbGhvc3R8XCIgKyBpcHY0ICsgXCJ8XCIgKyBpcHY2ICsgXCJ8XCIgKyBob3N0ICsgZG9tYWluICsgdGxkICsgXCIpXCIgKyBwb3J0ICsgcGF0aDtcbiAgdXJsUmVnID0gbmV3IFJlZ0V4cChcIig/Ol5cIiArIHJlZ2V4ICsgXCIkKVwiLCAnaScpO1xuICByZXR1cm4gdXJsUmVnO1xufSk7XG5cbi8qIGVzbGludCBtYXgtbGVuOjAgKi9cblxudmFyIHBhdHRlcm4kMiA9IHtcbiAgLy8gaHR0cDovL2VtYWlscmVnZXguY29tL1xuICBlbWFpbDogL14oKFtePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSsoXFwuW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XSl8KChbYS16QS1aXFwtMC05XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXStcXC4pK1thLXpBLVpcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdezIsfSkpJC8sXG4gIC8vIHVybDogbmV3IFJlZ0V4cChcbiAgLy8gICAnXig/IW1haWx0bzopKD86KD86aHR0cHxodHRwc3xmdHApOi8vfC8vKSg/OlxcXFxTKyg/OjpcXFxcUyopP0ApPyg/Oig/Oig/OlsxLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMDFdXFxcXGR8MjJbMC0zXSkoPzpcXFxcLig/OjE/XFxcXGR7MSwyfXwyWzAtNF1cXFxcZHwyNVswLTVdKSl7Mn0oPzpcXFxcLig/OlswLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMC00XVxcXFxkfDI1WzAtNF0pKXwoPzooPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKig/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmZdezIsfSkpKXxsb2NhbGhvc3QpKD86OlxcXFxkezIsNX0pPyg/OigvfFxcXFw/fCMpW15cXFxcc10qKT8kJyxcbiAgLy8gICAnaScsXG4gIC8vICksXG4gIGhleDogL14jPyhbYS1mMC05XXs2fXxbYS1mMC05XXszfSkkL2lcbn07XG52YXIgdHlwZXMgPSB7XG4gIGludGVnZXI6IGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZXMubnVtYmVyKHZhbHVlKSAmJiBwYXJzZUludCh2YWx1ZSwgMTApID09PSB2YWx1ZTtcbiAgfSxcbiAgXCJmbG9hdFwiOiBmdW5jdGlvbiBmbG9hdCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlcy5udW1iZXIodmFsdWUpICYmICF0eXBlcy5pbnRlZ2VyKHZhbHVlKTtcbiAgfSxcbiAgYXJyYXk6IGZ1bmN0aW9uIGFycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICB9LFxuICByZWdleHA6IGZ1bmN0aW9uIHJlZ2V4cCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIW5ldyBSZWdFeHAodmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIGRhdGU6IGZ1bmN0aW9uIGRhdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlLmdldFRpbWUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlLmdldE1vbnRoID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS5nZXRZZWFyID09PSAnZnVuY3Rpb24nICYmICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xuICB9LFxuICBudW1iZXI6IGZ1bmN0aW9uIG51bWJlcih2YWx1ZSkge1xuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbiAgfSxcbiAgb2JqZWN0OiBmdW5jdGlvbiBvYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhdHlwZXMuYXJyYXkodmFsdWUpO1xuICB9LFxuICBtZXRob2Q6IGZ1bmN0aW9uIG1ldGhvZCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG4gIH0sXG4gIGVtYWlsOiBmdW5jdGlvbiBlbWFpbCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA8PSAzMjAgJiYgISF2YWx1ZS5tYXRjaChwYXR0ZXJuJDIuZW1haWwpO1xuICB9LFxuICB1cmw6IGZ1bmN0aW9uIHVybCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA8PSAyMDQ4ICYmICEhdmFsdWUubWF0Y2goZ2V0VXJsUmVnZXgoKSk7XG4gIH0sXG4gIGhleDogZnVuY3Rpb24gaGV4KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgISF2YWx1ZS5tYXRjaChwYXR0ZXJuJDIuaGV4KTtcbiAgfVxufTtcblxudmFyIHR5cGUkMSA9IGZ1bmN0aW9uIHR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIGlmIChydWxlLnJlcXVpcmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXF1aXJlZCQxKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1c3RvbSA9IFsnaW50ZWdlcicsICdmbG9hdCcsICdhcnJheScsICdyZWdleHAnLCAnb2JqZWN0JywgJ21ldGhvZCcsICdlbWFpbCcsICdudW1iZXInLCAnZGF0ZScsICd1cmwnLCAnaGV4J107XG4gIHZhciBydWxlVHlwZSA9IHJ1bGUudHlwZTtcblxuICBpZiAoY3VzdG9tLmluZGV4T2YocnVsZVR5cGUpID4gLTEpIHtcbiAgICBpZiAoIXR5cGVzW3J1bGVUeXBlXSh2YWx1ZSkpIHtcbiAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnR5cGVzW3J1bGVUeXBlXSwgcnVsZS5mdWxsRmllbGQsIHJ1bGUudHlwZSkpO1xuICAgIH0gLy8gc3RyYWlnaHQgdHlwZW9mIGNoZWNrXG5cbiAgfSBlbHNlIGlmIChydWxlVHlwZSAmJiB0eXBlb2YgdmFsdWUgIT09IHJ1bGUudHlwZSkge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnR5cGVzW3J1bGVUeXBlXSwgcnVsZS5mdWxsRmllbGQsIHJ1bGUudHlwZSkpO1xuICB9XG59O1xuXG52YXIgcmFuZ2UgPSBmdW5jdGlvbiByYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbiA9IHR5cGVvZiBydWxlLmxlbiA9PT0gJ251bWJlcic7XG4gIHZhciBtaW4gPSB0eXBlb2YgcnVsZS5taW4gPT09ICdudW1iZXInO1xuICB2YXIgbWF4ID0gdHlwZW9mIHJ1bGUubWF4ID09PSAnbnVtYmVyJzsgLy8g5q2j5YiZ5Yy56YWN56CB54K56IyD5Zu05LuOVSswMTAwMDDkuIDnm7TliLBVKzEwRkZGRueahOaWh+Wtl++8iOihpeWFheW5s+mdolN1cHBsZW1lbnRhcnkgUGxhbmXvvIlcblxuICB2YXIgc3BSZWdleHAgPSAvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXS9nO1xuICB2YXIgdmFsID0gdmFsdWU7XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgbnVtID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbiAgdmFyIHN0ciA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gIHZhciBhcnIgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcblxuICBpZiAobnVtKSB7XG4gICAga2V5ID0gJ251bWJlcic7XG4gIH0gZWxzZSBpZiAoc3RyKSB7XG4gICAga2V5ID0gJ3N0cmluZyc7XG4gIH0gZWxzZSBpZiAoYXJyKSB7XG4gICAga2V5ID0gJ2FycmF5JztcbiAgfSAvLyBpZiB0aGUgdmFsdWUgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgZm9yIHJhbmdlIHZhbGlkYXRpb25cbiAgLy8gdGhlIHZhbGlkYXRpb24gcnVsZSBydWxlIHNob3VsZCB1c2UgdGhlXG4gIC8vIHR5cGUgcHJvcGVydHkgdG8gYWxzbyB0ZXN0IGZvciBhIHBhcnRpY3VsYXIgdHlwZVxuXG5cbiAgaWYgKCFrZXkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoYXJyKSB7XG4gICAgdmFsID0gdmFsdWUubGVuZ3RoO1xuICB9XG5cbiAgaWYgKHN0cikge1xuICAgIC8vIOWkhOeQhueggeeCueWkp+S6jlUrMDEwMDAw55qE5paH5a2XbGVuZ3Ro5bGe5oCn5LiN5YeG56Gu55qEYnVn77yM5aaCXCLwoK638KCut/CgrrdcIi5sZW5naHQgIT09IDNcbiAgICB2YWwgPSB2YWx1ZS5yZXBsYWNlKHNwUmVnZXhwLCAnXycpLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChsZW4pIHtcbiAgICBpZiAodmFsICE9PSBydWxlLmxlbikge1xuICAgICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5sZW4sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLmxlbikpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChtaW4gJiYgIW1heCAmJiB2YWwgPCBydWxlLm1pbikge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ubWluLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5taW4pKTtcbiAgfSBlbHNlIGlmIChtYXggJiYgIW1pbiAmJiB2YWwgPiBydWxlLm1heCkge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ubWF4LCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5tYXgpKTtcbiAgfSBlbHNlIGlmIChtaW4gJiYgbWF4ICYmICh2YWwgPCBydWxlLm1pbiB8fCB2YWwgPiBydWxlLm1heCkpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLnJhbmdlLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5taW4sIHJ1bGUubWF4KSk7XG4gIH1cbn07XG5cbnZhciBFTlVNJDEgPSAnZW51bSc7XG5cbnZhciBlbnVtZXJhYmxlJDEgPSBmdW5jdGlvbiBlbnVtZXJhYmxlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICBydWxlW0VOVU0kMV0gPSBBcnJheS5pc0FycmF5KHJ1bGVbRU5VTSQxXSkgPyBydWxlW0VOVU0kMV0gOiBbXTtcblxuICBpZiAocnVsZVtFTlVNJDFdLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW0VOVU0kMV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlW0VOVU0kMV0uam9pbignLCAnKSkpO1xuICB9XG59O1xuXG52YXIgcGF0dGVybiQxID0gZnVuY3Rpb24gcGF0dGVybihydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgaWYgKHJ1bGUucGF0dGVybikge1xuICAgIGlmIChydWxlLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIGlmIGEgUmVnRXhwIGluc3RhbmNlIGlzIHBhc3NlZCwgcmVzZXQgYGxhc3RJbmRleGAgaW4gY2FzZSBpdHMgYGdsb2JhbGBcbiAgICAgIC8vIGZsYWcgaXMgYWNjaWRlbnRhbGx5IHNldCB0byBgdHJ1ZWAsIHdoaWNoIGluIGEgdmFsaWRhdGlvbiBzY2VuYXJpb1xuICAgICAgLy8gaXMgbm90IG5lY2Vzc2FyeSBhbmQgdGhlIHJlc3VsdCBtaWdodCBiZSBtaXNsZWFkaW5nXG4gICAgICBydWxlLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcblxuICAgICAgaWYgKCFydWxlLnBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMucGF0dGVybi5taXNtYXRjaCwgcnVsZS5mdWxsRmllbGQsIHZhbHVlLCBydWxlLnBhdHRlcm4pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBydWxlLnBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgX3BhdHRlcm4gPSBuZXcgUmVnRXhwKHJ1bGUucGF0dGVybik7XG5cbiAgICAgIGlmICghX3BhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMucGF0dGVybi5taXNtYXRjaCwgcnVsZS5mdWxsRmllbGQsIHZhbHVlLCBydWxlLnBhdHRlcm4pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbnZhciBydWxlcyA9IHtcbiAgcmVxdWlyZWQ6IHJlcXVpcmVkJDEsXG4gIHdoaXRlc3BhY2U6IHdoaXRlc3BhY2UsXG4gIHR5cGU6IHR5cGUkMSxcbiAgcmFuZ2U6IHJhbmdlLFxuICBcImVudW1cIjogZW51bWVyYWJsZSQxLFxuICBwYXR0ZXJuOiBwYXR0ZXJuJDFcbn07XG5cbnZhciBzdHJpbmcgPSBmdW5jdGlvbiBzdHJpbmcocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgJ3N0cmluZycpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgICAgaWYgKHJ1bGUud2hpdGVzcGFjZSA9PT0gdHJ1ZSkge1xuICAgICAgICBydWxlcy53aGl0ZXNwYWNlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBtZXRob2QgPSBmdW5jdGlvbiBtZXRob2QocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBudW1iZXIgPSBmdW5jdGlvbiBudW1iZXIocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgX2Jvb2xlYW4gPSBmdW5jdGlvbiBfYm9vbGVhbihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIHJlZ2V4cCA9IGZ1bmN0aW9uIHJlZ2V4cChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUpKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBpbnRlZ2VyID0gZnVuY3Rpb24gaW50ZWdlcihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBmbG9hdEZuID0gZnVuY3Rpb24gZmxvYXRGbihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBhcnJheSA9IGZ1bmN0aW9uIGFycmF5KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCAnYXJyYXknKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgb2JqZWN0ID0gZnVuY3Rpb24gb2JqZWN0KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgRU5VTSA9ICdlbnVtJztcblxudmFyIGVudW1lcmFibGUgPSBmdW5jdGlvbiBlbnVtZXJhYmxlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXNbRU5VTV0ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIHBhdHRlcm4gPSBmdW5jdGlvbiBwYXR0ZXJuKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ3N0cmluZycpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSkge1xuICAgICAgcnVsZXMucGF0dGVybihydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgZGF0ZSA9IGZ1bmN0aW9uIGRhdGUocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgLy8gY29uc29sZS5sb2coJ2ludGVnZXIgcnVsZSBjYWxsZWQgJWonLCBydWxlKTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTsgLy8gY29uc29sZS5sb2coJ3ZhbGlkYXRlIG9uICVzIHZhbHVlJywgdmFsdWUpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUsICdkYXRlJykgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ2RhdGUnKSkge1xuICAgICAgdmFyIGRhdGVPYmplY3Q7XG5cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgZGF0ZU9iamVjdCA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0ZU9iamVjdCA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcnVsZXMudHlwZShydWxlLCBkYXRlT2JqZWN0LCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChkYXRlT2JqZWN0KSB7XG4gICAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIGRhdGVPYmplY3QuZ2V0VGltZSgpLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciByZXF1aXJlZCA9IGZ1bmN0aW9uIHJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHR5cGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/ICdhcnJheScgOiB0eXBlb2YgdmFsdWU7XG4gIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgdHlwZSk7XG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgdHlwZSA9IGZ1bmN0aW9uIHR5cGUocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIHJ1bGVUeXBlID0gcnVsZS50eXBlO1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUsIHJ1bGVUeXBlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCBydWxlVHlwZSk7XG5cbiAgICBpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSwgcnVsZVR5cGUpKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBhbnkgPSBmdW5jdGlvbiBhbnkocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgdmFsaWRhdG9ycyA9IHtcbiAgc3RyaW5nOiBzdHJpbmcsXG4gIG1ldGhvZDogbWV0aG9kLFxuICBudW1iZXI6IG51bWJlcixcbiAgXCJib29sZWFuXCI6IF9ib29sZWFuLFxuICByZWdleHA6IHJlZ2V4cCxcbiAgaW50ZWdlcjogaW50ZWdlcixcbiAgXCJmbG9hdFwiOiBmbG9hdEZuLFxuICBhcnJheTogYXJyYXksXG4gIG9iamVjdDogb2JqZWN0LFxuICBcImVudW1cIjogZW51bWVyYWJsZSxcbiAgcGF0dGVybjogcGF0dGVybixcbiAgZGF0ZTogZGF0ZSxcbiAgdXJsOiB0eXBlLFxuICBoZXg6IHR5cGUsXG4gIGVtYWlsOiB0eXBlLFxuICByZXF1aXJlZDogcmVxdWlyZWQsXG4gIGFueTogYW55XG59O1xuXG5mdW5jdGlvbiBuZXdNZXNzYWdlcygpIHtcbiAgcmV0dXJuIHtcbiAgICBcImRlZmF1bHRcIjogJ1ZhbGlkYXRpb24gZXJyb3Igb24gZmllbGQgJXMnLFxuICAgIHJlcXVpcmVkOiAnJXMgaXMgcmVxdWlyZWQnLFxuICAgIFwiZW51bVwiOiAnJXMgbXVzdCBiZSBvbmUgb2YgJXMnLFxuICAgIHdoaXRlc3BhY2U6ICclcyBjYW5ub3QgYmUgZW1wdHknLFxuICAgIGRhdGU6IHtcbiAgICAgIGZvcm1hdDogJyVzIGRhdGUgJXMgaXMgaW52YWxpZCBmb3IgZm9ybWF0ICVzJyxcbiAgICAgIHBhcnNlOiAnJXMgZGF0ZSBjb3VsZCBub3QgYmUgcGFyc2VkLCAlcyBpcyBpbnZhbGlkICcsXG4gICAgICBpbnZhbGlkOiAnJXMgZGF0ZSAlcyBpcyBpbnZhbGlkJ1xuICAgIH0sXG4gICAgdHlwZXM6IHtcbiAgICAgIHN0cmluZzogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIG1ldGhvZDogJyVzIGlzIG5vdCBhICVzIChmdW5jdGlvbiknLFxuICAgICAgYXJyYXk6ICclcyBpcyBub3QgYW4gJXMnLFxuICAgICAgb2JqZWN0OiAnJXMgaXMgbm90IGFuICVzJyxcbiAgICAgIG51bWJlcjogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIGRhdGU6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBcImJvb2xlYW5cIjogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIGludGVnZXI6ICclcyBpcyBub3QgYW4gJXMnLFxuICAgICAgXCJmbG9hdFwiOiAnJXMgaXMgbm90IGEgJXMnLFxuICAgICAgcmVnZXhwOiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnLFxuICAgICAgZW1haWw6ICclcyBpcyBub3QgYSB2YWxpZCAlcycsXG4gICAgICB1cmw6ICclcyBpcyBub3QgYSB2YWxpZCAlcycsXG4gICAgICBoZXg6ICclcyBpcyBub3QgYSB2YWxpZCAlcydcbiAgICB9LFxuICAgIHN0cmluZzoge1xuICAgICAgbGVuOiAnJXMgbXVzdCBiZSBleGFjdGx5ICVzIGNoYXJhY3RlcnMnLFxuICAgICAgbWluOiAnJXMgbXVzdCBiZSBhdCBsZWFzdCAlcyBjaGFyYWN0ZXJzJyxcbiAgICAgIG1heDogJyVzIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAlcyBjaGFyYWN0ZXJzJyxcbiAgICAgIHJhbmdlOiAnJXMgbXVzdCBiZSBiZXR3ZWVuICVzIGFuZCAlcyBjaGFyYWN0ZXJzJ1xuICAgIH0sXG4gICAgbnVtYmVyOiB7XG4gICAgICBsZW46ICclcyBtdXN0IGVxdWFsICVzJyxcbiAgICAgIG1pbjogJyVzIGNhbm5vdCBiZSBsZXNzIHRoYW4gJXMnLFxuICAgICAgbWF4OiAnJXMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAlcycsXG4gICAgICByYW5nZTogJyVzIG11c3QgYmUgYmV0d2VlbiAlcyBhbmQgJXMnXG4gICAgfSxcbiAgICBhcnJheToge1xuICAgICAgbGVuOiAnJXMgbXVzdCBiZSBleGFjdGx5ICVzIGluIGxlbmd0aCcsXG4gICAgICBtaW46ICclcyBjYW5ub3QgYmUgbGVzcyB0aGFuICVzIGluIGxlbmd0aCcsXG4gICAgICBtYXg6ICclcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICVzIGluIGxlbmd0aCcsXG4gICAgICByYW5nZTogJyVzIG11c3QgYmUgYmV0d2VlbiAlcyBhbmQgJXMgaW4gbGVuZ3RoJ1xuICAgIH0sXG4gICAgcGF0dGVybjoge1xuICAgICAgbWlzbWF0Y2g6ICclcyB2YWx1ZSAlcyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuICVzJ1xuICAgIH0sXG4gICAgY2xvbmU6IGZ1bmN0aW9uIGNsb25lKCkge1xuICAgICAgdmFyIGNsb25lZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcykpO1xuICAgICAgY2xvbmVkLmNsb25lID0gdGhpcy5jbG9uZTtcbiAgICAgIHJldHVybiBjbG9uZWQ7XG4gICAgfVxuICB9O1xufVxudmFyIG1lc3NhZ2VzID0gbmV3TWVzc2FnZXMoKTtcblxuLyoqXG4gKiAgRW5jYXBzdWxhdGVzIGEgdmFsaWRhdGlvbiBzY2hlbWEuXG4gKlxuICogIEBwYXJhbSBkZXNjcmlwdG9yIEFuIG9iamVjdCBkZWNsYXJpbmcgdmFsaWRhdGlvbiBydWxlc1xuICogIGZvciB0aGlzIHNjaGVtYS5cbiAqL1xuXG52YXIgU2NoZW1hID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBTdGF0aWMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gSW5zdGFuY2UgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIFNjaGVtYShkZXNjcmlwdG9yKSB7XG4gICAgdGhpcy5ydWxlcyA9IG51bGw7XG4gICAgdGhpcy5fbWVzc2FnZXMgPSBtZXNzYWdlcztcbiAgICB0aGlzLmRlZmluZShkZXNjcmlwdG9yKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTY2hlbWEucHJvdG90eXBlO1xuXG4gIF9wcm90by5kZWZpbmUgPSBmdW5jdGlvbiBkZWZpbmUocnVsZXMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCFydWxlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29uZmlndXJlIGEgc2NoZW1hIHdpdGggbm8gcnVsZXMnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJ1bGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJ1bGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdWxlcyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHRoaXMucnVsZXMgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhydWxlcykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGl0ZW0gPSBydWxlc1tuYW1lXTtcbiAgICAgIF90aGlzLnJ1bGVzW25hbWVdID0gQXJyYXkuaXNBcnJheShpdGVtKSA/IGl0ZW0gOiBbaXRlbV07XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLm1lc3NhZ2VzID0gZnVuY3Rpb24gbWVzc2FnZXMoX21lc3NhZ2VzKSB7XG4gICAgaWYgKF9tZXNzYWdlcykge1xuICAgICAgdGhpcy5fbWVzc2FnZXMgPSBkZWVwTWVyZ2UobmV3TWVzc2FnZXMoKSwgX21lc3NhZ2VzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZXM7XG4gIH07XG5cbiAgX3Byb3RvLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoc291cmNlXywgbywgb2MpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmIChvID09PSB2b2lkIDApIHtcbiAgICAgIG8gPSB7fTtcbiAgICB9XG5cbiAgICBpZiAob2MgPT09IHZvaWQgMCkge1xuICAgICAgb2MgPSBmdW5jdGlvbiBvYygpIHt9O1xuICAgIH1cblxuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VfO1xuICAgIHZhciBvcHRpb25zID0gbztcbiAgICB2YXIgY2FsbGJhY2sgPSBvYztcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5ydWxlcyB8fCBPYmplY3Qua2V5cyh0aGlzLnJ1bGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBzb3VyY2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNvdXJjZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcGxldGUocmVzdWx0cykge1xuICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgdmFyIGZpZWxkcyA9IHt9O1xuXG4gICAgICBmdW5jdGlvbiBhZGQoZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgICAgIHZhciBfZXJyb3JzO1xuXG4gICAgICAgICAgZXJyb3JzID0gKF9lcnJvcnMgPSBlcnJvcnMpLmNvbmNhdC5hcHBseShfZXJyb3JzLCBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWRkKHJlc3VsdHNbaV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgc291cmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkcyA9IGNvbnZlcnRGaWVsZHNFcnJvcihlcnJvcnMpO1xuICAgICAgICBjYWxsYmFjayhlcnJvcnMsIGZpZWxkcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubWVzc2FnZXMpIHtcbiAgICAgIHZhciBtZXNzYWdlcyQxID0gdGhpcy5tZXNzYWdlcygpO1xuXG4gICAgICBpZiAobWVzc2FnZXMkMSA9PT0gbWVzc2FnZXMpIHtcbiAgICAgICAgbWVzc2FnZXMkMSA9IG5ld01lc3NhZ2VzKCk7XG4gICAgICB9XG5cbiAgICAgIGRlZXBNZXJnZShtZXNzYWdlcyQxLCBvcHRpb25zLm1lc3NhZ2VzKTtcbiAgICAgIG9wdGlvbnMubWVzc2FnZXMgPSBtZXNzYWdlcyQxO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zLm1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcygpO1xuICAgIH1cblxuICAgIHZhciBzZXJpZXMgPSB7fTtcbiAgICB2YXIga2V5cyA9IG9wdGlvbnMua2V5cyB8fCBPYmplY3Qua2V5cyh0aGlzLnJ1bGVzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKHopIHtcbiAgICAgIHZhciBhcnIgPSBfdGhpczIucnVsZXNbel07XG4gICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vbel07XG4gICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgICB2YXIgcnVsZSA9IHI7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBydWxlLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGlmIChzb3VyY2UgPT09IHNvdXJjZV8pIHtcbiAgICAgICAgICAgIHNvdXJjZSA9IF9leHRlbmRzKHt9LCBzb3VyY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhbHVlID0gc291cmNlW3pdID0gcnVsZS50cmFuc2Zvcm0odmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcnVsZSA9IHtcbiAgICAgICAgICAgIHZhbGlkYXRvcjogcnVsZVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcnVsZSA9IF9leHRlbmRzKHt9LCBydWxlKTtcbiAgICAgICAgfSAvLyBGaWxsIHZhbGlkYXRvci4gU2tpcCBpZiBub3RoaW5nIG5lZWQgdG8gdmFsaWRhdGVcblxuXG4gICAgICAgIHJ1bGUudmFsaWRhdG9yID0gX3RoaXMyLmdldFZhbGlkYXRpb25NZXRob2QocnVsZSk7XG5cbiAgICAgICAgaWYgKCFydWxlLnZhbGlkYXRvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bGUuZmllbGQgPSB6O1xuICAgICAgICBydWxlLmZ1bGxGaWVsZCA9IHJ1bGUuZnVsbEZpZWxkIHx8IHo7XG4gICAgICAgIHJ1bGUudHlwZSA9IF90aGlzMi5nZXRUeXBlKHJ1bGUpO1xuICAgICAgICBzZXJpZXNbel0gPSBzZXJpZXNbel0gfHwgW107XG4gICAgICAgIHNlcmllc1t6XS5wdXNoKHtcbiAgICAgICAgICBydWxlOiBydWxlLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICBmaWVsZDogelxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHZhciBlcnJvckZpZWxkcyA9IHt9O1xuICAgIHJldHVybiBhc3luY01hcChzZXJpZXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChkYXRhLCBkb0l0KSB7XG4gICAgICB2YXIgcnVsZSA9IGRhdGEucnVsZTtcbiAgICAgIHZhciBkZWVwID0gKHJ1bGUudHlwZSA9PT0gJ29iamVjdCcgfHwgcnVsZS50eXBlID09PSAnYXJyYXknKSAmJiAodHlwZW9mIHJ1bGUuZmllbGRzID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcnVsZS5kZWZhdWx0RmllbGQgPT09ICdvYmplY3QnKTtcbiAgICAgIGRlZXAgPSBkZWVwICYmIChydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIGRhdGEudmFsdWUpO1xuICAgICAgcnVsZS5maWVsZCA9IGRhdGEuZmllbGQ7XG5cbiAgICAgIGZ1bmN0aW9uIGFkZEZ1bGxGaWVsZChrZXksIHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHNjaGVtYSwge1xuICAgICAgICAgIGZ1bGxGaWVsZDogcnVsZS5mdWxsRmllbGQgKyBcIi5cIiArIGtleSxcbiAgICAgICAgICBmdWxsRmllbGRzOiBydWxlLmZ1bGxGaWVsZHMgPyBbXS5jb25jYXQocnVsZS5mdWxsRmllbGRzLCBba2V5XSkgOiBba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY2IoZSkge1xuICAgICAgICBpZiAoZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGVycm9yTGlzdCA9IEFycmF5LmlzQXJyYXkoZSkgPyBlIDogW2VdO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5zdXBwcmVzc1dhcm5pbmcgJiYgZXJyb3JMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgIFNjaGVtYS53YXJuaW5nKCdhc3luYy12YWxpZGF0b3I6JywgZXJyb3JMaXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvckxpc3QubGVuZ3RoICYmIHJ1bGUubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZXJyb3JMaXN0ID0gW10uY29uY2F0KHJ1bGUubWVzc2FnZSk7XG4gICAgICAgIH0gLy8gRmlsbCBlcnJvciBpbmZvXG5cblxuICAgICAgICB2YXIgZmlsbGVkRXJyb3JzID0gZXJyb3JMaXN0Lm1hcChjb21wbGVtZW50RXJyb3IocnVsZSwgc291cmNlKSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZmlyc3QgJiYgZmlsbGVkRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgIGVycm9yRmllbGRzW3J1bGUuZmllbGRdID0gMTtcbiAgICAgICAgICByZXR1cm4gZG9JdChmaWxsZWRFcnJvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkZWVwKSB7XG4gICAgICAgICAgZG9JdChmaWxsZWRFcnJvcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIHJ1bGUgaXMgcmVxdWlyZWQgYnV0IHRoZSB0YXJnZXQgb2JqZWN0XG4gICAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgZmFpbCBhdCB0aGUgcnVsZSBsZXZlbCBhbmQgZG9uJ3RcbiAgICAgICAgICAvLyBnbyBkZWVwZXJcbiAgICAgICAgICBpZiAocnVsZS5yZXF1aXJlZCAmJiAhZGF0YS52YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHJ1bGUubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGZpbGxlZEVycm9ycyA9IFtdLmNvbmNhdChydWxlLm1lc3NhZ2UpLm1hcChjb21wbGVtZW50RXJyb3IocnVsZSwgc291cmNlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZXJyb3IpIHtcbiAgICAgICAgICAgICAgZmlsbGVkRXJyb3JzID0gW29wdGlvbnMuZXJyb3IocnVsZSwgZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMucmVxdWlyZWQsIHJ1bGUuZmllbGQpKV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkb0l0KGZpbGxlZEVycm9ycyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGZpZWxkc1NjaGVtYSA9IHt9O1xuXG4gICAgICAgICAgaWYgKHJ1bGUuZGVmYXVsdEZpZWxkKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhLnZhbHVlKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICBmaWVsZHNTY2hlbWFba2V5XSA9IHJ1bGUuZGVmYXVsdEZpZWxkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmllbGRzU2NoZW1hID0gX2V4dGVuZHMoe30sIGZpZWxkc1NjaGVtYSwgZGF0YS5ydWxlLmZpZWxkcyk7XG4gICAgICAgICAgdmFyIHBhcmVkRmllbGRzU2NoZW1hID0ge307XG4gICAgICAgICAgT2JqZWN0LmtleXMoZmllbGRzU2NoZW1hKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICAgICAgdmFyIGZpZWxkU2NoZW1hID0gZmllbGRzU2NoZW1hW2ZpZWxkXTtcbiAgICAgICAgICAgIHZhciBmaWVsZFNjaGVtYUxpc3QgPSBBcnJheS5pc0FycmF5KGZpZWxkU2NoZW1hKSA/IGZpZWxkU2NoZW1hIDogW2ZpZWxkU2NoZW1hXTtcbiAgICAgICAgICAgIHBhcmVkRmllbGRzU2NoZW1hW2ZpZWxkXSA9IGZpZWxkU2NoZW1hTGlzdC5tYXAoYWRkRnVsbEZpZWxkLmJpbmQobnVsbCwgZmllbGQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgc2NoZW1hID0gbmV3IFNjaGVtYShwYXJlZEZpZWxkc1NjaGVtYSk7XG4gICAgICAgICAgc2NoZW1hLm1lc3NhZ2VzKG9wdGlvbnMubWVzc2FnZXMpO1xuXG4gICAgICAgICAgaWYgKGRhdGEucnVsZS5vcHRpb25zKSB7XG4gICAgICAgICAgICBkYXRhLnJ1bGUub3B0aW9ucy5tZXNzYWdlcyA9IG9wdGlvbnMubWVzc2FnZXM7XG4gICAgICAgICAgICBkYXRhLnJ1bGUub3B0aW9ucy5lcnJvciA9IG9wdGlvbnMuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZW1hLnZhbGlkYXRlKGRhdGEudmFsdWUsIGRhdGEucnVsZS5vcHRpb25zIHx8IG9wdGlvbnMsIGZ1bmN0aW9uIChlcnJzKSB7XG4gICAgICAgICAgICB2YXIgZmluYWxFcnJvcnMgPSBbXTtcblxuICAgICAgICAgICAgaWYgKGZpbGxlZEVycm9ycyAmJiBmaWxsZWRFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGZpbmFsRXJyb3JzLnB1c2guYXBwbHkoZmluYWxFcnJvcnMsIGZpbGxlZEVycm9ycyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnJzICYmIGVycnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGZpbmFsRXJyb3JzLnB1c2guYXBwbHkoZmluYWxFcnJvcnMsIGVycnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb0l0KGZpbmFsRXJyb3JzLmxlbmd0aCA/IGZpbmFsRXJyb3JzIDogbnVsbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHJlcztcblxuICAgICAgaWYgKHJ1bGUuYXN5bmNWYWxpZGF0b3IpIHtcbiAgICAgICAgcmVzID0gcnVsZS5hc3luY1ZhbGlkYXRvcihydWxlLCBkYXRhLnZhbHVlLCBjYiwgZGF0YS5zb3VyY2UsIG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIGlmIChydWxlLnZhbGlkYXRvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlcyA9IHJ1bGUudmFsaWRhdG9yKHJ1bGUsIGRhdGEudmFsdWUsIGNiLCBkYXRhLnNvdXJjZSwgb3B0aW9ucyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvciA9PSBudWxsID8gdm9pZCAwIDogY29uc29sZS5lcnJvcihlcnJvcik7IC8vIHJldGhyb3cgdG8gcmVwb3J0IGVycm9yXG5cbiAgICAgICAgICBpZiAoIW9wdGlvbnMuc3VwcHJlc3NWYWxpZGF0b3JFcnJvcikge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzID09PSB0cnVlKSB7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgY2IodHlwZW9mIHJ1bGUubWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJyA/IHJ1bGUubWVzc2FnZShydWxlLmZ1bGxGaWVsZCB8fCBydWxlLmZpZWxkKSA6IHJ1bGUubWVzc2FnZSB8fCAocnVsZS5mdWxsRmllbGQgfHwgcnVsZS5maWVsZCkgKyBcIiBmYWlsc1wiKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGNiKHJlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjYihyZXMubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlcyAmJiByZXMudGhlbikge1xuICAgICAgICByZXMudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgY29tcGxldGUocmVzdWx0cyk7XG4gICAgfSwgc291cmNlKTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0VHlwZSA9IGZ1bmN0aW9uIGdldFR5cGUocnVsZSkge1xuICAgIGlmIChydWxlLnR5cGUgPT09IHVuZGVmaW5lZCAmJiBydWxlLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJ1bGUudHlwZSA9ICdwYXR0ZXJuJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJ1bGUudmFsaWRhdG9yICE9PSAnZnVuY3Rpb24nICYmIHJ1bGUudHlwZSAmJiAhdmFsaWRhdG9ycy5oYXNPd25Qcm9wZXJ0eShydWxlLnR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZm9ybWF0KCdVbmtub3duIHJ1bGUgdHlwZSAlcycsIHJ1bGUudHlwZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBydWxlLnR5cGUgfHwgJ3N0cmluZyc7XG4gIH07XG5cbiAgX3Byb3RvLmdldFZhbGlkYXRpb25NZXRob2QgPSBmdW5jdGlvbiBnZXRWYWxpZGF0aW9uTWV0aG9kKHJ1bGUpIHtcbiAgICBpZiAodHlwZW9mIHJ1bGUudmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcnVsZS52YWxpZGF0b3I7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhydWxlKTtcbiAgICB2YXIgbWVzc2FnZUluZGV4ID0ga2V5cy5pbmRleE9mKCdtZXNzYWdlJyk7XG5cbiAgICBpZiAobWVzc2FnZUluZGV4ICE9PSAtMSkge1xuICAgICAga2V5cy5zcGxpY2UobWVzc2FnZUluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDEgJiYga2V5c1swXSA9PT0gJ3JlcXVpcmVkJykge1xuICAgICAgcmV0dXJuIHZhbGlkYXRvcnMucmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvcnNbdGhpcy5nZXRUeXBlKHJ1bGUpXSB8fCB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIFNjaGVtYTtcbn0oKTtcblxuU2NoZW1hLnJlZ2lzdGVyID0gZnVuY3Rpb24gcmVnaXN0ZXIodHlwZSwgdmFsaWRhdG9yKSB7XG4gIGlmICh0eXBlb2YgdmFsaWRhdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVnaXN0ZXIgYSB2YWxpZGF0b3IgYnkgdHlwZSwgdmFsaWRhdG9yIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICB2YWxpZGF0b3JzW3R5cGVdID0gdmFsaWRhdG9yO1xufTtcblxuU2NoZW1hLndhcm5pbmcgPSB3YXJuaW5nO1xuU2NoZW1hLm1lc3NhZ2VzID0gbWVzc2FnZXM7XG5TY2hlbWEudmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7XG5cbmV4cG9ydCB7IFNjaGVtYSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWVkaXRhYmxlXCI+XG4gICAgPGRpdiB2LWlmPVwiIWVkaXRpbmcgfHwgZGlzYWJsZWRcIiBjbGFzcz1cImZzLWVkaXRhYmxlLWlubmVyIGZzLWVkaXRhYmxlLXBvaW50ZXJcIiB2LWJpbmQ9XCJhY3RpdmVUcmlnZ2VyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtZWRpdGFibGUtaW5wdXRcIj5cbiAgICAgICAgPGRpdiB2LWlmPVwiZGlydHlcIiBjbGFzcz1cImZzLWVkaXRhYmxlLWRpcnR5XCIgLz5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHYtaWY9XCJ0cmlnZ2VyICYmICFkaXNhYmxlZFwiIGNsYXNzPVwiZnMtZWRpdGFibGUtYWN0aW9uIGZzLWVkaXRhYmxlLWljb25cIj5cbiAgICAgICAgPGZzLWljb24gOmljb249XCJ1aS5pY29ucy5lZGl0XCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwiZnMtZWRpdGFibGUtaW5uZXJcIiA6Y2xhc3M9XCJ7ICdmcy12YWxpZGF0ZS1lcnJvcic6IGhhc0Vycm9yKCkgfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWVkaXRhYmxlLWlucHV0XCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJlZGl0XCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtZWRpdGFibGUtYWN0aW9uXCI+XG4gICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkudG9vbHRpcC5uYW1lXCI+XG4gICAgICAgICAgPHRlbXBsYXRlICNbdWkudG9vbHRpcC5jb250ZW50XT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3ItaWNvblwiPlxuICAgICAgICAgICAgICB7eyBnZXRWYWxpZGF0ZUVycm9yTWVzc2FnZSgpIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8dGVtcGxhdGUgI1t1aS50b29sdGlwLnRyaWdnZXJdPlxuICAgICAgICAgICAgPGZzLWljb24gOmNsYXNzPVwieyBoaWRkZW46ICFoYXNFcnJvcigpLCAnZXJyb3ItaWNvbic6IHRydWUgfVwiIHNpemU9XCJtaW5pXCIgOmljb249XCJ1aS5pY29ucy5pbmZvXCIgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzaG93QWN0aW9uXCI+XG4gICAgICAgICAgPGZzLWljb24gdi1pZj1cImxvYWRpbmdcIiBzaXplPVwibWluaVwiIDpzcGluPVwidHJ1ZVwiIDppY29uPVwidWkuaWNvbnMucmVmcmVzaFwiIC8+XG4gICAgICAgICAgPGZzLWljb24gdi1lbHNlIHNpemU9XCJtaW5pXCIgOmljb249XCJ1aS5pY29ucy5jaGVja1wiIEBjbGljaz1cImRvU3VibWl0XCIgLz5cbiAgICAgICAgICA8ZnMtaWNvbiA6Y2xhc3M9XCJ7IGhpZGRlbjogbG9hZGluZyB9XCIgc2l6ZT1cIm1pbmlcIiA6aWNvbj1cInVpLmljb25zLmNsb3NlXCIgQGNsaWNrPVwiZG9DYW5jZWxcIiAvPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIkBmYXN0LWNydWQvdWktaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gXCJ2dWVcIjtcblxudHlwZSBGc0VkaXRhYmxlUHJvcHMgPSB7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgZWRpdGluZzogYm9vbGVhbjtcbiAgZGlydHk/OiBib29sZWFuO1xuICB0cmlnZ2VyPzogXCJvbkNsaWNrXCIgfCBcIm9uRGJDbGlja1wiIHwgZmFsc2U7XG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICBzaG93QWN0aW9uPzogYm9vbGVhbjtcbiAgdmFsaWRhdGVFcnJvcnM/OiBhbnlbXTtcbn07XG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhkZWZpbmVQcm9wczxGc0VkaXRhYmxlUHJvcHM+KCksIHtcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBlZGl0aW5nOiBmYWxzZSxcbiAgZGlydHk6IGZhbHNlLFxuICBsb2FkaW5nOiBmYWxzZSxcbiAgc2hvd0FjdGlvbjogdHJ1ZSxcbiAgdHJpZ2dlcjogXCJvbkNsaWNrXCIsXG4gIHZhbGlkYXRlRXJyb3JzOiAoKSA9PiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59KTtcblxuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbmNvbnN0IGVtaXRzID0gZGVmaW5lRW1pdHMoW1widXBkYXRlOmVkaXRpbmdcIiwgXCJzdWJtaXRcIiwgXCJjYW5jZWxcIl0pO1xuY29uc3QgYWN0aXZlVHJpZ2dlciA9IGNvbXB1dGVkKCgpID0+IHtcbiAgaWYgKCFwcm9wcy50cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgW3Byb3BzLnRyaWdnZXJdOiAoKSA9PiB7XG4gICAgICBlbWl0cyhcInVwZGF0ZTplZGl0aW5nXCIsIHRydWUpO1xuICAgIH1cbiAgfTtcbn0pO1xuZnVuY3Rpb24gZG9TdWJtaXQoKSB7XG4gIGVtaXRzKFwic3VibWl0XCIpO1xufVxuZnVuY3Rpb24gZG9DYW5jZWwoKSB7XG4gIGVtaXRzKFwiY2FuY2VsXCIpO1xufVxuZnVuY3Rpb24gaGFzRXJyb3IoKSB7XG4gIHJldHVybiBwcm9wcy52YWxpZGF0ZUVycm9ycz8ubGVuZ3RoID4gMDtcbn1cbmZ1bmN0aW9uIGdldFZhbGlkYXRlRXJyb3JNZXNzYWdlKCkge1xuICBpZiAocHJvcHMudmFsaWRhdGVFcnJvcnM/Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gcHJvcHMudmFsaWRhdGVFcnJvcnM/Lm1hcCgoaXRlbSkgPT4gaXRlbS5tZXNzYWdlKS5qb2luKFwiLFwiKTtcbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1lZGl0YWJsZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHdpZHRoOiAxMDAlO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAuZnMtZWRpdGFibGUtcG9pbnRlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG4gIC5mcy1lZGl0YWJsZS1pbm5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIG1pbi1oZWlnaHQ6IDIzcHg7XG4gICAgLmZzLWVkaXRhYmxlLWRpcnR5IHtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwMHB4O1xuICAgICAgd2lkdGg6IDVweDtcbiAgICAgIGhlaWdodDogNXB4O1xuICAgICAgbWFyZ2luLWxlZnQ6IC01cHg7XG4gICAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgfVxuICAgIC5mcy1lZGl0YWJsZS1pbnB1dCB7XG4gICAgICBmbGV4OiAxO1xuICAgIH1cbiAgICAuZnMtZWRpdGFibGUtYWN0aW9uIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgICAgaSxcbiAgICAgIC5hbnRpY29uIHtcbiAgICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB9XG4gICAgICAuaGlkZGVuIHtcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5mcy1lZGl0YWJsZS1pY29uIHtcbiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICB9XG4gICAgJjpob3ZlciAuZnMtZWRpdGFibGUtaWNvbiB7XG4gICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIH1cblxuICAgIC5lbC1yYWRpbyB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgICAgIC5lbC1yYWRpb19fbGFiZWwge1xuICAgICAgICBwYWRkaW5nOiAycHg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi5mcy12YWxpZGF0ZS1lcnJvciB7XG4gICAgICAuZXJyb3ItaWNvbiB7XG4gICAgICAgIGNvbG9yOiAjZmY0ZDRmO1xuICAgICAgfVxuICAgICAgLmFudC1pbnB1dC1hZmZpeC13cmFwcGVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAjZmY0ZDRmO1xuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiKDI1NSAzOCA1IC8gNiUpO1xuICAgICAgfVxuICAgICAgLmVsLWlucHV0X193cmFwcGVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAjZmY0ZDRmICFpbXBvcnRhbnQ7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCAjZmY0ZDRmIGluc2V0ICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgICAubi1pbnB1dCAubi1pbnB1dF9fc3RhdGUtYm9yZGVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAjZmY0ZDRmICFpbXBvcnRhbnQ7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2IoMjU1IDM4IDUgLyA2JSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtYWN0aW9uYmFyXCI+XG4gICAgPHRlbXBsYXRlIHYtZm9yPVwiKHZhbHVlLCBrZXkpIGluIGNvbXB1dGVkQnV0dG9uc1wiIDprZXk9XCJrZXlcIj5cbiAgICAgIDxmcy1idXR0b24gdi1pZj1cInZhbHVlLnNob3cgIT09IGZhbHNlXCIgdi1iaW5kPVwidmFsdWVcIiBAY2xpY2s9XCJvbkNsaWNrKGtleSwgdmFsdWUsICRldmVudClcIiAvPlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIGNvbXB1dGVkLCBSZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBzb3J0QnkgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcbmltcG9ydCB7IEFjdGlvbmJhckNsaWNrRXZlbnQsIEJ1dHRvbnNQcm9wcyB9IGZyb20gXCIuLi8uLi9kXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNBY3Rpb25iYXJcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDmjInpkq7phY3nva5cbiAgICAgKiB7XG4gICAgICogIGFkZDp7XG4gICAgICogICAgLi4uRnNCdXR0b24sXG4gICAgICogICAgc2hvdzp0cnVlXG4gICAgICogIH0sXG4gICAgICogIGN1c3RvbTp7Li4ufVxuICAgICAqIH1cbiAgICAgKi9cbiAgICBidXR0b25zOiB7fVxuICB9IGFzIGFueSxcbiAgZW1pdHM6IFtcImFjdGlvblwiXSxcbiAgc2V0dXAocHJvcHMsIGN0eDogYW55KSB7XG4gICAgZnVuY3Rpb24gb25DbGljayhrZXk6IGFueSwgYnRuOiBhbnksICRldmVudDogYW55KSB7XG4gICAgICBjb25zdCBlID0geyBrZXksIGJ0biwgJGV2ZW50IH07XG4gICAgICBpZiAoYnRuLmNsaWNrKSB7XG4gICAgICAgIGJ0bi5jbGljayhlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGJ0bi5vbkNsaWNrKSB7XG4gICAgICAgIGJ0bi5vbkNsaWNrKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcImFjdGlvblwiLCBlKTtcbiAgICB9XG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zOiBSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBsZXQgc29ydEFyciA9IFtdO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yIChsZXQga2V5IGluIHByb3BzLmJ1dHRvbnMpIHtcbiAgICAgICAgc29ydEFyci5wdXNoKHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgLi4ucHJvcHMuYnV0dG9uc1trZXldLFxuICAgICAgICAgIF9rZXk6IGtleVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5vcmRlciA/PyBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNvcnRlZEJ1dHRvbnM6IEJ1dHRvbnNQcm9wczxBY3Rpb25iYXJDbGlja0V2ZW50PiA9IHt9O1xuXG4gICAgICBzb3J0QXJyLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBsZXQgX2tleSA9IGl0ZW0uX2tleTtcbiAgICAgICAgZGVsZXRlIGl0ZW0uX2tleTtcbiAgICAgICAgc29ydGVkQnV0dG9uc1tfa2V5XSA9IGl0ZW07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzb3J0ZWRCdXR0b25zO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBvbkNsaWNrLFxuICAgICAgY29tcHV0ZWRCdXR0b25zXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWFjdGlvbmJhciB7XG4gIC5mcy1idXR0b24ge1xuICAgIG1hcmdpbjogMnB4OyAvLyDmjaLooYzkuYvlkI7kuZ/opoHmnInkuIDngrnpl7TpmpRcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWFjdGlvbmJhclwiPlxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIih2YWx1ZSwga2V5KSBpbiBjb21wdXRlZEJ1dHRvbnNcIiA6a2V5PVwia2V5XCI+XG4gICAgICA8ZnMtYnV0dG9uIHYtaWY9XCJ2YWx1ZS5zaG93ICE9PSBmYWxzZVwiIHYtYmluZD1cInZhbHVlXCIgQGNsaWNrPVwib25DbGljayhrZXksIHZhbHVlLCAkZXZlbnQpXCIgLz5cbiAgICA8L3RlbXBsYXRlPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBjb21wdXRlZCwgUmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgc29ydEJ5IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBY3Rpb25iYXJDbGlja0V2ZW50LCBCdXR0b25zUHJvcHMgfSBmcm9tIFwiLi4vLi4vZFwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQWN0aW9uYmFyXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uXG4gICAgICoge1xuICAgICAqICBhZGQ6e1xuICAgICAqICAgIC4uLkZzQnV0dG9uLFxuICAgICAqICAgIHNob3c6dHJ1ZVxuICAgICAqICB9LFxuICAgICAqICBjdXN0b206ey4uLn1cbiAgICAgKiB9XG4gICAgICovXG4gICAgYnV0dG9uczoge31cbiAgfSBhcyBhbnksXG4gIGVtaXRzOiBbXCJhY3Rpb25cIl0sXG4gIHNldHVwKHByb3BzLCBjdHg6IGFueSkge1xuICAgIGZ1bmN0aW9uIG9uQ2xpY2soa2V5OiBhbnksIGJ0bjogYW55LCAkZXZlbnQ6IGFueSkge1xuICAgICAgY29uc3QgZSA9IHsga2V5LCBidG4sICRldmVudCB9O1xuICAgICAgaWYgKGJ0bi5jbGljaykge1xuICAgICAgICBidG4uY2xpY2soZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChidG4ub25DbGljaykge1xuICAgICAgICBidG4ub25DbGljayhlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJhY3Rpb25cIiwgZSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbXB1dGVkQnV0dG9uczogUmVmID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgbGV0IHNvcnRBcnIgPSBbXTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvciAobGV0IGtleSBpbiBwcm9wcy5idXR0b25zKSB7XG4gICAgICAgIHNvcnRBcnIucHVzaCh7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIC4uLnByb3BzLmJ1dHRvbnNba2V5XSxcbiAgICAgICAgICBfa2V5OiBrZXlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzb3J0QXJyID0gc29ydEJ5KHNvcnRBcnIsIChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzb3J0ZWRCdXR0b25zOiBCdXR0b25zUHJvcHM8QWN0aW9uYmFyQ2xpY2tFdmVudD4gPSB7fTtcblxuICAgICAgc29ydEFyci5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IF9rZXkgPSBpdGVtLl9rZXk7XG4gICAgICAgIGRlbGV0ZSBpdGVtLl9rZXk7XG4gICAgICAgIHNvcnRlZEJ1dHRvbnNbX2tleV0gPSBpdGVtO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc29ydGVkQnV0dG9ucztcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgb25DbGljayxcbiAgICAgIGNvbXB1dGVkQnV0dG9uc1xuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1hY3Rpb25iYXIge1xuICAuZnMtYnV0dG9uIHtcbiAgICBtYXJnaW46IDJweDsgLy8g5o2i6KGM5LmL5ZCO5Lmf6KaB5pyJ5LiA54K56Ze06ZqUXG4gIH1cbn1cbjwvc3R5bGU+XG4iLG51bGwsbnVsbCwiPHRlbXBsYXRlPlxuICA8IS0tIOeugOWNleaooeW8jyAtLT5cbiAgPHRlbXBsYXRlIHYtaWY9XCJtb2RlID09PSAnc2ltcGxlJ1wiPlxuICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiBjbGFzcz1cImZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyLXNpbXBsZVwiPlxuICAgICAgPGNvbXBvbmVudFxuICAgICAgICA6aXM9XCJ1aS5jb2wubmFtZVwiXG4gICAgICAgIHYtZm9yPVwiKGVsZW1lbnQsIGtleSkgaW4gY3VycmVudENvbHVtbnNcIlxuICAgICAgICB2LXNob3c9XCJvcmlnaW5hbFtlbGVtZW50LmtleV0/Ll9fc2hvdyAhPT0gZmFsc2VcIlxuICAgICAgICA6a2V5PVwia2V5XCJcbiAgICAgICAgOnNwYW49XCI2XCJcbiAgICAgID5cbiAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgIDppcz1cInVpLmNoZWNrYm94Lm5hbWVcIlxuICAgICAgICAgIHYtbW9kZWw6W3VpLmNoZWNrYm94Lm1vZGVsVmFsdWVdPVwiZWxlbWVudC5zaG93XCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJvcmlnaW5hbFtlbGVtZW50LmtleV0/Ll9fZGlzYWJsZWQgPT09IHRydWVcIlxuICAgICAgICAgIGNsYXNzPVwiaXRlbS1sYWJlbFwiXG4gICAgICAgICAgOnRpdGxlPVwiYnVpbGRUZXh0KGVsZW1lbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGJ1aWxkVGV4dChlbGVtZW50KSB9fVxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvY29tcG9uZW50PlxuICAgIDxjb21wb25lbnQgOmlzPVwidWkuZGl2aWRlci5uYW1lXCIgLz5cbiAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCI+XG4gICAgICA8ZnMtYnV0dG9uXG4gICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA1cHhcIlxuICAgICAgICB0eXBlPVwicHJpbWFyeVwiXG4gICAgICAgIDppY29uPVwidWkuaWNvbnMuY2hlY2tcIlxuICAgICAgICA6dGV4dD1cIl90ZXh0LmNvbmZpcm1cIlxuICAgICAgICBAY2xpY2s9XCJzaW1wbGVTdWJtaXQoKVwiXG4gICAgICAvPlxuICAgICAgPGZzLWJ1dHRvbiA6aWNvbj1cInVpLmljb25zLnJlZnJlc2hcIiA6dGV4dD1cIl90ZXh0LnJlc2V0XCIgQGNsaWNrPVwic2ltcGxlUmVzZXRcIiAvPlxuICAgIDwvY29tcG9uZW50PlxuICA8L3RlbXBsYXRlPlxuICA8IS0tIOWujOWFqOaooeW8jyAtLT5cblxuICA8Y29tcG9uZW50IDppcz1cImNvbnRhaW5lcj8uaXMgfHwgJ2ZzLWNvbHVtbnMtZmlsdGVyLWxheW91dC1kZWZhdWx0J1wiIHYtZWxzZSB2LWJpbmQ9XCJjb250YWluZXJcIj5cbiAgICA8dGVtcGxhdGUgI2J1dHRvbnM+XG4gICAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCIgY2xhc3M9XCJmcy1kcmF3ZXItZm9vdGVyXCIgOmd1dHRlcj1cIjEwXCI+XG4gICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuY29sLm5hbWVcIiA6c3Bhbj1cIjEyXCI+XG4gICAgICAgICAgPGZzLWJ1dHRvbiA6aWNvbj1cInVpLmljb25zLnJlZnJlc2hcIiA6dGV4dD1cIl90ZXh0LnJlc2V0XCIgYmxvY2sgQGNsaWNrPVwicmVzZXRcIiAvPlxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jb2wubmFtZVwiIDpzcGFuPVwiMTJcIj5cbiAgICAgICAgICA8ZnMtYnV0dG9uIHR5cGU9XCJwcmltYXJ5XCIgOmljb249XCJ1aS5pY29ucy5jaGVja1wiIDp0ZXh0PVwiX3RleHQuY29uZmlybVwiIGJsb2NrIEBjbGljaz1cInN1Ym1pdChmYWxzZSlcIiAvPlxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIiBzZXR1cD5cbi8qKlxuICogRnNUYWJsZUNvbHVtbnNGaWx0ZXLvvIzliJforr7nva7nu4Tku7ZcbiAqL1xuaW1wb3J0IHsgb21pdCwgZm9yRWFjaCwgcGljayB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCBUYWJsZVN0b3JlIGZyb20gXCIuLi8uLi8uLi91dGlscy91dGlsLnN0b3JlXCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGluamVjdCwgbmV4dFRpY2ssIHByb3ZpZGUsIFJlZiwgcmVmLCB3YXRjaCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVpQ29udGV4dCB9IGZyb20gXCIuLi8uLi8uLi91aVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vLi4vdXNlL3VzZS1tZXJnZVwiO1xuaW1wb3J0IHsgdXNlUm91dGUgfSBmcm9tIFwidnVlLXJvdXRlclwiO1xuaW1wb3J0IHtcbiAgQ29sdW1uUHJvcHMsXG4gIENvbHVtbnNGaWx0ZXJDb21wb25lbnRQcm9wcyxcbiAgQ29sdW1uc0ZpbHRlckl0ZW0sXG4gIENvbHVtbnNGaWx0ZXJQcm92aWRlS2V5LFxuICBUYWJsZUNvbHVtbnNQcm9wc1xufSBmcm9tIFwiLi4vLi4vLi4vZFwiO1xuXG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhkZWZpbmVQcm9wczxDb2x1bW5zRmlsdGVyQ29tcG9uZW50UHJvcHM+KCksIHtcbiAgc3RvcmFnZTogdHJ1ZSxcbiAgbW9kZTogXCJkZWZhdWx0XCIsXG4gIGNvbnRhaW5lcjogKCkgPT4ge1xuICAgIHJldHVybiB7IGlzOiBcImZzLWNvbHVtbnMtZmlsdGVyLWxheW91dC1kZWZhdWx0XCIgfTtcbiAgfVxufSk7XG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoW1widXBkYXRlOmNvbHVtbnNcIiwgXCJ1cGRhdGU6c2hvd1wiLCBcInJlc2V0XCIsIFwic3VibWl0XCJdKTtcblxuY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG5jb25zdCB1aSA9IHVpQ29udGV4dC5nZXQoKTtcbmNvbnN0IGFjdGl2ZSA9IHJlZihmYWxzZSk7XG5jb25zdCBzdGFydCA9ICgpID0+IHtcbiAgYWN0aXZlLnZhbHVlID0gdHJ1ZTtcbn07XG5cbi8vIOaVsOe7hOW9ouW8j+eahOWOn+Wni3RyZWVcbmNvbnN0IG9yaWdpbmFsOiBSZWY8Q29sdW1uc0ZpbHRlckl0ZW1bXT4gPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiB0cmFuc2Zvcm1Db2x1bW5zVHJlZShwcm9wcy5vcmlnaW5hbENvbHVtbnMpO1xufSk7XG4vL+aVsOe7hOW9ouW8j+eahHRyZWVcbmNvbnN0IGN1cnJlbnRDb2x1bW5zOiBSZWY8Q29sdW1uc0ZpbHRlckl0ZW1bXT4gPSByZWYoW10pO1xuXG5jb25zdCBvcmlnaW5hbENvbHVtbnNNYXA6IFJlZjxSZWNvcmQ8c3RyaW5nLCBDb2x1bW5zRmlsdGVySXRlbT4+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIENvbHVtbnNGaWx0ZXJJdGVtPiA9IHt9O1xuICBlYWNoVHJlZShvcmlnaW5hbC52YWx1ZSwgKGl0ZW06IENvbHVtbnNGaWx0ZXJJdGVtKSA9PiB7XG4gICAgbWFwW2l0ZW0uX19rZXldID0gaXRlbTtcbiAgfSk7XG4gIHJldHVybiBtYXA7XG59KTtcbmNvbnN0IHsgbWVyZ2UsIGNsb25lRGVlcCB9ID0gdXNlTWVyZ2UoKTtcblxuY29uc3QgX3RleHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGNvbnN0IGRlZiA9IHtcbiAgICB0aXRsZTogdChcImZzLnRvb2xiYXIuY29sdW1uRmlsdGVyLnRpdGxlXCIpLFxuICAgIGZpeGVkOiB0KFwiZnMudG9vbGJhci5jb2x1bW5GaWx0ZXIuZml4ZWRcIiksXG4gICAgb3JkZXI6IHQoXCJmcy50b29sYmFyLmNvbHVtbkZpbHRlci5vcmRlclwiKSxcbiAgICByZXNldDogdChcImZzLnRvb2xiYXIuY29sdW1uRmlsdGVyLnJlc2V0XCIpLFxuICAgIGNvbmZpcm06IHQoXCJmcy50b29sYmFyLmNvbHVtbkZpbHRlci5jb25maXJtXCIpLFxuICAgIHVubmFtZWQ6IHQoXCJmcy50b29sYmFyLmNvbHVtbkZpbHRlci51bm5hbWVkXCIpXG4gIH07XG4gIG1lcmdlKGRlZiwgcHJvcHMudGV4dCk7XG4gIHJldHVybiBkZWY7XG59KTtcblxuZnVuY3Rpb24gZWFjaFRyZWUodHJlZTogYW55LCBjYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgaWYgKCF0cmVlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHRyZWUpKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRyZWUpIHtcbiAgICAgIGNhbGxiYWNrKGl0ZW0pO1xuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgZWFjaFRyZWUoaXRlbS5jaGlsZHJlbiwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0cmVlKSB7XG4gICAgICBjb25zdCBpdGVtID0gdHJlZVtrZXldO1xuICAgICAgY2FsbGJhY2soaXRlbSk7XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xuICAgICAgICBlYWNoVHJlZShpdGVtLmNoaWxkcmVuLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29sdW1uRmlsdGVySXRlbShpdGVtOiBDb2x1bW5Qcm9wcyk6IENvbHVtbnNGaWx0ZXJJdGVtIHtcbiAgcmV0dXJuIHtcbiAgICBrZXk6IGl0ZW0ua2V5LFxuICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxuICAgIGZpeGVkOiBpdGVtLmZpeGVkID8/IGZhbHNlLFxuICAgIHNob3c6IGl0ZW0uc2hvdyA/PyB0cnVlLFxuICAgIF9fc2hvdzogaXRlbS5jb2x1bW5TZXRTaG93ICE9PSBmYWxzZSxcbiAgICBfX2Rpc2FibGVkOiBpdGVtLmNvbHVtblNldERpc2FibGVkID8/IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVRvVGFibGVDb2x1bW5zKHJlc3VsdDogQ29sdW1uc0ZpbHRlckl0ZW1bXSkge1xuICBjb25zdCBjb2x1bW5zOiBUYWJsZUNvbHVtbnNQcm9wcyA9IHt9O1xuICBmb3JFYWNoKHJlc3VsdCwgKGl0ZW0pID0+IHtcbiAgICBjb25zdCBjb2x1bW46IENvbHVtblByb3BzID0gb21pdChpdGVtLCBcImNoaWxkcmVuXCIsIFwiX19zaG93XCIsIFwiX19kaXNhYmxlZFwiLCBcIl9fcGFyZW50XCIsIFwiX19rZXlcIik7XG4gICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBjb2x1bW4uY2hpbGRyZW4gPSB0cmFuc2Zvcm1Ub1RhYmxlQ29sdW1ucyhpdGVtLmNoaWxkcmVuKTtcbiAgICB9XG4gICAgY29sdW1uc1tpdGVtLmtleV0gPSBjb2x1bW47XG4gIH0pO1xuICByZXR1cm4gY29sdW1ucztcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtQ29sdW1uc1RyZWUodmFsdWU6IFRhYmxlQ29sdW1uc1Byb3BzLCBwYXJlbnQ/OiBDb2x1bW5zRmlsdGVySXRlbSk6IENvbHVtbnNGaWx0ZXJJdGVtW10ge1xuICBjb25zdCBjb2x1bW5zOiBDb2x1bW5zRmlsdGVySXRlbVtdID0gW107XG4gIGZvckVhY2godmFsdWUsIChpdGVtKSA9PiB7XG4gICAgY29uc3QgY29sdW1uID0gYnVpbGRDb2x1bW5GaWx0ZXJJdGVtKGl0ZW0pO1xuICAgIGNvbHVtbi5fX3BhcmVudCA9IHBhcmVudDtcbiAgICBjb2x1bW4uX19rZXkgPSBgJHtwYXJlbnQ/LmtleSB8fCBcIlwifS4ke2l0ZW0ua2V5fWA7XG4gICAgY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgIGNvbHVtbi5jaGlsZHJlbiA9IHRyYW5zZm9ybUNvbHVtbnNUcmVlKGl0ZW0uY2hpbGRyZW4sIGNvbHVtbik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGNvbHVtbnM7XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRWYWx1ZSh2YWx1ZTogYW55KSB7XG4gIGN1cnJlbnRDb2x1bW5zLnZhbHVlID0gdHJhbnNmb3JtQ29sdW1uc1RyZWUodmFsdWUpO1xufVxuXG4vLyDov5jljp9cbmFzeW5jIGZ1bmN0aW9uIHJlc2V0KCkge1xuICBjdXJyZW50Q29sdW1ucy52YWx1ZSA9IHRyYW5zZm9ybUNvbHVtbnNUcmVlKHByb3BzLm9yaWdpbmFsQ29sdW1ucyk7XG4gIGF3YWl0IGRvX3NhdmUodHJ1ZSk7XG4gIGF3YWl0IGNsZWFyVGhpc1N0b3JhZ2UoKTtcbiAgZW1pdChcInJlc2V0XCIpO1xufVxuXG4vLyDnoa7orqRcbmFzeW5jIGZ1bmN0aW9uIGRvX3NhdmUobm9TYXZlID0gZmFsc2UpIHtcbiAgaWYgKCFub1NhdmUpIHtcbiAgICBhd2FpdCBzYXZlT3B0aW9uc1RvU3RvcmFnZShjdXJyZW50Q29sdW1ucy52YWx1ZSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2xvbmVEZWVwKGN1cnJlbnRDb2x1bW5zLnZhbHVlKTtcblxuICAvL+ino+WGs25haXZlIHVp5LiO5YiX6K6+572u5Yay56qB55qE6Zeu6aKYXG4gIGVhY2hUcmVlKHJlc3VsdCwgKGl0ZW06IGFueSkgPT4ge1xuICAgIGlmIChpdGVtKSB7XG4gICAgICBkZWxldGUgaXRlbS5fX2Rpc2FibGVkO1xuICAgICAgZGVsZXRlIGl0ZW0uX19zaG93O1xuICAgICAgZGVsZXRlIGl0ZW0uX19wYXJlbnQ7XG4gICAgICBkZWxldGUgaXRlbS5fX2tleTtcbiAgICB9XG4gIH0pO1xuXG4gIGRvRW1pdChyZXN1bHQpO1xuICBhY3RpdmUudmFsdWUgPSBmYWxzZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0KG5vU2F2ZSA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbHVtbnMgPSBhd2FpdCBkb19zYXZlKG5vU2F2ZSk7XG4gIGVtaXQoXCJzdWJtaXRcIiwgeyBjb2x1bW5zIH0pO1xufVxuY29uc3QgY29tcHV0ZWRPcmlnaW5hbENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiBwcm9wcy5vcmlnaW5hbENvbHVtbnM7XG59KTtcbnByb3ZpZGUoQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXksIHtcbiAgb3JpZ2luYWxDb2x1bW5zOiBjb21wdXRlZE9yaWdpbmFsQ29sdW1ucyxcbiAgb3JpZ2luYWxDb2x1bW5zTWFwOiBvcmlnaW5hbENvbHVtbnNNYXAsXG4gIGN1cnJlbnRDb2x1bW5zLFxuICB0ZXh0OiBfdGV4dCxcbiAgYWN0aXZlLFxuICBzdWJtaXQsXG4gIHJlc2V0XG59KTtcblxuYXN5bmMgZnVuY3Rpb24gc2ltcGxlU3VibWl0KCkge1xuICBhd2FpdCBzdWJtaXQoZmFsc2UpO1xuICBlbWl0KFwidXBkYXRlOnNob3dcIiwgZmFsc2UpO1xufVxuYXN5bmMgZnVuY3Rpb24gc2ltcGxlUmVzZXQoKSB7XG4gIGF3YWl0IHJlc2V0KCk7XG4gIGVtaXQoXCJ1cGRhdGU6c2hvd1wiLCBmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIGRvRW1pdChyZXN1bHQ6IENvbHVtbnNGaWx0ZXJJdGVtW10pIHtcbiAgZW1pdChcInVwZGF0ZTpjb2x1bW5zXCIsIHRyYW5zZm9ybVRvVGFibGVDb2x1bW5zKHJlc3VsdCkpO1xufVxuXG5jb25zdCBnZXRDcnVkQmluZGluZyA9IGluamVjdChcImdldDpjcnVkQmluZGluZ1wiLCAoKSA9PiB7XG4gIHJldHVybiB7IGlkOiBcIlwiIH07XG59KTtcblxuY29uc3Qgc3RvcmFnZVRhYmxlU3RvcmUgPSByZWYoKTtcbmZ1bmN0aW9uIGdldFN0b3JhZ2VUYWJsZSgpIHtcbiAgLy9wcm9wcy5zdG9yYWdl5piv5ZCm5a6e546w5LqGQ29sdW1uRmlsdGVyU3RvcmFnZSDmjqXlj6NcbiAgY29uc3QgcmVtb3RlU3RvcmFnZSA9IHR5cGVvZiBwcm9wcy5zdG9yYWdlID09PSBcIm9iamVjdFwiID8gcHJvcHMuc3RvcmFnZSA6IG51bGw7XG4gIGNvbnN0IGtleVR5cGUgPSB0eXBlb2YgcHJvcHMuc3RvcmFnZSA9PT0gXCJzdHJpbmdcIiA/IHByb3BzLnN0b3JhZ2UgOiBcIlwiO1xuICBpZiAoc3RvcmFnZVRhYmxlU3RvcmUudmFsdWUgPT0gbnVsbCkge1xuICAgIGNvbnN0IHJvdXRlID0gdXNlUm91dGUoKTtcbiAgICBzdG9yYWdlVGFibGVTdG9yZS52YWx1ZSA9IG5ldyBUYWJsZVN0b3JlKHtcbiAgICAgICRyb3V0ZXI6IHJvdXRlLFxuICAgICAgdGFibGVOYW1lOiBcImNvbHVtbnNGaWx0ZXJcIixcbiAgICAgIGtleVR5cGU6IGtleVR5cGUsXG4gICAgICByZW1vdGVTdG9yYWdlXG4gICAgfSk7XG4gIH1cbiAgc3RvcmFnZVRhYmxlU3RvcmUudmFsdWUuaWQgPSBnZXRDcnVkQmluZGluZygpLmlkO1xuICByZXR1cm4gc3RvcmFnZVRhYmxlU3RvcmUudmFsdWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVPcHRpb25zVG9TdG9yYWdlKHZhbHVlOiBhbnkpIHtcbiAgaWYgKHByb3BzLnN0b3JhZ2UgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHN0b3JlZE9wdGlvbnM6IGFueSA9IGNsb25lRGVlcCh2YWx1ZSk7XG4gIC8v5Yig6ZmkcGFyZW505byV55SoXG4gIGVhY2hUcmVlKHN0b3JlZE9wdGlvbnMsIChpdGVtOiBhbnkpID0+IHtcbiAgICBkZWxldGUgaXRlbS5fX3BhcmVudDtcbiAgfSk7XG5cbiAgYXdhaXQgZ2V0U3RvcmFnZVRhYmxlKCkudXBkYXRlVGFibGVWYWx1ZShzdG9yZWRPcHRpb25zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9uc0Zyb21TdG9yYWdlKCkge1xuICBpZiAocHJvcHMuc3RvcmFnZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmV0dXJuIGF3YWl0IGdldFN0b3JhZ2VUYWJsZSgpLmdldFRhYmxlVmFsdWUoKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNsZWFyVGhpc1N0b3JhZ2UoKSB7XG4gIGF3YWl0IGdldFN0b3JhZ2VUYWJsZSgpLmNsZWFyVGFibGVWYWx1ZSgpO1xufVxuXG5mdW5jdGlvbiBnZXRDb2x1bW5zSGFzaChjb2x1bW5zOiBhbnkpIHtcbiAgY29uc3Qga2V5czogYW55ID0gW107XG4gIGVhY2hUcmVlKGNvbHVtbnMsIChpdGVtOiBhbnkpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBwaWNrKGl0ZW0sIFwia2V5XCIsIFwiX19zaG93XCIsIFwiX19kaXNhYmxlZFwiKTtcbiAgICBrZXlzLnB1c2goSlNPTi5zdHJpbmdpZnkodGFyZ2V0KSk7XG4gIH0pO1xuICBrZXlzLnNvcnQoKTtcbiAgbGV0IGhhc2ggPSBcIlwiO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaGFzaCArPSBrZXk7XG4gIH1cbiAgcmV0dXJuIGhhc2g7XG59XG53YXRjaChcbiAgKCkgPT4ge1xuICAgIHJldHVybiBwcm9wcy5jb2x1bW5zO1xuICB9LFxuICAodmFsdWUpID0+IHtcbiAgICBzZXRDdXJyZW50VmFsdWUodmFsdWUpO1xuICB9XG4pO1xuXG5jb25zdCBpbml0ID0gYXN5bmMgKCkgPT4ge1xuICBzZXRDdXJyZW50VmFsdWUocHJvcHMuY29sdW1ucyk7XG4gIGNvbnN0IHN0b3JlZE9wdGlvbnMgPSBhd2FpdCBnZXRPcHRpb25zRnJvbVN0b3JhZ2UoKTtcbiAgaWYgKHN0b3JlZE9wdGlvbnMpIHtcbiAgICBjb25zdCBzdG9yZUhhc2ggPSBnZXRDb2x1bW5zSGFzaChzdG9yZWRPcHRpb25zKTtcbiAgICBjb25zdCBvcHRpb25IYXNoID0gZ2V0Q29sdW1uc0hhc2gob3JpZ2luYWwudmFsdWUpO1xuICAgIGlmIChvcHRpb25IYXNoICE9PSBzdG9yZUhhc2gpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiY29sdW1ucyBjaGFuZ2VkLCBpZ25vcmUgbG9jYWwgc3RvcmFnZVwiKTtcbiAgICAgIC8vIOWmguaenOWtl+auteWIl+aciei/h+S/ruaUue+8jOWImeS4jeS9v+eUqOacrOWcsOiuvue9rlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjdXJyZW50Q29sdW1ucy52YWx1ZSA9IHN0b3JlZE9wdGlvbnM7XG4gICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICBhd2FpdCBzdWJtaXQodHJ1ZSk7XG4gIH1cbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZShjaGFuZ2U6IChjdXJyZW50Q29sdW1uczogUmVmPENvbHVtbnNGaWx0ZXJJdGVtW10+KSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gIGF3YWl0IGNoYW5nZShjdXJyZW50Q29sdW1ucyk7XG4gIGF3YWl0IGRvX3NhdmUoKTtcbn1cblxud2F0Y2goXG4gICgpID0+IHtcbiAgICByZXR1cm4gb3JpZ2luYWwudmFsdWU7XG4gIH0sXG4gIGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgIGF3YWl0IGluaXQoKTtcbiAgfSxcbiAge1xuICAgIGltbWVkaWF0ZTogdHJ1ZVxuICB9XG4pO1xuXG5kZWZpbmVFeHBvc2Uoe1xuICBzdGFydCxcbiAgc2F2ZTogZG9fc2F2ZSxcbiAgdXBkYXRlLFxuICBvcmlnaW5hbCxcbiAgY29sdW1uczogY3VycmVudENvbHVtbnNcbn0pO1xuXG5mdW5jdGlvbiBidWlsZFRleHQoZWxlbWVudDogYW55KSB7XG4gIHJldHVybiBlbGVtZW50LmxhYmVsIHx8IGVsZW1lbnQudGl0bGUgfHwgZWxlbWVudC5rZXkgfHwgX3RleHQudmFsdWUudW5uYW1lZDtcbn1cbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtdGFibGUtY29sdW1ucy1maWx0ZXItc2ltcGxlIHtcbiAgbWluLXdpZHRoOiA3NjBweDtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG59XG5cbi5mcy10YWJsZS1jb2x1bW5zLWZpbHRlciB7XG4gIDpmb2N1cyB7XG4gICAgb3V0bGluZTogMDtcbiAgfVxuXG4gIFtmbGV4fj1cImNyb3NzOmNlbnRlclwiXSB7XG4gICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG5cbiAgW2ZsZXh+PVwibWFpbjpqdXN0aWZ5XCJdIHtcbiAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgfVxuXG4gIFtmbGV4XSB7XG4gICAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuXG4gIFtmbGV4LWJveD1cIjFcIl0ge1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgICBmbGV4LXNocmluazogMTtcbiAgfVxuXG4gIFtmbGV4XSA+ICoge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gIH1cblxuICAuZWwtZHJhd2VyX19ib2R5IHtcbiAgICBoZWlnaHQ6IDA7XG4gIH1cblxuICAuZnMtZHJhd2VyLXdyYXBwZXIge1xuICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gIH1cblxuICAuZnMtZHJhd2VyLWZvb3RlciB7XG4gICAgcGFkZGluZzogMjBweDtcbiAgfVxuXG4gIC5jb21wb25lbnQtLWxpc3Qge1xuICAgIG1hcmdpbjogLTIwcHg7XG5cbiAgICAuaXRlbS1sYWJlbCB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgbWluLXdpZHRoOiAwO1xuXG4gICAgICAuYW50LWNoZWNrYm94ICsgc3BhbiB7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgfVxuICAgIH1cbiAgICAuaXRlbS1yaWdodCB7XG4gICAgICBmbGV4LXNocmluazogMTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgfVxuXG4gICAgLnRpdGxlIHtcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICB9XG5cbiAgICAuY29tcG9uZW50LS1saXN0LWl0ZW0ge1xuICAgICAgcGFkZGluZzogMTBweDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDFweDtcblxuICAgICAgJi5naG9zdCB7XG4gICAgICAgIG9wYWNpdHk6IDAuNTtcbiAgICAgIH1cblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICAgICAgfVxuXG4gICAgICAuY29tcG9uZW50LS1saXN0LWl0ZW0taGFuZGxlIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgICAgIGN1cnNvcjogbW92ZTtcblxuICAgICAgICAmLmRpc2FibGVkIHtcbiAgICAgICAgICBvcGFjaXR5OiAwLjM7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtdG9vbGJhclwiPlxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBrZXkpIG9mIGNvbXB1dGVkQnV0dG9uc1wiIDprZXk9XCJrZXlcIj5cbiAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXRlbS5zaG93ICE9PSBmYWxzZVwiPlxuICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgOmlzPVwidWkucG9wb3Zlci5uYW1lXCJcbiAgICAgICAgICB2LWlmPVwia2V5ID09PSAnY29sdW1ucycgJiYgY29sdW1uc0ZpbHRlciAmJiBjb2x1bW5zRmlsdGVyPy5tb2RlID09PSAnc2ltcGxlJ1wiXG4gICAgICAgICAgdi1tb2RlbDpbdWkucG9wb3Zlci52aXNpYmxlXT1cInBvcG92ZXJWaXNpYmxlXCJcbiAgICAgICAgICBkaXNwbGF5LWRpcmVjdGl2ZT1cInNob3dcIlxuICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgOndpZHRoPVwiNzYwXCJcbiAgICAgICAgICB0cmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgICA+XG4gICAgICAgICAgPHRlbXBsYXRlICNbdWkucG9wb3Zlci50cmlnZ2VyU2xvdE5hbWVdPlxuICAgICAgICAgICAgPGZzLWJ1dHRvbiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrPVwiaGFuZGxlU2ltcGxlQ2xpY2tcIiAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPHRlbXBsYXRlICNbdWkucG9wb3Zlci5jb250ZW50U2xvdE5hbWVdPlxuICAgICAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgICAgICA6aXM9XCJjb2x1bW5zRmlsdGVyLmlzIHx8ICdmcy10YWJsZS1jb2x1bW5zLWZpbHRlcidcIlxuICAgICAgICAgICAgICB2LWlmPVwiY29sdW1uc1wiXG4gICAgICAgICAgICAgIHJlZj1cImNvbHVtbnNGaWx0ZXJSZWZcIlxuICAgICAgICAgICAgICB2LW1vZGVsOnNob3c9XCJwb3BvdmVyVmlzaWJsZVwiXG4gICAgICAgICAgICAgIG1vZGU9XCJzaW1wbGVcIlxuICAgICAgICAgICAgICB2LWJpbmQ9XCJjb2x1bW5zRmlsdGVyXCJcbiAgICAgICAgICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgICAgICAgICAgOnN0b3JhZ2U9XCJzdG9yYWdlXCJcbiAgICAgICAgICAgICAgQHVwZGF0ZTpjb2x1bW5zPVwiJGVtaXQoJ3VwZGF0ZTpjb2x1bW5zJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICA8ZnMtYnV0dG9uIHYtZWxzZSB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrPVwiaXRlbS5jbGljaygpXCIgLz5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8Y29tcG9uZW50XG4gICAgICA6aXM9XCJjb2x1bW5zRmlsdGVyLmlzIHx8ICdmcy10YWJsZS1jb2x1bW5zLWZpbHRlcidcIlxuICAgICAgdi1pZj1cImNvbHVtbnMgJiYgY29sdW1uc0ZpbHRlcj8ubW9kZSAhPT0gJ3NpbXBsZSdcIlxuICAgICAgcmVmPVwiY29sdW1uc0ZpbHRlclJlZlwiXG4gICAgICA6c3RvcmFnZT1cInN0b3JhZ2VcIlxuICAgICAgdi1iaW5kPVwiY29sdW1uc0ZpbHRlclwiXG4gICAgICA6Y29sdW1ucz1cImNvbHVtbnNcIlxuICAgICAgQHVwZGF0ZTpjb2x1bW5zPVwiJGVtaXQoJ3VwZGF0ZTpjb2x1bW5zJywgJGV2ZW50KVwiXG4gICAgLz5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IEZzVGFibGVDb2x1bW5zRmlsdGVyIGZyb20gXCIuL2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyL2luZGV4LnZ1ZVwiO1xuaW1wb3J0IHsgc29ydEJ5IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgUHJvcFR5cGUsIHJlZiwgUmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgQnV0dG9uUHJvcHMsIEJ1dHRvbnNQcm9wcywgVGFibGVDb2x1bW5zUHJvcHMgfSBmcm9tIFwiLi4vLi4vZFwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UsIHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuLyoqXG4gKiDlt6XlhbfmnaFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1Rvb2xiYXJcIixcbiAgY29tcG9uZW50czogeyBGc1RhYmxlQ29sdW1uc0ZpbHRlciB9LFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaMiemSrumFjee9rlxuICAgICAqe1xuICAgICAqICAgc2VhcmNoOnt9LCDmn6Xor6JcbiAgICAgKiAgIHJlZnJlc2g6e30sIOWIt+aWsFxuICAgICAqICAgY29tcGFjdDp7fSwg57Sn5YeR5qih5byPXG4gICAgICogICBleHBvcnQ6e30sIOWvvOWHulxuICAgICAqICAgY29sdW1uczp7fSDliJforr7nva5cbiAgICAgKn1cbiAgICAgKiovXG4gICAgYnV0dG9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlvZPliY3mmK/lkKbntKflh5HmqKHlvI9cbiAgICAgKi9cbiAgICBjb21wYWN0OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5YiX6YWN572uXG4gICAgICovXG4gICAgY29sdW1uczoge1xuICAgICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPFRhYmxlQ29sdW1uc1Byb3BzPixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5piv5ZCm5L+d5a2Y55So5oi35YiX6K6+572uXG4gICAgICog5Lygc3RyaW5n5YiZ6KGo56S65Lyg5YWl57yT5a2Y55qE5Li7a2V5XG4gICAgICovXG4gICAgc3RvcmFnZToge1xuICAgICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmj5Lmp71cbiAgICAgKi9cbiAgICBzbG90czoge30sXG5cbiAgICAvKipcbiAgICAgKiDliJforr7nva7phY3nva5cbiAgICAgKi9cbiAgICBjb2x1bW5zRmlsdGVyOiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8YW55PlxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcInVwZGF0ZTpjb2x1bW5zXCJdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHgpIHtcbiAgICBjb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcbiAgICBjb25zdCBjb2x1bW5zRmlsdGVyUmVmOiBSZWYgPSByZWYoKTtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdEJ1dHRvbnM6IEJ1dHRvbnNQcm9wczx2b2lkPiA9IHtcbiAgICAgICAgY29sdW1uczoge1xuICAgICAgICAgIGNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBjb2x1bW5zRmlsdGVyUmVmLnZhbHVlLnN0YXJ0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBtZXJnZShkZWZhdWx0QnV0dG9ucywgcHJvcHMuYnV0dG9ucyk7XG4gICAgICAvLyBpZiAoZGVmYXVsdEJ1dHRvbnMuc2VhcmNoKSB7XG4gICAgICAvLyAgIGRlZmF1bHRCdXR0b25zLnNlYXJjaC50eXBlID0gcHJvcHMuc2VhcmNoID8gXCJwcmltYXJ5XCIgOiBcImRlZmF1bHRcIjtcbiAgICAgIC8vIH1cbiAgICAgIC8vIGlmIChkZWZhdWx0QnV0dG9ucy5jb21wYWN0KSB7XG4gICAgICAvLyAgIGRlZmF1bHRCdXR0b25zLmNvbXBhY3QudHlwZSA9IHByb3BzLmNvbXBhY3QgPyBcInByaW1hcnlcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgLy8gfVxuXG4gICAgICBsZXQgc29ydEFycjogQnV0dG9uUHJvcHNbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgZGVmYXVsdEJ1dHRvbnNLZXkgaW4gZGVmYXVsdEJ1dHRvbnMpIHtcbiAgICAgICAgc29ydEFyci5wdXNoKHtcbiAgICAgICAgICAuLi5kZWZhdWx0QnV0dG9uc1tkZWZhdWx0QnV0dG9uc0tleV0sXG4gICAgICAgICAgX2tleTogZGVmYXVsdEJ1dHRvbnNLZXlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzb3J0QXJyID0gc29ydEJ5KHNvcnRBcnIsIChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLm9yZGVyID8/IENvbnN0YW50cy5vcmRlckRlZmF1bHQ7XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc29ydGVkQnV0dG9uczogQnV0dG9uc1Byb3BzPHZvaWQ+ID0ge307XG5cbiAgICAgIHNvcnRBcnIuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBsZXQgX2tleSA9IGl0ZW0uX2tleTtcbiAgICAgICAgZGVsZXRlIGl0ZW0uX2tleTtcbiAgICAgICAgc29ydGVkQnV0dG9uc1tfa2V5XSA9IGl0ZW07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzb3J0ZWRCdXR0b25zO1xuICAgIH0pO1xuICAgIGNvbnN0IHBvcG92ZXJWaXNpYmxlID0gcmVmKGZhbHNlKTtcbiAgICBjb25zdCBoYW5kbGVTaW1wbGVDbGljayA9ICgpID0+IHtcbiAgICAgIGlmICh1aS50eXBlID09PSBcImVsZW1lbnRcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwb3BvdmVyVmlzaWJsZS52YWx1ZSA9ICFwb3BvdmVyVmlzaWJsZS52YWx1ZTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIGNvbHVtbnNGaWx0ZXJSZWYsXG4gICAgICBjb21wdXRlZEJ1dHRvbnMsXG4gICAgICBwb3BvdmVyVmlzaWJsZSxcbiAgICAgIGhhbmRsZVNpbXBsZUNsaWNrXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXRvb2xiYXIge1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5mcy1idXR0b24ge1xuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy10b29sYmFyXCI+XG4gICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGtleSkgb2YgY29tcHV0ZWRCdXR0b25zXCIgOmtleT1cImtleVwiPlxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpdGVtLnNob3cgIT09IGZhbHNlXCI+XG4gICAgICAgIDxjb21wb25lbnRcbiAgICAgICAgICA6aXM9XCJ1aS5wb3BvdmVyLm5hbWVcIlxuICAgICAgICAgIHYtaWY9XCJrZXkgPT09ICdjb2x1bW5zJyAmJiBjb2x1bW5zRmlsdGVyICYmIGNvbHVtbnNGaWx0ZXI/Lm1vZGUgPT09ICdzaW1wbGUnXCJcbiAgICAgICAgICB2LW1vZGVsOlt1aS5wb3BvdmVyLnZpc2libGVdPVwicG9wb3ZlclZpc2libGVcIlxuICAgICAgICAgIGRpc3BsYXktZGlyZWN0aXZlPVwic2hvd1wiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICA6d2lkdGg9XCI3NjBcIlxuICAgICAgICAgIHRyaWdnZXI9XCJjbGlja1wiXG4gICAgICAgID5cbiAgICAgICAgICA8dGVtcGxhdGUgI1t1aS5wb3BvdmVyLnRyaWdnZXJTbG90TmFtZV0+XG4gICAgICAgICAgICA8ZnMtYnV0dG9uIHYtYmluZD1cIml0ZW1cIiBAY2xpY2s9XCJoYW5kbGVTaW1wbGVDbGlja1wiIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8dGVtcGxhdGUgI1t1aS5wb3BvdmVyLmNvbnRlbnRTbG90TmFtZV0+XG4gICAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICAgIDppcz1cImNvbHVtbnNGaWx0ZXIuaXMgfHwgJ2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyJ1wiXG4gICAgICAgICAgICAgIHYtaWY9XCJjb2x1bW5zXCJcbiAgICAgICAgICAgICAgcmVmPVwiY29sdW1uc0ZpbHRlclJlZlwiXG4gICAgICAgICAgICAgIHYtbW9kZWw6c2hvdz1cInBvcG92ZXJWaXNpYmxlXCJcbiAgICAgICAgICAgICAgbW9kZT1cInNpbXBsZVwiXG4gICAgICAgICAgICAgIHYtYmluZD1cImNvbHVtbnNGaWx0ZXJcIlxuICAgICAgICAgICAgICA6Y29sdW1ucz1cImNvbHVtbnNcIlxuICAgICAgICAgICAgICA6c3RvcmFnZT1cInN0b3JhZ2VcIlxuICAgICAgICAgICAgICBAdXBkYXRlOmNvbHVtbnM9XCIkZW1pdCgndXBkYXRlOmNvbHVtbnMnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgIDxmcy1idXR0b24gdi1lbHNlIHYtYmluZD1cIml0ZW1cIiBAY2xpY2s9XCJpdGVtLmNsaWNrKClcIiAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDxjb21wb25lbnRcbiAgICAgIDppcz1cImNvbHVtbnNGaWx0ZXIuaXMgfHwgJ2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyJ1wiXG4gICAgICB2LWlmPVwiY29sdW1ucyAmJiBjb2x1bW5zRmlsdGVyPy5tb2RlICE9PSAnc2ltcGxlJ1wiXG4gICAgICByZWY9XCJjb2x1bW5zRmlsdGVyUmVmXCJcbiAgICAgIDpzdG9yYWdlPVwic3RvcmFnZVwiXG4gICAgICB2LWJpbmQ9XCJjb2x1bW5zRmlsdGVyXCJcbiAgICAgIDpjb2x1bW5zPVwiY29sdW1uc1wiXG4gICAgICBAdXBkYXRlOmNvbHVtbnM9XCIkZW1pdCgndXBkYXRlOmNvbHVtbnMnLCAkZXZlbnQpXCJcbiAgICAvPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgRnNUYWJsZUNvbHVtbnNGaWx0ZXIgZnJvbSBcIi4vZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvaW5kZXgudnVlXCI7XG5pbXBvcnQgeyBzb3J0QnkgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBQcm9wVHlwZSwgcmVmLCBSZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBCdXR0b25Qcm9wcywgQnV0dG9uc1Byb3BzLCBUYWJsZUNvbHVtbnNQcm9wcyB9IGZyb20gXCIuLi8uLi9kXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSwgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG4vKipcbiAqIOW3peWFt+adoVxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzVG9vbGJhclwiLFxuICBjb21wb25lbnRzOiB7IEZzVGFibGVDb2x1bW5zRmlsdGVyIH0sXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uXG4gICAgICp7XG4gICAgICogICBzZWFyY2g6e30sIOafpeivolxuICAgICAqICAgcmVmcmVzaDp7fSwg5Yi35pawXG4gICAgICogICBjb21wYWN0Ont9LCDntKflh5HmqKHlvI9cbiAgICAgKiAgIGV4cG9ydDp7fSwg5a+85Ye6XG4gICAgICogICBjb2x1bW5zOnt9IOWIl+iuvue9rlxuICAgICAqfVxuICAgICAqKi9cbiAgICBidXR0b25zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW9k+WJjeaYr+WQpue0p+WHkeaooeW8j1xuICAgICAqL1xuICAgIGNvbXBhY3Q6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliJfphY3nva5cbiAgICAgKi9cbiAgICBjb2x1bW5zOiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8VGFibGVDb2x1bW5zUHJvcHM+LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKbkv53lrZjnlKjmiLfliJforr7nva5cbiAgICAgKiDkvKBzdHJpbmfliJnooajnpLrkvKDlhaXnvJPlrZjnmoTkuLtrZXlcbiAgICAgKi9cbiAgICBzdG9yYWdlOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaPkuanvVxuICAgICAqL1xuICAgIHNsb3RzOiB7fSxcblxuICAgIC8qKlxuICAgICAqIOWIl+iuvue9rumFjee9rlxuICAgICAqL1xuICAgIGNvbHVtbnNGaWx0ZXI6IHtcbiAgICAgIHR5cGU6IE9iamVjdCBhcyBQcm9wVHlwZTxhbnk+XG4gICAgfVxuICB9LFxuICBlbWl0czogW1widXBkYXRlOmNvbHVtbnNcIl0sXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eCkge1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuICAgIGNvbnN0IGNvbHVtbnNGaWx0ZXJSZWY6IFJlZiA9IHJlZigpO1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgICBjb25zdCBjb21wdXRlZEJ1dHRvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0QnV0dG9uczogQnV0dG9uc1Byb3BzPHZvaWQ+ID0ge1xuICAgICAgICBjb2x1bW5zOiB7XG4gICAgICAgICAgY2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbHVtbnNGaWx0ZXJSZWYudmFsdWUuc3RhcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIG1lcmdlKGRlZmF1bHRCdXR0b25zLCBwcm9wcy5idXR0b25zKTtcbiAgICAgIC8vIGlmIChkZWZhdWx0QnV0dG9ucy5zZWFyY2gpIHtcbiAgICAgIC8vICAgZGVmYXVsdEJ1dHRvbnMuc2VhcmNoLnR5cGUgPSBwcm9wcy5zZWFyY2ggPyBcInByaW1hcnlcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgLy8gfVxuICAgICAgLy8gaWYgKGRlZmF1bHRCdXR0b25zLmNvbXBhY3QpIHtcbiAgICAgIC8vICAgZGVmYXVsdEJ1dHRvbnMuY29tcGFjdC50eXBlID0gcHJvcHMuY29tcGFjdCA/IFwicHJpbWFyeVwiIDogXCJkZWZhdWx0XCI7XG4gICAgICAvLyB9XG5cbiAgICAgIGxldCBzb3J0QXJyOiBCdXR0b25Qcm9wc1tdID0gW107XG4gICAgICBmb3IgKGxldCBkZWZhdWx0QnV0dG9uc0tleSBpbiBkZWZhdWx0QnV0dG9ucykge1xuICAgICAgICBzb3J0QXJyLnB1c2goe1xuICAgICAgICAgIC4uLmRlZmF1bHRCdXR0b25zW2RlZmF1bHRCdXR0b25zS2V5XSxcbiAgICAgICAgICBfa2V5OiBkZWZhdWx0QnV0dG9uc0tleVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzb3J0ZWRCdXR0b25zOiBCdXR0b25zUHJvcHM8dm9pZD4gPSB7fTtcblxuICAgICAgc29ydEFyci5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGxldCBfa2V5ID0gaXRlbS5fa2V5O1xuICAgICAgICBkZWxldGUgaXRlbS5fa2V5O1xuICAgICAgICBzb3J0ZWRCdXR0b25zW19rZXldID0gaXRlbTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNvcnRlZEJ1dHRvbnM7XG4gICAgfSk7XG4gICAgY29uc3QgcG9wb3ZlclZpc2libGUgPSByZWYoZmFsc2UpO1xuICAgIGNvbnN0IGhhbmRsZVNpbXBsZUNsaWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHVpLnR5cGUgPT09IFwiZWxlbWVudFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHBvcG92ZXJWaXNpYmxlLnZhbHVlID0gIXBvcG92ZXJWaXNpYmxlLnZhbHVlO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgY29sdW1uc0ZpbHRlclJlZixcbiAgICAgIGNvbXB1dGVkQnV0dG9ucyxcbiAgICAgIHBvcG92ZXJWaXNpYmxlLFxuICAgICAgaGFuZGxlU2ltcGxlQ2xpY2tcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtdG9vbGJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgLmZzLWJ1dHRvbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIi8qKiFcbiAqIFNvcnRhYmxlIDEuMTQuMFxuICogQGF1dGhvclx0UnViYVhhICAgPHRyYXNoQHJ1YmF4YS5vcmc+XG4gKiBAYXV0aG9yXHRvd2VubSAgICA8b3dlbjIzMzU1QGdtYWlsLmNvbT5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG5cbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHtcbiAgICAgIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuXG4gIHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTtcblxuICB2YXIga2V5LCBpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTtcbiAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbnZhciB2ZXJzaW9uID0gXCIxLjE0LjBcIjtcblxuZnVuY3Rpb24gdXNlckFnZW50KHBhdHRlcm4pIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5uYXZpZ2F0b3IpIHtcbiAgICByZXR1cm4gISEgLypAX19QVVJFX18qL25hdmlnYXRvci51c2VyQWdlbnQubWF0Y2gocGF0dGVybik7XG4gIH1cbn1cblxudmFyIElFMTFPckxlc3MgPSB1c2VyQWdlbnQoLyg/OlRyaWRlbnQuKnJ2WyA6XT8xMVxcLnxtc2llfGllbW9iaWxlfFdpbmRvd3MgUGhvbmUpL2kpO1xudmFyIEVkZ2UgPSB1c2VyQWdlbnQoL0VkZ2UvaSk7XG52YXIgRmlyZUZveCA9IHVzZXJBZ2VudCgvZmlyZWZveC9pKTtcbnZhciBTYWZhcmkgPSB1c2VyQWdlbnQoL3NhZmFyaS9pKSAmJiAhdXNlckFnZW50KC9jaHJvbWUvaSkgJiYgIXVzZXJBZ2VudCgvYW5kcm9pZC9pKTtcbnZhciBJT1MgPSB1c2VyQWdlbnQoL2lQKGFkfG9kfGhvbmUpL2kpO1xudmFyIENocm9tZUZvckFuZHJvaWQgPSB1c2VyQWdlbnQoL2Nocm9tZS9pKSAmJiB1c2VyQWdlbnQoL2FuZHJvaWQvaSk7XG5cbnZhciBjYXB0dXJlTW9kZSA9IHtcbiAgY2FwdHVyZTogZmFsc2UsXG4gIHBhc3NpdmU6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBvbihlbCwgZXZlbnQsIGZuKSB7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCAhSUUxMU9yTGVzcyAmJiBjYXB0dXJlTW9kZSk7XG59XG5cbmZ1bmN0aW9uIG9mZihlbCwgZXZlbnQsIGZuKSB7XG4gIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCAhSUUxMU9yTGVzcyAmJiBjYXB0dXJlTW9kZSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXMoXG4vKipIVE1MRWxlbWVudCovXG5lbCxcbi8qKlN0cmluZyovXG5zZWxlY3Rvcikge1xuICBpZiAoIXNlbGVjdG9yKSByZXR1cm47XG4gIHNlbGVjdG9yWzBdID09PSAnPicgJiYgKHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyaW5nKDEpKTtcblxuICBpZiAoZWwpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGVsLm1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIGVsLm1hdGNoZXMoc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmIChlbC5tc01hdGNoZXNTZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZWwubXNNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmIChlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVsLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50T3JIb3N0KGVsKSB7XG4gIHJldHVybiBlbC5ob3N0ICYmIGVsICE9PSBkb2N1bWVudCAmJiBlbC5ob3N0Lm5vZGVUeXBlID8gZWwuaG9zdCA6IGVsLnBhcmVudE5vZGU7XG59XG5cbmZ1bmN0aW9uIGNsb3Nlc3QoXG4vKipIVE1MRWxlbWVudCovXG5lbCxcbi8qKlN0cmluZyovXG5zZWxlY3Rvcixcbi8qKkhUTUxFbGVtZW50Ki9cbmN0eCwgaW5jbHVkZUNUWCkge1xuICBpZiAoZWwpIHtcbiAgICBjdHggPSBjdHggfHwgZG9jdW1lbnQ7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCAmJiAoc2VsZWN0b3JbMF0gPT09ICc+JyA/IGVsLnBhcmVudE5vZGUgPT09IGN0eCAmJiBtYXRjaGVzKGVsLCBzZWxlY3RvcikgOiBtYXRjaGVzKGVsLCBzZWxlY3RvcikpIHx8IGluY2x1ZGVDVFggJiYgZWwgPT09IGN0eCkge1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbCA9PT0gY3R4KSBicmVhaztcbiAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgICB9IHdoaWxlIChlbCA9IGdldFBhcmVudE9ySG9zdChlbCkpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBSX1NQQUNFID0gL1xccysvZztcblxuZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWwsIG5hbWUsIHN0YXRlKSB7XG4gIGlmIChlbCAmJiBuYW1lKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdCkge1xuICAgICAgZWwuY2xhc3NMaXN0W3N0YXRlID8gJ2FkZCcgOiAncmVtb3ZlJ10obmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjbGFzc05hbWUgPSAoJyAnICsgZWwuY2xhc3NOYW1lICsgJyAnKS5yZXBsYWNlKFJfU1BBQ0UsICcgJykucmVwbGFjZSgnICcgKyBuYW1lICsgJyAnLCAnICcpO1xuICAgICAgZWwuY2xhc3NOYW1lID0gKGNsYXNzTmFtZSArIChzdGF0ZSA/ICcgJyArIG5hbWUgOiAnJykpLnJlcGxhY2UoUl9TUEFDRSwgJyAnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3NzKGVsLCBwcm9wLCB2YWwpIHtcbiAgdmFyIHN0eWxlID0gZWwgJiYgZWwuc3R5bGU7XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgaWYgKHZhbCA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgICAgICB2YWwgPSBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsLCAnJyk7XG4gICAgICB9IGVsc2UgaWYgKGVsLmN1cnJlbnRTdHlsZSkge1xuICAgICAgICB2YWwgPSBlbC5jdXJyZW50U3R5bGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9wID09PSB2b2lkIDAgPyB2YWwgOiB2YWxbcHJvcF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghKHByb3AgaW4gc3R5bGUpICYmIHByb3AuaW5kZXhPZignd2Via2l0JykgPT09IC0xKSB7XG4gICAgICAgIHByb3AgPSAnLXdlYmtpdC0nICsgcHJvcDtcbiAgICAgIH1cblxuICAgICAgc3R5bGVbcHJvcF0gPSB2YWwgKyAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyAnJyA6ICdweCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXRyaXgoZWwsIHNlbGZPbmx5KSB7XG4gIHZhciBhcHBsaWVkVHJhbnNmb3JtcyA9ICcnO1xuXG4gIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgYXBwbGllZFRyYW5zZm9ybXMgPSBlbDtcbiAgfSBlbHNlIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdHJhbnNmb3JtID0gY3NzKGVsLCAndHJhbnNmb3JtJyk7XG5cbiAgICAgIGlmICh0cmFuc2Zvcm0gJiYgdHJhbnNmb3JtICE9PSAnbm9uZScpIHtcbiAgICAgICAgYXBwbGllZFRyYW5zZm9ybXMgPSB0cmFuc2Zvcm0gKyAnICcgKyBhcHBsaWVkVHJhbnNmb3JtcztcbiAgICAgIH1cbiAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuICAgIH0gd2hpbGUgKCFzZWxmT25seSAmJiAoZWwgPSBlbC5wYXJlbnROb2RlKSk7XG4gIH1cblxuICB2YXIgbWF0cml4Rm4gPSB3aW5kb3cuRE9NTWF0cml4IHx8IHdpbmRvdy5XZWJLaXRDU1NNYXRyaXggfHwgd2luZG93LkNTU01hdHJpeCB8fCB3aW5kb3cuTVNDU1NNYXRyaXg7XG4gIC8qanNoaW50IC1XMDU2ICovXG5cbiAgcmV0dXJuIG1hdHJpeEZuICYmIG5ldyBtYXRyaXhGbihhcHBsaWVkVHJhbnNmb3Jtcyk7XG59XG5cbmZ1bmN0aW9uIGZpbmQoY3R4LCB0YWdOYW1lLCBpdGVyYXRvcikge1xuICBpZiAoY3R4KSB7XG4gICAgdmFyIGxpc3QgPSBjdHguZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSksXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBuID0gbGlzdC5sZW5ndGg7XG5cbiAgICBpZiAoaXRlcmF0b3IpIHtcbiAgICAgIGZvciAoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdG9yKGxpc3RbaV0sIGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCkge1xuICB2YXIgc2Nyb2xsaW5nRWxlbWVudCA9IGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQ7XG5cbiAgaWYgKHNjcm9sbGluZ0VsZW1lbnQpIHtcbiAgICByZXR1cm4gc2Nyb2xsaW5nRWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIFwiYm91bmRpbmcgY2xpZW50IHJlY3RcIiBvZiBnaXZlbiBlbGVtZW50XG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgICAgICAgICAgICAgICAgIFRoZSBlbGVtZW50IHdob3NlIGJvdW5kaW5nQ2xpZW50UmVjdCBpcyB3YW50ZWRcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gcmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jayAgV2hldGhlciB0aGUgcmVjdCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5pbmcgYmxvY2sgb2YgKGluY2x1ZGluZykgdGhlIGNvbnRhaW5lclxuICogQHBhcmFtICB7W0Jvb2xlYW5dfSByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50ICBXaGV0aGVyIHRoZSByZWN0IHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcmVsYXRpdmUgcGFyZW50IG9mIChpbmNsdWRpbmcpIHRoZSBjb250YWllbnJcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gdW5kb1NjYWxlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgY29udGFpbmVyJ3Mgc2NhbGUoKSBzaG91bGQgYmUgdW5kb25lXG4gKiBAcGFyYW0gIHtbSFRNTEVsZW1lbnRdfSBjb250YWluZXIgICAgICAgICAgICAgIFRoZSBwYXJlbnQgdGhlIGVsZW1lbnQgd2lsbCBiZSBwbGFjZWQgaW5cbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJvdW5kaW5nQ2xpZW50UmVjdCBvZiBlbCwgd2l0aCBzcGVjaWZpZWQgYWRqdXN0bWVudHNcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFJlY3QoZWwsIHJlbGF0aXZlVG9Db250YWluaW5nQmxvY2ssIHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQsIHVuZG9TY2FsZSwgY29udGFpbmVyKSB7XG4gIGlmICghZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmIGVsICE9PSB3aW5kb3cpIHJldHVybjtcbiAgdmFyIGVsUmVjdCwgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCBoZWlnaHQsIHdpZHRoO1xuXG4gIGlmIChlbCAhPT0gd2luZG93ICYmIGVsLnBhcmVudE5vZGUgJiYgZWwgIT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkge1xuICAgIGVsUmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRvcCA9IGVsUmVjdC50b3A7XG4gICAgbGVmdCA9IGVsUmVjdC5sZWZ0O1xuICAgIGJvdHRvbSA9IGVsUmVjdC5ib3R0b207XG4gICAgcmlnaHQgPSBlbFJlY3QucmlnaHQ7XG4gICAgaGVpZ2h0ID0gZWxSZWN0LmhlaWdodDtcbiAgICB3aWR0aCA9IGVsUmVjdC53aWR0aDtcbiAgfSBlbHNlIHtcbiAgICB0b3AgPSAwO1xuICAgIGxlZnQgPSAwO1xuICAgIGJvdHRvbSA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICByaWdodCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICB9XG5cbiAgaWYgKChyZWxhdGl2ZVRvQ29udGFpbmluZ0Jsb2NrIHx8IHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQpICYmIGVsICE9PSB3aW5kb3cpIHtcbiAgICAvLyBBZGp1c3QgZm9yIHRyYW5zbGF0ZSgpXG4gICAgY29udGFpbmVyID0gY29udGFpbmVyIHx8IGVsLnBhcmVudE5vZGU7IC8vIHNvbHZlcyAjMTEyMyAoc2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzc5NTM4MDYvNjA4ODMxMilcbiAgICAvLyBOb3QgbmVlZGVkIG9uIDw9IElFMTFcblxuICAgIGlmICghSUUxMU9yTGVzcykge1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoY29udGFpbmVyICYmIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QgJiYgKGNzcyhjb250YWluZXIsICd0cmFuc2Zvcm0nKSAhPT0gJ25vbmUnIHx8IHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQgJiYgY3NzKGNvbnRhaW5lciwgJ3Bvc2l0aW9uJykgIT09ICdzdGF0aWMnKSkge1xuICAgICAgICAgIHZhciBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyAvLyBTZXQgcmVsYXRpdmUgdG8gZWRnZXMgb2YgcGFkZGluZyBib3ggb2YgY29udGFpbmVyXG5cbiAgICAgICAgICB0b3AgLT0gY29udGFpbmVyUmVjdC50b3AgKyBwYXJzZUludChjc3MoY29udGFpbmVyLCAnYm9yZGVyLXRvcC13aWR0aCcpKTtcbiAgICAgICAgICBsZWZ0IC09IGNvbnRhaW5lclJlY3QubGVmdCArIHBhcnNlSW50KGNzcyhjb250YWluZXIsICdib3JkZXItbGVmdC13aWR0aCcpKTtcbiAgICAgICAgICBib3R0b20gPSB0b3AgKyBlbFJlY3QuaGVpZ2h0O1xuICAgICAgICAgIHJpZ2h0ID0gbGVmdCArIGVsUmVjdC53aWR0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG5cbiAgICAgIH0gd2hpbGUgKGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodW5kb1NjYWxlICYmIGVsICE9PSB3aW5kb3cpIHtcbiAgICAvLyBBZGp1c3QgZm9yIHNjYWxlKClcbiAgICB2YXIgZWxNYXRyaXggPSBtYXRyaXgoY29udGFpbmVyIHx8IGVsKSxcbiAgICAgICAgc2NhbGVYID0gZWxNYXRyaXggJiYgZWxNYXRyaXguYSxcbiAgICAgICAgc2NhbGVZID0gZWxNYXRyaXggJiYgZWxNYXRyaXguZDtcblxuICAgIGlmIChlbE1hdHJpeCkge1xuICAgICAgdG9wIC89IHNjYWxlWTtcbiAgICAgIGxlZnQgLz0gc2NhbGVYO1xuICAgICAgd2lkdGggLz0gc2NhbGVYO1xuICAgICAgaGVpZ2h0IC89IHNjYWxlWTtcbiAgICAgIGJvdHRvbSA9IHRvcCArIGhlaWdodDtcbiAgICAgIHJpZ2h0ID0gbGVmdCArIHdpZHRoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiB0b3AsXG4gICAgbGVmdDogbGVmdCxcbiAgICBib3R0b206IGJvdHRvbSxcbiAgICByaWdodDogcmlnaHQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59XG4vKipcbiAqIENoZWNrcyBpZiBhIHNpZGUgb2YgYW4gZWxlbWVudCBpcyBzY3JvbGxlZCBwYXN0IGEgc2lkZSBvZiBpdHMgcGFyZW50c1xuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICBlbCAgICAgICAgICAgVGhlIGVsZW1lbnQgd2hvJ3Mgc2lkZSBiZWluZyBzY3JvbGxlZCBvdXQgb2YgdmlldyBpcyBpbiBxdWVzdGlvblxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICBlbFNpZGUgICAgICAgU2lkZSBvZiB0aGUgZWxlbWVudCBpbiBxdWVzdGlvbiAoJ3RvcCcsICdsZWZ0JywgJ3JpZ2h0JywgJ2JvdHRvbScpXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgIHBhcmVudFNpZGUgICBTaWRlIG9mIHRoZSBwYXJlbnQgaW4gcXVlc3Rpb24gKCd0b3AnLCAnbGVmdCcsICdyaWdodCcsICdib3R0b20nKVxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9ICAgICAgICAgICAgICAgVGhlIHBhcmVudCBzY3JvbGwgZWxlbWVudCB0aGF0IHRoZSBlbCdzIHNpZGUgaXMgc2Nyb2xsZWQgcGFzdCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIGlzU2Nyb2xsZWRQYXN0KGVsLCBlbFNpZGUsIHBhcmVudFNpZGUpIHtcbiAgdmFyIHBhcmVudCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsLCB0cnVlKSxcbiAgICAgIGVsU2lkZVZhbCA9IGdldFJlY3QoZWwpW2VsU2lkZV07XG4gIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuICB3aGlsZSAocGFyZW50KSB7XG4gICAgdmFyIHBhcmVudFNpZGVWYWwgPSBnZXRSZWN0KHBhcmVudClbcGFyZW50U2lkZV0sXG4gICAgICAgIHZpc2libGUgPSB2b2lkIDA7XG5cbiAgICBpZiAocGFyZW50U2lkZSA9PT0gJ3RvcCcgfHwgcGFyZW50U2lkZSA9PT0gJ2xlZnQnKSB7XG4gICAgICB2aXNpYmxlID0gZWxTaWRlVmFsID49IHBhcmVudFNpZGVWYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2libGUgPSBlbFNpZGVWYWwgPD0gcGFyZW50U2lkZVZhbDtcbiAgICB9XG5cbiAgICBpZiAoIXZpc2libGUpIHJldHVybiBwYXJlbnQ7XG4gICAgaWYgKHBhcmVudCA9PT0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpKSBicmVhaztcbiAgICBwYXJlbnQgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChwYXJlbnQsIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogR2V0cyBudGggY2hpbGQgb2YgZWwsIGlnbm9yaW5nIGhpZGRlbiBjaGlsZHJlbiwgc29ydGFibGUncyBlbGVtZW50cyAoZG9lcyBub3QgaWdub3JlIGNsb25lIGlmIGl0J3MgdmlzaWJsZSlcbiAqIGFuZCBub24tZHJhZ2dhYmxlIGVsZW1lbnRzXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgVGhlIHBhcmVudCBlbGVtZW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGNoaWxkTnVtICAgICAgVGhlIGluZGV4IG9mIHRoZSBjaGlsZFxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zICAgICAgIFBhcmVudCBTb3J0YWJsZSdzIG9wdGlvbnNcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICBUaGUgY2hpbGQgYXQgaW5kZXggY2hpbGROdW0sIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRDaGlsZChlbCwgY2hpbGROdW0sIG9wdGlvbnMsIGluY2x1ZGVEcmFnRWwpIHtcbiAgdmFyIGN1cnJlbnRDaGlsZCA9IDAsXG4gICAgICBpID0gMCxcbiAgICAgIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47XG5cbiAgd2hpbGUgKGkgPCBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBpZiAoY2hpbGRyZW5baV0uc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnICYmIGNoaWxkcmVuW2ldICE9PSBTb3J0YWJsZS5naG9zdCAmJiAoaW5jbHVkZURyYWdFbCB8fCBjaGlsZHJlbltpXSAhPT0gU29ydGFibGUuZHJhZ2dlZCkgJiYgY2xvc2VzdChjaGlsZHJlbltpXSwgb3B0aW9ucy5kcmFnZ2FibGUsIGVsLCBmYWxzZSkpIHtcbiAgICAgIGlmIChjdXJyZW50Q2hpbGQgPT09IGNoaWxkTnVtKSB7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbltpXTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudENoaWxkKys7XG4gICAgfVxuXG4gICAgaSsrO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdldHMgdGhlIGxhc3QgY2hpbGQgaW4gdGhlIGVsLCBpZ25vcmluZyBnaG9zdEVsIG9yIGludmlzaWJsZSBlbGVtZW50cyAoY2xvbmVzKVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgICAgIFBhcmVudCBlbGVtZW50XG4gKiBAcGFyYW0gIHtzZWxlY3Rvcn0gc2VsZWN0b3IgICAgQW55IG90aGVyIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWRcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICBUaGUgbGFzdCBjaGlsZCwgaWdub3JpbmcgZ2hvc3RFbFxuICovXG5cblxuZnVuY3Rpb24gbGFzdENoaWxkKGVsLCBzZWxlY3Rvcikge1xuICB2YXIgbGFzdCA9IGVsLmxhc3RFbGVtZW50Q2hpbGQ7XG5cbiAgd2hpbGUgKGxhc3QgJiYgKGxhc3QgPT09IFNvcnRhYmxlLmdob3N0IHx8IGNzcyhsYXN0LCAnZGlzcGxheScpID09PSAnbm9uZScgfHwgc2VsZWN0b3IgJiYgIW1hdGNoZXMobGFzdCwgc2VsZWN0b3IpKSkge1xuICAgIGxhc3QgPSBsYXN0LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbGFzdCB8fCBudWxsO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBhbiBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50IGZvciBhIHNlbGVjdGVkIHNldCBvZlxuICogZWxlbWVudHNcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbFxuICogQHBhcmFtICB7c2VsZWN0b3J9IHNlbGVjdG9yXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblxuXG5mdW5jdGlvbiBpbmRleChlbCwgc2VsZWN0b3IpIHtcbiAgdmFyIGluZGV4ID0gMDtcblxuICBpZiAoIWVsIHx8ICFlbC5wYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuXG4gIHdoaWxlIChlbCA9IGVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHtcbiAgICBpZiAoZWwubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gJ1RFTVBMQVRFJyAmJiBlbCAhPT0gU29ydGFibGUuY2xvbmUgJiYgKCFzZWxlY3RvciB8fCBtYXRjaGVzKGVsLCBzZWxlY3RvcikpKSB7XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmRleDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgc2Nyb2xsIG9mZnNldCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgYWRkZWQgd2l0aCBhbGwgdGhlIHNjcm9sbCBvZmZzZXRzIG9mIHBhcmVudCBlbGVtZW50cy5cbiAqIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCBpbiByZWFsIHBpeGVscy5cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbFxuICogQHJldHVybiB7QXJyYXl9ICAgICAgICAgICAgIE9mZnNldHMgaW4gdGhlIGZvcm1hdCBvZiBbbGVmdCwgdG9wXVxuICovXG5cblxuZnVuY3Rpb24gZ2V0UmVsYXRpdmVTY3JvbGxPZmZzZXQoZWwpIHtcbiAgdmFyIG9mZnNldExlZnQgPSAwLFxuICAgICAgb2Zmc2V0VG9wID0gMCxcbiAgICAgIHdpblNjcm9sbGVyID0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuXG4gIGlmIChlbCkge1xuICAgIGRvIHtcbiAgICAgIHZhciBlbE1hdHJpeCA9IG1hdHJpeChlbCksXG4gICAgICAgICAgc2NhbGVYID0gZWxNYXRyaXguYSxcbiAgICAgICAgICBzY2FsZVkgPSBlbE1hdHJpeC5kO1xuICAgICAgb2Zmc2V0TGVmdCArPSBlbC5zY3JvbGxMZWZ0ICogc2NhbGVYO1xuICAgICAgb2Zmc2V0VG9wICs9IGVsLnNjcm9sbFRvcCAqIHNjYWxlWTtcbiAgICB9IHdoaWxlIChlbCAhPT0gd2luU2Nyb2xsZXIgJiYgKGVsID0gZWwucGFyZW50Tm9kZSkpO1xuICB9XG5cbiAgcmV0dXJuIFtvZmZzZXRMZWZ0LCBvZmZzZXRUb3BdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IHdpdGhpbiB0aGUgZ2l2ZW4gYXJyYXlcbiAqIEBwYXJhbSAge0FycmF5fSBhcnIgICBBcnJheSB0aGF0IG1heSBvciBtYXkgbm90IGhvbGQgdGhlIG9iamVjdFxuICogQHBhcmFtICB7T2JqZWN0fSBvYmogIEFuIG9iamVjdCB0aGF0IGhhcyBhIGtleS12YWx1ZSBwYWlyIHVuaXF1ZSB0byBhbmQgaWRlbnRpY2FsIHRvIGEga2V5LXZhbHVlIHBhaXIgaW4gdGhlIG9iamVjdCB5b3Ugd2FudCB0byBmaW5kXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgVGhlIGluZGV4IG9mIHRoZSBvYmplY3QgaW4gdGhlIGFycmF5LCBvciAtMVxuICovXG5cblxuZnVuY3Rpb24gaW5kZXhPZk9iamVjdChhcnIsIG9iaikge1xuICBmb3IgKHZhciBpIGluIGFycikge1xuICAgIGlmICghYXJyLmhhc093blByb3BlcnR5KGkpKSBjb250aW51ZTtcblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSAmJiBvYmpba2V5XSA9PT0gYXJyW2ldW2tleV0pIHJldHVybiBOdW1iZXIoaSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbCwgaW5jbHVkZVNlbGYpIHtcbiAgLy8gc2tpcCB0byB3aW5kb3dcbiAgaWYgKCFlbCB8fCAhZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICB2YXIgZWxlbSA9IGVsO1xuICB2YXIgZ290U2VsZiA9IGZhbHNlO1xuXG4gIGRvIHtcbiAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGdldCBlbGVtIGNzcyBpZiBpdCBpc24ndCBldmVuIG92ZXJmbG93aW5nIGluIHRoZSBmaXJzdCBwbGFjZSAocGVyZm9ybWFuY2UpXG4gICAgaWYgKGVsZW0uY2xpZW50V2lkdGggPCBlbGVtLnNjcm9sbFdpZHRoIHx8IGVsZW0uY2xpZW50SGVpZ2h0IDwgZWxlbS5zY3JvbGxIZWlnaHQpIHtcbiAgICAgIHZhciBlbGVtQ1NTID0gY3NzKGVsZW0pO1xuXG4gICAgICBpZiAoZWxlbS5jbGllbnRXaWR0aCA8IGVsZW0uc2Nyb2xsV2lkdGggJiYgKGVsZW1DU1Mub3ZlcmZsb3dYID09ICdhdXRvJyB8fCBlbGVtQ1NTLm92ZXJmbG93WCA9PSAnc2Nyb2xsJykgfHwgZWxlbS5jbGllbnRIZWlnaHQgPCBlbGVtLnNjcm9sbEhlaWdodCAmJiAoZWxlbUNTUy5vdmVyZmxvd1kgPT0gJ2F1dG8nIHx8IGVsZW1DU1Mub3ZlcmZsb3dZID09ICdzY3JvbGwnKSkge1xuICAgICAgICBpZiAoIWVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0IHx8IGVsZW0gPT09IGRvY3VtZW50LmJvZHkpIHJldHVybiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgICAgIGlmIChnb3RTZWxmIHx8IGluY2x1ZGVTZWxmKSByZXR1cm4gZWxlbTtcbiAgICAgICAgZ290U2VsZiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuICB9IHdoaWxlIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKTtcblxuICByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xufVxuXG5mdW5jdGlvbiBleHRlbmQoZHN0LCBzcmMpIHtcbiAgaWYgKGRzdCAmJiBzcmMpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICBpZiAoc3JjLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgZHN0W2tleV0gPSBzcmNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZHN0O1xufVxuXG5mdW5jdGlvbiBpc1JlY3RFcXVhbChyZWN0MSwgcmVjdDIpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQocmVjdDEudG9wKSA9PT0gTWF0aC5yb3VuZChyZWN0Mi50b3ApICYmIE1hdGgucm91bmQocmVjdDEubGVmdCkgPT09IE1hdGgucm91bmQocmVjdDIubGVmdCkgJiYgTWF0aC5yb3VuZChyZWN0MS5oZWlnaHQpID09PSBNYXRoLnJvdW5kKHJlY3QyLmhlaWdodCkgJiYgTWF0aC5yb3VuZChyZWN0MS53aWR0aCkgPT09IE1hdGgucm91bmQocmVjdDIud2lkdGgpO1xufVxuXG52YXIgX3Rocm90dGxlVGltZW91dDtcblxuZnVuY3Rpb24gdGhyb3R0bGUoY2FsbGJhY2ssIG1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFfdGhyb3R0bGVUaW1lb3V0KSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjYWxsYmFjay5jYWxsKF90aGlzLCBhcmdzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KF90aGlzLCBhcmdzKTtcbiAgICAgIH1cblxuICAgICAgX3Rocm90dGxlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhyb3R0bGVUaW1lb3V0ID0gdm9pZCAwO1xuICAgICAgfSwgbXMpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsVGhyb3R0bGUoKSB7XG4gIGNsZWFyVGltZW91dChfdGhyb3R0bGVUaW1lb3V0KTtcbiAgX3Rocm90dGxlVGltZW91dCA9IHZvaWQgMDtcbn1cblxuZnVuY3Rpb24gc2Nyb2xsQnkoZWwsIHgsIHkpIHtcbiAgZWwuc2Nyb2xsTGVmdCArPSB4O1xuICBlbC5zY3JvbGxUb3AgKz0geTtcbn1cblxuZnVuY3Rpb24gY2xvbmUoZWwpIHtcbiAgdmFyIFBvbHltZXIgPSB3aW5kb3cuUG9seW1lcjtcbiAgdmFyICQgPSB3aW5kb3cualF1ZXJ5IHx8IHdpbmRvdy5aZXB0bztcblxuICBpZiAoUG9seW1lciAmJiBQb2x5bWVyLmRvbSkge1xuICAgIHJldHVybiBQb2x5bWVyLmRvbShlbCkuY2xvbmVOb2RlKHRydWUpO1xuICB9IGVsc2UgaWYgKCQpIHtcbiAgICByZXR1cm4gJChlbCkuY2xvbmUodHJ1ZSlbMF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVsLmNsb25lTm9kZSh0cnVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZWN0KGVsLCByZWN0KSB7XG4gIGNzcyhlbCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gIGNzcyhlbCwgJ3RvcCcsIHJlY3QudG9wKTtcbiAgY3NzKGVsLCAnbGVmdCcsIHJlY3QubGVmdCk7XG4gIGNzcyhlbCwgJ3dpZHRoJywgcmVjdC53aWR0aCk7XG4gIGNzcyhlbCwgJ2hlaWdodCcsIHJlY3QuaGVpZ2h0KTtcbn1cblxuZnVuY3Rpb24gdW5zZXRSZWN0KGVsKSB7XG4gIGNzcyhlbCwgJ3Bvc2l0aW9uJywgJycpO1xuICBjc3MoZWwsICd0b3AnLCAnJyk7XG4gIGNzcyhlbCwgJ2xlZnQnLCAnJyk7XG4gIGNzcyhlbCwgJ3dpZHRoJywgJycpO1xuICBjc3MoZWwsICdoZWlnaHQnLCAnJyk7XG59XG5cbnZhciBleHBhbmRvID0gJ1NvcnRhYmxlJyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG5mdW5jdGlvbiBBbmltYXRpb25TdGF0ZU1hbmFnZXIoKSB7XG4gIHZhciBhbmltYXRpb25TdGF0ZXMgPSBbXSxcbiAgICAgIGFuaW1hdGlvbkNhbGxiYWNrSWQ7XG4gIHJldHVybiB7XG4gICAgY2FwdHVyZUFuaW1hdGlvblN0YXRlOiBmdW5jdGlvbiBjYXB0dXJlQW5pbWF0aW9uU3RhdGUoKSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMgPSBbXTtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFuaW1hdGlvbikgcmV0dXJuO1xuICAgICAgdmFyIGNoaWxkcmVuID0gW10uc2xpY2UuY2FsbCh0aGlzLmVsLmNoaWxkcmVuKTtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGlmIChjc3MoY2hpbGQsICdkaXNwbGF5JykgPT09ICdub25lJyB8fCBjaGlsZCA9PT0gU29ydGFibGUuZ2hvc3QpIHJldHVybjtcbiAgICAgICAgYW5pbWF0aW9uU3RhdGVzLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogY2hpbGQsXG4gICAgICAgICAgcmVjdDogZ2V0UmVjdChjaGlsZClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGZyb21SZWN0ID0gX29iamVjdFNwcmVhZDIoe30sIGFuaW1hdGlvblN0YXRlc1thbmltYXRpb25TdGF0ZXMubGVuZ3RoIC0gMV0ucmVjdCk7IC8vIElmIGFuaW1hdGluZzogY29tcGVuc2F0ZSBmb3IgY3VycmVudCBhbmltYXRpb25cblxuXG4gICAgICAgIGlmIChjaGlsZC50aGlzQW5pbWF0aW9uRHVyYXRpb24pIHtcbiAgICAgICAgICB2YXIgY2hpbGRNYXRyaXggPSBtYXRyaXgoY2hpbGQsIHRydWUpO1xuXG4gICAgICAgICAgaWYgKGNoaWxkTWF0cml4KSB7XG4gICAgICAgICAgICBmcm9tUmVjdC50b3AgLT0gY2hpbGRNYXRyaXguZjtcbiAgICAgICAgICAgIGZyb21SZWN0LmxlZnQgLT0gY2hpbGRNYXRyaXguZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZC5mcm9tUmVjdCA9IGZyb21SZWN0O1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBhZGRBbmltYXRpb25TdGF0ZTogZnVuY3Rpb24gYWRkQW5pbWF0aW9uU3RhdGUoc3RhdGUpIHtcbiAgICAgIGFuaW1hdGlvblN0YXRlcy5wdXNoKHN0YXRlKTtcbiAgICB9LFxuICAgIHJlbW92ZUFuaW1hdGlvblN0YXRlOiBmdW5jdGlvbiByZW1vdmVBbmltYXRpb25TdGF0ZSh0YXJnZXQpIHtcbiAgICAgIGFuaW1hdGlvblN0YXRlcy5zcGxpY2UoaW5kZXhPZk9iamVjdChhbmltYXRpb25TdGF0ZXMsIHtcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICAgIH0pLCAxKTtcbiAgICB9LFxuICAgIGFuaW1hdGVBbGw6IGZ1bmN0aW9uIGFuaW1hdGVBbGwoY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICBjbGVhclRpbWVvdXQoYW5pbWF0aW9uQ2FsbGJhY2tJZCk7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGFuaW1hdGluZyA9IGZhbHNlLFxuICAgICAgICAgIGFuaW1hdGlvblRpbWUgPSAwO1xuICAgICAgYW5pbWF0aW9uU3RhdGVzLmZvckVhY2goZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHZhciB0aW1lID0gMCxcbiAgICAgICAgICAgIHRhcmdldCA9IHN0YXRlLnRhcmdldCxcbiAgICAgICAgICAgIGZyb21SZWN0ID0gdGFyZ2V0LmZyb21SZWN0LFxuICAgICAgICAgICAgdG9SZWN0ID0gZ2V0UmVjdCh0YXJnZXQpLFxuICAgICAgICAgICAgcHJldkZyb21SZWN0ID0gdGFyZ2V0LnByZXZGcm9tUmVjdCxcbiAgICAgICAgICAgIHByZXZUb1JlY3QgPSB0YXJnZXQucHJldlRvUmVjdCxcbiAgICAgICAgICAgIGFuaW1hdGluZ1JlY3QgPSBzdGF0ZS5yZWN0LFxuICAgICAgICAgICAgdGFyZ2V0TWF0cml4ID0gbWF0cml4KHRhcmdldCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKHRhcmdldE1hdHJpeCkge1xuICAgICAgICAgIC8vIENvbXBlbnNhdGUgZm9yIGN1cnJlbnQgYW5pbWF0aW9uXG4gICAgICAgICAgdG9SZWN0LnRvcCAtPSB0YXJnZXRNYXRyaXguZjtcbiAgICAgICAgICB0b1JlY3QubGVmdCAtPSB0YXJnZXRNYXRyaXguZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldC50b1JlY3QgPSB0b1JlY3Q7XG5cbiAgICAgICAgaWYgKHRhcmdldC50aGlzQW5pbWF0aW9uRHVyYXRpb24pIHtcbiAgICAgICAgICAvLyBDb3VsZCBhbHNvIGNoZWNrIGlmIGFuaW1hdGluZ1JlY3QgaXMgYmV0d2VlbiBmcm9tUmVjdCBhbmQgdG9SZWN0XG4gICAgICAgICAgaWYgKGlzUmVjdEVxdWFsKHByZXZGcm9tUmVjdCwgdG9SZWN0KSAmJiAhaXNSZWN0RXF1YWwoZnJvbVJlY3QsIHRvUmVjdCkgJiYgLy8gTWFrZSBzdXJlIGFuaW1hdGluZ1JlY3QgaXMgb24gbGluZSBiZXR3ZWVuIHRvUmVjdCAmIGZyb21SZWN0XG4gICAgICAgICAgKGFuaW1hdGluZ1JlY3QudG9wIC0gdG9SZWN0LnRvcCkgLyAoYW5pbWF0aW5nUmVjdC5sZWZ0IC0gdG9SZWN0LmxlZnQpID09PSAoZnJvbVJlY3QudG9wIC0gdG9SZWN0LnRvcCkgLyAoZnJvbVJlY3QubGVmdCAtIHRvUmVjdC5sZWZ0KSkge1xuICAgICAgICAgICAgLy8gSWYgcmV0dXJuaW5nIHRvIHNhbWUgcGxhY2UgYXMgc3RhcnRlZCBmcm9tIGFuaW1hdGlvbiBhbmQgb24gc2FtZSBheGlzXG4gICAgICAgICAgICB0aW1lID0gY2FsY3VsYXRlUmVhbFRpbWUoYW5pbWF0aW5nUmVjdCwgcHJldkZyb21SZWN0LCBwcmV2VG9SZWN0LCBfdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gaWYgZnJvbVJlY3QgIT0gdG9SZWN0OiBhbmltYXRlXG5cblxuICAgICAgICBpZiAoIWlzUmVjdEVxdWFsKHRvUmVjdCwgZnJvbVJlY3QpKSB7XG4gICAgICAgICAgdGFyZ2V0LnByZXZGcm9tUmVjdCA9IGZyb21SZWN0O1xuICAgICAgICAgIHRhcmdldC5wcmV2VG9SZWN0ID0gdG9SZWN0O1xuXG4gICAgICAgICAgaWYgKCF0aW1lKSB7XG4gICAgICAgICAgICB0aW1lID0gX3RoaXMub3B0aW9ucy5hbmltYXRpb247XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMuYW5pbWF0ZSh0YXJnZXQsIGFuaW1hdGluZ1JlY3QsIHRvUmVjdCwgdGltZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGltZSkge1xuICAgICAgICAgIGFuaW1hdGluZyA9IHRydWU7XG4gICAgICAgICAgYW5pbWF0aW9uVGltZSA9IE1hdGgubWF4KGFuaW1hdGlvblRpbWUsIHRpbWUpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0YXJnZXQuYW5pbWF0aW9uUmVzZXRUaW1lcik7XG4gICAgICAgICAgdGFyZ2V0LmFuaW1hdGlvblJlc2V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRhcmdldC5hbmltYXRpb25UaW1lID0gMDtcbiAgICAgICAgICAgIHRhcmdldC5wcmV2RnJvbVJlY3QgPSBudWxsO1xuICAgICAgICAgICAgdGFyZ2V0LmZyb21SZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRhcmdldC5wcmV2VG9SZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRhcmdldC50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICAgIH0sIHRpbWUpO1xuICAgICAgICAgIHRhcmdldC50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSB0aW1lO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNsZWFyVGltZW91dChhbmltYXRpb25DYWxsYmFja0lkKTtcblxuICAgICAgaWYgKCFhbmltYXRpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFuaW1hdGlvbkNhbGxiYWNrSWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuICAgICAgICB9LCBhbmltYXRpb25UaW1lKTtcbiAgICAgIH1cblxuICAgICAgYW5pbWF0aW9uU3RhdGVzID0gW107XG4gICAgfSxcbiAgICBhbmltYXRlOiBmdW5jdGlvbiBhbmltYXRlKHRhcmdldCwgY3VycmVudFJlY3QsIHRvUmVjdCwgZHVyYXRpb24pIHtcbiAgICAgIGlmIChkdXJhdGlvbikge1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNpdGlvbicsICcnKTtcbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zZm9ybScsICcnKTtcbiAgICAgICAgdmFyIGVsTWF0cml4ID0gbWF0cml4KHRoaXMuZWwpLFxuICAgICAgICAgICAgc2NhbGVYID0gZWxNYXRyaXggJiYgZWxNYXRyaXguYSxcbiAgICAgICAgICAgIHNjYWxlWSA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmQsXG4gICAgICAgICAgICB0cmFuc2xhdGVYID0gKGN1cnJlbnRSZWN0LmxlZnQgLSB0b1JlY3QubGVmdCkgLyAoc2NhbGVYIHx8IDEpLFxuICAgICAgICAgICAgdHJhbnNsYXRlWSA9IChjdXJyZW50UmVjdC50b3AgLSB0b1JlY3QudG9wKSAvIChzY2FsZVkgfHwgMSk7XG4gICAgICAgIHRhcmdldC5hbmltYXRpbmdYID0gISF0cmFuc2xhdGVYO1xuICAgICAgICB0YXJnZXQuYW5pbWF0aW5nWSA9ICEhdHJhbnNsYXRlWTtcbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUzZCgnICsgdHJhbnNsYXRlWCArICdweCwnICsgdHJhbnNsYXRlWSArICdweCwwKScpO1xuICAgICAgICB0aGlzLmZvclJlcGFpbnREdW1teSA9IHJlcGFpbnQodGFyZ2V0KTsgLy8gcmVwYWludFxuXG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2l0aW9uJywgJ3RyYW5zZm9ybSAnICsgZHVyYXRpb24gKyAnbXMnICsgKHRoaXMub3B0aW9ucy5lYXNpbmcgPyAnICcgKyB0aGlzLm9wdGlvbnMuZWFzaW5nIDogJycpKTtcbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUzZCgwLDAsMCknKTtcbiAgICAgICAgdHlwZW9mIHRhcmdldC5hbmltYXRlZCA9PT0gJ251bWJlcicgJiYgY2xlYXJUaW1lb3V0KHRhcmdldC5hbmltYXRlZCk7XG4gICAgICAgIHRhcmdldC5hbmltYXRlZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2l0aW9uJywgJycpO1xuICAgICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAnJyk7XG4gICAgICAgICAgdGFyZ2V0LmFuaW1hdGVkID0gZmFsc2U7XG4gICAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1ggPSBmYWxzZTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0aW5nWSA9IGZhbHNlO1xuICAgICAgICB9LCBkdXJhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiByZXBhaW50KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0Lm9mZnNldFdpZHRoO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVSZWFsVGltZShhbmltYXRpbmdSZWN0LCBmcm9tUmVjdCwgdG9SZWN0LCBvcHRpb25zKSB7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coZnJvbVJlY3QudG9wIC0gYW5pbWF0aW5nUmVjdC50b3AsIDIpICsgTWF0aC5wb3coZnJvbVJlY3QubGVmdCAtIGFuaW1hdGluZ1JlY3QubGVmdCwgMikpIC8gTWF0aC5zcXJ0KE1hdGgucG93KGZyb21SZWN0LnRvcCAtIHRvUmVjdC50b3AsIDIpICsgTWF0aC5wb3coZnJvbVJlY3QubGVmdCAtIHRvUmVjdC5sZWZ0LCAyKSkgKiBvcHRpb25zLmFuaW1hdGlvbjtcbn1cblxudmFyIHBsdWdpbnMgPSBbXTtcbnZhciBkZWZhdWx0cyA9IHtcbiAgaW5pdGlhbGl6ZUJ5RGVmYXVsdDogdHJ1ZVxufTtcbnZhciBQbHVnaW5NYW5hZ2VyID0ge1xuICBtb3VudDogZnVuY3Rpb24gbW91bnQocGx1Z2luKSB7XG4gICAgLy8gU2V0IGRlZmF1bHQgc3RhdGljIHByb3BlcnRpZXNcbiAgICBmb3IgKHZhciBvcHRpb24gaW4gZGVmYXVsdHMpIHtcbiAgICAgIGlmIChkZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShvcHRpb24pICYmICEob3B0aW9uIGluIHBsdWdpbikpIHtcbiAgICAgICAgcGx1Z2luW29wdGlvbl0gPSBkZWZhdWx0c1tvcHRpb25dO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKHAucGx1Z2luTmFtZSA9PT0gcGx1Z2luLnBsdWdpbk5hbWUpIHtcbiAgICAgICAgdGhyb3cgXCJTb3J0YWJsZTogQ2Fubm90IG1vdW50IHBsdWdpbiBcIi5jb25jYXQocGx1Z2luLnBsdWdpbk5hbWUsIFwiIG1vcmUgdGhhbiBvbmNlXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHBsdWdpbnMucHVzaChwbHVnaW4pO1xuICB9LFxuICBwbHVnaW5FdmVudDogZnVuY3Rpb24gcGx1Z2luRXZlbnQoZXZlbnROYW1lLCBzb3J0YWJsZSwgZXZ0KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuZXZlbnRDYW5jZWxlZCA9IGZhbHNlO1xuXG4gICAgZXZ0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmV2ZW50Q2FuY2VsZWQgPSB0cnVlO1xuICAgIH07XG5cbiAgICB2YXIgZXZlbnROYW1lR2xvYmFsID0gZXZlbnROYW1lICsgJ0dsb2JhbCc7XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIGlmICghc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdKSByZXR1cm47IC8vIEZpcmUgZ2xvYmFsIGV2ZW50cyBpZiBpdCBleGlzdHMgaW4gdGhpcyBzb3J0YWJsZVxuXG4gICAgICBpZiAoc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdW2V2ZW50TmFtZUdsb2JhbF0pIHtcbiAgICAgICAgc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdW2V2ZW50TmFtZUdsb2JhbF0oX29iamVjdFNwcmVhZDIoe1xuICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZVxuICAgICAgICB9LCBldnQpKTtcbiAgICAgIH0gLy8gT25seSBmaXJlIHBsdWdpbiBldmVudCBpZiBwbHVnaW4gaXMgZW5hYmxlZCBpbiB0aGlzIHNvcnRhYmxlLFxuICAgICAgLy8gYW5kIHBsdWdpbiBoYXMgZXZlbnQgZGVmaW5lZFxuXG5cbiAgICAgIGlmIChzb3J0YWJsZS5vcHRpb25zW3BsdWdpbi5wbHVnaW5OYW1lXSAmJiBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lXSkge1xuICAgICAgICBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lXShfb2JqZWN0U3ByZWFkMih7XG4gICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlXG4gICAgICAgIH0sIGV2dCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICBpbml0aWFsaXplUGx1Z2luczogZnVuY3Rpb24gaW5pdGlhbGl6ZVBsdWdpbnMoc29ydGFibGUsIGVsLCBkZWZhdWx0cywgb3B0aW9ucykge1xuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICB2YXIgcGx1Z2luTmFtZSA9IHBsdWdpbi5wbHVnaW5OYW1lO1xuICAgICAgaWYgKCFzb3J0YWJsZS5vcHRpb25zW3BsdWdpbk5hbWVdICYmICFwbHVnaW4uaW5pdGlhbGl6ZUJ5RGVmYXVsdCkgcmV0dXJuO1xuICAgICAgdmFyIGluaXRpYWxpemVkID0gbmV3IHBsdWdpbihzb3J0YWJsZSwgZWwsIHNvcnRhYmxlLm9wdGlvbnMpO1xuICAgICAgaW5pdGlhbGl6ZWQuc29ydGFibGUgPSBzb3J0YWJsZTtcbiAgICAgIGluaXRpYWxpemVkLm9wdGlvbnMgPSBzb3J0YWJsZS5vcHRpb25zO1xuICAgICAgc29ydGFibGVbcGx1Z2luTmFtZV0gPSBpbml0aWFsaXplZDsgLy8gQWRkIGRlZmF1bHQgb3B0aW9ucyBmcm9tIHBsdWdpblxuXG4gICAgICBfZXh0ZW5kcyhkZWZhdWx0cywgaW5pdGlhbGl6ZWQuZGVmYXVsdHMpO1xuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgb3B0aW9uIGluIHNvcnRhYmxlLm9wdGlvbnMpIHtcbiAgICAgIGlmICghc29ydGFibGUub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHRpb24pKSBjb250aW51ZTtcbiAgICAgIHZhciBtb2RpZmllZCA9IHRoaXMubW9kaWZ5T3B0aW9uKHNvcnRhYmxlLCBvcHRpb24sIHNvcnRhYmxlLm9wdGlvbnNbb3B0aW9uXSk7XG5cbiAgICAgIGlmICh0eXBlb2YgbW9kaWZpZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNvcnRhYmxlLm9wdGlvbnNbb3B0aW9uXSA9IG1vZGlmaWVkO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZ2V0RXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBnZXRFdmVudFByb3BlcnRpZXMobmFtZSwgc29ydGFibGUpIHtcbiAgICB2YXIgZXZlbnRQcm9wZXJ0aWVzID0ge307XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIGlmICh0eXBlb2YgcGx1Z2luLmV2ZW50UHJvcGVydGllcyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuXG4gICAgICBfZXh0ZW5kcyhldmVudFByb3BlcnRpZXMsIHBsdWdpbi5ldmVudFByb3BlcnRpZXMuY2FsbChzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0sIG5hbWUpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZXZlbnRQcm9wZXJ0aWVzO1xuICB9LFxuICBtb2RpZnlPcHRpb246IGZ1bmN0aW9uIG1vZGlmeU9wdGlvbihzb3J0YWJsZSwgbmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgbW9kaWZpZWRWYWx1ZTtcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgLy8gUGx1Z2luIG11c3QgZXhpc3Qgb24gdGhlIFNvcnRhYmxlXG4gICAgICBpZiAoIXNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSkgcmV0dXJuOyAvLyBJZiBzdGF0aWMgb3B0aW9uIGxpc3RlbmVyIGV4aXN0cyBmb3IgdGhpcyBvcHRpb24sIGNhbGwgaW4gdGhlIGNvbnRleHQgb2YgdGhlIFNvcnRhYmxlJ3MgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW5cblxuICAgICAgaWYgKHBsdWdpbi5vcHRpb25MaXN0ZW5lcnMgJiYgdHlwZW9mIHBsdWdpbi5vcHRpb25MaXN0ZW5lcnNbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbW9kaWZpZWRWYWx1ZSA9IHBsdWdpbi5vcHRpb25MaXN0ZW5lcnNbbmFtZV0uY2FsbChzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbW9kaWZpZWRWYWx1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChfcmVmKSB7XG4gIHZhciBzb3J0YWJsZSA9IF9yZWYuc29ydGFibGUsXG4gICAgICByb290RWwgPSBfcmVmLnJvb3RFbCxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICB0YXJnZXRFbCA9IF9yZWYudGFyZ2V0RWwsXG4gICAgICBjbG9uZUVsID0gX3JlZi5jbG9uZUVsLFxuICAgICAgdG9FbCA9IF9yZWYudG9FbCxcbiAgICAgIGZyb21FbCA9IF9yZWYuZnJvbUVsLFxuICAgICAgb2xkSW5kZXggPSBfcmVmLm9sZEluZGV4LFxuICAgICAgbmV3SW5kZXggPSBfcmVmLm5ld0luZGV4LFxuICAgICAgb2xkRHJhZ2dhYmxlSW5kZXggPSBfcmVmLm9sZERyYWdnYWJsZUluZGV4LFxuICAgICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBfcmVmLm5ld0RyYWdnYWJsZUluZGV4LFxuICAgICAgb3JpZ2luYWxFdmVudCA9IF9yZWYub3JpZ2luYWxFdmVudCxcbiAgICAgIHB1dFNvcnRhYmxlID0gX3JlZi5wdXRTb3J0YWJsZSxcbiAgICAgIGV4dHJhRXZlbnRQcm9wZXJ0aWVzID0gX3JlZi5leHRyYUV2ZW50UHJvcGVydGllcztcbiAgc29ydGFibGUgPSBzb3J0YWJsZSB8fCByb290RWwgJiYgcm9vdEVsW2V4cGFuZG9dO1xuICBpZiAoIXNvcnRhYmxlKSByZXR1cm47XG4gIHZhciBldnQsXG4gICAgICBvcHRpb25zID0gc29ydGFibGUub3B0aW9ucyxcbiAgICAgIG9uTmFtZSA9ICdvbicgKyBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zdWJzdHIoMSk7IC8vIFN1cHBvcnQgZm9yIG5ldyBDdXN0b21FdmVudCBmZWF0dXJlXG5cbiAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiAhSUUxMU9yTGVzcyAmJiAhRWRnZSkge1xuICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2dC5pbml0RXZlbnQobmFtZSwgdHJ1ZSwgdHJ1ZSk7XG4gIH1cblxuICBldnQudG8gPSB0b0VsIHx8IHJvb3RFbDtcbiAgZXZ0LmZyb20gPSBmcm9tRWwgfHwgcm9vdEVsO1xuICBldnQuaXRlbSA9IHRhcmdldEVsIHx8IHJvb3RFbDtcbiAgZXZ0LmNsb25lID0gY2xvbmVFbDtcbiAgZXZ0Lm9sZEluZGV4ID0gb2xkSW5kZXg7XG4gIGV2dC5uZXdJbmRleCA9IG5ld0luZGV4O1xuICBldnQub2xkRHJhZ2dhYmxlSW5kZXggPSBvbGREcmFnZ2FibGVJbmRleDtcbiAgZXZ0Lm5ld0RyYWdnYWJsZUluZGV4ID0gbmV3RHJhZ2dhYmxlSW5kZXg7XG4gIGV2dC5vcmlnaW5hbEV2ZW50ID0gb3JpZ2luYWxFdmVudDtcbiAgZXZ0LnB1bGxNb2RlID0gcHV0U29ydGFibGUgPyBwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSA6IHVuZGVmaW5lZDtcblxuICB2YXIgYWxsRXZlbnRQcm9wZXJ0aWVzID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGV4dHJhRXZlbnRQcm9wZXJ0aWVzKSwgUGx1Z2luTWFuYWdlci5nZXRFdmVudFByb3BlcnRpZXMobmFtZSwgc29ydGFibGUpKTtcblxuICBmb3IgKHZhciBvcHRpb24gaW4gYWxsRXZlbnRQcm9wZXJ0aWVzKSB7XG4gICAgZXZ0W29wdGlvbl0gPSBhbGxFdmVudFByb3BlcnRpZXNbb3B0aW9uXTtcbiAgfVxuXG4gIGlmIChyb290RWwpIHtcbiAgICByb290RWwuZGlzcGF0Y2hFdmVudChldnQpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnNbb25OYW1lXSkge1xuICAgIG9wdGlvbnNbb25OYW1lXS5jYWxsKHNvcnRhYmxlLCBldnQpO1xuICB9XG59XG5cbnZhciBfZXhjbHVkZWQgPSBbXCJldnRcIl07XG5cbnZhciBwbHVnaW5FdmVudCA9IGZ1bmN0aW9uIHBsdWdpbkV2ZW50KGV2ZW50TmFtZSwgc29ydGFibGUpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9LFxuICAgICAgb3JpZ2luYWxFdmVudCA9IF9yZWYuZXZ0LFxuICAgICAgZGF0YSA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIFBsdWdpbk1hbmFnZXIucGx1Z2luRXZlbnQuYmluZChTb3J0YWJsZSkoZXZlbnROYW1lLCBzb3J0YWJsZSwgX29iamVjdFNwcmVhZDIoe1xuICAgIGRyYWdFbDogZHJhZ0VsLFxuICAgIHBhcmVudEVsOiBwYXJlbnRFbCxcbiAgICBnaG9zdEVsOiBnaG9zdEVsLFxuICAgIHJvb3RFbDogcm9vdEVsLFxuICAgIG5leHRFbDogbmV4dEVsLFxuICAgIGxhc3REb3duRWw6IGxhc3REb3duRWwsXG4gICAgY2xvbmVFbDogY2xvbmVFbCxcbiAgICBjbG9uZUhpZGRlbjogY2xvbmVIaWRkZW4sXG4gICAgZHJhZ1N0YXJ0ZWQ6IG1vdmVkLFxuICAgIHB1dFNvcnRhYmxlOiBwdXRTb3J0YWJsZSxcbiAgICBhY3RpdmVTb3J0YWJsZTogU29ydGFibGUuYWN0aXZlLFxuICAgIG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnQsXG4gICAgb2xkSW5kZXg6IG9sZEluZGV4LFxuICAgIG9sZERyYWdnYWJsZUluZGV4OiBvbGREcmFnZ2FibGVJbmRleCxcbiAgICBuZXdJbmRleDogbmV3SW5kZXgsXG4gICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG5ld0RyYWdnYWJsZUluZGV4LFxuICAgIGhpZGVHaG9zdEZvclRhcmdldDogX2hpZGVHaG9zdEZvclRhcmdldCxcbiAgICB1bmhpZGVHaG9zdEZvclRhcmdldDogX3VuaGlkZUdob3N0Rm9yVGFyZ2V0LFxuICAgIGNsb25lTm93SGlkZGVuOiBmdW5jdGlvbiBjbG9uZU5vd0hpZGRlbigpIHtcbiAgICAgIGNsb25lSGlkZGVuID0gdHJ1ZTtcbiAgICB9LFxuICAgIGNsb25lTm93U2hvd246IGZ1bmN0aW9uIGNsb25lTm93U2hvd24oKSB7XG4gICAgICBjbG9uZUhpZGRlbiA9IGZhbHNlO1xuICAgIH0sXG4gICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50OiBmdW5jdGlvbiBkaXNwYXRjaFNvcnRhYmxlRXZlbnQobmFtZSkge1xuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgZGF0YSkpO1xufTtcblxuZnVuY3Rpb24gX2Rpc3BhdGNoRXZlbnQoaW5mbykge1xuICBkaXNwYXRjaEV2ZW50KF9vYmplY3RTcHJlYWQyKHtcbiAgICBwdXRTb3J0YWJsZTogcHV0U29ydGFibGUsXG4gICAgY2xvbmVFbDogY2xvbmVFbCxcbiAgICB0YXJnZXRFbDogZHJhZ0VsLFxuICAgIHJvb3RFbDogcm9vdEVsLFxuICAgIG9sZEluZGV4OiBvbGRJbmRleCxcbiAgICBvbGREcmFnZ2FibGVJbmRleDogb2xkRHJhZ2dhYmxlSW5kZXgsXG4gICAgbmV3SW5kZXg6IG5ld0luZGV4LFxuICAgIG5ld0RyYWdnYWJsZUluZGV4OiBuZXdEcmFnZ2FibGVJbmRleFxuICB9LCBpbmZvKSk7XG59XG5cbnZhciBkcmFnRWwsXG4gICAgcGFyZW50RWwsXG4gICAgZ2hvc3RFbCxcbiAgICByb290RWwsXG4gICAgbmV4dEVsLFxuICAgIGxhc3REb3duRWwsXG4gICAgY2xvbmVFbCxcbiAgICBjbG9uZUhpZGRlbixcbiAgICBvbGRJbmRleCxcbiAgICBuZXdJbmRleCxcbiAgICBvbGREcmFnZ2FibGVJbmRleCxcbiAgICBuZXdEcmFnZ2FibGVJbmRleCxcbiAgICBhY3RpdmVHcm91cCxcbiAgICBwdXRTb3J0YWJsZSxcbiAgICBhd2FpdGluZ0RyYWdTdGFydGVkID0gZmFsc2UsXG4gICAgaWdub3JlTmV4dENsaWNrID0gZmFsc2UsXG4gICAgc29ydGFibGVzID0gW10sXG4gICAgdGFwRXZ0LFxuICAgIHRvdWNoRXZ0LFxuICAgIGxhc3REeCxcbiAgICBsYXN0RHksXG4gICAgdGFwRGlzdGFuY2VMZWZ0LFxuICAgIHRhcERpc3RhbmNlVG9wLFxuICAgIG1vdmVkLFxuICAgIGxhc3RUYXJnZXQsXG4gICAgbGFzdERpcmVjdGlvbixcbiAgICBwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggPSBmYWxzZSxcbiAgICBpc0NpcmN1bXN0YW50aWFsSW52ZXJ0ID0gZmFsc2UsXG4gICAgdGFyZ2V0TW92ZURpc3RhbmNlLFxuICAgIC8vIEZvciBwb3NpdGlvbmluZyBnaG9zdCBhYnNvbHV0ZWx5XG5naG9zdFJlbGF0aXZlUGFyZW50LFxuICAgIGdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsID0gW10sXG4gICAgLy8gKGxlZnQsIHRvcClcbl9zaWxlbnQgPSBmYWxzZSxcbiAgICBzYXZlZElucHV0Q2hlY2tlZCA9IFtdO1xuLyoqIEBjb25zdCAqL1xuXG52YXIgZG9jdW1lbnRFeGlzdHMgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnLFxuICAgIFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5ID0gSU9TLFxuICAgIENTU0Zsb2F0UHJvcGVydHkgPSBFZGdlIHx8IElFMTFPckxlc3MgPyAnY3NzRmxvYXQnIDogJ2Zsb2F0JyxcbiAgICAvLyBUaGlzIHdpbGwgbm90IHBhc3MgZm9yIElFOSwgYmVjYXVzZSBJRTkgRG5EIG9ubHkgd29ya3Mgb24gYW5jaG9yc1xuc3VwcG9ydERyYWdnYWJsZSA9IGRvY3VtZW50RXhpc3RzICYmICFDaHJvbWVGb3JBbmRyb2lkICYmICFJT1MgJiYgJ2RyYWdnYWJsZScgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksXG4gICAgc3VwcG9ydENzc1BvaW50ZXJFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghZG9jdW1lbnRFeGlzdHMpIHJldHVybjsgLy8gZmFsc2Ugd2hlbiA8PSBJRTExXG5cbiAgaWYgKElFMTFPckxlc3MpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd4Jyk7XG4gIGVsLnN0eWxlLmNzc1RleHQgPSAncG9pbnRlci1ldmVudHM6YXV0byc7XG4gIHJldHVybiBlbC5zdHlsZS5wb2ludGVyRXZlbnRzID09PSAnYXV0byc7XG59KCksXG4gICAgX2RldGVjdERpcmVjdGlvbiA9IGZ1bmN0aW9uIF9kZXRlY3REaXJlY3Rpb24oZWwsIG9wdGlvbnMpIHtcbiAgdmFyIGVsQ1NTID0gY3NzKGVsKSxcbiAgICAgIGVsV2lkdGggPSBwYXJzZUludChlbENTUy53aWR0aCkgLSBwYXJzZUludChlbENTUy5wYWRkaW5nTGVmdCkgLSBwYXJzZUludChlbENTUy5wYWRkaW5nUmlnaHQpIC0gcGFyc2VJbnQoZWxDU1MuYm9yZGVyTGVmdFdpZHRoKSAtIHBhcnNlSW50KGVsQ1NTLmJvcmRlclJpZ2h0V2lkdGgpLFxuICAgICAgY2hpbGQxID0gZ2V0Q2hpbGQoZWwsIDAsIG9wdGlvbnMpLFxuICAgICAgY2hpbGQyID0gZ2V0Q2hpbGQoZWwsIDEsIG9wdGlvbnMpLFxuICAgICAgZmlyc3RDaGlsZENTUyA9IGNoaWxkMSAmJiBjc3MoY2hpbGQxKSxcbiAgICAgIHNlY29uZENoaWxkQ1NTID0gY2hpbGQyICYmIGNzcyhjaGlsZDIpLFxuICAgICAgZmlyc3RDaGlsZFdpZHRoID0gZmlyc3RDaGlsZENTUyAmJiBwYXJzZUludChmaXJzdENoaWxkQ1NTLm1hcmdpbkxlZnQpICsgcGFyc2VJbnQoZmlyc3RDaGlsZENTUy5tYXJnaW5SaWdodCkgKyBnZXRSZWN0KGNoaWxkMSkud2lkdGgsXG4gICAgICBzZWNvbmRDaGlsZFdpZHRoID0gc2Vjb25kQ2hpbGRDU1MgJiYgcGFyc2VJbnQoc2Vjb25kQ2hpbGRDU1MubWFyZ2luTGVmdCkgKyBwYXJzZUludChzZWNvbmRDaGlsZENTUy5tYXJnaW5SaWdodCkgKyBnZXRSZWN0KGNoaWxkMikud2lkdGg7XG5cbiAgaWYgKGVsQ1NTLmRpc3BsYXkgPT09ICdmbGV4Jykge1xuICAgIHJldHVybiBlbENTUy5mbGV4RGlyZWN0aW9uID09PSAnY29sdW1uJyB8fCBlbENTUy5mbGV4RGlyZWN0aW9uID09PSAnY29sdW1uLXJldmVyc2UnID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgfVxuXG4gIGlmIChlbENTUy5kaXNwbGF5ID09PSAnZ3JpZCcpIHtcbiAgICByZXR1cm4gZWxDU1MuZ3JpZFRlbXBsYXRlQ29sdW1ucy5zcGxpdCgnICcpLmxlbmd0aCA8PSAxID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgfVxuXG4gIGlmIChjaGlsZDEgJiYgZmlyc3RDaGlsZENTU1tcImZsb2F0XCJdICYmIGZpcnN0Q2hpbGRDU1NbXCJmbG9hdFwiXSAhPT0gJ25vbmUnKSB7XG4gICAgdmFyIHRvdWNoaW5nU2lkZUNoaWxkMiA9IGZpcnN0Q2hpbGRDU1NbXCJmbG9hdFwiXSA9PT0gJ2xlZnQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICByZXR1cm4gY2hpbGQyICYmIChzZWNvbmRDaGlsZENTUy5jbGVhciA9PT0gJ2JvdGgnIHx8IHNlY29uZENoaWxkQ1NTLmNsZWFyID09PSB0b3VjaGluZ1NpZGVDaGlsZDIpID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgfVxuXG4gIHJldHVybiBjaGlsZDEgJiYgKGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ2Jsb2NrJyB8fCBmaXJzdENoaWxkQ1NTLmRpc3BsYXkgPT09ICdmbGV4JyB8fCBmaXJzdENoaWxkQ1NTLmRpc3BsYXkgPT09ICd0YWJsZScgfHwgZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSAnZ3JpZCcgfHwgZmlyc3RDaGlsZFdpZHRoID49IGVsV2lkdGggJiYgZWxDU1NbQ1NTRmxvYXRQcm9wZXJ0eV0gPT09ICdub25lJyB8fCBjaGlsZDIgJiYgZWxDU1NbQ1NTRmxvYXRQcm9wZXJ0eV0gPT09ICdub25lJyAmJiBmaXJzdENoaWxkV2lkdGggKyBzZWNvbmRDaGlsZFdpZHRoID4gZWxXaWR0aCkgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xufSxcbiAgICBfZHJhZ0VsSW5Sb3dDb2x1bW4gPSBmdW5jdGlvbiBfZHJhZ0VsSW5Sb3dDb2x1bW4oZHJhZ1JlY3QsIHRhcmdldFJlY3QsIHZlcnRpY2FsKSB7XG4gIHZhciBkcmFnRWxTMU9wcCA9IHZlcnRpY2FsID8gZHJhZ1JlY3QubGVmdCA6IGRyYWdSZWN0LnRvcCxcbiAgICAgIGRyYWdFbFMyT3BwID0gdmVydGljYWwgPyBkcmFnUmVjdC5yaWdodCA6IGRyYWdSZWN0LmJvdHRvbSxcbiAgICAgIGRyYWdFbE9wcExlbmd0aCA9IHZlcnRpY2FsID8gZHJhZ1JlY3Qud2lkdGggOiBkcmFnUmVjdC5oZWlnaHQsXG4gICAgICB0YXJnZXRTMU9wcCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5sZWZ0IDogdGFyZ2V0UmVjdC50b3AsXG4gICAgICB0YXJnZXRTMk9wcCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5yaWdodCA6IHRhcmdldFJlY3QuYm90dG9tLFxuICAgICAgdGFyZ2V0T3BwTGVuZ3RoID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LndpZHRoIDogdGFyZ2V0UmVjdC5oZWlnaHQ7XG4gIHJldHVybiBkcmFnRWxTMU9wcCA9PT0gdGFyZ2V0UzFPcHAgfHwgZHJhZ0VsUzJPcHAgPT09IHRhcmdldFMyT3BwIHx8IGRyYWdFbFMxT3BwICsgZHJhZ0VsT3BwTGVuZ3RoIC8gMiA9PT0gdGFyZ2V0UzFPcHAgKyB0YXJnZXRPcHBMZW5ndGggLyAyO1xufSxcblxuLyoqXG4gKiBEZXRlY3RzIGZpcnN0IG5lYXJlc3QgZW1wdHkgc29ydGFibGUgdG8gWCBhbmQgWSBwb3NpdGlvbiB1c2luZyBlbXB0eUluc2VydFRocmVzaG9sZC5cbiAqIEBwYXJhbSAge051bWJlcn0geCAgICAgIFggcG9zaXRpb25cbiAqIEBwYXJhbSAge051bWJlcn0geSAgICAgIFkgcG9zaXRpb25cbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgIEVsZW1lbnQgb2YgdGhlIGZpcnN0IGZvdW5kIG5lYXJlc3QgU29ydGFibGVcbiAqL1xuX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlID0gZnVuY3Rpb24gX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlKHgsIHkpIHtcbiAgdmFyIHJldDtcbiAgc29ydGFibGVzLnNvbWUoZnVuY3Rpb24gKHNvcnRhYmxlKSB7XG4gICAgdmFyIHRocmVzaG9sZCA9IHNvcnRhYmxlW2V4cGFuZG9dLm9wdGlvbnMuZW1wdHlJbnNlcnRUaHJlc2hvbGQ7XG4gICAgaWYgKCF0aHJlc2hvbGQgfHwgbGFzdENoaWxkKHNvcnRhYmxlKSkgcmV0dXJuO1xuICAgIHZhciByZWN0ID0gZ2V0UmVjdChzb3J0YWJsZSksXG4gICAgICAgIGluc2lkZUhvcml6b250YWxseSA9IHggPj0gcmVjdC5sZWZ0IC0gdGhyZXNob2xkICYmIHggPD0gcmVjdC5yaWdodCArIHRocmVzaG9sZCxcbiAgICAgICAgaW5zaWRlVmVydGljYWxseSA9IHkgPj0gcmVjdC50b3AgLSB0aHJlc2hvbGQgJiYgeSA8PSByZWN0LmJvdHRvbSArIHRocmVzaG9sZDtcblxuICAgIGlmIChpbnNpZGVIb3Jpem9udGFsbHkgJiYgaW5zaWRlVmVydGljYWxseSkge1xuICAgICAgcmV0dXJuIHJldCA9IHNvcnRhYmxlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXQ7XG59LFxuICAgIF9wcmVwYXJlR3JvdXAgPSBmdW5jdGlvbiBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpIHtcbiAgZnVuY3Rpb24gdG9Gbih2YWx1ZSwgcHVsbCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodG8sIGZyb20sIGRyYWdFbCwgZXZ0KSB7XG4gICAgICB2YXIgc2FtZUdyb3VwID0gdG8ub3B0aW9ucy5ncm91cC5uYW1lICYmIGZyb20ub3B0aW9ucy5ncm91cC5uYW1lICYmIHRvLm9wdGlvbnMuZ3JvdXAubmFtZSA9PT0gZnJvbS5vcHRpb25zLmdyb3VwLm5hbWU7XG5cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIChwdWxsIHx8IHNhbWVHcm91cCkpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBwdWxsIHZhbHVlXG4gICAgICAgIC8vIERlZmF1bHQgcHVsbCBhbmQgcHV0IHZhbHVlIGlmIHNhbWUgZ3JvdXBcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAocHVsbCAmJiB2YWx1ZSA9PT0gJ2Nsb25lJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdG9Gbih2YWx1ZSh0bywgZnJvbSwgZHJhZ0VsLCBldnQpLCBwdWxsKSh0bywgZnJvbSwgZHJhZ0VsLCBldnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG90aGVyR3JvdXAgPSAocHVsbCA/IHRvIDogZnJvbSkub3B0aW9ucy5ncm91cC5uYW1lO1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSA9PT0gb3RoZXJHcm91cCB8fCB2YWx1ZS5qb2luICYmIHZhbHVlLmluZGV4T2Yob3RoZXJHcm91cCkgPiAtMTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGdyb3VwID0ge307XG4gIHZhciBvcmlnaW5hbEdyb3VwID0gb3B0aW9ucy5ncm91cDtcblxuICBpZiAoIW9yaWdpbmFsR3JvdXAgfHwgX3R5cGVvZihvcmlnaW5hbEdyb3VwKSAhPSAnb2JqZWN0Jykge1xuICAgIG9yaWdpbmFsR3JvdXAgPSB7XG4gICAgICBuYW1lOiBvcmlnaW5hbEdyb3VwXG4gICAgfTtcbiAgfVxuXG4gIGdyb3VwLm5hbWUgPSBvcmlnaW5hbEdyb3VwLm5hbWU7XG4gIGdyb3VwLmNoZWNrUHVsbCA9IHRvRm4ob3JpZ2luYWxHcm91cC5wdWxsLCB0cnVlKTtcbiAgZ3JvdXAuY2hlY2tQdXQgPSB0b0ZuKG9yaWdpbmFsR3JvdXAucHV0KTtcbiAgZ3JvdXAucmV2ZXJ0Q2xvbmUgPSBvcmlnaW5hbEdyb3VwLnJldmVydENsb25lO1xuICBvcHRpb25zLmdyb3VwID0gZ3JvdXA7XG59LFxuICAgIF9oaWRlR2hvc3RGb3JUYXJnZXQgPSBmdW5jdGlvbiBfaGlkZUdob3N0Rm9yVGFyZ2V0KCkge1xuICBpZiAoIXN1cHBvcnRDc3NQb2ludGVyRXZlbnRzICYmIGdob3N0RWwpIHtcbiAgICBjc3MoZ2hvc3RFbCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xuICB9XG59LFxuICAgIF91bmhpZGVHaG9zdEZvclRhcmdldCA9IGZ1bmN0aW9uIF91bmhpZGVHaG9zdEZvclRhcmdldCgpIHtcbiAgaWYgKCFzdXBwb3J0Q3NzUG9pbnRlckV2ZW50cyAmJiBnaG9zdEVsKSB7XG4gICAgY3NzKGdob3N0RWwsICdkaXNwbGF5JywgJycpO1xuICB9XG59OyAvLyAjMTE4NCBmaXggLSBQcmV2ZW50IGNsaWNrIGV2ZW50IG9uIGZhbGxiYWNrIGlmIGRyYWdnZWQgYnV0IGl0ZW0gbm90IGNoYW5nZWQgcG9zaXRpb25cblxuXG5pZiAoZG9jdW1lbnRFeGlzdHMpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgaWYgKGlnbm9yZU5leHRDbGljaykge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldnQuc3RvcFByb3BhZ2F0aW9uICYmIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gJiYgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgaWdub3JlTmV4dENsaWNrID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB0cnVlKTtcbn1cblxudmFyIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50ID0gZnVuY3Rpb24gbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQoZXZ0KSB7XG4gIGlmIChkcmFnRWwpIHtcbiAgICBldnQgPSBldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0O1xuXG4gICAgdmFyIG5lYXJlc3QgPSBfZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUoZXZ0LmNsaWVudFgsIGV2dC5jbGllbnRZKTtcblxuICAgIGlmIChuZWFyZXN0KSB7XG4gICAgICAvLyBDcmVhdGUgaW1pdGF0aW9uIGV2ZW50XG4gICAgICB2YXIgZXZlbnQgPSB7fTtcblxuICAgICAgZm9yICh2YXIgaSBpbiBldnQpIHtcbiAgICAgICAgaWYgKGV2dC5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgIGV2ZW50W2ldID0gZXZ0W2ldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV2ZW50LnRhcmdldCA9IGV2ZW50LnJvb3RFbCA9IG5lYXJlc3Q7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCA9IHZvaWQgMDtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9IHZvaWQgMDtcblxuICAgICAgbmVhcmVzdFtleHBhbmRvXS5fb25EcmFnT3ZlcihldmVudCk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgX2NoZWNrT3V0c2lkZVRhcmdldEVsID0gZnVuY3Rpb24gX2NoZWNrT3V0c2lkZVRhcmdldEVsKGV2dCkge1xuICBpZiAoZHJhZ0VsKSB7XG4gICAgZHJhZ0VsLnBhcmVudE5vZGVbZXhwYW5kb10uX2lzT3V0c2lkZVRoaXNFbChldnQudGFyZ2V0KTtcbiAgfVxufTtcbi8qKlxuICogQGNsYXNzICBTb3J0YWJsZVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICBlbFxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICBbb3B0aW9uc11cbiAqL1xuXG5cbmZ1bmN0aW9uIFNvcnRhYmxlKGVsLCBvcHRpb25zKSB7XG4gIGlmICghKGVsICYmIGVsLm5vZGVUeXBlICYmIGVsLm5vZGVUeXBlID09PSAxKSkge1xuICAgIHRocm93IFwiU29ydGFibGU6IGBlbGAgbXVzdCBiZSBhbiBIVE1MRWxlbWVudCwgbm90IFwiLmNvbmNhdCh7fS50b1N0cmluZy5jYWxsKGVsKSk7XG4gIH1cblxuICB0aGlzLmVsID0gZWw7IC8vIHJvb3QgZWxlbWVudFxuXG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgb3B0aW9ucyk7IC8vIEV4cG9ydCBpbnN0YW5jZVxuXG4gIGVsW2V4cGFuZG9dID0gdGhpcztcbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgIGdyb3VwOiBudWxsLFxuICAgIHNvcnQ6IHRydWUsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIHN0b3JlOiBudWxsLFxuICAgIGhhbmRsZTogbnVsbCxcbiAgICBkcmFnZ2FibGU6IC9eW3VvXWwkL2kudGVzdChlbC5ub2RlTmFtZSkgPyAnPmxpJyA6ICc+KicsXG4gICAgc3dhcFRocmVzaG9sZDogMSxcbiAgICAvLyBwZXJjZW50YWdlOyAwIDw9IHggPD0gMVxuICAgIGludmVydFN3YXA6IGZhbHNlLFxuICAgIC8vIGludmVydCBhbHdheXNcbiAgICBpbnZlcnRlZFN3YXBUaHJlc2hvbGQ6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgdG8gc2FtZSBhcyBzd2FwVGhyZXNob2xkIGlmIGRlZmF1bHRcbiAgICByZW1vdmVDbG9uZU9uSGlkZTogdHJ1ZSxcbiAgICBkaXJlY3Rpb246IGZ1bmN0aW9uIGRpcmVjdGlvbigpIHtcbiAgICAgIHJldHVybiBfZGV0ZWN0RGlyZWN0aW9uKGVsLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0sXG4gICAgZ2hvc3RDbGFzczogJ3NvcnRhYmxlLWdob3N0JyxcbiAgICBjaG9zZW5DbGFzczogJ3NvcnRhYmxlLWNob3NlbicsXG4gICAgZHJhZ0NsYXNzOiAnc29ydGFibGUtZHJhZycsXG4gICAgaWdub3JlOiAnYSwgaW1nJyxcbiAgICBmaWx0ZXI6IG51bGwsXG4gICAgcHJldmVudE9uRmlsdGVyOiB0cnVlLFxuICAgIGFuaW1hdGlvbjogMCxcbiAgICBlYXNpbmc6IG51bGwsXG4gICAgc2V0RGF0YTogZnVuY3Rpb24gc2V0RGF0YShkYXRhVHJhbnNmZXIsIGRyYWdFbCkge1xuICAgICAgZGF0YVRyYW5zZmVyLnNldERhdGEoJ1RleHQnLCBkcmFnRWwudGV4dENvbnRlbnQpO1xuICAgIH0sXG4gICAgZHJvcEJ1YmJsZTogZmFsc2UsXG4gICAgZHJhZ292ZXJCdWJibGU6IGZhbHNlLFxuICAgIGRhdGFJZEF0dHI6ICdkYXRhLWlkJyxcbiAgICBkZWxheTogMCxcbiAgICBkZWxheU9uVG91Y2hPbmx5OiBmYWxzZSxcbiAgICB0b3VjaFN0YXJ0VGhyZXNob2xkOiAoTnVtYmVyLnBhcnNlSW50ID8gTnVtYmVyIDogd2luZG93KS5wYXJzZUludCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgMTApIHx8IDEsXG4gICAgZm9yY2VGYWxsYmFjazogZmFsc2UsXG4gICAgZmFsbGJhY2tDbGFzczogJ3NvcnRhYmxlLWZhbGxiYWNrJyxcbiAgICBmYWxsYmFja09uQm9keTogZmFsc2UsXG4gICAgZmFsbGJhY2tUb2xlcmFuY2U6IDAsXG4gICAgZmFsbGJhY2tPZmZzZXQ6IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfSxcbiAgICBzdXBwb3J0UG9pbnRlcjogU29ydGFibGUuc3VwcG9ydFBvaW50ZXIgIT09IGZhbHNlICYmICdQb2ludGVyRXZlbnQnIGluIHdpbmRvdyAmJiAhU2FmYXJpLFxuICAgIGVtcHR5SW5zZXJ0VGhyZXNob2xkOiA1XG4gIH07XG4gIFBsdWdpbk1hbmFnZXIuaW5pdGlhbGl6ZVBsdWdpbnModGhpcywgZWwsIGRlZmF1bHRzKTsgLy8gU2V0IGRlZmF1bHQgb3B0aW9uc1xuXG4gIGZvciAodmFyIG5hbWUgaW4gZGVmYXVsdHMpIHtcbiAgICAhKG5hbWUgaW4gb3B0aW9ucykgJiYgKG9wdGlvbnNbbmFtZV0gPSBkZWZhdWx0c1tuYW1lXSk7XG4gIH1cblxuICBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpOyAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcblxuXG4gIGZvciAodmFyIGZuIGluIHRoaXMpIHtcbiAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ZuXSA9IHRoaXNbZm5dLmJpbmQodGhpcyk7XG4gICAgfVxuICB9IC8vIFNldHVwIGRyYWcgbW9kZVxuXG5cbiAgdGhpcy5uYXRpdmVEcmFnZ2FibGUgPSBvcHRpb25zLmZvcmNlRmFsbGJhY2sgPyBmYWxzZSA6IHN1cHBvcnREcmFnZ2FibGU7XG5cbiAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgLy8gVG91Y2ggc3RhcnQgdGhyZXNob2xkIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG5hdGl2ZSBkcmFnc3RhcnQgdGhyZXNob2xkXG4gICAgdGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgPSAxO1xuICB9IC8vIEJpbmQgZXZlbnRzXG5cblxuICBpZiAob3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgIG9uKGVsLCAncG9pbnRlcmRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgfSBlbHNlIHtcbiAgICBvbihlbCwgJ21vdXNlZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuICAgIG9uKGVsLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVGFwU3RhcnQpO1xuICB9XG5cbiAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgb24oZWwsICdkcmFnb3ZlcicsIHRoaXMpO1xuICAgIG9uKGVsLCAnZHJhZ2VudGVyJywgdGhpcyk7XG4gIH1cblxuICBzb3J0YWJsZXMucHVzaCh0aGlzLmVsKTsgLy8gUmVzdG9yZSBzb3J0aW5nXG5cbiAgb3B0aW9ucy5zdG9yZSAmJiBvcHRpb25zLnN0b3JlLmdldCAmJiB0aGlzLnNvcnQob3B0aW9ucy5zdG9yZS5nZXQodGhpcykgfHwgW10pOyAvLyBBZGQgYW5pbWF0aW9uIHN0YXRlIG1hbmFnZXJcblxuICBfZXh0ZW5kcyh0aGlzLCBBbmltYXRpb25TdGF0ZU1hbmFnZXIoKSk7XG59XG5cblNvcnRhYmxlLnByb3RvdHlwZSA9XG4vKiogQGxlbmRzIFNvcnRhYmxlLnByb3RvdHlwZSAqL1xue1xuICBjb25zdHJ1Y3RvcjogU29ydGFibGUsXG4gIF9pc091dHNpZGVUaGlzRWw6IGZ1bmN0aW9uIF9pc091dHNpZGVUaGlzRWwodGFyZ2V0KSB7XG4gICAgaWYgKCF0aGlzLmVsLmNvbnRhaW5zKHRhcmdldCkgJiYgdGFyZ2V0ICE9PSB0aGlzLmVsKSB7XG4gICAgICBsYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICB9XG4gIH0sXG4gIF9nZXREaXJlY3Rpb246IGZ1bmN0aW9uIF9nZXREaXJlY3Rpb24oZXZ0LCB0YXJnZXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMub3B0aW9ucy5kaXJlY3Rpb24gPT09ICdmdW5jdGlvbicgPyB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uLmNhbGwodGhpcywgZXZ0LCB0YXJnZXQsIGRyYWdFbCkgOiB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICB9LFxuICBfb25UYXBTdGFydDogZnVuY3Rpb24gX29uVGFwU3RhcnQoXG4gIC8qKiBFdmVudHxUb3VjaEV2ZW50ICovXG4gIGV2dCkge1xuICAgIGlmICghZXZ0LmNhbmNlbGFibGUpIHJldHVybjtcblxuICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICAgIGVsID0gdGhpcy5lbCxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgcHJldmVudE9uRmlsdGVyID0gb3B0aW9ucy5wcmV2ZW50T25GaWx0ZXIsXG4gICAgICAgIHR5cGUgPSBldnQudHlwZSxcbiAgICAgICAgdG91Y2ggPSBldnQudG91Y2hlcyAmJiBldnQudG91Y2hlc1swXSB8fCBldnQucG9pbnRlclR5cGUgJiYgZXZ0LnBvaW50ZXJUeXBlID09PSAndG91Y2gnICYmIGV2dCxcbiAgICAgICAgdGFyZ2V0ID0gKHRvdWNoIHx8IGV2dCkudGFyZ2V0LFxuICAgICAgICBvcmlnaW5hbFRhcmdldCA9IGV2dC50YXJnZXQuc2hhZG93Um9vdCAmJiAoZXZ0LnBhdGggJiYgZXZ0LnBhdGhbMF0gfHwgZXZ0LmNvbXBvc2VkUGF0aCAmJiBldnQuY29tcG9zZWRQYXRoKClbMF0pIHx8IHRhcmdldCxcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG5cbiAgICBfc2F2ZUlucHV0Q2hlY2tlZFN0YXRlKGVsKTsgLy8gRG9uJ3QgdHJpZ2dlciBzdGFydCBldmVudCB3aGVuIGFuIGVsZW1lbnQgaXMgYmVlbiBkcmFnZ2VkLCBvdGhlcndpc2UgdGhlIGV2dC5vbGRpbmRleCBhbHdheXMgd3Jvbmcgd2hlbiBzZXQgb3B0aW9uLmdyb3VwLlxuXG5cbiAgICBpZiAoZHJhZ0VsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKC9tb3VzZWRvd258cG9pbnRlcmRvd24vLnRlc3QodHlwZSkgJiYgZXZ0LmJ1dHRvbiAhPT0gMCB8fCBvcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47IC8vIG9ubHkgbGVmdCBidXR0b24gYW5kIGVuYWJsZWRcbiAgICB9IC8vIGNhbmNlbCBkbmQgaWYgb3JpZ2luYWwgdGFyZ2V0IGlzIGNvbnRlbnQgZWRpdGFibGVcblxuXG4gICAgaWYgKG9yaWdpbmFsVGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBTYWZhcmkgaWdub3JlcyBmdXJ0aGVyIGV2ZW50IGhhbmRsaW5nIGFmdGVyIG1vdXNlZG93blxuXG5cbiAgICBpZiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlICYmIFNhZmFyaSAmJiB0YXJnZXQgJiYgdGFyZ2V0LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSBjbG9zZXN0KHRhcmdldCwgb3B0aW9ucy5kcmFnZ2FibGUsIGVsLCBmYWxzZSk7XG5cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5hbmltYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsYXN0RG93bkVsID09PSB0YXJnZXQpIHtcbiAgICAgIC8vIElnbm9yaW5nIGR1cGxpY2F0ZSBgZG93bmBcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGRyYWdnZWQgZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudFxuXG5cbiAgICBvbGRJbmRleCA9IGluZGV4KHRhcmdldCk7XG4gICAgb2xkRHJhZ2dhYmxlSW5kZXggPSBpbmRleCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlKTsgLy8gQ2hlY2sgZmlsdGVyXG5cbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGZpbHRlci5jYWxsKHRoaXMsIGV2dCwgdGFyZ2V0LCB0aGlzKSkge1xuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgIHJvb3RFbDogb3JpZ2luYWxUYXJnZXQsXG4gICAgICAgICAgbmFtZTogJ2ZpbHRlcicsXG4gICAgICAgICAgdGFyZ2V0RWw6IHRhcmdldCxcbiAgICAgICAgICB0b0VsOiBlbCxcbiAgICAgICAgICBmcm9tRWw6IGVsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBsdWdpbkV2ZW50KCdmaWx0ZXInLCBfdGhpcywge1xuICAgICAgICAgIGV2dDogZXZ0XG4gICAgICAgIH0pO1xuICAgICAgICBwcmV2ZW50T25GaWx0ZXIgJiYgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjsgLy8gY2FuY2VsIGRuZFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmlsdGVyKSB7XG4gICAgICBmaWx0ZXIgPSBmaWx0ZXIuc3BsaXQoJywnKS5zb21lKGZ1bmN0aW9uIChjcml0ZXJpYSkge1xuICAgICAgICBjcml0ZXJpYSA9IGNsb3Nlc3Qob3JpZ2luYWxUYXJnZXQsIGNyaXRlcmlhLnRyaW0oKSwgZWwsIGZhbHNlKTtcblxuICAgICAgICBpZiAoY3JpdGVyaWEpIHtcbiAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgICAgICByb290RWw6IGNyaXRlcmlhLFxuICAgICAgICAgICAgbmFtZTogJ2ZpbHRlcicsXG4gICAgICAgICAgICB0YXJnZXRFbDogdGFyZ2V0LFxuICAgICAgICAgICAgZnJvbUVsOiBlbCxcbiAgICAgICAgICAgIHRvRWw6IGVsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBwbHVnaW5FdmVudCgnZmlsdGVyJywgX3RoaXMsIHtcbiAgICAgICAgICAgIGV2dDogZXZ0XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgIHByZXZlbnRPbkZpbHRlciAmJiBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuOyAvLyBjYW5jZWwgZG5kXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaGFuZGxlICYmICFjbG9zZXN0KG9yaWdpbmFsVGFyZ2V0LCBvcHRpb25zLmhhbmRsZSwgZWwsIGZhbHNlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gUHJlcGFyZSBgZHJhZ3N0YXJ0YFxuXG5cbiAgICB0aGlzLl9wcmVwYXJlRHJhZ1N0YXJ0KGV2dCwgdG91Y2gsIHRhcmdldCk7XG4gIH0sXG4gIF9wcmVwYXJlRHJhZ1N0YXJ0OiBmdW5jdGlvbiBfcHJlcGFyZURyYWdTdGFydChcbiAgLyoqIEV2ZW50ICovXG4gIGV2dCxcbiAgLyoqIFRvdWNoICovXG4gIHRvdWNoLFxuICAvKiogSFRNTEVsZW1lbnQgKi9cbiAgdGFyZ2V0KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcyxcbiAgICAgICAgZWwgPSBfdGhpcy5lbCxcbiAgICAgICAgb3B0aW9ucyA9IF90aGlzLm9wdGlvbnMsXG4gICAgICAgIG93bmVyRG9jdW1lbnQgPSBlbC5vd25lckRvY3VtZW50LFxuICAgICAgICBkcmFnU3RhcnRGbjtcblxuICAgIGlmICh0YXJnZXQgJiYgIWRyYWdFbCAmJiB0YXJnZXQucGFyZW50Tm9kZSA9PT0gZWwpIHtcbiAgICAgIHZhciBkcmFnUmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgICAgIHJvb3RFbCA9IGVsO1xuICAgICAgZHJhZ0VsID0gdGFyZ2V0O1xuICAgICAgcGFyZW50RWwgPSBkcmFnRWwucGFyZW50Tm9kZTtcbiAgICAgIG5leHRFbCA9IGRyYWdFbC5uZXh0U2libGluZztcbiAgICAgIGxhc3REb3duRWwgPSB0YXJnZXQ7XG4gICAgICBhY3RpdmVHcm91cCA9IG9wdGlvbnMuZ3JvdXA7XG4gICAgICBTb3J0YWJsZS5kcmFnZ2VkID0gZHJhZ0VsO1xuICAgICAgdGFwRXZ0ID0ge1xuICAgICAgICB0YXJnZXQ6IGRyYWdFbCxcbiAgICAgICAgY2xpZW50WDogKHRvdWNoIHx8IGV2dCkuY2xpZW50WCxcbiAgICAgICAgY2xpZW50WTogKHRvdWNoIHx8IGV2dCkuY2xpZW50WVxuICAgICAgfTtcbiAgICAgIHRhcERpc3RhbmNlTGVmdCA9IHRhcEV2dC5jbGllbnRYIC0gZHJhZ1JlY3QubGVmdDtcbiAgICAgIHRhcERpc3RhbmNlVG9wID0gdGFwRXZ0LmNsaWVudFkgLSBkcmFnUmVjdC50b3A7XG4gICAgICB0aGlzLl9sYXN0WCA9ICh0b3VjaCB8fCBldnQpLmNsaWVudFg7XG4gICAgICB0aGlzLl9sYXN0WSA9ICh0b3VjaCB8fCBldnQpLmNsaWVudFk7XG4gICAgICBkcmFnRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnYWxsJztcblxuICAgICAgZHJhZ1N0YXJ0Rm4gPSBmdW5jdGlvbiBkcmFnU3RhcnRGbigpIHtcbiAgICAgICAgcGx1Z2luRXZlbnQoJ2RlbGF5RW5kZWQnLCBfdGhpcywge1xuICAgICAgICAgIGV2dDogZXZ0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICAgICAgX3RoaXMuX29uRHJvcCgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIERlbGF5ZWQgZHJhZyBoYXMgYmVlbiB0cmlnZ2VyZWRcbiAgICAgICAgLy8gd2UgY2FuIHJlLWVuYWJsZSB0aGUgZXZlbnRzOiB0b3VjaG1vdmUvbW91c2Vtb3ZlXG5cblxuICAgICAgICBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCk7XG5cbiAgICAgICAgaWYgKCFGaXJlRm94ICYmIF90aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICAgIGRyYWdFbC5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICB9IC8vIEJpbmQgdGhlIGV2ZW50czogZHJhZ3N0YXJ0L2RyYWdlbmRcblxuXG4gICAgICAgIF90aGlzLl90cmlnZ2VyRHJhZ1N0YXJ0KGV2dCwgdG91Y2gpOyAvLyBEcmFnIHN0YXJ0IGV2ZW50XG5cblxuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgIG5hbWU6ICdjaG9vc2UnLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICB9KTsgLy8gQ2hvc2VuIGl0ZW1cblxuXG4gICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5jaG9zZW5DbGFzcywgdHJ1ZSk7XG4gICAgICB9OyAvLyBEaXNhYmxlIFwiZHJhZ2dhYmxlXCJcblxuXG4gICAgICBvcHRpb25zLmlnbm9yZS5zcGxpdCgnLCcpLmZvckVhY2goZnVuY3Rpb24gKGNyaXRlcmlhKSB7XG4gICAgICAgIGZpbmQoZHJhZ0VsLCBjcml0ZXJpYS50cmltKCksIF9kaXNhYmxlRHJhZ2dhYmxlKTtcbiAgICAgIH0pO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ2RyYWdvdmVyJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ21vdXNlbW92ZScsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaG1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoZW5kJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCBfdGhpcy5fb25Ecm9wKTsgLy8gTWFrZSBkcmFnRWwgZHJhZ2dhYmxlIChtdXN0IGJlIGJlZm9yZSBkZWxheSBmb3IgRmlyZUZveClcblxuICAgICAgaWYgKEZpcmVGb3ggJiYgdGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgPSA0O1xuICAgICAgICBkcmFnRWwuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcGx1Z2luRXZlbnQoJ2RlbGF5U3RhcnQnLCB0aGlzLCB7XG4gICAgICAgIGV2dDogZXZ0XG4gICAgICB9KTsgLy8gRGVsYXkgaXMgaW1wb3NzaWJsZSBmb3IgbmF0aXZlIERuRCBpbiBFZGdlIG9yIElFXG5cbiAgICAgIGlmIChvcHRpb25zLmRlbGF5ICYmICghb3B0aW9ucy5kZWxheU9uVG91Y2hPbmx5IHx8IHRvdWNoKSAmJiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlIHx8ICEoRWRnZSB8fCBJRTExT3JMZXNzKSkpIHtcbiAgICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgICB0aGlzLl9vbkRyb3AoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBJZiB0aGUgdXNlciBtb3ZlcyB0aGUgcG9pbnRlciBvciBsZXQgZ28gdGhlIGNsaWNrIG9yIHRvdWNoXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgZGVsYXkgaGFzIGJlZW4gcmVhY2hlZDpcbiAgICAgICAgLy8gZGlzYWJsZSB0aGUgZGVsYXllZCBkcmFnXG5cblxuICAgICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCBfdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNobW92ZScsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICBvcHRpb25zLnN1cHBvcnRQb2ludGVyICYmIG9uKG93bmVyRG9jdW1lbnQsICdwb2ludGVybW92ZScsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICBfdGhpcy5fZHJhZ1N0YXJ0VGltZXIgPSBzZXRUaW1lb3V0KGRyYWdTdGFydEZuLCBvcHRpb25zLmRlbGF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdTdGFydEZuKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBfZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyOiBmdW5jdGlvbiBfZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKFxuICAvKiogVG91Y2hFdmVudHxQb2ludGVyRXZlbnQgKiovXG4gIGUpIHtcbiAgICB2YXIgdG91Y2ggPSBlLnRvdWNoZXMgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgaWYgKE1hdGgubWF4KE1hdGguYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLl9sYXN0WCksIE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSB0aGlzLl9sYXN0WSkpID49IE1hdGguZmxvb3IodGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgLyAodGhpcy5uYXRpdmVEcmFnZ2FibGUgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkpKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcoKTtcbiAgICB9XG4gIH0sXG4gIF9kaXNhYmxlRGVsYXllZERyYWc6IGZ1bmN0aW9uIF9kaXNhYmxlRGVsYXllZERyYWcoKSB7XG4gICAgZHJhZ0VsICYmIF9kaXNhYmxlRHJhZ2dhYmxlKGRyYWdFbCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2RyYWdTdGFydFRpbWVyKTtcblxuICAgIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpO1xuICB9LFxuICBfZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzOiBmdW5jdGlvbiBfZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCkge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gdGhpcy5lbC5vd25lckRvY3VtZW50O1xuICAgIG9mZihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgfSxcbiAgX3RyaWdnZXJEcmFnU3RhcnQ6IGZ1bmN0aW9uIF90cmlnZ2VyRHJhZ1N0YXJ0KFxuICAvKiogRXZlbnQgKi9cbiAgZXZ0LFxuICAvKiogVG91Y2ggKi9cbiAgdG91Y2gpIHtcbiAgICB0b3VjaCA9IHRvdWNoIHx8IGV2dC5wb2ludGVyVHlwZSA9PSAndG91Y2gnICYmIGV2dDtcblxuICAgIGlmICghdGhpcy5uYXRpdmVEcmFnZ2FibGUgfHwgdG91Y2gpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIH0gZWxzZSBpZiAodG91Y2gpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbihkb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb24oZHJhZ0VsLCAnZHJhZ2VuZCcsIHRoaXMpO1xuICAgICAgb24ocm9vdEVsLCAnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7XG4gICAgICAgIC8vIFRpbWVvdXQgbmVjY2Vzc2FyeSBmb3IgSUU5XG4gICAgICAgIF9uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge31cbiAgfSxcbiAgX2RyYWdTdGFydGVkOiBmdW5jdGlvbiBfZHJhZ1N0YXJ0ZWQoZmFsbGJhY2ssIGV2dCkge1xuXG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHJvb3RFbCAmJiBkcmFnRWwpIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdkcmFnU3RhcnRlZCcsIHRoaXMsIHtcbiAgICAgICAgZXZ0OiBldnRcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdkcmFnb3ZlcicsIF9jaGVja091dHNpZGVUYXJnZXRFbCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOyAvLyBBcHBseSBlZmZlY3RcblxuICAgICAgIWZhbGxiYWNrICYmIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5kcmFnQ2xhc3MsIGZhbHNlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5naG9zdENsYXNzLCB0cnVlKTtcbiAgICAgIFNvcnRhYmxlLmFjdGl2ZSA9IHRoaXM7XG4gICAgICBmYWxsYmFjayAmJiB0aGlzLl9hcHBlbmRHaG9zdCgpOyAvLyBEcmFnIHN0YXJ0IGV2ZW50XG5cbiAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgIG5hbWU6ICdzdGFydCcsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX251bGxpbmcoKTtcbiAgICB9XG4gIH0sXG4gIF9lbXVsYXRlRHJhZ092ZXI6IGZ1bmN0aW9uIF9lbXVsYXRlRHJhZ092ZXIoKSB7XG4gICAgaWYgKHRvdWNoRXZ0KSB7XG4gICAgICB0aGlzLl9sYXN0WCA9IHRvdWNoRXZ0LmNsaWVudFg7XG4gICAgICB0aGlzLl9sYXN0WSA9IHRvdWNoRXZ0LmNsaWVudFk7XG5cbiAgICAgIF9oaWRlR2hvc3RGb3JUYXJnZXQoKTtcblxuICAgICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQodG91Y2hFdnQuY2xpZW50WCwgdG91Y2hFdnQuY2xpZW50WSk7XG4gICAgICB2YXIgcGFyZW50ID0gdGFyZ2V0O1xuXG4gICAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldC5zaGFkb3dSb290KSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5zaGFkb3dSb290LmVsZW1lbnRGcm9tUG9pbnQodG91Y2hFdnQuY2xpZW50WCwgdG91Y2hFdnQuY2xpZW50WSk7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IHBhcmVudCkgYnJlYWs7XG4gICAgICAgIHBhcmVudCA9IHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgZHJhZ0VsLnBhcmVudE5vZGVbZXhwYW5kb10uX2lzT3V0c2lkZVRoaXNFbCh0YXJnZXQpO1xuXG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAocGFyZW50W2V4cGFuZG9dKSB7XG4gICAgICAgICAgICB2YXIgaW5zZXJ0ZWQgPSB2b2lkIDA7XG4gICAgICAgICAgICBpbnNlcnRlZCA9IHBhcmVudFtleHBhbmRvXS5fb25EcmFnT3Zlcih7XG4gICAgICAgICAgICAgIGNsaWVudFg6IHRvdWNoRXZ0LmNsaWVudFgsXG4gICAgICAgICAgICAgIGNsaWVudFk6IHRvdWNoRXZ0LmNsaWVudFksXG4gICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICByb290RWw6IHBhcmVudFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChpbnNlcnRlZCAmJiAhdGhpcy5vcHRpb25zLmRyYWdvdmVyQnViYmxlKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRhcmdldCA9IHBhcmVudDsgLy8gc3RvcmUgbGFzdCBlbGVtZW50XG4gICAgICAgIH1cbiAgICAgICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuICAgICAgICB3aGlsZSAocGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGUpO1xuICAgICAgfVxuXG4gICAgICBfdW5oaWRlR2hvc3RGb3JUYXJnZXQoKTtcbiAgICB9XG4gIH0sXG4gIF9vblRvdWNoTW92ZTogZnVuY3Rpb24gX29uVG91Y2hNb3ZlKFxuICAvKipUb3VjaEV2ZW50Ki9cbiAgZXZ0KSB7XG4gICAgaWYgKHRhcEV2dCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgZmFsbGJhY2tUb2xlcmFuY2UgPSBvcHRpb25zLmZhbGxiYWNrVG9sZXJhbmNlLFxuICAgICAgICAgIGZhbGxiYWNrT2Zmc2V0ID0gb3B0aW9ucy5mYWxsYmFja09mZnNldCxcbiAgICAgICAgICB0b3VjaCA9IGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQsXG4gICAgICAgICAgZ2hvc3RNYXRyaXggPSBnaG9zdEVsICYmIG1hdHJpeChnaG9zdEVsLCB0cnVlKSxcbiAgICAgICAgICBzY2FsZVggPSBnaG9zdEVsICYmIGdob3N0TWF0cml4ICYmIGdob3N0TWF0cml4LmEsXG4gICAgICAgICAgc2NhbGVZID0gZ2hvc3RFbCAmJiBnaG9zdE1hdHJpeCAmJiBnaG9zdE1hdHJpeC5kLFxuICAgICAgICAgIHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID0gUG9zaXRpb25HaG9zdEFic29sdXRlbHkgJiYgZ2hvc3RSZWxhdGl2ZVBhcmVudCAmJiBnZXRSZWxhdGl2ZVNjcm9sbE9mZnNldChnaG9zdFJlbGF0aXZlUGFyZW50KSxcbiAgICAgICAgICBkeCA9ICh0b3VjaC5jbGllbnRYIC0gdGFwRXZ0LmNsaWVudFggKyBmYWxsYmFja09mZnNldC54KSAvIChzY2FsZVggfHwgMSkgKyAocmVsYXRpdmVTY3JvbGxPZmZzZXQgPyByZWxhdGl2ZVNjcm9sbE9mZnNldFswXSAtIGdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsWzBdIDogMCkgLyAoc2NhbGVYIHx8IDEpLFxuICAgICAgICAgIGR5ID0gKHRvdWNoLmNsaWVudFkgLSB0YXBFdnQuY2xpZW50WSArIGZhbGxiYWNrT2Zmc2V0LnkpIC8gKHNjYWxlWSB8fCAxKSArIChyZWxhdGl2ZVNjcm9sbE9mZnNldCA/IHJlbGF0aXZlU2Nyb2xsT2Zmc2V0WzFdIC0gZ2hvc3RSZWxhdGl2ZVBhcmVudEluaXRpYWxTY3JvbGxbMV0gOiAwKSAvIChzY2FsZVkgfHwgMSk7IC8vIG9ubHkgc2V0IHRoZSBzdGF0dXMgdG8gZHJhZ2dpbmcsIHdoZW4gd2UgYXJlIGFjdHVhbGx5IGRyYWdnaW5nXG5cbiAgICAgIGlmICghU29ydGFibGUuYWN0aXZlICYmICFhd2FpdGluZ0RyYWdTdGFydGVkKSB7XG4gICAgICAgIGlmIChmYWxsYmFja1RvbGVyYW5jZSAmJiBNYXRoLm1heChNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy5fbGFzdFgpLCBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy5fbGFzdFkpKSA8IGZhbGxiYWNrVG9sZXJhbmNlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25EcmFnU3RhcnQoZXZ0LCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdob3N0RWwpIHtcbiAgICAgICAgaWYgKGdob3N0TWF0cml4KSB7XG4gICAgICAgICAgZ2hvc3RNYXRyaXguZSArPSBkeCAtIChsYXN0RHggfHwgMCk7XG4gICAgICAgICAgZ2hvc3RNYXRyaXguZiArPSBkeSAtIChsYXN0RHkgfHwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2hvc3RNYXRyaXggPSB7XG4gICAgICAgICAgICBhOiAxLFxuICAgICAgICAgICAgYjogMCxcbiAgICAgICAgICAgIGM6IDAsXG4gICAgICAgICAgICBkOiAxLFxuICAgICAgICAgICAgZTogZHgsXG4gICAgICAgICAgICBmOiBkeVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY3NzTWF0cml4ID0gXCJtYXRyaXgoXCIuY29uY2F0KGdob3N0TWF0cml4LmEsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguYiwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5jLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmQsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguZSwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5mLCBcIilcIik7XG4gICAgICAgIGNzcyhnaG9zdEVsLCAnd2Via2l0VHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgY3NzKGdob3N0RWwsICdtb3pUcmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgJ21zVHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBsYXN0RHggPSBkeDtcbiAgICAgICAgbGFzdER5ID0gZHk7XG4gICAgICAgIHRvdWNoRXZ0ID0gdG91Y2g7XG4gICAgICB9XG5cbiAgICAgIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSxcbiAgX2FwcGVuZEdob3N0OiBmdW5jdGlvbiBfYXBwZW5kR2hvc3QoKSB7XG4gICAgLy8gQnVnIGlmIHVzaW5nIHNjYWxlKCk6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI2MzcwNThcbiAgICAvLyBOb3QgYmVpbmcgYWRqdXN0ZWQgZm9yXG4gICAgaWYgKCFnaG9zdEVsKSB7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5vcHRpb25zLmZhbGxiYWNrT25Cb2R5ID8gZG9jdW1lbnQuYm9keSA6IHJvb3RFbCxcbiAgICAgICAgICByZWN0ID0gZ2V0UmVjdChkcmFnRWwsIHRydWUsIFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5LCB0cnVlLCBjb250YWluZXIpLFxuICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7IC8vIFBvc2l0aW9uIGFic29sdXRlbHlcblxuICAgICAgaWYgKFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5KSB7XG4gICAgICAgIC8vIEdldCByZWxhdGl2ZWx5IHBvc2l0aW9uZWQgcGFyZW50XG4gICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBjb250YWluZXI7XG5cbiAgICAgICAgd2hpbGUgKGNzcyhnaG9zdFJlbGF0aXZlUGFyZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycgJiYgY3NzKGdob3N0UmVsYXRpdmVQYXJlbnQsICd0cmFuc2Zvcm0nKSA9PT0gJ25vbmUnICYmIGdob3N0UmVsYXRpdmVQYXJlbnQgIT09IGRvY3VtZW50KSB7XG4gICAgICAgICAgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdob3N0UmVsYXRpdmVQYXJlbnQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnaG9zdFJlbGF0aXZlUGFyZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmIGdob3N0UmVsYXRpdmVQYXJlbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgIGlmIChnaG9zdFJlbGF0aXZlUGFyZW50ID09PSBkb2N1bWVudCkgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAgICAgICByZWN0LnRvcCArPSBnaG9zdFJlbGF0aXZlUGFyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICByZWN0LmxlZnQgKz0gZ2hvc3RSZWxhdGl2ZVBhcmVudC5zY3JvbGxMZWZ0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbCA9IGdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0KGdob3N0UmVsYXRpdmVQYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICBnaG9zdEVsID0gZHJhZ0VsLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGdob3N0RWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgZmFsc2UpO1xuICAgICAgdG9nZ2xlQ2xhc3MoZ2hvc3RFbCwgb3B0aW9ucy5mYWxsYmFja0NsYXNzLCB0cnVlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGdob3N0RWwsIG9wdGlvbnMuZHJhZ0NsYXNzLCB0cnVlKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAndHJhbnNpdGlvbicsICcnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAndHJhbnNmb3JtJywgJycpO1xuICAgICAgY3NzKGdob3N0RWwsICdib3gtc2l6aW5nJywgJ2JvcmRlci1ib3gnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnbWFyZ2luJywgMCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3RvcCcsIHJlY3QudG9wKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnbGVmdCcsIHJlY3QubGVmdCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3dpZHRoJywgcmVjdC53aWR0aCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ2hlaWdodCcsIHJlY3QuaGVpZ2h0KTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnb3BhY2l0eScsICcwLjgnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAncG9zaXRpb24nLCBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSA/ICdhYnNvbHV0ZScgOiAnZml4ZWQnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnekluZGV4JywgJzEwMDAwMCcpO1xuICAgICAgY3NzKGdob3N0RWwsICdwb2ludGVyRXZlbnRzJywgJ25vbmUnKTtcbiAgICAgIFNvcnRhYmxlLmdob3N0ID0gZ2hvc3RFbDtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChnaG9zdEVsKTsgLy8gU2V0IHRyYW5zZm9ybS1vcmlnaW5cblxuICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0tb3JpZ2luJywgdGFwRGlzdGFuY2VMZWZ0IC8gcGFyc2VJbnQoZ2hvc3RFbC5zdHlsZS53aWR0aCkgKiAxMDAgKyAnJSAnICsgdGFwRGlzdGFuY2VUb3AgLyBwYXJzZUludChnaG9zdEVsLnN0eWxlLmhlaWdodCkgKiAxMDAgKyAnJScpO1xuICAgIH1cbiAgfSxcbiAgX29uRHJhZ1N0YXJ0OiBmdW5jdGlvbiBfb25EcmFnU3RhcnQoXG4gIC8qKkV2ZW50Ki9cbiAgZXZ0LFxuICAvKipib29sZWFuKi9cbiAgZmFsbGJhY2spIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGRhdGFUcmFuc2ZlciA9IGV2dC5kYXRhVHJhbnNmZXI7XG4gICAgdmFyIG9wdGlvbnMgPSBfdGhpcy5vcHRpb25zO1xuICAgIHBsdWdpbkV2ZW50KCdkcmFnU3RhcnQnLCB0aGlzLCB7XG4gICAgICBldnQ6IGV2dFxuICAgIH0pO1xuXG4gICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgIHRoaXMuX29uRHJvcCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGx1Z2luRXZlbnQoJ3NldHVwQ2xvbmUnLCB0aGlzKTtcblxuICAgIGlmICghU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgY2xvbmVFbCA9IGNsb25lKGRyYWdFbCk7XG4gICAgICBjbG9uZUVsLmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgY2xvbmVFbC5zdHlsZVsnd2lsbC1jaGFuZ2UnXSA9ICcnO1xuXG4gICAgICB0aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgdG9nZ2xlQ2xhc3MoY2xvbmVFbCwgdGhpcy5vcHRpb25zLmNob3NlbkNsYXNzLCBmYWxzZSk7XG4gICAgICBTb3J0YWJsZS5jbG9uZSA9IGNsb25lRWw7XG4gICAgfSAvLyAjMTE0MzogSUZyYW1lIHN1cHBvcnQgd29ya2Fyb3VuZFxuXG5cbiAgICBfdGhpcy5jbG9uZUlkID0gX25leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdjbG9uZScsIF90aGlzKTtcbiAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm47XG5cbiAgICAgIGlmICghX3RoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSkge1xuICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIGRyYWdFbCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgIG5hbWU6ICdjbG9uZSdcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgICFmYWxsYmFjayAmJiB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZHJhZ0NsYXNzLCB0cnVlKTsgLy8gU2V0IHByb3BlciBkcm9wIGV2ZW50c1xuXG4gICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICBpZ25vcmVOZXh0Q2xpY2sgPSB0cnVlO1xuICAgICAgX3RoaXMuX2xvb3BJZCA9IHNldEludGVydmFsKF90aGlzLl9lbXVsYXRlRHJhZ092ZXIsIDUwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVW5kbyB3aGF0IHdhcyBzZXQgaW4gX3ByZXBhcmVEcmFnU3RhcnQgYmVmb3JlIGRyYWcgc3RhcnRlZFxuICAgICAgb2ZmKGRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2hlbmQnLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgX3RoaXMuX29uRHJvcCk7XG5cbiAgICAgIGlmIChkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7XG4gICAgICAgIG9wdGlvbnMuc2V0RGF0YSAmJiBvcHRpb25zLnNldERhdGEuY2FsbChfdGhpcywgZGF0YVRyYW5zZmVyLCBkcmFnRWwpO1xuICAgICAgfVxuXG4gICAgICBvbihkb2N1bWVudCwgJ2Ryb3AnLCBfdGhpcyk7IC8vICMxMjc2IGZpeDpcblxuICAgICAgY3NzKGRyYWdFbCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGVaKDApJyk7XG4gICAgfVxuXG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IHRydWU7XG4gICAgX3RoaXMuX2RyYWdTdGFydElkID0gX25leHRUaWNrKF90aGlzLl9kcmFnU3RhcnRlZC5iaW5kKF90aGlzLCBmYWxsYmFjaywgZXZ0KSk7XG4gICAgb24oZG9jdW1lbnQsICdzZWxlY3RzdGFydCcsIF90aGlzKTtcbiAgICBtb3ZlZCA9IHRydWU7XG5cbiAgICBpZiAoU2FmYXJpKSB7XG4gICAgICBjc3MoZG9jdW1lbnQuYm9keSwgJ3VzZXItc2VsZWN0JywgJ25vbmUnKTtcbiAgICB9XG4gIH0sXG4gIC8vIFJldHVybnMgdHJ1ZSAtIGlmIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIG5lZWRlZCAoZWl0aGVyIGluc2VydGVkIG9yIGFub3RoZXIgY29uZGl0aW9uKVxuICBfb25EcmFnT3ZlcjogZnVuY3Rpb24gX29uRHJhZ092ZXIoXG4gIC8qKkV2ZW50Ki9cbiAgZXZ0KSB7XG4gICAgdmFyIGVsID0gdGhpcy5lbCxcbiAgICAgICAgdGFyZ2V0ID0gZXZ0LnRhcmdldCxcbiAgICAgICAgZHJhZ1JlY3QsXG4gICAgICAgIHRhcmdldFJlY3QsXG4gICAgICAgIHJldmVydCxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZ3JvdXAgPSBvcHRpb25zLmdyb3VwLFxuICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IFNvcnRhYmxlLmFjdGl2ZSxcbiAgICAgICAgaXNPd25lciA9IGFjdGl2ZUdyb3VwID09PSBncm91cCxcbiAgICAgICAgY2FuU29ydCA9IG9wdGlvbnMuc29ydCxcbiAgICAgICAgZnJvbVNvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgYWN0aXZlU29ydGFibGUsXG4gICAgICAgIHZlcnRpY2FsLFxuICAgICAgICBfdGhpcyA9IHRoaXMsXG4gICAgICAgIGNvbXBsZXRlZEZpcmVkID0gZmFsc2U7XG5cbiAgICBpZiAoX3NpbGVudCkgcmV0dXJuO1xuXG4gICAgZnVuY3Rpb24gZHJhZ092ZXJFdmVudChuYW1lLCBleHRyYSkge1xuICAgICAgcGx1Z2luRXZlbnQobmFtZSwgX3RoaXMsIF9vYmplY3RTcHJlYWQyKHtcbiAgICAgICAgZXZ0OiBldnQsXG4gICAgICAgIGlzT3duZXI6IGlzT3duZXIsXG4gICAgICAgIGF4aXM6IHZlcnRpY2FsID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJyxcbiAgICAgICAgcmV2ZXJ0OiByZXZlcnQsXG4gICAgICAgIGRyYWdSZWN0OiBkcmFnUmVjdCxcbiAgICAgICAgdGFyZ2V0UmVjdDogdGFyZ2V0UmVjdCxcbiAgICAgICAgY2FuU29ydDogY2FuU29ydCxcbiAgICAgICAgZnJvbVNvcnRhYmxlOiBmcm9tU29ydGFibGUsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBjb21wbGV0ZWQ6IGNvbXBsZXRlZCxcbiAgICAgICAgb25Nb3ZlOiBmdW5jdGlvbiBvbk1vdmUodGFyZ2V0LCBhZnRlcikge1xuICAgICAgICAgIHJldHVybiBfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgZ2V0UmVjdCh0YXJnZXQpLCBldnQsIGFmdGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hhbmdlZDogY2hhbmdlZFxuICAgICAgfSwgZXh0cmEpKTtcbiAgICB9IC8vIENhcHR1cmUgYW5pbWF0aW9uIHN0YXRlXG5cblxuICAgIGZ1bmN0aW9uIGNhcHR1cmUoKSB7XG4gICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlckFuaW1hdGlvbkNhcHR1cmUnKTtcblxuICAgICAgX3RoaXMuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG5cbiAgICAgIGlmIChfdGhpcyAhPT0gZnJvbVNvcnRhYmxlKSB7XG4gICAgICAgIGZyb21Tb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9IC8vIFJldHVybiBpbnZvY2F0aW9uIHdoZW4gZHJhZ0VsIGlzIGluc2VydGVkIChvciBjb21wbGV0ZWQpXG5cblxuICAgIGZ1bmN0aW9uIGNvbXBsZXRlZChpbnNlcnRpb24pIHtcbiAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyQ29tcGxldGVkJywge1xuICAgICAgICBpbnNlcnRpb246IGluc2VydGlvblxuICAgICAgfSk7XG5cbiAgICAgIGlmIChpbnNlcnRpb24pIHtcbiAgICAgICAgLy8gQ2xvbmVzIG11c3QgYmUgaGlkZGVuIGJlZm9yZSBmb2xkaW5nIGFuaW1hdGlvbiB0byBjYXB0dXJlIGRyYWdSZWN0QWJzb2x1dGUgcHJvcGVybHlcbiAgICAgICAgaWYgKGlzT3duZXIpIHtcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5faGlkZUNsb25lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0aXZlU29ydGFibGUuX3Nob3dDbG9uZShfdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXMgIT09IGZyb21Tb3J0YWJsZSkge1xuICAgICAgICAgIC8vIFNldCBnaG9zdCBjbGFzcyB0byBuZXcgc29ydGFibGUncyBnaG9zdCBjbGFzc1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgcHV0U29ydGFibGUgPyBwdXRTb3J0YWJsZS5vcHRpb25zLmdob3N0Q2xhc3MgOiBhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmdob3N0Q2xhc3MsIGZhbHNlKTtcbiAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHV0U29ydGFibGUgIT09IF90aGlzICYmIF90aGlzICE9PSBTb3J0YWJsZS5hY3RpdmUpIHtcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IF90aGlzO1xuICAgICAgICB9IGVsc2UgaWYgKF90aGlzID09PSBTb3J0YWJsZS5hY3RpdmUgJiYgcHV0U29ydGFibGUpIHtcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IG51bGw7XG4gICAgICAgIH0gLy8gQW5pbWF0aW9uXG5cblxuICAgICAgICBpZiAoZnJvbVNvcnRhYmxlID09PSBfdGhpcykge1xuICAgICAgICAgIF90aGlzLl9pZ25vcmVXaGlsZUFuaW1hdGluZyA9IHRhcmdldDtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmFuaW1hdGVBbGwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyQW5pbWF0aW9uQ29tcGxldGUnKTtcbiAgICAgICAgICBfdGhpcy5faWdub3JlV2hpbGVBbmltYXRpbmcgPSBudWxsO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoX3RoaXMgIT09IGZyb21Tb3J0YWJsZSkge1xuICAgICAgICAgIGZyb21Tb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gICAgICAgICAgZnJvbVNvcnRhYmxlLl9pZ25vcmVXaGlsZUFuaW1hdGluZyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gTnVsbCBsYXN0VGFyZ2V0IGlmIGl0IGlzIG5vdCBpbnNpZGUgYSBwcmV2aW91c2x5IHN3YXBwZWQgZWxlbWVudFxuXG5cbiAgICAgIGlmICh0YXJnZXQgPT09IGRyYWdFbCAmJiAhZHJhZ0VsLmFuaW1hdGVkIHx8IHRhcmdldCA9PT0gZWwgJiYgIXRhcmdldC5hbmltYXRlZCkge1xuICAgICAgICBsYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICAgIH0gLy8gbm8gYnViYmxpbmcgYW5kIG5vdCBmYWxsYmFja1xuXG5cbiAgICAgIGlmICghb3B0aW9ucy5kcmFnb3ZlckJ1YmJsZSAmJiAhZXZ0LnJvb3RFbCAmJiB0YXJnZXQgIT09IGRvY3VtZW50KSB7XG4gICAgICAgIGRyYWdFbC5wYXJlbnROb2RlW2V4cGFuZG9dLl9pc091dHNpZGVUaGlzRWwoZXZ0LnRhcmdldCk7IC8vIERvIG5vdCBkZXRlY3QgZm9yIGVtcHR5IGluc2VydCBpZiBhbHJlYWR5IGluc2VydGVkXG5cblxuICAgICAgICAhaW5zZXJ0aW9uICYmIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KGV2dCk7XG4gICAgICB9XG5cbiAgICAgICFvcHRpb25zLmRyYWdvdmVyQnViYmxlICYmIGV2dC5zdG9wUHJvcGFnYXRpb24gJiYgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuIGNvbXBsZXRlZEZpcmVkID0gdHJ1ZTtcbiAgICB9IC8vIENhbGwgd2hlbiBkcmFnRWwgaGFzIGJlZW4gaW5zZXJ0ZWRcblxuXG4gICAgZnVuY3Rpb24gY2hhbmdlZCgpIHtcbiAgICAgIG5ld0luZGV4ID0gaW5kZXgoZHJhZ0VsKTtcbiAgICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gaW5kZXgoZHJhZ0VsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG5cbiAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICBuYW1lOiAnY2hhbmdlJyxcbiAgICAgICAgdG9FbDogZWwsXG4gICAgICAgIG5ld0luZGV4OiBuZXdJbmRleCxcbiAgICAgICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG5ld0RyYWdnYWJsZUluZGV4LFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChldnQucHJldmVudERlZmF1bHQgIT09IHZvaWQgMCkge1xuICAgICAgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gY2xvc2VzdCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlLCBlbCwgdHJ1ZSk7XG4gICAgZHJhZ092ZXJFdmVudCgnZHJhZ092ZXInKTtcbiAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuIGNvbXBsZXRlZEZpcmVkO1xuXG4gICAgaWYgKGRyYWdFbC5jb250YWlucyhldnQudGFyZ2V0KSB8fCB0YXJnZXQuYW5pbWF0ZWQgJiYgdGFyZ2V0LmFuaW1hdGluZ1ggJiYgdGFyZ2V0LmFuaW1hdGluZ1kgfHwgX3RoaXMuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID09PSB0YXJnZXQpIHtcbiAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgIH1cblxuICAgIGlnbm9yZU5leHRDbGljayA9IGZhbHNlO1xuXG4gICAgaWYgKGFjdGl2ZVNvcnRhYmxlICYmICFvcHRpb25zLmRpc2FibGVkICYmIChpc093bmVyID8gY2FuU29ydCB8fCAocmV2ZXJ0ID0gcGFyZW50RWwgIT09IHJvb3RFbCkgLy8gUmV2ZXJ0aW5nIGl0ZW0gaW50byB0aGUgb3JpZ2luYWwgbGlzdFxuICAgIDogcHV0U29ydGFibGUgPT09IHRoaXMgfHwgKHRoaXMubGFzdFB1dE1vZGUgPSBhY3RpdmVHcm91cC5jaGVja1B1bGwodGhpcywgYWN0aXZlU29ydGFibGUsIGRyYWdFbCwgZXZ0KSkgJiYgZ3JvdXAuY2hlY2tQdXQodGhpcywgYWN0aXZlU29ydGFibGUsIGRyYWdFbCwgZXZ0KSkpIHtcbiAgICAgIHZlcnRpY2FsID0gdGhpcy5fZ2V0RGlyZWN0aW9uKGV2dCwgdGFyZ2V0KSA9PT0gJ3ZlcnRpY2FsJztcbiAgICAgIGRyYWdSZWN0ID0gZ2V0UmVjdChkcmFnRWwpO1xuICAgICAgZHJhZ092ZXJFdmVudCgnZHJhZ092ZXJWYWxpZCcpO1xuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybiBjb21wbGV0ZWRGaXJlZDtcblxuICAgICAgaWYgKHJldmVydCkge1xuICAgICAgICBwYXJlbnRFbCA9IHJvb3RFbDsgLy8gYWN0dWFsaXphdGlvblxuXG4gICAgICAgIGNhcHR1cmUoKTtcblxuICAgICAgICB0aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgICBkcmFnT3ZlckV2ZW50KCdyZXZlcnQnKTtcblxuICAgICAgICBpZiAoIVNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgICBpZiAobmV4dEVsKSB7XG4gICAgICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgbmV4dEVsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVsTGFzdENoaWxkID0gbGFzdENoaWxkKGVsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG5cbiAgICAgIGlmICghZWxMYXN0Q2hpbGQgfHwgX2dob3N0SXNMYXN0KGV2dCwgdmVydGljYWwsIHRoaXMpICYmICFlbExhc3RDaGlsZC5hbmltYXRlZCkge1xuICAgICAgICAvLyBJbnNlcnQgdG8gZW5kIG9mIGxpc3RcbiAgICAgICAgLy8gSWYgYWxyZWFkeSBhdCBlbmQgb2YgbGlzdDogRG8gbm90IGluc2VydFxuICAgICAgICBpZiAoZWxMYXN0Q2hpbGQgPT09IGRyYWdFbCkge1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICB9IC8vIGlmIHRoZXJlIGlzIGEgbGFzdCBlbGVtZW50LCBpdCBpcyB0aGUgdGFyZ2V0XG5cblxuICAgICAgICBpZiAoZWxMYXN0Q2hpbGQgJiYgZWwgPT09IGV2dC50YXJnZXQpIHtcbiAgICAgICAgICB0YXJnZXQgPSBlbExhc3RDaGlsZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICB0YXJnZXRSZWN0ID0gZ2V0UmVjdCh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCBldnQsICEhdGFyZ2V0KSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjYXB0dXJlKCk7XG4gICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoZHJhZ0VsKTtcbiAgICAgICAgICBwYXJlbnRFbCA9IGVsOyAvLyBhY3R1YWxpemF0aW9uXG5cbiAgICAgICAgICBjaGFuZ2VkKCk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbExhc3RDaGlsZCAmJiBfZ2hvc3RJc0ZpcnN0KGV2dCwgdmVydGljYWwsIHRoaXMpKSB7XG4gICAgICAgIC8vIEluc2VydCB0byBzdGFydCBvZiBsaXN0XG4gICAgICAgIHZhciBmaXJzdENoaWxkID0gZ2V0Q2hpbGQoZWwsIDAsIG9wdGlvbnMsIHRydWUpO1xuXG4gICAgICAgIGlmIChmaXJzdENoaWxkID09PSBkcmFnRWwpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldCA9IGZpcnN0Q2hpbGQ7XG4gICAgICAgIHRhcmdldFJlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG5cbiAgICAgICAgaWYgKF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCBldnQsIGZhbHNlKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjYXB0dXJlKCk7XG4gICAgICAgICAgZWwuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgZmlyc3RDaGlsZCk7XG4gICAgICAgICAgcGFyZW50RWwgPSBlbDsgLy8gYWN0dWFsaXphdGlvblxuXG4gICAgICAgICAgY2hhbmdlZCgpO1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LnBhcmVudE5vZGUgPT09IGVsKSB7XG4gICAgICAgIHRhcmdldFJlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSAwLFxuICAgICAgICAgICAgdGFyZ2V0QmVmb3JlRmlyc3RTd2FwLFxuICAgICAgICAgICAgZGlmZmVyZW50TGV2ZWwgPSBkcmFnRWwucGFyZW50Tm9kZSAhPT0gZWwsXG4gICAgICAgICAgICBkaWZmZXJlbnRSb3dDb2wgPSAhX2RyYWdFbEluUm93Q29sdW1uKGRyYWdFbC5hbmltYXRlZCAmJiBkcmFnRWwudG9SZWN0IHx8IGRyYWdSZWN0LCB0YXJnZXQuYW5pbWF0ZWQgJiYgdGFyZ2V0LnRvUmVjdCB8fCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCksXG4gICAgICAgICAgICBzaWRlMSA9IHZlcnRpY2FsID8gJ3RvcCcgOiAnbGVmdCcsXG4gICAgICAgICAgICBzY3JvbGxlZFBhc3RUb3AgPSBpc1Njcm9sbGVkUGFzdCh0YXJnZXQsICd0b3AnLCAndG9wJykgfHwgaXNTY3JvbGxlZFBhc3QoZHJhZ0VsLCAndG9wJywgJ3RvcCcpLFxuICAgICAgICAgICAgc2Nyb2xsQmVmb3JlID0gc2Nyb2xsZWRQYXN0VG9wID8gc2Nyb2xsZWRQYXN0VG9wLnNjcm9sbFRvcCA6IHZvaWQgMDtcblxuICAgICAgICBpZiAobGFzdFRhcmdldCAhPT0gdGFyZ2V0KSB7XG4gICAgICAgICAgdGFyZ2V0QmVmb3JlRmlyc3RTd2FwID0gdGFyZ2V0UmVjdFtzaWRlMV07XG4gICAgICAgICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gZmFsc2U7XG4gICAgICAgICAgaXNDaXJjdW1zdGFudGlhbEludmVydCA9ICFkaWZmZXJlbnRSb3dDb2wgJiYgb3B0aW9ucy5pbnZlcnRTd2FwIHx8IGRpZmZlcmVudExldmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlyZWN0aW9uID0gX2dldFN3YXBEaXJlY3Rpb24oZXZ0LCB0YXJnZXQsIHRhcmdldFJlY3QsIHZlcnRpY2FsLCBkaWZmZXJlbnRSb3dDb2wgPyAxIDogb3B0aW9ucy5zd2FwVGhyZXNob2xkLCBvcHRpb25zLmludmVydGVkU3dhcFRocmVzaG9sZCA9PSBudWxsID8gb3B0aW9ucy5zd2FwVGhyZXNob2xkIDogb3B0aW9ucy5pbnZlcnRlZFN3YXBUaHJlc2hvbGQsIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQsIGxhc3RUYXJnZXQgPT09IHRhcmdldCk7XG4gICAgICAgIHZhciBzaWJsaW5nO1xuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0YXJnZXQgaXMgYmVzaWRlIGRyYWdFbCBpbiByZXNwZWN0aXZlIGRpcmVjdGlvbiAoaWdub3JpbmcgaGlkZGVuIGVsZW1lbnRzKVxuICAgICAgICAgIHZhciBkcmFnSW5kZXggPSBpbmRleChkcmFnRWwpO1xuXG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgZHJhZ0luZGV4IC09IGRpcmVjdGlvbjtcbiAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnRFbC5jaGlsZHJlbltkcmFnSW5kZXhdO1xuICAgICAgICAgIH0gd2hpbGUgKHNpYmxpbmcgJiYgKGNzcyhzaWJsaW5nLCAnZGlzcGxheScpID09PSAnbm9uZScgfHwgc2libGluZyA9PT0gZ2hvc3RFbCkpO1xuICAgICAgICB9IC8vIElmIGRyYWdFbCBpcyBhbHJlYWR5IGJlc2lkZSB0YXJnZXQ6IERvIG5vdCBpbnNlcnRcblxuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IDAgfHwgc2libGluZyA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICBsYXN0RGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICB2YXIgbmV4dFNpYmxpbmcgPSB0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nLFxuICAgICAgICAgICAgYWZ0ZXIgPSBmYWxzZTtcbiAgICAgICAgYWZ0ZXIgPSBkaXJlY3Rpb24gPT09IDE7XG5cbiAgICAgICAgdmFyIG1vdmVWZWN0b3IgPSBfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgdGFyZ2V0UmVjdCwgZXZ0LCBhZnRlcik7XG5cbiAgICAgICAgaWYgKG1vdmVWZWN0b3IgIT09IGZhbHNlKSB7XG4gICAgICAgICAgaWYgKG1vdmVWZWN0b3IgPT09IDEgfHwgbW92ZVZlY3RvciA9PT0gLTEpIHtcbiAgICAgICAgICAgIGFmdGVyID0gbW92ZVZlY3RvciA9PT0gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfc2lsZW50ID0gdHJ1ZTtcbiAgICAgICAgICBzZXRUaW1lb3V0KF91bnNpbGVudCwgMzApO1xuICAgICAgICAgIGNhcHR1cmUoKTtcblxuICAgICAgICAgIGlmIChhZnRlciAmJiAhbmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkcmFnRWwsIGFmdGVyID8gbmV4dFNpYmxpbmcgOiB0YXJnZXQpO1xuICAgICAgICAgIH0gLy8gVW5kbyBjaHJvbWUncyBzY3JvbGwgYWRqdXN0bWVudCAoaGFzIG5vIGVmZmVjdCBvbiBvdGhlciBicm93c2VycylcblxuXG4gICAgICAgICAgaWYgKHNjcm9sbGVkUGFzdFRvcCkge1xuICAgICAgICAgICAgc2Nyb2xsQnkoc2Nyb2xsZWRQYXN0VG9wLCAwLCBzY3JvbGxCZWZvcmUgLSBzY3JvbGxlZFBhc3RUb3Auc2Nyb2xsVG9wKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJlbnRFbCA9IGRyYWdFbC5wYXJlbnROb2RlOyAvLyBhY3R1YWxpemF0aW9uXG4gICAgICAgICAgLy8gbXVzdCBiZSBkb25lIGJlZm9yZSBhbmltYXRpb25cblxuICAgICAgICAgIGlmICh0YXJnZXRCZWZvcmVGaXJzdFN3YXAgIT09IHVuZGVmaW5lZCAmJiAhaXNDaXJjdW1zdGFudGlhbEludmVydCkge1xuICAgICAgICAgICAgdGFyZ2V0TW92ZURpc3RhbmNlID0gTWF0aC5hYnModGFyZ2V0QmVmb3JlRmlyc3RTd2FwIC0gZ2V0UmVjdCh0YXJnZXQpW3NpZGUxXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hhbmdlZCgpO1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGVsLmNvbnRhaW5zKGRyYWdFbCkpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBfaWdub3JlV2hpbGVBbmltYXRpbmc6IG51bGwsXG4gIF9vZmZNb3ZlRXZlbnRzOiBmdW5jdGlvbiBfb2ZmTW92ZUV2ZW50cygpIHtcbiAgICBvZmYoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgIG9mZihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgIG9mZihkb2N1bWVudCwgJ2RyYWdvdmVyJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgIG9mZihkb2N1bWVudCwgJ21vdXNlbW92ZScsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICBvZmYoZG9jdW1lbnQsICd0b3VjaG1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gIH0sXG4gIF9vZmZVcEV2ZW50czogZnVuY3Rpb24gX29mZlVwRXZlbnRzKCkge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gdGhpcy5lbC5vd25lckRvY3VtZW50O1xuICAgIG9mZihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX29uRHJvcCk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX29uRHJvcCk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihkb2N1bWVudCwgJ3NlbGVjdHN0YXJ0JywgdGhpcyk7XG4gIH0sXG4gIF9vbkRyb3A6IGZ1bmN0aW9uIF9vbkRyb3AoXG4gIC8qKkV2ZW50Ki9cbiAgZXZ0KSB7XG4gICAgdmFyIGVsID0gdGhpcy5lbCxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50XG5cbiAgICBuZXdJbmRleCA9IGluZGV4KGRyYWdFbCk7XG4gICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICBwbHVnaW5FdmVudCgnZHJvcCcsIHRoaXMsIHtcbiAgICAgIGV2dDogZXZ0XG4gICAgfSk7XG4gICAgcGFyZW50RWwgPSBkcmFnRWwgJiYgZHJhZ0VsLnBhcmVudE5vZGU7IC8vIEdldCBhZ2FpbiBhZnRlciBwbHVnaW4gZXZlbnRcblxuICAgIG5ld0luZGV4ID0gaW5kZXgoZHJhZ0VsKTtcbiAgICBuZXdEcmFnZ2FibGVJbmRleCA9IGluZGV4KGRyYWdFbCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuXG4gICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgIHRoaXMuX251bGxpbmcoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0aW5nRHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICBpc0NpcmN1bXN0YW50aWFsSW52ZXJ0ID0gZmFsc2U7XG4gICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gZmFsc2U7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9sb29wSWQpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9kcmFnU3RhcnRUaW1lcik7XG5cbiAgICBfY2FuY2VsTmV4dFRpY2sodGhpcy5jbG9uZUlkKTtcblxuICAgIF9jYW5jZWxOZXh0VGljayh0aGlzLl9kcmFnU3RhcnRJZCk7IC8vIFVuYmluZCBldmVudHNcblxuXG4gICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICBvZmYoZG9jdW1lbnQsICdkcm9wJywgdGhpcyk7XG4gICAgICBvZmYoZWwsICdkcmFnc3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydCk7XG4gICAgfVxuXG4gICAgdGhpcy5fb2ZmTW92ZUV2ZW50cygpO1xuXG4gICAgdGhpcy5fb2ZmVXBFdmVudHMoKTtcblxuICAgIGlmIChTYWZhcmkpIHtcbiAgICAgIGNzcyhkb2N1bWVudC5ib2R5LCAndXNlci1zZWxlY3QnLCAnJyk7XG4gICAgfVxuXG4gICAgY3NzKGRyYWdFbCwgJ3RyYW5zZm9ybScsICcnKTtcblxuICAgIGlmIChldnQpIHtcbiAgICAgIGlmIChtb3ZlZCkge1xuICAgICAgICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgIW9wdGlvbnMuZHJvcEJ1YmJsZSAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGdob3N0RWwgJiYgZ2hvc3RFbC5wYXJlbnROb2RlICYmIGdob3N0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChnaG9zdEVsKTtcblxuICAgICAgaWYgKHJvb3RFbCA9PT0gcGFyZW50RWwgfHwgcHV0U29ydGFibGUgJiYgcHV0U29ydGFibGUubGFzdFB1dE1vZGUgIT09ICdjbG9uZScpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGNsb25lKHMpXG4gICAgICAgIGNsb25lRWwgJiYgY2xvbmVFbC5wYXJlbnROb2RlICYmIGNsb25lRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZUVsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdFbCkge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgICBvZmYoZHJhZ0VsLCAnZHJhZ2VuZCcsIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2Rpc2FibGVEcmFnZ2FibGUoZHJhZ0VsKTtcblxuICAgICAgICBkcmFnRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnJzsgLy8gUmVtb3ZlIGNsYXNzZXNcbiAgICAgICAgLy8gZ2hvc3RDbGFzcyBpcyBhZGRlZCBpbiBkcmFnU3RhcnRlZFxuXG4gICAgICAgIGlmIChtb3ZlZCAmJiAhYXdhaXRpbmdEcmFnU3RhcnRlZCkge1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgcHV0U29ydGFibGUgPyBwdXRTb3J0YWJsZS5vcHRpb25zLmdob3N0Q2xhc3MgOiB0aGlzLm9wdGlvbnMuZ2hvc3RDbGFzcywgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTsgLy8gRHJhZyBzdG9wIGV2ZW50XG5cbiAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgIG5hbWU6ICd1bmNob29zZScsXG4gICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgbmV3SW5kZXg6IG51bGwsXG4gICAgICAgICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG51bGwsXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyb290RWwgIT09IHBhcmVudEVsKSB7XG4gICAgICAgICAgaWYgKG5ld0luZGV4ID49IDApIHtcbiAgICAgICAgICAgIC8vIEFkZCBldmVudFxuICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICByb290RWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBuYW1lOiAnYWRkJyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIGZyb21FbDogcm9vdEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pOyAvLyBSZW1vdmUgZXZlbnRcblxuXG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICBuYW1lOiAncmVtb3ZlJyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgfSk7IC8vIGRyYWcgZnJvbSBvbmUgbGlzdCBhbmQgZHJvcCBpbnRvIGFub3RoZXJcblxuXG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHJvb3RFbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIG5hbWU6ICdzb3J0JyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIGZyb21FbDogcm9vdEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICBuYW1lOiAnc29ydCcsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLnNhdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobmV3SW5kZXggIT09IG9sZEluZGV4KSB7XG4gICAgICAgICAgICBpZiAobmV3SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAvLyBkcmFnICYgZHJvcCB3aXRoaW4gdGhlIHNhbWUgbGlzdFxuICAgICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmFtZTogJ3VwZGF0ZScsXG4gICAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnc29ydCcsXG4gICAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChTb3J0YWJsZS5hY3RpdmUpIHtcbiAgICAgICAgICAvKiBqc2hpbnQgZXFudWxsOnRydWUgKi9cbiAgICAgICAgICBpZiAobmV3SW5kZXggPT0gbnVsbCB8fCBuZXdJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIG5ld0luZGV4ID0gb2xkSW5kZXg7XG4gICAgICAgICAgICBuZXdEcmFnZ2FibGVJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgbmFtZTogJ2VuZCcsXG4gICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgIH0pOyAvLyBTYXZlIHNvcnRpbmdcblxuXG4gICAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9udWxsaW5nKCk7XG4gIH0sXG4gIF9udWxsaW5nOiBmdW5jdGlvbiBfbnVsbGluZygpIHtcbiAgICBwbHVnaW5FdmVudCgnbnVsbGluZycsIHRoaXMpO1xuICAgIHJvb3RFbCA9IGRyYWdFbCA9IHBhcmVudEVsID0gZ2hvc3RFbCA9IG5leHRFbCA9IGNsb25lRWwgPSBsYXN0RG93bkVsID0gY2xvbmVIaWRkZW4gPSB0YXBFdnQgPSB0b3VjaEV2dCA9IG1vdmVkID0gbmV3SW5kZXggPSBuZXdEcmFnZ2FibGVJbmRleCA9IG9sZEluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXggPSBsYXN0VGFyZ2V0ID0gbGFzdERpcmVjdGlvbiA9IHB1dFNvcnRhYmxlID0gYWN0aXZlR3JvdXAgPSBTb3J0YWJsZS5kcmFnZ2VkID0gU29ydGFibGUuZ2hvc3QgPSBTb3J0YWJsZS5jbG9uZSA9IFNvcnRhYmxlLmFjdGl2ZSA9IG51bGw7XG4gICAgc2F2ZWRJbnB1dENoZWNrZWQuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgIGVsLmNoZWNrZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHNhdmVkSW5wdXRDaGVja2VkLmxlbmd0aCA9IGxhc3REeCA9IGxhc3REeSA9IDA7XG4gIH0sXG4gIGhhbmRsZUV2ZW50OiBmdW5jdGlvbiBoYW5kbGVFdmVudChcbiAgLyoqRXZlbnQqL1xuICBldnQpIHtcbiAgICBzd2l0Y2ggKGV2dC50eXBlKSB7XG4gICAgICBjYXNlICdkcm9wJzpcbiAgICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgICAgICB0aGlzLl9vbkRyb3AoZXZ0KTtcblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICAgICAgaWYgKGRyYWdFbCkge1xuICAgICAgICAgIHRoaXMuX29uRHJhZ092ZXIoZXZ0KTtcblxuICAgICAgICAgIF9nbG9iYWxEcmFnT3ZlcihldnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbGVjdHN0YXJ0JzpcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU2VyaWFsaXplcyB0aGUgaXRlbSBpbnRvIGFuIGFycmF5IG9mIHN0cmluZy5cbiAgICogQHJldHVybnMge1N0cmluZ1tdfVxuICAgKi9cbiAgdG9BcnJheTogZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICB2YXIgb3JkZXIgPSBbXSxcbiAgICAgICAgZWwsXG4gICAgICAgIGNoaWxkcmVuID0gdGhpcy5lbC5jaGlsZHJlbixcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIG4gPSBjaGlsZHJlbi5sZW5ndGgsXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBmb3IgKDsgaSA8IG47IGkrKykge1xuICAgICAgZWwgPSBjaGlsZHJlbltpXTtcblxuICAgICAgaWYgKGNsb3Nlc3QoZWwsIG9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLmVsLCBmYWxzZSkpIHtcbiAgICAgICAgb3JkZXIucHVzaChlbC5nZXRBdHRyaWJ1dGUob3B0aW9ucy5kYXRhSWRBdHRyKSB8fCBfZ2VuZXJhdGVJZChlbCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcmRlcjtcbiAgfSxcblxuICAvKipcbiAgICogU29ydHMgdGhlIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgYXJyYXkuXG4gICAqIEBwYXJhbSAge1N0cmluZ1tdfSAgb3JkZXIgIG9yZGVyIG9mIHRoZSBpdGVtc1xuICAgKi9cbiAgc29ydDogZnVuY3Rpb24gc29ydChvcmRlciwgdXNlQW5pbWF0aW9uKSB7XG4gICAgdmFyIGl0ZW1zID0ge30sXG4gICAgICAgIHJvb3RFbCA9IHRoaXMuZWw7XG4gICAgdGhpcy50b0FycmF5KCkuZm9yRWFjaChmdW5jdGlvbiAoaWQsIGkpIHtcbiAgICAgIHZhciBlbCA9IHJvb3RFbC5jaGlsZHJlbltpXTtcblxuICAgICAgaWYgKGNsb3Nlc3QoZWwsIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUsIHJvb3RFbCwgZmFsc2UpKSB7XG4gICAgICAgIGl0ZW1zW2lkXSA9IGVsO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICAgIHVzZUFuaW1hdGlvbiAmJiB0aGlzLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIG9yZGVyLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICBpZiAoaXRlbXNbaWRdKSB7XG4gICAgICAgIHJvb3RFbC5yZW1vdmVDaGlsZChpdGVtc1tpZF0pO1xuICAgICAgICByb290RWwuYXBwZW5kQ2hpbGQoaXRlbXNbaWRdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1c2VBbmltYXRpb24gJiYgdGhpcy5hbmltYXRlQWxsKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIGN1cnJlbnQgc29ydGluZ1xuICAgKi9cbiAgc2F2ZTogZnVuY3Rpb24gc2F2ZSgpIHtcbiAgICB2YXIgc3RvcmUgPSB0aGlzLm9wdGlvbnMuc3RvcmU7XG4gICAgc3RvcmUgJiYgc3RvcmUuc2V0ICYmIHN0b3JlLnNldCh0aGlzKTtcbiAgfSxcblxuICAvKipcbiAgICogRm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0LCBnZXQgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciBieSB0ZXN0aW5nIHRoZSBlbGVtZW50IGl0c2VsZiBhbmQgdHJhdmVyc2luZyB1cCB0aHJvdWdoIGl0cyBhbmNlc3RvcnMgaW4gdGhlIERPTSB0cmVlLlxuICAgKiBAcGFyYW0gICB7SFRNTEVsZW1lbnR9ICBlbFxuICAgKiBAcGFyYW0gICB7U3RyaW5nfSAgICAgICBbc2VsZWN0b3JdICBkZWZhdWx0OiBgb3B0aW9ucy5kcmFnZ2FibGVgXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgY2xvc2VzdDogZnVuY3Rpb24gY2xvc2VzdCQxKGVsLCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBjbG9zZXN0KGVsLCBzZWxlY3RvciB8fCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLmVsLCBmYWxzZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldC9nZXQgb3B0aW9uXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtICAgeyp9ICAgICAgW3ZhbHVlXVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIG9wdGlvbjogZnVuY3Rpb24gb3B0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnNbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtb2RpZmllZFZhbHVlID0gUGx1Z2luTWFuYWdlci5tb2RpZnlPcHRpb24odGhpcywgbmFtZSwgdmFsdWUpO1xuXG4gICAgICBpZiAodHlwZW9mIG1vZGlmaWVkVmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9wdGlvbnNbbmFtZV0gPSBtb2RpZmllZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmFtZSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRGVzdHJveVxuICAgKi9cbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBwbHVnaW5FdmVudCgnZGVzdHJveScsIHRoaXMpO1xuICAgIHZhciBlbCA9IHRoaXMuZWw7XG4gICAgZWxbZXhwYW5kb10gPSBudWxsO1xuICAgIG9mZihlbCwgJ21vdXNlZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuICAgIG9mZihlbCwgJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgICBvZmYoZWwsICdwb2ludGVyZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuXG4gICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICBvZmYoZWwsICdkcmFnb3ZlcicsIHRoaXMpO1xuICAgICAgb2ZmKGVsLCAnZHJhZ2VudGVyJywgdGhpcyk7XG4gICAgfSAvLyBSZW1vdmUgZHJhZ2dhYmxlIGF0dHJpYnV0ZXNcblxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlbC5xdWVyeVNlbGVjdG9yQWxsKCdbZHJhZ2dhYmxlXScpLCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dhYmxlJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9vbkRyb3AoKTtcblxuICAgIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpO1xuXG4gICAgc29ydGFibGVzLnNwbGljZShzb3J0YWJsZXMuaW5kZXhPZih0aGlzLmVsKSwgMSk7XG4gICAgdGhpcy5lbCA9IGVsID0gbnVsbDtcbiAgfSxcbiAgX2hpZGVDbG9uZTogZnVuY3Rpb24gX2hpZGVDbG9uZSgpIHtcbiAgICBpZiAoIWNsb25lSGlkZGVuKSB7XG4gICAgICBwbHVnaW5FdmVudCgnaGlkZUNsb25lJywgdGhpcyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuO1xuICAgICAgY3NzKGNsb25lRWwsICdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSAmJiBjbG9uZUVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgY2xvbmVFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lRWwpO1xuICAgICAgfVxuXG4gICAgICBjbG9uZUhpZGRlbiA9IHRydWU7XG4gICAgfVxuICB9LFxuICBfc2hvd0Nsb25lOiBmdW5jdGlvbiBfc2hvd0Nsb25lKHB1dFNvcnRhYmxlKSB7XG4gICAgaWYgKHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlICE9PSAnY2xvbmUnKSB7XG4gICAgICB0aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjbG9uZUhpZGRlbikge1xuICAgICAgcGx1Z2luRXZlbnQoJ3Nob3dDbG9uZScsIHRoaXMpO1xuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybjsgLy8gc2hvdyBjbG9uZSBhdCBkcmFnRWwgb3Igb3JpZ2luYWwgcG9zaXRpb25cblxuICAgICAgaWYgKGRyYWdFbC5wYXJlbnROb2RlID09IHJvb3RFbCAmJiAhdGhpcy5vcHRpb25zLmdyb3VwLnJldmVydENsb25lKSB7XG4gICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmVFbCwgZHJhZ0VsKTtcbiAgICAgIH0gZWxzZSBpZiAobmV4dEVsKSB7XG4gICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmVFbCwgbmV4dEVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChjbG9uZUVsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncm91cC5yZXZlcnRDbG9uZSkge1xuICAgICAgICB0aGlzLmFuaW1hdGUoZHJhZ0VsLCBjbG9uZUVsKTtcbiAgICAgIH1cblxuICAgICAgY3NzKGNsb25lRWwsICdkaXNwbGF5JywgJycpO1xuICAgICAgY2xvbmVIaWRkZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9nbG9iYWxEcmFnT3Zlcihcbi8qKkV2ZW50Ki9cbmV2dCkge1xuICBpZiAoZXZ0LmRhdGFUcmFuc2Zlcikge1xuICAgIGV2dC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcbiAgfVxuXG4gIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG5mdW5jdGlvbiBfb25Nb3ZlKGZyb21FbCwgdG9FbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0RWwsIHRhcmdldFJlY3QsIG9yaWdpbmFsRXZlbnQsIHdpbGxJbnNlcnRBZnRlcikge1xuICB2YXIgZXZ0LFxuICAgICAgc29ydGFibGUgPSBmcm9tRWxbZXhwYW5kb10sXG4gICAgICBvbk1vdmVGbiA9IHNvcnRhYmxlLm9wdGlvbnMub25Nb3ZlLFxuICAgICAgcmV0VmFsOyAvLyBTdXBwb3J0IGZvciBuZXcgQ3VzdG9tRXZlbnQgZmVhdHVyZVxuXG4gIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgIUlFMTFPckxlc3MgJiYgIUVkZ2UpIHtcbiAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ21vdmUnLCB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2dC5pbml0RXZlbnQoJ21vdmUnLCB0cnVlLCB0cnVlKTtcbiAgfVxuXG4gIGV2dC50byA9IHRvRWw7XG4gIGV2dC5mcm9tID0gZnJvbUVsO1xuICBldnQuZHJhZ2dlZCA9IGRyYWdFbDtcbiAgZXZ0LmRyYWdnZWRSZWN0ID0gZHJhZ1JlY3Q7XG4gIGV2dC5yZWxhdGVkID0gdGFyZ2V0RWwgfHwgdG9FbDtcbiAgZXZ0LnJlbGF0ZWRSZWN0ID0gdGFyZ2V0UmVjdCB8fCBnZXRSZWN0KHRvRWwpO1xuICBldnQud2lsbEluc2VydEFmdGVyID0gd2lsbEluc2VydEFmdGVyO1xuICBldnQub3JpZ2luYWxFdmVudCA9IG9yaWdpbmFsRXZlbnQ7XG4gIGZyb21FbC5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cbiAgaWYgKG9uTW92ZUZuKSB7XG4gICAgcmV0VmFsID0gb25Nb3ZlRm4uY2FsbChzb3J0YWJsZSwgZXZ0LCBvcmlnaW5hbEV2ZW50KTtcbiAgfVxuXG4gIHJldHVybiByZXRWYWw7XG59XG5cbmZ1bmN0aW9uIF9kaXNhYmxlRHJhZ2dhYmxlKGVsKSB7XG4gIGVsLmRyYWdnYWJsZSA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBfdW5zaWxlbnQoKSB7XG4gIF9zaWxlbnQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gX2dob3N0SXNGaXJzdChldnQsIHZlcnRpY2FsLCBzb3J0YWJsZSkge1xuICB2YXIgcmVjdCA9IGdldFJlY3QoZ2V0Q2hpbGQoc29ydGFibGUuZWwsIDAsIHNvcnRhYmxlLm9wdGlvbnMsIHRydWUpKTtcbiAgdmFyIHNwYWNlciA9IDEwO1xuICByZXR1cm4gdmVydGljYWwgPyBldnQuY2xpZW50WCA8IHJlY3QubGVmdCAtIHNwYWNlciB8fCBldnQuY2xpZW50WSA8IHJlY3QudG9wICYmIGV2dC5jbGllbnRYIDwgcmVjdC5yaWdodCA6IGV2dC5jbGllbnRZIDwgcmVjdC50b3AgLSBzcGFjZXIgfHwgZXZ0LmNsaWVudFkgPCByZWN0LmJvdHRvbSAmJiBldnQuY2xpZW50WCA8IHJlY3QubGVmdDtcbn1cblxuZnVuY3Rpb24gX2dob3N0SXNMYXN0KGV2dCwgdmVydGljYWwsIHNvcnRhYmxlKSB7XG4gIHZhciByZWN0ID0gZ2V0UmVjdChsYXN0Q2hpbGQoc29ydGFibGUuZWwsIHNvcnRhYmxlLm9wdGlvbnMuZHJhZ2dhYmxlKSk7XG4gIHZhciBzcGFjZXIgPSAxMDtcbiAgcmV0dXJuIHZlcnRpY2FsID8gZXZ0LmNsaWVudFggPiByZWN0LnJpZ2h0ICsgc3BhY2VyIHx8IGV2dC5jbGllbnRYIDw9IHJlY3QucmlnaHQgJiYgZXZ0LmNsaWVudFkgPiByZWN0LmJvdHRvbSAmJiBldnQuY2xpZW50WCA+PSByZWN0LmxlZnQgOiBldnQuY2xpZW50WCA+IHJlY3QucmlnaHQgJiYgZXZ0LmNsaWVudFkgPiByZWN0LnRvcCB8fCBldnQuY2xpZW50WCA8PSByZWN0LnJpZ2h0ICYmIGV2dC5jbGllbnRZID4gcmVjdC5ib3R0b20gKyBzcGFjZXI7XG59XG5cbmZ1bmN0aW9uIF9nZXRTd2FwRGlyZWN0aW9uKGV2dCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCwgc3dhcFRocmVzaG9sZCwgaW52ZXJ0ZWRTd2FwVGhyZXNob2xkLCBpbnZlcnRTd2FwLCBpc0xhc3RUYXJnZXQpIHtcbiAgdmFyIG1vdXNlT25BeGlzID0gdmVydGljYWwgPyBldnQuY2xpZW50WSA6IGV2dC5jbGllbnRYLFxuICAgICAgdGFyZ2V0TGVuZ3RoID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LmhlaWdodCA6IHRhcmdldFJlY3Qud2lkdGgsXG4gICAgICB0YXJnZXRTMSA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC50b3AgOiB0YXJnZXRSZWN0LmxlZnQsXG4gICAgICB0YXJnZXRTMiA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5ib3R0b20gOiB0YXJnZXRSZWN0LnJpZ2h0LFxuICAgICAgaW52ZXJ0ID0gZmFsc2U7XG5cbiAgaWYgKCFpbnZlcnRTd2FwKSB7XG4gICAgLy8gTmV2ZXIgaW52ZXJ0IG9yIGNyZWF0ZSBkcmFnRWwgc2hhZG93IHdoZW4gdGFyZ2V0IG1vdmVtZW5ldCBjYXVzZXMgbW91c2UgdG8gbW92ZSBwYXN0IHRoZSBlbmQgb2YgcmVndWxhciBzd2FwVGhyZXNob2xkXG4gICAgaWYgKGlzTGFzdFRhcmdldCAmJiB0YXJnZXRNb3ZlRGlzdGFuY2UgPCB0YXJnZXRMZW5ndGggKiBzd2FwVGhyZXNob2xkKSB7XG4gICAgICAvLyBtdWx0aXBsaWVkIG9ubHkgYnkgc3dhcFRocmVzaG9sZCBiZWNhdXNlIG1vdXNlIHdpbGwgYWxyZWFkeSBiZSBpbnNpZGUgdGFyZ2V0IGJ5ICgxIC0gdGhyZXNob2xkKSAqIHRhcmdldExlbmd0aCAvIDJcbiAgICAgIC8vIGNoZWNrIGlmIHBhc3QgZmlyc3QgaW52ZXJ0IHRocmVzaG9sZCBvbiBzaWRlIG9wcG9zaXRlIG9mIGxhc3REaXJlY3Rpb25cbiAgICAgIGlmICghcGFzdEZpcnN0SW52ZXJ0VGhyZXNoICYmIChsYXN0RGlyZWN0aW9uID09PSAxID8gbW91c2VPbkF4aXMgPiB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIgOiBtb3VzZU9uQXhpcyA8IHRhcmdldFMyIC0gdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMikpIHtcbiAgICAgICAgLy8gcGFzdCBmaXJzdCBpbnZlcnQgdGhyZXNob2xkLCBkbyBub3QgcmVzdHJpY3QgaW52ZXJ0ZWQgdGhyZXNob2xkIHRvIGRyYWdFbCBzaGFkb3dcbiAgICAgICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwYXN0Rmlyc3RJbnZlcnRUaHJlc2gpIHtcbiAgICAgICAgLy8gZHJhZ0VsIHNoYWRvdyAodGFyZ2V0IG1vdmUgZGlzdGFuY2Ugc2hhZG93KVxuICAgICAgICBpZiAobGFzdERpcmVjdGlvbiA9PT0gMSA/IG1vdXNlT25BeGlzIDwgdGFyZ2V0UzEgKyB0YXJnZXRNb3ZlRGlzdGFuY2UgLy8gb3ZlciBkcmFnRWwgc2hhZG93XG4gICAgICAgIDogbW91c2VPbkF4aXMgPiB0YXJnZXRTMiAtIHRhcmdldE1vdmVEaXN0YW5jZSkge1xuICAgICAgICAgIHJldHVybiAtbGFzdERpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW52ZXJ0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVndWxhclxuICAgICAgaWYgKG1vdXNlT25BeGlzID4gdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggKiAoMSAtIHN3YXBUaHJlc2hvbGQpIC8gMiAmJiBtb3VzZU9uQXhpcyA8IHRhcmdldFMyIC0gdGFyZ2V0TGVuZ3RoICogKDEgLSBzd2FwVGhyZXNob2xkKSAvIDIpIHtcbiAgICAgICAgcmV0dXJuIF9nZXRJbnNlcnREaXJlY3Rpb24odGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpbnZlcnQgPSBpbnZlcnQgfHwgaW52ZXJ0U3dhcDtcblxuICBpZiAoaW52ZXJ0KSB7XG4gICAgLy8gSW52ZXJ0IG9mIHJlZ3VsYXJcbiAgICBpZiAobW91c2VPbkF4aXMgPCB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIgfHwgbW91c2VPbkF4aXMgPiB0YXJnZXRTMiAtIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIpIHtcbiAgICAgIHJldHVybiBtb3VzZU9uQXhpcyA+IHRhcmdldFMxICsgdGFyZ2V0TGVuZ3RoIC8gMiA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cbi8qKlxuICogR2V0cyB0aGUgZGlyZWN0aW9uIGRyYWdFbCBtdXN0IGJlIHN3YXBwZWQgcmVsYXRpdmUgdG8gdGFyZ2V0IGluIG9yZGVyIHRvIG1ha2UgaXRcbiAqIHNlZW0gdGhhdCBkcmFnRWwgaGFzIGJlZW4gXCJpbnNlcnRlZFwiIGludG8gdGhhdCBlbGVtZW50J3MgcG9zaXRpb25cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSB0YXJnZXQgICAgICAgVGhlIHRhcmdldCB3aG9zZSBwb3NpdGlvbiBkcmFnRWwgaXMgYmVpbmcgaW5zZXJ0ZWQgYXRcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uIGRyYWdFbCBtdXN0IGJlIHN3YXBwZWRcbiAqL1xuXG5cbmZ1bmN0aW9uIF9nZXRJbnNlcnREaXJlY3Rpb24odGFyZ2V0KSB7XG4gIGlmIChpbmRleChkcmFnRWwpIDwgaW5kZXgodGFyZ2V0KSkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAtMTtcbiAgfVxufVxuLyoqXG4gKiBHZW5lcmF0ZSBpZFxuICogQHBhcmFtICAge0hUTUxFbGVtZW50fSBlbFxuICogQHJldHVybnMge1N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5mdW5jdGlvbiBfZ2VuZXJhdGVJZChlbCkge1xuICB2YXIgc3RyID0gZWwudGFnTmFtZSArIGVsLmNsYXNzTmFtZSArIGVsLnNyYyArIGVsLmhyZWYgKyBlbC50ZXh0Q29udGVudCxcbiAgICAgIGkgPSBzdHIubGVuZ3RoLFxuICAgICAgc3VtID0gMDtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgc3VtICs9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICB9XG5cbiAgcmV0dXJuIHN1bS50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIF9zYXZlSW5wdXRDaGVja2VkU3RhdGUocm9vdCkge1xuICBzYXZlZElucHV0Q2hlY2tlZC5sZW5ndGggPSAwO1xuICB2YXIgaW5wdXRzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTtcbiAgdmFyIGlkeCA9IGlucHV0cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGlkeC0tKSB7XG4gICAgdmFyIGVsID0gaW5wdXRzW2lkeF07XG4gICAgZWwuY2hlY2tlZCAmJiBzYXZlZElucHV0Q2hlY2tlZC5wdXNoKGVsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfbmV4dFRpY2soZm4pIHtcbiAgcmV0dXJuIHNldFRpbWVvdXQoZm4sIDApO1xufVxuXG5mdW5jdGlvbiBfY2FuY2VsTmV4dFRpY2soaWQpIHtcbiAgcmV0dXJuIGNsZWFyVGltZW91dChpZCk7XG59IC8vIEZpeGVkICM5NzM6XG5cblxuaWYgKGRvY3VtZW50RXhpc3RzKSB7XG4gIG9uKGRvY3VtZW50LCAndG91Y2htb3ZlJywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGlmICgoU29ydGFibGUuYWN0aXZlIHx8IGF3YWl0aW5nRHJhZ1N0YXJ0ZWQpICYmIGV2dC5jYW5jZWxhYmxlKSB7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0pO1xufSAvLyBFeHBvcnQgdXRpbHNcblxuXG5Tb3J0YWJsZS51dGlscyA9IHtcbiAgb246IG9uLFxuICBvZmY6IG9mZixcbiAgY3NzOiBjc3MsXG4gIGZpbmQ6IGZpbmQsXG4gIGlzOiBmdW5jdGlvbiBpcyhlbCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gISFjbG9zZXN0KGVsLCBzZWxlY3RvciwgZWwsIGZhbHNlKTtcbiAgfSxcbiAgZXh0ZW5kOiBleHRlbmQsXG4gIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgY2xvc2VzdDogY2xvc2VzdCxcbiAgdG9nZ2xlQ2xhc3M6IHRvZ2dsZUNsYXNzLFxuICBjbG9uZTogY2xvbmUsXG4gIGluZGV4OiBpbmRleCxcbiAgbmV4dFRpY2s6IF9uZXh0VGljayxcbiAgY2FuY2VsTmV4dFRpY2s6IF9jYW5jZWxOZXh0VGljayxcbiAgZGV0ZWN0RGlyZWN0aW9uOiBfZGV0ZWN0RGlyZWN0aW9uLFxuICBnZXRDaGlsZDogZ2V0Q2hpbGRcbn07XG4vKipcbiAqIEdldCB0aGUgU29ydGFibGUgaW5zdGFuY2Ugb2YgYW4gZWxlbWVudFxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnRcbiAqIEByZXR1cm4ge1NvcnRhYmxlfHVuZGVmaW5lZH0gICAgICAgICBUaGUgaW5zdGFuY2Ugb2YgU29ydGFibGVcbiAqL1xuXG5Tb3J0YWJsZS5nZXQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudFtleHBhbmRvXTtcbn07XG4vKipcbiAqIE1vdW50IGEgcGx1Z2luIHRvIFNvcnRhYmxlXG4gKiBAcGFyYW0gIHsuLi5Tb3J0YWJsZVBsdWdpbnxTb3J0YWJsZVBsdWdpbltdfSBwbHVnaW5zICAgICAgIFBsdWdpbnMgYmVpbmcgbW91bnRlZFxuICovXG5cblxuU29ydGFibGUubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwbHVnaW5zID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHBsdWdpbnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAocGx1Z2luc1swXS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHBsdWdpbnMgPSBwbHVnaW5zWzBdO1xuICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgIGlmICghcGx1Z2luLnByb3RvdHlwZSB8fCAhcGx1Z2luLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcikge1xuICAgICAgdGhyb3cgXCJTb3J0YWJsZTogTW91bnRlZCBwbHVnaW4gbXVzdCBiZSBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCBub3QgXCIuY29uY2F0KHt9LnRvU3RyaW5nLmNhbGwocGx1Z2luKSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbi51dGlscykgU29ydGFibGUudXRpbHMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgU29ydGFibGUudXRpbHMpLCBwbHVnaW4udXRpbHMpO1xuICAgIFBsdWdpbk1hbmFnZXIubW91bnQocGx1Z2luKTtcbiAgfSk7XG59O1xuLyoqXG4gKiBDcmVhdGUgc29ydGFibGUgaW5zdGFuY2VcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9ICBlbFxuICogQHBhcmFtIHtPYmplY3R9ICAgICAgW29wdGlvbnNdXG4gKi9cblxuXG5Tb3J0YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBTb3J0YWJsZShlbCwgb3B0aW9ucyk7XG59OyAvLyBFeHBvcnRcblxuXG5Tb3J0YWJsZS52ZXJzaW9uID0gdmVyc2lvbjtcblxudmFyIGF1dG9TY3JvbGxzID0gW10sXG4gICAgc2Nyb2xsRWwsXG4gICAgc2Nyb2xsUm9vdEVsLFxuICAgIHNjcm9sbGluZyA9IGZhbHNlLFxuICAgIGxhc3RBdXRvU2Nyb2xsWCxcbiAgICBsYXN0QXV0b1Njcm9sbFksXG4gICAgdG91Y2hFdnQkMSxcbiAgICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbDtcblxuZnVuY3Rpb24gQXV0b1Njcm9sbFBsdWdpbigpIHtcbiAgZnVuY3Rpb24gQXV0b1Njcm9sbCgpIHtcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgc2Nyb2xsOiB0cnVlLFxuICAgICAgZm9yY2VBdXRvU2Nyb2xsRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgc2Nyb2xsU2Vuc2l0aXZpdHk6IDMwLFxuICAgICAgc2Nyb2xsU3BlZWQ6IDEwLFxuICAgICAgYnViYmxlU2Nyb2xsOiB0cnVlXG4gICAgfTsgLy8gQmluZCBhbGwgcHJpdmF0ZSBtZXRob2RzXG5cbiAgICBmb3IgKHZhciBmbiBpbiB0aGlzKSB7XG4gICAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXNbZm5dID0gdGhpc1tmbl0uYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBBdXRvU2Nyb2xsLnByb3RvdHlwZSA9IHtcbiAgICBkcmFnU3RhcnRlZDogZnVuY3Rpb24gZHJhZ1N0YXJ0ZWQoX3JlZikge1xuICAgICAgdmFyIG9yaWdpbmFsRXZlbnQgPSBfcmVmLm9yaWdpbmFsRXZlbnQ7XG5cbiAgICAgIGlmICh0aGlzLnNvcnRhYmxlLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICBvbihkb2N1bWVudCwgJ2RyYWdvdmVyJywgdGhpcy5faGFuZGxlQXV0b1Njcm9sbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN1cHBvcnRQb2ludGVyKSB7XG4gICAgICAgICAgb24oZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3JpZ2luYWxFdmVudC50b3VjaGVzKSB7XG4gICAgICAgICAgb24oZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZHJhZ092ZXJDb21wbGV0ZWQ6IGZ1bmN0aW9uIGRyYWdPdmVyQ29tcGxldGVkKF9yZWYyKSB7XG4gICAgICB2YXIgb3JpZ2luYWxFdmVudCA9IF9yZWYyLm9yaWdpbmFsRXZlbnQ7XG5cbiAgICAgIC8vIEZvciB3aGVuIGJ1YmJsaW5nIGlzIGNhbmNlbGVkIGFuZCB1c2luZyBmYWxsYmFjayAoZmFsbGJhY2sgJ3RvdWNobW92ZScgYWx3YXlzIHJlYWNoZWQpXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5kcmFnT3ZlckJ1YmJsZSAmJiAhb3JpZ2luYWxFdmVudC5yb290RWwpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlQXV0b1Njcm9sbChvcmlnaW5hbEV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyb3A6IGZ1bmN0aW9uIGRyb3AoKSB7XG4gICAgICBpZiAodGhpcy5zb3J0YWJsZS5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAnZHJhZ292ZXInLCB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgIH1cblxuICAgICAgY2xlYXJQb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCgpO1xuICAgICAgY2xlYXJBdXRvU2Nyb2xscygpO1xuICAgICAgY2FuY2VsVGhyb3R0bGUoKTtcbiAgICB9LFxuICAgIG51bGxpbmc6IGZ1bmN0aW9uIG51bGxpbmcoKSB7XG4gICAgICB0b3VjaEV2dCQxID0gc2Nyb2xsUm9vdEVsID0gc2Nyb2xsRWwgPSBzY3JvbGxpbmcgPSBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCA9IGxhc3RBdXRvU2Nyb2xsWCA9IGxhc3RBdXRvU2Nyb2xsWSA9IG51bGw7XG4gICAgICBhdXRvU2Nyb2xscy5sZW5ndGggPSAwO1xuICAgIH0sXG4gICAgX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbDogZnVuY3Rpb24gX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbChldnQpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUF1dG9TY3JvbGwoZXZ0LCB0cnVlKTtcbiAgICB9LFxuICAgIF9oYW5kbGVBdXRvU2Nyb2xsOiBmdW5jdGlvbiBfaGFuZGxlQXV0b1Njcm9sbChldnQsIGZhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgeCA9IChldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KS5jbGllbnRYLFxuICAgICAgICAgIHkgPSAoZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCkuY2xpZW50WSxcbiAgICAgICAgICBlbGVtID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcbiAgICAgIHRvdWNoRXZ0JDEgPSBldnQ7IC8vIElFIGRvZXMgbm90IHNlZW0gdG8gaGF2ZSBuYXRpdmUgYXV0b3Njcm9sbCxcbiAgICAgIC8vIEVkZ2UncyBhdXRvc2Nyb2xsIHNlZW1zIHRvbyBjb25kaXRpb25hbCxcbiAgICAgIC8vIE1BQ09TIFNhZmFyaSBkb2VzIG5vdCBoYXZlIGF1dG9zY3JvbGwsXG4gICAgICAvLyBGaXJlZm94IGFuZCBDaHJvbWUgYXJlIGdvb2RcblxuICAgICAgaWYgKGZhbGxiYWNrIHx8IHRoaXMub3B0aW9ucy5mb3JjZUF1dG9TY3JvbGxGYWxsYmFjayB8fCBFZGdlIHx8IElFMTFPckxlc3MgfHwgU2FmYXJpKSB7XG4gICAgICAgIGF1dG9TY3JvbGwoZXZ0LCB0aGlzLm9wdGlvbnMsIGVsZW0sIGZhbGxiYWNrKTsgLy8gTGlzdGVuZXIgZm9yIHBvaW50ZXIgZWxlbWVudCBjaGFuZ2VcblxuICAgICAgICB2YXIgb2dFbGVtU2Nyb2xsZXIgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbGVtLCB0cnVlKTtcblxuICAgICAgICBpZiAoc2Nyb2xsaW5nICYmICghcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgfHwgeCAhPT0gbGFzdEF1dG9TY3JvbGxYIHx8IHkgIT09IGxhc3RBdXRvU2Nyb2xsWSkpIHtcbiAgICAgICAgICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCAmJiBjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKCk7IC8vIERldGVjdCBmb3IgcG9pbnRlciBlbGVtIGNoYW5nZSwgZW11bGF0aW5nIG5hdGl2ZSBEbkQgYmVoYXZpb3VyXG5cbiAgICAgICAgICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuZXdFbGVtID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmIChuZXdFbGVtICE9PSBvZ0VsZW1TY3JvbGxlcikge1xuICAgICAgICAgICAgICBvZ0VsZW1TY3JvbGxlciA9IG5ld0VsZW07XG4gICAgICAgICAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXV0b1Njcm9sbChldnQsIF90aGlzLm9wdGlvbnMsIG5ld0VsZW0sIGZhbGxiYWNrKTtcbiAgICAgICAgICB9LCAxMCk7XG4gICAgICAgICAgbGFzdEF1dG9TY3JvbGxYID0geDtcbiAgICAgICAgICBsYXN0QXV0b1Njcm9sbFkgPSB5O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBEbkQgaXMgZW5hYmxlZCAoYW5kIGJyb3dzZXIgaGFzIGdvb2QgYXV0b3Njcm9sbGluZyksIGZpcnN0IGF1dG9zY3JvbGwgd2lsbCBhbHJlYWR5IHNjcm9sbCwgc28gZ2V0IHBhcmVudCBhdXRvc2Nyb2xsIG9mIGZpcnN0IGF1dG9zY3JvbGxcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnViYmxlU2Nyb2xsIHx8IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsZW0sIHRydWUpID09PSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCkpIHtcbiAgICAgICAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0b1Njcm9sbChldnQsIHRoaXMub3B0aW9ucywgZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgZmFsc2UpLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gX2V4dGVuZHMoQXV0b1Njcm9sbCwge1xuICAgIHBsdWdpbk5hbWU6ICdzY3JvbGwnLFxuICAgIGluaXRpYWxpemVCeURlZmF1bHQ6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyQXV0b1Njcm9sbHMoKSB7XG4gIGF1dG9TY3JvbGxzLmZvckVhY2goZnVuY3Rpb24gKGF1dG9TY3JvbGwpIHtcbiAgICBjbGVhckludGVydmFsKGF1dG9TY3JvbGwucGlkKTtcbiAgfSk7XG4gIGF1dG9TY3JvbGxzID0gW107XG59XG5cbmZ1bmN0aW9uIGNsZWFyUG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwoKSB7XG4gIGNsZWFySW50ZXJ2YWwocG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwpO1xufVxuXG52YXIgYXV0b1Njcm9sbCA9IHRocm90dGxlKGZ1bmN0aW9uIChldnQsIG9wdGlvbnMsIHJvb3RFbCwgaXNGYWxsYmFjaykge1xuICAvLyBCdWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTUyMVxuICBpZiAoIW9wdGlvbnMuc2Nyb2xsKSByZXR1cm47XG4gIHZhciB4ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFgsXG4gICAgICB5ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFksXG4gICAgICBzZW5zID0gb3B0aW9ucy5zY3JvbGxTZW5zaXRpdml0eSxcbiAgICAgIHNwZWVkID0gb3B0aW9ucy5zY3JvbGxTcGVlZCxcbiAgICAgIHdpblNjcm9sbGVyID0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICB2YXIgc2Nyb2xsVGhpc0luc3RhbmNlID0gZmFsc2UsXG4gICAgICBzY3JvbGxDdXN0b21GbjsgLy8gTmV3IHNjcm9sbCByb290LCBzZXQgc2Nyb2xsRWxcblxuICBpZiAoc2Nyb2xsUm9vdEVsICE9PSByb290RWwpIHtcbiAgICBzY3JvbGxSb290RWwgPSByb290RWw7XG4gICAgY2xlYXJBdXRvU2Nyb2xscygpO1xuICAgIHNjcm9sbEVsID0gb3B0aW9ucy5zY3JvbGw7XG4gICAgc2Nyb2xsQ3VzdG9tRm4gPSBvcHRpb25zLnNjcm9sbEZuO1xuXG4gICAgaWYgKHNjcm9sbEVsID09PSB0cnVlKSB7XG4gICAgICBzY3JvbGxFbCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KHJvb3RFbCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxheWVyc091dCA9IDA7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gc2Nyb2xsRWw7XG5cbiAgZG8ge1xuICAgIHZhciBlbCA9IGN1cnJlbnRQYXJlbnQsXG4gICAgICAgIHJlY3QgPSBnZXRSZWN0KGVsKSxcbiAgICAgICAgdG9wID0gcmVjdC50b3AsXG4gICAgICAgIGJvdHRvbSA9IHJlY3QuYm90dG9tLFxuICAgICAgICBsZWZ0ID0gcmVjdC5sZWZ0LFxuICAgICAgICByaWdodCA9IHJlY3QucmlnaHQsXG4gICAgICAgIHdpZHRoID0gcmVjdC53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gcmVjdC5oZWlnaHQsXG4gICAgICAgIGNhblNjcm9sbFggPSB2b2lkIDAsXG4gICAgICAgIGNhblNjcm9sbFkgPSB2b2lkIDAsXG4gICAgICAgIHNjcm9sbFdpZHRoID0gZWwuc2Nyb2xsV2lkdGgsXG4gICAgICAgIHNjcm9sbEhlaWdodCA9IGVsLnNjcm9sbEhlaWdodCxcbiAgICAgICAgZWxDU1MgPSBjc3MoZWwpLFxuICAgICAgICBzY3JvbGxQb3NYID0gZWwuc2Nyb2xsTGVmdCxcbiAgICAgICAgc2Nyb2xsUG9zWSA9IGVsLnNjcm9sbFRvcDtcblxuICAgIGlmIChlbCA9PT0gd2luU2Nyb2xsZXIpIHtcbiAgICAgIGNhblNjcm9sbFggPSB3aWR0aCA8IHNjcm9sbFdpZHRoICYmIChlbENTUy5vdmVyZmxvd1ggPT09ICdhdXRvJyB8fCBlbENTUy5vdmVyZmxvd1ggPT09ICdzY3JvbGwnIHx8IGVsQ1NTLm92ZXJmbG93WCA9PT0gJ3Zpc2libGUnKTtcbiAgICAgIGNhblNjcm9sbFkgPSBoZWlnaHQgPCBzY3JvbGxIZWlnaHQgJiYgKGVsQ1NTLm92ZXJmbG93WSA9PT0gJ2F1dG8nIHx8IGVsQ1NTLm92ZXJmbG93WSA9PT0gJ3Njcm9sbCcgfHwgZWxDU1Mub3ZlcmZsb3dZID09PSAndmlzaWJsZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW5TY3JvbGxYID0gd2lkdGggPCBzY3JvbGxXaWR0aCAmJiAoZWxDU1Mub3ZlcmZsb3dYID09PSAnYXV0bycgfHwgZWxDU1Mub3ZlcmZsb3dYID09PSAnc2Nyb2xsJyk7XG4gICAgICBjYW5TY3JvbGxZID0gaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0ICYmIChlbENTUy5vdmVyZmxvd1kgPT09ICdhdXRvJyB8fCBlbENTUy5vdmVyZmxvd1kgPT09ICdzY3JvbGwnKTtcbiAgICB9XG5cbiAgICB2YXIgdnggPSBjYW5TY3JvbGxYICYmIChNYXRoLmFicyhyaWdodCAtIHgpIDw9IHNlbnMgJiYgc2Nyb2xsUG9zWCArIHdpZHRoIDwgc2Nyb2xsV2lkdGgpIC0gKE1hdGguYWJzKGxlZnQgLSB4KSA8PSBzZW5zICYmICEhc2Nyb2xsUG9zWCk7XG4gICAgdmFyIHZ5ID0gY2FuU2Nyb2xsWSAmJiAoTWF0aC5hYnMoYm90dG9tIC0geSkgPD0gc2VucyAmJiBzY3JvbGxQb3NZICsgaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0KSAtIChNYXRoLmFicyh0b3AgLSB5KSA8PSBzZW5zICYmICEhc2Nyb2xsUG9zWSk7XG5cbiAgICBpZiAoIWF1dG9TY3JvbGxzW2xheWVyc091dF0pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGxheWVyc091dDsgaSsrKSB7XG4gICAgICAgIGlmICghYXV0b1Njcm9sbHNbaV0pIHtcbiAgICAgICAgICBhdXRvU2Nyb2xsc1tpXSA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF1dG9TY3JvbGxzW2xheWVyc091dF0udnggIT0gdnggfHwgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS52eSAhPSB2eSB8fCBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLmVsICE9PSBlbCkge1xuICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5lbCA9IGVsO1xuICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS52eCA9IHZ4O1xuICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS52eSA9IHZ5O1xuICAgICAgY2xlYXJJbnRlcnZhbChhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnBpZCk7XG5cbiAgICAgIGlmICh2eCAhPSAwIHx8IHZ5ICE9IDApIHtcbiAgICAgICAgc2Nyb2xsVGhpc0luc3RhbmNlID0gdHJ1ZTtcbiAgICAgICAgLyoganNoaW50IGxvb3BmdW5jOnRydWUgKi9cblxuICAgICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnBpZCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBlbXVsYXRlIGRyYWcgb3ZlciBkdXJpbmcgYXV0b3Njcm9sbCAoZmFsbGJhY2spLCBlbXVsYXRpbmcgbmF0aXZlIERuRCBiZWhhdmlvdXJcbiAgICAgICAgICBpZiAoaXNGYWxsYmFjayAmJiB0aGlzLmxheWVyID09PSAwKSB7XG4gICAgICAgICAgICBTb3J0YWJsZS5hY3RpdmUuX29uVG91Y2hNb3ZlKHRvdWNoRXZ0JDEpOyAvLyBUbyBtb3ZlIGdob3N0IGlmIGl0IGlzIHBvc2l0aW9uZWQgYWJzb2x1dGVseVxuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHNjcm9sbE9mZnNldFkgPSBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eSA/IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ5ICogc3BlZWQgOiAwO1xuICAgICAgICAgIHZhciBzY3JvbGxPZmZzZXRYID0gYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0udnggPyBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eCAqIHNwZWVkIDogMDtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygc2Nyb2xsQ3VzdG9tRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmIChzY3JvbGxDdXN0b21Gbi5jYWxsKFNvcnRhYmxlLmRyYWdnZWQucGFyZW50Tm9kZVtleHBhbmRvXSwgc2Nyb2xsT2Zmc2V0WCwgc2Nyb2xsT2Zmc2V0WSwgZXZ0LCB0b3VjaEV2dCQxLCBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS5lbCkgIT09ICdjb250aW51ZScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjcm9sbEJ5KGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLmVsLCBzY3JvbGxPZmZzZXRYLCBzY3JvbGxPZmZzZXRZKTtcbiAgICAgICAgfS5iaW5kKHtcbiAgICAgICAgICBsYXllcjogbGF5ZXJzT3V0XG4gICAgICAgIH0pLCAyNCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGF5ZXJzT3V0Kys7XG4gIH0gd2hpbGUgKG9wdGlvbnMuYnViYmxlU2Nyb2xsICYmIGN1cnJlbnRQYXJlbnQgIT09IHdpblNjcm9sbGVyICYmIChjdXJyZW50UGFyZW50ID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoY3VycmVudFBhcmVudCwgZmFsc2UpKSk7XG5cbiAgc2Nyb2xsaW5nID0gc2Nyb2xsVGhpc0luc3RhbmNlOyAvLyBpbiBjYXNlIGFub3RoZXIgZnVuY3Rpb24gY2F0Y2hlcyBzY3JvbGxpbmcgYXMgZmFsc2UgaW4gYmV0d2VlbiB3aGVuIGl0IGlzIG5vdFxufSwgMzApO1xuXG52YXIgZHJvcCA9IGZ1bmN0aW9uIGRyb3AoX3JlZikge1xuICB2YXIgb3JpZ2luYWxFdmVudCA9IF9yZWYub3JpZ2luYWxFdmVudCxcbiAgICAgIHB1dFNvcnRhYmxlID0gX3JlZi5wdXRTb3J0YWJsZSxcbiAgICAgIGRyYWdFbCA9IF9yZWYuZHJhZ0VsLFxuICAgICAgYWN0aXZlU29ydGFibGUgPSBfcmVmLmFjdGl2ZVNvcnRhYmxlLFxuICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50ID0gX3JlZi5kaXNwYXRjaFNvcnRhYmxlRXZlbnQsXG4gICAgICBoaWRlR2hvc3RGb3JUYXJnZXQgPSBfcmVmLmhpZGVHaG9zdEZvclRhcmdldCxcbiAgICAgIHVuaGlkZUdob3N0Rm9yVGFyZ2V0ID0gX3JlZi51bmhpZGVHaG9zdEZvclRhcmdldDtcbiAgaWYgKCFvcmlnaW5hbEV2ZW50KSByZXR1cm47XG4gIHZhciB0b1NvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgYWN0aXZlU29ydGFibGU7XG4gIGhpZGVHaG9zdEZvclRhcmdldCgpO1xuICB2YXIgdG91Y2ggPSBvcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID8gb3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXSA6IG9yaWdpbmFsRXZlbnQ7XG4gIHZhciB0YXJnZXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpO1xuICB1bmhpZGVHaG9zdEZvclRhcmdldCgpO1xuXG4gIGlmICh0b1NvcnRhYmxlICYmICF0b1NvcnRhYmxlLmVsLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoJ3NwaWxsJyk7XG4gICAgdGhpcy5vblNwaWxsKHtcbiAgICAgIGRyYWdFbDogZHJhZ0VsLFxuICAgICAgcHV0U29ydGFibGU6IHB1dFNvcnRhYmxlXG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFJldmVydCgpIHt9XG5cblJldmVydC5wcm90b3R5cGUgPSB7XG4gIHN0YXJ0SW5kZXg6IG51bGwsXG4gIGRyYWdTdGFydDogZnVuY3Rpb24gZHJhZ1N0YXJ0KF9yZWYyKSB7XG4gICAgdmFyIG9sZERyYWdnYWJsZUluZGV4ID0gX3JlZjIub2xkRHJhZ2dhYmxlSW5kZXg7XG4gICAgdGhpcy5zdGFydEluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXg7XG4gIH0sXG4gIG9uU3BpbGw6IGZ1bmN0aW9uIG9uU3BpbGwoX3JlZjMpIHtcbiAgICB2YXIgZHJhZ0VsID0gX3JlZjMuZHJhZ0VsLFxuICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYzLnB1dFNvcnRhYmxlO1xuICAgIHRoaXMuc29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG5cbiAgICBpZiAocHV0U29ydGFibGUpIHtcbiAgICAgIHB1dFNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIH1cblxuICAgIHZhciBuZXh0U2libGluZyA9IGdldENoaWxkKHRoaXMuc29ydGFibGUuZWwsIHRoaXMuc3RhcnRJbmRleCwgdGhpcy5vcHRpb25zKTtcblxuICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgdGhpcy5zb3J0YWJsZS5lbC5pbnNlcnRCZWZvcmUoZHJhZ0VsLCBuZXh0U2libGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc29ydGFibGUuZWwuYXBwZW5kQ2hpbGQoZHJhZ0VsKTtcbiAgICB9XG5cbiAgICB0aGlzLnNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcblxuICAgIGlmIChwdXRTb3J0YWJsZSkge1xuICAgICAgcHV0U29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgIH1cbiAgfSxcbiAgZHJvcDogZHJvcFxufTtcblxuX2V4dGVuZHMoUmV2ZXJ0LCB7XG4gIHBsdWdpbk5hbWU6ICdyZXZlcnRPblNwaWxsJ1xufSk7XG5cbmZ1bmN0aW9uIFJlbW92ZSgpIHt9XG5cblJlbW92ZS5wcm90b3R5cGUgPSB7XG4gIG9uU3BpbGw6IGZ1bmN0aW9uIG9uU3BpbGwoX3JlZjQpIHtcbiAgICB2YXIgZHJhZ0VsID0gX3JlZjQuZHJhZ0VsLFxuICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWY0LnB1dFNvcnRhYmxlO1xuICAgIHZhciBwYXJlbnRTb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IHRoaXMuc29ydGFibGU7XG4gICAgcGFyZW50U29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgZHJhZ0VsLnBhcmVudE5vZGUgJiYgZHJhZ0VsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZHJhZ0VsKTtcbiAgICBwYXJlbnRTb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gIH0sXG4gIGRyb3A6IGRyb3Bcbn07XG5cbl9leHRlbmRzKFJlbW92ZSwge1xuICBwbHVnaW5OYW1lOiAncmVtb3ZlT25TcGlsbCdcbn0pO1xuXG52YXIgbGFzdFN3YXBFbDtcblxuZnVuY3Rpb24gU3dhcFBsdWdpbigpIHtcbiAgZnVuY3Rpb24gU3dhcCgpIHtcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgc3dhcENsYXNzOiAnc29ydGFibGUtc3dhcC1oaWdobGlnaHQnXG4gICAgfTtcbiAgfVxuXG4gIFN3YXAucHJvdG90eXBlID0ge1xuICAgIGRyYWdTdGFydDogZnVuY3Rpb24gZHJhZ1N0YXJ0KF9yZWYpIHtcbiAgICAgIHZhciBkcmFnRWwgPSBfcmVmLmRyYWdFbDtcbiAgICAgIGxhc3RTd2FwRWwgPSBkcmFnRWw7XG4gICAgfSxcbiAgICBkcmFnT3ZlclZhbGlkOiBmdW5jdGlvbiBkcmFnT3ZlclZhbGlkKF9yZWYyKSB7XG4gICAgICB2YXIgY29tcGxldGVkID0gX3JlZjIuY29tcGxldGVkLFxuICAgICAgICAgIHRhcmdldCA9IF9yZWYyLnRhcmdldCxcbiAgICAgICAgICBvbk1vdmUgPSBfcmVmMi5vbk1vdmUsXG4gICAgICAgICAgYWN0aXZlU29ydGFibGUgPSBfcmVmMi5hY3RpdmVTb3J0YWJsZSxcbiAgICAgICAgICBjaGFuZ2VkID0gX3JlZjIuY2hhbmdlZCxcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmMi5jYW5jZWw7XG4gICAgICBpZiAoIWFjdGl2ZVNvcnRhYmxlLm9wdGlvbnMuc3dhcCkgcmV0dXJuO1xuICAgICAgdmFyIGVsID0gdGhpcy5zb3J0YWJsZS5lbCxcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gZWwpIHtcbiAgICAgICAgdmFyIHByZXZTd2FwRWwgPSBsYXN0U3dhcEVsO1xuXG4gICAgICAgIGlmIChvbk1vdmUodGFyZ2V0KSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICB0b2dnbGVDbGFzcyh0YXJnZXQsIG9wdGlvbnMuc3dhcENsYXNzLCB0cnVlKTtcbiAgICAgICAgICBsYXN0U3dhcEVsID0gdGFyZ2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhc3RTd2FwRWwgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZTd2FwRWwgJiYgcHJldlN3YXBFbCAhPT0gbGFzdFN3YXBFbCkge1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKHByZXZTd2FwRWwsIG9wdGlvbnMuc3dhcENsYXNzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2hhbmdlZCgpO1xuICAgICAgY29tcGxldGVkKHRydWUpO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKF9yZWYzKSB7XG4gICAgICB2YXIgYWN0aXZlU29ydGFibGUgPSBfcmVmMy5hY3RpdmVTb3J0YWJsZSxcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYzLnB1dFNvcnRhYmxlLFxuICAgICAgICAgIGRyYWdFbCA9IF9yZWYzLmRyYWdFbDtcbiAgICAgIHZhciB0b1NvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgdGhpcy5zb3J0YWJsZTtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgbGFzdFN3YXBFbCAmJiB0b2dnbGVDbGFzcyhsYXN0U3dhcEVsLCBvcHRpb25zLnN3YXBDbGFzcywgZmFsc2UpO1xuXG4gICAgICBpZiAobGFzdFN3YXBFbCAmJiAob3B0aW9ucy5zd2FwIHx8IHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLm9wdGlvbnMuc3dhcCkpIHtcbiAgICAgICAgaWYgKGRyYWdFbCAhPT0gbGFzdFN3YXBFbCkge1xuICAgICAgICAgIHRvU29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgICAgICAgaWYgKHRvU29ydGFibGUgIT09IGFjdGl2ZVNvcnRhYmxlKSBhY3RpdmVTb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgICAgICBzd2FwTm9kZXMoZHJhZ0VsLCBsYXN0U3dhcEVsKTtcbiAgICAgICAgICB0b1NvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgICBpZiAodG9Tb3J0YWJsZSAhPT0gYWN0aXZlU29ydGFibGUpIGFjdGl2ZVNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbnVsbGluZzogZnVuY3Rpb24gbnVsbGluZygpIHtcbiAgICAgIGxhc3RTd2FwRWwgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzKFN3YXAsIHtcbiAgICBwbHVnaW5OYW1lOiAnc3dhcCcsXG4gICAgZXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBldmVudFByb3BlcnRpZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzd2FwSXRlbTogbGFzdFN3YXBFbFxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzd2FwTm9kZXMobjEsIG4yKSB7XG4gIHZhciBwMSA9IG4xLnBhcmVudE5vZGUsXG4gICAgICBwMiA9IG4yLnBhcmVudE5vZGUsXG4gICAgICBpMSxcbiAgICAgIGkyO1xuICBpZiAoIXAxIHx8ICFwMiB8fCBwMS5pc0VxdWFsTm9kZShuMikgfHwgcDIuaXNFcXVhbE5vZGUobjEpKSByZXR1cm47XG4gIGkxID0gaW5kZXgobjEpO1xuICBpMiA9IGluZGV4KG4yKTtcblxuICBpZiAocDEuaXNFcXVhbE5vZGUocDIpICYmIGkxIDwgaTIpIHtcbiAgICBpMisrO1xuICB9XG5cbiAgcDEuaW5zZXJ0QmVmb3JlKG4yLCBwMS5jaGlsZHJlbltpMV0pO1xuICBwMi5pbnNlcnRCZWZvcmUobjEsIHAyLmNoaWxkcmVuW2kyXSk7XG59XG5cbnZhciBtdWx0aURyYWdFbGVtZW50cyA9IFtdLFxuICAgIG11bHRpRHJhZ0Nsb25lcyA9IFtdLFxuICAgIGxhc3RNdWx0aURyYWdTZWxlY3QsXG4gICAgLy8gZm9yIHNlbGVjdGlvbiB3aXRoIG1vZGlmaWVyIGtleSBkb3duIChTSElGVClcbm11bHRpRHJhZ1NvcnRhYmxlLFxuICAgIGluaXRpYWxGb2xkaW5nID0gZmFsc2UsXG4gICAgLy8gSW5pdGlhbCBtdWx0aS1kcmFnIGZvbGQgd2hlbiBkcmFnIHN0YXJ0ZWRcbmZvbGRpbmcgPSBmYWxzZSxcbiAgICAvLyBGb2xkaW5nIGFueSBvdGhlciB0aW1lXG5kcmFnU3RhcnRlZCA9IGZhbHNlLFxuICAgIGRyYWdFbCQxLFxuICAgIGNsb25lc0Zyb21SZWN0LFxuICAgIGNsb25lc0hpZGRlbjtcblxuZnVuY3Rpb24gTXVsdGlEcmFnUGx1Z2luKCkge1xuICBmdW5jdGlvbiBNdWx0aURyYWcoc29ydGFibGUpIHtcbiAgICAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcbiAgICBmb3IgKHZhciBmbiBpbiB0aGlzKSB7XG4gICAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXNbZm5dID0gdGhpc1tmbl0uYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc29ydGFibGUub3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgICAgb24oZG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uKGRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9uKGRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgfVxuXG4gICAgb24oZG9jdW1lbnQsICdrZXlkb3duJywgdGhpcy5fY2hlY2tLZXlEb3duKTtcbiAgICBvbihkb2N1bWVudCwgJ2tleXVwJywgdGhpcy5fY2hlY2tLZXlVcCk7XG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIHNlbGVjdGVkQ2xhc3M6ICdzb3J0YWJsZS1zZWxlY3RlZCcsXG4gICAgICBtdWx0aURyYWdLZXk6IG51bGwsXG4gICAgICBzZXREYXRhOiBmdW5jdGlvbiBzZXREYXRhKGRhdGFUcmFuc2ZlciwgZHJhZ0VsKSB7XG4gICAgICAgIHZhciBkYXRhID0gJyc7XG5cbiAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCAmJiBtdWx0aURyYWdTb3J0YWJsZSA9PT0gc29ydGFibGUpIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50LCBpKSB7XG4gICAgICAgICAgICBkYXRhICs9ICghaSA/ICcnIDogJywgJykgKyBtdWx0aURyYWdFbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGEgPSBkcmFnRWwudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhVHJhbnNmZXIuc2V0RGF0YSgnVGV4dCcsIGRhdGEpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBNdWx0aURyYWcucHJvdG90eXBlID0ge1xuICAgIG11bHRpRHJhZ0tleURvd246IGZhbHNlLFxuICAgIGlzTXVsdGlEcmFnOiBmYWxzZSxcbiAgICBkZWxheVN0YXJ0R2xvYmFsOiBmdW5jdGlvbiBkZWxheVN0YXJ0R2xvYmFsKF9yZWYpIHtcbiAgICAgIHZhciBkcmFnZ2VkID0gX3JlZi5kcmFnRWw7XG4gICAgICBkcmFnRWwkMSA9IGRyYWdnZWQ7XG4gICAgfSxcbiAgICBkZWxheUVuZGVkOiBmdW5jdGlvbiBkZWxheUVuZGVkKCkge1xuICAgICAgdGhpcy5pc011bHRpRHJhZyA9IH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKTtcbiAgICB9LFxuICAgIHNldHVwQ2xvbmU6IGZ1bmN0aW9uIHNldHVwQ2xvbmUoX3JlZjIpIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWYyLnNvcnRhYmxlLFxuICAgICAgICAgIGNhbmNlbCA9IF9yZWYyLmNhbmNlbDtcbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZykgcmV0dXJuO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lcy5wdXNoKGNsb25lKG11bHRpRHJhZ0VsZW1lbnRzW2ldKSk7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lc1tpXS5zb3J0YWJsZUluZGV4ID0gbXVsdGlEcmFnRWxlbWVudHNbaV0uc29ydGFibGVJbmRleDtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzW2ldLmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgICBtdWx0aURyYWdDbG9uZXNbaV0uc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnJztcbiAgICAgICAgdG9nZ2xlQ2xhc3MobXVsdGlEcmFnQ2xvbmVzW2ldLCB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgZmFsc2UpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50c1tpXSA9PT0gZHJhZ0VsJDEgJiYgdG9nZ2xlQ2xhc3MobXVsdGlEcmFnQ2xvbmVzW2ldLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgc29ydGFibGUuX2hpZGVDbG9uZSgpO1xuXG4gICAgICBjYW5jZWwoKTtcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZShfcmVmMykge1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjMuc29ydGFibGUsXG4gICAgICAgICAgcm9vdEVsID0gX3JlZjMucm9vdEVsLFxuICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCA9IF9yZWYzLmRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmMy5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUpIHtcbiAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCAmJiBtdWx0aURyYWdTb3J0YWJsZSA9PT0gc29ydGFibGUpIHtcbiAgICAgICAgICBpbnNlcnRNdWx0aURyYWdDbG9uZXModHJ1ZSwgcm9vdEVsKTtcbiAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoJ2Nsb25lJyk7XG4gICAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHNob3dDbG9uZTogZnVuY3Rpb24gc2hvd0Nsb25lKF9yZWY0KSB7XG4gICAgICB2YXIgY2xvbmVOb3dTaG93biA9IF9yZWY0LmNsb25lTm93U2hvd24sXG4gICAgICAgICAgcm9vdEVsID0gX3JlZjQucm9vdEVsLFxuICAgICAgICAgIGNhbmNlbCA9IF9yZWY0LmNhbmNlbDtcbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZykgcmV0dXJuO1xuICAgICAgaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKGZhbHNlLCByb290RWwpO1xuICAgICAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgIGNzcyhjbG9uZSwgJ2Rpc3BsYXknLCAnJyk7XG4gICAgICB9KTtcbiAgICAgIGNsb25lTm93U2hvd24oKTtcbiAgICAgIGNsb25lc0hpZGRlbiA9IGZhbHNlO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBoaWRlQ2xvbmU6IGZ1bmN0aW9uIGhpZGVDbG9uZShfcmVmNSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjUuc29ydGFibGUsXG4gICAgICAgICAgY2xvbmVOb3dIaWRkZW4gPSBfcmVmNS5jbG9uZU5vd0hpZGRlbixcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmNS5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICBjc3MoY2xvbmUsICdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSAmJiBjbG9uZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgY2xvbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2xvbmVOb3dIaWRkZW4oKTtcbiAgICAgIGNsb25lc0hpZGRlbiA9IHRydWU7XG4gICAgICBjYW5jZWwoKTtcbiAgICB9LFxuICAgIGRyYWdTdGFydEdsb2JhbDogZnVuY3Rpb24gZHJhZ1N0YXJ0R2xvYmFsKF9yZWY2KSB7XG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmNi5zb3J0YWJsZTtcblxuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnICYmIG11bHRpRHJhZ1NvcnRhYmxlKSB7XG4gICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlLm11bHRpRHJhZy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcbiAgICAgIH1cblxuICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgIH0pOyAvLyBTb3J0IG11bHRpLWRyYWcgZWxlbWVudHNcblxuICAgICAgbXVsdGlEcmFnRWxlbWVudHMgPSBtdWx0aURyYWdFbGVtZW50cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLnNvcnRhYmxlSW5kZXggLSBiLnNvcnRhYmxlSW5kZXg7XG4gICAgICB9KTtcbiAgICAgIGRyYWdTdGFydGVkID0gdHJ1ZTtcbiAgICB9LFxuICAgIGRyYWdTdGFydGVkOiBmdW5jdGlvbiBkcmFnU3RhcnRlZChfcmVmNykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWY3LnNvcnRhYmxlO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc29ydCkge1xuICAgICAgICAvLyBDYXB0dXJlIHJlY3RzLFxuICAgICAgICAvLyBoaWRlIG11bHRpIGRyYWcgZWxlbWVudHMgKGJ5IHBvc2l0aW9uaW5nIHRoZW0gYWJzb2x1dGUpLFxuICAgICAgICAvLyBzZXQgbXVsdGkgZHJhZyBlbGVtZW50cyByZWN0cyB0byBkcmFnUmVjdCxcbiAgICAgICAgLy8gc2hvdyBtdWx0aSBkcmFnIGVsZW1lbnRzLFxuICAgICAgICAvLyBhbmltYXRlIHRvIHJlY3RzLFxuICAgICAgICAvLyB1bnNldCByZWN0cyAmIHJlbW92ZSBmcm9tIERPTVxuICAgICAgICBzb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgICAgICAgICAgY3NzKG11bHRpRHJhZ0VsZW1lbnQsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBkcmFnUmVjdCA9IGdldFJlY3QoZHJhZ0VsJDEsIGZhbHNlLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICAgICAgICAgIHNldFJlY3QobXVsdGlEcmFnRWxlbWVudCwgZHJhZ1JlY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvbGRpbmcgPSB0cnVlO1xuICAgICAgICAgIGluaXRpYWxGb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzb3J0YWJsZS5hbmltYXRlQWxsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9sZGluZyA9IGZhbHNlO1xuICAgICAgICBpbml0aWFsRm9sZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChfdGhpczIub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICB1bnNldFJlY3QobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gLy8gUmVtb3ZlIGFsbCBhdXhpbGlhcnkgbXVsdGlkcmFnIGl0ZW1zIGZyb20gZWwsIGlmIHNvcnRpbmcgZW5hYmxlZFxuXG5cbiAgICAgICAgaWYgKF90aGlzMi5vcHRpb25zLnNvcnQpIHtcbiAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGRyYWdPdmVyOiBmdW5jdGlvbiBkcmFnT3ZlcihfcmVmOCkge1xuICAgICAgdmFyIHRhcmdldCA9IF9yZWY4LnRhcmdldCxcbiAgICAgICAgICBjb21wbGV0ZWQgPSBfcmVmOC5jb21wbGV0ZWQsXG4gICAgICAgICAgY2FuY2VsID0gX3JlZjguY2FuY2VsO1xuXG4gICAgICBpZiAoZm9sZGluZyAmJiB+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZih0YXJnZXQpKSB7XG4gICAgICAgIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIGNhbmNlbCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmV2ZXJ0OiBmdW5jdGlvbiByZXZlcnQoX3JlZjkpIHtcbiAgICAgIHZhciBmcm9tU29ydGFibGUgPSBfcmVmOS5mcm9tU29ydGFibGUsXG4gICAgICAgICAgcm9vdEVsID0gX3JlZjkucm9vdEVsLFxuICAgICAgICAgIHNvcnRhYmxlID0gX3JlZjkuc29ydGFibGUsXG4gICAgICAgICAgZHJhZ1JlY3QgPSBfcmVmOS5kcmFnUmVjdDtcblxuICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gU2V0dXAgdW5mb2xkIGFuaW1hdGlvblxuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgc29ydGFibGUuYWRkQW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgdGFyZ2V0OiBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgICAgcmVjdDogZm9sZGluZyA/IGdldFJlY3QobXVsdGlEcmFnRWxlbWVudCkgOiBkcmFnUmVjdFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHVuc2V0UmVjdChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LmZyb21SZWN0ID0gZHJhZ1JlY3Q7XG4gICAgICAgICAgZnJvbVNvcnRhYmxlLnJlbW92ZUFuaW1hdGlvblN0YXRlKG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9sZGluZyA9IGZhbHNlO1xuICAgICAgICBpbnNlcnRNdWx0aURyYWdFbGVtZW50cyghdGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlLCByb290RWwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZHJhZ092ZXJDb21wbGV0ZWQ6IGZ1bmN0aW9uIGRyYWdPdmVyQ29tcGxldGVkKF9yZWYxMCkge1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjEwLnNvcnRhYmxlLFxuICAgICAgICAgIGlzT3duZXIgPSBfcmVmMTAuaXNPd25lcixcbiAgICAgICAgICBpbnNlcnRpb24gPSBfcmVmMTAuaW5zZXJ0aW9uLFxuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlID0gX3JlZjEwLmFjdGl2ZVNvcnRhYmxlLFxuICAgICAgICAgIHBhcmVudEVsID0gX3JlZjEwLnBhcmVudEVsLFxuICAgICAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjEwLnB1dFNvcnRhYmxlO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGlmIChpbnNlcnRpb24pIHtcbiAgICAgICAgLy8gQ2xvbmVzIG11c3QgYmUgaGlkZGVuIGJlZm9yZSBmb2xkaW5nIGFuaW1hdGlvbiB0byBjYXB0dXJlIGRyYWdSZWN0QWJzb2x1dGUgcHJvcGVybHlcbiAgICAgICAgaWYgKGlzT3duZXIpIHtcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5faGlkZUNsb25lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbml0aWFsRm9sZGluZyA9IGZhbHNlOyAvLyBJZiBsZWF2aW5nIHNvcnQ6ZmFsc2Ugcm9vdCwgb3IgYWxyZWFkeSBmb2xkaW5nIC0gRm9sZCB0byBuZXcgbG9jYXRpb25cblxuICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24gJiYgbXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoID4gMSAmJiAoZm9sZGluZyB8fCAhaXNPd25lciAmJiAhYWN0aXZlU29ydGFibGUub3B0aW9ucy5zb3J0ICYmICFwdXRTb3J0YWJsZSkpIHtcbiAgICAgICAgICAvLyBGb2xkOiBTZXQgYWxsIG11bHRpIGRyYWcgZWxlbWVudHMncyByZWN0cyB0byBkcmFnRWwncyByZWN0IHdoZW4gbXVsdGktZHJhZyBlbGVtZW50cyBhcmUgaW52aXNpYmxlXG4gICAgICAgICAgdmFyIGRyYWdSZWN0QWJzb2x1dGUgPSBnZXRSZWN0KGRyYWdFbCQxLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgICAgICAgICBzZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQsIGRyYWdSZWN0QWJzb2x1dGUpOyAvLyBNb3ZlIGVsZW1lbnQocykgdG8gZW5kIG9mIHBhcmVudEVsIHNvIHRoYXQgaXQgZG9lcyBub3QgaW50ZXJmZXJlIHdpdGggbXVsdGktZHJhZyBjbG9uZXMgaW5zZXJ0aW9uIGlmIHRoZXkgYXJlIGluc2VydGVkXG4gICAgICAgICAgICAvLyB3aGlsZSBmb2xkaW5nLCBhbmQgc28gdGhhdCB3ZSBjYW4gY2FwdHVyZSB0aGVtIGFnYWluIGJlY2F1c2Ugb2xkIHNvcnRhYmxlIHdpbGwgbm8gbG9uZ2VyIGJlIGZyb21Tb3J0YWJsZVxuXG4gICAgICAgICAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgfSAvLyBDbG9uZXMgbXVzdCBiZSBzaG93biAoYW5kIGNoZWNrIHRvIHJlbW92ZSBtdWx0aSBkcmFncykgYWZ0ZXIgZm9sZGluZyB3aGVuIGludGVyZmVyaW5nIG11bHRpRHJhZ0VsZW1lbnRzIGFyZSBtb3ZlZCBvdXRcblxuXG4gICAgICAgIGlmICghaXNPd25lcikge1xuICAgICAgICAgIC8vIE9ubHkgcmVtb3ZlIGlmIG5vdCBmb2xkaW5nIChmb2xkaW5nIHdpbGwgcmVtb3ZlIHRoZW0gYW55d2F5cylcbiAgICAgICAgICBpZiAoIWZvbGRpbmcpIHtcbiAgICAgICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciBjbG9uZXNIaWRkZW5CZWZvcmUgPSBjbG9uZXNIaWRkZW47XG5cbiAgICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLl9zaG93Q2xvbmUoc29ydGFibGUpOyAvLyBVbmZvbGQgYW5pbWF0aW9uIGZvciBjbG9uZXMgaWYgc2hvd2luZyBmcm9tIGhpZGRlblxuXG5cbiAgICAgICAgICAgIGlmIChhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmFuaW1hdGlvbiAmJiAhY2xvbmVzSGlkZGVuICYmIGNsb25lc0hpZGRlbkJlZm9yZSkge1xuICAgICAgICAgICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5hZGRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgICAgICAgICB0YXJnZXQ6IGNsb25lLFxuICAgICAgICAgICAgICAgICAgcmVjdDogY2xvbmVzRnJvbVJlY3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjbG9uZS5mcm9tUmVjdCA9IGNsb25lc0Zyb21SZWN0O1xuICAgICAgICAgICAgICAgIGNsb25lLnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5fc2hvd0Nsb25lKHNvcnRhYmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQW5pbWF0aW9uQ2FwdHVyZTogZnVuY3Rpb24gZHJhZ092ZXJBbmltYXRpb25DYXB0dXJlKF9yZWYxMSkge1xuICAgICAgdmFyIGRyYWdSZWN0ID0gX3JlZjExLmRyYWdSZWN0LFxuICAgICAgICAgIGlzT3duZXIgPSBfcmVmMTEuaXNPd25lcixcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IF9yZWYxMS5hY3RpdmVTb3J0YWJsZTtcbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudC50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmFuaW1hdGlvbiAmJiAhaXNPd25lciAmJiBhY3RpdmVTb3J0YWJsZS5tdWx0aURyYWcuaXNNdWx0aURyYWcpIHtcbiAgICAgICAgY2xvbmVzRnJvbVJlY3QgPSBfZXh0ZW5kcyh7fSwgZHJhZ1JlY3QpO1xuICAgICAgICB2YXIgZHJhZ01hdHJpeCA9IG1hdHJpeChkcmFnRWwkMSwgdHJ1ZSk7XG4gICAgICAgIGNsb25lc0Zyb21SZWN0LnRvcCAtPSBkcmFnTWF0cml4LmY7XG4gICAgICAgIGNsb25lc0Zyb21SZWN0LmxlZnQgLT0gZHJhZ01hdHJpeC5lO1xuICAgICAgfVxuICAgIH0sXG4gICAgZHJhZ092ZXJBbmltYXRpb25Db21wbGV0ZTogZnVuY3Rpb24gZHJhZ092ZXJBbmltYXRpb25Db21wbGV0ZSgpIHtcbiAgICAgIGlmIChmb2xkaW5nKSB7XG4gICAgICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyb3A6IGZ1bmN0aW9uIGRyb3AoX3JlZjEyKSB7XG4gICAgICB2YXIgZXZ0ID0gX3JlZjEyLm9yaWdpbmFsRXZlbnQsXG4gICAgICAgICAgcm9vdEVsID0gX3JlZjEyLnJvb3RFbCxcbiAgICAgICAgICBwYXJlbnRFbCA9IF9yZWYxMi5wYXJlbnRFbCxcbiAgICAgICAgICBzb3J0YWJsZSA9IF9yZWYxMi5zb3J0YWJsZSxcbiAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQgPSBfcmVmMTIuZGlzcGF0Y2hTb3J0YWJsZUV2ZW50LFxuICAgICAgICAgIG9sZEluZGV4ID0gX3JlZjEyLm9sZEluZGV4LFxuICAgICAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjEyLnB1dFNvcnRhYmxlO1xuICAgICAgdmFyIHRvU29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCB0aGlzLnNvcnRhYmxlO1xuICAgICAgaWYgKCFldnQpIHJldHVybjtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGNoaWxkcmVuID0gcGFyZW50RWwuY2hpbGRyZW47IC8vIE11bHRpLWRyYWcgc2VsZWN0aW9uXG5cbiAgICAgIGlmICghZHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubXVsdGlEcmFnS2V5ICYmICF0aGlzLm11bHRpRHJhZ0tleURvd24pIHtcbiAgICAgICAgICB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsJDEsIG9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgIX5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKSk7XG5cbiAgICAgICAgaWYgKCF+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSkpIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5wdXNoKGRyYWdFbCQxKTtcbiAgICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICAgICAgbmFtZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICB0YXJnZXRFbDogZHJhZ0VsJDEsXG4gICAgICAgICAgICBvcmlnaW5hbEV2dDogZXZ0XG4gICAgICAgICAgfSk7IC8vIE1vZGlmaWVyIGFjdGl2YXRlZCwgc2VsZWN0IGZyb20gbGFzdCB0byBkcmFnRWxcblxuICAgICAgICAgIGlmIChldnQuc2hpZnRLZXkgJiYgbGFzdE11bHRpRHJhZ1NlbGVjdCAmJiBzb3J0YWJsZS5lbC5jb250YWlucyhsYXN0TXVsdGlEcmFnU2VsZWN0KSkge1xuICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IGluZGV4KGxhc3RNdWx0aURyYWdTZWxlY3QpLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4KGRyYWdFbCQxKTtcblxuICAgICAgICAgICAgaWYgKH5sYXN0SW5kZXggJiYgfmN1cnJlbnRJbmRleCAmJiBsYXN0SW5kZXggIT09IGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgICAgICAvLyBNdXN0IGluY2x1ZGUgbGFzdE11bHRpRHJhZ1NlbGVjdCAoc2VsZWN0IGl0KSwgaW4gY2FzZSBtb2RpZmllZCBzZWxlY3Rpb24gZnJvbSBubyBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgLy8gKGJ1dCBwcmV2aW91cyBzZWxlY3Rpb24gZXhpc3RlZClcbiAgICAgICAgICAgICAgdmFyIG4sIGk7XG5cbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgIGkgPSBsYXN0SW5kZXg7XG4gICAgICAgICAgICAgICAgbiA9IGN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpID0gY3VycmVudEluZGV4O1xuICAgICAgICAgICAgICAgIG4gPSBsYXN0SW5kZXggKyAxO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yICg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAofm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoY2hpbGRyZW5baV0pKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0b2dnbGVDbGFzcyhjaGlsZHJlbltpXSwgb3B0aW9ucy5zZWxlY3RlZENsYXNzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgICAgICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICAgICAgICAgICAgbmFtZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAgICAgICB0YXJnZXRFbDogY2hpbGRyZW5baV0sXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2dDogZXZ0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFzdE11bHRpRHJhZ1NlbGVjdCA9IGRyYWdFbCQxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gdG9Tb3J0YWJsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5zcGxpY2UobXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSksIDEpO1xuICAgICAgICAgIGxhc3RNdWx0aURyYWdTZWxlY3QgPSBudWxsO1xuICAgICAgICAgIGRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlLFxuICAgICAgICAgICAgcm9vdEVsOiByb290RWwsXG4gICAgICAgICAgICBuYW1lOiAnZGVzZWxlY3QnLFxuICAgICAgICAgICAgdGFyZ2V0RWw6IGRyYWdFbCQxLFxuICAgICAgICAgICAgb3JpZ2luYWxFdnQ6IGV2dFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IC8vIE11bHRpLWRyYWcgZHJvcFxuXG5cbiAgICAgIGlmIChkcmFnU3RhcnRlZCAmJiB0aGlzLmlzTXVsdGlEcmFnKSB7XG4gICAgICAgIGZvbGRpbmcgPSBmYWxzZTsgLy8gRG8gbm90IFwidW5mb2xkXCIgYWZ0ZXIgYXJvdW5kIGRyYWdFbCBpZiByZXZlcnRlZFxuXG4gICAgICAgIGlmICgocGFyZW50RWxbZXhwYW5kb10ub3B0aW9ucy5zb3J0IHx8IHBhcmVudEVsICE9PSByb290RWwpICYmIG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCQxKSxcbiAgICAgICAgICAgICAgbXVsdGlEcmFnSW5kZXggPSBpbmRleChkcmFnRWwkMSwgJzpub3QoLicgKyB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcyArICcpJyk7XG4gICAgICAgICAgaWYgKCFpbml0aWFsRm9sZGluZyAmJiBvcHRpb25zLmFuaW1hdGlvbikgZHJhZ0VsJDEudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgICB0b1NvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuXG4gICAgICAgICAgaWYgKCFpbml0aWFsRm9sZGluZykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgIGRyYWdFbCQxLmZyb21SZWN0ID0gZHJhZ1JlY3Q7XG4gICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCAhPT0gZHJhZ0VsJDEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciByZWN0ID0gZm9sZGluZyA/IGdldFJlY3QobXVsdGlEcmFnRWxlbWVudCkgOiBkcmFnUmVjdDtcbiAgICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQuZnJvbVJlY3QgPSByZWN0OyAvLyBQcmVwYXJlIHVuZm9sZCBhbmltYXRpb25cblxuICAgICAgICAgICAgICAgICAgdG9Tb3J0YWJsZS5hZGRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcmVjdDogcmVjdFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gLy8gTXVsdGkgZHJhZyBlbGVtZW50cyBhcmUgbm90IG5lY2Vzc2FyaWx5IHJlbW92ZWQgZnJvbSB0aGUgRE9NIG9uIGRyb3AsIHNvIHRvIHJlaW5zZXJ0XG4gICAgICAgICAgICAvLyBwcm9wZXJseSB0aGV5IG11c3QgYWxsIGJlIHJlbW92ZWRcblxuXG4gICAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5bbXVsdGlEcmFnSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50RWwuaW5zZXJ0QmVmb3JlKG11bHRpRHJhZ0VsZW1lbnQsIGNoaWxkcmVuW211bHRpRHJhZ0luZGV4XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBtdWx0aURyYWdJbmRleCsrO1xuICAgICAgICAgICAgfSk7IC8vIElmIGluaXRpYWwgZm9sZGluZyBpcyBkb25lLCB0aGUgZWxlbWVudHMgbWF5IGhhdmUgY2hhbmdlZCBwb3NpdGlvbiBiZWNhdXNlIHRoZXkgYXJlIG5vd1xuICAgICAgICAgICAgLy8gdW5mb2xkaW5nIGFyb3VuZCBkcmFnRWwsIGV2ZW4gdGhvdWdoIGRyYWdFbCBtYXkgbm90IGhhdmUgaGlzIGluZGV4IGNoYW5nZWQsIHNvIHVwZGF0ZSBldmVudFxuICAgICAgICAgICAgLy8gbXVzdCBiZSBmaXJlZCBoZXJlIGFzIFNvcnRhYmxlIHdpbGwgbm90LlxuXG4gICAgICAgICAgICBpZiAob2xkSW5kZXggPT09IGluZGV4KGRyYWdFbCQxKSkge1xuICAgICAgICAgICAgICB2YXIgdXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4ICE9PSBpbmRleChtdWx0aURyYWdFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgdXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoJ3VwZGF0ZScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBNdXN0IGJlIGRvbmUgYWZ0ZXIgY2FwdHVyaW5nIGluZGl2aWR1YWwgcmVjdHMgKHNjcm9sbCBiYXIpXG5cblxuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHVuc2V0UmVjdChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0b1NvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gdG9Tb3J0YWJsZTtcbiAgICAgIH0gLy8gUmVtb3ZlIGNsb25lcyBpZiBuZWNlc3NhcnlcblxuXG4gICAgICBpZiAocm9vdEVsID09PSBwYXJlbnRFbCB8fCBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSAhPT0gJ2Nsb25lJykge1xuICAgICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICBjbG9uZS5wYXJlbnROb2RlICYmIGNsb25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG51bGxpbmdHbG9iYWw6IGZ1bmN0aW9uIG51bGxpbmdHbG9iYWwoKSB7XG4gICAgICB0aGlzLmlzTXVsdGlEcmFnID0gZHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5sZW5ndGggPSAwO1xuICAgIH0sXG4gICAgZGVzdHJveUdsb2JhbDogZnVuY3Rpb24gZGVzdHJveUdsb2JhbCgpIHtcbiAgICAgIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG5cbiAgICAgIG9mZihkb2N1bWVudCwgJ3BvaW50ZXJ1cCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ2tleWRvd24nLCB0aGlzLl9jaGVja0tleURvd24pO1xuICAgICAgb2ZmKGRvY3VtZW50LCAna2V5dXAnLCB0aGlzLl9jaGVja0tleVVwKTtcbiAgICB9LFxuICAgIF9kZXNlbGVjdE11bHRpRHJhZzogZnVuY3Rpb24gX2Rlc2VsZWN0TXVsdGlEcmFnKGV2dCkge1xuICAgICAgaWYgKHR5cGVvZiBkcmFnU3RhcnRlZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkcmFnU3RhcnRlZCkgcmV0dXJuOyAvLyBPbmx5IGRlc2VsZWN0IGlmIHNlbGVjdGlvbiBpcyBpbiB0aGlzIHNvcnRhYmxlXG5cbiAgICAgIGlmIChtdWx0aURyYWdTb3J0YWJsZSAhPT0gdGhpcy5zb3J0YWJsZSkgcmV0dXJuOyAvLyBPbmx5IGRlc2VsZWN0IGlmIHRhcmdldCBpcyBub3QgaXRlbSBpbiB0aGlzIHNvcnRhYmxlXG5cbiAgICAgIGlmIChldnQgJiYgY2xvc2VzdChldnQudGFyZ2V0LCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLnNvcnRhYmxlLmVsLCBmYWxzZSkpIHJldHVybjsgLy8gT25seSBkZXNlbGVjdCBpZiBsZWZ0IGNsaWNrXG5cbiAgICAgIGlmIChldnQgJiYgZXZ0LmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuXG4gICAgICB3aGlsZSAobXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbCA9IG11bHRpRHJhZ0VsZW1lbnRzWzBdO1xuICAgICAgICB0b2dnbGVDbGFzcyhlbCwgdGhpcy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc2hpZnQoKTtcbiAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IHRoaXMuc29ydGFibGUsXG4gICAgICAgICAgcm9vdEVsOiB0aGlzLnNvcnRhYmxlLmVsLFxuICAgICAgICAgIG5hbWU6ICdkZXNlbGVjdCcsXG4gICAgICAgICAgdGFyZ2V0RWw6IGVsLFxuICAgICAgICAgIG9yaWdpbmFsRXZ0OiBldnRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBfY2hlY2tLZXlEb3duOiBmdW5jdGlvbiBfY2hlY2tLZXlEb3duKGV2dCkge1xuICAgICAgaWYgKGV2dC5rZXkgPT09IHRoaXMub3B0aW9ucy5tdWx0aURyYWdLZXkpIHtcbiAgICAgICAgdGhpcy5tdWx0aURyYWdLZXlEb3duID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIF9jaGVja0tleVVwOiBmdW5jdGlvbiBfY2hlY2tLZXlVcChldnQpIHtcbiAgICAgIGlmIChldnQua2V5ID09PSB0aGlzLm9wdGlvbnMubXVsdGlEcmFnS2V5KSB7XG4gICAgICAgIHRoaXMubXVsdGlEcmFnS2V5RG93biA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzKE11bHRpRHJhZywge1xuICAgIC8vIFN0YXRpYyBtZXRob2RzICYgcHJvcGVydGllc1xuICAgIHBsdWdpbk5hbWU6ICdtdWx0aURyYWcnLFxuICAgIHV0aWxzOiB7XG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdHMgdGhlIHByb3ZpZGVkIG11bHRpLWRyYWcgaXRlbVxuICAgICAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgIFRoZSBlbGVtZW50IHRvIGJlIHNlbGVjdGVkXG4gICAgICAgKi9cbiAgICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KGVsKSB7XG4gICAgICAgIHZhciBzb3J0YWJsZSA9IGVsLnBhcmVudE5vZGVbZXhwYW5kb107XG4gICAgICAgIGlmICghc29ydGFibGUgfHwgIXNvcnRhYmxlLm9wdGlvbnMubXVsdGlEcmFnIHx8IH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGVsKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChtdWx0aURyYWdTb3J0YWJsZSAmJiBtdWx0aURyYWdTb3J0YWJsZSAhPT0gc29ydGFibGUpIHtcbiAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZS5tdWx0aURyYWcuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG5cbiAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHNvcnRhYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZWwsIHNvcnRhYmxlLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgdHJ1ZSk7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnB1c2goZWwpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEZXNlbGVjdHMgdGhlIHByb3ZpZGVkIG11bHRpLWRyYWcgaXRlbVxuICAgICAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgIFRoZSBlbGVtZW50IHRvIGJlIGRlc2VsZWN0ZWRcbiAgICAgICAqL1xuICAgICAgZGVzZWxlY3Q6IGZ1bmN0aW9uIGRlc2VsZWN0KGVsKSB7XG4gICAgICAgIHZhciBzb3J0YWJsZSA9IGVsLnBhcmVudE5vZGVbZXhwYW5kb10sXG4gICAgICAgICAgICBpbmRleCA9IG11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZWwpO1xuICAgICAgICBpZiAoIXNvcnRhYmxlIHx8ICFzb3J0YWJsZS5vcHRpb25zLm11bHRpRHJhZyB8fCAhfmluZGV4KSByZXR1cm47XG4gICAgICAgIHRvZ2dsZUNsYXNzKGVsLCBzb3J0YWJsZS5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV2ZW50UHJvcGVydGllczogZnVuY3Rpb24gZXZlbnRQcm9wZXJ0aWVzKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBvbGRJbmRpY2llcyA9IFtdLFxuICAgICAgICAgIG5ld0luZGljaWVzID0gW107XG4gICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgIG9sZEluZGljaWVzLnB1c2goe1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQ6IG11bHRpRHJhZ0VsZW1lbnQsXG4gICAgICAgICAgaW5kZXg6IG11bHRpRHJhZ0VsZW1lbnQuc29ydGFibGVJbmRleFxuICAgICAgICB9KTsgLy8gbXVsdGlEcmFnRWxlbWVudHMgd2lsbCBhbHJlYWR5IGJlIHNvcnRlZCBpZiBmb2xkaW5nXG5cbiAgICAgICAgdmFyIG5ld0luZGV4O1xuXG4gICAgICAgIGlmIChmb2xkaW5nICYmIG11bHRpRHJhZ0VsZW1lbnQgIT09IGRyYWdFbCQxKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChmb2xkaW5nKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50LCAnOm5vdCguJyArIF90aGlzMy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MgKyAnKScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBuZXdJbmRpY2llcy5wdXNoKHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50OiBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgIGluZGV4OiBuZXdJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXRlbXM6IF90b0NvbnN1bWFibGVBcnJheShtdWx0aURyYWdFbGVtZW50cyksXG4gICAgICAgIGNsb25lczogW10uY29uY2F0KG11bHRpRHJhZ0Nsb25lcyksXG4gICAgICAgIG9sZEluZGljaWVzOiBvbGRJbmRpY2llcyxcbiAgICAgICAgbmV3SW5kaWNpZXM6IG5ld0luZGljaWVzXG4gICAgICB9O1xuICAgIH0sXG4gICAgb3B0aW9uTGlzdGVuZXJzOiB7XG4gICAgICBtdWx0aURyYWdLZXk6IGZ1bmN0aW9uIG11bHRpRHJhZ0tleShrZXkpIHtcbiAgICAgICAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ2N0cmwnKSB7XG4gICAgICAgICAga2V5ID0gJ0NvbnRyb2wnO1xuICAgICAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAga2V5ID0ga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cigxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0TXVsdGlEcmFnRWxlbWVudHMoY2xvbmVzSW5zZXJ0ZWQsIHJvb3RFbCkge1xuICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50LCBpKSB7XG4gICAgdmFyIHRhcmdldCA9IHJvb3RFbC5jaGlsZHJlblttdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggKyAoY2xvbmVzSW5zZXJ0ZWQgPyBOdW1iZXIoaSkgOiAwKV07XG5cbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICByb290RWwuaW5zZXJ0QmVmb3JlKG11bHRpRHJhZ0VsZW1lbnQsIHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgICB9XG4gIH0pO1xufVxuLyoqXG4gKiBJbnNlcnQgbXVsdGktZHJhZyBjbG9uZXNcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gZWxlbWVudHNJbnNlcnRlZCAgV2hldGhlciB0aGUgbXVsdGktZHJhZyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWRcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSByb290RWxcbiAqL1xuXG5cbmZ1bmN0aW9uIGluc2VydE11bHRpRHJhZ0Nsb25lcyhlbGVtZW50c0luc2VydGVkLCByb290RWwpIHtcbiAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lLCBpKSB7XG4gICAgdmFyIHRhcmdldCA9IHJvb3RFbC5jaGlsZHJlbltjbG9uZS5zb3J0YWJsZUluZGV4ICsgKGVsZW1lbnRzSW5zZXJ0ZWQgPyBOdW1iZXIoaSkgOiAwKV07XG5cbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lLCB0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByb290RWwuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCkge1xuICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgbXVsdGlEcmFnRWxlbWVudC5wYXJlbnROb2RlICYmIG11bHRpRHJhZ0VsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgfSk7XG59XG5cblNvcnRhYmxlLm1vdW50KG5ldyBBdXRvU2Nyb2xsUGx1Z2luKCkpO1xuU29ydGFibGUubW91bnQoUmVtb3ZlLCBSZXZlcnQpO1xuXG5leHBvcnQgZGVmYXVsdCBTb3J0YWJsZTtcbmV4cG9ydCB7IE11bHRpRHJhZ1BsdWdpbiBhcyBNdWx0aURyYWcsIFNvcnRhYmxlLCBTd2FwUGx1Z2luIGFzIFN3YXAgfTtcbiIsInZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19kZWZQcm9wcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzO1xudmFyIF9fZ2V0T3duUHJvcERlc2NzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbnZhciBfX3NwcmVhZFByb3BzID0gKGEsIGIpID0+IF9fZGVmUHJvcHMoYSwgX19nZXRPd25Qcm9wRGVzY3MoYikpO1xuaW1wb3J0IFNvcnRhYmxlIGZyb20gXCJzb3J0YWJsZWpzXCI7XG5pbXBvcnQgeyByZXNvbHZlQ29tcG9uZW50LCBUcmFuc2l0aW9uR3JvdXAsIGRlZmluZUNvbXBvbmVudCwgaCwgbmV4dFRpY2sgfSBmcm9tIFwidnVlXCI7XG5mdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUpIHtcbiAgaWYgKG5vZGUucGFyZW50RWxlbWVudCAhPT0gbnVsbCkge1xuICAgIG5vZGUucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTtcbiAgfVxufVxuZnVuY3Rpb24gaW5zZXJ0Tm9kZUF0KGZhdGhlck5vZGUsIG5vZGUsIHBvc2l0aW9uKSB7XG4gIGNvbnN0IHJlZk5vZGUgPSBwb3NpdGlvbiA9PT0gMCA/IGZhdGhlck5vZGUuY2hpbGRyZW5bMF0gOiBmYXRoZXJOb2RlLmNoaWxkcmVuW3Bvc2l0aW9uIC0gMV0ubmV4dFNpYmxpbmc7XG4gIGZhdGhlck5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZk5vZGUpO1xufVxuZnVuY3Rpb24gZ2V0Q29uc29sZSgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gd2luZG93LmNvbnNvbGU7XG4gIH1cbiAgcmV0dXJuIGdsb2JhbC5jb25zb2xlO1xufVxuY29uc3QgY29uc29sZSQxID0gZ2V0Q29uc29sZSgpO1xuZnVuY3Rpb24gY2FjaGVkKGZuKSB7XG4gIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiBmdW5jdGlvbiBjYWNoZWRGbihzdHIpIHtcbiAgICBjb25zdCBoaXQgPSBjYWNoZVtzdHJdO1xuICAgIHJldHVybiBoaXQgfHwgKGNhY2hlW3N0cl0gPSBmbihzdHIpKTtcbiAgfTtcbn1cbmNvbnN0IHJlZ2V4ID0gLy0oXFx3KS9nO1xuY29uc3QgY2FtZWxpemUgPSBjYWNoZWQoKHN0cikgPT4gc3RyLnJlcGxhY2UocmVnZXgsIChfLCBjKSA9PiBjLnRvVXBwZXJDYXNlKCkpKTtcbmNvbnN0IG1hbmFnZUFuZEVtaXQkMSA9IFtcIlN0YXJ0XCIsIFwiQWRkXCIsIFwiUmVtb3ZlXCIsIFwiVXBkYXRlXCIsIFwiRW5kXCJdO1xuY29uc3QgZW1pdCQxID0gW1wiQ2hvb3NlXCIsIFwiVW5jaG9vc2VcIiwgXCJTb3J0XCIsIFwiRmlsdGVyXCIsIFwiQ2xvbmVcIl07XG5jb25zdCBtYW5hZ2UkMSA9IFtcIk1vdmVcIl07XG5jb25zdCBldmVudEhhbmRsZXJOYW1lcyA9IFttYW5hZ2UkMSwgbWFuYWdlQW5kRW1pdCQxLCBlbWl0JDFdLmZsYXRNYXAoKGV2ZW50czIpID0+IGV2ZW50czIpLm1hcCgoZXZ0KSA9PiBgb24ke2V2dH1gKTtcbmNvbnN0IGV2ZW50cyA9IHtcbiAgbWFuYWdlOiBtYW5hZ2UkMSxcbiAgbWFuYWdlQW5kRW1pdDogbWFuYWdlQW5kRW1pdCQxLFxuICBlbWl0OiBlbWl0JDFcbn07XG5mdW5jdGlvbiBpc1JlYWRPbmx5KGV2ZW50TmFtZSkge1xuICByZXR1cm4gZXZlbnRIYW5kbGVyTmFtZXMuaW5kZXhPZihldmVudE5hbWUpICE9PSAtMTtcbn1cbmNvbnN0IHRhZ3MgPSBbXG4gIFwiYVwiLFxuICBcImFiYnJcIixcbiAgXCJhZGRyZXNzXCIsXG4gIFwiYXJlYVwiLFxuICBcImFydGljbGVcIixcbiAgXCJhc2lkZVwiLFxuICBcImF1ZGlvXCIsXG4gIFwiYlwiLFxuICBcImJhc2VcIixcbiAgXCJiZGlcIixcbiAgXCJiZG9cIixcbiAgXCJibG9ja3F1b3RlXCIsXG4gIFwiYm9keVwiLFxuICBcImJyXCIsXG4gIFwiYnV0dG9uXCIsXG4gIFwiY2FudmFzXCIsXG4gIFwiY2FwdGlvblwiLFxuICBcImNpdGVcIixcbiAgXCJjb2RlXCIsXG4gIFwiY29sXCIsXG4gIFwiY29sZ3JvdXBcIixcbiAgXCJkYXRhXCIsXG4gIFwiZGF0YWxpc3RcIixcbiAgXCJkZFwiLFxuICBcImRlbFwiLFxuICBcImRldGFpbHNcIixcbiAgXCJkZm5cIixcbiAgXCJkaWFsb2dcIixcbiAgXCJkaXZcIixcbiAgXCJkbFwiLFxuICBcImR0XCIsXG4gIFwiZW1cIixcbiAgXCJlbWJlZFwiLFxuICBcImZpZWxkc2V0XCIsXG4gIFwiZmlnY2FwdGlvblwiLFxuICBcImZpZ3VyZVwiLFxuICBcImZvb3RlclwiLFxuICBcImZvcm1cIixcbiAgXCJoMVwiLFxuICBcImgyXCIsXG4gIFwiaDNcIixcbiAgXCJoNFwiLFxuICBcImg1XCIsXG4gIFwiaDZcIixcbiAgXCJoZWFkXCIsXG4gIFwiaGVhZGVyXCIsXG4gIFwiaGdyb3VwXCIsXG4gIFwiaHJcIixcbiAgXCJodG1sXCIsXG4gIFwiaVwiLFxuICBcImlmcmFtZVwiLFxuICBcImltZ1wiLFxuICBcImlucHV0XCIsXG4gIFwiaW5zXCIsXG4gIFwia2JkXCIsXG4gIFwibGFiZWxcIixcbiAgXCJsZWdlbmRcIixcbiAgXCJsaVwiLFxuICBcImxpbmtcIixcbiAgXCJtYWluXCIsXG4gIFwibWFwXCIsXG4gIFwibWFya1wiLFxuICBcIm1hdGhcIixcbiAgXCJtZW51XCIsXG4gIFwibWVudWl0ZW1cIixcbiAgXCJtZXRhXCIsXG4gIFwibWV0ZXJcIixcbiAgXCJuYXZcIixcbiAgXCJub3NjcmlwdFwiLFxuICBcIm9iamVjdFwiLFxuICBcIm9sXCIsXG4gIFwib3B0Z3JvdXBcIixcbiAgXCJvcHRpb25cIixcbiAgXCJvdXRwdXRcIixcbiAgXCJwXCIsXG4gIFwicGFyYW1cIixcbiAgXCJwaWN0dXJlXCIsXG4gIFwicHJlXCIsXG4gIFwicHJvZ3Jlc3NcIixcbiAgXCJxXCIsXG4gIFwicmJcIixcbiAgXCJycFwiLFxuICBcInJ0XCIsXG4gIFwicnRjXCIsXG4gIFwicnVieVwiLFxuICBcInNcIixcbiAgXCJzYW1wXCIsXG4gIFwic2NyaXB0XCIsXG4gIFwic2VjdGlvblwiLFxuICBcInNlbGVjdFwiLFxuICBcInNsb3RcIixcbiAgXCJzbWFsbFwiLFxuICBcInNvdXJjZVwiLFxuICBcInNwYW5cIixcbiAgXCJzdHJvbmdcIixcbiAgXCJzdHlsZVwiLFxuICBcInN1YlwiLFxuICBcInN1bW1hcnlcIixcbiAgXCJzdXBcIixcbiAgXCJzdmdcIixcbiAgXCJ0YWJsZVwiLFxuICBcInRib2R5XCIsXG4gIFwidGRcIixcbiAgXCJ0ZW1wbGF0ZVwiLFxuICBcInRleHRhcmVhXCIsXG4gIFwidGZvb3RcIixcbiAgXCJ0aFwiLFxuICBcInRoZWFkXCIsXG4gIFwidGltZVwiLFxuICBcInRpdGxlXCIsXG4gIFwidHJcIixcbiAgXCJ0cmFja1wiLFxuICBcInVcIixcbiAgXCJ1bFwiLFxuICBcInZhclwiLFxuICBcInZpZGVvXCIsXG4gIFwid2JyXCJcbl07XG5mdW5jdGlvbiBpc0h0bWxUYWcobmFtZSkge1xuICByZXR1cm4gdGFncy5pbmNsdWRlcyhuYW1lKTtcbn1cbmZ1bmN0aW9uIGlzVHJhbnNpdGlvbihuYW1lKSB7XG4gIHJldHVybiBbXCJ0cmFuc2l0aW9uLWdyb3VwXCIsIFwiVHJhbnNpdGlvbkdyb3VwXCJdLmluY2x1ZGVzKG5hbWUpO1xufVxuZnVuY3Rpb24gaXNIdG1sQXR0cmlidXRlKHZhbHVlKSB7XG4gIHJldHVybiBbXCJpZFwiLCBcImNsYXNzXCIsIFwicm9sZVwiLCBcInN0eWxlXCJdLmluY2x1ZGVzKHZhbHVlKSB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiZGF0YS1cIikgfHwgdmFsdWUuc3RhcnRzV2l0aChcImFyaWEtXCIpIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCJvblwiKTtcbn1cbmZ1bmN0aW9uIHByb2plY3QoZW50cmllcykge1xuICByZXR1cm4gZW50cmllcy5yZWR1Y2UoKHJlcywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgcmVzW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gcmVzO1xuICB9LCB7fSk7XG59XG5mdW5jdGlvbiBnZXRDb21wb25lbnRBdHRyaWJ1dGVzKHsgJGF0dHJzLCBjb21wb25lbnREYXRhID0ge30gfSkge1xuICBjb25zdCBhdHRyaWJ1dGVzID0gcHJvamVjdChPYmplY3QuZW50cmllcygkYXR0cnMpLmZpbHRlcigoW2tleSwgX10pID0+IGlzSHRtbEF0dHJpYnV0ZShrZXkpKSk7XG4gIHJldHVybiBfX3NwcmVhZFZhbHVlcyhfX3NwcmVhZFZhbHVlcyh7fSwgYXR0cmlidXRlcyksIGNvbXBvbmVudERhdGEpO1xufVxuZnVuY3Rpb24gY3JlYXRlU29ydGFibGVPcHRpb24oeyAkYXR0cnMsIGNhbGxCYWNrQnVpbGRlciB9KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwcm9qZWN0KGdldFZhbGlkU29ydGFibGVFbnRyaWVzKCRhdHRycykpO1xuICBPYmplY3QuZW50cmllcyhjYWxsQmFja0J1aWxkZXIpLmZvckVhY2goKFtldmVudFR5cGUsIGV2ZW50QnVpbGRlcl0pID0+IHtcbiAgICBldmVudHNbZXZlbnRUeXBlXS5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgb3B0aW9uc1tgb24ke2V2ZW50fWBdID0gZXZlbnRCdWlsZGVyKGV2ZW50KTtcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IGRyYWdnYWJsZSA9IGBbZGF0YS1kcmFnZ2FibGVdJHtvcHRpb25zLmRyYWdnYWJsZSB8fCBcIlwifWA7XG4gIHJldHVybiBfX3NwcmVhZFByb3BzKF9fc3ByZWFkVmFsdWVzKHt9LCBvcHRpb25zKSwge1xuICAgIGRyYWdnYWJsZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldFZhbGlkU29ydGFibGVFbnRyaWVzKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh2YWx1ZSkuZmlsdGVyKChba2V5LCBfXSkgPT4gIWlzSHRtbEF0dHJpYnV0ZShrZXkpKS5tYXAoKFtrZXksIHZhbHVlMl0pID0+IFtjYW1lbGl6ZShrZXkpLCB2YWx1ZTJdKS5maWx0ZXIoKFtrZXksIF9dKSA9PiAhaXNSZWFkT25seShrZXkpKTtcbn1cbmNvbnN0IGdldEh0bWxFbGVtZW50RnJvbU5vZGUgPSAobm9kZSkgPT4ge1xuICBjb25zdCBlbCA9IG5vZGUuZWwgfHwgQXJyYXkuaXNBcnJheShub2RlLmNoaWxkcmVuKSAmJiBub2RlLmNoaWxkcmVuWzBdLmVsLnBhcmVudE5vZGU7XG4gIGlmICghZWwpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiXFx1NEY3RlxcdTc1MjggdHJhbnNpdGlvbi1ncm91cCAsIFxcdTk3MDBcXHU4OTgxXFx1NTcyOHNsb3RcXHU0RTJEdGVtcGxhdGVcXHU1MTg1XFx1ODFGM1xcdTVDMTEyXFx1NUM0Mmh0bWxcXHU2ODA3XFx1N0I3RVwiKTtcbiAgfVxuICByZXR1cm4gZWwgfHwge307XG59O1xuY29uc3QgYWRkQ29udGV4dCA9IChkb21FbGVtZW50LCBjb250ZXh0KSA9PiBkb21FbGVtZW50Ll9fZHJhZ2dhYmxlX2NvbnRleHQgPSBjb250ZXh0O1xuY29uc3QgZ2V0Q29udGV4dCA9IChkb21FbGVtZW50KSA9PiBkb21FbGVtZW50Ll9fZHJhZ2dhYmxlX2NvbnRleHQ7XG5jbGFzcyBDb21wb25lbnRTdHJ1Y3R1cmUge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgbm9kZXM6IHsgaGVhZGVyLCBkZWZhdWx0OiBkZWZhdWx0Tm9kZXMsIGZvb3RlciB9LFxuICAgIHJvb3QsXG4gICAgcmVhbExpc3RcbiAgfSkge1xuICAgIHRoaXMuZGVmYXVsdE5vZGVzID0gZGVmYXVsdE5vZGVzO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbLi4uaGVhZGVyLCAuLi5kZWZhdWx0Tm9kZXMsIC4uLmZvb3Rlcl07XG4gICAgdGhpcy5leHRlcm5hbENvbXBvbmVudCA9IHJvb3QuZXh0ZXJuYWxDb21wb25lbnQ7XG4gICAgdGhpcy5yb290VHJhbnNpdGlvbiA9IHJvb3QudHJhbnNpdGlvbjtcbiAgICB0aGlzLnRhZyA9IHJvb3QudGFnO1xuICAgIHRoaXMucmVhbExpc3QgPSByZWFsTGlzdDtcbiAgfVxuICBnZXQgX2lzUm9vdENvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5leHRlcm5hbENvbXBvbmVudCB8fCB0aGlzLnJvb3RUcmFuc2l0aW9uO1xuICB9XG4gIHJlbmRlcihoMiwgYXR0cmlidXRlcykge1xuICAgIGNvbnN0IHsgdGFnLCBjaGlsZHJlbiwgX2lzUm9vdENvbXBvbmVudCB9ID0gdGhpcztcbiAgICBjb25zdCBvcHRpb24gPSAhX2lzUm9vdENvbXBvbmVudCA/IGNoaWxkcmVuIDogeyBkZWZhdWx0OiAoKSA9PiBjaGlsZHJlbiB9O1xuICAgIHJldHVybiBoMih0YWcsIGF0dHJpYnV0ZXMsIG9wdGlvbik7XG4gIH1cbiAgdXBkYXRlZCgpIHtcbiAgICBjb25zdCB7IGRlZmF1bHROb2RlcywgcmVhbExpc3QgfSA9IHRoaXM7XG4gICAgZGVmYXVsdE5vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBhZGRDb250ZXh0KGdldEh0bWxFbGVtZW50RnJvbU5vZGUobm9kZSksIHtcbiAgICAgICAgZWxlbWVudDogcmVhbExpc3RbaW5kZXhdLFxuICAgICAgICBpbmRleFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgZ2V0VW5kZXJseWluZ1ZtKGRvbUVsZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0Q29udGV4dChkb21FbGVtZW50KTtcbiAgfVxuICBnZXRWbUluZGV4RnJvbURvbUluZGV4KGRvbUluZGV4LCBlbGVtZW50KSB7XG4gICAgY29uc3QgeyBkZWZhdWx0Tm9kZXMgfSA9IHRoaXM7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGRlZmF1bHROb2RlcztcbiAgICBjb25zdCBkb21DaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW47XG4gICAgY29uc3QgZG9tRWxlbWVudCA9IGRvbUNoaWxkcmVuLml0ZW0oZG9tSW5kZXgpO1xuICAgIGlmIChkb21FbGVtZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dChkb21FbGVtZW50KTtcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIGNvbnRleHQuaW5kZXg7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBmaXJzdERvbUxpc3RFbGVtZW50ID0gZ2V0SHRtbEVsZW1lbnRGcm9tTm9kZShkZWZhdWx0Tm9kZXNbMF0pO1xuICAgIGNvbnN0IGluZGV4Rmlyc3REb21MaXN0RWxlbWVudCA9IFsuLi5kb21DaGlsZHJlbl0uZmluZEluZGV4KChlbGVtZW50MikgPT4gZWxlbWVudDIgPT09IGZpcnN0RG9tTGlzdEVsZW1lbnQpO1xuICAgIHJldHVybiBkb21JbmRleCA8IGluZGV4Rmlyc3REb21MaXN0RWxlbWVudCA/IDAgOiBsZW5ndGg7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFNsb3Qoc2xvdHMsIGtleSkge1xuICBjb25zdCBzbG90VmFsdWUgPSBzbG90c1trZXldO1xuICByZXR1cm4gc2xvdFZhbHVlID8gc2xvdFZhbHVlKCkgOiBbXTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVOb2Rlcyh7ICRzbG90cywgcmVhbExpc3QsIGdldEtleSB9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRMaXN0ID0gcmVhbExpc3QgfHwgW107XG4gIGNvbnN0IFtoZWFkZXIsIGZvb3Rlcl0gPSBbXCJoZWFkZXJcIiwgXCJmb290ZXJcIl0ubWFwKChuYW1lKSA9PiBnZXRTbG90KCRzbG90cywgbmFtZSkpO1xuICBjb25zdCB7IGl0ZW0gfSA9ICRzbG90cztcbiAgaWYgKCFpdGVtKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZHJhZ2dhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGFuIGl0ZW0gc2xvdFwiKTtcbiAgfVxuICBjb25zdCBkZWZhdWx0Tm9kZXMgPSBub3JtYWxpemVkTGlzdC5mbGF0TWFwKChlbGVtZW50LCBpbmRleCkgPT4gaXRlbSh7IGVsZW1lbnQsIGluZGV4IH0pLm1hcCgobm9kZSkgPT4ge1xuICAgIG5vZGUua2V5ID0gZ2V0S2V5KGVsZW1lbnQpO1xuICAgIG5vZGUucHJvcHMgPSBfX3NwcmVhZFByb3BzKF9fc3ByZWFkVmFsdWVzKHt9LCBub2RlLnByb3BzIHx8IHt9KSwgeyBcImRhdGEtZHJhZ2dhYmxlXCI6IHRydWUgfSk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0pKTtcbiAgaWYgKGRlZmF1bHROb2Rlcy5sZW5ndGggIT09IG5vcm1hbGl6ZWRMaXN0Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkl0ZW0gc2xvdCBtdXN0IGhhdmUgb25seSBvbmUgY2hpbGRcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBoZWFkZXIsXG4gICAgZm9vdGVyLFxuICAgIGRlZmF1bHQ6IGRlZmF1bHROb2Rlc1xuICB9O1xufVxuZnVuY3Rpb24gZ2V0Um9vdEluZm9ybWF0aW9uKHRhZykge1xuICBjb25zdCB0cmFuc2l0aW9uID0gaXNUcmFuc2l0aW9uKHRhZyk7XG4gIGNvbnN0IGV4dGVybmFsQ29tcG9uZW50ID0gIWlzSHRtbFRhZyh0YWcpICYmICF0cmFuc2l0aW9uO1xuICByZXR1cm4ge1xuICAgIHRyYW5zaXRpb24sXG4gICAgZXh0ZXJuYWxDb21wb25lbnQsXG4gICAgdGFnOiBleHRlcm5hbENvbXBvbmVudCA/IHJlc29sdmVDb21wb25lbnQodGFnKSA6IHRyYW5zaXRpb24gPyBUcmFuc2l0aW9uR3JvdXAgOiB0YWdcbiAgfTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVDb21wb25lbnRTdHJ1Y3R1cmUoeyAkc2xvdHMsIHRhZywgcmVhbExpc3QsIGdldEtleSB9KSB7XG4gIGNvbnN0IG5vZGVzID0gY29tcHV0ZU5vZGVzKHsgJHNsb3RzLCByZWFsTGlzdCwgZ2V0S2V5IH0pO1xuICBjb25zdCByb290ID0gZ2V0Um9vdEluZm9ybWF0aW9uKHRhZyk7XG4gIHJldHVybiBuZXcgQ29tcG9uZW50U3RydWN0dXJlKHsgbm9kZXMsIHJvb3QsIHJlYWxMaXN0IH0pO1xufVxuZnVuY3Rpb24gZW1pdChldnROYW1lLCBldnREYXRhKSB7XG4gIG5leHRUaWNrKCgpID0+IHRoaXMuJGVtaXQoZXZ0TmFtZS50b0xvd2VyQ2FzZSgpLCBldnREYXRhKSk7XG59XG5mdW5jdGlvbiBtYW5hZ2UoZXZ0TmFtZSkge1xuICByZXR1cm4gKGV2dERhdGEsIG9yaWdpbmFsRWxlbWVudCkgPT4ge1xuICAgIGlmICh0aGlzLnJlYWxMaXN0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpc1tgb25EcmFnJHtldnROYW1lfWBdKGV2dERhdGEsIG9yaWdpbmFsRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gbWFuYWdlQW5kRW1pdChldnROYW1lKSB7XG4gIGNvbnN0IGRlbGVnYXRlQ2FsbEJhY2sgPSBtYW5hZ2UuY2FsbCh0aGlzLCBldnROYW1lKTtcbiAgcmV0dXJuIChldnREYXRhLCBvcmlnaW5hbEVsZW1lbnQpID0+IHtcbiAgICBkZWxlZ2F0ZUNhbGxCYWNrLmNhbGwodGhpcywgZXZ0RGF0YSwgb3JpZ2luYWxFbGVtZW50KTtcbiAgICBlbWl0LmNhbGwodGhpcywgZXZ0TmFtZSwgZXZ0RGF0YSk7XG4gIH07XG59XG5sZXQgZHJhZ2dpbmdFbGVtZW50ID0gbnVsbDtcbmNvbnN0IHByb3BzID0ge1xuICBsaXN0OiB7XG4gICAgdHlwZTogQXJyYXksXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGRlZmF1bHQ6IG51bGxcbiAgfSxcbiAgbW9kZWxWYWx1ZToge1xuICAgIHR5cGU6IEFycmF5LFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBkZWZhdWx0OiBudWxsXG4gIH0sXG4gIGl0ZW1LZXk6IHtcbiAgICB0eXBlOiBbU3RyaW5nLCBGdW5jdGlvbl0sXG4gICAgcmVxdWlyZWQ6IHRydWVcbiAgfSxcbiAgY2xvbmU6IHtcbiAgICB0eXBlOiBGdW5jdGlvbixcbiAgICBkZWZhdWx0OiAob3JpZ2luYWwpID0+IHtcbiAgICAgIHJldHVybiBvcmlnaW5hbDtcbiAgICB9XG4gIH0sXG4gIHRhZzoge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgICBkZWZhdWx0OiBcImRpdlwiXG4gIH0sXG4gIG1vdmU6IHtcbiAgICB0eXBlOiBGdW5jdGlvbixcbiAgICBkZWZhdWx0OiBudWxsXG4gIH0sXG4gIGNvbXBvbmVudERhdGE6IHtcbiAgICB0eXBlOiBPYmplY3QsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGRlZmF1bHQ6IG51bGxcbiAgfVxufTtcbmNvbnN0IGVtaXRzID0gW1xuICBcInVwZGF0ZTptb2RlbFZhbHVlXCIsXG4gIFwiY2hhbmdlXCIsXG4gIC4uLlsuLi5ldmVudHMubWFuYWdlQW5kRW1pdCwgLi4uZXZlbnRzLmVtaXRdLm1hcCgoZXZ0KSA9PiBldnQudG9Mb3dlckNhc2UoKSlcbl07XG5jb25zdCBkcmFnZ2FibGVDb21wb25lbnQgPSBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcImRyYWdnYWJsZVwiLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICBwcm9wcyxcbiAgZW1pdHMsXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiBmYWxzZVxuICAgIH07XG4gIH0sXG4gIHJlbmRlcigpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5lcnJvciA9IGZhbHNlO1xuICAgICAgY29uc3QgeyAkc2xvdHMsICRhdHRycywgdGFnLCBjb21wb25lbnREYXRhLCByZWFsTGlzdCwgZ2V0S2V5IH0gPSB0aGlzO1xuICAgICAgY29uc3QgY29tcG9uZW50U3RydWN0dXJlID0gY29tcHV0ZUNvbXBvbmVudFN0cnVjdHVyZSh7XG4gICAgICAgICRzbG90cyxcbiAgICAgICAgdGFnLFxuICAgICAgICByZWFsTGlzdCxcbiAgICAgICAgZ2V0S2V5XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29tcG9uZW50U3RydWN0dXJlID0gY29tcG9uZW50U3RydWN0dXJlO1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGdldENvbXBvbmVudEF0dHJpYnV0ZXMoeyAkYXR0cnMsIGNvbXBvbmVudERhdGEgfSk7XG4gICAgICByZXR1cm4gY29tcG9uZW50U3RydWN0dXJlLnJlbmRlcihoLCBhdHRyaWJ1dGVzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSB0cnVlO1xuICAgICAgcmV0dXJuIGgoXCJwcmVcIiwgeyBzdHlsZTogeyBjb2xvcjogXCJyZWRcIiB9IH0sIGVyci5zdGFjayk7XG4gICAgfVxuICB9LFxuICBjcmVhdGVkKCkge1xuICAgIGlmICh0aGlzLmxpc3QgIT09IG51bGwgJiYgdGhpcy5tb2RlbFZhbHVlICE9PSBudWxsKSB7XG4gICAgICBjb25zb2xlJDEuZXJyb3IoXCJtb2RlbFZhbHVlIGFuZCBsaXN0IHByb3BzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUhIFBsZWFzZSBzZXQgb25lIG9yIGFub3RoZXIuXCIpO1xuICAgIH1cbiAgfSxcbiAgbW91bnRlZCgpIHtcbiAgICBpZiAodGhpcy5lcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7ICRhdHRycywgJGVsLCBjb21wb25lbnRTdHJ1Y3R1cmUgfSA9IHRoaXM7XG4gICAgY29tcG9uZW50U3RydWN0dXJlLnVwZGF0ZWQoKTtcbiAgICBjb25zdCBzb3J0YWJsZU9wdGlvbnMgPSBjcmVhdGVTb3J0YWJsZU9wdGlvbih7XG4gICAgICAkYXR0cnMsXG4gICAgICBjYWxsQmFja0J1aWxkZXI6IHtcbiAgICAgICAgbWFuYWdlQW5kRW1pdDogKGV2ZW50KSA9PiBtYW5hZ2VBbmRFbWl0LmNhbGwodGhpcywgZXZlbnQpLFxuICAgICAgICBlbWl0OiAoZXZlbnQpID0+IGVtaXQuYmluZCh0aGlzLCBldmVudCksXG4gICAgICAgIG1hbmFnZTogKGV2ZW50KSA9PiBtYW5hZ2UuY2FsbCh0aGlzLCBldmVudClcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXREb21FbGVtZW50ID0gJGVsLm5vZGVUeXBlID09PSAxID8gJGVsIDogJGVsLnBhcmVudEVsZW1lbnQ7XG4gICAgdGhpcy5fc29ydGFibGUgPSBuZXcgU29ydGFibGUodGFyZ2V0RG9tRWxlbWVudCwgc29ydGFibGVPcHRpb25zKTtcbiAgICB0aGlzLnRhcmdldERvbUVsZW1lbnQgPSB0YXJnZXREb21FbGVtZW50O1xuICAgIHRhcmdldERvbUVsZW1lbnQuX19kcmFnZ2FibGVfY29tcG9uZW50X18gPSB0aGlzO1xuICB9LFxuICB1cGRhdGVkKCkge1xuICAgIHRoaXMuY29tcG9uZW50U3RydWN0dXJlLnVwZGF0ZWQoKTtcbiAgfSxcbiAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICBpZiAodGhpcy5fc29ydGFibGUgIT09IHZvaWQgMClcbiAgICAgIHRoaXMuX3NvcnRhYmxlLmRlc3Ryb3koKTtcbiAgfSxcbiAgY29tcHV0ZWQ6IHtcbiAgICByZWFsTGlzdCgpIHtcbiAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdGhpcztcbiAgICAgIHJldHVybiBsaXN0ID8gbGlzdCA6IHRoaXMubW9kZWxWYWx1ZTtcbiAgICB9LFxuICAgIGdldEtleSgpIHtcbiAgICAgIGNvbnN0IHsgaXRlbUtleSB9ID0gdGhpcztcbiAgICAgIGlmICh0eXBlb2YgaXRlbUtleSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVtS2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIChlbGVtZW50KSA9PiBlbGVtZW50W2l0ZW1LZXldO1xuICAgIH1cbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICAkYXR0cnM6IHtcbiAgICAgIGhhbmRsZXIobmV3T3B0aW9uVmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBfc29ydGFibGUgfSA9IHRoaXM7XG4gICAgICAgIGlmICghX3NvcnRhYmxlKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZ2V0VmFsaWRTb3J0YWJsZUVudHJpZXMobmV3T3B0aW9uVmFsdWUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIF9zb3J0YWJsZS5vcHRpb24oa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGRlZXA6IHRydWVcbiAgICB9XG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRVbmRlcmx5aW5nVm0oZG9tRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50U3RydWN0dXJlLmdldFVuZGVybHlpbmdWbShkb21FbGVtZW50KSB8fCBudWxsO1xuICAgIH0sXG4gICAgZ2V0VW5kZXJseWluZ1BvdGVuY2lhbERyYWdnYWJsZUNvbXBvbmVudChodG1FbGVtZW50KSB7XG4gICAgICByZXR1cm4gaHRtRWxlbWVudC5fX2RyYWdnYWJsZV9jb21wb25lbnRfXztcbiAgICB9LFxuICAgIGVtaXRDaGFuZ2VzKGV2dCkge1xuICAgICAgbmV4dFRpY2soKCkgPT4gdGhpcy4kZW1pdChcImNoYW5nZVwiLCBldnQpKTtcbiAgICB9LFxuICAgIGFsdGVyTGlzdChvbkxpc3QpIHtcbiAgICAgIGlmICh0aGlzLmxpc3QpIHtcbiAgICAgICAgb25MaXN0KHRoaXMubGlzdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld0xpc3QgPSBbLi4udGhpcy5tb2RlbFZhbHVlXTtcbiAgICAgIG9uTGlzdChuZXdMaXN0KTtcbiAgICAgIHRoaXMuJGVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCBuZXdMaXN0KTtcbiAgICB9LFxuICAgIHNwbGljZUxpc3QoKSB7XG4gICAgICBjb25zdCBzcGxpY2VMaXN0ID0gKGxpc3QpID0+IGxpc3Quc3BsaWNlKC4uLmFyZ3VtZW50cyk7XG4gICAgICB0aGlzLmFsdGVyTGlzdChzcGxpY2VMaXN0KTtcbiAgICB9LFxuICAgIHVwZGF0ZVBvc2l0aW9uKG9sZEluZGV4LCBuZXdJbmRleCkge1xuICAgICAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSAobGlzdCkgPT4gbGlzdC5zcGxpY2UobmV3SW5kZXgsIDAsIGxpc3Quc3BsaWNlKG9sZEluZGV4LCAxKVswXSk7XG4gICAgICB0aGlzLmFsdGVyTGlzdCh1cGRhdGVQb3NpdGlvbik7XG4gICAgfSxcbiAgICBnZXRSZWxhdGVkQ29udGV4dEZyb21Nb3ZlRXZlbnQoeyB0bywgcmVsYXRlZCB9KSB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmdldFVuZGVybHlpbmdQb3RlbmNpYWxEcmFnZ2FibGVDb21wb25lbnQodG8pO1xuICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuIHsgY29tcG9uZW50IH07XG4gICAgICB9XG4gICAgICBjb25zdCBsaXN0ID0gY29tcG9uZW50LnJlYWxMaXN0O1xuICAgICAgY29uc3QgY29udGV4dCA9IHsgbGlzdCwgY29tcG9uZW50IH07XG4gICAgICBpZiAodG8gIT09IHJlbGF0ZWQgJiYgbGlzdCkge1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGNvbXBvbmVudC5nZXRVbmRlcmx5aW5nVm0ocmVsYXRlZCkgfHwge307XG4gICAgICAgIHJldHVybiBfX3NwcmVhZFZhbHVlcyhfX3NwcmVhZFZhbHVlcyh7fSwgZGVzdGluYXRpb24pLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH0sXG4gICAgZ2V0Vm1JbmRleEZyb21Eb21JbmRleChkb21JbmRleCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50U3RydWN0dXJlLmdldFZtSW5kZXhGcm9tRG9tSW5kZXgoZG9tSW5kZXgsIHRoaXMudGFyZ2V0RG9tRWxlbWVudCk7XG4gICAgfSxcbiAgICBvbkRyYWdTdGFydChldnQpIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IHRoaXMuZ2V0VW5kZXJseWluZ1ZtKGV2dC5pdGVtKTtcbiAgICAgIGV2dC5pdGVtLl91bmRlcmx5aW5nX3ZtXyA9IHRoaXMuY2xvbmUodGhpcy5jb250ZXh0LmVsZW1lbnQpO1xuICAgICAgZHJhZ2dpbmdFbGVtZW50ID0gZXZ0Lml0ZW07XG4gICAgfSxcbiAgICBvbkRyYWdBZGQoZXZ0KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZXZ0Lml0ZW0uX3VuZGVybHlpbmdfdm1fO1xuICAgICAgaWYgKGVsZW1lbnQgPT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZW1vdmVOb2RlKGV2dC5pdGVtKTtcbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5nZXRWbUluZGV4RnJvbURvbUluZGV4KGV2dC5uZXdJbmRleCk7XG4gICAgICB0aGlzLnNwbGljZUxpc3QobmV3SW5kZXgsIDAsIGVsZW1lbnQpO1xuICAgICAgY29uc3QgYWRkZWQgPSB7IGVsZW1lbnQsIG5ld0luZGV4IH07XG4gICAgICB0aGlzLmVtaXRDaGFuZ2VzKHsgYWRkZWQgfSk7XG4gICAgfSxcbiAgICBvbkRyYWdSZW1vdmUoZXZ0KSB7XG4gICAgICBpbnNlcnROb2RlQXQodGhpcy4kZWwsIGV2dC5pdGVtLCBldnQub2xkSW5kZXgpO1xuICAgICAgaWYgKGV2dC5wdWxsTW9kZSA9PT0gXCJjbG9uZVwiKSB7XG4gICAgICAgIHJlbW92ZU5vZGUoZXZ0LmNsb25lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBpbmRleDogb2xkSW5kZXgsIGVsZW1lbnQgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgIHRoaXMuc3BsaWNlTGlzdChvbGRJbmRleCwgMSk7XG4gICAgICBjb25zdCByZW1vdmVkID0geyBlbGVtZW50LCBvbGRJbmRleCB9O1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlcyh7IHJlbW92ZWQgfSk7XG4gICAgfSxcbiAgICBvbkRyYWdVcGRhdGUoZXZ0KSB7XG4gICAgICByZW1vdmVOb2RlKGV2dC5pdGVtKTtcbiAgICAgIGluc2VydE5vZGVBdChldnQuZnJvbSwgZXZ0Lml0ZW0sIGV2dC5vbGRJbmRleCk7XG4gICAgICBjb25zdCBvbGRJbmRleCA9IHRoaXMuY29udGV4dC5pbmRleDtcbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5nZXRWbUluZGV4RnJvbURvbUluZGV4KGV2dC5uZXdJbmRleCk7XG4gICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKG9sZEluZGV4LCBuZXdJbmRleCk7XG4gICAgICBjb25zdCBtb3ZlZCA9IHsgZWxlbWVudDogdGhpcy5jb250ZXh0LmVsZW1lbnQsIG9sZEluZGV4LCBuZXdJbmRleCB9O1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlcyh7IG1vdmVkIH0pO1xuICAgIH0sXG4gICAgY29tcHV0ZUZ1dHVyZUluZGV4KHJlbGF0ZWRDb250ZXh0LCBldnQpIHtcbiAgICAgIGlmICghcmVsYXRlZENvbnRleHQuZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRvbUNoaWxkcmVuID0gWy4uLmV2dC50by5jaGlsZHJlbl0uZmlsdGVyKChlbCkgPT4gZWwuc3R5bGVbXCJkaXNwbGF5XCJdICE9PSBcIm5vbmVcIik7XG4gICAgICBjb25zdCBjdXJyZW50RG9tSW5kZXggPSBkb21DaGlsZHJlbi5pbmRleE9mKGV2dC5yZWxhdGVkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHJlbGF0ZWRDb250ZXh0LmNvbXBvbmVudC5nZXRWbUluZGV4RnJvbURvbUluZGV4KGN1cnJlbnREb21JbmRleCk7XG4gICAgICBjb25zdCBkcmFnZ2VkSW5MaXN0ID0gZG9tQ2hpbGRyZW4uaW5kZXhPZihkcmFnZ2luZ0VsZW1lbnQpICE9PSAtMTtcbiAgICAgIHJldHVybiBkcmFnZ2VkSW5MaXN0IHx8ICFldnQud2lsbEluc2VydEFmdGVyID8gY3VycmVudEluZGV4IDogY3VycmVudEluZGV4ICsgMTtcbiAgICB9LFxuICAgIG9uRHJhZ01vdmUoZXZ0LCBvcmlnaW5hbEV2ZW50KSB7XG4gICAgICBjb25zdCB7IG1vdmUsIHJlYWxMaXN0IH0gPSB0aGlzO1xuICAgICAgaWYgKCFtb3ZlIHx8ICFyZWFsTGlzdCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0ZWRDb250ZXh0ID0gdGhpcy5nZXRSZWxhdGVkQ29udGV4dEZyb21Nb3ZlRXZlbnQoZXZ0KTtcbiAgICAgIGNvbnN0IGZ1dHVyZUluZGV4ID0gdGhpcy5jb21wdXRlRnV0dXJlSW5kZXgocmVsYXRlZENvbnRleHQsIGV2dCk7XG4gICAgICBjb25zdCBkcmFnZ2VkQ29udGV4dCA9IF9fc3ByZWFkUHJvcHMoX19zcHJlYWRWYWx1ZXMoe30sIHRoaXMuY29udGV4dCksIHtcbiAgICAgICAgZnV0dXJlSW5kZXhcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2VuZEV2ZW50ID0gX19zcHJlYWRQcm9wcyhfX3NwcmVhZFZhbHVlcyh7fSwgZXZ0KSwge1xuICAgICAgICByZWxhdGVkQ29udGV4dCxcbiAgICAgICAgZHJhZ2dlZENvbnRleHRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG1vdmUoc2VuZEV2ZW50LCBvcmlnaW5hbEV2ZW50KTtcbiAgICB9LFxuICAgIG9uRHJhZ0VuZCgpIHtcbiAgICAgIGRyYWdnaW5nRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG59KTtcbmV4cG9ydCB7IGRyYWdnYWJsZUNvbXBvbmVudCBhcyBkZWZhdWx0IH07XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnQgOmlzPVwidWkuYnV0dG9uR3JvdXAubmFtZVwiIGNsYXNzPVwiZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyXCI+XG4gICAgPGZzLWJ1dHRvblxuICAgICAgdi1mb3I9XCJvcHRpb24gb2Ygb3B0aW9uc1wiXG4gICAgICA6a2V5PVwib3B0aW9uLmljb25cIlxuICAgICAgOnR5cGU9XCJtb2RlbFZhbHVlID09PSBvcHRpb24udmFsdWUgPyAncHJpbWFyeScgOiAnZGVmYXVsdCdcIlxuICAgICAgOmljb249XCJvcHRpb24uaWNvblwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgQGNsaWNrPVwic3VibWl0KG9wdGlvbi52YWx1ZSlcIlxuICAgIC8+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3VzZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzVGFibGVDb2x1bW5zRml4ZWRDb250cm9sbGVyXCIsXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZToge1xuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCBcImNoYW5nZVwiXSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogXCJsZWZ0XCIsXG4gICAgICAgICAgaWNvbjogdWkuaWNvbnMubGVmdCAvLyAnZWwtaWNvbi1hcnJvdy1sZWZ0J1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICAgIGljb246IHVpLmljb25zLmNsb3NlIC8vICdlbC1pY29uLWNsb3NlJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IFwicmlnaHRcIixcbiAgICAgICAgICBpY29uOiB1aS5pY29ucy5yaWdodCAvLyAnZWwtaWNvbi1hcnJvdy1yaWdodCdcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHN1Ym1pdCh2YWx1ZTogYW55KSB7XG4gICAgICBjdHguZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHN1Ym1pdFxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlciB7XG4gIC5mcy1idXR0b24ge1xuICAgIHBhZGRpbmc6IDJweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICBtaW4taGVpZ2h0OiBhdXRvO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50IDppcz1cInVpLmJ1dHRvbkdyb3VwLm5hbWVcIiBjbGFzcz1cImZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlclwiPlxuICAgIDxmcy1idXR0b25cbiAgICAgIHYtZm9yPVwib3B0aW9uIG9mIG9wdGlvbnNcIlxuICAgICAgOmtleT1cIm9wdGlvbi5pY29uXCJcbiAgICAgIDp0eXBlPVwibW9kZWxWYWx1ZSA9PT0gb3B0aW9uLnZhbHVlID8gJ3ByaW1hcnknIDogJ2RlZmF1bHQnXCJcbiAgICAgIDppY29uPVwib3B0aW9uLmljb25cIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIEBjbGljaz1cInN1Ym1pdChvcHRpb24udmFsdWUpXCJcbiAgICAvPlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCByZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi8uLi8uLi91c2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1RhYmxlQ29sdW1uc0ZpeGVkQ29udHJvbGxlclwiLFxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBlbWl0czogW1widXBkYXRlOm1vZGVsVmFsdWVcIiwgXCJjaGFuZ2VcIl0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IFwibGVmdFwiLFxuICAgICAgICAgIGljb246IHVpLmljb25zLmxlZnQgLy8gJ2VsLWljb24tYXJyb3ctbGVmdCdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgICAgICBpY29uOiB1aS5pY29ucy5jbG9zZSAvLyAnZWwtaWNvbi1jbG9zZSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiBcInJpZ2h0XCIsXG4gICAgICAgICAgaWNvbjogdWkuaWNvbnMucmlnaHQgLy8gJ2VsLWljb24tYXJyb3ctcmlnaHQnXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBzdWJtaXQodmFsdWU6IGFueSkge1xuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCB2YWx1ZSk7XG4gICAgICBjdHguZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBzdWJtaXRcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy10YWJsZS1jb2x1bW5zLWZpeGVkLWNvbnRyb2xsZXIge1xuICAuZnMtYnV0dG9uIHtcbiAgICBwYWRkaW5nOiAycHggIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IDEwcHg7XG4gICAgbWluLWhlaWdodDogYXV0bztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRyYWdnYWJsZSA6bGlzdD1cImNvbHVtbnNcIiBpdGVtLWtleT1cImtleVwiIDptb3ZlPVwib25EcmFnZ2FibGVNb3ZlXCI+XG4gICAgPHRlbXBsYXRlICNpdGVtPVwieyBlbGVtZW50LCBpbmRleCB9XCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgdi1zaG93PVwib3JpZ2luYWxDb2x1bW5zTWFwW2VsZW1lbnQuX19rZXldPy5fX3Nob3cgIT09IGZhbHNlXCJcbiAgICAgICAgICA6dGl0bGU9XCJidWlsZFRleHQoZWxlbWVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY29tcG9uZW50LS1saXN0LWl0ZW1cIlxuICAgICAgICAgIGZsZXg9XCJtYWluOmp1c3RpZnkgY3Jvc3M6Y2VudGVyXCJcbiAgICAgICAgICA6aT1cImluZGV4XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjb21wb25lbnRcbiAgICAgICAgICAgIDppcz1cInVpLmNoZWNrYm94Lm5hbWVcIlxuICAgICAgICAgICAgOlt1aS5jaGVja2JveC5tb2RlbFZhbHVlXT1cImVsZW1lbnQuc2hvd1wiXG4gICAgICAgICAgICA6ZGlzYWJsZWQ9XCJvcmlnaW5hbENvbHVtbnNNYXBbZWxlbWVudC5fX2tleV0/Ll9fZGlzYWJsZWQgPT09IHRydWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJpdGVtLWxhYmVsXCJcbiAgICAgICAgICAgIDp0aXRsZT1cImJ1aWxkVGV4dChlbGVtZW50KVwiXG4gICAgICAgICAgICBAW2J1aWxkVXBkYXRlS2V5KHVpLmNoZWNrYm94Lm1vZGVsVmFsdWUpXT1cInVwZGF0ZUNoZWNrZWQoZWxlbWVudClcIlxuICAgICAgICAgICAgQGNoYW5nZT1cIm9uQ2hlY2tDaGFuZ2VkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBidWlsZFRleHQoZWxlbWVudCkgfX1cbiAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1yaWdodFwiPlxuICAgICAgICAgICAgPGZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlclxuICAgICAgICAgICAgICB2LWlmPVwiaXNSb290XCJcbiAgICAgICAgICAgICAgdi1tb2RlbD1cImVsZW1lbnQuZml4ZWRcIlxuICAgICAgICAgICAgICBmbGV4LWJveD1cIjBcIlxuICAgICAgICAgICAgICBjbGFzcz1cImQyLW1yLTEwXCJcbiAgICAgICAgICAgICAgQGNoYW5nZT1cImZpeGVkQ2hhbmdlKGluZGV4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2IGZsZXgtYm94PVwiMFwiIGNsYXNzPVwiY29tcG9uZW50LS1saXN0LWl0ZW0taGFuZGxlIGhhbmRsZVwiPlxuICAgICAgICAgICAgICA8ZnMtaWNvbiA6aWNvbj1cInVpLmljb25zLnNvcnRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDIwcHg7IHBhZGRpbmctbGVmdDogMTBweDsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZWVlXCI+XG4gICAgICAgICAgPGZzLWNvbHVtbnMtZmlsdGVyLW5lc3QtbGlzdFxuICAgICAgICAgICAgdi1pZj1cImVsZW1lbnQuY2hpbGRyZW5cIlxuICAgICAgICAgICAgOmNvbHVtbnM9XCJlbGVtZW50LmNoaWxkcmVuXCJcbiAgICAgICAgICAgIEBjaGVjay1jaGFuZ2VkPVwib25DaGVja0NoYW5nZWRcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9kcmFnZ2FibGU+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cbi8v5LiN6KaB5YigXG4vL0B0cy1pZ25vcmVcbmltcG9ydCBkcmFnZ2FibGUgZnJvbSBcInZ1ZWRyYWdnYWJsZS1lc1wiO1xuaW1wb3J0IEZzVGFibGVDb2x1bW5zRml4ZWRDb250cm9sbGVyIGZyb20gXCIuL2ZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlci9pbmRleC52dWVcIjtcbmltcG9ydCB7IENvbHVtbnNGaWx0ZXJDb250ZXh0LCBDb2x1bW5zRmlsdGVySXRlbSwgQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXkgfSBmcm9tIFwiLi4vLi4vLi4vZFwiO1xuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiQGZhc3QtY3J1ZC91aS1pbnRlcmZhY2VcIjtcblxuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbmNvbnN0IGVtaXRzID0gZGVmaW5lRW1pdHMoW1wiY2hlY2stY2hhbmdlZFwiLCBcImZpeGVkLWNoYW5nZWRcIl0pO1xudHlwZSBOZXN0TGlzdFByb3BzID0ge1xuICBjb2x1bW5zOiBDb2x1bW5zRmlsdGVySXRlbVtdO1xuICBpc1Jvb3Q/OiBib29sZWFuO1xufTtcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKGRlZmluZVByb3BzPE5lc3RMaXN0UHJvcHM+KCksIHtcbiAgaXNSb290OiBmYWxzZVxufSk7XG5jb25zdCB7IG9yaWdpbmFsQ29sdW1ucywgY3VycmVudENvbHVtbnMsIG9yaWdpbmFsQ29sdW1uc01hcCwgdGV4dCwgYWN0aXZlIH0gPVxuICBpbmplY3Q8Q29sdW1uc0ZpbHRlckNvbnRleHQ+KENvbHVtbnNGaWx0ZXJQcm92aWRlS2V5KTtcbmZ1bmN0aW9uIGJ1aWxkVGV4dChlbGVtZW50OiBhbnkpIHtcbiAgcmV0dXJuIGVsZW1lbnQubGFiZWwgfHwgZWxlbWVudC50aXRsZSB8fCBlbGVtZW50LmtleSB8fCB0ZXh0LnZhbHVlLnVubmFtZWQ7XG59XG5cbmZ1bmN0aW9uIG9uRHJhZ2dhYmxlTW92ZShlOiBhbnkpIHtcbiAgY29uc3QgZHJhZ2VkID0gZS5kcmFnZ2VkQ29udGV4dC5lbGVtZW50O1xuICBjb25zdCB0YXJnZXQgPSBlLnJlbGF0ZWRDb250ZXh0LmVsZW1lbnQ7XG4gIGNvbnN0IHNvcnRlZDogQ29sdW1uc0ZpbHRlckl0ZW1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgY3VycmVudENvbHVtbnMudmFsdWUpIHtcbiAgICBpZiAoaXRlbS5rZXkgPT09IGRyYWdlZC5rZXkpIHtcbiAgICAgIHNvcnRlZC5wdXNoKHRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLmtleSA9PT0gdGFyZ2V0LmtleSkge1xuICAgICAgc29ydGVkLnB1c2goZHJhZ2VkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc29ydGVkLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIC8v55yLa2V555qE5o6S5YiX5piv5ZCm5q2j5bi4XG4gIGxldCBsZWZ0SW5kZXggPSAwO1xuICBsZXQgcmlnaHRJbmRleCA9IHNvcnRlZC5sZW5ndGggLSAxO1xuICBsZXQgbWluTm90SW5kZXggPSBzb3J0ZWQubGVuZ3RoIC0gMTtcbiAgbGV0IG1heE5vdEluZGV4ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gc29ydGVkW2ldO1xuICAgIGlmIChpdGVtLmZpeGVkID09PSBcImxlZnRcIikge1xuICAgICAgbGVmdEluZGV4ID0gaTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0uZml4ZWQgPT09IFwicmlnaHRcIikge1xuICAgICAgcmlnaHRJbmRleCA9IHJpZ2h0SW5kZXggPiBpID8gaSA6IHJpZ2h0SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pbk5vdEluZGV4ID0gbWluTm90SW5kZXggPiBpID8gaSA6IG1pbk5vdEluZGV4O1xuICAgICAgbWF4Tm90SW5kZXggPSBtYXhOb3RJbmRleCA8IGkgPyBpIDogbWF4Tm90SW5kZXg7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1pbk5vdEluZGV4IDwgbGVmdEluZGV4IHx8IG1heE5vdEluZGV4ID4gcmlnaHRJbmRleCkge1xuICAgIC8vdWkubWVzc2FnZS5lcnJvcihcIumdnmZpeGVk5a2X5q615LiN5b6X6LaK6L+HZml4ZWTlrZfmrrXnmoTpobrluo9cIik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBidWlsZFVwZGF0ZUtleShrZXkpIHtcbiAgcmV0dXJuIFwidXBkYXRlOlwiICsga2V5O1xufVxuXG5mdW5jdGlvbiBmaW5kRnJvbVRyZWUodHJlZTogYW55W10sIGtleTogc3RyaW5nKSB7XG4gIGZvciAoY29uc3QgaXRlbSBvZiB0cmVlKSB7XG4gICAgaWYgKGl0ZW0ua2V5ID09PSBrZXkpIHtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZmluZEZyb21UcmVlKGl0ZW0uY2hpbGRyZW4sIGtleSk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlQ2hlY2tlZChlbGVtZW50OiBhbnkpIHtcbiAgZWxlbWVudC5zaG93ID0gIWVsZW1lbnQuc2hvdztcbiAgLy/nuqfogZTpgInkuK3lkozlj5bmtohcblxuICBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbihlbGVtZW50OiBhbnkpIHtcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikge1xuICAgICAgZWxlbWVudC5jaGlsZHJlbi5mb3JFYWNoKChlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFlLl9fc2hvdyB8fCBlLl9fZGlzYWJsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZS5zaG93ID0gZWxlbWVudC5zaG93O1xuICAgICAgICB1cGRhdGVDaGlsZHJlbihlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICB1cGRhdGVDaGlsZHJlbihlbGVtZW50KTtcblxuICBmdW5jdGlvbiB1cGRhdGVQYXJlbnQoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50Ll9fcGFyZW50KSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBlbGVtZW50Ll9fcGFyZW50O1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICBwYXJlbnQuc2hvdyA9IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoKGU6IGFueSkgPT4gZS5fX3Nob3cgJiYgZS5zaG93ID09PSB0cnVlKS5sZW5ndGggPiAwO1xuICAgICAgICB1cGRhdGVQYXJlbnQocGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdXBkYXRlUGFyZW50KGVsZW1lbnQpO1xufVxuZnVuY3Rpb24gb25DaGVja0NoYW5nZWQoKSB7XG4gIGVtaXRzKFwiY2hlY2stY2hhbmdlZFwiKTtcbn1cbmZ1bmN0aW9uIGZpeGVkQ2hhbmdlKGluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcbiAgZW1pdHMoXCJmaXhlZC1jaGFuZ2VkXCIsIGluZGV4LCB2YWx1ZSk7XG59XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cInVpLmRyYXdlci5uYW1lXCJcbiAgICBjbGFzcz1cImZzLWNvbHVtbnMtZmlsdGVyLWxheW91dC1kZWZhdWx0XCJcbiAgICA6dGl0bGU9XCJ0ZXh0LnRpdGxlXCJcbiAgICB2LWJpbmQ9XCJkcmF3ZXJCaW5kXCJcbiAgICBhcHBlbmQtdG8tYm9keVxuICA+XG4gICAgPGNvbXBvbmVudFxuICAgICAgOmlzPVwidWkuZHJhd2VyLmhhc0NvbnRlbnRXcmFwIHx8ICdkaXYnXCJcbiAgICAgIGNsYXNzPVwiZnMtZHJhd2VyLXdyYXBwZXIgZnMtdGFibGUtY29sdW1ucy1maWx0ZXJcIlxuICAgICAgOnRpdGxlPVwidGV4dC50aXRsZVwiXG4gICAgPlxuICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jYXJkLm5hbWVcIiBzaGFkb3c9XCJuZXZlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LS1saXN0XCI+XG4gICAgICAgICAgPGRpdiBrZXk9XCJfX2ZpcnN0X19cIiBjbGFzcz1cImNvbXBvbmVudC0tbGlzdC1pdGVtXCIgZmxleD1cIm1haW46anVzdGlmeSBjcm9zczpjZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIDpzcGFuPVwiMTJcIj5cbiAgICAgICAgICAgICAgPCEtLSDlhajpgIkg5Y+N6YCJIC0tPlxuICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmNoZWNrYm94Lm5hbWVcIiA6aW5kZXRlcm1pbmF0ZT1cImlzSW5kZXRlcm1pbmF0ZVwiIHYtYmluZD1cImNoZWNrQWxsQmluZFwiPlxuICAgICAgICAgICAgICAgIHt7IHNob3dMZW5ndGggfX0gLyB7eyBhbGxMZW5ndGggfX1cbiAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3sgdGV4dC5maXhlZCB9fSAvIHt7IHRleHQub3JkZXIgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZnMtY29sdW1ucy1maWx0ZXItbmVzdC1saXN0XG4gICAgICAgICAgICA6Y29sdW1ucz1cImN1cnJlbnRDb2x1bW5zXCJcbiAgICAgICAgICAgIDppcy1yb290PVwidHJ1ZVwiXG4gICAgICAgICAgICBAY2hlY2stY2hhbmdlZD1cImFsbENoZWNrZWRVcGRhdGVcIlxuICAgICAgICAgICAgQGZpeGVkLWNoYW5nZWQ9XCJmaXhlZENoYW5nZVwiXG4gICAgICAgICAgPjwvZnMtY29sdW1ucy1maWx0ZXItbmVzdC1saXN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgICAgPHNsb3QgbmFtZT1cImJ1dHRvbnNcIj48L3Nsb3Q+XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIiBzZXR1cD5cbmltcG9ydCB7IG1lcmdlIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuLy/kuI3opoHliKBcbi8vQHRzLWlnbm9yZVxuaW1wb3J0IGRyYWdnYWJsZSBmcm9tIFwidnVlZHJhZ2dhYmxlLWVzXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi8uLi91c2VcIjtcbmltcG9ydCB7IGNvbXB1dGVkLCBpbmplY3QsIHJlZiwgd2F0Y2ggfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBDb2x1bW5zRmlsdGVyUHJvdmlkZUtleSwgQ29sdW1uc0ZpbHRlckNvbnRleHQsIENvbHVtbnNGaWx0ZXJDb250YWluZXJQcm9wcyB9IGZyb20gXCIuLi8uLi8uLi9kL1wiO1xuaW1wb3J0IEZzQ29sdW1uc0ZpbHRlck5lc3RMaXN0IGZyb20gXCIuL2ZzLWNvbHVtbnMtZmlsdGVyLW5lc3QtbGlzdC52dWVcIjtcblxuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcblxuY29uc3QgeyBvcmlnaW5hbENvbHVtbnMsIGN1cnJlbnRDb2x1bW5zLCB0ZXh0LCBhY3RpdmUgfSA9IGluamVjdDxDb2x1bW5zRmlsdGVyQ29udGV4dD4oQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXkpO1xuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczxDb2x1bW5zRmlsdGVyQ29udGFpbmVyUHJvcHM+KCk7XG5jb25zdCBkcmF3ZXJCaW5kID0gY29tcHV0ZWQoKCkgPT4ge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgW3VpLmRyYXdlci52aXNpYmxlXTogYWN0aXZlLnZhbHVlLFxuICAgICAgW1wib25VcGRhdGU6XCIgKyB1aS5kcmF3ZXIudmlzaWJsZV06IChlOiBhbnkpID0+IHtcbiAgICAgICAgYWN0aXZlLnZhbHVlID0gZTtcbiAgICAgIH0sXG4gICAgICBbdWkuZHJhd2VyLndpZHRoXTogcHJvcHMud2lkdGggfHwgXCI0MDBweFwiXG4gICAgfSxcbiAgICBwcm9wcy5kcmF3ZXJcbiAgKTtcbn0pO1xuXG5jb25zdCBjaGVja0FsbCA9IHJlZihmYWxzZSk7XG4vLyDlhajpgInlkozlj43pgInlj5HnlJ/lj5jljJbml7bop6blj5FcbmZ1bmN0aW9uIG9uQ2hlY2tBbGxDaGFuZ2UodmFsdWU6IGFueSkge1xuICBjaGVja0FsbC52YWx1ZSA9IHZhbHVlO1xuICBjdXJyZW50Q29sdW1ucy52YWx1ZSA9IGN1cnJlbnRDb2x1bW5zLnZhbHVlLm1hcCgoZTogYW55KSA9PiB7XG4gICAgaWYgKCFlLl9fc2hvdyB8fCBlLl9fZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICBlLnNob3cgPSB2YWx1ZTtcbiAgICByZXR1cm4gZTtcbiAgfSk7XG59XG5cbmNvbnN0IGNoZWNrQWxsQmluZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBbdWkuY2hlY2tib3gubW9kZWxWYWx1ZV06IGNoZWNrQWxsLnZhbHVlLFxuICAgIFtcIm9uVXBkYXRlOlwiICsgdWkuY2hlY2tib3gubW9kZWxWYWx1ZV06ICh2OiBhbnkpID0+IHtcbiAgICAgIG9uQ2hlY2tBbGxDaGFuZ2Uodik7XG4gICAgfVxuICB9O1xufSk7XG5cbmNvbnN0IHNob3dMZW5ndGggPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiBjdXJyZW50Q29sdW1ucy52YWx1ZS5maWx0ZXIoKGU6IGFueSkgPT4gZS5fX3Nob3cgJiYgZS5zaG93ID09PSB0cnVlKS5sZW5ndGg7XG59KTtcbmNvbnN0IGFsbExlbmd0aCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIGN1cnJlbnRDb2x1bW5zLnZhbHVlLmZpbHRlcigoZTogYW55KSA9PiBlLl9fc2hvdykubGVuZ3RoO1xufSk7XG5jb25zdCBpc0luZGV0ZXJtaW5hdGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiBzaG93TGVuZ3RoLnZhbHVlID4gMCAmJiBzaG93TGVuZ3RoLnZhbHVlIDwgYWxsTGVuZ3RoLnZhbHVlO1xufSk7XG5cbndhdGNoKFxuICAoKSA9PiB7XG4gICAgY3VycmVudENvbHVtbnMudmFsdWU7XG4gIH0sXG4gICgpID0+IHtcbiAgICBhbGxDaGVja2VkVXBkYXRlKCk7XG4gIH0sXG4gIHsgaW1tZWRpYXRlOiB0cnVlIH1cbik7XG5cbi8vIGZpeGVkIOWPmOWMluaXtuinpuWPkVxuZnVuY3Rpb24gZml4ZWRDaGFuZ2UoaW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSkge1xuICBpZiAodmFsdWUpIHtcbiAgICBjdXJyZW50Q29sdW1ucy52YWx1ZVtpbmRleF0uc2hvdyA9IHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09PSBcImxlZnRcIikge1xuICAgIGN1cnJlbnRDb2x1bW5zLnZhbHVlLnVuc2hpZnQoY3VycmVudENvbHVtbnMudmFsdWUuc3BsaWNlKGluZGV4LCAxKVswXSk7XG4gIH1cbiAgaWYgKHZhbHVlID09PSBcInJpZ2h0XCIpIHtcbiAgICBjdXJyZW50Q29sdW1ucy52YWx1ZS5wdXNoKGN1cnJlbnRDb2x1bW5zLnZhbHVlLnNwbGljZShpbmRleCwgMSlbMF0pO1xuICB9XG4gIGFsbENoZWNrZWRVcGRhdGUoKTtcbn1cbmZ1bmN0aW9uIGFsbENoZWNrZWRVcGRhdGUoKSB7XG4gIGNoZWNrQWxsLnZhbHVlID0gc2hvd0xlbmd0aC52YWx1ZSA9PT0gYWxsTGVuZ3RoLnZhbHVlO1xufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1idG5zXCI+XG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGJ1dHRvbnNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgPGZzLWJ1dHRvbiB2LWlmPVwiaXRlbS5zaG93XCIgdi1iaW5kPVwiaXRlbVwiIEBjbGljaz1cIml0ZW0uX2NsaWNrKClcIiAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2NvbXBvbmVudD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzU2VhcmNoQnV0dG9uc1wiLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICBwcm9wczoge1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH1cbiAgfSxcbiAgc2V0dXAoKSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICByZXR1cm4geyB1aSB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtYnRuc1wiPlxuICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBidXR0b25zXCIgOmtleT1cImluZGV4XCI+XG4gICAgICAgIDxmcy1idXR0b24gdi1pZj1cIml0ZW0uc2hvd1wiIHYtYmluZD1cIml0ZW1cIiBAY2xpY2s9XCJpdGVtLl9jbGljaygpXCIgLz5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1NlYXJjaEJ1dHRvbnNcIixcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcbiAgcHJvcHM6IHtcbiAgICBidXR0b25zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9XG4gIH0sXG4gIHNldHVwKCkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgcmV0dXJuIHsgdWkgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaCBmcy1zZWFyY2gtdjJcIj5cbiAgICA8Y29tcG9uZW50IDppcz1cInVpLmNvbGxhcHNlVHJhbnNpdGlvbi5uYW1lXCI+XG4gICAgICA8Y29tcG9uZW50XG4gICAgICAgIDppcz1cInVpLmZvcm0ubmFtZVwiXG4gICAgICAgIHJlZj1cInNlYXJjaEZvcm1SZWZcIlxuICAgICAgICA6bW9kZWw9XCJmb3JtRGF0YVwiXG4gICAgICAgIG9uc3VibWl0PVwiZXZlbnQucHJldmVudERlZmF1bHQoKTtcIlxuICAgICAgICB2LWJpbmQ9XCJvcHRpb25zXCJcbiAgICAgICAgOnJ1bGVzPVwiY29tcHV0ZWRSdWxlc1wiXG4gICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLWZvcm1cIlxuICAgICAgICBAY29tcG9zaXRpb25zdGFydD1cImNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCh0cnVlKVwiXG4gICAgICAgIEBjb21wb3NpdGlvbmVuZD1cImNoYW5nZUlucHV0RXZlbnREaXNhYmxlZChmYWxzZSlcIlxuICAgICAgPlxuICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgOmlzPVwiY29udGFpbmVyPy5pcyB8fCAnZnMtc2VhcmNoLWxheW91dC1kZWZhdWx0J1wiXG4gICAgICAgICAgdi1pZj1cInNob3cgIT09IGZhbHNlXCJcbiAgICAgICAgICB2LWJpbmQ9XCJjb250YWluZXJcIlxuICAgICAgICAgIDpjb2x1bW5zPVwiY29tcHV0ZWRDb2x1bW5zXCJcbiAgICAgICAgICA6Z2V0LWNvbnRleHQtZm49XCJnZXRDb250ZXh0Rm5cIlxuICAgICAgICA+XG4gICAgICAgICAgPHRlbXBsYXRlICNzZWFyY2gtYnV0dG9ucz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtYnV0dG9uc1wiPlxuICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNvbXB1dGVkQnV0dG9uc1wiIDprZXk9XCJpbmRleFwiPlxuICAgICAgICAgICAgICAgIDxmcy1idXR0b24gdi1pZj1cIml0ZW0uc2hvdyAhPT0gZmFsc2VcIiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrPVwiaXRlbS5fY2xpY2soKVwiIC8+XG4gICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuXG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzbG90c1snc2VhcmNoLWxlZnQnXVwiICNzZWFyY2gtbGVmdD5cbiAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLWxlZnQnXVwiIDpzY29wZT1cImdldENvbnRleHRGbigpXCIgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2xvdHNbJ3NlYXJjaC1taWRkbGUnXVwiICNzZWFyY2gtbWlkZGxlPlxuICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtbWlkZGxlJ11cIiA6c2NvcGU9XCJnZXRDb250ZXh0Rm4oKVwiIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cInNsb3RzWydzZWFyY2gtcmlnaHQnXVwiICNzZWFyY2gtcmlnaHQ+XG4gICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1yaWdodCddXCIgOnNjb3BlPVwiZ2V0Q29udGV4dEZuKClcIiAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHN4XCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBuZXh0VGljaywgcmVhY3RpdmUsIHJlZiwgUmVmLCB1bnJlZiwgd2F0Y2ggfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBmb3JFYWNoLCBjbG9uZURlZXAsIGVhY2gsIGtleXMsIHVuc2V0LCBzZXQsIHNvcnRCeSwgZW50cmllcywgZGVib3VuY2UsIGdldCBhcyBMb2Rhc2hHZXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtY29tcHV0ZVwiO1xuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwubG9nXCI7XG5pbXBvcnQgRnNTZWFyY2hCdXR0b25zIGZyb20gXCIuL2J1dHRvbnMudnVlXCI7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEJ1dHRvbnNQcm9wcyxcbiAgU2VhcmNoRXZlbnRDb250ZXh0LFxuICBTZWFyY2hJdGVtUHJvcHMsXG4gIFR5cGVNYXAsXG4gIFZhbHVlQ2hhbmdlQ29udGV4dCxcbiAgVmFsdWVDaGFuZ2VIYW5kbGVcbn0gZnJvbSBcIi4uLy4uL2RcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtdWlcIjtcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtbWVyZ2VcIjtcblxuLyoqXG4gKiDmn6Xor6LmoYbnu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1NlYXJjaFwiLFxuICBjb21wb25lbnRzOiB7IEZzU2VhcmNoQnV0dG9ucyB9LFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOW4g+WxgOWuueWZqFxuICAgICAqL1xuICAgIGNvbnRhaW5lcjoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliJ3lp4vmn6Xor6LmnaHku7ZcbiAgICAgKiDngrnlh7vph43nva7vvIzkvJrph43nva7miJDor6XmnaHku7ZcbiAgICAgKi9cbiAgICBpbml0aWFsRm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmoKHpqozlkI7nmoTmn6Xor6LooajljZXmlbDmja5cbiAgICAgKi9cbiAgICB2YWxpZGF0ZWRGb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOWNleWPguaVsFxuICAgICAqIOaUr+aMgWVsLWZvcm0gfCBhLWZvcm3nmoTlsZ7mgKdcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOafpeivouWtl+autemFjee9rlxuICAgICAqL1xuICAgIGNvbHVtbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uLOWPr+S7peagueaNrm9yZGVy5o6S5bqPXG4gICAgICogYHtzZWFyY2g6ey4uLkZzQnV0dG9ufSxyZXNldDp7Li4uRnNCdXR0b259fWBcbiAgICAgKi9cbiAgICBidXR0b25zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOeCueWHu+mHjee9ruWQjuaYr+WQpueri+WNs+inpuWPkeafpeivolxuICAgICAqL1xuICAgIHNlYXJjaEFmdGVyUmVzZXQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKblvIDlkK/oh6rliqjmn6Xor6JcbiAgICAgKi9cbiAgICBhdXRvU2VhcmNoOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6Ieq5Yqo5p+l6K+i77yM6Ziy5oqW6K6+572uXG4gICAgICog5LygZmFsc2XliJnlhbPpl63oh6rliqjmn6Xor6JcbiAgICAgKi9cbiAgICBkZWJvdW5jZToge1xuICAgICAgdHlwZTogW0Jvb2xlYW4sIE9iamVjdF0sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaPkuanvVxuICAgICAqL1xuICAgIHNsb3RzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKbmmL7npLrmn6Xor6LmoYZcbiAgICAgKi9cbiAgICBzaG93OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5piv5ZCm5ZCv55So5qCh6aqMXG4gICAgICovXG4gICAgdmFsaWRhdGU6IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOaYr+WQpuS7u+aEj+WAvOWPmOWMluWwseinpuWPkeagoemqjFxuICAgICAqL1xuICAgIHZhbGlkYXRlT25DaGFuZ2U6IHtcbiAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICB0eXBlOiBCb29sZWFuXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliJfnmoTlrr3luqborr7nva7vvIxzcGFuPXh4XG4gICAgICovXG4gICAgY29sOiB7fSxcblxuICAgIC8qKlxuICAgICAqIOe7n+S4gOWtl+auteeahGZvcm1JdGVt5bGe5oCnXG4gICAgICovXG4gICAgZm9ybUl0ZW06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcbiAgICAvKipcbiAgICAgKiDmn6Xor6Lkuovku7ZcbiAgICAgKiovXG4gICAgXCJzZWFyY2hcIixcbiAgICAvKipcbiAgICAgKiDmn6Xor6Lkuovku7bvvIzmraTkuovku7bkvpvns7vnu5/osIPnlKhcbiAgICAgKi9cbiAgICBcIl9zZWFyY2hcIixcbiAgICAvKipcbiAgICAgKiDph43nva7kuovku7bvvIzkvpvnlKjmiLfkvb/nlKhcbiAgICAgKiovXG4gICAgXCJyZXNldFwiLFxuICAgIC8qKlxuICAgICAqIOmHjee9ruS6i+S7tu+8jOatpOS6i+S7tuS+m+ezu+e7n+iwg+eUqFxuICAgICAqL1xuICAgIFwiX3Jlc2V0XCIsXG4gICAgLyoqXG4gICAgICog5qCh6aqM5aSx6LSl5LqL5Lu2XG4gICAgICovXG4gICAgXCJ2YWxpZGF0ZS1lcnJvclwiLFxuICAgIC8qKlxuICAgICAqIOagoemqjOWQjueahOihqOWNleaVsOaNruWPmOWMllxuICAgICAqL1xuICAgIFwidXBkYXRlOnZhbGlkYXRlZEZvcm1cIlxuICBdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHg6IGFueSkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgICBjb25zdCBkb01lcmdlID0gbWVyZ2U7XG4gICAgY29uc3QgeyBkb0NvbXB1dGVkLCBBc3luY0NvbXB1dGVWYWx1ZSwgQ29tcHV0ZVZhbHVlIH0gPSB1c2VDb21wdXRlKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxuICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLnZhbHVlICE9IG51bGwgJiYgKGl0ZW0udmFsdWUgaW5zdGFuY2VvZiBBc3luY0NvbXB1dGVWYWx1ZSB8fCBpdGVtLnZhbHVlIGluc3RhbmNlb2YgQ29tcHV0ZVZhbHVlKSkge1xuICAgICAgICBsb2dnZXIud2FybihcInNlYXJjaC52YWx1ZemFjee9ruS4jeaUr+aMgUNvbXB1dGVWYWx1ZS9Bc3luY0NvbXB1dGXnsbvlnovnmoTliqjmgIHorqHnrpdcIik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbml0aWFsRm9ybSgpOiBhbnkge1xuICAgICAgLy/pu5jorqTlgLxcbiAgICAgIGNvbnN0IGZvcm06IGFueSA9IHt9O1xuXG4gICAgICBmb3JFYWNoKHByb3BzLmNvbHVtbnMsIChjb2x1bW4sIGtleSkgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVmVmFsdWUgPSB1bnJlZihjb2x1bW4udmFsdWUpO1xuICAgICAgICBpZiAoZGVmVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uc2hvdyAhPT0gZmFsc2UgJiYgY29sdW1uLmNvbXBvbmVudD8uc2hvdyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAvL+m7mOiupOWAvFxuICAgICAgICAgIGZvcm1ba2V5XSA9IGRlZlZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNsb25lRGVlcChtZXJnZSh7fSwgcHJvcHMuaW5pdGlhbEZvcm0sIGZvcm0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtRGF0YSA9IHJlYWN0aXZlKGNyZWF0ZUluaXRpYWxGb3JtKCkpO1xuXG4gICAgbGV0IGF1dG9TZWFyY2g6IGFueSA9IG51bGw7XG5cbiAgICBjb25zdCBjb21wdXRlZENvbHVtbnM6IFJlZjxUeXBlTWFwPFNlYXJjaEl0ZW1Qcm9wcz4+ID0gZG9Db21wdXRlZChcbiAgICAgICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHByb3BzLmNvbHVtbnM7XG4gICAgICB9LFxuICAgICAgZ2V0Q29udGV4dEZuLFxuICAgICAgbnVsbCxcbiAgICAgIChjb2x1bW5zOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSBjbG9uZURlZXAocHJvcHMuZm9ybUl0ZW0gfHwge30pO1xuICAgICAgICBmb3JFYWNoKGNvbHVtbnMsIChpdGVtKSA9PiB7XG4gICAgICAgICAgbWVyZ2UoaXRlbSwgZm9ybUl0ZW0sIGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gY29sdW1ucyA9IG1lcmdlKGZvcm1JdGVtLCBjb2x1bW5zKTtcbiAgICAgICAgaWYgKCFwcm9wcy52YWxpZGF0ZSkge1xuICAgICAgICAgIC8v5aaC5p6c5YWz6ZetdmFsaWRhdGXliJnljrvmjolydWxlc1xuICAgICAgICAgIGZvckVhY2goY29sdW1ucywgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtLnJ1bGVzO1xuICAgICAgICAgICAgZGVsZXRlIGl0ZW0ucnVsZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyDlkIjlubZjb2xcbiAgICAgICAgaWYgKHByb3BzLmNvbCkge1xuICAgICAgICAgIGZvckVhY2goY29sdW1ucywgKHYpID0+IHtcbiAgICAgICAgICAgIHYuY29sID0gbWVyZ2Uoe30sIHByb3BzLmNvbCwgdi5jb2wpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jZWxsUmVuZGVyXG4gICAgICAgIGZvckVhY2goY29sdW1ucywgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpdGVtLl9jZWxsUmVuZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNlbGxSZW5kZXIoaXRlbSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy/lrZfmrrXmjpLluo9cbiAgICAgICAgbGV0IHNvcnRBcnI6IFNlYXJjaEl0ZW1Qcm9wc1tdID0gW107XG4gICAgICAgIGZvckVhY2goY29sdW1ucywgKHYsIGtleSkgPT4ge1xuICAgICAgICAgIHYuX2tleSA9IGtleTtcbiAgICAgICAgICBzb3J0QXJyLnB1c2godik7XG4gICAgICAgIH0pO1xuICAgICAgICBzb3J0QXJyID0gc29ydEJ5KHNvcnRBcnIsIChpdGVtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc29ydGVkQ29sdW1uczoge1xuICAgICAgICAgIFtrZXk6IHN0cmluZ106IFNlYXJjaEl0ZW1Qcm9wcztcbiAgICAgICAgfSA9IHt9O1xuXG4gICAgICAgIHNvcnRBcnIuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGxldCBfa2V5ID0gaXRlbS5fa2V5O1xuICAgICAgICAgIGRlbGV0ZSBpdGVtLl9rZXk7XG4gICAgICAgICAgc29ydGVkQ29sdW1uc1tfa2V5XSA9IGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc29ydGVkQ29sdW1ucztcbiAgICAgIH1cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gb25Gb3JtVmFsaWRhdGVkKCkge1xuICAgICAgY29uc3QgdmFsaWRhdGVkRm9ybSA9IGNsb25lRGVlcChmb3JtRGF0YSk7XG4gICAgICBjdHguZW1pdChcInVwZGF0ZTp2YWxpZGF0ZWRGb3JtXCIsIHZhbGlkYXRlZEZvcm0pO1xuICAgIH1cblxuICAgIHdhdGNoKFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvcHMudmFsaWRhdGVkRm9ybTtcbiAgICAgIH0sXG4gICAgICAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtRGF0YSkge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtRGF0YVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIG1lcmdlKGZvcm1EYXRhLCB2YWx1ZSB8fCB7fSk7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkZWVwOiB0cnVlXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IGdldCA9IChmb3JtOiBhbnksIGtleTogYW55KSA9PiB7XG4gICAgICByZXR1cm4gTG9kYXNoR2V0KGZvcm0sIGtleSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHNwbGl0S2V5KGtleTogc3RyaW5nKSB7XG4gICAgICBpZiAoa2V5ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGtleS5pbmRleE9mKFwiLlwiKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBrZXkuc3BsaXQoXCIuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICAvLyBjb25zdCBkZWJvdW5jZVZhbGlkYXRlID0gZGVib3VuY2UoYXN5bmMgKCkgPT4ge1xuICAgIC8vICAgaWYgKGF3YWl0IGRvVmFsaWRhdGUoKSkge1xuICAgIC8vICAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9LCA1MDApO1xuXG4gICAgZnVuY3Rpb24gY2VsbFJlbmRlcihpdGVtOiBhbnkpIHtcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBfb25VcGRhdGVNb2RlbFZhbHVlKCRldmVudDogYW55KSB7XG4gICAgICAgIC8vIGF3YWl0IGRlYm91bmNlVmFsaWRhdGUoKTtcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQoJGV2ZW50LCBpdGVtKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX29uSW5wdXQoKSB7XG4gICAgICAgIG9uSW5wdXQoaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uS2V5dXAoaXRlbTogYW55LCBrZXk6IGFueSkge1xuICAgICAgICBpZiAoa2V5LmNvZGUgPT09IFwiRW50ZXJcIikge1xuICAgICAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSBcImVudGVyXCIpIHtcbiAgICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBkZWZhdWx0U2xvdDogYW55ID0gbnVsbDtcbiAgICAgIGlmIChwcm9wcy5zbG90c1tcInNlYXJjaF9cIiArIGtleV0pIHtcbiAgICAgICAgZGVmYXVsdFNsb3QgPSA8ZnMtc2xvdC1yZW5kZXIgc2xvdHM9e3Byb3BzLnNsb3RzW1wic2VhcmNoX1wiICsga2V5XX0gc2NvcGU9e2J1aWxkRmllbGRDb250ZXh0KGtleSl9IC8+O1xuICAgICAgfSBlbHNlIGlmIChpdGVtLnJlbmRlcikge1xuICAgICAgICBkZWZhdWx0U2xvdCA9IDxmcy1yZW5kZXIgcmVuZGVyLWZ1bmM9e2l0ZW0ucmVuZGVyfSBzY29wZT17YnVpbGRGaWVsZENvbnRleHQoa2V5KX0gLz47XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcG9uZW50ICYmIGl0ZW0uY29tcG9uZW50LnNob3cgIT09IGZhbHNlKSB7XG4gICAgICAgIGRlZmF1bHRTbG90ID0gKFxuICAgICAgICAgIDxmcy1jb21wb25lbnQtcmVuZGVyXG4gICAgICAgICAgICByZWY9eyh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFJlbmRlclJlZnMudmFsdWVba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIG1vZGVsLXZhbHVlPXtnZXQoZm9ybURhdGEsIGtleSl9XG4gICAgICAgICAgICBvbktleXVwPXsoJGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgb25LZXl1cChpdGVtLCAkZXZlbnQpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHsuLi5pdGVtLmNvbXBvbmVudH1cbiAgICAgICAgICAgIHNjb3BlPXtidWlsZEZpZWxkQ29udGV4dChrZXkpfVxuICAgICAgICAgICAgb25VcGRhdGU6bW9kZWxWYWx1ZT17X29uVXBkYXRlTW9kZWxWYWx1ZX1cbiAgICAgICAgICAgIG9uSW5wdXQ9e19vbklucHV0fVxuICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwbGl0ZWRLZXkgPSBzcGxpdEtleShrZXkpO1xuXG4gICAgICByZXR1cm4gdWkuZm9ybUl0ZW0ucmVuZGVyKHtcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIGxhYmVsOiBpdGVtLnRpdGxlLFxuICAgICAgICAgIFt1aS5mb3JtSXRlbS5wcm9wXTogc3BsaXRlZEtleSxcbiAgICAgICAgICBwYXRoOiBrZXksXG4gICAgICAgICAgcnVsZVBhdGg6IGtleVxuICAgICAgICB9LFxuICAgICAgICBzbG90czoge1xuICAgICAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFNsb3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hGb3JtUmVmID0gcmVmKCk7XG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG4gICAgY29uc3QgY29tcG9uZW50UmVuZGVyUmVmczogUmVmID0gcmVmKHt9KTtcblxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudFJlbmRlclJlZihrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZnMudmFsdWVba2V5XTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudFJlbmRlclJlZihrZXkpPy5nZXRUYXJnZXRSZWYoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb250ZXh0Rm4oKTogU2VhcmNoRXZlbnRDb250ZXh0IHtcbiAgICAgIHJldHVybiB7IGZvcm06IGZvcm1EYXRhLCB2YWxpZGF0ZWRGb3JtOiBwcm9wcy52YWxpZGF0ZWRGb3JtLCBnZXRDb21wb25lbnRSZWYsIGRvU2VhcmNoLCBkb1Jlc2V0LCBkb1ZhbGlkYXRlIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnVpbGRGaWVsZENvbnRleHQoa2V5OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiB7IC4uLmdldENvbnRleHRGbigpLCBrZXksIHZhbHVlOiBnZXQoZm9ybURhdGEsIGtleSkgfTtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBkb1ZhbGlkYXRlKHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLCB0cmlnZ2VyOiBzdHJpbmcgPSBcInNlYXJjaFwiKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocHJvcHMudmFsaWRhdGUpIHtcbiAgICAgICAgICBhd2FpdCB1aS5mb3JtLnZhbGlkYXRlV3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgIGN0eC5lbWl0KFwidmFsaWRhdGUtZXJyb3JcIiwgeyAuLi5nZXRDb250ZXh0Rm4oKSwgZXJyb3I6IGUsIHRyaWdnZXIgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG9TZWFyY2goKSB7XG4gICAgICBpZiAoYXV0b1NlYXJjaCkge1xuICAgICAgICAvLyDpmLLmipbmn6Xor6Llj5bmtohcbiAgICAgICAgYXV0b1NlYXJjaC5jYW5jZWwoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGRvVmFsaWRhdGUoKSkge1xuICAgICAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAgICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICAgICAgY3R4LmVtaXQoXCJfc2VhcmNoXCIsIGdldENvbnRleHRGbigpKTtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWFyY2hcIiwgZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvUmVzZXQoKSB7XG4gICAgICAvLyB1aS5mb3JtLnJlc2V0V3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlLCB7IGZvcm0sIGluaXRpYWxGb3JtOiBjcmVhdGVJbml0aWFsRm9ybSgpIH0pO1xuICAgICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xuICAgICAgY29uc3QgZW50cmllc1JldCA9IGVudHJpZXMoZm9ybURhdGEpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzUmV0KSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IGdldChpbml0aWFsRm9ybSwgZW50cnlbMF0pO1xuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICB1bnNldChmb3JtRGF0YSwgZW50cnlbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldChmb3JtRGF0YSwgZW50cnlbMF0sIGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGRvVmFsaWRhdGUoKSkge1xuICAgICAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAgICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICAgICAgaWYgKHByb3BzLnJlc2V0KSB7XG4gICAgICAgICAgcHJvcHMucmVzZXQoZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIOihqOWNlemHjee9ruS6i+S7tlxuICAgICAgICBjdHguZW1pdChcIl9yZXNldFwiLCBnZXRDb250ZXh0Rm4oKSk7XG4gICAgICAgIGN0eC5lbWl0KFwicmVzZXRcIiwgZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgICBpZiAocHJvcHMuc2VhcmNoQWZ0ZXJSZXNldCkge1xuICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZEJ1dHRvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBidG5zOiBhbnkgPSBbXTtcbiAgICAgIGNvbnN0IGRlZkJ0bk9wdGlvbnM6IEJ1dHRvbnNQcm9wczxTZWFyY2hFdmVudENvbnRleHQ+ID0ge1xuICAgICAgICBzZWFyY2g6IHtcbiAgICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgY2xpY2s6IChjb250ZXh0OiBTZWFyY2hFdmVudENvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmRlcjogMSxcbiAgICAgICAgICB0ZXh0OiB0KFwiZnMuc2VhcmNoLnNlYXJjaC50ZXh0XCIpIC8vICfmn6Xor6InLFxuICAgICAgICB9LFxuICAgICAgICByZXNldDoge1xuICAgICAgICAgIHNob3c6IHRydWUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICBjbGljazogKGNvbnRleHQ6IFNlYXJjaEV2ZW50Q29udGV4dCkgPT4ge1xuICAgICAgICAgICAgZG9SZXNldCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGV4dDogdChcImZzLnNlYXJjaC5yZXNldC50ZXh0XCIpLCAvLyAn6YeN572uJyxcbiAgICAgICAgICBvcmRlcjogMlxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbWVyZ2UoZGVmQnRuT3B0aW9ucywgcHJvcHMuYnV0dG9ucyk7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGVmQnRuT3B0aW9ucykge1xuICAgICAgICBjb25zdCBidG4gPSBkZWZCdG5PcHRpb25zW2tleV07XG4gICAgICAgIGJ0bi5fY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgYnRuLmNsaWNrKGdldENvbnRleHRGbigpKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnRucy5wdXNoKGJ0bik7XG4gICAgICB9XG5cbiAgICAgIGJ0bnMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYnRucztcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGluaXRBdXRvU2VhcmNoKCkge1xuICAgICAgaWYgKHByb3BzLmF1dG9TZWFyY2ggPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIOaehOW7uumYsuaKluafpeivouWHveaVsFxuICAgICAgaWYgKHByb3BzLmRlYm91bmNlICE9PSBmYWxzZSkge1xuICAgICAgICBsZXQgd2FpdCA9IHByb3BzLmRlYm91bmNlPy53YWl0IHx8IDUwMDtcbiAgICAgICAgYXV0b1NlYXJjaCA9IGRlYm91bmNlKGRvU2VhcmNoLCB3YWl0LCBwcm9wcy5kZWJvdW5jZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5pdEF1dG9TZWFyY2goKTtcblxuICAgIGZ1bmN0aW9uIGdldEZvcm0oKSB7XG4gICAgICByZXR1cm4gZm9ybURhdGE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VmFsaWRhdGVkRm9ybSgpIHtcbiAgICAgIHJldHVybiBwcm9wcy52YWxpZGF0ZWRGb3JtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuvue9rmZvcm3lgLxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRGb3JtKG5ld0Zvcm06IGFueSwgbWVyZ2UgPSB0cnVlKSB7XG4gICAgICBpZiAoIW1lcmdlKSB7XG4gICAgICAgIGVhY2goa2V5cyhmb3JtRGF0YSksIChpdGVtKSA9PiB7XG4gICAgICAgICAgZGVsZXRlIGZvcm1EYXRhW2l0ZW1dO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRvTWVyZ2UoZm9ybURhdGEsIG5ld0Zvcm0pO1xuICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXRFdmVudERpc2FibGVkID0gcmVmKGZhbHNlKTtcblxuICAgIGNvbnN0IGRvQXV0b1NlYXJjaCA9ICgpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImRvIGF1dG8gc2VhcmNoLGlucHV0RXZlbnREaXNhYmxlZDpcIiwgaW5wdXRFdmVudERpc2FibGVkLnZhbHVlKTtcbiAgICAgIGlmIChpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUgIT09IHRydWUgJiYgYXV0b1NlYXJjaCkge1xuICAgICAgICAvLyDpmLLmipbmn6Xor6JcbiAgICAgICAgYXV0b1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbklucHV0ID0gKGl0ZW06IGFueSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IFwiaW5wdXRcIikge1xuICAgICAgICBkb0F1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIOi+k+WFpeazleebkeWQrFxuICAgIGNvbnN0IGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCA9IChkaXNhYmxlZDogYm9vbGVhbikgPT4ge1xuICAgICAgaW5wdXRFdmVudERpc2FibGVkLnZhbHVlID0gZGlzYWJsZWQ7XG4gICAgICBkb0F1dG9TZWFyY2goKTtcbiAgICB9O1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gb25WYWx1ZUNoYW5nZWQodmFsdWU6IGFueSwgaXRlbTogU2VhcmNoSXRlbVByb3BzKSB7XG4gICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcbiAgICAgIHNldChmb3JtRGF0YSwga2V5LCB2YWx1ZSk7XG5cbiAgICAgIGNvbnN0IHNpbGVudCA9IHByb3BzLnZhbGlkYXRlT25DaGFuZ2VTaWxlbnQ7XG4gICAgICAvLyBpZiAocHJvcHMudmFsaWRhdGVPbkNoYW5nZSAmJiAoYXdhaXQgZG9WYWxpZGF0ZShzaWxlbnQsIFwiY2hhbmdlXCIpKSkge1xuICAgICAgLy8gICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAgIC8vIH1cblxuICAgICAgaWYgKGl0ZW0udmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybURhdGFba2V5XTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gZ2V0Q29tcG9uZW50UmVmKGtleSk7XG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlOiBWYWx1ZUNoYW5nZUhhbmRsZSA9XG4gICAgICAgICAgaXRlbS52YWx1ZUNoYW5nZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gaXRlbS52YWx1ZUNoYW5nZSA6IGl0ZW0udmFsdWVDaGFuZ2UuaGFuZGxlO1xuICAgICAgICBjb25zdCBzY29wZSA9IGdldENvbnRleHRGbigpO1xuICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZUNvbnRleHQ6IFZhbHVlQ2hhbmdlQ29udGV4dCA9IHtcbiAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICByb3c6IHNjb3BlLmZvcm0sXG4gICAgICAgICAgZm9ybTogc2NvcGUuZm9ybSxcbiAgICAgICAgICAuLi5zY29wZSxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgY29tcG9uZW50UmVmLFxuICAgICAgICAgIGltbWVkaWF0ZTogZmFsc2UsXG4gICAgICAgICAgZ2V0Q29tcG9uZW50UmVmLFxuICAgICAgICAgIG1vZGU6IFwic2VhcmNoXCJcbiAgICAgICAgfTtcbiAgICAgICAgdmFsdWVDaGFuZ2UodmFsdWVDaGFuZ2VDb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE8g55Sx5LqOdmFsaWRhdGVkRm9ybSDlj5HlsITlh7rljrvlkI7vvIzkvJrmm7TmlrBmb3JtRGF0YeeahOaVsOaNru+8jOaJgOS7peimgeaUvuWcqHZhbHVlQ2hhbmdl5ZCO6Z2iLOS4jeeEtuS8muatu+W+queOr1xuICAgICAgaWYgKHByb3BzLnZhbGlkYXRlT25DaGFuZ2UgJiYgKGF3YWl0IGRvVmFsaWRhdGUoc2lsZW50LCBcImNoYW5nZVwiKSkpIHtcbiAgICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PSBudWxsIHx8IGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IHRydWUgfHwgaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJjaGFuZ2VcIikge1xuICAgICAgICBkb0F1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZFJ1bGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKCFwcm9wcy52YWxpZGF0ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMub3B0aW9ucy5ydWxlcztcbiAgICB9KTtcblxuICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xuICAgIHJldHVybiB7XG4gICAgICBnZXQsXG4gICAgICB1aSxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkLFxuICAgICAgZG9WYWxpZGF0ZSxcbiAgICAgIGRvU2VhcmNoLFxuICAgICAgZG9SZXNldCxcbiAgICAgIGZvcm1EYXRhLFxuICAgICAgY29tcG9uZW50UmVuZGVyUmVmcyxcbiAgICAgIGdldENvbXBvbmVudFJlbmRlclJlZixcbiAgICAgIGdldENvbXBvbmVudFJlZixcbiAgICAgIGdldEZvcm0sXG4gICAgICBnZXRWYWxpZGF0ZWRGb3JtLFxuICAgICAgc2V0Rm9ybSxcbiAgICAgIHNlYXJjaEZvcm1SZWYsXG4gICAgICBvbklucHV0LFxuICAgICAgaW5wdXRFdmVudERpc2FibGVkLFxuICAgICAgY2hhbmdlSW5wdXRFdmVudERpc2FibGVkLFxuICAgICAgY29tcHV0ZWRDb2x1bW5zLFxuICAgICAgY29tcHV0ZWRCdXR0b25zLFxuICAgICAgY29tcHV0ZWRSdWxlcyxcbiAgICAgIGJ1aWxkRmllbGRDb250ZXh0LFxuICAgICAgZ2V0Q29udGV4dEZuXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXNlYXJjaCB7XG4gICYuZnMtc2VhcmNoLXYyIHtcbiAgICAvL2Rpc3BsYXk6IGZsZXg7XG4gICAgLy9mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAuZnMtc2VhcmNoLWJ1dHRvbnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICB9XG4gICAgLnNlYXJjaC1sZWZ0IHtcbiAgICB9XG5cbiAgICAuc2VhcmNoLXJpZ2h0IHtcbiAgICAgIGZsZXg6IDE7XG4gICAgfVxuXG4gICAgLmFudC1mb3JtLWlubGluZSB7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgfVxuXG4gICAgLmZzLXNlYXJjaC1mb3JtIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuXG4gICAgICAuYW50LXBpY2tlcixcbiAgICAgIC5hbnQtc2VsZWN0LFxuICAgICAgLm4tZGF0ZS1waWNrZXIsXG4gICAgICAuZWwtc2VsZWN0LFxuICAgICAgLmVsLWRhdGUtZWRpdG9yIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG5cbiAgICAgIC5lbC1yYW5nZS1lZGl0b3IuZWwtaW5wdXRfX3dyYXBwZXIge1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuXG4gICAgICAuYW50LWJ0bi1sb2FkaW5nLWljb24ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBtYXJnaW4tbGVmdDogMnB4O1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgICAgIH1cblxuICAgICAgJi5lbC1mb3JtLS1sYWJlbC10b3Age1xuICAgICAgICAuZWwtZm9ybS1pdGVtIHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuZWwtZm9ybS1pdGVtIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgICYuZWwtZm9ybS0taW5saW5lIHtcbiAgICAgICAgLmVsLWlucHV0IHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuZWwtZm9ybS1pdGVtX19jb250ZW50IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZnMtc2VhcmNoLWNvbCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAvLyBhbnRkdlxuICAgICAgLmFudC1mb3JtLWl0ZW0tZXhwbGFpbixcbiAgICAgIC5lbC1mb3JtLWl0ZW1fX2Vycm9yIHtcbiAgICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgYm90dG9tOiAzcHg7XG4gICAgICAgIHJpZ2h0OiA4cHg7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB0b3A6IGF1dG87XG4gICAgICAgIGxlZnQ6IGF1dG87XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgIH1cblxuICAgICAgLmVsLWZvcm0taXRlbV9fZXJyb3Ige1xuICAgICAgICBib3R0b206IDEwcHg7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICAuYW50LWZvcm0taXRlbS1leHBsYWluLFxuICAgICAgICAuZWwtZm9ybS1pdGVtX19lcnJvciB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5uLWZvcm0taXRlbS1ibGFuayB7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gIC5mcy1zZWFyY2gge1xuICAgIC5mcy1zZWFyY2gtZm9ybSB7XG4gICAgICAuZnMtc2VhcmNoLWNvbCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICAgIGZsZXg6IDEwMCU7XG4gICAgICAgIC8vYW50ZHZcbiAgICAgICAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xuICAgICAgICAgIHdpZHRoOiAxMjBweDtcbiAgICAgICAgICBmbGV4OiBub25lO1xuICAgICAgICB9XG4gICAgICAgIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2ggZnMtc2VhcmNoLXYyXCI+XG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jb2xsYXBzZVRyYW5zaXRpb24ubmFtZVwiPlxuICAgICAgPGNvbXBvbmVudFxuICAgICAgICA6aXM9XCJ1aS5mb3JtLm5hbWVcIlxuICAgICAgICByZWY9XCJzZWFyY2hGb3JtUmVmXCJcbiAgICAgICAgOm1vZGVsPVwiZm9ybURhdGFcIlxuICAgICAgICBvbnN1Ym1pdD1cImV2ZW50LnByZXZlbnREZWZhdWx0KCk7XCJcbiAgICAgICAgdi1iaW5kPVwib3B0aW9uc1wiXG4gICAgICAgIDpydWxlcz1cImNvbXB1dGVkUnVsZXNcIlxuICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1mb3JtXCJcbiAgICAgICAgQGNvbXBvc2l0aW9uc3RhcnQ9XCJjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQodHJ1ZSlcIlxuICAgICAgICBAY29tcG9zaXRpb25lbmQ9XCJjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQoZmFsc2UpXCJcbiAgICAgID5cbiAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgIDppcz1cImNvbnRhaW5lcj8uaXMgfHwgJ2ZzLXNlYXJjaC1sYXlvdXQtZGVmYXVsdCdcIlxuICAgICAgICAgIHYtaWY9XCJzaG93ICE9PSBmYWxzZVwiXG4gICAgICAgICAgdi1iaW5kPVwiY29udGFpbmVyXCJcbiAgICAgICAgICA6Y29sdW1ucz1cImNvbXB1dGVkQ29sdW1uc1wiXG4gICAgICAgICAgOmdldC1jb250ZXh0LWZuPVwiZ2V0Q29udGV4dEZuXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0ZW1wbGF0ZSAjc2VhcmNoLWJ1dHRvbnM+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjb21wdXRlZEJ1dHRvbnNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8ZnMtYnV0dG9uIHYtaWY9XCJpdGVtLnNob3cgIT09IGZhbHNlXCIgdi1iaW5kPVwiaXRlbVwiIEBjbGljaz1cIml0ZW0uX2NsaWNrKClcIiAvPlxuICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cblxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2xvdHNbJ3NlYXJjaC1sZWZ0J11cIiAjc2VhcmNoLWxlZnQ+XG4gICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1sZWZ0J11cIiA6c2NvcGU9XCJnZXRDb250ZXh0Rm4oKVwiIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cInNsb3RzWydzZWFyY2gtbWlkZGxlJ11cIiAjc2VhcmNoLW1pZGRsZT5cbiAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLW1pZGRsZSddXCIgOnNjb3BlPVwiZ2V0Q29udGV4dEZuKClcIiAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzbG90c1snc2VhcmNoLXJpZ2h0J11cIiAjc2VhcmNoLXJpZ2h0PlxuICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtcmlnaHQnXVwiIDpzY29wZT1cImdldENvbnRleHRGbigpXCIgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvY29tcG9uZW50PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzeFwiPlxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIHJlYWN0aXZlLCByZWYsIFJlZiwgdW5yZWYsIHdhdGNoIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgZm9yRWFjaCwgY2xvbmVEZWVwLCBlYWNoLCBrZXlzLCB1bnNldCwgc2V0LCBzb3J0QnksIGVudHJpZXMsIGRlYm91bmNlLCBnZXQgYXMgTG9kYXNoR2V0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuLi8uLi91dGlscy91dGlsLmxvZ1wiO1xuaW1wb3J0IEZzU2VhcmNoQnV0dG9ucyBmcm9tIFwiLi9idXR0b25zLnZ1ZVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBCdXR0b25zUHJvcHMsXG4gIFNlYXJjaEV2ZW50Q29udGV4dCxcbiAgU2VhcmNoSXRlbVByb3BzLFxuICBUeXBlTWFwLFxuICBWYWx1ZUNoYW5nZUNvbnRleHQsXG4gIFZhbHVlQ2hhbmdlSGFuZGxlXG59IGZyb20gXCIuLi8uLi9kXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLXVpXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLW1lcmdlXCI7XG5cbi8qKlxuICog5p+l6K+i5qGG57uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNTZWFyY2hcIixcbiAgY29tcG9uZW50czogeyBGc1NlYXJjaEJ1dHRvbnMgfSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDluIPlsYDlrrnlmahcbiAgICAgKi9cbiAgICBjb250YWluZXI6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5Yid5aeL5p+l6K+i5p2h5Lu2XG4gICAgICog54K55Ye76YeN572u77yM5Lya6YeN572u5oiQ6K+l5p2h5Lu2XG4gICAgICovXG4gICAgaW5pdGlhbEZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5qCh6aqM5ZCO55qE5p+l6K+i6KGo5Y2V5pWw5o2uXG4gICAgICovXG4gICAgdmFsaWRhdGVkRm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDooajljZXlj4LmlbBcbiAgICAgKiDmlK/mjIFlbC1mb3JtIHwgYS1mb3Jt55qE5bGe5oCnXG4gICAgICovXG4gICAgb3B0aW9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmn6Xor6LlrZfmrrXphY3nva5cbiAgICAgKi9cbiAgICBjb2x1bW5zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaMiemSrumFjee9rizlj6/ku6XmoLnmja5vcmRlcuaOkuW6j1xuICAgICAqIGB7c2VhcmNoOnsuLi5Gc0J1dHRvbn0scmVzZXQ6ey4uLkZzQnV0dG9ufX1gXG4gICAgICovXG4gICAgYnV0dG9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDngrnlh7vph43nva7lkI7mmK/lkKbnq4vljbPop6blj5Hmn6Xor6JcbiAgICAgKi9cbiAgICBzZWFyY2hBZnRlclJlc2V0OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5piv5ZCm5byA5ZCv6Ieq5Yqo5p+l6K+iXG4gICAgICovXG4gICAgYXV0b1NlYXJjaDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOiHquWKqOafpeivou+8jOmYsuaKluiuvue9rlxuICAgICAqIOS8oGZhbHNl5YiZ5YWz6Zet6Ieq5Yqo5p+l6K+iXG4gICAgICovXG4gICAgZGVib3VuY2U6IHtcbiAgICAgIHR5cGU6IFtCb29sZWFuLCBPYmplY3RdLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmj5Lmp71cbiAgICAgKi9cbiAgICBzbG90czoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5piv5ZCm5pi+56S65p+l6K+i5qGGXG4gICAgICovXG4gICAgc2hvdzoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuWQr+eUqOagoemqjFxuICAgICAqL1xuICAgIHZhbGlkYXRlOiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDmmK/lkKbku7vmhI/lgLzlj5jljJblsLHop6blj5HmoKHpqoxcbiAgICAgKi9cbiAgICB2YWxpZGF0ZU9uQ2hhbmdlOiB7XG4gICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgdHlwZTogQm9vbGVhblxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5YiX55qE5a695bqm6K6+572u77yMc3Bhbj14eFxuICAgICAqL1xuICAgIGNvbDoge30sXG5cbiAgICAvKipcbiAgICAgKiDnu5/kuIDlrZfmrrXnmoRmb3JtSXRlbeWxnuaAp1xuICAgICAqL1xuICAgIGZvcm1JdGVtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXG4gICAgLyoqXG4gICAgICog5p+l6K+i5LqL5Lu2XG4gICAgICoqL1xuICAgIFwic2VhcmNoXCIsXG4gICAgLyoqXG4gICAgICog5p+l6K+i5LqL5Lu277yM5q2k5LqL5Lu25L6b57O757uf6LCD55SoXG4gICAgICovXG4gICAgXCJfc2VhcmNoXCIsXG4gICAgLyoqXG4gICAgICog6YeN572u5LqL5Lu277yM5L6b55So5oi35L2/55SoXG4gICAgICoqL1xuICAgIFwicmVzZXRcIixcbiAgICAvKipcbiAgICAgKiDph43nva7kuovku7bvvIzmraTkuovku7bkvpvns7vnu5/osIPnlKhcbiAgICAgKi9cbiAgICBcIl9yZXNldFwiLFxuICAgIC8qKlxuICAgICAqIOagoemqjOWksei0peS6i+S7tlxuICAgICAqL1xuICAgIFwidmFsaWRhdGUtZXJyb3JcIixcbiAgICAvKipcbiAgICAgKiDmoKHpqozlkI7nmoTooajljZXmlbDmja7lj5jljJZcbiAgICAgKi9cbiAgICBcInVwZGF0ZTp2YWxpZGF0ZWRGb3JtXCJcbiAgXSxcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4OiBhbnkpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgZG9NZXJnZSA9IG1lcmdlO1xuICAgIGNvbnN0IHsgZG9Db21wdXRlZCwgQXN5bmNDb21wdXRlVmFsdWUsIENvbXB1dGVWYWx1ZSB9ID0gdXNlQ29tcHV0ZSgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2V0dXAtcHJvcHMtZGVzdHJ1Y3R1cmVcbiAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS52YWx1ZSAhPSBudWxsICYmIChpdGVtLnZhbHVlIGluc3RhbmNlb2YgQXN5bmNDb21wdXRlVmFsdWUgfHwgaXRlbS52YWx1ZSBpbnN0YW5jZW9mIENvbXB1dGVWYWx1ZSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJzZWFyY2gudmFsdWXphY3nva7kuI3mlK/mjIFDb21wdXRlVmFsdWUvQXN5bmNDb21wdXRl57G75Z6L55qE5Yqo5oCB6K6h566XXCIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW5pdGlhbEZvcm0oKTogYW55IHtcbiAgICAgIC8v6buY6K6k5YC8XG4gICAgICBjb25zdCBmb3JtOiBhbnkgPSB7fTtcblxuICAgICAgZm9yRWFjaChwcm9wcy5jb2x1bW5zLCAoY29sdW1uLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlZlZhbHVlID0gdW5yZWYoY29sdW1uLnZhbHVlKTtcbiAgICAgICAgaWYgKGRlZlZhbHVlICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLnNob3cgIT09IGZhbHNlICYmIGNvbHVtbi5jb21wb25lbnQ/LnNob3cgIT09IGZhbHNlKSB7XG4gICAgICAgICAgLy/pu5jorqTlgLxcbiAgICAgICAgICBmb3JtW2tleV0gPSBkZWZWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjbG9uZURlZXAobWVyZ2Uoe30sIHByb3BzLmluaXRpYWxGb3JtLCBmb3JtKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybURhdGEgPSByZWFjdGl2ZShjcmVhdGVJbml0aWFsRm9ybSgpKTtcblxuICAgIGxldCBhdXRvU2VhcmNoOiBhbnkgPSBudWxsO1xuXG4gICAgY29uc3QgY29tcHV0ZWRDb2x1bW5zOiBSZWY8VHlwZU1hcDxTZWFyY2hJdGVtUHJvcHM+PiA9IGRvQ29tcHV0ZWQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9wcy5jb2x1bW5zO1xuICAgICAgfSxcbiAgICAgIGdldENvbnRleHRGbixcbiAgICAgIG51bGwsXG4gICAgICAoY29sdW1uczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1JdGVtID0gY2xvbmVEZWVwKHByb3BzLmZvcm1JdGVtIHx8IHt9KTtcbiAgICAgICAgZm9yRWFjaChjb2x1bW5zLCAoaXRlbSkgPT4ge1xuICAgICAgICAgIG1lcmdlKGl0ZW0sIGZvcm1JdGVtLCBpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbHVtbnMgPSBtZXJnZShmb3JtSXRlbSwgY29sdW1ucyk7XG4gICAgICAgIGlmICghcHJvcHMudmFsaWRhdGUpIHtcbiAgICAgICAgICAvL+WmguaenOWFs+mXrXZhbGlkYXRl5YiZ5Y675o6JcnVsZXNcbiAgICAgICAgICBmb3JFYWNoKGNvbHVtbnMsIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgaXRlbS5ydWxlcztcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtLnJ1bGU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5ZCI5bm2Y29sXG4gICAgICAgIGlmIChwcm9wcy5jb2wpIHtcbiAgICAgICAgICBmb3JFYWNoKGNvbHVtbnMsICh2KSA9PiB7XG4gICAgICAgICAgICB2LmNvbCA9IG1lcmdlKHt9LCBwcm9wcy5jb2wsIHYuY29sKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2VsbFJlbmRlclxuICAgICAgICBmb3JFYWNoKGNvbHVtbnMsIChpdGVtKSA9PiB7XG4gICAgICAgICAgaXRlbS5fY2VsbFJlbmRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjZWxsUmVuZGVyKGl0ZW0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8v5a2X5q615o6S5bqPXG4gICAgICAgIGxldCBzb3J0QXJyOiBTZWFyY2hJdGVtUHJvcHNbXSA9IFtdO1xuICAgICAgICBmb3JFYWNoKGNvbHVtbnMsICh2LCBrZXkpID0+IHtcbiAgICAgICAgICB2Ll9rZXkgPSBrZXk7XG4gICAgICAgICAgc29ydEFyci5wdXNoKHYpO1xuICAgICAgICB9KTtcbiAgICAgICAgc29ydEFyciA9IHNvcnRCeShzb3J0QXJyLCAoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLm9yZGVyID8/IENvbnN0YW50cy5vcmRlckRlZmF1bHQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNvcnRlZENvbHVtbnM6IHtcbiAgICAgICAgICBba2V5OiBzdHJpbmddOiBTZWFyY2hJdGVtUHJvcHM7XG4gICAgICAgIH0gPSB7fTtcblxuICAgICAgICBzb3J0QXJyLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBsZXQgX2tleSA9IGl0ZW0uX2tleTtcbiAgICAgICAgICBkZWxldGUgaXRlbS5fa2V5O1xuICAgICAgICAgIHNvcnRlZENvbHVtbnNbX2tleV0gPSBpdGVtO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNvcnRlZENvbHVtbnM7XG4gICAgICB9XG4gICAgKTtcblxuICAgIGZ1bmN0aW9uIG9uRm9ybVZhbGlkYXRlZCgpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZEZvcm0gPSBjbG9uZURlZXAoZm9ybURhdGEpO1xuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6dmFsaWRhdGVkRm9ybVwiLCB2YWxpZGF0ZWRGb3JtKTtcbiAgICB9XG5cbiAgICB3YXRjaChcbiAgICAgICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHByb3BzLnZhbGlkYXRlZEZvcm07XG4gICAgICB9LFxuICAgICAgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybURhdGEpIHtcbiAgICAgICAgICBkZWxldGUgZm9ybURhdGFba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBtZXJnZShmb3JtRGF0YSwgdmFsdWUgfHwge30pO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGVlcDogdHJ1ZVxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBnZXQgPSAoZm9ybTogYW55LCBrZXk6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIExvZGFzaEdldChmb3JtLCBrZXkpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBzcGxpdEtleShrZXk6IHN0cmluZykge1xuICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChrZXkuaW5kZXhPZihcIi5cIikgPj0gMCkge1xuICAgICAgICByZXR1cm4ga2V5LnNwbGl0KFwiLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuXG4gICAgLy8gY29uc3QgZGVib3VuY2VWYWxpZGF0ZSA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcbiAgICAvLyAgIGlmIChhd2FpdCBkb1ZhbGlkYXRlKCkpIHtcbiAgICAvLyAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgLy8gICB9XG4gICAgLy8gfSwgNTAwKTtcblxuICAgIGZ1bmN0aW9uIGNlbGxSZW5kZXIoaXRlbTogYW55KSB7XG4gICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcblxuICAgICAgYXN5bmMgZnVuY3Rpb24gX29uVXBkYXRlTW9kZWxWYWx1ZSgkZXZlbnQ6IGFueSkge1xuICAgICAgICAvLyBhd2FpdCBkZWJvdW5jZVZhbGlkYXRlKCk7XG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkKCRldmVudCwgaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF9vbklucHV0KCkge1xuICAgICAgICBvbklucHV0KGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvbktleXVwKGl0ZW06IGFueSwga2V5OiBhbnkpIHtcbiAgICAgICAgaWYgKGtleS5jb2RlID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJlbnRlclwiKSB7XG4gICAgICAgICAgICBkb1NlYXJjaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgZGVmYXVsdFNsb3Q6IGFueSA9IG51bGw7XG4gICAgICBpZiAocHJvcHMuc2xvdHNbXCJzZWFyY2hfXCIgKyBrZXldKSB7XG4gICAgICAgIGRlZmF1bHRTbG90ID0gPGZzLXNsb3QtcmVuZGVyIHNsb3RzPXtwcm9wcy5zbG90c1tcInNlYXJjaF9cIiArIGtleV19IHNjb3BlPXtidWlsZEZpZWxkQ29udGV4dChrZXkpfSAvPjtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5yZW5kZXIpIHtcbiAgICAgICAgZGVmYXVsdFNsb3QgPSA8ZnMtcmVuZGVyIHJlbmRlci1mdW5jPXtpdGVtLnJlbmRlcn0gc2NvcGU9e2J1aWxkRmllbGRDb250ZXh0KGtleSl9IC8+O1xuICAgICAgfSBlbHNlIGlmIChpdGVtLmNvbXBvbmVudCAmJiBpdGVtLmNvbXBvbmVudC5zaG93ICE9PSBmYWxzZSkge1xuICAgICAgICBkZWZhdWx0U2xvdCA9IChcbiAgICAgICAgICA8ZnMtY29tcG9uZW50LXJlbmRlclxuICAgICAgICAgICAgcmVmPXsodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb21wb25lbnRSZW5kZXJSZWZzLnZhbHVlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBtb2RlbC12YWx1ZT17Z2V0KGZvcm1EYXRhLCBrZXkpfVxuICAgICAgICAgICAgb25LZXl1cD17KCRldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIG9uS2V5dXAoaXRlbSwgJGV2ZW50KTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB7Li4uaXRlbS5jb21wb25lbnR9XG4gICAgICAgICAgICBzY29wZT17YnVpbGRGaWVsZENvbnRleHQoa2V5KX1cbiAgICAgICAgICAgIG9uVXBkYXRlOm1vZGVsVmFsdWU9e19vblVwZGF0ZU1vZGVsVmFsdWV9XG4gICAgICAgICAgICBvbklucHV0PXtfb25JbnB1dH1cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGxpdGVkS2V5ID0gc3BsaXRLZXkoa2V5KTtcblxuICAgICAgcmV0dXJuIHVpLmZvcm1JdGVtLnJlbmRlcih7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBsYWJlbDogaXRlbS50aXRsZSxcbiAgICAgICAgICBbdWkuZm9ybUl0ZW0ucHJvcF06IHNwbGl0ZWRLZXksXG4gICAgICAgICAgcGF0aDoga2V5LFxuICAgICAgICAgIHJ1bGVQYXRoOiBrZXlcbiAgICAgICAgfSxcbiAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICBkZWZhdWx0KCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRTbG90O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoRm9ybVJlZiA9IHJlZigpO1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlbmRlclJlZnM6IFJlZiA9IHJlZih7fSk7XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnRSZW5kZXJSZWZzLnZhbHVlW2tleV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5KT8uZ2V0VGFyZ2V0UmVmKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29udGV4dEZuKCk6IFNlYXJjaEV2ZW50Q29udGV4dCB7XG4gICAgICByZXR1cm4geyBmb3JtOiBmb3JtRGF0YSwgdmFsaWRhdGVkRm9ybTogcHJvcHMudmFsaWRhdGVkRm9ybSwgZ2V0Q29tcG9uZW50UmVmLCBkb1NlYXJjaCwgZG9SZXNldCwgZG9WYWxpZGF0ZSB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJ1aWxkRmllbGRDb250ZXh0KGtleTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4geyAuLi5nZXRDb250ZXh0Rm4oKSwga2V5LCB2YWx1ZTogZ2V0KGZvcm1EYXRhLCBrZXkpIH07XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG9WYWxpZGF0ZShzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSwgdHJpZ2dlcjogc3RyaW5nID0gXCJzZWFyY2hcIik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHByb3BzLnZhbGlkYXRlKSB7XG4gICAgICAgICAgYXdhaXQgdWkuZm9ybS52YWxpZGF0ZVdyYXAoc2VhcmNoRm9ybVJlZi52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICBjdHguZW1pdChcInZhbGlkYXRlLWVycm9yXCIsIHsgLi4uZ2V0Q29udGV4dEZuKCksIGVycm9yOiBlLCB0cmlnZ2VyIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvU2VhcmNoKCkge1xuICAgICAgaWYgKGF1dG9TZWFyY2gpIHtcbiAgICAgICAgLy8g6Ziy5oqW5p+l6K+i5Y+W5raIXG4gICAgICAgIGF1dG9TZWFyY2guY2FuY2VsKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBkb1ZhbGlkYXRlKCkpIHtcbiAgICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgICAgIGN0eC5lbWl0KFwiX3NlYXJjaFwiLCBnZXRDb250ZXh0Rm4oKSk7XG4gICAgICAgIGN0eC5lbWl0KFwic2VhcmNoXCIsIGdldENvbnRleHRGbigpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBkb1Jlc2V0KCkge1xuICAgICAgLy8gdWkuZm9ybS5yZXNldFdyYXAoc2VhcmNoRm9ybVJlZi52YWx1ZSwgeyBmb3JtLCBpbml0aWFsRm9ybTogY3JlYXRlSW5pdGlhbEZvcm0oKSB9KTtcbiAgICAgIGNvbnN0IGluaXRpYWxGb3JtID0gY3JlYXRlSW5pdGlhbEZvcm0oKTtcbiAgICAgIGNvbnN0IGVudHJpZXNSZXQgPSBlbnRyaWVzKGZvcm1EYXRhKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllc1JldCkge1xuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBnZXQoaW5pdGlhbEZvcm0sIGVudHJ5WzBdKTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgdW5zZXQoZm9ybURhdGEsIGVudHJ5WzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXQoZm9ybURhdGEsIGVudHJ5WzBdLCBpbml0aWFsVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBkb1ZhbGlkYXRlKCkpIHtcbiAgICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgICAgIGlmIChwcm9wcy5yZXNldCkge1xuICAgICAgICAgIHByb3BzLnJlc2V0KGdldENvbnRleHRGbigpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDooajljZXph43nva7kuovku7ZcbiAgICAgICAgY3R4LmVtaXQoXCJfcmVzZXRcIiwgZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgICBjdHguZW1pdChcInJlc2V0XCIsIGdldENvbnRleHRGbigpKTtcbiAgICAgICAgaWYgKHByb3BzLnNlYXJjaEFmdGVyUmVzZXQpIHtcbiAgICAgICAgICBkb1NlYXJjaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgYnRuczogYW55ID0gW107XG4gICAgICBjb25zdCBkZWZCdG5PcHRpb25zOiBCdXR0b25zUHJvcHM8U2VhcmNoRXZlbnRDb250ZXh0PiA9IHtcbiAgICAgICAgc2VhcmNoOiB7XG4gICAgICAgICAgc2hvdzogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiBcInByaW1hcnlcIixcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgIGNsaWNrOiAoY29udGV4dDogU2VhcmNoRXZlbnRDb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBkb1NlYXJjaCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgdGV4dDogdChcImZzLnNlYXJjaC5zZWFyY2gudGV4dFwiKSAvLyAn5p+l6K+iJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgY2xpY2s6IChjb250ZXh0OiBTZWFyY2hFdmVudENvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGRvUmVzZXQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRleHQ6IHQoXCJmcy5zZWFyY2gucmVzZXQudGV4dFwiKSwgLy8gJ+mHjee9ricsXG4gICAgICAgICAgb3JkZXI6IDJcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG1lcmdlKGRlZkJ0bk9wdGlvbnMsIHByb3BzLmJ1dHRvbnMpO1xuICAgICAgZm9yIChsZXQga2V5IGluIGRlZkJ0bk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYnRuID0gZGVmQnRuT3B0aW9uc1trZXldO1xuICAgICAgICBidG4uX2NsaWNrID0gKCkgPT4ge1xuICAgICAgICAgIGJ0bi5jbGljayhnZXRDb250ZXh0Rm4oKSk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0bnMucHVzaChidG4pO1xuICAgICAgfVxuXG4gICAgICBidG5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJ0bnM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBpbml0QXV0b1NlYXJjaCgpIHtcbiAgICAgIGlmIChwcm9wcy5hdXRvU2VhcmNoID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyDmnoTlu7rpmLLmipbmn6Xor6Llh73mlbBcbiAgICAgIGlmIChwcm9wcy5kZWJvdW5jZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHdhaXQgPSBwcm9wcy5kZWJvdW5jZT8ud2FpdCB8fCA1MDA7XG4gICAgICAgIGF1dG9TZWFyY2ggPSBkZWJvdW5jZShkb1NlYXJjaCwgd2FpdCwgcHJvcHMuZGVib3VuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGluaXRBdXRvU2VhcmNoKCk7XG5cbiAgICBmdW5jdGlvbiBnZXRGb3JtKCkge1xuICAgICAgcmV0dXJuIGZvcm1EYXRhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFZhbGlkYXRlZEZvcm0oKSB7XG4gICAgICByZXR1cm4gcHJvcHMudmFsaWRhdGVkRm9ybTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorr7nva5mb3Jt5YC8XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Rm9ybShuZXdGb3JtOiBhbnksIG1lcmdlID0gdHJ1ZSkge1xuICAgICAgaWYgKCFtZXJnZSkge1xuICAgICAgICBlYWNoKGtleXMoZm9ybURhdGEpLCAoaXRlbSkgPT4ge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtRGF0YVtpdGVtXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBkb01lcmdlKGZvcm1EYXRhLCBuZXdGb3JtKTtcbiAgICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0RXZlbnREaXNhYmxlZCA9IHJlZihmYWxzZSk7XG5cbiAgICBjb25zdCBkb0F1dG9TZWFyY2ggPSAoKSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJkbyBhdXRvIHNlYXJjaCxpbnB1dEV2ZW50RGlzYWJsZWQ6XCIsIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSk7XG4gICAgICBpZiAoaW5wdXRFdmVudERpc2FibGVkLnZhbHVlICE9PSB0cnVlICYmIGF1dG9TZWFyY2gpIHtcbiAgICAgICAgLy8g6Ziy5oqW5p+l6K+iXG4gICAgICAgIGF1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25JbnB1dCA9IChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgZG9BdXRvU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyDovpPlhaXms5Xnm5HlkKxcbiAgICBjb25zdCBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQgPSAoZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSA9IGRpc2FibGVkO1xuICAgICAgZG9BdXRvU2VhcmNoKCk7XG4gICAgfTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIG9uVmFsdWVDaGFuZ2VkKHZhbHVlOiBhbnksIGl0ZW06IFNlYXJjaEl0ZW1Qcm9wcykge1xuICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXk7XG4gICAgICBzZXQoZm9ybURhdGEsIGtleSwgdmFsdWUpO1xuXG4gICAgICBjb25zdCBzaWxlbnQgPSBwcm9wcy52YWxpZGF0ZU9uQ2hhbmdlU2lsZW50O1xuICAgICAgLy8gaWYgKHByb3BzLnZhbGlkYXRlT25DaGFuZ2UgJiYgKGF3YWl0IGRvVmFsaWRhdGUoc2lsZW50LCBcImNoYW5nZVwiKSkpIHtcbiAgICAgIC8vICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgICAvLyB9XG5cbiAgICAgIGlmIChpdGVtLnZhbHVlQ2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1EYXRhW2tleV07XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGdldENvbXBvbmVudFJlZihrZXkpO1xuICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZTogVmFsdWVDaGFuZ2VIYW5kbGUgPVxuICAgICAgICAgIGl0ZW0udmFsdWVDaGFuZ2UgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGl0ZW0udmFsdWVDaGFuZ2UgOiBpdGVtLnZhbHVlQ2hhbmdlLmhhbmRsZTtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBnZXRDb250ZXh0Rm4oKTtcbiAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2VDb250ZXh0OiBWYWx1ZUNoYW5nZUNvbnRleHQgPSB7XG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgcm93OiBzY29wZS5mb3JtLFxuICAgICAgICAgIGZvcm06IHNjb3BlLmZvcm0sXG4gICAgICAgICAgLi4uc2NvcGUsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGNvbXBvbmVudFJlZixcbiAgICAgICAgICBpbW1lZGlhdGU6IGZhbHNlLFxuICAgICAgICAgIGdldENvbXBvbmVudFJlZixcbiAgICAgICAgICBtb2RlOiBcInNlYXJjaFwiXG4gICAgICAgIH07XG4gICAgICAgIHZhbHVlQ2hhbmdlKHZhbHVlQ2hhbmdlQ29udGV4dCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPIOeUseS6jnZhbGlkYXRlZEZvcm0g5Y+R5bCE5Ye65Y675ZCO77yM5Lya5pu05pawZm9ybURhdGHnmoTmlbDmja7vvIzmiYDku6XopoHmlL7lnKh2YWx1ZUNoYW5nZeWQjumdoizkuI3nhLbkvJrmrbvlvqrnjq9cbiAgICAgIGlmIChwcm9wcy52YWxpZGF0ZU9uQ2hhbmdlICYmIChhd2FpdCBkb1ZhbGlkYXRlKHNpbGVudCwgXCJjaGFuZ2VcIikpKSB7XG4gICAgICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT0gbnVsbCB8fCBpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSB0cnVlIHx8IGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IFwiY2hhbmdlXCIpIHtcbiAgICAgICAgZG9BdXRvU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRSdWxlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmICghcHJvcHMudmFsaWRhdGUpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BzLm9wdGlvbnMucnVsZXM7XG4gICAgfSk7XG5cbiAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0LFxuICAgICAgdWksXG4gICAgICBvblZhbHVlQ2hhbmdlZCxcbiAgICAgIGRvVmFsaWRhdGUsXG4gICAgICBkb1NlYXJjaCxcbiAgICAgIGRvUmVzZXQsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGNvbXBvbmVudFJlbmRlclJlZnMsXG4gICAgICBnZXRDb21wb25lbnRSZW5kZXJSZWYsXG4gICAgICBnZXRDb21wb25lbnRSZWYsXG4gICAgICBnZXRGb3JtLFxuICAgICAgZ2V0VmFsaWRhdGVkRm9ybSxcbiAgICAgIHNldEZvcm0sXG4gICAgICBzZWFyY2hGb3JtUmVmLFxuICAgICAgb25JbnB1dCxcbiAgICAgIGlucHV0RXZlbnREaXNhYmxlZCxcbiAgICAgIGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCxcbiAgICAgIGNvbXB1dGVkQ29sdW1ucyxcbiAgICAgIGNvbXB1dGVkQnV0dG9ucyxcbiAgICAgIGNvbXB1dGVkUnVsZXMsXG4gICAgICBidWlsZEZpZWxkQ29udGV4dCxcbiAgICAgIGdldENvbnRleHRGblxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1zZWFyY2gge1xuICAmLmZzLXNlYXJjaC12MiB7XG4gICAgLy9kaXNwbGF5OiBmbGV4O1xuICAgIC8vZmxleC13cmFwOiBub3dyYXA7XG4gICAgLmZzLXNlYXJjaC1idXR0b25zIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgfVxuICAgIC5zZWFyY2gtbGVmdCB7XG4gICAgfVxuXG4gICAgLnNlYXJjaC1yaWdodCB7XG4gICAgICBmbGV4OiAxO1xuICAgIH1cblxuICAgIC5hbnQtZm9ybS1pbmxpbmUge1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgIH1cblxuICAgIC5mcy1zZWFyY2gtZm9ybSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcblxuICAgICAgLmFudC1waWNrZXIsXG4gICAgICAuYW50LXNlbGVjdCxcbiAgICAgIC5uLWRhdGUtcGlja2VyLFxuICAgICAgLmVsLXNlbGVjdCxcbiAgICAgIC5lbC1kYXRlLWVkaXRvciB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuXG4gICAgICAuZWwtcmFuZ2UtZWRpdG9yLmVsLWlucHV0X193cmFwcGVyIHtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgIH1cblxuICAgICAgLmFudC1idG4tbG9hZGluZy1pY29uIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDJweDtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gICAgICB9XG5cbiAgICAgICYuZWwtZm9ybS0tbGFiZWwtdG9wIHtcbiAgICAgICAgLmVsLWZvcm0taXRlbSB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLmVsLWZvcm0taXRlbSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICAgICAgbWFyZ2luLXRvcDogNHB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICAmLmVsLWZvcm0tLWlubGluZSB7XG4gICAgICAgIC5lbC1pbnB1dCB7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLmVsLWZvcm0taXRlbV9fY29udGVudCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmZzLXNlYXJjaC1jb2wge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgLy8gYW50ZHZcbiAgICAgIC5hbnQtZm9ybS1pdGVtLWV4cGxhaW4sXG4gICAgICAuZWwtZm9ybS1pdGVtX19lcnJvciB7XG4gICAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGJvdHRvbTogM3B4O1xuICAgICAgICByaWdodDogOHB4O1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdG9wOiBhdXRvO1xuICAgICAgICBsZWZ0OiBhdXRvO1xuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC5lbC1mb3JtLWl0ZW1fX2Vycm9yIHtcbiAgICAgICAgYm90dG9tOiAxMHB4O1xuICAgICAgfVxuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgLmFudC1mb3JtLWl0ZW0tZXhwbGFpbixcbiAgICAgICAgLmVsLWZvcm0taXRlbV9fZXJyb3Ige1xuICAgICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAubi1mb3JtLWl0ZW0tYmxhbmsge1xuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA1NzVweCkge1xuICAuZnMtc2VhcmNoIHtcbiAgICAuZnMtc2VhcmNoLWZvcm0ge1xuICAgICAgLmZzLXNlYXJjaC1jb2wge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICBmbGV4OiAxMDAlO1xuICAgICAgICAvL2FudGR2XG4gICAgICAgIC5hbnQtZm9ybS1pdGVtLWxhYmVsIHtcbiAgICAgICAgICB3aWR0aDogMTIwcHg7XG4gICAgICAgICAgZmxleDogbm9uZTtcbiAgICAgICAgfVxuICAgICAgICAuYW50LWZvcm0taXRlbS1jb250cm9sIHtcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50IDppcz1cInVpLmNvbGxhcHNlVHJhbnNpdGlvbi5uYW1lXCI+XG4gICAgPGRpdiB2LWlmPVwic2hvdyAhPT0gZmFsc2VcIiBjbGFzcz1cImZzLXNlYXJjaFwiIDpjbGFzcz1cInsgJ2ZzLXNlYXJjaC1tdWx0aS1saW5lJzogY29tcHV0ZWRJc011bHRpTGluZSB9XCI+XG4gICAgICA8Y29tcG9uZW50XG4gICAgICAgIDppcz1cInVpLmZvcm0ubmFtZVwiXG4gICAgICAgIHJlZj1cInNlYXJjaEZvcm1SZWZcIlxuICAgICAgICA6bW9kZWw9XCJmb3JtXCJcbiAgICAgICAgdi1iaW5kPVwib3B0aW9uc1wiXG4gICAgICAgIDpydWxlcz1cImNvbXB1dGVkUnVsZXNcIlxuICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1mb3JtXCJcbiAgICAgICAgQGNvbXBvc2l0aW9uc3RhcnQ9XCJjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQodHJ1ZSlcIlxuICAgICAgICBAY29tcG9zaXRpb25lbmQ9XCJjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQoZmFsc2UpXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1ib3hcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLW1haW5cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmcy1zZWFyY2gtY29sdW1uc1wiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgJ2ZzLXNlYXJjaC1jb2xsYXBzZSc6IGNvbGxhcHNlIH1cIlxuICAgICAgICAgICAgICA6c3R5bGU9XCJ7IGhlaWdodDogY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiByZWY9XCJjb2x1bW5zUm93UmVmXCI+XG4gICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwic2xvdHNbJ3NlYXJjaC1sZWZ0J11cIiBjbGFzcz1cImZzLXNlYXJjaC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1sZWZ0J11cIiA6c2NvcGU9XCJzZWFyY2hFdmVudENvbnRleHRSZWZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGtleSkgaW4gY29tcHV0ZWRDb2x1bW5zXCIgOmtleT1cImtleVwiPlxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJjb21wdXRlZENvbE5hbWVcIiB2LWlmPVwiaXRlbS5zaG93ID09PSB0cnVlXCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sXCIgdi1iaW5kPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCIgdi1iaW5kPVwiaXRlbVwiIDpbdWkuZm9ybUl0ZW0ucHJvcF09XCJrZXlcIiA6bGFiZWw9XCJpdGVtLnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzbG90c1snc2VhcmNoXycgKyBrZXldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaF8nICsga2V5XVwiIDpzY29wZT1cInsgLi4uc2VhcmNoRXZlbnRDb250ZXh0UmVmLCBrZXkgfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGZzLWNvbXBvbmVudC1yZW5kZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdi1pZj1cIml0ZW0uY29tcG9uZW50ICYmIGl0ZW0uY29tcG9uZW50LnNob3cgIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOnJlZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UmVuZGVyUmVmc1tpdGVtLmtleV0gPSBlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDptb2RlbC12YWx1ZT1cImdldChmb3JtLCBrZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdi1iaW5kPVwiaXRlbS5jb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6c2NvcGU9XCJzZWFyY2hFdmVudENvbnRleHRSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwib25WYWx1ZUNoYW5nZWQoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpbnB1dD1cIm9uSW5wdXQoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJzbG90c1snc2VhcmNoLW1pZGRsZSddXCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1taWRkbGVcIj5cbiAgICAgICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1taWRkbGUnXVwiIDpzY29wZT1cInNlYXJjaEV2ZW50Q29udGV4dFJlZlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZnMtc2VhcmNoLWJ1dHRvbnMgdi1pZj1cIiFjb21wdXRlZElzTXVsdGlMaW5lXCIgOmJ1dHRvbnM9XCJjb21wdXRlZEJ1dHRvbnNcIj48L2ZzLXNlYXJjaC1idXR0b25zPlxuICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cInNsb3RzWydzZWFyY2gtcmlnaHQnXVwiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1yaWdodCddXCIgOnNjb3BlPVwic2VhcmNoRXZlbnRDb250ZXh0UmVmXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGZzLXNlYXJjaC1idXR0b25zIHYtaWY9XCJjb21wdXRlZElzTXVsdGlMaW5lXCIgOmJ1dHRvbnM9XCJjb21wdXRlZEJ1dHRvbnNcIj48L2ZzLXNlYXJjaC1idXR0b25zPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiB2LWlmPVwiY29tcHV0ZWRJc011bHRpTGluZVwiIGNsYXNzPVwiZnMtc2VhcmNoLWFjdGlvblwiPlxuICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XG4gICAgICAgICAgICAgIDxmcy1idXR0b24gOmljb249XCJjb2xsYXBzZSA/IHVpLmljb25zLmNhcmV0VXAgOiB1aS5pY29ucy5jYXJldERvd25cIiBAY2xpY2s9XCJ0b2dnbGVDb2xsYXBzZVwiIC8+XG4gICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2NvbXBvbmVudD5cbiAgICA8L2Rpdj5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIG9uTW91bnRlZCwgcmVhY3RpdmUsIHJlZiwgUmVmLCB1bnJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IGVhY2gsIGZvckVhY2gsIHNvcnRCeSwgZW50cmllcywgdW5zZXQsIHNldCwga2V5cywgZ2V0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuLi8uLi91dGlscy91dGlsLmxvZ1wiO1xuaW1wb3J0IEZzU2VhcmNoQnV0dG9ucyBmcm9tIFwiLi9idXR0b25zLnZ1ZVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBCdXR0b25zUHJvcHMsIFNlYXJjaEV2ZW50Q29udGV4dCwgU2VhcmNoSXRlbVByb3BzIH0gZnJvbSBcIi4uLy4uL2RcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtdWlcIjtcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtbWVyZ2VcIjtcblxuLyoqXG4gKiDmn6Xor6LmoYbnu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1NlYXJjaFYxXCIsXG4gIGNvbXBvbmVudHM6IHsgRnNTZWFyY2hCdXR0b25zIH0sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5Yid5aeL5p+l6K+i5p2h5Lu2XG4gICAgICog54K55Ye76YeN572u77yM5Lya6YeN572u5oiQ6K+l5p2h5Lu2XG4gICAgICovXG4gICAgaW5pdGlhbEZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6KGo5Y2V5Y+C5pWwXG4gICAgICog5pSv5oyBZWwtZm9ybSB8IGEtZm9ybeeahOWxnuaAp1xuICAgICAqL1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5p+l6K+i5a2X5q616YWN572uXG4gICAgICovXG4gICAgY29sdW1uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiB0YWJzXG4gICAgICogeyBzaG93ICwgb3B0aW9ucyxrZXksIGRlZmF1bHR9XG4gICAgICovXG4gICAgdGFiczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmjInpkq7phY3nva4s5Y+v5Lul5qC55o2ub3JkZXLmjpLluo9cbiAgICAgKiB7c2VhcmNoOnsuLi5Gc0J1dHRvbn0scmVzZXQ6ey4uLkZzQnV0dG9ufX1cbiAgICAgKi9cbiAgICBidXR0b25zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOeCueWHu+mHjee9ruWQjuaYr+WQpueri+WNs+inpuWPkeafpeivolxuICAgICAqL1xuICAgIHNlYXJjaEFmdGVyUmVzZXQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKblvIDlkK/oh6rliqjmn6Xor6JcbiAgICAgKi9cbiAgICBhdXRvU2VhcmNoOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6Ieq5Yqo5p+l6K+i77yM6Ziy5oqW6K6+572uXG4gICAgICog5LygZmFsc2XliJnlhbPpl63oh6rliqjmn6Xor6JcbiAgICAgKi9cbiAgICBkZWJvdW5jZToge1xuICAgICAgdHlwZTogW0Jvb2xlYW4sIE9iamVjdF0sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaPkuanvVxuICAgICAqL1xuICAgIHNsb3RzOiB7XG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKbmmL7npLrmn6Xor6LmoYZcbiAgICAgKi9cbiAgICBzaG93OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5piv5ZCm5ZCv55So5qCh6aqMXG4gICAgICovXG4gICAgdmFsaWRhdGU6IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDluIPlsYAsIHNpbmdsZS1saW5lIOWNleihjO+8jCBtdWx0aS1saW5lIOWkmuihjO+8iOaUr+aMgeWxleW8gOaUtui1t++8iVxuICAgICAqL1xuICAgIGxheW91dDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogXCJzaW5nbGUtbGluZVwiXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliJfnmoTlrr3luqborr7nva7vvIxzcGFuPXh4XG4gICAgICovXG4gICAgY29sOiB7fSxcblxuICAgIC8qKlxuICAgICAqIOaYr+WQpuaKmOWPoFxuICAgICAqL1xuICAgIGNvbGxhcHNlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXG4gICAgLyoqXG4gICAgICog5p+l6K+i5LqL5Lu2XG4gICAgICoqL1xuICAgIFwic2VhcmNoXCIsXG4gICAgLyoqXG4gICAgICog6YeN572u5LqL5Lu2XG4gICAgICoqL1xuICAgIFwicmVzZXRcIixcbiAgICBcImNvbGxhcHNlXCIsXG4gICAgXCJ1cGRhdGU6Y29sbGFwc2VcIlxuICBdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICAvLyDlvILmraVzZXR1cOmcgOimgeaUvuWcqOesrOS4gOS4qmF3YWl05LmL5YmNXG4gICAgLy8gb25Nb3VudGVkIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLlxuICAgIC8v5Li65ZWl5Lya5pyJ6L+Z5Liq6K2m5ZGKXG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIGlmIChjb21wdXRlZElzTXVsdGlMaW5lLnZhbHVlICYmIGNvbHVtbnNSb3dSZWYudmFsdWUpIHtcbiAgICAgICAgY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA9IGNvbHVtbnNSb3dSZWYudmFsdWUuJGVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgY29uc3QgY29sdW1uc0xpc3QgPSBjb2x1bW5zUm93UmVmLnZhbHVlLiRlbC5jaGlsZHJlbjtcbiAgICAgICAgaWYgKGNvbHVtbnNMaXN0ICYmIGNvbHVtbnNMaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZSA9IGNvbHVtbnNMaXN0WzFdLm9mZnNldEhlaWdodCArIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCBhdXRvU2VhcmNoOiBhbnkgPSBudWxsO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxGb3JtKCkge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICByZXR1cm4gY2xvbmVEZWVwKHByb3BzLmluaXRpYWxGb3JtIHx8IHt9KTtcbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlYWN0aXZlKGNyZWF0ZUluaXRpYWxGb3JtKCkpO1xuICAgIGNvbnN0IHsgZG9Db21wdXRlZCwgQXN5bmNDb21wdXRlVmFsdWUgfSA9IHVzZUNvbXB1dGUoKTtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS52YWx1ZSAhPSBudWxsICYmIGl0ZW0udmFsdWUgaW5zdGFuY2VvZiBBc3luY0NvbXB1dGVWYWx1ZSkge1xuICAgICAgICBsb2dnZXIud2FybihcInNlYXJjaC52YWx1ZemFjee9ruS4jeaUr+aMgUFzeW5jQ29tcHV0Zeexu+Wei+eahOWKqOaAgeiuoeeul1wiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICAgIGNvbnN0IGRvTWVyZ2UgPSBtZXJnZTtcbiAgICBjb25zdCBjb21wdXRlZENvbHVtbnMgPSBkb0NvbXB1dGVkKFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIHByb3BzLmNvbHVtbnM7XG4gICAgICB9LFxuICAgICAgZ2V0Q29udGV4dEZuLFxuICAgICAgbnVsbCxcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgaWYgKCFwcm9wcy52YWxpZGF0ZSkge1xuICAgICAgICAgIC8v5aaC5p6c5YWz6ZetdmFsaWRhdGXliJnljrvmjolydWxlc1xuICAgICAgICAgIGZvckVhY2godmFsdWUsIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgaXRlbS5ydWxlcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyDlkIjlubZjb2xcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIGlmIChwcm9wcy5jb2wpIHtcbiAgICAgICAgICBmb3JFYWNoKHZhbHVlLCAodikgPT4ge1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICB2LmNvbCA9IG1lcmdlKHt9LCBwcm9wcy5jb2wsIHYuY29sKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v5a2X5q615o6S5bqPXG4gICAgICAgIGxldCBzb3J0QXJyOiBTZWFyY2hJdGVtUHJvcHNbXSA9IFtdO1xuICAgICAgICBmb3JFYWNoKHZhbHVlLCAodiwga2V5KSA9PiB7XG4gICAgICAgICAgdi5fa2V5ID0ga2V5O1xuICAgICAgICAgIHNvcnRBcnIucHVzaCh2KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW0pID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5vcmRlciA/PyBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzb3J0ZWRDb2x1bW5zOiB7XG4gICAgICAgICAgW2tleTogc3RyaW5nXTogU2VhcmNoSXRlbVByb3BzO1xuICAgICAgICB9ID0ge307XG5cbiAgICAgICAgc29ydEFyci5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgbGV0IF9rZXkgPSBpdGVtLl9rZXk7XG4gICAgICAgICAgZGVsZXRlIGl0ZW0uX2tleTtcbiAgICAgICAgICBzb3J0ZWRDb2x1bW5zW19rZXldID0gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzb3J0ZWRDb2x1bW5zO1xuICAgICAgfVxuICAgICk7XG5cbiAgICAvL+m7mOiupOWAvFxuICAgIGZvckVhY2goY29tcHV0ZWRDb2x1bW5zLnZhbHVlLCAoY29sdW1uLCBrZXkpID0+IHtcbiAgICAgIGlmIChjb2x1bW4udmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkZWZWYWx1ZSA9IHVucmVmKGNvbHVtbi52YWx1ZSk7XG4gICAgICBpZiAoZGVmVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uc2hvdyAhPT0gZmFsc2UgJiYgY29sdW1uLmNvbXBvbmVudD8uc2hvdyAhPT0gZmFsc2UpIHtcbiAgICAgICAgLy/pu5jorqTlgLxcbiAgICAgICAgZm9ybVtrZXldID0gZGVmVmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc2VhcmNoRm9ybVJlZiA9IHJlZigpO1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlbmRlclJlZnM6IFJlZiA9IHJlZih7fSk7XG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVuZGVyUmVmKGtleTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50UmVuZGVyUmVmcy52YWx1ZVtrZXldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudFJlZihrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50UmVuZGVyUmVmKGtleSk/LiRyZWZzPy50YXJnZXRSZWY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29udGV4dEZuKCk6IFNlYXJjaEV2ZW50Q29udGV4dCB7XG4gICAgICByZXR1cm4geyBmb3JtLCB2YWxpZGF0ZWRGb3JtOiBmb3JtLCBnZXRDb21wb25lbnRSZWYsIGRvVmFsaWRhdGU6IG51bGwgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hFdmVudENvbnRleHRSZWY6IFJlZjxTZWFyY2hFdmVudENvbnRleHQ+ID0gcmVmKGdldENvbnRleHRGbigpKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvU2VhcmNoKCkge1xuICAgICAgaWYgKGF1dG9TZWFyY2gpIHtcbiAgICAgICAgLy8g6Ziy5oqW5p+l6K+i5Y+W5raIXG4gICAgICAgIGF1dG9TZWFyY2guY2FuY2VsKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbGlkID0gYXdhaXQgdWkuZm9ybS52YWxpZGF0ZVdyYXAoc2VhcmNoRm9ybVJlZi52YWx1ZSk7XG4gICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWFyY2hcIiwgc2VhcmNoRXZlbnRDb250ZXh0UmVmLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVpLm1lc3NhZ2UuZXJyb3Ioe1xuICAgICAgICAgIG1lc3NhZ2U6IHQoXCJmcy5zZWFyY2guZXJyb3IubWVzc2FnZVwiKVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRvUmVzZXQoKSB7XG4gICAgICAvLyB1aS5mb3JtLnJlc2V0V3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlLCB7IGZvcm0sIGluaXRpYWxGb3JtOiBjcmVhdGVJbml0aWFsRm9ybSgpIH0pO1xuICAgICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xuICAgICAgY29uc3QgZW50cmllc1JldCA9IGVudHJpZXMoZm9ybSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXNSZXQpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gZ2V0KGluaXRpYWxGb3JtLCBlbnRyeVswXSk7XG4gICAgICAgIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIHVuc2V0KGZvcm0sIGVudHJ5WzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXQoZm9ybSwgZW50cnlbMF0sIGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKHByb3BzLnJlc2V0KSB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBwcm9wcy5yZXNldChzZWFyY2hFdmVudENvbnRleHRSZWYudmFsdWUpO1xuICAgICAgfVxuICAgICAgLy8g6KGo5Y2V6YeN572u5LqL5Lu2XG4gICAgICBjdHguZW1pdChcInJlc2V0XCIsIGdldENvbnRleHRGbigpKTtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKHByb3BzLnNlYXJjaEFmdGVyUmVzZXQpIHtcbiAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb21wdXRlZEJ1dHRvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBidG5zOiBhbnkgPSBbXTtcbiAgICAgIGNvbnN0IGRlZkJ0bk9wdGlvbnM6IEJ1dHRvbnNQcm9wczxTZWFyY2hFdmVudENvbnRleHQ+ID0ge1xuICAgICAgICBzZWFyY2g6IHtcbiAgICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICBjbGljazogKGNvbnRleHQ6IFNlYXJjaEV2ZW50Q29udGV4dCkgPT4ge1xuICAgICAgICAgICAgZG9TZWFyY2goKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9yZGVyOiAxLFxuICAgICAgICAgIHRleHQ6IHQoXCJmcy5zZWFyY2guc2VhcmNoLnRleHRcIikgLy8gJ+afpeivoicsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgc2hvdzogdHJ1ZSxcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgY2xpY2s6IChjb250ZXh0OiBTZWFyY2hFdmVudENvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGRvUmVzZXQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRleHQ6IHQoXCJmcy5zZWFyY2gucmVzZXQudGV4dFwiKSwgLy8gJ+mHjee9ricsXG4gICAgICAgICAgb3JkZXI6IDJcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgbWVyZ2UoZGVmQnRuT3B0aW9ucywgcHJvcHMuYnV0dG9ucyk7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGVmQnRuT3B0aW9ucykge1xuICAgICAgICBjb25zdCBidG4gPSBkZWZCdG5PcHRpb25zW2tleV07XG4gICAgICAgIGJ0bi5fY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgYnRuLmNsaWNrKGdldENvbnRleHRGbigpKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnRucy5wdXNoKGJ0bik7XG4gICAgICB9XG5cbiAgICAgIGJ0bnMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYnRucztcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGluaXRBdXRvU2VhcmNoKCkge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocHJvcHMuYXV0b1NlYXJjaCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8g5p6E5bu66Ziy5oqW5p+l6K+i5Ye95pWwXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmIChwcm9wcy5kZWJvdW5jZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIGxldCB3YWl0ID0gcHJvcHMuZGVib3VuY2U/LndhaXQgfHwgNTAwO1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgYXV0b1NlYXJjaCA9IGRlYm91bmNlKGRvU2VhcmNoLCB3YWl0LCBwcm9wcy5kZWJvdW5jZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5pdEF1dG9TZWFyY2goKTtcblxuICAgIGZ1bmN0aW9uIGdldEZvcm0oKSB7XG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorr7nva5mb3Jt5YC8XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Rm9ybShuZXdGb3JtOiBhbnksIG1lcmdlID0gdHJ1ZSkge1xuICAgICAgaWYgKCFtZXJnZSkge1xuICAgICAgICBlYWNoKGtleXMoZm9ybSksIChpdGVtKSA9PiB7XG4gICAgICAgICAgZGVsZXRlIGZvcm1baXRlbV07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZG9NZXJnZShmb3JtLCBuZXdGb3JtKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dEV2ZW50RGlzYWJsZWQgPSByZWYoZmFsc2UpO1xuXG4gICAgY29uc3QgZG9BdXRvU2VhcmNoID0gKCkgPT4ge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiZG8gYXV0byBzZWFyY2gsaW5wdXRFdmVudERpc2FibGVkOlwiLCBpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUpO1xuICAgICAgaWYgKGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSAhPT0gdHJ1ZSAmJiBhdXRvU2VhcmNoKSB7XG4gICAgICAgIC8vIOmYsuaKluafpeivolxuICAgICAgICBhdXRvU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uSW5wdXQgPSAoaXRlbTogYW55KSA9PiB7XG4gICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgIGRvQXV0b1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgLy8g6L6T5YWl5rOV55uR5ZCsXG4gICAgY29uc3QgY2hhbmdlSW5wdXRFdmVudERpc2FibGVkID0gKGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgICBpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUgPSBkaXNhYmxlZDtcbiAgICAgIGRvQXV0b1NlYXJjaCgpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvblZhbHVlQ2hhbmdlZCh2YWx1ZTogYW55LCBpdGVtOiBTZWFyY2hJdGVtUHJvcHMpIHtcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xuICAgICAgc2V0KGZvcm0sIGtleSwgdmFsdWUpO1xuICAgICAgaWYgKGl0ZW0udmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybVtrZXldO1xuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBnZXRDb21wb25lbnRSZWYoa2V5KTtcbiAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2UgPSBpdGVtLnZhbHVlQ2hhbmdlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBpdGVtLnZhbHVlQ2hhbmdlIDogaXRlbS52YWx1ZUNoYW5nZS5oYW5kbGU7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICB2YWx1ZUNoYW5nZSh7IGtleSwgdmFsdWUsIGNvbXBvbmVudFJlZiwgLi4uZ2V0Q29udGV4dEZuKCksIGltbWlkaWF0ZTogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PSBudWxsIHx8IGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IHRydWUgfHwgaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJjaGFuZ2VcIikge1xuICAgICAgICBkb0F1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZFJ1bGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAoIXByb3BzLnZhbGlkYXRlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHByb3BzLm9wdGlvbnMucnVsZXM7XG4gICAgfSk7XG5cbiAgICAvLy0tLS0t5aSa6KGM5qih5byP5oqY5Y+gXG5cbiAgICBjb25zdCBjb2x1bW5zUm93UmVmID0gcmVmKCk7XG4gICAgY29uc3QgY29sdW1uc0JveEhlaWdodFJlZiA9IHJlZigwKTtcbiAgICBjb25zdCBjb2x1bW5zTGluZUhlaWdodFJlZiA9IHJlZigwKTtcblxuICAgIGNvbnN0IHRvZ2dsZUNvbGxhcHNlID0gKCkgPT4ge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBjdHguZW1pdChcInVwZGF0ZTpjb2xsYXBzZVwiLCAhcHJvcHMuY29sbGFwc2UpO1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBjdHguZW1pdChcImNvbGxhcHNlXCIsICFwcm9wcy5jb2xsYXBzZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbXB1dGVkQ29sTmFtZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKHByb3BzLmxheW91dCA9PT0gXCJtdWx0aS1saW5lXCIpIHtcbiAgICAgICAgcmV0dXJuIHVpLmNvbC5uYW1lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFwiZGl2XCI7XG4gICAgfSk7XG4gICAgY29uc3QgY29tcHV0ZWRJc011bHRpTGluZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHByb3BzLmxheW91dCA9PT0gXCJtdWx0aS1saW5lXCI7XG4gICAgICAvL+S4jeimgei/meS4qu+8jOS8muatu+W+queOr++8jCAmJiBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID4gY29sdW1uc0xpbmVIZWlnaHRSZWYudmFsdWU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZENvbHVtbkJveEhlaWdodCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmICghY29tcHV0ZWRJc011bHRpTGluZS52YWx1ZSkge1xuICAgICAgICByZXR1cm4gXCJhdXRvXCI7XG4gICAgICB9XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmIChwcm9wcy5jb2xsYXBzZSkge1xuICAgICAgICByZXR1cm4gY29sdW1uc0xpbmVIZWlnaHRSZWYudmFsdWUgPyBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZSArIFwicHhcIiA6IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA/IGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgKyBcInB4XCIgOiBcIlwiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdldDogKGZvcm06IGFueSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldChmb3JtLCBrZXkpO1xuICAgICAgfSxcbiAgICAgIHVpLFxuICAgICAgb25WYWx1ZUNoYW5nZWQsXG4gICAgICBkb1NlYXJjaCxcbiAgICAgIGRvUmVzZXQsXG4gICAgICBmb3JtLFxuICAgICAgY29tcG9uZW50UmVuZGVyUmVmcyxcbiAgICAgIGdldENvbXBvbmVudFJlbmRlclJlZixcbiAgICAgIGdldENvbXBvbmVudFJlZixcbiAgICAgIGdldEZvcm0sXG4gICAgICBzZXRGb3JtLFxuICAgICAgc2VhcmNoRm9ybVJlZixcbiAgICAgIG9uSW5wdXQsXG4gICAgICBpbnB1dEV2ZW50RGlzYWJsZWQsXG4gICAgICBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQsXG4gICAgICBjb21wdXRlZENvbHVtbnMsXG4gICAgICBjb21wdXRlZEJ1dHRvbnMsXG4gICAgICBjb21wdXRlZFJ1bGVzLFxuICAgICAgY29sdW1uc1Jvd1JlZixcbiAgICAgIGNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0LFxuICAgICAgY29tcHV0ZWRDb2xOYW1lLFxuICAgICAgY29tcHV0ZWRJc011bHRpTGluZSxcbiAgICAgIHRvZ2dsZUNvbGxhcHNlLFxuICAgICAgc2VhcmNoRXZlbnRDb250ZXh0UmVmXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXNlYXJjaCB7XG4gIC8vZGlzcGxheTogZmxleDtcbiAgLy9mbGV4LXdyYXA6IG5vd3JhcDtcbiAgLnNlYXJjaC1sZWZ0IHtcbiAgfVxuICAuc2VhcmNoLXJpZ2h0IHtcbiAgICBmbGV4OiAxO1xuICB9XG4gIC5hbnQtZm9ybS1pbmxpbmUge1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgfVxuICAuZnMtc2VhcmNoLWZvcm0ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgLy8mID4gKiB7XG4gICAgLy8gIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICAvLyAgbWFyZ2luLXRvcDogNHB4O1xuICAgIC8vICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgLy99XG5cbiAgICAuZnMtc2VhcmNoLWJveCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgLmZzLXNlYXJjaC1tYWluIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICB9XG4gICAgLmZzLXNlYXJjaC1jb2wge1xuICAgICAgJiA+ICoge1xuICAgICAgICBtYXJnaW46IDBweCA1cHg7XG4gICAgICB9XG4gICAgICBtYXJnaW46IDFweCAwO1xuICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIC8vIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5lbC1mb3JtLWl0ZW0ge1xuICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgICAgbWFyZ2luLXRvcDogNHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuXG4gICAgLmVsLWZvcm0tLWlubGluZSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG5cbiAgICAuZWwtZm9ybS1pdGVtX19jb250ZW50IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cbiAgfVxuXG4gIC5mcy1zZWFyY2gtYnRucyB7XG4gICAgLmZzLWJ1dHRvbiB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgICB9XG4gIH1cblxuICAmLmZzLXNlYXJjaC1tdWx0aS1saW5lIHtcbiAgICAuZnMtc2VhcmNoLWJveCB7XG4gICAgICAuZnMtc2VhcmNoLW1haW4ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAuZnMtc2VhcmNoLWNvbHVtbnMge1xuICAgICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgICBvdmVyZmxvdy15OiBoaWRkZW47XG4gICAgICAgICAgLy8gdHJhbnNpdGlvbjogYWxsIDAuM3MgbGluZWFyO1xuICAgICAgICAgIC8vIHdpbGwtY2hhbmdlOiBoZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgLmZzLXNlYXJjaC1idG5zIHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgbWFyZ2luLXRvcDogNHB4O1xuICAgICAgICAgIC5lbC1mb3JtLWl0ZW1fX2NvbnRlbnQge1xuICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLm4tZm9ybS1pdGVtLWJsYW5rIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLmZzLXNlYXJjaC1hY3Rpb24ge1xuICAgICAgLmFudC1mb3JtLWl0ZW0ge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLmZzLXNlYXJjaCB7XG4gIC5uLWZvcm0taXRlbS1ibGFuayB7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnQgOmlzPVwidWkuY29sbGFwc2VUcmFuc2l0aW9uLm5hbWVcIj5cbiAgICA8ZGl2IHYtaWY9XCJzaG93ICE9PSBmYWxzZVwiIGNsYXNzPVwiZnMtc2VhcmNoXCIgOmNsYXNzPVwieyAnZnMtc2VhcmNoLW11bHRpLWxpbmUnOiBjb21wdXRlZElzTXVsdGlMaW5lIH1cIj5cbiAgICAgIDxjb21wb25lbnRcbiAgICAgICAgOmlzPVwidWkuZm9ybS5uYW1lXCJcbiAgICAgICAgcmVmPVwic2VhcmNoRm9ybVJlZlwiXG4gICAgICAgIDptb2RlbD1cImZvcm1cIlxuICAgICAgICB2LWJpbmQ9XCJvcHRpb25zXCJcbiAgICAgICAgOnJ1bGVzPVwiY29tcHV0ZWRSdWxlc1wiXG4gICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLWZvcm1cIlxuICAgICAgICBAY29tcG9zaXRpb25zdGFydD1cImNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCh0cnVlKVwiXG4gICAgICAgIEBjb21wb3NpdGlvbmVuZD1cImNoYW5nZUlucHV0RXZlbnREaXNhYmxlZChmYWxzZSlcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWJveFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtbWFpblwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1jb2x1bW5zXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyAnZnMtc2VhcmNoLWNvbGxhcHNlJzogY29sbGFwc2UgfVwiXG4gICAgICAgICAgICAgIDpzdHlsZT1cInsgaGVpZ2h0OiBjb21wdXRlZENvbHVtbkJveEhlaWdodCB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yb3cubmFtZVwiIHJlZj1cImNvbHVtbnNSb3dSZWZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJzbG90c1snc2VhcmNoLWxlZnQnXVwiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbFwiPlxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLWxlZnQnXVwiIDpzY29wZT1cInNlYXJjaEV2ZW50Q29udGV4dFJlZlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwga2V5KSBpbiBjb21wdXRlZENvbHVtbnNcIiA6a2V5PVwia2V5XCI+XG4gICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cImNvbXB1dGVkQ29sTmFtZVwiIHYtaWY9XCJpdGVtLnNob3cgPT09IHRydWVcIiBjbGFzcz1cImZzLXNlYXJjaC1jb2xcIiB2LWJpbmQ9XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIiB2LWJpbmQ9XCJpdGVtXCIgOlt1aS5mb3JtSXRlbS5wcm9wXT1cImtleVwiIDpsYWJlbD1cIml0ZW0udGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cInNsb3RzWydzZWFyY2hfJyArIGtleV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoXycgKyBrZXldXCIgOnNjb3BlPVwieyAuLi5zZWFyY2hFdmVudENvbnRleHRSZWYsIGtleSB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZnMtY29tcG9uZW50LXJlbmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2LWlmPVwiaXRlbS5jb21wb25lbnQgJiYgaXRlbS5jb21wb25lbnQuc2hvdyAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6cmVmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRSZW5kZXJSZWZzW2l0ZW0ua2V5XSA9IGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOm1vZGVsLXZhbHVlPVwiZ2V0KGZvcm0sIGtleSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2LWJpbmQ9XCJpdGVtLmNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDpzY29wZT1cInNlYXJjaEV2ZW50Q29udGV4dFJlZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJvblZhbHVlQ2hhbmdlZCgkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlucHV0PVwib25JbnB1dChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cInNsb3RzWydzZWFyY2gtbWlkZGxlJ11cIiBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLW1pZGRsZVwiPlxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLW1pZGRsZSddXCIgOnNjb3BlPVwic2VhcmNoRXZlbnRDb250ZXh0UmVmXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxmcy1zZWFyY2gtYnV0dG9ucyB2LWlmPVwiIWNvbXB1dGVkSXNNdWx0aUxpbmVcIiA6YnV0dG9ucz1cImNvbXB1dGVkQnV0dG9uc1wiPjwvZnMtc2VhcmNoLWJ1dHRvbnM+XG4gICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwic2xvdHNbJ3NlYXJjaC1yaWdodCddXCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLXJpZ2h0J11cIiA6c2NvcGU9XCJzZWFyY2hFdmVudENvbnRleHRSZWZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZnMtc2VhcmNoLWJ1dHRvbnMgdi1pZj1cImNvbXB1dGVkSXNNdWx0aUxpbmVcIiA6YnV0dG9ucz1cImNvbXB1dGVkQnV0dG9uc1wiPjwvZnMtc2VhcmNoLWJ1dHRvbnM+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCJjb21wdXRlZElzTXVsdGlMaW5lXCIgY2xhc3M9XCJmcy1zZWFyY2gtYWN0aW9uXCI+XG4gICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIj5cbiAgICAgICAgICAgICAgPGZzLWJ1dHRvbiA6aWNvbj1cImNvbGxhcHNlID8gdWkuaWNvbnMuY2FyZXRVcCA6IHVpLmljb25zLmNhcmV0RG93blwiIEBjbGljaz1cInRvZ2dsZUNvbGxhcHNlXCIgLz5cbiAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvZGl2PlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBuZXh0VGljaywgb25Nb3VudGVkLCByZWFjdGl2ZSwgcmVmLCBSZWYsIHVucmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgZWFjaCwgZm9yRWFjaCwgc29ydEJ5LCBlbnRyaWVzLCB1bnNldCwgc2V0LCBrZXlzLCBnZXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtY29tcHV0ZVwiO1xuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwubG9nXCI7XG5pbXBvcnQgRnNTZWFyY2hCdXR0b25zIGZyb20gXCIuL2J1dHRvbnMudnVlXCI7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcbmltcG9ydCB7IEJ1dHRvbnNQcm9wcywgU2VhcmNoRXZlbnRDb250ZXh0LCBTZWFyY2hJdGVtUHJvcHMgfSBmcm9tIFwiLi4vLi4vZFwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS11aVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1tZXJnZVwiO1xuXG4vKipcbiAqIOafpeivouahhue7hOS7tlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzU2VhcmNoVjFcIixcbiAgY29tcG9uZW50czogeyBGc1NlYXJjaEJ1dHRvbnMgfSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDliJ3lp4vmn6Xor6LmnaHku7ZcbiAgICAgKiDngrnlh7vph43nva7vvIzkvJrph43nva7miJDor6XmnaHku7ZcbiAgICAgKi9cbiAgICBpbml0aWFsRm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDooajljZXlj4LmlbBcbiAgICAgKiDmlK/mjIFlbC1mb3JtIHwgYS1mb3Jt55qE5bGe5oCnXG4gICAgICovXG4gICAgb3B0aW9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmn6Xor6LlrZfmrrXphY3nva5cbiAgICAgKi9cbiAgICBjb2x1bW5zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIHRhYnNcbiAgICAgKiB7IHNob3cgLCBvcHRpb25zLGtleSwgZGVmYXVsdH1cbiAgICAgKi9cbiAgICB0YWJzOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaMiemSrumFjee9rizlj6/ku6XmoLnmja5vcmRlcuaOkuW6j1xuICAgICAqIHtzZWFyY2g6ey4uLkZzQnV0dG9ufSxyZXNldDp7Li4uRnNCdXR0b259fVxuICAgICAqL1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog54K55Ye76YeN572u5ZCO5piv5ZCm56uL5Y2z6Kem5Y+R5p+l6K+iXG4gICAgICovXG4gICAgc2VhcmNoQWZ0ZXJSZXNldDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuW8gOWQr+iHquWKqOafpeivolxuICAgICAqL1xuICAgIGF1dG9TZWFyY2g6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDoh6rliqjmn6Xor6LvvIzpmLLmipborr7nva5cbiAgICAgKiDkvKBmYWxzZeWImeWFs+mXreiHquWKqOafpeivolxuICAgICAqL1xuICAgIGRlYm91bmNlOiB7XG4gICAgICB0eXBlOiBbQm9vbGVhbiwgT2JqZWN0XSxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5o+S5qe9XG4gICAgICovXG4gICAgc2xvdHM6IHtcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuaYvuekuuafpeivouahhlxuICAgICAqL1xuICAgIHNob3c6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKblkK/nlKjmoKHpqoxcbiAgICAgKi9cbiAgICB2YWxpZGF0ZToge1xuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW4g+WxgCwgc2luZ2xlLWxpbmUg5Y2V6KGM77yMIG11bHRpLWxpbmUg5aSa6KGM77yI5pSv5oyB5bGV5byA5pS26LW377yJXG4gICAgICovXG4gICAgbGF5b3V0OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcInNpbmdsZS1saW5lXCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWIl+eahOWuveW6puiuvue9ru+8jHNwYW49eHhcbiAgICAgKi9cbiAgICBjb2w6IHt9LFxuXG4gICAgLyoqXG4gICAgICog5piv5ZCm5oqY5Y+gXG4gICAgICovXG4gICAgY29sbGFwc2U6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcbiAgICAvKipcbiAgICAgKiDmn6Xor6Lkuovku7ZcbiAgICAgKiovXG4gICAgXCJzZWFyY2hcIixcbiAgICAvKipcbiAgICAgKiDph43nva7kuovku7ZcbiAgICAgKiovXG4gICAgXCJyZXNldFwiLFxuICAgIFwiY29sbGFwc2VcIixcbiAgICBcInVwZGF0ZTpjb2xsYXBzZVwiXG4gIF0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIC8vIOW8guatpXNldHVw6ZyA6KaB5pS+5Zyo56ys5LiA5LiqYXdhaXTkuYvliY1cbiAgICAvLyBvbk1vdW50ZWQgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZSB0byBiZSBhc3NvY2lhdGVkIHdpdGguXG4gICAgLy/kuLrllaXkvJrmnInov5nkuKrorablkYpcbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgaWYgKGNvbXB1dGVkSXNNdWx0aUxpbmUudmFsdWUgJiYgY29sdW1uc1Jvd1JlZi52YWx1ZSkge1xuICAgICAgICBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID0gY29sdW1uc1Jvd1JlZi52YWx1ZS4kZWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBjb25zdCBjb2x1bW5zTGlzdCA9IGNvbHVtbnNSb3dSZWYudmFsdWUuJGVsLmNoaWxkcmVuO1xuICAgICAgICBpZiAoY29sdW1uc0xpc3QgJiYgY29sdW1uc0xpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGNvbHVtbnNMaW5lSGVpZ2h0UmVmLnZhbHVlID0gY29sdW1uc0xpc3RbMV0ub2Zmc2V0SGVpZ2h0ICsgMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGF1dG9TZWFyY2g6IGFueSA9IG51bGw7XG4gICAgZnVuY3Rpb24gY3JlYXRlSW5pdGlhbEZvcm0oKSB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHJldHVybiBjbG9uZURlZXAocHJvcHMuaW5pdGlhbEZvcm0gfHwge30pO1xuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVhY3RpdmUoY3JlYXRlSW5pdGlhbEZvcm0oKSk7XG4gICAgY29uc3QgeyBkb0NvbXB1dGVkLCBBc3luY0NvbXB1dGVWYWx1ZSB9ID0gdXNlQ29tcHV0ZSgpO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLnZhbHVlICE9IG51bGwgJiYgaXRlbS52YWx1ZSBpbnN0YW5jZW9mIEFzeW5jQ29tcHV0ZVZhbHVlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwic2VhcmNoLnZhbHVl6YWN572u5LiN5pSv5oyBQXN5bmNDb21wdXRl57G75Z6L55qE5Yqo5oCB6K6h566XXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgZG9NZXJnZSA9IG1lcmdlO1xuICAgIGNvbnN0IGNvbXB1dGVkQ29sdW1ucyA9IGRvQ29tcHV0ZWQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gcHJvcHMuY29sdW1ucztcbiAgICAgIH0sXG4gICAgICBnZXRDb250ZXh0Rm4sXG4gICAgICBudWxsLFxuICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBpZiAoIXByb3BzLnZhbGlkYXRlKSB7XG4gICAgICAgICAgLy/lpoLmnpzlhbPpl612YWxpZGF0ZeWImeWOu+aOiXJ1bGVzXG4gICAgICAgICAgZm9yRWFjaCh2YWx1ZSwgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtLnJ1bGVzO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIOWQiOW5tmNvbFxuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgaWYgKHByb3BzLmNvbCkge1xuICAgICAgICAgIGZvckVhY2godmFsdWUsICh2KSA9PiB7XG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIHYuY29sID0gbWVyZ2Uoe30sIHByb3BzLmNvbCwgdi5jb2wpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy/lrZfmrrXmjpLluo9cbiAgICAgICAgbGV0IHNvcnRBcnI6IFNlYXJjaEl0ZW1Qcm9wc1tdID0gW107XG4gICAgICAgIGZvckVhY2godmFsdWUsICh2LCBrZXkpID0+IHtcbiAgICAgICAgICB2Ll9rZXkgPSBrZXk7XG4gICAgICAgICAgc29ydEFyci5wdXNoKHYpO1xuICAgICAgICB9KTtcbiAgICAgICAgc29ydEFyciA9IHNvcnRCeShzb3J0QXJyLCAoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLm9yZGVyID8/IENvbnN0YW50cy5vcmRlckRlZmF1bHQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNvcnRlZENvbHVtbnM6IHtcbiAgICAgICAgICBba2V5OiBzdHJpbmddOiBTZWFyY2hJdGVtUHJvcHM7XG4gICAgICAgIH0gPSB7fTtcblxuICAgICAgICBzb3J0QXJyLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBsZXQgX2tleSA9IGl0ZW0uX2tleTtcbiAgICAgICAgICBkZWxldGUgaXRlbS5fa2V5O1xuICAgICAgICAgIHNvcnRlZENvbHVtbnNbX2tleV0gPSBpdGVtO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNvcnRlZENvbHVtbnM7XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8v6buY6K6k5YC8XG4gICAgZm9yRWFjaChjb21wdXRlZENvbHVtbnMudmFsdWUsIChjb2x1bW4sIGtleSkgPT4ge1xuICAgICAgaWYgKGNvbHVtbi52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlZlZhbHVlID0gdW5yZWYoY29sdW1uLnZhbHVlKTtcbiAgICAgIGlmIChkZWZWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbi5zaG93ICE9PSBmYWxzZSAmJiBjb2x1bW4uY29tcG9uZW50Py5zaG93ICE9PSBmYWxzZSkge1xuICAgICAgICAvL+m7mOiupOWAvFxuICAgICAgICBmb3JtW2tleV0gPSBkZWZWYWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzZWFyY2hGb3JtUmVmID0gcmVmKCk7XG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG4gICAgY29uc3QgY29tcG9uZW50UmVuZGVyUmVmczogUmVmID0gcmVmKHt9KTtcbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnRSZW5kZXJSZWZzLnZhbHVlW2tleV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5KT8uJHJlZnM/LnRhcmdldFJlZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb250ZXh0Rm4oKTogU2VhcmNoRXZlbnRDb250ZXh0IHtcbiAgICAgIHJldHVybiB7IGZvcm0sIHZhbGlkYXRlZEZvcm06IGZvcm0sIGdldENvbXBvbmVudFJlZiwgZG9WYWxpZGF0ZTogbnVsbCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaEV2ZW50Q29udGV4dFJlZjogUmVmPFNlYXJjaEV2ZW50Q29udGV4dD4gPSByZWYoZ2V0Q29udGV4dEZuKCkpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG9TZWFyY2goKSB7XG4gICAgICBpZiAoYXV0b1NlYXJjaCkge1xuICAgICAgICAvLyDpmLLmipbmn6Xor6Llj5bmtohcbiAgICAgICAgYXV0b1NlYXJjaC5jYW5jZWwoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsaWQgPSBhd2FpdCB1aS5mb3JtLnZhbGlkYXRlV3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlKTtcbiAgICAgIGlmICh2YWxpZCkge1xuICAgICAgICBjdHguZW1pdChcInNlYXJjaFwiLCBzZWFyY2hFdmVudENvbnRleHRSZWYudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdWkubWVzc2FnZS5lcnJvcih7XG4gICAgICAgICAgbWVzc2FnZTogdChcImZzLnNlYXJjaC5lcnJvci5tZXNzYWdlXCIpXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9SZXNldCgpIHtcbiAgICAgIC8vIHVpLmZvcm0ucmVzZXRXcmFwKHNlYXJjaEZvcm1SZWYudmFsdWUsIHsgZm9ybSwgaW5pdGlhbEZvcm06IGNyZWF0ZUluaXRpYWxGb3JtKCkgfSk7XG4gICAgICBjb25zdCBpbml0aWFsRm9ybSA9IGNyZWF0ZUluaXRpYWxGb3JtKCk7XG4gICAgICBjb25zdCBlbnRyaWVzUmV0ID0gZW50cmllcyhmb3JtKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllc1JldCkge1xuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBnZXQoaW5pdGlhbEZvcm0sIGVudHJ5WzBdKTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgdW5zZXQoZm9ybSwgZW50cnlbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldChmb3JtLCBlbnRyeVswXSwgaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocHJvcHMucmVzZXQpIHtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIHByb3BzLnJlc2V0KHNlYXJjaEV2ZW50Q29udGV4dFJlZi52YWx1ZSk7XG4gICAgICB9XG4gICAgICAvLyDooajljZXph43nva7kuovku7ZcbiAgICAgIGN0eC5lbWl0KFwicmVzZXRcIiwgZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocHJvcHMuc2VhcmNoQWZ0ZXJSZXNldCkge1xuICAgICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgZG9TZWFyY2goKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbXB1dGVkQnV0dG9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IGJ0bnM6IGFueSA9IFtdO1xuICAgICAgY29uc3QgZGVmQnRuT3B0aW9uczogQnV0dG9uc1Byb3BzPFNlYXJjaEV2ZW50Q29udGV4dD4gPSB7XG4gICAgICAgIHNlYXJjaDoge1xuICAgICAgICAgIHNob3c6IHRydWUsXG4gICAgICAgICAgdHlwZTogXCJwcmltYXJ5XCIsXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIGNsaWNrOiAoY29udGV4dDogU2VhcmNoRXZlbnRDb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBkb1NlYXJjaCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgdGV4dDogdChcImZzLnNlYXJjaC5zZWFyY2gudGV4dFwiKSAvLyAn5p+l6K+iJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICBjbGljazogKGNvbnRleHQ6IFNlYXJjaEV2ZW50Q29udGV4dCkgPT4ge1xuICAgICAgICAgICAgZG9SZXNldCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGV4dDogdChcImZzLnNlYXJjaC5yZXNldC50ZXh0XCIpLCAvLyAn6YeN572uJyxcbiAgICAgICAgICBvcmRlcjogMlxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBtZXJnZShkZWZCdG5PcHRpb25zLCBwcm9wcy5idXR0b25zKTtcbiAgICAgIGZvciAobGV0IGtleSBpbiBkZWZCdG5PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGJ0biA9IGRlZkJ0bk9wdGlvbnNba2V5XTtcbiAgICAgICAgYnRuLl9jbGljayA9ICgpID0+IHtcbiAgICAgICAgICBidG4uY2xpY2soZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgICB9O1xuICAgICAgICBidG5zLnB1c2goYnRuKTtcbiAgICAgIH1cblxuICAgICAgYnRucy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gYS5vcmRlciAtIGIub3JkZXI7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBidG5zO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gaW5pdEF1dG9TZWFyY2goKSB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmIChwcm9wcy5hdXRvU2VhcmNoID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyDmnoTlu7rpmLLmipbmn6Xor6Llh73mlbBcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKHByb3BzLmRlYm91bmNlICE9PSBmYWxzZSkge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgbGV0IHdhaXQgPSBwcm9wcy5kZWJvdW5jZT8ud2FpdCB8fCA1MDA7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBhdXRvU2VhcmNoID0gZGVib3VuY2UoZG9TZWFyY2gsIHdhaXQsIHByb3BzLmRlYm91bmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0QXV0b1NlYXJjaCgpO1xuXG4gICAgZnVuY3Rpb24gZ2V0Rm9ybSgpIHtcbiAgICAgIHJldHVybiBmb3JtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuvue9rmZvcm3lgLxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRGb3JtKG5ld0Zvcm06IGFueSwgbWVyZ2UgPSB0cnVlKSB7XG4gICAgICBpZiAoIW1lcmdlKSB7XG4gICAgICAgIGVhY2goa2V5cyhmb3JtKSwgKGl0ZW0pID0+IHtcbiAgICAgICAgICBkZWxldGUgZm9ybVtpdGVtXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBkb01lcmdlKGZvcm0sIG5ld0Zvcm0pO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0RXZlbnREaXNhYmxlZCA9IHJlZihmYWxzZSk7XG5cbiAgICBjb25zdCBkb0F1dG9TZWFyY2ggPSAoKSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJkbyBhdXRvIHNlYXJjaCxpbnB1dEV2ZW50RGlzYWJsZWQ6XCIsIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSk7XG4gICAgICBpZiAoaW5wdXRFdmVudERpc2FibGVkLnZhbHVlICE9PSB0cnVlICYmIGF1dG9TZWFyY2gpIHtcbiAgICAgICAgLy8g6Ziy5oqW5p+l6K+iXG4gICAgICAgIGF1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25JbnB1dCA9IChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgZG9BdXRvU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyDovpPlhaXms5Xnm5HlkKxcbiAgICBjb25zdCBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQgPSAoZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSA9IGRpc2FibGVkO1xuICAgICAgZG9BdXRvU2VhcmNoKCk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIG9uVmFsdWVDaGFuZ2VkKHZhbHVlOiBhbnksIGl0ZW06IFNlYXJjaEl0ZW1Qcm9wcykge1xuICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXk7XG4gICAgICBzZXQoZm9ybSwga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoaXRlbS52YWx1ZUNoYW5nZSkge1xuICAgICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtW2tleV07XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGdldENvbXBvbmVudFJlZihrZXkpO1xuICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZSA9IGl0ZW0udmFsdWVDaGFuZ2UgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGl0ZW0udmFsdWVDaGFuZ2UgOiBpdGVtLnZhbHVlQ2hhbmdlLmhhbmRsZTtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIHZhbHVlQ2hhbmdlKHsga2V5LCB2YWx1ZSwgY29tcG9uZW50UmVmLCAuLi5nZXRDb250ZXh0Rm4oKSwgaW1taWRpYXRlOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09IG51bGwgfHwgaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gdHJ1ZSB8fCBpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSBcImNoYW5nZVwiKSB7XG4gICAgICAgIGRvQXV0b1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXB1dGVkUnVsZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmICghcHJvcHMudmFsaWRhdGUpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICByZXR1cm4gcHJvcHMub3B0aW9ucy5ydWxlcztcbiAgICB9KTtcblxuICAgIC8vLS0tLS3lpJrooYzmqKHlvI/mipjlj6BcblxuICAgIGNvbnN0IGNvbHVtbnNSb3dSZWYgPSByZWYoKTtcbiAgICBjb25zdCBjb2x1bW5zQm94SGVpZ2h0UmVmID0gcmVmKDApO1xuICAgIGNvbnN0IGNvbHVtbnNMaW5lSGVpZ2h0UmVmID0gcmVmKDApO1xuXG4gICAgY29uc3QgdG9nZ2xlQ29sbGFwc2UgPSAoKSA9PiB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOmNvbGxhcHNlXCIsICFwcm9wcy5jb2xsYXBzZSk7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGN0eC5lbWl0KFwiY29sbGFwc2VcIiwgIXByb3BzLmNvbGxhcHNlKTtcbiAgICB9O1xuXG4gICAgY29uc3QgY29tcHV0ZWRDb2xOYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocHJvcHMubGF5b3V0ID09PSBcIm11bHRpLWxpbmVcIikge1xuICAgICAgICByZXR1cm4gdWkuY29sLm5hbWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJkaXZcIjtcbiAgICB9KTtcbiAgICBjb25zdCBjb21wdXRlZElzTXVsdGlMaW5lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICByZXR1cm4gcHJvcHMubGF5b3V0ID09PSBcIm11bHRpLWxpbmVcIjtcbiAgICAgIC8v5LiN6KaB6L+Z5Liq77yM5Lya5q275b6q546v77yMICYmIGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgPiBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKCFjb21wdXRlZElzTXVsdGlMaW5lLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBcImF1dG9cIjtcbiAgICAgIH1cbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKHByb3BzLmNvbGxhcHNlKSB7XG4gICAgICAgIHJldHVybiBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZSA/IGNvbHVtbnNMaW5lSGVpZ2h0UmVmLnZhbHVlICsgXCJweFwiIDogXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID8gY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSArIFwicHhcIiA6IFwiXCI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0OiAoZm9ybTogYW55LCBrZXk6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0KGZvcm0sIGtleSk7XG4gICAgICB9LFxuICAgICAgdWksXG4gICAgICBvblZhbHVlQ2hhbmdlZCxcbiAgICAgIGRvU2VhcmNoLFxuICAgICAgZG9SZXNldCxcbiAgICAgIGZvcm0sXG4gICAgICBjb21wb25lbnRSZW5kZXJSZWZzLFxuICAgICAgZ2V0Q29tcG9uZW50UmVuZGVyUmVmLFxuICAgICAgZ2V0Q29tcG9uZW50UmVmLFxuICAgICAgZ2V0Rm9ybSxcbiAgICAgIHNldEZvcm0sXG4gICAgICBzZWFyY2hGb3JtUmVmLFxuICAgICAgb25JbnB1dCxcbiAgICAgIGlucHV0RXZlbnREaXNhYmxlZCxcbiAgICAgIGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCxcbiAgICAgIGNvbXB1dGVkQ29sdW1ucyxcbiAgICAgIGNvbXB1dGVkQnV0dG9ucyxcbiAgICAgIGNvbXB1dGVkUnVsZXMsXG4gICAgICBjb2x1bW5zUm93UmVmLFxuICAgICAgY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQsXG4gICAgICBjb21wdXRlZENvbE5hbWUsXG4gICAgICBjb21wdXRlZElzTXVsdGlMaW5lLFxuICAgICAgdG9nZ2xlQ29sbGFwc2UsXG4gICAgICBzZWFyY2hFdmVudENvbnRleHRSZWZcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtc2VhcmNoIHtcbiAgLy9kaXNwbGF5OiBmbGV4O1xuICAvL2ZsZXgtd3JhcDogbm93cmFwO1xuICAuc2VhcmNoLWxlZnQge1xuICB9XG4gIC5zZWFyY2gtcmlnaHQge1xuICAgIGZsZXg6IDE7XG4gIH1cbiAgLmFudC1mb3JtLWlubGluZSB7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICB9XG4gIC5mcy1zZWFyY2gtZm9ybSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAvLyYgPiAqIHtcbiAgICAvLyAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgIC8vICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgLy8gIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAvL31cblxuICAgIC5mcy1zZWFyY2gtYm94IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAuZnMtc2VhcmNoLW1haW4ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgIH1cbiAgICAuZnMtc2VhcmNoLWNvbCB7XG4gICAgICAmID4gKiB7XG4gICAgICAgIG1hcmdpbjogMHB4IDVweDtcbiAgICAgIH1cbiAgICAgIG1hcmdpbjogMXB4IDA7XG4gICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgLy8gbWFyZ2luLWxlZnQ6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmVsLWZvcm0taXRlbSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiA0cHg7XG4gICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG5cbiAgICAuZWwtZm9ybS0taW5saW5lIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cblxuICAgIC5lbC1mb3JtLWl0ZW1fX2NvbnRlbnQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICB9XG5cbiAgLmZzLXNlYXJjaC1idG5zIHtcbiAgICAuZnMtYnV0dG9uIHtcbiAgICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICAgIH1cbiAgfVxuXG4gICYuZnMtc2VhcmNoLW11bHRpLWxpbmUge1xuICAgIC5mcy1zZWFyY2gtYm94IHtcbiAgICAgIC5mcy1zZWFyY2gtbWFpbiB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIC5mcy1zZWFyY2gtY29sdW1ucyB7XG4gICAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICAgIG92ZXJmbG93LXk6IGhpZGRlbjtcbiAgICAgICAgICAvLyB0cmFuc2l0aW9uOiBhbGwgMC4zcyBsaW5lYXI7XG4gICAgICAgICAgLy8gd2lsbC1jaGFuZ2U6IGhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICAuZnMtc2VhcmNoLWJ0bnMge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICAgICAgLmVsLWZvcm0taXRlbV9fY29udGVudCB7XG4gICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAubi1mb3JtLWl0ZW0tYmxhbmsge1xuICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAuZnMtc2VhcmNoLWFjdGlvbiB7XG4gICAgICAuYW50LWZvcm0taXRlbSB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4uZnMtc2VhcmNoIHtcbiAgLm4tZm9ybS1pdGVtLWJsYW5rIHtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1sYXlvdXQtZGVmYXVsdFwiIDpjbGFzcz1cInsgJ2ZzLXNlYXJjaC1tdWx0aS1saW5lJzogY29tcHV0ZWRJc011bHRpTGluZSB9XCI+XG4gICAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1ib3hcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmcy1zZWFyY2gtbWFpblwiXG4gICAgICAgIDpjbGFzcz1cInsgJ2ZzLXNlYXJjaC1jb2xsYXBzZSc6IGNvbGxhcHNlIH1cIlxuICAgICAgICA6c3R5bGU9XCJ7IG1heEhlaWdodDogY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQgfVwiXG4gICAgICA+XG4gICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiByZWY9XCJjb2x1bW5zUm93UmVmXCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sdW1uc1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtc2xvdFwiPlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaC1sZWZ0XCI+PC9zbG90PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8IS0tIOafpeivouWtl+autXJlbmRlcu+8jOmcgOimgeWumuS5iXByb3BzLmNvbHVtbnMgLS0+XG4gICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGtleSkgb2YgY29sdW1uc1wiIDprZXk9XCJrZXlcIj5cbiAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuY29sLm5hbWVcIiB2LWlmPVwiaXRlbS5zaG93XCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sXCIgdi1iaW5kPVwibWVyZ2VDb2woaXRlbS5jb2wpXCI+XG4gICAgICAgICAgICAgIDxmcy1yZW5kZXIgOnJlbmRlci1mdW5jPVwiaXRlbS5fY2VsbFJlbmRlclwiIDpzY29wZT1cImdldENvbnRleHRGbigpXCIgLz5cbiAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1zbG90XCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoLW1pZGRsZVwiPjwvc2xvdD5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgICAgOmlzPVwidWkuY29sLm5hbWVcIlxuICAgICAgICAgICAgdi1pZj1cIiFjb21wdXRlZElzTXVsdGlMaW5lXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtYnV0dG9ucy1ncm91cFwiXG4gICAgICAgICAgICB2LWJpbmQ9XCJtZXJnZUNvbChhY3Rpb24/LmNvbClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiIDpbdWkuZm9ybUl0ZW0ubGFiZWxdPVwiYWN0aW9uPy5sYWJlbFwiPlxuICAgICAgICAgICAgICA8IS0tIOafpeivouaMiemSruaPkuanvS0tPlxuICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoLWJ1dHRvbnNcIiB2LWJpbmQ9XCJnZXRDb250ZXh0Rm4oKVwiPjwvc2xvdD5cbiAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtc2xvdFwiPlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaC1yaWdodFwiIHYtYmluZD1cImdldENvbnRleHRGbigpXCI+PC9zbG90PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgdi1pZj1cImNvbXB1dGVkSXNNdWx0aUxpbmVcIiBjbGFzcz1cImZzLXNlYXJjaC1idXR0b25zLWdyb3VwIGZzLXNlYXJjaC1tdWx0aS1saW5lLWJ1dHRvbnNcIj5cbiAgICAgICAgPCEtLSDlpJrooYzmqKHlvI/ml7bnmoTmn6Xor6LmjInpkq4tLT5cbiAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaC1idXR0b25zXCI+PC9zbG90PlxuICAgICAgICA8ZnMtYnV0dG9uXG4gICAgICAgICAgdi1pZj1cImNvbGxhcHNlQnV0dG9uPy5zaG93ICE9PSBmYWxzZVwiXG4gICAgICAgICAgOmljb249XCJjb2xsYXBzZSA/IHVpLmljb25zLmNhcmV0RG93biA6IHVpLmljb25zLmNhcmV0VXBcIlxuICAgICAgICAgIDp0ZXh0PVwiXG4gICAgICAgICAgICBjb2xsYXBzZVxuICAgICAgICAgICAgICA/IHQoJ2ZzLnNlYXJjaC5jb250YWluZXIuY29sbGFwc2VCdXR0b24udGV4dC5leHBhbmQnKVxuICAgICAgICAgICAgICA6IHQoJ2ZzLnNlYXJjaC5jb250YWluZXIuY29sbGFwc2VCdXR0b24udGV4dC5jb2xsYXBzZScpXG4gICAgICAgICAgXCJcbiAgICAgICAgICB2LWJpbmQ9XCJjb2xsYXBzZUJ1dHRvblwiXG4gICAgICAgICAgQGNsaWNrPVwidG9nZ2xlQ29sbGFwc2VcIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIG9uTW91bnRlZCwgcmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzU2VhcmNoTGF5b3V0RGVmYXVsdFwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaYr+WQpuaUtue8qVxuICAgICAqL1xuICAgIGNvbGxhcHNlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5bGV5byA5oyJ6ZKuXG4gICAgICovXG4gICAgY29sbGFwc2VCdXR0b246IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG5cbiAgICBhY3Rpb246IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5biD5bGA5qih5byPXG4gICAgICovXG4gICAgbGF5b3V0OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcInNpbmdsZS1saW5lXCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOafpeivouWtl+auteWIl+ihqO+8jOWPr+S7peeyvue7huWMluiHquWumuS5ieafpeivouWtl+auteW4g+WxgFxuICAgICAqL1xuICAgIGNvbHVtbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6buY6K6k55qEY29s6YWN572uXG4gICAgICovXG4gICAgY29sOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog6I635Y+W5p+l6K+i5LiK5LiL5paHXG4gICAgICovXG4gICAgZ2V0Q29udGV4dEZuOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvblxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcInVwZGF0ZTpjb2xsYXBzZVwiLCBcImNvbGxhcHNlXCJdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcbiAgICBjb25zdCBjb2x1bW5zUm93UmVmID0gcmVmKCk7XG4gICAgY29uc3QgY29tcHV0ZWRJc011bHRpTGluZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBwcm9wcy5sYXlvdXQgPT09IFwibXVsdGktbGluZVwiO1xuICAgICAgLy/kuI3opoHov5nkuKrvvIzkvJrmrbvlvqrnjq/vvIwgJiYgY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA+IGNvbHVtbnNMaW5lSGVpZ2h0UmVmLnZhbHVlO1xuICAgIH0pO1xuICAgIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgICBpZiAoY29tcHV0ZWRJc011bHRpTGluZS52YWx1ZSAmJiBjb2x1bW5zUm93UmVmLnZhbHVlKSB7XG4gICAgICAgIGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgPSBjb2x1bW5zUm93UmVmLnZhbHVlLiRlbC5vZmZzZXRIZWlnaHQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZENvbHVtbkJveEhlaWdodCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmICghY29tcHV0ZWRJc011bHRpTGluZS52YWx1ZSB8fCAhcHJvcHMuY29sbGFwc2UpIHtcbiAgICAgICAgcmV0dXJuIFwiYXV0b1wiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgPyBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlICsgXCJweFwiIDogXCJcIjtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbHVtbnNCb3hIZWlnaHRSZWYgPSByZWYoMCk7XG5cbiAgICBjb25zdCB0b2dnbGVDb2xsYXBzZSA9ICgpID0+IHtcbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOmNvbGxhcHNlXCIsICFwcm9wcy5jb2xsYXBzZSk7XG4gICAgICBjdHguZW1pdChcImNvbGxhcHNlXCIsICFwcm9wcy5jb2xsYXBzZSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29sKGNvbDogYW55KSB7XG4gICAgICByZXR1cm4gbWVyZ2Uoe30sIHByb3BzLmNvbCwgY29sKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICBjb2x1bW5zUm93UmVmLFxuICAgICAgY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQsXG4gICAgICBjb21wdXRlZElzTXVsdGlMaW5lLFxuICAgICAgdG9nZ2xlQ29sbGFwc2UsXG4gICAgICBtZXJnZUNvbCxcbiAgICAgIHRcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtc2VhcmNoLWxheW91dC1kZWZhdWx0IHtcbiAgd2lkdGg6IDEwMCU7XG5cbiAgLmZzLXNlYXJjaC1ib3gge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgICAuZnMtc2VhcmNoLW1haW4ge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgaGVpZ2h0OiBhdXRvO1xuXG4gICAgICAuYW50LWZvcm0taXRlbS1jb250cm9sIHtcbiAgICAgICAgd2lkdGg6IDUwJTtcbiAgICAgIH1cblxuICAgICAgLmZzLXNlYXJjaC1jb2x1bW5zIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICBwYWRkaW5nOiA0cHggMCA0cHggMDtcblxuICAgICAgICAuZnMtc2VhcmNoLWNvbCB7XG4gICAgICAgICAgbWluLXdpZHRoOiAxODBweDtcbiAgICAgICAgICAmLmZzLXNlYXJjaC1zbG90IHtcbiAgICAgICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgJiA+ICoge1xuICAgICAgICAgICAgbWFyZ2luOiAwcHggNHB4O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1hcmdpbjogNHB4IDA7XG5cbiAgICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIC8vIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC5hbnQtZm9ybS1pdGVtLWxhYmVsIHtcbiAgICAgICAgICAgIG1heC13aWR0aDogNTAlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC5hbnQtaW5wdXQtbnVtYmVyLFxuICAgICAgICAgIC5hbnQtcGlja2VyLFxuICAgICAgICAgIC5lbC1pbnB1dC1udW1iZXIsXG4gICAgICAgICAgLmVsLWNhc2NhZGVyLFxuICAgICAgICAgIC5lbC1kYXRlLWVkaXRvcixcbiAgICAgICAgICAubi1zZWxlY3QsXG4gICAgICAgICAgLm4tZGF0ZS1waWNrZXIsXG4gICAgICAgICAgLm4taW5wdXQtbnVtYmVyIHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAuZWwtZGF0ZS1lZGl0b3IgLmVsLXJhbmdlX19pY29uIHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAuZWwtZGF0ZS1lZGl0b3IgLmVsLXJhbmdlX19jbG9zZS1pY29uIHtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuZnMtc2VhcmNoLWJ1dHRvbnMtZ3JvdXAge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIC5mcy1idXR0b24ge1xuICAgICAgbWFyZ2luOiAwIDJweCAwIDJweDtcbiAgICB9XG4gIH1cblxuICAmLmZzLXNlYXJjaC1tdWx0aS1saW5lIHtcbiAgICAuZnMtc2VhcmNoLWJveCB7XG4gICAgICAuZnMtc2VhcmNoLW1haW4ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgICAgIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMC4ycyBlYXNlO1xuICAgICAgICAmLmZzLXNlYXJjaC1jb2xsYXBzZSB7XG4gICAgICAgICAgbWF4LWhlaWdodDogNDJweCAhaW1wb3J0YW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmFudC1mb3JtLWl0ZW0ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgLmFudC1mb3JtLXJvdyB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgICAgLmFudC1mb3JtLWl0ZW0tcm93IHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgICAuYW50LWZvcm0taXRlbS1jb250cm9sIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgd2lkdGg6IGF1dG87XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWxheW91dC1kZWZhdWx0XCIgOmNsYXNzPVwieyAnZnMtc2VhcmNoLW11bHRpLWxpbmUnOiBjb21wdXRlZElzTXVsdGlMaW5lIH1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWJveFwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1tYWluXCJcbiAgICAgICAgOmNsYXNzPVwieyAnZnMtc2VhcmNoLWNvbGxhcHNlJzogY29sbGFwc2UgfVwiXG4gICAgICAgIDpzdHlsZT1cInsgbWF4SGVpZ2h0OiBjb21wdXRlZENvbHVtbkJveEhlaWdodCB9XCJcbiAgICAgID5cbiAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yb3cubmFtZVwiIHJlZj1cImNvbHVtbnNSb3dSZWZcIiBjbGFzcz1cImZzLXNlYXJjaC1jb2x1bW5zXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1zbG90XCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoLWxlZnRcIj48L3Nsb3Q+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwhLS0g5p+l6K+i5a2X5q61cmVuZGVy77yM6ZyA6KaB5a6a5LmJcHJvcHMuY29sdW1ucyAtLT5cbiAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwga2V5KSBvZiBjb2x1bW5zXCIgOmtleT1cImtleVwiPlxuICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jb2wubmFtZVwiIHYtaWY9XCJpdGVtLnNob3dcIiBjbGFzcz1cImZzLXNlYXJjaC1jb2xcIiB2LWJpbmQ9XCJtZXJnZUNvbChpdGVtLmNvbClcIj5cbiAgICAgICAgICAgICAgPGZzLXJlbmRlciA6cmVuZGVyLWZ1bmM9XCJpdGVtLl9jZWxsUmVuZGVyXCIgOnNjb3BlPVwiZ2V0Q29udGV4dEZuKClcIiAvPlxuICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLXNsb3RcIj5cbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2gtbWlkZGxlXCI+PC9zbG90PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICA6aXM9XCJ1aS5jb2wubmFtZVwiXG4gICAgICAgICAgICB2LWlmPVwiIWNvbXB1dGVkSXNNdWx0aUxpbmVcIlxuICAgICAgICAgICAgY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1idXR0b25zLWdyb3VwXCJcbiAgICAgICAgICAgIHYtYmluZD1cIm1lcmdlQ29sKGFjdGlvbj8uY29sKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCIgOlt1aS5mb3JtSXRlbS5sYWJlbF09XCJhY3Rpb24/LmxhYmVsXCI+XG4gICAgICAgICAgICAgIDwhLS0g5p+l6K+i5oyJ6ZKu5o+S5qe9LS0+XG4gICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2gtYnV0dG9uc1wiIHYtYmluZD1cImdldENvbnRleHRGbigpXCI+PC9zbG90PlxuICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1zbG90XCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoLXJpZ2h0XCIgdi1iaW5kPVwiZ2V0Q29udGV4dEZuKClcIj48L3Nsb3Q+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiB2LWlmPVwiY29tcHV0ZWRJc011bHRpTGluZVwiIGNsYXNzPVwiZnMtc2VhcmNoLWJ1dHRvbnMtZ3JvdXAgZnMtc2VhcmNoLW11bHRpLWxpbmUtYnV0dG9uc1wiPlxuICAgICAgICA8IS0tIOWkmuihjOaooeW8j+aXtueahOafpeivouaMiemSri0tPlxuICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoLWJ1dHRvbnNcIj48L3Nsb3Q+XG4gICAgICAgIDxmcy1idXR0b25cbiAgICAgICAgICB2LWlmPVwiY29sbGFwc2VCdXR0b24/LnNob3cgIT09IGZhbHNlXCJcbiAgICAgICAgICA6aWNvbj1cImNvbGxhcHNlID8gdWkuaWNvbnMuY2FyZXREb3duIDogdWkuaWNvbnMuY2FyZXRVcFwiXG4gICAgICAgICAgOnRleHQ9XCJcbiAgICAgICAgICAgIGNvbGxhcHNlXG4gICAgICAgICAgICAgID8gdCgnZnMuc2VhcmNoLmNvbnRhaW5lci5jb2xsYXBzZUJ1dHRvbi50ZXh0LmV4cGFuZCcpXG4gICAgICAgICAgICAgIDogdCgnZnMuc2VhcmNoLmNvbnRhaW5lci5jb2xsYXBzZUJ1dHRvbi50ZXh0LmNvbGxhcHNlJylcbiAgICAgICAgICBcIlxuICAgICAgICAgIHYtYmluZD1cImNvbGxhcHNlQnV0dG9uXCJcbiAgICAgICAgICBAY2xpY2s9XCJ0b2dnbGVDb2xsYXBzZVwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgb25Nb3VudGVkLCByZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNTZWFyY2hMYXlvdXREZWZhdWx0XCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5piv5ZCm5pS257ypXG4gICAgICovXG4gICAgY29sbGFwc2U6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlsZXlvIDmjInpkq5cbiAgICAgKi9cbiAgICBjb2xsYXBzZUJ1dHRvbjoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcblxuICAgIGFjdGlvbjoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDluIPlsYDmqKHlvI9cbiAgICAgKi9cbiAgICBsYXlvdXQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IFwic2luZ2xlLWxpbmVcIlxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5p+l6K+i5a2X5q615YiX6KGo77yM5Y+v5Lul57K+57uG5YyW6Ieq5a6a5LmJ5p+l6K+i5a2X5q615biD5bGAXG4gICAgICovXG4gICAgY29sdW1uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDpu5jorqTnmoRjb2zphY3nva5cbiAgICAgKi9cbiAgICBjb2w6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDojrflj5bmn6Xor6LkuIrkuIvmlodcbiAgICAgKi9cbiAgICBnZXRDb250ZXh0Rm46IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uXG4gICAgfVxuICB9LFxuICBlbWl0czogW1widXBkYXRlOmNvbGxhcHNlXCIsIFwiY29sbGFwc2VcIl0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuICAgIGNvbnN0IGNvbHVtbnNSb3dSZWYgPSByZWYoKTtcbiAgICBjb25zdCBjb21wdXRlZElzTXVsdGlMaW5lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLmxheW91dCA9PT0gXCJtdWx0aS1saW5lXCI7XG4gICAgICAvL+S4jeimgei/meS4qu+8jOS8muatu+W+queOr++8jCAmJiBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID4gY29sdW1uc0xpbmVIZWlnaHRSZWYudmFsdWU7XG4gICAgfSk7XG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIGlmIChjb21wdXRlZElzTXVsdGlMaW5lLnZhbHVlICYmIGNvbHVtbnNSb3dSZWYudmFsdWUpIHtcbiAgICAgICAgY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA9IGNvbHVtbnNSb3dSZWYudmFsdWUuJGVsLm9mZnNldEhlaWdodDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKCFjb21wdXRlZElzTXVsdGlMaW5lLnZhbHVlIHx8ICFwcm9wcy5jb2xsYXBzZSkge1xuICAgICAgICByZXR1cm4gXCJhdXRvXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA/IGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgKyBcInB4XCIgOiBcIlwiO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29sdW1uc0JveEhlaWdodFJlZiA9IHJlZigwKTtcblxuICAgIGNvbnN0IHRvZ2dsZUNvbGxhcHNlID0gKCkgPT4ge1xuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6Y29sbGFwc2VcIiwgIXByb3BzLmNvbGxhcHNlKTtcbiAgICAgIGN0eC5lbWl0KFwiY29sbGFwc2VcIiwgIXByb3BzLmNvbGxhcHNlKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbWVyZ2VDb2woY29sOiBhbnkpIHtcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuY29sLCBjb2wpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIGNvbHVtbnNSb3dSZWYsXG4gICAgICBjb21wdXRlZENvbHVtbkJveEhlaWdodCxcbiAgICAgIGNvbXB1dGVkSXNNdWx0aUxpbmUsXG4gICAgICB0b2dnbGVDb2xsYXBzZSxcbiAgICAgIG1lcmdlQ29sLFxuICAgICAgdFxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1zZWFyY2gtbGF5b3V0LWRlZmF1bHQge1xuICB3aWR0aDogMTAwJTtcblxuICAuZnMtc2VhcmNoLWJveCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgIC5mcy1zZWFyY2gtbWFpbiB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBoZWlnaHQ6IGF1dG87XG5cbiAgICAgIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wge1xuICAgICAgICB3aWR0aDogNTAlO1xuICAgICAgfVxuXG4gICAgICAuZnMtc2VhcmNoLWNvbHVtbnMge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgICAgIHBhZGRpbmc6IDRweCAwIDRweCAwO1xuXG4gICAgICAgIC5mcy1zZWFyY2gtY29sIHtcbiAgICAgICAgICBtaW4td2lkdGg6IDE4MHB4O1xuICAgICAgICAgICYuZnMtc2VhcmNoLXNsb3Qge1xuICAgICAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICAmID4gKiB7XG4gICAgICAgICAgICBtYXJnaW46IDBweCA0cHg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWFyZ2luOiA0cHggMDtcblxuICAgICAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgLy8gbWFyZ2luLWxlZnQ6IDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xuICAgICAgICAgICAgbWF4LXdpZHRoOiA1MCU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLmFudC1pbnB1dC1udW1iZXIsXG4gICAgICAgICAgLmFudC1waWNrZXIsXG4gICAgICAgICAgLmVsLWlucHV0LW51bWJlcixcbiAgICAgICAgICAuZWwtY2FzY2FkZXIsXG4gICAgICAgICAgLmVsLWRhdGUtZWRpdG9yLFxuICAgICAgICAgIC5uLXNlbGVjdCxcbiAgICAgICAgICAubi1kYXRlLXBpY2tlcixcbiAgICAgICAgICAubi1pbnB1dC1udW1iZXIge1xuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2ljb24ge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2Nsb3NlLWljb24ge1xuICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5mcy1zZWFyY2gtYnV0dG9ucy1ncm91cCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gICAgLmZzLWJ1dHRvbiB7XG4gICAgICBtYXJnaW46IDAgMnB4IDAgMnB4O1xuICAgIH1cbiAgfVxuXG4gICYuZnMtc2VhcmNoLW11bHRpLWxpbmUge1xuICAgIC5mcy1zZWFyY2gtYm94IHtcbiAgICAgIC5mcy1zZWFyY2gtbWFpbiB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjJzIGVhc2U7XG4gICAgICAgICYuZnMtc2VhcmNoLWNvbGxhcHNlIHtcbiAgICAgICAgICBtYXgtaGVpZ2h0OiA0MnB4ICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAuYW50LWZvcm0taXRlbSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAuYW50LWZvcm0tcm93IHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgICAuYW50LWZvcm0taXRlbS1yb3cge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICAgIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IGFzIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi8gX19NQUNST1NfZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1RhYnNGaWx0ZXJcIixcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZVxufSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLXRhYnMtZmlsdGVyXCI+XG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS50YWJzLm5hbWVcIiB2LWJpbmQ9XCJiaW5kaW5nXCI+XG4gICAgICA8Y29tcG9uZW50XG4gICAgICAgIDppcz1cInVpLnRhYlBhbmUubmFtZVwiXG4gICAgICAgIHYtaWY9XCJkZWZhdWx0T3B0aW9uLnNob3dcIlxuICAgICAgICA6W3VpLnRhYlBhbmUua2V5XT1cIl9fREVGQVVMVF9fXCJcbiAgICAgICAgOlt1aS50YWJQYW5lLnRhYl09XCJkZWZhdWx0T3B0aW9uLmxhYmVsXCJcbiAgICAgIC8+XG4gICAgICA8Y29tcG9uZW50XG4gICAgICAgIDppcz1cInVpLnRhYlBhbmUubmFtZVwiXG4gICAgICAgIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBvZiBvcHRpb25zXCJcbiAgICAgICAgOmtleT1cImluZGV4XCJcbiAgICAgICAgOlt1aS50YWJQYW5lLmtleV09XCJnZXRWYWx1ZShpdGVtKVwiXG4gICAgICAgIDpbdWkudGFiUGFuZS50YWJdPVwiZ2V0TGFiZWwoaXRlbSlcIlxuICAgICAgLz5cbiAgICA8L2NvbXBvbmVudD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIiBzZXR1cD5cbmltcG9ydCB7IGNvbXB1dGVkLCB1c2VBdHRycyB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZU1lcmdlLCB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbjtcblxudHlwZSBUYWJzRmlsdGVyRGVmYXVsdE9wdGlvbiA9IHsgc2hvdz86IGJvb2xlYW47IHZhbHVlPzogYW55OyBsYWJlbD86IHN0cmluZyB9O1xudHlwZSBUYWJzRmlsdGVyT3B0aW9uID0geyB2YWx1ZTogYW55OyBsYWJlbDogc3RyaW5nOyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbmludGVyZmFjZSBUYWJzRmlsdGVyUHJvcHMge1xuICBuYW1lOiBzdHJpbmc7IC8v5p+l6K+i5a2X5q6155qEa2V5LHNlYXJjaOWPguaVsGtleVxuICBzaG93PzogYm9vbGVhbjtcbiAgZGVmYXVsdE9wdGlvbj86IFRhYnNGaWx0ZXJEZWZhdWx0T3B0aW9uO1xuICBvcHRpb25zOiBUYWJzRmlsdGVyT3B0aW9uW107XG4gIG1vZGVsVmFsdWU6IGFueTtcbiAgdmFsdWU/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xufVxuXG5jb25zdCBhdHRycyA9IHVzZUF0dHJzKCk7XG5jb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoZGVmaW5lUHJvcHM8VGFic0ZpbHRlclByb3BzPigpLCB7XG4gIHNob3c6IGZhbHNlLFxuICB2YWx1ZTogXCJ2YWx1ZVwiLFxuICBsYWJlbDogXCJsYWJlbFwiLFxuICBkZWZhdWx0T3B0aW9uOiB1bmRlZmluZWQsXG4gIG9wdGlvbnM6ICgpID0+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbn0pO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuICBjb25zdCBkZWYgPSB7XG4gICAgc2hvdzogdHJ1ZSxcbiAgICB2YWx1ZTogbnVsbCxcbiAgICBsYWJlbDogXCLlhajpg6hcIlxuICB9IGFzIFRhYnNGaWx0ZXJEZWZhdWx0T3B0aW9uO1xuICByZXR1cm4gbWVyZ2UoZGVmLCBwcm9wcy5kZWZhdWx0T3B0aW9uIHx8IHt9KTtcbn0pO1xuXG5jb25zdCBfX0RFRkFVTFRfXyA9IFwiX2RlZmF1bHRfa2V5X1wiO1xuY29uc3QgYmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3QgdmFsdWUgPVxuICAgIHByb3BzLm1vZGVsVmFsdWUgPT0gbnVsbCB8fCBwcm9wcy5tb2RlbFZhbHVlID09PSBkZWZhdWx0T3B0aW9uLnZhbHVlLnZhbHVlID8gX19ERUZBVUxUX18gOiBwcm9wcy5tb2RlbFZhbHVlO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiY2FyZFwiLFxuICAgIC4uLmF0dHJzLFxuICAgIFt1aS50YWJzLm1vZGVsVmFsdWVdOiB2YWx1ZSxcbiAgICBbXCJvblVwZGF0ZTpcIiArIHVpLnRhYnMubW9kZWxWYWx1ZV06IG9uVXBkYXRlQWN0aXZlS2V5XG4gIH07XG59KTtcblxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFtcInVwZGF0ZTptb2RlbFZhbHVlXCIsIFwiY2hhbmdlXCJdKTtcblxuZnVuY3Rpb24gb25VcGRhdGVBY3RpdmVLZXkodmFsdWU6IGFueSkge1xuICBpZiAoX19ERUZBVUxUX18gPT09IHZhbHVlKSB7XG4gICAgdmFsdWUgPSBkZWZhdWx0T3B0aW9uLnZhbHVlLnZhbHVlO1xuICB9XG4gIGNvbnN0IG9sZFZhbHVlID0gcHJvcHMubW9kZWxWYWx1ZTtcbiAgZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgaWYgKG9sZFZhbHVlICE9PSB2YWx1ZSkge1xuICAgIGVtaXQoXCJjaGFuZ2VcIiwgdmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKG9wdGlvbjogVGFic0ZpbHRlck9wdGlvbikge1xuICByZXR1cm4gb3B0aW9uW3Byb3BzLnZhbHVlXTtcbn1cbmZ1bmN0aW9uIGdldExhYmVsKG9wdGlvbjogVGFic0ZpbHRlck9wdGlvbikge1xuICByZXR1cm4gb3B0aW9uW3Byb3BzLmxhYmVsXTtcbn1cblxuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy10YWJzLWZpbHRlciB7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIC8vd2lkdGg6IDEwMCU7XG4gIC5hbnQtdGFicyA+IC5hbnQtdGFicy1uYXYsXG4gIC5hbnQtdGFicyA+IGRpdiA+IC5hbnQtdGFicy1uYXYge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cblxuICAuZWwtdGFicy0tY2FyZCA+IC5lbC10YWJzX19oZWFkZXIge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cblxuICAubi10YWItcGFuZSB7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCBhcyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNJY29uU2VsZWN0b3JcIlxufSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWljb24tc2VsZWN0b3JcIj5cbiAgICA8Y29tcG9uZW50IDppcz1cInVpLmlucHV0Lm5hbWVcIiB2LWJpbmQ9XCJpbnB1dEJpbmRpbmdcIiBAY2xpY2s9XCJoYW5kbGVDbGlja1wiPlxuICAgICAgPHRlbXBsYXRlICNwcmVmaXg+XG4gICAgICAgIDxmcy1pY29uIHYtaWY9XCJtb2RlbFZhbHVlXCIgY2xhc3M9XCJmcy1pY29uLXNlbGVjdG9yLWlucHV0LXByZWZpeFwiIDppY29uPVwibW9kZWxWYWx1ZVwiPjwvZnMtaWNvbj5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9jb21wb25lbnQ+XG5cbiAgICA8ZGl2IHYtaWY9XCJkaWFsb2dPcGVuZWRcIiBjbGFzcz1cImZzLWljb24tc2VsZWN0b3ItZGlhbG9nXCI+XG4gICAgICA8Y29tcG9uZW50IDppcz1cInVpLmRpYWxvZy5uYW1lXCIgcHJlc2V0PVwiZGlhbG9nXCIgdi1iaW5kPVwiY29tcHV0ZWREaWFsb2dcIiA6Zm9vdGVyPVwibnVsbFwiPlxuICAgICAgICA8dGVtcGxhdGUgI1t1aS5kaWFsb2cudGl0bGVTbG90TmFtZV0+XG4gICAgICAgICAgPGZzLWljb24gaWNvbj1cImljb24tc2VsZWN0XCIgY2xhc3M9XCJtci0yXCI+PC9mcy1pY29uPlxuICAgICAgICAgIOmAieaLqeWbvuagh1xuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtaWNvbi1zZWxlY3Rvci1kaWFsb2ctY29udGVudCBtYi00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tdGFicy1ib3ggbXQtMTAgbWItMTBcIj5cbiAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkudGFicy5uYW1lXCIgdi1iaW5kPVwiY29tcHV0ZVRhYnNcIiB0eXBlPVwiY2FyZFwiPlxuICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLnRhYlBhbmUubmFtZVwiIGtleT1cImFsbFwiIDpbdWkudGFiUGFuZS5rZXldPVwiJ2FsbCdcIiA6W3VpLnRhYlBhbmUudGFiXT1cIiflhajpg6gnXCI+XG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICAgICAgOmlzPVwidWkudGFiUGFuZS5uYW1lXCJcbiAgICAgICAgICAgICAgICB2LWZvcj1cInNldCBvZiBpY29uU2V0c1wiXG4gICAgICAgICAgICAgICAgOmtleT1cInNldFwiXG4gICAgICAgICAgICAgICAgOlt1aS50YWJQYW5lLmtleV09XCJzZXRcIlxuICAgICAgICAgICAgICAgIDpbdWkudGFiUGFuZS50YWJdPVwic2V0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgIDwvY29tcG9uZW50PlxuXG4gICAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICAgIDppcz1cInVpLmlucHV0Lm5hbWVcIlxuICAgICAgICAgICAgICB2LW1vZGVsOlt1aS5pbnB1dC5tb2RlbFZhbHVlXT1cInNlYXJjaEtleVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWwtMlwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi5pCc57Si5Zu+5qCHLCDlj4zlh7vpgInmi6lcIlxuICAgICAgICAgICAgICBAa2V5ZG93bi5lbnRlcj1cImhhbmRsZVNlYXJjaFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjc3VmZml4PlxuICAgICAgICAgICAgICAgIDxmcy1idXR0b24gdHlwZT1cInByaW1hcnlcIiBzaXplPVwic21hbGxcIiA6aWNvbj1cInVpLmljb25zLnNlYXJjaFwiIEBjbGljaz1cImhhbmRsZVNlYXJjaFwiPjwvZnMtYnV0dG9uPlxuICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgPC9jb21wb25lbnQ+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgdi1mb3I9XCJpY29uIGluIHBhZ2VyLnJlY29yZHNcIlxuICAgICAgICAgICAgICAgICAgOmtleT1cImljb25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgOmNsYXNzPVwieyBhY3RpdmU6IGljb24gPT09IGN1cnJlbnQgfVwiXG4gICAgICAgICAgICAgICAgICA6dGl0bGU9XCJpY29uXCJcbiAgICAgICAgICAgICAgICAgIEBjbGljaz1cImhhbmRsZUljb25TZWxlY3QoaWNvbiwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgICAgIEBkYmxjbGljaz1cImhhbmRsZUljb25TZWxlY3QoaWNvbiwgdHJ1ZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxmcy1pY29uIDppY29uPVwiaWNvblwiIGNsYXNzPVwidGV4dC0yeGxcIj48L2ZzLWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkLW1vcmVcIj5cbiAgICAgICAgICAgICAgICA8ZnMtbG9hZGluZyB2LWlmPVwicGFnZXIubG9hZGluZ1wiIDpsb2FkaW5nPVwicGFnZXIubG9hZGluZ1wiIHRleHQ9XCLliqDovb3kuK1cIiAvPlxuICAgICAgICAgICAgICAgIDxkaXYgdi1lbHNlLWlmPVwicGFnZXIudG90YWwgPT0gbnVsbCB8fCBwYWdlci50b3RhbCA9PSAwXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2PuaaguaXoOaVsOaNrjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgdi1lbHNlLWlmPVwicGFnZXIudG90YWwgPiBwYWdlci5zdGFydCArIHBhZ2VyLmxpbWl0XCIgQGNsaWNrPVwibG9hZE1vcmVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+5Yqg6L295pu05aSaPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XG4gICAgICAgICAgICAgIDxmcy1idXR0b24gdHlwZT1cInByaW1hcnlcIiBAY2xpY2s9XCJvbkNvbmZpcm1cIj7noa7lrpo8L2ZzLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCIgc2V0dXA+XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCJAZmFzdC1jcnVkL3VpLWludGVyZmFjZVwiO1xuaW1wb3J0IHsgcmVmLCB1c2VBdHRycywgUmVmLCBjb21wdXRlZCB9IGZyb20gXCJ2dWVcIjtcblxuO1xuXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoW1widXBkYXRlOm1vZGVsVmFsdWVcIl0pO1xuY29uc3QgZGVmYXVsdExpbWl0ID0gMTM2O1xuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gIG1vZGVsVmFsdWU6IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgZGVmYXVsdDogXCJcIlxuICB9LFxuICBkaWFsb2c6IHtcbiAgICB0eXBlOiBPYmplY3QsXG4gICAgZGVmYXVsdDogKCkgPT4gKHt9KVxuICB9LFxuICB0YWJzOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICAgIGRlZmF1bHQ6ICgpID0+ICh7fSlcbiAgfSxcbiAgLy8g6ZmQ5Yi25q+P6aG15pi+56S65pWw6YePXG4gIGxpbWl0OiB7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGRlZmF1bHQ6IDEzNlxuICB9LFxuICBpY29uU2V0czoge1xuICAgIHR5cGU6IEFycmF5PHN0cmluZz4sXG4gICAgZGVmYXVsdDogKCkgPT4gW1wiY2FyYm9uXCIsIFwiaW9uXCIsIFwiYW50LWRlc2lnblwiLCBcImZhLXNvbGlkXCIsIFwiZmEtYnJhbmRzXCIsIFwiZmEtcmVndWxhclwiLCBcIm1kaVwiXVxuICB9LFxuICBhcGlQcm92aWRlcjoge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgICBkZWZhdWx0OiBcImh0dHBzOi8vYXBpLmljb25pZnkuZGVzaWduXCJcbiAgfVxufSk7XG5jb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuXG5jb25zdCBkaWFsb2dPcGVuZWQgPSByZWYoZmFsc2UpO1xuY29uc3QgY29tcHV0ZWREaWFsb2cgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IDEwMjQsXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiBcIjEwMjRweFwiXG4gICAgfSxcbiAgICAuLi5wcm9wcy5kaWFsb2csXG4gICAgW3VpLmRpYWxvZy52aXNpYmxlXTogZGlhbG9nT3BlbmVkLnZhbHVlLFxuICAgIFtgb25VcGRhdGU6JHt1aS5kaWFsb2cudmlzaWJsZX1gXTogKHZhbDogYm9vbGVhbikgPT4ge1xuICAgICAgZGlhbG9nT3BlbmVkLnZhbHVlID0gdmFsO1xuICAgIH1cbiAgfTtcbn0pO1xuXG5jb25zdCBmb3JtSXRlbUNvbnRleHQgPSB1aS5mb3JtSXRlbS5pbmplY3RGb3JtSXRlbUNvbnRleHQoKTtcbmNvbnN0IGlucHV0QmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5hdHRycyxcbiAgICBbdWkuaW5wdXQubW9kZWxWYWx1ZV06IHByb3BzLm1vZGVsVmFsdWUsXG4gICAgW2BvblVwZGF0ZToke3VpLmlucHV0Lm1vZGVsVmFsdWV9YF06ICh2YWw6IHN0cmluZykgPT4ge1xuICAgICAgZW1pdENoYW5nZSh2YWwpO1xuICAgIH1cbiAgfTtcbn0pO1xuXG5jb25zdCBlbWl0Q2hhbmdlID0gKHZhbDogc3RyaW5nKSA9PiB7XG4gIGVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCB2YWwpO1xuICBmb3JtSXRlbUNvbnRleHQ/Lm9uQ2hhbmdlKCk7XG59O1xuXG5jb25zdCBoYW5kbGVDbGljayA9ICgpID0+IHtcbiAgZGlhbG9nT3BlbmVkLnZhbHVlID0gdHJ1ZTtcbiAgaWYgKHByb3BzLmljb25TZXRzLmxlbmd0aCA+IDAgJiYgcGFnZXIudmFsdWUucmVjb3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICBvblRhYkNoYW5nZShwcm9wcy5pY29uU2V0c1swXSBhcyBzdHJpbmcpO1xuICB9XG59O1xuXG5jb25zdCBhdHRycyA9IHVzZUF0dHJzKCk7XG5cbmNvbnN0IGFwaSA9IHtcbiAgYXN5bmMgZ2V0Q29sbGVjdGlvbnMoKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMuYXBpUHJvdmlkZXJ9L2NvbGxlY3Rpb25zYCk7XG4gICAgcmV0dXJuIGF3YWl0IHJlcy5qc29uKCk7XG4gIH0sXG4gIGFzeW5jIGdldEljb25zKHByZWZpeDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMuYXBpUHJvdmlkZXJ9L2NvbGxlY3Rpb24/cHJlZml4PSR7cHJlZml4fWApO1xuICAgIHJldHVybiBhd2FpdCByZXMuanNvbigpO1xuICB9LFxuICBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZywgcGFnZXI6IGFueSkge1xuICAgIGNvbnN0IHN0YXJ0ID0gcGFnZXIuc3RhcnQgPz8gMDtcbiAgICBjb25zdCBsaW1pdCA9IHBhZ2VyLmxpbWl0ID8/IDUwO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3Byb3BzLmFwaVByb3ZpZGVyfS9zZWFyY2g/cXVlcnk9JHtxdWVyeX0mc3RhcnQ9JHtzdGFydH0mbGltaXQ9JHtsaW1pdH1gKTtcbiAgICByZXR1cm4gYXdhaXQgcmVzLmpzb24oKTtcbiAgfVxufTtcblxuY29uc3QgaWNvblN0b3JlOiBSZWYgPSByZWYoe30pO1xuXG5jb25zdCBsb2FkSWNvblNldCA9IGFzeW5jIChwcmVmaXg6IHN0cmluZykgPT4ge1xuICBsZXQgc2V0cyA9IGljb25TdG9yZS52YWx1ZVtwcmVmaXhdO1xuICBpZiAoIXNldHMpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkuZ2V0SWNvbnMocHJlZml4KTtcbiAgICBjb25zdCB1bmNhdGVnb3JpZXMgPSByZXMudW5jYXRlZ29yaXplZCA/PyBbXTtcbiAgICBjb25zdCBjYXRlZ29yaWVzID0gcmVzLmNhdGVnb3JpZXMgPz8gW107XG4gICAgc2V0cyA9IHVuY2F0ZWdvcmllcztcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjYXRlZ29yaWVzKSB7XG4gICAgICBzZXRzID0gc2V0cy5jb25jYXQoY2F0ZWdvcmllc1trZXldKTtcbiAgICB9XG4gICAgc2V0cyA9IHNldHMubWFwKChpdGVtOiBhbnkpID0+IGAke3ByZWZpeH06JHtpdGVtfWApO1xuICAgIGljb25TdG9yZS52YWx1ZVtwcmVmaXhdID0gc2V0cztcbiAgfVxuICByZXR1cm4gc2V0cztcbn07XG5cbmNvbnN0IHNlYXJjaEtleSA9IHJlZihcIlwiKTtcbmNvbnN0IHRhYktleSA9IHJlZihcImFsbFwiKTtcbmNvbnN0IG9uVGFiQ2hhbmdlID0gKGtleTogc3RyaW5nKSA9PiB7XG4gIHRhYktleS52YWx1ZSA9IGtleTtcbiAgc2VhcmNoS2V5LnZhbHVlID0gXCJcIjtcbiAgcmVzZXRQYWdlcigpO1xuICBoYW5kbGVTZWFyY2goKTtcbn07XG5cbmNvbnN0IHJlc2V0UGFnZXIgPSAoKSA9PiB7XG4gIHBhZ2VyLnZhbHVlLnN0YXJ0ID0gMDtcbiAgcGFnZXIudmFsdWUucmVjb3JkcyA9IFtdO1xuICBwYWdlci52YWx1ZS50b3RhbCA9IDA7XG4gIHBhZ2VyLnZhbHVlLmxpbWl0ID0gcHJvcHMubGltaXQgPz8gZGVmYXVsdExpbWl0O1xufTtcblxuY29uc3QgcGFnZXIgPSByZWYoe1xuICBsb2FkaW5nOiBmYWxzZSxcbiAgc3RhcnQ6IDAsXG4gIGxpbWl0OiBwcm9wcy5saW1pdCA/PyBkZWZhdWx0TGltaXQsXG4gIHRvdGFsOiBudWxsLFxuICBxdWVyeTogXCJcIixcbiAgcmVjb3JkczogW11cbn0pO1xuXG5jb25zdCBoYW5kbGVTZWFyY2ggPSBhc3luYyAoKSA9PiB7XG4gIGlmIChwYWdlci52YWx1ZS5sb2FkaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwYWdlci52YWx1ZS5xdWVyeSAhPT0gc2VhcmNoS2V5LnZhbHVlKSB7XG4gICAgLy/ph43nva5zdGFydFxuICAgIHJlc2V0UGFnZXIoKTtcbiAgfVxuXG4gIHBhZ2VyLnZhbHVlLmxvYWRpbmcgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGRvU2VhcmNoKCk7XG4gICAgcGFnZXIudmFsdWUucmVjb3JkcyA9IHBhZ2VyLnZhbHVlLnJlY29yZHMuY29uY2F0KHJlcy5pY29ucyk7XG4gICAgcGFnZXIudmFsdWUudG90YWwgPSByZXMudG90YWw7XG4gICAgcGFnZXIudmFsdWUubGltaXQgPSByZXMubGltaXQ7XG4gICAgcGFnZXIudmFsdWUucXVlcnkgPSBzZWFyY2hLZXkudmFsdWU7XG4gIH0gZmluYWxseSB7XG4gICAgcGFnZXIudmFsdWUubG9hZGluZyA9IGZhbHNlO1xuICB9XG59O1xuXG5hc3luYyBmdW5jdGlvbiBkb1NlYXJjaCgpIHtcbiAgaWYgKHRhYktleS52YWx1ZSA9PT0gXCJhbGxcIikge1xuICAgIGlmICghc2VhcmNoS2V5LnZhbHVlKSB7XG4gICAgICB1aS5ub3RpZmljYXRpb24ud2FybihcIuivt+i+k+WFpeaQnOe0ouWFs+mUruWtl1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGFwaS5zZWFyY2goc2VhcmNoS2V5LnZhbHVlLCBwYWdlci52YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGF3YWl0IGdldFBhZ2VyRnJvbUljb25TZXQodGFiS2V5LnZhbHVlKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQYWdlckZyb21JY29uU2V0KHByZWZpeDogc3RyaW5nKSB7XG4gIGNvbnN0IGljb25zID0gYXdhaXQgbG9hZEljb25TZXQocHJlZml4KTtcbiAgbGV0IGZpbHRlcnMgPSBpY29ucztcbiAgaWYgKHNlYXJjaEtleS52YWx1ZSkge1xuICAgIGZpbHRlcnMgPSBpY29ucy5maWx0ZXIoKGljb246IHN0cmluZykgPT4gaWNvbi5pbmNsdWRlcyhzZWFyY2hLZXkudmFsdWUpKTtcbiAgfVxuICBsZXQgZW5kID0gcGFnZXIudmFsdWUuc3RhcnQgKyBwYWdlci52YWx1ZS5saW1pdDtcbiAgaWYgKGVuZCA+IGZpbHRlcnMubGVuZ3RoKSB7XG4gICAgZW5kID0gZmlsdGVycy5sZW5ndGg7XG4gIH1cbiAgY29uc3QgcGFnZXJJY29ucyA9IGZpbHRlcnMuc2xpY2UocGFnZXIudmFsdWUuc3RhcnQsIGVuZCk7XG4gIHJldHVybiB7XG4gICAgaWNvbnM6IHBhZ2VySWNvbnMsXG4gICAgdG90YWw6IGZpbHRlcnMubGVuZ3RoLFxuICAgIGxpbWl0OiBwYWdlci52YWx1ZS5saW1pdCxcbiAgICBzdGFydDogcGFnZXIudmFsdWUuc3RhcnRcbiAgfTtcbn1cblxuY29uc3QgY3VycmVudCA9IHJlZihwcm9wcy5tb2RlbFZhbHVlKTtcbmNvbnN0IGhhbmRsZUljb25TZWxlY3QgPSAoaWNvbjogc3RyaW5nLCBjb25maXJtID0gZmFsc2UpID0+IHtcbiAgY3VycmVudC52YWx1ZSA9IGljb247XG4gIGlmIChjb25maXJtKSB7XG4gICAgb25Db25maXJtKCk7XG4gIH1cbn07XG5cbmNvbnN0IG9uQ29uZmlybSA9ICgpID0+IHtcbiAgZGlhbG9nT3BlbmVkLnZhbHVlID0gZmFsc2U7XG4gIGVtaXRDaGFuZ2UoY3VycmVudC52YWx1ZSk7XG59O1xuXG5jb25zdCBsb2FkTW9yZSA9IGFzeW5jICgpID0+IHtcbiAgcGFnZXIudmFsdWUuc3RhcnQgKz0gcGFnZXIudmFsdWUubGltaXQ7XG4gIGF3YWl0IGhhbmRsZVNlYXJjaCgpO1xufTtcblxuY29uc3QgY29tcHV0ZVRhYnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4ucHJvcHMudGFicyxcbiAgICBbdWkudGFicy5tb2RlbFZhbHVlXTogdGFiS2V5LnZhbHVlLFxuICAgIFtgb25VcGRhdGU6JHt1aS50YWJzLm1vZGVsVmFsdWV9YF06IG9uVGFiQ2hhbmdlXG4gIH07XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtaWNvbi1zZWxlY3RvciB7XG4gIC5mcy1pY29uLXNlbGVjdG9yLWlucHV0LXByZWZpeCB7XG4gICAgZm9udC1zaXplOiAxOHB4O1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICB9XG59XG4uZnMtaWNvbi1zZWxlY3Rvci1kaWFsb2ctY29udGVudCB7XG4gIC5pY29uLXRhYnMtYm94IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgbWluLWhlaWdodDogNTAwcHg7XG4gICAgbWF4LWhlaWdodDogNjB2aDtcblxuICAgIC5sb2FkLW1vcmUge1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZm9vdGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGVuZDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgIH1cbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC5pY29uLWNvbnRhaW5lciB7XG4gICAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgICAgZmxleDogMTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAgIC5pY29uLWxpc3Qge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgICAuaWNvbi1pdGVtIHtcbiAgICAgICAgICB3aWR0aDogNTBweDtcbiAgICAgICAgICBoZWlnaHQ6IDUwcHg7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgICAgICBtYXJnaW46IDJweDtcbiAgICAgICAgICAmLmFjdGl2ZSB7XG4gICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjNDA5ZWZmO1xuICAgICAgICAgIH1cbiAgICAgICAgICAmOmhvdmVyIHtcbiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM2Y2IzZjg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC5mcy1pY29uIHtcbiAgICAgICAgICBmb250LXNpemU6IDMwcHg7XG4gICAgICAgICAgbWF4LXdpZHRoOiA5NiU7XG4gICAgICAgICAgbWF4LWhlaWdodDogOTYlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50IDppcz1cInVpLnJhZGlvR3JvdXAubmFtZVwiIEBjaGFuZ2U9XCJvblNlbGVjdGVkQ2hhbmdlXCI+XG4gICAgPGNvbXBvbmVudFxuICAgICAgOmlzPVwiY29tcHV0ZWRSYWRpb05hbWVcIlxuICAgICAgdi1mb3I9XCJpdGVtIG9mIGNvbXB1dGVkT3B0aW9uc1wiXG4gICAgICByZWY9XCJyYWRpb1JlZlwiXG4gICAgICA6a2V5PVwiZ2V0VmFsdWUoaXRlbSlcIlxuICAgICAgOlt1aS5yYWRpby52YWx1ZV09XCJnZXRWYWx1ZShpdGVtKVwiXG4gICAgICB2LWJpbmQ9XCJvcHRpb25Qcm9wc1wiXG4gICAgPlxuICAgICAge3sgZ2V0TGFiZWwoaXRlbSkgfX1cbiAgICA8L2NvbXBvbmVudD5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XG5pbXBvcnQgeyB1aUNvbnRleHQgfSBmcm9tIFwiLi4vLi4vdWlcIjtcbmltcG9ydCB7IHJlZiwgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuLyoqXG4gKiDlrZflhbjljZXpgInmoYZcbiAqIOaUr+aMgWVsLXJhZGlvLWdyb3VwfGEtcmFkaW8tZ3JvdXDnmoTlj4LmlbBcbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNEaWN0UmFkaW9cIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDmlbDmja7lrZflhbjphY3nva5cbiAgICAgKi9cbiAgICBkaWN0OiB7fSxcbiAgICAvKipcbiAgICAgKiDlj6/pgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5IH0sXG5cbiAgICAvKipcbiAgICAgKiByYWRpb+e7hOS7tuWQjeensFxuICAgICAqIGFudGR25L2/55SoYnV0dG9u5qC35byP55qE5pe25YCZ5pyJ55SoXG4gICAgICog5Y2z5bCG5bqf5byDLOivt+S9v+eUqG9wdGlvbk5hbWVcbiAgICAgKi9cbiAgICByYWRpb05hbWU6IHt9LFxuXG4gICAgLyoqXG4gICAgICog6YCJ6aG555qE57uE5Lu25ZCN56ewXG4gICAgICovXG4gICAgb3B0aW9uTmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOmAiemhueeahOWxnuaAp1xuICAgICAqL1xuICAgIG9wdGlvblByb3BzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDovazmjaJEaWN0RGF0YVxuICAgICAqL1xuICAgIHRyYW5zZm9ybURpY3REYXRhOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcbiAgICAvKipcbiAgICAgKiDlrZflhbjmlbDmja7lj5jljJbkuovku7ZcbiAgICAgKi9cbiAgICBcImRpY3QtY2hhbmdlXCIsXG5cbiAgICAvKipcbiAgICAgKiDpgInkuK3lgLzlj5jljJbkuovku7bvvIzlj6/ku6Xojrflj5bliLDlvZPliY3pgInkuK3nmoRvcHRpb27lr7nosaFcbiAgICAgKi9cbiAgICBcInNlbGVjdGVkLWNoYW5nZVwiLFxuICAgIC8qKlxuICAgICAqIOWAvOWPmOWMluS6i+S7tlxuICAgICAqL1xuICAgIFwiY2hhbmdlXCJcbiAgXSxcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4OiBhbnkpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuXG4gICAgaWYgKHByb3BzLnJhZGlvTmFtZSkge1xuICAgICAgY29uc29sZS53YXJuKFwi5Y+C5pWwcmFkaW9OYW1l5Y2z5bCG5bqf5byD77yM6K+35pS55oiQb3B0aW9uTmFtZVwiKTtcbiAgICB9XG4gICAgY29uc3QgY29tcHV0ZWRSYWRpb05hbWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMub3B0aW9uTmFtZSA/PyBwcm9wcy5yYWRpb05hbWUgPz8gdWkucmFkaW8ubmFtZTtcbiAgICB9KTtcblxuICAgIGxldCB1c2VkRGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCwgdWkucmFkaW9Hcm91cC5tb2RlbFZhbHVlKTtcbiAgICBjb25zdCBjb21wdXRlZE9wdGlvbnMgPSB1c2VkRGljdC5jcmVhdGVDb21wdXRlZE9wdGlvbnMoKTtcblxuICAgIGNvbnN0IG9uU2VsZWN0ZWRDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgY3R4LmVtaXQoXCJjaGFuZ2VcIiwgdmFsdWUpO1xuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRhcmdldCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRhcmdldC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XG4gICAgICBpZiAoZGljdCAmJiBkaWN0LmRhdGFNYXAgJiYgZGljdC5kYXRhTWFwW3ZhbHVlXSkge1xuICAgICAgICBjb25zdCBvcHQgPSBkaWN0LmRhdGFNYXBbdmFsdWVdO1xuICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBvcHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIGNvbXB1dGVkUmFkaW9OYW1lLFxuICAgICAgLi4udXNlZERpY3QsXG4gICAgICBjb21wdXRlZE9wdGlvbnMsXG4gICAgICBvblNlbGVjdGVkQ2hhbmdlXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yYWRpb0dyb3VwLm5hbWVcIiBAY2hhbmdlPVwib25TZWxlY3RlZENoYW5nZVwiPlxuICAgIDxjb21wb25lbnRcbiAgICAgIDppcz1cImNvbXB1dGVkUmFkaW9OYW1lXCJcbiAgICAgIHYtZm9yPVwiaXRlbSBvZiBjb21wdXRlZE9wdGlvbnNcIlxuICAgICAgcmVmPVwicmFkaW9SZWZcIlxuICAgICAgOmtleT1cImdldFZhbHVlKGl0ZW0pXCJcbiAgICAgIDpbdWkucmFkaW8udmFsdWVdPVwiZ2V0VmFsdWUoaXRlbSlcIlxuICAgICAgdi1iaW5kPVwib3B0aW9uUHJvcHNcIlxuICAgID5cbiAgICAgIHt7IGdldExhYmVsKGl0ZW0pIH19XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyB1c2VEaWN0IH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtZGljdFwiO1xuaW1wb3J0IHsgdWlDb250ZXh0IH0gZnJvbSBcIi4uLy4uL3VpXCI7XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbi8qKlxuICog5a2X5YW45Y2V6YCJ5qGGXG4gKiDmlK/mjIFlbC1yYWRpby1ncm91cHxhLXJhZGlvLWdyb3Vw55qE5Y+C5pWwXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRGljdFJhZGlvXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5pWw5o2u5a2X5YW46YWN572uXG4gICAgICovXG4gICAgZGljdDoge30sXG4gICAgLyoqXG4gICAgICog5Y+v6YCJ6aG577yM5q+UZGljdC5kYXRh5LyY5YWI57qn6auYXG4gICAgICovXG4gICAgb3B0aW9uczogeyB0eXBlOiBBcnJheSB9LFxuXG4gICAgLyoqXG4gICAgICogcmFkaW/nu4Tku7blkI3np7BcbiAgICAgKiBhbnRkduS9v+eUqGJ1dHRvbuagt+W8j+eahOaXtuWAmeacieeUqFxuICAgICAqIOWNs+WwhuW6n+W8gyzor7fkvb/nlKhvcHRpb25OYW1lXG4gICAgICovXG4gICAgcmFkaW9OYW1lOiB7fSxcblxuICAgIC8qKlxuICAgICAqIOmAiemhueeahOe7hOS7tuWQjeensFxuICAgICAqL1xuICAgIG9wdGlvbk5hbWU6IHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDpgInpobnnmoTlsZ7mgKdcbiAgICAgKi9cbiAgICBvcHRpb25Qcm9wczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6L2s5o2iRGljdERhdGFcbiAgICAgKi9cbiAgICB0cmFuc2Zvcm1EaWN0RGF0YToge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXG4gICAgLyoqXG4gICAgICog5a2X5YW45pWw5o2u5Y+Y5YyW5LqL5Lu2XG4gICAgICovXG4gICAgXCJkaWN0LWNoYW5nZVwiLFxuXG4gICAgLyoqXG4gICAgICog6YCJ5Lit5YC85Y+Y5YyW5LqL5Lu277yM5Y+v5Lul6I635Y+W5Yiw5b2T5YmN6YCJ5Lit55qEb3B0aW9u5a+56LGhXG4gICAgICovXG4gICAgXCJzZWxlY3RlZC1jaGFuZ2VcIixcbiAgICAvKipcbiAgICAgKiDlgLzlj5jljJbkuovku7ZcbiAgICAgKi9cbiAgICBcImNoYW5nZVwiXG4gIF0sXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eDogYW55KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcblxuICAgIGlmIChwcm9wcy5yYWRpb05hbWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIuWPguaVsHJhZGlvTmFtZeWNs+WwhuW6n+W8g++8jOivt+aUueaIkG9wdGlvbk5hbWVcIik7XG4gICAgfVxuICAgIGNvbnN0IGNvbXB1dGVkUmFkaW9OYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLm9wdGlvbk5hbWUgPz8gcHJvcHMucmFkaW9OYW1lID8/IHVpLnJhZGlvLm5hbWU7XG4gICAgfSk7XG5cbiAgICBsZXQgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgsIHVpLnJhZGlvR3JvdXAubW9kZWxWYWx1ZSk7XG4gICAgY29uc3QgY29tcHV0ZWRPcHRpb25zID0gdXNlZERpY3QuY3JlYXRlQ29tcHV0ZWRPcHRpb25zKCk7XG5cbiAgICBjb25zdCBvblNlbGVjdGVkQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcbiAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50YXJnZXQpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50YXJnZXQudmFsdWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xuICAgICAgaWYgKGRpY3QgJiYgZGljdC5kYXRhTWFwICYmIGRpY3QuZGF0YU1hcFt2YWx1ZV0pIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gZGljdC5kYXRhTWFwW3ZhbHVlXTtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgb3B0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIG51bGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICBjb21wdXRlZFJhZGlvTmFtZSxcbiAgICAgIC4uLnVzZWREaWN0LFxuICAgICAgY29tcHV0ZWRPcHRpb25zLFxuICAgICAgb25TZWxlY3RlZENoYW5nZVxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG4iLCI8c2NyaXB0IGxhbmc9XCJ0c3hcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCBhcyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNEaWN0U2VsZWN0XCJcbn0pO1xuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG4gIDxyZW5kZXI+PC9yZW5kZXI+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHN4XCIgc2V0dXA+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCByZWYsIHJlc29sdmVEeW5hbWljQ29tcG9uZW50LCB1c2VBdHRycyB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5cbi8qKlxuICog5a2X5YW46YCJ5oup5qGGXG4gKiDmlK/mjIFlbC1zZWxlY3R8YS1zZWxlY3TnmoTlsZ7mgKfphY3nva5cbiAqL1xuXG47XG5cbnR5cGUgUHJvcHNUeXBlID0ge1xuICAvKipcbiAgICog5a2X5YW4XG4gICAqL1xuICBkaWN0PzogYW55O1xuICAvKipcbiAgICog5Y+v6YCJ6aG577yM5q+UZGljdC5kYXRh5LyY5YWI57qn6auYXG4gICAqL1xuICBvcHRpb25zPzogYW55W107XG5cbiAgLyoqXG4gICAqIHNlbGVjdOe7hOS7tueahOaPkuanvVxuICAgKi9cbiAgc2xvdHM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIOiHquWumuS5iWxhYmVs55qEcmVuZGVy5pa55rOVXG4gICAqL1xuICByZW5kZXJMYWJlbD86IChpdGVtOiBhbnkpID0+IGFueTtcbiAgLyoqXG4gICAqIOi9rOaNokRpY3REYXRhXG4gICAqL1xuICB0cmFuc2Zvcm1EaWN0RGF0YT86IChpdGVtOiBhbnkpID0+IGFueTtcbn07XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8UHJvcHNUeXBlPigpO1xuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFtcImRpY3QtY2hhbmdlXCIsIFwic2VsZWN0ZWQtY2hhbmdlXCIsIFwiY2hhbmdlXCJdKTtcblxuY29uc3Qgc2VsZWN0UmVmID0gcmVmKCk7XG5jb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcbmNvbnN0IGNvbXB1dGVkUGxhY2Vob2xkZXIgPSBjb21wdXRlZCgoKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHByb3BzLnBsYWNlaG9sZGVyIHx8IHQoXCJmcy5jb21wb25lbnQuc2VsZWN0LnBsYWNlaG9sZGVyXCIpO1xufSk7XG5cbmNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG5jb25zdCBhdHRycyA9IHVzZUF0dHJzKCk7XG5jb25zdCBjdHggPSB7XG4gIGVtaXQsXG4gIGF0dHJzXG59O1xuY29uc3QgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgsIHVpLnNlbGVjdC5tb2RlbFZhbHVlKTtcbmNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IHVzZWREaWN0LmNyZWF0ZUNvbXB1dGVkT3B0aW9ucygpO1xuXG5jb25zdCBvblNlbGVjdGVkQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XG4gIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XG4gIC8v5aaC5p6c5piv5pWw57uEXG4gIGlmICh2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgb3B0cyA9IFtdO1xuICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZSkge1xuICAgICAgaWYgKGRpY3QgJiYgZGljdC5kYXRhTWFwICYmIGRpY3QuZGF0YU1hcFt2XSkge1xuICAgICAgICBvcHRzLnB1c2goZGljdC5kYXRhTWFwW3ZdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBvcHRzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZGljdCAmJiBkaWN0LmRhdGFNYXAgJiYgZGljdC5kYXRhTWFwW3ZhbHVlXSkge1xuICAgIGNvbnN0IG9wdCA9IGRpY3QuZGF0YU1hcFt2YWx1ZV07XG4gICAgZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBvcHQpO1xuICB9IGVsc2Uge1xuICAgIGVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgbnVsbCk7XG4gIH1cbn07XG5cbmNvbnN0IHRlbXBTbG90cyA9IGRlZmluZVNsb3RzKCk7XG5cbmRlZmluZUV4cG9zZSh7XG4gIHNlbGVjdFJlZixcbiAgY29tcHV0ZWRQbGFjZWhvbGRlcixcbiAgLi4udXNlZERpY3QsXG4gIGNvbXB1dGVkT3B0aW9ucyxcbiAgb25TZWxlY3RlZENoYW5nZVxufSk7XG5cbmNvbnN0IHJlbmRlciA9ICgpID0+IHtcbiAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgY29uc3Qgc2VsZWN0Q29tcCA9IHJlc29sdmVEeW5hbWljQ29tcG9uZW50KHVpLnNlbGVjdC5uYW1lKTtcbiAgY29uc3Qgdk1vZGVsID0gdWkuc2VsZWN0Lm1vZGVsVmFsdWU7XG4gIGlmICh1aS5vcHRpb24ubmFtZSA9PSBudWxsKSB7XG4gICAgLy9uYWl2ZSB1aVxuICAgIC8v5Lulb3B0aW9uc+WPguaVsOS9nOS4um9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zID0gY29tcHV0ZWRPcHRpb25zLnZhbHVlIHx8IFtdO1xuICAgIGNvbnN0IGJpbmRpbmc6IGFueSA9IHtcbiAgICAgIFtgb25VcGRhdGU6JHt2TW9kZWx9YF06ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLiRlbWl0KGBvblVwZGF0ZToke3ZNb2RlbH1gLCB2YWx1ZSk7XG4gICAgICAgIG9uU2VsZWN0ZWRDaGFuZ2UodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIC4uLmF0dHJzXG4gICAgfTtcbiAgICBjb25zdCB0aGlzU2xvdHMgPSB7XG4gICAgICAuLi50ZW1wU2xvdHMsXG4gICAgICAuLi5wcm9wcy5zbG90c1xuICAgIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxzZWxlY3RDb21wXG4gICAgICAgIHJlZj17XCJzZWxlY3RSZWZcIn1cbiAgICAgICAgcGxhY2Vob2xkZXI9e2NvbXB1dGVkUGxhY2Vob2xkZXIudmFsdWV9XG4gICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgIHJlbmRlckxhYmVsPXtwcm9wcy5yZW5kZXJMYWJlbH1cbiAgICAgICAgdi1zbG90cz17dGhpc1Nsb3RzfVxuICAgICAgICB7Li4uYmluZGluZ31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuICAvLyBvcHRpb25zIOS4uuWtkOe7hOS7tlxuICBjb25zdCBvcHRpb25zID0gW107XG4gIGNvbnN0IG9wdGlvbkNvbXAgPSByZXNvbHZlRHluYW1pY0NvbXBvbmVudCh1aS5vcHRpb24ubmFtZSk7XG4gIGNvbnN0IGNvcyA9IGNvbXB1dGVkT3B0aW9ucy52YWx1ZSB8fCBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGNvcykge1xuICAgIGNvbnN0IG9wdGlvbiA9IChcbiAgICAgIDxvcHRpb25Db21wIHsuLi5pdGVtfSB2YWx1ZT17dXNlZERpY3QuZ2V0VmFsdWUoaXRlbSl9IGxhYmVsPXt1c2VkRGljdC5nZXRMYWJlbChpdGVtKX0+XG4gICAgICAgIHtwcm9wcy5yZW5kZXJMYWJlbCA/IHByb3BzLnJlbmRlckxhYmVsKGl0ZW0pIDogdXNlZERpY3QuZ2V0TGFiZWwoaXRlbSl9XG4gICAgICA8L29wdGlvbkNvbXA+XG4gICAgKTtcbiAgICBvcHRpb25zLnB1c2gob3B0aW9uKTtcbiAgfVxuICBjb25zdCB0aGlzU2xvdHMgPSB7XG4gICAgZGVmYXVsdDogKCkgPT4gb3B0aW9ucyxcbiAgICAuLi50ZW1wU2xvdHMsXG4gICAgLi4ucHJvcHMuc2xvdHNcbiAgfTtcbiAgcmV0dXJuIChcbiAgICA8c2VsZWN0Q29tcFxuICAgICAgcmVmPXtcInNlbGVjdFJlZlwifVxuICAgICAgcGxhY2Vob2xkZXI9e2NvbXB1dGVkUGxhY2Vob2xkZXIudmFsdWV9XG4gICAgICB2LXNsb3RzPXt0aGlzU2xvdHN9XG4gICAgICBvbkNoYW5nZT17b25TZWxlY3RlZENoYW5nZX1cbiAgICAgIHsuLi5hdHRyc31cbiAgICAvPlxuICApO1xufTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uYW50LXNlbGVjdC1tdWx0aXBsZSB7XG4gIG1pbi13aWR0aDogMTAwcHg7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8c3BhbiBjbGFzcz1cImZzLXZhbHVlcy1mb3JtYXRcIj5cbiAgICA8dGVtcGxhdGUgdi1pZj1cIml0ZW1SZW5kZXJcIj5cbiAgICAgIDxmcy1yZW5kZXIgdi1mb3I9XCJpdGVtIGluIGNvbXB1dGVkVmFsdWVJdGVtc1wiIDprZXk9XCJnZXRWYWx1ZShpdGVtKVwiIDpyZW5kZXItZnVuYz1cIml0ZW1SZW5kZXJcIiA6c2NvcGU9XCJpdGVtXCIgLz5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJ0eXBlID09PSAndGV4dCdcIj5cbiAgICAgIDxzcGFuIHYtZm9yPVwiaXRlbSBpbiBjb21wdXRlZFZhbHVlSXRlbXNcIiA6a2V5PVwiZ2V0VmFsdWUoaXRlbSlcIiBAY2xpY2s9XCJkb0NsaWNrKGl0ZW0pXCI+e3sgZ2V0TGFiZWwoaXRlbSkgfX08L3NwYW4+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgdi1lbHNlPlxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjb21wdXRlZFZhbHVlSXRlbXNcIiA6a2V5PVwiZ2V0VmFsdWUoaXRlbSlcIj5cbiAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgIDppcz1cInVpLnRhZy5uYW1lXCJcbiAgICAgICAgICBjbGFzcz1cImZzLXRhZ1wiXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICA6Y2xvc2FibGU9XCJjbG9zYWJsZVwiXG4gICAgICAgICAgdi1iaW5kPVwiaXRlbVwiXG4gICAgICAgICAgOmljb249XCJudWxsXCJcbiAgICAgICAgICA6bmFtZT1cIm51bGxcIlxuICAgICAgICAgIEBjbG9zZT1cImRvQ2xvc2UoaW5kZXgsIGl0ZW0pXCJcbiAgICAgICAgICBAY2xpY2s9XCJkb0NsaWNrKGl0ZW0pXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXRlbS5pY29uXCI+XG4gICAgICAgICAgICA8ZnMtaWNvbiA6aWNvbj1cIml0ZW0uaWNvblwiIDpzcGluPVwiaXRlbS5pY29uU3BpblwiIGNsYXNzPVwiZnMtdGFnLWljb25cIiAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAge3sgZ2V0TGFiZWwoaXRlbSkgfX1cbiAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvc3Bhbj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBmb3JFYWNoLCBvbWl0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgUmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuZnVuY3Rpb24gZ2V0SGFzaENvZGUoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ciA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICBzdHIgPSBKU09OLnN0cmluZ2lmeShzdHIpO1xuICB9XG4gIGxldCBoYXNoID0gMDtcbiAgbGV0IGk7XG4gIGxldCBjaHI7XG4gIGxldCBsZW47XG4gIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gaGFzaDtcbiAgZm9yIChpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY2hyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIGNocjtcbiAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG4gIHJldHVybiBNYXRoLmFicyhoYXNoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBcnJheVZhbHVlKHByb3BzOiBhbnkpIHtcbiAgbGV0IHZhbHVlQXJyID0gW107XG4gIGlmICh0eXBlb2YgcHJvcHMubW9kZWxWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBwcm9wcy5tdWx0aXBsZSAmJiBwcm9wcy5zZXBhcmF0b3IgIT0gbnVsbCAmJiBwcm9wcy5zZXBhcmF0b3IgIT09IFwiXCIpIHtcbiAgICB2YWx1ZUFyciA9IHByb3BzLm1vZGVsVmFsdWUuc3BsaXQocHJvcHMuc2VwYXJhdG9yKTtcbiAgfSBlbHNlIGlmIChwcm9wcy5tb2RlbFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAvLyDmnKzmnaXlsLHmmK/mlbDnu4TnmoRcbiAgICB2YWx1ZUFyciA9IHByb3BzLm1vZGVsVmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWVBcnIgPSBbcHJvcHMubW9kZWxWYWx1ZV07XG4gIH1cbiAgcmV0dXJuIHZhbHVlQXJyO1xufVxuXG4vKipcbiAqIHZhbHVl5qC85byP5YyW5bGV56S657uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNWYWx1ZXNGb3JtYXRcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDlgLxcbiAgICAgKi9cbiAgICBtb2RlbFZhbHVlOiB7fSxcbiAgICAvKipcbiAgICAgKiDlrZflhbjphY3nva5cbiAgICAgKi9cbiAgICBkaWN0OiB7fSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKblpJrpgIlcbiAgICAgKi9cbiAgICBtdWx0aXBsZTogeyBkZWZhdWx0OiB0cnVlIH0sXG4gICAgLyoqXG4gICAgICog5YiG6ZqU56ymPGJyLz5cbiAgICAgKiDlpJrpgInml7bvvIzlpoLmnpx2YWx1ZeS4unN0cmluZ++8jOWImeS7peivpeWIhumalOespuWIhuWJsuaIkOWkmuS4quWxleekujxici8+XG4gICAgICog5Lyg5YWl56m65a2X56ym5Liy77yM6KGo56S65LiN5YiG5YmyPGJyLz5cbiAgICAgKi9cbiAgICBzZXBhcmF0b3I6IHsgZGVmYXVsdDogXCIsXCIgfSxcblxuICAgIC8qKlxuICAgICAqIOminOiJslxuICAgICAqIGVsZW1lbnQ944CQYXV0bywgcHJpbWFyeSwgc3VjY2Vzcywgd2FybmluZywgZGFuZ2VyICxpbmZv44CRXG4gICAgICogYW50ZHY944CQYXV0bywgcHJpbWFyeSwgc3VjY2VzcywgYmx1ZSxyZWQsLi4u44CRXG4gICAgICog6YWN572uYXV0b++8jOWImeiHquWKqOagueaNrnZhbHVl5YC8aGFzaGNvZGXliIbphY3popzoibLlgLxcbiAgICAgKi9cbiAgICBjb2xvcjoge30sXG4gICAgLyoqXG4gICAgICog5pWI5p6c77yI5LuFZWxlbWVudO+8iVxuICAgICAqKi9cbiAgICBlZmZlY3Q6IHt9LFxuICAgIC8qKlxuICAgICAqIOiHquWKqOafk+iJsuminOiJsuWAvOWIl+ihqFxuICAgICAqL1xuICAgIGF1dG9Db2xvcnM6IHtcbiAgICAgIHR5cGU6IEFycmF5XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDoh6rliqjkuLvpopjliJfooajvvIjku4VlbGVtZW5077yJXG4gICAgICog44CQIGxpZ2h0LCBwbGFpbiDjgJFcbiAgICAgKi9cbiAgICBhdXRvRWZmZWN0czoge1xuICAgICAgdHlwZTogQXJyYXlcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaYvuekuuexu+Wei++8muOAkHRleHQsIHRhZ+OAkVxuICAgICAqL1xuICAgIHR5cGU6IHtcbiAgICAgIGRlZmF1bHQ6IFwidGFnXCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWAvOeahOexu+Wei++8jOOAkCB2YWx1ZSB8IG9iamVjdOOAkVxuICAgICAqL1xuICAgIHZhbHVlVHlwZToge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlvZN2YWx1ZeWAvOS4jeWcqOWtl+WFuOS4reaXtum7mOiupOaYvuekuueahOaWh+acrFxuICAgICAqL1xuICAgIGRlZmF1bHRMYWJlbDoge30sXG5cbiAgICAvKipcbiAgICAgKiBsYWJlbOiHquWumuS5iXJlbmRlclxuICAgICAqL1xuICAgIGxhYmVsRm9ybWF0dGVyOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvblxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6Ieq5a6a5LmJ6YCJ6aG5cmVuZGVyXG4gICAgICovXG4gICAgaXRlbVJlbmRlcjoge1xuICAgICAgdHlwZTogRnVuY3Rpb25cbiAgICB9LFxuXG4gICAgY2xvc2FibGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcImNsaWNrXCIsIFwiZGljdC1jaGFuZ2VcIiwgXCJjbG9zZVwiLCBcInVwZGF0ZTptb2RlbFZhbHVlXCJdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHg6IGFueSkge1xuICAgIC8vIHRyYWNlLnRyYWNlKFwidmFsdWVzLWZvcm1hdFwiKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcInZhbHVlcy1mb3JtYXQgaW5pdFwiLCBwcm9wcy5tb2RlbFZhbHVlKTtcbiAgICAvL2NvbnN0IGRpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgQ09MT1JfTElTVCA9IHVpLnRhZy5jb2xvcnM7XG4gICAgY29uc3QgRUZGRUNUX0xJU1QgPSBbXCJwbGFpblwiLCBcImxpZ2h0XCJdO1xuXG4gICAgY29uc3QgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHsgZ2V0Q29sb3IsIGdldFZhbHVlLCByZW1vdmVQcm9wVmFsdWUgfSA9IHVzZWREaWN0O1xuICAgIHVzZWREaWN0LndhdGNoVmFsdWUoKTtcbiAgICBmdW5jdGlvbiBzZXRDb2xvcihwcm9wczogYW55LCBpdGVtOiBhbnkpIHtcbiAgICAgIGlmICghaXRlbS5lZmZlY3QgJiYgcHJvcHMuZWZmZWN0KSB7XG4gICAgICAgIGl0ZW0uZWZmZWN0ID0gcHJvcHMuZWZmZWN0O1xuICAgICAgfVxuICAgICAgY29uc3QgdHlwZUtleSA9IHVpLnRhZy50eXBlO1xuICAgICAgY29uc3QgY29sb3IgPSBnZXRDb2xvcihpdGVtKTtcbiAgICAgIGlmIChjb2xvciAhPSBudWxsKSB7XG4gICAgICAgIC8v5aaC5p6c5bey57uP6YWN572u5LqGY29sb3JcbiAgICAgICAgaWYgKHR5cGVvZiBjb2xvciAhPSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8v5bCG5Y6f5pyJ55qEY29sb3LlrZfmrrXliKDmjonvvIzpgb/lhY1uYWl2ZSBjb2xvcuaKpemUmVxuICAgICAgICByZW1vdmVQcm9wVmFsdWUoaXRlbSwgXCJjb2xvclwiKTtcbiAgICAgICAgaXRlbVt0eXBlS2V5XSA9IGNvbG9yO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuY29sb3IgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgIGNvbnN0IGhhc2hjb2RlID0gZ2V0SGFzaENvZGUoZ2V0VmFsdWUoaXRlbSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhcImhhc2hjb2RlXCIsIGdldFZhbHVlKGl0ZW0pLCBoYXNoY29kZSk7XG4gICAgICAgIGNvbnN0IGNvbG9ycyA9IHByb3BzLmF1dG9Db2xvcnMgPyBwcm9wcy5hdXRvQ29sb3JzIDogQ09MT1JfTElTVDtcbiAgICAgICAgaXRlbVt0eXBlS2V5XSA9IGNvbG9yc1toYXNoY29kZSAlIGNvbG9ycy5sZW5ndGhdO1xuICAgICAgICBjb25zdCBlZmZlY3RzID0gcHJvcHMuYXV0b0VmZmVjdHMgPyBwcm9wcy5hdXRvRWZmZWN0cyA6IEVGRkVDVF9MSVNUO1xuICAgICAgICBpdGVtLmVmZmVjdCA9IGVmZmVjdHNbTWF0aC5mbG9vcihoYXNoY29kZSAvIGNvbG9ycy5sZW5ndGgpICUgZWZmZWN0cy5sZW5ndGhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbVt0eXBlS2V5XSA9IHByb3BzLmNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXB1dGVkVmFsdWVJdGVtczogUmVmPGFueVtdPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChwcm9wcy52YWx1ZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKHByb3BzLm1vZGVsVmFsdWUgJiYgIUFycmF5LmlzQXJyYXkocHJvcHMubW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gW3Byb3BzLm1vZGVsVmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcy5tb2RlbFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xuICAgICAgaWYgKHByb3BzLm1vZGVsVmFsdWUgPT0gbnVsbCB8fCBwcm9wcy5tb2RlbFZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlQXJyID0gYnVpbGRBcnJheVZhbHVlKHByb3BzKTtcblxuICAgICAgbGV0IG9wdGlvbnMgPSBbXTtcblxuICAgICAgY29uc3QgdmFsdWVQcm9wID0gcHJvcHMuZGljdD8udmFsdWUgfHwgXCJ2YWx1ZVwiO1xuICAgICAgY29uc3QgbGFiZWxQcm9wID0gcHJvcHMuZGljdD8ubGFiZWwgfHwgXCJsYWJlbFwiO1xuXG4gICAgICBpZiAoZGljdCkge1xuICAgICAgICBvcHRpb25zID0gZGljdC5nZXROb2Rlc0Zyb21EYXRhTWFwKHZhbHVlQXJyKTtcbiAgICAgICAgLy/orr7nva7pu5jorqRsYWJlbFxuICAgICAgICBmb3JFYWNoKG9wdGlvbnMsIChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW1bbGFiZWxQcm9wXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpdGVtW2xhYmVsUHJvcF0gPSBwcm9wcy5kZWZhdWx0TGFiZWwgfHwgaXRlbVt2YWx1ZVByb3BdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zID0gW107XG4gICAgICAgIGZvckVhY2godmFsdWVBcnIsIChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaChpdGVtKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgW3ZhbHVlUHJvcF06IGl0ZW0sXG4gICAgICAgICAgICAgIFtsYWJlbFByb3BdOiBpdGVtXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb2xvcmZ1bE9wdGlvbnM6IGFueSA9IFtdO1xuICAgICAgZm9yRWFjaChvcHRpb25zLCAoaXRlbSkgPT4ge1xuICAgICAgICBjb2xvcmZ1bE9wdGlvbnMucHVzaChvbWl0KGl0ZW0sIFwiY2hpbGRyZW5cIikpO1xuICAgICAgfSk7XG4gICAgICBmb3JFYWNoKGNvbG9yZnVsT3B0aW9ucywgKGl0ZW0pID0+IHtcbiAgICAgICAgc2V0Q29sb3IocHJvcHMsIGl0ZW0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29sb3JmdWxPcHRpb25zO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZG9DbGljayhpdGVtOiBhbnkpIHtcbiAgICAgIGN0eC5lbWl0KFwiY2xpY2tcIiwgeyBpdGVtOiBpdGVtIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkb0Nsb3NlKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICAgICAgY3R4LmVtaXQoXCJjbG9zZVwiLCB7IGl0ZW0sIGluZGV4IH0pO1xuICAgICAgY29uc3QgbmV3VmFsdWVzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wdXRlZFZhbHVlSXRlbXMudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgIT09IGluZGV4KSB7XG4gICAgICAgICAgbmV3VmFsdWVzLnB1c2goZ2V0VmFsdWUoY29tcHV0ZWRWYWx1ZUl0ZW1zLnZhbHVlW2ldKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgbmV3VmFsdWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICAuLi51c2VkRGljdCxcbiAgICAgIGRvQ2xpY2ssXG4gICAgICBjb21wdXRlZFZhbHVlSXRlbXMsXG4gICAgICBkb0Nsb3NlXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXZhbHVlcy1mb3JtYXQgLmZzLXRhZyB7XG4gIG1hcmdpbjogMnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC5mcy10YWctaWNvbiB7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxzcGFuIGNsYXNzPVwiZnMtdmFsdWVzLWZvcm1hdFwiPlxuICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXRlbVJlbmRlclwiPlxuICAgICAgPGZzLXJlbmRlciB2LWZvcj1cIml0ZW0gaW4gY29tcHV0ZWRWYWx1ZUl0ZW1zXCIgOmtleT1cImdldFZhbHVlKGl0ZW0pXCIgOnJlbmRlci1mdW5jPVwiaXRlbVJlbmRlclwiIDpzY29wZT1cIml0ZW1cIiAvPlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlIHYtZWxzZS1pZj1cInR5cGUgPT09ICd0ZXh0J1wiPlxuICAgICAgPHNwYW4gdi1mb3I9XCJpdGVtIGluIGNvbXB1dGVkVmFsdWVJdGVtc1wiIDprZXk9XCJnZXRWYWx1ZShpdGVtKVwiIEBjbGljaz1cImRvQ2xpY2soaXRlbSlcIj57eyBnZXRMYWJlbChpdGVtKSB9fTwvc3Bhbj5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNvbXB1dGVkVmFsdWVJdGVtc1wiIDprZXk9XCJnZXRWYWx1ZShpdGVtKVwiPlxuICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgOmlzPVwidWkudGFnLm5hbWVcIlxuICAgICAgICAgIGNsYXNzPVwiZnMtdGFnXCJcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIDpjbG9zYWJsZT1cImNsb3NhYmxlXCJcbiAgICAgICAgICB2LWJpbmQ9XCJpdGVtXCJcbiAgICAgICAgICA6aWNvbj1cIm51bGxcIlxuICAgICAgICAgIDpuYW1lPVwibnVsbFwiXG4gICAgICAgICAgQGNsb3NlPVwiZG9DbG9zZShpbmRleCwgaXRlbSlcIlxuICAgICAgICAgIEBjbGljaz1cImRvQ2xpY2soaXRlbSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpdGVtLmljb25cIj5cbiAgICAgICAgICAgIDxmcy1pY29uIDppY29uPVwiaXRlbS5pY29uXCIgOnNwaW49XCJpdGVtLmljb25TcGluXCIgY2xhc3M9XCJmcy10YWctaWNvblwiIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICB7eyBnZXRMYWJlbChpdGVtKSB9fVxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9zcGFuPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGZvckVhY2gsIG9taXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBSZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VEaWN0IH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtZGljdFwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5mdW5jdGlvbiBnZXRIYXNoQ29kZShzdHI6IHN0cmluZykge1xuICBpZiAoc3RyID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xuICAgIHN0ciA9IEpTT04uc3RyaW5naWZ5KHN0cik7XG4gIH1cbiAgbGV0IGhhc2ggPSAwO1xuICBsZXQgaTtcbiAgbGV0IGNocjtcbiAgbGV0IGxlbjtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHJldHVybiBoYXNoO1xuICBmb3IgKGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjaHIgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgY2hyO1xuICAgIGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cbiAgcmV0dXJuIE1hdGguYWJzKGhhc2gpO1xufVxuXG5mdW5jdGlvbiBidWlsZEFycmF5VmFsdWUocHJvcHM6IGFueSkge1xuICBsZXQgdmFsdWVBcnIgPSBbXTtcbiAgaWYgKHR5cGVvZiBwcm9wcy5tb2RlbFZhbHVlID09PSBcInN0cmluZ1wiICYmIHByb3BzLm11bHRpcGxlICYmIHByb3BzLnNlcGFyYXRvciAhPSBudWxsICYmIHByb3BzLnNlcGFyYXRvciAhPT0gXCJcIikge1xuICAgIHZhbHVlQXJyID0gcHJvcHMubW9kZWxWYWx1ZS5zcGxpdChwcm9wcy5zZXBhcmF0b3IpO1xuICB9IGVsc2UgaWYgKHByb3BzLm1vZGVsVmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIC8vIOacrOadpeWwseaYr+aVsOe7hOeahFxuICAgIHZhbHVlQXJyID0gcHJvcHMubW9kZWxWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZUFyciA9IFtwcm9wcy5tb2RlbFZhbHVlXTtcbiAgfVxuICByZXR1cm4gdmFsdWVBcnI7XG59XG5cbi8qKlxuICogdmFsdWXmoLzlvI/ljJblsZXnpLrnu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1ZhbHVlc0Zvcm1hdFwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOWAvFxuICAgICAqL1xuICAgIG1vZGVsVmFsdWU6IHt9LFxuICAgIC8qKlxuICAgICAqIOWtl+WFuOmFjee9rlxuICAgICAqL1xuICAgIGRpY3Q6IHt9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuWkmumAiVxuICAgICAqL1xuICAgIG11bHRpcGxlOiB7IGRlZmF1bHQ6IHRydWUgfSxcbiAgICAvKipcbiAgICAgKiDliIbpmpTnrKY8YnIvPlxuICAgICAqIOWkmumAieaXtu+8jOWmguaenHZhbHVl5Li6c3RyaW5n77yM5YiZ5Lul6K+l5YiG6ZqU56ym5YiG5Ymy5oiQ5aSa5Liq5bGV56S6PGJyLz5cbiAgICAgKiDkvKDlhaXnqbrlrZfnrKbkuLLvvIzooajnpLrkuI3liIblibI8YnIvPlxuICAgICAqL1xuICAgIHNlcGFyYXRvcjogeyBkZWZhdWx0OiBcIixcIiB9LFxuXG4gICAgLyoqXG4gICAgICog6aKc6ImyXG4gICAgICogZWxlbWVudD3jgJBhdXRvLCBwcmltYXJ5LCBzdWNjZXNzLCB3YXJuaW5nLCBkYW5nZXIgLGluZm/jgJFcbiAgICAgKiBhbnRkdj3jgJBhdXRvLCBwcmltYXJ5LCBzdWNjZXNzLCBibHVlLHJlZCwuLi7jgJFcbiAgICAgKiDphY3nva5hdXRv77yM5YiZ6Ieq5Yqo5qC55o2udmFsdWXlgLxoYXNoY29kZeWIhumFjeminOiJsuWAvFxuICAgICAqL1xuICAgIGNvbG9yOiB7fSxcbiAgICAvKipcbiAgICAgKiDmlYjmnpzvvIjku4VlbGVtZW5077yJXG4gICAgICoqL1xuICAgIGVmZmVjdDoge30sXG4gICAgLyoqXG4gICAgICog6Ieq5Yqo5p+T6Imy6aKc6Imy5YC85YiX6KGoXG4gICAgICovXG4gICAgYXV0b0NvbG9yczoge1xuICAgICAgdHlwZTogQXJyYXlcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOiHquWKqOS4u+mimOWIl+ihqO+8iOS7hWVsZW1lbnTvvIlcbiAgICAgKiDjgJAgbGlnaHQsIHBsYWluIOOAkVxuICAgICAqL1xuICAgIGF1dG9FZmZlY3RzOiB7XG4gICAgICB0eXBlOiBBcnJheVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5pi+56S657G75Z6L77ya44CQdGV4dCwgdGFn44CRXG4gICAgICovXG4gICAgdHlwZToge1xuICAgICAgZGVmYXVsdDogXCJ0YWdcIlxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5YC855qE57G75Z6L77yM44CQIHZhbHVlIHwgb2JqZWN044CRXG4gICAgICovXG4gICAgdmFsdWVUeXBlOiB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW9k3ZhbHVl5YC85LiN5Zyo5a2X5YW45Lit5pe26buY6K6k5pi+56S655qE5paH5pysXG4gICAgICovXG4gICAgZGVmYXVsdExhYmVsOiB7fSxcblxuICAgIC8qKlxuICAgICAqIGxhYmVs6Ieq5a6a5LmJcmVuZGVyXG4gICAgICovXG4gICAgbGFiZWxGb3JtYXR0ZXI6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDoh6rlrprkuYnpgInpoblyZW5kZXJcbiAgICAgKi9cbiAgICBpdGVtUmVuZGVyOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvblxuICAgIH0sXG5cbiAgICBjbG9zYWJsZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBlbWl0czogW1wiY2xpY2tcIiwgXCJkaWN0LWNoYW5nZVwiLCBcImNsb3NlXCIsIFwidXBkYXRlOm1vZGVsVmFsdWVcIl0sXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eDogYW55KSB7XG4gICAgLy8gdHJhY2UudHJhY2UoXCJ2YWx1ZXMtZm9ybWF0XCIpO1xuICAgIC8vIGNvbnNvbGUubG9nKFwidmFsdWVzLWZvcm1hdCBpbml0XCIsIHByb3BzLm1vZGVsVmFsdWUpO1xuICAgIC8vY29uc3QgZGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCk7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCBDT0xPUl9MSVNUID0gdWkudGFnLmNvbG9ycztcbiAgICBjb25zdCBFRkZFQ1RfTElTVCA9IFtcInBsYWluXCIsIFwibGlnaHRcIl07XG5cbiAgICBjb25zdCB1c2VkRGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCk7XG4gICAgY29uc3QgeyBnZXRDb2xvciwgZ2V0VmFsdWUsIHJlbW92ZVByb3BWYWx1ZSB9ID0gdXNlZERpY3Q7XG4gICAgdXNlZERpY3Qud2F0Y2hWYWx1ZSgpO1xuICAgIGZ1bmN0aW9uIHNldENvbG9yKHByb3BzOiBhbnksIGl0ZW06IGFueSkge1xuICAgICAgaWYgKCFpdGVtLmVmZmVjdCAmJiBwcm9wcy5lZmZlY3QpIHtcbiAgICAgICAgaXRlbS5lZmZlY3QgPSBwcm9wcy5lZmZlY3Q7XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlS2V5ID0gdWkudGFnLnR5cGU7XG4gICAgICBjb25zdCBjb2xvciA9IGdldENvbG9yKGl0ZW0pO1xuICAgICAgaWYgKGNvbG9yICE9IG51bGwpIHtcbiAgICAgICAgLy/lpoLmnpzlt7Lnu4/phY3nva7kuoZjb2xvclxuICAgICAgICBpZiAodHlwZW9mIGNvbG9yICE9IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy/lsIbljp/mnInnmoRjb2xvcuWtl+auteWIoOaOie+8jOmBv+WFjW5haXZlIGNvbG9y5oql6ZSZXG4gICAgICAgIHJlbW92ZVByb3BWYWx1ZShpdGVtLCBcImNvbG9yXCIpO1xuICAgICAgICBpdGVtW3R5cGVLZXldID0gY29sb3I7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5jb2xvciA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgY29uc3QgaGFzaGNvZGUgPSBnZXRIYXNoQ29kZShnZXRWYWx1ZShpdGVtKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiaGFzaGNvZGVcIiwgZ2V0VmFsdWUoaXRlbSksIGhhc2hjb2RlKTtcbiAgICAgICAgY29uc3QgY29sb3JzID0gcHJvcHMuYXV0b0NvbG9ycyA/IHByb3BzLmF1dG9Db2xvcnMgOiBDT0xPUl9MSVNUO1xuICAgICAgICBpdGVtW3R5cGVLZXldID0gY29sb3JzW2hhc2hjb2RlICUgY29sb3JzLmxlbmd0aF07XG4gICAgICAgIGNvbnN0IGVmZmVjdHMgPSBwcm9wcy5hdXRvRWZmZWN0cyA/IHByb3BzLmF1dG9FZmZlY3RzIDogRUZGRUNUX0xJU1Q7XG4gICAgICAgIGl0ZW0uZWZmZWN0ID0gZWZmZWN0c1tNYXRoLmZsb29yKGhhc2hjb2RlIC8gY29sb3JzLmxlbmd0aCkgJSBlZmZlY3RzLmxlbmd0aF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtW3R5cGVLZXldID0gcHJvcHMuY29sb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRWYWx1ZUl0ZW1zOiBSZWY8YW55W10+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKHByb3BzLnZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAocHJvcHMubW9kZWxWYWx1ZSAmJiAhQXJyYXkuaXNBcnJheShwcm9wcy5tb2RlbFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBbcHJvcHMubW9kZWxWYWx1ZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BzLm1vZGVsVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XG4gICAgICBpZiAocHJvcHMubW9kZWxWYWx1ZSA9PSBudWxsIHx8IHByb3BzLm1vZGVsVmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWVBcnIgPSBidWlsZEFycmF5VmFsdWUocHJvcHMpO1xuXG4gICAgICBsZXQgb3B0aW9ucyA9IFtdO1xuXG4gICAgICBjb25zdCB2YWx1ZVByb3AgPSBwcm9wcy5kaWN0Py52YWx1ZSB8fCBcInZhbHVlXCI7XG4gICAgICBjb25zdCBsYWJlbFByb3AgPSBwcm9wcy5kaWN0Py5sYWJlbCB8fCBcImxhYmVsXCI7XG5cbiAgICAgIGlmIChkaWN0KSB7XG4gICAgICAgIG9wdGlvbnMgPSBkaWN0LmdldE5vZGVzRnJvbURhdGFNYXAodmFsdWVBcnIpO1xuICAgICAgICAvL+iuvue9rum7mOiupGxhYmVsXG4gICAgICAgIGZvckVhY2gob3B0aW9ucywgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbVtsYWJlbFByb3BdID09IG51bGwpIHtcbiAgICAgICAgICAgIGl0ZW1bbGFiZWxQcm9wXSA9IHByb3BzLmRlZmF1bHRMYWJlbCB8fCBpdGVtW3ZhbHVlUHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yRWFjaCh2YWx1ZUFyciwgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKGl0ZW0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICBbdmFsdWVQcm9wXTogaXRlbSxcbiAgICAgICAgICAgICAgW2xhYmVsUHJvcF06IGl0ZW1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbG9yZnVsT3B0aW9uczogYW55ID0gW107XG4gICAgICBmb3JFYWNoKG9wdGlvbnMsIChpdGVtKSA9PiB7XG4gICAgICAgIGNvbG9yZnVsT3B0aW9ucy5wdXNoKG9taXQoaXRlbSwgXCJjaGlsZHJlblwiKSk7XG4gICAgICB9KTtcbiAgICAgIGZvckVhY2goY29sb3JmdWxPcHRpb25zLCAoaXRlbSkgPT4ge1xuICAgICAgICBzZXRDb2xvcihwcm9wcywgaXRlbSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb2xvcmZ1bE9wdGlvbnM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBkb0NsaWNrKGl0ZW06IGFueSkge1xuICAgICAgY3R4LmVtaXQoXCJjbGlja1wiLCB7IGl0ZW06IGl0ZW0gfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRvQ2xvc2UoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSB7XG4gICAgICBjdHguZW1pdChcImNsb3NlXCIsIHsgaXRlbSwgaW5kZXggfSk7XG4gICAgICBjb25zdCBuZXdWYWx1ZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXB1dGVkVmFsdWVJdGVtcy52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gaW5kZXgpIHtcbiAgICAgICAgICBuZXdWYWx1ZXMucHVzaChnZXRWYWx1ZShjb21wdXRlZFZhbHVlSXRlbXMudmFsdWVbaV0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCBuZXdWYWx1ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIC4uLnVzZWREaWN0LFxuICAgICAgZG9DbGljayxcbiAgICAgIGNvbXB1dGVkVmFsdWVJdGVtcyxcbiAgICAgIGRvQ2xvc2VcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtdmFsdWVzLWZvcm1hdCAuZnMtdGFnIHtcbiAgbWFyZ2luOiAycHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLmZzLXRhZy1pY29uIHtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPHNwYW4+XG4gICAgPHRlbXBsYXRlIHYtaWY9XCJjb21wdXRlZE11bHRpcGxlXCI+XG4gICAgICA8ZGl2IHYtZm9yPVwiKExhYmVscywgSW5kZXgpIGluIG11bHRpcGxlTGFiZWxzXCIgOmtleT1cIkluZGV4XCI+XG4gICAgICAgIDxzcGFuIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBMYWJlbHNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgICA8c3BhbiB2LWlmPVwiaW5kZXggIT09IDBcIj4gLyA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgZ2V0TGFiZWwoaXRlbSkgfX08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlIHYtZWxzZT5cbiAgICAgIDxzcGFuIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBsYWJlbHNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgPHNwYW4gdi1pZj1cImluZGV4ICE9PSAwXCI+IC8gPC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBnZXRMYWJlbChpdGVtKSB9fTwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L3RlbXBsYXRlPlxuICA8L3NwYW4+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG4vKipcbiAqIOe6p+iBlOaVsOaNruagvOW8j+WMluWxleekuue7hOS7tlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRGljdENhc2NhZGVyRm9ybWF0XCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICogICDlgLw8YnIvPlxuICAgICAqICAg5Y2V6YCJ5pe2ICcxLDIsMycg5oiWIFsxLDIsM108YnIvPlxuICAgICAqICAg5aSa6YCJW1sxLDIsM10sWzQsNSw2XV08YnIvPlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBtb2RlbFZhbHVlOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBBcnJheV0sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICByZXF1aXJlOiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiAgdmFsdWXnmoTliIbpmpTnrKY8YnIvPlxuICAgICAqICDlpJrpgInml7bvvIzlpoLmnpx2YWx1ZeS4unN0cmluZ++8jOWImeS7peivpeWIhumalOespuWIhuWJsuaIkOWkmuS4quWxleekujxici8+XG4gICAgICogIOS8oOWFpeepuuWtl+espuS4su+8jOihqOekuuS4jeWIhuWJsjxici8+XG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHNlcGFyYXRvcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IFwiLFwiLCByZXF1aXJlOiBmYWxzZSB9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuWkmumAiVxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBtdWx0aXBsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIC8qKlxuICAgICAqIOaVsOaNruWtl+WFuFxuICAgICAqL1xuICAgIGRpY3Q6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgIHJlcXVpcmU6IGZhbHNlXG4gICAgfVxuICB9IGFzIGFueSxcbiAgZW1pdHM6IFtcImRpY3QtY2hhbmdlXCJdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgZGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChwcm9wcy5kaWN0Py5nZXROb2Rlc0J5VmFsdWVzKSB7XG4gICAgICBkaWN0LndhdGNoVmFsdWUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZE11bHRpcGxlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHByb3BzLm11bHRpcGxlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRpY3QsXG4gICAgICBjb21wdXRlZE11bHRpcGxlXG4gICAgfTtcbiAgfSxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge307XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgbGFiZWxzKCkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaWYgKHRoaXMubW9kZWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkVmFsdWVJdGVtKHRoaXMubW9kZWxWYWx1ZSk7XG4gICAgfSxcbiAgICBtdWx0aXBsZUxhYmVscygpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICh0aGlzLm1vZGVsVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBjb25zdCBhcnIgPSBbXTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhcnIucHVzaCh0aGlzLmJ1aWxkVmFsdWVJdGVtKGl0ZW0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgZ2V0VmFsdWVBcnIodmFsdWVzOiBhbnkpIHtcbiAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgdmFsdWVzID0gW107XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIGl0ZW0pIHtcbiAgICAgICAgICAgICAgdmFsdWVzLnB1c2goc3ViKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHZhbHVlcyA9IHRoaXMubW9kZWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGxldCBhcnIgPSBudWxsO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZXMgPT09IFwic3RyaW5nXCIgJiYgIXRoaXMubXVsdGlwbGUgJiYgdGhpcy5zZXBhcmF0b3IgIT0gbnVsbCAmJiB0aGlzLnNlcGFyYXRvciAhPT0gXCJcIikge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGFyciA9IHZhbHVlcy5zcGxpdCh0aGlzLnNlcGFyYXRvcik7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGFyciA9IHZhbHVlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyciA9IFt2YWx1ZXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIGJ1aWxkVmFsdWVJdGVtKHZhbHVlczogYW55KSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCBhcnIgPSB0aGlzLmdldFZhbHVlQXJyKHZhbHVlcyk7XG5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGNvbnN0IGRpY3QgPSB0aGlzLmdldERpY3QoKTtcbiAgICAgIGlmIChkaWN0KSB7XG4gICAgICAgIHJldHVybiBkaWN0LmdldE5vZGVzRnJvbURhdGFNYXAoYXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxzcGFuPlxuICAgIDx0ZW1wbGF0ZSB2LWlmPVwiY29tcHV0ZWRNdWx0aXBsZVwiPlxuICAgICAgPGRpdiB2LWZvcj1cIihMYWJlbHMsIEluZGV4KSBpbiBtdWx0aXBsZUxhYmVsc1wiIDprZXk9XCJJbmRleFwiPlxuICAgICAgICA8c3BhbiB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gTGFiZWxzXCIgOmtleT1cImluZGV4XCI+XG4gICAgICAgICAgPHNwYW4gdi1pZj1cImluZGV4ICE9PSAwXCI+IC8gPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7IGdldExhYmVsKGl0ZW0pIH19PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XG4gICAgICA8c3BhbiB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gbGFiZWxzXCIgOmtleT1cImluZGV4XCI+XG4gICAgICAgIDxzcGFuIHYtaWY9XCJpbmRleCAhPT0gMFwiPiAvIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgZ2V0TGFiZWwoaXRlbSkgfX08L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9zcGFuPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuLyoqXG4gKiDnuqfogZTmlbDmja7moLzlvI/ljJblsZXnpLrnu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0RpY3RDYXNjYWRlckZvcm1hdFwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqICAg5YC8PGJyLz5cbiAgICAgKiAgIOWNlemAieaXtiAnMSwyLDMnIOaIliBbMSwyLDNdPGJyLz5cbiAgICAgKiAgIOWkmumAiVtbMSwyLDNdLFs0LDUsNl1dPGJyLz5cbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbW9kZWxWYWx1ZToge1xuICAgICAgdHlwZTogW1N0cmluZywgQXJyYXldLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICAgICAgcmVxdWlyZTogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogIHZhbHVl55qE5YiG6ZqU56ymPGJyLz5cbiAgICAgKiAg5aSa6YCJ5pe277yM5aaC5p6cdmFsdWXkuLpzdHJpbmfvvIzliJnku6Xor6XliIbpmpTnrKbliIblibLmiJDlpJrkuKrlsZXnpLo8YnIvPlxuICAgICAqICDkvKDlhaXnqbrlrZfnrKbkuLLvvIzooajnpLrkuI3liIblibI8YnIvPlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzZXBhcmF0b3I6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBcIixcIiwgcmVxdWlyZTogZmFsc2UgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKblpJrpgIlcbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbXVsdGlwbGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICAvKipcbiAgICAgKiDmlbDmja7lrZflhbhcbiAgICAgKi9cbiAgICBkaWN0OiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICByZXF1aXJlOiBmYWxzZVxuICAgIH1cbiAgfSBhcyBhbnksXG4gIGVtaXRzOiBbXCJkaWN0LWNoYW5nZVwiXSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IGRpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAocHJvcHMuZGljdD8uZ2V0Tm9kZXNCeVZhbHVlcykge1xuICAgICAgZGljdC53YXRjaFZhbHVlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRNdWx0aXBsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiBwcm9wcy5tdWx0aXBsZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kaWN0LFxuICAgICAgY29tcHV0ZWRNdWx0aXBsZVxuICAgIH07XG4gIH0sXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9LFxuICBjb21wdXRlZDoge1xuICAgIGxhYmVscygpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICh0aGlzLm1vZGVsVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4gdGhpcy5idWlsZFZhbHVlSXRlbSh0aGlzLm1vZGVsVmFsdWUpO1xuICAgIH0sXG4gICAgbXVsdGlwbGVMYWJlbHMoKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpZiAodGhpcy5tb2RlbFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgYXJyID0gW107XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgYXJyLnB1c2godGhpcy5idWlsZFZhbHVlSXRlbShpdGVtKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIGdldFZhbHVlQXJyKHZhbHVlczogYW55KSB7XG4gICAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIHZhbHVlcyA9IFtdO1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiBpdGVtKSB7XG4gICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHN1Yik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB2YWx1ZXMgPSB0aGlzLm1vZGVsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBsZXQgYXJyID0gbnVsbDtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICh0eXBlb2YgdmFsdWVzID09PSBcInN0cmluZ1wiICYmICF0aGlzLm11bHRpcGxlICYmIHRoaXMuc2VwYXJhdG9yICE9IG51bGwgJiYgdGhpcy5zZXBhcmF0b3IgIT09IFwiXCIpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhcnIgPSB2YWx1ZXMuc3BsaXQodGhpcy5zZXBhcmF0b3IpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBhcnIgPSB2YWx1ZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnIgPSBbdmFsdWVzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICBidWlsZFZhbHVlSXRlbSh2YWx1ZXM6IGFueSkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgYXJyID0gdGhpcy5nZXRWYWx1ZUFycih2YWx1ZXMpO1xuXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCBkaWN0ID0gdGhpcy5nZXREaWN0KCk7XG4gICAgICBpZiAoZGljdCkge1xuICAgICAgICByZXR1cm4gZGljdC5nZXROb2Rlc0Zyb21EYXRhTWFwKGFycik7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50XG4gICAgOmlzPVwidWkuY2FzY2FkZXIubmFtZVwiXG4gICAgcmVmPVwiY2FzY2FkZXJSZWZcIlxuICAgIDpvcHRpb25zPVwiY29tcHV0ZWRPcHRpb25zXCJcbiAgICB2LWJpbmQ9XCJmaWVsZE5hbWVzQmluZGVyXCJcbiAgICBAY2hhbmdlPVwib25TZWxlY3RDaGFuZ2VcIlxuICAvPlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyB1c2VEaWN0IH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtZGljdFwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbi8qKlxuICog5a2X5YW457qn6IGU57uE5Lu2XG4gKiDmlK/mjIFlbC1jYXNjYWRlcnxhLWNhc2NhZGVy57uE5Lu255qE5Y+C5pWwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNEaWN0Q2FzY2FkZXJcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDlrZflhbjphY3nva5cbiAgICAgKi9cbiAgICBkaWN0OiB7fSxcbiAgICAvKipcbiAgICAgKiDpgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5IH0sXG4gICAgLyoqXG4gICAgICog6L2s5o2iRGljdERhdGFcbiAgICAgKi9cbiAgICB0cmFuc2Zvcm1EaWN0RGF0YToge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXG4gICAgLyoqXG4gICAgICog5a2X5YW45pWw5o2u5Y+Y5YyW5LqL5Lu2XG4gICAgICovXG4gICAgXCJkaWN0LWNoYW5nZVwiLFxuXG4gICAgLyoqXG4gICAgICog6YCJ5Lit5YC85Y+Y5YyW5LqL5Lu277yM5Y+v5Lul6I635Y+W5Yiw5b2T5YmN6YCJ5Lit55qEb3B0aW9u5a+56LGhXG4gICAgICovXG4gICAgXCJzZWxlY3RlZC1jaGFuZ2VcIixcbiAgICAvKipcbiAgICAgKiDlgLzlj5jljJbkuovku7ZcbiAgICAgKi9cbiAgICBcImNoYW5nZVwiXG4gIF0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCBjYXNjYWRlclJlZiA9IHJlZigpO1xuICAgIGNvbnN0IGRpY3RVc2VSZXQgPSB1c2VEaWN0KHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgZmllbGROYW1lc0JpbmRlciA9IHJlZigpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAocHJvcHMuZGljdCkge1xuICAgICAgZmllbGROYW1lc0JpbmRlci52YWx1ZSA9IHVpLmNhc2NhZGVyLmZpZWxkTmFtZXMoe1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHZhbHVlOiBwcm9wcy5kaWN0LnZhbHVlLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGxhYmVsOiBwcm9wcy5kaWN0LmxhYmVsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNoaWxkcmVuOiBwcm9wcy5kaWN0LmNoaWxkcmVuXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgY29tcHV0ZWRPcHRpb25zID0gZGljdFVzZVJldC5jcmVhdGVDb21wdXRlZE9wdGlvbnMoKTtcblxuICAgIGZ1bmN0aW9uIG9uU2VsZWN0Q2hhbmdlKHZhbHVlOiBhbnkpIHtcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb25zID0gW107XG4gICAgICAgIGNvbnN0IGRpY3QgPSBkaWN0VXNlUmV0LmdldERpY3QoKTtcbiAgICAgICAgaWYgKGRpY3QgJiYgZGljdC5kYXRhTWFwKSB7XG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0ID0gZGljdC5kYXRhTWFwW2l0ZW1dO1xuICAgICAgICAgICAgaWYgKG9wdCkge1xuICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbnMucHVzaChvcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBzZWxlY3RlZE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgY2FzY2FkZXJSZWYsXG4gICAgICAuLi5kaWN0VXNlUmV0LFxuICAgICAgZmllbGROYW1lc0JpbmRlcixcbiAgICAgIGNvbXB1dGVkT3B0aW9ucyxcbiAgICAgIG9uU2VsZWN0Q2hhbmdlXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cInVpLmNhc2NhZGVyLm5hbWVcIlxuICAgIHJlZj1cImNhc2NhZGVyUmVmXCJcbiAgICA6b3B0aW9ucz1cImNvbXB1dGVkT3B0aW9uc1wiXG4gICAgdi1iaW5kPVwiZmllbGROYW1lc0JpbmRlclwiXG4gICAgQGNoYW5nZT1cIm9uU2VsZWN0Q2hhbmdlXCJcbiAgLz5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCByZWYgfSBmcm9tIFwidnVlXCI7XG4vKipcbiAqIOWtl+WFuOe6p+iBlOe7hOS7tlxuICog5pSv5oyBZWwtY2FzY2FkZXJ8YS1jYXNjYWRlcue7hOS7tueahOWPguaVsFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRGljdENhc2NhZGVyXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5a2X5YW46YWN572uXG4gICAgICovXG4gICAgZGljdDoge30sXG4gICAgLyoqXG4gICAgICog6YCJ6aG577yM5q+UZGljdC5kYXRh5LyY5YWI57qn6auYXG4gICAgICovXG4gICAgb3B0aW9uczogeyB0eXBlOiBBcnJheSB9LFxuICAgIC8qKlxuICAgICAqIOi9rOaNokRpY3REYXRhXG4gICAgICovXG4gICAgdHJhbnNmb3JtRGljdERhdGE6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfVxuICB9LFxuICBlbWl0czogW1xuICAgIC8qKlxuICAgICAqIOWtl+WFuOaVsOaNruWPmOWMluS6i+S7tlxuICAgICAqL1xuICAgIFwiZGljdC1jaGFuZ2VcIixcblxuICAgIC8qKlxuICAgICAqIOmAieS4reWAvOWPmOWMluS6i+S7tu+8jOWPr+S7peiOt+WPluWIsOW9k+WJjemAieS4reeahG9wdGlvbuWvueixoVxuICAgICAqL1xuICAgIFwic2VsZWN0ZWQtY2hhbmdlXCIsXG4gICAgLyoqXG4gICAgICog5YC85Y+Y5YyW5LqL5Lu2XG4gICAgICovXG4gICAgXCJjaGFuZ2VcIlxuICBdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgY2FzY2FkZXJSZWYgPSByZWYoKTtcbiAgICBjb25zdCBkaWN0VXNlUmV0ID0gdXNlRGljdChwcm9wcywgY3R4KTtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IGZpZWxkTmFtZXNCaW5kZXIgPSByZWYoKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHByb3BzLmRpY3QpIHtcbiAgICAgIGZpZWxkTmFtZXNCaW5kZXIudmFsdWUgPSB1aS5jYXNjYWRlci5maWVsZE5hbWVzKHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB2YWx1ZTogcHJvcHMuZGljdC52YWx1ZSxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsYWJlbDogcHJvcHMuZGljdC5sYWJlbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjaGlsZHJlbjogcHJvcHMuZGljdC5jaGlsZHJlblxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IGRpY3RVc2VSZXQuY3JlYXRlQ29tcHV0ZWRPcHRpb25zKCk7XG5cbiAgICBmdW5jdGlvbiBvblNlbGVjdENoYW5nZSh2YWx1ZTogYW55KSB7XG4gICAgICBjdHguZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9ucyA9IFtdO1xuICAgICAgICBjb25zdCBkaWN0ID0gZGljdFVzZVJldC5nZXREaWN0KCk7XG4gICAgICAgIGlmIChkaWN0ICYmIGRpY3QuZGF0YU1hcCkge1xuICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdCA9IGRpY3QuZGF0YU1hcFtpdGVtXTtcbiAgICAgICAgICAgIGlmIChvcHQpIHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb25zLnB1c2gob3B0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgc2VsZWN0ZWRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIGNhc2NhZGVyUmVmLFxuICAgICAgLi4uZGljdFVzZVJldCxcbiAgICAgIGZpZWxkTmFtZXNCaW5kZXIsXG4gICAgICBjb21wdXRlZE9wdGlvbnMsXG4gICAgICBvblNlbGVjdENoYW5nZVxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnQgOmlzPVwidWkuY2hlY2tib3hHcm91cC5uYW1lXCIgQGNoYW5nZT1cIm9uU2VsZWN0ZWRDaGFuZ2VcIj5cbiAgICA8Y29tcG9uZW50XG4gICAgICA6aXM9XCJvcHRpb25OYW1lIHx8IHVpLmNoZWNrYm94Lm5hbWVcIlxuICAgICAgdi1mb3I9XCJpdGVtIG9mIGNvbXB1dGVkT3B0aW9uc1wiXG4gICAgICByZWY9XCJjaGVja2JveFJlZlwiXG4gICAgICA6a2V5PVwiZ2V0VmFsdWUoaXRlbSlcIlxuICAgICAgOlt1aS5jaGVja2JveC52YWx1ZV09XCJnZXRWYWx1ZShpdGVtKVwiXG4gICAgICB2LWJpbmQ9XCJvcHRpb25Qcm9wc1wiXG4gICAgICA+e3sgZ2V0TGFiZWwoaXRlbSkgfX08L2NvbXBvbmVudFxuICAgID5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcblxuLyoqXG4gKiDlrZflhbhjaGVja2JveFxuICog5pSv5oyBZWwtY2hlY2tib3h8YS1jaGVja2JveOWPguaVsFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRGljdENoZWNrYm94XCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5a2X5YW4XG4gICAgICovXG4gICAgZGljdDoge30sXG4gICAgLyoqXG4gICAgICog6YCJ6aG577yM5q+UZGljdC5kYXRh5LyY5YWI57qn6auYXG4gICAgICovXG4gICAgb3B0aW9uczogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogdW5kZWZpbmVkLCByZXF1aXJlOiBmYWxzZSB9LFxuXG4gICAgLyoqXG4gICAgICog6YCJ6aG555qE57uE5Lu25ZCN56ewXG4gICAgICovXG4gICAgb3B0aW9uTmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOmAiemhueeahOWxnuaAp1xuICAgICAqL1xuICAgIG9wdGlvblByb3BzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDovazmjaJEaWN0RGF0YVxuICAgICAqL1xuICAgIHRyYW5zZm9ybURpY3REYXRhOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcbiAgICAvKipcbiAgICAgKiDlrZflhbjmlbDmja7lj5jljJbkuovku7ZcbiAgICAgKi9cbiAgICBcImRpY3QtY2hhbmdlXCIsXG5cbiAgICAvKipcbiAgICAgKiDpgInkuK3lgLzlj5jljJbkuovku7bvvIzlj6/ku6Xojrflj5bliLDlvZPliY3pgInkuK3nmoRvcHRpb27lr7nosaFcbiAgICAgKi9cbiAgICBcInNlbGVjdGVkLWNoYW5nZVwiLFxuICAgIC8qKlxuICAgICAqIOWAvOWPmOWMluS6i+S7tlxuICAgICAqL1xuICAgIFwiY2hhbmdlXCJcbiAgXSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgbGV0IHVzZWREaWN0ID0gdXNlRGljdChwcm9wcywgY3R4LCB1aS5jaGVja2JveEdyb3VwLm1vZGVsVmFsdWUpO1xuICAgIGNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IHVzZWREaWN0LmNyZWF0ZUNvbXB1dGVkT3B0aW9ucygpO1xuICAgIGNvbnN0IG9uU2VsZWN0ZWRDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgY3R4LmVtaXQoXCJjaGFuZ2VcIiwgdmFsdWUpO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGxldCBzZWxlY3RlZE9wdGlvbnMgPSBbXTtcbiAgICAgICAgY29uc3QgZGljdCA9IHVzZWREaWN0LmdldERpY3QoKTtcbiAgICAgICAgaWYgKGRpY3QgJiYgZGljdC5kYXRhTWFwKSB7XG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0ID0gZGljdC5kYXRhTWFwW2l0ZW1dO1xuICAgICAgICAgICAgaWYgKG9wdCkge1xuICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbnMucHVzaChvcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBzZWxlY3RlZE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBudWxsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgLi4udXNlZERpY3QsXG4gICAgICBjb21wdXRlZE9wdGlvbnMsXG4gICAgICBvblNlbGVjdGVkQ2hhbmdlXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jaGVja2JveEdyb3VwLm5hbWVcIiBAY2hhbmdlPVwib25TZWxlY3RlZENoYW5nZVwiPlxuICAgIDxjb21wb25lbnRcbiAgICAgIDppcz1cIm9wdGlvbk5hbWUgfHwgdWkuY2hlY2tib3gubmFtZVwiXG4gICAgICB2LWZvcj1cIml0ZW0gb2YgY29tcHV0ZWRPcHRpb25zXCJcbiAgICAgIHJlZj1cImNoZWNrYm94UmVmXCJcbiAgICAgIDprZXk9XCJnZXRWYWx1ZShpdGVtKVwiXG4gICAgICA6W3VpLmNoZWNrYm94LnZhbHVlXT1cImdldFZhbHVlKGl0ZW0pXCJcbiAgICAgIHYtYmluZD1cIm9wdGlvblByb3BzXCJcbiAgICAgID57eyBnZXRMYWJlbChpdGVtKSB9fTwvY29tcG9uZW50XG4gICAgPlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuXG4vKipcbiAqIOWtl+WFuGNoZWNrYm94XG4gKiDmlK/mjIFlbC1jaGVja2JveHxhLWNoZWNrYm945Y+C5pWwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNEaWN0Q2hlY2tib3hcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDlrZflhbhcbiAgICAgKi9cbiAgICBkaWN0OiB7fSxcbiAgICAvKipcbiAgICAgKiDpgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiB1bmRlZmluZWQsIHJlcXVpcmU6IGZhbHNlIH0sXG5cbiAgICAvKipcbiAgICAgKiDpgInpobnnmoTnu4Tku7blkI3np7BcbiAgICAgKi9cbiAgICBvcHRpb25OYW1lOiB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog6YCJ6aG555qE5bGe5oCnXG4gICAgICovXG4gICAgb3B0aW9uUHJvcHM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOi9rOaNokRpY3REYXRhXG4gICAgICovXG4gICAgdHJhbnNmb3JtRGljdERhdGE6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfVxuICB9LFxuICBlbWl0czogW1xuICAgIC8qKlxuICAgICAqIOWtl+WFuOaVsOaNruWPmOWMluS6i+S7tlxuICAgICAqL1xuICAgIFwiZGljdC1jaGFuZ2VcIixcblxuICAgIC8qKlxuICAgICAqIOmAieS4reWAvOWPmOWMluS6i+S7tu+8jOWPr+S7peiOt+WPluWIsOW9k+WJjemAieS4reeahG9wdGlvbuWvueixoVxuICAgICAqL1xuICAgIFwic2VsZWN0ZWQtY2hhbmdlXCIsXG4gICAgLyoqXG4gICAgICog5YC85Y+Y5YyW5LqL5Lu2XG4gICAgICovXG4gICAgXCJjaGFuZ2VcIlxuICBdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBsZXQgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgsIHVpLmNoZWNrYm94R3JvdXAubW9kZWxWYWx1ZSk7XG4gICAgY29uc3QgY29tcHV0ZWRPcHRpb25zID0gdXNlZERpY3QuY3JlYXRlQ29tcHV0ZWRPcHRpb25zKCk7XG4gICAgY29uc3Qgb25TZWxlY3RlZENoYW5nZSA9ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICBjdHguZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9ucyA9IFtdO1xuICAgICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xuICAgICAgICBpZiAoZGljdCAmJiBkaWN0LmRhdGFNYXApIHtcbiAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBvcHQgPSBkaWN0LmRhdGFNYXBbaXRlbV07XG4gICAgICAgICAgICBpZiAob3B0KSB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9ucy5wdXNoKG9wdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIHNlbGVjdGVkT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIG51bGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICAuLi51c2VkRGljdCxcbiAgICAgIGNvbXB1dGVkT3B0aW9ucyxcbiAgICAgIG9uU2VsZWN0ZWRDaGFuZ2VcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50IDppcz1cInVpLnN3aXRjaC5uYW1lXCIgcmVmPVwic3dpdGNoUmVmXCIgdi1iaW5kPVwiYmluZGluZ1wiIC8+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XG5pbXBvcnQgeyB1aUNvbnRleHQgfSBmcm9tIFwiLi4vLi4vdWlcIjtcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgUHJvcFR5cGUgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBEaWN0T3B0aW9ucywgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5cbi8qKlxuICog5a2X5YW45byA5YWzXG4gKiDmlK/mjIFlbC1zd2l0Y2h8YS1zd2l0Y2jnmoTlsZ7mgKdcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0RpY3RTd2l0Y2hcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDlrZflhbjnrKzkuIDkuKrkuLrlvIDlkK9cbiAgICAgKiDnrKzkuozkuKrkuLrlhbPpl61cbiAgICAgKi9cbiAgICBkaWN0OiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8RGljdE9wdGlvbnM8YW55Pj5cbiAgICB9LFxuICAgIG9wdGlvbnM6IHt9LFxuICAgIC8qKlxuICAgICAqIOi9rOaNokRpY3REYXRhXG4gICAgICovXG4gICAgdHJhbnNmb3JtRGljdERhdGE6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfVxuICB9IGFzIGFueSxcbiAgZW1pdHM6IFtcImRpY3QtY2hhbmdlXCJdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBsZXQgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgsIHVpLnN3aXRjaC5tb2RlbFZhbHVlKTtcbiAgICBjb25zdCBjb21wdXRlZE9wdGlvbnMgPSB1c2VkRGljdC5jcmVhdGVDb21wdXRlZE9wdGlvbnMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICAuLi51c2VkRGljdCxcbiAgICAgIGNvbXB1dGVkT3B0aW9uc1xuICAgIH07XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgX2FjdGl2ZSgpIHtcbiAgICAgIGlmICh0aGlzLmNvbXB1dGVkT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVkT3B0aW9uc1swXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICAgIF9pbkFjdGl2ZSgpIHtcbiAgICAgIGlmICh0aGlzLmNvbXB1dGVkT3B0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVkT3B0aW9uc1sxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICAgIGJpbmRpbmcoKSB7XG4gICAgICBjb25zdCB1aSA9IHVpQ29udGV4dC5nZXQoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgW3VpLnN3aXRjaC5hY3RpdmVUZXh0XTogdGhpcy5fYWN0aXZlW3RoaXMuZGljdD8ubGFiZWwgfHwgXCJsYWJlbFwiXSxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBbdWkuc3dpdGNoLmluYWN0aXZlVGV4dF06IHRoaXMuX2luQWN0aXZlW3RoaXMuZGljdD8ubGFiZWwgfHwgXCJsYWJlbFwiXSxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBbdWkuc3dpdGNoLmFjdGl2ZUNvbG9yXTogdGhpcy5fYWN0aXZlW3RoaXMuZGljdD8uY29sb3IgfHwgXCJjb2xvclwiXSxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBbdWkuc3dpdGNoLmluYWN0aXZlQ29sb3JdOiB0aGlzLl9pbkFjdGl2ZVt0aGlzLmRpY3Q/LmNvbG9yIHx8IFwiY29sb3JcIl0sXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgW3VpLnN3aXRjaC5hY3RpdmVWYWx1ZV06IHRoaXMuX2FjdGl2ZVt0aGlzLmRpY3Q/LnZhbHVlIHx8IFwidmFsdWVcIl0sXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgW3VpLnN3aXRjaC5pbmFjdGl2ZVZhbHVlXTogdGhpcy5faW5BY3RpdmVbdGhpcy5kaWN0Py52YWx1ZSB8fCBcInZhbHVlXCJdXG4gICAgICB9O1xuICAgIH1cbiAgfVxufSk7XG48L3NjcmlwdD4iLCI8dGVtcGxhdGU+XG4gIDxzcGFuPnt7IGRvRm9ybWF0IH19PC9zcGFuPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIjtcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbi8qKlxuICog5pel5pyf5qC85byP5YyW5bGV56S657uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNEYXRlRm9ybWF0XCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5pel5pyf5pe26Ze05YC877yM5pSv5oyBbG9uZyxzdHJpbmcsZGF0Zeetie+8jOeUsWRheWpz6L2s5YyWXG4gICAgICovXG4gICAgbW9kZWxWYWx1ZTogeyByZXF1aXJlZDogZmFsc2UgfSxcbiAgICAvKipcbiAgICAgKiAg6L6T5YWl5qC85byP5YyW77yM5LiN5Lyg5YiZ55SxZGF5anPoh6rliqjovazljJZcbiAgICAgKi9cbiAgICB2YWx1ZUZvcm1hdDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IHVuZGVmaW5lZCwgcmVxdWlyZWQ6IGZhbHNlIH0sXG4gICAgLyoqXG4gICAgICogIOi+k+WHuuagvOW8j+WMllxuICAgICAqL1xuICAgIGZvcm1hdDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IFwiWVlZWS1NTS1ERCBISDptbTpzc1wiLCByZXF1aXJlZDogZmFsc2UgfVxuICB9LFxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtOiB7fVxuICAgIH07XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgZG9Gb3JtYXQoKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbFZhbHVlID09IG51bGwgfHwgdGhpcy5tb2RlbFZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgICAgbGV0IGRhdGUgPSBudWxsO1xuICAgICAgaWYgKHRoaXMudmFsdWVGb3JtYXQgIT0gbnVsbCkge1xuICAgICAgICBkYXRlID0gZGF5anModGhpcy5tb2RlbFZhbHVlLCB0aGlzLnZhbHVlRm9ybWF0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGUgPSBkYXlqcyh0aGlzLm1vZGVsVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGUuZm9ybWF0KHRoaXMuZm9ybWF0KTtcbiAgICB9XG4gIH0gYXMgYW55LFxuICBjcmVhdGVkKCkge30sXG4gIG1ldGhvZHM6IHt9XG59KTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50XG4gICAgOmlzPVwidWkudHJlZVNlbGVjdC5uYW1lXCJcbiAgICByZWY9XCJ0cmVlUmVmXCJcbiAgICA6W3VpLnRyZWVTZWxlY3Qub3B0aW9uc109XCJjb21wdXRlZE9wdGlvbnNcIlxuICAgIDpwbGFjZWhvbGRlcj1cImNvbXB1dGVkUGxhY2Vob2xkZXJcIlxuICAgIHYtYmluZD1cImNvbXB1dGVkQmluZGluZ1wiXG4gICAgQGNoYW5nZT1cIm9uU2VsZWN0ZWRDaGFuZ2VcIlxuICA+XG4gICAgPHRlbXBsYXRlIHYtZm9yPVwiKHZhbHVlLCBrZXkpIG9mIHNsb3RzXCIgOmtleT1cImtleVwiICNba2V5XT1cInNjb3BlXCI+XG4gICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwidmFsdWVcIiA6c2NvcGU9XCJzY29wZVwiPjwvZnMtc2xvdC1yZW5kZXI+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5cbi8qKlxuICog5a2X5YW45qCR6YCJ5oup57uE5Lu2XG4gKiDmlK/mjIEgYS10cmVlLXNlbGVjdCDlj4LmlbBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0RpY3RUcmVlXCIsXG4gIGNvbXBvbmVudHM6IHt9LFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaVsOaNruWtl+WFuFxuICAgICAqL1xuICAgIGRpY3Q6IHt9LFxuICAgIC8qKlxuICAgICAqIOWPr+mAiemhue+8jOavlGRpY3QuZGF0YeS8mOWFiOe6p+mrmFxuICAgICAqL1xuICAgIG9wdGlvbnM6IHsgdHlwZTogQXJyYXkgfSxcbiAgICAvKipcbiAgICAgKiBwbGFjZWhvbGRlclxuICAgICAqL1xuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZyB9LFxuICAgIC8qKlxuICAgICAqIOi9rOaNokRpY3REYXRhXG4gICAgICovXG4gICAgdHJhbnNmb3JtRGljdERhdGE6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfVxuICB9LFxuICBlbWl0czogW1xuICAgIC8qKlxuICAgICAqIOWtl+WFuOaVsOaNruWPmOWMluS6i+S7tlxuICAgICAqL1xuICAgIFwiZGljdC1jaGFuZ2VcIixcblxuICAgIC8qKlxuICAgICAqIOmAieS4reWAvOWPmOWMluS6i+S7tu+8jOWPr+S7peiOt+WPluWIsOW9k+WJjemAieS4reeahG9wdGlvbuWvueixoVxuICAgICAqL1xuICAgIFwic2VsZWN0ZWQtY2hhbmdlXCIsXG4gICAgLyoqXG4gICAgICog5YC85Y+Y5YyW5LqL5Lu2XG4gICAgICovXG4gICAgXCJjaGFuZ2VcIlxuICBdLFxuICAvLyByZW5kZXIgKCkge1xuICAvLyAgIHJldHVybiB0aGlzLnJlbmRlckZ1bmMoeyBkYXRhOiB0aGlzLmRhdGEsIGRhdGFNYXA6IHRoaXMuZGF0YU1hcCwgc2NvcGU6IHRoaXMuc2NvcGUsIGF0dHJzOiB0aGlzLiRhdHRycyB9KVxuICAvLyB9LFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCBjb21wdXRlZFBsYWNlaG9sZGVyID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLnBsYWNlaG9sZGVyIHx8IHQoXCJmcy5jb21wb25lbnQuc2VsZWN0LnBsYWNlaG9sZGVyXCIpO1xuICAgIH0pO1xuXG4gICAgbGV0IHVzZWREaWN0ID0gdXNlRGljdChwcm9wcywgY3R4KTtcblxuICAgIGNvbnN0IHNsb3RzID0gY3R4LnNsb3RzO1xuXG4gICAgY29uc3QgY29tcHV0ZWRPcHRpb25zID0gdXNlZERpY3QuY3JlYXRlQ29tcHV0ZWRPcHRpb25zKCk7XG5cbiAgICBjb25zdCBjb21wdXRlZEJpbmRpbmcgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xuICAgICAgcmV0dXJuIHVpLnRyZWVTZWxlY3QuYnVpbGRPcHRpb25LZXlzTmFtZUJpbmRpbmcoe1xuICAgICAgICBsYWJlbDogZGljdC5sYWJlbCxcbiAgICAgICAgdmFsdWU6IGRpY3QudmFsdWUsXG4gICAgICAgIGNoaWxkcmVuOiBkaWN0LmNoaWxkcmVuXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IG9uU2VsZWN0ZWRDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgY3R4LmVtaXQoXCJjaGFuZ2VcIiwgdmFsdWUpO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XG4gICAgICAgIGlmIChkaWN0ICYmIGRpY3QuZGF0YU1hcCkge1xuICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb25zID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9wdCA9IGRpY3QuZGF0YU1hcFtpdGVtXTtcbiAgICAgICAgICAgICAgaWYgKG9wdCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9ucy5wdXNoKG9wdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIHNlbGVjdGVkT3B0aW9ucyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIGRpY3QuZGF0YU1hcFt2YWx1ZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHRyZWVSZWYgPSByZWYoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICBjb21wdXRlZEJpbmRpbmcsXG4gICAgICBjb21wdXRlZFBsYWNlaG9sZGVyLFxuICAgICAgLi4udXNlZERpY3QsXG4gICAgICBjb21wdXRlZE9wdGlvbnMsXG4gICAgICBvblNlbGVjdGVkQ2hhbmdlLFxuICAgICAgc2xvdHMsXG4gICAgICB0cmVlUmVmXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cInVpLnRyZWVTZWxlY3QubmFtZVwiXG4gICAgcmVmPVwidHJlZVJlZlwiXG4gICAgOlt1aS50cmVlU2VsZWN0Lm9wdGlvbnNdPVwiY29tcHV0ZWRPcHRpb25zXCJcbiAgICA6cGxhY2Vob2xkZXI9XCJjb21wdXRlZFBsYWNlaG9sZGVyXCJcbiAgICB2LWJpbmQ9XCJjb21wdXRlZEJpbmRpbmdcIlxuICAgIEBjaGFuZ2U9XCJvblNlbGVjdGVkQ2hhbmdlXCJcbiAgPlxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIih2YWx1ZSwga2V5KSBvZiBzbG90c1wiIDprZXk9XCJrZXlcIiAjW2tleV09XCJzY29wZVwiPlxuICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInZhbHVlXCIgOnNjb3BlPVwic2NvcGVcIj48L2ZzLXNsb3QtcmVuZGVyPlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCByZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VEaWN0IH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtZGljdFwiO1xuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuXG4vKipcbiAqIOWtl+WFuOagkemAieaLqee7hOS7tlxuICog5pSv5oyBIGEtdHJlZS1zZWxlY3Qg5Y+C5pWwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNEaWN0VHJlZVwiLFxuICBjb21wb25lbnRzOiB7fSxcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDmlbDmja7lrZflhbhcbiAgICAgKi9cbiAgICBkaWN0OiB7fSxcbiAgICAvKipcbiAgICAgKiDlj6/pgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5IH0sXG4gICAgLyoqXG4gICAgICogcGxhY2Vob2xkZXJcbiAgICAgKi9cbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcgfSxcbiAgICAvKipcbiAgICAgKiDovazmjaJEaWN0RGF0YVxuICAgICAqL1xuICAgIHRyYW5zZm9ybURpY3REYXRhOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcbiAgICAvKipcbiAgICAgKiDlrZflhbjmlbDmja7lj5jljJbkuovku7ZcbiAgICAgKi9cbiAgICBcImRpY3QtY2hhbmdlXCIsXG5cbiAgICAvKipcbiAgICAgKiDpgInkuK3lgLzlj5jljJbkuovku7bvvIzlj6/ku6Xojrflj5bliLDlvZPliY3pgInkuK3nmoRvcHRpb27lr7nosaFcbiAgICAgKi9cbiAgICBcInNlbGVjdGVkLWNoYW5nZVwiLFxuICAgIC8qKlxuICAgICAqIOWAvOWPmOWMluS6i+S7tlxuICAgICAqL1xuICAgIFwiY2hhbmdlXCJcbiAgXSxcbiAgLy8gcmVuZGVyICgpIHtcbiAgLy8gICByZXR1cm4gdGhpcy5yZW5kZXJGdW5jKHsgZGF0YTogdGhpcy5kYXRhLCBkYXRhTWFwOiB0aGlzLmRhdGFNYXAsIHNjb3BlOiB0aGlzLnNjb3BlLCBhdHRyczogdGhpcy4kYXR0cnMgfSlcbiAgLy8gfSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgY29tcHV0ZWRQbGFjZWhvbGRlciA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBwcm9wcy5wbGFjZWhvbGRlciB8fCB0KFwiZnMuY29tcG9uZW50LnNlbGVjdC5wbGFjZWhvbGRlclwiKTtcbiAgICB9KTtcblxuICAgIGxldCB1c2VkRGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCk7XG5cbiAgICBjb25zdCBzbG90cyA9IGN0eC5zbG90cztcblxuICAgIGNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IHVzZWREaWN0LmNyZWF0ZUNvbXB1dGVkT3B0aW9ucygpO1xuXG4gICAgY29uc3QgY29tcHV0ZWRCaW5kaW5nID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgZGljdCA9IHVzZWREaWN0LmdldERpY3QoKTtcbiAgICAgIHJldHVybiB1aS50cmVlU2VsZWN0LmJ1aWxkT3B0aW9uS2V5c05hbWVCaW5kaW5nKHtcbiAgICAgICAgbGFiZWw6IGRpY3QubGFiZWwsXG4gICAgICAgIHZhbHVlOiBkaWN0LnZhbHVlLFxuICAgICAgICBjaGlsZHJlbjogZGljdC5jaGlsZHJlblxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvblNlbGVjdGVkQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xuICAgICAgICBpZiAoZGljdCAmJiBkaWN0LmRhdGFNYXApIHtcbiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9ucyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCBvcHQgPSBkaWN0LmRhdGFNYXBbaXRlbV07XG4gICAgICAgICAgICAgIGlmIChvcHQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbnMucHVzaChvcHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBzZWxlY3RlZE9wdGlvbnMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBkaWN0LmRhdGFNYXBbdmFsdWVdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIG51bGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB0cmVlUmVmID0gcmVmKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgY29tcHV0ZWRCaW5kaW5nLFxuICAgICAgY29tcHV0ZWRQbGFjZWhvbGRlcixcbiAgICAgIC4uLnVzZWREaWN0LFxuICAgICAgY29tcHV0ZWRPcHRpb25zLFxuICAgICAgb25TZWxlY3RlZENoYW5nZSxcbiAgICAgIHNsb3RzLFxuICAgICAgdHJlZVJlZlxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy10YWJsZS1zZWxlY3RcIj5cbiAgICA8dGVtcGxhdGUgdi1pZj1cIiFzbG90cz8uZGVmYXVsdCAmJiAhdmlld01vZGVcIj5cbiAgICAgIDxmcy1kaWN0LXNlbGVjdFxuICAgICAgICByZWY9XCJkaWN0U2VsZWN0UmVmXCJcbiAgICAgICAgdi1iaW5kPVwiY29tcHV0ZWRTZWxlY3RcIlxuICAgICAgICA6b3Blbj1cImZhbHNlXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICA6cmVhZG9ubHk9XCJyZWFkb25seVwiXG4gICAgICAgIDpkaWN0PVwiZGljdFwiXG4gICAgICAgIEBjbGljaz1cIm9wZW5UYWJsZVNlbGVjdFwiXG4gICAgICAvPlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHNsb3Qgdi1iaW5kPVwic2NvcGVSZWZcIj48L3Nsb3Q+XG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5za2lwVmFsaWRhdGlvbldyYXBwZXJcIj5cbiAgICAgIDxmcy1mb3JtLXdyYXBwZXIgcmVmPVwiZm9ybVdyYXBwZXJSZWZcIiB2LWJpbmQ9XCJmb3JtV3JhcHBlck9wdGlvbnNcIiBAY2xvc2VkPVwib25DbG9zZVwiIEBvcGVuPVwib25PcGVuXCI+XG4gICAgICAgIDx0ZW1wbGF0ZSAjZm9ybS1ib2R5LXRvcD5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCJkaWFsb2dPcGVuIHx8IGRlc3Ryb3lPbkNsb3NlID09PSBmYWxzZVwiIDpzdHlsZT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiBoZWlnaHQgfHwgJzcwdmgnIH1cIj5cbiAgICAgICAgICAgIDxmcy1jcnVkIHJlZj1cImNydWRSZWZcIiB2LWJpbmQ9XCJjcnVkQmluZGluZ1wiPlxuICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlci10b3A+XG4gICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwic2hvd0N1cnJlbnQgIT09IGZhbHNlICYmICF2aWV3TW9kZVwiIGNsYXNzPVwiZnMtdGFibGUtc2VsZWN0LWN1cnJlbnRcIj5cbiAgICAgICAgICAgICAgICAgIOW9k+WJjemAieS4re+8mlxuICAgICAgICAgICAgICAgICAgPGZzLXZhbHVlcy1mb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgcmVmPVwidmFsdWVzRm9ybWF0UmVmXCJcbiAgICAgICAgICAgICAgICAgICAgdi1tb2RlbD1cInNlbGVjdGVkUm93S2V5c1wiXG4gICAgICAgICAgICAgICAgICAgIDpkaWN0PVwiZGljdFwiXG4gICAgICAgICAgICAgICAgICAgIDpjbG9zYWJsZT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICB2LWJpbmQ9XCJjb21wdXRlZFZhbHVlc0Zvcm1hdFwiXG4gICAgICAgICAgICAgICAgICA+PC9mcy12YWx1ZXMtZm9ybWF0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgPC9mcy1jcnVkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9mcy1mb3JtLXdyYXBwZXI+XG4gICAgICA8IS0tICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5kaWFsb2cubmFtZVwiIHYtbW9kZWw6W3VpLmRpYWxvZy52aXNpYmxlXT1cImRpYWxvZ09wZW5cIiB2LWJpbmQ9XCJjb21wdXRlZERpYWxvZ0JpbmRpbmdcIj4tLT5cbiAgICAgIDwhLS0gICAgICAgIDx0ZW1wbGF0ZSAjW3VpLmRpYWxvZy5mb290ZXJTbG90TmFtZV0+LS0+XG4gICAgICA8IS0tICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuYnV0dG9uLm5hbWVcIiB2LWlmPVwiIXZpZXdNb2RlXCIgQGNsaWNrPVwiZGlhbG9nT3BlbiA9IGZhbHNlXCI+5Y+W5raIPC9jb21wb25lbnQ+LS0+XG4gICAgICA8IS0tICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuYnV0dG9uLm5hbWVcIiB0eXBlPVwicHJpbWFyeVwiIEBjbGljaz1cIm9uT2tcIj7noa7orqQ8L2NvbXBvbmVudD4tLT5cbiAgICAgIDwhLS0gICAgICAgIDwvdGVtcGxhdGU+LS0+XG4gICAgICA8IS0tICAgICAgPC9jb21wb25lbnQ+LS0+XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzeFwiIHNldHVwPlxuaW1wb3J0IHsgRGljdCwgdXNlQ29tcHV0ZSwgdXNlRnNBc3luYywgdXNlRnNSZWYsIHVzZU1lcmdlLCB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbmltcG9ydCB7IGNvbXB1dGVkLCBuZXh0VGljaywgcmVmLCBSZWYsIHdhdGNoIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgQ3JlYXRlQ3J1ZE9wdGlvbnMsIER5bmFtaWNhbGx5Q3J1ZE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vZFwiO1xuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcblxudHlwZSBGc1RhYmxlU2VsZWN0UHJvcHMgPSB7XG4gIC8qKlxuICAgKiBtb2RlbFZhbHVlXG4gICAqL1xuICBtb2RlbFZhbHVlOiBhbnk7XG4gIC8qKlxuICAgKiBjcnVkT3B0aW9uc+WIm+W7uuaWueazlVxuICAgKi9cbiAgY3JlYXRlQ3J1ZE9wdGlvbnM6IENyZWF0ZUNydWRPcHRpb25zO1xuICAvKipcbiAgICogY3J1ZE9wdGlvbnMg6KaG55uW6YWN572uXG4gICAqL1xuICBjcnVkT3B0aW9uc092ZXJyaWRlPzogRHluYW1pY2FsbHlDcnVkT3B0aW9ucztcblxuICAvKipcbiAgICog5omT5byA5a+56K+d5qGG5YmN77yM5Y+v5Lul5L+u5pS56YWN572uXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBiZWZvcmVPcGVuPzogKG9wdGlvbnM6IHtcbiAgICBjcnVkT3B0aW9uczogRHluYW1pY2FsbHlDcnVkT3B0aW9ucztcbiAgICBzZWxlY3RlZFJvd0tleXM6IGFueTtcbiAgICBvcGVuOiBhbnk7XG4gICAgb3BlbmVkOiBhbnk7XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9KSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICog5pWw5o2u5a2X5YW4XG4gICAqIOW/hemgiOmFjee9rmBnZXROb2Rlc0J5VmFsdWVzYOWPguaVsCzkvaDpnIDopoHlrp7njrDvvJrmoLnmja5pZOWIl+ihqOWQkeWQjuWPsOivt+axguWkmuihjOaVsOaNruW5tui/lOWbnlxuICAgKiBgZGljdC52YWx1ZeW/hemhu+S4jnRhYmxlLnJvd0tleeS4gOiHtGBcbiAgICovXG4gIGRpY3Q6IERpY3Q7XG4gIC8qKlxuICAgKiDpgInmi6nmoYYgZnMtZGljdC1zZWxlY3TphY3nva5cbiAgICovXG4gIHNlbGVjdD86IGFueTtcblxuICAvKipcbiAgICog5piv5ZCm5pi+56S66YCJ5oup5qGGXG4gICAqIOacieaXtuWAmeS9oOWPquaYr+aDs+imgemCo+S4qumAieaLqeeahERpYWxvZ++8jOmCo+S5iOS9oOWPr+S7pemakOiXj3NlbGVjdO+8jOeEtuWQjuiHquWumuS5iea/gOa0u+aWueW8j1xuICAgKi9cbiAgc2hvd1NlbGVjdD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiDlr7nor53moYbphY3nva5cbiAgICovXG4gIGRpYWxvZz86IGFueTtcblxuICAvKipcbiAgICog5a+56K+d5qGG5Lit5piv5ZCm5pi+56S65b2T5YmN6YCJ5Lit5YC8XG4gICAqL1xuICBzaG93Q3VycmVudD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiDlvZPliY3pgInkuK3lgLwgZnMtdmFsdWVzLWZvcm1hdOe7hOS7tiDphY3nva5cbiAgICovXG4gIHZhbHVlc0Zvcm1hdD86IGFueTtcblxuICAvKipcbiAgICogY3J1ZOmrmOW6plxuICAgKi9cbiAgaGVpZ2h0Pzogc3RyaW5nO1xuICAvKipcbiAgICog5piv5ZCm5aSa6YCJXG4gICAqL1xuICBtdWx0aXBsZT86IGJvb2xlYW47IC8v5Y2V6YCJ6L+Y5piv5aSa6YCJXG4gIC8qKlxuICAgKiDot6jpobXpgInkuK1cbiAgICovXG4gIGNyb3NzUGFnZT86IGJvb2xlYW47IC8v6Leo6aG16YCJ5LitXG5cbiAgLyoqXG4gICAqIOWPr+mAiSxlbGVtZW50LXBsdXPlv4XkvKBcbiAgICovXG4gIHJvd0tleT86IHN0cmluZztcblxuICBkaXNhYmxlZD86IGJvb2xlYW47XG5cbiAgcmVhZG9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiDlgLznsbvlnotcbiAgICovXG4gIHZhbHVlVHlwZT86IFwidmFsdWVcIiB8IFwib2JqZWN0XCI7XG5cbiAgLyoqXG4gICAqIOaYr+WQpuafpeeci+aooeW8j1xuICAgKi9cbiAgdmlld01vZGU/OiBib29sZWFuO1xuICAvKipcbiAgICog5p+l55yL5qih5byP5LiL5piv5ZCm6Kem5Y+RY2hhbmdl5LqL5Lu2XG4gICAqL1xuICBlbWl0T25WaWV3TW9kZWw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiB0YWJsZeaYr+WQpui3n+maj+eql+WPo+WFs+mXreiAjOmUgOavgVxuICAgKi9cbiAgZGVzdHJveU9uQ2xvc2U/OiBib29sZWFuO1xufTtcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKGRlZmluZVByb3BzPEZzVGFibGVTZWxlY3RQcm9wcz4oKSwge1xuICBjcm9zc1BhZ2U6IHRydWUsXG4gIHJvd0tleTogdW5kZWZpbmVkLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIHJlYWRvbmx5OiBmYWxzZSxcbiAgaGVpZ2h0OiB1bmRlZmluZWQsXG4gIHZhbHVlc0Zvcm1hdDogdW5kZWZpbmVkLFxuICBkaWFsb2c6IHVuZGVmaW5lZCxcbiAgc2VsZWN0OiB1bmRlZmluZWQsXG4gIGNydWRPcHRpb25zT3ZlcnJpZGU6IHVuZGVmaW5lZCxcbiAgdmFsdWVUeXBlOiBcInZhbHVlXCIsXG4gIHNob3dTZWxlY3Q6IHRydWUsXG4gIHNob3dDdXJyZW50OiB0cnVlLFxuICB2aWV3TW9kZTogZmFsc2UsXG4gIGVtaXRPblZpZXdNb2RlbDogdHJ1ZSxcbiAgZGVzdHJveU9uQ2xvc2U6IHRydWUsXG4gIC8qKlxuICAgKiBjcmVhdGVDcnVkT3B0aW9uc+aWueazleaYr+WQjOatpei/mOaYr+W8guatpVxuICAgKi9cbiAgSXNTeW5jQ3JlYXRlOiBmYWxzZVxufSk7XG5cbmNvbnN0IHNsb3RzID0gZGVmaW5lU2xvdHM8e1xuICAvKipgXG4gICAqIOm7mOiupOaPkuanvVxuICAgKiBgYGBqc1xuICAgKiBzY29wZSA9IHtcbiAgICogIC8v5piv5ZCm5bey5omT5byAXG4gICAqICBvcGVuZWQ6Ym9vbGVhbixcbiAgICogIC8v5omT5byA5pa55rOVXG4gICAqICBvcGVuOigpPT52b2lkXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBkZWZhdWx0OiBhbnk7XG59PigpO1xuXG5jb25zdCBlbWl0cyA9IGRlZmluZUVtaXRzKFtcbiAgXCJjaGFuZ2VcIixcbiAgXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLFxuICAvKiDpgInkuK3ooYzlj5jljJbkuovku7YgKi9cbiAgXCJzZWxlY3RlZC1jaGFuZ2VcIixcbiAgLyrlr7nor53moYbljbPlsIblhbPpl60qL1xuICBcImRpYWxvZy1jbG9zZVwiLFxuICAvKuWvueivneahhuW3suWFs+mXrSovXG4gIFwiZGlhbG9nLWNsb3NlZFwiXG5dKTtcbmNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG5jb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcbmNvbnN0IGRpY3RTZWxlY3RSZWYgPSByZWYoKTtcbmNvbnN0IHZhbHVlc0Zvcm1hdFJlZiA9IHJlZigpO1xuY29uc3QgZGlhbG9nT3BlbiA9IHJlZihmYWxzZSk7XG5cbmZ1bmN0aW9uIG9uQ2xvc2UoKSB7XG4gIGRpYWxvZ09wZW4udmFsdWUgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIG9uT3BlbigpIHtcbiAgZGlhbG9nT3Blbi52YWx1ZSA9IHRydWU7XG59XG5cbmNvbnN0IHsgY3J1ZFJlZiwgY3J1ZEJpbmRpbmcsIGNydWRFeHBvc2UgfSA9IHVzZUZzUmVmKCk7XG5cbmZ1bmN0aW9uIGluaXRTZWxlY3RlZEtleXMobW9kZWxWYWx1ZTogYW55KSB7XG4gIGlmIChtb2RlbFZhbHVlID09IG51bGwgfHwgKEFycmF5LmlzQXJyYXkobW9kZWxWYWx1ZSkgJiYgbW9kZWxWYWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICBzZWxlY3RlZFJvd0tleXMudmFsdWUgPSBbXTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcbiAgICAgIHNlbGVjdGVkUm93S2V5cy52YWx1ZSA9IG1vZGVsVmFsdWUgfHwgW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGVkUm93S2V5cy52YWx1ZSA9IFttb2RlbFZhbHVlXTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgc2VsZWN0ZWRSb3dLZXlzLnZhbHVlID0gc2VsZWN0ZWRSb3dLZXlzLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvcHMuZGljdC5nZXRWYWx1ZShpdGVtKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBmb3JtV3JhcHBlclJlZiA9IHJlZigpO1xuY29uc3QgZm9ybVdyYXBwZXJPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHdyYXBwZXI6IHt9XG4gIH07XG59KTtcblxuY29uc3Qgb3BlblRhYmxlU2VsZWN0ID0gYXN5bmMgKG9wZW5PcHRpb25zOiB7IGNydWRPcHRpb25zPzogRHluYW1pY2FsbHlDcnVkT3B0aW9uczsgY29udGV4dD86IGFueSB9ID0ge30pID0+IHtcbiAgaWYgKHByb3BzLmRpc2FibGVkIHx8IHByb3BzLnJlYWRvbmx5IHx8IHByb3BzLnNlbGVjdD8uZGlzYWJsZWQgfHwgcHJvcHMuc2VsZWN0Py5yZWFkb25seSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvcHMuZGljdCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwi5b+F6aG76YWN572uZGljdO+8jOS4lOW/hemhu+mFjee9rmRpY3QuZ2V0Tm9kZXNCeVZhbHVlc1wiKTtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHVzZUZzQXN5bmMoe1xuICAgIGNydWRCaW5kaW5nLFxuICAgIGNydWRSZWYsXG4gICAgY3JlYXRlQ3J1ZE9wdGlvbnM6IHByb3BzLmNyZWF0ZUNydWRPcHRpb25zLFxuICAgIGNydWRPcHRpb25zT3ZlcnJpZGU6IGJ1aWxkTWVyZ2VkQ3J1ZE9wdGlvbnMoKSxcbiAgICBjb250ZXh0OiB7XG4gICAgICB0LFxuICAgICAgdWksXG4gICAgICAuLi5vcGVuT3B0aW9ucz8uY29udGV4dFxuICAgIH0sXG4gICAgY3J1ZEV4cG9zZVxuICB9KTtcblxuICBpbml0U2VsZWN0ZWRLZXlzKHByb3BzLm1vZGVsVmFsdWUpO1xuICBpZiAocHJvcHMuYmVmb3JlT3Blbikge1xuICAgIGF3YWl0IHByb3BzLmJlZm9yZU9wZW4oe1xuICAgICAgY3J1ZE9wdGlvbnM6IG9wZW5PcHRpb25zPy5jcnVkT3B0aW9ucyxcbiAgICAgIC4uLmdldFNjb3BlQ29udGV4dCgpXG4gICAgfSk7XG4gIH1cbiAgaWYgKG9wZW5PcHRpb25zKSB7XG4gICAgcmV0LmFwcGVuZENydWRPcHRpb25zKG9wZW5PcHRpb25zPy5jcnVkT3B0aW9ucyk7XG4gIH1cbiAgY29uc3Qgd3JhcHBlck9wdGlvbnMgPSBtZXJnZShcbiAgICB7XG4gICAgICB3cmFwcGVyOiB7XG4gICAgICAgIHRpdGxlOiBwcm9wcy52aWV3TW9kZSA/IHQoXCJmcy5leHRlbmRzLnRhYmxlU2VsZWN0LnZpZXdcIikgOiB0KFwiZnMuZXh0ZW5kcy50YWJsZVNlbGVjdC5zZWxlY3RcIiksXG4gICAgICAgIHdpZHRoOiBcIjgwJVwiLFxuICAgICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICAgIGlzOiB1aS5kaWFsb2cubmFtZSxcbiAgICAgICAgZm9vdGVyOiBmYWxzZSxcbiAgICAgICAgLi4udWkuZm9ybVdyYXBwZXIuYnVpbGRJbml0QmluZCh1aS5kaWFsb2cubmFtZSksXG4gICAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgc2hvdzogZmFsc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgICAgdGV4dDogdChcImZzLmV4dGVuZHMudGFibGVTZWxlY3QuY2FuY2VsXCIpLFxuICAgICAgICAgICAgYXN5bmMgY2xpY2soKSB7XG4gICAgICAgICAgICAgIGZvcm1XcmFwcGVyUmVmLnZhbHVlLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvazoge1xuICAgICAgICAgICAgdHlwZTogXCJwcmltYXJ5XCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMuZXh0ZW5kcy50YWJsZVNlbGVjdC5va1wiKSxcbiAgICAgICAgICAgIGFzeW5jIGNsaWNrKCkge1xuICAgICAgICAgICAgICBhd2FpdCBvbk9rKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICB3cmFwcGVyOiBwcm9wcy5kaWFsb2dcbiAgICB9XG4gICk7XG4gIGZvcm1XcmFwcGVyUmVmLnZhbHVlLm9wZW4od3JhcHBlck9wdGlvbnMpO1xuXG4gIGF3YWl0IG5leHRUaWNrKCk7XG4gIGF3YWl0IGNydWRFeHBvc2UuZG9SZWZyZXNoKCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5jb25zdCBjb21wdXRlZFZhbHVlc0Zvcm1hdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wcm9wcy52YWx1ZXNGb3JtYXRcbiAgfTtcbn0pO1xuXG5jb25zdCBjb21wdXRlZFNlbGVjdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3QgdXBkYXRlS2V5ID0gYG9uVXBkYXRlOiR7dWkuc2VsZWN0Lm1vZGVsVmFsdWV9YDtcblxuICBsZXQgdmFsdWUgPSBwcm9wcy5tb2RlbFZhbHVlO1xuICBpZiAocHJvcHMudmFsdWVUeXBlID09PSBcIm9iamVjdFwiICYmIHByb3BzLm1vZGVsVmFsdWUpIHtcbiAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcbiAgICAgIHZhbHVlID0gcHJvcHMubW9kZWxWYWx1ZS5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvcHMuZGljdC5nZXRWYWx1ZShpdGVtKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHByb3BzLmRpY3QuZ2V0VmFsdWUocHJvcHMubW9kZWxWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgW3VpLnNlbGVjdC5tb2RlbFZhbHVlXTogdmFsdWUsXG4gICAgW3VwZGF0ZUtleV06ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICBlbWl0cyhcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgICB9LFxuICAgIFt1aS5zZWxlY3QuY2xlYXJhYmxlXTogdHJ1ZSxcbiAgICAuLi51aS5zZWxlY3QuYnVpbGRNdWx0aUJpbmRpbmcocHJvcHMubXVsdGlwbGUpLFxuICAgIHNob3c6IGZhbHNlLFxuICAgIC4uLnByb3BzLnNlbGVjdFxuICB9O1xufSk7XG5cbi8vIGNvbnN0IGNvbXB1dGVkRGlhbG9nQmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbi8vICAgY29uc3QgYmFzZSA9IHVpLmRpYWxvZy5idWlsZFByb3BzKHtcbi8vICAgICB0aXRsZTogcHJvcHMudmlld01vZGUgPyB0KFwiZnMuZXh0ZW5kcy50YWJsZVNlbGVjdC52aWV3XCIpIDogdChcImZzLmV4dGVuZHMudGFibGVTZWxlY3Quc2VsZWN0XCIpLFxuLy8gICAgIHdpZHRoOiBcIjgwJVwiXG4vLyAgIH0pO1xuLy8gICByZXR1cm4gbWVyZ2UoYmFzZSwgcHJvcHMuZGlhbG9nKTtcbi8vIH0pO1xuXG53YXRjaChcbiAgKCkgPT4ge1xuICAgIHJldHVybiBwcm9wcy5tb2RlbFZhbHVlO1xuICB9LFxuICBhc3luYyAodmFsdWUpID0+IHtcbiAgICBpZiAodmFsdWUgPT09IHNlbGVjdGVkUm93S2V5cy52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbml0U2VsZWN0ZWRLZXlzKHZhbHVlKTtcbiAgICBhd2FpdCBuZXh0VGljaygpO1xuICAgIGF3YWl0IHByb3BzLmRpY3QuYXBwZW5kQnlWYWx1ZXMoc2VsZWN0ZWRSb3dLZXlzLnZhbHVlKTtcbiAgICAvLyBkaWN0U2VsZWN0UmVmLnZhbHVlLnJlbG9hZERpY3QoKTtcbiAgfVxuKTtcbmNvbnN0IHNlbGVjdGVkUm93S2V5czogUmVmPGFueVtdPiA9IHJlZihbXSk7XG5cbmZ1bmN0aW9uIGdldFJvd0tleSgpIHtcbiAgcmV0dXJuIHByb3BzLnJvd0tleSB8fCBjcnVkQmluZGluZy52YWx1ZS50YWJsZS5yb3dLZXkgfHwgXCJpZFwiO1xufVxuY29uc3QgcmVmcmVzaGluZyA9IHJlZihmYWxzZSk7XG5cbmZ1bmN0aW9uIGJ1aWxkTWVyZ2VkQ3J1ZE9wdGlvbnMoKSB7XG4gIGxldCB0YWJsZUNJID0gdWkudGFibGU7XG4gIGlmIChjcnVkQmluZGluZy52YWx1ZT8udGFibGU/LnRhYmxlVmVyc2lvbiA9PT0gXCJ2MlwiKSB7XG4gICAgdGFibGVDSSA9IHVpLnRhYmxlVjI7XG4gIH1cbiAgbGV0IHNlbGVjdGlvbk9wdGlvbnMgPSB0YWJsZUNJLmJ1aWxkU2VsZWN0aW9uQ3J1ZE9wdGlvbnMoe1xuICAgIGNyb3NzUGFnZTogcHJvcHMuY3Jvc3NQYWdlLFxuICAgIHNlbGVjdE9uQ2xpY2tSb3c6IHRydWUsXG4gICAgZ2V0Um93S2V5LFxuICAgIGdldFBhZ2VEYXRhKCkge1xuICAgICAgcmV0dXJuIGNydWRCaW5kaW5nLnZhbHVlLmRhdGE7XG4gICAgfSxcbiAgICB1c2VDb21wdXRlOiB1c2VDb21wdXRlLFxuICAgIG11bHRpcGxlOiBwcm9wcy5tdWx0aXBsZSxcbiAgICBzZWxlY3RlZFJvd0tleXMsXG4gICAgb25TZWxlY3RlZEtleXNDaGFuZ2VkOiBhc3luYyAoY2hhbmdlZCkgPT4ge1xuICAgICAgc2VsZWN0ZWRSb3dLZXlzLnZhbHVlID0gWy4uLmNoYW5nZWRdO1xuICAgICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICAgIGF3YWl0IHByb3BzLmRpY3QuYXBwZW5kQnlWYWx1ZXMoc2VsZWN0ZWRSb3dLZXlzLnZhbHVlKTtcbiAgICAgIC8vIGlmICh2YWx1ZXNGb3JtYXRSZWYudmFsdWUpIHtcbiAgICAgIC8vICAgdmFsdWVzRm9ybWF0UmVmLnZhbHVlLnJlbG9hZERpY3QoKTtcbiAgICAgIC8vIH1cbiAgICB9XG4gIH0pO1xuICBjb25zdCBjcnVkT3B0aW9ucyA9IHtcbiAgICB0YWJsZToge1xuICAgICAgYXN5bmMgb25SZWZyZXNoZWQoKSB7XG4gICAgICAgIGlmICh0YWJsZUNJLnNldFNlbGVjdGVkUm93cykge1xuICAgICAgICAgIHJlZnJlc2hpbmcudmFsdWUgPSB0cnVlO1xuICAgICAgICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgICAgICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICAgICAgICBjb25zdCBiYXNlVGFibGVSZWYgPSBjcnVkRXhwb3NlLmdldEJhc2VUYWJsZVJlZigpO1xuICAgICAgICAgIHRhYmxlQ0kuc2V0U2VsZWN0ZWRSb3dzKHtcbiAgICAgICAgICAgIGdldFJvd0tleSxcbiAgICAgICAgICAgIG11bHRpcGxlOiBwcm9wcy5tdWx0aXBsZSxcbiAgICAgICAgICAgIHRhYmxlUmVmOiBiYXNlVGFibGVSZWYsXG4gICAgICAgICAgICBzZWxlY3RlZFJvd0tleXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZWZyZXNoaW5nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBtZXJnZShjcnVkT3B0aW9ucywgc2VsZWN0aW9uT3B0aW9ucywgcHJvcHMuY3J1ZE9wdGlvbnNPdmVycmlkZSk7XG59XG5cbmNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG5cbi8vIHdhdGNoKFxuLy8gICAoKSA9PiB7XG4vLyAgICAgcmV0dXJuIHByb3BzLmNydWRPcHRpb25zT3ZlcnJpZGU7XG4vLyAgIH0sXG4vLyAgIGFzeW5jICh2YWx1ZSwgb2xkVmFsdWUpID0+IHtcbi8vICAgICBpZiAoSlNPTi5zdHJpbmdpZnkodmFsdWUpID09PSBKU09OLnN0cmluZ2lmeShvbGRWYWx1ZSkpIHtcbi8vICAgICAgIHJldHVybjtcbi8vICAgICB9XG4vLyAgICAgY29uc3QgY3VyID0gY3J1ZEJpbmRpbmcudmFsdWU/LnBhZ2luYXRpb25bdWkucGFnaW5hdGlvbi5jdXJyZW50UGFnZV07XG4vLyAgICAgYXBwZW5kQ3J1ZE9wdGlvbnModmFsdWUpO1xuLy8gICAgIGlmIChjcnVkUmVmLnZhbHVlKSB7XG4vLyAgICAgICBjcnVkQmluZGluZy52YWx1ZS5wYWdpbmF0aW9uW3VpLnBhZ2luYXRpb24uY3VycmVudFBhZ2VdID0gY3VyO1xuLy8gICAgICAgYXdhaXQgY3J1ZEV4cG9zZS5kb1JlZnJlc2goeyBnb0ZpcnN0UGFnZTogZmFsc2UgfSk7XG4vLyAgICAgfVxuLy8gICB9XG4vLyApO1xuXG5hc3luYyBmdW5jdGlvbiBvbk9rKCkge1xuICBpZiAocHJvcHMuZGljdC5sb2FkaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCB2YWx1ZSA9IG51bGw7XG4gIGxldCByb3dzID0gbnVsbDtcbiAgaWYgKHNlbGVjdGVkUm93S2V5cy52YWx1ZT8ubGVuZ3RoID4gMCkge1xuICAgIHZhbHVlID0gWy4uLnNlbGVjdGVkUm93S2V5cy52YWx1ZV07XG5cbiAgICByb3dzID0gdmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMuZGljdC5nZXREaWN0TWFwKClbaXRlbV07XG4gICAgfSk7XG4gICAgaWYgKHByb3BzLnZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdmFsdWUgPSByb3dzO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5tdWx0aXBsZSAhPT0gdHJ1ZSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlWzBdO1xuICAgIH1cbiAgfVxuXG4gIGlmICghcHJvcHMudmlld01vZGUgfHwgcHJvcHMuZW1pdE9uVmlld01vZGVsKSB7XG4gICAgLy/pnZ52aWV35qih5byP5LiL77yM6ZyA6KaB5pu05pawdmFsdWVcbiAgICBlbWl0cyhcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgICBlbWl0cyhcImNoYW5nZVwiLCB2YWx1ZSk7XG4gICAgZW1pdHMoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgcm93cyk7XG4gIH1cbiAgbGV0IHNjb3BlID0ge1xuICAgIHZhbHVlLFxuICAgIHJvd3MsXG4gICAgc2VsZWN0ZWRSb3dLZXlzOiBzZWxlY3RlZFJvd0tleXMudmFsdWVcbiAgfTtcbiAgZW1pdHMoXCJkaWFsb2ctY2xvc2VcIiwgc2NvcGUpO1xuICBhd2FpdCBuZXh0VGljaygpO1xuICBhd2FpdCBmb3JtV3JhcHBlclJlZi52YWx1ZS5jbG9zZSgpO1xuICBjb25zb2xlLmxvZyhcImRpYWxvZ09wZW5cIiwgZGlhbG9nT3Blbi52YWx1ZSk7XG4gIGVtaXRzKFwiZGlhbG9nLWNsb3NlZFwiLCBzY29wZSk7XG59XG5cbmNvbnN0IGdldFNjb3BlQ29udGV4dCA9ICgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvcGVuZWQ6IGRpYWxvZ09wZW4sXG4gICAgb3Blbjogb3BlblRhYmxlU2VsZWN0LFxuICAgIHNlbGVjdGVkUm93S2V5cyxcbiAgICBkaWN0U2VsZWN0UmVmLFxuICAgIHZhbHVlc0Zvcm1hdFJlZixcbiAgICBjcnVkUmVmLFxuICAgIGNydWRCaW5kaW5nLFxuICAgIGNydWRFeHBvc2VcbiAgfTtcbn07XG5cbmNvbnN0IHNjb3BlUmVmID0gcmVmKGdldFNjb3BlQ29udGV4dCgpKTtcbmRlZmluZUV4cG9zZShzY29wZVJlZi52YWx1ZSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXRhYmxlLXNlbGVjdCB7XG4gIHdpZHRoOiAxMDAlO1xuICAuZWwtZGlhbG9nX19ib2R5IHtcbiAgICBwYWRkaW5nLXRvcDogMDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMDtcbiAgfVxufVxuLmZzLXRhYmxlLXNlbGVjdC1jdXJyZW50IHtcbiAgLy9ib3JkZXI6IDFweCBzb2xpZCAjZWVlO1xuICAvL2JvcmRlci1yYWRpdXM6IDNweDtcbiAgcGFkZGluZzogMTBweCAwO1xufVxuPC9zdHlsZT5cbiIsIjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgYXMgX19NQUNST1NfZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qLyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQoe1xuICAvKipcbiAgICog5Y+v57yW6L6R6YCJ5oup5ZmoXG4gICAqL1xuICBuYW1lOiBcIkZzRWRpdGFibGVTZWxlY3RcIlxufSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWVkaXRhYmxlLXNlbGVjdFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RcIj5cbiAgICAgIDxmcy1kaWN0LXNlbGVjdCA6dmFsdWU9XCJtb2RlbFZhbHVlXCIgOmRpY3Q9XCJkaWN0XCIgdi1iaW5kPVwiZGljdFNlbGVjdFwiIEB1cGRhdGU6dmFsdWU9XCJkb1VwZGF0ZVwiPjwvZnMtZGljdC1zZWxlY3Q+XG4gICAgPC9kaXY+XG5cbiAgICA8ZnMtdGFibGUtc2VsZWN0XG4gICAgICBjbGFzcz1cInRhYmxlLXNlbGVjdFwiXG4gICAgICA6bW9kZWwtdmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICAgIDpkaWN0PVwiZGljdFwiXG4gICAgICA6ZGVzdHJveS1vbi1jbG9zZT1cImZhbHNlXCJcbiAgICAgIGhlaWdodD1cIjQwMHB4XCJcbiAgICAgIHYtYmluZD1cInRhYmxlU2VsZWN0XCJcbiAgICAgIEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJkb1VwZGF0ZVwiXG4gICAgICBAZGlhbG9nLWNsb3NlZD1cImRvUmVmcmVzaFwiXG4gICAgPlxuICAgICAgPHRlbXBsYXRlICNkZWZhdWx0PVwic2NvcGVcIj5cbiAgICAgICAgPGZzLWJ1dHRvbiB0eXBlPVwicHJpbWFyeVwiIGljb249XCJhbnQtZGVzaWduOmVkaXQtb3V0bGluZWRcIiB2LWJpbmQ9XCJidXR0b25cIiBAY2xpY2s9XCJzY29wZS5vcGVuXCI+PC9mcy1idXR0b24+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvZnMtdGFibGUtc2VsZWN0PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcbiAgLyoqXG4gICAqIOWAvFxuICAgKi9cbiAgbW9kZWxWYWx1ZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIOaVsOaNruWtl+WFuFxuICAgKi9cbiAgZGljdDogYW55O1xuICAvKipcbiAgICogdGFibGUtc2VsZWN05Y+C5pWwXG4gICAqL1xuICB0YWJsZVNlbGVjdDogYW55O1xuICAvKipcbiAgICogZGljdC1zZWxlY3Tlj4LmlbBcbiAgICovXG4gIGRpY3RTZWxlY3Q/OiBhbnk7XG4gIC8qKlxuICAgKiDmjInpkq7lj4LmlbBcbiAgICovXG4gIGJ1dHRvbj86IGFueTtcbn0+KCk7XG5cbjtcblxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFtcbiAgLyoqXG4gICAqIOWFs+mXreWvueivneahhuaXtuinpuWPkVxuICAgKi9cbiAgXCJyZWZyZXNoXCIsXG4gIFwidXBkYXRlOm1vZGVsVmFsdWVcIlxuXSk7XG5mdW5jdGlvbiBkb1JlZnJlc2goKSB7XG4gIGVtaXQoXCJyZWZyZXNoXCIpO1xuICBwcm9wcy5kaWN0Py5yZWxvYWREaWN0KCk7XG59XG5cbmZ1bmN0aW9uIGRvVXBkYXRlKHZhbHVlOiBhbnkpIHtcbiAgZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1lZGl0YWJsZS1zZWxlY3Qge1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5zZWxlY3Qge1xuICAgIGZsZXg6IDE7XG4gIH1cbiAgLnRhYmxlLXNlbGVjdCB7XG4gICAgZmxleDogMDtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICB9XG59XG48L3N0eWxlPlxuIixudWxsXSwibmFtZXMiOlsiZGVmYXVsdENydWRPcHRpb25zIiwiY3R4Iiwib3B0cyIsImN0IiwibmFtZSIsImNvbXB1dGVkIiwidWkiLCJ1aUNvbnRleHQiLCJ0cmlnZ2VyIiwiZG9DbG9zZSIsInJlc2V0Iiwic3VibWl0IiwidG90YWwiLCJnZXRDYWxsZXJJbmZvIiwiX2EiLCJibGFuayIsImFyZ3MiLCJsb2dJbmZvIiwibG9nV2FybiIsImxvZ0Vycm9yIiwiZXJyb3IiLCJ3YXJuIiwiaW5mbyIsImRlYnVnIiwiY2FsbGVySW5mbyIsImxvZyIsImNhbGxlciIsImxvZ2dlciIsInNldExvZ2dlciIsImxldmVsIiwiaXNFbXB0eSIsInZhbHVlIiwiaXNBbGxFbXB0eSIsInZhbHVlcyIsImhhc0VtcHR5IiwiU3RyaW5nVXRpbHMiLCJ0cmFjZSIsImVuYWJsZSIsIm9uUmVuZGVyVHJpZ2dlcmVkIiwiZXZlbnQiLCJjcmVhdGVBc3luY0NvbXBvbmVudCIsImVzIiwiZGVmaW5lQXN5bmNDb21wb25lbnQiLCJyZXRyeSIsImZhaWwiLCJhdHRlbXB0cyIsImluc3RhbGxBc3luY0NvbXBvbmVudCIsImFwcCIsIm9wdGlvbnMiLCJhc3luY0NvbXBvbmVudCIsImluc3RhbGxBc3luY0NvbXBvbmVudHMiLCJtb2R1bGVzIiwiZXhjbHVkZXMiLCJwaWNrTmFtZUV4cCIsInRyYW5zZm9ybSIsImltcG9ydHMiLCJ0cmFuc2Zvcm1Gcm9tR2xvYiIsImZvckVhY2giLCJpdGVtIiwia2V5IiwiaW5zdGFsbFN5bmNDb21wb25lbnRzIiwiY29tcG9uZW50cyIsInJlc3VsdCIsImNhbWVsQ2FzZSIsInVwcGVyRmlyc3QiLCJsb2FkQXN5bmNDb21wb25lbnRGcm9tR2xvYiIsIm1hcCIsImxvYWRDb21wb25lbnRGcm9tR2xvYiIsInZpdGUiLCJUYWJsZVN0b3JlIiwiX19wdWJsaWNGaWVsZCIsInRhYmxlTmFtZSIsInByZWZpeCIsInRhYmxlSWQiLCJzYXZlZCIsInRhYmxlIiwiJHJvdXRlIiwia2V5VHlwZSIsInJ4QXJySW5kZXgiLCJyeFZhck5hbWUiLCJyeFF1b3QiLCJqb2luUGF0aHMiLCJwYXRocyIsImFjYyIsInAiLCJnZXRQYXRoVG9TdHJpbmciLCJfIiwicGF0aFRvU3RyaW5nIiwicGF0aCIsInByZWZpeGVzIiwidHlwZSIsImhhcyIsImlzT2JqZWN0IiwiZ2V0SXRlcmF0ZSIsIml0ZXJhdGUiLCJvYmoiLCJjYWxsYmFjayIsImJyb2tlbiIsImJyZWFrSXQiLCJkZXNjcmliZVZhbHVlIiwicGFyZW50IiwiY3AiLCJpIiwiY2hpbGRyZW4iLCJjb250ZXh0UmVhZGVyIiwiQ29udGV4dFJlYWRlciIsImVyciIsInNjcCIsImdldEVsZW1lbnRzIiwiZ2V0T3duQ2hpbGRyZW4iLCJjaGlsZHJlblBhdGgiLCJzdHJDaGlsZHJlblBhdGgiLCJzdHJDaGlsZFBhdGhQcmVmaXgiLCJyZXMiLCJ2YWwiLCJzdHJDaGlsZFBhdGgiLCJwYXRoRm9ybWF0U3RyaW5nIiwiY2hpbGRLZXkiLCJhZnRlckl0ZXJhdGUiLCJjdXJQYXJlbnQiLCJpc09iamVjdEVtcHR5Iiwib3duUHJvcGVydGllc09ubHkiLCJnZXRFYWNoRGVlcCIsImVhY2hEZWVwIiwiaWRlbnRpdHkiLCJtZXJnZSIsImlzU3RyaW5nIiwidG9QYXRoIiwiZm9yRWFjaERlZXAiLCJkZWVwZGFzaCIsImRhc2giLCJyZWYiLCJza2lwcyIsImtleXMiLCJwQXR0cnMiLCJ1dGlscyIsInN0cmluZ3MiLCJzdG9yZSIsImFudGR2Q29sc3BhbiIsImxhYmVsU3BhbiIsImFzc2lzdCIsInVzZVVpIiwiYnV0dG9uIiwiY2FzY2FkZXIiLCJ6aENOIiwiZW4iLCJ0IiwiZ2V0IiwiYXJnIiwiaW5kZXgiLCJJMThuIiwiaW5zdGFuY2UiLCJsb2NhbGVzIiwibWVzc2FnZSIsImZzQ2xvbmUiLCJjbG9uZURlZXAiLCJpMThuIiwidXNlSTE4biIsImUiLCJtb2R1bGUiLCJ0aGlzIiwibiIsInIiLCJzIiwiYSIsImRheWpzIiwiYWR2YW5jZWRGb3JtYXQiLCJkb0Zvcm1hdCIsImRhdGUiLCJmb3JtYXQiLCJkYXRlRm9ybWF0dGVyIiwiZGF0ZXJhbmdlRm9ybWF0dGVyIiwiZGF0ZXRpbWVyYW5nZUZvcm1hdHRlciIsImYiLCJvIiwidSIsImQiLCJ3ZWVrZGF5IiwibG9jYWxlRGF0YSIsIndlZWtPZlllYXIiLCJkYXRlJDEiLCJidWlsZERhdGVWYWx1ZSIsInNjb3BlIiwicm93IiwiZWwiLCJpY29uIiwibnVtYmVyJDEiLCJwaG9uZSIsImNvbHVtbiIsInJldCIsInNlbGVjdCIsInRleHQiLCJ0cmVlIiwidHlwZUxpc3QiLCJkZWZhdWx0VHlwZUNyZWF0b3JzIiwiZGVmYXVsdFR5cGVzIiwiZ2V0VHlwZXMiLCJnZXRUeXBlIiwiYWRkVHlwZXMiLCJuZXdUeXBlcyIsInR5cGVzJDEiLCJjcmVhdG9yIiwiX3NmY19tYWluJEQiLCJkZWZpbmVDb21wb25lbnQiLCJwYWdlUmVmIiwib25Nb3VudGVkIiwiX2hvaXN0ZWRfMSIsIl9ob2lzdGVkXzIiLCJfaG9pc3RlZF80IiwiJHNsb3RzIiwiX2N0eCIsIl9jYWNoZSIsIiRwcm9wcyIsIiRzZXR1cCIsIiRkYXRhIiwiJG9wdGlvbnMiLCJfb3BlbkJsb2NrIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9jcmVhdGVDb21tZW50Vk5vZGUiLCJfY3JlYXRlRWxlbWVudFZOb2RlIiwiX2hvaXN0ZWRfMyIsImlzVW5NZXJnZWFibGUiLCJzcmNWYWx1ZSIsIlVuTWVyZ2VhYmxlIiwiaXNSZWYiLCJpc1VuQ2xvbmVhYmxlIiwidGFyZ2V0Iiwic291cmNlcyIsImN1c3RvbWl6ZXIiLCJvYmpWYWx1ZSIsImlzQXJyYXkiLCJmb3VuZCIsIm1lcmdlV2l0aCIsImNsb25lRGVlcFdpdGgiLCJVbk1lcmdlYWJsZSQxIiwiY2xvbmVhYmxlIiwidXNlTWVyZ2UiLCJpc0FzeW5jQ29tcHV0ZSIsIkFzeW5jQ29tcHV0ZVZhbHVlIiwiaXNTeW5jQ29tcHV0ZSIsIkNvbXB1dGVWYWx1ZSIsImZpbmRDb21wdXRlVmFsdWVzIiwiaXNBc3luYyIsImZvdW5kTWFwIiwiY2hlY2tGdW5jIiwiY29udGV4dCIsImV4Y2x1ZGUiLCJpc1NoYWxsb3ciLCJkb0FzeW5jQ29tcHV0ZSIsImRlcGVuZEFzeW5jVmFsdWVzIiwiZ2V0Q29udGV4dEZuIiwiYXN5bmNWYWx1ZU1hcCIsInNldEFzeW5jQ29tcHV0ZVZhbHVlIiwiYXN5bmNWYWx1ZXNNYXAiLCJ2YWx1ZVJlZiIsInNldCIsImRvQ29tcHV0ZWQiLCJnZXRUYXJnZXRGdW5jIiwidXNlckNvbXB1dGVkRm4iLCJkZXBlbmRWYWx1ZXMiLCJhc3luY0NvdW50Iiwic3luY0NvdW50IiwiY29tcHV0ZUZuIiwiY29tcHV0ZSIsImFzeW5jRm4iLCJkZWZhdWx0VmFsdWUiLCJhc3luY1JlZiIsImNvbXB1dGVkVmFsdWUiLCJ3YXRjaCIsImFzeW5jQ29tcHV0ZSIsInVzZUNvbXB1dGUiLCJDb25zdGFudHMiLCJtZXJnZUNvbHVtblBsdWdpbnMiLCJyZWdpc3Rlck1lcmdlQ29sdW1uUGx1Z2luIiwicGx1Z2luIiwicmVtb3ZlIiwicHVzaCIsInNvcnQiLCJiIiwib3JkZXIiLCJtZXJnZUNvbHVtbkRpY3QiLCJkaWN0IiwiY29tcG9uZW50Iiwic2hhbGxvd1JlYWN0aXZlIiwiZm9ybSIsIm1lcmdlQ29sdW1uVHlwZSIsInR5cGVDaGFpbiIsIkFycmF5IiwiYmFzZSIsInR5cGVPcHRpb25zIiwidHlwZXMiLCJtZXJnZVBsdWdpbnMiLCJoYW5kbGUiLCJjb2x1bW5Qcm9wcyIsImNydWRPcHRpb25zIiwic2V0dGluZ3MiLCJ2aWV3Rm9ybVVzZUNlbGxDb21wb25lbnQiLCJ2aWV3Rm9ybUNvbHVtbiIsImluY2x1ZGVzIiwicmVuZGVyIiwiX2NyZWF0ZVZOb2RlIiwidmlld0Zvcm0iLCJhZGRGb3JtIiwicnVsZXMiLCJydWxlIiwiZWRpdEZvcm0iLCJzZWFyY2giLCJtZXJnZVBsdWdpbiIsInNldHVwT3B0aW9uc0NvbHVtbnMiLCJjb2x1bW5zIiwidXNlck9wdGlvbnMiLCJpbml0ZWRDb2x1bW5zIiwiYnVpbGRPcHRpb25zQ29sdW1uc0ZsYXRNYXAiLCJidWlsZFRhYmxlQ29sdW1uc0ZsYXRNYXAiLCJidWlsZFRhYmxlQ29sdW1uIiwiY29sVGVtcGxhdGUiLCJ0YWJsZUNvbHVtbiIsInRpdGxlIiwiYnVpbGRUYWJsZUNvbHVtbnMiLCJ3cmFwcGVyQ3VzdG9tQ29tcG9uZW50IiwicmVhY3RpdmUiLCJzaGFsbG93UmVmIiwidGFibGVDb2x1bW5zIiwiZG9Db2x1bW5zU29ydCIsImRvQXJyYXlTb3J0IiwiYXJyIiwic29ydEJ5Iiwib3JkZXJEZWZhdWx0IiwibGlzdCIsInNpemUiLCJjb2x1bW5zQXJyIiwiY29sdW1uc01hcCIsImJ1aWxkRm9ybUNvbHVtbnMiLCJjb2x1bW5zRmxhdE1hcCIsImZvcm1UeXBlIiwiZm9ybUNvbHVtbnMiLCJmb3JtQ29sdW1uIiwiYnVpbGRGb3JtIiwiYmFzZU9wdGlvbnMiLCJvbkNvbXBsZXRlIiwiYnVpbGRTZWFyY2hGb3JtIiwic2VhcmNoQ29sdW1ucyIsImZvcm1Db2x1bW5zRm9yU2VhcmNoIiwiY29weVByb3BzIiwic2VhcmNoQ29weUZvcm1Qcm9wcyIsImNvcHlGcm9tQ29tcG9zaXRpb25Db2x1bW4iLCJmaWVsZCIsImNvbW1vbiIsImRlZiIsInBpY2siLCJidWlsZEZvcm1PcHRpb25zIiwibW9kZSIsImRlZmF1bHRPcHRpb25zIiwiY29tbW9uT3B0aW9ucyIsImNydWRFeHBvc2UiLCJidWlsZENvbHVtbnMiLCJ0b29sYmFyIiwiY29sdW1uc0ZpbHRlciIsIm9yaWdpbmFsQ29sdW1ucyIsImRpc2FibGVkIiwiZWRpdGFibGUiLCJmb3JFYWNoVGFibGVDb2x1bW5zIiwiZm9yRWFjaENvbHVtbnMiLCJ1c2VDb2x1bW5zIiwic2VlZCIsIkZzRm9ybVdyYXBwZXJMaXN0IiwiY3JlYXRlRm9ybVdyYXBwZXIiLCJpZCIsImNvbnRhaW5lciIsInJlc29sdmUiLCJyZWplY3QiLCJ2Tm9kZSIsImNyZWF0ZVZOb2RlIiwiRnNGb3JtV3JhcHBlciIsInZtIiwidXNlRm9ybVdyYXBwZXIiLCJwZCIsImluamVjdCIsIm9wZW5EaWFsb2ciLCJvcGVuQ3J1ZEZvcm1EaWFsb2ciLCJmb3JtT3B0aW9ucyIsImRvTWVyZ2UiLCJ1c2VFZGl0YWJsZSIsInByb3BzIiwiY3J1ZEJpbmRpbmciLCJfYyIsIl9iIiwiY3VzdG9tUm93SGFuZGxlQWN0aXZlIiwiX2QiLCJfZSIsIm9uRW5hYmxlZCIsImVkaXRhYmxlT3B0cyIsImVkaXRhYmxlSWQiLCJlZGl0YWJsZVJvdyIsImlzQWRkIiwic2V0RGF0YSIsInJvd0RhdGEiLCJkYXRhIiwidXNlRXhwb3NlIiwiY3J1ZFJlZiIsImZvcm1XcmFwcGVyUHJvdmlkZXIiLCJjaGVja0NydWRSZWYiLCJjaGVja0NydWRCaW5kaW5nUmVmIiwiZm9ybVdyYXBwZXJSZWYiLCJmb3JtUmVmIiwicmVjb3JkcyIsInRvUmF3IiwidmFsdWVCdWlsZGVyQ29sdW1ucyIsImNvbCIsInBhZ2VRdWVyeSIsInBhZ2UiLCJzZWFyY2hGb3JtRGF0YSIsInF1ZXJ5IiwidXNlclBhZ2VRdWVyeSIsInVzZXJQYWdlUmVzIiwiZGlzYWJsZUxvYWRpbmciLCJ1bnJlZiIsInBhZ2VSZXMiLCJjdXJyZW50UGFnZSIsInBhZ2VTaXplIiwiZnNUYWJsZVJlZiIsIm5vIiwidGFibGVSZWYiLCJyb3dLZXkiLCJyZW1vdmVCaW5kaW5nIiwiaXNMb2NhbCIsInJlbW92ZVNjb3BlIiwiZm9ybU9wdHMiLCJ4eEZvcm0iLCJsb2FkRnNFeHBvcnRVdGlsIiwiZWFjaCIsImxvYWRGc0ltcG9ydFV0aWwiLCJkZWZhdWx0RGF0YUZvcm1hdHRlciIsIm9yaWdpbmFsUm93Iiwibm9kZXMiLCJsYWJlbCIsIm5vZGUiLCJleHBvcnRUYWJsZSIsImV4cG9ydENvbCIsImV4cG9ydFV0aWwiLCJvcmlnaW5hbERhdGEiLCJzZWFyY2hQYXJhbXMiLCJjbG9uZSIsIm1hcHBpbmciLCJleHBPcHRzIiwiaW1wb3J0VGFibGUiLCJpbXBvcnREYXRhIiwiaXNFZGl0YWJsZSIsImNydWRPcHRpb25zUGx1Z2lucyIsInJlZ2lzdGVyQ3J1ZE9wdGlvbnNQbHVnaW4iLCJnZXRDcnVkT3B0aW9uc1BsdWdpbiIsInNlbGVjdGlvbiIsImdldFJvd0tleSIsInRhYmxlQ0kiLCJjaGFuZ2VkIiwic2VsZWN0ZWRSb3dLZXlzIiwibmV4dFRpY2siLCJtb2JpbGVBZGFwdG9yIiwicm93SGFuZGxlIiwiYnV0dG9ucyIsIm5ld0J1dHRvbnMiLCJidXR0b25zS2V5Iiwid2lkdGhSZWYiLCJ1c2VDcnVkIiwiZXhwb3NlIiwiZG9SZWZyZXNoIiwiZG9WYWx1ZVJlc29sdmUiLCJ1c2VQYWdpbmF0aW9uIiwiY3VycmVudCIsInVzZUZvcm1TdWJtaXQiLCJ1c2VSb3dIYW5kbGUiLCJ1c2VTZWFyY2giLCJiYXNlVGFibGVSZWYiLCJ1c2VUYWJzIiwiZm9ybURhdGEiLCJ1c2VUb29sYmFyIiwiZXhwb3J0aW5nIiwib3JpZ2luYWwiLCJ1cGRhdGVDb2x1bW5zIiwib2xkIiwib2xkQ29sdW1uIiwibmV3Q29sdW1uIiwibmV3Q29sdW1ucyIsInVzZVRhYmxlIiwic29ydENoYW5nZSIsImlzU2VydmVyU29ydCIsInByb3AiLCJhc2MiLCJvbGRTb3J0IiwidXNlQWN0aW9uYmFyIiwiYWN0aXZlUm93cyIsImFmdGVyVXNlQ3J1ZCIsImJpbmRpbmdzIiwicmVidWlsZENydWRCaW5kaW5ncyIsImlucHV0T3B0cyIsInVzZXJPcHRzIiwicGx1Z2lucyIsInBsdWciLCJiZWZvcmUiLCJwbHVnaW5PcHRpb25zIiwicmVzZXRDcnVkT3B0aW9ucyIsImFwcGVuZENydWRPcHRpb25zIiwib3Zlck9wdGlvbnMiLCJuZXdPcHRpb25zIiwiYXBwZW5kQ3J1ZEJpbmRpbmciLCJ1c2VGc0ltcGwiLCJjcmVhdGVDcnVkT3B0aW9ucyIsImNydWRFeHBvc2VSZWYiLCJjcmVhdGVDcnVkT3B0aW9uc1JldCIsImluaXRDcnVkIiwidXNlQ3J1ZFByb3BzIiwidXNlQ3J1ZFJldCIsInVzZUZzIiwidXNlRnNBc3luYyIsInVzZUZzUmVmIiwidXNlRGljdCIsInZNb2RlbCIsImNyZWF0ZUNvbXB1dGVkT3B0aW9ucyIsIm9wdGlvbiIsImdldFZhbHVlIiwiZ2V0TGFiZWwiLCJnZXREaWN0IiwiZ2V0U2NvcGUiLCJnZXRDdXJyZW50U2NvcGUiLCJwcm94eSIsImdldEN1cnJlbnRJbnN0YW5jZSIsImxvYWREaWN0IiwicmVsb2FkIiwicmVsb2FkRGljdCIsImNsZWFyRGljdCIsIndhdGNoVmFsdWUiLCJnZXREaWN0RGF0YSIsImdldFByb3BWYWx1ZSIsImF0dHIiLCJyZW1vdmVQcm9wVmFsdWUiLCJnZXRDaGlsZHJlbiIsInBlcmYiLCJ3YXJuZWQiLCJQUk9DRVNTIiwiZW1pdFdhcm5pbmciLCJtc2ciLCJjb2RlIiwiZm4iLCJBQyIsIkFTIiwid2FybkFDUG9seWZpbGwiLCJyZWFzb24iLCJwcmludEFDUG9seWZpbGxXYXJuaW5nIiwic2hvdWxkV2FybiIsImlzUG9zSW50IiwiZ2V0VWludEFycmF5IiwibWF4IiwiWmVyb0FycmF5IiwiX1N0YWNrIiwiSGVhcENscyIsIl9fcHJpdmF0ZUdldCIsIl9jb25zdHJ1Y3RpbmciLCJfX3ByaXZhdGVTZXQiLCJfX3ByaXZhdGVBZGQiLCJTdGFjayIsIl9MUlVDYWNoZSIsIl9pbml0aWFsaXplVFRMVHJhY2tpbmciLCJfaW5pdGlhbGl6ZVNpemVUcmFja2luZyIsIl9pbmRleGVzIiwiX3JpbmRleGVzIiwiX2lzVmFsaWRJbmRleCIsIl9ldmljdCIsIl9iYWNrZ3JvdW5kRmV0Y2giLCJfaXNCYWNrZ3JvdW5kRmV0Y2giLCJfY29ubmVjdCIsIl9tb3ZlVG9UYWlsIiwiX2RlbGV0ZSIsIl9jbGVhciIsIl9tYXgiLCJfbWF4U2l6ZSIsIl9kaXNwb3NlIiwiX2Rpc3Bvc2VBZnRlciIsIl9mZXRjaE1ldGhvZCIsIl9tZW1vTWV0aG9kIiwiX3NpemUiLCJfY2FsY3VsYXRlZFNpemUiLCJfa2V5TWFwIiwiX2tleUxpc3QiLCJfdmFsTGlzdCIsIl9uZXh0IiwiX3ByZXYiLCJfaGVhZCIsIl90YWlsIiwiX2ZyZWUiLCJfZGlzcG9zZWQiLCJfc2l6ZXMiLCJfc3RhcnRzIiwiX3R0bHMiLCJfaGFzRGlzcG9zZSIsIl9oYXNGZXRjaE1ldGhvZCIsIl9oYXNEaXNwb3NlQWZ0ZXIiLCJfdXBkYXRlSXRlbUFnZSIsIl9zdGF0dXNUVEwiLCJfc2V0SXRlbVRUTCIsIl9pc1N0YWxlIiwiX3JlbW92ZUl0ZW1TaXplIiwiX2kiLCJfYWRkSXRlbVNpemUiLCJfcyIsIl9zdCIsIl9yZXF1aXJlU2l6ZSIsIl9rIiwiX3YiLCJzaXplQ2FsY3VsYXRpb24iLCJ0dGwiLCJ0dGxSZXNvbHV0aW9uIiwidHRsQXV0b3B1cmdlIiwidXBkYXRlQWdlT25HZXQiLCJ1cGRhdGVBZ2VPbkhhcyIsImFsbG93U3RhbGUiLCJkaXNwb3NlIiwiZGlzcG9zZUFmdGVyIiwibm9EaXNwb3NlT25TZXQiLCJub1VwZGF0ZVRUTCIsIm1heFNpemUiLCJtYXhFbnRyeVNpemUiLCJmZXRjaE1ldGhvZCIsIm1lbW9NZXRob2QiLCJub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24iLCJub0RlbGV0ZU9uU3RhbGVHZXQiLCJhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiIsImFsbG93U3RhbGVPbkZldGNoQWJvcnQiLCJpZ25vcmVGZXRjaEFib3J0IiwiVWludEFycmF5IiwiX19wcml2YXRlTWV0aG9kIiwiaW5pdGlhbGl6ZVNpemVUcmFja2luZ19mbiIsImluaXRpYWxpemVUVExUcmFja2luZ19mbiIsImMiLCJpc0JhY2tncm91bmRGZXRjaF9mbiIsImsiLCJiYWNrZ3JvdW5kRmV0Y2hfZm4iLCJtb3ZlVG9UYWlsX2ZuIiwiaW5kZXhlc19mbiIsInJpbmRleGVzX2ZuIiwiZ2V0T3B0aW9ucyIsInYiLCJ0aGlzcCIsImRlbGV0ZWQiLCJkZWxldGVfZm4iLCJlbnRyeSIsInN0YXJ0IiwicmVtYWluIiwiYWdlIiwic2V0T3B0aW9ucyIsInN0YXR1cyIsImV2aWN0X2ZuIiwiX19wcml2YXRlV3JhcHBlciIsIm9sZFZhbCIsIm9sZFZhbHVlIiwiZHQiLCJ0YXNrIiwiaGFzT3B0aW9ucyIsInBlZWtPcHRpb25zIiwiZmV0Y2hPcHRpb25zIiwiZm9yY2VSZWZyZXNoIiwic2lnbmFsIiwic3RhbGUiLCJpc1N0YWxlIiwic3RhbGVWYWwiLCJtZW1vT3B0aW9ucyIsInZ2IiwiZmV0Y2hpbmciLCJjbGVhcl9mbiIsInR0bHMiLCJzdGFydHMiLCJjYWNoZWROb3ciLCJnZXROb3ciLCJzaXplcyIsImlzVmFsaWRJbmRleF9mbiIsImZyZWUiLCJoZWFkIiwiYWMiLCJmZXRjaE9wdHMiLCJjYiIsInVwZGF0ZUNhY2hlIiwiYWJvcnRlZCIsImlnbm9yZUFib3J0IiwiZmV0Y2hGYWlsIiwiYmYiLCJlYiIsImVyIiwiYWxsb3dTdGFsZUFib3J0ZWQiLCJub0RlbGV0ZSIsInBjYWxsIiwicmVqIiwiZm1wIiwiY29ubmVjdF9mbiIsInBpIiwibmkiLCJMUlVDYWNoZSIsIkRpY3RHbG9iYWxDYWNoZSIsInNldERpY3RSZXF1ZXN0IiwicmVxdWVzdCIsImRpY3RSZXF1ZXN0IiwiRGljdCIsImNhY2hlS2V5IiwiY2FjaGVkIiwiY2FsbCIsIm5vdGlmeSIsInRvRmV0Y2hWYWx1ZXMiLCJnZXRGcm9tUmVtb3RlIiwidXJsIiwibWF5YmVBcnIiLCJkaWN0RGF0YSIsImNvbmZpZyIsInVzZURpY3REZWZpbmUiLCJ1c2VUeXBlcyIsImRyYWdNb2RhbEZvckFudGR2IiwiZGlhbG9nRWwiLCJkaWFsb2dIZWFkZXJFbCIsImRyYWdEb20iLCJzdHkiLCJYIiwiWSIsInN0eUwiLCJzdHlUIiwibCIsImRyYWdNb2RhbEZvck5haXZlIiwiZHJhZ01vZGFsIiwidXNlRHJhZyIsIkdsb2JhbENvbmZpZyIsIl9zZmNfbWFpbiRDIiwiY29tcHV0ZWRJbm5lclN0eWxlIiwiY29tcHV0ZWRCb2R5U3R5bGUiLCJfc2ZjX3JlbmRlciIsIl9ub3JtYWxpemVTdHlsZSIsIl9yZW5kZXJTbG90IiwiX3NmY19tYWluJEIiLCJfY29tcG9uZW50X2ZzX2NvbnRhaW5lciIsIl9yZXNvbHZlQ29tcG9uZW50IiwiX2NyZWF0ZUJsb2NrIiwiX3dpdGhDdHgiLCJfaG9pc3RlZF81IiwiX3NmY19tYWluJEEiLCJnZXRDcnVkQmluZGluZyIsInNlYXJjaFNob3ciLCJjYXJkQ29tcG9uZW50TmFtZSIsIl9yZXNvbHZlRHluYW1pY0NvbXBvbmVudCIsIl9pc1Nsb3QiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsIl9pc1ZOb2RlIiwiaW5oZXJpdEF0dHJzIiwiU3RyaW5nIiwiZGVmYXVsdCIsInJlcXVpcmVkIiwiRnVuY3Rpb24iLCJpY29uUmlnaHQiLCJjaXJjbGUiLCJCb29sZWFuIiwidG9vbHRpcCIsInVuZGVmaW5lZCIsImJ1dHRvblByb3BzIiwiY2xhc3NOYW1lIiwic2V0dXAiLCJpY29uUmVuZGVyIiwiaWNvbkNsYXNzIiwiX21lcmdlUHJvcHMiLCJyZW5kZXJCdG4iLCJpc0ljb25TbG90IiwiaXNJY29uUHJvcCIsImljb25Qcm9wIiwic2xvdHMiLCJpc0NpcmNsZSIsImJ1dHRvbkNvbXAiLCJyZXNvbHZlRHluYW1pY0NvbXBvbmVudCIsImJ0blByb3BzIiwiY2xhc3MiLCJhdHRycyIsImgiLCJ0b29sdGlwQ29tcCIsImNvbXB1dGVUb29sdGlwUHJvcHMiLCJvbWl0IiwidHJpZ2dlclNsb3ROYW1lIiwicmVxdWlyZSIsImNvbXB1dGVkUmVuZGVyRnVuYyIsImluZGV4T2YiLCJzdGFydHNXaXRoIiwiSWNvbkNvbXAiLCJyZXBsYWNlIiwiaXNDb21wb25lbnQiLCJfc2ZjX21haW4keiIsIkljb24iLCJfbm9ybWFsaXplQ2xhc3MiLCJfc2ZjX21haW4keSIsInN5bWJvbElkIiwiZ2V0U3R5bGUiLCJzcGluIiwiX3NmY19tYWluJHgiLCJsYWJlbEF0dHJzIiwiX2NyZWF0ZVRleHRWTm9kZSIsIl90b0Rpc3BsYXlTdHJpbmciLCJfX2RlZmF1bHRfXyIsIl9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCIsImxvYWRpbmciLCJfY29tcG9uZW50X2ZzX2ljb24iLCJfdW5yZWYiLCJfc2ZjX21haW4kdiIsIm1lcmdlRXZlbnRIYW5kbGVzIiwiZXZlbnROYW1lIiwiZXZlbnRzIiwiJGV2ZW50IiwiaHRtbFRhZ3MiLCJtb2RlbFZhbHVlIiwib24iLCJ1bmRlZmluZVRvTnVsbCIsImVtaXRzIiwicHJvdmlkZSIsImVtaXQiLCJ0YXJnZXRSZWYiLCJhbGxBdHRycyIsInRyaW0iLCJudW1iZXIiLCJvblVwZGF0ZU1vZGVsVmFsdWVOYW1lIiwidG1wIiwiTnVtYmVyIiwiaXNOYU4iLCJoYW5kbGVyIiwiY2hpbGRyZW5SZW5kZXIiLCJjcmVhdGVDaGlsZHJlbiIsImNvbXB1dGVkSW5wdXRDb21wIiwiaXNBc3luY0NvbXBvbmVudCIsImlucHV0IiwiaW5wdXRDb21wIiwicmVzb2x2ZUNvbXBvbmVudCIsImNoaWxkcmVuUmVuZGVyZWQiLCJnZXRUYXJnZXRSZWYiLCJnZXRUYXJnZXRSZWZBc3luYyIsImdldFRhcmdldFJlZlN5bmMiLCJQcm9taXNlIiwiZ2V0VGFyZ2V0UmVmRGVsYXkiLCJjb3VudCIsInNldFRpbWVvdXQiLCJFcnJvciIsIl9zbG90IiwibWVyZ2VkIiwibWVyZ2VQcm9wcyIsIm1hcmtSYXciLCJmdW5jdGlvbmFsIiwicmVuZGVyRnVuYyIsIl9zZmNfbWFpbiR1IiwiY3JlYXRlSW5pdGlhbEZvcm0iLCJkZWZWYWx1ZSIsImluaXRpYWxGb3JtIiwic2V0Rm9ybURhdGEiLCJnZXRDb21wb25lbnRSZWYiLCJjb21wdXRlZENvbHVtbnMiLCJkb1ZhbHVlQnVpbGRlciIsImdldEZvcm1EYXRhIiwidmFsdWVDaGFuZ2UiLCJkb1ZhbHVlQ2hhbmdlIiwibWVyZ2VDb2wiLCJidWlsZEl0ZW1TY29wZSIsImZvcm1JdGVtUmVmcyIsImdldEZvcm1JdGVtUmVmIiwiZ3JvdXBBY3RpdmVLZXkiLCJncm91cEl0ZW0iLCJjb21wdXRlZEdyb3VwIiwiZ3JvdXAiLCJncm91cGVkS2V5cyIsIndyYXBwZXIiLCJjb21wdXRlZERlZmF1bHRDb2x1bW5zIiwiZ2V0Rm9ybVJlZiIsImVudHJpZXNSZXQiLCJlbnRyaWVzIiwiaW5pdGlhbFZhbHVlIiwidW5zZXQiLCJ2YWxpZFJlZiIsImVycm9yc1JlZiIsImZpbGxHcm91cEVycm9yIiwiZmllbGRFcnJvcnMiLCJ2YWxpZGF0ZSIsInZhbGlkYXRlU2NvcGUiLCJ2YWxpZGF0ZUVycm9ycyIsInN1Ym1pdFNjb3BlIiwiZm9ybUl0ZW1TaG93IiwiZ3JvdXBJdGVtU2hvdyIsIm5ld1ZhbCIsImlzRGlydHkiLCJhZnRlciIsIm1lcmdlZFNsb3RzIiwiZGlzcGxheSIsIl9GcmFnbWVudCIsIl9yZW5kZXJMaXN0IiwiaGVscGVyIiwiZ3JvdXBLZXkiLCJfY3JlYXRlU2xvdHMiLCJfY29tcG9uZW50X2ZzX2Zvcm1faXRlbV9jb2wiLCJzbG90TmFtZSIsIl9jb21wb25lbnRfZnNfcmVuZGVyIiwiX3NmY19tYWluJHQiLCJGc1JlbmRlciIsImNvbXBvbmVudFJlbmRlclJlZiIsInNjb3BlRnVuYyIsInVwZGF0ZU1vZGVsVmFsdWUiLCJjb21wdXRlZEl0ZW0iLCJjb21wdXRlZEhlbHBlclBvc2l0aW9uIiwiY29tcHV0ZWRIZWxwZXJUb29sdGlwIiwiY29tcHV0ZWRLZXkiLCJjb21wdXRlZExhYmVsIiwiY29tcHV0ZWRMYWJlbElzUmVuZGVyIiwiX2NvbXBvbmVudF9mc19jb21wb25lbnRfcmVuZGVyIiwiX25vcm1hbGl6ZVByb3BzIiwiX2hvaXN0ZWRfNiIsImZvcm1TbG90IiwiX2hvaXN0ZWRfNyIsIl9jb21wb25lbnRfZnNfc2xvdF9yZW5kZXIiLCJfY29tcG9uZW50X2ZzX2Zvcm1faGVscGVyIiwiX19wcm9wcyIsInVzZUF0dHJzIiwiZm9ybUl0ZW1SZWYiLCJfX2V4cG9zZSIsIl9jb21wb25lbnRfZnNfZm9ybV9pdGVtIiwiX3NmY19tYWluJHIiLCJpbm5lciIsImlubmVyV3JhcHBlciIsInpJbmRleCIsImZvcm1XcmFwcGVyT3BlbiIsImZvcm1XcmFwcGVySXMiLCJmb3JtV3JhcHBlckJpbmQiLCJmb3JtV3JhcHBlck9wdHMiLCJlbWl0T25DbG9zZWQiLCJlbWl0T25PcGVuZWQiLCJiZWZvcmVDbG9zZUN1c3RvbSIsImZvcm1XcmFwcGVySWQiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJmb3JtV3JhcHBlcklkQ2xhc3MiLCJmb3JtV3JhcHBlclNsb3RzIiwiYnVpbGRFdmVudCIsImNsb3NlIiwib25DbG9zZWQiLCJvbk9wZW5lZCIsIm9wZW4iLCJmdWxsc2NyZWVuRW5hYmxlZCIsImZ1bGxzY3JlZW4iLCJjb21wdXRlZEJ1dHRvbnMiLCJvblZhbHVlQ2hhbmdlIiwiaW5uZXJCaW5kIiwid3JhcHBlckJpbmRSZWYiLCJmb3JtT3B0aW9uc1JlZiIsInRvZ2dsZUZ1bGxzY3JlZW4iLCJvbk9wZW4iLCJpcyIsImN1c3RvbUNsYXNzS2V5IiwiZm9ybVdyYXBwZXIiLCJjdXN0b21DbGFzcyIsImJlZm9yZUNsb3NlIiwiZG9TYXZlUmVtaW5kIiwic2F2ZVJlbWluZCIsIm5lZWRTYXZlIiwibWVzc2FnZUJveCIsImNvbmZpcm0iLCJjb25maXJtQnV0dG9uVGV4dCIsImNhbmNlbEJ1dHRvblRleHQiLCJyb3V0ZSIsInVzZVJvdXRlIiwiZHJhZnRTdG9yZSIsImdldERyYWZ0U3RvcmUiLCJzYXZlRHJhZnQiLCIkcm91dGVyIiwiZG9TYXZlRHJhZnQiLCJ1cGRhdGVUYWJsZVZhbHVlIiwiY2xlYXJEcmFmdCIsImNsZWFyVGFibGVWYWx1ZSIsImxvYWREcmFmdCIsImRyYWZ0IiwiZ2V0VGFibGVWYWx1ZSIsIm1lcmdlRm9ybSIsInNhdmVkRHJhZnQiLCJlbGVtZW50QmVmb3JlQ2xvc2VGaXgiLCJkb25lIiwiZHJhZ2dhYmxlIiwiZHJhZ2VuYWJsZWQiLCJnZXRNb2RhbCIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsImdldENvbXB1dGVDb250ZXh0IiwiY29tcHV0ZWRDdXN0b21CdXR0b25zIiwiZGVmQnRucyIsImNhbmNlbCIsIm9rIiwiYnV0dG9uc0FyciIsIm9uQ2xpY2siLCJjbGljayIsImV4cG9zZWQiLCJlbmRzV2l0aCIsImJ1aWxkSW5uZXJCaW5kIiwiZ2V0SW5uZXJXcmFwcGVyIiwiaW5uZXJDb250YWluZXJTZWxlY3RvciIsImNsYXNzTGlzdCIsImFkZCIsImNvbnNvbGUiLCJ1c2VTbG90cyIsIl9zbG90cyIsInNsb3RzUmVuZGVyIiwiX3NlbGYiLCJ0aXRsZVNsb3ROYW1lIiwiZnVsbFNjcmVlbkljb24iLCJpY29ucyIsImZ1bGxTY3JlZW4iLCJ1bkZ1bGxTY3JlZW4iLCJzaG93IiwiaGFzQ29udGVudFdyYXAiLCJjb250ZW50V3JhcCIsInN1YkNoaWxkcmVuIiwiY29udGVudFdyYXBDb21wIiwidmlzaWJsZSIsInZDbG9zZWQiLCJidWlsZE9uQ2xvc2VkQmluZCIsInZDdXN0b21DbGFzcyIsInZGdWxsU2NyZWVuIiwidlN0eWxlIiwiZm9ybVdyYXBwZXJDb21wIiwiZm9ybVdyYXBwZXJMaXN0IiwidXNlUHJvdmlkZXJzIiwic2VhcmNoUmVmIiwiZ2V0U2VhcmNoUmVmIiwiZ2V0U2VhcmNoRm9ybURhdGEiLCJnZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YSIsInNldFNlYXJjaEZvcm1EYXRhIiwic2VhcmNoUmV0IiwiZGVmYXVsdFRhYnMiLCJfZyIsIl9mIiwic2xvdEZpbHRlciIsImN0eFNsb3RzIiwia2V5UHJlZml4IiwidXNlRml4ZWRIZWlnaHQiLCJjb250YWluZXJSZWYiLCJtYXhIZWlnaHRSZWYiLCJjb21wdXRlQm9keUhlaWdodCIsInRhYmxlRG9tIiwiaGVhZERvbSIsInRhYmxlSGVpZ2h0IiwiaGVhZEhlaWdodCIsInV0aWxMb2ciLCJ3YXRjaEJvZHlIZWlnaHRDaGFuZ2UiLCJ0YWJsZVdyYXBwZXJEb20iLCJ0b29sYmFyUmVmIiwidGFibGVQcm9wUmVmIiwidG9SZWYiLCJjb21wdXRlZFRhYmxlIiwiZml4ZWRIZWlnaHQiLCJjb21wdXRlZFRvb2xiYXIiLCJjb21wdXRlZENlbGxTbG90cyIsImNvbXB1dGVkRm9ybVNsb3RzIiwiY29tcHV0ZWRTZWFyY2hTbG90cyIsImNvbXB1dGVkVG9vbGJhclNsb3RzIiwiY29tcHV0ZWRDbGFzcyIsImNsYXp6IiwiaW5uZXJXcmFwcGVyUmVmIiwiaXNGb3JtSW5uZXIiLCJfc2ZjX21haW4kcCIsInRhYnMiLCJfY29tcG9uZW50X2ZzX2FjdGlvbmJhciIsIl9ndWFyZFJlYWN0aXZlUHJvcHMiLCJfY29tcG9uZW50X2ZzX3RhYnNfZmlsdGVyIiwidGFic0JpbmRpbmciLCJfY29tcG9uZW50X2ZzX3RhYmxlIiwiX3NmY19tYWluJG8iLCJzY29wZVJlZiIsImRvQ2xpY2siLCJwaWNrZWRQcm9wcyIsImNvbXB1dGVQcm9wcyIsImNvbXB1dGVkSGFuZGxlQnRucyIsIm1lcmdlZEJ0bnMiLCJidG5zIiwiY29tcHV0ZWREcm9wZG93bkF0TGVhc3QiLCJpc0Ryb3Bkb3duQnRuIiwiaGFzRHJvcGRvd25CdG4iLCJkb0Ryb3Bkb3duSXRlbUNsaWNrIiwiYnRuIiwiY29tcHV0ZWREcm9wZG93bkJpbmRpbmciLCJiaW5kaW5nIiwiX2NvbXBvbmVudF9mc19idXR0b24iLCJfZXh0ZW5kcyIsInNvdXJjZSIsIl9pbmhlcml0c0xvb3NlIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiX3NldFByb3RvdHlwZU9mIiwiX2dldFByb3RvdHlwZU9mIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIl9jb25zdHJ1Y3QiLCJQYXJlbnQiLCJDbGFzcyIsIkNvbnN0cnVjdG9yIiwiX2lzTmF0aXZlRnVuY3Rpb24iLCJfd3JhcE5hdGl2ZVN1cGVyIiwiV3JhcHBlciIsImZvcm1hdFJlZ0V4cCIsIndhcm5pbmciLCJlcnJvcnMiLCJjb252ZXJ0RmllbGRzRXJyb3IiLCJmaWVsZHMiLCJ0ZW1wbGF0ZSIsIl9sZW4iLCJfa2V5IiwibGVuIiwic3RyIiwieCIsImlzTmF0aXZlU3RyaW5nVHlwZSIsImlzRW1wdHlWYWx1ZSIsImFzeW5jUGFyYWxsZWxBcnJheSIsImZ1bmMiLCJyZXN1bHRzIiwiYXJyTGVuZ3RoIiwiYXN5bmNTZXJpYWxBcnJheSIsIm5leHQiLCJmbGF0dGVuT2JqQXJyIiwib2JqQXJyIiwiQXN5bmNWYWxpZGF0aW9uRXJyb3IiLCJfRXJyb3IiLCJfdGhpcyIsImFzeW5jTWFwIiwiX3BlbmRpbmciLCJmbGF0dGVuQXJyIiwiZmlyc3RGaWVsZHMiLCJvYmpBcnJLZXlzIiwib2JqQXJyTGVuZ3RoIiwicGVuZGluZyIsImlzRXJyb3JPYmoiLCJjb21wbGVtZW50RXJyb3IiLCJvZSIsImZpZWxkVmFsdWUiLCJkZWVwTWVyZ2UiLCJyZXF1aXJlZCQxIiwid2hpdGVzcGFjZSIsInVybFJlZyIsImdldFVybFJlZ2V4Iiwid29yZCIsInY0IiwidjZzZWciLCJ2NiIsInY0NkV4YWN0IiwidjRleGFjdCIsInY2ZXhhY3QiLCJpcCIsInByb3RvY29sIiwiYXV0aCIsImlwdjQiLCJpcHY2IiwiaG9zdCIsImRvbWFpbiIsInRsZCIsInBvcnQiLCJyZWdleCIsInBhdHRlcm4kMiIsInR5cGUkMSIsImN1c3RvbSIsInJ1bGVUeXBlIiwicmFuZ2UiLCJtaW4iLCJzcFJlZ2V4cCIsIm51bSIsIkVOVU0kMSIsImVudW1lcmFibGUkMSIsInBhdHRlcm4kMSIsIl9wYXR0ZXJuIiwic3RyaW5nIiwibWV0aG9kIiwiX2Jvb2xlYW4iLCJyZWdleHAiLCJpbnRlZ2VyIiwiZmxvYXRGbiIsImFycmF5Iiwib2JqZWN0IiwiRU5VTSIsImVudW1lcmFibGUiLCJwYXR0ZXJuIiwiZGF0ZU9iamVjdCIsImFueSIsInZhbGlkYXRvcnMiLCJuZXdNZXNzYWdlcyIsImNsb25lZCIsIm1lc3NhZ2VzIiwiU2NoZW1hIiwiZGVzY3JpcHRvciIsIl9wcm90byIsIl9tZXNzYWdlcyIsInNvdXJjZV8iLCJvYyIsIl90aGlzMiIsImNvbXBsZXRlIiwiX2Vycm9ycyIsIm1lc3NhZ2VzJDEiLCJzZXJpZXMiLCJ6IiwiZXJyb3JGaWVsZHMiLCJkb0l0IiwiZGVlcCIsImFkZEZ1bGxGaWVsZCIsInNjaGVtYSIsImVycm9yTGlzdCIsImZpbGxlZEVycm9ycyIsImZpZWxkc1NjaGVtYSIsInBhcmVkRmllbGRzU2NoZW1hIiwiZmllbGRTY2hlbWEiLCJmaWVsZFNjaGVtYUxpc3QiLCJlcnJzIiwiZmluYWxFcnJvcnMiLCJtZXNzYWdlSW5kZXgiLCJ2YWxpZGF0b3IiLCJjcmVhdGVWYWxpZGF0b3IiLCJlZGl0YWJsZUNlbGxzIiwiY3VyRGVzYyIsImVhY2hUcmVlIiwidXNlVGFibGVEYXRhIiwiZ2V0RGF0YSIsInRhYmxlRGF0YSIsImVkaXRhYmxlUm93cyIsImdldElkRnJvbVJvdyIsImdldEVkaXRhYmxlSWRGcm9tUm93IiwiZWRpdGFibGVFYWNoUm93cyIsImNlbGxzIiwiZWRpdGFibGVFYWNoQ2VsbHMiLCJjZWxsIiwiY3JlYXRlRWRpdGFibGVDZWxsIiwidGFibGVSb3ciLCJzZXRWYWx1ZSIsInVwZGF0ZUNlbGwiLCJzaG93QWN0aW9uIiwiZW5hYmxlZCIsImZvcm1JdGVtIiwic2V0RGVmYXVsdFZhbHVlIiwicm93S2V5VmFsdWUiLCJjcmVhdGVFZGl0YWJsZVJvdyIsImRvU2F2ZSIsIm5ld1JvdyIsInNhdmVSb3ciLCJwMyIsImNoaWxkIiwibmV4dEVkaXRhYmxlSWQiLCJlZGl0YWJsZUlkR2VuIiwic2V0dXBFZGl0YWJsZSIsInRtcFJvd3MiLCJmb3JPd24iLCJidWlsZFRoaW5EYXRhIiwidGhpbkRhdGEiLCJ0aGluUm93Iiwib2xkVGhpbkRhdGEiLCJnZXRFZGl0YWJsZUNlbGwiLCJhY3RpdmUiLCJpbmFjdGl2ZSIsInNhdmVFYWNoIiwiY2FuY2VsQWxsIiwicGVyc2lzdCIsInJlc3VtZSIsImhhc0RpcnR5IiwiZGlydHkiLCJhZGRJbmRleCIsInNldERlZmF1bHRGb3JtIiwiZm9ybUNvbHVtbkNvbmZpZ3MiLCJhZGRSb3ciLCJnZXRFZGl0YWJsZVJvdyIsInJlbW92ZVRhYmxlUm93QnlFZGl0YWJsZUlkIiwicmVtb3ZlUm93IiwiYWN0aXZlQ29scyIsImNvbHMiLCJnZXRBY3RpdmVSb3dzIiwicm93cyIsImhhc0Vycm9yIiwicmVtb3ZlRGF0YUVkaXRhYmxlSWQiLCJnZXRDbGVhblRhYmxlRGF0YSIsInVzZUNvbXBvbmVudFJlZlByb3ZpZGVyIiwiY29tcG9uZW50c1JlZiIsImdldHRlciIsInNldHRlciIsImJ1aWxkVGFibGVTbG90cyIsInNvcnRlZENvbHVtbnMiLCJyZW5kZXJSb3dIYW5kbGUiLCJyZW5kZXJDZWxsQ29tcG9uZW50IiwidGFibGVDb2x1bW5Db21wIiwidGFibGVDb2x1bW5Hcm91cENvbXAiLCJ0YWJsZUNvbHVtbkdyb3VwIiwidGFibGVTbG90cyIsImJ1aWxkQ29sdW1uIiwiY2VsbFNsb3RzIiwiY29sdW1uU2xvdHMiLCJjZWxsU2xvdE5hbWUiLCJjdXJyZW50VGFibGVDb2x1bW5Db21wIiwic3ViQ29sdW1ucyIsInN1YkNvbHVtbiIsIm5ld0l0ZW0iLCJyb3dIYW5kbGVTbG90cyIsInRhYmxlVmVyc2lvbiIsInRhYmxlVjIiLCJfcGFyZW50IiwiZGF0YUluZGV4IiwiY2hpbGRPcHRpb25zIiwiY3VzdG9tUmVuZGVyIiwicmVuZGVyTWV0aG9kIiwibmV3Q29sIiwicmVidWlsZFJlbmRlclNjb3BlIiwiY2VsbFJlbmRlciIsImNvbmRpdGlvbmFsUmVuZGVyIiwiY29tcG9uZW50UmVmcyIsImxlbmd0aCIsImNlbGxSZWYiLCJjdXJyZW50UmVmIiwidGFibGVDb2x1bW5DSSIsInRhYmxlQ29sdW1uVjIiLCJzY3JvbGxUbyIsInRvcCIsInRhYmxlQ29tcCIsImVkaXRhYmxlV3JhcCIsIm9uUm93SGFuZGxlIiwib25DaGFuZ2UiLCJvblNvcnRDaGFuZ2UiLCJzb3J0ZXIiLCJvbkZpbHRlckNoYW5nZSIsImZpbHRlcnMiLCJvblBhZ2luYXRpb24iLCJidWJibGVVcCIsInJvd0hhbmRsZVNsb3RzTmFtZSIsIm5ld1Njb3BlIiwic2V0UmVmIiwicm93UmVmcyIsImVkaXRhYmxlQ2VsbCIsInJlYWRvbmx5IiwicmVuZGVyTW9kZSIsImRhdGFTb3VyY2UiLCJjb21wdXRlZEJpbmRpbmciLCJjb21wdXRlZFRhYmxlU2xvdHMiLCJ0YWJsZVJlbmRlciIsInZMb2FkaW5nIiwicmVzb2x2ZURpcmVjdGl2ZSIsIndpdGhEaXJlY3RpdmVzIiwiY29tcHV0ZWRGbGF0Q29sdW1ucyIsImZsYXRDb2x1bW5zIiwiZmxhdENvbHVtbnNGbiIsImNvbXB1dGVkTXVsdGlIZWFkZXJzIiwiYnVpbGRNdWx0aUhlYWRlcnNCaW5kIiwidHJlZUNvbHVtbnMiLCJiaW5kIiwiaXNGbGF0IiwiY29sdW1uc0lzRmxhdCIsImNyZWF0ZVRhYmxlSW5zdGFuY2UiLCJ3aWR0aCIsImhlaWdodCIsImNvbXB1dGVkQ29tcG9uZW50IiwiY29tcHV0ZWRQcm9wc0NvbXBvbmVudCIsImNvbXB1dGVkVGl0bGUiLCJzaG93VGl0bGUiLCJjb21wdXRlZENlbGxDb250ZW50UmVuZGVyIiwic2xvdCIsImxhc3RSZW5kZXIiLCJjZWxsQ29udGVudFJlbmRlciIsIm1hdGNoIiwiZm9ybWF0dGVyIiwidG9vbHRpcFByb3BzIiwidG9vbHRpcFNsb3RzIiwiY29udGVudCIsImNvbHVtbktleSIsImNvbXB1dGVkRm9ybSIsImdldEZvcm1SZWZGdW5jIiwiZ2V0Rm9ybSIsImNvbXB1dGVkSXNFZGl0YWJsZSIsImVkaXRpbmdVcGRhdGUiLCJvblN1Ym1pdCIsInNhdmUiLCJvbkNhbmNlbCIsImlzQ2hhbmdlZCIsImVkaXQiLCJpbnB1dENvbXBvbmVudCIsImlzRWRpdGluZyIsImFjdGl2ZVRyaWdnZXIiLCJtZXRob2RzIiwiJHJlZnMiLCJ0YXJnZXRJbnB1dFJlZiIsIl9fZW1pdCIsImRvU3VibWl0IiwiZG9DYW5jZWwiLCJnZXRWYWxpZGF0ZUVycm9yTWVzc2FnZSIsImVkaXRpbmciLCJfc2ZjX21haW4kbSIsInNvcnRBcnIiLCJzb3J0ZWRCdXR0b25zIiwiU2V0Rm9ybURhdGFPcHRpb25zIiwiQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXkiLCJ0cmFuc2Zvcm1Db2x1bW5zVHJlZSIsImN1cnJlbnRDb2x1bW5zIiwib3JpZ2luYWxDb2x1bW5zTWFwIiwiX3RleHQiLCJidWlsZENvbHVtbkZpbHRlckl0ZW0iLCJ0cmFuc2Zvcm1Ub1RhYmxlQ29sdW1ucyIsInNldEN1cnJlbnRWYWx1ZSIsImRvX3NhdmUiLCJjbGVhclRoaXNTdG9yYWdlIiwibm9TYXZlIiwic2F2ZU9wdGlvbnNUb1N0b3JhZ2UiLCJkb0VtaXQiLCJjb21wdXRlZE9yaWdpbmFsQ29sdW1ucyIsInNpbXBsZVN1Ym1pdCIsInNpbXBsZVJlc2V0Iiwic3RvcmFnZVRhYmxlU3RvcmUiLCJnZXRTdG9yYWdlVGFibGUiLCJyZW1vdGVTdG9yYWdlIiwic3RvcmVkT3B0aW9ucyIsImdldE9wdGlvbnNGcm9tU3RvcmFnZSIsImdldENvbHVtbnNIYXNoIiwiaGFzaCIsImluaXQiLCJzdG9yZUhhc2giLCJ1cGRhdGUiLCJjaGFuZ2UiLCJidWlsZFRleHQiLCJlbGVtZW50IiwiX3dpdGhEaXJlY3RpdmVzIiwiX3ZTaG93IiwiX3NmY19tYWluJGsiLCJGc1RhYmxlQ29sdW1uc0ZpbHRlciIsImNvbHVtbnNGaWx0ZXJSZWYiLCJkZWZhdWx0QnV0dG9ucyIsImRlZmF1bHRCdXR0b25zS2V5IiwicG9wb3ZlclZpc2libGUiLCJzdG9yYWdlIiwib3duS2V5cyIsImVudW1lcmFibGVPbmx5Iiwic3ltYm9scyIsInN5bSIsIl9vYmplY3RTcHJlYWQyIiwiX2RlZmluZVByb3BlcnR5IiwiX3R5cGVvZiIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIiwiZXhjbHVkZWQiLCJzb3VyY2VLZXlzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwic291cmNlU3ltYm9sS2V5cyIsInZlcnNpb24iLCJ1c2VyQWdlbnQiLCJJRTExT3JMZXNzIiwiRWRnZSIsIkZpcmVGb3giLCJTYWZhcmkiLCJJT1MiLCJDaHJvbWVGb3JBbmRyb2lkIiwiY2FwdHVyZU1vZGUiLCJvZmYiLCJtYXRjaGVzIiwic2VsZWN0b3IiLCJnZXRQYXJlbnRPckhvc3QiLCJjbG9zZXN0IiwiaW5jbHVkZUNUWCIsIlJfU1BBQ0UiLCJ0b2dnbGVDbGFzcyIsInN0YXRlIiwiY3NzIiwic3R5bGUiLCJtYXRyaXgiLCJzZWxmT25seSIsImFwcGxpZWRUcmFuc2Zvcm1zIiwibWF0cml4Rm4iLCJmaW5kIiwidGFnTmFtZSIsIml0ZXJhdG9yIiwiZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCIsInNjcm9sbGluZ0VsZW1lbnQiLCJnZXRSZWN0IiwicmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jayIsInJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQiLCJ1bmRvU2NhbGUiLCJlbFJlY3QiLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiLCJjb250YWluZXJSZWN0IiwiZWxNYXRyaXgiLCJzY2FsZVgiLCJzY2FsZVkiLCJpc1Njcm9sbGVkUGFzdCIsImVsU2lkZSIsInBhcmVudFNpZGUiLCJnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudCIsImVsU2lkZVZhbCIsInBhcmVudFNpZGVWYWwiLCJnZXRDaGlsZCIsImNoaWxkTnVtIiwiaW5jbHVkZURyYWdFbCIsImN1cnJlbnRDaGlsZCIsIlNvcnRhYmxlIiwibGFzdENoaWxkIiwibGFzdCIsImdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0Iiwib2Zmc2V0TGVmdCIsIm9mZnNldFRvcCIsIndpblNjcm9sbGVyIiwiaW5kZXhPZk9iamVjdCIsImluY2x1ZGVTZWxmIiwiZWxlbSIsImdvdFNlbGYiLCJlbGVtQ1NTIiwiZXh0ZW5kIiwiZHN0Iiwic3JjIiwiaXNSZWN0RXF1YWwiLCJyZWN0MSIsInJlY3QyIiwiX3Rocm90dGxlVGltZW91dCIsInRocm90dGxlIiwibXMiLCJjYW5jZWxUaHJvdHRsZSIsInNjcm9sbEJ5IiwieSIsIlBvbHltZXIiLCIkIiwiZXhwYW5kbyIsIkFuaW1hdGlvblN0YXRlTWFuYWdlciIsImFuaW1hdGlvblN0YXRlcyIsImFuaW1hdGlvbkNhbGxiYWNrSWQiLCJmcm9tUmVjdCIsImNoaWxkTWF0cml4IiwiYW5pbWF0aW5nIiwiYW5pbWF0aW9uVGltZSIsInRpbWUiLCJ0b1JlY3QiLCJwcmV2RnJvbVJlY3QiLCJwcmV2VG9SZWN0IiwiYW5pbWF0aW5nUmVjdCIsInRhcmdldE1hdHJpeCIsImNhbGN1bGF0ZVJlYWxUaW1lIiwiY3VycmVudFJlY3QiLCJkdXJhdGlvbiIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwicmVwYWludCIsImRlZmF1bHRzIiwiUGx1Z2luTWFuYWdlciIsInNvcnRhYmxlIiwiZXZ0IiwiZXZlbnROYW1lR2xvYmFsIiwicGx1Z2luTmFtZSIsImluaXRpYWxpemVkIiwibW9kaWZpZWQiLCJldmVudFByb3BlcnRpZXMiLCJtb2RpZmllZFZhbHVlIiwiZGlzcGF0Y2hFdmVudCIsIl9yZWYiLCJyb290RWwiLCJ0YXJnZXRFbCIsImNsb25lRWwiLCJ0b0VsIiwiZnJvbUVsIiwib2xkSW5kZXgiLCJuZXdJbmRleCIsIm9sZERyYWdnYWJsZUluZGV4IiwibmV3RHJhZ2dhYmxlSW5kZXgiLCJvcmlnaW5hbEV2ZW50IiwicHV0U29ydGFibGUiLCJleHRyYUV2ZW50UHJvcGVydGllcyIsIm9uTmFtZSIsImFsbEV2ZW50UHJvcGVydGllcyIsIl9leGNsdWRlZCIsInBsdWdpbkV2ZW50IiwiZHJhZ0VsIiwicGFyZW50RWwiLCJnaG9zdEVsIiwibmV4dEVsIiwibGFzdERvd25FbCIsImNsb25lSGlkZGVuIiwibW92ZWQiLCJfaGlkZUdob3N0Rm9yVGFyZ2V0IiwiX3VuaGlkZUdob3N0Rm9yVGFyZ2V0IiwiX2Rpc3BhdGNoRXZlbnQiLCJhY3RpdmVHcm91cCIsImF3YWl0aW5nRHJhZ1N0YXJ0ZWQiLCJpZ25vcmVOZXh0Q2xpY2siLCJzb3J0YWJsZXMiLCJ0YXBFdnQiLCJ0b3VjaEV2dCIsImxhc3REeCIsImxhc3REeSIsInRhcERpc3RhbmNlTGVmdCIsInRhcERpc3RhbmNlVG9wIiwibGFzdFRhcmdldCIsImxhc3REaXJlY3Rpb24iLCJwYXN0Rmlyc3RJbnZlcnRUaHJlc2giLCJpc0NpcmN1bXN0YW50aWFsSW52ZXJ0IiwidGFyZ2V0TW92ZURpc3RhbmNlIiwiZ2hvc3RSZWxhdGl2ZVBhcmVudCIsImdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsIiwiX3NpbGVudCIsInNhdmVkSW5wdXRDaGVja2VkIiwiZG9jdW1lbnRFeGlzdHMiLCJQb3NpdGlvbkdob3N0QWJzb2x1dGVseSIsIkNTU0Zsb2F0UHJvcGVydHkiLCJzdXBwb3J0RHJhZ2dhYmxlIiwic3VwcG9ydENzc1BvaW50ZXJFdmVudHMiLCJfZGV0ZWN0RGlyZWN0aW9uIiwiZWxDU1MiLCJlbFdpZHRoIiwiY2hpbGQxIiwiY2hpbGQyIiwiZmlyc3RDaGlsZENTUyIsInNlY29uZENoaWxkQ1NTIiwiZmlyc3RDaGlsZFdpZHRoIiwic2Vjb25kQ2hpbGRXaWR0aCIsInRvdWNoaW5nU2lkZUNoaWxkMiIsIl9kcmFnRWxJblJvd0NvbHVtbiIsImRyYWdSZWN0IiwidGFyZ2V0UmVjdCIsInZlcnRpY2FsIiwiZHJhZ0VsUzFPcHAiLCJkcmFnRWxTMk9wcCIsImRyYWdFbE9wcExlbmd0aCIsInRhcmdldFMxT3BwIiwidGFyZ2V0UzJPcHAiLCJ0YXJnZXRPcHBMZW5ndGgiLCJfZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUiLCJ0aHJlc2hvbGQiLCJyZWN0IiwiaW5zaWRlSG9yaXpvbnRhbGx5IiwiaW5zaWRlVmVydGljYWxseSIsIl9wcmVwYXJlR3JvdXAiLCJ0b0ZuIiwicHVsbCIsInRvIiwiZnJvbSIsInNhbWVHcm91cCIsIm90aGVyR3JvdXAiLCJvcmlnaW5hbEdyb3VwIiwibmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQiLCJuZWFyZXN0IiwiX2NoZWNrT3V0c2lkZVRhcmdldEVsIiwiZGF0YVRyYW5zZmVyIiwicHJldmVudE9uRmlsdGVyIiwidG91Y2giLCJvcmlnaW5hbFRhcmdldCIsImZpbHRlciIsIl9zYXZlSW5wdXRDaGVja2VkU3RhdGUiLCJjcml0ZXJpYSIsIm93bmVyRG9jdW1lbnQiLCJkcmFnU3RhcnRGbiIsIl9kaXNhYmxlRHJhZ2dhYmxlIiwiX25leHRUaWNrIiwiZmFsbGJhY2siLCJpbnNlcnRlZCIsImZhbGxiYWNrVG9sZXJhbmNlIiwiZmFsbGJhY2tPZmZzZXQiLCJnaG9zdE1hdHJpeCIsInJlbGF0aXZlU2Nyb2xsT2Zmc2V0IiwiZHgiLCJkeSIsImNzc01hdHJpeCIsInJldmVydCIsImFjdGl2ZVNvcnRhYmxlIiwiaXNPd25lciIsImNhblNvcnQiLCJmcm9tU29ydGFibGUiLCJjb21wbGV0ZWRGaXJlZCIsImRyYWdPdmVyRXZlbnQiLCJleHRyYSIsImNvbXBsZXRlZCIsIl9vbk1vdmUiLCJjYXB0dXJlIiwiaW5zZXJ0aW9uIiwiZWxMYXN0Q2hpbGQiLCJfZ2hvc3RJc0xhc3QiLCJfZ2hvc3RJc0ZpcnN0IiwiZmlyc3RDaGlsZCIsImRpcmVjdGlvbiIsInRhcmdldEJlZm9yZUZpcnN0U3dhcCIsImRpZmZlcmVudExldmVsIiwiZGlmZmVyZW50Um93Q29sIiwic2lkZTEiLCJzY3JvbGxlZFBhc3RUb3AiLCJzY3JvbGxCZWZvcmUiLCJfZ2V0U3dhcERpcmVjdGlvbiIsInNpYmxpbmciLCJkcmFnSW5kZXgiLCJuZXh0U2libGluZyIsIm1vdmVWZWN0b3IiLCJfdW5zaWxlbnQiLCJfY2FuY2VsTmV4dFRpY2siLCJfZ2xvYmFsRHJhZ092ZXIiLCJfZ2VuZXJhdGVJZCIsInVzZUFuaW1hdGlvbiIsIml0ZW1zIiwid2lsbEluc2VydEFmdGVyIiwib25Nb3ZlRm4iLCJyZXRWYWwiLCJzcGFjZXIiLCJzd2FwVGhyZXNob2xkIiwiaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIiwiaW52ZXJ0U3dhcCIsImlzTGFzdFRhcmdldCIsIm1vdXNlT25BeGlzIiwidGFyZ2V0TGVuZ3RoIiwidGFyZ2V0UzEiLCJ0YXJnZXRTMiIsImludmVydCIsIl9nZXRJbnNlcnREaXJlY3Rpb24iLCJzdW0iLCJyb290IiwiaW5wdXRzIiwiaWR4IiwiYXV0b1Njcm9sbHMiLCJzY3JvbGxFbCIsInNjcm9sbFJvb3RFbCIsInNjcm9sbGluZyIsImxhc3RBdXRvU2Nyb2xsWCIsImxhc3RBdXRvU2Nyb2xsWSIsInRvdWNoRXZ0JDEiLCJwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCIsIkF1dG9TY3JvbGxQbHVnaW4iLCJBdXRvU2Nyb2xsIiwiX3JlZjIiLCJjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsIiwiY2xlYXJBdXRvU2Nyb2xscyIsImF1dG9TY3JvbGwiLCJvZ0VsZW1TY3JvbGxlciIsIm5ld0VsZW0iLCJpc0ZhbGxiYWNrIiwic2VucyIsInNwZWVkIiwic2Nyb2xsVGhpc0luc3RhbmNlIiwic2Nyb2xsQ3VzdG9tRm4iLCJsYXllcnNPdXQiLCJjdXJyZW50UGFyZW50IiwiY2FuU2Nyb2xsWCIsImNhblNjcm9sbFkiLCJzY3JvbGxXaWR0aCIsInNjcm9sbEhlaWdodCIsInNjcm9sbFBvc1giLCJzY3JvbGxQb3NZIiwidngiLCJ2eSIsInNjcm9sbE9mZnNldFkiLCJzY3JvbGxPZmZzZXRYIiwiZHJvcCIsImRpc3BhdGNoU29ydGFibGVFdmVudCIsImhpZGVHaG9zdEZvclRhcmdldCIsInVuaGlkZUdob3N0Rm9yVGFyZ2V0IiwidG9Tb3J0YWJsZSIsIlJldmVydCIsIl9yZWYzIiwiUmVtb3ZlIiwiX3JlZjQiLCJwYXJlbnRTb3J0YWJsZSIsIl9fZGVmUHJvcCIsIl9fZGVmUHJvcHMiLCJfX2dldE93blByb3BEZXNjcyIsIl9fZ2V0T3duUHJvcFN5bWJvbHMiLCJfX2hhc093blByb3AiLCJfX3Byb3BJc0VudW0iLCJfX2RlZk5vcm1hbFByb3AiLCJfX3NwcmVhZFZhbHVlcyIsIl9fc3ByZWFkUHJvcHMiLCJyZW1vdmVOb2RlIiwiaW5zZXJ0Tm9kZUF0IiwiZmF0aGVyTm9kZSIsInBvc2l0aW9uIiwicmVmTm9kZSIsImdldENvbnNvbGUiLCJjb25zb2xlJDEiLCJjYWNoZSIsImNhbWVsaXplIiwibWFuYWdlQW5kRW1pdCQxIiwiZW1pdCQxIiwibWFuYWdlJDEiLCJldmVudEhhbmRsZXJOYW1lcyIsImV2ZW50czIiLCJpc1JlYWRPbmx5IiwidGFncyIsImlzSHRtbFRhZyIsImlzVHJhbnNpdGlvbiIsImlzSHRtbEF0dHJpYnV0ZSIsInByb2plY3QiLCJnZXRDb21wb25lbnRBdHRyaWJ1dGVzIiwiJGF0dHJzIiwiY29tcG9uZW50RGF0YSIsImF0dHJpYnV0ZXMiLCJjcmVhdGVTb3J0YWJsZU9wdGlvbiIsImNhbGxCYWNrQnVpbGRlciIsImdldFZhbGlkU29ydGFibGVFbnRyaWVzIiwiZXZlbnRUeXBlIiwiZXZlbnRCdWlsZGVyIiwidmFsdWUyIiwiZ2V0SHRtbEVsZW1lbnRGcm9tTm9kZSIsImFkZENvbnRleHQiLCJkb21FbGVtZW50IiwiZ2V0Q29udGV4dCIsIkNvbXBvbmVudFN0cnVjdHVyZSIsImhlYWRlciIsImRlZmF1bHROb2RlcyIsImZvb3RlciIsInJlYWxMaXN0IiwiaDIiLCJ0YWciLCJfaXNSb290Q29tcG9uZW50IiwiZG9tSW5kZXgiLCJkb21DaGlsZHJlbiIsImZpcnN0RG9tTGlzdEVsZW1lbnQiLCJpbmRleEZpcnN0RG9tTGlzdEVsZW1lbnQiLCJlbGVtZW50MiIsImdldFNsb3QiLCJzbG90VmFsdWUiLCJjb21wdXRlTm9kZXMiLCJnZXRLZXkiLCJub3JtYWxpemVkTGlzdCIsImdldFJvb3RJbmZvcm1hdGlvbiIsInRyYW5zaXRpb24iLCJleHRlcm5hbENvbXBvbmVudCIsIlRyYW5zaXRpb25Hcm91cCIsImNvbXB1dGVDb21wb25lbnRTdHJ1Y3R1cmUiLCJldnROYW1lIiwiZXZ0RGF0YSIsIm1hbmFnZSIsIm9yaWdpbmFsRWxlbWVudCIsIm1hbmFnZUFuZEVtaXQiLCJkZWxlZ2F0ZUNhbGxCYWNrIiwiZHJhZ2dpbmdFbGVtZW50IiwiZHJhZ2dhYmxlQ29tcG9uZW50IiwiY29tcG9uZW50U3RydWN0dXJlIiwiJGVsIiwic29ydGFibGVPcHRpb25zIiwidGFyZ2V0RG9tRWxlbWVudCIsIml0ZW1LZXkiLCJuZXdPcHRpb25WYWx1ZSIsIl9zb3J0YWJsZSIsImh0bUVsZW1lbnQiLCJvbkxpc3QiLCJuZXdMaXN0Iiwic3BsaWNlTGlzdCIsInVwZGF0ZVBvc2l0aW9uIiwicmVsYXRlZCIsImRlc3RpbmF0aW9uIiwiYWRkZWQiLCJyZW1vdmVkIiwicmVsYXRlZENvbnRleHQiLCJjdXJyZW50RG9tSW5kZXgiLCJjdXJyZW50SW5kZXgiLCJtb3ZlIiwiZnV0dXJlSW5kZXgiLCJkcmFnZ2VkQ29udGV4dCIsInNlbmRFdmVudCIsIl9zZmNfbWFpbiRqIiwib25EcmFnZ2FibGVNb3ZlIiwiZHJhZ2VkIiwic29ydGVkIiwibGVmdEluZGV4IiwicmlnaHRJbmRleCIsIm1pbk5vdEluZGV4IiwibWF4Tm90SW5kZXgiLCJidWlsZFVwZGF0ZUtleSIsInVwZGF0ZUNoZWNrZWQiLCJ1cGRhdGVDaGlsZHJlbiIsInVwZGF0ZVBhcmVudCIsIm9uQ2hlY2tDaGFuZ2VkIiwiZml4ZWRDaGFuZ2UiLCJpc1Jvb3QiLCJGc1RhYmxlQ29sdW1uc0ZpeGVkQ29udHJvbGxlciIsIl9jb21wb25lbnRfZnNfY29sdW1uc19maWx0ZXJfbmVzdF9saXN0IiwiZHJhd2VyQmluZCIsImNoZWNrQWxsIiwib25DaGVja0FsbENoYW5nZSIsImNoZWNrQWxsQmluZCIsInNob3dMZW5ndGgiLCJhbGxMZW5ndGgiLCJpc0luZGV0ZXJtaW5hdGUiLCJhbGxDaGVja2VkVXBkYXRlIiwiRnNDb2x1bW5zRmlsdGVyTmVzdExpc3QiLCJfc2ZjX21haW4kZyIsIkZzU2VhcmNoQnV0dG9ucyIsInZhbGlkYXRlZEZvcm0iLCJzZWFyY2hBZnRlclJlc2V0IiwiYXV0b1NlYXJjaCIsImRlYm91bmNlIiwidmFsaWRhdGVPbkNoYW5nZSIsIl9jZWxsUmVuZGVyIiwib25Gb3JtVmFsaWRhdGVkIiwiTG9kYXNoR2V0Iiwic3BsaXRLZXkiLCJzcGxpdCIsIl9vblVwZGF0ZU1vZGVsVmFsdWUiLCJvblZhbHVlQ2hhbmdlZCIsIl9vbklucHV0Iiwib25JbnB1dCIsIm9uS2V5dXAiLCJhdXRvU2VhcmNoVHJpZ2dlciIsImRvU2VhcmNoIiwiZGVmYXVsdFNsb3QiLCJidWlsZEZpZWxkQ29udGV4dCIsImNvbXBvbmVudFJlbmRlclJlZnMiLCJzcGxpdGVkS2V5IiwicnVsZVBhdGgiLCJzZWFyY2hGb3JtUmVmIiwiZ2V0Q29tcG9uZW50UmVuZGVyUmVmIiwiZG9SZXNldCIsImRvVmFsaWRhdGUiLCJzaWxlbnQiLCJ2YWxpZGF0ZVdyYXAiLCJkZWZCdG5PcHRpb25zIiwiX2NsaWNrIiwiaW5pdEF1dG9TZWFyY2giLCJ3YWl0IiwiZ2V0VmFsaWRhdGVkRm9ybSIsInNldEZvcm0iLCJuZXdGb3JtIiwiaW5wdXRFdmVudERpc2FibGVkIiwiZG9BdXRvU2VhcmNoIiwiY2hhbmdlSW5wdXRFdmVudERpc2FibGVkIiwidmFsaWRhdGVPbkNoYW5nZVNpbGVudCIsImNvbXBvbmVudFJlZiIsInZhbHVlQ2hhbmdlQ29udGV4dCIsImltbWVkaWF0ZSIsImNvbXB1dGVkUnVsZXMiLCJfc2ZjX21haW4kZSIsImNvbXB1dGVkSXNNdWx0aUxpbmUiLCJjb2x1bW5zUm93UmVmIiwiY29sdW1uc0JveEhlaWdodFJlZiIsImNvbHVtbnNMaXN0IiwiY29sdW1uc0xpbmVIZWlnaHRSZWYiLCJzZWFyY2hFdmVudENvbnRleHRSZWYiLCJ0b2dnbGVDb2xsYXBzZSIsImNvbXB1dGVkQ29sTmFtZSIsImNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0IiwiX2NvbXBvbmVudF9mc19zZWFyY2hfYnV0dG9ucyIsImNvbGxhcHNlIiwiX3NmY19tYWluJGQiLCJjb2xsYXBzZUJ1dHRvbiIsImRlZmF1bHRPcHRpb24iLCJfX0RFRkFVTFRfXyIsIm9uVXBkYXRlQWN0aXZlS2V5IiwiZGVmYXVsdExpbWl0IiwiZGlhbG9nT3BlbmVkIiwiY29tcHV0ZWREaWFsb2ciLCJmb3JtSXRlbUNvbnRleHQiLCJpbnB1dEJpbmRpbmciLCJlbWl0Q2hhbmdlIiwiaGFuZGxlQ2xpY2siLCJwYWdlciIsIm9uVGFiQ2hhbmdlIiwiYXBpIiwibGltaXQiLCJpY29uU3RvcmUiLCJsb2FkSWNvblNldCIsInNldHMiLCJ1bmNhdGVnb3JpZXMiLCJjYXRlZ29yaWVzIiwic2VhcmNoS2V5IiwidGFiS2V5IiwicmVzZXRQYWdlciIsImhhbmRsZVNlYXJjaCIsImdldFBhZ2VyRnJvbUljb25TZXQiLCJlbmQiLCJoYW5kbGVJY29uU2VsZWN0Iiwib25Db25maXJtIiwibG9hZE1vcmUiLCJjb21wdXRlVGFicyIsIl9ob2lzdGVkXzgiLCJfY29tcG9uZW50X2ZzX2xvYWRpbmciLCJfaG9pc3RlZF85IiwiX2hvaXN0ZWRfMTAiLCJfc2ZjX21haW4kYSIsImNvbXB1dGVkUmFkaW9OYW1lIiwidXNlZERpY3QiLCJjb21wdXRlZE9wdGlvbnMiLCJvcHQiLCJvcHRpb25Qcm9wcyIsInNlbGVjdFJlZiIsImNvbXB1dGVkUGxhY2Vob2xkZXIiLCJwbGFjZWhvbGRlciIsIm9uU2VsZWN0ZWRDaGFuZ2UiLCJkYXRhTWFwIiwidGVtcFNsb3RzIiwiX3VzZVNsb3RzIiwic2VsZWN0Q29tcCIsIiRlbWl0IiwidGhpc1Nsb3RzIiwicmVuZGVyTGFiZWwiLCJvcHRpb25Db21wIiwiY29zIiwiZ2V0SGFzaENvZGUiLCJjaHIiLCJidWlsZEFycmF5VmFsdWUiLCJ2YWx1ZUFyciIsIl9zZmNfbWFpbiQ4IiwiQ09MT1JfTElTVCIsIkVGRkVDVF9MSVNUIiwiZ2V0Q29sb3IiLCJzZXRDb2xvciIsInR5cGVLZXkiLCJjb2xvciIsImhhc2hjb2RlIiwiY29sb3JzIiwiZWZmZWN0cyIsImNvbXB1dGVkVmFsdWVJdGVtcyIsInZhbHVlUHJvcCIsImxhYmVsUHJvcCIsImNvbG9yZnVsT3B0aW9ucyIsIm5ld1ZhbHVlcyIsIl9zZmNfbWFpbiQ3IiwiY29tcHV0ZWRNdWx0aXBsZSIsInN1YiIsIkxhYmVscyIsIkluZGV4IiwiX3NmY19tYWluJDYiLCJjYXNjYWRlclJlZiIsImRpY3RVc2VSZXQiLCJmaWVsZE5hbWVzQmluZGVyIiwib25TZWxlY3RDaGFuZ2UiLCJzZWxlY3RlZE9wdGlvbnMiLCJfc2ZjX21haW4kNSIsIl9zZmNfbWFpbiQ0IiwiX3NmY19tYWluJDMiLCJfc2ZjX21haW4kMiIsInRyZWVSZWYiLCJkaWN0U2VsZWN0UmVmIiwidmFsdWVzRm9ybWF0UmVmIiwiZGlhbG9nT3BlbiIsIm9uQ2xvc2UiLCJpbml0U2VsZWN0ZWRLZXlzIiwibXVsdGlwbGUiLCJ2YWx1ZVR5cGUiLCJmb3JtV3JhcHBlck9wdGlvbnMiLCJvcGVuVGFibGVTZWxlY3QiLCJvcGVuT3B0aW9ucyIsImNydWRPcHRpb25zT3ZlcnJpZGUiLCJidWlsZE1lcmdlZENydWRPcHRpb25zIiwiYmVmb3JlT3BlbiIsImdldFNjb3BlQ29udGV4dCIsIndyYXBwZXJPcHRpb25zIiwidmlld01vZGUiLCJkaWFsb2ciLCJidWlsZEluaXRCaW5kIiwib25PayIsImNvbXB1dGVkVmFsdWVzRm9ybWF0IiwidmFsdWVzRm9ybWF0IiwiY29tcHV0ZWRTZWxlY3QiLCJ1cGRhdGVLZXkiLCJjbGVhcmFibGUiLCJidWlsZE11bHRpQmluZGluZyIsImFwcGVuZEJ5VmFsdWVzIiwicmVmcmVzaGluZyIsInNlbGVjdGlvbk9wdGlvbnMiLCJidWlsZFNlbGVjdGlvbkNydWRPcHRpb25zIiwiY3Jvc3NQYWdlIiwic2VsZWN0T25DbGlja1JvdyIsImdldFBhZ2VEYXRhIiwib25TZWxlY3RlZEtleXNDaGFuZ2VkIiwib25SZWZyZXNoZWQiLCJzZXRTZWxlY3RlZFJvd3MiLCJnZXRCYXNlVGFibGVSZWYiLCJnZXREaWN0TWFwIiwiZW1pdE9uVmlld01vZGVsIiwib3BlbmVkIiwiX2NvbXBvbmVudF9mc19kaWN0X3NlbGVjdCIsInNraXBWYWxpZGF0aW9uV3JhcHBlciIsIl9jb21wb25lbnRfZnNfZm9ybV93cmFwcGVyIiwiZGVzdHJveU9uQ2xvc2UiLCJfY29tcG9uZW50X2ZzX2NydWQiLCJzaG93Q3VycmVudCIsIl9jb21wb25lbnRfZnNfdmFsdWVzX2Zvcm1hdCIsImNsb3NhYmxlIiwiZG9VcGRhdGUiLCJkaWN0U2VsZWN0IiwiX2NvbXBvbmVudF9mc190YWJsZV9zZWxlY3QiLCJ0YWJsZVNlbGVjdCIsIkZhc3RDcnVkIiwiY3VzdG9tQ29tcG9uZW50cyIsImNvbSIsInByaW50V2FybmluZ0xvZ2dlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlBLE1BQU1BLEtBQXFCO0FBQUEsRUFDekIsY0FBY0MsR0FBNEI7QUFDeEMsV0FBTztFQUNUO0FBQUEsRUFDQSxlQUFlQyxHQUFnQjtBQUN2QixVQUFBLEVBQUUsRUFBTSxJQUFBQSxHQUNSQyxJQUFLLENBQUNDLE1BQ0hDLEVBQVMsTUFDUCxFQUFFRCxDQUFJLENBQ2QsR0FFR0UsSUFBS0MsR0FBVTtBQUNkLFdBQUE7QUFBQSxNQUNMLFVB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QUNSLGVBQWVGO0FBQUEsRUFDZixNQUFNQztBQUNSO0FBQ0EsU0FBU0ksR0FBV3I4QixHQUFXO0FBQzdCLFNBQU9tOEIsR0FBa0IsUUFBUW44QixDQUFTLE1BQU07QUFDbEQ7QUFDQSxNQUFNczhCLEtBQU87QUFBQSxFQUNYO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFB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