tc-ui-toolkit
Version:
React components used to develop tools for the desktop app translationCore
366 lines (321 loc) • 35.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _styles = require("@material-ui/core/styles");
var _ListItem = _interopRequireDefault(require("@material-ui/core/ListItem"));
var _RootRef = _interopRequireDefault(require("@material-ui/core/RootRef"));
var _ListItemIcon = _interopRequireDefault(require("@material-ui/core/ListItemIcon"));
var _ListItemText = _interopRequireDefault(require("@material-ui/core/ListItemText"));
var _Tooltip = _interopRequireDefault(require("@material-ui/core/Tooltip"));
var _Badge = _interopRequireDefault(require("@material-ui/core/Badge"));
var _memoizeOne = _interopRequireDefault(require("memoize-one"));
var _lodash = _interopRequireDefault(require("lodash"));
var _fontUtils = require("../../common/fontUtils");
var _2 = require("../..");
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; } }
/**
* Utility to apply styles based on props
*/
// const styledBy = (property, mapping) => props => mapping[props[property]];
var styles = {
root: {
'borderBottom': 'solid #333333 1px',
'backgroundColor': '#747474',
'&$selected': {
'backgroundColor': '#2196F3',
'&:hover': {
backgroundColor: '#2196F3'
}
}
},
selected: {},
textRoot: {
paddingRight: 0
},
text: {
color: '#FFFFFF',
textOverflow: 'ellipsis',
overflow: 'hidden',
whiteSpace: 'nowrap',
fontSize: 12
},
badge: {
backgroundColor: '#ffffff',
border: 'solid 2px #747474',
borderColor: '#747474',
color: '#747474',
fontWeight: 'bold',
fontSize: '75%',
width: 18,
height: 18,
marginTop: 2,
marginRight: 2
},
selectedBadge: {
backgroundColor: '#ffffff',
border: 'solid 2px #747474',
borderColor: '#2196F3',
color: '#2196F3',
fontWeight: 'bold',
fontSize: '75%',
width: 18,
height: 18,
marginTop: 2,
marginRight: 2
},
lightTooltip: {
backgroundColor: '#fff',
color: '#000',
boxShadow: '1px 1px 5px 0px rgba(0,0,0,0.75)',
fontSize: 14,
padding: 15
},
lightTooltipSmall: {
backgroundColor: '#fff',
color: '#333333',
boxShadow: '1px 1px 5px 0px rgba(0,0,0,0.75)'
},
arrow: {
'fontSize': 16,
'width': 17,
'&::before': {
border: '1px solid #000',
backgroundColor: '#fff',
boxSizing: 'border-box'
}
},
listItemIconRoot: {
minWidth: '0px'
}
};
var LightTooltip = (0, _styles.withStyles)(function (theme) {
return {
tooltip: {
backgroundColor: theme.palette.common.white,
color: '#333333',
boxShadow: '1px 1px 5px 0px rgba(0,0,0,0.75)'
}
};
})(_Tooltip["default"]);
/**
* Renders a single item within the menu
* @param {string} title - the menu item text
* @param {function} [onClick] - a callback that receives click events from the menu item
* @param {boolean} [selected] - indicates if this item is selected
* @param {object} [status] - a dictionary of boolean values indicating the item's status
* @param {object[]} [statusIcons] - an array if icons that may be mapped to the item's current status
*/
var MenuItem = /*#__PURE__*/function (_React$Component) {
(0, _inherits2["default"])(MenuItem, _React$Component);
var _super = _createSuper(MenuItem);
function MenuItem() {
var _this;
(0, _classCallCheck2["default"])(this, MenuItem);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
arrowRef: null,
overflow: false
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "textRef", /*#__PURE__*/_react["default"].createRef());
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "listItemTextRef", /*#__PURE__*/_react["default"].createRef());
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleArrowRef", function (node) {
_this.setState({
arrowRef: node
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "checkOverflow", function () {
var direction = _this.props.direction;
var padding = (0, _2.isLTR)(direction) ? 8 : 20; // correct for padding width
var overflow = _this.listItemTextRef.current.offsetWidth <= _this.textRef.current.offsetWidth + padding;
if (overflow !== _this.state.overflow) {
_this.setState({
overflow: overflow
});
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleClick", function (e) {
var onClick = _this.props.onClick;
if (typeof onClick === 'function') {
onClick(e);
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateStatusIcon", (0, _memoizeOne["default"])(function (status, statusIcons, selected) {
var classes = _this.props.classes;
if (!statusIcons || !status) {
return null;
}
var icons = [];
for (var i = 0, len = statusIcons.length; i < len; i++) {
var icon = statusIcons[i];
var s = status[icon.key];
if (Boolean(s) === icon.value) {
icons.push(icon.icon);
}
}
if (icons.length === 1) {
return /*#__PURE__*/_react["default"].createElement(_ListItemIcon["default"], {
classes: {
root: classes.listItemIconRoot
}
}, icons[0]);
} else if (icons.length > 1) {
// display badged icon with tooltip
return /*#__PURE__*/_react["default"].createElement(_ListItemIcon["default"], {
classes: {
root: classes.listItemIconRoot
}
}, /*#__PURE__*/_react["default"].createElement(LightTooltip, {
placement: "right",
title: /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, icons.map(function (i, key) {
return /*#__PURE__*/_react["default"].cloneElement(i, {
key: key,
style: {
color: '#333333'
}
});
}))
}, /*#__PURE__*/_react["default"].createElement(_Badge["default"], {
badgeContent: icons.length,
classes: {
badge: selected ? classes.selectedBadge : classes.badge
}
}, icons[0])));
} else {
return null;
}
}));
return _this;
}
(0, _createClass2["default"])(MenuItem, [{
key: "shouldComponentUpdate",
value: function shouldComponentUpdate(nextProps, nextState) {
// TRICKY: we should technically check for an update to statusIcons
// however that is not a known use case and it's faster to ignore it.
var _this$props = this.props,
key = _this$props.key,
title = _this$props.title,
status = _this$props.status,
selected = _this$props.selected,
targetLanguageFont = _this$props.targetLanguageFont;
var overflow = this.state.overflow;
return overflow !== nextState.overflow || title !== nextProps.title || key !== nextProps.key || selected !== nextProps.selected || targetLanguageFont !== nextProps.targetLanguageFont || !_lodash["default"].isEqual(status, nextProps.status);
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
this.checkOverflow();
}
}, {
key: "componentDidMount",
value: function componentDidMount() {
this.checkOverflow();
}
}, {
key: "UNSAFE_componentWillReceiveProps",
value: function UNSAFE_componentWillReceiveProps(nextProps) {
if (nextProps.title !== this.props.title) {
this.setState({
overflow: false
});
}
}
}, {
key: "render",
value: function render() {
var _this$props2 = this.props,
key = _this$props2.key,
title = _this$props2.title,
status = _this$props2.status,
tooltip = _this$props2.tooltip,
classes = _this$props2.classes,
selected = _this$props2.selected,
direction = _this$props2.direction,
statusIcons = _this$props2.statusIcons,
targetLanguageFont = _this$props2.targetLanguageFont;
var overflow = this.state.overflow;
var tooltipText = tooltip ? tooltip : title;
var icon = this.generateStatusIcon(status, statusIcons, selected);
var fontClass = (0, _fontUtils.getFontClassName)(targetLanguageFont);
var style = {};
var toolTipStyle = {};
if (!(0, _2.isLTR)(direction)) {
// if RTL
style.textAlign = 'right';
style.paddingRight = '16px';
style.direction = 'rtl';
toolTipStyle.direction = 'rtl';
toolTipStyle.direction = 'rtl';
}
return /*#__PURE__*/_react["default"].createElement(_ListItem["default"], {
key: key,
disableGutters: false,
selected: selected,
onClick: this.handleClick,
classes: {
root: classes.root,
selected: classes.selected
}
}, icon, /*#__PURE__*/_react["default"].createElement(_RootRef["default"], {
rootRef: this.listItemTextRef
}, /*#__PURE__*/_react["default"].createElement(_Tooltip["default"], {
enterDelay: 300,
arrow: true,
title: /*#__PURE__*/_react["default"].createElement("div", {
className: fontClass,
style: toolTipStyle
}, tooltipText),
disableFocusListener: !overflow,
disableHoverListener: !overflow,
disableTouchListener: !overflow,
placement: 'bottom-start',
classes: {
tooltip: classes.lightTooltip,
arrow: classes.arrow
}
}, /*#__PURE__*/_react["default"].createElement(_ListItemText["default"], {
inset: !icon,
classes: {
root: classes.textRoot,
primary: classes.text
},
style: style,
primary: /*#__PURE__*/_react["default"].createElement("span", {
className: fontClass,
ref: this.textRef
}, title)
}))));
}
}]);
return MenuItem;
}(_react["default"].Component);
MenuItem.propTypes = {
classes: _propTypes["default"].object.isRequired,
title: _propTypes["default"].string.isRequired,
tooltip: _propTypes["default"].string,
key: _propTypes["default"].any,
onClick: _propTypes["default"].func,
selected: _propTypes["default"].bool,
statusIcons: _propTypes["default"].arrayOf(_propTypes["default"].object),
status: _propTypes["default"].object,
targetLanguageFont: _propTypes["default"].string,
direction: _propTypes["default"].string
};
var _default = (0, _styles.withStyles)(styles)(MenuItem);
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9Hcm91cGVkTWVudS9NZW51L01lbnVJdGVtLmpzIl0sIm5hbWVzIjpbInN0eWxlcyIsInJvb3QiLCJiYWNrZ3JvdW5kQ29sb3IiLCJzZWxlY3RlZCIsInRleHRSb290IiwicGFkZGluZ1JpZ2h0IiwidGV4dCIsImNvbG9yIiwidGV4dE92ZXJmbG93Iiwib3ZlcmZsb3ciLCJ3aGl0ZVNwYWNlIiwiZm9udFNpemUiLCJiYWRnZSIsImJvcmRlciIsImJvcmRlckNvbG9yIiwiZm9udFdlaWdodCIsIndpZHRoIiwiaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJzZWxlY3RlZEJhZGdlIiwibGlnaHRUb29sdGlwIiwiYm94U2hhZG93IiwicGFkZGluZyIsImxpZ2h0VG9vbHRpcFNtYWxsIiwiYXJyb3ciLCJib3hTaXppbmciLCJsaXN0SXRlbUljb25Sb290IiwibWluV2lkdGgiLCJMaWdodFRvb2x0aXAiLCJ0aGVtZSIsInRvb2x0aXAiLCJwYWxldHRlIiwiY29tbW9uIiwid2hpdGUiLCJUb29sdGlwIiwiTWVudUl0ZW0iLCJhcnJvd1JlZiIsIlJlYWN0IiwiY3JlYXRlUmVmIiwibm9kZSIsInNldFN0YXRlIiwiZGlyZWN0aW9uIiwicHJvcHMiLCJsaXN0SXRlbVRleHRSZWYiLCJjdXJyZW50Iiwib2Zmc2V0V2lkdGgiLCJ0ZXh0UmVmIiwic3RhdGUiLCJlIiwib25DbGljayIsInN0YXR1cyIsInN0YXR1c0ljb25zIiwiY2xhc3NlcyIsImljb25zIiwiaSIsImxlbiIsImxlbmd0aCIsImljb24iLCJzIiwia2V5IiwiQm9vbGVhbiIsInZhbHVlIiwicHVzaCIsIm1hcCIsImNsb25lRWxlbWVudCIsInN0eWxlIiwibmV4dFByb3BzIiwibmV4dFN0YXRlIiwidGl0bGUiLCJ0YXJnZXRMYW5ndWFnZUZvbnQiLCJfIiwiaXNFcXVhbCIsImNoZWNrT3ZlcmZsb3ciLCJ0b29sdGlwVGV4dCIsImdlbmVyYXRlU3RhdHVzSWNvbiIsImZvbnRDbGFzcyIsInRvb2xUaXBTdHlsZSIsInRleHRBbGlnbiIsImhhbmRsZUNsaWNrIiwicHJpbWFyeSIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJhbnkiLCJmdW5jIiwiYm9vbCIsImFycmF5T2YiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVBOzs7QUFHQTtBQUVBLElBQU1BLE1BQU0sR0FBRztBQUNiQyxFQUFBQSxJQUFJLEVBQUU7QUFDSixvQkFBZ0IsbUJBRFo7QUFFSix1QkFBbUIsU0FGZjtBQUdKLGtCQUFjO0FBQ1oseUJBQW1CLFNBRFA7QUFFWixpQkFBVztBQUFFQyxRQUFBQSxlQUFlLEVBQUU7QUFBbkI7QUFGQztBQUhWLEdBRE87QUFTYkMsRUFBQUEsUUFBUSxFQUFFLEVBVEc7QUFVYkMsRUFBQUEsUUFBUSxFQUFFO0FBQUVDLElBQUFBLFlBQVksRUFBRTtBQUFoQixHQVZHO0FBV2JDLEVBQUFBLElBQUksRUFBRTtBQUNKQyxJQUFBQSxLQUFLLEVBQUUsU0FESDtBQUVKQyxJQUFBQSxZQUFZLEVBQUUsVUFGVjtBQUdKQyxJQUFBQSxRQUFRLEVBQUUsUUFITjtBQUlKQyxJQUFBQSxVQUFVLEVBQUUsUUFKUjtBQUtKQyxJQUFBQSxRQUFRLEVBQUU7QUFMTixHQVhPO0FBa0JiQyxFQUFBQSxLQUFLLEVBQUU7QUFDTFYsSUFBQUEsZUFBZSxFQUFFLFNBRFo7QUFFTFcsSUFBQUEsTUFBTSxFQUFFLG1CQUZIO0FBR0xDLElBQUFBLFdBQVcsRUFBRSxTQUhSO0FBSUxQLElBQUFBLEtBQUssRUFBRSxTQUpGO0FBS0xRLElBQUFBLFVBQVUsRUFBRSxNQUxQO0FBTUxKLElBQUFBLFFBQVEsRUFBRSxLQU5MO0FBT0xLLElBQUFBLEtBQUssRUFBRSxF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RWEsc0JBQVVHLE1BVFg7QUFVbkI1QyxFQUFBQSxTQUFTLEVBQUV5QyxzQkFBVUc7QUFWRixDQUFyQjs7ZUFhZSx3QkFBV3RGLE1BQVgsRUFBbUJvQyxRQUFuQixDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyB3aXRoU3R5bGVzIH0gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvc3R5bGVzJztcbmltcG9ydCBMaXN0SXRlbSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9MaXN0SXRlbSc7XG5pbXBvcnQgUm9vdFJlZiBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9Sb290UmVmJztcbmltcG9ydCBMaXN0SXRlbUljb24gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvTGlzdEl0ZW1JY29uJztcbmltcG9ydCBMaXN0SXRlbVRleHQgZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvTGlzdEl0ZW1UZXh0JztcbmltcG9ydCBUb29sdGlwIGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL1Rvb2x0aXAnO1xuaW1wb3J0IEJhZGdlIGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0JhZGdlJztcbmltcG9ydCBtZW1vaXplIGZyb20gJ21lbW9pemUtb25lJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBnZXRGb250Q2xhc3NOYW1lIH0gZnJvbSAnLi4vLi4vY29tbW9uL2ZvbnRVdGlscyc7XG5pbXBvcnQgeyBpc0xUUiB9IGZyb20gJy4uLy4uJztcblxuLyoqXG4gKiBVdGlsaXR5IHRvIGFwcGx5IHN0eWxlcyBiYXNlZCBvbiBwcm9wc1xuICovXG4vLyBjb25zdCBzdHlsZWRCeSA9IChwcm9wZXJ0eSwgbWFwcGluZykgPT4gcHJvcHMgPT4gbWFwcGluZ1twcm9wc1twcm9wZXJ0eV1dO1xuXG5jb25zdCBzdHlsZXMgPSB7XG4gIHJvb3Q6IHtcbiAgICAnYm9yZGVyQm90dG9tJzogJ3NvbGlkICMzMzMzMzMgMXB4JyxcbiAgICAnYmFja2dyb3VuZENvbG9yJzogJyM3NDc0NzQnLFxuICAgICcmJHNlbGVjdGVkJzoge1xuICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICcjMjE5NkYzJyxcbiAgICAgICcmOmhvdmVyJzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjMjE5NkYzJyB9LFxuICAgIH0sXG4gIH0sXG4gIHNlbGVjdGVkOiB7fSxcbiAgdGV4dFJvb3Q6IHsgcGFkZGluZ1JpZ2h0OiAwIH0sXG4gIHRleHQ6IHtcbiAgICBjb2xvcjogJyNGRkZGRkYnLFxuICAgIHRleHRPdmVyZmxvdzogJ2VsbGlwc2lzJyxcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgZm9udFNpemU6IDEyLFxuICB9LFxuICBiYWRnZToge1xuICAgIGJhY2tncm91bmRDb2xvcjogJyNmZmZmZmYnLFxuICAgIGJvcmRlcjogJ3NvbGlkIDJweCAjNzQ3NDc0JyxcbiAgICBib3JkZXJDb2xvcjogJyM3NDc0NzQnLFxuICAgIGNvbG9yOiAnIzc0NzQ3NCcsXG4gICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgIGZvbnRTaXplOiAnNzUlJyxcbiAgICB3aWR0aDogMTgsXG4gICAgaGVpZ2h0OiAxOCxcbiAgICBtYXJnaW5Ub3A6IDIsXG4gICAgbWFyZ2luUmlnaHQ6IDIsXG4gIH0sXG4gIHNlbGVjdGVkQmFkZ2U6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICBib3JkZXI6ICdzb2xpZCAycHggIzc0NzQ3NCcsXG4gICAgYm9yZGVyQ29sb3I6ICcjMjE5NkYzJyxcbiAgICBjb2xvcjogJyMyMTk2RjMnLFxuICAgIGZvbnRXZWlnaHQ6ICdib2xkJyxcbiAgICBmb250U2l6ZTogJzc1JScsXG4gICAgd2lkdGg6IDE4LFxuICAgIGhlaWdodDogMTgsXG4gICAgbWFyZ2luVG9wOiAyLFxuICAgIG1hcmdpblJpZ2h0OiAyLFxuICB9LFxuICBsaWdodFRvb2x0aXA6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmJyxcbiAgICBjb2xvcjogJyMwMDAnLFxuICAgIGJveFNoYWRvdzogJzFweCAxcHggNXB4IDBweCByZ2JhKDAsMCwwLDAuNzUpJyxcbiAgICBmb250U2l6ZTogMTQsXG4gICAgcGFkZGluZzogMTUsXG4gIH0sXG4gIGxpZ2h0VG9vbHRpcFNtYWxsOiB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAnI2ZmZicsXG4gICAgY29sb3I6ICcjMzMzMzMzJyxcbiAgICBib3hTaGFkb3c6ICcxcHggMXB4IDVweCAwcHggcmdiYSgwLDAsMCwwLjc1KScsXG4gIH0sXG4gIGFycm93OiB7XG4gICAgJ2ZvbnRTaXplJzogMTYsXG4gICAgJ3dpZHRoJzogMTcsXG4gICAgJyY6OmJlZm9yZSc6IHtcbiAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjMDAwJyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmZmYnLFxuICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgfSxcbiAgfSxcbiAgbGlzdEl0ZW1JY29uUm9vdDogeyBtaW5XaWR0aDogJzBweCcgfSxcbn07XG5cbmNvbnN0IExpZ2h0VG9vbHRpcCA9IHdpdGhTdHlsZXMoKHRoZW1lKSA9PiAoe1xuICB0b29sdGlwOiB7XG4gICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmNvbW1vbi53aGl0ZSxcbiAgICBjb2xvcjogJyMzMzMzMzMnLFxuICAgIGJveFNoYWRvdzogJzFweCAxcHggNXB4IDBweCByZ2JhKDAsMCwwLDAuNzUpJyxcbiAgfSxcbn0pKShUb29sdGlwKTtcblxuLyoqXG4gKiBSZW5kZXJzIGEgc2luZ2xlIGl0ZW0gd2l0aGluIHRoZSBtZW51XG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aGUgbWVudSBpdGVtIHRleHRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtvbkNsaWNrXSAtIGEgY2FsbGJhY2sgdGhhdCByZWNlaXZlcyBjbGljayBldmVudHMgZnJvbSB0aGUgbWVudSBpdGVtXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzZWxlY3RlZF0gLSBpbmRpY2F0ZXMgaWYgdGhpcyBpdGVtIGlzIHNlbGVjdGVkXG4gKiBAcGFyYW0ge29iamVjdH0gW3N0YXR1c10gLSBhIGRpY3Rpb25hcnkgb2YgYm9vbGVhbiB2YWx1ZXMgaW5kaWNhdGluZyB0aGUgaXRlbSdzIHN0YXR1c1xuICogQHBhcmFtIHtvYmplY3RbXX0gW3N0YXR1c0ljb25zXSAtIGFuIGFycmF5IGlmIGljb25zIHRoYXQgbWF5IGJlIG1hcHBlZCB0byB0aGUgaXRlbSdzIGN1cnJlbnQgc3RhdHVzXG4gKi9cbmNsYXNzIE1lbnVJdGVtIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGUgPSB7XG4gICAgYXJyb3dSZWY6IG51bGwsXG4gICAgb3ZlcmZsb3c6IGZhbHNlLFxuICB9O1xuICB0ZXh0UmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gIGxpc3RJdGVtVGV4dFJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBub2RlIHJlZiB1c2VkIGZvciB0aGUgdG9vbHRpcCBhcnJvd1xuICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZSAtIGEgcmVhY3QgcmVmXG4gICAqL1xuICBoYW5kbGVBcnJvd1JlZiA9IG5vZGUgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBhcnJvd1JlZjogbm9kZSB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgZm9yIHRoZSB0b29sdGlwIHRleHQgb3ZlcmZsb3dcbiAgICovXG4gIGNoZWNrT3ZlcmZsb3cgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBkaXJlY3Rpb24gfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgcGFkZGluZyA9IGlzTFRSKGRpcmVjdGlvbikgPyA4IDogMjA7IC8vIGNvcnJlY3QgZm9yIHBhZGRpbmcgd2lkdGhcbiAgICBjb25zdCBvdmVyZmxvdyA9XG4gICAgICB0aGlzLmxpc3RJdGVtVGV4dFJlZi5jdXJyZW50Lm9mZnNldFdpZHRoIDw9XG4gICAgICB0aGlzLnRleHRSZWYuY3VycmVudC5vZmZzZXRXaWR0aCArIHBhZGRpbmc7XG5cbiAgICBpZiAob3ZlcmZsb3cgIT09IHRoaXMuc3RhdGUub3ZlcmZsb3cpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBvdmVyZmxvdyB9KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY2xpY2tzIG9uIHRoZSBpdGVtXG4gICAqL1xuICBoYW5kbGVDbGljayA9IGUgPT4ge1xuICAgIGNvbnN0IHsgb25DbGljayB9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmICh0eXBlb2Ygb25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb25DbGljayhlKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgY29ycmVjdCBzdGF0dXMgaWNvbiB0byBkaXNwbGF5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0dXMgLSB0aGUgaXRlbSBzdGF0dXMuIHRoaXMgaXMgYW4gb2JqZWN0IG9mIGJvb2xlYW4ga2V5c1xuICAgKiBAcGFyYW0ge29iamVjdFtdfSBzdGF0dXNJY29ucyAtIGFuIGFycmF5IG9mIGF2YWlsYWJsZSBzdGF0dXMgaWNvbnNcbiAgICovXG4gIGdlbmVyYXRlU3RhdHVzSWNvbiA9IG1lbW9pemUoKHN0YXR1cywgc3RhdHVzSWNvbnMsIHNlbGVjdGVkKSA9PiB7XG4gICAgY29uc3QgeyBjbGFzc2VzIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKCFzdGF0dXNJY29ucyB8fCAhc3RhdHVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBpY29ucyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0YXR1c0ljb25zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBpY29uID0gc3RhdHVzSWNvbnNbaV07XG4gICAgICBjb25zdCBzID0gc3RhdHVzW2ljb24ua2V5XTtcblxuICAgICAgaWYgKEJvb2xlYW4ocykgPT09IGljb24udmFsdWUpIHtcbiAgICAgICAgaWNvbnMucHVzaChpY29uLmljb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpY29ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxMaXN0SXRlbUljb24gY2xhc3Nlcz17eyByb290OiBjbGFzc2VzLmxpc3RJdGVtSWNvblJvb3QgfX0+XG4gICAgICAgICAge2ljb25zWzBdfVxuICAgICAgICA8L0xpc3RJdGVtSWNvbj5cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChpY29ucy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBkaXNwbGF5IGJhZGdlZCBpY29uIHdpdGggdG9vbHRpcFxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPExpc3RJdGVtSWNvbiBjbGFzc2VzPXt7IHJvb3Q6IGNsYXNzZXMubGlzdEl0ZW1JY29uUm9vdCB9fT5cbiAgICAgICAgICA8TGlnaHRUb29sdGlwXG4gICAgICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgICB0aXRsZT17XG4gICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICB7aWNvbnMubWFwKChpLCBrZXkpID0+XG4gICAgICAgICAgICAgICAgICBSZWFjdC5jbG9uZUVsZW1lbnQoaSwge1xuICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7IGNvbG9yOiAnIzMzMzMzMycgfSxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEJhZGdlXG4gICAgICAgICAgICAgIGJhZGdlQ29udGVudD17aWNvbnMubGVuZ3RofVxuICAgICAgICAgICAgICBjbGFzc2VzPXt7IGJhZGdlOiBzZWxlY3RlZCA/IGNsYXNzZXMuc2VsZWN0ZWRCYWRnZSA6IGNsYXNzZXMuYmFkZ2UgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2ljb25zWzBdfVxuICAgICAgICAgICAgPC9CYWRnZT5cbiAgICAgICAgICA8L0xpZ2h0VG9vbHRpcD5cbiAgICAgICAgPC9MaXN0SXRlbUljb24+XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0pO1xuXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgIC8vIFRSSUNLWTogd2Ugc2hvdWxkIHRlY2huaWNhbGx5IGNoZWNrIGZvciBhbiB1cGRhdGUgdG8gc3RhdHVzSWNvbnNcbiAgICAvLyBob3dldmVyIHRoYXQgaXMgbm90IGEga25vd24gdXNlIGNhc2UgYW5kIGl0J3MgZmFzdGVyIHRvIGlnbm9yZSBpdC5cbiAgICBjb25zdCB7XG4gICAgICBrZXksXG4gICAgICB0aXRsZSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIHNlbGVjdGVkLFxuICAgICAgdGFyZ2V0TGFuZ3VhZ2VGb250LFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgb3ZlcmZsb3cgfSA9IHRoaXMuc3RhdGU7XG4gICAgcmV0dXJuIChcbiAgICAgIG92ZXJmbG93ICE9PSBuZXh0U3RhdGUub3ZlcmZsb3cgfHxcbiAgICAgIHRpdGxlICE9PSBuZXh0UHJvcHMudGl0bGUgfHxcbiAgICAgIGtleSAhPT0gbmV4dFByb3BzLmtleSB8fFxuICAgICAgc2VsZWN0ZWQgIT09IG5leHRQcm9wcy5zZWxlY3RlZCB8fFxuICAgICAgdGFyZ2V0TGFuZ3VhZ2VGb250ICE9PSBuZXh0UHJvcHMudGFyZ2V0TGFuZ3VhZ2VGb250IHx8XG4gICAgICAhXy5pc0VxdWFsKHN0YXR1cywgbmV4dFByb3BzLnN0YXR1cylcbiAgICApO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIHRoaXMuY2hlY2tPdmVyZmxvdygpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5jaGVja092ZXJmbG93KCk7XG4gIH1cblxuICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLnRpdGxlICE9PSB0aGlzLnByb3BzLnRpdGxlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgb3ZlcmZsb3c6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBrZXksXG4gICAgICB0aXRsZSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIHRvb2x0aXAsXG4gICAgICBjbGFzc2VzLFxuICAgICAgc2VsZWN0ZWQsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICBzdGF0dXNJY29ucyxcbiAgICAgIHRhcmdldExhbmd1YWdlRm9udCxcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IG92ZXJmbG93IH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gdG9vbHRpcCA/IHRvb2x0aXAgOiB0aXRsZTtcbiAgICBjb25zdCBpY29uID0gdGhpcy5nZW5lcmF0ZVN0YXR1c0ljb24oc3RhdHVzLCBzdGF0dXNJY29ucywgc2VsZWN0ZWQpO1xuICAgIGNvbnN0IGZvbnRDbGFzcyA9IGdldEZvbnRDbGFzc05hbWUodGFyZ2V0TGFuZ3VhZ2VGb250KTtcbiAgICBjb25zdCBzdHlsZSA9IHt9O1xuICAgIGNvbnN0IHRvb2xUaXBTdHlsZSA9IHt9O1xuXG4gICAgaWYgKCFpc0xUUihkaXJlY3Rpb24pKSB7IC8vIGlmIFJUTFxuICAgICAgc3R5bGUudGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgIHN0eWxlLnBhZGRpbmdSaWdodCA9ICcxNnB4JztcbiAgICAgIHN0eWxlLmRpcmVjdGlvbiA9ICdydGwnO1xuICAgICAgdG9vbFRpcFN0eWxlLmRpcmVjdGlvbiA9ICdydGwnO1xuICAgICAgdG9vbFRpcFN0eWxlLmRpcmVjdGlvbiA9ICdydGwnO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8TGlzdEl0ZW1cbiAgICAgICAga2V5PXtrZXl9XG4gICAgICAgIGRpc2FibGVHdXR0ZXJzPXtmYWxzZX1cbiAgICAgICAgc2VsZWN0ZWQ9e3NlbGVjdGVkfVxuICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZUNsaWNrfVxuICAgICAgICBjbGFzc2VzPXt7XG4gICAgICAgICAgcm9vdDogY2xhc3Nlcy5yb290LFxuICAgICAgICAgIHNlbGVjdGVkOiBjbGFzc2VzLnNlbGVjdGVkLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7aWNvbn1cbiAgICAgICAgPFJvb3RSZWYgcm9vdFJlZj17dGhpcy5saXN0SXRlbVRleHRSZWZ9PlxuICAgICAgICAgIDxUb29sdGlwXG4gICAgICAgICAgICBlbnRlckRlbGF5PXszMDB9XG4gICAgICAgICAgICBhcnJvdz17dHJ1ZX1cbiAgICAgICAgICAgIHRpdGxlPXtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2ZvbnRDbGFzc30gc3R5bGU9e3Rvb2xUaXBTdHlsZX0+e3Rvb2x0aXBUZXh0fTwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzYWJsZUZvY3VzTGlzdGVuZXI9eyFvdmVyZmxvd31cbiAgICAgICAgICAgIGRpc2FibGVIb3Zlckxpc3RlbmVyPXshb3ZlcmZsb3d9XG4gICAgICAgICAgICBkaXNhYmxlVG91Y2hMaXN0ZW5lcj17IW92ZXJmbG93fVxuICAgICAgICAgICAgcGxhY2VtZW50PXsnYm90dG9tLXN0YXJ0J31cbiAgICAgICAgICAgIGNsYXNzZXM9e3tcbiAgICAgICAgICAgICAgdG9vbHRpcDogY2xhc3Nlcy5saWdodFRvb2x0aXAsXG4gICAgICAgICAgICAgIGFycm93OiBjbGFzc2VzLmFycm93LFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8TGlzdEl0ZW1UZXh0XG4gICAgICAgICAgICAgIGluc2V0PXshaWNvbn1cbiAgICAgICAgICAgICAgY2xhc3Nlcz17e1xuICAgICAgICAgICAgICAgIHJvb3Q6IGNsYXNzZXMudGV4dFJvb3QsXG4gICAgICAgICAgICAgICAgcHJpbWFyeTogY2xhc3Nlcy50ZXh0LFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAgIHByaW1hcnk9ezxzcGFuIGNsYXNzTmFtZT17Zm9udENsYXNzfSByZWY9e3RoaXMudGV4dFJlZn0+e3RpdGxlfTwvc3Bhbj59XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgPC9Sb290UmVmPlxuICAgICAgPC9MaXN0SXRlbT5cbiAgICApO1xuICB9XG59XG5cbk1lbnVJdGVtLnByb3BUeXBlcyA9IHtcbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICB0b29sdGlwOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBrZXk6IFByb3BUeXBlcy5hbnksXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICBzZWxlY3RlZDogUHJvcFR5cGVzLmJvb2wsXG4gIHN0YXR1c0ljb25zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgc3RhdHVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICB0YXJnZXRMYW5ndWFnZUZvbnQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGRpcmVjdGlvbjogUHJvcFR5cGVzLnN0cmluZyxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzKShNZW51SXRlbSk7XG4iXX0=