UNPKG

react-lightning-design-components

Version:

Salesforce Lightning Design System components built with React 16

403 lines (343 loc) 35.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); 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 _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); var _uuid = require('uuid'); var _uuid2 = _interopRequireDefault(_uuid); var _FormElement = require('./FormElement'); var _FormElement2 = _interopRequireDefault(_FormElement); var _Input = require('./Input'); var _Input2 = _interopRequireDefault(_Input); var _Icon = require('./Icon'); var _Icon2 = _interopRequireDefault(_Icon); var _Datepicker = require('./Datepicker'); var _Datepicker2 = _interopRequireDefault(_Datepicker); var _reactOnclickoutside = require('react-onclickoutside'); var _reactOnclickoutside2 = _interopRequireDefault(_reactOnclickoutside); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var DateInput = function (_Component) { (0, _inherits3.default)(DateInput, _Component); function DateInput(props) { (0, _classCallCheck3.default)(this, DateInput); var _this = (0, _possibleConstructorReturn3.default)(this, (DateInput.__proto__ || (0, _getPrototypeOf2.default)(DateInput)).call(this, props)); _this.handleClickOutside = _this.handleClickOutside.bind(_this); _this.state = { id: 'form-element-' + (0, _uuid2.default)(), opened: props.defaultOpened || false }; _this.onDateIconClick = _this.onDateIconClick.bind(_this); _this.onInputKeyDown = _this.onInputKeyDown.bind(_this); _this.onInputChange = _this.onInputChange.bind(_this); _this.onInputBlur = _this.onInputBlur.bind(_this); _this.onDatepickerSelect = _this.onDatepickerSelect.bind(_this); _this.onDatepickerBlur = _this.onDatepickerBlur.bind(_this); _this.onDatepickerClose = _this.onDatepickerClose.bind(_this); _this.inputRef = _this.inputRef.bind(_this); return _this; } (0, _createClass3.default)(DateInput, [{ key: 'componentDidUpdate', value: function componentDidUpdate(prevProps, prevState) { if (this.props.onValueChange && prevState.value !== this.state.value) { this.props.onValueChange(this.state.value, prevState.value); } } }, { key: 'onDateIconClick', value: function onDateIconClick() { var _this2 = this; setTimeout(function () { if (_this2.props.inputFocused) { var inputEl = _reactDom2.default.findDOMNode(_this2.input); if (inputEl) { inputEl.focus(); } } _this2.showDatepicker(); }, 10); } }, { key: 'onInputKeyDown', value: function onInputKeyDown(e) { var _this3 = this; if (e.keyCode === 13) { // return key this.onDatepickerClose(); e.preventDefault(); e.stopPropagation(); this.setValueFromInput(e.target.value); if (this.props.onComplete) { setTimeout(function () { _this3.props.onComplete(); }, 10); } } else if (e.keyCode === 40) { // down key this.showDatepicker(); e.preventDefault(); e.stopPropagation(); } else if (e.keyCode === 27) { // ESC this.onDatepickerClose(); e.preventDefault(); e.stopPropagation(); } if (this.props.onKeyDown) { this.props.onKeyDown(e); } } }, { key: 'onInputChange', value: function onInputChange(e) { var inputValue = e.target.value; this.setState({ inputValue: inputValue }); if (this.props.onChange) { this.props.onChange(e, inputValue); } } }, { key: 'onInputBlur', value: function onInputBlur(e) { var _this4 = this; this.setValueFromInput(e.target.value); setTimeout(function () { if (!_this4.isFocusedInComponent()) { if (_this4.props.onBlur) { _this4.props.onBlur(); } if (_this4.props.onComplete) { _this4.props.onComplete(); } } }, 10); } }, { key: 'onDatepickerSelect', value: function onDatepickerSelect(value) { var _this5 = this; this.setState({ value: value, inputValue: undefined }); setTimeout(function () { _this5.setState({ opened: false }); var inputEl = _reactDom2.default.findDOMNode(_this5.input); if (inputEl) { inputEl.focus(); inputEl.select(); } if (_this5.props.onComplete) { _this5.props.onComplete(); } }, 200); } }, { key: 'onDatepickerBlur', value: function onDatepickerBlur() { var _this6 = this; this.setState({ opened: false }); setTimeout(function () { if (!_this6.isFocusedInComponent()) { if (_this6.props.onBlur) { _this6.props.onBlur(); } if (_this6.props.onComplete) { _this6.props.onComplete(); } } }, 10); } }, { key: 'onDatepickerClose', value: function onDatepickerClose() { this.setState({ opened: false }); var inputEl = _reactDom2.default.findDOMNode(this.input); if (inputEl) { inputEl.focus(); inputEl.select(); } } }, { key: 'setValueFromInput', value: function setValueFromInput(inputValue) { var value = this.state.value; if (!inputValue) { value = ''; } else { value = (0, _moment2.default)(inputValue, this.props.dateFormat); if (value.isValid()) { value = value.format('YYYY-MM-DD'); } else { value = inputValue; } } this.setState({ value: value, inputValue: undefined }); } }, { key: 'inputRef', value: function inputRef(ref) { this.input = ref; } // provided by 'react-onclickoutside' HOC }, { key: 'handleClickOutside', value: function handleClickOutside() { if (!this.state.opened) { return; } this.onDatepickerClose(); } }, { key: 'isFocusedInComponent', value: function isFocusedInComponent() { var rootEl = _reactDom2.default.findDOMNode(this); var targetEl = document.activeElement; while (targetEl && targetEl !== rootEl) { targetEl = targetEl.parentNode; } return !!targetEl; } }, { key: 'showDatepicker', value: function showDatepicker() { var value = this.state.value; if (typeof this.state.inputValue !== 'undefined') { value = (0, _moment2.default)(this.state.inputValue, this.props.dateFormat); if (value.isValid()) { value = value.format('YYYY-MM-DD'); } else { value = this.state.value; } } this.setState({ opened: !this.state.opened, value: value }); } }, { key: 'renderInput', value: function renderInput(_ref) { var inputValue = _ref.inputValue, props = (0, _objectWithoutProperties3.default)(_ref, ['inputValue']); var inputDateClassNames = (0, _classnames2.default)('slds-input-has-icon', 'slds-input-has-icon--right', props.className); var pprops = props; delete pprops.onValueChange; delete pprops.defaultOpened; delete pprops.inputFocused; delete pprops.disableOnClickOutside; delete pprops.enableOnClickOutside; delete pprops.outsideClickIgnoreClass; delete pprops.preventDefault; delete pprops.eventTypes; delete pprops.stopPropagation; return _react2.default.createElement( 'div', { className: inputDateClassNames }, _react2.default.createElement(_Input2.default, (0, _extends3.default)({ ref: this.inputRef, value: inputValue }, props, { onKeyDown: this.onInputKeyDown, onChange: this.onInputChange, onBlur: this.onInputBlur, onClick: this.onDateIconClick })), _react2.default.createElement(_Icon2.default, { icon: 'event', className: 'slds-input__icon', style: { cursor: 'pointer' }, onClick: this.onDateIconClick }) ); } }, { key: 'renderDropdown', value: function renderDropdown(dateValue) { var datepickerClassNames = (0, _classnames2.default)('slds-dropdown', 'slds-dropdown--left'); return this.state.opened ? _react2.default.createElement(_Datepicker2.default, { className: datepickerClassNames, selectedDate: dateValue, autoFocus: !this.props.inputFocused, onSelect: this.onDatepickerSelect, onBlur: this.onDatepickerBlur, onClose: this.onDatepickerClose, disablePastDateSelection: this.props.disablePastDateSelection }) : _react2.default.createElement('div', null); } }, { key: 'render', value: function render() { var id = this.props.id || this.state.id; var _props = this.props, totalCols = _props.totalCols, cols = _props.cols, label = _props.label, required = _props.required, error = _props.error, defaultValue = _props.defaultValue, value = _props.value, dateFormat = _props.dateFormat, tooltip = _props.tooltip, props = (0, _objectWithoutProperties3.default)(_props, ['totalCols', 'cols', 'label', 'required', 'error', 'defaultValue', 'value', 'dateFormat', 'tooltip']); var dateValue = typeof value !== 'undefined' ? value : typeof this.state.value !== 'undefined' ? this.state.value : defaultValue; var mvalue = (0, _moment2.default)(dateValue, 'YYYY-MM-DD'); var inputValue = typeof this.state.inputValue !== 'undefined' ? this.state.inputValue : typeof dateValue !== 'undefined' ? mvalue.isValid() ? mvalue.format(dateFormat) : dateValue : undefined; var dropdown = this.renderDropdown(dateValue); var formElemProps = { id: id, totalCols: totalCols, cols: cols, label: label, required: required, error: error, dropdown: dropdown, tooltip: tooltip }; return _react2.default.createElement( _FormElement2.default, formElemProps, this.renderInput((0, _extends3.default)({ id: id, inputValue: inputValue }, props)) ); } }]); return DateInput; }(_react.Component); DateInput.propTypes = { id: _propTypes2.default.string, className: _propTypes2.default.string, label: _propTypes2.default.string, required: _propTypes2.default.bool, error: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.string, _propTypes2.default.shape({ message: _propTypes2.default.string })]), totalCols: _propTypes2.default.number, cols: _propTypes2.default.number, value: _propTypes2.default.string, onKeyDown: _propTypes2.default.func, onBlur: _propTypes2.default.func, defaultValue: _propTypes2.default.string, defaultOpened: _propTypes2.default.bool, dateFormat: _propTypes2.default.string, onChange: _propTypes2.default.func, onValueChange: _propTypes2.default.func, onComplete: _propTypes2.default.func, disablePastDateSelection: _propTypes2.default.bool, inputFocused: _propTypes2.default.bool, tooltip: _propTypes2.default.element }; DateInput.defaultProps = { dateFormat: 'L', inputFocused: false }; DateInput.isFormElement = true; exports.default = (0, _reactOnclickoutside2.default)(DateInput); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL0RhdGVJbnB1dC5qcyJdLCJuYW1lcyI6WyJEYXRlSW5wdXQiLCJwcm9wcyIsImhhbmRsZUNsaWNrT3V0c2lkZSIsImJpbmQiLCJzdGF0ZSIsImlkIiwib3BlbmVkIiwiZGVmYXVsdE9wZW5lZCIsIm9uRGF0ZUljb25DbGljayIsIm9uSW5wdXRLZXlEb3duIiwib25JbnB1dENoYW5nZSIsIm9uSW5wdXRCbHVyIiwib25EYXRlcGlja2VyU2VsZWN0Iiwib25EYXRlcGlja2VyQmx1ciIsIm9uRGF0ZXBpY2tlckNsb3NlIiwiaW5wdXRSZWYiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJvblZhbHVlQ2hhbmdlIiwidmFsdWUiLCJzZXRUaW1lb3V0IiwiaW5wdXRGb2N1c2VkIiwiaW5wdXRFbCIsImZpbmRET01Ob2RlIiwiaW5wdXQiLCJmb2N1cyIsInNob3dEYXRlcGlja2VyIiwiZSIsImtleUNvZGUiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsInNldFZhbHVlRnJvbUlucHV0IiwidGFyZ2V0Iiwib25Db21wbGV0ZSIsIm9uS2V5RG93biIsImlucHV0VmFsdWUiLCJzZXRTdGF0ZSIsIm9uQ2hhbmdlIiwiaXNGb2N1c2VkSW5Db21wb25lbnQiLCJvbkJsdXIiLCJ1bmRlZmluZWQiLCJzZWxlY3QiLCJkYXRlRm9ybWF0IiwiaXNWYWxpZCIsImZvcm1hdCIsInJlZiIsInJvb3RFbCIsInRhcmdldEVsIiwiZG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwicGFyZW50Tm9kZSIsImlucHV0RGF0ZUNsYXNzTmFtZXMiLCJjbGFzc05hbWUiLCJwcHJvcHMiLCJkaXNhYmxlT25DbGlja091dHNpZGUiLCJlbmFibGVPbkNsaWNrT3V0c2lkZSIsIm91dHNpZGVDbGlja0lnbm9yZUNsYXNzIiwiZXZlbnRUeXBlcyIsImN1cnNvciIsImRhdGVWYWx1ZSIsImRhdGVwaWNrZXJDbGFzc05hbWVzIiwiZGlzYWJsZVBhc3REYXRlU2VsZWN0aW9uIiwidG90YWxDb2xzIiwiY29scyIsImxhYmVsIiwicmVxdWlyZWQiLCJlcnJvciIsImRlZmF1bHRWYWx1ZSIsInRvb2x0aXAiLCJtdmFsdWUiLCJkcm9wZG93biIsInJlbmRlckRyb3Bkb3duIiwiZm9ybUVsZW1Qcm9wcyIsInJlbmRlcklucHV0IiwicHJvcFR5cGVzIiwic3RyaW5nIiwiYm9vbCIsIm9uZU9mVHlwZSIsInNoYXBlIiwibWVzc2FnZSIsIm51bWJlciIsImZ1bmMiLCJlbGVtZW50IiwiZGVmYXVsdFByb3BzIiwiaXNGb3JtRWxlbWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztJQUVNQSxTOzs7QUFDSixxQkFBWUMsS0FBWixFQUFtQjtBQUFBOztBQUFBLDRJQUNYQSxLQURXOztBQUVqQixVQUFLQyxrQkFBTCxHQUEwQixNQUFLQSxrQkFBTCxDQUF3QkMsSUFBeEIsT0FBMUI7QUFDQSxVQUFLQyxLQUFMLEdBQWE7QUFDWEMsNEJBQW9CLHFCQURUO0FBRVhDLGNBQVNMLE1BQU1NLGFBQU4sSUFBdUI7QUFGckIsS0FBYjs7QUFLQSxVQUFLQyxlQUFMLEdBQXVCLE1BQUtBLGVBQUwsQ0FBcUJMLElBQXJCLE9BQXZCO0FBQ0EsVUFBS00sY0FBTCxHQUFzQixNQUFLQSxjQUFMLENBQW9CTixJQUFwQixPQUF0QjtBQUNBLFVBQUtPLGFBQUwsR0FBcUIsTUFBS0EsYUFBTCxDQUFtQlAsSUFBbkIsT0FBckI7QUFDQSxVQUFLUSxXQUFMLEdBQW1CLE1BQUtBLFdBQUwsQ0FBaUJSLElBQWpCLE9BQW5COztBQUVBLFVBQUtTLGtCQUFMLEdBQTBCLE1BQUtBLGtCQUFMLENBQXdCVCxJQUF4QixPQUExQjtBQUNBLFVBQUtVLGdCQUFMLEdBQXdCLE1BQUtBLGdCQUFMLENBQXNCVixJ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QyxjQUFZLEdBRFc7QUFFdkJyQixnQkFBYztBQUZTLENBQXpCOztBQUtBckIsVUFBVW9GLGFBQVYsR0FBMEIsSUFBMUI7O2tCQUVlLG1DQUFlcEYsU0FBZixDIiwiZmlsZSI6IkRhdGVJbnB1dC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB1dWlkIGZyb20gJ3V1aWQnO1xuaW1wb3J0IEZvcm1FbGVtZW50IGZyb20gJy4vRm9ybUVsZW1lbnQnO1xuaW1wb3J0IElucHV0IGZyb20gJy4vSW5wdXQnO1xuaW1wb3J0IEljb24gZnJvbSAnLi9JY29uJztcbmltcG9ydCBEYXRlcGlja2VyIGZyb20gJy4vRGF0ZXBpY2tlcic7XG5pbXBvcnQgb25DbGlja091dHNpZGUgZnJvbSAncmVhY3Qtb25jbGlja291dHNpZGUnO1xuXG5jbGFzcyBEYXRlSW5wdXQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZSA9IHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlkOiBgZm9ybS1lbGVtZW50LSR7dXVpZCgpfWAsXG4gICAgICBvcGVuZWQ6IChwcm9wcy5kZWZhdWx0T3BlbmVkIHx8IGZhbHNlKSxcbiAgICB9O1xuXG4gICAgdGhpcy5vbkRhdGVJY29uQ2xpY2sgPSB0aGlzLm9uRGF0ZUljb25DbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25JbnB1dEtleURvd24gPSB0aGlzLm9uSW5wdXRLZXlEb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbklucHV0Q2hhbmdlID0gdGhpcy5vbklucHV0Q2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbklucHV0Qmx1ciA9IHRoaXMub25JbnB1dEJsdXIuYmluZCh0aGlzKTtcblxuICAgIHRoaXMub25EYXRlcGlja2VyU2VsZWN0ID0gdGhpcy5vbkRhdGVwaWNrZXJTZWxlY3QuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRGF0ZXBpY2tlckJsdXIgPSB0aGlzLm9uRGF0ZXBpY2tlckJsdXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRGF0ZXBpY2tlckNsb3NlID0gdGhpcy5vbkRhdGVwaWNrZXJDbG9zZS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5pbnB1dFJlZiA9IHRoaXMuaW5wdXRSZWYuYmluZCh0aGlzKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIGlmICh0aGlzLnByb3BzLm9uVmFsdWVDaGFuZ2UgJiYgcHJldlN0YXRlLnZhbHVlICE9PSB0aGlzLnN0YXRlLnZhbHVlKSB7XG4gICAgICB0aGlzLnByb3BzLm9uVmFsdWVDaGFuZ2UodGhpcy5zdGF0ZS52YWx1ZSwgcHJldlN0YXRlLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBvbkRhdGVJY29uQ2xpY2soKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5pbnB1dEZvY3VzZWQpIHtcbiAgICAgICAgY29uc3QgaW5wdXRFbCA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMuaW5wdXQpO1xuICAgICAgICBpZiAoaW5wdXRFbCkge1xuICAgICAgICAgIGlucHV0RWwuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlcigpO1xuICAgIH0sIDEwKTtcbiAgfVxuXG4gIG9uSW5wdXRLZXlEb3duKGUpIHtcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgeyAvLyByZXR1cm4ga2V5XG4gICAgICB0aGlzLm9uRGF0ZXBpY2tlckNsb3NlKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5zZXRWYWx1ZUZyb21JbnB1dChlLnRhcmdldC52YWx1ZSk7XG4gICAgICBpZiAodGhpcy5wcm9wcy5vbkNvbXBsZXRlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZSgpO1xuICAgICAgICB9LCAxMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDQwKSB7IC8vIGRvd24ga2V5XG4gICAgICB0aGlzLnNob3dEYXRlcGlja2VyKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSAyNykgeyAvLyBFU0NcbiAgICAgIHRoaXMub25EYXRlcGlja2VyQ2xvc2UoKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzLm9uS2V5RG93bikge1xuICAgICAgdGhpcy5wcm9wcy5vbktleURvd24oZSk7XG4gICAgfVxuICB9XG5cbiAgb25JbnB1dENoYW5nZShlKSB7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBpbnB1dFZhbHVlIH0pO1xuICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGUsIGlucHV0VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uSW5wdXRCbHVyKGUpIHtcbiAgICB0aGlzLnNldFZhbHVlRnJvbUlucHV0KGUudGFyZ2V0LnZhbHVlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc0ZvY3VzZWRJbkNvbXBvbmVudCgpKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQmx1cikge1xuICAgICAgICAgIHRoaXMucHJvcHMub25CbHVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25Db21wbGV0ZSkge1xuICAgICAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgb25EYXRlcGlja2VyU2VsZWN0KHZhbHVlKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlLCBpbnB1dFZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbmVkOiBmYWxzZSB9KTtcbiAgICAgIGNvbnN0IGlucHV0RWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLmlucHV0KTtcbiAgICAgIGlmIChpbnB1dEVsKSB7XG4gICAgICAgIGlucHV0RWwuZm9jdXMoKTtcbiAgICAgICAgaW5wdXRFbC5zZWxlY3QoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnByb3BzLm9uQ29tcGxldGUpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIG9uRGF0ZXBpY2tlckJsdXIoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogZmFsc2UgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNGb2N1c2VkSW5Db21wb25lbnQoKSkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkJsdXIpIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uQmx1cigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ29tcGxldGUpIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uQ29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDEwKTtcbiAgfVxuXG4gIG9uRGF0ZXBpY2tlckNsb3NlKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuZWQ6IGZhbHNlIH0pO1xuICAgIGNvbnN0IGlucHV0RWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLmlucHV0KTtcbiAgICBpZiAoaW5wdXRFbCkge1xuICAgICAgaW5wdXRFbC5mb2N1cygpO1xuICAgICAgaW5wdXRFbC5zZWxlY3QoKTtcbiAgICB9XG4gIH1cblxuICBzZXRWYWx1ZUZyb21JbnB1dChpbnB1dFZhbHVlKSB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICBpZiAoIWlucHV0VmFsdWUpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gbW9tZW50KGlucHV0VmFsdWUsIHRoaXMucHJvcHMuZGF0ZUZvcm1hdCk7XG4gICAgICBpZiAodmFsdWUuaXNWYWxpZCgpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGlucHV0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZSwgaW5wdXRWYWx1ZTogdW5kZWZpbmVkIH0pO1xuICB9XG5cbiAgaW5wdXRSZWYocmVmKSB7XG4gICAgdGhpcy5pbnB1dCA9IHJlZjtcbiAgfVxuXG4gIC8vIHByb3ZpZGVkIGJ5ICdyZWFjdC1vbmNsaWNrb3V0c2lkZScgSE9DXG4gIGhhbmRsZUNsaWNrT3V0c2lkZSgpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUub3BlbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub25EYXRlcGlja2VyQ2xvc2UoKTtcbiAgfVxuXG4gIGlzRm9jdXNlZEluQ29tcG9uZW50KCkge1xuICAgIGNvbnN0IHJvb3RFbCA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMpO1xuICAgIGxldCB0YXJnZXRFbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgd2hpbGUgKHRhcmdldEVsICYmIHRhcmdldEVsICE9PSByb290RWwpIHtcbiAgICAgIHRhcmdldEVsID0gdGFyZ2V0RWwucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuICEhdGFyZ2V0RWw7XG4gIH1cblxuICBzaG93RGF0ZXBpY2tlcigpIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgIGlmICh0eXBlb2YgdGhpcy5zdGF0ZS5pbnB1dFZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFsdWUgPSBtb21lbnQodGhpcy5zdGF0ZS5pbnB1dFZhbHVlLCB0aGlzLnByb3BzLmRhdGVGb3JtYXQpO1xuICAgICAgaWYgKHZhbHVlLmlzVmFsaWQoKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNldFN0YXRlKHsgb3BlbmVkOiAhdGhpcy5zdGF0ZS5vcGVuZWQsIHZhbHVlIH0pO1xuICB9XG5cbiAgcmVuZGVySW5wdXQoeyBpbnB1dFZhbHVlLCAuLi5wcm9wcyB9KSB7XG4gICAgY29uc3QgaW5wdXREYXRlQ2xhc3NOYW1lcyA9IGNsYXNzbmFtZXMoXG4gICAgICAnc2xkcy1pbnB1dC1oYXMtaWNvbicsXG4gICAgICAnc2xkcy1pbnB1dC1oYXMtaWNvbi0tcmlnaHQnLFxuICAgICAgcHJvcHMuY2xhc3NOYW1lXG4gICAgKTtcbiAgICBjb25zdCBwcHJvcHMgPSBwcm9wcztcbiAgICBkZWxldGUgcHByb3BzLm9uVmFsdWVDaGFuZ2U7XG4gICAgZGVsZXRlIHBwcm9wcy5kZWZhdWx0T3BlbmVkO1xuICAgIGRlbGV0ZSBwcHJvcHMuaW5wdXRGb2N1c2VkO1xuICAgIGRlbGV0ZSBwcHJvcHMuZGlzYWJsZU9uQ2xpY2tPdXRzaWRlO1xuICAgIGRlbGV0ZSBwcHJvcHMuZW5hYmxlT25DbGlja091dHNpZGU7XG4gICAgZGVsZXRlIHBwcm9wcy5vdXRzaWRlQ2xpY2tJZ25vcmVDbGFzcztcbiAgICBkZWxldGUgcHByb3BzLnByZXZlbnREZWZhdWx0O1xuICAgIGRlbGV0ZSBwcHJvcHMuZXZlbnRUeXBlcztcbiAgICBkZWxldGUgcHByb3BzLnN0b3BQcm9wYWdhdGlvbjtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17aW5wdXREYXRlQ2xhc3NOYW1lc30+XG4gICAgICAgIDxJbnB1dFxuICAgICAgICAgIHJlZj17dGhpcy5pbnB1dFJlZn1cbiAgICAgICAgICB2YWx1ZT17IGlucHV0VmFsdWUgfVxuICAgICAgICAgIHsgLi4ucHJvcHMgfVxuICAgICAgICAgIG9uS2V5RG93bj17IHRoaXMub25JbnB1dEtleURvd24gfVxuICAgICAgICAgIG9uQ2hhbmdlPXsgdGhpcy5vbklucHV0Q2hhbmdlIH1cbiAgICAgICAgICBvbkJsdXI9eyB0aGlzLm9uSW5wdXRCbHVyIH1cbiAgICAgICAgICBvbkNsaWNrPXsgdGhpcy5vbkRhdGVJY29uQ2xpY2sgfVxuICAgICAgICAvPlxuICAgICAgICA8SWNvblxuICAgICAgICAgIGljb249J2V2ZW50J1xuICAgICAgICAgIGNsYXNzTmFtZT0nc2xkcy1pbnB1dF9faWNvbidcbiAgICAgICAgICBzdHlsZT17IHsgY3Vyc29yOiAncG9pbnRlcicgfSB9XG4gICAgICAgICAgb25DbGljaz17IHRoaXMub25EYXRlSWNvbkNsaWNrIH1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICByZW5kZXJEcm9wZG93bihkYXRlVmFsdWUpIHtcbiAgICBjb25zdCBkYXRlcGlja2VyQ2xhc3NOYW1lcyA9IGNsYXNzbmFtZXMoXG4gICAgICAnc2xkcy1kcm9wZG93bicsXG4gICAgICAnc2xkcy1kcm9wZG93bi0tbGVmdCdcbiAgICApO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0YXRlLm9wZW5lZCA/XG4gICAgICAgIDxEYXRlcGlja2VyXG4gICAgICAgICAgY2xhc3NOYW1lPXsgZGF0ZXBpY2tlckNsYXNzTmFtZXMgfVxuICAgICAgICAgIHNlbGVjdGVkRGF0ZT17IGRhdGVWYWx1ZSB9XG4gICAgICAgICAgYXV0b0ZvY3VzPXshdGhpcy5wcm9wcy5pbnB1dEZvY3VzZWR9XG4gICAgICAgICAgb25TZWxlY3Q9eyB0aGlzLm9uRGF0ZXBpY2tlclNlbGVjdCB9XG4gICAgICAgICAgb25CbHVyPXsgdGhpcy5vbkRhdGVwaWNrZXJCbHVyIH1cbiAgICAgICAgICBvbkNsb3NlPXsgdGhpcy5vbkRhdGVwaWNrZXJDbG9zZSB9XG4gICAgICAgICAgZGlzYWJsZVBhc3REYXRlU2VsZWN0aW9uPXt0aGlzLnByb3BzLmRpc2FibGVQYXN0RGF0ZVNlbGVjdGlvbn1cbiAgICAgICAgLz4gOlxuICAgICAgICA8ZGl2IC8+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBpZCA9IHRoaXMucHJvcHMuaWQgfHwgdGhpcy5zdGF0ZS5pZDtcbiAgICBjb25zdCB7XG4gICAgICB0b3RhbENvbHMsIGNvbHMsIGxhYmVsLCByZXF1aXJlZCwgZXJyb3IsXG4gICAgICBkZWZhdWx0VmFsdWUsIHZhbHVlLCBkYXRlRm9ybWF0LCB0b29sdGlwLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZGF0ZVZhbHVlID1cbiAgICAgIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6XG4gICAgICB0eXBlb2YgdGhpcy5zdGF0ZS52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB0aGlzLnN0YXRlLnZhbHVlIDpcbiAgICAgIGRlZmF1bHRWYWx1ZTtcbiAgICBjb25zdCBtdmFsdWUgPSBtb21lbnQoZGF0ZVZhbHVlLCAnWVlZWS1NTS1ERCcpO1xuICAgIGNvbnN0IGlucHV0VmFsdWUgPVxuICAgICAgdHlwZW9mIHRoaXMuc3RhdGUuaW5wdXRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB0aGlzLnN0YXRlLmlucHV0VmFsdWUgOlxuICAgICAgdHlwZW9mIGRhdGVWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAobXZhbHVlLmlzVmFsaWQoKSA/IG12YWx1ZS5mb3JtYXQoZGF0ZUZvcm1hdCkgOiBkYXRlVmFsdWUpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5yZW5kZXJEcm9wZG93bihkYXRlVmFsdWUpO1xuICAgIGNvbnN0IGZvcm1FbGVtUHJvcHMgPSB7IGlkLCB0b3RhbENvbHMsIGNvbHMsIGxhYmVsLCByZXF1aXJlZCwgZXJyb3IsIGRyb3Bkb3duLCB0b29sdGlwIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxGb3JtRWxlbWVudCB7IC4uLmZvcm1FbGVtUHJvcHMgfT5cbiAgICAgICAgeyB0aGlzLnJlbmRlcklucHV0KHsgaWQsIGlucHV0VmFsdWUsIC4uLnByb3BzIH0pIH1cbiAgICAgIDwvRm9ybUVsZW1lbnQ+XG4gICAgKTtcbiAgfVxufVxuXG5EYXRlSW5wdXQucHJvcFR5cGVzID0ge1xuICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBsYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgcmVxdWlyZWQ6IFByb3BUeXBlcy5ib29sLFxuICBlcnJvcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLmJvb2wsXG4gICAgUHJvcFR5cGVzLnN0cmluZyxcbiAgICBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgbWVzc2FnZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB9KSxcbiAgXSksXG4gIHRvdGFsQ29sczogUHJvcFR5cGVzLm51bWJlcixcbiAgY29sczogUHJvcFR5cGVzLm51bWJlcixcbiAgdmFsdWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIG9uS2V5RG93bjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gIGRlZmF1bHRWYWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgZGVmYXVsdE9wZW5lZDogUHJvcFR5cGVzLmJvb2wsXG4gIGRhdGVGb3JtYXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25WYWx1ZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQ29tcGxldGU6IFByb3BUeXBlcy5mdW5jLFxuICBkaXNhYmxlUGFzdERhdGVTZWxlY3Rpb246IFByb3BUeXBlcy5ib29sLFxuICBpbnB1dEZvY3VzZWQ6IFByb3BUeXBlcy5ib29sLFxuICB0b29sdGlwOiBQcm9wVHlwZXMuZWxlbWVudCxcbn07XG5cbkRhdGVJbnB1dC5kZWZhdWx0UHJvcHMgPSB7XG4gIGRhdGVGb3JtYXQ6ICdMJyxcbiAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbn07XG5cbkRhdGVJbnB1dC5pc0Zvcm1FbGVtZW50ID0gdHJ1ZTtcblxuZXhwb3J0IGRlZmF1bHQgb25DbGlja091dHNpZGUoRGF0ZUlucHV0KTtcbiJdfQ==