UNPKG

kepler.gl

Version:

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

172 lines (170 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 _dndLayerItems = require("../../common/dnd-layer-items"); 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 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.$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: _dndLayerItems.SORTABLE_LAYER_TYPE, parent: _dndLayerItems.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: _dndLayerItems.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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lczMiLCJfc29ydGFibGUiLCJfdXRpbGl0aWVzIiwiX2xheWVyUGFuZWwiLCJfdXRpbHMiLCJfY29uc3RhbnRzIiwiX2RuZExheWVySXRlbXMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiQ29udGFpbmVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJTb3J0YWJsZVN0eWxlZEl0ZW0iLCJwcm9wcyIsIiR0cmFuc2l0aW9uIiwiJHRyYW5zZm9ybSIsInRoZW1lIiwicGFuZWxCYWNrZ3JvdW5kSG92ZXIiLCJmb250RmFtaWx5IiwiZm9udFdlaWdodCIsImZvbnRTaXplIiwibGluZUhlaWdodCIsInRleHRDb2xvckhsIiwiSU5JVElBTF9MQVlFUlNfVE9fU0hPVyIsIkxheWVyTGlzdEZhY3RvcnkiLCJkZXBzIiwiTGF5ZXJQYW5lbEZhY3RvcnkiLCJMYXllclBhbmVsIiwiU29ydGFibGVJdGVtIiwiX3JlZiIsImxheWVyIiwiaWR4IiwicGFuZWxQcm9wcyIsImxheWVyQWN0aW9ucyIsImRpc2FibGVkIiwiX3VzZVNvcnRhYmxlIiwidXNlU29ydGFibGUiLCJpZCIsImRhdGEiLCJ0eXBlIiwiU09SVEFCTEVfTEFZRVJfVFlQRSIsInBhcmVudCIsIlNPUlRBQkxFX1NJREVfUEFORUxfVFlQRSIsImF0dHJpYnV0ZXMiLCJsaXN0ZW5lcnMiLCJzZXROb2RlUmVmIiwiaXNEcmFnZ2luZyIsInRyYW5zZm9ybSIsInRyYW5zaXRpb24iLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwicmVmIiwiY2xhc3NOYW1lIiwiY2xhc3NuYW1lcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkYXRhVGVzdElkcyIsInNvcnRhYmxlTGF5ZXJJdGVtIiwic3RhdGljTGF5ZXJJdGVtIiwic29ydGluZyIsIkNTUyIsIlRyYW5zZm9ybSIsInRvU3RyaW5nIiwia2V5IiwiaXNEcmFnZ2FibGUiLCJMYXllckxpc3QiLCJsYXllcnMiLCJkYXRhc2V0cyIsImxheWVyT3JkZXIiLCJ1aVN0YXRlQWN0aW9ucyIsInZpc1N0YXRlQWN0aW9ucyIsIm1hcFN0YXRlQWN0aW9ucyIsImxheWVyQ2xhc3NlcyIsIl9wcm9wcyRpc1NvcnRhYmxlIiwiaXNTb3J0YWJsZSIsInNwbGl0TWFwIiwib3Blbk1vZGFsIiwidG9nZ2xlTW9kYWwiLCJsYXllcnNUb1Nob3ciLCJ1c2VNZW1vIiwicmVkdWNlIiwiYWNjIiwibGF5ZXJJZCIsImZpbmRCeUlkIiwiZmlsdGVyIiwiQm9vbGVhbiIsImNvbmZpZyIsImhpZGRlbiIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJzaWRlUGFuZWxEbmRJdGVtcyIsIm1hcCIsIl9yZWYyIiwibGF5ZXJUeXBlT3B0aW9ucyIsImtleXMiLCJkYXRhSWQiLCJsYWJlbCIsIm5hbWUiLCJpY29uIiwibGF5ZXJJY29uIiwicmVxdWlyZURhdGEiLCJsYXllckNvbG9yVUlDaGFuZ2UiLCJsYXllckNvbmZpZ0NoYW5nZSIsImxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSIsImxheWVyVG9nZ2xlVmlzaWJpbGl0eSIsImxheWVyVHlwZUNoYW5nZSIsImxheWVyVmlzQ29uZmlnQ2hhbmdlIiwibGF5ZXJUZXh0TGFiZWxDaGFuZ2UiLCJyZW1vdmVMYXllciIsInpvb21Ub0xheWVyIiwiZml0Qm91bmRzIiwiZHVwbGljYXRlTGF5ZXIiLCJsYXllclNldElzVmFsaWQiLCJTb3J0YWJsZUNvbnRleHQiLCJpdGVtcyIsInN0cmF0ZWd5IiwidmVydGljYWxMaXN0U29ydGluZ1N0cmF0ZWd5IiwiZmluZEluZGV4IiwibCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zaWRlLXBhbmVsL2xheWVyLXBhbmVsL2xheWVyLWxpc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZU1lbW99IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCB7TGF5ZXIsIExheWVyQ2xhc3Nlc1R5cGV9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7RGF0YXNldHN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtVSVN0YXRlQWN0aW9ucywgVmlzU3RhdGVBY3Rpb25zLCBNYXBTdGF0ZUFjdGlvbnN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5cbmltcG9ydCB7dXNlU29ydGFibGUsIFNvcnRhYmxlQ29udGV4dCwgdmVydGljYWxMaXN0U29ydGluZ1N0cmF0ZWd5fSBmcm9tICdAZG5kLWtpdC9zb3J0YWJsZSc7XG5pbXBvcnQge0NTU30gZnJvbSAnQGRuZC1raXQvdXRpbGl0aWVzJztcbmltcG9ydCBMYXllclBhbmVsRmFjdG9yeSBmcm9tICcuL2xheWVyLXBhbmVsJztcbmltcG9ydCB7ZmluZEJ5SWR9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtkYXRhVGVzdElkc30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtTcGxpdE1hcH0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1NPUlRBQkxFX0xBWUVSX1RZUEUsIFNPUlRBQkxFX1NJREVfUEFORUxfVFlQRX0gZnJvbSAnLi4vLi4vY29tbW9uL2RuZC1sYXllci1pdGVtcyc7XG5cbmV4cG9ydCB0eXBlIExheWVyTGlzdFByb3BzID0ge1xuICBkYXRhc2V0czogRGF0YXNldHM7XG4gIGxheWVyczogTGF5ZXJbXTtcbiAgbGF5ZXJPcmRlcjogc3RyaW5nW107XG4gIGxheWVyQ2xhc3NlczogTGF5ZXJDbGFzc2VzVHlwZTtcbiAgaXNTb3J0YWJsZT86IGJvb2xlYW47XG4gIHNwbGl0TWFwPzogU3BsaXRNYXA7XG4gIHVpU3RhdGVBY3Rpb25zOiB0eXBlb2YgVUlTdGF0ZUFjdGlvbnM7XG4gIHZpc1N0YXRlQWN0aW9uczogdHlwZW9mIFZpc1N0YXRlQWN0aW9ucztcbiAgbWFwU3RhdGVBY3Rpb25zOiB0eXBlb2YgTWFwU3RhdGVBY3Rpb25zO1xufTtcblxuZXhwb3J0IHR5cGUgTGF5ZXJMaXN0RmFjdG9yeURlcHMgPSBbdHlwZW9mIExheWVyUGFuZWxGYWN0b3J5XTtcblxuLy8gbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIGFsd2F5cyB2aXNpYmxlIHdoaWxlIGlzIGJlaW5nIGRyYWdnZWRcbi8vIGl0ZW0gYmVpbmcgZHJhZ2dlZCBpcyBhcHBlbmRlZCBpbiBib2R5LCBoZXJlIHRvIHJlc2V0IGl0cyBnbG9iYWwgc3R5bGVcblxuY29uc3QgQ29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiA4cHg7XG5gO1xuXG5pbnRlcmZhY2UgU29ydGFibGVTdHlsZWRJdGVtUHJvcHMge1xuICAkdHJhbnNpdGlvbj86IHN0cmluZztcbiAgJHRyYW5zZm9ybT86IHN0cmluZztcbn1cblxuY29uc3QgU29ydGFibGVTdHlsZWRJdGVtID0gc3R5bGVkLmRpdjxTb3J0YWJsZVN0eWxlZEl0ZW1Qcm9wcz5gXG4gIHRyYW5zaXRpb246ICR7cHJvcHMgPT4gcHJvcHMuJHRyYW5zaXRpb259O1xuICB0cmFuc2Zvcm06ICR7cHJvcHMgPT4gcHJvcHMuJHRyYW5zZm9ybX07XG4gICYuc29ydGluZyB7XG4gICAgb3BhY2l0eTogMC4zO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB9XG4gICYuc29ydGluZy1sYXllcnMgLmxheWVyLXBhbmVsX19oZWFkZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kSG92ZXJ9O1xuICAgIGZvbnQtZmFtaWx5OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmZvbnRGYW1pbHl9O1xuICAgIGZvbnQtd2VpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmZvbnRXZWlnaHR9O1xuICAgIGZvbnQtc2l6ZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5mb250U2l6ZX07XG4gICAgbGluZS1oZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubGluZUhlaWdodH07XG4gICAgKixcbiAgICAqOmJlZm9yZSxcbiAgICAqOmFmdGVyIHtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5sYXllcl9fZHJhZy1oYW5kbGUge1xuICAgICAgb3BhY2l0eTogMTtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IElOSVRJQUxfTEFZRVJTX1RPX1NIT1c6IExheWVyW10gPSBbXTtcblxuTGF5ZXJMaXN0RmFjdG9yeS5kZXBzID0gW0xheWVyUGFuZWxGYWN0b3J5XTtcblxuZnVuY3Rpb24gTGF5ZXJMaXN0RmFjdG9yeShMYXllclBhbmVsOiBSZXR1cm5UeXBlPHR5cGVvZiBMYXllclBhbmVsRmFjdG9yeT4pIHtcbiAgLy8gQnkgd3JhcHBpbmcgbGF5ZXIgcGFuZWwgdXNpbmcgYSBzb3J0YWJsZSBlbGVtZW50IHdlIGRvbid0IGhhdmUgdG8gaW1wbGVtZW50IHRoZSBkcmFnIGFuZCBkcm9wIGxvZ2ljIGludG8gdGhlIHBhbmVsIGl0c2VsZjtcbiAgLy8gRGV2ZWxvcGVycyBjYW4gcHJvdmlkZSBhbnkgbGF5ZXIgcGFuZWwgaW1wbGVtZW50YXRpb24gYW5kIGl0IHdpbGwgc3RpbGwgYmUgc29ydGFibGVcbiAgY29uc3QgU29ydGFibGVJdGVtID0gKHtsYXllciwgaWR4LCBwYW5lbFByb3BzLCBsYXllckFjdGlvbnMsIGRpc2FibGVkfSkgPT4ge1xuICAgIGNvbnN0IHthdHRyaWJ1dGVzLCBsaXN0ZW5lcnMsIHNldE5vZGVSZWYsIGlzRHJhZ2dpbmcsIHRyYW5zZm9ybSwgdHJhbnNpdGlvbn0gPSB1c2VTb3J0YWJsZSh7XG4gICAgICBpZDogbGF5ZXIuaWQsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHR5cGU6IFNPUlRBQkxFX0xBWUVSX1RZUEUsXG4gICAgICAgIHBhcmVudDogU09SVEFCTEVfU0lERV9QQU5FTF9UWVBFXG4gICAgICB9LFxuICAgICAgZGlzYWJsZWRcbiAgICB9KTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U29ydGFibGVTdHlsZWRJdGVtXG4gICAgICAgIHJlZj17c2V0Tm9kZVJlZn1cbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKFxuICAgICAgICAgIHtbZGF0YVRlc3RJZHMuc29ydGFibGVMYXllckl0ZW1dOiAhZGlzYWJsZWR9LFxuICAgICAgICAgIHtbZGF0YVRlc3RJZHMuc3RhdGljTGF5ZXJJdGVtXTogZGlzYWJsZWR9LFxuICAgICAgICAgIHtzb3J0aW5nOiBpc0RyYWdnaW5nfVxuICAgICAgICApfVxuICAgICAgICBkYXRhLXRlc3RpZD17ZGlzYWJsZWQgPyBkYXRhVGVzdElkcy5zdGF0aWNMYXllckl0ZW0gOiBkYXRhVGVzdElkcy5zb3J0YWJsZUxheWVySXRlbX1cbiAgICAgICAgJHRyYW5zZm9ybT17Q1NTLlRyYW5zZm9ybS50b1N0cmluZyh0cmFuc2Zvcm0pfVxuICAgICAgICAkdHJhbnNpdGlvbj17dHJhbnNpdGlvbn1cbiAgICAgICAgey4uLmF0dHJpYnV0ZXN9XG4gICAgICA+XG4gICAgICAgIDxMYXllclBhbmVsXG4gICAgICAgICAgey4uLnBhbmVsUHJvcHN9XG4gICAgICAgICAgey4uLmxheWVyQWN0aW9uc31cbiAgICAgICAgICBrZXk9e2xheWVyLmlkfVxuICAgICAgICAgIGlkeD17aWR4fVxuICAgICAgICAgIGxheWVyPXtsYXllcn1cbiAgICAgICAgICBsaXN0ZW5lcnM9e2xpc3RlbmVyc31cbiAgICAgICAgICBpc0RyYWdnYWJsZT17IWRpc2FibGVkfVxuICAgICAgICAvPlxuICAgICAgPC9Tb3J0YWJsZVN0eWxlZEl0ZW0+XG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBMYXllckxpc3Q6IFJlYWN0LkZDPExheWVyTGlzdFByb3BzPiA9IHByb3BzID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBsYXllcnMsXG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGxheWVyT3JkZXIsXG4gICAgICB1aVN0YXRlQWN0aW9ucyxcbiAgICAgIHZpc1N0YXRlQWN0aW9ucyxcbiAgICAgIG1hcFN0YXRlQWN0aW9ucyxcbiAgICAgIGxheWVyQ2xhc3NlcyxcbiAgICAgIGlzU29ydGFibGUgPSB0cnVlLFxuICAgICAgc3BsaXRNYXBcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3Qge3RvZ2dsZU1vZGFsOiBvcGVuTW9kYWx9ID0gdWlTdGF0ZUFjdGlvbnM7XG5cbiAgICBjb25zdCBsYXllcnNUb1Nob3cgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIHJldHVybiBsYXllck9yZGVyLnJlZHVjZSgoYWNjLCBsYXllcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gZmluZEJ5SWQobGF5ZXJJZCkobGF5ZXJzLmZpbHRlcihCb29sZWFuKSk7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhbGF5ZXIuY29uZmlnLmhpZGRlbiA/IFsuLi5hY2MsIGxheWVyXSA6IGFjYztcbiAgICAgIH0sIElOSVRJQUxfTEFZRVJTX1RPX1NIT1cpO1xuICAgIH0sIFtsYXllcnMsIGxheWVyT3JkZXJdKTtcblxuICAgIGNvbnN0IHNpZGVQYW5lbERuZEl0ZW1zID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICByZXR1cm4gbGF5ZXJzVG9TaG93Lm1hcCgoe2lkfSkgPT4gaWQpO1xuICAgIH0sIFtsYXllcnNUb1Nob3ddKTtcblxuICAgIGNvbnN0IGxheWVyVHlwZU9wdGlvbnMgPSB1c2VNZW1vKFxuICAgICAgKCkgPT5cbiAgICAgICAgT2JqZWN0LmtleXMobGF5ZXJDbGFzc2VzKS5tYXAoa2V5ID0+IHtcbiAgICAgICAgICBjb25zdCBsYXllciA9IG5ldyBsYXllckNsYXNzZXNba2V5XSh7ZGF0YUlkOiAnJ30pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDoga2V5LFxuICAgICAgICAgICAgbGFiZWw6IGxheWVyLm5hbWUsXG4gICAgICAgICAgICBpY29uOiBsYXllci5sYXllckljb24sXG4gICAgICAgICAgICByZXF1aXJlRGF0YTogbGF5ZXIucmVxdWlyZURhdGFcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIFtsYXllckNsYXNzZXNdXG4gICAgKTtcblxuICAgIGNvbnN0IGxheWVyQWN0aW9ucyA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoe1xuICAgICAgICBsYXllckNvbG9yVUlDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy5sYXllckNvbG9yVUlDaGFuZ2UsXG4gICAgICAgIGxheWVyQ29uZmlnQ2hhbmdlOiB2aXNTdGF0ZUFjdGlvbnMubGF5ZXJDb25maWdDaGFuZ2UsXG4gICAgICAgIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZTogdmlzU3RhdGVBY3Rpb25zLmxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSxcbiAgICAgICAgbGF5ZXJUb2dnbGVWaXNpYmlsaXR5OiB2aXNTdGF0ZUFjdGlvbnMubGF5ZXJUb2dnbGVWaXNpYmlsaXR5LFxuICAgICAgICBsYXllclR5cGVDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy5sYXllclR5cGVDaGFuZ2UsXG4gICAgICAgIGxheWVyVmlzQ29uZmlnQ2hhbmdlOiB2aXNTdGF0ZUFjdGlvbnMubGF5ZXJWaXNDb25maWdDaGFuZ2UsXG4gICAgICAgIGxheWVyVGV4dExhYmVsQ2hhbmdlOiB2aXNTdGF0ZUFjdGlvbnMubGF5ZXJUZXh0TGFiZWxDaGFuZ2UsXG4gICAgICAgIHJlbW92ZUxheWVyOiB2aXNTdGF0ZUFjdGlvbnMucmVtb3ZlTGF5ZXIsXG4gICAgICAgIHpvb21Ub0xheWVyOiBtYXBTdGF0ZUFjdGlvbnMuZml0Qm91bmRzLFxuICAgICAgICBkdXBsaWNhdGVMYXllcjogdmlzU3RhdGVBY3Rpb25zLmR1cGxpY2F0ZUxheWVyLFxuICAgICAgICBsYXllclNldElzVmFsaWQ6IHZpc1N0YXRlQWN0aW9ucy5sYXllclNldElzVmFsaWRcbiAgICAgIH0pLFxuICAgICAgW3Zpc1N0YXRlQWN0aW9ucywgbWFwU3RhdGVBY3Rpb25zXVxuICAgICk7XG5cbiAgICBjb25zdCBwYW5lbFByb3BzID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIGRhdGFzZXRzLFxuICAgICAgICBvcGVuTW9kYWwsXG4gICAgICAgIGxheWVyVHlwZU9wdGlvbnMsXG4gICAgICAgIHNwbGl0TWFwXG4gICAgICB9KSxcbiAgICAgIFtkYXRhc2V0cywgb3Blbk1vZGFsLCBsYXllclR5cGVPcHRpb25zLCBzcGxpdE1hcF1cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxDb250YWluZXI+XG4gICAgICAgIDxTb3J0YWJsZUNvbnRleHRcbiAgICAgICAgICBpZD17U09SVEFCTEVfU0lERV9QQU5FTF9UWVBFfVxuICAgICAgICAgIGl0ZW1zPXtzaWRlUGFuZWxEbmRJdGVtc31cbiAgICAgICAgICBzdHJhdGVneT17dmVydGljYWxMaXN0U29ydGluZ1N0cmF0ZWd5fVxuICAgICAgICAgIGRpc2FibGVkPXshaXNTb3J0YWJsZX1cbiAgICAgICAgPlxuICAgICAgICAgIHsvKiB3YXJuaW5nOiBjb250YWluZXJJZCBzaG91bGQgYmUgc2ltaWxhciB0byB0aGUgZmlyc3Qga2V5IGluIGRuZEl0ZW1zIGRlZmluZWQgaW4ga2VwbGVyLWdsLmpzKi99XG4gICAgICAgICAge2xheWVyc1RvU2hvdy5tYXAobGF5ZXIgPT4gKFxuICAgICAgICAgICAgPFNvcnRhYmxlSXRlbVxuICAgICAgICAgICAgICBrZXk9e2xheWVyLmlkfVxuICAgICAgICAgICAgICBsYXllcj17bGF5ZXJ9XG4gICAgICAgICAgICAgIGlkeD17bGF5ZXJzLmZpbmRJbmRleChsID0+IGw/LmlkID09PSBsYXllci5pZCl9XG4gICAgICAgICAgICAgIHBhbmVsUHJvcHM9e3BhbmVsUHJvcHN9XG4gICAgICAgICAgICAgIGxheWVyQWN0aW9ucz17bGF5ZXJBY3Rpb25zfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17IWlzU29ydGFibGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L1NvcnRhYmxlQ29udGV4dD5cbiAgICAgIDwvQ29udGFpbmVyPlxuICAgICk7XG4gIH07XG4gIHJldHVybiBMYXllckxpc3Q7XG59XG5leHBvcnQgZGVmYXVsdCBMYXllckxpc3RGYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsWUFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBTUEsSUFBQUksU0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sV0FBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FB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