tc-ui-toolkit
Version:
React components used to develop tools for the desktop app translationCore
412 lines (344 loc) • 47.3 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["default"] = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _reactBootstrap = require("react-bootstrap");
var _deepEqual = _interopRequireDefault(require("deep-equal"));
var _lodash = _interopRequireDefault(require("lodash"));
var _Panes = _interopRequireDefault(require("./Panes"));
var _ExpandedScripturePaneModal = _interopRequireDefault(require("./ExpandedScripturePaneModal"));
var _AddBibleButton = _interopRequireDefault(require("./AddBibleButton"));
var _AddPaneModal = _interopRequireDefault(require("./AddPaneModal"));
var _verseHelpers = require("./helpers/verseHelpers");
require("./ScripturePane.styles.css");
// components
// constant
var NAMESPACE = 'ScripturePane';
function ScripturePane(_ref) {
var bibles = _ref.bibles,
contextId = _ref.contextId,
translate = _ref.translate,
selections = _ref.selections,
showPopover = _ref.showPopover,
getLexiconData = _ref.getLexiconData,
setToolSettings = _ref.setToolSettings,
editTargetVerse = _ref.editTargetVerse,
handleModalOpen = _ref.handleModalOpen,
complexScriptFonts = _ref.complexScriptFonts,
currentPaneSettings = _ref.currentPaneSettings,
projectDetailsReducer = _ref.projectDetailsReducer,
expandedScripturePaneTitle = _ref.expandedScripturePaneTitle,
makeSureBiblesLoadedForTool = _ref.makeSureBiblesLoadedForTool,
addObjectPropertyToManifest = _ref.addObjectPropertyToManifest,
getAvailableScripturePaneSelections = _ref.getAvailableScripturePaneSelections,
onExpandedScripturePaneShow = _ref.onExpandedScripturePaneShow,
editVerseRef = _ref.editVerseRef,
autoOpenExpandedScripturePane = _ref.autoOpenExpandedScripturePane;
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
showExpandedScripturePane = _useState2[0],
toggleExpandedScripturePane = _useState2[1];
var _useState3 = (0, _react.useState)(false),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
showAddPaneModal = _useState4[0],
toggleAddPaneModal = _useState4[1];
var _useState5 = (0, _react.useState)({}),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
selectedPane = _useState6[0],
setSelectedPane = _useState6[1];
var _useState7 = (0, _react.useState)(autoOpenExpandedScripturePane),
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
currentAutoOpenExpSpCounter = _useState8[0],
setCurrentAutoOpenExpSpCounter = _useState8[1];
(0, _react.useEffect)(function () {
if (editVerseRef) {
// if verse is to be edited
openExpandedScripturePane();
}
}, [editVerseRef]);
(0, _react.useEffect)(function () {
if (currentAutoOpenExpSpCounter !== autoOpenExpandedScripturePane) {
// if changed
if (autoOpenExpandedScripturePane) {
// only show expanded scripture pane if counter is non-zero
openExpandedScripturePane();
}
setCurrentAutoOpenExpSpCounter(autoOpenExpandedScripturePane);
}
}, [autoOpenExpandedScripturePane]);
function openExpandedScripturePane() {
toggleExpandedScripturePane(true);
handleModalOpen(true); // eslint-disable-next-line no-unused-expressions
onExpandedScripturePaneShow && onExpandedScripturePaneShow(true);
}
function closeExpandedScripturePane() {
toggleExpandedScripturePane(false);
handleModalOpen(false); // eslint-disable-next-line no-unused-expressions
onExpandedScripturePaneShow && onExpandedScripturePaneShow(false);
}
function showAddBibleModal() {
toggleAddPaneModal(true);
handleModalOpen(true);
}
function hideAddBibleModal() {
toggleAddPaneModal(false);
handleModalOpen(false);
setSelectedPane({});
}
function selectSourceLanguage(value) {
var parts = value.split('_');
var _parts = (0, _slicedToArray2["default"])(parts, 2),
languageId = _parts[0],
bibleId = _parts[1];
var isPreRelease = false;
if (languageId.substring(0, 1) === '*') {
languageId = languageId.substring(1);
isPreRelease = translate('pre_release');
}
var owner = parts.slice(2).join('_'); // remainder is owner
var selectedBibleId = {
languageId: languageId,
bibleId: bibleId,
owner: owner,
isPreRelease: isPreRelease
};
setSelectedPane(function () {
return value ? selectedBibleId : {};
});
}
function addNewBibleResource() {
try {
if (currentPaneSettings) {
if (Object.keys(selectedPane).length) {
currentPaneSettings.push(selectedPane);
setToolSettings(NAMESPACE, 'currentPaneSettings', currentPaneSettings);
makeSureBiblesLoadedForTool();
hideAddBibleModal();
}
}
} catch (e) {
console.warn(e);
}
}
function removePane(key) {
try {
if (currentPaneSettings) {
currentPaneSettings.splice(key, 1);
setToolSettings(NAMESPACE, 'currentPaneSettings', currentPaneSettings);
}
} catch (e) {
console.warn(e);
}
}
function changePaneFontSize(index, fontSize) {
try {
if (currentPaneSettings) {
var paneSettings = _lodash["default"].cloneDeep(currentPaneSettings);
var newCurrentPaneSettings = paneSettings.map(function (paneSetting, i) {
if (index === i) {
paneSetting.fontSize = fontSize;
}
return paneSetting;
});
setToolSettings(NAMESPACE, 'currentPaneSettings', newCurrentPaneSettings);
}
} catch (e) {
console.warn(e);
}
}
function changePaneFontType(index, fontType) {
try {
if (currentPaneSettings) {
var paneSettings = _lodash["default"].cloneDeep(currentPaneSettings);
var newCurrentPaneSettings = paneSettings.map(function (paneSetting, i) {
if (index === i) {
paneSetting.font = fontType;
}
return paneSetting;
});
setToolSettings(NAMESPACE, 'currentPaneSettings', newCurrentPaneSettings);
}
} catch (e) {
console.warn(e);
}
}
var projectManifest = projectDetailsReducer.manifest;
var targetLanguageFont = projectManifest.projectFont || '';
var foundViewUrl = false; // make sure not a viewUrl pane
currentPaneSettings = currentPaneSettings.filter(function (paneSetting) {
if (paneSetting.bibleId === 'viewURL') {
if (!foundViewUrl) {
if (paneSetting.description === (projectManifest === null || projectManifest === void 0 ? void 0 : projectManifest.view_url)) {
var bibleId = Object.keys(bibles).find(function (langId) {
var found = false;
if (langId.split('_')[0] === 'url') {
var _bibles$langId, _bibles$langId$viewUR;
if ((_bibles$langId = bibles[langId]) === null || _bibles$langId === void 0 ? void 0 : (_bibles$langId$viewUR = _bibles$langId.viewURL) === null || _bibles$langId$viewUR === void 0 ? void 0 : _bibles$langId$viewUR.manifest) {
found = true;
}
}
return found;
});
if (bibleId) {
foundViewUrl = true;
return true;
}
}
}
return false;
}
return true;
});
if (bibles && !foundViewUrl && (projectManifest === null || projectManifest === void 0 ? void 0 : projectManifest.view_url)) {
// check for additional url to show
for (var _i = 0, _Object$keys = Object.keys(bibles); _i < _Object$keys.length; _i++) {
var lang = _Object$keys[_i];
var languageId = 'url'; // to match
if (lang.split('_')[0] === languageId) {
var langBibles = bibles[lang];
for (var _i2 = 0, _Object$keys2 = Object.keys(langBibles); _i2 < _Object$keys2.length; _i2++) {
var bibleId = _Object$keys2[_i2];
if (bibleId === 'viewURL') {
var _bible$manifest;
var bible = langBibles[bibleId];
var view_url = bible === null || bible === void 0 ? void 0 : (_bible$manifest = bible.manifest) === null || _bible$manifest === void 0 ? void 0 : _bible$manifest.view_url;
if (view_url && view_url === (projectManifest === null || projectManifest === void 0 ? void 0 : projectManifest.view_url)) {
// found bible with matching url
if (bible === null || bible === void 0 ? void 0 : bible[1]) {
var _bible$manifest2;
// have content
// paneSetting.languageId, paneSetting.bibleId, paneSetting.owner
currentPaneSettings.push({
bibleId: bibleId,
languageId: languageId,
owner: lang.substring(4),
description: view_url,
actualLanguage: bible === null || bible === void 0 ? void 0 : (_bible$manifest2 = bible.manifest) === null || _bible$manifest2 === void 0 ? void 0 : _bible$manifest2.language_id
});
}
}
}
}
}
}
} // make sure bibles in currentPaneSettings are found in the bibles object in the resourcesReducer
currentPaneSettings = currentPaneSettings.filter(function (paneSetting) {
var found = (0, _verseHelpers.getBibleElement)(bibles, paneSetting.languageId, paneSetting.bibleId, paneSetting.owner);
if (!found) {
console.log("Pane not loaded in bible: ".concat(JSON.stringify(paneSetting)));
}
return found;
});
return /*#__PURE__*/_react["default"].createElement("div", {
className: "scripture-pane-container"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "inner-container"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "title-bar"
}, /*#__PURE__*/_react["default"].createElement("span", null, translate('pane.title')), /*#__PURE__*/_react["default"].createElement(_reactBootstrap.Glyphicon, {
onClick: openExpandedScripturePane,
glyph: 'fullscreen',
style: {
cursor: 'pointer'
},
title: translate('pane.expand_hover')
})), /*#__PURE__*/_react["default"].createElement("div", {
className: "panes-container"
}, /*#__PURE__*/_react["default"].createElement(_Panes["default"], {
bibles: bibles,
contextId: contextId,
translate: translate,
removePane: removePane,
selections: selections,
showPopover: showPopover,
getLexiconData: getLexiconData,
projectManifest: projectManifest,
complexScriptFonts: complexScriptFonts,
changePaneFontSize: changePaneFontSize,
changePaneFontType: changePaneFontType,
currentPaneSettings: currentPaneSettings,
addObjectPropertyToManifest: addObjectPropertyToManifest
}), /*#__PURE__*/_react["default"].createElement(_AddBibleButton["default"], {
showAddBibleModal: showAddBibleModal,
clickAddResource: translate('pane.add_resource')
}))), showExpandedScripturePane ? /*#__PURE__*/_react["default"].createElement(_ExpandedScripturePaneModal["default"], {
bibles: bibles,
contextId: contextId,
translate: translate,
selections: selections,
showPopover: showPopover,
getLexiconData: getLexiconData,
show: showExpandedScripturePane,
editTargetVerse: editTargetVerse,
primaryLabel: translate('close'),
title: expandedScripturePaneTitle,
onHide: closeExpandedScripturePane,
targetLanguageFont: targetLanguageFont,
currentPaneSettings: currentPaneSettings,
projectDetailsReducer: projectDetailsReducer,
editVerseRef: editVerseRef
}) : /*#__PURE__*/_react["default"].createElement("div", null), showAddPaneModal ? /*#__PURE__*/_react["default"].createElement(_AddPaneModal["default"], {
translate: translate,
onHide: hideAddBibleModal,
selectLabel: translate('select'),
show: showAddPaneModal,
selectedPane: selectedPane,
currentPaneSettings: currentPaneSettings,
title: translate('pane.add_resource_label'),
addNewBibleResource: addNewBibleResource,
selectSourceLanguage: selectSourceLanguage,
selectLanguageLabel: translate('pane.select_language'),
getAvailableScripturePaneSelections: getAvailableScripturePaneSelections
}) : /*#__PURE__*/_react["default"].createElement("div", null));
}
ScripturePane.defaultProps = {
handleModalOpen: function handleModalOpen() {
console.info('handleModalOpen prop was not passed.');
},
onExpandedScripturePaneShow: null
};
ScripturePane.propTypes = {
handleModalOpen: _propTypes["default"].func,
bibles: _propTypes["default"].object.isRequired,
translate: _propTypes["default"].func.isRequired,
showPopover: _propTypes["default"].func.isRequired,
contextId: _propTypes["default"].object.isRequired,
selections: _propTypes["default"].array.isRequired,
getLexiconData: _propTypes["default"].func.isRequired,
editTargetVerse: _propTypes["default"].func.isRequired,
setToolSettings: _propTypes["default"].func.isRequired,
complexScriptFonts: _propTypes["default"].object.isRequired,
currentPaneSettings: _propTypes["default"].array.isRequired,
projectDetailsReducer: _propTypes["default"].object.isRequired,
addObjectPropertyToManifest: _propTypes["default"].func.isRequired,
makeSureBiblesLoadedForTool: _propTypes["default"].func.isRequired,
expandedScripturePaneTitle: _propTypes["default"].string.isRequired,
getAvailableScripturePaneSelections: _propTypes["default"].func.isRequired,
onExpandedScripturePaneShow: _propTypes["default"].func,
// called when expanded Scripture Pane as shown or hidden
editVerseRef: _propTypes["default"].string,
// if given then open verse for edit (single verse)
autoOpenExpandedScripturePane: _propTypes["default"].number // expanded SP is openned if this changes value
};
/**
* Custom comparison function to determine if component should rerender.
* @param {object} prevProps
* @param {object} nextProps
*/
function areEqual(prevProps, nextProps) {
/*
Return true if passing nextProps.bibles to
render would return the same result as passing
prevProps.bibles to render, otherwise return false
*/
return (0, _deepEqual["default"])(prevProps.bibles, nextProps.bibles) && (0, _deepEqual["default"])(prevProps.contextId, nextProps.contextId) && (0, _deepEqual["default"])(prevProps.currentPaneSettings, nextProps.currentPaneSettings) && (0, _deepEqual["default"])(prevProps.projectDetailsReducer, nextProps.projectDetailsReducer) && prevProps.expandedScripturePaneTitle === prevProps.expandedScripturePaneTitle && (0, _deepEqual["default"])(prevProps.selections, nextProps.selections) && prevProps.editVerseRef === nextProps.editVerseRef && prevProps.autoOpenExpandedScripturePane === nextProps.autoOpenExpandedScripturePane;
} // using React.memo to boost performance by memoizing the result
var _default = /*#__PURE__*/_react["default"].memo(ScripturePane, areEqual);
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TY3JpcHR1cmVQYW5lL1NjcmlwdHVyZVBhbmUuanMiXSwibmFtZXMiOlsiTkFNRVNQQUNFIiwiU2NyaXB0dXJlUGFuZSIsImJpYmxlcyIsImNvbnRleHRJZCIsInRyYW5zbGF0ZSIsInNlbGVjdGlvbnMiLCJzaG93UG9wb3ZlciIsImdldExleGljb25EYXRhIiwic2V0VG9vbFNldHRpbmdzIiwiZWRpdFRhcmdldFZlcnNlIiwiaGFuZGxlTW9kYWxPcGVuIiwiY29tcGxleFNjcmlwdEZvbnRzIiwiY3VycmVudFBhbmVTZXR0aW5ncyIsInByb2plY3REZXRhaWxzUmVkdWNlciIsImV4cGFuZGVkU2NyaXB0dXJlUGFuZVRpdGxlIiwibWFrZVN1cmVCaWJsZXNMb2FkZWRGb3JUb29sIiwiYWRkT2JqZWN0UHJvcGVydHlUb01hbmlmZXN0IiwiZ2V0QXZhaWxhYmxlU2NyaXB0dXJlUGFuZVNlbGVjdGlvbnMiLCJvbkV4cGFuZGVkU2NyaXB0dXJlUGFuZVNob3ciLCJlZGl0VmVyc2VSZWYiLCJhdXRvT3BlbkV4cGFuZGVkU2NyaXB0dXJlUGFuZSIsInNob3dFeHBhbmRlZFNjcmlwdHVyZVBhbmUiLCJ0b2dnbGVFeHBhbmRlZFNjcmlwdHVyZVBhbmUiLCJzaG93QWRkUGFuZU1vZGFsIiwidG9nZ2xlQWRkUGFuZU1vZGFsIiwic2VsZWN0ZWRQYW5lIiwic2V0U2VsZWN0ZWRQYW5lIiwiY3VycmVudEF1dG9PcGVuRXhwU3BDb3VudGVyIiwic2V0Q3VycmVudEF1dG9PcGVuRXhwU3BDb3VudGVyIiwib3BlbkV4cGFuZGVkU2NyaXB0dXJlUGFuZSIsImNsb3NlRXhwYW5kZWRTY3JpcHR1cmVQYW5lIiwic2hvd0FkZEJpYmxlTW9kYWwiLCJoaWRlQWRkQmlibGVNb2RhbCIsInNlbGVjdFNvdXJjZUxhbmd1YWdlIiwidmFsdWUiLCJwYXJ0cyIsInNwbGl0IiwibGFuZ3VhZ2VJZCIsImJpYmxlSWQiLCJpc1ByZVJlbGVhc2UiLCJzdWJzdHJpbmciLCJvd25lciIsInNsaWNlIiwiam9pbiIsInNlbGVjdGVkQmlibGVJZCIsImFkZE5ld0JpYmxlUmVzb3VyY2UiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwicHVzaCIsImUiLCJjb25zb2xlIiwid2FybiIsInJlbW92ZVBhbmUiLCJrZXkiLCJzcGxpY2UiLCJjaGFuZ2VQYW5lRm9udFNpemUiLCJpbmRleCIsImZvbnRTaXplIiwicGFuZVNldHRpbmdzIiwiXyIsImNsb25lRGVlcCIsIm5ld0N1cnJlbnRQYW5lU2V0dGluZ3MiLCJtYXAiLCJwYW5lU2V0dGluZyIsImkiLCJjaGFuZ2VQYW5lRm9udFR5cGUiLCJmb250VHlwZSIsImZvbnQiLCJwcm9qZWN0TWFuaWZlc3QiLCJtYW5pZmVzdCIsInRhcmdldExhbmd1YWdlRm9udCIsInByb2plY3RGb250IiwiZm91bmRWaWV3VXJsIiwiZmlsdGVyIiwiZGVzY3JpcHRpb24iLCJ2aWV3X3VybCIsImZpbmQiLCJsYW5nSWQiLCJmb3VuZCIsInZpZXdVUkwiLCJsYW5nIiwibGFuZ0JpYmxlcyIsImJpYmxlIiwiYWN0dWFsTGFuZ3VhZ2UiLCJsYW5ndWFnZV9pZCIsImxvZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjdXJzb3IiLCJkZWZhdWx0UHJvcHMiLCJpbmZvIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiZnVuYyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJhcnJheSIsInN0cmluZyIsIm51bWJlciIsImFyZUVxdWFsIiwicHJldlByb3BzIiwibmV4dFByb3BzIiwiUmVhY3QiLCJtZW1vIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBUEE7QUFTQTtBQUNBLElBQU1BLFNBQVMsR0FBRyxlQUFsQjs7QUFFQSxTQUFTQyxhQUFULE9Bb0JHO0FBQUEsTUFuQkRDLE1BbUJDLFFBbkJEQSxNQW1CQztBQUFBLE1BbEJEQyxTQWtCQyxRQWxCREEsU0Fr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RXlFLHNCQUFVTSxNQW5CakIsQ0FtQnlCOztBQW5CekIsQ0FBMUI7QUFzQkE7Ozs7OztBQUtBLFNBQVNDLFFBQVQsQ0FBa0JDLFNBQWxCLEVBQTZCQyxTQUE3QixFQUF3QztBQUN0Qzs7Ozs7QUFLQSxTQUFPLDJCQUFVRCxTQUFTLENBQUNuRyxNQUFwQixFQUE0Qm9HLFNBQVMsQ0FBQ3BHLE1BQXRDLEtBQ0wsMkJBQVVtRyxTQUFTLENBQUNsRyxTQUFwQixFQUErQm1HLFNBQVMsQ0FBQ25HLFNBQXpDLENBREssSUFFTCwyQkFBVWtHLFNBQVMsQ0FBQ3pGLG1CQUFwQixFQUF5QzBGLFNBQVMsQ0FBQzFGLG1CQUFuRCxDQUZLLElBR0wsMkJBQVV5RixTQUFTLENBQUN4RixxQkFBcEIsRUFBMkN5RixTQUFTLENBQUN6RixxQkFBckQsQ0FISyxJQUlMd0YsU0FBUyxDQUFDdkYsMEJBQVYsS0FBeUN1RixTQUFTLENBQUN2RiwwQkFKOUMsSUFLTCwyQkFBVXVGLFNBQVMsQ0FBQ2hHLFVBQXBCLEVBQWdDaUcsU0FBUyxDQUFDakcsVUFBMUMsQ0FMSyxJQU1KZ0csU0FBUyxDQUFDbEYsWUFBVixLQUEyQm1GLFNBQVMsQ0FBQ25GLFlBTmpDLElBT0prRixTQUFTLENBQUNqRiw2QkFBVixLQUE0Q2tGLFNBQVMsQ0FBQ2xGLDZCQVB6RDtBQVFELEMsQ0FFRDs7OzRCQUNlbUYsa0JBQU1DLElBQU4sQ0FBV3ZHLGFBQVgsRUFBMEJtRyxRQUExQixDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgR2x5cGhpY29uIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJztcbmltcG9ydCBkZWVwRXF1YWwgZnJvbSAnZGVlcC1lcXVhbCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuLy8gY29tcG9uZW50c1xuaW1wb3J0IFBhbmVzIGZyb20gJy4vUGFuZXMnO1xuaW1wb3J0IEV4cGFuZGVkU2NyaXB0dXJlUGFuZU1vZGFsIGZyb20gJy4vRXhwYW5kZWRTY3JpcHR1cmVQYW5lTW9kYWwnO1xuaW1wb3J0IEFkZEJpYmxlQnV0dG9uIGZyb20gJy4vQWRkQmlibGVCdXR0b24nO1xuaW1wb3J0IEFkZFBhbmVNb2RhbCBmcm9tICcuL0FkZFBhbmVNb2RhbCc7XG5pbXBvcnQgeyBnZXRCaWJsZUVsZW1lbnQgfSBmcm9tICcuL2hlbHBlcnMvdmVyc2VIZWxwZXJzJztcblxuaW1wb3J0ICcuL1NjcmlwdHVyZVBhbmUuc3R5bGVzLmNzcyc7XG5cbi8vIGNvbnN0YW50XG5jb25zdCBOQU1FU1BBQ0UgPSAnU2NyaXB0dXJlUGFuZSc7XG5cbmZ1bmN0aW9uIFNjcmlwdHVyZVBhbmUoe1xuICBiaWJsZXMsXG4gIGNvbnRleHRJZCxcbiAgdHJhbnNsYXRlLFxuICBzZWxlY3Rpb25zLFxuICBzaG93UG9wb3ZlcixcbiAgZ2V0TGV4aWNvbkRhdGEsXG4gIHNldFRvb2xTZXR0aW5ncyxcbiAgZWRpdFRhcmdldFZlcnNlLFxuICBoYW5kbGVNb2RhbE9wZW4sXG4gIGNvbXBsZXhTY3JpcHRGb250cyxcbiAgY3VycmVudFBhbmVTZXR0aW5ncyxcbiAgcHJvamVjdERldGFpbHNSZWR1Y2VyLFxuICBleHBhbmRlZFNjcmlwdHVyZVBhbmVUaXRsZSxcbiAgbWFrZVN1cmVCaWJsZXNMb2FkZWRGb3JUb29sLFxuICBhZGRPYmplY3RQcm9wZXJ0eVRvTWFuaWZlc3QsXG4gIGdldEF2YWlsYWJsZVNjcmlwdHVyZVBhbmVTZWxlY3Rpb25zLFxuICBvbkV4cGFuZGVkU2NyaXB0dXJlUGFuZVNob3csXG4gIGVkaXRWZXJzZVJlZixcbiAgYXV0b09wZW5FeHBhbmRlZFNjcmlwdHVyZVBhbmUsXG59KSB7XG4gIGNvbnN0IFtzaG93RXhwYW5kZWRTY3JpcHR1cmVQYW5lLCB0b2dnbGVFeHBhbmRlZFNjcmlwdHVyZVBhbmVdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2hvd0FkZFBhbmVNb2RhbCwgdG9nZ2xlQWRkUGFuZU1vZGFsXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3NlbGVjdGVkUGFuZSwgc2V0U2VsZWN0ZWRQYW5lXSA9IHVzZVN0YXRlKHt9KTtcbiAgY29uc3QgW2N1cnJlbnRBdXRvT3BlbkV4cFNwQ291bnRlciwgc2V0Q3VycmVudEF1dG9PcGVuRXhwU3BDb3VudGVyXSA9IHVzZVN0YXRlKGF1dG9PcGVuRXhwYW5kZWRTY3JpcHR1cmVQYW5lKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChlZGl0VmVyc2VSZWYpIHsgLy8gaWYgdmVyc2UgaXMgdG8gYmUgZWRpdGVkXG4gICAgICBvcGVuRXhwYW5kZWRTY3JpcHR1cmVQYW5lKCk7XG4gICAgfVxuICB9LCBbZWRpdFZlcnNlUmVmXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY3VycmVudEF1dG9PcGVuRXhwU3BDb3VudGVyICE9PSBhdXRvT3BlbkV4cGFuZGVkU2NyaXB0dXJlUGFuZSkgeyAvLyBpZiBjaGFuZ2VkXG4gICAgICBpZiAoYXV0b09wZW5FeHBhbmRlZFNjcmlwdHVyZVBhbmUpIHsgLy8gb25seSBzaG93IGV4cGFuZGVkIHNjcmlwdHVyZSBwYW5lIGlmIGNvdW50ZXIgaXMgbm9uLXplcm9cbiAgICAgICAgb3BlbkV4cGFuZGVkU2NyaXB0dXJlUGFuZSgpO1xuICAgICAgfVxuICAgICAgc2V0Q3VycmVudEF1dG9PcGVuRXhwU3BDb3VudGVyKGF1dG9PcGVuRXhwYW5kZWRTY3JpcHR1cmVQYW5lKTtcbiAgICB9XG4gIH0sIFthdXRvT3BlbkV4cGFuZGVkU2NyaXB0dXJlUGFuZV0pO1xuXG4gIGZ1bmN0aW9uIG9wZW5FeHBhbmRlZFNjcmlwdHVyZVBhbmUoKSB7XG4gICAgdG9nZ2xlRXhwYW5kZWRTY3JpcHR1cmVQYW5lKHRydWUpO1xuICAgIGhhbmRsZU1vZGFsT3Blbih0cnVlKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgb25FeHBhbmRlZFNjcmlwdHVyZVBhbmVTaG93ICYmIG9uRXhwYW5kZWRTY3JpcHR1cmVQYW5lU2hvdyh0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlRXhwYW5kZWRTY3JpcHR1cmVQYW5lKCkge1xuICAgIHRvZ2dsZUV4cGFuZGVkU2NyaXB0dXJlUGFuZShmYWxzZSk7XG4gICAgaGFuZGxlTW9kYWxPcGVuKGZhbHNlKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgb25FeHBhbmRlZFNjcmlwdHVyZVBhbmVTaG93ICYmIG9uRXhwYW5kZWRTY3JpcHR1cmVQYW5lU2hvdyhmYWxzZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93QWRkQmlibGVNb2RhbCgpIHtcbiAgICB0b2dnbGVBZGRQYW5lTW9kYWwodHJ1ZSk7XG4gICAgaGFuZGxlTW9kYWxPcGVuKHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlkZUFkZEJpYmxlTW9kYWwoKSB7XG4gICAgdG9nZ2xlQWRkUGFuZU1vZGFsKGZhbHNlKTtcbiAgICBoYW5kbGVNb2RhbE9wZW4oZmFsc2UpO1xuICAgIHNldFNlbGVjdGVkUGFuZSh7fSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3RTb3VyY2VMYW5ndWFnZSh2YWx1ZSkge1xuICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQoJ18nKTtcbiAgICBsZXQgWyBsYW5ndWFnZUlkLCBiaWJsZUlkXSA9IHBhcnRzO1xuICAgIGxldCBpc1ByZVJlbGVhc2UgPSBmYWxzZTtcblxuICAgIGlmIChsYW5ndWFnZUlkLnN1YnN0cmluZygwLDEpID09PSAnKicpIHtcbiAgICAgIGxhbmd1YWdlSWQgPSBsYW5ndWFnZUlkLnN1YnN0cmluZygxKTtcbiAgICAgIGlzUHJlUmVsZWFzZSA9IHRyYW5zbGF0ZSgncHJlX3JlbGVhc2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCBvd25lciA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oJ18nKTsgLy8gcmVtYWluZGVyIGlzIG93bmVyXG4gICAgY29uc3Qgc2VsZWN0ZWRCaWJsZUlkID0ge1xuICAgICAgbGFuZ3VhZ2VJZCxcbiAgICAgIGJpYmxlSWQsXG4gICAgICBvd25lcixcbiAgICAgIGlzUHJlUmVsZWFzZSxcbiAgICB9O1xuXG4gICAgc2V0U2VsZWN0ZWRQYW5lKCgpID0+IHZhbHVlID8gc2VsZWN0ZWRCaWJsZUlkIDoge30pO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkTmV3QmlibGVSZXNvdXJjZSgpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGN1cnJlbnRQYW5lU2V0dGluZ3MpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNlbGVjdGVkUGFuZSkubGVuZ3RoKSB7XG4gICAgICAgICAgY3VycmVudFBhbmVTZXR0aW5ncy5wdXNoKHNlbGVjdGVkUGFuZSk7XG4gICAgICAgICAgc2V0VG9vbFNldHRpbmdzKE5BTUVTUEFDRSwgJ2N1cnJlbnRQYW5lU2V0dGluZ3MnLCBjdXJyZW50UGFuZVNldHRpbmdzKTtcbiAgICAgICAgICBtYWtlU3VyZUJpYmxlc0xvYWRlZEZvclRvb2woKTtcbiAgICAgICAgICBoaWRlQWRkQmlibGVNb2RhbCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZVBhbmUoa2V5KSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjdXJyZW50UGFuZVNldHRpbmdzKSB7XG4gICAgICAgIGN1cnJlbnRQYW5lU2V0dGluZ3Muc3BsaWNlKGtleSwgMSk7XG4gICAgICAgIHNldFRvb2xTZXR0aW5ncyhOQU1FU1BBQ0UsICdjdXJyZW50UGFuZVNldHRpbmdzJywgY3VycmVudFBhbmVTZXR0aW5ncyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoYW5nZVBhbmVGb250U2l6ZShpbmRleCwgZm9udFNpemUpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGN1cnJlbnRQYW5lU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3QgcGFuZVNldHRpbmdzID0gXy5jbG9uZURlZXAoY3VycmVudFBhbmVTZXR0aW5ncyk7XG4gICAgICAgIGNvbnN0IG5ld0N1cnJlbnRQYW5lU2V0dGluZ3MgPSBwYW5lU2V0dGluZ3MubWFwKChwYW5lU2V0dGluZywgaSkgPT4ge1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xuICAgICAgICAgICAgcGFuZVNldHRpbmcuZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcGFuZVNldHRpbmc7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXRUb29sU2V0dGluZ3MoTkFNRVNQQUNFLCAnY3VycmVudFBhbmVTZXR0aW5ncycsIG5ld0N1cnJlbnRQYW5lU2V0dGluZ3MpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGFuZ2VQYW5lRm9udFR5cGUoaW5kZXgsIGZvbnRUeXBlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjdXJyZW50UGFuZVNldHRpbmdzKSB7XG4gICAgICAgIGNvbnN0IHBhbmVTZXR0aW5ncyA9IF8uY2xvbmVEZWVwKGN1cnJlbnRQYW5lU2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBuZXdDdXJyZW50UGFuZVNldHRpbmdzID0gcGFuZVNldHRpbmdzLm1hcCgocGFuZVNldHRpbmcsIGkpID0+IHtcbiAgICAgICAgICBpZiAoaW5kZXggPT09IGkpIHtcbiAgICAgICAgICAgIHBhbmVTZXR0aW5nLmZvbnQgPSBmb250VHlwZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcGFuZVNldHRpbmc7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXRUb29sU2V0dGluZ3MoTkFNRVNQQUNFLCAnY3VycmVudFBhbmVTZXR0aW5ncycsIG5ld0N1cnJlbnRQYW5lU2V0dGluZ3MpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IG1hbmlmZXN0OiBwcm9qZWN0TWFuaWZlc3QgfSA9IHByb2plY3REZXRhaWxzUmVkdWNlcjtcbiAgY29uc3QgdGFyZ2V0TGFuZ3VhZ2VGb250ID0gcHJvamVjdE1hbmlmZXN0LnByb2plY3RGb250IHx8ICcnO1xuICBsZXQgZm91bmRWaWV3VXJsID0gZmFsc2U7XG5cbiAgLy8gbWFrZSBzdXJlIG5vdCBhIHZpZXdVcmwgcGFuZVxuICBjdXJyZW50UGFuZVNldHRpbmdzID0gY3VycmVudFBhbmVTZXR0aW5ncy5maWx0ZXIoKHBhbmVTZXR0aW5nKSA9PiB7XG4gICAgaWYgKHBhbmVTZXR0aW5nLmJpYmxlSWQgPT09ICd2aWV3VVJMJykge1xuICAgICAgaWYgKCFmb3VuZFZpZXdVcmwpIHtcbiAgICAgICAgaWYgKHBhbmVTZXR0aW5nLmRlc2NyaXB0aW9uID09PSBwcm9qZWN0TWFuaWZlc3Q/LnZpZXdfdXJsKSB7XG4gICAgICAgICAgY29uc3QgYmlibGVJZCA9IE9iamVjdC5rZXlzKGJpYmxlcykuZmluZChsYW5nSWQgPT4ge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChsYW5nSWQuc3BsaXQoJ18nKVswXSA9PT0gJ3VybCcpIHtcbiAgICAgICAgICAgICAgaWYgKGJpYmxlc1tsYW5nSWRdPy52aWV3VVJMPy5tYW5pZmVzdCkge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGJpYmxlSWQpIHtcbiAgICAgICAgICAgIGZvdW5kVmlld1VybCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuXG4gIGlmIChiaWJsZXMgJiYgIWZvdW5kVmlld1VybCAmJiBwcm9qZWN0TWFuaWZlc3Q/LnZpZXdfdXJsKSB7IC8vIGNoZWNrIGZvciBhZGRpdGlvbmFsIHVybCB0byBzaG93XG4gICAgZm9yIChjb25zdCBsYW5nIG9mIE9iamVjdC5rZXlzKGJpYmxlcykpIHtcbiAgICAgIGNvbnN0IGxhbmd1YWdlSWQgPSAndXJsJzsgLy8gdG8gbWF0Y2hcblxuICAgICAgaWYgKGxhbmcuc3BsaXQoJ18nKVswXSA9PT0gbGFuZ3VhZ2VJZCkge1xuICAgICAgICBjb25zdCBsYW5nQmlibGVzID0gYmlibGVzW2xhbmddO1xuXG4gICAgICAgIGZvciAoY29uc3QgYmlibGVJZCBvZiBPYmplY3Qua2V5cyhsYW5nQmlibGVzKSkge1xuICAgICAgICAgIGlmIChiaWJsZUlkID09PSAndmlld1VSTCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpYmxlID0gbGFuZ0JpYmxlc1tiaWJsZUlkXTtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdfdXJsID0gYmlibGU/Lm1hbmlmZXN0Py52aWV3X3VybDtcblxuICAgICAgICAgICAgaWYgKHZpZXdfdXJsICYmICh2aWV3X3VybCA9PT0gcHJvamVjdE1hbmlmZXN0Py52aWV3X3VybCkpIHsgLy8gZm91bmQgYmlibGUgd2l0aCBtYXRjaGluZyB1cmxcbiAgICAgICAgICAgICAgaWYgKGJpYmxlPy5bMV0pIHsgLy8gaGF2ZSBjb250ZW50XG4gICAgICAgICAgICAgICAgLy8gcGFuZVNldHRpbmcubGFuZ3VhZ2VJZCwgcGFuZVNldHRpbmcuYmlibGVJZCwgcGFuZVNldHRpbmcub3duZXJcbiAgICAgICAgICAgICAgICBjdXJyZW50UGFuZVNldHRpbmdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgYmlibGVJZCxcbiAgICAgICAgICAgICAgICAgIGxhbmd1YWdlSWQsXG4gICAgICAgICAgICAgICAgICBvd25lcjogbGFuZy5zdWJzdHJpbmcoNCksXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdmlld191cmwsXG4gICAgICAgICAgICAgICAgICBhY3R1YWxMYW5ndWFnZTogYmlibGU/Lm1hbmlmZXN0Py5sYW5ndWFnZV9pZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG1ha2Ugc3VyZSBiaWJsZXMgaW4gY3VycmVudFBhbmVTZXR0aW5ncyBhcmUgZm91bmQgaW4gdGhlIGJpYmxlcyBvYmplY3QgaW4gdGhlIHJlc291cmNlc1JlZHVjZXJcbiAgY3VycmVudFBhbmVTZXR0aW5ncyA9IGN1cnJlbnRQYW5lU2V0dGluZ3MuZmlsdGVyKChwYW5lU2V0dGluZykgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gZ2V0QmlibGVFbGVtZW50KGJpYmxlcywgcGFuZVNldHRpbmcubGFuZ3VhZ2VJZCwgcGFuZVNldHRpbmcuYmlibGVJZCwgcGFuZVNldHRpbmcub3duZXIpO1xuXG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgY29uc29sZS5sb2coYFBhbmUgbm90IGxvYWRlZCBpbiBiaWJsZTogJHtKU09OLnN0cmluZ2lmeShwYW5lU2V0dGluZyl9YCk7XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbiAgfSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInNjcmlwdHVyZS1wYW5lLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbm5lci1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0aXRsZS1iYXJcIj5cbiAgICAgICAgICA8c3Bhbj57dHJhbnNsYXRlKCdwYW5lLnRpdGxlJyl9PC9zcGFuPlxuICAgICAgICAgIDxHbHlwaGljb25cbiAgICAgICAgICAgIG9uQ2xpY2s9e29wZW5FeHBhbmRlZFNjcmlwdHVyZVBhbmV9XG4gICAgICAgICAgICBnbHlwaD17J2Z1bGxzY3JlZW4nfVxuICAgICAgICAgICAgc3R5bGU9e3sgY3Vyc29yOiAncG9pbnRlcicgfX1cbiAgICAgICAgICAgIHRpdGxlPXt0cmFuc2xhdGUoJ3BhbmUuZXhwYW5kX2hvdmVyJyl9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPFBhbmVzXG4gICAgICAgICAgICBiaWJsZXM9e2JpYmxlc31cbiAgICAgICAgICAgIGNvbnRleHRJZD17Y29udGV4dElkfVxuICAgICAgICAgICAgdHJhbnNsYXRlPXt0cmFuc2xhdGV9XG4gICAgICAgICAgICByZW1vdmVQYW5lPXtyZW1vdmVQYW5lfVxuICAgICAgICAgICAgc2VsZWN0aW9ucz17c2VsZWN0aW9uc31cbiAgICAgICAgICAgIHNob3dQb3BvdmVyPXtzaG93UG9wb3Zlcn1cbiAgICAgICAgICAgIGdldExleGljb25EYXRhPXtnZXRMZXhpY29uRGF0YX1cbiAgICAgICAgICAgIHByb2plY3RNYW5pZmVzdD17cHJvamVjdE1hbmlmZXN0fVxuICAgICAgICAgICAgY29tcGxleFNjcmlwdEZvbnRzPXtjb21wbGV4U2NyaXB0Rm9udHN9XG4gICAgICAgICAgICBjaGFuZ2VQYW5lRm9udFNpemU9e2NoYW5nZVBhbmVGb250U2l6ZX1cbiAgICAgICAgICAgIGNoYW5nZVBhbmVGb250VHlwZT17Y2hhbmdlUGFuZUZvbnRUeXBlfVxuICAgICAgICAgICAgY3VycmVudFBhbmVTZXR0aW5ncz17Y3VycmVudFBhbmVTZXR0aW5nc31cbiAgICAgICAgICAgIGFkZE9iamVjdFByb3BlcnR5VG9NYW5pZmVzdD17YWRkT2JqZWN0UHJvcGVydHlUb01hbmlmZXN0fVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPEFkZEJpYmxlQnV0dG9uXG4gICAgICAgICAgICBzaG93QWRkQmlibGVNb2RhbD17c2hvd0FkZEJpYmxlTW9kYWx9XG4gICAgICAgICAgICBjbGlja0FkZFJlc291cmNlPXt0cmFuc2xhdGUoJ3BhbmUuYWRkX3Jlc291cmNlJyl9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIHtcbiAgICAgICAgc2hvd0V4cGFuZGVkU2NyaXB0dXJlUGFuZSA/XG4gICAgICAgICAgPEV4cGFuZGVkU2NyaXB0dXJlUGFuZU1vZGFsXG4gICAgICAgICAgICBiaWJsZXM9e2JpYmxlc31cbiAgICAgICAgICAgIGNvbnRleHRJZD17Y29udGV4dElkfVxuICAgICAgICAgICAgdHJhbnNsYXRlPXt0cmFuc2xhdGV9XG4gICAgICAgICAgICBzZWxlY3Rpb25zPXtzZWxlY3Rpb25zfVxuICAgICAgICAgICAgc2hvd1BvcG92ZXI9e3Nob3dQb3BvdmVyfVxuICAgICAgICAgICAgZ2V0TGV4aWNvbkRhdGE9e2dldExleGljb25EYXRhfVxuICAgICAgICAgICAgc2hvdz17c2hvd0V4cGFuZGVkU2NyaXB0dXJlUGFuZX1cbiAgICAgICAgICAgIGVkaXRUYXJnZXRWZXJzZT17ZWRpdFRhcmdldFZlcnNlfVxuICAgICAgICAgICAgcHJpbWFyeUxhYmVsPXt0cmFuc2xhdGUoJ2Nsb3NlJyl9XG4gICAgICAgICAgICB0aXRsZT17ZXhwYW5kZWRTY3JpcHR1cmVQYW5lVGl0bGV9XG4gICAgICAgICAgICBvbkhpZGU9e2Nsb3NlRXhwYW5kZWRTY3JpcHR1cmVQYW5lfVxuICAgICAgICAgICAgdGFyZ2V0TGFuZ3VhZ2VGb250PXt0YXJnZXRMYW5ndWFnZUZvbnR9XG4gICAgICAgICAgICBjdXJyZW50UGFuZVNldHRpbmdzPXtjdXJyZW50UGFuZVNldHRpbmdzfVxuICAgICAgICAgICAgcHJvamVjdERldGFpbHNSZWR1Y2VyPXtwcm9qZWN0RGV0YWlsc1JlZHVjZXJ9XG4gICAgICAgICAgICBlZGl0VmVyc2VSZWY9e2VkaXRWZXJzZVJlZn1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDpcbiAgICAgICAgICA8ZGl2Lz5cbiAgICAgIH1cbiAgICAgIHtcbiAgICAgICAgc2hvd0FkZFBhbmVNb2RhbCA/XG4gICAgICAgICAgPEFkZFBhbmVNb2RhbFxuICAgICAgICAgICAgdHJhbnNsYXRlPXt0cmFuc2xhdGV9XG4gICAgICAgICAgICBvbkhpZGU9e2hpZGVBZGRCaWJsZU1vZGFsfVxuICAgICAgICAgICAgc2VsZWN0TGFiZWw9e3RyYW5zbGF0ZSgnc2VsZWN0Jyl9XG4gICAgICAgICAgICBzaG93PXtzaG93QWRkUGFuZU1vZGFsfVxuICAgICAgICAgICAgc2VsZWN0ZWRQYW5lPXtzZWxlY3RlZFBhbmV9XG4gICAgICAgICAgICBjdXJyZW50UGFuZVNldHRpbmdzPXtjdXJyZW50UGFuZVNldHRpbmdzfVxuICAgICAgICAgICAgdGl0bGU9e3RyYW5zbGF0ZSgncGFuZS5hZGRfcmVzb3VyY2VfbGFiZWwnKX1cbiAgICAgICAgICAgIGFkZE5ld0JpYmxlUmVzb3VyY2U9e2FkZE5ld0JpYmxlUmVzb3VyY2V9XG4gICAgICAgICAgICBzZWxlY3RTb3VyY2VMYW5ndWFnZT17c2VsZWN0U291cmNlTGFuZ3VhZ2V9XG4gICAgICAgICAgICBzZWxlY3RMYW5ndWFnZUxhYmVsPXt0cmFuc2xhdGUoJ3BhbmUuc2VsZWN0X2xhbmd1YWdlJyl9XG4gICAgICAgICAgICBnZXRBdmFpbGFibGVTY3JpcHR1cmVQYW5lU2VsZWN0aW9ucz17Z2V0QXZhaWxhYmxlU2NyaXB0dXJlUGFuZVNlbGVjdGlvbnN9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA6XG4gICAgICAgICAgPGRpdi8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cblNjcmlwdHVyZVBhbmUuZGVmYXVsdFByb3BzID0ge1xuICBoYW5kbGVNb2RhbE9wZW46ICgpID0+IHtcbiAgICBjb25zb2xlLmluZm8oJ2hhbmRsZU1vZGFsT3BlbiBwcm9wIHdhcyBub3QgcGFzc2VkLicpO1xuICB9LFxuICBvbkV4cGFuZGVkU2NyaXB0dXJlUGFuZVNob3c6IG51bGwsXG59O1xuXG5TY3JpcHR1cmVQYW5lLnByb3BUeXBlcyA9IHtcbiAgaGFuZGxlTW9kYWxPcGVuOiBQcm9wVHlwZXMuZnVuYyxcbiAgYmlibGVzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIHRyYW5zbGF0ZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgc2hvd1BvcG92ZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGNvbnRleHRJZDogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICBzZWxlY3Rpb25zOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgZ2V0TGV4aWNvbkRhdGE6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGVkaXRUYXJnZXRWZXJzZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgc2V0VG9vbFNldHRpbmdzOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBjb21wbGV4U2NyaXB0Rm9udHM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgY3VycmVudFBhbmVTZXR0aW5nczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIHByb2plY3REZXRhaWxzUmVkdWNlcjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICBhZGRPYmplY3RQcm9wZXJ0eVRvTWFuaWZlc3Q6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG1ha2VTdXJlQmlibGVzTG9hZGVkRm9yVG9vbDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgZXhwYW5kZWRTY3JpcHR1cmVQYW5lVGl0bGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgZ2V0QXZhaWxhYmxlU2NyaXB0dXJlUGFuZVNlbGVjdGlvbnM6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uRXhwYW5kZWRTY3JpcHR1cmVQYW5lU2hvdzogUHJvcFR5cGVzLmZ1bmMsIC8vIGNhbGxlZCB3aGVuIGV4cGFuZGVkIFNjcmlwdHVyZSBQYW5lIGFzIHNob3duIG9yIGhpZGRlblxuICBlZGl0VmVyc2VSZWY6IFByb3BUeXBlcy5zdHJpbmcsIC8vIGlmIGdpdmVuIHRoZW4gb3BlbiB2ZXJzZSBmb3IgZWRpdCAoc2luZ2xlIHZlcnNlKVxuICBhdXRvT3BlbkV4cGFuZGVkU2NyaXB0dXJlUGFuZTogUHJvcFR5cGVzLm51bWJlciwgLy8gZXhwYW5kZWQgU1AgaXMgb3Blbm5lZCBpZiB0aGlzIGNoYW5nZXMgdmFsdWVcbn07XG5cbi8qKlxuICogQ3VzdG9tIGNvbXBhcmlzb24gZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGNvbXBvbmVudCBzaG91bGQgcmVyZW5kZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gcHJldlByb3BzXG4gKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gKi9cbmZ1bmN0aW9uIGFyZUVxdWFsKHByZXZQcm9wcywgbmV4dFByb3BzKSB7XG4gIC8qXG4gICAgUmV0dXJuIHRydWUgaWYgcGFzc2luZyBuZXh0UHJvcHMuYmlibGVzIHRvXG4gICAgcmVuZGVyIHdvdWxkIHJldHVybiB0aGUgc2FtZSByZXN1bHQgYXMgcGFzc2luZ1xuICAgIHByZXZQcm9wcy5iaWJsZXMgdG8gcmVuZGVyLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlXG4gICovXG4gIHJldHVybiBkZWVwRXF1YWwocHJldlByb3BzLmJpYmxlcywgbmV4dFByb3BzLmJpYmxlcykgJiZcbiAgICBkZWVwRXF1YWwocHJldlByb3BzLmNvbnRleHRJZCwgbmV4dFByb3BzLmNvbnRleHRJZCkgJiZcbiAgICBkZWVwRXF1YWwocHJldlByb3BzLmN1cnJlbnRQYW5lU2V0dGluZ3MsIG5leHRQcm9wcy5jdXJyZW50UGFuZVNldHRpbmdzKSAmJlxuICAgIGRlZXBFcXVhbChwcmV2UHJvcHMucHJvamVjdERldGFpbHNSZWR1Y2VyLCBuZXh0UHJvcHMucHJvamVjdERldGFpbHNSZWR1Y2VyKSAmJlxuICAgIHByZXZQcm9wcy5leHBhbmRlZFNjcmlwdHVyZVBhbmVUaXRsZSA9PT0gcHJldlByb3BzLmV4cGFuZGVkU2NyaXB0dXJlUGFuZVRpdGxlICYmXG4gICAgZGVlcEVxdWFsKHByZXZQcm9wcy5zZWxlY3Rpb25zLCBuZXh0UHJvcHMuc2VsZWN0aW9ucykgJiZcbiAgICAocHJldlByb3BzLmVkaXRWZXJzZVJlZiA9PT0gbmV4dFByb3BzLmVkaXRWZXJzZVJlZikgJiZcbiAgICAocHJldlByb3BzLmF1dG9PcGVuRXhwYW5kZWRTY3JpcHR1cmVQYW5lID09PSBuZXh0UHJvcHMuYXV0b09wZW5FeHBhbmRlZFNjcmlwdHVyZVBhbmUpO1xufVxuXG4vLyB1c2luZyBSZWFjdC5tZW1vIHRvIGJvb3N0IHBlcmZvcm1hbmNlIGJ5IG1lbW9pemluZyB0aGUgcmVzdWx0XG5leHBvcnQgZGVmYXVsdCBSZWFjdC5tZW1vKFNjcmlwdHVyZVBhbmUsIGFyZUVxdWFsKTtcbiJdfQ==