tc-ui-toolkit
Version:
React components used to develop tools for the desktop app translationCore
604 lines (550 loc) • 50.7 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.readJSON = exports.readUSFM = void 0;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _react = _interopRequireDefault(require("react"));
var _deepEqual = _interopRequireDefault(require("deep-equal"));
var verseHelpers = _interopRequireWildcard(require("../verseHelpers"));
function createMarker(verse) {
return {
type: 'verse',
text: verse + ''
};
}
describe('verseHelpers.getVerseData', function () {
it('test multiple cases without verse spans in data', function () {
var chapter1 = {
'1': 'v1-Content',
'2': 'v2-Content',
'3': 'v3-Content',
'4': 'v4-Content',
'5': 'v5-Content'
};
var bibleData = {
'1': chapter1
};
var tests = [{
chapter: 1,
verse: 2,
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-Content',
'type': 'text'
}]
},
'verseLabel': '2'
}
}, {
chapter: '1',
verse: '2',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-Content',
'type': 'text'
}]
},
'verseLabel': '2'
}
}, {
chapter: '1',
verse: '2-3',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-Content',
'type': 'text'
}, {
'text': '3',
'type': 'verse'
}, {
'text': 'v3-Content',
'type': 'text'
}]
},
'verseLabel': '2'
}
}, {
chapter: '1',
verse: '2,3',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-Content',
'type': 'text'
}, {
'text': '3',
'type': 'verse'
}, {
'text': 'v3-Content',
'type': 'text'
}]
},
'verseLabel': '2'
}
}, {
chapter: '1',
verse: '2-3,5',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-Content',
'type': 'text'
}, {
'text': '3',
'type': 'verse'
}, {
'text': 'v3-Content',
'type': 'text'
}, {
'text': '5',
'type': 'verse'
}, {
'text': 'v5-Content',
'type': 'text'
}]
},
'verseLabel': '2'
}
}, {
chapter: '1',
verse: '2,4-5',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-Content',
'type': 'text'
}, {
'text': '4',
'type': 'verse'
}, {
'text': 'v4-Content',
'type': 'text'
}, {
'text': '5',
'type': 'verse'
}, {
'text': 'v5-Content',
'type': 'text'
}]
},
'verseLabel': '2'
}
}];
for (var _i = 0, _tests = tests; _i < _tests.length; _i++) {
var test = _tests[_i];
var chapter = test.chapter,
verse = test.verse,
expected = test.expected;
var results = verseHelpers.getVerseData(bibleData, chapter, verse, createMarker);
var results_ = {
verseData: results.verseData,
verseLabel: results.verseLabel
};
if (!(0, _deepEqual["default"])(results_, expected)) {
console.log("compare failed for ".concat(chapter, ":").concat(verse));
expect(results).toEqual(expected);
}
}
});
it('test multiple cases with verse spans in data', function () {
var chapter1 = {
'1': 'v1-Content',
'2-3': 'v2-3-Content',
'4': 'v4-Content',
'5': 'v5-Content'
};
var bibleData = {
'1': chapter1
};
var tests = [{
chapter: 1,
verse: 1,
expected: {
'verseData': {
'verseObjects': [{
'text': 'v1-Content',
'type': 'text'
}]
},
'verseLabel': '1'
}
}, {
chapter: '1',
verse: '2',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-3-Content',
'type': 'text'
}]
},
'verseLabel': '2-3'
}
}, {
chapter: '1',
verse: '2-3',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-3-Content',
'type': 'text'
}]
},
'verseLabel': '2-3'
}
}, {
chapter: '1',
verse: '2,3',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-3-Content',
'type': 'text'
}]
},
'verseLabel': '2-3'
}
}, {
chapter: '1',
verse: '2-3,5',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-3-Content',
'type': 'text'
}, {
'text': '5',
'type': 'verse'
}, {
'text': 'v5-Content',
'type': 'text'
}]
},
'verseLabel': '2-3'
}
}, {
chapter: '1',
verse: '2,4-5',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-3-Content',
'type': 'text'
}, {
'text': '4',
'type': 'verse'
}, {
'text': 'v4-Content',
'type': 'text'
}, {
'text': '5',
'type': 'verse'
}, {
'text': 'v5-Content',
'type': 'text'
}]
},
'verseLabel': '2-3'
}
}, {
chapter: '1',
verse: '2,3,4,5',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-3-Content',
'type': 'text'
}, {
'text': '4',
'type': 'verse'
}, {
'text': 'v4-Content',
'type': 'text'
}, {
'text': '5',
'type': 'verse'
}, {
'text': 'v5-Content',
'type': 'text'
}]
},
'verseLabel': '2-3'
}
}, {
chapter: '1',
verse: '2-5',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v2-3-Content',
'type': 'text'
}, {
'text': '4',
'type': 'verse'
}, {
'text': 'v4-Content',
'type': 'text'
}, {
'text': '5',
'type': 'verse'
}, {
'text': 'v5-Content',
'type': 'text'
}]
},
'verseLabel': '2-3'
}
}, {
chapter: '1',
verse: '1-4',
expected: {
'verseData': {
'verseObjects': [{
'text': 'v1-Content',
'type': 'text'
}, {
'text': '2-3',
'type': 'verse'
}, {
'text': 'v2-3-Content',
'type': 'text'
}, {
'text': '4',
'type': 'verse'
}, {
'text': 'v4-Content',
'type': 'text'
}]
},
'verseLabel': '1'
}
}];
for (var _i2 = 0, _tests2 = tests; _i2 < _tests2.length; _i2++) {
var test = _tests2[_i2];
var chapter = test.chapter,
verse = test.verse,
expected = test.expected;
var results = verseHelpers.getVerseData(bibleData, chapter, verse, createMarker);
var results_ = {
verseData: results.verseData,
verseLabel: results.verseLabel
};
if (!(0, _deepEqual["default"])(results_, expected)) {
console.log("compare failed for ".concat(chapter, ":").concat(verse));
expect(results).toEqual(expected);
}
}
});
});
describe('verseHelpers.verseArray', function () {
it('should succeed with heb-12-27.el-x-koine', function () {
generateTest('heb-12-27.el-x-koine', 'ugnt');
});
it('should succeed with heb-12-27.el-x-koine and tisch should not be clickable', function () {
generateTest('heb-12-27.el-x-koine', 'tisch');
});
it('should succeed with mat-4-6', function () {
generateTest('mat-4-6', 'ult');
});
it('should succeed with luke-22-30.ult', function () {
var contextId = {
'reference': {
'bookId': 'luk',
'chapter': 22,
'verse': 30
},
'tool': 'translationWords',
'groupId': '12tribesofisrael',
'quote': [{
'word': 'δώδεκα',
'occurrence': 1
}, {
'word': 'φυλὰς',
'occurrence': 1
}, {
'word': 'κρίνοντες',
'occurrence': 1
}, {
'word': 'τοῦ',
'occurrence': 1
}, {
'word': 'Ἰσραήλ',
'occurrence': 1
}],
'strong': ['G14270', 'G54430', 'G29190', 'G35880', 'G24740'],
'occurrence': 1
};
generateTest('luke-22-30.ult', 'ult', contextId);
});
it('should succeed with jhn-6-21-en-t4t', function () {
generateTest('jhn-6-21-en-t4t', 't4t');
});
});
describe('verseHelpers.isVerseInSpan', function () {
it('should return false if verseLabel not span', function () {
// given
var verseLabel = '1';
var verse = '1';
var expect_isVerseSpan = false; // when
var results = verseHelpers.isVerseInSpan(verseLabel, verse); // then
expect(results.isVerseSpan).toEqual(expect_isVerseSpan);
});
it('should return false if verseLabel number', function () {
// given
var verseLabel = 1;
var verse = '1';
var expect_isVerseSpan = false; // when
var results = verseHelpers.isVerseInSpan(verseLabel, verse); // then
expect(results.isVerseSpan).toEqual(expect_isVerseSpan);
});
it('should return false if verseLabel other text', function () {
// given
var verseLabel = 'front';
var verse = '1';
var expect_isVerseSpan = false; // when
var results = verseHelpers.isVerseInSpan(verseLabel, verse); // then
expect(results.isVerseSpan).toEqual(expect_isVerseSpan);
});
it('should return true if verseLabel span and verse is number', function () {
// given
var verseLabel = '1-2';
var verse = 1;
var expect_isVerseSpan = true;
var expect_isFirstVerse = true; // when
var results = verseHelpers.isVerseInSpan(verseLabel, verse); // then
expect(results.isVerseSpan).toEqual(expect_isVerseSpan);
expect(results.isFirstVerse).toEqual(expect_isFirstVerse);
});
it('should return true if verseLabel span and verse is number', function () {
// given
var verseLabel = '1-2';
var verse = '1';
var expect_isVerseSpan = true;
var expect_isFirstVerse = true; // when
var results = verseHelpers.isVerseInSpan(verseLabel, verse); // then
expect(results.isVerseSpan).toEqual(expect_isVerseSpan);
expect(results.isFirstVerse).toEqual(expect_isFirstVerse);
});
it('should return true if verseLabel span and verse is not first', function () {
// given
var verseLabel = '1-2';
var verse = '2';
var expect_isVerseSpan = true;
var expect_isFirstVerse = false; // when
var results = verseHelpers.isVerseInSpan(verseLabel, verse); // then
expect(results.isVerseSpan).toEqual(expect_isVerseSpan);
expect(results.isFirstVerse).toEqual(expect_isFirstVerse);
});
});
describe('verseHelpers.getVerseSpanRange', function () {
it('should return no range if single verse', function () {
// given
var verseIndex = '1';
var expect_range = {}; // when
var results = verseHelpers.getVerseSpanRange(verseIndex); // then
expect(results).toEqual(expect_range);
});
it('should return no range if not verse', function () {
// given
var verseIndex = 'front';
var expect_range = {}; // when
var results = verseHelpers.getVerseSpanRange(verseIndex); // then
expect(results).toEqual(expect_range);
});
it('should return no range if incomplete', function () {
// given
var verseIndex = '1-';
var expect_range = {}; // when
var results = verseHelpers.getVerseSpanRange(verseIndex); // then
expect(results).toEqual(expect_range);
});
it('should return no range if incomplete #2', function () {
// given
var verseIndex = '-2';
var expect_range = {}; // when
var results = verseHelpers.getVerseSpanRange(verseIndex); // then
expect(results).toEqual(expect_range);
});
it('should return range', function () {
// given
var verseIndex = '5-10';
var expect_range = {
low: 5,
high: 10
}; // when
var results = verseHelpers.getVerseSpanRange(verseIndex); // then
expect(results).toEqual(expect_range);
});
});
describe('verseHelpers.createVerseMarker', function () {
it('should succeed with string verse', function () {
// given
var verse = '1';
var expected_html = /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement("b", null, verse), " ");
var expected_results = {
html: expected_html,
type: 'html',
text: ''
}; // when
var results = verseHelpers.createVerseMarker(verse); // then
expect(results).toEqual(expected_results);
});
it('should succeed with numerical verse', function () {
// given
var verse = 1;
var expected_html = /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement("b", null, verse), " ");
var expected_results = {
html: expected_html,
type: 'html',
text: ''
}; // when
var results = verseHelpers.createVerseMarker(verse); // then
expect(results).toEqual(expected_results);
});
}); //
// helpers
//
/**
* Reads a usfm file from the resources dir
* @param {string} filePath relative path to usfm file
* @return {string} sdv
*/
var readUSFM = function readUSFM(filePath) {
var fullPath = _path["default"].join('./src/ScripturePane/helpers/__test__/fixtures', filePath);
console.log(_path["default"].resolve(fullPath));
return _fs["default"].readFileSync(fullPath, 'UTF-8').toString();
};
/**
* Reads a json file from the resources dir
* @param {string} filePath relative path to json file
* @return {object} json object
*/
exports.readUSFM = readUSFM;
var readJSON = function readJSON(filePath) {
return JSON.parse(readUSFM(filePath));
};
/**
* Generator for testing json to usfm migration
* @param {string} name - the name of the test files to use. e.g. `valid` will test `valid.usfm` to `valid.json`
* @param {string} bibleId
* @param {Object} contextId
*/
exports.readJSON = readJSON;
var generateTest = function generateTest(name, bibleId) {
var contextId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
var input = readJSON("".concat(name, ".json"));
contextId = contextId || name;
expect(input).toBeTruthy(); // const expectedBaseName = expectedName ? expectedName : name;
// const expected = readUSFM(`${expectedBaseName}.usfm`);
// expect(expected).toBeTruthy();
var output = verseHelpers.verseArray(input, bibleId, contextId);
expect(output).toMatchSnapshot();
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9TY3JpcHR1cmVQYW5lL2hlbHBlcnMvX190ZXN0X18vdmVyc2VIZWxwZXJzLnRlc3QuanMiXSwibmFtZXMiOlsiY3JlYXRlTWFya2VyIiwidmVyc2UiLCJ0eXBlIiwidGV4dCIsImRlc2NyaWJlIiwiaXQiLCJjaGFwdGVyMSIsImJpYmxlRGF0YSIsInRlc3RzIiwiY2hhcHRlciIsImV4cGVjdGVkIiwidGVzdCIsInJlc3VsdHMiLCJ2ZXJzZUhlbHBlcnMiLCJnZXRWZXJzZURhdGEiLCJyZXN1bHRzXyIsInZlcnNlRGF0YSIsInZlcnNlTGFiZWwiLCJjb25zb2xlIiwibG9nIiwiZXhwZWN0IiwidG9FcXVhbCIsImdlbmVyYXRlVGVzdCIsImNvbnRleHRJZCIsImV4cGVjdF9pc1ZlcnNlU3BhbiIsImlzVmVyc2VJblNwYW4iLCJpc1ZlcnNlU3BhbiIsImV4cGVjdF9pc0ZpcnN0VmVyc2UiLCJpc0ZpcnN0VmVyc2UiLCJ2ZXJzZUluZGV4IiwiZXhwZWN0X3JhbmdlIiwiZ2V0VmVyc2VTcGFuUmFuZ2UiLCJsb3ciLCJoaWdoIiwiZXhwZWN0ZWRfaHRtbCIsImV4cGVjdGVkX3Jlc3VsdHMiLCJodG1sIiwiY3JlYXRlVmVyc2VNYXJrZXIiLCJyZWFkVVNGTSIsImZpbGVQYXRoIiwiZnVsbFBhdGgiLCJwYXRoIiwiam9pbiIsInJlc29sdmUiLCJmcyIsInJlYWRGaWxlU3luYyIsInRvU3RyaW5nIiwicmVhZEpTT04iLCJKU09OIiwicGFyc2UiLCJuYW1lIiwiYmlibGVJZCIsImlucHV0IiwidG9CZVRydXRoeSIsIm91dHB1dCIsInZlcnNlQXJyYXkiLCJ0b01hdGNoU25hcHNob3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsU0FBU0EsWUFBVCxDQUFzQkMsS0FBdEIsRUFBNkI7QUFDM0IsU0FBTztBQUNMQyxJQUFBQSxJQUFJLEVBQUUsT0FERDtBQUVMQyxJQUFBQSxJQUFJ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TSxRQUFuQyxFQUFQO0FBQ0QsQ0FKTTtBQU1QOzs7Ozs7Ozs7QUFLTyxJQUFNQyxRQUFRLEdBQUcsU0FBWEEsUUFBVyxDQUFBUixRQUFRO0FBQUEsU0FBSVMsSUFBSSxDQUFDQyxLQUFMLENBQVdYLFFBQVEsQ0FBQ0MsUUFBRCxDQUFuQixDQUFKO0FBQUEsQ0FBekI7QUFFUDs7Ozs7Ozs7OztBQU1BLElBQU1qQixZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDNEIsSUFBRCxFQUFPQyxPQUFQLEVBQWlDO0FBQUEsTUFBakI1QixTQUFpQix1RUFBUCxFQUFPO0FBQ3BELE1BQU02QixLQUFLLEdBQUdMLFFBQVEsV0FBSUcsSUFBSixXQUF0QjtBQUNBM0IsRUFBQUEsU0FBUyxHQUFHQSxTQUFTLElBQUkyQixJQUF6QjtBQUNBOUIsRUFBQUEsTUFBTSxDQUFDZ0MsS0FBRCxDQUFOLENBQWNDLFVBQWQsR0FIb0QsQ0FJcEQ7QUFDQTtBQUNBOztBQUNBLE1BQU1DLE1BQU0sR0FBR3pDLFlBQVksQ0FBQzBDLFVBQWIsQ0FBd0JILEtBQXhCLEVBQStCRCxPQUEvQixFQUF3QzVCLFNBQXhDLENBQWY7QUFDQUgsRUFBQUEsTUFBTSxDQUFDa0MsTUFBRCxDQUFOLENBQWVFLGVBQWY7QUFDRCxDQVREIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2RlZXAtZXF1YWwnO1xuaW1wb3J0ICogYXMgdmVyc2VIZWxwZXJzIGZyb20gJy4uL3ZlcnNlSGVscGVycyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hcmtlcih2ZXJzZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd2ZXJzZScsXG4gICAgdGV4dDogdmVyc2UgKyAnJyxcbiAgfTtcbn1cblxuZGVzY3JpYmUoJ3ZlcnNlSGVscGVycy5nZXRWZXJzZURhdGEnLCAoKSA9PiB7XG4gIGl0KCd0ZXN0IG11bHRpcGxlIGNhc2VzIHdpdGhvdXQgdmVyc2Ugc3BhbnMgaW4gZGF0YScsICgpID0+IHtcbiAgICBjb25zdCBjaGFwdGVyMSA9IHtcbiAgICAgICcxJzogJ3YxLUNvbnRlbnQnLFxuICAgICAgJzInOiAndjItQ29udGVudCcsXG4gICAgICAnMyc6ICd2My1Db250ZW50JyxcbiAgICAgICc0JzogJ3Y0LUNvbnRlbnQnLFxuICAgICAgJzUnOiAndjUtQ29udGVudCcsXG4gICAgfTtcbiAgICBjb25zdCBiaWJsZURhdGEgPSB7ICcxJzogY2hhcHRlcjEgfTtcbiAgICBjb25zdCB0ZXN0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgY2hhcHRlcjogMSwgdmVyc2U6IDIsIGV4cGVjdGVkOiB7ICd2ZXJzZURhdGEnOiB7ICd2ZXJzZU9iamVjdHMnOiBbeyAndGV4dCc6ICd2Mi1Db250ZW50JywgJ3R5cGUnOiAndGV4dCcgfV0gfSwgJ3ZlcnNlTGFiZWwnOiAnMicgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNoYXB0ZXI6ICcxJywgdmVyc2U6ICcyJywgZXhwZWN0ZWQ6IHsgJ3ZlcnNlRGF0YSc6IHsgJ3ZlcnNlT2JqZWN0cyc6IFt7ICd0ZXh0JzogJ3YyLUNvbnRlbnQnLCAndHlwZSc6ICd0ZXh0JyB9XSB9LCAndmVyc2VMYWJlbCc6ICcyJyB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2hhcHRlcjogJzEnLCB2ZXJzZTogJzItMycsIGV4cGVjdGVkOiB7ICd2ZXJzZURhdGEnOiB7ICd2ZXJzZU9iamVjdHMnOiBbeyAndGV4dCc6ICd2Mi1Db250ZW50JywgJ3R5cGUnOiAndGV4dCcgfSwgeyAndGV4dCc6ICczJywgJ3R5cGUnOiAndmVyc2UnIH0sIHsgJ3RleHQnOiAndjMtQ29udGVudCcsICd0eXBlJzogJ3RleHQnIH1dIH0sICd2ZXJzZUxhYmVsJzogJzInIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjaGFwdGVyOiAnMScsIHZlcnNlOiAnMiwzJywgZXhwZWN0ZWQ6IHsgJ3ZlcnNlRGF0YSc6IHsgJ3ZlcnNlT2JqZWN0cyc6IFt7ICd0ZXh0JzogJ3YyLUNvbnRlbnQnLCAndHlwZSc6ICd0ZXh0JyB9LCB7ICd0ZXh0JzogJzMnLCAndHlwZSc6ICd2ZXJzZScgfSwgeyAndGV4dCc6ICd2My1Db250ZW50JywgJ3R5cGUnOiAndGV4dCcgfV0gfSwgJ3ZlcnNlTGFiZWwnOiAnMicgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNoYXB0ZXI6ICcxJywgdmVyc2U6ICcyLTMsNScsIGV4cGVjdGVkOiB7ICd2ZXJzZURhdGEnOiB7ICd2ZXJzZU9iamVjdHMnOiBbeyAndGV4dCc6ICd2Mi1Db250ZW50JywgJ3R5cGUnOiAndGV4dCcgfSwgeyAndGV4dCc6ICczJywgJ3R5cGUnOiAndmVyc2UnIH0sIHsgJ3RleHQnOiAndjMtQ29udGVudCcsICd0eXBlJzogJ3RleHQnIH0sIHsgJ3RleHQnOiAnNScsICd0eXBlJzogJ3ZlcnNlJyB9LCB7ICd0ZXh0JzogJ3Y1LUNvbnRlbnQnLCAndHlwZSc6ICd0ZXh0JyB9XSB9LCAndmVyc2VMYWJlbCc6ICcyJyB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2hhcHRlcjogJzEnLCB2ZXJzZTogJzIsNC01JywgZXhwZWN0ZWQ6IHsgJ3ZlcnNlRGF0YSc6IHsgJ3ZlcnNlT2JqZWN0cyc6IFt7ICd0ZXh0JzogJ3YyLUNvbnRlbnQnLCAndHlwZSc6ICd0ZXh0JyB9LCB7ICd0ZXh0JzogJzQnLCAndHlwZSc6ICd2ZXJzZScgfSwgeyAndGV4dCc6ICd2NC1Db250ZW50JywgJ3R5cGUnOiAndGV4dCcgfSwgeyAndGV4dCc6ICc1JywgJ3R5cGUnOiAndmVyc2UnIH0sIHsgJ3RleHQnOiAndjUtQ29udGVudCcsICd0eXBlJzogJ3RleHQnIH1dIH0sICd2ZXJzZUxhYmVsJzogJzInIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHRlc3Qgb2YgdGVzdHMpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIGNoYXB0ZXIsIHZlcnNlLCBleHBlY3RlZCxcbiAgICAgIH0gPSB0ZXN0O1xuICAgICAgY29uc3QgcmVzdWx0cyA9IHZlcnNlSGVscGVycy5nZXRWZXJzZURhdGEoYmlibGVEYXRhLCBjaGFwdGVyLCB2ZXJzZSwgY3JlYXRlTWFya2VyKTtcblxuICAgICAgY29uc3QgcmVzdWx0c18gPSB7IHZlcnNlRGF0YTogcmVzdWx0cy52ZXJzZURhdGEsIHZlcnNlTGFiZWw6IHJlc3VsdHMudmVyc2VMYWJlbCB9O1xuXG4gICAgICBpZiAoIWlzRXF1YWwocmVzdWx0c18sIGV4cGVjdGVkKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgY29tcGFyZSBmYWlsZWQgZm9yICR7Y2hhcHRlcn06JHt2ZXJzZX1gKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdHMpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3Rlc3QgbXVsdGlwbGUgY2FzZXMgd2l0aCB2ZXJzZSBzcGFucyBpbiBkYXRhJywgKCkgPT4ge1xuICAgIGNvbnN0IGNoYXB0ZXIxID0ge1xuICAgICAgJzEnOiAndjEtQ29udGVudCcsXG4gICAgICAnMi0zJzogJ3YyLTMtQ29udGVudCcsXG4gICAgICAnNCc6ICd2NC1Db250ZW50JyxcbiAgICAgICc1JzogJ3Y1LUNvbnRlbnQnLFxuICAgIH07XG4gICAgY29uc3QgYmlibGVEYXRhID0geyAnMSc6IGNoYXB0ZXIxIH07XG4gICAgY29uc3QgdGVzdHMgPSBbXG4gICAgICB7XG4gICAgICAgIGNoYXB0ZXI6IDEsIHZlcnNlOiAxLCBleHBlY3RlZDogeyAndmVyc2VEYXRhJzogeyAndmVyc2VPYmplY3RzJzogW3sgJ3RleHQnOiAndjEtQ29udGVudCcsICd0eXBlJzogJ3RleHQnIH1dIH0sICd2ZXJzZUxhYmVsJzogJzEnIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjaGFwdGVyOiAnMScsIHZlcnNlOiAnMicsIGV4cGVjdGVkOiB7ICd2ZXJzZURhdGEnOiB7ICd2ZXJzZU9iamVjdHMnOiBbeyAndGV4dCc6ICd2Mi0zLUNvbnRlbnQnLCAndHlwZSc6ICd0ZXh0JyB9XSB9LCAndmVyc2VMYWJlbCc6ICcyLTMnIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjaGFwdGVyOiAnMScsIHZlcnNlOiAnMi0zJywgZXhwZWN0ZWQ6IHsgJ3ZlcnNlRGF0YSc6IHsgJ3ZlcnNlT2JqZWN0cyc6IFt7ICd0ZXh0JzogJ3YyLTMtQ29udGVudCcsICd0eXBlJzogJ3RleHQnIH1dIH0sICd2ZXJzZUxhYmVsJzogJzItMycgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNoYXB0ZXI6ICcxJywgdmVyc2U6ICcyLDMnLCBleHBlY3RlZDogeyAndmVyc2VEYXRhJzogeyAndmVyc2VPYmplY3RzJzogW3sgJ3RleHQnOiAndjItMy1Db250ZW50JywgJ3R5cGUnOiAndGV4dCcgfV0gfSwgJ3ZlcnNlTGFiZWwnOiAnMi0zJyB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2hhcHRlcjogJzEnLCB2ZXJzZTogJzItMyw1JywgZXhwZWN0ZWQ6IHsgJ3ZlcnNlRGF0YSc6IHsgJ3ZlcnNlT2JqZWN0cyc6IFt7ICd0ZXh0JzogJ3YyLTMtQ29udGVudCcsICd0eXBlJzogJ3RleHQnIH0sIHsgJ3RleHQnOiAnNScsICd0eXBlJzogJ3ZlcnNlJyB9LCB7ICd0ZXh0JzogJ3Y1LUNvbnRlbnQnLCAndHlwZSc6ICd0ZXh0JyB9XSB9LCAndmVyc2VMYWJlbCc6ICcyLTMnIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjaGFwdGVyOiAnMScsIHZlcnNlOiAnMiw0LTUnLCBleHBlY3RlZDogeyAndmVyc2VEYXRhJzogeyAndmVyc2VPYmplY3RzJzogW3sgJ3RleHQnOiAndjItMy1Db250ZW50JywgJ3R5cGUnOiAndGV4dCcgfSwgeyAndGV4dCc6ICc0JywgJ3R5cGUnOiAndmVyc2UnIH0sIHsgJ3RleHQnOiAndjQtQ29udGVudCcsICd0eXBlJzogJ3RleHQnIH0sIHsgJ3RleHQnOiAnNScsICd0eXBlJzogJ3ZlcnNlJyB9LCB7ICd0ZXh0JzogJ3Y1LUNvbnRlbnQnLCAndHlwZSc6ICd0ZXh0JyB9XSB9LCAndmVyc2VMYWJlbCc6ICcyLTMnIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjaGFwdGVyOiAnMScsIHZlcnNlOiAnMiwzLDQsNScsIGV4cGVjdGVkOiB7ICd2ZXJzZURhdGEnOiB7ICd2ZXJzZU9iamVjdHMnOiBbeyAndGV4dCc6ICd2Mi0zLUNvbnRlbnQnLCAndHlwZSc6ICd0ZXh0JyB9LCB7ICd0ZXh0JzogJzQnLCAndHlwZSc6ICd2ZXJzZScgfSwgeyAndGV4dCc6ICd2NC1Db250ZW50JywgJ3R5cGUnOiAndGV4dCcgfSwgeyAndGV4dCc6ICc1JywgJ3R5cGUnOiAndmVyc2UnIH0sIHsgJ3RleHQnOiAndjUtQ29udGVudCcsICd0eXBlJzogJ3RleHQnIH1dIH0sICd2ZXJzZUxhYmVsJzogJzItMycgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNoYXB0ZXI6ICcxJywgdmVyc2U6ICcyLTUnLCBleHBlY3RlZDogeyAndmVyc2VEYXRhJzogeyAndmVyc2VPYmplY3RzJzogW3sgJ3RleHQnOiAndjItMy1Db250ZW50JywgJ3R5cGUnOiAndGV4dCcgfSwgeyAndGV4dCc6ICc0JywgJ3R5cGUnOiAndmVyc2UnIH0sIHsgJ3RleHQnOiAndjQtQ29udGVudCcsICd0eXBlJzogJ3RleHQnIH0sIHsgJ3RleHQnOiAnNScsICd0eXBlJzogJ3ZlcnNlJyB9LCB7ICd0ZXh0JzogJ3Y1LUNvbnRlbnQnLCAndHlwZSc6ICd0ZXh0JyB9XSB9LCAndmVyc2VMYWJlbCc6ICcyLTMnIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjaGFwdGVyOiAnMScsIHZlcnNlOiAnMS00JywgZXhwZWN0ZWQ6IHsgJ3ZlcnNlRGF0YSc6IHsgJ3ZlcnNlT2JqZWN0cyc6IFt7ICd0ZXh0JzogJ3YxLUNvbnRlbnQnLCAndHlwZSc6ICd0ZXh0JyB9LCB7ICd0ZXh0JzogJzItMycsICd0eXBlJzogJ3ZlcnNlJyB9LCB7ICd0ZXh0JzogJ3YyLTMtQ29udGVudCcsICd0eXBlJzogJ3RleHQnIH0sIHsgJ3RleHQnOiAnNCcsICd0eXBlJzogJ3ZlcnNlJyB9LCB7ICd0ZXh0JzogJ3Y0LUNvbnRlbnQnLCAndHlwZSc6ICd0ZXh0JyB9XSB9LCAndmVyc2VMYWJlbCc6ICcxJyB9LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCB0ZXN0IG9mIHRlc3RzKSB7XG4gICAgICBsZXQge1xuICAgICAgICBjaGFwdGVyLCB2ZXJzZSwgZXhwZWN0ZWQsXG4gICAgICB9ID0gdGVzdDtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSB2ZXJzZUhlbHBlcnMuZ2V0VmVyc2VEYXRhKGJpYmxlRGF0YSwgY2hhcHRlciwgdmVyc2UsIGNyZWF0ZU1hcmtlcik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdHNfID0geyB2ZXJzZURhdGE6IHJlc3VsdHMudmVyc2VEYXRhLCB2ZXJzZUxhYmVsOiByZXN1bHRzLnZlcnNlTGFiZWwgfTtcblxuICAgICAgaWYgKCFpc0VxdWFsKHJlc3VsdHNfLCBleHBlY3RlZCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coYGNvbXBhcmUgZmFpbGVkIGZvciAke2NoYXB0ZXJ9OiR7dmVyc2V9YCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHRzKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd2ZXJzZUhlbHBlcnMudmVyc2VBcnJheScsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCBzdWNjZWVkIHdpdGggaGViLTEyLTI3LmVsLXgta29pbmUnLCAoKSA9PiB7XG4gICAgZ2VuZXJhdGVUZXN0KCdoZWItMTItMjcuZWwteC1rb2luZScsICd1Z250Jyk7XG4gIH0pO1xuICBpdCgnc2hvdWxkIHN1Y2NlZWQgd2l0aCBoZWItMTItMjcuZWwteC1rb2luZSBhbmQgdGlzY2ggc2hvdWxkIG5vdCBiZSBjbGlja2FibGUnLCAoKSA9PiB7XG4gICAgZ2VuZXJhdGVUZXN0KCdoZWItMTItMjcuZWwteC1rb2luZScsICd0aXNjaCcpO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCBzdWNjZWVkIHdpdGggbWF0LTQtNicsICgpID0+IHtcbiAgICBnZW5lcmF0ZVRlc3QoJ21hdC00LTYnLCAndWx0Jyk7XG4gIH0pO1xuICBpdCgnc2hvdWxkIHN1Y2NlZWQgd2l0aCBsdWtlLTIyLTMwLnVsdCcsICgpID0+IHtcbiAgICBjb25zdCBjb250ZXh0SWQgPSB7XG4gICAgICAncmVmZXJlbmNlJzoge1xuICAgICAgICAnYm9va0lkJzogJ2x1aycsXG4gICAgICAgICdjaGFwdGVyJzogMjIsXG4gICAgICAgICd2ZXJzZSc6IDMwLFxuICAgICAgfSxcbiAgICAgICd0b29sJzogJ3RyYW5zbGF0aW9uV29yZHMnLFxuICAgICAgJ2dyb3VwSWQnOiAnMTJ0cmliZXNvZmlzcmFlbCcsXG4gICAgICAncXVvdGUnOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAnd29yZCc6ICfOtM+OzrTOtc66zrEnLFxuICAgICAgICAgICdvY2N1cnJlbmNlJzogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICd3b3JkJzogJ8+Gz4XOu+G9sM+CJyxcbiAgICAgICAgICAnb2NjdXJyZW5jZSc6IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAnd29yZCc6ICfOus+Bzq/Ovc6/zr3PhM61z4InLFxuICAgICAgICAgICdvY2N1cnJlbmNlJzogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICd3b3JkJzogJ8+Ezr/hv6YnLFxuICAgICAgICAgICdvY2N1cnJlbmNlJzogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICd3b3JkJzogJ+G8uM+Dz4HOsc6uzrsnLFxuICAgICAgICAgICdvY2N1cnJlbmNlJzogMSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICAnc3Ryb25nJzogW1xuICAgICAgICAnRzE0MjcwJyxcbiAgICAgICAgJ0c1NDQzMCcsXG4gICAgICAgICdHMjkxOTAnLFxuICAgICAgICAnRzM1ODgwJyxcbiAgICAgICAgJ0cyNDc0MCcsXG4gICAgICBdLFxuICAgICAgJ29jY3VycmVuY2UnOiAxLFxuICAgIH07XG4gICAgZ2VuZXJhdGVUZXN0KCdsdWtlLTIyLTMwLnVsdCcsICd1bHQnLCBjb250ZXh0SWQpO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCBzdWNjZWVkIHdpdGggamhuLTYtMjEtZW4tdDR0JywgKCkgPT4ge1xuICAgIGdlbmVyYXRlVGVzdCgnamhuLTYtMjEtZW4tdDR0JywgJ3Q0dCcpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgndmVyc2VIZWxwZXJzLmlzVmVyc2VJblNwYW4nLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGlmIHZlcnNlTGFiZWwgbm90IHNwYW4nLCAoKSA9PiB7XG4gICAgLy8gZ2l2ZW5cbiAgICBjb25zdCB2ZXJzZUxhYmVsID0gJzEnO1xuICAgIGNvbnN0IHZlcnNlID0gJzEnO1xuICAgIGNvbnN0IGV4cGVjdF9pc1ZlcnNlU3BhbiA9IGZhbHNlO1xuXG4gICAgLy8gd2hlblxuICAgIGNvbnN0IHJlc3VsdHMgPSB2ZXJzZUhlbHBlcnMuaXNWZXJzZUluU3Bhbih2ZXJzZUxhYmVsLCB2ZXJzZSk7XG5cbiAgICAvLyB0aGVuXG4gICAgZXhwZWN0KHJlc3VsdHMuaXNWZXJzZVNwYW4pLnRvRXF1YWwoZXhwZWN0X2lzVmVyc2VTcGFuKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgaWYgdmVyc2VMYWJlbCBudW1iZXInLCAoKSA9PiB7XG4gICAgLy8gZ2l2ZW5cbiAgICBjb25zdCB2ZXJzZUxhYmVsID0gMTtcbiAgICBjb25zdCB2ZXJzZSA9ICcxJztcbiAgICBjb25zdCBleHBlY3RfaXNWZXJzZVNwYW4gPSBmYWxzZTtcblxuICAgIC8vIHdoZW5cbiAgICBjb25zdCByZXN1bHRzID0gdmVyc2VIZWxwZXJzLmlzVmVyc2VJblNwYW4odmVyc2VMYWJlbCwgdmVyc2UpO1xuXG4gICAgLy8gdGhlblxuICAgIGV4cGVjdChyZXN1bHRzLmlzVmVyc2VTcGFuKS50b0VxdWFsKGV4cGVjdF9pc1ZlcnNlU3Bhbik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGlmIHZlcnNlTGFiZWwgb3RoZXIgdGV4dCcsICgpID0+IHtcbiAgICAvLyBnaXZlblxuICAgIGNvbnN0IHZlcnNlTGFiZWwgPSAnZnJvbnQnO1xuICAgIGNvbnN0IHZlcnNlID0gJzEnO1xuICAgIGNvbnN0IGV4cGVjdF9pc1ZlcnNlU3BhbiA9IGZhbHNlO1xuXG4gICAgLy8gd2hlblxuICAgIGNvbnN0IHJlc3VsdHMgPSB2ZXJzZUhlbHBlcnMuaXNWZXJzZUluU3Bhbih2ZXJzZUxhYmVsLCB2ZXJzZSk7XG5cbiAgICAvLyB0aGVuXG4gICAgZXhwZWN0KHJlc3VsdHMuaXNWZXJzZVNwYW4pLnRvRXF1YWwoZXhwZWN0X2lzVmVyc2VTcGFuKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBpZiB2ZXJzZUxhYmVsIHNwYW4gYW5kIHZlcnNlIGlzIG51bWJlcicsICgpID0+IHtcbiAgICAvLyBnaXZlblxuICAgIGNvbnN0IHZlcnNlTGFiZWwgPSAnMS0yJztcbiAgICBjb25zdCB2ZXJzZSA9IDE7XG4gICAgY29uc3QgZXhwZWN0X2lzVmVyc2VTcGFuID0gdHJ1ZTtcbiAgICBjb25zdCBleHBlY3RfaXNGaXJzdFZlcnNlID0gdHJ1ZTtcblxuICAgIC8vIHdoZW5cbiAgICBjb25zdCByZXN1bHRzID0gdmVyc2VIZWxwZXJzLmlzVmVyc2VJblNwYW4odmVyc2VMYWJlbCwgdmVyc2UpO1xuXG4gICAgLy8gdGhlblxuICAgIGV4cGVjdChyZXN1bHRzLmlzVmVyc2VTcGFuKS50b0VxdWFsKGV4cGVjdF9pc1ZlcnNlU3Bhbik7XG4gICAgZXhwZWN0KHJlc3VsdHMuaXNGaXJzdFZlcnNlKS50b0VxdWFsKGV4cGVjdF9pc0ZpcnN0VmVyc2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGlmIHZlcnNlTGFiZWwgc3BhbiBhbmQgdmVyc2UgaXMgbnVtYmVyJywgKCkgPT4ge1xuICAgIC8vIGdpdmVuXG4gICAgY29uc3QgdmVyc2VMYWJlbCA9ICcxLTInO1xuICAgIGNvbnN0IHZlcnNlID0gJzEnO1xuICAgIGNvbnN0IGV4cGVjdF9pc1ZlcnNlU3BhbiA9IHRydWU7XG4gICAgY29uc3QgZXhwZWN0X2lzRmlyc3RWZXJzZSA9IHRydWU7XG5cbiAgICAvLyB3aGVuXG4gICAgY29uc3QgcmVzdWx0cyA9IHZlcnNlSGVscGVycy5pc1ZlcnNlSW5TcGFuKHZlcnNlTGFiZWwsIHZlcnNlKTtcblxuICAgIC8vIHRoZW5cbiAgICBleHBlY3QocmVzdWx0cy5pc1ZlcnNlU3BhbikudG9FcXVhbChleHBlY3RfaXNWZXJzZVNwYW4pO1xuICAgIGV4cGVjdChyZXN1bHRzLmlzRmlyc3RWZXJzZSkudG9FcXVhbChleHBlY3RfaXNGaXJzdFZlcnNlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBpZiB2ZXJzZUxhYmVsIHNwYW4gYW5kIHZlcnNlIGlzIG5vdCBmaXJzdCcsICgpID0+IHtcbiAgICAvLyBnaXZlblxuICAgIGNvbnN0IHZlcnNlTGFiZWwgPSAnMS0yJztcbiAgICBjb25zdCB2ZXJzZSA9ICcyJztcbiAgICBjb25zdCBleHBlY3RfaXNWZXJzZVNwYW4gPSB0cnVlO1xuICAgIGNvbnN0IGV4cGVjdF9pc0ZpcnN0VmVyc2UgPSBmYWxzZTtcblxuICAgIC8vIHdoZW5cbiAgICBjb25zdCByZXN1bHRzID0gdmVyc2VIZWxwZXJzLmlzVmVyc2VJblNwYW4odmVyc2VMYWJlbCwgdmVyc2UpO1xuXG4gICAgLy8gdGhlblxuICAgIGV4cGVjdChyZXN1bHRzLmlzVmVyc2VTcGFuKS50b0VxdWFsKGV4cGVjdF9pc1ZlcnNlU3Bhbik7XG4gICAgZXhwZWN0KHJlc3VsdHMuaXNGaXJzdFZlcnNlKS50b0VxdWFsKGV4cGVjdF9pc0ZpcnN0VmVyc2UpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgndmVyc2VIZWxwZXJzLmdldFZlcnNlU3BhblJhbmdlJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHJldHVybiBubyByYW5nZSBpZiBzaW5nbGUgdmVyc2UnLCAoKSA9PiB7XG4gICAgLy8gZ2l2ZW5cbiAgICBjb25zdCB2ZXJzZUluZGV4ID0gJzEnO1xuICAgIGNvbnN0IGV4cGVjdF9yYW5nZSA9IHt9O1xuXG4gICAgLy8gd2hlblxuICAgIGNvbnN0IHJlc3VsdHMgPSB2ZXJzZUhlbHBlcnMuZ2V0VmVyc2VTcGFuUmFuZ2UodmVyc2VJbmRleCk7XG5cbiAgICAvLyB0aGVuXG4gICAgZXhwZWN0KHJlc3VsdHMpLnRvRXF1YWwoZXhwZWN0X3JhbmdlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gbm8gcmFuZ2UgaWYgbm90IHZlcnNlJywgKCkgPT4ge1xuICAgIC8vIGdpdmVuXG4gICAgY29uc3QgdmVyc2VJbmRleCA9ICdmcm9udCc7XG4gICAgY29uc3QgZXhwZWN0X3JhbmdlID0ge307XG5cbiAgICAvLyB3aGVuXG4gICAgY29uc3QgcmVzdWx0cyA9IHZlcnNlSGVscGVycy5nZXRWZXJzZVNwYW5SYW5nZSh2ZXJzZUluZGV4KTtcblxuICAgIC8vIHRoZW5cbiAgICBleHBlY3QocmVzdWx0cykudG9FcXVhbChleHBlY3RfcmFuZ2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBubyByYW5nZSBpZiBpbmNvbXBsZXRlJywgKCkgPT4ge1xuICAgIC8vIGdpdmVuXG4gICAgY29uc3QgdmVyc2VJbmRleCA9ICcxLSc7XG4gICAgY29uc3QgZXhwZWN0X3JhbmdlID0ge307XG5cbiAgICAvLyB3aGVuXG4gICAgY29uc3QgcmVzdWx0cyA9IHZlcnNlSGVscGVycy5nZXRWZXJzZVNwYW5SYW5nZSh2ZXJzZUluZGV4KTtcblxuICAgIC8vIHRoZW5cbiAgICBleHBlY3QocmVzdWx0cykudG9FcXVhbChleHBlY3RfcmFuZ2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBubyByYW5nZSBpZiBpbmNvbXBsZXRlICMyJywgKCkgPT4ge1xuICAgIC8vIGdpdmVuXG4gICAgY29uc3QgdmVyc2VJbmRleCA9ICctMic7XG4gICAgY29uc3QgZXhwZWN0X3JhbmdlID0ge307XG5cbiAgICAvLyB3aGVuXG4gICAgY29uc3QgcmVzdWx0cyA9IHZlcnNlSGVscGVycy5nZXRWZXJzZVNwYW5SYW5nZSh2ZXJzZUluZGV4KTtcblxuICAgIC8vIHRoZW5cbiAgICBleHBlY3QocmVzdWx0cykudG9FcXVhbChleHBlY3RfcmFuZ2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiByYW5nZScsICgpID0+IHtcbiAgICAvLyBnaXZlblxuICAgIGNvbnN0IHZlcnNlSW5kZXggPSAnNS0xMCc7XG4gICAgY29uc3QgZXhwZWN0X3JhbmdlID0ge1xuICAgICAgbG93OiA1LFxuICAgICAgaGlnaDogMTAsXG4gICAgfTtcblxuICAgIC8vIHdoZW5cbiAgICBjb25zdCByZXN1bHRzID0gdmVyc2VIZWxwZXJzLmdldFZlcnNlU3BhblJhbmdlKHZlcnNlSW5kZXgpO1xuXG4gICAgLy8gdGhlblxuICAgIGV4cGVjdChyZXN1bHRzKS50b0VxdWFsKGV4cGVjdF9yYW5nZSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd2ZXJzZUhlbHBlcnMuY3JlYXRlVmVyc2VNYXJrZXInLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgc3VjY2VlZCB3aXRoIHN0cmluZyB2ZXJzZScsICgpID0+IHtcbiAgICAvLyBnaXZlblxuICAgIGNvbnN0IHZlcnNlID0gJzEnO1xuICAgIGNvbnN0IGV4cGVjdGVkX2h0bWwgPSA8Pjxici8+PGI+e3ZlcnNlfTwvYj4gPC8+O1xuICAgIGNvbnN0IGV4cGVjdGVkX3Jlc3VsdHMgPSB7XG4gICAgICBodG1sOiBleHBlY3RlZF9odG1sLFxuICAgICAgdHlwZTogJ2h0bWwnLFxuICAgICAgdGV4dDogJycsXG4gICAgfTtcblxuICAgIC8vIHdoZW5cbiAgICBjb25zdCByZXN1bHRzID0gdmVyc2VIZWxwZXJzLmNyZWF0ZVZlcnNlTWFya2VyKHZlcnNlKTtcblxuICAgIC8vIHRoZW5cbiAgICBleHBlY3QocmVzdWx0cykudG9FcXVhbChleHBlY3RlZF9yZXN1bHRzKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdWNjZWVkIHdpdGggbnVtZXJpY2FsIHZlcnNlJywgKCkgPT4ge1xuICAgIC8vIGdpdmVuXG4gICAgY29uc3QgdmVyc2UgPSAxO1xuICAgIGNvbnN0IGV4cGVjdGVkX2h0bWwgPSA8Pjxici8+PGI+e3ZlcnNlfTwvYj4gPC8+O1xuICAgIGNvbnN0IGV4cGVjdGVkX3Jlc3VsdHMgPSB7XG4gICAgICBodG1sOiBleHBlY3RlZF9odG1sLFxuICAgICAgdHlwZTogJ2h0bWwnLFxuICAgICAgdGV4dDogJycsXG4gICAgfTtcblxuICAgIC8vIHdoZW5cbiAgICBjb25zdCByZXN1bHRzID0gdmVyc2VIZWxwZXJzLmNyZWF0ZVZlcnNlTWFya2VyKHZlcnNlKTtcblxuICAgIC8vIHRoZW5cbiAgICBleHBlY3QocmVzdWx0cykudG9FcXVhbChleHBlY3RlZF9yZXN1bHRzKTtcbiAgfSk7XG59KTtcblxuLy9cbi8vIGhlbHBlcnNcbi8vXG5cbi8qKlxuICogUmVhZHMgYSB1c2ZtIGZpbGUgZnJvbSB0aGUgcmVzb3VyY2VzIGRpclxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIHJlbGF0aXZlIHBhdGggdG8gdXNmbSBmaWxlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHNkdlxuICovXG5leHBvcnQgY29uc3QgcmVhZFVTRk0gPSBmaWxlUGF0aCA9PiB7XG4gIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKCcuL3NyYy9TY3JpcHR1cmVQYW5lL2hlbHBlcnMvX190ZXN0X18vZml4dHVyZXMnLCBmaWxlUGF0aCk7XG4gIGNvbnNvbGUubG9nKHBhdGgucmVzb2x2ZShmdWxsUGF0aCkpO1xuICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAnVVRGLTgnKS50b1N0cmluZygpO1xufTtcblxuLyoqXG4gKiBSZWFkcyBhIGpzb24gZmlsZSBmcm9tIHRoZSByZXNvdXJjZXMgZGlyXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggcmVsYXRpdmUgcGF0aCB0byBqc29uIGZpbGVcbiAqIEByZXR1cm4ge29iamVjdH0ganNvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IHJlYWRKU09OID0gZmlsZVBhdGggPT4gSlNPTi5wYXJzZShyZWFkVVNGTShmaWxlUGF0aCkpO1xuXG4vKipcbiAqIEdlbmVyYXRvciBmb3IgdGVzdGluZyBqc29uIHRvIHVzZm0gbWlncmF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGZpbGVzIHRvIHVzZS4gZS5nLiBgdmFsaWRgIHdpbGwgdGVzdCBgdmFsaWQudXNmbWAgdG8gYHZhbGlkLmpzb25gXG4gKiBAcGFyYW0ge3N0cmluZ30gYmlibGVJZFxuICogQHBhcmFt