focus-components-v3
Version:
Focus web components to build applications (based on Material Design)
323 lines (277 loc) • 35.5 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _i18next = require('i18next');
var _i18next2 = _interopRequireDefault(_i18next);
var _button = require('../button');
var _button2 = _interopRequireDefault(_button);
var _reactRouter = require('react-router');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
var defaultButtonProps = { icon: 'link', shape: 'icon', type: 'button' };
var MenuPanel = function MenuPanel(_ref) {
var children = _ref.children,
onClose = _ref.onClose;
var style = { 'width': document.body.clientWidth };
return _react2.default.createElement(
'div',
{ className: 'animate-menu', 'data-focus': 'menu-sub-panel', style: style, onClick: onClose },
_react2.default.createElement(
'div',
null,
children
)
);
};
MenuPanel.displayName = 'MenuPanel';
MenuPanel.PropTypes = {
onClose: _react.PropTypes.func
};
var MenuItem = function (_Component) {
_inherits(MenuItem, _Component);
function MenuItem(props) {
_classCallCheck(this, MenuItem);
var _this = _possibleConstructorReturn(this, _Component.call(this, props));
_this.state = {
displaySubMenu: false
};
_this._toggleSubMenuVisibility = _this._toggleSubMenuVisibility.bind(_this);
return _this;
}
MenuItem.prototype._toggleSubMenuVisibility = function _toggleSubMenuVisibility() {
var _props = this.props,
showLabels = _props.showLabels,
showPanel = _props.showPanel;
if (showLabels && !showPanel) {
var displaySubMenu = this.state.displaySubMenu;
this.setState({ displaySubMenu: !displaySubMenu });
}
};
MenuItem.prototype.findPathnameInPossibleRoute = function findPathnameInPossibleRoute(possibleRoutes, pathname) {
return possibleRoutes.reduce(function (acc, element) {
if (pathname.indexOf(element) !== -1) {
acc = true;
}
return acc;
}, false);
};
MenuItem.prototype.setActiveListClassName = function setActiveListClassName(route, homePath, pathname, possibleRoutes, isActive, hasSubMenus) {
if (route) {
if (route === homePath && pathname !== homePath || !isActive) {
return '';
} else if (pathname === route || possibleRoutes && this.findPathnameInPossibleRoute(possibleRoutes, pathname)) {
return 'activeList';
}
} else if (possibleRoutes && this.findPathnameInPossibleRoute(possibleRoutes, pathname)) {
return 'activeList';
}
return '';
};
MenuItem.prototype.render = function render() {
var _props2 = this.props,
menu = _props2.menu,
isActive = _props2.isActive,
onClick = _props2.onClick,
onClose = _props2.onClose,
showLabels = _props2.showLabels,
showPanel = _props2.showPanel,
homePath = _props2.homePath,
pathname = _props2.pathname;
var route = menu.route,
label = menu.label,
icon = menu.icon,
iconLibrary = menu.iconLibrary,
subMenus = menu.subMenus,
possibleRoutes = menu.possibleRoutes;
var displaySubMenu = this.state.displaySubMenu;
var buttonProps = _extends({}, defaultButtonProps, { label: label, icon: !showLabels && icon === undefined ? 'link' : icon, iconLibrary: iconLibrary, shape: showLabels ? null : 'icon', onClick: onClick });
var hasSubMenus = subMenus && subMenus.length > 0;
if (hasSubMenus) {
return _react2.default.createElement(
'li',
{ 'data-deployed': isActive, className: this.setActiveListClassName(route, homePath, pathname, possibleRoutes, isActive, hasSubMenus) },
_react2.default.createElement(_button2.default, _extends({}, buttonProps, { onClick: showPanel ? onClick : this._toggleSubMenuVisibility })),
displaySubMenu && _react2.default.createElement(
'ul',
{ 'data-focus': 'menu-sub-items' },
subMenus.map(function (menu, idx) {
return _react2.default.createElement(MenuItem, { key: idx, menu: menu, onClose: onClose, showLabels: showLabels });
})
)
);
} else {
var _onClick = buttonProps.onClick;
buttonProps.handleOnClick = _onClick;
return _react2.default.createElement(
'li',
{ className: this.setActiveListClassName(route, homePath, pathname, possibleRoutes, isActive, hasSubMenus) },
route && _react2.default.createElement(
_reactRouter.Link,
{ to: route, onClick: onClose },
_react2.default.createElement(_button2.default, buttonProps)
),
!route && _react2.default.createElement(_button2.default, buttonProps)
);
}
};
return MenuItem;
}(_react.Component);
;
MenuItem.displayName = 'MenuItem';
MenuItem.PropTypes = {
menu: _react.PropTypes.object.isRequired,
isActive: _react.PropTypes.bool,
onClick: _react.PropTypes.func,
onClose: _react.PropTypes.func,
showLabels: _react.PropTypes.bool.isRequired,
showPanel: _react.PropTypes.bool.isRequired
};
var MenuList = function MenuList(_ref2) {
var activeMenuId = _ref2.activeMenuId,
menus = _ref2.menus,
_ref2$offset = _ref2.offset,
offset = _ref2$offset === undefined ? 0 : _ref2$offset,
_onClick2 = _ref2.onClick,
onClose = _ref2.onClose,
showLabels = _ref2.showLabels,
showPanel = _ref2.showPanel,
homePath = _ref2.homePath,
pathname = _ref2.pathname;
var style = { 'position': 'relative', 'top': offset };
return _react2.default.createElement(
'ul',
{ 'data-focus': 'menu-items', style: style },
menus.map(function (menu, idx) {
var isActive = activeMenuId ? activeMenuId === idx : -1;
var route = menu.route,
label = menu.label,
icon = menu.icon,
subMenus = menu.subMenus;
var buttonProps = _extends({}, defaultButtonProps, { label: label, icon: !showLabels && icon === undefined ? 'link' : icon, shape: showLabels ? null : 'icon' });
return _react2.default.createElement(MenuItem, { key: idx, menu: menu, onClick: function onClick(evt) {
return _onClick2 && _onClick2(evt, idx);
}, homePath: homePath, onClose: onClose, isActive: isActive, pathname: pathname, showLabels: showLabels, showPanel: showPanel });
})
);
};
MenuList.displayName = 'MenuList';
MenuList.PropTypes = {
activeMenuId: _react.PropTypes.number,
menus: _react.PropTypes.array.isRequired,
onClick: _react.PropTypes.func,
onClose: _react.PropTypes.func,
showLabels: _react.PropTypes.bool.isRequired,
showPanel: _react.PropTypes.bool.isRequired
};
/**
*
* Requested data.
* [
* { icon: 'home', label: 'menu.home', route: '/' }, // route: 'home'
* { icon: 'search', label: 'menu.search', handleOnClick: () => toto() }},
* { label: 'menu.test', route: '/admin/masterdata', subMenus: [
* { label: 'menu.home', route: '/' },
* { label: 'menu.home', route: '/' },
* { label: 'menu.home', route: '/' },
* { label: 'menu.home', route: '/' }
* ]},
* { icon: 'settings', label: 'menu.admin', route: '/admin/masterdata', subMenus: [
* { icon: 'settings', label: 'menu.home', route: '/' },
* { icon: 'settings', label: 'menu.home', route: '/' },
* { icon: 'settings', label: 'menu.home', route: '/' },
* { icon: 'settings', label: 'menu.home', route: '/' }
* ]},
* ];
*
*/
var Menu = function (_Component2) {
_inherits(Menu, _Component2);
function Menu(props) {
_classCallCheck(this, Menu);
var _this2 = _possibleConstructorReturn(this, _Component2.call(this, props));
var subMenus = [];
props.menus.map(function (menu, idx) {
subMenus[idx] = menu.subMenus;
});
_this2.state = {
activeMenuId: null,
subMenus: subMenus,
yPosition: 0
};
_this2._onSelectMenu = _this2._onSelectMenu.bind(_this2);
_this2._onSubPanelClose = _this2._onSubPanelClose.bind(_this2);
return _this2;
}
Menu.prototype._onSelectMenu = function _onSelectMenu(evt, menuId) {
var targetPosition = evt.target.getBoundingClientRect();
this.setState({
activeMenuId: menuId,
yPosition: targetPosition.top - 35 //TODO temporary : to improve
});
};
Menu.prototype._onSubPanelClose = function _onSubPanelClose() {
this.setState({
activeMenuId: null
});
};
Menu.prototype.render = function render() {
var _props3 = this.props,
children = _props3.children,
handleBrandClick = _props3.handleBrandClick,
menus = _props3.menus,
showLabels = _props3.showLabels,
showPanel = _props3.showPanel,
homePath = _props3.homePath,
pathname = _props3.pathname;
var size = showLabels ? 'large' : 'small';
var _state = this.state,
activeMenuId = _state.activeMenuId,
subMenus = _state.subMenus,
yPosition = _state.yPosition;
var displayPanel = activeMenuId && subMenus[activeMenuId];
var subMenuItems = subMenus[activeMenuId];
return _react2.default.createElement(
'nav',
{ 'data-focus': 'menu', 'data-size': size },
_react2.default.createElement(
'div',
null,
_react2.default.createElement('div', { 'data-focus': 'menu-brand', 'data-click': !!handleBrandClick, onClick: function onClick() {
return handleBrandClick && handleBrandClick();
} }),
_react2.default.createElement(MenuList, { activeMenuId: activeMenuId, menus: menus, onClick: this._onSelectMenu, homePath: homePath, pathname: pathname, showLabels: showLabels, showPanel: showPanel }),
children,
showPanel && subMenuItems && _react2.default.createElement(
MenuPanel,
{ onClose: this._onSubPanelClose },
_react2.default.createElement(MenuList, { offset: yPosition, menus: subMenuItems, onClose: this._onSubPanelClose, showLabels: true, showPanel: false })
)
)
);
};
return Menu;
}(_react.Component);
Menu.displayName = 'Menu';
Menu.propTypes = {
handleBrandClick: _react.PropTypes.func,
menus: _react.PropTypes.array.isRequired,
homePath: _react.PropTypes.string,
pathname: _react.PropTypes.string,
showPanel: _react.PropTypes.bool,
showLabels: _react.PropTypes.bool
};
Menu.defaultProps = {
menus: [],
showLabels: false,
showPanel: true
};
exports.default = Menu;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZyLUZSLmpzIl0sIm5hbWVzIjpbImRlZmF1bHRCdXR0b25Qcm9wcyIsImljb24iLCJzaGFwZSIsInR5cGUiLCJNZW51UGFuZWwiLCJjaGlsZHJlbiIsIm9uQ2xvc2UiLCJzdHlsZSIsImRvY3VtZW50IiwiYm9keSIsImNsaWVudFdpZHRoIiwiZGlzcGxheU5hbWUiLCJQcm9wVHlwZXMiLCJmdW5jIiwiTWVudUl0ZW0iLCJwcm9wcyIsInN0YXRlIiwiZGlzcGxheVN1Yk1lbnUiLCJfdG9nZ2xlU3ViTWVudVZpc2liaWxpdHkiLCJiaW5kIiwic2hvd0xhYmVscyIsInNob3dQYW5lbCIsInNldFN0YXRlIiwiZmluZFBhdGhuYW1lSW5Qb3NzaWJsZVJvdXRlIiwicG9zc2libGVSb3V0ZXMiLCJwYXRobmFtZSIsInJlZHVjZSIsImFjYyIsImVsZW1lbnQiLCJpbmRleE9mIiwic2V0QWN0aXZlTGlzdENsYXNzTmFtZSIsInJvdXRlIiwiaG9tZVBhdGgiLCJpc0FjdGl2ZSIsImhhc1N1Yk1lbnVzIiwicmVuZGVyIiwibWVudSIsIm9uQ2xpY2siLCJsYWJlbCIsImljb25MaWJyYXJ5Iiwic3ViTWVudXMiLCJidXR0b25Qcm9wcyIsInVuZGVmaW5lZCIsImxlbmd0aCIsIm1hcCIsImlkeCIsImhhbmRsZU9uQ2xpY2siLCJvYmplY3QiLCJpc1JlcXVpcmVkIiwiYm9vbCIsIk1lbnVMaXN0IiwiYWN0aXZlTWVudUlkIiwibWVudXMiLCJvZmZzZXQiLCJldnQiLCJudW1iZXIiLCJhcnJheSIsIk1lbnUiLCJ5UG9zaXRpb24iLCJfb25TZWxlY3RNZW51IiwiX29uU3ViUGFuZWxDbG9zZSIsIm1lbnVJZCIsInRhcmdldFBvc2l0aW9uIiwidGFyZ2V0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidG9wIiwiaGFuZGxlQnJhbmRDbGljayIsInNpemUiLCJkaXNwbGF5UGFuZWwiLCJzdWJNZW51SXRlbXMiLCJwcm9wVHlwZXMiLCJzdHJpbmciLCJkZWZhdWx0UHJvcHMiXSwi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QkEsa0JBQTFCO0FBQUEscUJBQXRFLEdBREo7QUFFSSw4Q0FBQyxRQUFELElBQVUsY0FBY2YsWUFBeEIsRUFBc0MsT0FBT0MsS0FBN0MsRUFBb0QsU0FBUyxLQUFLTyxhQUFsRSxFQUFpRixVQUFVM0IsUUFBM0YsRUFBcUcsVUFBVVAsUUFBL0csRUFBeUgsWUFBWUwsVUFBckksRUFBaUosV0FBV0MsU0FBNUosR0FGSjtBQUdLaEIsd0JBSEw7QUFJS2dCLDZCQUFhZ0QsWUFBYixJQUNHO0FBQUMsNkJBQUQ7QUFBQSxzQkFBVyxTQUFTLEtBQUtULGdCQUF6QjtBQUNJLGtEQUFDLFFBQUQsSUFBVSxRQUFRRixTQUFsQixFQUE2QixPQUFPVyxZQUFwQyxFQUFrRCxTQUFTLEtBQUtULGdCQUFoRSxFQUFrRixZQUFZLElBQTlGLEVBQW9HLFdBQVcsS0FBL0c7QUFESjtBQUxSO0FBREosU0FESjtBQWNILEs7O1dBL0NDSCxJOzs7QUFpRE5BLEtBQUs5QyxXQUFMLEdBQW1CLE1BQW5CO0FBQ0E4QyxLQUFLYSxTQUFMLEdBQWlCO0FBQ2JKLHNCQUFrQixpQkFBVXJELElBRGY7QUFFYnVDLFdBQU8saUJBQVVJLEtBQVYsQ0FBZ0JSLFVBRlY7QUFHYmhCLGNBQVUsaUJBQVV1QyxNQUhQO0FBSWI5QyxjQUFVLGlCQUFVOEMsTUFKUDtBQUtibEQsZUFBVyxpQkFBVTRCLElBTFI7QUFNYjdCLGdCQUFZLGlCQUFVNkI7QUFOVCxDQUFqQjtBQVFBUSxLQUFLZSxZQUFMLEdBQXFCO0FBQ2pCcEIsV0FBTyxFQURVO0FBRWpCaEMsZ0JBQVksS0FGSztBQUdqQkMsZUFBVztBQUhNLENBQXJCO2tCQUtlb0MsSSIsImZpbGUiOiJmci1GUi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgUHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBpMThuZXh0IGZyb20gJ2kxOG5leHQnO1xyXG5pbXBvcnQgQnV0dG9uIGZyb20gJy4uL2J1dHRvbic7XHJcbmltcG9ydCB7TGlua30gZnJvbSAncmVhY3Qtcm91dGVyJztcclxuXHJcbmNvbnN0IGRlZmF1bHRCdXR0b25Qcm9wcyA9IHtpY29uOiAnbGluaycsIHNoYXBlOiAnaWNvbicsIHR5cGU6ICdidXR0b24nfTtcclxuXHJcbmNvbnN0IE1lbnVQYW5lbCA9ICh7Y2hpbGRyZW4sIG9uQ2xvc2V9KSA9PiB7XHJcbiAgICBjb25zdCBzdHlsZSA9IHsgJ3dpZHRoJzogZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCB9XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdhbmltYXRlLW1lbnUnIGRhdGEtZm9jdXM9J21lbnUtc3ViLXBhbmVsJyBzdHlsZT17c3R5bGV9IG9uQ2xpY2s9e29uQ2xvc2V9PlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAge2NoaWxkcmVufVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICk7XHJcbn1cclxuTWVudVBhbmVsLmRpc3BsYXlOYW1lID0gJ01lbnVQYW5lbCc7XHJcbk1lbnVQYW5lbC5Qcm9wVHlwZXMgPSB7XHJcbiAgICBvbkNsb3NlOiBQcm9wVHlwZXMuZnVuY1xyXG59O1xyXG5cclxuY2xhc3MgTWVudUl0ZW0gZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGlzcGxheVN1Yk1lbnU6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl90b2dnbGVTdWJNZW51VmlzaWJpbGl0eSA9IHRoaXMuX3RvZ2dsZVN1Yk1lbnVWaXNpYmlsaXR5LmJpbmQodGhpcyk7XHJcbiAgICB9XHJcbiAgICBfdG9nZ2xlU3ViTWVudVZpc2liaWxpdHkoKSB7XHJcbiAgICAgICAgY29uc3Qge3Nob3dMYWJlbHMsIHNob3dQYW5lbH0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGlmKHNob3dMYWJlbHMgJiYgIXNob3dQYW5lbCkge1xyXG4gICAgICAgICAgICBjb25zdCB7ZGlzcGxheVN1Yk1lbnV9ID0gdGhpcy5zdGF0ZTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZGlzcGxheVN1Yk1lbnU6ICFkaXNwbGF5U3ViTWVudX0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmaW5kUGF0aG5hbWVJblBvc3NpYmxlUm91dGUocG9zc2libGVSb3V0ZXMsIHBhdGhuYW1lKXtcclxuICAgICAgcmV0dXJuIHBvc3NpYmxlUm91dGVzLnJlZHVjZSgoYWNjLCBlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgIGlmKHBhdGhuYW1lLmluZGV4T2YoZWxlbWVudCkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIGFjYyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgIH0sZmFsc2UpXHJcbiAgICB9XHJcbiAgICBzZXRBY3RpdmVMaXN0Q2xhc3NOYW1lKHJvdXRlLCBob21lUGF0aCwgcGF0aG5hbWUscG9zc2libGVSb3V0ZXMsIGlzQWN0aXZlLCBoYXNTdWJNZW51cykge1xyXG4gICAgICAgIGlmKHJvdXRlICkge1xyXG4gICAgICAgICAgICBpZigocm91dGUgPT09IGhvbWVQYXRoICYmIHBhdGhuYW1lICE9PSBob21lUGF0aCApfHwgIWlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJydcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRobmFtZT09PSByb3V0ZSB8fCAocG9zc2libGVSb3V0ZXMgJiYgdGhpcy5maW5kUGF0aG5hbWVJblBvc3NpYmxlUm91dGUocG9zc2libGVSb3V0ZXMsIHBhdGhuYW1lKSkgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FjdGl2ZUxpc3QnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2UgaWYgKHBvc3NpYmxlUm91dGVzICYmIHRoaXMuZmluZFBhdGhuYW1lSW5Qb3NzaWJsZVJvdXRlKHBvc3NpYmxlUm91dGVzLCBwYXRobmFtZSkpIHtcclxuICAgICAgICAgIHJldHVybiAnYWN0aXZlTGlzdCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7bWVudSwgaXNBY3RpdmUsIG9uQ2xpY2ssIG9uQ2xvc2UsIHNob3dMYWJlbHMsIHNob3dQYW5lbCwgaG9tZVBhdGgsIHBhdGhuYW1lfSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgY29uc3Qge3JvdXRlLCBsYWJlbCwgaWNvbiwgaWNvbkxpYnJhcnksIHN1Yk1lbnVzLCBwb3NzaWJsZVJvdXRlc30gPSBtZW51O1xyXG4gICAgICAgIGNvbnN0IHtkaXNwbGF5U3ViTWVudX0gPSB0aGlzLnN0YXRlO1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvblByb3BzID0gey4uLmRlZmF1bHRCdXR0b25Qcm9wcywgbGFiZWwsIGljb246ICghc2hvd0xhYmVscyAmJiBpY29uID09PSB1bmRlZmluZWQgPyAnbGluaycgOiBpY29uKSwgaWNvbkxpYnJhcnksIHNoYXBlOiAoc2hvd0xhYmVscyA/IG51bGwgOiAnaWNvbicpLCBvbkNsaWNrfTtcclxuICAgICAgICBjb25zdCBoYXNTdWJNZW51cyA9IHN1Yk1lbnVzICYmIHN1Yk1lbnVzLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgaWYoaGFzU3ViTWVudXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIDxsaSBkYXRhLWRlcGxveWVkPXtpc0FjdGl2ZX0gY2xhc3NOYW1lPXt0aGlzLnNldEFjdGl2ZUxpc3RDbGFzc05hbWUocm91dGUsIGhvbWVQYXRoLCBwYXRobmFtZSxwb3NzaWJsZVJvdXRlcywgaXNBY3RpdmUsaGFzU3ViTWVudXMpfT5cclxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHsuLi5idXR0b25Qcm9wc30gb25DbGljaz17c2hvd1BhbmVsID8gb25DbGljayA6IHRoaXMuX3RvZ2dsZVN1Yk1lbnVWaXNpYmlsaXR5fSAvPlxyXG4gICAgICAgICAgICAgICAgICAgIHtkaXNwbGF5U3ViTWVudSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgZGF0YS1mb2N1cz0nbWVudS1zdWItaXRlbXMnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N1Yk1lbnVzLm1hcCgobWVudSwgaWR4KSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPE1lbnVJdGVtIGtleT17aWR4fSBtZW51PXttZW51fSBvbkNsb3NlPXtvbkNsb3NlfSBzaG93TGFiZWxzPXtzaG93TGFiZWxzfSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB7b25DbGlja30gPSBidXR0b25Qcm9wcztcclxuICAgICAgICAgICAgYnV0dG9uUHJvcHMuaGFuZGxlT25DbGljayA9IG9uQ2xpY2tcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzc05hbWU9e3RoaXMuc2V0QWN0aXZlTGlzdENsYXNzTmFtZShyb3V0ZSwgaG9tZVBhdGgsIHBhdGhuYW1lLHBvc3NpYmxlUm91dGVzICwgaXNBY3RpdmUsIGhhc1N1Yk1lbnVzKX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3JvdXRlICYmIDxMaW5rIHRvPXtyb3V0ZX0gb25DbGljaz17b25DbG9zZX0+PEJ1dHRvbiB7Li4uYnV0dG9uUHJvcHN9IC8+PC9MaW5rPn1cclxuICAgICAgICAgICAgICAgICAgICB7IXJvdXRlICYmIDxCdXR0b24gey4uLmJ1dHRvblByb3BzfSAvPn1cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5NZW51SXRlbS5kaXNwbGF5TmFtZSA9ICdNZW51SXRlbSc7XHJcbk1lbnVJdGVtLlByb3BUeXBlcyA9IHtcclxuICAgIG1lbnU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcclxuICAgIGlzQWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcclxuICAgIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxyXG4gICAgb25DbG9zZTogUHJvcFR5cGVzLmZ1bmMsXHJcbiAgICBzaG93TGFiZWxzOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxyXG4gICAgc2hvd1BhbmVsOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkXHJcbn07XHJcblxyXG5cclxuY29uc3QgTWVudUxpc3QgPSAoe2FjdGl2ZU1lbnVJZCwgbWVudXMsIG9mZnNldCA9IDAsIG9uQ2xpY2ssIG9uQ2xvc2UsIHNob3dMYWJlbHMsIHNob3dQYW5lbCwgaG9tZVBhdGgsIHBhdGhuYW1lfSkgPT4ge1xyXG4gICAgY29uc3Qgc3R5bGUgPSB7J3Bvc2l0aW9uJzogJ3JlbGF0aXZlJywgJ3RvcCc6IG9mZnNldCB9O1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgICA8dWwgZGF0YS1mb2N1cz0nbWVudS1pdGVtcycgc3R5bGU9e3N0eWxlfT5cclxuICAgICAgICAgICAge21lbnVzLm1hcCgobWVudSwgaWR4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IGFjdGl2ZU1lbnVJZCA/IGFjdGl2ZU1lbnVJZCA9PT0gaWR4IDogLTE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7cm91dGUsIGxhYmVsLCBpY29uLCBzdWJNZW51c30gPSBtZW51O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYnV0dG9uUHJvcHMgPSB7Li4uZGVmYXVsdEJ1dHRvblByb3BzLCBsYWJlbCwgaWNvbjogKCFzaG93TGFiZWxzICYmIGljb24gPT09IHVuZGVmaW5lZCA/ICdsaW5rJyA6IGljb24pLCBzaGFwZTogKHNob3dMYWJlbHMgPyBudWxsIDogJ2ljb24nKX07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgIDxNZW51SXRlbSBrZXk9e2lkeH0gbWVudT17bWVudX0gb25DbGljaz17KGV2dCkgPT4gb25DbGljayAmJiBvbkNsaWNrKGV2dCwgaWR4KX0gaG9tZVBhdGg9e2hvbWVQYXRofSBvbkNsb3NlPXtvbkNsb3NlfSBpc0FjdGl2ZT17aXNBY3RpdmV9IHBhdGhuYW1lPXtwYXRobmFtZX0gc2hvd0xhYmVscz17c2hvd0xhYmVsc30gc2hvd1BhbmVsPXtzaG93UGFuZWx9IC8+XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KX1cclxuICAgICAgICA8L3VsPlxyXG4gICAgKTtcclxufTtcclxuTWVudUxpc3QuZGlzcGxheU5hbWUgPSAnTWVudUxpc3QnO1xyXG5NZW51TGlzdC5Qcm9wVHlwZXMgPSB7XHJcbiAgICBhY3RpdmVNZW51SWQ6IFByb3BUeXBlcy5udW1iZXIsXHJcbiAgICBtZW51czogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXHJcbiAgICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcclxuICAgIG9uQ2xvc2U6IFByb3BUeXBlcy5mdW5jLFxyXG4gICAgc2hvd0xhYmVsczogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcclxuICAgIHNob3dQYW5lbDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZFxyXG59O1xyXG5cclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBSZXF1ZXN0ZWQgZGF0YS5cclxuICogW1xyXG4gKiAgICB7IGljb246ICdob21lJywgbGFiZWw6ICdtZW51LmhvbWUnLCByb3V0ZTogJy8nIH0sIC8vIHJvdXRlOiAnaG9tZSdcclxuICogICAgeyBpY29uOiAnc2VhcmNoJywgbGFiZWw6ICdtZW51LnNlYXJjaCcsIGhhbmRsZU9uQ2xpY2s6ICgpID0+IHRvdG8oKSB9fSxcclxuICogICAgeyBsYWJlbDogJ21lbnUudGVzdCcsIHJvdXRlOiAnL2FkbWluL21hc3RlcmRhdGEnLCBzdWJNZW51czogW1xyXG4gKiAgICAgICAgeyBsYWJlbDogJ21lbnUuaG9tZScsIHJvdXRlOiAnLycgfSxcclxuICogICAgICAgIHsgbGFiZWw6ICdtZW51LmhvbWUnLCByb3V0ZTogJy8nIH0sXHJcbiAqICAgICAgICB7IGxhYmVsOiAnbWVudS5ob21lJywgcm91dGU6ICcvJyB9LFxyXG4gKiAgICAgICAgeyBsYWJlbDogJ21lbnUuaG9tZScsIHJvdXRlOiAnLycgfVxyXG4gKiAgICBdfSxcclxuICogICAgeyBpY29uOiAnc2V0dGluZ3MnLCBsYWJlbDogJ21lbnUuYWRtaW4nLCByb3V0ZTogJy9hZG1pbi9tYXN0ZXJkYXRhJywgc3ViTWVudXM6IFtcclxuICogICAgICAgIHsgaWNvbjogJ3NldHRpbmdzJywgbGFiZWw6ICdtZW51LmhvbWUnLCByb3V0ZTogJy8nIH0sXHJcbiAqICAgICAgICB7IGljb246ICdzZXR0aW5ncycsIGxhYmVsOiAnbWVudS5ob21lJywgcm91dGU6ICcvJyB9LFxyXG4gKiAgICAgICAgeyBpY29uOiAnc2V0dGluZ3MnLCBsYWJlbDogJ21lbnUuaG9tZScsIHJvdXRlOiAnLycgfSxcclxuICogICAgICAgIHsgaWNvbjogJ3NldHRpbmdzJywgbGFiZWw6ICdtZW51LmhvbWUnLCByb3V0ZTogJy8nIH1cclxuICogICAgXX0sXHJcbiAqIF07XHJcbiAqXHJcbiAqL1xyXG5jbGFzcyBNZW51IGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGNvbnN0IHN1Yk1lbnVzID0gW107XHJcbiAgICAgICAgcHJvcHMubWVudXMubWFwKChtZW51LCBpZHgpID0+IHtcclxuICAgICAgICAgICAgc3ViTWVudXNbaWR4XSA9IG1lbnUuc3ViTWVudXM7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWN0aXZlTWVudUlkOiBudWxsLFxyXG4gICAgICAgICAgICBzdWJNZW51cyxcclxuICAgICAgICAgICAgeVBvc2l0aW9uOiAwXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9vblNlbGVjdE1lbnUgPSB0aGlzLl9vblNlbGVjdE1lbnUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9vblN1YlBhbmVsQ2xvc2UgPSB0aGlzLl9vblN1YlBhbmVsQ2xvc2UuYmluZCh0aGlzKTtcclxuICAgIH1cclxuICAgIF9vblNlbGVjdE1lbnUoZXZ0LCBtZW51SWQpIHtcclxuICAgICAgICBjb25zdCB0YXJnZXRQb3NpdGlvbiA9IGV2dC50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGFjdGl2ZU1lbnVJZDogbWVudUlkLFxyXG4gICAgICAgICAgICB5UG9zaXRpb246IHRhcmdldFBvc2l0aW9uLnRvcCAtIDM1IC8vVE9ETyB0ZW1wb3JhcnkgOiB0byBpbXByb3ZlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBfb25TdWJQYW5lbENsb3NlKCkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBhY3RpdmVNZW51SWQ6IG51bGxcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHsgY2hpbGRyZW4sIGhhbmRsZUJyYW5kQ2xpY2ssIG1lbnVzLCBzaG93TGFiZWxzLCBzaG93UGFuZWwsIGhvbWVQYXRoLCBwYXRobmFtZSB9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCBzaXplID0gc2hvd0xhYmVscyA/ICdsYXJnZScgOiAnc21hbGwnO1xyXG4gICAgICAgIGNvbnN0IHthY3RpdmVNZW51SWQsIHN1Yk1lbnVzLCB5UG9zaXRpb259ID0gdGhpcy5zdGF0ZTtcclxuICAgICAgICBjb25zdCBkaXNwbGF5UGFuZWwgPSBhY3RpdmVNZW51SWQgJiYgc3ViTWVudXNbYWN0aXZlTWVudUlkXTtcclxuICAgICAgICBjb25zdCBzdWJNZW51SXRlbXMgPSBzdWJNZW51c1thY3RpdmVNZW51SWRdO1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxuYXYgZGF0YS1mb2N1cz0nbWVudScgZGF0YS1zaXplPXtzaXplfT5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWZvY3VzPSdtZW51LWJyYW5kJyBkYXRhLWNsaWNrPXshIWhhbmRsZUJyYW5kQ2xpY2t9IG9uQ2xpY2s9eygpID0+IGhhbmRsZUJyYW5kQ2xpY2sgJiYgaGFuZGxlQnJhbmRDbGljaygpfSAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxNZW51TGlzdCBhY3RpdmVNZW51SWQ9e2FjdGl2ZU1lbnVJZH0gbWVudXM9e21lbnVzfSBvbkNsaWNrPXt0aGlzLl9vblNlbGVjdE1lbnV9IGhvbWVQYXRoPXtob21lUGF0aH0gcGF0aG5hbWU9e3BhdGhuYW1lfSBzaG93TGFiZWxzPXtzaG93TGFiZWxzfSBzaG93UGFuZWw9e3Nob3dQYW5lbH0gLz5cclxuICAgICAgICAgICAgICAgICAgICB7Y2hpbGRyZW59XHJcbiAgICAgICAgICAgICAgICAgICAge3Nob3dQYW5lbCAmJiBzdWJNZW51SXRlbXMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgPE1lbnVQYW5lbCBvbkNsb3NlPXt0aGlzLl9vblN1YlBhbmVsQ2xvc2V9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPE1lbnVMaXN0IG9mZnNldD17eVBvc2l0aW9ufSBtZW51cz17c3ViTWVudUl0ZW1zfSBvbkNsb3NlPXt0aGlzLl9vblN1YlBhbmVsQ2xvc2V9IHNob3dMYWJlbHM9e3RydWV9IHNob3dQYW5lbD17ZmFsc2V9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvTWVudVBhbmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25hdj5cclxuICAgICAgICApO1xyXG4gICAgfTtcclxufVxyXG5NZW51LmRpc3BsYXlOYW1lID0gJ01lbnUnO1xyXG5NZW51LnByb3BUeXBlcyA9IHtcclxuICAgIGhhbmRsZUJyYW5kQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxyXG4gICAgbWVudXM6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxyXG4gICAgaG9tZVBhdGg6IFByb3BUeXBlcy5zdHJpbmcsXHJcbiAgICBwYXRobmFtZTogUHJvcFR5cGVzLnN0cmluZyxcclxuICAgIHNob3dQYW5lbDogUHJvcFR5cGVzLmJvb2wsXHJcbiAgICBzaG93TGFiZWxzOiBQcm9wVHlwZXMuYm9vbFxyXG59O1xyXG5NZW51LmRlZmF1bHRQcm9wcyA9ICB7XHJcbiAgICBtZW51czogW10sXHJcbiAgICBzaG93TGFiZWxzOiBmYWxzZSxcclxuICAgIHNob3dQYW5lbDogdHJ1ZVxyXG59O1xyXG5leHBvcnQgZGVmYXVsdCBNZW51O1xyXG4iXX0=