tc-ui-toolkit
Version:
React components used to develop tools for the desktop app translationCore
416 lines (350 loc) • 44.7 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.BIBLE_BOOKS = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _ospath = _interopRequireDefault(require("ospath"));
var lexiconHelpers = _interopRequireWildcard(require("../lexiconHelpers"));
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
var RESOURCE_PATH = _path["default"].join(_ospath["default"].home(), 'translationCore', 'resources');
var OT_PATH = _path["default"].join(RESOURCE_PATH, 'hbo/bibles/uhb/v1.4.1');
var outputFolder = _path["default"].join(__dirname, 'fixtures/words');
var BIBLE_BOOKS = {
oldTestament: {
'gen': 'Genesis',
'exo': 'Exodus',
'lev': 'Leviticus',
'num': 'Numbers',
'deu': 'Deuteronomy',
'jos': 'Joshua',
'jdg': 'Judges',
'rut': 'Ruth',
'1sa': '1 Samuel',
'2sa': '2 Samuel',
'1ki': '1 Kings',
'2ki': '2 Kings',
'1ch': '1 Chronicles',
'2ch': '2 Chronicles',
'ezr': 'Ezra',
'neh': 'Nehemiah',
'est': 'Esther',
'job': 'Job',
'psa': 'Psalms',
'pro': 'Proverbs',
'ecc': 'Ecclesiastes',
'sng': 'Song of Solomon',
'isa': 'Isaiah',
'jer': 'Jeremiah',
'lam': 'Lamentations',
'ezk': 'Ezekiel',
'dan': 'Daniel',
'hos': 'Hosea',
'jol': 'Joel',
'amo': 'Amos',
'oba': 'Obadiah',
'jon': 'Jonah',
'mic': 'Micah',
'nam': 'Nahum',
'hab': 'Habakkuk',
'zep': 'Zephaniah',
'hag': 'Haggai',
'zec': 'Zechariah',
'mal': 'Malachi'
},
newTestament: {
'mat': 'Matthew',
'mrk': 'Mark',
'luk': 'Luke',
'jhn': 'John',
'act': 'Acts',
'rom': 'Romans',
'1co': '1 Corinthians',
'2co': '2 Corinthians',
'gal': 'Galatians',
'eph': 'Ephesians',
'php': 'Philippians',
'col': 'Colossians',
'1th': '1 Thessalonians',
'2th': '2 Thessalonians',
'1ti': '1 Timothy',
'2ti': '2 Timothy',
'tit': 'Titus',
'phm': 'Philemon',
'heb': 'Hebrews',
'jas': 'James',
'1pe': '1 Peter',
'2pe': '2 Peter',
'1jn': '1 John',
'2jn': '2 John',
'3jn': '3 John',
'jud': 'Jude',
'rev': 'Revelation'
}
};
exports.BIBLE_BOOKS = BIBLE_BOOKS;
describe('lexiconHelpers', function () {
describe('test stongs lookup', function () {
var strongsTests = [['b:H7225', {
'uhl': {
'7225': 'uhl-7225'
}
}], ['H123:H7225', {
'uhl': {
'123': 'uhl-123',
'7225': 'uhl-7225'
}
}], ['c:d:H0776', {
'uhl': {
'776': 'uhl-776'
}
}], ['H1961', {
'uhl': {
'1961': 'uhl-1961'
}
}], ['H5921a', {
'uhl': {
'5921': 'uhl-5921'
}
}], ['G33260', {
'ugl': {
'3326': 'ugl-3326'
}
}], ['H7225:b', {
'uhl': {
'7225': 'uhl-7225'
}
}], ['', {}], ['b', {}], [null, {}]];
var _loop = function _loop() {
var test = _strongsTests[_i];
var strongs = test[0];
var expectedResults = test[1];
it('should succeed with "' + strongs + '"', function () {
//when
var results = lexiconHelpers.lookupStrongsNumbers(strongs, function (lexiconId, entryId) {
return getLexiconData(lexiconId, entryId);
}); // then
expect(results).toEqual(expectedResults);
});
};
for (var _i = 0, _strongsTests = strongsTests; _i < _strongsTests.length; _i++) {
_loop();
}
});
describe('test stongs parsing', function () {
var strongsTests = [['b:H7225', [0, 7225], ['uhl', 'uhl'], 2], ['H123:H7225', [123, 7225], ['uhl', 'uhl'], 2], ['c:d:H0776', [0, 0, 776], ['uhl', 'uhl', 'uhl'], 3], ['H1961', [1961], ['uhl'], 1], ['H5921a', [5921], ['uhl'], 1], ['G33260', [3326], ['ugl'], 1], ['', [], [], 0], ['b', [0], ['uhl'], 1], [null, [], [], 0]];
var _loop2 = function _loop2() {
var test = _strongsTests2[_i2];
var strongs = test[0];
var expectedEntryIds = test[1];
var expectedLexiconId = test[2];
var expectedPartCount = test[3];
it('should succeed with "' + strongs + '"', function () {
//when
var results = extractStrongs(strongs); // then
expect(results.entryIds).toEqual(expectedEntryIds);
expect(results.lexiconIds).toEqual(expectedLexiconId);
expect(results.parts.length).toEqual(expectedPartCount);
});
};
for (var _i2 = 0, _strongsTests2 = strongsTests; _i2 < _strongsTests2.length; _i2++) {
_loop2();
}
});
describe('test word parsing', function () {
var wordTests = [['בְּרֵאשִׁ֖ית', ['בְּ', 'רֵאשִׁ֖ית']], ['בָּרָ֣א', ['בָּרָ֣א']], ['הַשָּׁמַ֖יִם', ['הַ', 'שָּׁמַ֖יִם']], ['וְאֵ֥ת', ['וְ', 'אֵ֥ת']], ['וְהָאָ֗רֶץ', ['וְ', 'הָ', 'אָ֗רֶץ']], ['חֲכָמֶ֑יהָ', ['חֲכָמֶ֑י', 'הָ']], // gen 41:8
['Ἰάκωβος', ['Ἰάκωβος']]];
var _loop3 = function _loop3() {
var test = _wordTests[_i3];
var word = test[0];
var expectedParts = test[1];
it('should succeed with "' + word + '"', function () {
//when
var results = lexiconHelpers.getWordParts(word); // then
expect(results).toEqual(expectedParts);
});
};
for (var _i3 = 0, _wordTests = wordTests; _i3 < _wordTests.length; _i3++) {
_loop3();
}
});
describe('UHB tests', function () {
describe.skip('consistency check OT', function () {
var _loop4 = function _loop4() {
var bookId = _Object$keys[_i4];
var BookName = BIBLE_BOOKS.oldTestament[bookId];
it('check ' + BookName, function () {
// reads all the words from book and saves parsed words to file
var words = {};
var bookPath = _path["default"].join(OT_PATH, bookId);
var files = _fs["default"].readdirSync(bookPath);
var _iterator = _createForOfIteratorHelper(files),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var file = _step.value;
var chapter = JSON.parse(_fs["default"].readFileSync(_path["default"].join(bookPath, file), 'utf8'));
var cRef = bookId + '-' + file.split('.')[0] + ':';
var verses = Object.keys(chapter);
for (var _i5 = 0, _verses = verses; _i5 < _verses.length; _i5++) {
var verseNum = _verses[_i5];
var verse = chapter[verseNum];
var objects = verse.verseObjects;
var vRef = cRef + verseNum;
getWords(objects, words, vRef);
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
var output = '';
var anomallies = '';
var missingMorphs = 0;
var invalidStrongsCount = 0;
var invalidMorphCount = 0;
var wordEntries = Object.keys(words).sort();
var _iterator2 = _createForOfIteratorHelper(wordEntries),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var wordIndex = _step2.value;
var word = words[wordIndex];
var morph = word.word.morph;
var strongs = word.word.strong;
var morphKeys = lexiconHelpers.getMorphKeys(morph);
var wordParts = lexiconHelpers.getWordParts(word.word.text);
word.wordParts = wordParts;
if (!strongs) {
var warning = 'Missing strongs: ' + JSON.stringify(word);
anomallies += warning + '\n'; // console.warn(warning);
} else {
var valid = lexiconHelpers.containsValidStrongsNumber(strongs);
if (!valid) {
var _warning = 'Missing strongs Number: ' + JSON.stringify(word);
anomallies += _warning + '\n'; // console.warn(warning);
}
}
if (!morphKeys[0].length) {
if (++missingMorphs < 0) {
console.warn('Missing morph entry: ' + JSON.stringify(word));
}
} else {
var strongsParts = lexiconHelpers.getStrongsParts(strongs);
if (strongsParts.length !== morphKeys.length) {
var morphLen = morphKeys.length;
if (strongsParts.length + 1 === morphLen && morphKeys.length && morphKeys[morphKeys.length - 1][0] === 'suffix') {
// add exception for suffix
morphLen--;
}
if (strongsParts.length !== morphLen) {
var _warning2 = 'number of strongs parts ' + strongsParts.length + ' different than number of morph parts ' + morphKeys.length + ' : ' + JSON.stringify(word);
anomallies += _warning2 + '\n';
if (++invalidStrongsCount > 0) {// console.warn(warning);
}
}
}
if (wordParts.length !== morphKeys.length) {
var _morphLen = morphKeys.length;
if (wordParts.length + 1 === _morphLen && morphKeys.length && morphKeys[morphKeys.length - 1][0] === 'suffix') {
// add exception for suffix
_morphLen--;
}
if (wordParts.length !== _morphLen) {
var _warning3 = 'number of word parts ' + wordParts.length + ' different than number of morph parts ' + morphKeys.length + ' : ' + JSON.stringify(word);
anomallies += _warning3 + '\n';
if (++invalidMorphCount > 0) {// console.warn(warning);
}
}
}
}
word.morphKeys = morphKeys;
if (output) {
output += ',\n';
}
output += ' "' + wordIndex + '": ' + JSON.stringify(word);
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
console.log('-----------\nin ' + BookName + ':\nnumber of unique words: ' + wordEntries.length);
if (missingMorphs) {
console.warn('missingMorphs: ' + missingMorphs);
}
if (invalidStrongsCount) {
console.warn('inconsistant Strongs Count: ' + invalidStrongsCount);
}
if (invalidMorphCount) {
console.warn('inconsistant Morph Count: ' + invalidMorphCount);
}
if (anomallies) {
console.warn('anomallies:\n' + anomallies);
}
output = '{\n' + output + '\n}\n';
var outFile = _path["default"].join(outputFolder, bookId + '-word-checks.json');
_fs["default"].writeFileSync(outFile, output, {
encoding: 'utf8'
});
});
};
for (var _i4 = 0, _Object$keys = Object.keys(BIBLE_BOOKS.oldTestament); _i4 < _Object$keys.length; _i4++) {
_loop4();
}
});
});
}); //
// helpers
//
function extractStrongs(strongs) {
var parts = lexiconHelpers.getStrongsParts(strongs);
var lexiconIds = [];
var entryIds = [];
var _iterator3 = _createForOfIteratorHelper(parts),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var found = _step3.value;
var lexiconId = lexiconHelpers.lexiconIdFromStrongs(found);
lexiconIds.push(lexiconId);
var entryId = lexiconHelpers.lexiconEntryIdFromStrongs(found);
entryIds.push(entryId);
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
return {
entryIds: entryIds,
lexiconIds: lexiconIds,
parts: parts
};
}
function getWords(objects, words, ref) {
for (var i = 0, len = objects.length; i < len; i++) {
var object = objects[i];
if (object.type === 'word' && object.text && !words[object.text]) {
var data = {
word: object,
ref: ref + '.' + i
};
words[object.text] = data;
}
if (object.children) {
getWords(object.children, words, ref + '.' + i);
}
}
}
function getLexiconData(lexiconId, entryId) {
return (0, _defineProperty2["default"])({}, lexiconId, (0, _defineProperty2["default"])({}, entryId, lexiconId + '-' + entryId));
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9TY3JpcHR1cmVQYW5lL2hlbHBlcnMvX190ZXN0X18vbGV4aWNvbkhlbHBlcnMudGVzdC5qcyJdLCJuYW1lcyI6WyJSRVNPVVJDRV9QQVRIIiwicGF0aCIsImpvaW4iLCJvc3BhdGgiLCJob21lIiwiT1RfUEFUSCIsIm91dHB1dEZvbGRlciIsIl9fZGlybmFtZSIsIkJJQkxFX0JPT0tTIiwib2xkVGVzdGFtZW50IiwibmV3VGVzdGFtZW50IiwiZGVzY3JpYmUiLCJzdHJvbmdzVGVzdHMiLCJ0ZXN0Iiwic3Ryb25ncyIsImV4cGVjdGVkUmVzdWx0cyIsIml0IiwicmVzdWx0cyIsImxleGljb25IZWxwZXJzIiwibG9va3VwU3Ryb25nc051bWJlcnMiLCJsZXhpY29uSWQiLCJlbnRyeUlkIiwiZ2V0TGV4aWNvbkRhdGEiLCJleHBlY3QiLCJ0b0VxdWFsIiwiZXhwZWN0ZWRFbnRyeUlkcyIsImV4cGVjdGVkTGV4aWNvbklkIiwiZXhwZWN0ZWRQYXJ0Q291bnQiLCJleHRyYWN0U3Ryb25ncyIsImVudHJ5SWRzIiwibGV4aWNvbklkcyIsInBhcnRzIiwibGVuZ3RoIiwid29yZFRlc3RzIiwid29yZCIsImV4cGVjdGVkUGFydHMiLCJnZXRXb3JkUGFydHMiLCJza2lwIiwiYm9va0lkIiwiQm9va05hbWUiLCJ3b3JkcyIsImJvb2tQYXRoIiwiZmlsZXMiLCJmcyIsInJlYWRkaXJTeW5jIiwiZmlsZSIsImNoYXB0ZXIiLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZVN5bmMiLCJjUmVmIiwic3BsaXQiLCJ2ZXJzZXMiLCJPYmplY3QiLCJrZXlzIiwidmVyc2VOdW0iLCJ2ZXJzZSIsIm9iamVjdHMiLCJ2ZXJzZU9iamVjdHMiLCJ2UmVmIiwiZ2V0V29yZHMiLCJvdXRwdXQiLCJhbm9tYWxsaWVzIiwibWlzc2luZ01vcnBocyIsImludmFsaWRTdHJvbmdzQ291bnQiLCJpbnZhbGlkTW9ycGhDb3VudCIsIndvcmRFbnRyaWVzIiwic29ydCIsIndvcmRJbmRleCIsIm1vcnBoIiwic3Ryb25nIiwibW9ycGhLZXlzIiwiZ2V0TW9ycGhLZXlzIiwid29yZFBhcnRzIiwidGV4dCIsIndhcm5pbmciLCJzdHJpbmdpZnkiLCJ2YWxpZCIsImNvbnRhaW5zVmFsaWRTdHJvbmdzTnVtYmVyIiwiY29uc29sZSIsIndhcm4iLCJzdHJvbmdzUGFydHMiLCJnZXRTdHJvbmdzUGFydHMiLCJtb3JwaExlbiIsImxvZyIsIm91dEZpbGUiLCJ3cml0ZUZpbGVTeW5jIiwiZW5jb2RpbmciLCJmb3VuZCIsImxleGljb25JZEZyb21TdHJvbmdzIiwicHVzaCIsImxleGljb25FbnRyeUlkRnJvbVN0cm9uZ3MiLCJyZWYiLCJpIiwibGVuIiwib2JqZWN0IiwidHlwZSIsImRhdGEiLCJjaGlsZHJlbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7OztBQUVBLElBQU1BLGFBQWEsR0FBR0MsaUJBQUtDLElBQUwsQ0FBVUMsbUJBQU9DLElBQVAsRUFBVixFQUF5QixpQkFBekIsRUFBNEMsV0FBNUMsQ0FBdEI7O0FBQ0EsSUFBTUMsT0FBTyxHQUFHSixpQkFBS0MsSUFBTCxDQUFVRixhQUFWLEVBQXlCLHVCQUF6QixDQUFoQjs7QUFDQSxJQUFNTSxZQUFZLEdBQUdMLGlCQUFLQyxJQUFMLENBQVVLLFNBQVYsRUFBcUIsZ0JBQXJCLENBQXJCOztBQUVPLElBQU1DLFdBQVcsR0FBRztBQUN6QkMsRUFBQUEsWUFBWSxFQUFFO0FBQ1osV0FBTyxTQURLO0FBRVosV0FBTyxRQUZLO0FBR1osV0FBTyxXQUhLO0FBSVosV0FBTyxTQUpLO0FBS1osV0FBTyxhQUxLO0FBTVosV0FBTyxRQU5LO0FBT1osV0FBTyxRQVBLO0FBUVosV0FBTyxNQVJLO0FBU1osV0FBTyxVQVRLO0FBVVosV0FBTyxVQVZLO0FBV1osV0FBTyxTQVhLO0FBWVosV0FBTyxTQVpLO0FBYVosV0FBTSxjQWJNO0FBY1osV0FBTyxjQWRLO0FBZVosV0FBTyxNQWZLO0FBZ0Ja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QXJDLENBQVI7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsU0FBU3ZFLGNBQVQsQ0FBd0JGLFNBQXhCLEVBQW1DQyxPQUFuQyxFQUE0QztBQUMxQyw4Q0FBVUQsU0FBVix1Q0FBeUJDLE9BQXpCLEVBQW1DRCxTQUFTLEdBQUcsR0FBWixHQUFrQkMsT0FBckQ7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1lbnYgamVzdCAqL1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IG9zcGF0aCBmcm9tICdvc3BhdGgnO1xuaW1wb3J0ICogYXMgbGV4aWNvbkhlbHBlcnMgZnJvbSAnLi4vbGV4aWNvbkhlbHBlcnMnO1xuXG5jb25zdCBSRVNPVVJDRV9QQVRIID0gcGF0aC5qb2luKG9zcGF0aC5ob21lKCksICd0cmFuc2xhdGlvbkNvcmUnLCAncmVzb3VyY2VzJyk7XG5jb25zdCBPVF9QQVRIID0gcGF0aC5qb2luKFJFU09VUkNFX1BBVEgsICdoYm8vYmlibGVzL3VoYi92MS40LjEnKTtcbmNvbnN0IG91dHB1dEZvbGRlciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdmaXh0dXJlcy93b3JkcycpO1xuXG5leHBvcnQgY29uc3QgQklCTEVfQk9PS1MgPSB7XG4gIG9sZFRlc3RhbWVudDoge1xuICAgICdnZW4nOiAnR2VuZXNpcycsXG4gICAgJ2V4byc6ICdFeG9kdXMnLFxuICAgICdsZXYnOiAnTGV2aXRpY3VzJyxcbiAgICAnbnVtJzogJ051bWJlcnMnLFxuICAgICdkZXUnOiAnRGV1dGVyb25vbXknLFxuICAgICdqb3MnOiAnSm9zaHVhJyxcbiAgICAnamRnJzogJ0p1ZGdlcycsXG4gICAgJ3J1dCc6ICdSdXRoJyxcbiAgICAnMXNhJzogJzEgU2FtdWVsJyxcbiAgICAnMnNhJzogJzIgU2FtdWVsJyxcbiAgICAnMWtpJzogJzEgS2luZ3MnLFxuICAgICcya2knOiAnMiBLaW5ncycsXG4gICAgJzFjaCc6JzEgQ2hyb25pY2xlcycsXG4gICAgJzJjaCc6ICcyIENocm9uaWNsZXMnLFxuICAgICdlenInOiAnRXpyYScsXG4gICAgJ25laCc6ICdOZWhlbWlhaCcsXG4gICAgJ2VzdCc6ICdFc3RoZXInLFxuICAgICdqb2InOiAnSm9iJyxcbiAgICAncHNhJzogJ1BzYWxtcycsXG4gICAgJ3Bybyc6ICdQcm92ZXJicycsXG4gICAgJ2VjYyc6ICdFY2NsZXNpYXN0ZXMnLFxuICAgICdzbmcnOiAnU29uZyBvZiBTb2xvbW9uJyxcbiAgICAnaXNhJzogJ0lzYWlhaCcsXG4gICAgJ2plcic6ICdKZXJlbWlhaCcsXG4gICAgJ2xhbSc6ICdMYW1lbnRhdGlvbnMnLFxuICAgICdlemsnOiAnRXpla2llbCcsXG4gICAgJ2Rhbic6ICdEYW5pZWwnLFxuICAgICdob3MnOiAnSG9zZWEnLFxuICAgICdqb2wnOiAnSm9lbCcsXG4gICAgJ2Ftbyc6ICdBbW9zJyxcbiAgICAnb2JhJzogJ09iYWRpYWgnLFxuICAgICdqb24nOiAnSm9uYWgnLFxuICAgICdtaWMnOiAnTWljYWgnLFxuICAgICduYW0nOiAnTmFodW0nLFxuICAgICdoYWInOiAnSGFiYWtrdWsnLFxuICAgICd6ZXAnOiAnWmVwaGFuaWFoJyxcbiAgICAnaGFnJzogJ0hhZ2dhaScsXG4gICAgJ3plYyc6ICdaZWNoYXJpYWgnLFxuICAgICdtYWwnOidNYWxhY2hpJyxcbiAgfSxcbiAgbmV3VGVzdGFtZW50OiB7XG4gICAgJ21hdCc6ICdNYXR0aGV3JyxcbiAgICAnbXJrJzogJ01hcmsnLFxuICAgICdsdWsnOiAnTHVrZScsXG4gICAgJ2pobic6ICdKb2huJyxcbiAgICAnYWN0JzogJ0FjdHMnLFxuICAgICdyb20nOiAnUm9tYW5zJyxcbiAgICAnMWNvJzogJzEgQ29yaW50aGlhbnMnLFxuICAgICcyY28nOiAnMiBDb3JpbnRoaWFucycsXG4gICAgJ2dhbCc6ICdHYWxhdGlhbnMnLFxuICAgICdlcGgnOiAnRXBoZXNpYW5zJyxcbiAgICAncGhwJzogJ1BoaWxpcHBpYW5zJyxcbiAgICAnY29sJzogJ0NvbG9zc2lhbnMnLFxuICAgICcxdGgnOiAnMSBUaGVzc2Fsb25pYW5zJyxcbiAgICAnMnRoJzogJzIgVGhlc3NhbG9uaWFucycsXG4gICAgJzF0aSc6ICcxIFRpbW90aHknLFxuICAgICcydGknOiAnMiBUaW1vdGh5JyxcbiAgICAndGl0JzogJ1RpdHVzJyxcbiAgICAncGhtJzogJ1BoaWxlbW9uJyxcbiAgICAnaGViJzogJ0hlYnJld3MnLFxuICAgICdqYXMnOiAnSmFtZXMnLFxuICAgICcxcGUnOiAnMSBQZXRlcicsXG4gICAgJzJwZSc6ICcyIFBldGVyJyxcbiAgICAnMWpuJzogJzEgSm9obicsXG4gICAgJzJqbic6ICcyIEpvaG4nLFxuICAgICczam4nOiAnMyBKb2huJyxcbiAgICAnanVkJzogJ0p1ZGUnLFxuICAgICdyZXYnOiAnUmV2ZWxhdGlvbicsXG4gIH0sXG59O1xuXG5kZXNjcmliZSgnbGV4aWNvbkhlbHBlcnMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCd0ZXN0IHN0b25ncyBsb29rdXAnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3Ryb25nc1Rlc3RzID0gW1xuICAgICAgWydiOkg3MjI1JywgeyAndWhsJzogeyAnNzIyNSc6ICd1aGwtNzIyNScgfSB9XSxcbiAgICAgIFsnSDEyMzpINzIyNScsIHsgJ3VobCc6IHsgJzEyMyc6ICd1aGwtMTIzJywgJzcyMjUnOiAndWhsLTcyMjUnIH0gfV0sXG4gICAgICBbJ2M6ZDpIMDc3NicsIHsgJ3VobCc6IHsgJzc3Nic6ICd1aGwtNzc2JyB9IH1dLFxuICAgICAgWydIMTk2MScsIHsgJ3VobCc6IHsgJzE5NjEnOiAndWhsLTE5NjEnIH0gfV0sXG4gICAgICBbJ0g1OTIxYScsIHsgJ3VobCc6IHsgJzU5MjEnOiAndWhsLTU5MjEnIH0gfV0sXG4gICAgICBbJ0czMzI2MCcsIHsgJ3VnbCc6IHsgJzMzMjYnOiAndWdsLTMzMjYnIH0gfV0sXG4gICAgICBbJ0g3MjI1OmInLCB7ICd1aGwnOiB7ICc3MjI1JzogJ3VobC03MjI1JyB9IH1dLFxuICAgICAgWycnLCB7fV0sXG4gICAgICBbJ2InLCB7fV0sXG4gICAgICBbbnVsbCwge31dLFxuICAgIF07XG5cbiAgICBmb3IgKGxldCB0ZXN0IG9mIHN0cm9uZ3NUZXN0cykge1xuICAgICAgY29uc3Qgc3Ryb25ncyA9IHRlc3RbMF07XG4gICAgICBjb25zdCBleHBlY3RlZFJlc3VsdHMgPSB0ZXN0WzFdO1xuXG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCB3aXRoIFwiJyArIHN0cm9uZ3MgKyAnXCInLCAoKSA9PiB7XG4gICAgICAgIC8vd2hlblxuICAgICAgICBjb25zdCByZXN1bHRzID0gbGV4aWNvbkhlbHBlcnMubG9va3VwU3Ryb25nc051bWJlcnMoc3Ryb25ncywgKGxleGljb25JZCwgZW50cnlJZCkgPT4gKGdldExleGljb25EYXRhKGxleGljb25JZCwgZW50cnlJZCkpKTtcblxuICAgICAgICAvLyB0aGVuXG4gICAgICAgIGV4cGVjdChyZXN1bHRzKS50b0VxdWFsKGV4cGVjdGVkUmVzdWx0cyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0ZXN0IHN0b25ncyBwYXJzaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0cm9uZ3NUZXN0cyA9IFtcbiAgICAgIFsnYjpINzIyNScsIFswLCA3MjI1XSwgWyd1aGwnLCAndWhsJ10sIDJdLFxuICAgICAgWydIMTIzOkg3MjI1JywgWzEyMywgNzIyNV0sIFsndWhsJywgJ3VobCddLCAyXSxcbiAgICAgIFsnYzpkOkgwNzc2JywgWzAsIDAsIDc3Nl0sIFsndWhsJywgJ3VobCcsICd1aGwnXSwgM10sXG4gICAgICBbJ0gxOTYxJywgWzE5NjFdLCBbJ3VobCddLCAxXSxcbiAgICAgIFsnSDU5MjFhJywgWzU5MjFdLCBbJ3VobCddLCAxXSxcbiAgICAgIFsnRzMzMjYwJywgWzMzMjZdLCBbJ3VnbCddLCAxXSxcbiAgICAgIFsnJywgW10sIFtdLCAwXSxcbiAgICAgIFsnYicsIFswXSwgWyd1aGwnXSwgMV0sXG4gICAgICBbbnVsbCwgW10sIFtdLCAwXSxcbiAgICBdO1xuXG4gICAgZm9yIChsZXQgdGVzdCBvZiBzdHJvbmdzVGVzdHMpIHtcbiAgICAgIGNvbnN0IHN0cm9uZ3MgPSB0ZXN0WzBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRFbnRyeUlkcyA9IHRlc3RbMV07XG4gICAgICBjb25zdCBleHBlY3RlZExleGljb25JZCA9IHRlc3RbMl07XG4gICAgICBjb25zdCBleHBlY3RlZFBhcnRDb3VudCA9IHRlc3RbM107XG5cblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHdpdGggXCInICsgc3Ryb25ncyArICdcIicsICgpID0+IHtcbiAgICAgICAgLy93aGVuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBleHRyYWN0U3Ryb25ncyhzdHJvbmdzKTtcblxuICAgICAgICAvLyB0aGVuXG4gICAgICAgIGV4cGVjdChyZXN1bHRzLmVudHJ5SWRzKS50b0VxdWFsKGV4cGVjdGVkRW50cnlJZHMpO1xuICAgICAgICBleHBlY3QocmVzdWx0cy5sZXhpY29uSWRzKS50b0VxdWFsKGV4cGVjdGVkTGV4aWNvbklkKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdHMucGFydHMubGVuZ3RoKS50b0VxdWFsKGV4cGVjdGVkUGFydENvdW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIGRlc2NyaWJlKCd0ZXN0IHdvcmQgcGFyc2luZycsICgpID0+IHtcbiAgICBjb25zdCB3b3JkVGVzdHMgPSBbXG4gICAgICBbJ9eR1rzWsOKAi9eo1rXXkNep14HWtNaW15nXqicsIFsn15HWvNawJywgJ9eo1rXXkNep14HWtNaW15nXqiddXSxcbiAgICAgIFsn15HWvNa416jWuNaj15AnLCBbJ9eR1rzWuNeo1rjWo9eQJ11dLFxuICAgICAgWyfXlNa34oCL16nXgda81rjXnta31pbXmda0150nLCBbJ9eU1rcnLCAn16nXgda81rjXnta31pbXmda0150nXV0sXG4gICAgICBbJ9eV1rDigIvXkNa11qXXqicsIFsn15XWsCcsICfXkNa11qXXqiddXSxcbiAgICAgIFsn15XWsOKAi9eU1rjigIvXkNa41pfXqNa216UnLCBbJ9eV1rAnLCAn15TWuCcsICfXkNa41pfXqNa216UnXV0sXG4gICAgICBbJ9eX1rLXm9a4157WttaR15nigIvXlNa4JywgWyfXl9ay15vWuNee1rbWkdeZJywgJ9eU1rgnXV0sIC8vIGdlbiA0MTo4XG4gICAgICBbJ+G8uM6szrrPic6yzr/PgicsIFsn4by4zqzOus+JzrLOv8+CJ11dLFxuICAgIF07XG5cbiAgICBmb3IgKGxldCB0ZXN0IG9mIHdvcmRUZXN0cykge1xuICAgICAgY29uc3Qgd29yZCA9IHRlc3RbMF07XG4gICAgICBjb25zdCBleHBlY3RlZFBhcnRzID0gdGVzdFsxXTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHdpdGggXCInICsgd29yZCArICdcIicsICgpID0+IHtcbiAgICAgICAgLy93aGVuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBsZXhpY29uSGVscGVycy5nZXRXb3JkUGFydHMod29yZCk7XG5cbiAgICAgICAgLy8gdGhlblxuICAgICAgICBleHBlY3QocmVzdWx0cykudG9FcXVhbChleHBlY3RlZFBhcnRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1VIQiB0ZXN0cycsICgpID0+IHtcbiAgICBkZXNjcmliZS5za2lwKCdjb25zaXN0ZW5jeSBjaGVjayBPVCcsICgpID0+IHtcbiAgICAgIGZvciAobGV0IGJvb2tJZCBvZiBPYmplY3Qua2V5cyhCSUJMRV9CT09LUy5vbGRUZXN0YW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IEJvb2tOYW1lID0gQklCTEVfQk9PS1Mub2xkVGVzdGFtZW50W2Jvb2tJZF07XG5cbiAgICAgICAgaXQoJ2NoZWNrICcgKyBCb29rTmFtZSwgKCkgPT4geyAvLyByZWFkcyBhbGwgdGhlIHdvcmRzIGZyb20gYm9vayBhbmQgc2F2ZXMgcGFyc2VkIHdvcmRzIHRvIGZpbGVcbiAgICAgICAgICBjb25zdCB3b3JkcyA9IHt9O1xuICAgICAgICAgIGNvbnN0IGJvb2tQYXRoID0gcGF0aC5qb2luKE9UX1BBVEgsIGJvb2tJZCk7XG4gICAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhib29rUGF0aCk7XG5cbiAgICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFwdGVyID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGJvb2tQYXRoLCBmaWxlKSwgJ3V0ZjgnKSk7XG4gICAgICAgICAgICBjb25zdCBjUmVmID0gYm9va0lkICsgJy0nICsgZmlsZS5zcGxpdCgnLicpWzBdICsgJzonO1xuICAgICAgICAgICAgY29uc3QgdmVyc2VzID0gT2JqZWN0LmtleXMoY2hhcHRlcik7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHZlcnNlTnVtIG9mIHZlcnNlcykge1xuICAgICAgICAgICAgICBjb25zdCB2ZXJzZSA9IGNoYXB0ZXJbdmVyc2VOdW1dO1xuICAgICAgICAgICAgICBjb25zdCBvYmplY3RzID0gdmVyc2UudmVyc2VPYmplY3RzO1xuICAgICAgICAgICAgICBjb25zdCB2UmVmID0gY1JlZiArIHZlcnNlTnVtO1xuICAgICAgICAgICAgICBnZXRXb3JkcyhvYmplY3RzLCB3b3JkcywgdlJlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IG91dHB1dCA9ICcnO1xuICAgICAgICAgIGxldCBhbm9tYWxsaWVzID0gJyc7XG4gICAgICAgICAgbGV0IG1pc3NpbmdNb3JwaHMgPSAwO1xuICAgICAgICAgIGxldCBpbnZhbGlkU3Ryb25nc0NvdW50ID0gMDtcbiAgICAgICAgICBsZXQgaW52YWxpZE1vcnBoQ291bnQgPSAwO1xuICAgICAgICAgIGNvbnN0IHdvcmRFbnRyaWVzID0gT2JqZWN0LmtleXMod29yZHMpLnNvcnQoKTtcblxuICAgICAgICAgIGZvciAobGV0IHdvcmRJbmRleCBvZiB3b3JkRW50cmllcykge1xuICAgICAgICAgICAgY29uc3Qgd29yZCA9IHdvcmRzW3dvcmRJbmRleF07XG4gICAgICAgICAgICBjb25zdCBtb3JwaCA9IHdvcmQud29yZC5tb3JwaDtcbiAgICAgICAgICAgIGNvbnN0IHN0cm9uZ3MgPSB3b3JkLndvcmQuc3Ryb25nO1xuICAgICAgICAgICAgY29uc3QgbW9ycGhLZXlzID0gbGV4aWNvbkhlbHBlcnMuZ2V0TW9ycGhLZXlzKG1vcnBoKTtcbiAgICAgICAgICAgIGNvbnN0IHdvcmRQYXJ0cyA9IGxleGljb25IZWxwZXJzLmdldFdvcmRQYXJ0cyh3b3JkLndvcmQudGV4dCk7XG4gICAgICAgICAgICB3b3JkLndvcmRQYXJ0cyA9IHdvcmRQYXJ0cztcblxuICAgICAgICAgICAgaWYgKCFzdHJvbmdzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHdhcm5pbmcgPSAnTWlzc2luZyBzdHJvbmdzOiAnICsgSlNPTi5zdHJpbmdpZnkod29yZCk7XG4gICAgICAgICAgICAgIGFub21hbGxpZXMgKz0gd2FybmluZyArICdcXG4nO1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCB2YWxpZCA9IGxleGljb25IZWxwZXJzLmNvbnRhaW5zVmFsaWRTdHJvbmdzTnVtYmVyKHN0cm9uZ3MpO1xuXG4gICAgICAgICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3YXJuaW5nID0gJ01pc3Npbmcgc3Ryb25ncyBOdW1iZXI6ICcgKyBKU09OLnN0cmluZ2lmeSh3b3JkKTtcbiAgICAgICAgICAgICAgICBhbm9tYWxsaWVzICs9IHdhcm5pbmcgKyAnXFxuJztcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFtb3JwaEtleXNbMF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGlmICgrK21pc3NpbmdNb3JwaHMgPCAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaXNzaW5nIG1vcnBoIGVudHJ5OiAnICsgSlNPTi5zdHJpbmdpZnkod29yZCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBzdHJvbmdzUGFydHMgPSBsZXhpY29uSGVscGVycy5nZXRTdHJvbmdzUGFydHMoc3Ryb25ncyk7XG5cbiAgICAgICAgICAgICAgaWYgKHN0cm9uZ3NQYXJ0cy5sZW5ndGggIT09IG1vcnBoS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgbW9ycGhMZW4gPSBtb3JwaEtleXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKChzdHJvbmdzUGFydHMubGVuZ3RoICsgMSA9PT0gbW9ycGhMZW4pICYmIChtb3JwaEtleXMubGVuZ3RoICYmIG1vcnBoS2V5c1ttb3JwaEtleXMubGVuZ3RoIC0gMV1bMF0gPT09ICdzdWZmaXgnKSkgeyAvLyBhZGQgZXhjZXB0aW9uIGZvciBzdWZmaXhcbiAgICAgICAgICAgICAgICAgIG1vcnBoTGVuLS07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHN0cm9uZ3NQYXJ0cy5sZW5ndGggIT09IG1vcnBoTGVuKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB3YXJuaW5nID0gJ251bWJlciBvZiBzdHJvbmdzIHBhcnRzICcgKyBzdHJvbmdzUGFydHMubGVuZ3RoICsgJyBkaWZmZXJlbnQgdGhhbiBudW1iZXIgb2YgbW9ycGggcGFydHMgJyArIG1vcnBoS2V5cy5sZW5ndGggKyAnIDogJyArIEpTT04uc3RyaW5naWZ5KHdvcmQpO1xuICAgICAgICAgICAgICAgICAgYW5vbWFsbGllcyArPSB3YXJuaW5nICsgJ1xcbic7XG5cbiAgICAgICAgICAgICAgICAgIGlmICgrK2ludmFsaWRTdHJvbmdzQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAod29yZFBhcnRzLmxlbmd0aCAhPT0gbW9ycGhLZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBtb3JwaExlbiA9IG1vcnBoS2V5cy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAoKHdvcmRQYXJ0cy5sZW5ndGggKyAxID09PSBtb3JwaExlbikgJiYgKG1vcnBoS2V5cy5sZW5ndGggJiYgbW9ycGhLZXlzW21vcnBoS2V5cy5sZW5ndGggLSAxXVswXSA9PT0gJ3N1ZmZpeCcpKSB7IC8vIGFkZCBleGNlcHRpb24gZm9yIHN1ZmZpeFxuICAgICAgICAgICAgICAgICAgbW9ycGhMZW4tLTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAod29yZFBhcnRzLmxlbmd0aCAhPT0gbW9ycGhMZW4pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHdhcm5pbmcgPSAnbnVtYmVyIG9mIHdvcmQgcGFydHMgJyArIHdvcmRQYXJ0cy5sZW5ndGggKyAnIGRpZmZlcmVudCB0aGFuIG51bWJlciBvZiBtb3JwaCBwYXJ0cyAnICsgbW9ycGhLZXlzLmxlbmd0aCArICcgOiAnICsgSlNPTi5zdHJpbmdpZnkod29yZCk7XG4gICAgICAgICAgICAgICAgICBhbm9tYWxsaWVzICs9IHdhcm5pbmcgKyAnXFxuJztcblxuICAgICAgICAgICAgICAgICAgaWYgKCsraW52YWxpZE1vcnBoQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdvcmQubW9ycGhLZXlzID0gbW9ycGhLZXlzO1xuXG4gICAgICAgICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgICAgICAgIG91dHB1dCArPSAnLFxcbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXQgKz0gJyAgXCInICsgd29yZEluZGV4ICsgJ1wiOiAnICsgSlNPTi5zdHJpbmdpZnkod29yZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLVxcbmluICcgKyBCb29rTmFtZSArICc6XFxubnVtYmVyIG9mIHVuaXF1ZSB3b3JkczogJyArIHdvcmRFbnRyaWVzLmxlbmd0aCk7XG5cbiAgICAgICAgICBpZiAobWlzc2luZ01vcnBocykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdtaXNzaW5nTW9ycGhzOiAnICsgbWlzc2luZ01vcnBocyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGludmFsaWRTdHJvbmdzQ291bnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignaW5jb25zaXN0YW50IFN0cm9uZ3MgQ291bnQ6ICcgKyBpbnZhbGlkU3Ryb25nc0NvdW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaW52YWxpZE1vcnBoQ291bnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignaW5jb25zaXN0YW50IE1vcnBoIENvdW50OiAnICsgaW52YWxpZE1vcnBoQ291bnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhbm9tYWxsaWVzKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ2Fub21hbGxpZXM6XFxuJyArIGFub21hbGxpZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXRwdXQgPSAne1xcbicgKyBvdXRwdXQgKyAnXFxufVxcbic7XG4gICAgICAgICAgY29uc3Qgb3V0RmlsZSA9IHBhdGguam9pbihvdXRwdXRGb2xkZXIsIGJvb2tJZCArICctd29yZC1jaGVja3MuanNvbicpO1xuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMob3V0RmlsZSwgb3V0cHV0LCB7IGVuY29kaW5nOiAndXRmOCcgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn0pO1xuXG4vL1xuLy8gaGVscGVyc1xuLy9cblxuZnVuY3Rpb24gZXh0cmFjdFN0cm9uZ3Moc3Ryb25ncykge1xuICBjb25zdCBwYXJ0cyA9IGxleGljb25IZWxwZXJzLmdldFN0cm9uZ3NQYXJ0cyhzdHJvbmdzKTtcbiAgY29uc3QgbGV4aWNvbklkcyA9IFtdO1xuICBjb25zdCBlbnRyeUlkcyA9IFtdO1xuXG4gIGZvciAobGV0IGZvdW5kIG9mIHBhcnRzKSB7XG4gICAgY29uc3QgbGV4aWNvbklkID0gbGV4aWNvbkhlbHBlcnMubGV4aWNvbklkRnJvbVN0cm9uZ3MoZm91bmQpO1xuICAgIGxleGljb25JZHMucHVzaChsZXhpY29uSWQpO1xuICAgIGNvbnN0IGVudHJ5SWQgPSBsZXhpY29uSGVscGVycy5sZXhpY29uRW50cnlJZEZyb21TdHJvbmdzKGZvdW5kKTtcbiAgICBlbnRyeUlkcy5wdXNoKGVudHJ5SWQpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZW50cnlJZHMsIGxleGljb25JZHMsIHBhcnRzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRXb3JkcyhvYmplY3RzLCB3b3JkcywgcmVmKSB7XG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBvYmplY3RzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3Qgb2JqZWN0ID0gb2JqZWN0c1tpXTtcblxuICAgIGlmICgob2JqZWN0LnR5cGUgPT09ICd3b3JkJykgJiYgb2JqZWN0LnRleHQgJiYgIXdvcmRzW29iamVjdC50ZXh0XSkge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgd29yZDogb2JqZWN0LFxuICAgICAgICByZWY6IHJlZiArICcuJyArIGksXG4gICAgICB9O1xuICAgICAgd29yZHNbb2JqZWN0LnRleHRdID0gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAob2JqZWN0LmNoaWxkcmVuKSB7XG4gICAgICBnZXRXb3JkcyhvYmplY3QuY2hpbGRyZW4sIHdvcmRzLCByZWYgKyAnLicgKyBpKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TGV4aWNvbkRhdGEobGV4aWNvbklkLCBlbnRyeUlkKSB7XG4gIHJldHVybiB7IFtsZXhpY29uSWRdOiB7IFtlbnRyeUlkXTogbGV4aWNvbklkICsgJy0nICsgZW50cnlJZCB9IH07XG59XG4iXX0=