UNPKG

react-lightning-design-components

Version:

Salesforce Lightning Design System components built with React 16

364 lines (307 loc) 35.3 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _util = require('./util'); var _DropdownButton = require('./DropdownButton'); var _DropdownButton2 = _interopRequireDefault(_DropdownButton); var _DropdownMenu = require('./DropdownMenu'); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var Tabs = function (_Component) { (0, _inherits3.default)(Tabs, _Component); function Tabs(props) { (0, _classCallCheck3.default)(this, Tabs); var _this = (0, _possibleConstructorReturn3.default)(this, (Tabs.__proto__ || (0, _getPrototypeOf2.default)(Tabs)).call(this, props)); var _this$getvisibleAndHi = _this.getvisibleAndHiddenTabs(props), _this$getvisibleAndHi2 = (0, _slicedToArray3.default)(_this$getvisibleAndHi, 2), visibleTabs = _this$getvisibleAndHi2[0], hiddenTabs = _this$getvisibleAndHi2[1]; _this.state = { visibleTabs: visibleTabs, hiddenTabs: hiddenTabs }; _this.modifyVisibleTabs = _this.modifyVisibleTabs.bind(_this); _this.activeTabRef = _this.activeTabRef.bind(_this); (0, _util.registerStyle)('tab-menu', [['.slds-tabs__item.react-slds-tab-with-menu', '{ position: relative !important; overflow: visible !important; }'], ['.slds-tabs__item.react-slds-tab-with-menu > .react-slds-tab-item-inner', '{ overflow: hidden }'], ['.slds-tabs__item.react-slds-tab-with-menu > .react-slds-tab-item-inner > a', '{ padding-right: 2rem; }'], ['.react-slds-tab-menu', '{ position: absolute; top: 0; right: 0; visibility: hidden }'], ['.react-slds-tab-menu button', '{ height: 3rem; line-height: 3rem; width: 2rem; }'], ['.slds-tabs__item.slds-active .react-slds-tab-menu', '.slds-tabs__item:hover .react-slds-tab-menu', '{ visibility: visible }']]); return _this; } (0, _createClass3.default)(Tabs, [{ key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { var _getvisibleAndHiddenT = this.getvisibleAndHiddenTabs(nextProps), _getvisibleAndHiddenT2 = (0, _slicedToArray3.default)(_getvisibleAndHiddenT, 2), visibleTabs = _getvisibleAndHiddenT2[0], hiddenTabs = _getvisibleAndHiddenT2[1]; this.setState({ visibleTabs: visibleTabs, hiddenTabs: hiddenTabs }); } }, { key: 'componentDidUpdate', value: function componentDidUpdate() { if (this.state.focusTab) { var el = _reactDom2.default.findDOMNode(this.activeTab); if (el) { el.focus(); } /* eslint-disable react/no-did-update-set-state */ this.setState({ focusTab: false }); } } }, { key: 'onTabClick', value: function onTabClick(tabKey) { if (this.props.onSelect) { this.props.onSelect(tabKey); } // Uncontrolled this.setState({ activeKey: tabKey, focusTab: true }); } }, { key: 'onTabKeyDown', value: function onTabKeyDown(tabKey, e) { if (e.keyCode === 37 || e.keyCode === 39) { // left/right cursor key var idx = 0; var tabKeys = []; _react2.default.Children.forEach(this.props.children, function (tab, i) { tabKeys.push(tab.props.eventKey); if (tabKey === tab.props.eventKey) { idx = i; } }); var dir = e.keyCode === 37 ? -1 : 1; var activeIdx = (idx + dir + tabKeys.length) % tabKeys.length; var activeKey = tabKeys[activeIdx]; this.onTabClick(activeKey); e.preventDefault(); e.stopPropagation(); } } }, { key: 'getActiveKey', value: function getActiveKey(props) { var activeKey = props.activeKey, defaultActiveKey = props.defaultActiveKey; if (typeof activeKey !== 'undefined') return activeKey; if (this.state && typeof this.state.activeKey !== 'undefined') return this.state.activeKey; return defaultActiveKey; } }, { key: 'getvisibleAndHiddenTabs', value: function getvisibleAndHiddenTabs(props) { var children = props.children, maxVisibleTabs = props.maxVisibleTabs; var _ref = [children.slice(0, maxVisibleTabs), children.slice(maxVisibleTabs, children.length)], visibleTabs = _ref[0], hiddenTabs = _ref[1]; var activeKey = this.getActiveKey(props); var isActiveTabHidden = hiddenTabs.findIndex(function (tab) { return tab.props.eventKey === activeKey; }) !== -1; return isActiveTabHidden ? this.selectHiddenTab(visibleTabs, hiddenTabs, activeKey) : [visibleTabs, hiddenTabs]; } }, { key: 'selectHiddenTab', value: function selectHiddenTab(visibleTabs, hiddenTabs, activeKey) { var tabToShowIndex = hiddenTabs.findIndex(function (tab) { return tab.props.eventKey === activeKey; }); var tabToShow = hiddenTabs[tabToShowIndex]; var tabToHide = visibleTabs[visibleTabs.length - 1]; var newVisibleTabs = [].concat((0, _toConsumableArray3.default)(visibleTabs.slice(0, visibleTabs.length - 1)), [tabToShow]); var newHiddenTabs = [tabToHide].concat((0, _toConsumableArray3.default)(hiddenTabs.filter(function (tab) { return tab.props.eventKey !== activeKey; }))); return [newVisibleTabs, newHiddenTabs]; } }, { key: 'tabsType', value: function tabsType() { return this.props.type === 'scoped' ? 'scoped' : 'default'; } }, { key: 'modifyVisibleTabs', value: function modifyVisibleTabs(event) { var tabIndex = event.tabIndex; var onSelect = this.props.onSelect; if (onSelect) onSelect(tabIndex); var _selectHiddenTab = this.selectHiddenTab(this.state.visibleTabs, this.state.hiddenTabs, tabIndex), _selectHiddenTab2 = (0, _slicedToArray3.default)(_selectHiddenTab, 2), visibleTabs = _selectHiddenTab2[0], hiddenTabs = _selectHiddenTab2[1]; if (this.props.onSelect) { this.props.onSelect(tabIndex); } this.setState({ visibleTabs: visibleTabs, hiddenTabs: hiddenTabs, activeKey: tabIndex, focusTab: true }); } }, { key: 'activeTabRef', value: function activeTabRef(ref) { this.activeTab = ref; } }, { key: 'renderController', value: function renderController() { var label = this.props.moreLabel; var normalizedLabel = this.props.allCaps ? label.toUpperCase() : label; var marginTop = this.props.allCaps ? 4 : 7; return _react2.default.createElement( _DropdownButton2.default, { label: normalizedLabel, style: { marginTop: marginTop, marginLeft: 20, color: '#54698d' }, onMenuItemClick: this.modifyVisibleTabs }, this.state.hiddenTabs.map(function (tab) { return _react2.default.createElement( _DropdownMenu.MenuItem, { key: tab.props.eventKey, tabIndex: tab.props.eventKey }, tab.props.title ); }) ); } }, { key: 'renderTabNav', value: function renderTabNav() { var _this2 = this; var type = this.tabsType(); var _props = this.props, children = _props.children, maxVisibleTabs = _props.maxVisibleTabs; var currentActiveKey = this.getActiveKey(this.props); var tabNavClassName = 'slds-tabs--' + type + '__nav'; return _react2.default.createElement( 'ul', { className: tabNavClassName, role: 'tablist' }, this.state.visibleTabs.map(function (tab) { var _tab$props = tab.props, title = _tab$props.title, eventKey = _tab$props.eventKey, menu = _tab$props.menu, menuIcon = _tab$props.menuIcon; var menuItems = tab.props.menuItems; menuItems = menu ? menu.props.children : menuItems; var menuProps = menu ? menu.props : {}; var isActive = eventKey === currentActiveKey; var tabItemClassName = (0, _classnames2.default)('slds-tabs__item', 'slds-tabs--' + type + '__item', 'slds-text-heading---label', { 'slds-active': isActive }, { 'react-slds-tab-with-menu': menu || menuItems }); var tabLinkClassName = 'slds-tabs--' + type + '__link'; return _react2.default.createElement( 'li', { className: tabItemClassName, role: 'presentation', key: tab.props.eventKey }, _react2.default.createElement( 'span', { className: 'react-slds-tab-item-inner' }, _react2.default.createElement( 'a', { className: tabLinkClassName, onClick: _this2.onTabClick.bind(_this2, eventKey), onKeyDown: _this2.onTabKeyDown.bind(_this2, eventKey), role: 'tab', ref: isActive ? _this2.activeTabRef : null, tabIndex: isActive ? 0 : -1, 'aria-selected': isActive }, title ), menuItems ? _this2.renderTabMenu(menuIcon, menuItems, menuProps) : null ) ); }), maxVisibleTabs < children.length && this.renderController() ); } }, { key: 'renderTabMenu', value: function renderTabMenu() { var menuIcon = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'down'; var menuItems = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var menuProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return _react2.default.createElement( _DropdownButton2.default, (0, _extends3.default)({ className: 'react-slds-tab-menu', icon: menuIcon, type: 'icon-bare', iconSize: 'small', nubbinTop: true }, menuProps), menuItems ); } }, { key: 'renderTabPanel', value: function renderTabPanel() { var activeKey = this.getActiveKey(this.props); return this.state.visibleTabs.map(function (tab) { var eventKey = tab.props.eventKey; var isActive = eventKey === activeKey; return _react2.default.cloneElement(tab, { active: isActive, key: tab.props.eventKey }); }); } }, { key: 'render', value: function render() { var className = this.props.className; var tabsClassNames = (0, _classnames2.default)(className, 'slds-tabs--' + this.tabsType()); return _react2.default.createElement( 'div', { className: tabsClassNames }, this.renderTabNav(), this.renderTabPanel() ); } }]); return Tabs; }(_react.Component); exports.default = Tabs; var TAB_TYPES = ['default', 'scoped']; Tabs.propTypes = { className: _propTypes2.default.string, type: _propTypes2.default.oneOf(TAB_TYPES), defaultActiveKey: _propTypes2.default.any, activeKey: _propTypes2.default.any, onSelect: _propTypes2.default.func, children: _propTypes2.default.node, controller: _propTypes2.default.node, maxVisibleTabs: _propTypes2.default.number, allCaps: _propTypes2.default.bool, moreLabel: _propTypes2.default.string }; Tabs.defaultProps = { maxVisibleTabs: 10, moreLabel: 'More' }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL1RhYnMuanMiXSwibmFtZXMiOlsiVGFicyIsInByb3BzIiwiZ2V0dmlzaWJsZUFuZEhpZGRlblRhYnMiLCJ2aXNpYmxlVGFicyIsImhpZGRlblRhYnMiLCJzdGF0ZSIsIm1vZGlmeVZpc2libGVUYWJzIiwiYmluZCIsImFjdGl2ZVRhYlJlZiIsIm5leHRQcm9wcyIsInNldFN0YXRlIiwiZm9jdXNUYWIiLCJlbCIsImZpbmRET01Ob2RlIiwiYWN0aXZlVGFiIiwiZm9jdXMiLCJ0YWJLZXkiLCJvblNlbGVjdCIsImFjdGl2ZUtleSIsImUiLCJrZXlDb2RlIiwiaWR4IiwidGFiS2V5cyIsIkNoaWxkcmVuIiwiZm9yRWFjaCIsImNoaWxkcmVuIiwidGFiIiwiaSIsInB1c2giLCJldmVudEtleSIsImRpciIsImFjdGl2ZUlkeCIsImxlbmd0aCIsIm9uVGFiQ2xpY2siLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImRlZmF1bHRBY3RpdmVLZXkiLCJtYXhWaXNpYmxlVGFicyIsInNsaWNlIiwiZ2V0QWN0aXZlS2V5IiwiaXNBY3RpdmVUYWJIaWRkZW4iLCJmaW5kSW5kZXgiLCJzZWxlY3RIaWRkZW5UYWIiLCJ0YWJUb1Nob3dJbmRleCIsInRhYlRvU2hvdyIsInRhYlRvSGlkZSIsIm5ld1Zpc2libGVUYWJzIiwibmV3SGlkZGVuVGFicyIsImZpbHRlciIsInR5cGUiLCJldmVudCIsInRhYkluZGV4IiwicmVmIiwibGFiZWwiLCJtb3JlTGFiZWwiLCJub3JtYWxpemVkTGFiZWwiLCJhbGxDYXBzIiwidG9VcHBlckNhc2UiLCJtYXJnaW5Ub3AiLCJtYXJnaW5MZWZ0IiwiY29sb3IiLCJtYXAiLCJ0aXRsZSIsInRhYnNUeXBlIiwiY3VycmVudEFjdGl2ZUtleSIsInRhYk5hdkNsYXNzTmFtZSIsIm1lbnUiLCJtZW51SWNvbiIsIm1lbnVJdGVtcyIsIm1lbnVQcm9wcyIsImlzQWN0aXZlIiwidGFiSXRlbUNsYXNzTmFtZSIsInRhYkxpbmtDbGFzc05hbWUiLCJvblRhYktleURvd24iLCJyZW5kZXJUYWJNZW51IiwicmVuZGVyQ29udHJvbGxlciIsImNsb25lRWxlbWVudCIsImFjdGl2ZSIsImtleSIsImNsYXNzTmFtZSIsInRhYnNDbGFzc05hbWVzIiwicmVuZGVyVGFiTmF2IiwicmVuZGVyVGFiUGFuZWwiLCJUQUJfVFlQRVMiLCJwcm9wVHlwZXMiLCJzdHJpbmciLCJvbmVPZiIsImFueSIsImZ1bmMiLCJub2RlIiwiY29udHJvbGxlciIsIm51bWJlciIsImJvb2wiLCJkZWZhdWx0UHJvcHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7Ozs7O0lBRXFCQSxJOzs7QUFDbkIsZ0JBQVlDLEtBQVosRUFBbUI7QUFBQTs7QUFBQSxrSUFDWEEsS0FEVzs7QUFBQSxnQ0FFaUIsTUFBS0MsdUJBQUwsQ0FBNkJELEtBQTdCLENBRmpCO0FBQUE7QUFBQSxRQUVWRSxXQUZVO0FBQUEsUUFFR0MsVUFGSDs7QUFJakIsVUFBS0MsS0FBTCxHQUFhO0FBQ1hGLDhCQURXO0FBRVhDO0FBRlcsS0FBYjs7QUFLQSxVQUFLRSxpQkFBTCxHQUF5QixNQUFLQSxpQkFBTCxDQUF1QkMsSUFBdkIsT0FBekI7QUFDQSxVQUFLQyxZQUFMLEdBQW9CLE1BQUtBLFlBQUwsQ0FBa0JELElBQWxCLE9BQXBCOztBQUVBLDZCQUFjLFVBQWQsRUFBMEIsQ0FDeEIsQ0FDRSwyQ0FERixFQUVFLGtFQUZGLENBRHdCLEVBS3hCLENBQ0Usd0VBREYsRUFFRSxzQkFGRixDQUx3QixFQVN4QixDQUNFLDRFQURGLEVBRUUsMEJBRkYsQ0FUd0IsRUFheEIsQ0FDRSxzQkFERixFQUVFLDhEQUZGLENBYndCLEVBaUJ4QixDQUNFLDZCQURGLEVBRUUsbURBRkYsQ0FqQndCLEVBcUJ4QixDQUNFLG1EQURGLEVBRUUsNkNBRkYsRUFHRSx5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ZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IHJlZ2lzdGVyU3R5bGUgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IERyb3Bkb3duQnV0dG9uIGZyb20gJy4vRHJvcGRvd25CdXR0b24nO1xuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICcuL0Ryb3Bkb3duTWVudSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUYWJzIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgY29uc3QgW3Zpc2libGVUYWJzLCBoaWRkZW5UYWJzXSA9IHRoaXMuZ2V0dmlzaWJsZUFuZEhpZGRlblRhYnMocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHZpc2libGVUYWJzLFxuICAgICAgaGlkZGVuVGFicyxcbiAgICB9O1xuXG4gICAgdGhpcy5tb2RpZnlWaXNpYmxlVGFicyA9IHRoaXMubW9kaWZ5VmlzaWJsZVRhYnMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmFjdGl2ZVRhYlJlZiA9IHRoaXMuYWN0aXZlVGFiUmVmLmJpbmQodGhpcyk7XG5cbiAgICByZWdpc3RlclN0eWxlKCd0YWItbWVudScsIFtcbiAgICAgIFtcbiAgICAgICAgJy5zbGRzLXRhYnNfX2l0ZW0ucmVhY3Qtc2xkcy10YWItd2l0aC1tZW51JyxcbiAgICAgICAgJ3sgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7IG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7IH0nLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJy5zbGRzLXRhYnNfX2l0ZW0ucmVhY3Qtc2xkcy10YWItd2l0aC1tZW51ID4gLnJlYWN0LXNsZHMtdGFiLWl0ZW0taW5uZXInLFxuICAgICAgICAneyBvdmVyZmxvdzogaGlkZGVuIH0nLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJy5zbGRzLXRhYnNfX2l0ZW0ucmVhY3Qtc2xkcy10YWItd2l0aC1tZW51ID4gLnJlYWN0LXNsZHMtdGFiLWl0ZW0taW5uZXIgPiBhJyxcbiAgICAgICAgJ3sgcGFkZGluZy1yaWdodDogMnJlbTsgfScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnLnJlYWN0LXNsZHMtdGFiLW1lbnUnLFxuICAgICAgICAneyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgcmlnaHQ6IDA7IHZpc2liaWxpdHk6IGhpZGRlbiB9JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcucmVhY3Qtc2xkcy10YWItbWVudSBidXR0b24nLFxuICAgICAgICAneyBoZWlnaHQ6IDNyZW07IGxpbmUtaGVpZ2h0OiAzcmVtOyB3aWR0aDogMnJlbTsgfScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnLnNsZHMtdGFic19faXRlbS5zbGRzLWFjdGl2ZSAucmVhY3Qtc2xkcy10YWItbWVudScsXG4gICAgICAgICcuc2xkcy10YWJzX19pdGVtOmhvdmVyIC5yZWFjdC1zbGRzLXRhYi1tZW51JyxcbiAgICAgICAgJ3sgdmlzaWJpbGl0eTogdmlzaWJsZSB9JyxcbiAgICAgIF0sXG4gICAgXSk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIGNvbnN0IFt2aXNpYmxlVGFicywgaGlkZGVuVGFic10gPSB0aGlzLmdldHZpc2libGVBbmRIaWRkZW5UYWJzKG5leHRQcm9wcyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICB2aXNpYmxlVGFicyxcbiAgICAgIGhpZGRlblRhYnMsXG4gICAgfSk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZm9jdXNUYWIpIHtcbiAgICAgIGNvbnN0IGVsID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcy5hY3RpdmVUYWIpO1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLmZvY3VzKCk7XG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby1kaWQtdXBkYXRlLXNldC1zdGF0ZSAqL1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGZvY3VzVGFiOiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBvblRhYkNsaWNrKHRhYktleSkge1xuICAgIGlmICh0aGlzLnByb3BzLm9uU2VsZWN0KSB7XG4gICAgICB0aGlzLnByb3BzLm9uU2VsZWN0KHRhYktleSk7XG4gICAgfVxuICAgIC8vIFVuY29udHJvbGxlZFxuICAgIHRoaXMuc2V0U3RhdGUoeyBhY3RpdmVLZXk6IHRhYktleSwgZm9jdXNUYWI6IHRydWUgfSk7XG4gIH1cblxuICBvblRhYktleURvd24odGFiS2V5LCBlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOSkgeyAvLyBsZWZ0L3JpZ2h0IGN1cnNvciBrZXlcbiAgICAgIGxldCBpZHggPSAwO1xuICAgICAgY29uc3QgdGFiS2V5cyA9IFtdO1xuICAgICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaCh0aGlzLnByb3BzLmNoaWxkcmVuLCAodGFiLCBpKSA9PiB7XG4gICAgICAgIHRhYktleXMucHVzaCh0YWIucHJvcHMuZXZlbnRLZXkpO1xuICAgICAgICBpZiAodGFiS2V5ID09PSB0YWIucHJvcHMuZXZlbnRLZXkpIHtcbiAgICAgICAgICBpZHggPSBpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpciA9IGUua2V5Q29kZSA9PT0gMzcgPyAtMSA6IDE7XG4gICAgICBjb25zdCBhY3RpdmVJZHggPSAoaWR4ICsgZGlyICsgdGFiS2V5cy5sZW5ndGgpICUgdGFiS2V5cy5sZW5ndGg7XG4gICAgICBjb25zdCBhY3RpdmVLZXkgPSB0YWJLZXlzW2FjdGl2ZUlkeF07XG4gICAgICB0aGlzLm9uVGFiQ2xpY2soYWN0aXZlS2V5KTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0aXZlS2V5KHByb3BzKSB7XG4gICAgY29uc3QgeyBhY3RpdmVLZXksIGRlZmF1bHRBY3RpdmVLZXkgfSA9IHByb3BzO1xuICAgIGlmICh0eXBlb2YgYWN0aXZlS2V5ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGFjdGl2ZUtleTtcbiAgICBpZiAodGhpcy5zdGF0ZSAmJiB0eXBlb2YgdGhpcy5zdGF0ZS5hY3RpdmVLZXkgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gdGhpcy5zdGF0ZS5hY3RpdmVLZXk7XG4gICAgcmV0dXJuIGRlZmF1bHRBY3RpdmVLZXk7XG4gIH1cblxuICBnZXR2aXNpYmxlQW5kSGlkZGVuVGFicyhwcm9wcykge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIG1heFZpc2libGVUYWJzIH0gPSBwcm9wcztcblxuICAgIGNvbnN0IFt2aXNpYmxlVGFicywgaGlkZGVuVGFic10gPSBbXG4gICAgICBjaGlsZHJlbi5zbGljZSgwLCBtYXhWaXNpYmxlVGFicyksXG4gICAgICBjaGlsZHJlbi5zbGljZShtYXhWaXNpYmxlVGFicywgY2hpbGRyZW4ubGVuZ3RoKSxcbiAgICBdO1xuICAgIGNvbnN0IGFjdGl2ZUtleSA9IHRoaXMuZ2V0QWN0aXZlS2V5KHByb3BzKTtcbiAgICBjb25zdCBpc0FjdGl2ZVRhYkhpZGRlbiA9IGhpZGRlblRhYnMuZmluZEluZGV4KHRhYiA9PiB0YWIucHJvcHMuZXZlbnRLZXkgPT09IGFjdGl2ZUtleSkgIT09IC0xO1xuICAgIHJldHVybiBpc0FjdGl2ZVRhYkhpZGRlbiA/XG4gICAgICB0aGlzLnNlbGVjdEhpZGRlblRhYih2aXNpYmxlVGFicywgaGlkZGVuVGFicywgYWN0aXZlS2V5KSA6IFt2aXNpYmxlVGFicywgaGlkZGVuVGFic107XG4gIH1cblxuICBzZWxlY3RIaWRkZW5UYWIodmlzaWJsZVRhYnMsIGhpZGRlblRhYnMsIGFjdGl2ZUtleSkge1xuICAgIGNvbnN0IHRhYlRvU2hvd0luZGV4ID0gaGlkZGVuVGFicy5maW5kSW5kZXgodGFiID0+IHRhYi5wcm9wcy5ldmVudEtleSA9PT0gYWN0aXZlS2V5KTtcbiAgICBjb25zdCB0YWJUb1Nob3cgPSBoaWRkZW5UYWJzW3RhYlRvU2hvd0luZGV4XTtcbiAgICBjb25zdCB0YWJUb0hpZGUgPSB2aXNpYmxlVGFic1t2aXNpYmxlVGFicy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBuZXdWaXNpYmxlVGFicyA9IFsuLi52aXNpYmxlVGFicy5zbGljZSgwLCB2aXNpYmxlVGFicy5sZW5ndGggLSAxKSwgdGFiVG9TaG93XTtcbiAgICBjb25zdCBuZXdIaWRkZW5UYWJzID0gW1xuICAgICAgdGFiVG9IaWRlLFxuICAgICAgLi4uaGlkZGVuVGFicy5maWx0ZXIodGFiID0+IHRhYi5wcm9wcy5ldmVudEtleSAhPT0gYWN0aXZlS2V5KSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIFtuZXdWaXNpYmxlVGFicywgbmV3SGlkZGVuVGFic107XG4gIH1cblxuICB0YWJzVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy50eXBlID09PSAnc2NvcGVkJyA/ICdzY29wZWQnIDogJ2RlZmF1bHQnO1xuICB9XG5cbiAgbW9kaWZ5VmlzaWJsZVRhYnMoZXZlbnQpIHtcbiAgICBjb25zdCB7IHRhYkluZGV4IH0gPSBldmVudDtcbiAgICBjb25zdCB7IG9uU2VsZWN0IH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChvblNlbGVjdCkgb25TZWxlY3QodGFiSW5kZXgpO1xuICAgIGNvbnN0IFt2aXNpYmxlVGFicywgaGlkZGVuVGFic10gPVxuICAgICAgdGhpcy5zZWxlY3RIaWRkZW5UYWIodGhpcy5zdGF0ZS52aXNpYmxlVGFicywgdGhpcy5zdGF0ZS5oaWRkZW5UYWJzLCB0YWJJbmRleCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vblNlbGVjdCkge1xuICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdCh0YWJJbmRleCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICB2aXNpYmxlVGFicyxcbiAgICAgIGhpZGRlblRhYnMsXG4gICAgICBhY3RpdmVLZXk6IHRhYkluZGV4LFxuICAgICAgZm9jdXNUYWI6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBhY3RpdmVUYWJSZWYocmVmKSB7XG4gICAgdGhpcy5hY3RpdmVUYWIgPSByZWY7XG4gIH1cblxuICByZW5kZXJDb250cm9sbGVyKCkge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5wcm9wcy5tb3JlTGFiZWw7XG4gICAgY29uc3Qgbm9ybWFsaXplZExhYmVsID0gdGhpcy5wcm9wcy5hbGxDYXBzID8gbGFiZWwudG9VcHBlckNhc2UoKSA6IGxhYmVsO1xuICAgIGNvbnN0IG1hcmdpblRvcCA9IHRoaXMucHJvcHMuYWxsQ2FwcyA/IDQgOiA3O1xuICAgIHJldHVybiAoXG4gICAgICA8RHJvcGRvd25CdXR0b25cbiAgICAgICAgbGFiZWw9e25vcm1hbGl6ZWRMYWJlbH1cbiAgICAgICAgc3R5bGU9e3sgbWFyZ2luVG9wLCBtYXJnaW5MZWZ0OiAyMCwgY29sb3I6ICcjNTQ2OThkJyB9fVxuICAgICAgICBvbk1lbnVJdGVtQ2xpY2s9e3RoaXMubW9kaWZ5VmlzaWJsZVRhYnN9XG4gICAgICA+XG4gICAgICAgIHtcbiAgICAgICAgICB0aGlzLnN0YXRlLmhpZGRlblRhYnMubWFwKCh0YWIpID0+IChcbiAgICAgICAgICAgIDxNZW51SXRlbSBrZXk9e3RhYi5wcm9wcy5ldmVudEtleX0gdGFiSW5kZXg9e3RhYi5wcm9wcy5ldmVudEtleX0+XG4gICAgICAgICAgICAgIHt0YWIucHJvcHMudGl0bGV9XG4gICAgICAgICAgICA8L01lbnVJdGVtPlxuICAgICAgICAgICkpXG4gICAgICAgIH1cbiAgICAgIDwvRHJvcGRvd25CdXR0b24+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlclRhYk5hdigpIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50YWJzVHlwZSgpO1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIG1heFZpc2libGVUYWJzIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVLZXkgPSB0aGlzLmdldEFjdGl2ZUtleSh0aGlzLnByb3BzKTtcbiAgICBjb25zdCB0YWJOYXZDbGFzc05hbWUgPSBgc2xkcy10YWJzLS0ke3R5cGV9X19uYXZgO1xuICAgIHJldHVybiAoXG4gICAgICA8dWwgY2xhc3NOYW1lPXsgdGFiTmF2Q2xhc3NOYW1lIH0gcm9sZT0ndGFibGlzdCc+XG4gICAgICB7XG4gICAgICAgIHRoaXMuc3RhdGUudmlzaWJsZVRhYnMubWFwKCh0YWIpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHRpdGxlLCBldmVudEtleSwgbWVudSwgbWVudUljb24gfSA9IHRhYi5wcm9wcztcbiAgICAgICAgICBsZXQgeyBtZW51SXRlbXMgfSA9IHRhYi5wcm9wcztcbiAgICAgICAgICBtZW51SXRlbXMgPSBtZW51ID8gbWVudS5wcm9wcy5jaGlsZHJlbiA6IG1lbnVJdGVtcztcbiAgICAgICAgICBjb25zdCBtZW51UHJvcHMgPSBtZW51ID8gbWVudS5wcm9wcyA6IHt9O1xuICAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gZXZlbnRLZXkgPT09IGN1cnJlbnRBY3RpdmVLZXk7XG4gICAgICAgICAgY29uc3QgdGFiSXRlbUNsYXNzTmFtZSA9IGNsYXNzbmFtZXMoXG4gICAgICAgICAgICAnc2xkcy10YWJzX19pdGVtJyxcbiAgICAgICAgICAgIGBzbGRzLXRhYnMtLSR7dHlwZX1fX2l0ZW1gLFxuICAgICAgICAgICAgJ3NsZHMtdGV4dC1oZWFkaW5nLS0tbGFiZWwnLFxuICAgICAgICAgICAgeyAnc2xkcy1hY3RpdmUnOiBpc0FjdGl2ZSB9LFxuICAgICAgICAgICAgeyAncmVhY3Qtc2xkcy10YWItd2l0aC1tZW51JzogbWVudSB8fCBtZW51SXRlbXMgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgdGFiTGlua0NsYXNzTmFtZSA9IGBzbGRzLXRhYnMtLSR7dHlwZX1fX2xpbmtgO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8bGkgY2xhc3NOYW1lPXsgdGFiSXRlbUNsYXNzTmFtZSB9IHJvbGU9J3ByZXNlbnRhdGlvbicga2V5PXt0YWIucHJvcHMuZXZlbnRLZXl9PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3JlYWN0LXNsZHMtdGFiLWl0ZW0taW5uZXInPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9eyB0YWJMaW5rQ2xhc3NOYW1lIH1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyB0aGlzLm9uVGFiQ2xpY2suYmluZCh0aGlzLCBldmVudEtleSkgfVxuICAgICAgICAgICAgICAgICAgb25LZXlEb3duPXsgdGhpcy5vblRhYktleURvd24uYmluZCh0aGlzLCBldmVudEtleSkgfVxuICAgICAgICAgICAgICAgICAgcm9sZT0ndGFiJ1xuICAgICAgICAgICAgICAgICAgcmVmPXsgaXNBY3RpdmUgPyB0aGlzLmFjdGl2ZVRhYlJlZiA6IG51bGwgfVxuICAgICAgICAgICAgICAgICAgdGFiSW5kZXg9eyBpc0FjdGl2ZSA/IDAgOiAtMSB9XG4gICAgICAgICAgICAgICAgICBhcmlhLXNlbGVjdGVkPXsgaXNBY3RpdmUgfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHsgdGl0bGUgfVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICB7IG1lbnVJdGVtcyA/IHRoaXMucmVuZGVyVGFiTWVudShtZW51SWNvbiwgbWVudUl0ZW1zLCBtZW51UHJvcHMpIDogbnVsbCB9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHtcbiAgICAgICAgbWF4VmlzaWJsZVRhYnMgPCBjaGlsZHJlbi5sZW5ndGggJiYgdGhpcy5yZW5kZXJDb250cm9sbGVyKClcbiAgICAgIH1cbiAgICAgIDwvdWw+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlclRhYk1lbnUobWVudUljb24gPSAnZG93bicsIG1lbnVJdGVtcyA9IFtdLCBtZW51UHJvcHMgPSB7fSkge1xuICAgIHJldHVybiAoXG4gICAgICA8RHJvcGRvd25CdXR0b25cbiAgICAgICAgY2xhc3NOYW1lPSdyZWFjdC1zbGRzLXRhYi1tZW51J1xuICAgICAgICBpY29uPXsgbWVudUljb24gfVxuICAgICAgICB0eXBlPSdpY29uLWJhcmUnXG4gICAgICAgIGljb25TaXplPSdzbWFsbCdcbiAgICAgICAgbnViYmluVG9wXG4gICAgICAgIHsgLi4ubWVudVByb3BzIH1cbiAgICAgID5cbiAgICAgICAgeyBtZW51SXRlbXMgfVxuICAgICAgPC9Ecm9wZG93bkJ1dHRvbj5cbiAgICApO1xuICB9XG5cbiAgcmVuZGVyVGFiUGFuZWwoKSB7XG4gICAgY29uc3QgYWN0aXZlS2V5ID0gdGhpcy5nZXRBY3RpdmVLZXkodGhpcy5wcm9wcyk7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc3RhdGUudmlzaWJsZVRhYnMubWFwKCh0YWIpID0+IHtcbiAgICAgICAgY29uc3QgeyBldmVudEtleSB9ID0gdGFiLnByb3BzO1xuICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IGV2ZW50S2V5ID09PSBhY3RpdmVLZXk7XG4gICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQodGFiLCB7IGFjdGl2ZTogaXNBY3RpdmUsIGtleTogdGFiLnByb3BzLmV2ZW50S2V5IH0pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHRhYnNDbGFzc05hbWVzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsIGBzbGRzLXRhYnMtLSR7dGhpcy50YWJzVHlwZSgpfWApO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17IHRhYnNDbGFzc05hbWVzIH0+XG4gICAgICAgIHsgdGhpcy5yZW5kZXJUYWJOYXYoKSB9XG4gICAgICAgIHsgdGhpcy5yZW5kZXJUYWJQYW5lbCgpIH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgVEFCX1RZUEVTID0gWydkZWZhdWx0JywgJ3Njb3BlZCddO1xuXG5UYWJzLnByb3BUeXBlcyA9IHtcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICB0eXBlOiBQcm9wVHlwZXMub25lT2YoVEFCX1RZUEVTKSxcbiAgZGVmYXVsdEFjdGl2ZUtleTogUHJvcFR5cGVzLmFueSxcbiAgYWN0aXZlS2V5OiBQcm9wVHlwZXMuYW55LFxuICBvblNlbGVjdDogUHJvcFR5cGVzLmZ1bmMsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgY29udHJvbGxlcjogUHJvcFR5cGVzLm5vZGUsXG4gIG1heFZpc2libGVUYWJzOiBQcm9wVHlwZXMubnVtYmVyLFxuICBhbGxDYXBzOiBQcm9wVHlwZXMuYm9vbCxcbiAgbW9yZUxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxufTtcblxuVGFicy5kZWZhdWx0UHJvcHMgPSB7XG4gIG1heFZpc2libGVUYWJzOiAxMCxcbiAgbW9yZUxhYmVsOiAnTW9yZScsXG59O1xuIl19