UNPKG

@singleton-i18n/angular-client

Version:

Singleton client code for Angular 10.

238 lines 29.1 kB
/* * Copyright 2019-2021 VMware, Inc. * SPDX-License-Identifier: EPL-2.0 */ const ARG_OPN = '{'; const ARG_CLS = '}'; const ARG_SEP = ','; const NUM_ARG = '#'; const ESC = '\''; export function parse(pattern) { return parseAST({ pattern: String(pattern), index: 0 }, ''); } function parseAST(current, parentType) { const pattern = current.pattern; const length = pattern.length; const elements = []; let text = parseText(current, parentType); if (text) { elements.push(text); } while (current.index < length) { if (pattern[current.index] === ARG_CLS) { if (!parentType) { throw expected(current); } break; } elements.push(parsePlaceholder(current)); text = parseText(current, parentType); if (text) { elements.push(text); } } return elements; } function parseText(current, parentType) { const pattern = current.pattern; const length = pattern.length; const isPlural = parentType === 'plural'; let text = ''; while (current.index < length) { let char = pattern[current.index]; if (char === ARG_OPN || char === ARG_CLS || (isPlural && char === NUM_ARG)) { break; } else if (char === ESC) { char = pattern[++current.index]; if (char === ESC) { text += char; ++current.index; } else if (char === ARG_OPN || char === ARG_CLS || (isPlural && char === NUM_ARG)) { text += char; while (++current.index < length) { char = pattern[current.index]; if (char === ESC && pattern[current.index + 1] === ESC) { // double is always 1 ' text += ESC; ++current.index; } else if (char === ESC) { ++current.index; break; } else { text += char; } } } else { text += ESC; } } else { text += char; ++current.index; } } return text; } function isWhitespace(code) { return ((code >= 0x09 && code <= 0x0D) || code === 0x20 || code === 0x85 || code === 0xA0 || code === 0x180E || (code >= 0x2000 && code <= 0x200D) || code === 0x2028 || code === 0x2029 || code === 0x202F || code === 0x205F || code === 0x2060 || code === 0x3000 || code === 0xFEFF); } function skipWhitespace(current) { const pattern = current.pattern; const length = pattern.length; while (current.index < length && isWhitespace(pattern.charCodeAt(current.index))) { ++current.index; } } function parsePlaceholder(current) { const pattern = current.pattern; if (pattern[current.index] === NUM_ARG) { ++current.index; // move passed # return [NUM_ARG]; } /* istanbul ignore if should be unreachable if parseAST and parseText are right */ if (pattern[current.index] !== ARG_OPN) { throw expected(current, ARG_OPN); } ++current.index; // move passed { skipWhitespace(current); const id = parseId(current); if (!id) { throw expected(current, 'placeholder id'); } skipWhitespace(current); let char = pattern[current.index]; if (char === ARG_CLS) { ++current.index; return [id]; } if (char !== ARG_SEP) { throw expected(current, ARG_SEP + ' or ' + ARG_CLS); } ++current.index; skipWhitespace(current); const type = parseId(current); if (!type) { throw expected(current, 'placeholder type'); } skipWhitespace(current); char = pattern[current.index]; if (char === ARG_CLS) { if (type === 'plural') { throw expected(current, type + ' sub-messages'); } ++current.index; return [id, type]; } if (char !== ARG_SEP) { throw expected(current, ARG_SEP + ' or ' + ARG_CLS); } ++current.index; skipWhitespace(current); let arg; if (type === 'plural') { skipWhitespace(current); arg = [id, type, parseSubMessages(current, type)]; } skipWhitespace(current); if (pattern[current.index] !== ARG_CLS) { throw expected(current, ARG_CLS); } ++current.index; return arg; } function parseId(current) { const pattern = current.pattern; const length = pattern.length; let id = ''; while (current.index < length) { const char = pattern[current.index]; if (char === ARG_OPN || char === ARG_CLS || char === ARG_SEP || char === NUM_ARG || char === ESC || isWhitespace(char.charCodeAt(0))) { break; } id += char; ++current.index; } return id; } function parseSubMessages(current, parentType) { const pattern = current.pattern; const length = pattern.length; const options = {}; while (current.index < length && pattern[current.index] !== ARG_CLS) { const selector = parseId(current); if (!selector) { throw expected(current, 'sub-message selector'); } skipWhitespace(current); const arr = parseSubMessage(current, parentType); options[selector] = arr; skipWhitespace(current); } if (!options['other'] && parentType === 'plural') { throw expected(current, null, null, '"other" sub-message must be specified in plural'); } return options; } function parseSubMessage(current, parentType) { if (current.pattern[current.index] !== ARG_OPN) { throw expected(current, ARG_OPN + ' to start sub-message'); } ++current.index; // move passed { const message = parseAST(current, parentType); if (current.pattern[current.index] !== ARG_CLS) { throw expected(current, ARG_CLS + ' to end sub-message'); } ++current.index; // move passed } return message; } function expected(current, expectedstr, found, message) { const pattern = current.pattern; const lines = pattern.slice(0, current.index).split(/\r?\n/); const offset = current.index; const line = lines.length; const column = lines.slice(-1)[0].length; found = found || ((current.index >= pattern.length) ? 'end of message pattern' : (parseId(current) || pattern[current.index])); if (!message) { message = errorMessage(expectedstr, found); } message += ' in ' + pattern.replace(/\r?\n/g, '\n'); return new MessageSyntaxError(message, expectedstr, found, offset, line, column); } // Error function function errorMessage(expectedstr, found) { if (!expectedstr) { return 'Unexpected ' + found + ' found'; } return 'Expected ' + expectedstr + ' but found ' + found; } /** * SyntaxError * Holds information about bad syntax found in a message pattern **/ function MessageSyntaxError(message, expectedstr, found, offset, line, column) { Error.call(this, message); this.name = 'SyntaxError'; this.message = message; this.expected = expectedstr; this.found = found; this.offset = offset; this.line = line; this.column = column; } MessageSyntaxError.prototype = Object.create(Error.prototype); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1cmFsLm1lc3NhZ2UucGFyc2VyLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3JsaWdlbmcvUHJvamVjdHMvRGV2b3BzL0NsaWVudF9Bbmd1bGFyX0dpdEh1Yl9OcG1qcy92aXAvY2kvcHViMm9yZy9DbGllbnRfQW5ndWxhcl9HaXRIdWJfTnBtanMvc2luZ2xldG9uL3Byb2plY3RzL2FuZ3VsYXItY2xpZW50LyIsInNvdXJjZXMiOlsic3JjL2Zvcm1hdHRlcnMvcGx1cmFsL3BsdXJhbC5tZXNzYWdlLnBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFDcEIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUNwQixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFDcEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBTWpCLE1BQU0sVUFBVSxLQUFLLENBQ2pCLE9BQWU7SUFFZixPQUFPLFFBQVEsQ0FBQztRQUNaLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3hCLEtBQUssRUFBRSxDQUFDO0tBQ1gsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxPQUFnQixFQUFFLFVBQWtCO0lBQ2xELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDaEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUM5QixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDcEIsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMxQyxJQUFJLElBQUksRUFBRTtRQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FBRTtJQUNsQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLEdBQUcsTUFBTSxF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aHQgMjAxOS0yMDIxIFZNd2FyZSwgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuY29uc3QgQVJHX09QTiA9ICd7JztcbmNvbnN0IEFSR19DTFMgPSAnfSc7XG5jb25zdCBBUkdfU0VQID0gJywnO1xuY29uc3QgTlVNX0FSRyA9ICcjJztcbmNvbnN0IEVTQyA9ICdcXCcnO1xuaW50ZXJmYWNlIENvbnRleHQge1xuICAgIHBhdHRlcm46IHN0cmluZztcbiAgICBpbmRleDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UoXG4gICAgcGF0dGVybjogc3RyaW5nXG4pOiBhbnlbXSB7XG4gICAgcmV0dXJuIHBhcnNlQVNUKHtcbiAgICAgICAgcGF0dGVybjogU3RyaW5nKHBhdHRlcm4pLFxuICAgICAgICBpbmRleDogMFxuICAgIH0sICcnKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBU1QoY3VycmVudDogQ29udGV4dCwgcGFyZW50VHlwZTogc3RyaW5nKTogYW55W10ge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBjdXJyZW50LnBhdHRlcm47XG4gICAgY29uc3QgbGVuZ3RoID0gcGF0dGVybi5sZW5ndGg7XG4gICAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgICBsZXQgdGV4dCA9IHBhcnNlVGV4dChjdXJyZW50LCBwYXJlbnRUeXBlKTtcbiAgICBpZiAodGV4dCkgeyBlbGVtZW50cy5wdXNoKHRleHQpOyB9XG4gICAgd2hpbGUgKGN1cnJlbnQuaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKHBhdHRlcm5bY3VycmVudC5pbmRleF0gPT09IEFSR19DTFMpIHtcbiAgICAgICAgICAgIGlmICghcGFyZW50VHlwZSkgeyB0aHJvdyBleHBlY3RlZChjdXJyZW50KTsgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMucHVzaChwYXJzZVBsYWNlaG9sZGVyKGN1cnJlbnQpKTtcbiAgICAgICAgdGV4dCA9IHBhcnNlVGV4dChjdXJyZW50LCBwYXJlbnRUeXBlKTtcbiAgICAgICAgaWYgKHRleHQpIHsgZWxlbWVudHMucHVzaCh0ZXh0KTsgfVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGV4dChjdXJyZW50OiBDb250ZXh0LCBwYXJlbnRUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBjdXJyZW50LnBhdHRlcm47XG4gICAgY29uc3QgbGVuZ3RoID0gcGF0dGVybi5sZW5ndGg7XG4gICAgY29uc3QgaXNQbHVyYWwgPSBwYXJlbnRUeXBlID09PSAncGx1cmFsJztcbiAgICBsZXQgdGV4dCA9ICcnO1xuICAgIHdoaWxlIChjdXJyZW50LmluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGxldCBjaGFyID0gcGF0dGVybltjdXJyZW50LmluZGV4XTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhciA9PT0gQVJHX09QTiB8fCBjaGFyID09PSBBUkdfQ0xTIHx8XG4gICAgICAgICAgICAoaXNQbHVyYWwgJiYgY2hhciA9PT0gTlVNX0FSRylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBFU0MpIHtcbiAgICAgICAgICAgIGNoYXIgPSBwYXR0ZXJuWysrY3VycmVudC5pbmRleF07XG4gICAgICAgICAgICBpZiAoY2hhciA9PT0gRVNDKSB7XG4gICAgICAgICAgICAgICAgdGV4dCArPSBjaGFyO1xuICAgICAgICAgICAgICAgICsrY3VycmVudC5pbmRleDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgY2hhciA9PT0gQVJHX09QTiB8fCBjaGFyID09PSBBUkdfQ0xTIHx8XG4gICAgICAgICAgICAgICAgKGlzUGx1cmFsICYmIGNoYXIgPT09IE5VTV9BUkcpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IGNoYXI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCsrY3VycmVudC5pbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyID0gcGF0dGVybltjdXJyZW50LmluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09IEVTQyAmJiBwYXR0ZXJuW2N1cnJlbnQuaW5kZXggKyAxXSA9PT0gRVNDKSB7IC8vIGRvdWJsZSBpcyBhbHdheXMgMSAnXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IEVTQztcbiAgICAgICAgICAgICAgICAgICAgICAgICsrY3VycmVudC5pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBFU0MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrY3VycmVudC5pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBjaGFyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IEVTQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRleHQgKz0gY2hhcjtcbiAgICAgICAgICAgICsrY3VycmVudC5pbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dDtcbn1cblxuZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAgIChjb2RlID49IDB4MDkgJiYgY29kZSA8PSAweDBEKSB8fFxuICAgICAgICBjb2RlID09PSAweDIwIHx8IGNvZGUgPT09IDB4ODUgfHwgY29kZSA9PT0gMHhBMCB8fCBjb2RlID09PSAweDE4MEUgfHxcbiAgICAgICAgKGNvZGUgPj0gMHgyMDAwICYmIGNvZGUgPD0gMHgyMDBEKSB8fFxuICAgICAgICBjb2RlID09PSAweDIwMjggfHwgY29kZSA9PT0gMHgyMDI5IHx8IGNvZGUgPT09IDB4MjAyRiB8fCBjb2RlID09PSAweDIwNUYgfHxcbiAgICAgICAgY29kZSA9PT0gMHgyMDYwIHx8IGNvZGUgPT09IDB4MzAwMCB8fCBjb2RlID09PSAweEZFRkZcbiAgICApO1xufVxuXG5mdW5jdGlvbiBza2lwV2hpdGVzcGFjZShjdXJyZW50OiBDb250ZXh0KTogdm9pZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IGN1cnJlbnQucGF0dGVybjtcbiAgICBjb25zdCBsZW5ndGggPSBwYXR0ZXJuLmxlbmd0aDtcbiAgICB3aGlsZSAoY3VycmVudC5pbmRleCA8IGxlbmd0aCAmJiBpc1doaXRlc3BhY2UocGF0dGVybi5jaGFyQ29kZUF0KGN1cnJlbnQuaW5kZXgpKSkge1xuICAgICAgICArK2N1cnJlbnQuaW5kZXg7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVBsYWNlaG9sZGVyKGN1cnJlbnQ6IENvbnRleHQpLyo6IFBsYWNlaG9sZGVyICovIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gY3VycmVudC5wYXR0ZXJuO1xuICAgIGlmIChwYXR0ZXJuW2N1cnJlbnQuaW5kZXhdID09PSBOVU1fQVJHKSB7XG4gICAgICAgICsrY3VycmVudC5pbmRleDsgLy8gbW92ZSBwYXNzZWQgI1xuICAgICAgICByZXR1cm4gW05VTV9BUkddO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiBzaG91bGQgYmUgdW5yZWFjaGFibGUgaWYgcGFyc2VBU1QgYW5kIHBhcnNlVGV4dCBhcmUgcmlnaHQgKi9cbiAgICBpZiAocGF0dGVybltjdXJyZW50LmluZGV4XSAhPT0gQVJHX09QTikgeyB0aHJvdyBleHBlY3RlZChjdXJyZW50LCBBUkdfT1BOKTsgfVxuICAgICsrY3VycmVudC5pbmRleDsgLy8gbW92ZSBwYXNzZWQge1xuICAgIHNraXBXaGl0ZXNwYWNlKGN1cnJlbnQpO1xuXG4gICAgY29uc3QgaWQgPSBwYXJzZUlkKGN1cnJlbnQpO1xuICAgIGlmICghaWQpIHsgdGhyb3cgZXhwZWN0ZWQoY3VycmVudCwgJ3BsYWNlaG9sZGVyIGlkJyk7IH1cbiAgICBza2lwV2hpdGVzcGFjZShjdXJyZW50KTtcblxuICAgIGxldCBjaGFyID0gcGF0dGVybltjdXJyZW50LmluZGV4XTtcbiAgICBpZiAoY2hhciA9PT0gQVJHX0NMUykge1xuICAgICAgICArK2N1cnJlbnQuaW5kZXg7XG4gICAgICAgIHJldHVybiBbaWRdO1xuICAgIH1cblxuICAgIGlmIChjaGFyICE9PSBBUkdfU0VQKSB7IHRocm93IGV4cGVjdGVkKGN1cnJlbnQsIEFSR19TRVAgKyAnIG9yICcgKyBBUkdfQ0xTKTsgfVxuICAgICsrY3VycmVudC5pbmRleDtcbiAgICBza2lwV2hpdGVzcGFjZShjdXJyZW50KTtcblxuICAgIGNvbnN0IHR5cGUgPSBwYXJzZUlkKGN1cnJlbnQpO1xuICAgIGlmICghdHlwZSkgeyB0aHJvdyBleHBlY3RlZChjdXJyZW50LCAncGxhY2Vob2xkZXIgdHlwZScpOyB9XG4gICAgc2tpcFdoaXRlc3BhY2UoY3VycmVudCk7XG4gICAgY2hhciA9IHBhdHRlcm5bY3VycmVudC5pbmRleF07XG4gICAgaWYgKGNoYXIgPT09IEFSR19DTFMpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdwbHVyYWwnKSB7XG4gICAgICAgICAgICB0aHJvdyBleHBlY3RlZChjdXJyZW50LCB0eXBlICsgJyBzdWItbWVzc2FnZXMnKTtcbiAgICAgICAgfVxuICAgICAgICArK2N1cnJlbnQuaW5kZXg7XG4gICAgICAgIHJldHVybiBbaWQsIHR5cGVdO1xuICAgIH1cblxuICAgIGlmIChjaGFyICE9PSBBUkdfU0VQKSB7IHRocm93IGV4cGVjdGVkKGN1cnJlbnQsIEFSR19TRVAgKyAnIG9yICcgKyBBUkdfQ0xTKTsgfVxuICAgICsrY3VycmVudC5pbmRleDtcbiAgICBza2lwV2hpdGVzcGFjZShjdXJyZW50KTtcblxuICAgIGxldCBhcmc7XG4gICAgaWYgKHR5cGUgPT09ICdwbHVyYWwnKSB7XG4gICAgICAgIHNraXBXaGl0ZXNwYWNlKGN1cnJlbnQpO1xuICAgICAgICBhcmcgPSBbaWQsIHR5cGUsIHBhcnNlU3ViTWVzc2FnZXMoY3VycmVudCwgdHlwZSldO1xuICAgIH1cblxuICAgIHNraXBXaGl0ZXNwYWNlKGN1cnJlbnQpO1xuICAgIGlmIChwYXR0ZXJuW2N1cnJlbnQuaW5kZXhdICE9PSBBUkdfQ0xTKSB7IHRocm93IGV4cGVjdGVkKGN1cnJlbnQsIEFSR19DTFMpOyB9XG4gICAgKytjdXJyZW50LmluZGV4O1xuXG5cbiAgICByZXR1cm4gYXJnO1xufVxuXG5mdW5jdGlvbiBwYXJzZUlkKGN1cnJlbnQ6IENvbnRleHQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBjdXJyZW50LnBhdHRlcm47XG4gICAgY29uc3QgbGVuZ3RoID0gcGF0dGVybi5sZW5ndGg7XG4gICAgbGV0IGlkID0gJyc7XG4gICAgd2hpbGUgKGN1cnJlbnQuaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY2hhciA9IHBhdHRlcm5bY3VycmVudC5pbmRleF07XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNoYXIgPT09IEFSR19PUE4gfHwgY2hhciA9PT0gQVJHX0NMUyB8fCBjaGFyID09PSBBUkdfU0VQIHx8XG4gICAgICAgICAgICBjaGFyID09PSBOVU1fQVJHIHx8IGNoYXIgPT09IEVTQyB8fCBpc1doaXRlc3BhY2UoY2hhci5jaGFyQ29kZUF0KDApKVxuICAgICAgICApIHsgYnJlYWs7IH1cbiAgICAgICAgaWQgKz0gY2hhcjtcbiAgICAgICAgKytjdXJyZW50LmluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU3ViTWVzc2FnZXMoY3VycmVudDogQ29udGV4dCwgcGFyZW50VHlwZTogc3RyaW5nKS8qOiBTdWJNZXNzYWdlcyAqLyB7XG4gICAgY29uc3QgcGF0dGVybiA9IGN1cnJlbnQucGF0dGVybjtcbiAgICBjb25zdCBsZW5ndGggPSBwYXR0ZXJuLmxlbmd0aDtcbiAgICBjb25zdCBvcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgd2hpbGUgKGN1cnJlbnQuaW5kZXggPCBsZW5ndGggJiYgcGF0dGVybltjdXJyZW50LmluZGV4XSAhPT0gQVJHX0NMUykge1xuICAgICAgICBjb25zdCBzZWxlY3Rvcjogc3RyaW5nID0gcGFyc2VJZChjdXJyZW50KTtcbiAgICAgICAgaWYgKCFzZWxlY3RvcikgeyB0aHJvdyBleHBlY3RlZChjdXJyZW50LCAnc3ViLW1lc3NhZ2Ugc2VsZWN0b3InKTsgfVxuICAgICAgICBza2lwV2hpdGVzcGFjZShjdXJyZW50KTtcbiAgICAgICAgY29uc3QgYXJyID0gcGFyc2VTdWJNZXNzYWdlKGN1cnJlbnQsIHBhcmVudFR5cGUpO1xuICAgICAgICBvcHRpb25zW3NlbGVjdG9yXSA9IGFycjtcbiAgICAgICAgc2tpcFdoaXRlc3BhY2UoY3VycmVudCk7XG4gICAgfVxuICAgIGlmICghb3B0aW9uc1snb3RoZXInXSAmJiBwYXJlbnRUeXBlID09PSAncGx1cmFsJykge1xuICAgICAgICB0aHJvdyBleHBlY3RlZChjdXJyZW50LCBudWxsLCBudWxsLCAnXCJvdGhlclwiIHN1Yi1tZXNzYWdlIG11c3QgYmUgc3BlY2lmaWVkIGluIHBsdXJhbCcpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gcGFyc2VTdWJNZXNzYWdlKGN1cnJlbnQ6IENvbnRleHQsIHBhcmVudFR5cGU6IHN0cmluZyk6IGFueVtdIHtcbiAgICBpZiAoY3VycmVudC5wYXR0ZXJuW2N1cnJlbnQuaW5kZXhdICE9PSBBUkdfT1BOKSB7XG4gICAgICAgIHRocm93IGV4cGVjdGVkKGN1cnJlbnQsIEFSR19PUE4gKyAnIHRvIHN0YXJ0IHN1Yi1tZXNzYWdlJyk7XG4gICAgfVxuICAgICsrY3VycmVudC5pbmRleDsgLy8gbW92ZSBwYXNzZWQge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBwYXJzZUFTVChjdXJyZW50LCBwYXJlbnRUeXBlKTtcbiAgICBpZiAoY3VycmVudC5wYXR0ZXJuW2N1cnJlbnQuaW5kZXhdICE9PSBBUkdfQ0xTKSB7XG4gICAgICAgIHRocm93IGV4cGVjdGVkKGN1cnJlbnQsIEFSR19DTFMgKyAnIHRvIGVuZCBzdWItbWVzc2FnZScpO1xuICAgIH1cbiAgICArK2N1cnJlbnQuaW5kZXg7IC8vIG1vdmUgcGFzc2VkIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gZXhwZWN0ZWQoY3VycmVudDogQ29udGV4dCwgZXhwZWN0ZWRzdHI/OiBzdHJpbmcsIGZvdW5kPzogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBwYXR0ZXJuID0gY3VycmVudC5wYXR0ZXJuO1xuICAgIGNvbnN0IGxpbmVzID0gcGF0dGVybi5zbGljZSgwLCBjdXJyZW50LmluZGV4KS5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGNvbnN0IG9mZnNldCA9IGN1cnJlbnQuaW5kZXg7XG4gICAgY29uc3QgbGluZSA9IGxpbmVzLmxlbmd0aDtcbiAgICBjb25zdCBjb2x1bW4gPSBsaW5lcy5zbGljZSgtMSlbMF0ubGVuZ3RoO1xuICAgIGZvdW5kID0gZm91bmQgfHwgKFxuICAgICAgICAoY3VycmVudC5pbmRleCA+PSBwYXR0ZXJuLmxlbmd0aCkgPyAnZW5kIG9mIG1lc3NhZ2UgcGF0dGVybidcbiAgICAgICAgICAgIDogKHBhcnNlSWQoY3VycmVudCkgfHwgcGF0dGVybltjdXJyZW50LmluZGV4XSlcbiAgICApO1xuICAgIGlmICghbWVzc2FnZSkgeyBtZXNzYWdlID0gZXJyb3JNZXNzYWdlKGV4cGVjdGVkc3RyLCBmb3VuZCk7IH1cbiAgICBtZXNzYWdlICs9ICcgaW4gJyArIHBhdHRlcm4ucmVwbGFjZSgvXFxyP1xcbi9nLCAnXFxuJyk7XG4gICAgcmV0dXJuIG5ldyAoTWVzc2FnZVN5bnRheEVycm9yIGFzIGFueSkobWVzc2FnZSwgZXhwZWN0ZWRzdHIsIGZvdW5kLCBvZmZzZXQsIGxpbmUsIGNvbHVtbik7XG59XG5cbi8vIEVycm9yIGZ1bmN0aW9uXG5mdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXhwZWN0ZWRzdHI6IHN0cmluZywgZm91bmQ6IHN0cmluZykge1xuICAgIGlmICghZXhwZWN0ZWRzdHIpIHsgcmV0dXJuICdVbmV4cGVjdGVkICcgKyBmb3VuZCArICcgZm91bmQnOyB9XG4gICAgcmV0dXJuICdFeHBlY3RlZCAnICsgZXhwZWN0ZWRzdHIgKyAnIGJ1dCBmb3VuZCAnICsgZm91bmQ7XG59XG5cbi8qKlxuICogU3ludGF4RXJyb3JcbiAqICBIb2xkcyBpbmZvcm1hdGlvbiBhYm91dCBiYWQgc3ludGF4IGZvdW5kIGluIGEgbWVzc2FnZSBwYXR0ZXJuXG4gKiovXG5mdW5jdGlvbiBNZXNzYWdlU3ludGF4RXJyb3IobWVzc2FnZTogc3RyaW5nLCBleHBlY3RlZHN0cjogc3RyaW5nLCBmb3VuZDogc3RyaW5nLCBvZmZzZXQ6IG51bWJlciwgbGluZTogbnVtYmVyLCBjb2x1bW46IG51bWJlcikge1xuICAgIEVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1N5bnRheEVycm9yJztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuZXhwZWN0ZWQgPSBleHBlY3RlZHN0cjtcbiAgICB0aGlzLmZvdW5kID0gZm91bmQ7XG4gICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbn1cbk1lc3NhZ2VTeW50YXhFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4iXX0=