UNPKG

kepler.gl

Version:

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

173 lines (171 loc) 28.8 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 _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _classnames3 = _interopRequireDefault(require("classnames")); var _sortable = require("@dnd-kit/sortable"); var _utilities = require("@dnd-kit/utilities"); var _layerPanel = _interopRequireDefault(require("./layer-panel")); var _utils = require("@kepler.gl/utils"); 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; } // make sure the element is always visible while is being dragged // item being dragged is appended in body, here to reset its global style var Container = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n gap: 8px;\n"]))); var SortableStyledItem = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n z-index: ", ";\n transition: ", ";\n transform: ", ";\n &.sorting {\n opacity: 0.3;\n pointer-events: none;\n }\n &.sorting-layers .layer-panel__header {\n background-color: ", ";\n font-family: ", ";\n font-weight: ", ";\n font-size: ", ";\n line-height: ", ";\n *,\n *:before,\n *:after {\n box-sizing: border-box;\n }\n .layer__drag-handle {\n opacity: 1;\n color: ", ";\n }\n }\n"])), function (props) { return props.theme.dropdownWrapperZ + 1; }, function (props) { return props.transition; }, function (props) { return props.transform; }, function (props) { return props.theme.panelBackgroundHover; }, function (props) { return props.theme.fontFamily; }, function (props) { return props.theme.fontWeight; }, function (props) { return props.theme.fontSize; }, function (props) { return props.theme.lineHeight; }, function (props) { return props.theme.textColorHl; }); var INITIAL_LAYERS_TO_SHOW = []; LayerListFactory.deps = [_layerPanel["default"]]; function LayerListFactory(LayerPanel) { // By wrapping layer panel using a sortable element we don't have to implement the drag and drop logic into the panel itself; // Developers can provide any layer panel implementation and it will still be sortable var SortableItem = function SortableItem(_ref) { var layer = _ref.layer, idx = _ref.idx, panelProps = _ref.panelProps, layerActions = _ref.layerActions, disabled = _ref.disabled; var _useSortable = (0, _sortable.useSortable)({ id: layer.id, data: { type: _constants.SORTABLE_LAYER_TYPE, parent: _constants.SORTABLE_SIDE_PANEL_TYPE }, disabled: disabled }), attributes = _useSortable.attributes, listeners = _useSortable.listeners, setNodeRef = _useSortable.setNodeRef, isDragging = _useSortable.isDragging, transform = _useSortable.transform, transition = _useSortable.transition; return /*#__PURE__*/_react["default"].createElement(SortableStyledItem, (0, _extends2["default"])({ ref: setNodeRef, className: (0, _classnames3["default"])((0, _defineProperty2["default"])({}, _constants.dataTestIds.sortableLayerItem, !disabled), (0, _defineProperty2["default"])({}, _constants.dataTestIds.staticLayerItem, disabled), { sorting: isDragging }), "data-testid": disabled ? _constants.dataTestIds.staticLayerItem : _constants.dataTestIds.sortableLayerItem, transform: _utilities.CSS.Transform.toString(transform), transition: transition }, attributes), /*#__PURE__*/_react["default"].createElement(LayerPanel, (0, _extends2["default"])({}, panelProps, layerActions, { key: layer.id, idx: idx, layer: layer, listeners: listeners, isDraggable: !disabled }))); }; var LayerList = function LayerList(props) { var layers = props.layers, datasets = props.datasets, layerOrder = props.layerOrder, uiStateActions = props.uiStateActions, visStateActions = props.visStateActions, mapStateActions = props.mapStateActions, layerClasses = props.layerClasses, _props$isSortable = props.isSortable, isSortable = _props$isSortable === void 0 ? true : _props$isSortable, splitMap = props.splitMap; var openModal = uiStateActions.toggleModal; var layersToShow = (0, _react.useMemo)(function () { return layerOrder.reduce(function (acc, layerId) { var layer = (0, _utils.findById)(layerId)(layers.filter(Boolean)); if (!layer) { return acc; } return !layer.config.hidden ? [].concat((0, _toConsumableArray2["default"])(acc), [layer]) : acc; }, INITIAL_LAYERS_TO_SHOW); }, [layers, layerOrder]); var sidePanelDndItems = (0, _react.useMemo)(function () { return layersToShow.map(function (_ref2) { var id = _ref2.id; return id; }); }, [layersToShow]); var layerTypeOptions = (0, _react.useMemo)(function () { return Object.keys(layerClasses).map(function (key) { var layer = new layerClasses[key]({ dataId: '' }); return { id: key, label: layer.name, icon: layer.layerIcon, requireData: layer.requireData }; }); }, [layerClasses]); var layerActions = (0, _react.useMemo)(function () { return { layerColorUIChange: visStateActions.layerColorUIChange, layerConfigChange: visStateActions.layerConfigChange, layerVisualChannelConfigChange: visStateActions.layerVisualChannelConfigChange, layerToggleVisibility: visStateActions.layerToggleVisibility, layerTypeChange: visStateActions.layerTypeChange, layerVisConfigChange: visStateActions.layerVisConfigChange, layerTextLabelChange: visStateActions.layerTextLabelChange, removeLayer: visStateActions.removeLayer, zoomToLayer: mapStateActions.fitBounds, duplicateLayer: visStateActions.duplicateLayer, layerSetIsValid: visStateActions.layerSetIsValid }; }, [visStateActions, mapStateActions]); var panelProps = (0, _react.useMemo)(function () { return { datasets: datasets, openModal: openModal, layerTypeOptions: layerTypeOptions, splitMap: splitMap }; }, [datasets, openModal, layerTypeOptions, splitMap]); return /*#__PURE__*/_react["default"].createElement(Container, null, /*#__PURE__*/_react["default"].createElement(_sortable.SortableContext, { id: _constants.SORTABLE_SIDE_PANEL_TYPE, items: sidePanelDndItems, strategy: _sortable.verticalListSortingStrategy, disabled: !isSortable }, layersToShow.map(function (layer) { return /*#__PURE__*/_react["default"].createElement(SortableItem, { key: layer.id, layer: layer, idx: layers.findIndex(function (l) { return (l === null || l === void 0 ? void 0 : l.id) === layer.id; }), panelProps: panelProps, layerActions: layerActions, disabled: !isSortable }); }))); }; return LayerList; } var _default = exports["default"] = LayerListFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lczMiLCJfc29ydGFibGUiLCJfdXRpbGl0aWVzIiwiX2xheWVyUGFuZWwiLCJfdXRpbHMiLCJfY29uc3RhbnRzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIkNvbnRhaW5lciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiU29ydGFibGVTdHlsZWRJdGVtIiwicHJvcHMiLCJ0aGVtZSIsImRyb3Bkb3duV3JhcHBlcloiLCJ0cmFuc2l0aW9uIiwidHJhbnNmb3JtIiwicGFuZWxCYWNrZ3JvdW5kSG92ZXIiLCJmb250RmFtaWx5IiwiZm9udFdlaWdodCIsImZvbnRTaXplIiwibGluZUhlaWdodCIsInRleHRDb2xvckhsIiwiSU5JVElBTF9MQVlFUlNfVE9fU0hPVyIsIkxheWVyTGlzdEZhY3RvcnkiLCJkZXBzIiwiTGF5ZXJQYW5lbEZhY3RvcnkiLCJMYXllclBhbmVsIiwiU29ydGFibGVJdGVtIiwiX3JlZiIsImxheWVyIiwiaWR4IiwicGFuZWxQcm9wcyIsImxheWVyQWN0aW9ucyIsImRpc2FibGVkIiwiX3VzZVNvcnRhYmxlIiwidXNlU29ydGFibGUiLCJpZCIsImRhdGEiLCJ0eXBlIiwiU09SVEFCTEVfTEFZRVJfVFlQRSIsInBhcmVudCIsIlNPUlRBQkxFX1NJREVfUEFORUxfVFlQRSIsImF0dHJpYnV0ZXMiLCJsaXN0ZW5lcnMiLCJzZXROb2RlUmVmIiwiaXNEcmFnZ2luZyIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJyZWYiLCJjbGFzc05hbWUiLCJjbGFzc25hbWVzIiwiX2RlZmluZVByb3BlcnR5MiIsImRhdGFUZXN0SWRzIiwic29ydGFibGVMYXllckl0ZW0iLCJzdGF0aWNMYXllckl0ZW0iLCJzb3J0aW5nIiwiQ1NTIiwiVHJhbnNmb3JtIiwidG9TdHJpbmciLCJrZXkiLCJpc0RyYWdnYWJsZSIsIkxheWVyTGlzdCIsImxheWVycyIsImRhdGFzZXRzIiwibGF5ZXJPcmRlciIsInVpU3RhdGVBY3Rpb25zIiwidmlzU3RhdGVBY3Rpb25zIiwibWFwU3RhdGVBY3Rpb25zIiwibGF5ZXJDbGFzc2VzIiwiX3Byb3BzJGlzU29ydGFibGUiLCJpc1NvcnRhYmxlIiwic3BsaXRNYXAiLCJvcGVuTW9kYWwiLCJ0b2dnbGVNb2RhbCIsImxheWVyc1RvU2hvdyIsInVzZU1lbW8iLCJyZWR1Y2UiLCJhY2MiLCJsYXllcklkIiwiZmluZEJ5SWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwiY29uZmlnIiwiaGlkZGVuIiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInNpZGVQYW5lbERuZEl0ZW1zIiwibWFwIiwiX3JlZjIiLCJsYXllclR5cGVPcHRpb25zIiwia2V5cyIsImRhdGFJZCIsImxhYmVsIiwibmFtZSIsImljb24iLCJsYXllckljb24iLCJyZXF1aXJlRGF0YSIsImxheWVyQ29sb3JVSUNoYW5nZSIsImxheWVyQ29uZmlnQ2hhbmdlIiwibGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlIiwibGF5ZXJUb2dnbGVWaXNpYmlsaXR5IiwibGF5ZXJUeXBlQ2hhbmdlIiwibGF5ZXJWaXNDb25maWdDaGFuZ2UiLCJsYXllclRleHRMYWJlbENoYW5nZSIsInJlbW92ZUxheWVyIiwiem9vbVRvTGF5ZXIiLCJmaXRCb3VuZHMiLCJkdXBsaWNhdGVMYXllciIsImxheWVyU2V0SXNWYWxpZCIsIlNvcnRhYmxlQ29udGV4dCIsIml0ZW1zIiwic3RyYXRlZ3kiLCJ2ZXJ0aWNhbExpc3RTb3J0aW5nU3RyYXRlZ3kiLCJmaW5kSW5kZXgiLCJsIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvbGF5ZXItbGlzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlTWVtb30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IHtMYXllciwgTGF5ZXJDbGFzc2VzVHlwZX0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtEYXRhc2V0c30gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge1VJU3RhdGVBY3Rpb25zLCBWaXNTdGF0ZUFjdGlvbnMsIE1hcFN0YXRlQWN0aW9uc30gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcblxuaW1wb3J0IHt1c2VTb3J0YWJsZSwgU29ydGFibGVDb250ZXh0LCB2ZXJ0aWNhbExpc3RTb3J0aW5nU3RyYXRlZ3l9IGZyb20gJ0BkbmQta2l0L3NvcnRhYmxlJztcbmltcG9ydCB7Q1NTfSBmcm9tICdAZG5kLWtpdC91dGlsaXRpZXMnO1xuaW1wb3J0IExheWVyUGFuZWxGYWN0b3J5IGZyb20gJy4vbGF5ZXItcGFuZWwnO1xuaW1wb3J0IHtmaW5kQnlJZH0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2RhdGFUZXN0SWRzLCBTT1JUQUJMRV9MQVlFUl9UWVBFLCBTT1JUQUJMRV9TSURFX1BBTkVMX1RZUEV9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7U3BsaXRNYXB9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBMYXllckxpc3RQcm9wcyA9IHtcbiAgZGF0YXNldHM6IERhdGFzZXRzO1xuICBsYXllcnM6IExheWVyW107XG4gIGxheWVyT3JkZXI6IHN0cmluZ1tdO1xuICBsYXllckNsYXNzZXM6IExheWVyQ2xhc3Nlc1R5cGU7XG4gIGlzU29ydGFibGU/OiBib29sZWFuO1xuICBzcGxpdE1hcD86IFNwbGl0TWFwO1xuICB1aVN0YXRlQWN0aW9uczogdHlwZW9mIFVJU3RhdGVBY3Rpb25zO1xuICB2aXNTdGF0ZUFjdGlvbnM6IHR5cGVvZiBWaXNTdGF0ZUFjdGlvbnM7XG4gIG1hcFN0YXRlQWN0aW9uczogdHlwZW9mIE1hcFN0YXRlQWN0aW9ucztcbn07XG5cbmV4cG9ydCB0eXBlIExheWVyTGlzdEZhY3RvcnlEZXBzID0gW3R5cGVvZiBMYXllclBhbmVsRmFjdG9yeV07XG5cbi8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBhbHdheXMgdmlzaWJsZSB3aGlsZSBpcyBiZWluZyBkcmFnZ2VkXG4vLyBpdGVtIGJlaW5nIGRyYWdnZWQgaXMgYXBwZW5kZWQgaW4gYm9keSwgaGVyZSB0byByZXNldCBpdHMgZ2xvYmFsIHN0eWxlXG5cbmNvbnN0IENvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogOHB4O1xuYDtcblxuaW50ZXJmYWNlIFNvcnRhYmxlU3R5bGVkSXRlbVByb3BzIHtcbiAgdHJhbnNpdGlvbj86IHN0cmluZztcbiAgdHJhbnNmb3JtPzogc3RyaW5nO1xufVxuXG5jb25zdCBTb3J0YWJsZVN0eWxlZEl0ZW0gPSBzdHlsZWQuZGl2PFNvcnRhYmxlU3R5bGVkSXRlbVByb3BzPmBcbiAgei1pbmRleDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5kcm9wZG93bldyYXBwZXJaICsgMX07XG4gIHRyYW5zaXRpb246ICR7cHJvcHMgPT4gcHJvcHMudHJhbnNpdGlvbn07XG4gIHRyYW5zZm9ybTogJHtwcm9wcyA9PiBwcm9wcy50cmFuc2Zvcm19O1xuICAmLnNvcnRpbmcge1xuICAgIG9wYWNpdHk6IDAuMztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuICAmLnNvcnRpbmctbGF5ZXJzIC5sYXllci1wYW5lbF9faGVhZGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZEhvdmVyfTtcbiAgICBmb250LWZhbWlseTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5mb250RmFtaWx5fTtcbiAgICBmb250LXdlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5mb250V2VpZ2h0fTtcbiAgICBmb250LXNpemU6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZm9udFNpemV9O1xuICAgIGxpbmUtaGVpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxpbmVIZWlnaHR9O1xuICAgICosXG4gICAgKjpiZWZvcmUsXG4gICAgKjphZnRlciB7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAubGF5ZXJfX2RyYWctaGFuZGxlIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG4gICAgfVxuICB9XG5gO1xuXG5jb25zdCBJTklUSUFMX0xBWUVSU19UT19TSE9XOiBMYXllcltdID0gW107XG5cbkxheWVyTGlzdEZhY3RvcnkuZGVwcyA9IFtMYXllclBhbmVsRmFjdG9yeV07XG5cbmZ1bmN0aW9uIExheWVyTGlzdEZhY3RvcnkoTGF5ZXJQYW5lbDogUmV0dXJuVHlwZTx0eXBlb2YgTGF5ZXJQYW5lbEZhY3Rvcnk+KSB7XG4gIC8vIEJ5IHdyYXBwaW5nIGxheWVyIHBhbmVsIHVzaW5nIGEgc29ydGFibGUgZWxlbWVudCB3ZSBkb24ndCBoYXZlIHRvIGltcGxlbWVudCB0aGUgZHJhZyBhbmQgZHJvcCBsb2dpYyBpbnRvIHRoZSBwYW5lbCBpdHNlbGY7XG4gIC8vIERldmVsb3BlcnMgY2FuIHByb3ZpZGUgYW55IGxheWVyIHBhbmVsIGltcGxlbWVudGF0aW9uIGFuZCBpdCB3aWxsIHN0aWxsIGJlIHNvcnRhYmxlXG4gIGNvbnN0IFNvcnRhYmxlSXRlbSA9ICh7bGF5ZXIsIGlkeCwgcGFuZWxQcm9wcywgbGF5ZXJBY3Rpb25zLCBkaXNhYmxlZH0pID0+IHtcbiAgICBjb25zdCB7YXR0cmlidXRlcywgbGlzdGVuZXJzLCBzZXROb2RlUmVmLCBpc0RyYWdnaW5nLCB0cmFuc2Zvcm0sIHRyYW5zaXRpb259ID0gdXNlU29ydGFibGUoe1xuICAgICAgaWQ6IGxheWVyLmlkLFxuICAgICAgZGF0YToge1xuICAgICAgICB0eXBlOiBTT1JUQUJMRV9MQVlFUl9UWVBFLFxuICAgICAgICBwYXJlbnQ6IFNPUlRBQkxFX1NJREVfUEFORUxfVFlQRVxuICAgICAgfSxcbiAgICAgIGRpc2FibGVkXG4gICAgfSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFNvcnRhYmxlU3R5bGVkSXRlbVxuICAgICAgICByZWY9e3NldE5vZGVSZWZ9XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcyhcbiAgICAgICAgICB7W2RhdGFUZXN0SWRzLnNvcnRhYmxlTGF5ZXJJdGVtXTogIWRpc2FibGVkfSxcbiAgICAgICAgICB7W2RhdGFUZXN0SWRzLnN0YXRpY0xheWVySXRlbV06IGRpc2FibGVkfSxcbiAgICAgICAgICB7c29ydGluZzogaXNEcmFnZ2luZ31cbiAgICAgICAgKX1cbiAgICAgICAgZGF0YS10ZXN0aWQ9e2Rpc2FibGVkID8gZGF0YVRlc3RJZHMuc3RhdGljTGF5ZXJJdGVtIDogZGF0YVRlc3RJZHMuc29ydGFibGVMYXllckl0ZW19XG4gICAgICAgIHRyYW5zZm9ybT17Q1NTLlRyYW5zZm9ybS50b1N0cmluZyh0cmFuc2Zvcm0pfVxuICAgICAgICB0cmFuc2l0aW9uPXt0cmFuc2l0aW9ufVxuICAgICAgICB7Li4uYXR0cmlidXRlc31cbiAgICAgID5cbiAgICAgICAgPExheWVyUGFuZWxcbiAgICAgICAgICB7Li4ucGFuZWxQcm9wc31cbiAgICAgICAgICB7Li4ubGF5ZXJBY3Rpb25zfVxuICAgICAgICAgIGtleT17bGF5ZXIuaWR9XG4gICAgICAgICAgaWR4PXtpZHh9XG4gICAgICAgICAgbGF5ZXI9e2xheWVyfVxuICAgICAgICAgIGxpc3RlbmVycz17bGlzdGVuZXJzfVxuICAgICAgICAgIGlzRHJhZ2dhYmxlPXshZGlzYWJsZWR9XG4gICAgICAgIC8+XG4gICAgICA8L1NvcnRhYmxlU3R5bGVkSXRlbT5cbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IExheWVyTGlzdDogUmVhY3QuRkM8TGF5ZXJMaXN0UHJvcHM+ID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGxheWVycyxcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGF5ZXJPcmRlcixcbiAgICAgIHVpU3RhdGVBY3Rpb25zLFxuICAgICAgdmlzU3RhdGVBY3Rpb25zLFxuICAgICAgbWFwU3RhdGVBY3Rpb25zLFxuICAgICAgbGF5ZXJDbGFzc2VzLFxuICAgICAgaXNTb3J0YWJsZSA9IHRydWUsXG4gICAgICBzcGxpdE1hcFxuICAgIH0gPSBwcm9wcztcbiAgICBjb25zdCB7dG9nZ2xlTW9kYWw6IG9wZW5Nb2RhbH0gPSB1aVN0YXRlQWN0aW9ucztcblxuICAgIGNvbnN0IGxheWVyc1RvU2hvdyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgcmV0dXJuIGxheWVyT3JkZXIucmVkdWNlKChhY2MsIGxheWVySWQpID0+IHtcbiAgICAgICAgY29uc3QgbGF5ZXIgPSBmaW5kQnlJZChsYXllcklkKShsYXllcnMuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFsYXllci5jb25maWcuaGlkZGVuID8gWy4uLmFjYywgbGF5ZXJdIDogYWNjO1xuICAgICAgfSwgSU5JVElBTF9MQVlFUlNfVE9fU0hPVyk7XG4gICAgfSwgW2xheWVycywgbGF5ZXJPcmRlcl0pO1xuXG4gICAgY29uc3Qgc2lkZVBhbmVsRG5kSXRlbXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIHJldHVybiBsYXllcnNUb1Nob3cubWFwKCh7aWR9KSA9PiBpZCk7XG4gICAgfSwgW2xheWVyc1RvU2hvd10pO1xuXG4gICAgY29uc3QgbGF5ZXJUeXBlT3B0aW9ucyA9IHVzZU1lbW8oXG4gICAgICAoKSA9PlxuICAgICAgICBPYmplY3Qua2V5cyhsYXllckNsYXNzZXMpLm1hcChrZXkgPT4ge1xuICAgICAgICAgIGNvbnN0IGxheWVyID0gbmV3IGxheWVyQ2xhc3Nlc1trZXldKHtkYXRhSWQ6ICcnfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBrZXksXG4gICAgICAgICAgICBsYWJlbDogbGF5ZXIubmFtZSxcbiAgICAgICAgICAgIGljb246IGxheWVyLmxheWVySWNvbixcbiAgICAgICAgICAgIHJlcXVpcmVEYXRhOiBsYXllci5yZXF1aXJlRGF0YVxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgW2xheWVyQ2xhc3Nlc11cbiAgICApO1xuXG4gICAgY29uc3QgbGF5ZXJBY3Rpb25zID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIGxheWVyQ29sb3JVSUNoYW5nZTogdmlzU3RhdGVBY3Rpb25zLmxheWVyQ29sb3JVSUNoYW5nZSxcbiAgICAgICAgbGF5ZXJDb25maWdDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy5sYXllckNvbmZpZ0NoYW5nZSxcbiAgICAgICAgbGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlOiB2aXNTdGF0ZUFjdGlvbnMubGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlLFxuICAgICAgICBsYXllclRvZ2dsZVZpc2liaWxpdHk6IHZpc1N0YXRlQWN0aW9ucy5sYXllclRvZ2dsZVZpc2liaWxpdHksXG4gICAgICAgIGxheWVyVHlwZUNoYW5nZTogdmlzU3RhdGVBY3Rpb25zLmxheWVyVHlwZUNoYW5nZSxcbiAgICAgICAgbGF5ZXJWaXNDb25maWdDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy5sYXllclZpc0NvbmZpZ0NoYW5nZSxcbiAgICAgICAgbGF5ZXJUZXh0TGFiZWxDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy5sYXllclRleHRMYWJlbENoYW5nZSxcbiAgICAgICAgcmVtb3ZlTGF5ZXI6IHZpc1N0YXRlQWN0aW9ucy5yZW1vdmVMYXllcixcbiAgICAgICAgem9vbVRvTGF5ZXI6IG1hcFN0YXRlQWN0aW9ucy5maXRCb3VuZHMsXG4gICAgICAgIGR1cGxpY2F0ZUxheWVyOiB2aXNTdGF0ZUFjdGlvbnMuZHVwbGljYXRlTGF5ZXIsXG4gICAgICAgIGxheWVyU2V0SXNWYWxpZDogdmlzU3RhdGVBY3Rpb25zLmxheWVyU2V0SXNWYWxpZFxuICAgICAgfSksXG4gICAgICBbdmlzU3RhdGVBY3Rpb25zLCBtYXBTdGF0ZUFjdGlvbnNdXG4gICAgKTtcblxuICAgIGNvbnN0IHBhbmVsUHJvcHMgPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgZGF0YXNldHMsXG4gICAgICAgIG9wZW5Nb2RhbCxcbiAgICAgICAgbGF5ZXJUeXBlT3B0aW9ucyxcbiAgICAgICAgc3BsaXRNYXBcbiAgICAgIH0pLFxuICAgICAgW2RhdGFzZXRzLCBvcGVuTW9kYWwsIGxheWVyVHlwZU9wdGlvbnMsIHNwbGl0TWFwXVxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPENvbnRhaW5lcj5cbiAgICAgICAgPFNvcnRhYmxlQ29udGV4dFxuICAgICAgICAgIGlkPXtTT1JUQUJMRV9TSURFX1BBTkVMX1RZUEV9XG4gICAgICAgICAgaXRlbXM9e3NpZGVQYW5lbERuZEl0ZW1zfVxuICAgICAgICAgIHN0cmF0ZWd5PXt2ZXJ0aWNhbExpc3RTb3J0aW5nU3RyYXRlZ3l9XG4gICAgICAgICAgZGlzYWJsZWQ9eyFpc1NvcnRhYmxlfVxuICAgICAgICA+XG4gICAgICAgICAgey8qIHdhcm5pbmc6IGNvbnRhaW5lcklkIHNob3VsZCBiZSBzaW1pbGFyIHRvIHRoZSBmaXJzdCBrZXkgaW4gZG5kSXRlbXMgZGVmaW5lZCBpbiBrZXBsZXItZ2wuanMqL31cbiAgICAgICAgICB7bGF5ZXJzVG9TaG93Lm1hcChsYXllciA9PiAoXG4gICAgICAgICAgICA8U29ydGFibGVJdGVtXG4gICAgICAgICAgICAgIGtleT17bGF5ZXIuaWR9XG4gICAgICAgICAgICAgIGxheWVyPXtsYXllcn1cbiAgICAgICAgICAgICAgaWR4PXtsYXllcnMuZmluZEluZGV4KGwgPT4gbD8uaWQgPT09IGxheWVyLmlkKX1cbiAgICAgICAgICAgICAgcGFuZWxQcm9wcz17cGFuZWxQcm9wc31cbiAgICAgICAgICAgICAgbGF5ZXJBY3Rpb25zPXtsYXllckFjdGlvbnN9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXshaXNTb3J0YWJsZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvU29ydGFibGVDb250ZXh0PlxuICAgICAgPC9Db250YWluZXI+XG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIExheWVyTGlzdDtcbn1cbmV4cG9ydCBkZWZhdWx0IExheWVyTGlzdEZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxZQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFNQSxJQUFBSSxTQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxVQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxXQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFQ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