UNPKG

suitescript-mocks

Version:

Set of mocks for unit testing Netsuite Suitescript 2.*

511 lines (509 loc) 81.6 kB
var _initClass, _dec, _dec2, _dec3, _dec4, _init_cancelLine, _dec5, _dec6, _dec7, _init_commitLine, _dec8, _init_executeMacro, _dec9, _dec10, _init_findSublistLineWithValue, _dec11, _init_getCurrentMatrixSublistValue, _dec12, _dec13, _dec14, _init_getCurrentSublistField, _dec15, _dec16, _dec17, _init_getCurrentSublistIndex, _dec18, _dec19, _init_getCurrentSublistSubrecord, _dec20, _dec21, _dec22, _init_getCurrentSublistText, _dec23, _dec24, _dec25, _init_getCurrentSublistValue, _dec26, _dec27, _init_getField, _dec28, _dec29, _init_getLineCount, _dec30, _dec31, _init_getSublist, _dec32, _dec33, _init_getSublistField, _dec34, _dec35, _init_getSublistFields, _dec36, _dec37, _init_getSublistSubrecord, _dec38, _dec39, _init_getSublistText, _dec40, _dec41, _init_getSublistValue, _dec42, _dec43, _init_getSubrecord, _dec44, _dec45, _init_getText, _dec46, _dec47, _init_getValue, _dec48, _dec49, _dec50, _init_hasCurrentSublistSubrecord, _dec51, _dec52, _init_hasSublistSubrecord, _dec53, _dec54, _init_hasSubrecord, _dec55, _dec56, _init_insertLine, _dec57, _dec58, _dec59, _init_removeCurrentSublistSubrecord, _dec60, _dec61, _init_removeLine, _dec62, _dec63, _dec64, _init_removeSublistSubrecord, _dec65, _dec66, _init_removeSubrecord, _dec67, _dec68, _init_save, _dec69, _dec70, _dec71, _init_selectLine, _dec72, _dec73, _dec74, _init_selectNewLine, _dec75, _dec76, _dec77, _init_setCurrentSublistText, _dec78, _dec79, _dec80, _init_setCurrentSublistValue, _dec81, _dec82, _dec83, _init_setSublistText, _dec84, _dec85, _dec86, _init_setSublistValue, _dec87, _dec88, _init_setText, _dec89, _dec90, _init_setValue; function applyDecs2203RFactory() { function createAddInitializerMethod(e, t) { return function (r) { !function (e, t) { if (e.v) throw new Error("attempted to call " + t + " after decoration was finished"); }(t, "addInitializer"), assertCallable(r, "An initializer"), e.push(r); }; } function memberDec(e, t, r, n, a, i, s, o) { var c; switch (a) { case 1: c = "accessor"; break; case 2: c = "method"; break; case 3: c = "getter"; break; case 4: c = "setter"; break; default: c = "field"; } var l, u, f = { kind: c, name: s ? "#" + t : t, static: i, private: s }, p = { v: !1 }; 0 !== a && (f.addInitializer = createAddInitializerMethod(n, p)), 0 === a ? s ? (l = r.get, u = r.set) : (l = function () { return this[t]; }, u = function (e) { this[t] = e; }) : 2 === a ? l = function () { return r.value; } : (1 !== a && 3 !== a || (l = function () { return r.get.call(this); }), 1 !== a && 4 !== a || (u = function (e) { r.set.call(this, e); })), f.access = l && u ? { get: l, set: u } : l ? { get: l } : { set: u }; try { return e(o, f); } finally { p.v = !0; } } function assertCallable(e, t) { if ("function" != typeof e) throw new TypeError(t + " must be a function"); } function assertValidReturnValue(e, t) { var r = typeof t; if (1 === e) { if ("object" !== r || null === t) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0"); void 0 !== t.get && assertCallable(t.get, "accessor.get"), void 0 !== t.set && assertCallable(t.set, "accessor.set"), void 0 !== t.init && assertCallable(t.init, "accessor.init"); } else if ("function" !== r) { var n; throw n = 0 === e ? "field" : 10 === e ? "class" : "method", new TypeError(n + " decorators must return a function or void 0"); } } function applyMemberDec(e, t, r, n, a, i, s, o) { var c, l, u, f, p, d, h = r[0]; if (s ? c = 0 === a || 1 === a ? { get: r[3], set: r[4] } : 3 === a ? { get: r[3] } : 4 === a ? { set: r[3] } : { value: r[3] } : 0 !== a && (c = Object.getOwnPropertyDescriptor(t, n)), 1 === a ? u = { get: c.get, set: c.set } : 2 === a ? u = c.value : 3 === a ? u = c.get : 4 === a && (u = c.set), "function" == typeof h) void 0 !== (f = memberDec(h, n, c, o, a, i, s, u)) && (assertValidReturnValue(a, f), 0 === a ? l = f : 1 === a ? (l = f.init, p = f.get || u.get, d = f.set || u.set, u = { get: p, set: d }) : u = f);else for (var v = h.length - 1; v >= 0; v--) { var g; if (void 0 !== (f = memberDec(h[v], n, c, o, a, i, s, u))) assertValidReturnValue(a, f), 0 === a ? g = f : 1 === a ? (g = f.init, p = f.get || u.get, d = f.set || u.set, u = { get: p, set: d }) : u = f, void 0 !== g && (void 0 === l ? l = g : "function" == typeof l ? l = [l, g] : l.push(g)); } if (0 === a || 1 === a) { if (void 0 === l) l = function (e, t) { return t; };else if ("function" != typeof l) { var y = l; l = function (e, t) { for (var r = t, n = 0; n < y.length; n++) r = y[n].call(e, r); return r; }; } else { var m = l; l = function (e, t) { return m.call(e, t); }; } e.push(l); } 0 !== a && (1 === a ? (c.get = u.get, c.set = u.set) : 2 === a ? c.value = u : 3 === a ? c.get = u : 4 === a && (c.set = u), s ? 1 === a ? (e.push(function (e, t) { return u.get.call(e, t); }), e.push(function (e, t) { return u.set.call(e, t); })) : 2 === a ? e.push(u) : e.push(function (e, t) { return u.call(e, t); }) : Object.defineProperty(t, n, c)); } function applyMemberDecs(e, t) { for (var r, n, a = [], i = new Map(), s = new Map(), o = 0; o < t.length; o++) { var c = t[o]; if (Array.isArray(c)) { var l, u, f = c[1], p = c[2], d = c.length > 3, h = f >= 5; if (h ? (l = e, 0 !== (f -= 5) && (u = n = n || [])) : (l = e.prototype, 0 !== f && (u = r = r || [])), 0 !== f && !d) { var v = h ? s : i, g = v.get(p) || 0; if (!0 === g || 3 === g && 4 !== f || 4 === g && 3 !== f) throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + p); !g && f > 2 ? v.set(p, f) : v.set(p, !0); } applyMemberDec(a, l, c, p, f, h, d, u); } } return pushInitializers(a, r), pushInitializers(a, n), a; } function pushInitializers(e, t) { t && e.push(function (e) { for (var r = 0; r < t.length; r++) t[r].call(e); return e; }); } return function (e, t, r) { return { e: applyMemberDecs(e, t), get c() { return function (e, t) { if (t.length > 0) { for (var r = [], n = e, a = e.name, i = t.length - 1; i >= 0; i--) { var s = { v: !1 }; try { var o = t[i](n, { kind: "class", name: a, addInitializer: createAddInitializerMethod(r, s) }); } finally { s.v = !0; } void 0 !== o && (assertValidReturnValue(10, o), n = o); } return [n, function () { for (var e = 0; e < r.length; e++) r[e].call(n); }]; } }(e, r); } }; }; } function _applyDecs2203R(e, t, r) { return (_applyDecs2203R = applyDecs2203RFactory())(e, t, r); } const datefns = require("date-fns"); const structuredClone = require("core-js-pure/actual/structured-clone"); const { randomUUID } = require("node:crypto"); const SuiteScriptMocks = require("../../index.cjs"); const Field = require("./Field.cjs"); const Sublist = require("./Sublist.cjs"); const { options, required, addPromise, dynamicModeOnly, standardModeOnly, assignConstructor } = require("../../helpers.cjs"); let _Record; _dec = assignConstructor(); _dec2 = dynamicModeOnly(); _dec3 = options("sublistId"); _dec4 = required("sublistId"); _dec5 = dynamicModeOnly(); _dec6 = options("sublistId", "ignoreRecalc"); _dec7 = required("sublistId"); _dec8 = addPromise(); _dec9 = options("sublistId", "fieldId", "value"); _dec10 = required("sublistId", "fieldId", "value"); _dec11 = dynamicModeOnly(); _dec12 = dynamicModeOnly(); _dec13 = options("sublistId", "fieldId"); _dec14 = required("sublistId", "fieldId"); _dec15 = dynamicModeOnly(); _dec16 = options("sublistId"); _dec17 = required("sublistId"); _dec18 = dynamicModeOnly(); _dec19 = options("sublistId", "fieldId"); _dec20 = dynamicModeOnly(); _dec21 = options("sublistId", "fieldId"); _dec22 = required("sublistId", "fieldId"); _dec23 = dynamicModeOnly(); _dec24 = options("sublistId", "fieldId"); _dec25 = required("sublistId", "fieldId"); _dec26 = options("fieldId"); _dec27 = required("fieldId"); _dec28 = options("sublistId"); _dec29 = required("sublistId"); _dec30 = options("sublistId"); _dec31 = required("sublistId"); _dec32 = options("sublistId", "fieldId", "line"); _dec33 = required("sublistId", "fieldId", "line"); _dec34 = options("sublistId"); _dec35 = required("sublistId"); _dec36 = options("sublistId", "fieldId", "line"); _dec37 = required("sublistId", "fieldId", "line"); _dec38 = options("sublistId", "fieldId", "line"); _dec39 = required("sublistId", "fieldId", "line"); _dec40 = options("sublistId", "fieldId", "line"); _dec41 = required("sublistId", "fieldId", "line"); _dec42 = options("fieldId"); _dec43 = required("fieldId"); _dec44 = options("fieldId"); _dec45 = required("fieldId"); _dec46 = options("fieldId"); _dec47 = required("fieldId"); _dec48 = dynamicModeOnly(); _dec49 = options("sublistId", "fieldId"); _dec50 = required("sublistId", "fieldId"); _dec51 = options("sublistId", "fieldId", "line"); _dec52 = required("sublistId", "fieldId", "line"); _dec53 = options("fieldId"); _dec54 = required("fieldId"); _dec55 = options("sublistId", "line", "ignoreRecalc"); _dec56 = required("sublistId", "line"); _dec57 = dynamicModeOnly(); _dec58 = options("sublistId", "fieldId"); _dec59 = required("sublistId", "fieldId"); _dec60 = options("sublistId", "line", "ignoreRecalc", "lineInstanceId"); _dec61 = required("sublistId", "line"); _dec62 = standardModeOnly(); _dec63 = options("sublistId", "fieldId", "line"); _dec64 = required("sublistId", "fieldId", "line"); _dec65 = options("fieldId"); _dec66 = required("fieldId"); _dec67 = addPromise(); _dec68 = options("enableSourcing", "ignoreMandatoryFields"); _dec69 = dynamicModeOnly(); _dec70 = options("sublistId", "line"); _dec71 = required("sublistId", "line"); _dec72 = dynamicModeOnly(); _dec73 = options("sublistId"); _dec74 = required("sublistId"); _dec75 = dynamicModeOnly(); _dec76 = options("sublistId", "fieldId", "text"); _dec77 = required("sublistId", "fieldId", "text"); _dec78 = dynamicModeOnly(); _dec79 = options("sublistId", "fieldId", "value"); _dec80 = required("sublistId", "fieldId", "value"); _dec81 = standardModeOnly(); _dec82 = options("sublistId", "fieldId", "line", "text"); _dec83 = required("sublistId", "fieldId", "line", "text"); _dec84 = standardModeOnly(); _dec85 = options("sublistId", "fieldId", "line", "value"); _dec86 = required("sublistId", "fieldId", "line", "value"); _dec87 = options("fieldId", "text", "ignoreFieldChange"); _dec88 = required("fieldId", "text"); _dec89 = options("fieldId", "value", "ignoreFieldChange"); _dec90 = required("fieldId", "value"); class Record { static { ({ e: [_init_cancelLine, _init_commitLine, _init_executeMacro, _init_findSublistLineWithValue, _init_getCurrentMatrixSublistValue, _init_getCurrentSublistField, _init_getCurrentSublistIndex, _init_getCurrentSublistSubrecord, _init_getCurrentSublistText, _init_getCurrentSublistValue, _init_getField, _init_getLineCount, _init_getSublist, _init_getSublistField, _init_getSublistFields, _init_getSublistSubrecord, _init_getSublistText, _init_getSublistValue, _init_getSubrecord, _init_getText, _init_getValue, _init_hasCurrentSublistSubrecord, _init_hasSublistSubrecord, _init_hasSubrecord, _init_insertLine, _init_removeCurrentSublistSubrecord, _init_removeLine, _init_removeSublistSubrecord, _init_removeSubrecord, _init_save, _init_selectLine, _init_selectNewLine, _init_setCurrentSublistText, _init_setCurrentSublistValue, _init_setSublistText, _init_setSublistValue, _init_setText, _init_setValue], c: [_Record, _initClass] } = _applyDecs2203R(this, [[[_dec2, _dec3, _dec4], 0, "cancelLine"], [[_dec5, _dec6, _dec7], 0, "commitLine"], [_dec8, 0, "executeMacro"], [[_dec9, _dec10], 0, "findSublistLineWithValue"], [_dec11, 0, "getCurrentMatrixSublistValue"], [[_dec12, _dec13, _dec14], 0, "getCurrentSublistField"], [[_dec15, _dec16, _dec17], 0, "getCurrentSublistIndex"], [[_dec18, _dec19], 0, "getCurrentSublistSubrecord"], [[_dec20, _dec21, _dec22], 0, "getCurrentSublistText"], [[_dec23, _dec24, _dec25], 0, "getCurrentSublistValue"], [[_dec26, _dec27], 0, "getField"], [[_dec28, _dec29], 0, "getLineCount"], [[_dec30, _dec31], 0, "getSublist"], [[_dec32, _dec33], 0, "getSublistField"], [[_dec34, _dec35], 0, "getSublistFields"], [[_dec36, _dec37], 0, "getSublistSubrecord"], [[_dec38, _dec39], 0, "getSublistText"], [[_dec40, _dec41], 0, "getSublistValue"], [[_dec42, _dec43], 0, "getSubrecord"], [[_dec44, _dec45], 0, "getText"], [[_dec46, _dec47], 0, "getValue"], [[_dec48, _dec49, _dec50], 0, "hasCurrentSublistSubrecord"], [[_dec51, _dec52], 0, "hasSublistSubrecord"], [[_dec53, _dec54], 0, "hasSubrecord"], [[_dec55, _dec56], 0, "insertLine"], [[_dec57, _dec58, _dec59], 0, "removeCurrentSublistSubrecord"], [[_dec60, _dec61], 0, "removeLine"], [[_dec62, _dec63, _dec64], 0, "removeSublistSubrecord"], [[_dec65, _dec66], 0, "removeSubrecord"], [[_dec67, _dec68], 0, "save"], [[_dec69, _dec70, _dec71], 0, "selectLine"], [[_dec72, _dec73, _dec74], 0, "selectNewLine"], [[_dec75, _dec76, _dec77], 0, "setCurrentSublistText"], [[_dec78, _dec79, _dec80], 0, "setCurrentSublistValue"], [[_dec81, _dec82, _dec83], 0, "setSublistText"], [[_dec84, _dec85, _dec86], 0, "setSublistValue"], [[_dec87, _dec88], 0, "setText"], [[_dec89, _dec90], 0, "setValue"]], [_dec])); } id = null; type = null; fields = {}; sublists = {}; subrecords = {}; isDynamic = false; version = 1; initialize = () => { this.fields = structuredClone(this.fields); this.sublists = Object.entries(this.sublists || {}).reduce((acc, [lineId, lines]) => { acc[lineId] = { currentline: {}, lines: [...(("lines" in lines ? lines.lines : lines) || [])] }; acc[lineId].lines = acc[lineId].lines.map(line => { line = { ...line }; line._id = line._id || randomUUID(); Object.entries(line).forEach(([key, value]) => { if (value instanceof _Record) { line[key] = new _Record(value); } else { line[key] = structuredClone(value); } }); return line; }); return acc; }, {}); this.subrecords = Object.entries(this.subrecords || {}).reduce((acc, [subrecordId, subrecord]) => { acc[subrecordId] = new _Record(subrecord); return acc; }, {}); }; #getSublist(options) { const sublist = this.sublists[options.sublistId]; if (!sublist) { throw new Error("Sublist does not exist"); } return sublist; } #getLine(options) { const sublist = this.#getSublist(options); const line = sublist.lines[options.line]; if (!line) { throw new Error("Line does not exist"); } return line; } cancelLine = _init_cancelLine(this, options => { this.selectNewLine(options.sublistId); return this; }); commitLine = _init_commitLine(this, options => { const sublist = this.#getSublist(options); if (!sublist.currentline._id) { sublist.currentline._id = randomUUID(); } sublist.lines[this.getCurrentSublistIndex(options.sublistId)] = sublist.currentline; this.selectNewLine(options.sublistId); return this; }); executeMacro = _init_executeMacro(this, options => {}); findMatrixSublistLineWithValue = options => {}; findSublistLineWithValue = _init_findSublistLineWithValue(this, options => { for (let i = 0; i < this.getLineCount(options.sublistId); i++) { if (this.getSublistValue(options.sublistId, options.fieldId, i) == options.value) { return i; } } return -1; }); getCurrentMatrixSublistValue = _init_getCurrentMatrixSublistValue(this, options => {}); getCurrentSublistField = _init_getCurrentSublistField(this, options => { const sublist = this.#getSublist(options); if (options.fieldId in sublist.currentline) { return new Field({ id: options.fieldId, label: options.fieldId, sublistId: options.sublistId }); } return null; }); getCurrentSublistIndex = _init_getCurrentSublistIndex(this, options => { const sublist = this?.sublists?.[options.sublistId]; if (sublist) { const existingIndex = sublist?.lines.findIndex(a => a._id === sublist.currentline._id); return existingIndex > -1 ? existingIndex : sublist?.lines.length; } return -1; }); getCurrentSublistSubrecord = _init_getCurrentSublistSubrecord(this, options => { const sublist = this.#getSublist(options); if (!(options.fieldId in sublist.currentline) || !(sublist.currentline[options.fieldId] instanceof _Record)) { throw new Error(`Field ${options.fieldId} is not a subrecord field`); } return sublist.currentline[options.fieldId]; }); getCurrentSublistText = _init_getCurrentSublistText(this, options => { const sublist = this.#getSublist(options); const field = sublist.currentline[options.fieldId]; return parseText(field, this.isDynamic, "getCurrentSublistText"); }); getCurrentSublistValue = _init_getCurrentSublistValue(this, options => { const sublist = this.sublists[options.sublistId]; // this is correct, suitescript doesn't error when supplying a sublistId that doesn't exist if (sublist === undefined) { return null; } const field = sublist.currentline[options.fieldId]; return parseValue(field); }); getField = _init_getField(this, options => { if (options.fieldId in this.fields) { return new Field({ id: options.fieldId, label: options.fieldId }); } return null; }); getFields = () => { return Object.keys(this.fields); }; getLineCount = _init_getLineCount(this, options => { const sublist = this.sublists[options.sublistId]; if (sublist === undefined) { return -1; } return sublist.lines.length; }); getMacro = options => {}; getMacros = options => {}; getMatrixHeaderCount = options => {}; getMatrixHeaderField = options => {}; getMatrixHeaderValue = options => {}; getMatrixSublistField = options => {}; getMatrixSublistValue = options => {}; getSublist = _init_getSublist(this, options => { if (options.sublistId in this.sublists) { return new Sublist({ id: options.sublistId }); } return null; }); getSublists = () => { return Object.keys(this.sublists); }; getSublistField = _init_getSublistField(this, options => { const line = this.#getLine(options); if (options.fieldId in line) { return new Field({ id: options.fieldId, label: options.fieldId, sublistId: options.sublistId }); } return null; }); getSublistFields = _init_getSublistFields(this, options => { const sublist = this.#getSublist(options); return Object.keys(sublist.lines[0] || {}).filter(id => id !== "_id"); }); getSublistSubrecord = _init_getSublistSubrecord(this, options => { const line = this.#getLine(options); if (!(options.fieldId in line) || !(line[options.fieldId] instanceof _Record)) { throw new Error(`Field ${options.fieldId} is not a subrecord field`); } return line[options.fieldId]; }); getSublistText = _init_getSublistText(this, options => { const line = this.#getLine(options); const field = line[options.fieldId]; return parseText(field, this.isDynamic, "getSublistText"); }); getSublistValue = _init_getSublistValue(this, options => { const line = this.#getLine(options); const field = line[options.fieldId]; return parseValue(field); }); getSubrecord = _init_getSubrecord(this, options => { if (!(options.fieldId in this.subrecords)) { throw new Error(`Field ${options.fieldId} is not a subrecord field`); } return this.subrecords[options.fieldId]; }); getText = _init_getText(this, options => { const field = this.fields[options.fieldId]; return parseText(field, this.isDynamic, "getText"); }); getValue = _init_getValue(this, options => { const field = this.fields[options.fieldId]; return parseValue(field); }); hasCurrentSublistSubrecord = _init_hasCurrentSublistSubrecord(this, options => { return Boolean(this.getCurrentSublistSubrecord(options)); }); hasSublistSubrecord = _init_hasSublistSubrecord(this, options => { return Boolean(this.getSublistSubrecord(options)); }); hasSubrecord = _init_hasSubrecord(this, options => { return Boolean(this.getSubrecord(options)); }); insertLine = _init_insertLine(this, options => { const sublist = this.sublists[options.sublistId]; if (!sublist) { throw new Error("Sublist does not exist"); } if (options.line < 0 || options.line > sublist.lines.length) { throw new Error("Line is outside valid range"); } sublist.lines.splice(options.line, 0, {}); if (this.isDynamic) { this.selectLine(options); } return this; }); // @options("sublistId", "from", "to") // @required("sublistId", "from", "to") // moveLine = (options) => { // const sublist = this.#getSublist(options); // if (options.from < 0 || options.from > sublist.lines.length - 1) { // throw new Error("From is outside valid range"); // } // if (options.to < 0 || options.to > sublist.lines.length) { // throw new Error("To is outside valid range"); // } // // if (options.to > options.from) { // // options.to--; // // } // const line = sublist.lines.splice(options.from, 1); // sublist.lines.splice(options.to, 0, line); // return this; // }; removeCurrentSublistSubrecord = _init_removeCurrentSublistSubrecord(this, options => { const sublist = this.#getSublist(options); if (!(options.fieldId in sublist.currentline) || !(sublist.currentline[options.fieldId] instanceof _Record)) { throw new Error(`Field ${options.fieldId} is not a subrecord field`); } sublist.currentline[options.fieldId] = null; return this; }); removeLine = _init_removeLine(this, options => { const sublist = this.#getSublist(options); this.#getLine(options); sublist.lines.splice(options.line, 1); if (this.isDynamic) { if (sublist.lines.length > 0) { this.selectLine(options.sublistId, 0); } else { this.selectNewLine(options.sublistId); } } return this; }); removeSublistSubrecord = _init_removeSublistSubrecord(this, options => { const line = this.#getLine(options); if (!(options.fieldId in line) || !(line[options.fieldId] instanceof _Record)) { throw new Error(`Field ${options.fieldId} is not a subrecord field`); } line[options.fieldId] = null; return this; }); removeSubrecord = _init_removeSubrecord(this, options => { if (!(options.fieldId in this.subrecords)) { throw new Error(`Field ${options.fieldId} is not a subrecord field`); } this.subrecords[options.fieldId] = null; return this; }); save = _init_save(this, options => { if (this.id && SuiteScriptMocks.records.get(this).version !== this.version) { throw new Error("Record has changed"); } this.version++; const copy = new _Record(this); // change fields that only have value to not be an object so getText works Object.entries(copy.fields).forEach(([key, value]) => { if (typeof value === "object" && value !== null && !(value instanceof Date) && !("text" in value)) { copy.fields[key] = value.value; } }); Object.values(copy.sublists).forEach(sublist => { sublist.lines.forEach(line => { Object.entries(line).forEach(([key, value]) => { if (typeof value === "object" && value !== null && !(value instanceof Date) && !("text" in value)) { line[key] = value.value; } }); }); }); if (!this.id) { this.id = copy.id = Math.max(...Array.from(SuiteScriptMocks.records.values()).map(a => a.id)) + 1; SuiteScriptMocks.createdRecords.push(copy); } SuiteScriptMocks.records.set(copy); SuiteScriptMocks.savedRecords.push(copy); return this.id; }); selectLine = _init_selectLine(this, options => { const sublist = this.#getSublist(options); if (options.line != this.getCurrentSublistIndex(options.sublistId)) { const line = this.#getLine(options); sublist.currentline = { ...line }; sublist.lines = sublist.lines.filter(a => a._id); } return this; }); selectNewLine = _init_selectNewLine(this, options => { const sublist = this.#getSublist(options); sublist.currentline = {}; sublist.lines = sublist.lines.filter(a => a._id); return this; }); setCurrentMatrixSublistValue = options => {}; setCurrentSublistText = _init_setCurrentSublistText(this, options => { const sublist = this.#getSublist(options); sublist.currentline[options.fieldId] = { value: options.text, text: options.text }; return this; }); setCurrentSublistValue = _init_setCurrentSublistValue(this, options => { const sublist = this.#getSublist(options); sublist.currentline[options.fieldId] = { value: options.value }; return this; }); setMatrixHeaderValue = options => {}; setMatrixSublistValue = options => {}; setSublistText = _init_setSublistText(this, options => { const line = this.#getLine(options); line[options.fieldId] = { value: options.text, text: options.text }; return this; }); setSublistValue = _init_setSublistValue(this, options => { const line = this.#getLine(options); line[options.fieldId] = { value: options.value }; return this; }); setText = _init_setText(this, options => { this.fields[options.fieldId] = { value: options.text, text: options.text }; return this; }); setValue = _init_setValue(this, options => { this.fields[options.fieldId] = { value: options.value }; return this; }); static { _initClass(); } } function parseValue(field) { if (Array.isArray(field)) { return field; } else if (typeof field === "object" && field !== null && Object.prototype.toString.call(field) !== "[object Date]") { return field.value; } return field; } function parseText(field, isDynamic, funcName) { if (Object.prototype.toString.call(field) === "[object Date]") { return datefns.format(field, SuiteScriptMocks.dateFormat); } else if (Array.isArray(field)) { return String(field); } else if (typeof field === "object" && field !== null) { if (!isDynamic && !("text" in field)) { throw new Error(`Cannot use ${funcName} on field that has had value but not text set in standard mode`); } return field.text || field.value; } return field; } module.exports = _Record; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkYXRlZm5zIiwicmVxdWlyZSIsInN0cnVjdHVyZWRDbG9uZSIsInJhbmRvbVVVSUQiLCJTdWl0ZVNjcmlwdE1vY2tzIiwiRmllbGQiLCJTdWJsaXN0Iiwib3B0aW9ucyIsInJlcXVpcmVkIiwiYWRkUHJvbWlzZSIsImR5bmFtaWNNb2RlT25seSIsInN0YW5kYXJkTW9kZU9ubHkiLCJhc3NpZ25Db25zdHJ1Y3RvciIsIl9SZWNvcmQiLCJfZGVjIiwiX2RlYzIiLCJfZGVjMyIsIl9kZWM0IiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsIl9kZWMxMSIsIl9kZWMxMiIsIl9kZWMxMyIsIl9kZWMxNCIsIl9kZWMxNSIsIl9kZWMxNiIsIl9kZWMxNyIsIl9kZWMxOCIsIl9kZWMxOSIsIl9kZWMyMCIsIl9kZWMyMSIsIl9kZWMyMiIsIl9kZWMyMyIsIl9kZWMyNCIsIl9kZWMyNSIsIl9kZWMyNiIsIl9kZWMyNyIsIl9kZWMyOCIsIl9kZWMyOSIsIl9kZWMzMCIsIl9kZWMzMSIsIl9kZWMzMiIsIl9kZWMzMyIsIl9kZWMzNCIsIl9kZWMzNSIsIl9kZWMzNiIsIl9kZWMzNyIsIl9kZWMzOCIsIl9kZWMzOSIsIl9kZWM0MCIsIl9kZWM0MSIsIl9kZWM0MiIsIl9kZWM0MyIsIl9kZWM0NCIsIl9kZWM0NSIsIl9kZWM0NiIsIl9kZWM0NyIsIl9kZWM0OCIsIl9kZWM0OSIsIl9kZWM1MCIsIl9kZWM1MSIsIl9kZWM1MiIsIl9kZWM1MyIsIl9kZWM1NCIsIl9kZWM1NSIsIl9kZWM1NiIsIl9kZWM1NyIsIl9kZWM1OCIsIl9kZWM1OSIsIl9kZWM2MCIsIl9kZWM2MSIsIl9kZWM2MiIsIl9kZWM2MyIsIl9kZWM2NCIsIl9kZWM2NSIsIl9kZWM2NiIsIl9kZWM2NyIsIl9kZWM2OCIsIl9kZWM2OSIsIl9kZWM3MCIsIl9kZWM3MSIsIl9kZWM3MiIsIl9kZWM3MyIsIl9kZWM3NCIsIl9kZWM3NSIsIl9kZWM3NiIsIl9kZWM3NyIsIl9kZWM3OCIsIl9kZWM3OSIsIl9kZWM4MCIsIl9kZWM4MSIsIl9kZWM4MiIsIl9kZWM4MyIsIl9kZWM4NCIsIl9kZWM4NSIsIl9kZWM4NiIsIl9kZWM4NyIsIl9kZWM4OCIsIl9kZWM4OSIsIl9kZWM5MCIsIlJlY29yZCIsImUiLCJfaW5pdF9jYW5jZWxMaW5lIiwiX2luaXRfY29tbWl0TGluZSIsIl9pbml0X2V4ZWN1dGVNYWNybyIsIl9pbml0X2ZpbmRTdWJsaXN0TGluZVdpdGhWYWx1ZSIsIl9pbml0X2dldEN1cnJlbnRNYXRyaXhTdWJsaXN0VmFsdWUiLCJfaW5pdF9nZXRDdXJyZW50U3VibGlzdEZpZWxkIiwiX2luaXRfZ2V0Q3VycmVudFN1Ymxpc3RJbmRleCIsIl9pbml0X2dldEN1cnJlbnRTdWJsaXN0U3VicmVjb3JkIiwiX2luaXRfZ2V0Q3VycmVudFN1Ymxpc3RUZXh0IiwiX2luaXRfZ2V0Q3VycmVudFN1Ymxpc3RWYWx1ZSIsIl9pbml0X2dldEZpZWxkIiwiX2luaXRfZ2V0TGluZUNvdW50IiwiX2luaXRfZ2V0U3VibGlzdCIsIl9pbml0X2dldFN1Ymxpc3RGaWVsZCIsIl9pbml0X2dldFN1Ymxpc3RGaWVsZHMiLCJfaW5pdF9nZXRTdWJsaXN0U3VicmVjb3JkIiwiX2luaXRfZ2V0U3VibGlzdFRleHQiLCJfaW5pdF9nZXRTdWJsaXN0VmFsdWUiLCJfaW5pdF9nZXRTdWJyZWNvcmQiLCJfaW5pdF9nZXRUZXh0IiwiX2luaXRfZ2V0VmFsdWUiLCJfaW5pdF9oYXNDdXJyZW50U3VibGlzdFN1YnJlY29yZCIsIl9pbml0X2hhc1N1Ymxpc3RTdWJyZWNvcmQiLCJfaW5pdF9oYXNTdWJyZWNvcmQiLCJfaW5pdF9pbnNlcnRMaW5lIiwiX2luaXRfcmVtb3ZlQ3VycmVudFN1Ymxpc3RTdWJyZWNvcmQiLCJfaW5pdF9yZW1vdmVMaW5lIiwiX2luaXRfcmVtb3ZlU3VibGlzdFN1YnJlY29yZCIsIl9pbml0X3JlbW92ZVN1YnJlY29yZCIsIl9pbml0X3NhdmUiLCJfaW5pdF9zZWxlY3RMaW5lIiwiX2luaXRfc2VsZWN0TmV3TGluZSIsIl9pbml0X3NldEN1cnJlbnRTdWJsaXN0VGV4dCIsIl9pbml0X3NldEN1cnJlbnRTdWJsaXN0VmFsdWUiLCJfaW5pdF9zZXRTdWJsaXN0VGV4dCIsIl9pbml0X3NldFN1Ymxpc3RWYWx1ZSIsIl9pbml0X3NldFRleHQiLCJfaW5pdF9zZXRWYWx1ZSIsImMiLCJfaW5pdENsYXNzIiwiX2FwcGx5RGVjczIyMDNSIiwiaWQiLCJ0eXBlIiwiZmllbGRzIiwic3VibGlzdHMiLCJzdWJyZWNvcmRzIiwiaXNEeW5hbWljIiwidmVyc2lvbiIsImluaXRpYWxpemUiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwibGluZUlkIiwibGluZXMiLCJjdXJyZW50bGluZSIsIm1hcCIsImxpbmUiLCJfaWQiLCJmb3JFYWNoIiwia2V5IiwidmFsdWUiLCJzdWJyZWNvcmRJZCIsInN1YnJlY29yZCIsImdldFN1Ymxpc3QiLCIjZ2V0U3VibGlzdCIsInN1Ymxpc3QiLCJzdWJsaXN0SWQiLCJFcnJvciIsImdldExpbmUiLCIjZ2V0TGluZSIsImNhbmNlbExpbmUiLCJzZWxlY3ROZXdMaW5lIiwiY29tbWl0TGluZSIsImdldEN1cnJlbnRTdWJsaXN0SW5kZXgiLCJleGVjdXRlTWFjcm8iLCJmaW5kTWF0cml4U3VibGlzdExpbmVXaXRoVmFsdWUiLCJmaW5kU3VibGlzdExpbmVXaXRoVmFsdWUiLCJpIiwiZ2V0TGluZUNvdW50IiwiZ2V0U3VibGlzdFZhbHVlIiwiZmllbGRJZCIsImdldEN1cnJlbnRNYXRyaXhTdWJsaXN0VmFsdWUiLCJnZXRDdXJyZW50U3VibGlzdEZpZWxkIiwibGFiZWwiLCJleGlzdGluZ0luZGV4IiwiZmluZEluZGV4IiwiYSIsImxlbmd0aCIsImdldEN1cnJlbnRTdWJsaXN0U3VicmVjb3JkIiwiZ2V0Q3VycmVudFN1Ymxpc3RUZXh0IiwiZmllbGQiLCJwYXJzZVRleHQiLCJnZXRDdXJyZW50U3VibGlzdFZhbHVlIiwidW5kZWZpbmVkIiwicGFyc2VWYWx1ZSIsImdldEZpZWxkIiwiZ2V0RmllbGRzIiwia2V5cyIsImdldE1hY3JvIiwiZ2V0TWFjcm9zIiwiZ2V0TWF0cml4SGVhZGVyQ291bnQiLCJnZXRNYXRyaXhIZWFkZXJGaWVsZCIsImdldE1hdHJpeEhlYWRlclZhbHVlIiwiZ2V0TWF0cml4U3VibGlzdEZpZWxkIiwiZ2V0TWF0cml4U3VibGlzdFZhbHVlIiwiZ2V0U3VibGlzdHMiLCJnZXRTdWJsaXN0RmllbGQiLCJnZXRTdWJsaXN0RmllbGRzIiwiZmlsdGVyIiwiZ2V0U3VibGlzdFN1YnJlY29yZCIsImdldFN1Ymxpc3RUZXh0IiwiZ2V0U3VicmVjb3JkIiwiZ2V0VGV4dCIsImdldFZhbHVlIiwiaGFzQ3VycmVudFN1Ymxpc3RTdWJyZWNvcmQiLCJCb29sZWFuIiwiaGFzU3VibGlzdFN1YnJlY29yZCIsImhhc1N1YnJlY29yZCIsImluc2VydExpbmUiLCJzcGxpY2UiLCJzZWxlY3RMaW5lIiwicmVtb3ZlQ3VycmVudFN1Ymxpc3RTdWJyZWNvcmQiLCJyZW1vdmVMaW5lIiwicmVtb3ZlU3VibGlzdFN1YnJlY29yZCIsInJlbW92ZVN1YnJlY29yZCIsInNhdmUiLCJyZWNvcmRzIiwiZ2V0IiwiY29weSIsIkRhdGUiLCJ2YWx1ZXMiLCJNYXRoIiwibWF4IiwiQXJyYXkiLCJmcm9tIiwiY3JlYXRlZFJlY29yZHMiLCJwdXNoIiwic2V0Iiwic2F2ZWRSZWNvcmRzIiwic2V0Q3VycmVudE1hdHJpeFN1Ymxpc3RWYWx1ZSIsInNldEN1cnJlbnRTdWJsaXN0VGV4dCIsInRleHQiLCJzZXRDdXJyZW50U3VibGlzdFZhbHVlIiwic2V0TWF0cml4SGVhZGVyVmFsdWUiLCJzZXRNYXRyaXhTdWJsaXN0VmFsdWUiLCJzZXRTdWJsaXN0VGV4dCIsInNldFN1Ymxpc3RWYWx1ZSIsInNldFRleHQiLCJzZXRWYWx1ZSIsImlzQXJyYXkiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJmdW5jTmFtZSIsImZvcm1hdCIsImRhdGVGb3JtYXQiLCJTdHJpbmciLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vY2tzL3JlY29yZC9SZWNvcmQuY2pzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGRhdGVmbnMgPSByZXF1aXJlKFwiZGF0ZS1mbnNcIik7XG5jb25zdCBzdHJ1Y3R1cmVkQ2xvbmUgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL2FjdHVhbC9zdHJ1Y3R1cmVkLWNsb25lXCIpO1xuY29uc3QgeyByYW5kb21VVUlEIH0gPSByZXF1aXJlKFwibm9kZTpjcnlwdG9cIik7XG5jb25zdCBTdWl0ZVNjcmlwdE1vY2tzID0gcmVxdWlyZShcIi4uLy4uL2luZGV4LmNqc1wiKTtcbmNvbnN0IEZpZWxkID0gcmVxdWlyZShcIi4vRmllbGQuY2pzXCIpO1xuY29uc3QgU3VibGlzdCA9IHJlcXVpcmUoXCIuL1N1Ymxpc3QuY2pzXCIpO1xuY29uc3Qge1xuXHRvcHRpb25zLFxuXHRyZXF1aXJlZCxcblx0YWRkUHJvbWlzZSxcblx0ZHluYW1pY01vZGVPbmx5LFxuXHRzdGFuZGFyZE1vZGVPbmx5LFxuXHRhc3NpZ25Db25zdHJ1Y3Rvcixcbn0gPSByZXF1aXJlKFwiLi4vLi4vaGVscGVycy5janNcIik7XG5cbkBhc3NpZ25Db25zdHJ1Y3RvcigpXG5jbGFzcyBSZWNvcmQge1xuXHRpZCA9IG51bGw7XG5cdHR5cGUgPSBudWxsO1xuXHRmaWVsZHMgPSB7fTtcblx0c3VibGlzdHMgPSB7fTtcblx0c3VicmVjb3JkcyA9IHt9O1xuXHRpc0R5bmFtaWMgPSBmYWxzZTtcblx0dmVyc2lvbiA9IDE7XG5cblx0aW5pdGlhbGl6ZSA9ICgpID0+IHtcblx0XHR0aGlzLmZpZWxkcyA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLmZpZWxkcyk7XG5cdFx0dGhpcy5zdWJsaXN0cyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuc3VibGlzdHMgfHwge30pLnJlZHVjZSgoYWNjLCBbbGluZUlkLCBsaW5lc10pID0+IHtcblx0XHRcdGFjY1tsaW5lSWRdID0ge1xuXHRcdFx0XHRjdXJyZW50bGluZToge30sXG5cdFx0XHRcdGxpbmVzOiBbLi4uKChcImxpbmVzXCIgaW4gbGluZXMgPyBsaW5lcy5saW5lcyA6IGxpbmVzKSB8fCBbXSldLFxuXHRcdFx0fTtcblx0XHRcdGFjY1tsaW5lSWRdLmxpbmVzID0gYWNjW2xpbmVJZF0ubGluZXMubWFwKChsaW5lKSA9PiB7XG5cdFx0XHRcdGxpbmUgPSB7IC4uLmxpbmUgfTtcblx0XHRcdFx0bGluZS5faWQgPSBsaW5lLl9pZCB8fCByYW5kb21VVUlEKCk7XG5cdFx0XHRcdE9iamVjdC5lbnRyaWVzKGxpbmUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuXHRcdFx0XHRcdGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlY29yZCkge1xuXHRcdFx0XHRcdFx0bGluZVtrZXldID0gbmV3IFJlY29yZCh2YWx1ZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGxpbmVba2V5XSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGxpbmU7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBhY2M7XG5cdFx0fSwge30pO1xuXHRcdHRoaXMuc3VicmVjb3JkcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuc3VicmVjb3JkcyB8fCB7fSkucmVkdWNlKChhY2MsIFtzdWJyZWNvcmRJZCwgc3VicmVjb3JkXSkgPT4ge1xuXHRcdFx0YWNjW3N1YnJlY29yZElkXSA9IG5ldyBSZWNvcmQoc3VicmVjb3JkKTtcblx0XHRcdHJldHVybiBhY2M7XG5cdFx0fSwge30pO1xuXHR9O1xuXG5cdCNnZXRTdWJsaXN0KG9wdGlvbnMpIHtcblx0XHRjb25zdCBzdWJsaXN0ID0gdGhpcy5zdWJsaXN0c1tvcHRpb25zLnN1Ymxpc3RJZF07XG5cdFx0aWYgKCFzdWJsaXN0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTdWJsaXN0IGRvZXMgbm90IGV4aXN0XCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gc3VibGlzdDtcblx0fVxuXG5cdCNnZXRMaW5lKG9wdGlvbnMpIHtcblx0XHRjb25zdCBzdWJsaXN0ID0gdGhpcy4jZ2V0U3VibGlzdChvcHRpb25zKTtcblx0XHRjb25zdCBsaW5lID0gc3VibGlzdC5saW5lc1tvcHRpb25zLmxpbmVdO1xuXHRcdGlmICghbGluZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTGluZSBkb2VzIG5vdCBleGlzdFwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIGxpbmU7XG5cdH1cblxuXHRAZHluYW1pY01vZGVPbmx5KClcblx0QG9wdGlvbnMoXCJzdWJsaXN0SWRcIilcblx0QHJlcXVpcmVkKFwic3VibGlzdElkXCIpXG5cdGNhbmNlbExpbmUgPSAob3B0aW9ucykgPT4ge1xuXHRcdHRoaXMuc2VsZWN0TmV3TGluZShvcHRpb25zLnN1Ymxpc3RJZCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0QGR5bmFtaWNNb2RlT25seSgpXG5cdEBvcHRpb25zKFwic3VibGlzdElkXCIsIFwiaWdub3JlUmVjYWxjXCIpXG5cdEByZXF1aXJlZChcInN1Ymxpc3RJZFwiKVxuXHRjb21taXRMaW5lID0gKG9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBzdWJsaXN0ID0gdGhpcy4jZ2V0U3VibGlzdChvcHRpb25zKTtcblx0XHRpZiAoIXN1Ymxpc3QuY3VycmVudGxpbmUuX2lkKSB7XG5cdFx0XHRzdWJsaXN0LmN1cnJlbnRsaW5lLl9pZCA9IHJhbmRvbVVVSUQoKTtcblx0XHR9XG5cdFx0c3VibGlzdC5saW5lc1t0aGlzLmdldEN1cnJlbnRTdWJsaXN0SW5kZXgob3B0aW9ucy5zdWJsaXN0SWQpXSA9IHN1Ymxpc3QuY3VycmVudGxpbmU7XG5cdFx0dGhpcy5zZWxlY3ROZXdMaW5lKG9wdGlvbnMuc3VibGlzdElkKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRAYWRkUHJvbWlzZSgpXG5cdGV4ZWN1dGVNYWNybyA9IChvcHRpb25zKSA9PiB7fTtcblxuXHRmaW5kTWF0cml4U3VibGlzdExpbmVXaXRoVmFsdWUgPSAob3B0aW9ucykgPT4ge307XG5cblx0QG9wdGlvbnMoXCJzdWJsaXN0SWRcIiwgXCJmaWVsZElkXCIsIFwidmFsdWVcIilcblx0QHJlcXVpcmVkKFwic3VibGlzdElkXCIsIFwiZmllbGRJZFwiLCBcInZhbHVlXCIpXG5cdGZpbmRTdWJsaXN0TGluZVdpdGhWYWx1ZSA9IChvcHRpb25zKSA9PiB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmdldExpbmVDb3VudChvcHRpb25zLnN1Ymxpc3RJZCk7IGkrKykge1xuXHRcdFx0aWYgKHRoaXMuZ2V0U3VibGlzdFZhbHVlKG9wdGlvbnMuc3VibGlzdElkLCBvcHRpb25zLmZpZWxkSWQsIGkpID09IG9wdGlvbnMudmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fTtcblxuXHRAZHluYW1pY01vZGVPbmx5KClcblx0Z2V0Q3VycmVudE1hdHJpeFN1Ymxpc3RWYWx1ZSA9IChvcHRpb25zKSA9PiB7fTtcblxuXHRAZHluYW1pY01vZGVPbmx5KClcblx0QG9wdGlvbnMoXCJzdWJsaXN0SWRcIiwgXCJmaWVsZElkXCIpXG5cdEByZXF1aXJlZChcInN1Ymxpc3RJZFwiLCBcImZpZWxkSWRcIilcblx0Z2V0Q3VycmVudFN1Ymxpc3RGaWVsZCA9IChvcHRpb25zKSA9PiB7XG5cdFx0Y29uc3Qgc3VibGlzdCA9IHRoaXMuI2dldFN1Ymxpc3Qob3B0aW9ucyk7XG5cdFx0aWYgKG9wdGlvbnMuZmllbGRJZCBpbiBzdWJsaXN0LmN1cnJlbnRsaW5lKSB7XG5cdFx0XHRyZXR1cm4gbmV3IEZpZWxkKHsgaWQ6IG9wdGlvbnMuZmllbGRJZCwgbGFiZWw6IG9wdGlvbnMuZmllbGRJZCwgc3VibGlzdElkOiBvcHRpb25zLnN1Ymxpc3RJZCB9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG51bGw7XG5cdH07XG5cblx0QGR5bmFtaWNNb2RlT25seSgpXG5cdEBvcHRpb25zKFwic3VibGlzdElkXCIpXG5cdEByZXF1aXJlZChcInN1Ymxpc3RJZFwiKVxuXHRnZXRDdXJyZW50U3VibGlzdEluZGV4ID0gKG9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBzdWJsaXN0ID0gdGhpcz8uc3VibGlzdHM/LltvcHRpb25zLnN1Ymxpc3RJZF07XG5cdFx0aWYgKHN1Ymxpc3QpIHtcblx0XHRcdGNvbnN0IGV4aXN0aW5nSW5kZXggPSBzdWJsaXN0Py5saW5lcy5maW5kSW5kZXgoKGEpID0+IGEuX2lkID09PSBzdWJsaXN0LmN1cnJlbnRsaW5lLl9pZCk7XG5cdFx0XHRyZXR1cm4gZXhpc3RpbmdJbmRleCA+IC0xID8gZXhpc3RpbmdJbmRleCA6IHN1Ymxpc3Q/LmxpbmVzLmxlbmd0aDtcblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9O1xuXG5cdEBkeW5hbWljTW9kZU9ubHkoKVxuXHRAb3B0aW9ucyhcInN1Ymxpc3RJZFwiLCBcImZpZWxkSWRcIilcblx0Z2V0Q3VycmVudFN1Ymxpc3RTdWJyZWNvcmQgPSAob3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IHN1Ymxpc3QgPSB0aGlzLiNnZXRTdWJsaXN0KG9wdGlvbnMpO1xuXHRcdGlmICghKG9wdGlvbnMuZmllbGRJZCBpbiBzdWJsaXN0LmN1cnJlbnRsaW5lKSB8fCAhKHN1Ymxpc3QuY3VycmVudGxpbmVbb3B0aW9ucy5maWVsZElkXSBpbnN0YW5jZW9mIFJlY29yZCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRmllbGQgJHtvcHRpb25zLmZpZWxkSWR9IGlzIG5vdCBhIHN1YnJlY29yZCBmaWVsZGApO1xuXHRcdH1cblx0XHRyZXR1cm4gc3VibGlzdC5jdXJyZW50bGluZVtvcHRpb25zLmZpZWxkSWRdO1xuXHR9O1xuXG5cdEBkeW5hbWljTW9kZU9ubHkoKVxuXHRAb3B0aW9ucyhcInN1Ymxpc3RJZFwiLCBcImZpZWxkSWRcIilcblx0QHJlcXVpcmVkKFwic3VibGlzdElkXCIsIFwiZmllbGRJZFwiKVxuXHRnZXRDdXJyZW50U3VibGlzdFRleHQgPSAob3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IHN1Ymxpc3QgPSB0aGlzLiNnZXRTdWJsaXN0KG9wdGlvbnMpO1xuXHRcdGNvbnN0IGZpZWxkID0gc3VibGlzdC5jdXJyZW50bGluZVtvcHRpb25zLmZpZWxkSWRdO1xuXHRcdHJldHVybiBwYXJzZVRleHQoZmllbGQsIHRoaXMuaXNEeW5hbWljLCBcImdldEN1cnJlbnRTdWJsaXN0VGV4dFwiKTtcblx0fTtcblxuXHRAZHluYW1pY01vZGVPbmx5KClcblx0QG9wdGlvbnMoXCJzdWJsaXN0SWRcIiwgXCJmaWVsZElkXCIpXG5cdEByZXF1aXJlZChcInN1Ymxpc3RJZFwiLCBcImZpZWxkSWRcIilcblx0Z2V0Q3VycmVudFN1Ymxpc3RWYWx1ZSA9IChvcHRpb25zKSA9PiB7XG5cdFx0Y29uc3Qgc3VibGlzdCA9IHRoaXMuc3VibGlzdHNbb3B0aW9ucy5zdWJsaXN0SWRdO1xuXHRcdC8vIHRoaXMgaXMgY29ycmVjdCwgc3VpdGVzY3JpcHQgZG9lc24ndCBlcnJvciB3aGVuIHN1cHBseWluZyBhIHN1Ymxpc3RJZCB0aGF0IGRvZXNuJ3QgZXhpc3Rcblx0XHRpZiAoc3VibGlzdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgZmllbGQgPSBzdWJsaXN0LmN1cnJlbnRsaW5lW29wdGlvbnMuZmllbGRJZF07XG5cdFx0cmV0dXJuIHBhcnNlVmFsdWUoZmllbGQpO1xuXHR9O1xuXG5cdEBvcHRpb25zKFwiZmllbGRJZFwiKVxuXHRAcmVxdWlyZWQoXCJmaWVsZElkXCIpXG5cdGdldEZpZWxkID0gKG9wdGlvbnMpID0+IHtcblx0XHRpZiAob3B0aW9ucy5maWVsZElkIGluIHRoaXMuZmllbGRzKSB7XG5cdFx0XHRyZXR1cm4gbmV3IEZpZWxkKHsgaWQ6IG9wdGlvbnMuZmllbGRJZCwgbGFiZWw6IG9wdGlvbnMuZmllbGRJZCB9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG51bGw7XG5cdH07XG5cblx0Z2V0RmllbGRzID0gKCkgPT4ge1xuXHRcdHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpZWxkcyk7XG5cdH07XG5cblx0QG9wdGlvbnMoXCJzdWJsaXN0SWRcIilcblx0QHJlcXVpcmVkKFwic3VibGlzdElkXCIpXG5cdGdldExpbmVDb3VudCA9IChvcHRpb25zKSA9PiB7XG5cdFx0Y29uc3Qgc3VibGlzdCA9IHRoaXMuc3VibGlzdHNbb3B0aW9ucy5zdWJsaXN0SWRdO1xuXHRcdGlmIChzdWJsaXN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiAtMTtcblx0XHR9XG5cdFx0cmV0dXJuIHN1Ymxpc3QubGluZXMubGVuZ3RoO1xuXHR9O1xuXG5cdGdldE1hY3JvID0gKG9wdGlvbnMpID0+IHt9O1xuXG5cdGdldE1hY3JvcyA9IChvcHRpb25zKSA9PiB7fTtcblxuXHRnZXRNYXRyaXhIZWFkZXJDb3VudCA9IChvcHRpb25zKSA9PiB7fTtcblxuXHRnZXRNYXRyaXhIZWFkZXJGaWVsZCA9IChvcHRpb25zKSA9PiB7fTtcblxuXHRnZXRNYXRyaXhIZWFkZXJWYWx1ZSA9IChvcHRpb25zKSA9PiB7fTtcblxuXHRnZXRNYXRyaXhTdWJsaXN0RmllbGQgPSAob3B0aW9ucykgPT4ge307XG5cblx0Z2V0TWF0cml4U3VibGlzdFZhbHVlID0gKG9wdGlvbnMpID0+IHt9O1xuXG5cdEBvcHRpb25zKFwic3VibGlzdElkXCIpXG5cdEByZXF1aXJlZChcInN1Ymxpc3RJZFwiKVxuXHRnZXRTdWJsaXN0ID0gKG9wdGlvbnMpID0+IHtcblx0XHRpZiAob3B0aW9ucy5zdWJsaXN0SWQgaW4gdGhpcy5zdWJsaXN0cykge1xuXHRcdFx0cmV0dXJuIG5ldyBTdWJsaXN0KHsgaWQ6IG9wdGlvbnMuc3VibGlzdElkIH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fTtcblxuXHRnZXRTdWJsaXN0cyA9ICgpID0+IHtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXModGhpcy5zdWJsaXN0cyk7XG5cdH07XG5cblx0QG9wdGlvbnMoXCJzdWJsaXN0SWRcIiwgXCJmaWVsZElkXCIsIFwibGluZVwiKVxuXHRAcmVxdWlyZWQoXCJzdWJsaXN0SWRcIiwgXCJmaWVsZElkXCIsIFwibGluZVwiKVxuXHRnZXRTdWJsaXN0RmllbGQgPSAob3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IGxpbmUgPSB0aGlzLiNnZXRMaW5lKG9wdGlvbnMpO1xuXHRcdGlmIChvcHRpb25zLmZpZWxkSWQgaW4gbGluZSkge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWVsZCh7IGlkOiBvcHRpb25zLmZpZWxkSWQsIGxhYmVsOiBvcHRpb25zLmZpZWxkSWQsIHN1Ymxpc3RJZDogb3B0aW9ucy5zdWJsaXN0SWQgfSk7XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9O1xuXG5cdEBvcHRpb25zKFwic3VibGlzdElkXCIpXG5cdEByZXF1aXJlZChcInN1Ymxpc3RJZFwiKVxuXHRnZXRTdWJsaXN0RmllbGRzID0gKG9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBzdWJsaXN0ID0gdGhpcy4jZ2V0U3VibGlzdChvcHRpb25zKTtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMoc3VibGlzdC5saW5lc1swXSB8fCB7fSkuZmlsdGVyKChpZCkgPT4gaWQgIT09IFwiX2lkXCIpO1xuXHR9O1xuXG5cdEBvcHRpb25zKFwic3VibGlzdElkXCIsIFwiZmllbGRJZFwiLCBcImxpbmVcIilcblx0QHJlcXVpcmVkKFwic3VibGlzdElkXCIsIFwiZmllbGRJZFwiLCBcImxpbmVcIilcblx0Z2V0U3VibGlzdFN1YnJlY29yZCA9IChvcHRpb25zKSA9PiB7XG5cdFx0Y29uc3QgbGluZSA9IHRoaXMuI2dldExpbmUob3B0aW9ucyk7XG5cdFx0aWYgKCEob3B0aW9ucy5maWVsZElkIGluIGxpbmUpIHx8ICEobGluZVtvcHRpb25zLmZpZWxkSWRdIGluc3RhbmNlb2YgUmVjb3JkKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGaWVsZCAke29wdGlvbnMuZmllbGRJZH0gaXMgbm90IGEgc3VicmVjb3JkIGZpZWxkYCk7XG5cdFx0fVxuXHRcdHJldHVybiBsaW5lW29wdGlvbnMuZmllbGRJZF07XG5cdH07XG5cblx0QG9wdGlvbnMoXCJzdWJsaXN0SWRcIiwgXCJmaWVsZElkXCIsIFwibGluZVwiKVxuXHRAcmVxdWlyZWQoXCJzdWJsaXN0SWRcIiwgXCJmaWVsZElkXCIsIFwibGluZVwiKVxuXHRnZXRTdWJsaXN0VGV4dCA9IChvcHRpb25zKSA9PiB7XG5cdFx0Y29uc3QgbGluZSA9IHRoaXMuI2dldExpbmUob3B0aW9ucyk7XG5cdFx0Y29uc3QgZmllbGQgPSBsaW5lW29wdGlvbnMuZmllbGRJZF07XG5cdFx0cmV0dXJuIHBhcnNlVGV4dChmaWVsZCwgdGhpcy5pc0R5bmFtaWMsIFwiZ2V0U3VibGlzdFRleHRcIik7XG5cdH07XG5cblx0QG9wdGlvbnMoXCJzdWJsaXN0SWRcIiwgXCJmaWVsZElkXCIsIFwibGluZVwiKVxuXHRAcmVxdWlyZWQoXCJzdWJsaXN0SWRcIiwgXCJmaWVsZElkXCIsIFwibGluZVwiKVxuXHRnZXRTdWJsaXN0VmFsdWUgPSAob3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IGxpbmUgPSB0aGlzLiNnZXRMaW5lKG9wdGlvbnMpO1xuXHRcdGNvbnN0IGZpZWxkID0gbGluZVtvcHRpb25zLmZpZWxkSWRdO1xuXHRcdHJldHVybiBwYXJzZVZhbHVlKGZpZWxkKTtcblx0fTtcblxuXHRAb3B0aW9ucyhcImZpZWxkSWRcIilcblx0QHJlcXVpcmVkKFwiZmllbGRJZFwiKVxuXHRnZXRTdWJyZWNvcmQgPSAob3B0aW9ucykgPT4ge1xuXHRcdGlmICghKG9wdGlvbnMuZmllbGRJZCBpbiB0aGlzLnN1YnJlY29yZHMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZpZWxkICR7b3B0aW9ucy5maWVsZElkfSBpcyBub3QgYSBzdWJyZWNvcmQgZmllbGRgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuc3VicmVjb3Jkc1tvcHRpb25zLmZpZWxkSWRdO1xuXHR9O1xuXG5cdEBvcHRpb25zKFwiZmllbGRJZFwiKVxuXHRAcmVxdWlyZWQoXCJmaWVsZElkXCIpXG5cdGdldFRleHQgPSAob3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHNbb3B0aW9ucy5maWVsZElkXTtcblx0XHRyZXR1cm4gcGFyc2VUZXh0KGZpZWxkLCB0aGlzLmlzRHluYW1pYywgXCJnZXRUZXh0XCIpO1xuXHR9O1xuXG5cdEBvcHRpb25zKFwiZmllbGRJZFwiKVxuXHRAcmVxdWlyZWQoXCJmaWVsZElkXCIpXG5cdGdldFZhbHVlID0gKG9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzW29wdGlvbnMuZmllbGRJZF07XG5cdFx0cmV0dXJuIHBhcnNlVmFsdWUoZmllbGQpO1xuXHR9O1xuXG5cdEBkeW5hbWljTW9kZU9ubHkoKVxuXHRAb3B0aW9ucyhcInN1Ymxpc3RJZFwiLCBcImZpZWxkSWRcIilcblx0QHJlcXVpcmVkKFwic3VibGlzdElkXCIsIFwiZmllbGRJZFwiKVxuXHRoYXNDdXJyZW50U3VibGlzdFN1YnJlY29yZCA9IChvcHRpb25zKSA9PiB7XG5cdFx0cmV0dXJuIEJvb2xlYW4odGhpcy5nZXRDdXJyZW50U3VibGlzdFN1YnJlY29yZChvcHRpb25zKSk7XG5cdH07XG5cblx0QG9wdGlvbnMoXCJzdWJsaXN0SWRcIiwgXCJmaWVsZElkXCIsIFwibGluZVwiKVxuXHRAcmVxdWlyZWQoXCJzdWJsaXN0SWRcIiwgXCJmaWVsZElkXCIsIFwibGluZVwiKVxuXHRoYXNTdWJsaXN0U3VicmVjb3JkID0gKG9wdGlvbnMpID0+IHtcblx0XHRyZXR1cm4gQm9vbGVhbih0aGlzLmdldFN1Ymxpc3RTdWJyZWNvcmQob3B0aW9ucykpO1xuXHR9O1xuXG5cdEBvcHRpb25zKFwiZmllbGRJZFwiKVxuXHRAcmVxdWlyZWQoXCJmaWVsZElkXCIpXG5cdGhhc1N1YnJlY29yZCA9IChvcHRpb25zKSA9PiB7XG5cdFx0cmV0dXJuIEJvb2xlYW4odGhpcy5nZXRTdWJyZWNvcmQob3B0aW9ucykpO1xuXHR9O1xuXG5cdEBvcHRpb25zKFwic3VibGlzdElkXCIsIFwibGluZVwiLCBcImlnbm9yZVJlY2FsY1wiKVxuXHRAcmVxdWlyZWQoXCJzdWJsaXN0SWRcIiwgXCJsaW5lXCIpXG5cdGluc2VydExpbmUgPSAob3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IHN1Ymxpc3QgPSB0aGlzLnN1Ymxpc3RzW29wdGlvbnMuc3VibGlzdElkXTtcblx0XHRpZiAoIXN1Ymxpc3QpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlN1Ymxpc3QgZG9lcyBub3QgZXhpc3RcIik7XG5cdFx0fVxuXHRcdGlmIChvcHRpb25zLmxpbmUgPCAwIHx8IG9wdGlvbnMubGluZSA+IHN1Ymxpc3QubGluZXMubGVuZ3RoKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJMaW5lIGlzIG91dHNpZGUgdmFsaWQgcmFuZ2VcIik7XG5cdFx0fVxuXHRcdHN1Ymxpc3QubGluZXMuc3BsaWNlKG9wdGlvbnMubGluZSwgMCwge30pO1xuXHRcdGlmICh0aGlzLmlzRHluYW1pYykge1xuXHRcdFx0dGhpcy5zZWxlY3RMaW5lKG9wdGlvbnMpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHQvLyBAb3B0aW9ucyhcInN1Ymxpc3RJZFwiLCBcImZyb21cIiwgXCJ0b1wiKVxuXHQvLyBAcmVxdWlyZWQoXCJzdWJsaXN0SWRcIiwgXCJmcm9tXCIsIFwidG9cIilcblx0Ly8gbW92ZUxpbmUgPSAob3B0aW9ucykgPT4ge1xuXHQvLyBcdGNvbnN0IHN1Ymxpc3QgPSB0aGlzLiNnZXRTdWJsaXN0KG9wdGlvbnMpO1xuXHQvLyBcdGlmIChvcHRpb25zLmZyb20gPCAwIHx8IG9wdGlvbnMuZnJvbSA+IHN1Ymxpc3QubGluZXMubGVuZ3RoIC0gMSkge1xuXHQvLyBcdFx0dGhyb3cgbmV3IEVycm9yKFwiRnJvbSBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlXCIpO1xuXHQvLyBcdH1cblx0Ly8gXHRpZiAob3B0aW9ucy50byA8IDAgfHwgb3B0aW9ucy50byA+IHN1Ymxpc3QubGluZXMubGVuZ3RoKSB7XG5cdC8vIFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUbyBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlXCIpO1xuXHQvLyBcdH1cblx0Ly8gXHQvLyBpZiAob3B0aW9ucy50byA+IG9wdGlvbnMuZnJvbSkge1xuXHQvLyBcdC8vIFx0b3B0aW9ucy50by0tO1xuXHQvLyBcdC8vIH1cblx0Ly8gXHRjb25zdCBsaW5lID0gc3VibGlzdC5saW5lcy5zcGxpY2Uob3B0aW9ucy5mcm9tLCAxKTtcblx0Ly8gXHRzdWJsaXN0LmxpbmVzLnNwbGljZShvcHRpb25zLnRvLCAwLCBsaW5lKTtcblx0Ly8gXHRyZXR1cm4gdGhpcztcblx0Ly8gfTtcblxuXHRAZHluYW1pY01vZGVPbmx5KClcblx0QG9wdGlvbnMoXCJzdWJsaXN0SWRcIiwgXCJmaWVsZElkXCIpXG5cdEByZXF1aXJlZChcInN1Ymxpc3RJZFwiLCBcImZpZWxkSWRcIilcblx0cmVtb3ZlQ3VycmVudFN1Ymxpc3RTdWJyZWNvcmQgPSAob3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IHN1Ymxpc3QgPSB0aGlzLiNnZXRTdWJsaXN0KG9wdGlvbnMpO1xuXHRcdGlmICghKG9wdGlvbnMuZmllbGRJZCBpbiBzdWJsaXN0LmN1cnJlbnRsaW5lKSB8fCAhKHN1Ymxpc3QuY3VycmVudGxpbmVbb3B0aW9ucy5maWVsZElkXSBpbnN0YW5jZW9mIFJlY29yZCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRmllbGQgJHtvcHRpb25zLmZpZWxkSWR9IGlzIG5vdCBhIHN1YnJlY29yZCBmaWVsZGApO1xuXHRcdH1cblx0XHRzdWJsaXN0LmN1cnJlbnRsaW5lW29wdGlvbnMuZmllbGRJZF0gPSBudWxsO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdEBvcHRpb25zKFwic3VibGlzdElkXCIsIFwibGluZVwiLCBcImlnbm9yZVJlY2FsY1wiLCBcImxpbmVJbnN0YW5jZUlkXCIpXG5cdEByZXF1aXJlZChcInN1Ymxpc3RJZFwiLCBcImxpbmVcIilcblx0cmVtb3ZlTGluZSA9IChvcHRpb25zKSA9PiB7XG5cdFx0Y29uc3Qgc3VibGlzdCA9IHRoaXMuI2dldFN1Ymxpc3Qob3B0aW9ucyk7XG5cdFx0dGhpcy4jZ2V0TGluZShvcHRpb25zKTtcblx0XHRzdWJsaXN0LmxpbmVzLnNwbGljZShvcHRpb25zLmxpbmUsIDEpO1xuXHRcdGlmICh0aGlzLmlzRHluYW1pYykge1xuXHRcdFx0aWYgKHN1Ymxpc3QubGluZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR0aGlzLnNlbGVjdExpbmUob3B0aW9ucy5zdWJsaXN0SWQsIDApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zZWxlY3ROZXdMaW5lKG9wdGlvbnMuc3VibGlzdElkKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0QHN0YW5kYXJkTW9kZU9ubHkoKVxuXHRAb3B0aW9ucyhcInN1Ymxpc3RJZFwiLCBcImZpZWxkSWRcIiwgXCJsaW5lXCIpXG5cdEByZXF1aXJlZChcInN1Ymxpc3RJZFwiLCBcImZpZWxkSWRcIiwgXCJsaW5lXCIpXG5cdHJlbW92ZVN1Ymxpc3RTdWJyZWNvcmQgPSAob3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IGxpbmUgPSB0aGlzLiNnZXRMaW5lKG9wdGlvbnMpO1xuXHRcdGlmICghKG9wdGlvbnMuZmllbGRJZCBpbiBsaW5lKSB8fCAhKGxpbmVbb3B0aW9ucy5maWVsZElkXSBpbnN0YW5jZW9mIFJlY29yZCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRmllbGQgJHtvcHRpb25zLmZpZWxkSWR9IGlzIG5vdCBhIHN1YnJlY29yZCBmaWVsZGApO1xuXHRcdH1cblx0XHRsaW5lW29wdGlvbnMuZmllbGRJZF0gPSBudWxsO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdEBvcHRpb25zKFwiZmllbGRJZFwiKVxuXHRAcmVxdWlyZWQoXCJmaWVsZElkXCIpXG5cdHJlbW92ZVN1YnJlY29yZCA9IChvcHRpb25zKSA9PiB7XG5cdFx0aWYgKCEob3B0aW9ucy5maWVsZElkIGluIHRoaXMuc3VicmVjb3JkcykpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRmllbGQgJHtvcHRpb25zLmZpZWxkSWR9IGlzIG5vdCBhIHN1YnJlY29yZCBmaWVsZGApO1xuXHRcdH1cblx0XHR0aGlzLnN1YnJlY29yZHNbb3B0aW9ucy5maWVsZElkXSA9IG51bGw7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0QGFkZFByb21pc2UoKVxuXHRAb3B0aW9ucyhcImVuYWJsZVNvdXJjaW5nXCIsIFwiaWdub3JlTWFuZGF0b3J5RmllbGRzXCIpXG5cdHNhdmUgPSAob3B0aW9ucykgPT4ge1xuXHRcdGlmICh0aGlzLmlkICYmIFN1aXRlU2NyaXB0TW9ja3MucmVjb3Jkcy5nZXQodGhpcykudmVyc2lvbiAhPT0gdGhpcy52ZXJzaW9uKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJSZWNvcmQgaGFzIGNoYW5nZWRcIik7XG5cdFx0fVxuXHRcdHRoaXMudmVyc2lvbisrO1xuXHRcdGNvbnN0IGNvcHkgPSBuZXcgUmVjb3JkKHRoaXMpO1xuXHRcdC8vIGNoYW5nZSBmaWVsZHMgdGhhdCBvbmx5IGhhdmUgdmFsdWUgdG8gbm90IGJlIGFuIG9iamVjdCBzbyBnZXRUZXh0IHdvcmtzXG5cdFx0T2JqZWN0LmVudHJpZXMoY29weS5maWVsZHMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgJiYgIShcInRleHRcIiBpbiB2YWx1ZSkpIHtcblx0XHRcdFx0Y29weS5maWVsZHNba2V5XSA9IHZhbHVlLnZhbHVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC52YWx1ZXMoY29weS5zdWJsaXN0cykuZm9yRWFjaCgoc3VibGlzdCkgPT4ge1xuXHRcdFx0c3VibGlzdC5saW5lcy5mb3JFYWNoKChsaW5lKSA9PiB7XG5cdFx0XHRcdE9iamVjdC5lbnRyaWVzKGxpbmUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpICYmICEoXCJ0ZXh0XCIgaW4gdmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRsaW5lW2tleV0gPSB2YWx1ZS52YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0aWYgKCF0aGlzLmlkKSB7XG5cdFx0XHR0aGlzLmlkID0gY29weS5pZCA9IE1hdGgubWF4KC4uLkFycmF5LmZyb20oU3VpdGVTY3JpcHRNb2Nrcy5yZWNvcmRzLnZhbHVlcygpKS5tYXAoKGEpID0+IGEuaWQpKSArIDE7XG5cdFx0XHRTdWl0ZVNjcmlwdE1vY2tzLmNyZWF0ZWRSZWNvcmRzLnB1c2goY29weSk7XG5cdFx0fVxuXHRcdFN1aXRlU2NyaXB0TW9ja3MucmVjb3Jkcy5zZXQoY29weSk7XG5cdFx0U3VpdGVTY3JpcHRNb2Nrcy5zYXZlZFJlY29yZHMucHVzaChjb3B5KTtcblx0XHRyZXR1cm4gdGhpcy5pZDtcblx0fTtcblxuXHRAZHluYW1pY01vZGVPbmx5KClcblx0QG9wdGlvbnMoXCJzdWJsaXN0SWRcIiwgXCJsaW5lXCIpXG5cdEByZXF1aXJlZChcInN1Ymxpc3RJZFwiLCBcImxpbmVcIilcblx0c2VsZWN0TGluZSA9IChvcHRpb25zKSA9PiB7XG5cdFx0Y29uc3Qgc3VibGlzdCA9IHRoaXMuI2dldFN1Ymxpc3Qob3B0aW9ucyk7XG5cdFx0aWYgKG9wdGlvbnMubGluZSAhPSB0aGlzLmdldEN1cnJlbnRTdWJsaXN0SW5kZXgob3B0aW9ucy5zdWJsaXN0SWQpKSB7XG5cdFx0XHRjb25zdCBsaW5lID0gdGhpcy4jZ2V0TGluZShvcHRpb25zKTtcblx0XHRcdHN1Ymxpc3QuY3VycmVudGxpbmUgPSB7IC4uLmxpbmUgfTtcblx0XHRcdHN1Ymxpc3QubGluZXMgPSBzdWJsaXN0LmxpbmVzLmZpbHRlcigoYSkgPT4gYS5faWQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRAZHluYW1pY01vZGVPbmx5KClcblx0QG9wdGlvbnMoXCJzdWJsaXN0SWRcIilcblx0QHJlcXVpcmVkKFwic3VibGlzdElkXCIpXG5cdHNlbGVjdE5ld0xpbmUgPSAob3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IHN1Ymxpc3QgPSB0aGlzLiNnZXRTdWJsaXN0KG9wdGlvbnMpO1xuXHRcdHN1Ymxpc3QuY3VycmVudGxpbmUgPSB7fTtcblx0XHRzdWJsaXN0LmxpbmVzID0gc3