UNPKG

react-lightning-design-components

Version:

Salesforce Lightning Design System components built with React 16

408 lines (365 loc) 37 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); 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 _Button = require('./Button'); var _Button2 = _interopRequireDefault(_Button); var _Picklist = require('./Picklist'); var _Picklist2 = _interopRequireDefault(_Picklist); var _reactOnclickoutside = require('react-onclickoutside'); var _reactOnclickoutside2 = _interopRequireDefault(_reactOnclickoutside); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function createCalendarObject(date) { var d = (0, _moment2.default)(date, 'YYYY-MM-DD'); if (!d.isValid()) { d = (0, _moment2.default)(); } var year = d.year(); var month = d.month(); var first = (0, _moment2.default)(d).startOf('month').startOf('week'); var last = (0, _moment2.default)(d).endOf('month').endOf('week'); var weeks = []; var days = []; for (var dd = first; dd.isBefore(last); dd = dd.add(1, 'd')) { days.push({ year: dd.year(), month: dd.month(), date: dd.date(), value: dd.format('YYYY-MM-DD') }); if (days.length === 7) { weeks.push(days); days = []; } } return { year: year, month: month, weeks: weeks }; } function cancelEvent(e) { e.preventDefault(); e.stopPropagation(); } var Datepicker = function (_Component) { (0, _inherits3.default)(Datepicker, _Component); function Datepicker(props) { (0, _classCallCheck3.default)(this, Datepicker); var _this = (0, _possibleConstructorReturn3.default)(this, (Datepicker.__proto__ || (0, _getPrototypeOf2.default)(Datepicker)).call(this, props)); _this.handleClickOutside = _this.handleClickOutside.bind(_this); var targetDate = _this.props.selectedDate || (0, _moment2.default)().format('YYYY-MM-DD'); _this.state = { targetDate: targetDate }; _this.monthRef = _this.monthRef.bind(_this); _this.datepickerRef = _this.datepickerRef.bind(_this); return _this; } (0, _createClass3.default)(Datepicker, [{ key: 'componentDidMount', value: function componentDidMount() { if (this.props.autoFocus) { var targetDate = this.props.selectedDate || (0, _moment2.default)().format('YYYY-MM-DD'); this.focusDate(targetDate); } } }, { key: 'componentDidUpdate', value: function componentDidUpdate() { if (this.state.focusDate && (this.state.targetDate || this.props.selectedDate)) { this.focusDate(this.state.targetDate || this.props.selectedDate); /* eslint-disable react/no-did-update-set-state */ this.setState({ focusDate: false }); } } }, { key: 'onDateKeyDown', value: function onDateKeyDown(date, e) { var targetDate = this.state.targetDate || this.props.selectedDate; if (e.keyCode === 13 || e.keyCode === 32) { // return / space this.onDateClick(date); e.preventDefault(); e.stopPropagation(); } else if (e.keyCode >= 37 && e.keyCode <= 40) { // cursor key if (e.keyCode === 37) { targetDate = (0, _moment2.default)(targetDate).add(-1, e.shiftKey ? 'months' : 'days'); } else if (e.keyCode === 39) { // right arrow key targetDate = (0, _moment2.default)(targetDate).add(1, e.shiftKey ? 'months' : 'days'); } else if (e.keyCode === 38) { // up arrow key targetDate = (0, _moment2.default)(targetDate).add(-1, e.shiftKey ? 'years' : 'weeks'); } else if (e.keyCode === 40) { // down arrow key targetDate = (0, _moment2.default)(targetDate).add(1, e.shiftKey ? 'years' : 'weeks'); } targetDate = targetDate.format('YYYY-MM-DD'); this.setState({ targetDate: targetDate, focusDate: true }); e.preventDefault(); e.stopPropagation(); } } }, { key: 'onDateClick', value: function onDateClick(date) { if (this.props.onSelect) { this.props.onSelect(date); } } }, { key: 'onDateFocus', value: function onDateFocus(date) { if (this.state.targetDate !== date) { this.setState({ targetDate: date }); } } }, { key: 'onYearChange', value: function onYearChange(item) { var targetDate = this.state.targetDate || this.props.selectedDate; targetDate = (0, _moment2.default)(targetDate).year(item.value).format('YYYY-MM-DD'); this.setState({ targetDate: targetDate }); } }, { key: 'onMonthChange', value: function onMonthChange(month) { var targetDate = this.state.targetDate || this.props.selectedDate; targetDate = (0, _moment2.default)(targetDate).add(month, 'months').format('YYYY-MM-DD'); this.setState({ targetDate: targetDate }); } }, { key: 'onKeyDown', value: function onKeyDown(e) { if (e.keyCode === 27) { // ESC if (this.props.onClose) { this.props.onClose(); } } } // provided by 'react-onclickoutside' }, { key: 'handleClickOutside', value: function handleClickOutside(e) { if (this.props.onBlur) { this.props.onBlur(e); } } }, { key: 'focusDate', value: function focusDate(date) { var el = _reactDom2.default.findDOMNode(this.month); var dateEl = el.querySelector('.slds-day[data-date-value="' + date + '"]'); if (dateEl) { dateEl.focus(); } } }, { key: 'monthRef', value: function monthRef(ref) { this.month = ref; } }, { key: 'datepickerRef', value: function datepickerRef(ref) { this.datepicker = ref; } }, { key: 'renderFilter', value: function renderFilter(cal) { /* eslint-disable max-len */ var startYear = this.props.userCurrentYear ? (0, _moment2.default)().year() : cal.year; var minYear = startYear - this.props.backRange; return _react2.default.createElement( 'div', { className: 'slds-datepicker__filter slds-grid' }, _react2.default.createElement( 'div', { className: 'slds-datepicker__filter--month slds-grid slds-grid--align-spread slds-size--2-of-3' }, _react2.default.createElement( 'div', { className: 'slds-align-middle' }, _react2.default.createElement(_Button2.default, { className: 'slds-align-middle', type: 'icon-container', icon: 'left', size: 'small', alt: 'Previous Month', onClick: this.onMonthChange.bind(this, -1) }) ), _react2.default.createElement( 'h2', { className: 'slds-align-middle' }, _moment2.default.monthsShort()[cal.month] ), _react2.default.createElement( 'div', { className: 'slds-align-middle' }, _react2.default.createElement(_Button2.default, { className: 'slds-align-middle', type: 'icon-container', icon: 'right', size: 'small', alt: 'Next Month', onClick: this.onMonthChange.bind(this, 1) }) ) ), _react2.default.createElement( 'div', { className: 'slds-size--1-of-3' }, _react2.default.createElement( _Picklist2.default, { className: 'slds-picklist--fluid slds-shrink-none', value: cal.year, maxHeight: this.props.pickListHeight, onSelect: this.onYearChange.bind(this) }, new Array(this.props.backRange + this.props.futureRange).join('_').split('_').map(function (a, i) { var year = minYear + i; return _react2.default.createElement(_Picklist.PicklistItem, { key: year, label: year, value: year }); }) ) ) ); } }, { key: 'renderMonth', value: function renderMonth(cal, selectedDate, today) { var _this2 = this; return _react2.default.createElement( 'table', { className: 'datepicker__month', role: 'grid', 'aria-labelledby': 'month', ref: this.monthRef }, _react2.default.createElement( 'thead', null, _react2.default.createElement( 'tr', null, _moment2.default.weekdaysMin(true).map(function (wd, i) { return _react2.default.createElement( 'th', { key: i }, _react2.default.createElement( 'abbr', { title: _moment2.default.weekdays(true, i) }, wd ) ); }) ) ), _react2.default.createElement( 'tbody', null, cal.weeks.map(function (days, i) { return _react2.default.createElement( 'tr', { key: i }, days.map(_this2.renderDate.bind(_this2, cal, selectedDate, today)) ); }) ) ); } }, { key: 'renderDate', value: function renderDate(cal, selectedDate, today, d, i) { var enabled = d.year === cal.year && d.month === cal.month; if (this.props.disablePastDateSelection) enabled = d.value >= today; var selected = d.value === selectedDate; var isToday = d.value === today; var dateClassName = (0, _classnames2.default)({ 'slds-disabled-text': !enabled, 'slds-is-selected': selected, 'slds-is-today': isToday }); return _react2.default.createElement( 'td', { className: dateClassName, key: i, headers: _moment2.default.weekdays(i), role: 'gridcell', 'aria-disabled': !enabled, 'aria-selected': selected }, _react2.default.createElement( 'span', { className: 'slds-day', tabIndex: enabled ? 0 : -1, onClick: enabled ? this.onDateClick.bind(this, d.value) : null, onKeyDown: enabled ? this.onDateKeyDown.bind(this, d.value) : null, onFocus: enabled ? this.onDateFocus.bind(this, d.value) : cancelEvent, 'data-date-value': d.value }, d.date ) ); } }, { key: 'render', value: function render() { var _props = this.props, className = _props.className, selectedDate = _props.selectedDate; var today = (0, _moment2.default)().format('YYYY-MM-DD'); var targetDate = this.state.targetDate || selectedDate; var cal = createCalendarObject(targetDate); var datepickerClassNames = (0, _classnames2.default)('slds-datepicker', className); return _react2.default.createElement( 'div', { className: datepickerClassNames, ref: this.datepickerRef, 'aria-hidden': false, onKeyDown: this.onKeyDown.bind(this) }, this.renderFilter(cal), this.renderMonth(cal, selectedDate, today) ); } }]); return Datepicker; }(_react.Component); Datepicker.defaultProps = { backRange: 100, futureRange: 30, userCurrentYear: true, pickListHeight: 5 }; Datepicker.propTypes = { className: _propTypes2.default.string, selectedDate: _propTypes2.default.string, autoFocus: _propTypes2.default.bool, onSelect: _propTypes2.default.func, onBlur: _propTypes2.default.func, onClose: _propTypes2.default.func, disablePastDateSelection: _propTypes2.default.bool, userCurrentYear: _propTypes2.default.bool, backRange: _propTypes2.default.number, futureRange: _propTypes2.default.number, pickListHeight: _propTypes2.default.oneOf([5, 7, 10]) }; exports.default = (0, _reactOnclickoutside2.default)(Datepicker); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL0RhdGVwaWNrZXIuanMiXSwibmFtZXMiOlsiY3JlYXRlQ2FsZW5kYXJPYmplY3QiLCJkYXRlIiwiZCIsImlzVmFsaWQiLCJ5ZWFyIiwibW9udGgiLCJmaXJzdCIsInN0YXJ0T2YiLCJsYXN0IiwiZW5kT2YiLCJ3ZWVrcyIsImRheXMiLCJkZCIsImlzQmVmb3JlIiwiYWRkIiwicHVzaCIsInZhbHVlIiwiZm9ybWF0IiwibGVuZ3RoIiwiY2FuY2VsRXZlbnQiLCJlIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJEYXRlcGlja2VyIiwicHJvcHMiLCJoYW5kbGVDbGlja091dHNpZGUiLCJiaW5kIiwidGFyZ2V0RGF0ZSIsInNlbGVjdGVkRGF0ZSIsInN0YXRlIiwibW9udGhSZWYiLCJkYXRlcGlja2VyUmVmIiwiYXV0b0ZvY3VzIiwiZm9jdXNEYXRlIiwic2V0U3RhdGUiLCJrZXlDb2RlIiwib25EYXRlQ2xpY2siLCJzaGlmdEtleSIsIm9uU2VsZWN0IiwiaXRlbSIsIm9uQ2xvc2UiLCJvbkJsdXIiLCJlbCIsImZpbmRET01Ob2RlIiwiZGF0ZUVsIiwicXVlcnlTZWxlY3RvciIsImZvY3VzIiwicmVmIiwiZGF0ZXBpY2tlciIsImNhbCIsInN0YXJ0WWVhciIsInVzZXJDdXJyZW50WWVhciIsIm1pblllYXIiLCJiYWNrUmFuZ2UiLCJvbk1vbnRoQ2hhbmdlIiwibW9udGhzU2hvcnQiLCJwaWNrTGlzdEhlaWdodCIsIm9uWWVhckNoYW5nZSIsIkFycmF5IiwiZnV0dXJlUmFuZ2UiLCJqb2luIiwic3BsaXQiLCJtYXAiLCJhIiwiaSIsInRvZGF5Iiwid2Vla2RheXNNaW4iLCJ3ZCIsIndlZWtkYXlzIiwicmVuZGVyRGF0ZSIsImVuYWJsZWQiLCJkaXNhYmxlUGFzdERhdGVTZWxlY3Rpb24iLCJzZWxlY3RlZCIsImlzVG9kYXkiLCJkYXRlQ2xhc3NOYW1lIiwib25EYXRlS2V5RG93biIsIm9uRGF0ZUZvY3VzIiwiY2xhc3NOYW1lIiwiZGF0ZXBpY2tlckNsYXNzTmFtZXMiLCJvbktleURvd24iLCJyZW5kZXJGaWx0ZXIiLCJyZW5kZXJNb250aCIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsInN0cmluZyIsImJvb2wiLCJmdW5jIiwibnVtYmVyIiwib25lT2YiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsU0FBU0Esb0JBQVQsQ0FBOEJDLElBQTlCLEVBQW9DO0FBQ2xDLE1BQUlDLElBQUksc0JBQU9ELElBQVAsRUFBYSxZQUFiLENBQVI7QUFDQSxNQUFJLENBQUNDLEVBQUVDLE9BQUYsRUFBTCxFQUFrQjtBQUNoQkQsUUFBSSx1QkFBSjtBQUNEO0FBQ0QsTUFBTUUsT0FBT0YsRUFBRUUsSUFBRixFQUFiO0FBQ0EsTUFBTUMsUUFBUUgsRUFBRUcsS0FBRixFQUFkO0FBQ0EsTUFBTUMsUUFBUSxzQkFBT0osQ0FBUCxFQUFVSyxPQUFWLENBQWtCLE9BQWxCLEVBQTJCQSxPQUEzQixDQUFtQyxNQUFuQyxDQUFkO0FBQ0EsTUFBTUMsT0FBTyxzQkFBT04sQ0FBUCxFQUFVTyxLQUFWLENBQWdCLE9BQWhCLEVBQXlCQSxLQUF6QixDQUErQixNQUEvQixDQUFiO0FBQ0EsTUFBTUMsUUFBUSxFQUFkO0FBQ0EsTUFBSUMsT0FBTyxFQUFYO0FBQ0EsT0FBSyxJQUFJQyxLQUFLTixLQUFkLEVBQXFCTSxHQUFHQyxRQUFILENBQVlMLElBQVosQ0FBckIsRUFBd0NJLEtBQUtBLEdBQUdFLEdBQUgsQ0FBTyxDQUFQLEVBQVUsR0FBVixDQUE3QyxFQUE2RDtBQUMzREgsU0FBS0ksSUFBTCxDQUFVO0FBQ1JYLFlBQU1RLEdBQUdSLElBQUgsRUFERTtBQUVSQyxhQUFPTyxHQUFHUCxLQUFILEVBRkM7QUFHUkosWUFBTVcsR0FBR1gsSUFBSCxFQUhFO0FBSVJlLGFBQU9KLEdBQUdL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QVcsaUJBQVgsRUFBOEJELFNBQTlCLENBQTdCO0FBQ0EsYUFDRTtBQUFBO0FBQUE7QUFDRSxxQkFBWUMsb0JBRGQ7QUFFRSxlQUFLLEtBQUsvQyxhQUZaO0FBR0UseUJBQWMsS0FIaEI7QUFJRSxxQkFBWSxLQUFLZ0QsU0FBTCxDQUFlckQsSUFBZixDQUFvQixJQUFwQjtBQUpkO0FBTUksYUFBS3NELFlBQUwsQ0FBa0IvQixHQUFsQixDQU5KO0FBT0ksYUFBS2dDLFdBQUwsQ0FBaUJoQyxHQUFqQixFQUFzQnJCLFlBQXRCLEVBQW9DcUMsS0FBcEM7QUFQSixPQURGO0FBV0Q7Ozs7O0FBR0gxQyxXQUFXMkQsWUFBWCxHQUEwQjtBQUN4QjdCLGFBQVcsR0FEYTtBQUV4Qk0sZUFBYSxFQUZXO0FBR3hCUixtQkFBaUIsSUFITztBQUl4Qkssa0JBQWdCOztBQUpRLENBQTFCOztBQVFBakMsV0FBVzRELFNBQVgsR0FBdUI7QUFDckJOLGFBQVcsb0JBQVVPLE1BREE7QUFFckJ4RCxnQkFBYyxvQkFBVXdELE1BRkg7QUFHckJwRCxhQUFXLG9CQUFVcUQsSUFIQTtBQUlyQi9DLFlBQVUsb0JBQVVnRCxJQUpDO0FBS3JCN0MsVUFBUSxvQkFBVTZDLElBTEc7QUFNckI5QyxXQUFTLG9CQUFVOEMsSUFORTtBQU9yQmYsNEJBQTBCLG9CQUFVYyxJQVBmO0FBUXJCbEMsbUJBQWlCLG9CQUFVa0MsSUFSTjtBQVNyQmhDLGFBQVcsb0JBQVVrQyxNQVRBO0FBVXJCNUIsZUFBYSxvQkFBVTRCLE1BVkY7QUFXckIvQixrQkFBZ0Isb0JBQVVnQyxLQUFWLENBQWdCLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxFQUFQLENBQWhCO0FBWEssQ0FBdkI7O2tCQWNlLG1DQUFlakUsVUFBZixDIiwiZmlsZSI6IkRhdGVwaWNrZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4vQnV0dG9uJztcbmltcG9ydCB7IGRlZmF1bHQgYXMgUGlja2xpc3QsIFBpY2tsaXN0SXRlbSB9IGZyb20gJy4vUGlja2xpc3QnO1xuaW1wb3J0IG9uQ2xpY2tPdXRzaWRlIGZyb20gJ3JlYWN0LW9uY2xpY2tvdXRzaWRlJztcblxuZnVuY3Rpb24gY3JlYXRlQ2FsZW5kYXJPYmplY3QoZGF0ZSkge1xuICBsZXQgZCA9IG1vbWVudChkYXRlLCAnWVlZWS1NTS1ERCcpO1xuICBpZiAoIWQuaXNWYWxpZCgpKSB7XG4gICAgZCA9IG1vbWVudCgpO1xuICB9XG4gIGNvbnN0IHllYXIgPSBkLnllYXIoKTtcbiAgY29uc3QgbW9udGggPSBkLm1vbnRoKCk7XG4gIGNvbnN0IGZpcnN0ID0gbW9tZW50KGQpLnN0YXJ0T2YoJ21vbnRoJykuc3RhcnRPZignd2VlaycpO1xuICBjb25zdCBsYXN0ID0gbW9tZW50KGQpLmVuZE9mKCdtb250aCcpLmVuZE9mKCd3ZWVrJyk7XG4gIGNvbnN0IHdlZWtzID0gW107XG4gIGxldCBkYXlzID0gW107XG4gIGZvciAobGV0IGRkID0gZmlyc3Q7IGRkLmlzQmVmb3JlKGxhc3QpOyBkZCA9IGRkLmFkZCgxLCAnZCcpKSB7XG4gICAgZGF5cy5wdXNoKHtcbiAgICAgIHllYXI6IGRkLnllYXIoKSxcbiAgICAgIG1vbnRoOiBkZC5tb250aCgpLFxuICAgICAgZGF0ZTogZGQuZGF0ZSgpLFxuICAgICAgdmFsdWU6IGRkLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxuICAgIH0pO1xuICAgIGlmIChkYXlzLmxlbmd0aCA9PT0gNykge1xuICAgICAgd2Vla3MucHVzaChkYXlzKTtcbiAgICAgIGRheXMgPSBbXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgeWVhciwgbW9udGgsIHdlZWtzIH07XG59XG5cbmZ1bmN0aW9uIGNhbmNlbEV2ZW50KGUpIHtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICBlLnN0b3BQcm9wYWdhdGlvbigpO1xufVxuXG5jbGFzcyBEYXRlcGlja2VyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5oYW5kbGVDbGlja091dHNpZGUgPSB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZS5iaW5kKHRoaXMpO1xuICAgIGNvbnN0IHRhcmdldERhdGUgPSB0aGlzLnByb3BzLnNlbGVjdGVkRGF0ZSB8fCBtb21lbnQoKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICB0aGlzLnN0YXRlID0geyB0YXJnZXREYXRlIH07XG4gICAgdGhpcy5tb250aFJlZiA9IHRoaXMubW9udGhSZWYuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRhdGVwaWNrZXJSZWYgPSB0aGlzLmRhdGVwaWNrZXJSZWYuYmluZCh0aGlzKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICh0aGlzLnByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgY29uc3QgdGFyZ2V0RGF0ZSA9IHRoaXMucHJvcHMuc2VsZWN0ZWREYXRlIHx8IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgdGhpcy5mb2N1c0RhdGUodGFyZ2V0RGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmZvY3VzRGF0ZSAmJiAodGhpcy5zdGF0ZS50YXJnZXREYXRlIHx8IHRoaXMucHJvcHMuc2VsZWN0ZWREYXRlKSkge1xuICAgICAgdGhpcy5mb2N1c0RhdGUodGhpcy5zdGF0ZS50YXJnZXREYXRlIHx8IHRoaXMucHJvcHMuc2VsZWN0ZWREYXRlKTtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLWRpZC11cGRhdGUtc2V0LXN0YXRlICovXG4gICAgICB0aGlzLnNldFN0YXRlKHsgZm9jdXNEYXRlOiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBvbkRhdGVLZXlEb3duKGRhdGUsIGUpIHtcbiAgICBsZXQgdGFyZ2V0RGF0ZSA9IHRoaXMuc3RhdGUudGFyZ2V0RGF0ZSB8fCB0aGlzLnByb3BzLnNlbGVjdGVkRGF0ZTtcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMyB8fCBlLmtleUNvZGUgPT09IDMyKSB7IC8vIHJldHVybiAvIHNwYWNlXG4gICAgICB0aGlzLm9uRGF0ZUNsaWNrKGRhdGUpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA+PSAzNyAmJiBlLmtleUNvZGUgPD0gNDApIHsgLy8gY3Vyc29yIGtleVxuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzcpIHtcbiAgICAgICAgdGFyZ2V0RGF0ZSA9IG1vbWVudCh0YXJnZXREYXRlKS5hZGQoLTEsIGUuc2hpZnRLZXkgPyAnbW9udGhzJyA6ICdkYXlzJyk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PT0gMzkpIHsgLy8gcmlnaHQgYXJyb3cga2V5XG4gICAgICAgIHRhcmdldERhdGUgPSBtb21lbnQodGFyZ2V0RGF0ZSkuYWRkKDEsIGUuc2hpZnRLZXkgPyAnbW9udGhzJyA6ICdkYXlzJyk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PT0gMzgpIHsgLy8gdXAgYXJyb3cga2V5XG4gICAgICAgIHRhcmdldERhdGUgPSBtb21lbnQodGFyZ2V0RGF0ZSkuYWRkKC0xLCBlLnNoaWZ0S2V5ID8gJ3llYXJzJyA6ICd3ZWVrcycpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDQwKSB7IC8vIGRvd24gYXJyb3cga2V5XG4gICAgICAgIHRhcmdldERhdGUgPSBtb21lbnQodGFyZ2V0RGF0ZSkuYWRkKDEsIGUuc2hpZnRLZXkgPyAneWVhcnMnIDogJ3dlZWtzJyk7XG4gICAgICB9XG4gICAgICB0YXJnZXREYXRlID0gdGFyZ2V0RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyB0YXJnZXREYXRlLCBmb2N1c0RhdGU6IHRydWUgfSk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIG9uRGF0ZUNsaWNrKGRhdGUpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vblNlbGVjdCkge1xuICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdChkYXRlKTtcbiAgICB9XG4gIH1cblxuICBvbkRhdGVGb2N1cyhkYXRlKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUudGFyZ2V0RGF0ZSAhPT0gZGF0ZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHRhcmdldERhdGU6IGRhdGUgfSk7XG4gICAgfVxuICB9XG5cbiAgb25ZZWFyQ2hhbmdlKGl0ZW0pIHtcbiAgICBsZXQgdGFyZ2V0RGF0ZSA9IHRoaXMuc3RhdGUudGFyZ2V0RGF0ZSB8fCB0aGlzLnByb3BzLnNlbGVjdGVkRGF0ZTtcbiAgICB0YXJnZXREYXRlID0gbW9tZW50KHRhcmdldERhdGUpLnllYXIoaXRlbS52YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHRhcmdldERhdGUgfSk7XG4gIH1cblxuICBvbk1vbnRoQ2hhbmdlKG1vbnRoKSB7XG4gICAgbGV0IHRhcmdldERhdGUgPSB0aGlzLnN0YXRlLnRhcmdldERhdGUgfHwgdGhpcy5wcm9wcy5zZWxlY3RlZERhdGU7XG4gICAgdGFyZ2V0RGF0ZSA9IG1vbWVudCh0YXJnZXREYXRlKS5hZGQobW9udGgsICdtb250aHMnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgdGFyZ2V0RGF0ZSB9KTtcbiAgfVxuXG4gIG9uS2V5RG93bihlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHsgLy8gRVNDXG4gICAgICBpZiAodGhpcy5wcm9wcy5vbkNsb3NlKSB7XG4gICAgICAgIHRoaXMucHJvcHMub25DbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHByb3ZpZGVkIGJ5ICdyZWFjdC1vbmNsaWNrb3V0c2lkZSdcbiAgaGFuZGxlQ2xpY2tPdXRzaWRlKGUpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vbkJsdXIpIHtcbiAgICAgIHRoaXMucHJvcHMub25CbHVyKGUpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzRGF0ZShkYXRlKSB7XG4gICAgY29uc3QgZWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLm1vbnRoKTtcbiAgICBjb25zdCBkYXRlRWwgPSBlbC5xdWVyeVNlbGVjdG9yKGAuc2xkcy1kYXlbZGF0YS1kYXRlLXZhbHVlPVwiJHtkYXRlfVwiXWApO1xuICAgIGlmIChkYXRlRWwpIHtcbiAgICAgIGRhdGVFbC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIG1vbnRoUmVmKHJlZikge1xuICAgIHRoaXMubW9udGggPSByZWY7XG4gIH1cblxuICBkYXRlcGlja2VyUmVmKHJlZikge1xuICAgIHRoaXMuZGF0ZXBpY2tlciA9IHJlZjtcbiAgfVxuXG4gIHJlbmRlckZpbHRlcihjYWwpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG4gICAgY29uc3Qgc3RhcnRZZWFyID0gdGhpcy5wcm9wcy51c2VyQ3VycmVudFllYXIgPyBtb21lbnQoKS55ZWFyKCkgOiBjYWwueWVhcjtcbiAgICBjb25zdCBtaW5ZZWFyID0gc3RhcnRZZWFyIC0gdGhpcy5wcm9wcy5iYWNrUmFuZ2U7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdzbGRzLWRhdGVwaWNrZXJfX2ZpbHRlciBzbGRzLWdyaWQnPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nc2xkcy1kYXRlcGlja2VyX19maWx0ZXItLW1vbnRoIHNsZHMtZ3JpZCBzbGRzLWdyaWQtLWFsaWduLXNwcmVhZCBzbGRzLXNpemUtLTItb2YtMyc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3NsZHMtYWxpZ24tbWlkZGxlJz5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPSdzbGRzLWFsaWduLW1pZGRsZSdcbiAgICAgICAgICAgICAgdHlwZT0naWNvbi1jb250YWluZXInXG4gICAgICAgICAgICAgIGljb249J2xlZnQnXG4gICAgICAgICAgICAgIHNpemU9J3NtYWxsJ1xuICAgICAgICAgICAgICBhbHQ9J1ByZXZpb3VzIE1vbnRoJ1xuICAgICAgICAgICAgICBvbkNsaWNrPXsgdGhpcy5vbk1vbnRoQ2hhbmdlLmJpbmQodGhpcywgLTEpIH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGgyIGNsYXNzTmFtZT0nc2xkcy1hbGlnbi1taWRkbGUnPnsgbW9tZW50Lm1vbnRoc1Nob3J0KClbY2FsLm1vbnRoXSB9PC9oMj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nc2xkcy1hbGlnbi1taWRkbGUnPlxuICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICBjbGFzc05hbWU9J3NsZHMtYWxpZ24tbWlkZGxlJ1xuICAgICAgICAgICAgICB0eXBlPSdpY29uLWNvbnRhaW5lcidcbiAgICAgICAgICAgICAgaWNvbj0ncmlnaHQnXG4gICAgICAgICAgICAgIHNpemU9J3NtYWxsJ1xuICAgICAgICAgICAgICBhbHQ9J05leHQgTW9udGgnXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyB0aGlzLm9uTW9udGhDaGFuZ2UuYmluZCh0aGlzLCAxKSB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3NsZHMtc2l6ZS0tMS1vZi0zJz5cbiAgICAgICAgICA8UGlja2xpc3RcbiAgICAgICAgICAgIGNsYXNzTmFtZT0nc2xkcy1waWNrbGlzdC0tZmx1aWQgc2xkcy1zaHJpbmstbm9uZSdcbiAgICAgICAgICAgIHZhbHVlPXsgY2FsLnllYXIgfVxuICAgICAgICAgICAgbWF4SGVpZ2h0PXt0aGlzLnByb3BzLnBpY2tMaXN0SGVpZ2h0fVxuICAgICAgICAgICAgb25TZWxlY3Q9eyB0aGlzLm9uWWVhckNoYW5nZS5iaW5kKHRoaXMpIH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5ldyBBcnJheSgodGhpcy5wcm9wcy5iYWNrUmFuZ2UgKyB0aGlzLnByb3BzLmZ1dHVyZVJhbmdlKSkuam9pbignXycpLnNwbGl0KCdfJylcbiAgICAgICAgICAgICAgICAubWFwKChhLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICBsZXQgeWVhciA9IG1pblllYXIgKyBpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIDxQaWNrbGlzdEl0ZW0ga2V5PXsgeWVhciB9IGxhYmVsPXsgeWVhciB9IHZhbHVlPXsgeWVhciB9IC8+O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9QaWNrbGlzdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgcmVuZGVyTW9udGgoY2FsLCBzZWxlY3RlZERhdGUsIHRvZGF5KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDx0YWJsZSBjbGFzc05hbWU9J2RhdGVwaWNrZXJfX21vbnRoJyByb2xlPSdncmlkJyBhcmlhLWxhYmVsbGVkYnk9J21vbnRoJyByZWY9e3RoaXMubW9udGhSZWZ9PlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtb21lbnQud2Vla2RheXNNaW4odHJ1ZSkubWFwKCh3ZCwgaSkgPT4gKFxuICAgICAgICAgICAgICAgIDx0aCBrZXk9eyBpIH0+XG4gICAgICAgICAgICAgICAgICA8YWJiciB0aXRsZT17IG1vbWVudC53ZWVrZGF5cyh0cnVlLCBpKSB9Pnsgd2QgfTwvYWJicj5cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBjYWwud2Vla3MubWFwKChkYXlzLCBpKSA9PiAoXG4gICAgICAgICAgICAgIDx0ciBrZXk9eyBpIH0+eyBkYXlzLm1hcCh0aGlzLnJlbmRlckRhdGUuYmluZCh0aGlzLCBjYWwsIHNlbGVjdGVkRGF0ZSwgdG9kYXkpKSB9PC90cj5cbiAgICAgICAgICAgICkpXG4gICAgICAgICAgfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICApO1xuICB9XG5cbiAgcmVuZGVyRGF0ZShjYWwsIHNlbGVjdGVkRGF0ZSwgdG9kYXksIGQsIGkpIHtcbiAgICBsZXQgZW5hYmxlZCA9IGQueWVhciA9PT0gY2FsLnllYXIgJiYgZC5tb250aCA9PT0gY2FsLm1vbnRoO1xuICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVQYXN0RGF0ZVNlbGVjdGlvbikgZW5hYmxlZCA9IGQudmFsdWUgPj0gdG9kYXk7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBkLnZhbHVlID09PSBzZWxlY3RlZERhdGU7XG4gICAgY29uc3QgaXNUb2RheSA9IGQudmFsdWUgPT09IHRvZGF5O1xuICAgIGNvbnN0IGRhdGVDbGFzc05hbWUgPSBjbGFzc25hbWVzKHtcbiAgICAgICdzbGRzLWRpc2FibGVkLXRleHQnOiAhZW5hYmxlZCxcbiAgICAgICdzbGRzLWlzLXNlbGVjdGVkJzogc2VsZWN0ZWQsXG4gICAgICAnc2xkcy1pcy10b2RheSc6IGlzVG9kYXksXG4gICAgfSk7XG4gICAgcmV0dXJuIChcbiAgICAgIDx0ZFxuICAgICAgICBjbGFzc05hbWU9eyBkYXRlQ2xhc3NOYW1lIH1cbiAgICAgICAga2V5PXsgaSB9XG4gICAgICAgIGhlYWRlcnM9eyBtb21lbnQud2Vla2RheXMoaSkgfVxuICAgICAgICByb2xlPSdncmlkY2VsbCdcbiAgICAgICAgYXJpYS1kaXNhYmxlZD17ICFlbmFibGVkIH1cbiAgICAgICAgYXJpYS1zZWxlY3RlZD17IHNlbGVjdGVkIH1cbiAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzc05hbWU9J3NsZHMtZGF5J1xuICAgICAgICAgIHRhYkluZGV4PXsgZW5hYmxlZCA/IDAgOiAtMSB9XG4gICAgICAgICAgb25DbGljaz17IGVuYWJsZWQgPyB0aGlzLm9uRGF0ZUNsaWNrLmJpbmQodGhpcywgZC52YWx1ZSkgOiBudWxsIH1cbiAgICAgICAgICBvbktleURvd249eyBlbmFibGVkID8gdGhpcy5vbkRhdGVLZXlEb3duLmJpbmQodGhpcywgZC52YWx1ZSkgOiBudWxsIH1cbiAgICAgICAgICBvbkZvY3VzPXsgZW5hYmxlZCA/IHRoaXMub25EYXRlRm9jdXMuYmluZCh0aGlzLCBkLnZhbHVlKSA6IGNhbmNlbEV2ZW50IH1cbiAgICAgICAgICBkYXRhLWRhdGUtdmFsdWU9eyBkLnZhbHVlIH1cbiAgICAgICAgPnsgZC5kYXRlIH08L3NwYW4+XG4gICAgICA8L3RkPlxuICAgICk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBjbGFzc05hbWUsIHNlbGVjdGVkRGF0ZSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB0b2RheSA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgIGNvbnN0IHRhcmdldERhdGUgPSB0aGlzLnN0YXRlLnRhcmdldERhdGUgfHwgc2VsZWN0ZWREYXRlO1xuICAgIGNvbnN0IGNhbCA9IGNyZWF0ZUNhbGVuZGFyT2JqZWN0KHRhcmdldERhdGUpO1xuICAgIGNvbnN0IGRhdGVwaWNrZXJDbGFzc05hbWVzID0gY2xhc3NuYW1lcygnc2xkcy1kYXRlcGlja2VyJywgY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9eyBkYXRlcGlja2VyQ2xhc3NOYW1lcyB9XG4gICAgICAgIHJlZj17dGhpcy5kYXRlcGlja2VyUmVmfVxuICAgICAgICBhcmlhLWhpZGRlbj17IGZhbHNlIH1cbiAgICAgICAgb25LZXlEb3duPXsgdGhpcy5vbktleURvd24uYmluZCh0aGlzKSB9XG4gICAgICA+XG4gICAgICAgIHsgdGhpcy5yZW5kZXJGaWx0ZXIoY2FsKSB9XG4gICAgICAgIHsgdGhpcy5yZW5kZXJNb250aChjYWwsIHNlbGVjdGVkRGF0ZSwgdG9kYXkpIH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuRGF0ZXBpY2tlci5kZWZhdWx0UHJvcHMgPSB7XG4gIGJhY2tSYW5nZTogMTAwLFxuICBmdXR1cmVSYW5nZTogMzAsXG4gIHVzZXJDdXJyZW50WWVhcjogdHJ1ZSxcbiAgcGlja0xpc3RIZWlnaHQ6IDUsXG5cbn07XG5cbkRhdGVwaWNrZXIucHJvcFR5cGVzID0ge1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHNlbGVjdGVkRGF0ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgYXV0b0ZvY3VzOiBQcm9wVHlwZXMuYm9vbCxcbiAgb25TZWxlY3Q6IFByb3BUeXBlcy5mdW5jLFxuICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuICBvbkNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcbiAgZGlzYWJsZVBhc3REYXRlU2VsZWN0aW9uOiBQcm9wVHlwZXMuYm9vbCxcbiAgdXNlckN1cnJlbnRZZWFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgYmFja1JhbmdlOiBQcm9wVHlwZXMubnVtYmVyLFxuICBmdXR1cmVSYW5nZTogUHJvcFR5cGVzLm51bWJlcixcbiAgcGlja0xpc3RIZWlnaHQ6IFByb3BUeXBlcy5vbmVPZihbNSwgNywgMTBdKSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9uQ2xpY2tPdXRzaWRlKERhdGVwaWNrZXIpO1xuIl19