UNPKG

tc-ui-toolkit

Version:

React components used to develop tools for the desktop app translationCore

366 lines (321 loc) 35.4 kB
"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=