UNPKG

mui-checkboxlist

Version:

A Material UI based react component for checkbox list.

326 lines (272 loc) 35.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _lodash = _interopRequireDefault(require("lodash")); var _Checkbox = _interopRequireDefault(require("@material-ui/core/Checkbox")); var _Grid = _interopRequireDefault(require("@material-ui/core/Grid")); var _TextField = _interopRequireDefault(require("@material-ui/core/TextField")); var _FormControlLabel = _interopRequireDefault(require("@material-ui/core/FormControlLabel")); var _InputAdornment = _interopRequireDefault(require("@material-ui/core/InputAdornment")); var _IconButton = _interopRequireDefault(require("@material-ui/core/IconButton")); var _Close = _interopRequireDefault(require("@material-ui/icons/Close")); var _DefaultStyles = _interopRequireDefault(require("./DefaultStyles")); var _styles = require("@material-ui/styles"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var CheckboxValueSelect = /*#__PURE__*/ function (_React$Component) { _inherits(CheckboxValueSelect, _React$Component); function CheckboxValueSelect(props) { var _this; _classCallCheck(this, CheckboxValueSelect); _this = _possibleConstructorReturn(this, _getPrototypeOf(CheckboxValueSelect).call(this, props)); _this.state = { searchKey: null, selectedItems: props.selectedItems || [] }; return _this; } _createClass(CheckboxValueSelect, [{ key: "isChecked", value: function isChecked(item, selectedItems) { var valueFilter = _lodash["default"].filter(selectedItems, function (selectedItem) { return selectedItem === item; }); return !_lodash["default"].isEmpty(valueFilter); } }, { key: "renderSearchBar", value: function renderSearchBar() { var _this2 = this; var _this$props = this.props, classes = _this$props.classes, searchBarLabel = _this$props.searchBarLabel, disabled = _this$props.disabled; var searchKey = this.state.searchKey; if (_lodash["default"].isNil(searchBarLabel) || disabled) return; var handleSearchChange = function handleSearchChange(event) { _this2.setState({ searchKey: _lodash["default"].lowerCase(event.target.value) }); }; return _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement(_Grid["default"], { item: true, xs: 12, className: classes.listSearchBar }, _react["default"].createElement(_TextField["default"], { fullWidth: true, placeholder: searchBarLabel, className: classes.listSearchBarText, value: searchKey || "", onChange: handleSearchChange, InputProps: !_lodash["default"].isNil(this.state.searchKey) && this.state.searchKey !== "" ? { endAdornment: _react["default"].createElement(_InputAdornment["default"], { position: "end" }, _react["default"].createElement(_IconButton["default"], { edge: "end", "aria-label": "Clear search bar", onClick: function onClick() { _this2.setState({ searchKey: null }); } }, _react["default"].createElement(_Close["default"], null))) } : null }))); } }, { key: "renderSelectAll", value: function renderSelectAll() { var _this3 = this; var _this$props2 = this.props, classes = _this$props2.classes, listItems = _this$props2.listItems, selectAllLabel = _this$props2.selectAllLabel, onChange = _this$props2.onChange, checkedIcon = _this$props2.checkedIcon, icon = _this$props2.icon, disabled = _this$props2.disabled, limit = _this$props2.limit; var selectedItems = this.state.selectedItems; if (_lodash["default"].isNil(selectAllLabel) || !_lodash["default"].isNil(limit)) return; var handleSelectAllChange = function handleSelectAllChange(event) { var newSelectedItems = []; if (event.target.checked) { newSelectedItems = _lodash["default"].clone(listItems); } onChange(newSelectedItems); _this3.setState({ selectedItems: newSelectedItems }); }; return _react["default"].createElement("div", { className: classes.listItem }, _react["default"].createElement(_FormControlLabel["default"], { control: _react["default"].createElement(_Checkbox["default"], { className: classes.listItemCheckbox, disableRipple: true, color: "default", checked: _lodash["default"].isEqual(selectedItems, listItems), onChange: handleSelectAllChange, disabled: disabled, checkedIcon: checkedIcon, icon: icon }), className: classes.listItemCheckbox.label, label: selectAllLabel })); } }, { key: "renderStatusBar", value: function renderStatusBar() { var selectedItems = this.state.selectedItems; var limit = this.props.limit; var status = "".concat(selectedItems.length, " item").concat(selectedItems.length !== 1 ? "s are" : " is", " currently selected."); if (limit) { status = status + " You can only select ".concat(limit.max, " ").concat(limit.max > 1 ? "items" : "item", "."); } return status; } }, { key: "renderValueCheckbox", value: function renderValueCheckbox(item) { var _this4 = this; var _this$props3 = this.props, classes = _this$props3.classes, checkedIcon = _this$props3.checkedIcon, icon = _this$props3.icon, disabled = _this$props3.disabled, onChange = _this$props3.onChange, limit = _this$props3.limit; var selectedItems = this.state.selectedItems; var handleChange = function handleChange(item) { return function (event) { var selectedItems = _this4.state.selectedItems; var newSelectedItems = selectedItems; if (event.target.checked) { if (limit && limit.max === newSelectedItems.length) { newSelectedItems.splice(limit.deleteLast ? limit.max - 1 : 0, 1); } newSelectedItems.push(item); } else { _lodash["default"].remove(newSelectedItems, function (listItem) { return item === listItem; }); } onChange(newSelectedItems); _this4.setState({ selectedItems: newSelectedItems }); }; }; return _react["default"].createElement("div", { className: classes.listItem, key: "div-".concat(item) }, _react["default"].createElement(_FormControlLabel["default"], { control: _react["default"].createElement(_Checkbox["default"], { className: classes.listItemCheckbox, disabled: disabled, disableRipple: true, color: "default", checked: this.isChecked(item, selectedItems), onChange: handleChange(item), checkedIcon: checkedIcon, icon: icon }), className: classes.listItemCheckbox.label, label: item })); } }, { key: "renderCheckboxes", value: function renderCheckboxes() { var _this5 = this; var _this$state = this.state, selectedItems = _this$state.selectedItems, searchKey = _this$state.searchKey; var _this$props4 = this.props, listItems = _this$props4.listItems, selectedItemsFirst = _this$props4.selectedItemsFirst; var filteredListItems = _lodash["default"].orderBy(searchKey && searchKey !== "" ? _lodash["default"].filter(listItems, function (listItem) { return _lodash["default"].startsWith(_lodash["default"].lowerCase(listItem), searchKey); }) : selectedItemsFirst && !_lodash["default"].isEmpty(selectedItems) ? _lodash["default"].filter(listItems, function (listItem) { return _lodash["default"].isNil(_lodash["default"].find(selectedItems, function (selectedItem) { return selectedItem === listItem; })); }) : listItems); return _react["default"].createElement(_react["default"].Fragment, null, selectedItemsFirst && (_lodash["default"].isNil(searchKey) || searchKey === "") && !_lodash["default"].isEmpty(selectedItems) && _lodash["default"].orderBy(selectedItems).map(function (item) { return _this5.renderValueCheckbox(item); }), filteredListItems.map(function (item) { return _this5.renderValueCheckbox(item); })); } }, { key: "render", value: function render() { var _this$props5 = this.props, classes = _this$props5.classes, label = _this$props5.label, statusBar = _this$props5.statusBar; console.log(classes.listLabel); return _react["default"].createElement(_Grid["default"], { container: true, direction: "row", alignItems: "stretch", className: classes.root }, label && _react["default"].createElement(_Grid["default"], { item: true, xs: 12, className: classes.listLabel }, label), statusBar && _react["default"].createElement(_Grid["default"], { item: true, xs: 12, className: classes.listStatusBar }, this.renderStatusBar()), this.renderSearchBar(), _react["default"].createElement(_Grid["default"], { item: true, xs: 12, className: classes.listContainer }, this.renderSelectAll(), this.renderCheckboxes())); } }]); return CheckboxValueSelect; }(_react["default"].Component); CheckboxValueSelect.propTypes = { checkedIcon: _propTypes["default"].object, classes: _propTypes["default"].object, disabled: _propTypes["default"].bool, icon: _propTypes["default"].object, label: _propTypes["default"].string, limit: _propTypes["default"].shape({ max: _propTypes["default"].number.isRequired, deleteLast: _propTypes["default"].bool.isRequired }), listItems: _propTypes["default"].arrayOf(_propTypes["default"].string).isRequired, onChange: _propTypes["default"].func.isRequired, searchBarLabel: _propTypes["default"].string, selectAllLabel: _propTypes["default"].string, selectedItems: _propTypes["default"].arrayOf(_propTypes["default"].string), selectedItemsFirst: _propTypes["default"].bool, statusBar: _propTypes["default"].bool }; CheckboxValueSelect.defaultProps = { disabled: false, selectAll: true, statusBar: false, selectedItemsFirst: false }; var _default = (0, _styles.withStyles)(_DefaultStyles["default"])(CheckboxValueSelect); exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9DaGVja2JveFZhbHVlU2VsZWN0LmpzIl0sIm5hbWVzIjpbIkNoZWNrYm94VmFsdWVTZWxlY3QiLCJwcm9wcyIsInN0YXRlIiwic2VhcmNoS2V5Iiwic2VsZWN0ZWRJdGVtcyIsIml0ZW0iLCJ2YWx1ZUZpbHRlciIsIl8iLCJmaWx0ZXIiLCJzZWxlY3RlZEl0ZW0iLCJpc0VtcHR5IiwiY2xhc3NlcyIsInNlYXJjaEJhckxhYmVsIiwiZGlzYWJsZWQiLCJpc05pbCIsImhhbmRsZVNlYXJjaENoYW5nZSIsImV2ZW50Iiwic2V0U3RhdGUiLCJsb3dlckNhc2UiLCJ0YXJnZXQiLCJ2YWx1ZSIsImxpc3RTZWFyY2hCYXIiLCJsaXN0U2VhcmNoQmFyVGV4dCIsImVuZEFkb3JubWVudCIsImxpc3RJdGVtcyIsInNlbGVjdEFsbExhYmVsIiwib25DaGFuZ2UiLCJjaGVja2VkSWNvbiIsImljb24iLCJsaW1pdCIsImhhbmRsZVNlbGVjdEFsbENoYW5nZSIsIm5ld1NlbGVjdGVkSXRlbXMiLCJjaGVja2VkIiwiY2xvbmUiLCJsaXN0SXRlbSIsImxpc3RJdGVtQ2hlY2tib3giLCJpc0VxdWFsIiwibGFiZWwiLCJzdGF0dXMiLCJsZW5ndGgiLCJtYXgiLCJoYW5kbGVDaGFuZ2UiLCJzcGxpY2UiLCJkZWxldGVMYXN0IiwicHVzaCIsInJlbW92ZSIsImlzQ2hlY2tlZCIsInNlbGVjdGVkSXRlbXNGaXJzdCIsImZpbHRlcmVkTGlzdEl0ZW1zIiwib3JkZXJCeSIsInN0YXJ0c1dpdGgiLCJmaW5kIiwibWFwIiwicmVuZGVyVmFsdWVDaGVja2JveCIsInN0YXR1c0JhciIsImNvbnNvbGUiLCJsb2ciLCJsaXN0TGFiZWwiLCJyb290IiwibGlzdFN0YXR1c0JhciIsInJlbmRlclN0YXR1c0JhciIsInJlbmRlclNlYXJjaEJhciIsImxpc3RDb250YWluZXIiLCJyZW5kZXJTZWxlY3RBbGwiLCJyZW5kZXJDaGVja2JveGVzIiwiUmVhY3QiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJib29sIiwic3RyaW5nIiwic2hhcGUiLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwiYXJyYXlPZiIsImZ1bmMiLCJkZWZhdWx0UHJvcHMiLCJzZWxlY3RBbGwiLCJEZWZhdWx0U3R5bGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFTUEsbUI7Ozs7O0FBQ0osK0JBQVlDLEtBQVosRUFBbUI7QUFBQTs7QUFBQTs7QUFDakIsNkZBQU1BLEtBQU47QUFDQSxVQUFLQyxLQUFMLEdBQWE7QUFDWEMsTUFBQUEsU0FBUyxFQUFFLElBREE7QUFFWEMsTUFBQUEsYUFBYSxFQUFFSCxLQUFLLENBQUNHLGFBQU4sSUFBdUI7QUFGM0IsS0FBYjtBQUZpQjtBQU1sQjs7Ozs4QkFFU0MsSSxFQUFNRCxhLEVBQWU7QUFDN0IsVUFBTUUsV0FBVyxHQUFHQyxtQkFBRUMsTUFBRixDQUFTSixhQUFULEVBQXdCLFVBQVNLLFlBQVQsRUFBdUI7QUFDakUsZUFBT0EsWUFBWSxLQUFLSixJQUF4QjtBQUNELE9BRm1CLENBQXBCOztBQUdBLGFBQU8sQ0FBQ0UsbUJBQUVHLE9BQUYsQ0FBVUosV0FBVixDQUFSO0FBQ0Q7OztzQ0FFaUI7QUFBQTs7QUFBQSx3QkFDOEIsS0FBS0wsS0FEbkM7QUFBQSxVQUNSVSxPQURRLGVBQ1JBLE9BRFE7QUFBQSxVQUNDQyxjQURELGVBQ0NBLGNBREQ7QUFBQSxVQUNpQkMsUUFEakIsZUFDaUJBLFFBRGpCO0FBQUEsVUFFUlYsU0FGUSxHQUVNLEtBQUtELEtBRlgsQ0FFUkMsU0FGUTtBQUloQixVQUFJSSxtQkFBRU8sS0FBRixDQUFRRixjQUFSLEtBQTJCQyxRQUEvQixFQUF5Qzs7QUFFekMsVUFBTUUsa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFxQixDQUFBQyxLQUFLLEVBQUk7QUFDbEMs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QTVCLENBZGU7QUFlOUJ4QixFQUFBQSxrQkFBa0IsRUFBRXFCLHNCQUFVRSxJQWZBO0FBZ0I5QmhCLEVBQUFBLFNBQVMsRUFBRWMsc0JBQVVFO0FBaEJTLENBQWhDO0FBbUJBdEUsbUJBQW1CLENBQUM2RSxZQUFwQixHQUFtQztBQUNqQ2hFLEVBQUFBLFFBQVEsRUFBRSxLQUR1QjtBQUVqQ2lFLEVBQUFBLFNBQVMsRUFBRSxJQUZzQjtBQUdqQ3hCLEVBQUFBLFNBQVMsRUFBRSxLQUhzQjtBQUlqQ1AsRUFBQUEsa0JBQWtCLEVBQUU7QUFKYSxDQUFuQzs7ZUFPZSx3QkFBV2dDLHlCQUFYLEVBQTBCL0UsbUJBQTFCLEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcclxuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgQ2hlY2tib3ggZnJvbSBcIkBtYXRlcmlhbC11aS9jb3JlL0NoZWNrYm94XCI7XHJcbmltcG9ydCBHcmlkIGZyb20gXCJAbWF0ZXJpYWwtdWkvY29yZS9HcmlkXCI7XHJcbmltcG9ydCBUZXh0RmllbGQgZnJvbSBcIkBtYXRlcmlhbC11aS9jb3JlL1RleHRGaWVsZFwiO1xyXG5pbXBvcnQgRm9ybUNvbnRyb2xMYWJlbCBmcm9tIFwiQG1hdGVyaWFsLXVpL2NvcmUvRm9ybUNvbnRyb2xMYWJlbFwiO1xyXG5pbXBvcnQgSW5wdXRBZG9ybm1lbnQgZnJvbSBcIkBtYXRlcmlhbC11aS9jb3JlL0lucHV0QWRvcm5tZW50XCI7XHJcbmltcG9ydCBJY29uQnV0dG9uIGZyb20gXCJAbWF0ZXJpYWwtdWkvY29yZS9JY29uQnV0dG9uXCI7XHJcbmltcG9ydCBDbG9zZSBmcm9tIFwiQG1hdGVyaWFsLXVpL2ljb25zL0Nsb3NlXCI7XHJcbmltcG9ydCBEZWZhdWx0U3R5bGVzIGZyb20gJy4vRGVmYXVsdFN0eWxlcyc7XHJcbmltcG9ydCB7d2l0aFN0eWxlc30gZnJvbSAnQG1hdGVyaWFsLXVpL3N0eWxlcyc7XHJcblxyXG5jbGFzcyBDaGVja2JveFZhbHVlU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgc3VwZXIocHJvcHMpO1xyXG4gICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgc2VhcmNoS2V5OiBudWxsLFxyXG4gICAgICBzZWxlY3RlZEl0ZW1zOiBwcm9wcy5zZWxlY3RlZEl0ZW1zIHx8IFtdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgaXNDaGVja2VkKGl0ZW0sIHNlbGVjdGVkSXRlbXMpIHtcclxuICAgIGNvbnN0IHZhbHVlRmlsdGVyID0gXy5maWx0ZXIoc2VsZWN0ZWRJdGVtcywgZnVuY3Rpb24oc2VsZWN0ZWRJdGVtKSB7XHJcbiAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW0gPT09IGl0ZW07XHJcbiAgICB9KTtcclxuICAgIHJldHVybiAhXy5pc0VtcHR5KHZhbHVlRmlsdGVyKTtcclxuICB9XHJcblxyXG4gIHJlbmRlclNlYXJjaEJhcigpIHtcclxuICAgIGNvbnN0IHsgY2xhc3Nlcywgc2VhcmNoQmFyTGFiZWwsIGRpc2FibGVkIH0gPSB0aGlzLnByb3BzO1xyXG4gICAgY29uc3QgeyBzZWFyY2hLZXkgfSA9IHRoaXMuc3RhdGU7XHJcblxyXG4gICAgaWYgKF8uaXNOaWwoc2VhcmNoQmFyTGFiZWwpIHx8IGRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgaGFuZGxlU2VhcmNoQ2hhbmdlID0gZXZlbnQgPT4ge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2VhcmNoS2V5OiBfLmxvd2VyQ2FzZShldmVudC50YXJnZXQudmFsdWUpIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8UmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgPEdyaWQgaXRlbSB4cz17MTJ9IGNsYXNzTmFtZT17Y2xhc3Nlcy5saXN0U2VhcmNoQmFyfT5cclxuICAgICAgICAgIDxUZXh0RmllbGRcclxuICAgICAgICAgICAgZnVsbFdpZHRoXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtzZWFyY2hCYXJMYWJlbH1cclxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RTZWFyY2hCYXJUZXh0fVxyXG4gICAgICAgICAgICB2YWx1ZT17c2VhcmNoS2V5IHx8IFwiXCJ9XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVTZWFyY2hDaGFuZ2V9XHJcbiAgICAgICAgICAgIElucHV0UHJvcHM9e1xyXG4gICAgICAgICAgICAgICFfLmlzTmlsKHRoaXMuc3RhdGUuc2VhcmNoS2V5KSAmJiB0aGlzLnN0YXRlLnNlYXJjaEtleSAhPT0gXCJcIlxyXG4gICAgICAgICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRBZG9ybm1lbnQgcG9zaXRpb249XCJlbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlPVwiZW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoIGJhclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlYXJjaEtleTogbnVsbCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPENsb3NlIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvSWNvbkJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvSW5wdXRBZG9ybm1lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA6IG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyU2VsZWN0QWxsKCkge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBjbGFzc2VzLFxyXG4gICAgICBsaXN0SXRlbXMsXHJcbiAgICAgIHNlbGVjdEFsbExhYmVsLFxyXG4gICAgICBvbkNoYW5nZSxcclxuICAgICAgY2hlY2tlZEljb24sXHJcbiAgICAgIGljb24sXHJcbiAgICAgIGRpc2FibGVkLFxyXG4gICAgICBsaW1pdFxyXG4gICAgfSA9IHRoaXMucHJvcHM7XHJcbiAgICBjb25zdCB7IHNlbGVjdGVkSXRlbXMgfSA9IHRoaXMuc3RhdGU7XHJcblxyXG4gICAgaWYgKF8uaXNOaWwoc2VsZWN0QWxsTGFiZWwpIHx8ICFfLmlzTmlsKGxpbWl0KSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZVNlbGVjdEFsbENoYW5nZSA9IGV2ZW50ID0+IHtcclxuICAgICAgbGV0IG5ld1NlbGVjdGVkSXRlbXMgPSBbXTtcclxuICAgICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgICAgbmV3U2VsZWN0ZWRJdGVtcyA9IF8uY2xvbmUobGlzdEl0ZW1zKTtcclxuICAgICAgfVxyXG4gICAgICBvbkNoYW5nZShuZXdTZWxlY3RlZEl0ZW1zKTtcclxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkSXRlbXM6IG5ld1NlbGVjdGVkSXRlbXMgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RJdGVtfT5cclxuICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxyXG4gICAgICAgICAgY29udHJvbD17XHJcbiAgICAgICAgICAgIDxDaGVja2JveFxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5saXN0SXRlbUNoZWNrYm94fVxyXG4gICAgICAgICAgICAgIGRpc2FibGVSaXBwbGVcclxuICAgICAgICAgICAgICBjb2xvcj1cImRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgIGNoZWNrZWQ9e18uaXNFcXVhbChzZWxlY3RlZEl0ZW1zLCBsaXN0SXRlbXMpfVxyXG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVTZWxlY3RBbGxDaGFuZ2V9XHJcbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxyXG4gICAgICAgICAgICAgIGNoZWNrZWRJY29uPXtjaGVja2VkSWNvbn1cclxuICAgICAgICAgICAgICBpY29uPXtpY29ufVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RJdGVtQ2hlY2tib3gubGFiZWx9XHJcbiAgICAgICAgICBsYWJlbD17c2VsZWN0QWxsTGFiZWx9XHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyU3RhdHVzQmFyKCkge1xyXG4gICAgY29uc3QgeyBzZWxlY3RlZEl0ZW1zIH0gPSB0aGlzLnN0YXRlO1xyXG4gICAgY29uc3QgeyBsaW1pdCB9ID0gdGhpcy5wcm9wcztcclxuXHJcbiAgICBsZXQgc3RhdHVzID0gYCR7c2VsZWN0ZWRJdGVtcy5sZW5ndGh9IGl0ZW0ke1xyXG4gICAgICBzZWxlY3RlZEl0ZW1zLmxlbmd0aCAhPT0gMSA/IFwicyBhcmVcIiA6IFwiIGlzXCJcclxuICAgIH0gY3VycmVudGx5IHNlbGVjdGVkLmA7XHJcblxyXG4gICAgaWYgKGxpbWl0KSB7XHJcbiAgICAgIHN0YXR1cyA9XHJcbiAgICAgICAgc3RhdHVzICtcclxuICAgICAgICBgIFlvdSBjYW4gb25seSBzZWxlY3QgJHtsaW1pdC5tYXh9ICR7XHJcbiAgICAgICAgICBsaW1pdC5tYXggPiAxID8gXCJpdGVtc1wiIDogXCJpdGVtXCJcclxuICAgICAgICB9LmA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN0YXR1cztcclxuICB9XHJcblxyXG4gIHJlbmRlclZhbHVlQ2hlY2tib3goaXRlbSkge1xyXG4gICAgY29uc3QgeyBjbGFzc2VzLCBjaGVja2VkSWNvbiwgaWNvbiwgZGlzYWJsZWQsIG9uQ2hhbmdlLCBsaW1pdCB9ID0gdGhpcy5wcm9wcztcclxuICAgIGNvbnN0IHsgc2VsZWN0ZWRJdGVtcyB9ID0gdGhpcy5zdGF0ZTtcclxuXHJcbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSBpdGVtID0+IGV2ZW50ID0+IHtcclxuICAgICAgY29uc3QgeyBzZWxlY3RlZEl0ZW1zIH0gPSB0aGlzLnN0YXRlO1xyXG4gICAgICBsZXQgbmV3U2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGVkSXRlbXM7XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xyXG4gICAgICAgIGlmIChsaW1pdCAmJiBsaW1pdC5tYXggPT09IG5ld1NlbGVjdGVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBuZXdTZWxlY3RlZEl0ZW1zLnNwbGljZShsaW1pdC5kZWxldGVMYXN0ID8gbGltaXQubWF4IC0gMSA6IDAsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXdTZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgXy5yZW1vdmUobmV3U2VsZWN0ZWRJdGVtcywgZnVuY3Rpb24obGlzdEl0ZW0pIHtcclxuICAgICAgICAgIHJldHVybiBpdGVtID09PSBsaXN0SXRlbTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgb25DaGFuZ2UobmV3U2VsZWN0ZWRJdGVtcyk7XHJcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZEl0ZW1zOiBuZXdTZWxlY3RlZEl0ZW1zIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3Nlcy5saXN0SXRlbX0ga2V5PXtgZGl2LSR7aXRlbX1gfT5cclxuICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxyXG4gICAgICAgICAgY29udHJvbD17XHJcbiAgICAgICAgICAgIDxDaGVja2JveFxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5saXN0SXRlbUNoZWNrYm94fVxyXG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgICAgICAgICAgICBkaXNhYmxlUmlwcGxlXHJcbiAgICAgICAgICAgICAgY29sb3I9XCJkZWZhdWx0XCJcclxuICAgICAgICAgICAgICBjaGVja2VkPXt0aGlzLmlzQ2hlY2tlZChpdGVtLCBzZWxlY3RlZEl0ZW1zKX1cclxuICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlKGl0ZW0pfVxyXG4gICAgICAgICAgICAgIGNoZWNrZWRJY29uPXtjaGVja2VkSWNvbn1cclxuICAgICAgICAgICAgICBpY29uPXtpY29ufVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RJdGVtQ2hlY2tib3gubGFiZWx9XHJcbiAgICAgICAgICBsYWJlbD17aXRlbX1cclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZW5kZXJDaGVja2JveGVzKCkge1xyXG4gICAgY29uc3QgeyBzZWxlY3RlZEl0ZW1zLCBzZWFyY2hLZXkgfSA9IHRoaXMuc3RhdGU7XHJcbiAgICBjb25zdCB7IGxpc3RJdGVtcywgc2VsZWN0ZWRJdGVtc0ZpcnN0IH0gPSB0aGlzLnByb3BzO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkTGlzdEl0ZW1zID0gXy5vcmRlckJ5KFxyXG4gICAgICBzZWFyY2hLZXkgJiYgc2VhcmNoS2V5ICE9PSBcIlwiXHJcbiAgICAgICAgPyBfLmZpbHRlcihsaXN0SXRlbXMsIGxpc3RJdGVtID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIF8uc3RhcnRzV2l0aChfLmxvd2VyQ2FzZShsaXN0SXRlbSksIHNlYXJjaEtleSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIDogc2VsZWN0ZWRJdGVtc0ZpcnN0ICYmICFfLmlzRW1wdHkoc2VsZWN0ZWRJdGVtcylcclxuICAgICAgICA/IF8uZmlsdGVyKGxpc3RJdGVtcywgbGlzdEl0ZW0gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gXy5pc05pbChcclxuICAgICAgICAgICAgICBfLmZpbmQoc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRJdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW0gPT09IGxpc3RJdGVtO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIDogbGlzdEl0ZW1zXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIDxSZWFjdC5GcmFnbWVudD5cclxuICAgICAgICB7c2VsZWN0ZWRJdGVtc0ZpcnN0ICYmXHJcbiAgICAgICAgICAoXy5pc05pbChzZWFyY2hLZXkpIHx8IHNlYXJjaEtleSA9PT0gXCJcIikgJiZcclxuICAgICAgICAgICFfLmlzRW1wdHkoc2VsZWN0ZWRJdGVtcykgJiZcclxuICAgICAgICAgIF8ub3JkZXJCeShzZWxlY3RlZEl0ZW1zKS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlclZhbHVlQ2hlY2tib3goaXRlbSk7XHJcbiAgICAgICAgICB9KX1cclxuICAgICAgICB7ZmlsdGVyZWRMaXN0SXRlbXMubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVmFsdWVDaGVja2JveChpdGVtKTtcclxuICAgICAgICB9KX1cclxuICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZW5kZXIoKSB7XHJcbiAgICBjb25zdCB7IGNsYXNzZXMsIGxhYmVsLCBzdGF0dXNCYXIgfSA9IHRoaXMucHJvcHM7XHJcbiAgICBjb25zb2xlLmxvZyhjbGFzc2VzLmxpc3RMYWJlbCk7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgPEdyaWQgY29udGFpbmVyIGRpcmVjdGlvbj1cInJvd1wiIGFsaWduSXRlbXM9XCJzdHJldGNoXCIgY2xhc3NOYW1lPXtjbGFzc2VzLnJvb3R9PlxyXG4gICAgICAgIHtsYWJlbCAmJiAoXHJcbiAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RMYWJlbH0+XHJcbiAgICAgICAgICAgIHtsYWJlbH1cclxuICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICApfVxyXG4gICAgICAgIHtzdGF0dXNCYXIgJiYgKFxyXG4gICAgICAgICAgPEdyaWQgaXRlbSB4cz17MTJ9IGNsYXNzTmFtZT17Y2xhc3Nlcy5saXN0U3RhdHVzQmFyfT5cclxuICAgICAgICAgICAge3RoaXMucmVuZGVyU3RhdHVzQmFyKCl9XHJcbiAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgKX1cclxuICAgICAgICB7dGhpcy5yZW5kZXJTZWFyY2hCYXIoKX1cclxuICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RDb250YWluZXJ9PlxyXG4gICAgICAgICAge3RoaXMucmVuZGVyU2VsZWN0QWxsKCl9XHJcbiAgICAgICAgICB7dGhpcy5yZW5kZXJDaGVja2JveGVzKCl9XHJcbiAgICAgICAgPC9HcmlkPlxyXG4gICAgICA8L0dyaWQ+XHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuQ2hlY2tib3hWYWx1ZVNlbGVjdC5wcm9wVHlwZXMgPSB7XHJcbiAgY2hlY2tlZEljb246IFByb3BUeXBlcy5vYmplY3QsXHJcbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcclxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcbiAgaWNvbjogUHJvcFR5cGVzLm9iamVjdCxcclxuICBsYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcclxuICBsaW1pdDogUHJvcFR5cGVzLnNoYXBlKHtcclxuICAgIG1heDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxyXG4gICAgZGVsZXRlTGFzdDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZFxyXG4gIH0pLFxyXG4gIGxpc3RJdGVtczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxcclxuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcclxuICBzZWFyY2hCYXJMYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcclxuICBzZWxlY3RBbGxMYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcclxuICBzZWxlY3RlZEl0ZW1zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSxcclxuICBzZWxlY3RlZEl0ZW1zRmlyc3Q6IFByb3BUeXBlcy5ib29sLFxyXG4gIHN0YXR1c0JhcjogUHJvcFR5cGVzLmJvb2wsXHJcbn07XHJcblxyXG5DaGVja2JveFZhbHVlU2VsZWN0LmRlZmF1bHRQcm9wcyA9IHtcclxuICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgc2VsZWN0QWxsOiB0cnVlLFxyXG4gIHN0YXR1c0JhcjogZmFsc2UsXHJcbiAgc2VsZWN0ZWRJdGVtc0ZpcnN0OiBmYWxzZSxcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoRGVmYXVsdFN0eWxlcykoQ2hlY2tib3hWYWx1ZVNlbGVjdCk7XHJcbiJdfQ==