focus-components-v3
Version:
Focus web components to build applications (based on Material Design)
291 lines (227 loc) • 28.1 kB
JavaScript
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 _dec, _class;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _i18next = require('i18next');
var _i18next2 = _interopRequireDefault(_i18next);
var _material = require('../behaviours/material');
var _material2 = _interopRequireDefault(_material);
var _inputComponent = require('../behaviours/input-component');
var _debounce = require('lodash/debounce');
var _debounce2 = _interopRequireDefault(_debounce);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
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) : _defaults(subClass, superClass); }
var AutocompleteTextEdit = (_dec = (0, _material2.default)('materialInput'), _dec(_class = (0, _inputComponent.InputBehaviour)(_class = function (_Component) {
_inherits(AutocompleteTextEdit, _Component);
function AutocompleteTextEdit(props) {
_classCallCheck(this, AutocompleteTextEdit);
var _this = _possibleConstructorReturn(this, _Component.call(this, props));
_this.getValue = function () {
var inputValue = _this.state.inputValue;
if (inputValue !== undefined) {
return inputValue;
} else {
return null;
}
};
_this._querySearcher = function (value) {
var querySearcher = _this.props.querySearcher;
var hasSuggestions = _this.state.hasSuggestions;
querySearcher(value).then(function (_ref) {
var data = _ref.data,
totalCount = _ref.totalCount;
if (totalCount > 0) {
_this.setState({ hasSuggestions: true, suggestions: data, error: '' });
}
_this.refs.loader.classList.remove('mdl-progress__indeterminate');
_this.setState({ isLoading: false });
}).catch(function (err) {
_this.refs.loader.classList.remove('mdl-progress__indeterminate');
_this.setState({ error: JSON.stringify(err), isLoading: false });
_this.refs.materialInput.classList.add('is-invalid');
});
};
_this._handleonChange = function (_ref2) {
var value = _ref2.target.value;
var onChange = _this.props.onChange;
_this.setState({ inputValue: value });
if (value.trim() == '') {
_this.setState({ hasSuggestions: false });
} else {
_this.refs.loader.classList.add('mdl-progress__indeterminate');
_this.setState({ isLoading: true });
_this._debouncedQuerySearcher(value);
if (onChange) onChange(value);
}
};
_this.renderSuggestions = function () {
var suggestions = _this.state.suggestions;
var allSuggestions = suggestions.map(function (_ref3) {
var key = _ref3.key,
label = _ref3.label;
return _react2.default.createElement(
'li',
{ key: key, onMouseDown: function onMouseDown(e) {
_this.onResultClick(label);e.preventDefault();
}, 'data-focus': 'option' },
label
);
});
return _react2.default.createElement(
'ul',
{ ref: 'suggestions', 'data-focus': 'options' },
allSuggestions
);
};
_this._handleonFocus = function (e) {
var _this$state = _this.state,
hasSuggestions = _this$state.hasSuggestions,
hasFocus = _this$state.hasFocus;
var _this$props = _this.props,
showAtFocus = _this$props.showAtFocus,
emptyShowAll = _this$props.emptyShowAll;
_this.setState({ hasFocus: !_this.state.hasFocus });
if (hasSuggestions && !showAtFocus && hasFocus === false) {
_this.setState({ hasSuggestions: false });
}
if (!hasSuggestions && e.target.value.trim() === '' && emptyShowAll && hasFocus === false) {
// Doing a global search here
_this._querySearcher('');
}
return true;
};
_this.state = {
inputValue: _this.props.rawInputValue,
suggestions: [],
hasSuggestions: false,
error: _this.props.error,
hasFocus: false,
isLoading: false
};
return _this;
}
AutocompleteTextEdit.prototype.componentWillReceiveProps = function componentWillReceiveProps(_ref4) {
var error = _ref4.error;
if (error) {
this.setState({ error: error });
}
};
AutocompleteTextEdit.prototype.componentDidMount = function componentDidMount() {
var inputTimeout = this.props.inputTimeout;
this._debouncedQuerySearcher = (0, _debounce2.default)(this._querySearcher, inputTimeout);
};
// Returns the state's inputValue
// Gets the defined props' querySearch and returns the object given by the promise
// Sets the hasSuggestions' state if the given object has a none empty array
// Sets the state's inputValue when the user is typing
// Sets the value input with the selected suggestion and hides the dropdown
AutocompleteTextEdit.prototype.onResultClick = function onResultClick(value) {
var onChange = this.props.onChange;
this.refs.inputText.value = value;
this.setState({ inputValue: value, hasSuggestions: false, suggestions: [] });
if (onChange) onChange(value);
return value;
};
// Returns an html list whith the Suggestions
// Behaviour when onFocus and onBlur are triggered
// Maybe give the option for the floating label
AutocompleteTextEdit.prototype.render = function render() {
var _state = this.state,
inputValue = _state.inputValue,
hasSuggestions = _state.hasSuggestions,
hasFocus = _state.hasFocus,
isLoading = _state.isLoading;
var validInputProps = this._checkProps(this.props);
var _props = this.props,
inputTimeout = _props.inputTimeout,
error = _props.error,
placeholder = _props.placeholder;
validInputProps.value = inputValue === undefined || inputValue === null ? '' : inputValue;
validInputProps.onBlur = this._handleonFocus;
var inputProps = _extends({}, validInputProps);
return _react2.default.createElement(
'div',
{ 'data-focus': 'autocompleteText' },
_react2.default.createElement(
'div',
{ className: 'mdl-textfield mdl-js-textfield' + (error ? ' is-invalid' : ''), ref: 'materialInput' },
_react2.default.createElement('div', { 'data-focus': 'loading', 'data-loading': isLoading, className: 'mdl-progress mdl-js-progress', ref: 'loader' }),
_react2.default.createElement('input', _extends({ className: 'mdl-textfield__input', type: 'text', ref: 'inputText' }, inputProps)),
_react2.default.createElement(
'label',
{ className: 'mdl-textfield__label' },
_i18next2.default.t(placeholder)
),
_react2.default.createElement(
'span',
{ className: 'mdl-textfield__error', ref: 'errorMessage' },
_i18next2.default.t(error)
)
),
hasSuggestions && hasFocus && this.renderSuggestions()
);
};
return AutocompleteTextEdit;
}(_react.Component)) || _class) || _class);
AutocompleteTextEdit.displayName = 'AutocompleteTextEdit';
AutocompleteTextEdit.defaultProps = {
emptyShowAll: false,
inputTimeout: 200,
placeholder: 'Search here...',
showAtFocus: false
};
AutocompleteTextEdit.propTypes = {
emptyShowAll: _react.PropTypes.bool, //Defines if it shows suggestions on focus when the input is empty.
error: _react.PropTypes.string, //Error showed message.
inputTimeout: _react.PropTypes.number.isRequired, //Timeout to execute the debounce function.
onChange: _react.PropTypes.func, //Launches the querySearcher.
placeholder: _react.PropTypes.string, //Placeholder field.
querySearcher: _react.PropTypes.func.isRequired, //Returns a promise which is connected to the web service.
rawInputValue: _react.PropTypes.string, //Field value.
showAtFocus: _react.PropTypes.bool //Defines it shows suggestions on focus.
};
exports.default = AutocompleteTextEdit;
/*
EXAMPLE
const _querySearcher = query => {
let data = [
{
key: 'JL',
label: 'Joh Lickeur'
},
{
key: 'GK',
label: 'Guénolé Kikabou'
},
{
key: 'YL',
label: 'Yannick Lounivis'
}
];
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
data,
totalCount: data.length
});
}, 500);
});
};
<AutocompleteText
isEdit={isEdit}
querySearcher={_querySearcher}
placeholder={'Your search...'}
error{Something wrong happend. Retry please...}
/>
*/
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZyLUZSLmpzIl0sIm5hbWVzIjpbIkF1dG9jb21wbGV0ZVRleHRFZGl0IiwicHJvcHMiLCJnZXRWYWx1ZSIsImlucHV0VmFsdWUiLCJzdGF0ZSIsInVuZGVmaW5lZCIsIl9xdWVyeVNlYXJjaGVyIiwicXVlcnlTZWFyY2hlciIsImhhc1N1Z2dlc3Rpb25zIiwidmFsdWUiLCJ0aGVuIiwiZGF0YSIsInRvdGFsQ291bnQiLCJzZXRTdGF0ZSIsInN1Z2dlc3Rpb25zIiwiZXJyb3IiLCJyZWZzIiwibG9hZGVyIiwiY2xhc3NMaXN0IiwicmVtb3ZlIiwiaXNMb2FkaW5nIiwiY2F0Y2giLCJKU09OIiwic3RyaW5naWZ5IiwiZXJyIiwibWF0ZXJpYWxJbnB1dCIsImFkZCIsIl9oYW5kbGVvbkNoYW5nZSIsInRhcmdldCIsIm9uQ2hhbmdlIiwidHJpbSIsIl9kZWJvdW5jZWRRdWVyeVNlYXJjaGVyIiwicmVuZGVyU3VnZ2VzdGlvbnMiLCJhbGxTdWdnZXN0aW9ucyIsIm1hcCIsImtleSIsImxhYmVsIiwiZSIsIm9uUmVzdWx0Q2xpY2siLCJwcmV2ZW50RGVmYXVsdCIsIl9oYW5kbGVvbkZvY3VzIiwiaGFzRm9jdXMiLCJzaG93QXRGb2N1cyIsImVtcHR5U2hvd0FsbCIsInJhd0lucHV0VmFsdWUiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50RGlkTW91bnQiLCJpbnB1dFRpbWVvdXQiLCJpbnB1dFRleHQiLCJyZW5kZXIiLCJ2YWxpZElucHV0UHJvcHMiLCJfY2hlY2tQcm9wcyIsInBsYWNlaG9sZGVyIiwib25CbHVyIiwiaW5wdXRQcm9wcyIsInQiLCJkaXNwbGF5TmFtZSIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsImJvb2wiLCJzdHJpbmciLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwiZnVuYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7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QUNDO0FBQzlCNUMsV0FBTyxpQkFBVTZDLE1BRlksRUFFSjtBQUN6QmIsa0JBQWUsaUJBQVVjLE1BQVYsQ0FBaUJDLFVBSEgsRUFHZTtBQUM1Q2pDLGNBQVUsaUJBQVVrQyxJQUpTLEVBSUg7QUFDMUJYLGlCQUFhLGlCQUFVUSxNQUxNLEVBS0U7QUFDL0JyRCxtQkFBZSxpQkFBVXdELElBQVYsQ0FBZUQsVUFORCxFQU1hO0FBQzFDbEIsbUJBQWUsaUJBQVVnQixNQVBJLEVBT0k7QUFDakNsQixpQkFBYSxpQkFBVWlCLElBUk0sQ0FRRDtBQVJDLENBQWpDO2tCQVVlM0Qsb0I7O0FBR2YiLCJmaWxlIjoiZnItRlIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIFByb3BUeXBlc30gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcclxuaW1wb3J0IGkxOG5leHQgZnJvbSAnaTE4bmV4dCc7XHJcbmltcG9ydCBNREJlaGF2aW91ciBmcm9tICcuLi9iZWhhdmlvdXJzL21hdGVyaWFsJztcclxuaW1wb3J0IHtJbnB1dEJlaGF2aW91cn0gZnJvbSAnLi4vYmVoYXZpb3Vycy9pbnB1dC1jb21wb25lbnQnO1xyXG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoL2RlYm91bmNlJztcclxuXHJcbkBNREJlaGF2aW91cignbWF0ZXJpYWxJbnB1dCcpXHJcbkBJbnB1dEJlaGF2aW91clxyXG5jbGFzcyBBdXRvY29tcGxldGVUZXh0RWRpdCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBpbnB1dFZhbHVlOiB0aGlzLnByb3BzLnJhd0lucHV0VmFsdWUsXHJcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBbXSxcclxuICAgICAgICAgICAgaGFzU3VnZ2VzdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgICAgICBlcnJvcjogdGhpcy5wcm9wcy5lcnJvcixcclxuICAgICAgICAgICAgaGFzRm9jdXM6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHtlcnJvcn0pIHtcclxuICAgICAgICBpZihlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtlcnJvcjogZXJyb3J9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgY29uc3Qge2lucHV0VGltZW91dH0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIHRoaXMuX2RlYm91bmNlZFF1ZXJ5U2VhcmNoZXIgPSBkZWJvdW5jZSh0aGlzLl9xdWVyeVNlYXJjaGVyLCBpbnB1dFRpbWVvdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybnMgdGhlIHN0YXRlJ3MgaW5wdXRWYWx1ZVxyXG4gICAgZ2V0VmFsdWUgPSAoKSA9PiAge1xyXG4gICAgICAgIGNvbnN0IHtpbnB1dFZhbHVlfSA9IHRoaXMuc3RhdGU7XHJcbiAgICAgICAgaWYoaW5wdXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBHZXRzIHRoZSBkZWZpbmVkIHByb3BzJyBxdWVyeVNlYXJjaCBhbmQgcmV0dXJucyB0aGUgb2JqZWN0IGdpdmVuIGJ5IHRoZSBwcm9taXNlXHJcbiAgICAvLyBTZXRzIHRoZSBoYXNTdWdnZXN0aW9ucycgc3RhdGUgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgYSBub25lIGVtcHR5IGFycmF5XHJcbiAgICBfcXVlcnlTZWFyY2hlciA9IHZhbHVlID0+IHtcclxuICAgICAgICBjb25zdCB7cXVlcnlTZWFyY2hlcn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGNvbnN0IHtoYXNTdWdnZXN0aW9uc30gPSB0aGlzLnN0YXRlO1xyXG5cclxuICAgICAgICBxdWVyeVNlYXJjaGVyKHZhbHVlKS50aGVuKCh7ZGF0YSwgdG90YWxDb3VudH0pID0+IHtcclxuICAgICAgICAgICAgaWYodG90YWxDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2hhc1N1Z2dlc3Rpb25zOiB0cnVlLCBzdWdnZXN0aW9uczogZGF0YSwgZXJyb3I6ICcnfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZWZzLmxvYWRlci5jbGFzc0xpc3QucmVtb3ZlKCdtZGwtcHJvZ3Jlc3NfX2luZGV0ZXJtaW5hdGUnKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNMb2FkaW5nOiBmYWxzZX0pO1xyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcy5sb2FkZXIuY2xhc3NMaXN0LnJlbW92ZSgnbWRsLXByb2dyZXNzX19pbmRldGVybWluYXRlJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2Vycm9yOiBKU09OLnN0cmluZ2lmeShlcnIpLCBpc0xvYWRpbmc6IGZhbHNlfSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcy5tYXRlcmlhbElucHV0LmNsYXNzTGlzdC5hZGQoJ2lzLWludmFsaWQnKTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gU2V0cyB0aGUgc3RhdGUncyBpbnB1dFZhbHVlIHdoZW4gdGhlIHVzZXIgaXMgdHlwaW5nXHJcbiAgICBfaGFuZGxlb25DaGFuZ2UgPSAoe3RhcmdldDoge3ZhbHVlfX0pID0+IHtcclxuICAgICAgICBjb25zdCB7b25DaGFuZ2V9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbnB1dFZhbHVlOiB2YWx1ZX0pO1xyXG4gICAgICAgIGlmKHZhbHVlLnRyaW0oKSA9PSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtoYXNTdWdnZXN0aW9uczogZmFsc2V9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcy5sb2FkZXIuY2xhc3NMaXN0LmFkZCgnbWRsLXByb2dyZXNzX19pbmRldGVybWluYXRlJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2lzTG9hZGluZzogdHJ1ZX0pO1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJvdW5jZWRRdWVyeVNlYXJjaGVyKHZhbHVlKTtcclxuICAgICAgICAgICAgaWYgKG9uQ2hhbmdlKSBvbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBTZXRzIHRoZSB2YWx1ZSBpbnB1dCB3aXRoIHRoZSBzZWxlY3RlZCBzdWdnZXN0aW9uIGFuZCBoaWRlcyB0aGUgZHJvcGRvd25cclxuICAgIG9uUmVzdWx0Q2xpY2sodmFsdWUpIHtcclxuICAgICAgICBjb25zdCB7b25DaGFuZ2V9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICB0aGlzLnJlZnMuaW5wdXRUZXh0LnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW5wdXRWYWx1ZTogdmFsdWUsIGhhc1N1Z2dlc3Rpb25zOiBmYWxzZSwgc3VnZ2VzdGlvbnM6IFtdfSk7XHJcbiAgICAgICAgaWYgKG9uQ2hhbmdlKSBvbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBSZXR1cm5zIGFuIGh0bWwgbGlzdCB3aGl0aCB0aGUgU3VnZ2VzdGlvbnNcclxuICAgIHJlbmRlclN1Z2dlc3Rpb25zID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHtzdWdnZXN0aW9uc30gPSB0aGlzLnN0YXRlO1xyXG4gICAgICAgIGNvbnN0IGFsbFN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnMubWFwKCh7a2V5LCBsYWJlbH0pID0+IDxsaSBrZXk9e2tleX0gb25Nb3VzZURvd249eyhlKSA9PiB7dGhpcy5vblJlc3VsdENsaWNrKGxhYmVsKTsgZS5wcmV2ZW50RGVmYXVsdCgpO319IGRhdGEtZm9jdXM9J29wdGlvbicgPntsYWJlbH08L2xpPik7XHJcbiAgICAgICAgcmV0dXJuKFxyXG4gICAgICAgICAgICA8dWwgcmVmPSdzdWdnZXN0aW9ucycgZGF0YS1mb2N1cz0nb3B0aW9ucyc+XHJcbiAgICAgICAgICAgICAgICB7YWxsU3VnZ2VzdGlvbnN9XHJcbiAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gQmVoYXZpb3VyIHdoZW4gb25Gb2N1cyBhbmQgb25CbHVyIGFyZSB0cmlnZ2VyZWRcclxuICAgIF9oYW5kbGVvbkZvY3VzID0gZSA9PiB7XHJcbiAgICAgICAgY29uc3Qge2hhc1N1Z2dlc3Rpb25zLCBoYXNGb2N1c30gPSB0aGlzLnN0YXRlO1xyXG4gICAgICAgIGNvbnN0IHtzaG93QXRGb2N1cywgZW1wdHlTaG93QWxsfSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aGFzRm9jdXM6ICF0aGlzLnN0YXRlLmhhc0ZvY3VzfSk7XHJcbiAgICAgICAgaWYoaGFzU3VnZ2VzdGlvbnMgJiYgIXNob3dBdEZvY3VzICYmIGhhc0ZvY3VzID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtoYXNTdWdnZXN0aW9uczogZmFsc2V9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKCFoYXNTdWdnZXN0aW9ucyAmJiBlLnRhcmdldC52YWx1ZS50cmltKCkgPT09ICcnICYmIGVtcHR5U2hvd0FsbCAmJiBoYXNGb2N1cyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgLy8gRG9pbmcgYSBnbG9iYWwgc2VhcmNoIGhlcmVcclxuICAgICAgICAgICAgdGhpcy5fcXVlcnlTZWFyY2hlcignJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBNYXliZSBnaXZlIHRoZSBvcHRpb24gZm9yIHRoZSBmbG9hdGluZyBsYWJlbFxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHtpbnB1dFZhbHVlLCBoYXNTdWdnZXN0aW9ucywgaGFzRm9jdXMsIGlzTG9hZGluZ30gPSB0aGlzLnN0YXRlO1xyXG5cclxuICAgICAgICBjb25zdCB2YWxpZElucHV0UHJvcHMgPSB0aGlzLl9jaGVja1Byb3BzKHRoaXMucHJvcHMpO1xyXG5cclxuICAgICAgICBjb25zdCB7aW5wdXRUaW1lb3V0LCBlcnJvciwgcGxhY2Vob2xkZXJ9ID0gdGhpcy5wcm9wcztcclxuXHJcbiAgICAgICAgdmFsaWRJbnB1dFByb3BzLnZhbHVlID0gaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGlucHV0VmFsdWUgPT09IG51bGwgID8gJycgOiBpbnB1dFZhbHVlO1xyXG4gICAgICAgIHZhbGlkSW5wdXRQcm9wcy5vbkJsdXIgPSB0aGlzLl9oYW5kbGVvbkZvY3VzO1xyXG4gICAgICAgIGNvbnN0IGlucHV0UHJvcHMgPSB7Li4udmFsaWRJbnB1dFByb3BzfTtcclxuICAgICAgICByZXR1cm4oXHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1mb2N1cz0nYXV0b2NvbXBsZXRlVGV4dCc+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YG1kbC10ZXh0ZmllbGQgbWRsLWpzLXRleHRmaWVsZCR7ZXJyb3IgPyAnIGlzLWludmFsaWQnIDogJyd9YH0gcmVmPSdtYXRlcmlhbElucHV0Jz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtZm9jdXM9J2xvYWRpbmcnIGRhdGEtbG9hZGluZz17aXNMb2FkaW5nfSBjbGFzc05hbWU9J21kbC1wcm9ncmVzcyBtZGwtanMtcHJvZ3Jlc3MnIHJlZj0nbG9hZGVyJy8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT0nbWRsLXRleHRmaWVsZF9faW5wdXQnIHR5cGU9J3RleHQnIHJlZj0naW5wdXRUZXh0JyB7Li4uaW5wdXRQcm9wc30vPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJtZGwtdGV4dGZpZWxkX19sYWJlbFwiPntpMThuZXh0LnQocGxhY2Vob2xkZXIpfTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWRsLXRleHRmaWVsZF9fZXJyb3JcIiByZWY9J2Vycm9yTWVzc2FnZSc+e2kxOG5leHQudChlcnJvcil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB7aGFzU3VnZ2VzdGlvbnMgJiYgaGFzRm9jdXMgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclN1Z2dlc3Rpb25zKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG5cclxuQXV0b2NvbXBsZXRlVGV4dEVkaXQuZGlzcGxheU5hbWUgPSAnQXV0b2NvbXBsZXRlVGV4dEVkaXQnO1xyXG5BdXRvY29tcGxldGVUZXh0RWRpdC5kZWZhdWx0UHJvcHMgPSB7XHJcbiAgICBlbXB0eVNob3dBbGw6IGZhbHNlLFxyXG4gICAgaW5wdXRUaW1lb3V0OiAyMDAsXHJcbiAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCBoZXJlLi4uJyxcclxuICAgIHNob3dBdEZvY3VzOiBmYWxzZVxyXG59O1xyXG5BdXRvY29tcGxldGVUZXh0RWRpdC5wcm9wVHlwZXMgPSB7XHJcbiAgICBlbXB0eVNob3dBbGw6IFByb3BUeXBlcy5ib29sLCAvL0RlZmluZXMgaWYgaXQgc2hvd3Mgc3VnZ2VzdGlvbnMgb24gZm9jdXMgd2hlbiB0aGUgaW5wdXQgaXMgZW1wdHkuXHJcbiAgICBlcnJvcjogUHJvcFR5cGVzLnN0cmluZywgLy9FcnJvciBzaG93ZWQgbWVzc2FnZS5cclxuICAgIGlucHV0VGltZW91dCA6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCwgLy9UaW1lb3V0IHRvIGV4ZWN1dGUgdGhlIGRlYm91bmNlIGZ1bmN0aW9uLlxyXG4gICAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLCAvL0xhdW5jaGVzIHRoZSBxdWVyeVNlYXJjaGVyLlxyXG4gICAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsIC8vUGxhY2Vob2xkZXIgZmllbGQuXHJcbiAgICBxdWVyeVNlYXJjaGVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLCAvL1JldHVybnMgYSBwcm9taXNlIHdoaWNoIGlzIGNvbm5lY3RlZCB0byB0aGUgd2ViIHNlcnZpY2UuXHJcbiAgICByYXdJbnB1dFZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLCAvL0ZpZWxkIHZhbHVlLlxyXG4gICAgc2hvd0F0Rm9jdXM6IFByb3BUeXBlcy5ib29sIC8vRGVmaW5lcyBpdCBzaG93cyBzdWdnZXN0aW9ucyBvbiBmb2N1cy5cclxufTtcclxuZXhwb3J0IGRlZmF1bHQgQXV0b2NvbXBsZXRlVGV4dEVkaXQ7XHJcblxyXG5cclxuLypcclxuRVhBTVBMRVxyXG5jb25zdCBfcXVlcnlTZWFyY2hlciA9IHF1ZXJ5ID0+IHtcclxubGV0IGRhdGEgPSBbXHJcbntcclxua2V5OiAnSkwnLFxyXG5sYWJlbDogJ0pvaCBMaWNrZXVyJ1xyXG59LFxyXG57XHJcbmtleTogJ0dLJyxcclxubGFiZWw6ICdHdcOpbm9sw6kgS2lrYWJvdSdcclxufSxcclxue1xyXG5rZXk6ICdZTCcsXHJcbmxhYmVsOiAnWWFubmljayBMb3VuaXZpcydcclxufVxyXG5dO1xyXG5yZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5zZXRUaW1lb3V0KCgpID0+IHtcclxucmVzb2x2ZSh7XHJcbmRhdGEsXHJcbnRvdGFsQ291bnQ6IGRhdGEubGVuZ3RoXHJcbn0pO1xyXG59LCA1MDApO1xyXG59KTtcclxufTtcclxuXHJcbjxBdXRvY29tcGxldGVUZXh0XHJcbmlzRWRpdD17aXNFZGl0fVxyXG5xdWVyeVNlYXJjaGVyPXtfcXVlcnlTZWFyY2hlcn1cclxucGxhY2Vob2xkZXI9eydZb3VyIHNlYXJjaC4uLid9XHJcbmVycm9ye1NvbWV0aGluZyB3cm9uZyBoYXBwZW5kLiBSZXRyeSBwbGVhc2UuLi59XHJcbi8+XHJcbiovXHJcbiJdfQ==
;