UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

303 lines (246 loc) 36.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var _lodash = _interopRequireDefault(require("lodash.uniqby")); var _reactOnclickoutside = _interopRequireDefault(require("react-onclickoutside")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _accessor = _interopRequireDefault(require("./accessor")); var _chickletedInput = _interopRequireDefault(require("./chickleted-input")); var _typeahead = _interopRequireDefault(require("./typeahead")); var _icons = require("../icons"); var _dropdownList = _interopRequireWildcard(require("./dropdown-list")); var _utils = require("../../../utils/utils"); var _templateObject, _templateObject2, _templateObject3, _templateObject4; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var StyledDropdownSelect = _styledComponents["default"].div.attrs({ className: 'item-selector__dropdown' })(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n\n .list__item__anchor {\n ", ";\n }\n"])), function (props) { return props.inputTheme === 'secondary' ? props.theme.secondaryInput : props.theme.input; }, function (props) { return props.theme.dropdownListAnchor; }); var DropdownSelectValue = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n overflow: hidden;\n"])), function (props) { return props.hasPlaceholder ? props.theme.selectColorPlaceHolder : props.theme.selectColor; }); var DropdownSelectErase = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: 6px;\n display: flex;\n"]))); var DropdownWrapper = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n border: 0;\n width: 100%;\n left: 0;\n z-index: ", ";\n position: absolute;\n bottom: ", ";\n margin-top: ", ";\n margin-bottom: ", ";\n"])), function (props) { return props.theme.dropdownWrapperZ; }, function (props) { return props.placement === 'top' ? props.theme.inputBoxHeight : 'auto'; }, function (props) { return props.placement === 'bottom' ? '4px' : 'auto'; }, function (props) { return props.placement === 'top' ? '4px' : 'auto'; }); var ItemSelector = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(ItemSelector, _Component); var _super = _createSuper(ItemSelector); function ItemSelector() { var _this; (0, _classCallCheck2["default"])(this, ItemSelector); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", { showTypeahead: false }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleClickOutside", function () { _this._hideTypeahead(); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onBlur", function () { // note: chickleted input is not a real form element so we call onBlur() // when we feel the events are appropriate if (_this.props.onBlur) { _this.props.onBlur(); } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_removeItem", function (item, e) { // only used when multiSelect = true e.preventDefault(); e.stopPropagation(); var selectedItems = _this.props.selectedItems; var index = selectedItems.findIndex(function (t) { return t === item; }); if (index < 0) { return; } var items = [].concat((0, _toConsumableArray2["default"])(selectedItems.slice(0, index)), (0, _toConsumableArray2["default"])(selectedItems.slice(index + 1, selectedItems.length))); _this.props.onChange(items); if (_this.props.closeOnSelect) { _this.setState({ showTypeahead: false }); _this._onBlur(); } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_selectItem", function (item) { var getValue = _accessor["default"].generateOptionToStringFor(_this.props.getOptionValue || _this.props.displayOption); var previousSelected = (0, _utils.toArray)(_this.props.selectedItems); if (_this.props.multiSelect) { var items = (0, _lodash["default"])(previousSelected.concat((0, _utils.toArray)(item)), getValue); _this.props.onChange(items); } else { _this.props.onChange(getValue(item)); } if (_this.props.closeOnSelect) { _this.setState({ showTypeahead: false }); _this._onBlur(); } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onErase", function (e) { e.stopPropagation(); _this.props.onChange(null); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_showTypeahead", function () { if (!_this.props.disabled) { _this.setState({ showTypeahead: true }); } }); return _this; } (0, _createClass2["default"])(ItemSelector, [{ key: "_hideTypeahead", value: function _hideTypeahead() { this.setState({ showTypeahead: false }); this._onBlur(); } }, { key: "_renderDropdown", value: function _renderDropdown() { return (/*#__PURE__*/_react["default"].createElement(DropdownWrapper, { placement: this.props.placement }, /*#__PURE__*/_react["default"].createElement(_typeahead["default"], { customClasses: { results: 'list-selector', input: 'typeahead__input', listItem: 'list__item', listAnchor: 'list__item__anchor' }, options: this.props.options, filterOption: this.props.filterOption, fixedOptions: this.props.fixedOptions, placeholder: "Search", onOptionSelected: this._selectItem, customListComponent: this.props.DropDownRenderComponent, customListHeaderComponent: this.props.DropdownHeaderComponent, customListItemComponent: this.props.DropDownLineItemRenderComponent, displayOption: _accessor["default"].generateOptionToStringFor(this.props.displayOption), searchable: this.props.searchable, showOptionsWhenEmpty: true, selectedItems: (0, _utils.toArray)(this.props.selectedItems) })) ); } }, { key: "render", value: function render() { var selected = (0, _utils.toArray)(this.props.selectedItems); var hasValue = selected.length; var displayOption = _accessor["default"].generateOptionToStringFor(this.props.displayOption); var dropdownSelectProps = { className: (0, _classnames["default"])({ active: this.state.showTypeahead }), disabled: this.props.disabled, onClick: this._showTypeahead, onFocus: this._showPopover, error: this.props.isError, inputTheme: this.props.inputTheme }; return (/*#__PURE__*/_react["default"].createElement("div", { className: "item-selector" }, /*#__PURE__*/_react["default"].createElement("div", { style: { position: 'relative' } }, this.props.multiSelect ? /*#__PURE__*/_react["default"].createElement(_chickletedInput["default"], (0, _extends2["default"])({}, dropdownSelectProps, { selectedItems: (0, _utils.toArray)(this.props.selectedItems), placeholder: this.props.placeholder, displayOption: displayOption, removeItem: this._removeItem })) : /*#__PURE__*/_react["default"].createElement(StyledDropdownSelect, dropdownSelectProps, /*#__PURE__*/_react["default"].createElement(DropdownSelectValue, { hasPlaceholder: !hasValue, className: "item-selector__dropdown__value" }, hasValue ? /*#__PURE__*/_react["default"].createElement(this.props.DropDownLineItemRenderComponent, { displayOption: displayOption, value: selected[0] }) : this.props.placeholder), this.props.erasable && hasValue ? /*#__PURE__*/_react["default"].createElement(DropdownSelectErase, null, /*#__PURE__*/_react["default"].createElement(_icons.Delete, { height: "12px", onClick: this._onErase })) : null), this.state.showTypeahead && this._renderDropdown())) ); } }]); return ItemSelector; }(_react.Component); (0, _defineProperty2["default"])(ItemSelector, "propTypes", { // required properties selectedItems: _propTypes["default"].oneOfType([_propTypes["default"].array, _propTypes["default"].string, _propTypes["default"].number, _propTypes["default"].bool, _propTypes["default"].object]), onChange: _propTypes["default"].func.isRequired, options: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired, // optional properties fixedOptions: _propTypes["default"].arrayOf(_propTypes["default"].any), erasable: _propTypes["default"].bool, displayOption: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].func]), getOptionValue: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].func]), filterOption: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].func]), placement: _propTypes["default"].string, disabled: _propTypes["default"].bool, isError: _propTypes["default"].bool, multiSelect: _propTypes["default"].bool, inputTheme: _propTypes["default"].string, onBlur: _propTypes["default"].func, placeholder: _propTypes["default"].string, closeOnSelect: _propTypes["default"].bool, DropdownHeaderComponent: _propTypes["default"].func, DropDownRenderComponent: _propTypes["default"].func, DropDownLineItemRenderComponent: _propTypes["default"].func }); (0, _defineProperty2["default"])(ItemSelector, "defaultProps", { erasable: false, placement: 'bottom', selectedItems: [], displayOption: null, getOptionValue: null, filterOption: null, fixedOptions: null, inputTheme: 'primary', multiSelect: true, placeholder: 'Enter a value', closeOnSelect: true, searchable: true, dropdownHeader: null, DropdownHeaderComponent: null, DropDownRenderComponent: _dropdownList["default"], DropDownLineItemRenderComponent: _dropdownList.ListItem }); var _default = exports["default"] = (0, _reactOnclickoutside["default"])(ItemSelector); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9pdGVtLXNlbGVjdG9yL2l0ZW0tc2VsZWN0b3IuanMiXSwibmFtZXMiOlsiU3R5bGVkRHJvcGRvd25TZWxlY3QiLCJzdHlsZWQiLCJkaXYiLCJhdHRycyIsImNsYXNzTmFtZSIsInByb3BzIiwiaW5wdXRUaGVtZSIsInRoZW1lIiwic2Vjb25kYXJ5SW5wdXQiLCJpbnB1dCIsImRyb3Bkb3duTGlzdEFuY2hvciIsIkRyb3Bkb3duU2VsZWN0VmFsdWUiLCJzcGFuIiwiaGFzUGxhY2Vob2xkZXIiLCJzZWxlY3RDb2xvclBsYWNlSG9sZGVyIiwic2VsZWN0Q29sb3IiLCJEcm9wZG93blNlbGVjdEVyYXNlIiwiRHJvcGRvd25XcmFwcGVyIiwiZHJvcGRvd25XcmFwcGVyWiIsInBsYWNlbWVudCIsImlucHV0Qm94SGVpZ2h0IiwiSXRlbVNlbGVjdG9yIiwic2hvd1R5cGVhaGVhZCIsIl9oaWRlVHlwZWFoZWFkIiwib25CbHVyIiwiaXRlbSIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsInNlbGVjdGVkSXRlbXMiLCJpbmRleCIsImZpbmRJbmRleCIsInQiLCJpdGVtcyIsInNsaWNlIiwibGVuZ3RoIiwib25DaGFuZ2UiLCJjbG9zZU9uU2VsZWN0Iiwic2V0U3RhdGUiLCJfb25CbHVyIiwiZ2V0VmFsdWUiLCJBY2Nlc3NvciIsImdlbmVyYXRlT3B0aW9uVG9TdHJpbmdGb3IiLCJnZXRPcHRpb25WYWx1ZSIsImRpc3BsYXlPcHRpb24iLCJwcmV2aW91c1NlbGVjdGVkIiwibXVsdGlTZWxlY3QiLCJjb25jYXQiLCJkaXNhYmxlZCIsInJlc3VsdHMiLCJsaXN0SXRlbSIsImxpc3RBbmNob3IiLCJvcHRpb25zIiwiZmlsdGVyT3B0aW9uIiwiZml4ZWRPcHRpb25zIiwiX3NlbGVjdEl0ZW0iLCJEcm9wRG93blJlbmRlckNvbXBvbmVudCIsIkRyb3Bkb3duSGVhZGVyQ29tcG9uZW50IiwiRHJvcERvd25MaW5lSXRlbVJlbmRlckNvbXBvbmVudCIsInNlYXJjaGFibGUiLCJzZWxlY3RlZCIsImhhc1ZhbHVlIiwiZHJvcGRvd25TZWxlY3RQcm9wcyIsImFjdGl2ZSIsInN0YXRlIiwib25DbGljayIsIl9zaG93VHlwZWFoZWFkIiwib25Gb2N1cyIsIl9zaG93UG9wb3ZlciIsImVycm9yIiwiaXNFcnJvciIsInBvc2l0aW9uIiwicGxhY2Vob2xkZXIiLCJfcmVtb3ZlSXRlbSIsImVyYXNhYmxlIiwiX29uRXJhc2UiLCJfcmVuZGVyRHJvcGRvd24iLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJvbmVPZlR5cGUiLCJhcnJheSIsInN0cmluZyIsIm51bWJlciIsImJvb2wiLCJvYmplY3QiLCJmdW5jIiwiaXNSZXF1aXJlZCIsImFycmF5T2YiLCJhbnkiLCJkcm9wZG93bkhlYWRlciIsIkRyb3Bkb3duTGlzdCIsIkxpc3RJdGVtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxvQkFBb0IsR0FBR0MsNkJBQU9DLEdBQVAsQ0FBV0MsS0FBWCxDQUFpQjtBQUM1Q0MsRUFBQUEsU0FBUyxFQUFFO0FBRGlDLENBQWpCLENBQUgsNklBR3RCLFVBQUFDLEtBQUs7QUFBQSxTQUNMQSxLQUFLLENBQUNDLFVBQU4sS0FBcUIsV0FBckIsR0FDSUQsS0FBSyxDQUFDRSxLQUFOLENBQVlDLGNBRGhCLEdBRUlILEtBQUssQ0FBQ0UsS0FBTixDQUFZRSxLQUhYO0FBQUEsQ0FIaUIsRUFTcEIsVUFBQUosS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0UsS0FBTixDQUFZRyxrQkFBaEI7QUFBQSxDQVRlLENBQTFCOztBQWFBLElBQU1DLG1CQUFtQixHQUFHViw2QkFBT1csSUFBVixnSUFDZCxVQUFBUCxLQUFLO0FBQUEs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QUFVTyxJQTFCbEI7QUEyQmpCN0IsRUFBQUEsdUJBQXVCLEVBQUVzQixzQkFBVU8sSUEzQmxCO0FBNEJqQjNCLEVBQUFBLCtCQUErQixFQUFFb0Isc0JBQVVPO0FBNUIxQixDO2lDQURmaEUsWSxrQkFnQ2tCO0FBQ3BCcUQsRUFBQUEsUUFBUSxFQUFFLEtBRFU7QUFFcEJ2RCxFQUFBQSxTQUFTLEVBQUUsUUFGUztBQUdwQlUsRUFBQUEsYUFBYSxFQUFFLEVBSEs7QUFJcEJlLEVBQUFBLGFBQWEsRUFBRSxJQUpLO0FBS3BCRCxFQUFBQSxjQUFjLEVBQUUsSUFMSTtBQU1wQlUsRUFBQUEsWUFBWSxFQUFFLElBTk07QUFPcEJDLEVBQUFBLFlBQVksRUFBRSxJQVBNO0FBUXBCaEQsRUFBQUEsVUFBVSxFQUFFLFNBUlE7QUFTcEJ3QyxFQUFBQSxXQUFXLEVBQUUsSUFUTztBQVVwQjBCLEVBQUFBLFdBQVcsRUFBRSxlQVZPO0FBV3BCbkMsRUFBQUEsYUFBYSxFQUFFLElBWEs7QUFZcEJzQixFQUFBQSxVQUFVLEVBQUUsSUFaUTtBQWFwQjhCLEVBQUFBLGNBQWMsRUFBRSxJQWJJO0FBY3BCaEMsRUFBQUEsdUJBQXVCLEVBQUUsSUFkTDtBQWVwQkQsRUFBQUEsdUJBQXVCLEVBQUVrQyx3QkFmTDtBQWdCcEJoQyxFQUFBQSwrQkFBK0IsRUFBRWlDO0FBaEJiLEM7O29DQTBMVCxxQ0FBc0J0RSxZQUF0QixDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgdW5pcUJ5IGZyb20gJ2xvZGFzaC51bmlxYnknO1xuaW1wb3J0IGxpc3RlbnNUb0NsaWNrT3V0c2lkZSBmcm9tICdyZWFjdC1vbmNsaWNrb3V0c2lkZSc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IEFjY2Vzc29yIGZyb20gJy4vYWNjZXNzb3InO1xuaW1wb3J0IENoaWNrbGV0ZWRJbnB1dCBmcm9tICcuL2NoaWNrbGV0ZWQtaW5wdXQnO1xuaW1wb3J0IFR5cGVhaGVhZCBmcm9tICcuL3R5cGVhaGVhZCc7XG5pbXBvcnQge0RlbGV0ZX0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMnO1xuaW1wb3J0IERyb3Bkb3duTGlzdCwge0xpc3RJdGVtfSBmcm9tICcuL2Ryb3Bkb3duLWxpc3QnO1xuXG5pbXBvcnQge3RvQXJyYXl9IGZyb20gJ3V0aWxzL3V0aWxzJztcblxuY29uc3QgU3R5bGVkRHJvcGRvd25TZWxlY3QgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnaXRlbS1zZWxlY3Rvcl9fZHJvcGRvd24nXG59KWBcbiAgJHtwcm9wcyA9PlxuICAgIHByb3BzLmlucHV0VGhlbWUgPT09ICdzZWNvbmRhcnknXG4gICAgICA/IHByb3BzLnRoZW1lLnNlY29uZGFyeUlucHV0XG4gICAgICA6IHByb3BzLnRoZW1lLmlucHV0fTtcblxuICAubGlzdF9faXRlbV9fYW5jaG9yIHtcbiAgICAke3Byb3BzID0+IHByb3BzLnRoZW1lLmRyb3Bkb3duTGlzdEFuY2hvcn07XG4gIH1cbmA7XG5cbmNvbnN0IERyb3Bkb3duU2VsZWN0VmFsdWUgPSBzdHlsZWQuc3BhbmBcbiAgY29sb3I6ICR7cHJvcHMgPT5cbiAgICBwcm9wcy5oYXNQbGFjZWhvbGRlclxuICAgICAgPyBwcm9wcy50aGVtZS5zZWxlY3RDb2xvclBsYWNlSG9sZGVyXG4gICAgICA6IHByb3BzLnRoZW1lLnNlbGVjdENvbG9yfTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbmA7XG5cbmNvbnN0IERyb3Bkb3duU2VsZWN0RXJhc2UgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tbGVmdDogNnB4O1xuICBkaXNwbGF5OiBmbGV4O1xuYDtcblxuY29uc3QgRHJvcGRvd25XcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgYm9yZGVyOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5kcm9wZG93bldyYXBwZXJafTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206ICR7cHJvcHMgPT5cbiAgICBwcm9wcy5wbGFjZW1lbnQgPT09ICd0b3AnID8gcHJvcHMudGhlbWUuaW5wdXRCb3hIZWlnaHQgOiAnYXV0byd9O1xuICBtYXJnaW4tdG9wOiAke3Byb3BzID0+IChwcm9wcy5wbGFjZW1lbnQgPT09ICdib3R0b20nID8gJzRweCcgOiAnYXV0bycpfTtcbiAgbWFyZ2luLWJvdHRvbTogJHtwcm9wcyA9PiAocHJvcHMucGxhY2VtZW50ID09PSAndG9wJyA/ICc0cHgnIDogJ2F1dG8nKX07XG5gO1xuXG5jbGFzcyBJdGVtU2VsZWN0b3IgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIC8vIHJlcXVpcmVkIHByb3BlcnRpZXNcbiAgICBzZWxlY3RlZEl0ZW1zOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgIFByb3BUeXBlcy5hcnJheSxcbiAgICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgUHJvcFR5cGVzLmJvb2wsXG4gICAgICBQcm9wVHlwZXMub2JqZWN0XG4gICAgXSksXG4gICAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb3B0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSkuaXNSZXF1aXJlZCxcblxuICAgIC8vIG9wdGlvbmFsIHByb3BlcnRpZXNcbiAgICBmaXhlZE9wdGlvbnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLFxuICAgIGVyYXNhYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBkaXNwbGF5T3B0aW9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIGdldE9wdGlvblZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIGZpbHRlck9wdGlvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBwbGFjZW1lbnQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIGlzRXJyb3I6IFByb3BUeXBlcy5ib29sLFxuICAgIG11bHRpU2VsZWN0OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBpbnB1dFRoZW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY2xvc2VPblNlbGVjdDogUHJvcFR5cGVzLmJvb2wsXG4gICAgRHJvcGRvd25IZWFkZXJDb21wb25lbnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIERyb3BEb3duUmVuZGVyQ29tcG9uZW50OiBQcm9wVHlwZXMuZnVuYyxcbiAgICBEcm9wRG93bkxpbmVJdGVtUmVuZGVyQ29tcG9uZW50OiBQcm9wVHlwZXMuZnVuY1xuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgZXJhc2FibGU6IGZhbHNlLFxuICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gICAgc2VsZWN0ZWRJdGVtczogW10sXG4gICAgZGlzcGxheU9wdGlvbjogbnVsbCxcbiAgICBnZXRPcHRpb25WYWx1ZTogbnVsbCxcbiAgICBmaWx0ZXJPcHRpb246IG51bGwsXG4gICAgZml4ZWRPcHRpb25zOiBudWxsLFxuICAgIGlucHV0VGhlbWU6ICdwcmltYXJ5JyxcbiAgICBtdWx0aVNlbGVjdDogdHJ1ZSxcbiAgICBwbGFjZWhvbGRlcjogJ0VudGVyIGEgdmFsdWUnLFxuICAgIGNsb3NlT25TZWxlY3Q6IHRydWUsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBkcm9wZG93bkhlYWRlcjogbnVsbCxcbiAgICBEcm9wZG93bkhlYWRlckNvbXBvbmVudDogbnVsbCxcbiAgICBEcm9wRG93blJlbmRlckNvbXBvbmVudDogRHJvcGRvd25MaXN0LFxuICAgIERyb3BEb3duTGluZUl0ZW1SZW5kZXJDb21wb25lbnQ6IExpc3RJdGVtXG4gIH07XG5cbiAgc3RhdGUgPSB7XG4gICAgc2hvd1R5cGVhaGVhZDogZmFsc2VcbiAgfTtcblxuICBoYW5kbGVDbGlja091dHNpZGUgPSAoKSA9PiB7XG4gICAgdGhpcy5faGlkZVR5cGVhaGVhZCgpO1xuICB9O1xuXG4gIF9oaWRlVHlwZWFoZWFkKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe3Nob3dUeXBlYWhlYWQ6IGZhbHNlfSk7XG4gICAgdGhpcy5fb25CbHVyKCk7XG4gIH1cblxuICBfb25CbHVyID0gKCkgPT4ge1xuICAgIC8vIG5vdGU6IGNoaWNrbGV0ZWQgaW5wdXQgaXMgbm90IGEgcmVhbCBmb3JtIGVsZW1lbnQgc28gd2UgY2FsbCBvbkJsdXIoKVxuICAgIC8vIHdoZW4gd2UgZmVlbCB0aGUgZXZlbnRzIGFyZSBhcHByb3ByaWF0ZVxuICAgIGlmICh0aGlzLnByb3BzLm9uQmx1cikge1xuICAgICAgdGhpcy5wcm9wcy5vbkJsdXIoKTtcbiAgICB9XG4gIH07XG5cbiAgX3JlbW92ZUl0ZW0gPSAoaXRlbSwgZSkgPT4ge1xuICAgIC8vIG9ubHkgdXNlZCB3aGVuIG11bHRpU2VsZWN0ID0gdHJ1ZVxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IHtzZWxlY3RlZEl0ZW1zfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgaW5kZXggPSBzZWxlY3RlZEl0ZW1zLmZpbmRJbmRleCh0ID0+IHQgPT09IGl0ZW0pO1xuXG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1zID0gW1xuICAgICAgLi4uc2VsZWN0ZWRJdGVtcy5zbGljZSgwLCBpbmRleCksXG4gICAgICAuLi5zZWxlY3RlZEl0ZW1zLnNsaWNlKGluZGV4ICsgMSwgc2VsZWN0ZWRJdGVtcy5sZW5ndGgpXG4gICAgXTtcblxuICAgIHRoaXMucHJvcHMub25DaGFuZ2UoaXRlbXMpO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuY2xvc2VPblNlbGVjdCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7c2hvd1R5cGVhaGVhZDogZmFsc2V9KTtcbiAgICAgIHRoaXMuX29uQmx1cigpO1xuICAgIH1cbiAgfTtcblxuICBfc2VsZWN0SXRlbSA9IGl0ZW0gPT4ge1xuICAgIGNvbnN0IGdldFZhbHVlID0gQWNjZXNzb3IuZ2VuZXJhdGVPcHRpb25Ub1N0cmluZ0ZvcihcbiAgICAgIHRoaXMucHJvcHMuZ2V0T3B0aW9uVmFsdWUgfHwgdGhpcy5wcm9wcy5kaXNwbGF5T3B0aW9uXG4gICAgKTtcblxuICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0ZWQgPSB0b0FycmF5KHRoaXMucHJvcHMuc2VsZWN0ZWRJdGVtcyk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5tdWx0aVNlbGVjdCkge1xuICAgICAgY29uc3QgaXRlbXMgPSB1bmlxQnkocHJldmlvdXNTZWxlY3RlZC5jb25jYXQodG9BcnJheShpdGVtKSksIGdldFZhbHVlKTtcbiAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UoaXRlbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGdldFZhbHVlKGl0ZW0pKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5jbG9zZU9uU2VsZWN0KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtzaG93VHlwZWFoZWFkOiBmYWxzZX0pO1xuICAgICAgdGhpcy5fb25CbHVyKCk7XG4gICAgfVxuICB9O1xuXG4gIF9vbkVyYXNlID0gZSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKG51bGwpO1xuICB9O1xuXG4gIF9zaG93VHlwZWFoZWFkID0gKCkgPT4ge1xuICAgIGlmICghdGhpcy5wcm9wcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNob3dUeXBlYWhlYWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBfcmVuZGVyRHJvcGRvd24oKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEcm9wZG93bldyYXBwZXIgcGxhY2VtZW50PXt0aGlzLnByb3BzLnBsYWNlbWVudH0+XG4gICAgICAgIDxUeXBlYWhlYWRcbiAgICAgICAgICBjdXN0b21DbGFzc2VzPXt7XG4gICAgICAgICAgICByZXN1bHRzOiAnbGlzdC1zZWxlY3RvcicsXG4gICAgICAgICAgICBpbnB1dDogJ3R5cGVhaGVhZF9faW5wdXQnLFxuICAgICAgICAgICAgbGlzdEl0ZW06ICdsaXN0X19pdGVtJyxcbiAgICAgICAgICAgIGxpc3RBbmNob3I6ICdsaXN0X19pdGVtX19hbmNob3InXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvcHRpb25zPXt0aGlzLnByb3BzLm9wdGlvbnN9XG4gICAgICAgICAgZmlsdGVyT3B0aW9uPXt0aGlzLnByb3BzLmZpbHRlck9wdGlvbn1cbiAgICAgICAgICBmaXhlZE9wdGlvbnM9e3RoaXMucHJvcHMuZml4ZWRPcHRpb25zfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCJcbiAgICAgICAgICBvbk9wdGlvblNlbGVjdGVkPXt0aGlzLl9zZWxlY3RJdGVtfVxuICAgICAgICAgIGN1c3RvbUxpc3RDb21wb25lbnQ9e3RoaXMucHJvcHMuRHJvcERvd25SZW5kZXJDb21wb25lbnR9XG4gICAgICAgICAgY3VzdG9tTGlzdEhlYWRlckNvbXBvbmVudD17dGhpcy5wcm9wcy5Ecm9wZG93bkhlYWRlckNvbXBvbmVudH1cbiAgICAgICAgICBjdXN0b21MaXN0SXRlbUNvbXBvbmVudD17dGhpcy5wcm9wcy5Ecm9wRG93bkxpbmVJdGVtUmVuZGVyQ29tcG9uZW50fVxuICAgICAgICAgIGRpc3BsYXlPcHRpb249e0FjY2Vzc29yLmdlbmVyYXRlT3B0aW9uVG9TdHJpbmdGb3IoXG4gICAgICAgICAgICB0aGlzLnByb3BzLmRpc3BsYXlPcHRpb25cbiAgICAgICAgICApfVxuICAgICAgICAgIHNlYXJjaGFibGU9e3RoaXMucHJvcHMuc2VhcmNoYWJsZX1cbiAgICAgICAgICBzaG93T3B0aW9uc1doZW5FbXB0eVxuICAgICAgICAgIHNlbGVjdGVkSXRlbXM9e3RvQXJyYXkodGhpcy5wcm9wcy5zZWxlY3RlZEl0ZW1zKX1cbiAgICAgICAgLz5cbiAgICAgIDwvRHJvcGRvd25XcmFwcGVyPlxuICAgICk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0b0FycmF5KHRoaXMucHJvcHMuc2VsZWN0ZWRJdGVtcyk7XG4gICAgY29uc3QgaGFzVmFsdWUgPSBzZWxlY3RlZC5sZW5ndGg7XG4gICAgY29uc3QgZGlzcGxheU9wdGlvbiA9IEFjY2Vzc29yLmdlbmVyYXRlT3B0aW9uVG9TdHJpbmdGb3IoXG4gICAgICB0aGlzLnByb3BzLmRpc3BsYXlPcHRpb25cbiAgICApO1xuXG4gICAgY29uc3QgZHJvcGRvd25TZWxlY3RQcm9wcyA9IHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyh7XG4gICAgICAgIGFjdGl2ZTogdGhpcy5zdGF0ZS5zaG93VHlwZWFoZWFkXG4gICAgICB9KSxcbiAgICAgIGRpc2FibGVkOiB0aGlzLnByb3BzLmRpc2FibGVkLFxuICAgICAgb25DbGljazogdGhpcy5fc2hvd1R5cGVhaGVhZCxcbiAgICAgIG9uRm9jdXM6IHRoaXMuX3Nob3dQb3BvdmVyLFxuICAgICAgZXJyb3I6IHRoaXMucHJvcHMuaXNFcnJvcixcbiAgICAgIGlucHV0VGhlbWU6IHRoaXMucHJvcHMuaW5wdXRUaGVtZVxuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJpdGVtLXNlbGVjdG9yXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9e3twb3NpdGlvbjogJ3JlbGF0aXZlJ319PlxuICAgICAgICAgIHsvKiB0aGlzIHBhcnQgaXMgdXNlZCB0byBkaXNwbGF5IHRoZSBsYWJlbCAqL31cbiAgICAgICAgICB7dGhpcy5wcm9wcy5tdWx0aVNlbGVjdCA/IChcbiAgICAgICAgICAgIDxDaGlja2xldGVkSW5wdXRcbiAgICAgICAgICAgICAgey4uLmRyb3Bkb3duU2VsZWN0UHJvcHN9XG4gICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXM9e3RvQXJyYXkodGhpcy5wcm9wcy5zZWxlY3RlZEl0ZW1zKX1cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3RoaXMucHJvcHMucGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICAgIGRpc3BsYXlPcHRpb249e2Rpc3BsYXlPcHRpb259XG4gICAgICAgICAgICAgIHJlbW92ZUl0ZW09e3RoaXMuX3JlbW92ZUl0ZW19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8U3R5bGVkRHJvcGRvd25TZWxlY3Qgey4uLmRyb3Bkb3duU2VsZWN0UHJvcHN9PlxuICAgICAgICAgICAgICA8RHJvcGRvd25TZWxlY3RWYWx1ZVxuICAgICAgICAgICAgICAgIGhhc1BsYWNlaG9sZGVyPXshaGFzVmFsdWV9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaXRlbS1zZWxlY3Rvcl9fZHJvcGRvd25fX3ZhbHVlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtoYXNWYWx1ZSA/IChcbiAgICAgICAgICAgICAgICAgIDx0aGlzLnByb3BzLkRyb3BEb3duTGluZUl0ZW1SZW5kZXJDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU9wdGlvbj17ZGlzcGxheU9wdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlbGVjdGVkWzBdfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvRHJvcGRvd25TZWxlY3RWYWx1ZT5cbiAgICAgICAgICAgICAge3RoaXMucHJvcHMuZXJhc2FibGUgJiYgaGFzVmFsdWUgPyAoXG4gICAgICAgICAgICAgICAgPERyb3Bkb3duU2VsZWN0RXJhc2U+XG4gICAgICAgICAgICAgICAgICA8RGVsZXRlIGhlaWdodD1cIjEycHhcIiBvbkNsaWNrPXt0aGlzLl9vbkVyYXNlfSAvPlxuICAgICAgICAgICAgICAgIDwvRHJvcGRvd25TZWxlY3RFcmFzZT5cbiAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICA8L1N0eWxlZERyb3Bkb3duU2VsZWN0PlxuICAgICAgICAgICl9XG4gICAgICAgICAgey8qIHRoaXMgcGFydCBpcyB1c2VkIHRvIGJ1aWx0IHRoZSBsaXN0ICovfVxuICAgICAgICAgIHt0aGlzLnN0YXRlLnNob3dUeXBlYWhlYWQgJiYgdGhpcy5fcmVuZGVyRHJvcGRvd24oKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxpc3RlbnNUb0NsaWNrT3V0c2lkZShJdGVtU2VsZWN0b3IpO1xuIl19