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
JavaScript
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
;