UNPKG

material-ui-datetime-range-picker

Version:

React Datetime Range Picker Component that Implements Google's Material Design Via Material-UI.

384 lines (331 loc) 38.9 kB
'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 _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _simpleAssign = require('simple-assign'); var _simpleAssign2 = _interopRequireDefault(_simpleAssign); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _events = require('../utils/events'); var _events2 = _interopRequireDefault(_events); var _keycode = require('keycode'); var _keycode2 = _interopRequireDefault(_keycode); var _FocusRipple = require('./FocusRipple'); var _FocusRipple2 = _interopRequireDefault(_FocusRipple); var _TouchRipple = require('./TouchRipple'); var _TouchRipple2 = _interopRequireDefault(_TouchRipple); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } 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) : subClass.__proto__ = superClass; } var styleInjected = false; var listening = false; var tabPressed = false; function injectStyle() { if (!styleInjected) { // Remove inner padding and border in Firefox 4+. var style = document.createElement('style'); style.innerHTML = '\n button::-moz-focus-inner,\n input::-moz-focus-inner {\n border: 0;\n padding: 0;\n }\n '; document.body.appendChild(style); styleInjected = true; } } function listenForTabPresses() { if (!listening) { _events2.default.on(window, 'keydown', function (event) { tabPressed = (0, _keycode2.default)(event) === 'tab'; }); listening = true; } } var EnhancedButton = function (_Component) { _inherits(EnhancedButton, _Component); function EnhancedButton() { var _ref; var _temp, _this, _ret; _classCallCheck(this, EnhancedButton); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = EnhancedButton.__proto__ || Object.getPrototypeOf(EnhancedButton)).call.apply(_ref, [this].concat(args))), _this), _this.state = { isKeyboardFocused: false }, _this.handleKeyDown = function (event) { if (!_this.props.disabled && !_this.props.disableKeyboardFocus) { if ((0, _keycode2.default)(event) === 'enter' && _this.state.isKeyboardFocused) { _this.handleTouchTap(event); } if ((0, _keycode2.default)(event) === 'esc' && _this.state.isKeyboardFocused) { _this.removeKeyboardFocus(event); } } _this.props.onKeyDown(event); }, _this.handleKeyUp = function (event) { if (!_this.props.disabled && !_this.props.disableKeyboardFocus) { if ((0, _keycode2.default)(event) === 'space' && _this.state.isKeyboardFocused) { _this.handleTouchTap(event); } } _this.props.onKeyUp(event); }, _this.handleBlur = function (event) { _this.cancelFocusTimeout(); _this.removeKeyboardFocus(event); _this.props.onBlur(event); }, _this.handleFocus = function (event) { if (event) event.persist(); if (!_this.props.disabled && !_this.props.disableKeyboardFocus) { // setTimeout is needed because the focus event fires first // Wait so that we can capture if this was a keyboard focus // or touch focus _this.focusTimeout = setTimeout(function () { if (tabPressed) { _this.setKeyboardFocus(event); tabPressed = false; } }, 150); _this.props.onFocus(event); } }, _this.handleTouchTap = function (event) { _this.cancelFocusTimeout(); if (!_this.props.disabled) { tabPressed = false; _this.removeKeyboardFocus(event); _this.props.onClick(event); } }, _temp), _possibleConstructorReturn(_this, _ret); } _createClass(EnhancedButton, [{ key: 'componentWillMount', value: function componentWillMount() { var _props = this.props, disabled = _props.disabled, disableKeyboardFocus = _props.disableKeyboardFocus, keyboardFocused = _props.keyboardFocused; if (!disabled && keyboardFocused && !disableKeyboardFocus) { this.setState({ isKeyboardFocused: true }); } } }, { key: 'componentDidMount', value: function componentDidMount() { injectStyle(); listenForTabPresses(); if (this.state.isKeyboardFocused) { this.button.focus(); this.props.onKeyboardFocus(null, true); } } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { if ((nextProps.disabled || nextProps.disableKeyboardFocus) && this.state.isKeyboardFocused) { this.setState({ isKeyboardFocused: false }); if (nextProps.onKeyboardFocus) { nextProps.onKeyboardFocus(null, false); } } } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { if (this.focusTimeout) { clearTimeout(this.focusTimeout); } } }, { key: 'isKeyboardFocused', value: function isKeyboardFocused() { return this.state.isKeyboardFocused; } }, { key: 'removeKeyboardFocus', value: function removeKeyboardFocus(event) { if (this.state.isKeyboardFocused) { this.setState({ isKeyboardFocused: false }); this.props.onKeyboardFocus(event, false); } } }, { key: 'setKeyboardFocus', value: function setKeyboardFocus(event) { if (!this.state.isKeyboardFocused) { this.setState({ isKeyboardFocused: true }); this.props.onKeyboardFocus(event, true); } } }, { key: 'cancelFocusTimeout', value: function cancelFocusTimeout() { if (this.focusTimeout) { clearTimeout(this.focusTimeout); this.focusTimeout = null; } } }, { key: 'createButtonChildren', value: function createButtonChildren() { var _props2 = this.props, centerRipple = _props2.centerRipple, children = _props2.children, disabled = _props2.disabled, disableFocusRipple = _props2.disableFocusRipple, disableKeyboardFocus = _props2.disableKeyboardFocus, disableTouchRipple = _props2.disableTouchRipple, focusRippleColor = _props2.focusRippleColor, focusRippleOpacity = _props2.focusRippleOpacity, touchRippleColor = _props2.touchRippleColor, touchRippleOpacity = _props2.touchRippleOpacity; var isKeyboardFocused = this.state.isKeyboardFocused; // Focus Ripple var focusRipple = isKeyboardFocused && !disabled && !disableFocusRipple && !disableKeyboardFocus ? _react2.default.createElement(_FocusRipple2.default, { color: focusRippleColor, opacity: focusRippleOpacity, show: isKeyboardFocused, style: { overflow: 'hidden' }, key: 'focusRipple' }) : undefined; // Touch Ripple var touchRipple = !disabled && !disableTouchRipple ? _react2.default.createElement( _TouchRipple2.default, { centerRipple: centerRipple, color: touchRippleColor, opacity: touchRippleOpacity, key: 'touchRipple' }, children ) : undefined; return [focusRipple, touchRipple, touchRipple ? undefined : children]; } }, { key: 'render', value: function render() { var _this2 = this; var _props3 = this.props, centerRipple = _props3.centerRipple, children = _props3.children, containerElement = _props3.containerElement, disabled = _props3.disabled, disableFocusRipple = _props3.disableFocusRipple, disableKeyboardFocus = _props3.disableKeyboardFocus, disableTouchRipple = _props3.disableTouchRipple, focusRippleColor = _props3.focusRippleColor, focusRippleOpacity = _props3.focusRippleOpacity, href = _props3.href, keyboardFocused = _props3.keyboardFocused, touchRippleColor = _props3.touchRippleColor, touchRippleOpacity = _props3.touchRippleOpacity, onBlur = _props3.onBlur, onClick = _props3.onClick, onFocus = _props3.onFocus, onKeyUp = _props3.onKeyUp, onKeyDown = _props3.onKeyDown, onKeyboardFocus = _props3.onKeyboardFocus, style = _props3.style, tabIndex = _props3.tabIndex, type = _props3.type, other = _objectWithoutProperties(_props3, ['centerRipple', 'children', 'containerElement', 'disabled', 'disableFocusRipple', 'disableKeyboardFocus', 'disableTouchRipple', 'focusRippleColor', 'focusRippleOpacity', 'href', 'keyboardFocused', 'touchRippleColor', 'touchRippleOpacity', 'onBlur', 'onClick', 'onFocus', 'onKeyUp', 'onKeyDown', 'onKeyboardFocus', 'style', 'tabIndex', 'type']); var _context$muiTheme = this.context.muiTheme, prepareStyles = _context$muiTheme.prepareStyles, enhancedButton = _context$muiTheme.enhancedButton; var mergedStyles = (0, _simpleAssign2.default)({ border: 10, boxSizing: 'border-box', display: 'inline-block', fontFamily: this.context.muiTheme.baseTheme.fontFamily, WebkitTapHighlightColor: enhancedButton.tapHighlightColor, // Remove mobile color flashing (deprecated) cursor: disabled ? 'default' : 'pointer', textDecoration: 'none', margin: 0, padding: 0, outline: 'none', fontSize: 'inherit', fontWeight: 'inherit', position: 'relative', // This is needed so that ripples do not bleed past border radius. verticalAlign: href ? 'middle' : null }, style); // Passing both background:none & backgroundColor can break due to object iteration order if (!mergedStyles.backgroundColor && !mergedStyles.background) { mergedStyles.background = 'none'; } if (disabled && href) { return _react2.default.createElement( 'span', _extends({}, other, { style: mergedStyles }), children ); } var buttonProps = _extends({}, other, { style: prepareStyles(mergedStyles), ref: function ref(node) { return _this2.button = node; }, disabled: disabled, onBlur: this.handleBlur, onFocus: this.handleFocus, onKeyUp: this.handleKeyUp, onKeyDown: this.handleKeyDown, onClick: this.handleTouchTap, tabIndex: disabled || disableKeyboardFocus ? -1 : tabIndex }); if (href) buttonProps.href = href; var buttonChildren = this.createButtonChildren(); if (_react2.default.isValidElement(containerElement)) { return _react2.default.cloneElement(containerElement, buttonProps, buttonChildren); } if (!href && containerElement === 'button') { buttonProps.type = type; } return _react2.default.createElement(href ? 'a' : containerElement, buttonProps, buttonChildren); } }]); return EnhancedButton; }(_react.Component); EnhancedButton.propTypes = { centerRipple: _propTypes2.default.bool, children: _propTypes2.default.node, containerElement: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.element]), disableFocusRipple: _propTypes2.default.bool, disableKeyboardFocus: _propTypes2.default.bool, disableTouchRipple: _propTypes2.default.bool, disabled: _propTypes2.default.bool, focusRippleColor: _propTypes2.default.string, focusRippleOpacity: _propTypes2.default.number, href: _propTypes2.default.string, keyboardFocused: _propTypes2.default.bool, onBlur: _propTypes2.default.func, onClick: _propTypes2.default.func, onFocus: _propTypes2.default.func, onKeyDown: _propTypes2.default.func, onKeyUp: _propTypes2.default.func, onKeyboardFocus: _propTypes2.default.func, style: _propTypes2.default.object, tabIndex: _propTypes2.default.number, touchRippleColor: _propTypes2.default.string, touchRippleOpacity: _propTypes2.default.number, type: _propTypes2.default.string }; EnhancedButton.defaultProps = { containerElement: 'button', onBlur: function onBlur() {}, onClick: function onClick() {}, onFocus: function onFocus() {}, onKeyDown: function onKeyDown() {}, onKeyUp: function onKeyUp() {}, onKeyboardFocus: function onKeyboardFocus() {}, tabIndex: 0, type: 'button' }; EnhancedButton.contextTypes = { muiTheme: _propTypes2.default.object.isRequired }; exports.default = EnhancedButton; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlcm5hbC9FbmhhbmNlZEJ1dHRvbi5qcyJdLCJuYW1lcyI6WyJzdHlsZUluamVjdGVkIiwibGlzdGVuaW5nIiwidGFiUHJlc3NlZCIsImluamVjdFN0eWxlIiwic3R5bGUiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lckhUTUwiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJsaXN0ZW5Gb3JUYWJQcmVzc2VzIiwiRXZlbnRzIiwib24iLCJ3aW5kb3ciLCJldmVudCIsIkVuaGFuY2VkQnV0dG9uIiwic3RhdGUiLCJpc0tleWJvYXJkRm9jdXNlZCIsImhhbmRsZUtleURvd24iLCJwcm9wcyIsImRpc2FibGVkIiwiZGlzYWJsZUtleWJvYXJkRm9jdXMiLCJoYW5kbGVUb3VjaFRhcCIsInJlbW92ZUtleWJvYXJkRm9jdXMiLCJvbktleURvd24iLCJoYW5kbGVLZXlVcCIsIm9uS2V5VXAiLCJoYW5kbGVCbHVyIiwiY2FuY2VsRm9jdXNUaW1lb3V0Iiwib25CbHVyIiwiaGFuZGxlRm9jdXMiLCJwZXJzaXN0IiwiZm9jdXNUaW1lb3V0Iiwic2V0VGltZW91dCIsInNldEtleWJvYXJkRm9jdXMiLCJvbkZvY3VzIiwib25DbGljayIsImtleWJvYXJkRm9jdXNlZCIsInNldFN0YXRlIiwiYnV0dG9uIiwiZm9jdXMiLCJvbktleWJvYXJkRm9jdXMiLCJuZXh0UHJvcHMiLCJjbGVhclRpbWVvdXQiLCJjZW50ZXJSaXBwbGUiLCJjaGlsZHJlbiIsImRpc2FibGVGb2N1c1JpcHBsZSIsImRpc2FibGVUb3VjaFJpcHBsZSIsImZvY3VzUmlwcGxlQ29sb3IiLCJmb2N1c1JpcHBsZU9wYWNpdHkiLCJ0b3VjaFJpcHBsZUNvbG9yIiwidG91Y2hSaXBwbGVPcGFjaXR5IiwiZm9jdXNSaXBwbGUiLCJvdmVyZmxvdyIsInVuZGVmaW5lZCIsInRvdWNoUmlwcGxlIiwiY29udGFpbmVyRWxlbWVudCIsImhyZWYiLCJ0YWJJbmRleCIsInR5cGUiLCJvdGhlciIsImNvbnRleHQiLCJtdWlUaGVtZSIsInByZXBhcmVTdHlsZXMiLCJlbmhhbmNlZEJ1dHRvbiIsIm1lcmdlZFN0eWxlcyIsImJvcmRlciIsImJveFNpemluZyIsImRpc3BsYXkiLCJmb250RmFtaWx5IiwiYmFzZVRoZW1lIiwiV2Via2l0VGFwSGlnaGxpZ2h0Q29sb3IiLCJ0YXBIaWdobGlnaHRDb2xvciIsImN1cnNvciIsInRleHREZWNvcmF0aW9uIiwibWFyZ2luIiwicGFkZGluZyIsIm91dGxpbmUiLCJmb250U2l6ZSIsImZvbnRXZWlnaHQiLCJwb3NpdGlvbiIsInZlcnRpY2FsQWxpZ24iLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kIiwiYnV0dG9uUHJvcHMiLCJyZWYiLCJub2RlIiwiYnV0dG9uQ2hpbGRyZW4iLCJjcmVhdGVCdXR0b25DaGlsZHJlbiIsIlJlYWN0IiwiaXNWYWxpZEVsZW1lbnQiLCJjbG9uZUVsZW1lbnQiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJib29sIiwib25lT2ZUeXBlIiwic3RyaW5nIiwiZWxlbWVudCIsIm51bWJlciIsImZ1bmMiLCJvYmplY3QiLCJkZWZhdWx0UHJvcHMiLCJjb250ZXh0VHlwZXMiLCJpc1JlcXVpcmVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFJQSxnQkFBZ0IsS0FBcEI7QUFDQSxJQUFJQyxZQUFZLEtBQWhCO0FBQ0EsSUFBSUMsYUFBYSxLQUFqQjs7QUFFQSxTQUFTQyxXQUFULEdBQXVCO0FBQ3JCLE1BQUksQ0FBQ0gsYUFBTCxFQUFvQjtBQUNsQjtBQUNBLFFBQU1JLFFBQVFDLFNBQVNDLGFBQVQsQ0FBdUIsT0FBdkIsQ0FBZDtBQUNBRixVQUFNRyxTQUFOOztBQVFBRixhQUFTRyxJQUFULENBQWNDLFdBQWQsQ0FBMEJMLEtBQTFCO0FBQ0FKLG9CQUFnQixJQUFoQjtBQUNEO0FB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QVdzRSxvQkFBVU0sSUFsQko7QUFtQmpCMUUsV0FBU29FLG9CQUFVTSxJQW5CRjtBQW9CakIzRCxtQkFBaUJxRCxvQkFBVU0sSUFwQlY7QUFxQmpCaEcsU0FBTzBGLG9CQUFVTyxNQXJCQTtBQXNCakIzQyxZQUFVb0Msb0JBQVVLLE1BdEJIO0FBdUJqQmpELG9CQUFrQjRDLG9CQUFVRyxNQXZCWDtBQXdCakI5QyxzQkFBb0IyQyxvQkFBVUssTUF4QmI7QUF5QmpCeEMsUUFBTW1DLG9CQUFVRztBQXpCQyxDO0FBRGZsRixjLENBNkJHdUYsWSxHQUFlO0FBQ3BCOUMsb0JBQWtCLFFBREU7QUFFcEIzQixVQUFRLGtCQUFNLENBQUUsQ0FGSTtBQUdwQk8sV0FBUyxtQkFBTSxDQUFFLENBSEc7QUFJcEJELFdBQVMsbUJBQU0sQ0FBRSxDQUpHO0FBS3BCWCxhQUFXLHFCQUFNLENBQUUsQ0FMQztBQU1wQkUsV0FBUyxtQkFBTSxDQUFFLENBTkc7QUFPcEJlLG1CQUFpQiwyQkFBTSxDQUFFLENBUEw7QUFRcEJpQixZQUFVLENBUlU7QUFTcEJDLFFBQU07QUFUYyxDO0FBN0JsQjVDLGMsQ0F5Q0d3RixZLEdBQWU7QUFDcEJ6QyxZQUFVZ0Msb0JBQVVPLE1BQVYsQ0FBaUJHO0FBRFAsQztrQkFvUVR6RixjIiwiZmlsZSI6IkVuaGFuY2VkQnV0dG9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEV2ZW50cyBmcm9tICcuLi91dGlscy9ldmVudHMnO1xuaW1wb3J0IGtleWNvZGUgZnJvbSAna2V5Y29kZSc7XG5pbXBvcnQgRm9jdXNSaXBwbGUgZnJvbSAnLi9Gb2N1c1JpcHBsZSc7XG5pbXBvcnQgVG91Y2hSaXBwbGUgZnJvbSAnLi9Ub3VjaFJpcHBsZSc7XG5cbmxldCBzdHlsZUluamVjdGVkID0gZmFsc2U7XG5sZXQgbGlzdGVuaW5nID0gZmFsc2U7XG5sZXQgdGFiUHJlc3NlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpbmplY3RTdHlsZSgpIHtcbiAgaWYgKCFzdHlsZUluamVjdGVkKSB7XG4gICAgLy8gUmVtb3ZlIGlubmVyIHBhZGRpbmcgYW5kIGJvcmRlciBpbiBGaXJlZm94IDQrLlxuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS5pbm5lckhUTUwgPSBgXG4gICAgICBidXR0b246Oi1tb3otZm9jdXMtaW5uZXIsXG4gICAgICBpbnB1dDo6LW1vei1mb2N1cy1pbm5lciB7XG4gICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgc3R5bGVJbmplY3RlZCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdGVuRm9yVGFiUHJlc3NlcygpIHtcbiAgaWYgKCFsaXN0ZW5pbmcpIHtcbiAgICBFdmVudHMub24od2luZG93LCAna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgdGFiUHJlc3NlZCA9IGtleWNvZGUoZXZlbnQpID09PSAndGFiJztcbiAgICB9KTtcbiAgICBsaXN0ZW5pbmcgPSB0cnVlO1xuICB9XG59XG5cbmNsYXNzIEVuaGFuY2VkQnV0dG9uIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBjZW50ZXJSaXBwbGU6IFByb3BUeXBlcy5ib29sLFxuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgICBjb250YWluZXJFbGVtZW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICBdKSxcbiAgICBkaXNhYmxlRm9jdXNSaXBwbGU6IFByb3BUeXBlcy5ib29sLFxuICAgIGRpc2FibGVLZXlib2FyZEZvY3VzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBkaXNhYmxlVG91Y2hSaXBwbGU6IFByb3BUeXBlcy5ib29sLFxuICAgIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBmb2N1c1JpcHBsZUNvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGZvY3VzUmlwcGxlT3BhY2l0eTogUHJvcFR5cGVzLm51bWJlcixcbiAgICBocmVmOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGtleWJvYXJkRm9jdXNlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvbktleURvd246IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uS2V5VXA6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uS2V5Ym9hcmRGb2N1czogUHJvcFR5cGVzLmZ1bmMsXG4gICAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgdGFiSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgdG91Y2hSaXBwbGVDb2xvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0b3VjaFJpcHBsZU9wYWNpdHk6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgfTtcblxuICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIGNvbnRhaW5lckVsZW1lbnQ6ICdidXR0b24nLFxuICAgIG9uQmx1cjogKCkgPT4ge30sXG4gICAgb25DbGljazogKCkgPT4ge30sXG4gICAgb25Gb2N1czogKCkgPT4ge30sXG4gICAgb25LZXlEb3duOiAoKSA9PiB7fSxcbiAgICBvbktleVVwOiAoKSA9PiB7fSxcbiAgICBvbktleWJvYXJkRm9jdXM6ICgpID0+IHt9LFxuICAgIHRhYkluZGV4OiAwLFxuICAgIHR5cGU6ICdidXR0b24nLFxuICB9O1xuXG4gIHN0YXRpYyBjb250ZXh0VHlwZXMgPSB7XG4gICAgbXVpVGhlbWU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgfTtcblxuICBzdGF0ZSA9IHtcbiAgICBpc0tleWJvYXJkRm9jdXNlZDogZmFsc2UsXG4gIH07XG5cbiAgY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgIGNvbnN0IHtkaXNhYmxlZCwgZGlzYWJsZUtleWJvYXJkRm9jdXMsIGtleWJvYXJkRm9jdXNlZH0gPSB0aGlzLnByb3BzO1xuICAgIGlmICghZGlzYWJsZWQgJiYga2V5Ym9hcmRGb2N1c2VkICYmICFkaXNhYmxlS2V5Ym9hcmRGb2N1cykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNLZXlib2FyZEZvY3VzZWQ6IHRydWV9KTtcbiAgICB9XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBpbmplY3RTdHlsZSgpO1xuICAgIGxpc3RlbkZvclRhYlByZXNzZXMoKTtcbiAgICBpZiAodGhpcy5zdGF0ZS5pc0tleWJvYXJkRm9jdXNlZCkge1xuICAgICAgdGhpcy5idXR0b24uZm9jdXMoKTtcbiAgICAgIHRoaXMucHJvcHMub25LZXlib2FyZEZvY3VzKG51bGwsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgaWYgKChuZXh0UHJvcHMuZGlzYWJsZWQgfHwgbmV4dFByb3BzLmRpc2FibGVLZXlib2FyZEZvY3VzKSAmJlxuICAgICAgdGhpcy5zdGF0ZS5pc0tleWJvYXJkRm9jdXNlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNLZXlib2FyZEZvY3VzZWQ6IGZhbHNlfSk7XG4gICAgICBpZiAobmV4dFByb3BzLm9uS2V5Ym9hcmRGb2N1cykge1xuICAgICAgICBuZXh0UHJvcHMub25LZXlib2FyZEZvY3VzKG51bGwsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBpZiAodGhpcy5mb2N1c1RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZvY3VzVGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgaXNLZXlib2FyZEZvY3VzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuaXNLZXlib2FyZEZvY3VzZWQ7XG4gIH1cblxuICByZW1vdmVLZXlib2FyZEZvY3VzKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNLZXlib2FyZEZvY3VzZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2lzS2V5Ym9hcmRGb2N1c2VkOiBmYWxzZX0pO1xuICAgICAgdGhpcy5wcm9wcy5vbktleWJvYXJkRm9jdXMoZXZlbnQsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBzZXRLZXlib2FyZEZvY3VzKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmlzS2V5Ym9hcmRGb2N1c2VkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtpc0tleWJvYXJkRm9jdXNlZDogdHJ1ZX0pO1xuICAgICAgdGhpcy5wcm9wcy5vbktleWJvYXJkRm9jdXMoZXZlbnQsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGNhbmNlbEZvY3VzVGltZW91dCgpIHtcbiAgICBpZiAodGhpcy5mb2N1c1RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZvY3VzVGltZW91dCk7XG4gICAgICB0aGlzLmZvY3VzVGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlQnV0dG9uQ2hpbGRyZW4oKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2VudGVyUmlwcGxlLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGRpc2FibGVGb2N1c1JpcHBsZSxcbiAgICAgIGRpc2FibGVLZXlib2FyZEZvY3VzLFxuICAgICAgZGlzYWJsZVRvdWNoUmlwcGxlLFxuICAgICAgZm9jdXNSaXBwbGVDb2xvcixcbiAgICAgIGZvY3VzUmlwcGxlT3BhY2l0eSxcbiAgICAgIHRvdWNoUmlwcGxlQ29sb3IsXG4gICAgICB0b3VjaFJpcHBsZU9wYWNpdHksXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge2lzS2V5Ym9hcmRGb2N1c2VkfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAvLyBGb2N1cyBSaXBwbGVcbiAgICBjb25zdCBmb2N1c1JpcHBsZSA9IGlzS2V5Ym9hcmRGb2N1c2VkICYmICFkaXNhYmxlZCAmJiAhZGlzYWJsZUZvY3VzUmlwcGxlICYmICFkaXNhYmxlS2V5Ym9hcmRGb2N1cyA/IChcbiAgICAgIDxGb2N1c1JpcHBsZVxuICAgICAgICBjb2xvcj17Zm9jdXNSaXBwbGVDb2xvcn1cbiAgICAgICAgb3BhY2l0eT17Zm9jdXNSaXBwbGVPcGFjaXR5fVxuICAgICAgICBzaG93PXtpc0tleWJvYXJkRm9jdXNlZH1cbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgIH19XG4gICAgICAgIGtleT1cImZvY3VzUmlwcGxlXCJcbiAgICAgIC8+XG4gICAgKSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIFRvdWNoIFJpcHBsZVxuICAgIGNvbnN0IHRvdWNoUmlwcGxlID0gIWRpc2FibGVkICYmICFkaXNhYmxlVG91Y2hSaXBwbGUgPyAoXG4gICAgICA8VG91Y2hSaXBwbGVcbiAgICAgICAgY2VudGVyUmlwcGxlPXtjZW50ZXJSaXBwbGV9XG4gICAgICAgIGNvbG9yPXt0b3VjaFJpcHBsZUNvbG9yfVxuICAgICAgICBvcGFjaXR5PXt0b3VjaFJpcHBsZU9wYWNpdHl9XG4gICAgICAgIGtleT1cInRvdWNoUmlwcGxlXCJcbiAgICAgID5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9Ub3VjaFJpcHBsZT5cbiAgICApIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIGZvY3VzUmlwcGxlLFxuICAgICAgdG91Y2hSaXBwbGUsXG4gICAgICB0b3VjaFJpcHBsZSA/IHVuZGVmaW5lZCA6IGNoaWxkcmVuLFxuICAgIF07XG4gIH1cblxuICBoYW5kbGVLZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKCF0aGlzLnByb3BzLmRpc2FibGVkICYmICF0aGlzLnByb3BzLmRpc2FibGVLZXlib2FyZEZvY3VzKSB7XG4gICAgICBpZiAoa2V5Y29kZShldmVudCkgPT09ICdlbnRlcicgJiYgdGhpcy5zdGF0ZS5pc0tleWJvYXJkRm9jdXNlZCkge1xuICAgICAgICB0aGlzLmhhbmRsZVRvdWNoVGFwKGV2ZW50KTtcbiAgICAgIH1cbiAgICAgIGlmIChrZXljb2RlKGV2ZW50KSA9PT0gJ2VzYycgJiYgdGhpcy5zdGF0ZS5pc0tleWJvYXJkRm9jdXNlZCkge1xuICAgICAgICB0aGlzLnJlbW92ZUtleWJvYXJkRm9jdXMoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnByb3BzLm9uS2V5RG93bihldmVudCk7XG4gIH07XG5cbiAgaGFuZGxlS2V5VXAgPSAoZXZlbnQpID0+IHtcbiAgICBpZiAoIXRoaXMucHJvcHMuZGlzYWJsZWQgJiYgIXRoaXMucHJvcHMuZGlzYWJsZUtleWJvYXJkRm9jdXMpIHtcbiAgICAgIGlmIChrZXljb2RlKGV2ZW50KSA9PT0gJ3NwYWNlJyAmJiB0aGlzLnN0YXRlLmlzS2V5Ym9hcmRGb2N1c2VkKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlVG91Y2hUYXAoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnByb3BzLm9uS2V5VXAoZXZlbnQpO1xuICB9O1xuXG4gIGhhbmRsZUJsdXIgPSAoZXZlbnQpID0+IHtcbiAgICB0aGlzLmNhbmNlbEZvY3VzVGltZW91dCgpO1xuICAgIHRoaXMucmVtb3ZlS2V5Ym9hcmRGb2N1cyhldmVudCk7XG4gICAgdGhpcy5wcm9wcy5vbkJsdXIoZXZlbnQpO1xuICB9O1xuXG4gIGhhbmRsZUZvY3VzID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50KSBldmVudC5wZXJzaXN0KCk7XG4gICAgaWYgKCF0aGlzLnByb3BzLmRpc2FibGVkICYmICF0aGlzLnByb3BzLmRpc2FibGVLZXlib2FyZEZvY3VzKSB7XG4gICAgICAvLyBzZXRUaW1lb3V0IGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBmb2N1cyBldmVudCBmaXJlcyBmaXJzdFxuICAgICAgLy8gV2FpdCBzbyB0aGF0IHdlIGNhbiBjYXB0dXJlIGlmIHRoaXMgd2FzIGEga2V5Ym9hcmQgZm9jdXNcbiAgICAgIC8vIG9yIHRvdWNoIGZvY3VzXG4gICAgICB0aGlzLmZvY3VzVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGFiUHJlc3NlZCkge1xuICAgICAgICAgIHRoaXMuc2V0S2V5Ym9hcmRGb2N1cyhldmVudCk7XG4gICAgICAgICAgdGFiUHJlc3NlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LCAxNTApO1xuXG4gICAgICB0aGlzLnByb3BzLm9uRm9jdXMoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICBoYW5kbGVUb3VjaFRhcCA9IChldmVudCkgPT4ge1xuICAgIHRoaXMuY2FuY2VsRm9jdXNUaW1lb3V0KCk7XG4gICAgaWYgKCF0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICB0YWJQcmVzc2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnJlbW92ZUtleWJvYXJkRm9jdXMoZXZlbnQpO1xuICAgICAgdGhpcy5wcm9wcy5vbkNsaWNrKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNlbnRlclJpcHBsZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgY2hpbGRyZW4sXG4gICAgICBjb250YWluZXJFbGVtZW50LFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlRm9jdXNSaXBwbGUsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIGRpc2FibGVLZXlib2FyZEZvY3VzLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBkaXNhYmxlVG91Y2hSaXBwbGUsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIGZvY3VzUmlwcGxlQ29sb3IsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIGZvY3VzUmlwcGxlT3BhY2l0eSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgaHJlZixcbiAgICAgIGtleWJvYXJkRm9jdXNlZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgdG91Y2hSaXBwbGVDb2xvciwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgdG91Y2hSaXBwbGVPcGFjaXR5LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBvbkJsdXIsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIG9uQ2xpY2ssIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIG9uRm9jdXMsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIG9uS2V5VXAsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIG9uS2V5RG93biwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgb25LZXlib2FyZEZvY3VzLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBzdHlsZSxcbiAgICAgIHRhYkluZGV4LFxuICAgICAgdHlwZSxcbiAgICAgIC4uLm90aGVyXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCB7XG4gICAgICBwcmVwYXJlU3R5bGVzLFxuICAgICAgZW5oYW5jZWRCdXR0b24sXG4gICAgfSA9IHRoaXMuY29udGV4dC5tdWlUaGVtZTtcblxuICAgIGNvbnN0IG1lcmdlZFN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgYm9yZGVyOiAxMCxcbiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICBmb250RmFtaWx5OiB0aGlzLmNvbnRleHQubXVpVGhlbWUuYmFzZVRoZW1lLmZvbnRGYW1pbHksXG4gICAgICBXZWJraXRUYXBIaWdobGlnaHRDb2xvcjogZW5oYW5jZWRCdXR0b24udGFwSGlnaGxpZ2h0Q29sb3IsIC8vIFJlbW92ZSBtb2JpbGUgY29sb3IgZmxhc2hpbmcgKGRlcHJlY2F0ZWQpXG4gICAgICBjdXJzb3I6IGRpc2FibGVkID8gJ2RlZmF1bHQnIDogJ3BvaW50ZXInLFxuICAgICAgdGV4dERlY29yYXRpb246ICdub25lJyxcbiAgICAgIG1hcmdpbjogMCxcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgICBmb250U2l6ZTogJ2luaGVyaXQnLFxuICAgICAgZm9udFdlaWdodDogJ2luaGVyaXQnLFxuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsIC8vIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgcmlwcGxlcyBkbyBub3QgYmxlZWQgcGFzdCBib3JkZXIgcmFkaXVzLlxuICAgICAgdmVydGljYWxBbGlnbjogaHJlZiA/ICdtaWRkbGUnIDogbnVsbCxcbiAgICB9LCBzdHlsZSk7XG5cblxuICAgIC8vIFBhc3NpbmcgYm90aCBiYWNrZ3JvdW5kOm5vbmUgJiBiYWNrZ3JvdW5kQ29sb3IgY2FuIGJyZWFrIGR1ZSB0byBvYmplY3QgaXRlcmF0aW9uIG9yZGVyXG4gICAgaWYgKCFtZXJnZWRTdHlsZXMuYmFja2dyb3VuZENvbG9yICYmICFtZXJnZWRTdHlsZXMuYmFja2dyb3VuZCkge1xuICAgICAgbWVyZ2VkU3R5bGVzLmJhY2tncm91bmQgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkICYmIGhyZWYpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgey4uLm90aGVyfVxuICAgICAgICAgIHN0eWxlPXttZXJnZWRTdHlsZXN9XG4gICAgICAgID5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYnV0dG9uUHJvcHMgPSB7XG4gICAgICAuLi5vdGhlcixcbiAgICAgIHN0eWxlOiBwcmVwYXJlU3R5bGVzKG1lcmdlZFN0eWxlcyksXG4gICAgICByZWY6IChub2RlKSA9PiB0aGlzLmJ1dHRvbiA9IG5vZGUsXG4gICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICBvbkJsdXI6IHRoaXMuaGFuZGxlQmx1cixcbiAgICAgIG9uRm9jdXM6IHRoaXMuaGFuZGxlRm9jdXMsXG4gICAgICBvbktleVVwOiB0aGlzLmhhbmRsZUtleVVwLFxuICAgICAgb25LZXlEb3duOiB0aGlzLmhhbmRsZUtleURvd24sXG4gICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZVRvdWNoVGFwLFxuICAgICAgdGFiSW5kZXg6IGRpc2FibGVkIHx8IGRpc2FibGVLZXlib2FyZEZvY3VzID8gLTEgOiB0YWJJbmRleCxcbiAgICB9O1xuXG4gICAgaWYgKGhyZWYpIGJ1dHRvblByb3BzLmhyZWYgPSBocmVmO1xuXG4gICAgY29uc3QgYnV0dG9uQ2hpbGRyZW4gPSB0aGlzLmNyZWF0ZUJ1dHRvbkNoaWxkcmVuKCk7XG5cbiAgICBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQoY29udGFpbmVyRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY29udGFpbmVyRWxlbWVudCwgYnV0dG9uUHJvcHMsIGJ1dHRvbkNoaWxkcmVuKTtcbiAgICB9XG5cbiAgICBpZiAoIWhyZWYgJiYgY29udGFpbmVyRWxlbWVudCA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGJ1dHRvblByb3BzLnR5cGUgPSB0eXBlO1xuICAgIH1cblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGhyZWYgPyAnYScgOiBjb250YWluZXJFbGVtZW50LCBidXR0b25Qcm9wcywgYnV0dG9uQ2hpbGRyZW4pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVuaGFuY2VkQnV0dG9uO1xuIl19