tc-ui-toolkit
Version:
React components used to develop tools for the desktop app translationCore
324 lines (276 loc) • 33.8 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.generateWordLexiconDetails = generateWordLexiconDetails;
exports["default"] = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var lexiconHelpers = _interopRequireWildcard(require("../ScripturePane/helpers/lexiconHelpers"));
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
/**
* lookup translations and convert to morph description
* @param {string} morph - morph code to convert
* @param {Function} translate
* @return {Array} morph description for each part
*/
function getWordParts(morph, translate) {
var morphKeysForParts = lexiconHelpers.getMorphKeys(morph);
var morphStrs = [];
morphKeysForParts.forEach(function (morphKeys) {
var translatedMorphs = [];
morphKeys.forEach(function (key) {
if (key.startsWith('*')) {
translatedMorphs.push(key.substr(1));
} else {
translatedMorphs.push(translate(key));
}
});
morphStrs.push(translatedMorphs.join(', '));
});
return morphStrs;
}
/**
* creates span with formatted html
* @param html
* @return {*}
*/
function getFormatted(html) {
var props = {
dangerouslySetInnerHTML: {
__html: html
}
};
return /*#__PURE__*/_react["default"].createElement("span", props);
}
/**
* creates a data line with label, text and optionally text can be formatted html
* @param {string} label
* @param {string} text
* @param {boolean} isFormatted - if true then text contains html formatting
* @param {string} fontSize - font size to use for text
* @return {*}
*/
function generateDataSegment(label, text) {
var isFormatted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
var fontSize = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '1.0em';
return isFormatted ? /*#__PURE__*/_react["default"].createElement("span", null, /*#__PURE__*/_react["default"].createElement("strong", null, label), " ", /*#__PURE__*/_react["default"].createElement("span", {
style: {
fontSize: fontSize
}
}, text && getFormatted(text) || '')) : /*#__PURE__*/_react["default"].createElement("span", null, /*#__PURE__*/_react["default"].createElement("strong", null, label), " ", /*#__PURE__*/_react["default"].createElement("span", {
style: {
fontSize: fontSize
}
}, text));
}
/**
* draws line between word parts
* @param {Number} pos - order of part on screen (0 is top)
* @return {*}
*/
function generateLine(pos) {
return pos > 0 ? /*#__PURE__*/_react["default"].createElement("hr", {
style: {
'height': '6px',
'borderBottom': '1px solid gray',
'marginBottom': '5px',
'marginTop': '0px'
}
}) : '';
}
/**
* creates an html word
* @param {boolean} multipart - if true then this is a multipart word
* @param {string} word
* @param {string} fontSize - font size to use for word
* @return {*}
*/
function generateWordEntry(multipart, word) {
var fontSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '1.2em';
return multipart ? /*#__PURE__*/_react["default"].createElement("div", {
style: {
margin: '0',
padding: '0'
}
}, /*#__PURE__*/_react["default"].createElement("strong", {
style: {
fontSize: fontSize
}
}, word), /*#__PURE__*/_react["default"].createElement("br", null)) : '';
}
/**
* creates an entry for a word part
* @param {function} translate
* @param {string} lemma
* @param {string} morphStr
* @param {Number} strongsNum
* @param {string} strongs
* @param {string} lexicon
* @param {string} word
* @param {Number} itemNum - number of part in word
* @param {Number} pos - order of part on screen (0 is top)
* @param {Number} count - total number of parts to show
* @param {boolean} isHebrew - if true then we adjust font size for Original language
* @return {*}
*/
function generateWordPart(translate, lemma, morphStr, strongsNum, strongs, lexicon, word, itemNum, pos, count) {
var isHebrew = arguments.length > 10 && arguments[10] !== undefined ? arguments[10] : false;
morphStr = morphStr || translate('morph_missing');
var multipart = count > 1;
var key = 'lexicon_details_' + pos;
var origLangFontSize = isHebrew ? '1.7em' : '1.2em';
if (strongsNum) {
return /*#__PURE__*/_react["default"].createElement("div", {
key: key,
style: {
margin: '0px 10px 0px 10px',
maxWidth: '400px'
}
}, generateLine(pos), generateWordEntry(multipart, word, origLangFontSize), generateDataSegment(translate('lemma'), lemma, false, origLangFontSize), /*#__PURE__*/_react["default"].createElement("br", null), generateDataSegment(translate('morphology'), morphStr), /*#__PURE__*/_react["default"].createElement("br", null), generateDataSegment(translate('strongs'), strongs), /*#__PURE__*/_react["default"].createElement("br", null), generateDataSegment(translate('lexicon'), lexicon, true), /*#__PURE__*/_react["default"].createElement("br", null));
} else {
// not main word
return /*#__PURE__*/_react["default"].createElement("div", {
key: key,
style: {
margin: '0px 0px 0px 10px',
maxWidth: '400px'
}
}, generateLine(pos), generateWordEntry(multipart, word, origLangFontSize), generateDataSegment(translate('morphology'), morphStr), /*#__PURE__*/_react["default"].createElement("br", null));
}
}
/**
* find the major part of the word and move to top
* @param {Number} partCount - actual part count
* @param {Array} wordParts - word split into parts
* @return {number[]}
*/
function movePrimaryWordToTop(partCount, wordParts) {
var majorHighest = 0;
var majorPos = 0;
var indices = Array.from({
length: partCount
}).map(function (u, i) {
return i;
});
indices.forEach(function (i) {
// sort by part length, longest first
var partLen = (wordParts && wordParts.length > i && wordParts[i] || '').length;
if (partLen > majorHighest) {
majorHighest = partLen;
majorPos = i;
}
});
if (majorPos > 0) {
// move
indices.splice(majorPos, 1);
indices.unshift(majorPos);
}
return indices;
}
/**
* get the strongs and lexicon for position
* checks for formats such as `c:d:H0776` or 'H123:H7225' and extracts the actual strongs number(s)
* @param {String} strong - parse the strongs numbers for part
* @param {Object} lexiconData
* @param {number} pos - position of part to get strongs and lexicon
* @return {strongNumber, lexicon}
*/
function getStrongsAndLexicon(strong, lexiconData, pos) {
var lexicon = '';
var strongNumber = 0;
var strongsParts = lexiconHelpers.getStrongsParts(strong);
if (strongsParts.length > pos) {
strong = strongsParts[pos];
} else {
strong = '';
}
var lexiconId = lexiconHelpers.lexiconIdFromStrongs(strong);
strongNumber = lexiconHelpers.lexiconEntryIdFromStrongs(strong);
if (lexiconData && lexiconData[lexiconId] && lexiconData[lexiconId][strongNumber]) {
lexicon = lexiconData[lexiconId][strongNumber]["long"];
}
return {
strongNumber: strongNumber,
lexicon: lexicon,
strong: strong
};
}
/**
*
* @param {Object} wordObject - word to display in lexicon
* @param {String} lexiconData - contains lexicon for strongs
* @param {Function} translate
* @param {Function} generateWordPart
* @param {boolean} isHebrew - if true then we adjust font size for Original language
* @return {*[]}
*/
function generateWordLexiconDetails(wordObject, lexiconData, translate, generateWordPart, isHebrew) {
var wordLexiconDetails;
var wordParts = lexiconHelpers.getWordParts(wordObject.text);
var morphStrs = getWordParts(wordObject.morph, translate);
var strongsParts = lexiconHelpers.getStrongsParts(wordObject.strong);
var partCount = Math.max(morphStrs.length, strongsParts.length, wordParts.length); // since there may be inconsistancies, use largest count
if (partCount < 2) {
var _getStrongsAndLexicon = getStrongsAndLexicon(wordObject.strong, lexiconData, 0),
strongNumber = _getStrongsAndLexicon.strongNumber,
lexicon = _getStrongsAndLexicon.lexicon,
strongs = _getStrongsAndLexicon.strong;
wordLexiconDetails = generateWordPart(translate, wordObject.lemma, morphStrs[0], strongNumber, strongs, lexicon, wordParts[0], 0, 0, partCount, isHebrew);
} else {
var indices = movePrimaryWordToTop(partCount, wordParts);
wordLexiconDetails = indices.map(function (pos, index) {
var morphStr = morphStrs.length > pos && morphStrs[pos] || '';
var word = wordParts.length > pos && wordParts[pos] || '';
var _getStrongsAndLexicon2 = getStrongsAndLexicon(wordObject.strong, lexiconData, pos),
strongNumber = _getStrongsAndLexicon2.strongNumber,
lexicon = _getStrongsAndLexicon2.lexicon,
strongs = _getStrongsAndLexicon2.strong;
var lemmaStr = index === 0 ? wordObject.lemma : '';
return generateWordPart(translate, lemmaStr, morphStr, strongNumber, strongs, lexicon, word, pos, index, partCount, isHebrew);
});
}
return wordLexiconDetails;
}
var WordLexiconDetails = /*#__PURE__*/function (_React$Component) {
(0, _inherits2["default"])(WordLexiconDetails, _React$Component);
var _super = _createSuper(WordLexiconDetails);
function WordLexiconDetails() {
(0, _classCallCheck2["default"])(this, WordLexiconDetails);
return _super.apply(this, arguments);
}
(0, _createClass2["default"])(WordLexiconDetails, [{
key: "render",
value: function render() {
var _this$props = this.props,
wordObject = _this$props.wordObject,
translate = _this$props.translate,
lexiconData = _this$props.lexiconData,
isHebrew = _this$props.isHebrew;
var wordLexiconDetails = generateWordLexiconDetails(wordObject, lexiconData, translate, generateWordPart, isHebrew);
return wordLexiconDetails;
}
}]);
return WordLexiconDetails;
}(_react["default"].Component);
WordLexiconDetails.propTypes = {
translate: _propTypes["default"].func.isRequired,
wordObject: _propTypes["default"].shape({
lemma: _propTypes["default"].string.isRequired,
morph: _propTypes["default"].string.isRequired,
strong: _propTypes["default"].string.isRequired
}).isRequired,
lexiconData: _propTypes["default"].object.isRequired,
isHebrew: _propTypes["default"].bool.isRequired
};
var _default = WordLexiconDetails;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Xb3JkTGV4aWNvbkRldGFpbHMvV29yZExleGljb25EZXRhaWxzLmpzIl0sIm5hbWVzIjpbImdldFdvcmRQYXJ0cyIsIm1vcnBoIiwidHJhbnNsYXRlIiwibW9ycGhLZXlzRm9yUGFydHMiLCJsZXhpY29uSGVscGVycyIsImdldE1vcnBoS2V5cyIsIm1vcnBoU3RycyIsImZvckVhY2giLCJtb3JwaEtleXMiLCJ0cmFuc2xhdGVkTW9ycGhzIiwia2V5Iiwic3RhcnRzV2l0aCIsInB1c2giLCJzdWJzdHIiLCJqb2luIiwiZ2V0Rm9ybWF0dGVkIiwiaHRtbCIsInByb3BzIiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJfX2h0bWwiLCJnZW5lcmF0ZURhdGFTZWdtZW50IiwibGFiZWwiLCJ0ZXh0IiwiaXNGb3JtYXR0ZWQiLCJmb250U2l6ZSIsImdlbmVyYXRlTGluZSIsInBvcyIsImdlbmVyYXRlV29yZEVudHJ5IiwibXVsdGlwYXJ0Iiwid29yZCIsIm1hcmdpbiIsInBhZGRpbmciLCJnZW5lcmF0ZVdvcmRQYXJ0IiwibGVtbWEiLCJtb3JwaFN0ciIsInN0cm9uZ3NOdW0iLCJzdHJvbmdzIiwibGV4aWNvbiIsIml0ZW1OdW0iLCJjb3VudCIsImlzSGVicmV3Iiwib3JpZ0xhbmdGb250U2l6ZSIsIm1heFdpZHRoIiwibW92ZVByaW1hcnlXb3JkVG9Ub3AiLCJwYXJ0Q291bnQiLCJ3b3JkUGFydHMiLCJtYWpvckhpZ2hlc3QiLCJtYWpvclBvcyIsImluZGljZXMiLCJBcnJheSIsImZyb20iLCJsZW5ndGgiLCJtYXAiLCJ1IiwiaSIsInBhcnRMZW4iLCJzcGxpY2UiLCJ1bnNoaWZ0IiwiZ2V0U3Ryb25nc0FuZExleGljb24iLCJzdHJvbmciLCJsZXhpY29uRGF0YSIsInN0cm9uZ051bWJlciIsInN0cm9uZ3NQYXJ0cyIsImdldFN0cm9uZ3NQYXJ0cyIsImxleGljb25JZCIsImxleGljb25JZEZyb21TdHJvbmdzIiwibGV4aWNvbkVudHJ5SWRGcm9tU3Ryb25ncyIsImdlbmVyYXRlV29yZExleGljb25EZXRhaWxzIiwid29yZE9iamVjdCIsIndvcmRMZXhpY29uRGV0YWlscyIsIk1hdGgiLCJtYXgiLCJpbmRleCIsImxlbW1hU3RyIiwiV29yZExleGljb25EZXRhaWxzIiwiUmVhY3QiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJmdW5jIiwiaXNSZXF1aXJlZCIsInNoYXBlIiwic3RyaW5nIiwib2JqZWN0IiwiYm9vbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUVBOzs7Ozs7QUFFQTs7Ozs7O0FBTUEsU0FBU0EsWUFBVCxDQUFzQkMsS0FBdEIsRUFBNkJDLFNBQTdCLEVBQXdDO0FBQ3RDLE1BQU1DLGlCQUFpQixHQUFHQyxjQUFjLENBQUNDLFlBQWYsQ0FBNEJKLEtBQTVCLENBQTFCO0FBQ0EsTUFBTUssU0FBUyxHQUFHLEVBQWxCO0FBRUFILEVBQUFBLGlCQUFpQixDQUFDSSxPQUFsQixDQUEwQixVQUFBQyxTQUFTLEVBQUk7QUFDckMsUUFBTUMsZ0JBQWdCLEdBQUcsRUFBekI7QUFFQUQsSUFBQUEsU0FBUyxDQUFDRCxPQUFWLENBQWtCLFVBQUFHLEdBQUcsRUFBSTtBQUN2QixVQUFJQSxHQUFHLENBQUNDLFVBQUosQ0FBZSxHQUFmLENBQUosRUFBeUI7QUFDdkJGLFFBQUFBLGdCQUFnQixDQUFDRyxJQUFqQixDQUFzQkYsR0FBRyxDQUFDRyxNQUFKLENBQVcsQ0FBWCxDQUF0QjtBQUNELE9BRkQsTUFFTztBQUNMSixRQUFBQSxnQkFBZ0IsQ0FBQ0csSUFBakIsQ0FBc0JWLFNBQVMsQ0FBQ1EsR0FBRCxDQUEvQjtBQUNEO0FBQ0YsS0FORDtBQU9BSixJQUFBQSxTQUFTLENBQUNNLElBQVYsQ0FBZUgsZ0JBQWdCLENBQUNLLElBQWpCLENBQXNCLElBQXRCLENBQWY7QUFDRCxHQVhEO0FBWUEsU0FBT1IsU0FBUDtBQUNEO0FBRUQ7Ozs7Ozs7QUFLQSxTQUFTUyxZQUFULENB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QjtBQUdELEtBVm9CLENBQXJCO0FBV0Q7O0FBQ0QsU0FBTzZCLGtCQUFQO0FBQ0Q7O0lBRUtLLGtCOzs7Ozs7Ozs7Ozs7NkJBQ0s7QUFBQSx3QkFHSCxLQUFLekQsS0FIRjtBQUFBLFVBRUxtRCxVQUZLLGVBRUxBLFVBRks7QUFBQSxVQUVPbEUsU0FGUCxlQUVPQSxTQUZQO0FBQUEsVUFFa0IwRCxXQUZsQixlQUVrQkEsV0FGbEI7QUFBQSxVQUUrQnBCLFFBRi9CLGVBRStCQSxRQUYvQjtBQUlQLFVBQUk2QixrQkFBa0IsR0FBR0YsMEJBQTBCLENBQUNDLFVBQUQsRUFBYVIsV0FBYixFQUEwQjFELFNBQTFCLEVBQXFDOEIsZ0JBQXJDLEVBQXVEUSxRQUF2RCxDQUFuRDtBQUNBLGFBQU82QixrQkFBUDtBQUNEOzs7RUFQOEJNLGtCQUFNQyxTOztBQVV2Q0Ysa0JBQWtCLENBQUNHLFNBQW5CLEdBQStCO0FBQzdCM0UsRUFBQUEsU0FBUyxFQUFFNEUsc0JBQVVDLElBQVYsQ0FBZUMsVUFERztBQUU3QlosRUFBQUEsVUFBVSxFQUFFVSxzQkFBVUcsS0FBVixDQUFnQjtBQUMxQmhELElBQUFBLEtBQUssRUFBRTZDLHNCQUFVSSxNQUFWLENBQWlCRixVQURFO0FBRTFCL0UsSUFBQUEsS0FBSyxFQUFFNkUsc0JBQVVJLE1BQVYsQ0FBaUJGLFVBRkU7QUFHMUJyQixJQUFBQSxNQUFNLEVBQUVtQixzQkFBVUksTUFBVixDQUFpQkY7QUFIQyxHQUFoQixFQUlUQSxVQU4wQjtBQU83QnBCLEVBQUFBLFdBQVcsRUFBRWtCLHNCQUFVSyxNQUFWLENBQWlCSCxVQVBEO0FBUTdCeEMsRUFBQUEsUUFBUSxFQUFFc0Msc0JBQVVNLElBQVYsQ0FBZUo7QUFSSSxDQUEvQjtlQVdlTixrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuLy8gaGVscGVyc1xuaW1wb3J0ICogYXMgbGV4aWNvbkhlbHBlcnMgZnJvbSAnLi4vU2NyaXB0dXJlUGFuZS9oZWxwZXJzL2xleGljb25IZWxwZXJzJztcblxuLyoqXG4gKiBsb29rdXAgdHJhbnNsYXRpb25zIGFuZCBjb252ZXJ0IHRvIG1vcnBoIGRlc2NyaXB0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9ycGggLSBtb3JwaCBjb2RlIHRvIGNvbnZlcnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zbGF0ZVxuICogQHJldHVybiB7QXJyYXl9IG1vcnBoIGRlc2NyaXB0aW9uIGZvciBlYWNoIHBhcnRcbiAqL1xuZnVuY3Rpb24gZ2V0V29yZFBhcnRzKG1vcnBoLCB0cmFuc2xhdGUpIHtcbiAgY29uc3QgbW9ycGhLZXlzRm9yUGFydHMgPSBsZXhpY29uSGVscGVycy5nZXRNb3JwaEtleXMobW9ycGgpO1xuICBjb25zdCBtb3JwaFN0cnMgPSBbXTtcblxuICBtb3JwaEtleXNGb3JQYXJ0cy5mb3JFYWNoKG1vcnBoS2V5cyA9PiB7XG4gICAgY29uc3QgdHJhbnNsYXRlZE1vcnBocyA9IFtdO1xuXG4gICAgbW9ycGhLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnKicpKSB7XG4gICAgICAgIHRyYW5zbGF0ZWRNb3JwaHMucHVzaChrZXkuc3Vic3RyKDEpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zbGF0ZWRNb3JwaHMucHVzaCh0cmFuc2xhdGUoa2V5KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbW9ycGhTdHJzLnB1c2godHJhbnNsYXRlZE1vcnBocy5qb2luKCcsICcpKTtcbiAgfSk7XG4gIHJldHVybiBtb3JwaFN0cnM7XG59XG5cbi8qKlxuICogY3JlYXRlcyBzcGFuIHdpdGggZm9ybWF0dGVkIGh0bWxcbiAqIEBwYXJhbSBodG1sXG4gKiBAcmV0dXJuIHsqfVxuICovXG5mdW5jdGlvbiBnZXRGb3JtYXR0ZWQoaHRtbCkge1xuICBjb25zdCBwcm9wcyA9IHsgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHsgX19odG1sOiBodG1sIH0gfTtcbiAgcmV0dXJuIDxzcGFuIHsuLi5wcm9wc30+PC9zcGFuPjtcbn1cblxuLyoqXG4gKiBjcmVhdGVzIGEgZGF0YSBsaW5lIHdpdGggbGFiZWwsIHRleHQgYW5kIG9wdGlvbmFsbHkgdGV4dCBjYW4gYmUgZm9ybWF0dGVkIGh0bWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNGb3JtYXR0ZWQgLSBpZiB0cnVlIHRoZW4gdGV4dCBjb250YWlucyBodG1sIGZvcm1hdHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb250U2l6ZSAtIGZvbnQgc2l6ZSB0byB1c2UgZm9yIHRleHRcbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRGF0YVNlZ21lbnQobGFiZWwsIHRleHQsIGlzRm9ybWF0dGVkID0gZmFsc2UsIGZvbnRTaXplID0gJzEuMGVtJykge1xuICByZXR1cm4gKGlzRm9ybWF0dGVkID9cbiAgICA8c3Bhbj48c3Ryb25nPntsYWJlbH08L3N0cm9uZz4gPHNwYW4gc3R5bGU9e3sgZm9udFNpemUgfX0+eyh0ZXh0ICYmIGdldEZvcm1hdHRlZCh0ZXh0KSkgfHwgJyd9PC9zcGFuPjwvc3Bhbj5cbiAgICA6XG4gICAgPHNwYW4+PHN0cm9uZz57bGFiZWx9PC9zdHJvbmc+IDxzcGFuIHN0eWxlPXt7IGZvbnRTaXplIH19Pnt0ZXh0fTwvc3Bhbj48L3NwYW4+XG4gICk7XG59XG5cbi8qKlxuICogZHJhd3MgbGluZSBiZXR3ZWVuIHdvcmQgcGFydHNcbiAqIEBwYXJhbSB7TnVtYmVyfSBwb3MgLSBvcmRlciBvZiBwYXJ0IG9uIHNjcmVlbiAoMCBpcyB0b3ApXG4gKiBAcmV0dXJuIHsqfVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUxpbmUocG9zKSB7XG4gIHJldHVybiAocG9zID4gMCkgP1xuICAgIDxociBzdHlsZT17e1xuICAgICAgJ2hlaWdodCc6ICc2cHgnLCAnYm9yZGVyQm90dG9tJzogJzFweCBzb2xpZCBncmF5JywgJ21hcmdpbkJvdHRvbSc6ICc1cHgnLCAnbWFyZ2luVG9wJzogJzBweCcsXG4gICAgfX0vPlxuICAgIDogJyc7XG59XG5cbi8qKlxuICogY3JlYXRlcyBhbiBodG1sIHdvcmRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbXVsdGlwYXJ0IC0gaWYgdHJ1ZSB0aGVuIHRoaXMgaXMgYSBtdWx0aXBhcnQgd29yZFxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb250U2l6ZSAtIGZvbnQgc2l6ZSB0byB1c2UgZm9yIHdvcmRcbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlV29yZEVudHJ5KG11bHRpcGFydCwgd29yZCwgZm9udFNpemUgPSAnMS4yZW0nKSB7XG4gIHJldHVybiBtdWx0aXBhcnQgP1xuICAgIDxkaXYgc3R5bGU9e3sgbWFyZ2luOiAnMCcsIHBhZGRpbmc6ICcwJyB9fT5cbiAgICAgIDxzdHJvbmcgc3R5bGU9e3sgZm9udFNpemUgfX0+e3dvcmR9PC9zdHJvbmc+XG4gICAgICA8YnIvPlxuICAgIDwvZGl2PlxuICAgIDogJyc7XG59XG5cbi8qKlxuICogY3JlYXRlcyBhbiBlbnRyeSBmb3IgYSB3b3JkIHBhcnRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHRyYW5zbGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGxlbW1hXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9ycGhTdHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJvbmdzTnVtXG4gKiBAcGFyYW0ge3N0cmluZ30gc3Ryb25nc1xuICogQHBhcmFtIHtzdHJpbmd9IGxleGljb25cbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkXG4gKiBAcGFyYW0ge051bWJlcn0gaXRlbU51bSAtIG51bWJlciBvZiBwYXJ0IGluIHdvcmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBwb3MgLSBvcmRlciBvZiBwYXJ0IG9uIHNjcmVlbiAoMCBpcyB0b3ApXG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgLSB0b3RhbCBudW1iZXIgb2YgcGFydHMgdG8gc2hvd1xuICogQHBhcmFtIHtib29sZWFufSBpc0hlYnJldyAtIGlmIHRydWUgdGhlbiB3ZSBhZGp1c3QgZm9udCBzaXplIGZvciBPcmlnaW5hbCBsYW5ndWFnZVxuICogQHJldHVybiB7Kn1cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVXb3JkUGFydCh0cmFuc2xhdGUsIGxlbW1hLCBtb3JwaFN0ciwgc3Ryb25nc051bSwgc3Ryb25ncywgbGV4aWNvbiwgd29yZCwgaXRlbU51bSwgcG9zLCBjb3VudCxcbiAgaXNIZWJyZXcgPSBmYWxzZSkge1xuICBtb3JwaFN0ciA9IG1vcnBoU3RyIHx8IHRyYW5zbGF0ZSgnbW9ycGhfbWlzc2luZycpO1xuICBjb25zdCBtdWx0aXBhcnQgPSBjb3VudCA+IDE7XG4gIGNvbnN0IGtleSA9ICdsZXhpY29uX2RldGFpbHNfJyArIHBvcztcbiAgY29uc3Qgb3JpZ0xhbmdGb250U2l6ZSA9IGlzSGVicmV3ID8gJzEuN2VtJyA6ICcxLjJlbSc7XG5cbiAgaWYgKHN0cm9uZ3NOdW0pIHtcbiAgICByZXR1cm4gPGRpdiBrZXk9e2tleX0gc3R5bGU9e3sgbWFyZ2luOiAnMHB4IDEwcHggMHB4IDEwcHgnLCBtYXhXaWR0aDogJzQwMHB4JyB9fT5cbiAgICAgIHtnZW5lcmF0ZUxpbmUocG9zKX1cbiAgICAgIHtnZW5lcmF0ZVdvcmRFbnRyeShtdWx0aXBhcnQsIHdvcmQsIG9yaWdMYW5nRm9udFNpemUpfVxuICAgICAge2dlbmVyYXRlRGF0YVNlZ21lbnQodHJhbnNsYXRlKCdsZW1tYScpLCBsZW1tYSwgZmFsc2UsIG9yaWdMYW5nRm9udFNpemUpfTxici8+XG4gICAgICB7Z2VuZXJhdGVEYXRhU2VnbWVudCh0cmFuc2xhdGUoJ21vcnBob2xvZ3knKSwgbW9ycGhTdHIpfTxici8+XG4gICAgICB7Z2VuZXJhdGVEYXRhU2VnbWVudCh0cmFuc2xhdGUoJ3N0cm9uZ3MnKSwgc3Ryb25ncyl9PGJyLz5cbiAgICAgIHtnZW5lcmF0ZURhdGFTZWdtZW50KHRyYW5zbGF0ZSgnbGV4aWNvbicpLCBsZXhpY29uLCB0cnVlKX08YnIvPlxuICAgIDwvZGl2PjtcbiAgfSBlbHNlIHsgLy8gbm90IG1haW4gd29yZFxuICAgIHJldHVybiA8ZGl2IGtleT17a2V5fSBzdHlsZT17eyBtYXJnaW46ICcwcHggMHB4IDBweCAxMHB4JywgbWF4V2lkdGg6ICc0MDBweCcgfX0+XG4gICAgICB7Z2VuZXJhdGVMaW5lKHBvcyl9XG4gICAgICB7Z2VuZXJhdGVXb3JkRW50cnkobXVsdGlwYXJ0LCB3b3JkLCBvcmlnTGFuZ0ZvbnRTaXplKX1cbiAgICAgIHtnZW5lcmF0ZURhdGFTZWdtZW50KHRyYW5zbGF0ZSgnbW9ycGhvbG9neScpLCBtb3JwaFN0cil9PGJyLz5cbiAgICA8L2Rpdj47XG4gIH1cbn1cblxuLyoqXG4gKiBmaW5kIHRoZSBtYWpvciBwYXJ0IG9mIHRoZSB3b3JkIGFuZCBtb3ZlIHRvIHRvcFxuICogQHBhcmFtIHtOdW1iZXJ9IHBhcnRDb3VudCAtIGFjdHVhbCBwYXJ0IGNvdW50XG4gKiBAcGFyYW0ge0FycmF5fSB3b3JkUGFydHMgLSB3b3JkIHNwbGl0IGludG8gcGFydHNcbiAqIEByZXR1cm4ge251bWJlcltdfVxuICovXG5mdW5jdGlvbiBtb3ZlUHJpbWFyeVdvcmRUb1RvcChwYXJ0Q291bnQsIHdvcmRQYXJ0cykge1xuICBsZXQgbWFqb3JIaWdoZXN0ID0gMDtcbiAgbGV0IG1ham9yUG9zID0gMDtcbiAgbGV0IGluZGljZXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBwYXJ0Q291bnQgfSkubWFwKCh1LCBpKSA9PiBpKTtcblxuICBpbmRpY2VzLmZvckVhY2goaSA9PiB7XG4gICAgLy8gc29ydCBieSBwYXJ0IGxlbmd0aCwgbG9uZ2VzdCBmaXJzdFxuICAgIGNvbnN0IHBhcnRMZW4gPSAoKHdvcmRQYXJ0cyAmJiAod29yZFBhcnRzLmxlbmd0aCA+IGkpICYmIHdvcmRQYXJ0c1tpXSkgfHwgJycpLmxlbmd0aDtcblxuICAgIGlmIChwYXJ0TGVuID4gbWFqb3JIaWdoZXN0KSB7XG4gICAgICBtYWpvckhpZ2hlc3QgPSBwYXJ0TGVuO1xuICAgICAgbWFqb3JQb3MgPSBpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKG1ham9yUG9zID4gMCkgeyAvLyBtb3ZlXG4gICAgaW5kaWNlcy5zcGxpY2UobWFqb3JQb3MsIDEpO1xuICAgIGluZGljZXMudW5zaGlmdChtYWpvclBvcyk7XG4gIH1cbiAgcmV0dXJuIGluZGljZXM7XG59XG5cbi8qKlxuICogZ2V0IHRoZSBzdHJvbmdzIGFuZCBsZXhpY29uIGZvciBwb3NpdGlvblxuICogY2hlY2tzIGZvciBmb3JtYXRzIHN1Y2ggYXMgYGM6ZDpIMDc3NmAgb3IgJ0gxMjM6SDcyMjUnIGFuZCBleHRyYWN0cyB0aGUgYWN0dWFsIHN0cm9uZ3MgbnVtYmVyKHMpXG4gKiBAcGFyYW0ge1N0cmluZ30gc3Ryb25nIC0gcGFyc2UgdGhlIHN0cm9uZ3MgbnVtYmVycyBmb3IgcGFydFxuICogQHBhcmFtIHtPYmplY3R9IGxleGljb25EYXRhXG4gKiBAcGFyYW0ge251bWJlcn0gcG9zIC0gcG9zaXRpb24gb2YgcGFydCB0byBnZXQgc3Ryb25ncyBhbmQgbGV4aWNvblxuICogQHJldHVybiB7c3Ryb25nTnVtYmVyLCBsZXhpY29ufVxuICovXG5mdW5jdGlvbiBnZXRTdHJvbmdzQW5kTGV4aWNvbihzdHJvbmcsIGxleGljb25EYXRhLCBwb3MpIHtcbiAgbGV0IGxleGljb24gPSAnJztcbiAgbGV0IHN0cm9uZ051bWJlciA9IDA7XG4gIGNvbnN0IHN0cm9uZ3NQYXJ0cyA9IGxleGljb25IZWxwZXJzLmdldFN0cm9uZ3NQYXJ0cyhzdHJvbmcpO1xuXG4gIGlmIChzdHJvbmdzUGFydHMubGVuZ3RoID4gcG9zKSB7XG4gICAgc3Ryb25nID0gc3Ryb25nc1BhcnRzW3Bvc107XG4gIH0gZWxzZSB7XG4gICAgc3Ryb25nID0gJyc7XG4gIH1cblxuICBjb25zdCBsZXhpY29uSWQgPSBsZXhpY29uSGVscGVycy5sZXhpY29uSWRGcm9tU3Ryb25ncyhzdHJvbmcpO1xuICBzdHJvbmdOdW1iZXIgPSBsZXhpY29uSGVscGVycy5sZXhpY29uRW50cnlJZEZyb21TdHJvbmdzKHN0cm9uZyk7XG5cbiAgaWYgKGxleGljb25EYXRhICYmIGxleGljb25EYXRhW2xleGljb25JZF0gJiYgbGV4aWNvbkRhdGFbbGV4aWNvbklkXVtzdHJvbmdOdW1iZXJdKSB7XG4gICAgbGV4aWNvbiA9IGxleGljb25EYXRhW2xleGljb25JZF1bc3Ryb25nTnVtYmVyXS5sb25nO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3Ryb25nTnVtYmVyLCBsZXhpY29uLCBzdHJvbmcsXG4gIH07XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB3b3JkT2JqZWN0IC0gd29yZCB0byBkaXNwbGF5IGluIGxleGljb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBsZXhpY29uRGF0YSAtIGNvbnRhaW5zIGxleGljb24gZm9yIHN0cm9uZ3NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zbGF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZ2VuZXJhdGVXb3JkUGFydFxuICogQHBhcmFtIHtib29sZWFufSBpc0hlYnJldyAtIGlmIHRydWUgdGhlbiB3ZSBhZGp1c3QgZm9udCBzaXplIGZvciBPcmlnaW5hbCBsYW5ndWFnZVxuICogQHJldHVybiB7KltdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVXb3JkTGV4aWNvbkRldGFpbHMod29yZE9iamVjdCwgbGV4aWNvbkRhdGEsIHRyYW5zbGF0ZSwgZ2VuZXJhdGVXb3JkUGFydCwgaXNIZWJyZXcpIHtcbiAgbGV0IHdvcmRMZXhpY29uRGV0YWlscztcbiAgY29uc3Qgd29yZFBhcnRzID0gbGV4aWNvbkhlbHBlcnMuZ2V0V29yZFBhcnRzKHdvcmRPYmplY3QudGV4dCk7XG4gIGNvbnN0IG1vcnBoU3RycyA9IGdldFdvcmRQYXJ0cyh3b3JkT2JqZWN0Lm1vcnBoLCB0cmFuc2xhdGUpO1xuICBjb25zdCBzdHJvbmdzUGFydHMgPSBsZXhpY29uSGVscGVycy5nZXRTdHJvbmdzUGFydHMod29yZE9iamVjdC5zdHJvbmcpO1xuICBjb25zdCBwYXJ0Q291bnQgPSBNYXRoLm1heChtb3JwaFN0cnMubGVuZ3RoLCBzdHJvbmdzUGFydHMubGVuZ3RoLCB3b3JkUGFydHMubGVuZ3RoKTsgLy8gc2luY2UgdGhlcmUgbWF5IGJlIGluY29uc2lzdGFuY2llcywgdXNlIGxhcmdlc3QgY291bnRcblxuICBpZiAocGFydENvdW50IDwgMikge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0cm9uZ051bWJlciwgbGV4aWNvbiwgc3Ryb25nOiBzdHJvbmdzLFxuICAgIH0gPSBnZXRTdHJvbmdzQW5kTGV4aWNvbih3b3JkT2JqZWN0LnN0cm9uZywgbGV4aWNvbkRhdGEsIDApO1xuICAgIHdvcmRMZXhpY29uRGV0YWlscyA9IGdlbmVyYXRlV29yZFBhcnQodHJhbnNsYXRlLCB3b3JkT2JqZWN0LmxlbW1hLCBtb3JwaFN0cnNbMF0sIHN0cm9uZ051bWJlciwgc3Ryb25ncywgbGV4aWNvbiwgd29yZFBhcnRzWzBdLCAwLCAwLCBwYXJ0Q291bnQsIGlzSGVicmV3KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbmRpY2VzID0gbW92ZVByaW1hcnlXb3JkVG9Ub3AocGFydENvdW50LCB3b3JkUGFydHMpO1xuXG4gICAgd29yZExleGljb25EZXRhaWxzID0gaW5kaWNlcy5tYXAoKHBvcywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG1vcnBoU3RyID0gKChtb3JwaFN0cnMubGVuZ3RoID4gcG9zKSAmJiBtb3JwaFN0cnNbcG9zXSkgfHwgJyc7XG4gICAgICBjb25zdCB3b3JkID0gKCh3b3JkUGFydHMubGVuZ3RoID4gcG9zKSAmJiB3b3JkUGFydHNbcG9zXSkgfHwgJyc7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0cm9uZ051bWJlciwgbGV4aWNvbiwgc3Ryb25nOiBzdHJvbmdzLFxuICAgICAgfSA9IGdldFN0cm9uZ3NBbmRMZXhpY29uKHdvcmRPYmplY3Quc3Ryb25nLCBsZXhpY29uRGF0YSwgcG9zKTtcbiAgICAgIGNvbnN0IGxlbW1hU3RyID0gKGluZGV4ID09PSAwKSA/IHdvcmRPYmplY3QubGVtbWEgOiAnJztcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGdlbmVyYXRlV29yZFBhcnQodHJhbnNsYXRlLCBsZW1tYVN0ciwgbW9ycGhTdHIsIHN0cm9uZ051bWJlciwgc3Ryb25ncywgbGV4aWNvbiwgd29yZCwgcG9zLCBpbmRleCwgcGFydENvdW50LCBpc0hlYnJldylcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHdvcmRMZXhpY29uRGV0YWlscztcbn1cblxuY2xhc3MgV29yZExleGljb25EZXRhaWxzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHdvcmRPYmplY3QsIHRyYW5zbGF0ZSwgbGV4aWNvbkRhdGEsIGlzSGVicmV3LFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB3b3JkTGV4aWNvbkRldGFpbHMgPSBnZW5lcmF0ZVdvcmRMZXhpY29uRGV0YWlscyh3b3JkT2JqZWN0LCBsZXhpY29uRGF0YSwgdHJhbnNsYXRlLCBnZW5lcmF0ZVdvcmRQYXJ0LCBpc0hlYnJldyk7XG4gICAgcmV0dXJuIHdvcmRMZXhpY29uRGV0YWlscztcbiAgfVxufVxuXG5Xb3JkTGV4aWNvbkRldGFpbHMucHJvcFR5cGVzID0ge1xuICB0cmFuc2xhdGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHdvcmRPYmplY3Q6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgbGVtbWE6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICBtb3JwaDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHN0cm9uZzogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICB9KS5pc1JlcXVpcmVkLFxuICBsZXhpY29uRGF0YTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICBpc0hlYnJldzogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFdvcmRMZXhpY29uRGV0YWlscztcbiJdfQ==