UNPKG

kepler.gl

Version:

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

237 lines (234 loc) 31 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getGeoTools = getGeoTools; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _react = _interopRequireWildcard(require("react")); var _reactRedux = require("react-redux"); var _geoda = require("@openassistant/geoda"); var _osm = require("@openassistant/osm"); var _processors = require("@kepler.gl/processors"); var _actions = require("@kepler.gl/actions"); var _lisaTool = require("./lisa-tool"); var _utils = require("./utils"); 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 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 function getGeoTools(aiAssistant, datasets, layers, layerData) { // context for geo tools var getValues = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(datasetName, variableName) { var values; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: values = (0, _utils.getValuesFromDataset)(datasets, layers, datasetName, variableName); return _context.abrupt("return", values); case 2: case "end": return _context.stop(); } }, _callee); })); return function getValues(_x, _x2) { return _ref.apply(this, arguments); }; }(); var getGeometries = /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(datasetName) { var geoms, geojson; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: geoms = (0, _utils.getGeometriesFromDataset)(datasets, layers, layerData, datasetName); if (geoms.length === 0) { // get the geoms from the cache geojson = (0, _osm.getCachedData)(datasetName); if (geojson && 'features' in geojson) { geoms = geojson.features; } } return _context2.abrupt("return", geoms); case 3: case "end": return _context2.stop(); } }, _callee2); })); return function getGeometries(_x3) { return _ref2.apply(this, arguments); }; }(); var getMapboxToken = function getMapboxToken() { if (aiAssistant.config.mapboxToken) { return aiAssistant.config.mapboxToken; } throw new Error('Mapbox token is not provided'); }; // geo tools var classifyTool = _objectSpread(_objectSpread({}, _geoda.dataClassify), {}, { context: _objectSpread(_objectSpread({}, _geoda.dataClassify.context), {}, { getValues: getValues }) }); var weightsTool = _objectSpread(_objectSpread({}, _geoda.spatialWeights), {}, { context: _objectSpread(_objectSpread({}, _geoda.spatialWeights.context), {}, { getGeometries: getGeometries }) }); var globalMoranTool = _objectSpread(_objectSpread({}, _geoda.globalMoran), {}, { context: _objectSpread(_objectSpread({}, _geoda.globalMoran.context), {}, { getValues: getValues }) }); var regressionTool = _objectSpread(_objectSpread({}, _geoda.spatialRegression), {}, { context: _objectSpread(_objectSpread({}, _geoda.spatialRegression.context), {}, { getValues: getValues }) }); var lisaTool = _objectSpread(_objectSpread({}, _geoda.lisa), {}, { context: _objectSpread(_objectSpread({}, _geoda.lisa.context), {}, { getValues: getValues }), component: _lisaTool.LisaToolComponent }); var spatialJoinTool = _objectSpread(_objectSpread({}, _geoda.spatialJoin), {}, { context: _objectSpread(_objectSpread({}, _geoda.spatialJoin.context), {}, { getValues: getValues, getGeometries: getGeometries }), component: CustomSpatialJoinToolComponent }); var spatialFilterTool = _objectSpread(_objectSpread({}, _geoda.spatialFilter), {}, { context: _objectSpread(_objectSpread({}, _geoda.spatialFilter.context), {}, { getValues: getValues, getGeometries: getGeometries }), component: CustomSpatialJoinToolComponent }); var routingTool = _objectSpread(_objectSpread({}, _osm.routing), {}, { context: _objectSpread(_objectSpread({}, _osm.routing.context), {}, { getMapboxToken: getMapboxToken }) }); var isochroneTool = _objectSpread(_objectSpread({}, _osm.isochrone), {}, { context: _objectSpread(_objectSpread({}, _osm.isochrone.context), {}, { getMapboxToken: getMapboxToken }) }); var bufferTool = _objectSpread(_objectSpread({}, _geoda.buffer), {}, { context: _objectSpread(_objectSpread({}, _geoda.buffer.context), {}, { getGeometries: getGeometries }) }); var centroidTool = _objectSpread(_objectSpread({}, _geoda.centroid), {}, { context: _objectSpread(_objectSpread({}, _geoda.centroid.context), {}, { getGeometries: getGeometries }) }); var dissolveTool = _objectSpread(_objectSpread({}, _geoda.dissolve), {}, { context: _objectSpread(_objectSpread({}, _geoda.dissolve.context), {}, { getGeometries: getGeometries }) }); var lengthTool = _objectSpread(_objectSpread({}, _geoda.length), {}, { context: _objectSpread(_objectSpread({}, _geoda.length.context), {}, { getGeometries: getGeometries }) }); var areaTool = _objectSpread(_objectSpread({}, _geoda.area), {}, { context: _objectSpread(_objectSpread({}, _geoda.area.context), {}, { getGeometries: getGeometries }) }); var perimeterTool = _objectSpread(_objectSpread({}, _geoda.perimeter), {}, { context: _objectSpread(_objectSpread({}, _geoda.perimeter.context), {}, { getGeometries: getGeometries }) }); var roadsTool = _objectSpread(_objectSpread({}, _osm.roads), {}, { context: _objectSpread(_objectSpread({}, _osm.roads.context), {}, { getGeometries: getGeometries }) }); return { classifyTool: classifyTool, weightsTool: weightsTool, globalMoranTool: globalMoranTool, regressionTool: regressionTool, lisaTool: lisaTool, spatialJoinTool: spatialJoinTool, spatialFilterTool: spatialFilterTool, bufferTool: bufferTool, centroidTool: centroidTool, dissolveTool: dissolveTool, lengthTool: lengthTool, areaTool: areaTool, perimeterTool: perimeterTool, getUsStateGeojson: _osm.getUsStateGeojson, getUsCountyGeojson: _osm.getUsCountyGeojson, getUsZipcodeGeojson: _osm.getUsZipcodeGeojson, queryUSZipcodes: _osm.queryUSZipcodes, geocoding: _osm.geocoding, routing: routingTool, isochrone: isochroneTool, roads: roadsTool }; } /** * Use SpatialJoinToolComponent to add the join result to kepler.gl */ function CustomSpatialJoinToolComponent(props) { var dispatch = (0, _reactRedux.useDispatch)(); (0, _react.useEffect)(function () { function addJoinedDatasetToMap() { return _addJoinedDatasetToMap.apply(this, arguments); } function _addJoinedDatasetToMap() { _addJoinedDatasetToMap = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() { var parsedData; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: if (!(props.joinedDatasetId && props.joinedDataset)) { _context3.next = 5; break; } _context3.next = 3; return (0, _processors.processFileData)({ content: { data: props.joinedDataset, fileName: props.joinedDatasetId }, fileCache: [] }); case 3: parsedData = _context3.sent; dispatch((0, _actions.addDataToMap)({ datasets: parsedData, options: { autoCreateLayers: true, centerMap: false } })); case 5: case "end": return _context3.stop(); } }, _callee3); })); return _addJoinedDatasetToMap.apply(this, arguments); } addJoinedDatasetToMap(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return /*#__PURE__*/_react["default"].createElement(_geoda.SpatialJoinToolComponent, props); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RSZWR1eCIsIl9nZW9kYSIsIl9vc20iLCJfcHJvY2Vzc29ycyIsIl9hY3Rpb25zIiwiX2xpc2FUb29sIiwiX3V0aWxzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZ2V0R2VvVG9vbHMiLCJhaUFzc2lzdGFudCIsImRhdGFzZXRzIiwibGF5ZXJzIiwibGF5ZXJEYXRhIiwiZ2V0VmFsdWVzIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiZGF0YXNldE5hbWUiLCJ2YXJpYWJsZU5hbWUiLCJ2YWx1ZXMiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiZ2V0VmFsdWVzRnJvbURhdGFzZXQiLCJhYnJ1cHQiLCJzdG9wIiwiX3giLCJfeDIiLCJnZXRHZW9tZXRyaWVzIiwiX3JlZjIiLCJfY2FsbGVlMiIsImdlb21zIiwiZ2VvanNvbiIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsImdldEdlb21ldHJpZXNGcm9tRGF0YXNldCIsImdldENhY2hlZERhdGEiLCJmZWF0dXJlcyIsIl94MyIsImdldE1hcGJveFRva2VuIiwiY29uZmlnIiwibWFwYm94VG9rZW4iLCJFcnJvciIsImNsYXNzaWZ5VG9vbCIsImRhdGFDbGFzc2lmeSIsImNvbnRleHQiLCJ3ZWlnaHRzVG9vbCIsInNwYXRpYWxXZWlnaHRzIiwiZ2xvYmFsTW9yYW5Ub29sIiwiZ2xvYmFsTW9yYW4iLCJyZWdyZXNzaW9uVG9vbCIsInNwYXRpYWxSZWdyZXNzaW9uIiwibGlzYVRvb2wiLCJsaXNhIiwiY29tcG9uZW50IiwiTGlzYVRvb2xDb21wb25lbnQiLCJzcGF0aWFsSm9pblRvb2wiLCJzcGF0aWFsSm9pbiIsIkN1c3RvbVNwYXRpYWxKb2luVG9vbENvbXBvbmVudCIsInNwYXRpYWxGaWx0ZXJUb29sIiwic3BhdGlhbEZpbHRlciIsInJvdXRpbmdUb29sIiwicm91dGluZyIsImlzb2Nocm9uZVRvb2wiLCJpc29jaHJvbmUiLCJidWZmZXJUb29sIiwiYnVmZmVyIiwiY2VudHJvaWRUb29sIiwiY2VudHJvaWQiLCJkaXNzb2x2ZVRvb2wiLCJkaXNzb2x2ZSIsImxlbmd0aFRvb2wiLCJhcmVhVG9vbCIsImFyZWEiLCJwZXJpbWV0ZXJUb29sIiwicGVyaW1ldGVyIiwicm9hZHNUb29sIiwicm9hZHMiLCJnZXRVc1N0YXRlR2VvanNvbiIsImdldFVzQ291bnR5R2VvanNvbiIsImdldFVzWmlwY29kZUdlb2pzb24iLCJxdWVyeVVTWmlwY29kZXMiLCJnZW9jb2RpbmciLCJwcm9wcyIsImRpc3BhdGNoIiwidXNlRGlzcGF0Y2giLCJ1c2VFZmZlY3QiLCJhZGRKb2luZWREYXRhc2V0VG9NYXAiLCJfYWRkSm9pbmVkRGF0YXNldFRvTWFwIiwiX2NhbGxlZTMiLCJwYXJzZWREYXRhIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiam9pbmVkRGF0YXNldElkIiwiam9pbmVkRGF0YXNldCIsInByb2Nlc3NGaWxlRGF0YSIsImNvbnRlbnQiLCJkYXRhIiwiZmlsZU5hbWUiLCJmaWxlQ2FjaGUiLCJzZW50IiwiYWRkRGF0YVRvTWFwIiwib3B0aW9ucyIsImF1dG9DcmVhdGVMYXllcnMiLCJjZW50ZXJNYXAiLCJjcmVhdGVFbGVtZW50IiwiU3BhdGlhbEpvaW5Ub29sQ29tcG9uZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL2dlby10b29scy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZURpc3BhdGNofSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge1xuICBkYXRhQ2xhc3NpZnksXG4gIERhdGFDbGFzc2lmeVRvb2wsXG4gIHNwYXRpYWxXZWlnaHRzLFxuICBTcGF0aWFsV2VpZ2h0c1Rvb2wsXG4gIGdsb2JhbE1vcmFuLFxuICBHbG9iYWxNb3JhblRvb2wsXG4gIHNwYXRpYWxSZWdyZXNzaW9uLFxuICBTcGF0aWFsUmVncmVzc2lvblRvb2wsXG4gIGxpc2EsXG4gIExpc2FUb29sLFxuICBzcGF0aWFsSm9pbixcbiAgU3BhdGlhbEpvaW5Ub29sLFxuICBzcGF0aWFsRmlsdGVyLFxuICBTcGF0aWFsSm9pblRvb2xDb21wb25lbnQsXG4gIGJ1ZmZlcixcbiAgY2VudHJvaWQsXG4gIGRpc3NvbHZlLFxuICBsZW5ndGgsXG4gIGFyZWEsXG4gIHBlcmltZXRlcixcbiAgQnVmZmVyVG9vbCxcbiAgQ2VudHJvaWRUb29sLFxuICBEaXNzb2x2ZVRvb2xcbn0gZnJvbSAnQG9wZW5hc3Npc3RhbnQvZ2VvZGEnO1xuaW1wb3J0IHtcbiAgZ2V0VXNTdGF0ZUdlb2pzb24sXG4gIGdldFVzQ291bnR5R2VvanNvbixcbiAgZ2V0VXNaaXBjb2RlR2VvanNvbixcbiAgcXVlcnlVU1ppcGNvZGVzLFxuICBnZW9jb2RpbmcsXG4gIHJvdXRpbmcsXG4gIGlzb2Nocm9uZSxcbiAgZ2V0Q2FjaGVkRGF0YSxcbiAgSXNvY2hyb25lVG9vbCxcbiAgUm91dGluZ1Rvb2wsXG4gIHJvYWRzXG59IGZyb20gJ0BvcGVuYXNzaXN0YW50L29zbSc7XG5pbXBvcnQge0RhdGFzZXRzfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7TGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7cHJvY2Vzc0ZpbGVEYXRhfSBmcm9tICdAa2VwbGVyLmdsL3Byb2Nlc3NvcnMnO1xuaW1wb3J0IHthZGREYXRhVG9NYXB9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5cbmltcG9ydCB7TGlzYVRvb2xDb21wb25lbnR9IGZyb20gJy4vbGlzYS10b29sJztcbmltcG9ydCB7Z2V0R2VvbWV0cmllc0Zyb21EYXRhc2V0LCBnZXRWYWx1ZXNGcm9tRGF0YXNldH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge0FpQXNzaXN0YW50U3RhdGV9IGZyb20gJy4uL3JlZHVjZXJzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlb1Rvb2xzKFxuICBhaUFzc2lzdGFudDogQWlBc3Npc3RhbnRTdGF0ZSxcbiAgZGF0YXNldHM6IERhdGFzZXRzLFxuICBsYXllcnM6IExheWVyW10sXG4gIGxheWVyRGF0YTogYW55W11cbikge1xuICAvLyBjb250ZXh0IGZvciBnZW8gdG9vbHNcbiAgY29uc3QgZ2V0VmFsdWVzID0gYXN5bmMgKGRhdGFzZXROYW1lOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gZ2V0VmFsdWVzRnJvbURhdGFzZXQoZGF0YXNldHMsIGxheWVycywgZGF0YXNldE5hbWUsIHZhcmlhYmxlTmFtZSk7XG4gICAgcmV0dXJuIHZhbHVlcyBhcyBudW1iZXJbXTtcbiAgfTtcblxuICBjb25zdCBnZXRHZW9tZXRyaWVzID0gYXN5bmMgKGRhdGFzZXROYW1lOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgZ2VvbXMgPSBnZXRHZW9tZXRyaWVzRnJvbURhdGFzZXQoZGF0YXNldHMsIGxheWVycywgbGF5ZXJEYXRhLCBkYXRhc2V0TmFtZSk7XG4gICAgaWYgKGdlb21zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gZ2V0IHRoZSBnZW9tcyBmcm9tIHRoZSBjYWNoZVxuICAgICAgY29uc3QgZ2VvanNvbiA9IGdldENhY2hlZERhdGEoZGF0YXNldE5hbWUpO1xuICAgICAgaWYgKGdlb2pzb24gJiYgJ2ZlYXR1cmVzJyBpbiBnZW9qc29uKSB7XG4gICAgICAgIGdlb21zID0gZ2VvanNvbi5mZWF0dXJlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdlb21zO1xuICB9O1xuXG4gIGNvbnN0IGdldE1hcGJveFRva2VuID0gKCkgPT4ge1xuICAgIGlmIChhaUFzc2lzdGFudC5jb25maWcubWFwYm94VG9rZW4pIHtcbiAgICAgIHJldHVybiBhaUFzc2lzdGFudC5jb25maWcubWFwYm94VG9rZW47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignTWFwYm94IHRva2VuIGlzIG5vdCBwcm92aWRlZCcpO1xuICB9O1xuXG4gIC8vIGdlbyB0b29sc1xuICBjb25zdCBjbGFzc2lmeVRvb2w6IERhdGFDbGFzc2lmeVRvb2wgPSB7XG4gICAgLi4uZGF0YUNsYXNzaWZ5LFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmRhdGFDbGFzc2lmeS5jb250ZXh0LFxuICAgICAgZ2V0VmFsdWVzXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHdlaWdodHNUb29sOiBTcGF0aWFsV2VpZ2h0c1Rvb2wgPSB7XG4gICAgLi4uc3BhdGlhbFdlaWdodHMsXG4gICAgY29udGV4dDoge1xuICAgICAgLi4uc3BhdGlhbFdlaWdodHMuY29udGV4dCxcbiAgICAgIGdldEdlb21ldHJpZXNcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2xvYmFsTW9yYW5Ub29sOiBHbG9iYWxNb3JhblRvb2wgPSB7XG4gICAgLi4uZ2xvYmFsTW9yYW4sXG4gICAgY29udGV4dDoge1xuICAgICAgLi4uZ2xvYmFsTW9yYW4uY29udGV4dCxcbiAgICAgIGdldFZhbHVlc1xuICAgIH1cbiAgfTtcblxuICBjb25zdCByZWdyZXNzaW9uVG9vbDogU3BhdGlhbFJlZ3Jlc3Npb25Ub29sID0ge1xuICAgIC4uLnNwYXRpYWxSZWdyZXNzaW9uLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLnNwYXRpYWxSZWdyZXNzaW9uLmNvbnRleHQsXG4gICAgICBnZXRWYWx1ZXNcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbGlzYVRvb2w6IExpc2FUb29sID0ge1xuICAgIC4uLmxpc2EsXG4gICAgY29udGV4dDoge1xuICAgICAgLi4ubGlzYS5jb250ZXh0LFxuICAgICAgZ2V0VmFsdWVzXG4gICAgfSxcbiAgICBjb21wb25lbnQ6IExpc2FUb29sQ29tcG9uZW50XG4gIH07XG5cbiAgY29uc3Qgc3BhdGlhbEpvaW5Ub29sOiBTcGF0aWFsSm9pblRvb2wgPSB7XG4gICAgLi4uc3BhdGlhbEpvaW4sXG4gICAgY29udGV4dDoge1xuICAgICAgLi4uc3BhdGlhbEpvaW4uY29udGV4dCxcbiAgICAgIGdldFZhbHVlcyxcbiAgICAgIGdldEdlb21ldHJpZXNcbiAgICB9LFxuICAgIGNvbXBvbmVudDogQ3VzdG9tU3BhdGlhbEpvaW5Ub29sQ29tcG9uZW50XG4gIH07XG5cbiAgY29uc3Qgc3BhdGlhbEZpbHRlclRvb2wgPSB7XG4gICAgLi4uc3BhdGlhbEZpbHRlcixcbiAgICBjb250ZXh0OiB7XG4gICAgICAuLi5zcGF0aWFsRmlsdGVyLmNvbnRleHQsXG4gICAgICBnZXRWYWx1ZXMsXG4gICAgICBnZXRHZW9tZXRyaWVzXG4gICAgfSxcbiAgICBjb21wb25lbnQ6IEN1c3RvbVNwYXRpYWxKb2luVG9vbENvbXBvbmVudFxuICB9O1xuXG4gIGNvbnN0IHJvdXRpbmdUb29sOiBSb3V0aW5nVG9vbCA9IHtcbiAgICAuLi5yb3V0aW5nLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLnJvdXRpbmcuY29udGV4dCxcbiAgICAgIGdldE1hcGJveFRva2VuXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGlzb2Nocm9uZVRvb2w6IElzb2Nocm9uZVRvb2wgPSB7XG4gICAgLi4uaXNvY2hyb25lLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmlzb2Nocm9uZS5jb250ZXh0LFxuICAgICAgZ2V0TWFwYm94VG9rZW5cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYnVmZmVyVG9vbDogQnVmZmVyVG9vbCA9IHtcbiAgICAuLi5idWZmZXIsXG4gICAgY29udGV4dDoge1xuICAgICAgLi4uYnVmZmVyLmNvbnRleHQsXG4gICAgICBnZXRHZW9tZXRyaWVzXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNlbnRyb2lkVG9vbDogQ2VudHJvaWRUb29sID0ge1xuICAgIC4uLmNlbnRyb2lkLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmNlbnRyb2lkLmNvbnRleHQsXG4gICAgICBnZXRHZW9tZXRyaWVzXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGRpc3NvbHZlVG9vbDogRGlzc29sdmVUb29sID0ge1xuICAgIC4uLmRpc3NvbHZlLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmRpc3NvbHZlLmNvbnRleHQsXG4gICAgICBnZXRHZW9tZXRyaWVzXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxlbmd0aFRvb2wgPSB7XG4gICAgLi4ubGVuZ3RoLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmxlbmd0aC5jb250ZXh0LFxuICAgICAgZ2V0R2VvbWV0cmllc1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBhcmVhVG9vbCA9IHtcbiAgICAuLi5hcmVhLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmFyZWEuY29udGV4dCxcbiAgICAgIGdldEdlb21ldHJpZXNcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcGVyaW1ldGVyVG9vbCA9IHtcbiAgICAuLi5wZXJpbWV0ZXIsXG4gICAgY29udGV4dDoge1xuICAgICAgLi4ucGVyaW1ldGVyLmNvbnRleHQsXG4gICAgICBnZXRHZW9tZXRyaWVzXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJvYWRzVG9vbCA9IHtcbiAgICAuLi5yb2FkcyxcbiAgICBjb250ZXh0OiB7XG4gICAgICAuLi5yb2Fkcy5jb250ZXh0LFxuICAgICAgZ2V0R2VvbWV0cmllc1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGNsYXNzaWZ5VG9vbCxcbiAgICB3ZWlnaHRzVG9vbCxcbiAgICBnbG9iYWxNb3JhblRvb2wsXG4gICAgcmVncmVzc2lvblRvb2wsXG4gICAgbGlzYVRvb2wsXG4gICAgc3BhdGlhbEpvaW5Ub29sLFxuICAgIHNwYXRpYWxGaWx0ZXJUb29sLFxuICAgIGJ1ZmZlclRvb2wsXG4gICAgY2VudHJvaWRUb29sLFxuICAgIGRpc3NvbHZlVG9vbCxcbiAgICBsZW5ndGhUb29sLFxuICAgIGFyZWFUb29sLFxuICAgIHBlcmltZXRlclRvb2wsXG4gICAgZ2V0VXNTdGF0ZUdlb2pzb24sXG4gICAgZ2V0VXNDb3VudHlHZW9qc29uLFxuICAgIGdldFVzWmlwY29kZUdlb2pzb24sXG4gICAgcXVlcnlVU1ppcGNvZGVzLFxuICAgIGdlb2NvZGluZyxcbiAgICByb3V0aW5nOiByb3V0aW5nVG9vbCxcbiAgICBpc29jaHJvbmU6IGlzb2Nocm9uZVRvb2wsXG4gICAgcm9hZHM6IHJvYWRzVG9vbFxuICB9O1xufVxuXG4vKipcbiAqIFVzZSBTcGF0aWFsSm9pblRvb2xDb21wb25lbnQgdG8gYWRkIHRoZSBqb2luIHJlc3VsdCB0byBrZXBsZXIuZ2xcbiAqL1xuZnVuY3Rpb24gQ3VzdG9tU3BhdGlhbEpvaW5Ub29sQ29tcG9uZW50KHByb3BzKSB7XG4gIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGFzeW5jIGZ1bmN0aW9uIGFkZEpvaW5lZERhdGFzZXRUb01hcCgpIHtcbiAgICAgIGlmIChwcm9wcy5qb2luZWREYXRhc2V0SWQgJiYgcHJvcHMuam9pbmVkRGF0YXNldCkge1xuICAgICAgICAvLyBhZGQgdGhlIGpvaW5lZCBkYXRhc2V0IHRvIGtlcGxlci5nbFxuICAgICAgICBjb25zdCBwYXJzZWREYXRhID0gYXdhaXQgcHJvY2Vzc0ZpbGVEYXRhKHtcbiAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICBkYXRhOiBwcm9wcy5qb2luZWREYXRhc2V0LFxuICAgICAgICAgICAgZmlsZU5hbWU6IHByb3BzLmpvaW5lZERhdGFzZXRJZFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmlsZUNhY2hlOiBbXVxuICAgICAgICB9KTtcblxuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICBhZGREYXRhVG9NYXAoe2RhdGFzZXRzOiBwYXJzZWREYXRhLCBvcHRpb25zOiB7YXV0b0NyZWF0ZUxheWVyczogdHJ1ZSwgY2VudGVyTWFwOiBmYWxzZX19KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBhZGRKb2luZWREYXRhc2V0VG9NYXAoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICByZXR1cm4gPFNwYXRpYWxKb2luVG9vbENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQXlCQSxJQUFBRyxJQUFBLEdBQUFILE9BQUE7QUFlQSxJQUFBSSxXQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxRQUFBLEdBQUFMLE9BQUE7QUFFQSxJQUFBTSxTQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFQLE9BQUE7QUFBdUUsU0FBQVEseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQs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