UNPKG

kepler.gl

Version:

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

194 lines (182 loc) 26.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.editTopMapStyle = exports.editBottomMapStyle = void 0; exports.getDefaultLayerGroupVisibility = getDefaultLayerGroupVisibility; exports.getStyleDownloadUrl = getStyleDownloadUrl; exports.getStyleImageIcon = getStyleImageIcon; exports.mergeLayerGroupVisibility = mergeLayerGroupVisibility; exports.scaleMapStyleByResolution = scaleMapStyleByResolution; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _lodash = _interopRequireDefault(require("lodash.memoize")); var _lodash2 = _interopRequireDefault(require("lodash.clonedeep")); var _constants = require("@kepler.gl/constants"); 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 getDefaultLayerGroupVisibility(_ref) { var _ref$layerGroups = _ref.layerGroups, layerGroups = _ref$layerGroups === void 0 ? [] : _ref$layerGroups; return layerGroups.reduce(function (accu, layer) { return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.slug, layer.defaultVisibility)); }, {}); } var resolver = function resolver(_ref2) { var id = _ref2.id, _ref2$visibleLayerGro = _ref2.visibleLayerGroups, visibleLayerGroups = _ref2$visibleLayerGro === void 0 ? {} : _ref2$visibleLayerGro; return "".concat(id, ":").concat(Object.keys(visibleLayerGroups).filter(function (d) { return visibleLayerGroups[d]; }).sort().join('-')); }; /** * Edit preset map style to keep only visible layers * * @param mapStyle - preset map style * @param visibleLayerGroups - visible layers of top map * @returns top map style */ var editTopMapStyle = exports.editTopMapStyle = (0, _lodash["default"])(function (_ref3) { var mapStyle = _ref3.mapStyle, visibleLayerGroups = _ref3.visibleLayerGroups; var visibleFilters = (mapStyle.layerGroups || []).filter(function (lg) { return visibleLayerGroups[lg.slug]; }).map(function (lg) { return lg.filter; }); // if top map // keep only visible layers // @ts-expect-error var filteredLayers = mapStyle.style.layers.filter(function (layer) { return visibleFilters.some(function (match) { return match(layer); }); }); return _objectSpread(_objectSpread({}, mapStyle.style), {}, { layers: filteredLayers }); }, resolver); /** * Edit preset map style to filter out invisible layers * * @param {Object} mapStyle - preset map style * @param {Object} visibleLayerGroups - visible layers of bottom map * @returns {Object} bottom map style */ var editBottomMapStyle = exports.editBottomMapStyle = (0, _lodash["default"])(function (_ref4) { var id = _ref4.id, mapStyle = _ref4.mapStyle, visibleLayerGroups = _ref4.visibleLayerGroups; if (id === _constants.NO_MAP_ID) { return _constants.EMPTY_MAPBOX_STYLE; } var invisibleFilters = (mapStyle.layerGroups || []).filter(function (lg) { return !visibleLayerGroups[lg.slug]; }).map(function (lg) { return lg.filter; }); // if bottom map // filter out invisible layers var filteredLayers = mapStyle.style.layers.filter(function (layer) { return invisibleFilters.every(function (match) { return !match(layer); }); }); return _objectSpread(_objectSpread({}, mapStyle.style), {}, { layers: filteredLayers }); }, resolver); function getStyleDownloadUrl(styleUrl, accessToken, mapboxApiUrl) { if (styleUrl.startsWith('http')) { return styleUrl; } // mapbox://styles/jckr/cjhcl0lxv13di2rpfoytdbdyj if (styleUrl.startsWith('mapbox://styles')) { var styleId = styleUrl.replace('mapbox://styles/', ''); // https://api.mapbox.com/styles/v1/heshan0131/cjg1bfumo1cwm2rlrjxkinfgw?pluginName=Keplergl&access_token=<token> return "".concat(mapboxApiUrl || _constants.DEFAULT_MAPBOX_API_URL, "/styles/v1/").concat(styleId, "?pluginName=Keplergl&access_token=").concat(accessToken); } // style url not recognized return null; } /** * Generate static map image from style Url to be used as icon * @param param * @param param.styleUrl * @param param.mapboxApiAccessToken * @param param.mapboxApiUrl * @param param.mapState * @param param.mapW * @param param.mapH */ function getStyleImageIcon(_ref5) { var styleUrl = _ref5.styleUrl, mapboxApiAccessToken = _ref5.mapboxApiAccessToken, _ref5$mapboxApiUrl = _ref5.mapboxApiUrl, mapboxApiUrl = _ref5$mapboxApiUrl === void 0 ? _constants.DEFAULT_MAPBOX_API_URL : _ref5$mapboxApiUrl, _ref5$mapState = _ref5.mapState, mapState = _ref5$mapState === void 0 ? { longitude: -122.3391, latitude: 37.7922, zoom: 9 } : _ref5$mapState, _ref5$mapW = _ref5.mapW, mapW = _ref5$mapW === void 0 ? 400 : _ref5$mapW, _ref5$mapH = _ref5.mapH, mapH = _ref5$mapH === void 0 ? 300 : _ref5$mapH; var styleId = styleUrl.replace('mapbox://styles/', ''); return "".concat(mapboxApiUrl, "/styles/v1/").concat(styleId, "/static/") + "".concat(mapState.longitude, ",").concat(mapState.latitude, ",").concat(mapState.zoom, ",0,0/") + "".concat(mapW, "x").concat(mapH) + "?access_token=".concat(mapboxApiAccessToken, "&logo=false&attribution=false"); } function scaleMapStyleByResolution(mapboxStyle, scale) { if (scale !== 1 && mapboxStyle) { var labelLayerGroup = _constants.DEFAULT_LAYER_GROUPS.find(function (lg) { return lg.slug === 'label'; }); // @ts-ignore var labelLayerFilter = labelLayerGroup.filter; var zoomOffset = Math.log2(scale); var copyStyle = (0, _lodash2["default"])(mapboxStyle); (copyStyle.layers || []).forEach(function (d) { // edit minzoom and maxzoom if (d.maxzoom) { d.maxzoom = Math.max(d.maxzoom + zoomOffset, 1); // The maximum zoom is 24 // https://github.com/visgl/react-map-gl/blob/master/docs/api-reference/map.md#maxzoom-number-maxzoom if (d.maxzoom > 24) { d.maxzoom = 24; } } if (d.minzoom) { d.minzoom = Math.max(d.minzoom + zoomOffset, 1); } // edit text size if (labelLayerFilter(d)) { if (d.layout && d.layout['text-size'] && Array.isArray(d.layout['text-size'].stops)) { d.layout['text-size'].stops.forEach(function (stop) { // zoom stop[0] = Math.max(stop[0] + zoomOffset, 1); // size stop[1] *= scale; }); } } }); return copyStyle; } return mapboxStyle; } /** * When switch to a new style, try to keep current layer group visibility * by merging default and current * @param {Object} defaultLayerGroup * @param {Object} currentLayerGroup * @return {Object} mergedLayerGroups */ function mergeLayerGroupVisibility(defaultLayerGroup, currentLayerGroup) { return Object.keys(defaultLayerGroup).reduce(function (accu, key) { return _objectSpread(_objectSpread({}, accu), Object.prototype.hasOwnProperty.call(currentLayerGroup, key) ? (0, _defineProperty2["default"])({}, key, currentLayerGroup[key]) : {}); }, defaultLayerGroup); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbG9kYXNoMiIsIl9jb25zdGFudHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImdldERlZmF1bHRMYXllckdyb3VwVmlzaWJpbGl0eSIsIl9yZWYiLCJfcmVmJGxheWVyR3JvdXBzIiwibGF5ZXJHcm91cHMiLCJyZWR1Y2UiLCJhY2N1IiwibGF5ZXIiLCJzbHVnIiwiZGVmYXVsdFZpc2liaWxpdHkiLCJyZXNvbHZlciIsIl9yZWYyIiwiaWQiLCJfcmVmMiR2aXNpYmxlTGF5ZXJHcm8iLCJ2aXNpYmxlTGF5ZXJHcm91cHMiLCJjb25jYXQiLCJkIiwic29ydCIsImpvaW4iLCJlZGl0VG9wTWFwU3R5bGUiLCJleHBvcnRzIiwibWVtb2l6ZSIsIl9yZWYzIiwibWFwU3R5bGUiLCJ2aXNpYmxlRmlsdGVycyIsImxnIiwibWFwIiwiZmlsdGVyZWRMYXllcnMiLCJzdHlsZSIsImxheWVycyIsInNvbWUiLCJtYXRjaCIsImVkaXRCb3R0b21NYXBTdHlsZSIsIl9yZWY0IiwiTk9fTUFQX0lEIiwiRU1QVFlfTUFQQk9YX1NUWUxFIiwiaW52aXNpYmxlRmlsdGVycyIsImV2ZXJ5IiwiZ2V0U3R5bGVEb3dubG9hZFVybCIsInN0eWxlVXJsIiwiYWNjZXNzVG9rZW4iLCJtYXBib3hBcGlVcmwiLCJzdGFydHNXaXRoIiwic3R5bGVJZCIsInJlcGxhY2UiLCJERUZBVUxUX01BUEJPWF9BUElfVVJMIiwiZ2V0U3R5bGVJbWFnZUljb24iLCJfcmVmNSIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwiX3JlZjUkbWFwYm94QXBpVXJsIiwiX3JlZjUkbWFwU3RhdGUiLCJtYXBTdGF0ZSIsImxvbmdpdHVkZSIsImxhdGl0dWRlIiwiem9vbSIsIl9yZWY1JG1hcFciLCJtYXBXIiwiX3JlZjUkbWFwSCIsIm1hcEgiLCJzY2FsZU1hcFN0eWxlQnlSZXNvbHV0aW9uIiwibWFwYm94U3R5bGUiLCJzY2FsZSIsImxhYmVsTGF5ZXJHcm91cCIsIkRFRkFVTFRfTEFZRVJfR1JPVVBTIiwiZmluZCIsImxhYmVsTGF5ZXJGaWx0ZXIiLCJ6b29tT2Zmc2V0IiwiTWF0aCIsImxvZzIiLCJjb3B5U3R5bGUiLCJjbG9uZERlZXAiLCJtYXh6b29tIiwibWF4IiwibWluem9vbSIsImxheW91dCIsIkFycmF5IiwiaXNBcnJheSIsInN0b3BzIiwic3RvcCIsIm1lcmdlTGF5ZXJHcm91cFZpc2liaWxpdHkiLCJkZWZhdWx0TGF5ZXJHcm91cCIsImN1cnJlbnRMYXllckdyb3VwIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hcC1zdHlsZS11dGlscy9tYXBib3gtZ2wtc3R5bGUtZWRpdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBtZW1vaXplIGZyb20gJ2xvZGFzaC5tZW1vaXplJztcbmltcG9ydCBjbG9uZERlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQge1xuICBERUZBVUxUX0xBWUVSX0dST1VQUyxcbiAgREVGQVVMVF9NQVBCT1hfQVBJX1VSTCxcbiAgTk9fTUFQX0lELFxuICBFTVBUWV9NQVBCT1hfU1RZTEVcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtCYXNlTWFwU3R5bGUsIExheWVyR3JvdXAsIE1hcFN0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRMYXllckdyb3VwVmlzaWJpbGl0eSh7bGF5ZXJHcm91cHMgPSBbXX06IHtsYXllckdyb3VwczogTGF5ZXJHcm91cFtdfSkge1xuICByZXR1cm4gbGF5ZXJHcm91cHMucmVkdWNlKFxuICAgIChhY2N1LCBsYXllcikgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICBbbGF5ZXIuc2x1Z106IGxheWVyLmRlZmF1bHRWaXNpYmlsaXR5XG4gICAgfSksXG4gICAge31cbiAgKTtcbn1cblxuY29uc3QgcmVzb2x2ZXIgPSAoe1xuICBpZCxcbiAgdmlzaWJsZUxheWVyR3JvdXBzID0ge31cbn06IHtcbiAgaWQ/OiBzdHJpbmc7XG4gIG1hcFN0eWxlOiBCYXNlTWFwU3R5bGU7XG4gIHZpc2libGVMYXllckdyb3Vwczoge1tpZDogc3RyaW5nXTogTGF5ZXJHcm91cCB8IGJvb2xlYW59IHwgZmFsc2U7XG59KSA9PlxuICBgJHtpZH06JHtPYmplY3Qua2V5cyh2aXNpYmxlTGF5ZXJHcm91cHMpXG4gICAgLmZpbHRlcihkID0+IHZpc2libGVMYXllckdyb3Vwc1tkXSlcbiAgICAuc29ydCgpXG4gICAgLmpvaW4oJy0nKX1gO1xuXG4vKipcbiAqIEVkaXQgcHJlc2V0IG1hcCBzdHlsZSB0byBrZWVwIG9ubHkgdmlzaWJsZSBsYXllcnNcbiAqXG4gKiBAcGFyYW0gbWFwU3R5bGUgLSBwcmVzZXQgbWFwIHN0eWxlXG4gKiBAcGFyYW0gdmlzaWJsZUxheWVyR3JvdXBzIC0gdmlzaWJsZSBsYXllcnMgb2YgdG9wIG1hcFxuICogQHJldHVybnMgdG9wIG1hcCBzdHlsZVxuICovXG5leHBvcnQgY29uc3QgZWRpdFRvcE1hcFN0eWxlID0gbWVtb2l6ZShcbiAgKHtcbiAgICBtYXBTdHlsZSxcbiAgICB2aXNpYmxlTGF5ZXJHcm91cHNcbiAgfToge1xuICAgIGlkPzogc3RyaW5nO1xuICAgIG1hcFN0eWxlOiBCYXNlTWFwU3R5bGU7XG4gICAgdmlzaWJsZUxheWVyR3JvdXBzOiB7W2lkOiBzdHJpbmddOiBMYXllckdyb3VwIHwgYm9vbGVhbn0gfCBmYWxzZTtcbiAgfSkgPT4ge1xuICAgIGNvbnN0IHZpc2libGVGaWx0ZXJzID0gKG1hcFN0eWxlLmxheWVyR3JvdXBzIHx8IFtdKVxuICAgICAgLmZpbHRlcihsZyA9PiB2aXNpYmxlTGF5ZXJHcm91cHNbbGcuc2x1Z10pXG4gICAgICAubWFwKGxnID0+IGxnLmZpbHRlcik7XG5cbiAgICAvLyBpZiB0b3AgbWFwXG4gICAgLy8ga2VlcCBvbmx5IHZpc2libGUgbGF5ZXJzXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGNvbnN0IGZpbHRlcmVkTGF5ZXJzID0gbWFwU3R5bGUuc3R5bGUubGF5ZXJzLmZpbHRlcihsYXllciA9PlxuICAgICAgdmlzaWJsZUZpbHRlcnMuc29tZShtYXRjaCA9PiBtYXRjaChsYXllcikpXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5tYXBTdHlsZS5zdHlsZSxcbiAgICAgIGxheWVyczogZmlsdGVyZWRMYXllcnNcbiAgICB9O1xuICB9LFxuICByZXNvbHZlclxuKTtcblxuLyoqXG4gKiBFZGl0IHByZXNldCBtYXAgc3R5bGUgdG8gZmlsdGVyIG91dCBpbnZpc2libGUgbGF5ZXJzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1hcFN0eWxlIC0gcHJlc2V0IG1hcCBzdHlsZVxuICogQHBhcmFtIHtPYmplY3R9IHZpc2libGVMYXllckdyb3VwcyAtIHZpc2libGUgbGF5ZXJzIG9mIGJvdHRvbSBtYXBcbiAqIEByZXR1cm5zIHtPYmplY3R9IGJvdHRvbSBtYXAgc3R5bGVcbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRCb3R0b21NYXBTdHlsZSA9IG1lbW9pemUoKHtpZCwgbWFwU3R5bGUsIHZpc2libGVMYXllckdyb3Vwc30pID0+IHtcbiAgaWYgKGlkID09PSBOT19NQVBfSUQpIHtcbiAgICByZXR1cm4gRU1QVFlfTUFQQk9YX1NUWUxFO1xuICB9XG5cbiAgY29uc3QgaW52aXNpYmxlRmlsdGVycyA9IChtYXBTdHlsZS5sYXllckdyb3VwcyB8fCBbXSlcbiAgICAuZmlsdGVyKGxnID0+ICF2aXNpYmxlTGF5ZXJHcm91cHNbbGcuc2x1Z10pXG4gICAgLm1hcChsZyA9PiBsZy5maWx0ZXIpO1xuXG4gIC8vIGlmIGJvdHRvbSBtYXBcbiAgLy8gZmlsdGVyIG91dCBpbnZpc2libGUgbGF5ZXJzXG4gIGNvbnN0IGZpbHRlcmVkTGF5ZXJzID0gbWFwU3R5bGUuc3R5bGUubGF5ZXJzLmZpbHRlcihsYXllciA9PlxuICAgIGludmlzaWJsZUZpbHRlcnMuZXZlcnkobWF0Y2ggPT4gIW1hdGNoKGxheWVyKSlcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIC4uLm1hcFN0eWxlLnN0eWxlLFxuICAgIGxheWVyczogZmlsdGVyZWRMYXllcnNcbiAgfTtcbn0sIHJlc29sdmVyKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlRG93bmxvYWRVcmwoc3R5bGVVcmwsIGFjY2Vzc1Rva2VuLCBtYXBib3hBcGlVcmwpIHtcbiAgaWYgKHN0eWxlVXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgIHJldHVybiBzdHlsZVVybDtcbiAgfVxuXG4gIC8vIG1hcGJveDovL3N0eWxlcy9qY2tyL2NqaGNsMGx4djEzZGkycnBmb3l0ZGJkeWpcbiAgaWYgKHN0eWxlVXJsLnN0YXJ0c1dpdGgoJ21hcGJveDovL3N0eWxlcycpKSB7XG4gICAgY29uc3Qgc3R5bGVJZCA9IHN0eWxlVXJsLnJlcGxhY2UoJ21hcGJveDovL3N0eWxlcy8nLCAnJyk7XG5cbiAgICAvLyBodHRwczovL2FwaS5tYXBib3guY29tL3N0eWxlcy92MS9oZXNoYW4wMTMxL2NqZzFiZnVtbzFjd20ycmxyanhraW5mZ3c/cGx1Z2luTmFtZT1LZXBsZXJnbCZhY2Nlc3NfdG9rZW49PHRva2VuPlxuICAgIHJldHVybiBgJHtcbiAgICAgIG1hcGJveEFwaVVybCB8fCBERUZBVUxUX01BUEJPWF9BUElfVVJMXG4gICAgfS9zdHlsZXMvdjEvJHtzdHlsZUlkfT9wbHVnaW5OYW1lPUtlcGxlcmdsJmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWA7XG4gIH1cblxuICAvLyBzdHlsZSB1cmwgbm90IHJlY29nbml6ZWRcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgc3RhdGljIG1hcCBpbWFnZSBmcm9tIHN0eWxlIFVybCB0byBiZSB1c2VkIGFzIGljb25cbiAqIEBwYXJhbSBwYXJhbVxuICogQHBhcmFtIHBhcmFtLnN0eWxlVXJsXG4gKiBAcGFyYW0gcGFyYW0ubWFwYm94QXBpQWNjZXNzVG9rZW5cbiAqIEBwYXJhbSBwYXJhbS5tYXBib3hBcGlVcmxcbiAqIEBwYXJhbSBwYXJhbS5tYXBTdGF0ZVxuICogQHBhcmFtIHBhcmFtLm1hcFdcbiAqIEBwYXJhbSBwYXJhbS5tYXBIXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHlsZUltYWdlSWNvbih7XG4gIHN0eWxlVXJsLFxuICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgbWFwYm94QXBpVXJsID0gREVGQVVMVF9NQVBCT1hfQVBJX1VSTCxcbiAgbWFwU3RhdGUgPSB7XG4gICAgbG9uZ2l0dWRlOiAtMTIyLjMzOTEsXG4gICAgbGF0aXR1ZGU6IDM3Ljc5MjIsXG4gICAgem9vbTogOVxuICB9LFxuICBtYXBXID0gNDAwLFxuICBtYXBIID0gMzAwXG59OiB7XG4gIHN0eWxlVXJsOiBzdHJpbmc7XG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIG1hcGJveEFwaVVybD86IHN0cmluZztcbiAgbWFwU3RhdGU/OiBQYXJ0aWFsPE1hcFN0YXRlPjtcbiAgbWFwVz86IG51bWJlcjtcbiAgbWFwSD86IG51bWJlcjtcbn0pIHtcbiAgY29uc3Qgc3R5bGVJZCA9IHN0eWxlVXJsLnJlcGxhY2UoJ21hcGJveDovL3N0eWxlcy8nLCAnJyk7XG5cbiAgcmV0dXJuIChcbiAgICBgJHttYXBib3hBcGlVcmx9L3N0eWxlcy92MS8ke3N0eWxlSWR9L3N0YXRpYy9gICtcbiAgICBgJHttYXBTdGF0ZS5sb25naXR1ZGV9LCR7bWFwU3RhdGUubGF0aXR1ZGV9LCR7bWFwU3RhdGUuem9vbX0sMCwwL2AgK1xuICAgIGAke21hcFd9eCR7bWFwSH1gICtcbiAgICBgP2FjY2Vzc190b2tlbj0ke21hcGJveEFwaUFjY2Vzc1Rva2VufSZsb2dvPWZhbHNlJmF0dHJpYnV0aW9uPWZhbHNlYFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbihtYXBib3hTdHlsZSwgc2NhbGUpIHtcbiAgaWYgKHNjYWxlICE9PSAxICYmIG1hcGJveFN0eWxlKSB7XG4gICAgY29uc3QgbGFiZWxMYXllckdyb3VwID0gREVGQVVMVF9MQVlFUl9HUk9VUFMuZmluZChsZyA9PiBsZy5zbHVnID09PSAnbGFiZWwnKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3Qge2ZpbHRlcjogbGFiZWxMYXllckZpbHRlcn0gPSBsYWJlbExheWVyR3JvdXA7XG4gICAgY29uc3Qgem9vbU9mZnNldCA9IE1hdGgubG9nMihzY2FsZSk7XG5cbiAgICBjb25zdCBjb3B5U3R5bGUgPSBjbG9uZERlZXAobWFwYm94U3R5bGUpO1xuICAgIChjb3B5U3R5bGUubGF5ZXJzIHx8IFtdKS5mb3JFYWNoKGQgPT4ge1xuICAgICAgLy8gZWRpdCBtaW56b29tIGFuZCBtYXh6b29tXG4gICAgICBpZiAoZC5tYXh6b29tKSB7XG4gICAgICAgIGQubWF4em9vbSA9IE1hdGgubWF4KGQubWF4em9vbSArIHpvb21PZmZzZXQsIDEpO1xuXG4gICAgICAgIC8vIFRoZSBtYXhpbXVtIHpvb20gaXMgMjRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Zpc2dsL3JlYWN0LW1hcC1nbC9ibG9iL21hc3Rlci9kb2NzL2FwaS1yZWZlcmVuY2UvbWFwLm1kI21heHpvb20tbnVtYmVyLW1heHpvb21cbiAgICAgICAgaWYgKGQubWF4em9vbSA+IDI0KSB7XG4gICAgICAgICAgZC5tYXh6b29tID0gMjQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGQubWluem9vbSkge1xuICAgICAgICBkLm1pbnpvb20gPSBNYXRoLm1heChkLm1pbnpvb20gKyB6b29tT2Zmc2V0LCAxKTtcbiAgICAgIH1cblxuICAgICAgLy8gZWRpdCB0ZXh0IHNpemVcbiAgICAgIGlmIChsYWJlbExheWVyRmlsdGVyKGQpKSB7XG4gICAgICAgIGlmIChkLmxheW91dCAmJiBkLmxheW91dFsndGV4dC1zaXplJ10gJiYgQXJyYXkuaXNBcnJheShkLmxheW91dFsndGV4dC1zaXplJ10uc3RvcHMpKSB7XG4gICAgICAgICAgZC5sYXlvdXRbJ3RleHQtc2l6ZSddLnN0b3BzLmZvckVhY2goc3RvcCA9PiB7XG4gICAgICAgICAgICAvLyB6b29tXG4gICAgICAgICAgICBzdG9wWzBdID0gTWF0aC5tYXgoc3RvcFswXSArIHpvb21PZmZzZXQsIDEpO1xuICAgICAgICAgICAgLy8gc2l6ZVxuICAgICAgICAgICAgc3RvcFsxXSAqPSBzY2FsZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvcHlTdHlsZTtcbiAgfVxuXG4gIHJldHVybiBtYXBib3hTdHlsZTtcbn1cblxuLyoqXG4gKiBXaGVuIHN3aXRjaCB0byBhIG5ldyBzdHlsZSwgdHJ5IHRvIGtlZXAgY3VycmVudCBsYXllciBncm91cCB2aXNpYmlsaXR5XG4gKiBieSBtZXJnaW5nIGRlZmF1bHQgYW5kIGN1cnJlbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0TGF5ZXJHcm91cFxuICogQHBhcmFtIHtPYmplY3R9IGN1cnJlbnRMYXllckdyb3VwXG4gKiBAcmV0dXJuIHtPYmplY3R9IG1lcmdlZExheWVyR3JvdXBzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxheWVyR3JvdXBWaXNpYmlsaXR5KGRlZmF1bHRMYXllckdyb3VwLCBjdXJyZW50TGF5ZXJHcm91cCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZGVmYXVsdExheWVyR3JvdXApLnJlZHVjZShcbiAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIC4uLihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudExheWVyR3JvdXAsIGtleSlcbiAgICAgICAgPyB7W2tleV06IGN1cnJlbnRMYXllckdyb3VwW2tleV19XG4gICAgICAgIDoge30pXG4gICAgfSksXG4gICAgZGVmYXVsdExheWVyR3JvdXBcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUYsT0FBQTtBQUs4QixTQUFBRyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixD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UUFDaEI7TUFDRjtNQUVBLElBQUl2RCxDQUFDLENBQUN5RCxPQUFPLEVBQUU7UUFDYnpELENBQUMsQ0FBQ3lELE9BQU8sR0FBR04sSUFBSSxDQUFDSyxHQUFHLENBQUN4RCxDQUFDLENBQUN5RCxPQUFPLEdBQUdQLFVBQVUsRUFBRSxDQUFDLENBQUM7TUFDakQ7O01BRUE7TUFDQSxJQUFJRCxnQkFBZ0IsQ0FBQ2pELENBQUMsQ0FBQyxFQUFFO1FBQ3ZCLElBQUlBLENBQUMsQ0FBQzBELE1BQU0sSUFBSTFELENBQUMsQ0FBQzBELE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSUMsS0FBSyxDQUFDQyxPQUFPLENBQUM1RCxDQUFDLENBQUMwRCxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUNHLEtBQUssQ0FBQyxFQUFFO1VBQ25GN0QsQ0FBQyxDQUFDMEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDRyxLQUFLLENBQUNqRixPQUFPLENBQUMsVUFBQWtGLElBQUksRUFBSTtZQUMxQztZQUNBQSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUdYLElBQUksQ0FBQ0ssR0FBRyxDQUFDTSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUdaLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDM0M7WUFDQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJakIsS0FBSztVQUNsQixDQUFDLENBQUM7UUFDSjtNQUNGO0lBQ0YsQ0FBQyxDQUFDO0lBRUYsT0FBT1EsU0FBUztFQUNsQjtFQUVBLE9BQU9ULFdBQVc7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTbUIseUJBQXlCQSxDQUFDQyxpQkFBaUIsRUFBRUMsaUJBQWlCLEVBQUU7RUFDOUUsT0FBT2pHLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDK0YsaUJBQWlCLENBQUMsQ0FBQzNFLE1BQU0sQ0FDMUMsVUFBQ0MsSUFBSSxFQUFFNEUsR0FBRztJQUFBLE9BQUF6RixhQUFBLENBQUFBLGFBQUEsS0FDTGEsSUFBSSxHQUNIdEIsTUFBTSxDQUFDbUcsU0FBUyxDQUFDQyxjQUFjLENBQUNDLElBQUksQ0FBQ0osaUJBQWlCLEVBQUVDLEdBQUcsQ0FBQyxPQUFBckYsZ0JBQUEsaUJBQzFEcUYsR0FBRyxFQUFHRCxpQkFBaUIsQ0FBQ0MsR0FBRyxDQUFDLElBQzlCLENBQUMsQ0FBQztFQUFBLENBQ04sRUFDRkYsaUJBQ0YsQ0FBQztBQUNIIiwiaWdub3JlTGlzdCI6W119