UNPKG

kepler.gl

Version:

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

144 lines (141 loc) 19.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.LisaToolComponent = LisaToolComponent; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = require("react"); var _reactRedux = require("react-redux"); var _actions = require("@kepler.gl/actions"); var _utils = require("./utils"); var _layerCreationTool = require("./kepler-tools/layer-creation-tool"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project /** * Use LisaToolComponent adding Lisa result to kepler.gl */ function LisaToolComponent(_ref) { var datasetName = _ref.datasetName, lisaDatasetName = _ref.lisaDatasetName, significanceThreshold = _ref.significanceThreshold, clusters = _ref.clusters, lagValues = _ref.lagValues, pValues = _ref.pValues, lisaValues = _ref.lisaValues, sigCategories = _ref.sigCategories, nn = _ref.nn, labels = _ref.labels, colors = _ref.colors; var datasets = (0, _reactRedux.useSelector)(function (state) { return state.demo.keplerGl.map.visState.datasets; }); var layers = (0, _reactRedux.useSelector)(function (state) { return state.demo.keplerGl.map.visState.layers; }); var dispatch = (0, _reactRedux.useDispatch)(); // save the result from lisa tool to a new lisa dataset (0, _react.useEffect)(function () { var lisaData = { clusters: clusters, lagValues: lagValues, pValues: pValues, lisaValues: lisaValues, sigCategories: sigCategories, nn: nn, fillColor: clusters.map(function (cluster, index) { return pValues[index] < significanceThreshold ? colors[cluster] : colors[0]; }), label: clusters.map(function (cluster, index) { return pValues[index] < significanceThreshold ? labels[cluster] : labels[0]; }) }; // create a new geojson layer using clusters with ordinal color scale and customColorScale and colors var newDataset = (0, _utils.saveAsDataset)(datasets, layers, datasetName, lisaDatasetName, lisaData); if (newDataset) { // add the new dataset to the map dispatch((0, _actions.addDataToMap)({ datasets: [newDataset], options: { autoCreateLayers: false, centerMap: false } })); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // create a LISA layer for the new lisa dataset (0, _react.useEffect)(function () { var datasetId = Object.keys(datasets).find(function (dataId) { return datasets[dataId].label === lisaDatasetName; }); if (!datasetId) return; var newDataset = datasets[datasetId]; if (newDataset) { var layerId = "".concat(lisaDatasetName, "_lisa"); // check if the layer already exists? if (layers.find(function (l) { return l.id === layerId; })) { return; } // add a new layer for the new dataset var layer = (0, _layerCreationTool.guessDefaultLayer)(newDataset, 'geojson'); if (!layer) return; var colorField = { name: 'clusters', type: 'integer' }; var colorDomain = Array.from({ length: colors.length }, function (_, i) { return i; }); var colorLegends = {}; for (var i = 0; i < colors.length; i++) { colorLegends[colors[i]] = labels[i]; } var colorMap = colors.map(function (color, index) { return [index, color]; }); var newLayer = { id: layerId, type: layer.type, config: _objectSpread(_objectSpread({}, layer.config), {}, { dataId: datasetId, columns: Object.keys(layer.config.columns).reduce(function (acc, key) { acc[key] = layer.config.columns[key].value; return acc; }, {}), colorScale: 'customOrdinal', colorField: colorField, strokeColorDomain: colorDomain, strokeColorField: colorField, strokeColorScale: 'customOrdinal', visConfig: _objectSpread(_objectSpread({}, layer.config.visConfig), {}, { colorRange: _objectSpread(_objectSpread({}, layer.config.visConfig.colorRange), {}, { colorDomain: colorDomain, colors: colors, colorMap: colorMap, colorLegends: colorLegends }), strokeColorRange: { category: 'Custom', name: 'custom', colors: colors, colorMap: colorMap }, strokeOpacity: 1, stroked: true, strokedWidth: 0.5 }) }) }; dispatch((0, _actions.addLayer)(newLayer, datasetId)); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [datasets]); return null; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0UmVkdXgiLCJfYWN0aW9ucyIsIl91dGlscyIsIl9sYXllckNyZWF0aW9uVG9vbCIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiTGlzYVRvb2xDb21wb25lbnQiLCJfcmVmIiwiZGF0YXNldE5hbWUiLCJsaXNhRGF0YXNldE5hbWUiLCJzaWduaWZpY2FuY2VUaHJlc2hvbGQiLCJjbHVzdGVycyIsImxhZ1ZhbHVlcyIsInBWYWx1ZXMiLCJsaXNhVmFsdWVzIiwic2lnQ2F0ZWdvcmllcyIsIm5uIiwibGFiZWxzIiwiY29sb3JzIiwiZGF0YXNldHMiLCJ1c2VTZWxlY3RvciIsInN0YXRlIiwiZGVtbyIsImtlcGxlckdsIiwibWFwIiwidmlzU3RhdGUiLCJsYXllcnMiLCJkaXNwYXRjaCIsInVzZURpc3BhdGNoIiwidXNlRWZmZWN0IiwibGlzYURhdGEiLCJmaWxsQ29sb3IiLCJjbHVzdGVyIiwiaW5kZXgiLCJsYWJlbCIsIm5ld0RhdGFzZXQiLCJzYXZlQXNEYXRhc2V0IiwiYWRkRGF0YVRvTWFwIiwib3B0aW9ucyIsImF1dG9DcmVhdGVMYXllcnMiLCJjZW50ZXJNYXAiLCJkYXRhc2V0SWQiLCJmaW5kIiwiZGF0YUlkIiwibGF5ZXJJZCIsImNvbmNhdCIsImwiLCJpZCIsImxheWVyIiwiZ3Vlc3NEZWZhdWx0TGF5ZXIiLCJjb2xvckZpZWxkIiwibmFtZSIsInR5cGUiLCJjb2xvckRvbWFpbiIsIkFycmF5IiwiZnJvbSIsIl8iLCJpIiwiY29sb3JMZWdlbmRzIiwiY29sb3JNYXAiLCJjb2xvciIsIm5ld0xheWVyIiwiY29uZmlnIiwiY29sdW1ucyIsInJlZHVjZSIsImFjYyIsImtleSIsInZhbHVlIiwiY29sb3JTY2FsZSIsInN0cm9rZUNvbG9yRG9tYWluIiwic3Ryb2tlQ29sb3JGaWVsZCIsInN0cm9rZUNvbG9yU2NhbGUiLCJ2aXNDb25maWciLCJjb2xvclJhbmdlIiwic3Ryb2tlQ29sb3JSYW5nZSIsImNhdGVnb3J5Iiwic3Ryb2tlT3BhY2l0eSIsInN0cm9rZWQiLCJzdHJva2VkV2lkdGgiLCJhZGRMYXllciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9saXNhLXRvb2wudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7dXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZURpc3BhdGNoLCB1c2VTZWxlY3Rvcn0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHthZGREYXRhVG9NYXAsIGFkZExheWVyfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtzYXZlQXNEYXRhc2V0fSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7Z3Vlc3NEZWZhdWx0TGF5ZXJ9IGZyb20gJy4va2VwbGVyLXRvb2xzL2xheWVyLWNyZWF0aW9uLXRvb2wnO1xuaW1wb3J0IHtTdGF0ZX0gZnJvbSAnLi4vY29tcG9uZW50cy9haS1hc3Npc3RhbnQtbWFuYWdlcic7XG5cbi8qKlxuICogVXNlIExpc2FUb29sQ29tcG9uZW50IGFkZGluZyBMaXNhIHJlc3VsdCB0byBrZXBsZXIuZ2xcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIExpc2FUb29sQ29tcG9uZW50KHtcbiAgZGF0YXNldE5hbWUsXG4gIGxpc2FEYXRhc2V0TmFtZSxcbiAgc2lnbmlmaWNhbmNlVGhyZXNob2xkLFxuICBjbHVzdGVycyxcbiAgbGFnVmFsdWVzLFxuICBwVmFsdWVzLFxuICBsaXNhVmFsdWVzLFxuICBzaWdDYXRlZ29yaWVzLFxuICBubixcbiAgbGFiZWxzLFxuICBjb2xvcnNcbn0pIHtcbiAgY29uc3QgZGF0YXNldHMgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IFN0YXRlKSA9PiBzdGF0ZS5kZW1vLmtlcGxlckdsLm1hcC52aXNTdGF0ZS5kYXRhc2V0cyk7XG4gIGNvbnN0IGxheWVycyA9IHVzZVNlbGVjdG9yKChzdGF0ZTogU3RhdGUpID0+IHN0YXRlLmRlbW8ua2VwbGVyR2wubWFwLnZpc1N0YXRlLmxheWVycyk7XG4gIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcblxuICAvLyBzYXZlIHRoZSByZXN1bHQgZnJvbSBsaXNhIHRvb2wgdG8gYSBuZXcgbGlzYSBkYXRhc2V0XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbGlzYURhdGE6IFJlY29yZDxzdHJpbmcsIG51bWJlcltdPiA9IHtcbiAgICAgIGNsdXN0ZXJzLFxuICAgICAgbGFnVmFsdWVzLFxuICAgICAgcFZhbHVlcyxcbiAgICAgIGxpc2FWYWx1ZXMsXG4gICAgICBzaWdDYXRlZ29yaWVzLFxuICAgICAgbm4sXG4gICAgICBmaWxsQ29sb3I6IGNsdXN0ZXJzLm1hcCgoY2x1c3RlciwgaW5kZXgpID0+XG4gICAgICAgIHBWYWx1ZXNbaW5kZXhdIDwgc2lnbmlmaWNhbmNlVGhyZXNob2xkID8gY29sb3JzW2NsdXN0ZXJdIDogY29sb3JzWzBdXG4gICAgICApLFxuICAgICAgbGFiZWw6IGNsdXN0ZXJzLm1hcCgoY2x1c3RlciwgaW5kZXgpID0+XG4gICAgICAgIHBWYWx1ZXNbaW5kZXhdIDwgc2lnbmlmaWNhbmNlVGhyZXNob2xkID8gbGFiZWxzW2NsdXN0ZXJdIDogbGFiZWxzWzBdXG4gICAgICApXG4gICAgfTtcbiAgICAvLyBjcmVhdGUgYSBuZXcgZ2VvanNvbiBsYXllciB1c2luZyBjbHVzdGVycyB3aXRoIG9yZGluYWwgY29sb3Igc2NhbGUgYW5kIGN1c3RvbUNvbG9yU2NhbGUgYW5kIGNvbG9yc1xuICAgIGNvbnN0IG5ld0RhdGFzZXQgPSBzYXZlQXNEYXRhc2V0KGRhdGFzZXRzLCBsYXllcnMsIGRhdGFzZXROYW1lLCBsaXNhRGF0YXNldE5hbWUsIGxpc2FEYXRhKTtcbiAgICBpZiAobmV3RGF0YXNldCkge1xuICAgICAgLy8gYWRkIHRoZSBuZXcgZGF0YXNldCB0byB0aGUgbWFwXG4gICAgICBkaXNwYXRjaChcbiAgICAgICAgYWRkRGF0YVRvTWFwKHtkYXRhc2V0czogW25ld0RhdGFzZXRdLCBvcHRpb25zOiB7YXV0b0NyZWF0ZUxheWVyczogZmFsc2UsIGNlbnRlck1hcDogZmFsc2V9fSlcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW10pO1xuXG4gIC8vIGNyZWF0ZSBhIExJU0EgbGF5ZXIgZm9yIHRoZSBuZXcgbGlzYSBkYXRhc2V0XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZGF0YXNldElkID0gT2JqZWN0LmtleXMoZGF0YXNldHMpLmZpbmQoXG4gICAgICBkYXRhSWQgPT4gZGF0YXNldHNbZGF0YUlkXS5sYWJlbCA9PT0gbGlzYURhdGFzZXROYW1lXG4gICAgKTtcbiAgICBpZiAoIWRhdGFzZXRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3RGF0YXNldCA9IGRhdGFzZXRzW2RhdGFzZXRJZF07XG4gICAgaWYgKG5ld0RhdGFzZXQpIHtcbiAgICAgIGNvbnN0IGxheWVySWQgPSBgJHtsaXNhRGF0YXNldE5hbWV9X2xpc2FgO1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIGxheWVyIGFscmVhZHkgZXhpc3RzP1xuICAgICAgaWYgKGxheWVycy5maW5kKGwgPT4gbC5pZCA9PT0gbGF5ZXJJZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gYWRkIGEgbmV3IGxheWVyIGZvciB0aGUgbmV3IGRhdGFzZXRcbiAgICAgIGNvbnN0IGxheWVyID0gZ3Vlc3NEZWZhdWx0TGF5ZXIobmV3RGF0YXNldCwgJ2dlb2pzb24nKTtcbiAgICAgIGlmICghbGF5ZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IGNvbG9yRmllbGQgPSB7XG4gICAgICAgIG5hbWU6ICdjbHVzdGVycycsXG4gICAgICAgIHR5cGU6ICdpbnRlZ2VyJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGNvbG9yRG9tYWluID0gQXJyYXkuZnJvbSh7bGVuZ3RoOiBjb2xvcnMubGVuZ3RofSwgKF8sIGkpID0+IGkpO1xuICAgICAgY29uc3QgY29sb3JMZWdlbmRzID0ge307XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb2xvckxlZ2VuZHNbY29sb3JzW2ldXSA9IGxhYmVsc1tpXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbG9yTWFwID0gY29sb3JzLm1hcCgoY29sb3IsIGluZGV4KSA9PiBbaW5kZXgsIGNvbG9yXSk7XG4gICAgICBjb25zdCBuZXdMYXllciA9IHtcbiAgICAgICAgaWQ6IGxheWVySWQsXG4gICAgICAgIHR5cGU6IGxheWVyLnR5cGUsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIC4uLmxheWVyLmNvbmZpZyxcbiAgICAgICAgICBkYXRhSWQ6IGRhdGFzZXRJZCxcbiAgICAgICAgICBjb2x1bW5zOiBPYmplY3Qua2V5cyhsYXllci5jb25maWcuY29sdW1ucykucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBsYXllci5jb25maWcuY29sdW1uc1trZXldLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LCB7fSksXG4gICAgICAgICAgY29sb3JTY2FsZTogJ2N1c3RvbU9yZGluYWwnLFxuICAgICAgICAgIGNvbG9yRmllbGQsXG4gICAgICAgICAgc3Ryb2tlQ29sb3JEb21haW46IGNvbG9yRG9tYWluLFxuICAgICAgICAgIHN0cm9rZUNvbG9yRmllbGQ6IGNvbG9yRmllbGQsXG4gICAgICAgICAgc3Ryb2tlQ29sb3JTY2FsZTogJ2N1c3RvbU9yZGluYWwnLFxuICAgICAgICAgIHZpc0NvbmZpZzoge1xuICAgICAgICAgICAgLi4ubGF5ZXIuY29uZmlnLnZpc0NvbmZpZyxcbiAgICAgICAgICAgIGNvbG9yUmFuZ2U6IHtcbiAgICAgICAgICAgICAgLi4ubGF5ZXIuY29uZmlnLnZpc0NvbmZpZy5jb2xvclJhbmdlLFxuICAgICAgICAgICAgICBjb2xvckRvbWFpbixcbiAgICAgICAgICAgICAgY29sb3JzLFxuICAgICAgICAgICAgICBjb2xvck1hcCxcbiAgICAgICAgICAgICAgY29sb3JMZWdlbmRzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3Ryb2tlQ29sb3JSYW5nZToge1xuICAgICAgICAgICAgICBjYXRlZ29yeTogJ0N1c3RvbScsXG4gICAgICAgICAgICAgIG5hbWU6ICdjdXN0b20nLFxuICAgICAgICAgICAgICBjb2xvcnMsXG4gICAgICAgICAgICAgIGNvbG9yTWFwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3Ryb2tlT3BhY2l0eTogMSxcbiAgICAgICAgICAgIHN0cm9rZWQ6IHRydWUsXG4gICAgICAgICAgICBzdHJva2VkV2lkdGg6IDAuNVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGRpc3BhdGNoKGFkZExheWVyKG5ld0xheWVyLCBkYXRhc2V0SWQpKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZGF0YXNldHNdKTtcbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0Es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QUM7TUFDN0QsSUFBTUMsUUFBUSxHQUFHO1FBQ2ZkLEVBQUUsRUFBRUgsT0FBTztRQUNYUSxJQUFJLEVBQUVKLEtBQUssQ0FBQ0ksSUFBSTtRQUNoQlUsTUFBTSxFQUFBaEUsYUFBQSxDQUFBQSxhQUFBLEtBQ0RrRCxLQUFLLENBQUNjLE1BQU07VUFDZm5CLE1BQU0sRUFBRUYsU0FBUztVQUNqQnNCLE9BQU8sRUFBRTFFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDMEQsS0FBSyxDQUFDYyxNQUFNLENBQUNDLE9BQU8sQ0FBQyxDQUFDQyxNQUFNLENBQUMsVUFBQ0MsR0FBRyxFQUFFQyxHQUFHLEVBQUs7WUFDOURELEdBQUcsQ0FBQ0MsR0FBRyxDQUFDLEdBQUdsQixLQUFLLENBQUNjLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDRyxHQUFHLENBQUMsQ0FBQ0MsS0FBSztZQUMxQyxPQUFPRixHQUFHO1VBQ1osQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1VBQ05HLFVBQVUsRUFBRSxlQUFlO1VBQzNCbEIsVUFBVSxFQUFWQSxVQUFVO1VBQ1ZtQixpQkFBaUIsRUFBRWhCLFdBQVc7VUFDOUJpQixnQkFBZ0IsRUFBRXBCLFVBQVU7VUFDNUJxQixnQkFBZ0IsRUFBRSxlQUFlO1VBQ2pDQyxTQUFTLEVBQUExRSxhQUFBLENBQUFBLGFBQUEsS0FDSmtELEtBQUssQ0FBQ2MsTUFBTSxDQUFDVSxTQUFTO1lBQ3pCQyxVQUFVLEVBQUEzRSxhQUFBLENBQUFBLGFBQUEsS0FDTGtELEtBQUssQ0FBQ2MsTUFBTSxDQUFDVSxTQUFTLENBQUNDLFVBQVU7Y0FDcENwQixXQUFXLEVBQVhBLFdBQVc7Y0FDWG5DLE1BQU0sRUFBTkEsTUFBTTtjQUNOeUMsUUFBUSxFQUFSQSxRQUFRO2NBQ1JELFlBQVksRUFBWkE7WUFBWSxFQUNiO1lBQ0RnQixnQkFBZ0IsRUFBRTtjQUNoQkMsUUFBUSxFQUFFLFFBQVE7Y0FDbEJ4QixJQUFJLEVBQUUsUUFBUTtjQUNkakMsTUFBTSxFQUFOQSxNQUFNO2NBQ055QyxRQUFRLEVBQVJBO1lBQ0YsQ0FBQztZQUNEaUIsYUFBYSxFQUFFLENBQUM7WUFDaEJDLE9BQU8sRUFBRSxJQUFJO1lBQ2JDLFlBQVksRUFBRTtVQUFHO1FBQ2xCO01BRUwsQ0FBQztNQUNEbkQsUUFBUSxDQUFDLElBQUFvRCxpQkFBUSxFQUFDbEIsUUFBUSxFQUFFcEIsU0FBUyxDQUFDLENBQUM7SUFDekM7SUFDQTtFQUNGLENBQUMsRUFBRSxDQUFDdEIsUUFBUSxDQUFDLENBQUM7RUFDZCxPQUFPLElBQUk7QUFDYiIsImlnbm9yZUxpc3QiOltdfQ==