kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
258 lines (253 loc) • 40.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.classList = exports.ListItem = void 0;
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 _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _constants = require("@kepler.gl/constants");
var _templateObject, _templateObject2; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
var LEFT_BUTTON = 0;
var classList = exports.classList = {
list: 'list-selector',
listHeader: 'list__header',
listSection: 'list__section',
listItem: 'list__item',
listItemAnchor: 'list__item__anchor',
listItemFixed: 'list__item__fixed'
};
var defaultDisplay = function defaultDisplay(d) {
return d;
};
var ListItem = exports.ListItem = function ListItem(_ref) {
var value = _ref.value,
_ref$displayOption = _ref.displayOption,
displayOption = _ref$displayOption === void 0 ? defaultDisplay : _ref$displayOption,
disabled = _ref.disabled;
var displayValue = displayOption(value);
return /*#__PURE__*/_react["default"].createElement("span", {
title: displayValue,
className: (0, _classnames["default"])(classList.listItemAnchor, {
disabled: disabled
})
}, displayValue);
};
var DropdownListWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n border-top: 1px solid\n ", ";\n ", ";\n"])), function (props) {
return props.$light ? props.theme.dropdownListBgdLT : props.theme.dropdownListBgd;
}, function (props) {
return props.$light ? props.theme.dropdownListBorderTopLT : props.theme.dropdownListBorderTop;
}, function (props) {
return props.$light ? props.theme.dropdownListLT : props.theme.dropdownList;
});
var DropdownFooterWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n height: '0px';\n"])));
// TODO: make Option a generic type
var DropdownList = exports["default"] = /*#__PURE__*/function (_Component) {
function DropdownList(props) {
var _this;
(0, _classCallCheck2["default"])(this, DropdownList);
_this = _callSuper(this, DropdownList, [props]);
(0, _defineProperty2["default"])(_this, "initNumberOfOptions", void 0);
(0, _defineProperty2["default"])(_this, "page", void 0);
(0, _defineProperty2["default"])(_this, "prevY", void 0);
(0, _defineProperty2["default"])(_this, "loadingRef", void 0);
(0, _defineProperty2["default"])(_this, "observer", void 0);
(0, _defineProperty2["default"])(_this, "handleObserver", function (entities) {
var y = entities[0].boundingClientRect.y;
if (_this.prevY > y) {
var options = _this._getOptions(_this.page);
if (options) _this.setState({
options: options
});
}
_this.prevY = y;
});
_this.state = {
options: []
};
_this.initNumberOfOptions = _constants.INIT_FILTER_ITEMS_IN_DROPDOWN;
_this.page = 0;
_this.prevY = 0;
_this.loadingRef = /*#__PURE__*/_react["default"].createRef();
return _this;
}
(0, _inherits2["default"])(DropdownList, _Component);
return (0, _createClass2["default"])(DropdownList, [{
key: "componentDidMount",
value: function componentDidMount() {
var options = this._getOptions(this.page);
this.setState({
options: options
});
var divOptions = {
root: null,
rootMargin: '0%',
threshold: 1.0
};
if (this.loadingRef.current) {
this.observer = new IntersectionObserver(this.handleObserver, divOptions);
this.observer.observe(this.loadingRef.current);
}
}
}, {
key: "getSnapshotBeforeUpdate",
value: function getSnapshotBeforeUpdate(prevProps) {
if (prevProps.options !== this.props.options) {
// check if user searching, reset state.options at the first time
var options = this._getOptions(0);
this.setState({
options: options
});
}
return null;
}
// prevent console warning: getSnapshotBeforeUpdate() should be used with componentDidUpdate().
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
return;
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
if (this.loadingRef.current) {
var _this$observer, _this$loadingRef;
(_this$observer = this.observer) === null || _this$observer === void 0 || _this$observer.unobserve((_this$loadingRef = this.loadingRef) === null || _this$loadingRef === void 0 ? void 0 : _this$loadingRef.current);
this.page = 0;
this.prevY = 0;
}
}
}, {
key: "_getOptions",
value: function _getOptions(page) {
if (!this.props.options) {
return [];
}
var n = this.props.options.length;
if (n === 0) {
return [];
}
var start = page * this.initNumberOfOptions;
var end = start + this.initNumberOfOptions > n ? n : start + this.initNumberOfOptions;
if (start < end && end <= n) {
this.page = page + 1;
// in case of user searching, props.options will be updated
// so "page" value will be set to 0 and previous state.options will be discarded
return [].concat((0, _toConsumableArray2["default"])(page > 0 ? this.state.options || [] : []), (0, _toConsumableArray2["default"])(this.props.options.slice(start, end)));
}
return null;
}
}, {
key: "_onClick",
value: function _onClick(result, event) {
event.preventDefault();
// only work when left is clicked
if (event.type === 'mousedown' && event.button === LEFT_BUTTON || event.type === 'click') {
var _this$props$onOptionS, _this$props;
(_this$props$onOptionS = (_this$props = this.props).onOptionSelected) === null || _this$props$onOptionS === void 0 || _this$props$onOptionS.call(_this$props, result, event);
}
}
}, {
key: "render",
value: function render() {
var _this$props$options,
_this$props$customCla,
_this$props$customCla2,
_this2 = this,
_this$state$options;
var _this$props2 = this.props,
fixedOptions = _this$props2.fixedOptions,
light = _this$props2.light,
_this$props2$allowCus = _this$props2.allowCustomValues,
allowCustomValues = _this$props2$allowCus === void 0 ? 0 : _this$props2$allowCus,
_this$props2$customLi = _this$props2.customListItemComponent,
CustomListItemComponent = _this$props2$customLi === void 0 ? ListItem : _this$props2$customLi;
var _this$props$displayOp = this.props.displayOption,
display = _this$props$displayOp === void 0 ? defaultDisplay : _this$props$displayOp;
// Don't render if there are no options to display
if (!((_this$props$options = this.props.options) !== null && _this$props$options !== void 0 && _this$props$options.length) && allowCustomValues <= 0) {
return /*#__PURE__*/_react["default"].createElement("div", null);
}
var valueOffset = Array.isArray(fixedOptions) ? fixedOptions.length : 0;
// For some reason onClick is not fired when clicked on an option
// onMouseDown is used here as a workaround of #205 and other
return /*#__PURE__*/_react["default"].createElement(DropdownListWrapper, {
className: (0, _classnames["default"])(classList.list, (_this$props$customCla = this.props.customClasses) === null || _this$props$customCla === void 0 ? void 0 : _this$props$customCla.results),
$light: light
}, this.props.customListHeaderComponent ? /*#__PURE__*/_react["default"].createElement("div", {
className: (0, _classnames["default"])(classList.listHeader, (_this$props$customCla2 = this.props.customClasses) === null || _this$props$customCla2 === void 0 ? void 0 : _this$props$customCla2.listHeader)
}, /*#__PURE__*/_react["default"].createElement(this.props.customListHeaderComponent, null)) : null, valueOffset > 0 ? /*#__PURE__*/_react["default"].createElement("div", {
className: classList.listSection
}, fixedOptions === null || fixedOptions === void 0 ? void 0 : fixedOptions.map(function (value, i) {
var _this2$props$customCl;
return /*#__PURE__*/_react["default"].createElement("div", {
className: (0, _classnames["default"])(classList.listItem, (0, _defineProperty2["default"])({
hover: _this2.props.selectionIndex === i
}, classList.listItemFixed, true), (_this2$props$customCl = _this2.props.customClasses) === null || _this2$props$customCl === void 0 ? void 0 : _this2$props$customCl.listItem),
key: "".concat(display(value), "_").concat(i),
onMouseDown: function onMouseDown(e) {
return _this2._onClick(value, e);
},
onClick: function onClick(e) {
return _this2._onClick(value, e);
}
}, /*#__PURE__*/_react["default"].createElement(CustomListItemComponent, {
value: value,
displayOption: display,
light: light
}));
})) : null, (_this$state$options = this.state.options) === null || _this$state$options === void 0 ? void 0 : _this$state$options.map(function (value, i) {
var _this2$props$customCl2;
return /*#__PURE__*/_react["default"].createElement("div", {
className: (0, _classnames["default"])(classList.listItem, {
hover: _this2.props.selectionIndex === i + valueOffset,
selected: (_this2.props.selectedItems || []).find(function (item) {
return display(item) === display(value);
})
}, (_this2$props$customCl2 = _this2.props.customClasses) === null || _this2$props$customCl2 === void 0 ? void 0 : _this2$props$customCl2.listItem),
key: "".concat(display(value), "_").concat(i),
onMouseDown: function onMouseDown(e) {
return _this2._onClick(value, e);
},
onClick: function onClick(e) {
return _this2._onClick(value, e);
}
}, /*#__PURE__*/_react["default"].createElement(CustomListItemComponent, {
value: value,
displayOption: display
}));
}), /*#__PURE__*/_react["default"].createElement(DropdownFooterWrapper, {
ref: this.loadingRef
}));
}
}]);
}(_react.Component);
(0, _defineProperty2["default"])(DropdownList, "defaultProps", {
customClasses: {},
customListItemComponent: ListItem,
customListHeaderComponent: null,
allowCustomValues: 0,
customValues: [],
displayOption: defaultDisplay,
onOptionSelected: function onOptionSelected() {
return;
},
defaultClassNames: true,
selectionIndex: null
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9jb25zdGFudHMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NhbGxTdXBlciIsIm8iLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJMRUZUX0JVVFRPTiIsImNsYXNzTGlzdCIsImV4cG9ydHMiLCJsaXN0IiwibGlzdEhlYWRlciIsImxpc3RTZWN0aW9uIiwibGlzdEl0ZW0iLCJsaXN0SXRlbUFuY2hvciIsImxpc3RJdGVtRml4ZWQiLCJkZWZhdWx0RGlzcGxheSIsImQiLCJMaXN0SXRlbSIsIl9yZWYiLCJ2YWx1ZSIsIl9yZWYkZGlzcGxheU9wdGlvbiIsImRpc3BsYXlPcHRpb24iLCJkaXNhYmxlZCIsImRpc3BsYXlWYWx1ZSIsImNyZWF0ZUVsZW1lbnQiLCJ0aXRsZSIsImNsYXNzTmFtZSIsImNsYXNzTmFtZXMiLCJEcm9wZG93bkxpc3RXcmFwcGVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsIiRsaWdodCIsInRoZW1lIiwiZHJvcGRvd25MaXN0QmdkTFQiLCJkcm9wZG93bkxpc3RCZ2QiLCJkcm9wZG93bkxpc3RCb3JkZXJUb3BMVCIsImRyb3Bkb3duTGlzdEJvcmRlclRvcCIsImRyb3Bkb3duTGlzdExUIiwiZHJvcGRvd25MaXN0IiwiRHJvcGRvd25Gb290ZXJXcmFwcGVyIiwiRHJvcGRvd25MaXN0IiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJlbnRpdGllcyIsInkiLCJib3VuZGluZ0NsaWVudFJlY3QiLCJwcmV2WSIsIm9wdGlvbnMiLCJfZ2V0T3B0aW9ucyIsInBhZ2UiLCJzZXRTdGF0ZSIsInN0YXRlIiwiaW5pdE51bWJlck9mT3B0aW9ucyIsIklOSVRfRklMVEVSX0lURU1TX0lOX0RST1BET1dOIiwibG9hZGluZ1JlZiIsIlJlYWN0IiwiY3JlYXRlUmVmIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJjb21wb25lbnREaWRNb3VudCIsImRpdk9wdGlvbnMiLCJyb290Iiwicm9vdE1hcmdpbiIsInRocmVzaG9sZCIsImN1cnJlbnQiLCJvYnNlcnZlciIsIkludGVyc2VjdGlvbk9ic2VydmVyIiwiaGFuZGxlT2JzZXJ2ZXIiLCJvYnNlcnZlIiwiZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUiLCJwcmV2UHJvcHMiLCJjb21wb25lbnREaWRVcGRhdGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsIl90aGlzJG9ic2VydmVyIiwiX3RoaXMkbG9hZGluZ1JlZiIsInVub2JzZXJ2ZSIsImxlbmd0aCIsInN0YXJ0IiwiZW5kIiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInNsaWNlIiwiX29uQ2xpY2siLCJyZXN1bHQiLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwidHlwZSIsImJ1dHRvbiIsIl90aGlzJHByb3BzJG9uT3B0aW9uUyIsIl90aGlzJHByb3BzIiwib25PcHRpb25TZWxlY3RlZCIsInJlbmRlciIsIl90aGlzJHByb3BzJG9wdGlvbnMiLCJfdGhpcyRwcm9wcyRjdXN0b21DbGEiLCJfdGhpcyRwcm9wcyRjdXN0b21DbGEyIiwiX3RoaXMyIiwiX3RoaXMkc3RhdGUkb3B0aW9ucyIsIl90aGlzJHByb3BzMiIsImZpeGVkT3B0aW9ucyIsImxpZ2h0IiwiX3RoaXMkcHJvcHMyJGFsbG93Q3VzIiwiYWxsb3dDdXN0b21WYWx1ZXMiLCJfdGhpcyRwcm9wczIkY3VzdG9tTGkiLCJjdXN0b21MaXN0SXRlbUNvbXBvbmVudCIsIkN1c3RvbUxpc3RJdGVtQ29tcG9uZW50IiwiX3RoaXMkcHJvcHMkZGlzcGxheU9wIiwiZGlzcGxheSIsInZhbHVlT2Zmc2V0IiwiQXJyYXkiLCJpc0FycmF5IiwiY3VzdG9tQ2xhc3NlcyIsInJlc3VsdHMiLCJjdXN0b21MaXN0SGVhZGVyQ29tcG9uZW50IiwibWFwIiwiX3RoaXMyJHByb3BzJGN1c3RvbUNsIiwiaG92ZXIiLCJzZWxlY3Rpb25JbmRleCIsIm9uTW91c2VEb3duIiwib25DbGljayIsIl90aGlzMiRwcm9wcyRjdXN0b21DbDIiLCJzZWxlY3RlZCIsInNlbGVjdGVkSXRlbXMiLCJmaW5kIiwiaXRlbSIsInJlZiIsIkNvbXBvbmVudCIsImN1c3RvbVZhbHVlcyIsImRlZmF1bHRDbGFzc05hbWVzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1vbi9pdGVtLXNlbGVjdG9yL2Ryb3Bkb3duLWxpc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgRWxlbWVudFR5cGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHN0eWxlZCwge0lTdHlsZWRDb21wb25lbnR9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7SU5JVF9GSUxURVJfSVRFTVNfSU5fRFJPUERPV059IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7QmFzZUNvbXBvbmVudFByb3BzfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmNvbnN0IExFRlRfQlVUVE9OID0gMDtcblxuZXhwb3J0IGNvbnN0IGNsYXNzTGlzdCA9IHtcbiAgbGlzdDogJ2xpc3Qtc2VsZWN0b3InLFxuICBsaXN0SGVhZGVyOiAnbGlzdF9faGVhZGVyJyxcbiAgbGlzdFNlY3Rpb246ICdsaXN0X19zZWN0aW9uJyxcbiAgbGlzdEl0ZW06ICdsaXN0X19pdGVtJyxcbiAgbGlzdEl0ZW1BbmNob3I6ICdsaXN0X19pdGVtX19hbmNob3InLFxuICBsaXN0SXRlbUZpeGVkOiAnbGlzdF9faXRlbV9fZml4ZWQnXG59O1xuXG5leHBvcnQgdHlwZSBMaXN0SXRlbVByb3BzPE9wdGlvbj4gPSB7XG4gIHZhbHVlOiBPcHRpb247XG4gIGRpc3BsYXlPcHRpb246IChvcHQ6IE9wdGlvbikgPT4gc3RyaW5nO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGxpZ2h0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IGRlZmF1bHREaXNwbGF5ID0gZCA9PiBkO1xuZXhwb3J0IGNvbnN0IExpc3RJdGVtID0gKHt2YWx1ZSwgZGlzcGxheU9wdGlvbiA9IGRlZmF1bHREaXNwbGF5LCBkaXNhYmxlZH06IExpc3RJdGVtUHJvcHM8YW55PikgPT4ge1xuICBjb25zdCBkaXNwbGF5VmFsdWUgPSBkaXNwbGF5T3B0aW9uKHZhbHVlKTtcbiAgcmV0dXJuIChcbiAgICA8c3BhbiB0aXRsZT17ZGlzcGxheVZhbHVlfSBjbGFzc05hbWU9e2NsYXNzTmFtZXMoY2xhc3NMaXN0Lmxpc3RJdGVtQW5jaG9yLCB7ZGlzYWJsZWR9KX0+XG4gICAgICB7ZGlzcGxheVZhbHVlfVxuICAgIDwvc3Bhbj5cbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIERyb3Bkb3duTGlzdFdyYXBwZXJQcm9wcyA9IEJhc2VDb21wb25lbnRQcm9wcyAmIHtcbiAgJGxpZ2h0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IERyb3Bkb3duTGlzdFdyYXBwZXI6IElTdHlsZWRDb21wb25lbnQ8XG4gICd3ZWInLFxuICBEcm9wZG93bkxpc3RXcmFwcGVyUHJvcHNcbj4gPSBzdHlsZWQuZGl2PERyb3Bkb3duTGlzdFdyYXBwZXJQcm9wcz5gXG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT5cbiAgICBwcm9wcy4kbGlnaHQgPyBwcm9wcy50aGVtZS5kcm9wZG93bkxpc3RCZ2RMVCA6IHByb3BzLnRoZW1lLmRyb3Bkb3duTGlzdEJnZH07XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZFxuICAgICR7cHJvcHMgPT5cbiAgICAgIHByb3BzLiRsaWdodCA/IHByb3BzLnRoZW1lLmRyb3Bkb3duTGlzdEJvcmRlclRvcExUIDogcHJvcHMudGhlbWUuZHJvcGRvd25MaXN0Qm9yZGVyVG9wfTtcbiAgJHtwcm9wcyA9PiAocHJvcHMuJGxpZ2h0ID8gcHJvcHMudGhlbWUuZHJvcGRvd25MaXN0TFQgOiBwcm9wcy50aGVtZS5kcm9wZG93bkxpc3QpfTtcbmA7XG5cbmNvbnN0IERyb3Bkb3duRm9vdGVyV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIGhlaWdodDogJzBweCc7XG5gO1xuXG50eXBlIE9wdGlvbiA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBvYmplY3QgfCBhbnk7XG4vLyBUT0RPOiBtYWtlIE9wdGlvbiBhIGdlbmVyaWMgdHlwZVxuaW50ZXJmYWNlIERyb3Bkb3duTGlzdFByb3BzIHtcbiAgb3B0aW9ucz86IE9wdGlvbltdO1xuICBhbGxvd0N1c3RvbVZhbHVlcz86IG51bWJlcjtcbiAgY3VzdG9tQ2xhc3Nlcz86IHtsaXN0SGVhZGVyPzogc3RyaW5nOyBsaXN0SXRlbT86IHN0cmluZzsgcmVzdWx0cz86IHN0cmluZ307XG4gIGN1c3RvbVZhbHVlcz86IGFueVtdO1xuICBjdXN0b21MaXN0SXRlbUNvbXBvbmVudD86IEVsZW1lbnRUeXBlO1xuICBjdXN0b21MaXN0SGVhZGVyQ29tcG9uZW50PzogRWxlbWVudFR5cGU7XG4gIHNlbGVjdGlvbkluZGV4PzogbnVtYmVyO1xuICBvbk9wdGlvblNlbGVjdGVkPzogKG9wdGlvbjogT3B0aW9uLCBldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgZGlzcGxheU9wdGlvbj86IChvcHRpb246IE9wdGlvbikgPT4gc3RyaW5nO1xuICBkZWZhdWx0Q2xhc3NOYW1lcz86IGJvb2xlYW47XG4gIGFyZVJlc3VsdHNUcnVuY2F0ZWQ/OiBib29sZWFuO1xuICByZXN1bHRzVHJ1bmNhdGVkTWVzc2FnZT86IHN0cmluZztcbiAgbGlzdEl0ZW1Db21wb25lbnQ/OiBFbGVtZW50VHlwZTtcbiAgbGlnaHQ/OiBib29sZWFuO1xuICBmaXhlZE9wdGlvbnM/OiBhbnlbXTtcbiAgc2VsZWN0ZWRJdGVtcz86IGFueVtdOyAvLyBQYXNzZWQgdGhyb3VnaCBieSBUeXBlYWhlYWRcbn1cblxuaW50ZXJmYWNlIERyb3Bkb3duTGlzdFN0YXRlIHtcbiAgb3B0aW9uczogQXJyYXk8YW55PiB8IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyb3Bkb3duTGlzdCBleHRlbmRzIENvbXBvbmVudDxEcm9wZG93bkxpc3RQcm9wcywgRHJvcGRvd25MaXN0U3RhdGU+IHtcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBjdXN0b21DbGFzc2VzOiB7fSxcbiAgICBjdXN0b21MaXN0SXRlbUNvbXBvbmVudDogTGlzdEl0ZW0sXG4gICAgY3VzdG9tTGlzdEhlYWRlckNvbXBvbmVudDogbnVsbCxcbiAgICBhbGxvd0N1c3RvbVZhbHVlczogMCxcbiAgICBjdXN0b21WYWx1ZXM6IFtdLFxuICAgIGRpc3BsYXlPcHRpb246IGRlZmF1bHREaXNwbGF5LFxuICAgIG9uT3B0aW9uU2VsZWN0ZWQ6ICgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9LFxuICAgIGRlZmF1bHRDbGFzc05hbWVzOiB0cnVlLFxuICAgIHNlbGVjdGlvbkluZGV4OiBudWxsXG4gIH07XG5cbiAgaW5pdE51bWJlck9mT3B0aW9uczogbnVtYmVyO1xuICBwYWdlOiBudW1iZXI7XG4gIHByZXZZOiBudW1iZXI7XG4gIGxvYWRpbmdSZWY6IFJlYWN0LlJlZk9iamVjdDxIVE1MRGl2RWxlbWVudD47XG4gIG9ic2VydmVyOiBJbnRlcnNlY3Rpb25PYnNlcnZlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7b3B0aW9uczogW119O1xuICAgIHRoaXMuaW5pdE51bWJlck9mT3B0aW9ucyA9IElOSVRfRklMVEVSX0lURU1TX0lOX0RST1BET1dOO1xuICAgIHRoaXMucGFnZSA9IDA7XG4gICAgdGhpcy5wcmV2WSA9IDA7XG4gICAgdGhpcy5sb2FkaW5nUmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0T3B0aW9ucyh0aGlzLnBhZ2UpO1xuICAgIHRoaXMuc2V0U3RhdGUoe29wdGlvbnN9KTtcblxuICAgIGNvbnN0IGRpdk9wdGlvbnMgPSB7XG4gICAgICByb290OiBudWxsLFxuICAgICAgcm9vdE1hcmdpbjogJzAlJyxcbiAgICAgIHRocmVzaG9sZDogMS4wXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmxvYWRpbmdSZWYuY3VycmVudCkge1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih0aGlzLmhhbmRsZU9ic2VydmVyLCBkaXZPcHRpb25zKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmxvYWRpbmdSZWYuY3VycmVudCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUocHJldlByb3BzOiBEcm9wZG93bkxpc3RQcm9wcykge1xuICAgIGlmIChwcmV2UHJvcHMub3B0aW9ucyAhPT0gdGhpcy5wcm9wcy5vcHRpb25zKSB7XG4gICAgICAvLyBjaGVjayBpZiB1c2VyIHNlYXJjaGluZywgcmVzZXQgc3RhdGUub3B0aW9ucyBhdCB0aGUgZmlyc3QgdGltZVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldE9wdGlvbnMoMCk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtvcHRpb25zfSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gcHJldmVudCBjb25zb2xlIHdhcm5pbmc6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjb21wb25lbnREaWRVcGRhdGUoKS5cbiAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdSZWYuY3VycmVudCkge1xuICAgICAgdGhpcy5vYnNlcnZlcj8udW5vYnNlcnZlKHRoaXMubG9hZGluZ1JlZj8uY3VycmVudCk7XG4gICAgICB0aGlzLnBhZ2UgPSAwO1xuICAgICAgdGhpcy5wcmV2WSA9IDA7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlT2JzZXJ2ZXIgPSBlbnRpdGllcyA9PiB7XG4gICAgY29uc3QgeSA9IGVudGl0aWVzWzBdLmJvdW5kaW5nQ2xpZW50UmVjdC55O1xuICAgIGlmICh0aGlzLnByZXZZID4geSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldE9wdGlvbnModGhpcy5wYWdlKTtcbiAgICAgIGlmIChvcHRpb25zKSB0aGlzLnNldFN0YXRlKHtvcHRpb25zfSk7XG4gICAgfVxuICAgIHRoaXMucHJldlkgPSB5O1xuICB9O1xuXG4gIF9nZXRPcHRpb25zKHBhZ2UpIHtcbiAgICBpZiAoIXRoaXMucHJvcHMub3B0aW9ucykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IG4gPSB0aGlzLnByb3BzLm9wdGlvbnMubGVuZ3RoO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gcGFnZSAqIHRoaXMuaW5pdE51bWJlck9mT3B0aW9ucztcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMuaW5pdE51bWJlck9mT3B0aW9ucyA+IG4gPyBuIDogc3RhcnQgKyB0aGlzLmluaXROdW1iZXJPZk9wdGlvbnM7XG5cbiAgICBpZiAoc3RhcnQgPCBlbmQgJiYgZW5kIDw9IG4pIHtcbiAgICAgIHRoaXMucGFnZSA9IHBhZ2UgKyAxO1xuICAgICAgLy8gaW4gY2FzZSBvZiB1c2VyIHNlYXJjaGluZywgcHJvcHMub3B0aW9ucyB3aWxsIGJlIHVwZGF0ZWRcbiAgICAgIC8vIHNvIFwicGFnZVwiIHZhbHVlIHdpbGwgYmUgc2V0IHRvIDAgYW5kIHByZXZpb3VzIHN0YXRlLm9wdGlvbnMgd2lsbCBiZSBkaXNjYXJkZWRcbiAgICAgIHJldHVybiBbXG4gICAgICAgIC4uLihwYWdlID4gMCA/IHRoaXMuc3RhdGUub3B0aW9ucyB8fCBbXSA6IFtdKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vcHRpb25zLnNsaWNlKHN0YXJ0LCBlbmQpXG4gICAgICBdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgX29uQ2xpY2socmVzdWx0LCBldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgLy8gb25seSB3b3JrIHdoZW4gbGVmdCBpcyBjbGlja2VkXG4gICAgaWYgKChldmVudC50eXBlID09PSAnbW91c2Vkb3duJyAmJiBldmVudC5idXR0b24gPT09IExFRlRfQlVUVE9OKSB8fCBldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICB0aGlzLnByb3BzLm9uT3B0aW9uU2VsZWN0ZWQ/LihyZXN1bHQsIGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgZml4ZWRPcHRpb25zLFxuICAgICAgbGlnaHQsXG4gICAgICBhbGxvd0N1c3RvbVZhbHVlcyA9IDAsXG4gICAgICBjdXN0b21MaXN0SXRlbUNvbXBvbmVudDogQ3VzdG9tTGlzdEl0ZW1Db21wb25lbnQgPSBMaXN0SXRlbVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtkaXNwbGF5T3B0aW9uOiBkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXl9ID0gdGhpcy5wcm9wcztcblxuICAgIC8vIERvbid0IHJlbmRlciBpZiB0aGVyZSBhcmUgbm8gb3B0aW9ucyB0byBkaXNwbGF5XG4gICAgaWYgKCF0aGlzLnByb3BzLm9wdGlvbnM/Lmxlbmd0aCAmJiBhbGxvd0N1c3RvbVZhbHVlcyA8PSAwKSB7XG4gICAgICByZXR1cm4gPGRpdiAvPjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZU9mZnNldCA9IEFycmF5LmlzQXJyYXkoZml4ZWRPcHRpb25zKSA/IGZpeGVkT3B0aW9ucy5sZW5ndGggOiAwO1xuXG4gICAgLy8gRm9yIHNvbWUgcmVhc29uIG9uQ2xpY2sgaXMgbm90IGZpcmVkIHdoZW4gY2xpY2tlZCBvbiBhbiBvcHRpb25cbiAgICAvLyBvbk1vdXNlRG93biBpcyB1c2VkIGhlcmUgYXMgYSB3b3JrYXJvdW5kIG9mICMyMDUgYW5kIG90aGVyXG4gICAgcmV0dXJuIChcbiAgICAgIDxEcm9wZG93bkxpc3RXcmFwcGVyXG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhjbGFzc0xpc3QubGlzdCwgdGhpcy5wcm9wcy5jdXN0b21DbGFzc2VzPy5yZXN1bHRzKX1cbiAgICAgICAgJGxpZ2h0PXtsaWdodH1cbiAgICAgID5cbiAgICAgICAge3RoaXMucHJvcHMuY3VzdG9tTGlzdEhlYWRlckNvbXBvbmVudCA/IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhjbGFzc0xpc3QubGlzdEhlYWRlciwgdGhpcy5wcm9wcy5jdXN0b21DbGFzc2VzPy5saXN0SGVhZGVyKX0+XG4gICAgICAgICAgICA8dGhpcy5wcm9wcy5jdXN0b21MaXN0SGVhZGVyQ29tcG9uZW50IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiBudWxsfVxuXG4gICAgICAgIHt2YWx1ZU9mZnNldCA+IDAgPyAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzTGlzdC5saXN0U2VjdGlvbn0+XG4gICAgICAgICAgICB7Zml4ZWRPcHRpb25zPy5tYXAoKHZhbHVlLCBpKSA9PiAoXG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXG4gICAgICAgICAgICAgICAgICBjbGFzc0xpc3QubGlzdEl0ZW0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGhvdmVyOiB0aGlzLnByb3BzLnNlbGVjdGlvbkluZGV4ID09PSBpLFxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NMaXN0Lmxpc3RJdGVtRml4ZWRdOiB0cnVlXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5jdXN0b21DbGFzc2VzPy5saXN0SXRlbVxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAga2V5PXtgJHtkaXNwbGF5KHZhbHVlKX1fJHtpfWB9XG4gICAgICAgICAgICAgICAgb25Nb3VzZURvd249e2UgPT4gdGhpcy5fb25DbGljayh2YWx1ZSwgZSl9XG4gICAgICAgICAgICAgICAgb25DbGljaz17ZSA9PiB0aGlzLl9vbkNsaWNrKHZhbHVlLCBlKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxDdXN0b21MaXN0SXRlbUNvbXBvbmVudCB2YWx1ZT17dmFsdWV9IGRpc3BsYXlPcHRpb249e2Rpc3BsYXl9IGxpZ2h0PXtsaWdodH0gLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IG51bGx9XG5cbiAgICAgICAge3RoaXMuc3RhdGUub3B0aW9ucz8ubWFwKCh2YWx1ZSwgaSkgPT4gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgICAgICAgY2xhc3NMaXN0Lmxpc3RJdGVtLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaG92ZXI6IHRoaXMucHJvcHMuc2VsZWN0aW9uSW5kZXggPT09IGkgKyB2YWx1ZU9mZnNldCxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogKHRoaXMucHJvcHMuc2VsZWN0ZWRJdGVtcyB8fCBbXSkuZmluZChcbiAgICAgICAgICAgICAgICAgIGl0ZW0gPT4gZGlzcGxheShpdGVtKSA9PT0gZGlzcGxheSh2YWx1ZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMucHJvcHMuY3VzdG9tQ2xhc3Nlcz8ubGlzdEl0ZW1cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBrZXk9e2Ake2Rpc3BsYXkodmFsdWUpfV8ke2l9YH1cbiAgICAgICAgICAgIG9uTW91c2VEb3duPXtlID0+IHRoaXMuX29uQ2xpY2sodmFsdWUsIGUpfVxuICAgICAgICAgICAgb25DbGljaz17ZSA9PiB0aGlzLl9vbkNsaWNrKHZhbHVlLCBlKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Q3VzdG9tTGlzdEl0ZW1Db21wb25lbnQgdmFsdWU9e3ZhbHVlfSBkaXNwbGF5T3B0aW9uPXtkaXNwbGF5fSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApKX1cblxuICAgICAgICA8RHJvcGRvd25Gb290ZXJXcmFwcGVyIHJlZj17dGhpcy5sb2FkaW5nUmVmfSAvPlxuICAgICAgPC9Ecm9wZG93bkxpc3RXcmFwcGVyPlxuICAgICk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMs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