kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
174 lines (144 loc) • 19.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.generateMapboxLayers = generateMapboxLayers;
exports.geojsonFromPoints = geojsonFromPoints;
exports.updateMapboxLayers = updateMapboxLayers;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _baseLayer = require("./base-layer");
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; }
/**
* This function will convert layers to mapbox layers
* @param {Array<Object>} layers the layers to be converted
* @param {Array<Object>} layerData extra layer information
* @param {Array<Number>} layerOrder the order by which we should convert layers
* @param {Object} layersToRender {[id]: true | false} object whether each layer should be rendered
* @returns {Object} {[id]: layer}
*/
function generateMapboxLayers() {
var layers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var layerData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var layerOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
var layersToRender = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
if (layerData.length > 0) {
return layerOrder.slice().reverse().filter(function (idx) {
return layers[idx].overlayType === _baseLayer.OVERLAY_TYPE.mapboxgl && layersToRender[layers[idx].id];
}).reduce(function (accu, index) {
var layer = layers[index];
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, {
id: layer.id,
data: layerData[index].data,
isVisible: layer.config.isVisible,
config: layerData[index].config,
sourceId: layerData[index].config.source
}));
}, {});
}
return {};
}
/**
* Update mapbox layers on the given map
* @param {Object} map
* @param {Object} newLayers Map of new mapbox layers to be displayed
* @param {Object} oldLayers Map of the old layers to be compare with the current ones to detect deleted layers
* {layerId: sourceId}
*/
function updateMapboxLayers(map) {
var newLayers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var oldLayers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
// delete no longer existed old layers
if (oldLayers) {
checkAndRemoveOldLayers(map, oldLayers, newLayers);
} // insert or update new layer
Object.values(newLayers).forEach(function (overlay) {
var layerId = overlay.id,
config = overlay.config,
data = overlay.data,
sourceId = overlay.sourceId,
isVisible = overlay.isVisible;
if (!data && !config) {
return;
}
var _ref = oldLayers && oldLayers[layerId] || {},
oldData = _ref.data,
oldConfig = _ref.config;
if (data && data !== oldData) {
updateSourceData(map, sourceId, data);
} // compare with previous configs
if (oldConfig !== config) {
updateLayerConfig(map, layerId, config, isVisible);
}
});
}
function checkAndRemoveOldLayers(map, oldLayers, newLayers) {
Object.keys(oldLayers).forEach(function (layerId) {
if (!newLayers[layerId]) {
map.removeLayer(layerId);
}
});
}
function updateLayerConfig(map, layerId, config, isVisible) {
var mapboxLayer = map.getLayer(layerId);
if (mapboxLayer) {
// check if layer already is set
// remove it if exists
map.removeLayer(layerId);
}
map.addLayer(config);
map.setLayoutProperty(layerId, 'visibility', isVisible ? 'visible' : 'none');
}
function updateSourceData(map, sourceId, data) {
var source = map.getSource(sourceId);
if (!source) {
map.addSource(sourceId, {
type: 'geojson',
data: data
});
} else {
source.setData(data);
}
}
/**
*
* @param points
* @param columns {
* lat: {fieldIdx},
* lng: {fieldIdx},
* alt: {fieldIdx}
* }
* @param properties [{label: {fieldIdx}]
* @returns {{type: string, properties: {}, features: {type: string, properties: {}, geometry: {type: string, coordinates: *[]}}[]}}
*/
function geojsonFromPoints() {
var allData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var filteredIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var columns = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var properties = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
var geojson = {
type: 'FeatureCollection',
features: []
};
var _loop = function _loop() {
var point = allData[filteredIndex[i]];
geojson.features.push({
type: 'Feature',
properties: properties.reduce(function (_final, property) {
return _objectSpread(_objectSpread({}, _final), {}, (0, _defineProperty2["default"])({}, property.name, point[property.tableFieldIndex - 1]));
}, {}),
geometry: {
type: 'Point',
coordinates: [columns.lng ? point[columns.lng.fieldIdx] : null, // lng
columns.lat ? point[columns.lat.fieldIdx] : null // lat
]
}
});
};
for (var i = 0; i < filteredIndex.length; i++) {
_loop();
}
return geojson;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvbWFwYm94LXV0aWxzLmpzIl0sIm5hbWVzIjpbImdlbmVyYXRlTWFwYm94TGF5ZXJzIiwibGF5ZXJzIiwibGF5ZXJEYXRhIiwibGF5ZXJPcmRlciIsImxheWVyc1RvUmVuZGVyIiwibGVuZ3RoIiwic2xpY2UiLCJyZXZlcnNlIiwiZmlsdGVyIiwiaWR4Iiwib3ZlcmxheVR5cGUiLCJPVkVSTEFZX1RZUEUiLCJtYXBib3hnbCIsImlkIiwicmVkdWNlIiwiYWNjdSIsImluZGV4IiwibGF5ZXIiLCJkYXRhIiwiaXNWaXNpYmxlIiwiY29uZmlnIiwic291cmNlSWQiLCJzb3VyY2UiLCJ1cGRhdGVNYXBib3hMYXllcnMiLCJtYXAiLCJuZXdMYXllcnMiLCJvbGRMYXllcnMiLCJjaGVja0FuZFJlbW92ZU9sZExheWVycyIsIk9iamVjdCIsInZhbHVlcyIsImZvckVhY2giLCJvdmVybGF5IiwibGF5ZXJJZCIsIm9sZERhdGEiLCJvbGRDb25maWciLCJ1cGRhdGVTb3VyY2VEYXRhIiwidXBkYXRlTGF5ZXJDb25maWciLCJrZXlzIiwicmVtb3ZlTGF5ZXIiLCJtYXBib3hMYXllciIsImdldExheWVyIiwiYWRkTGF5ZXIiLCJzZXRMYXlvdXRQcm9wZXJ0eSIsImdldFNvdXJjZSIsImFkZFNvdXJjZSIsInR5cGUiLCJzZXREYXRhIiwiZ2VvanNvbkZyb21Qb2ludHMiLCJhbGxEYXRhIiwiZmlsdGVyZWRJbmRleCIsImNvbHVtbnMiLCJwcm9wZXJ0aWVzIiwiZ2VvanNvbiIsImZlYXR1cmVzIiwicG9pbnQiLCJpIiwicHVzaCIsImZpbmFsIiwicHJvcGVydHkiLCJuYW1lIiwidGFibGVGaWVsZEluZGV4IiwiZ2VvbWV0cnkiLCJjb29yZGluYXRlcyIsImxuZyIsImZpZWxkSWR4IiwibGF0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBb0JBOzs7Ozs7QUFFQTs7Ozs7Ozs7QUFRTyxTQUFTQSxvQkFBVCxHQUtMO0FBQUEsTUFKQUMsTUFJQSx1RUFKUyxFQUlUO0FBQUEsTUFIQUMsU0FHQSx1RUFIWSxFQUdaO0FBQUEsTUFGQUMsVUFFQSx1RUFGYSxFQUViO0FBQUEsTUFEQUMsY0FDQSx1RUFEaUIsRUFDakI7O0FBQ0EsTUFBSUYsU0FBUyxDQUFDRyxNQUFWLEdBQW1CLENBQXZCLEVBQTBCO0FBQ3hCLFdBQU9GLFVBQVUsQ0FDZEcsS0FESSxHQUVKQyxPQUZJLEdBR0pDLE1BSEksQ0FJSCxVQUFBQyxHQUFHO0FBQUEsYUFDRFIsTUFBTSxDQUFDUSxHQUFELENBQU4sQ0FBWUMsV0FBWixLQUE0QkMsd0JBQWFDLFFBQXpDLElBQ0FSLGNBQWMsQ0FBQ0gsTUFBTSxDQUFDUSxHQUFELENBQU4sQ0FBWUksRUFBYixDQUZiO0FBQUEsS0FKQSxFQVFKQyxNQVJJLENBUUcsVUFBQ0MsSUFBRCxFQUFPQyxLQUFQLEVBQWlCO0FBQ3ZCLFVBQU1DLEtBQUssR0FBR2hCLE1BQU0sQ0FBQ2UsS0FBRCxDQUFwQjtBQUNBLDZDQUNLRCxJQURMLDRDQUVHRSxLQUFLLENBQUNKLEVBRlQsRUFFYztBQUNWQSxRQUFBQSxFQUFFLEVBQUVJLEtBQUssQ0FBQ0osRUFEQTtBQUVWSyxRQUFBQSxJQUFJLEVBQUVoQixTQUFTLENBQUNjLEtBQUQsQ0FBVCxDQUFpQkUsSUFGYjtBQUdWQyxRQUFBQSxTQUFTLEVBQUVGLEtBQUssQ0FBQ0csTUFBTixDQUFhRCxTQUhkO0FBSVZDLFFBQUFBLE1BQU0sRUFBRWxCLFNBQVMsQ0FBQ2MsS0FBRCxDQUFULENBQWlCSSxNQUpmO0FBS1ZDLFFBQUFBLFFBQVEsRUFBRW5CLFNBQVMsQ0FBQ2MsS0FBRCxDQUFULENBQWlCSSxNQUFqQixDQUF3QkU7QUFMeEIsT0FGZDtBQVVELEtBcEJJLEVBb0JGLEVBcEJFLENBQVA7QUFxQkQ7O0FBRUQsU0FBTyxFQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7O0FBT08sU0FBU0Msa0JBQVQsQ0FBNEJDLEdBQTVCLEVBQW1FO0FBQUEsTUFBbENDLFNBQWtDLHVFQUF0QixFQUFzQjtBQUFBLE1BQWxCQyxTQUFrQix1RUFBTixJQUFNOztBQUN4RTtBQUNBLE1BQUlBLFNBQUosRUFBZTtBQUNiQyxJQUFBQSx1QkFBdUIsQ0FBQ0gsR0FBRCxFQUFNRSxTQUFOLEVBQWlCRCxTQUFqQixDQUF2QjtBQUNELEdBSnVFLENBTXhFOzs7QUFDQUcsRUFBQUEsTUFBTSxDQUFDQyxNQUFQLENBQWNKLFNBQWQsRUFBeUJLLE9BQXpCLENBQWlDLFVBQUFDLE9BQU8sRUFBSTtBQUMxQyxRQUFXQyxPQUFYLEdBQXlERCxPQUF6RCxDQUFPbEIsRUFBUDtBQUFBLFFBQW9CTyxNQUFwQixHQUF5RFcsT0FBekQsQ0FBb0JYLE1BQXBCO0FBQUEsUUFBNEJGLElBQTVCLEdBQXlEYSxPQUF6RCxDQUE0QmIsSUFBNUI7QUFBQSxRQUFrQ0csUUFBbEMsR0FBeURVLE9BQXpELENBQWtDVixRQUFsQztBQUFBLFFBQTRDRixTQUE1QyxHQUF5RFksT0FBekQsQ0FBNENaLFNBQTVDOztBQUNBLFFBQUksQ0FBQ0QsSUFBRCxJQUFTLENBQUNFLE1BQWQsRUFBc0I7QUFDcEI7QUFDRDs7QUFFRCxlQUNHTSxTQUFTLElBQUlBLFNBQVMsQ0FBQ00sT0FBRCxDQUF2QixJQUFxQyxFQUR2QztBQUFBLFFBQWFDLE9BQWIsUUFBT2YsSUFBUDtBQUFBLFFBQThCZ0IsU0FBOUIsUUFBc0JkLE1BQXRCOztBQUdBLFFBQUlGLElBQUksSUFBSUEsSUFBSSxLQUFLZSxPQUFyQixFQUE4QjtBQUM1QkUsTUFBQUEsZ0JBQWdCLENBQUNYLEdBQUQsRUFBTUgsUUFBTixFQUFnQkgsSUFBaEIsQ0FBaEI7QUFDRCxLQVh5QyxDQWExQzs7O0FBQ0EsUUFBSWdCLFNBQVMsS0FBS2QsTUFBbEIsRUFBMEI7QUFDeEJnQixNQUFBQSxpQkFBaUIsQ0FBQ1osR0FBRCxFQUFNUSxPQUFOLEVBQWVaLE1BQWYsRUFBdUJELFNBQXZCLENBQWpCO0FBQ0Q7QUFDRixHQWpCRDtBQWtCRDs7QUFFRCxTQUFTUSx1QkFBVCxDQUFpQ0gsR0FBakMsRUFBc0NFLFNBQXRDLEVBQWlERCxTQUFqRCxFQUE0RDtBQUMxREcsRUFBQUEsTUFBTSxDQUFDUyxJQUFQLENBQVlYLFNBQVosRUFBdUJJLE9BQXZCLENBQStCLFVBQUFFLE9BQU8sRUFBSTtBQUN4QyxRQUFJLENBQUNQLFNBQVMsQ0FBQ08sT0FBRCxDQUFkLEVBQXlCO0FBQ3ZCUixNQUFBQSxHQUFHLENBQUNjLFdBQUosQ0FBZ0JOLE9BQWhCO0FBQ0Q7QUFDRixHQUpEO0FBS0Q7O0FBRUQsU0FBU0ksaUJBQVQsQ0FBMkJaLEdBQTNCLEVBQWdDUSxPQUFoQyxFQUF5Q1osTUFBekMsRUFBaURELFNBQWpELEVBQTREO0FBQzFELE1BQU1vQixXQUFXLEdBQUdmLEdBQUcsQ0FBQ2dCLFFBQUosQ0FBYVIsT0FBYixDQUFwQjs7QUFFQSxNQUFJTyxXQUFKLEVBQWlCO0FBQ2Y7QUFDQTtBQUNBZixJQUFBQSxHQUFHLENBQUNjLFdBQUosQ0FBZ0JOLE9BQWhCO0FBQ0Q7O0FBRURSLEVBQUFBLEdBQUcsQ0FBQ2lCLFFBQUosQ0FBYXJCLE1BQWI7QUFDQUksRUFBQUEsR0FBRyxDQUFDa0IsaUJBQUosQ0FBc0JWLE9BQXRCLEVBQStCLFlBQS9CLEVBQTZDYixTQUFTLEdBQUcsU0FBSCxHQUFlLE1BQXJFO0FBQ0Q7O0FBRUQsU0FBU2dCLGdCQUFULENBQTBCWCxHQUExQixFQUErQkgsUUFBL0IsRUFBeUNILElBQXpDLEVBQStDO0FBQzdDLE1BQU1JLE1BQU0sR0FBR0UsR0FBRyxDQUFDbUIsU0FBSixDQUFjdEIsUUFBZCxDQUFmOztBQUVBLE1BQUksQ0FBQ0MsTUFBTCxFQUFhO0FBQ1hFLElBQUFBLEdBQUcsQ0FBQ29CLFNBQUosQ0FBY3ZCLFFBQWQsRUFBd0I7QUFDdEJ3QixNQUFBQSxJQUFJLEVBQUUsU0FEZ0I7QUFFdEIzQixNQUFBQSxJQUFJLEVBQUpBO0FBRnNCLEtBQXhCO0FBSUQsR0FMRCxNQUtPO0FBQ0xJLElBQUFBLE1BQU0sQ0FBQ3dCLE9BQVAsQ0FBZTVCLElBQWY7QUFDRDtBQUNGO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7QUFXTyxTQUFTNkIsaUJBQVQsR0FLTDtBQUFBLE1BSkFDLE9BSUEsdUVBSlUsRUFJVjtBQUFBLE1BSEFDLGFBR0EsdUVBSGdCLEVBR2hCO0FBQUEsTUFGQUMsT0FFQSx1RUFGVSxFQUVWO0FBQUEsTUFEQUMsVUFDQSx1RUFEYSxFQUNiO0FBQ0EsTUFBTUMsT0FBTyxHQUFHO0FBQ2RQLElBQUFBLElBQUksRUFBRSxtQkFEUTtBQUVkUSxJQUFBQSxRQUFRLEVBQUU7QUFGSSxHQUFoQjs7QUFEQSwrQkFNK0M7QUFDN0MsUUFBTUMsS0FBSyxHQUFHTixPQUFPLENBQUNDLGFBQWEsQ0FBQ00sQ0FBRCxDQUFkLENBQXJCO0FBQ0FILElBQUFBLE9BQU8sQ0FBQ0MsUUFBUixDQUFpQkcsSUFBakIsQ0FBc0I7QUFDcEJYLE1BQUFBLElBQUksRUFBRSxTQURjO0FBRXBCTSxNQUFBQSxVQUFVLEVBQUVBLFVBQVUsQ0FBQ3JDLE1BQVgsQ0FDVixVQUFDMkMsTUFBRCxFQUFRQyxRQUFSO0FBQUEsK0NBQ0tELE1BREwsNENBRUdDLFFBQVEsQ0FBQ0MsSUFGWixFQUVtQkwsS0FBSyxDQUFDSSxRQUFRLENBQUNFLGVBQVQsR0FBMkIsQ0FBNUIsQ0FGeEI7QUFBQSxPQURVLEVBS1YsRUFMVSxDQUZRO0FBU3BCQyxNQUFBQSxRQUFRLEVBQUU7QUFDUmhCLFFBQUFBLElBQUksRUFBRSxPQURFO0FBRVJpQixRQUFBQSxXQUFXLEVBQUUsQ0FDWFosT0FBTyxDQUFDYSxHQUFSLEdBQWNULEtBQUssQ0FBQ0osT0FBTyxDQUFDYSxHQUFSLENBQVlDLFFBQWIsQ0FBbkIsR0FBNEMsSUFEakMsRUFDdUM7QUFDbERkLFFBQUFBLE9BQU8sQ0FBQ2UsR0FBUixHQUFjWCxLQUFLLENBQUNKLE9BQU8sQ0FBQ2UsR0FBUixDQUFZRCxRQUFiLENBQW5CLEdBQTRDLElBRmpDLENBRXNDO0FBRnRDO0FBRkw7QUFUVSxLQUF0QjtBQWlCRCxHQXpCRDs7QUFNQSxPQUFLLElBQUlULENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdOLGFBQWEsQ0FBQzVDLE1BQWxDLEVBQTBDa0QsQ0FBQyxFQUEzQztBQUFBO0FBQUE7O0FBcUJBLFNBQU9ILE9BQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7T1ZFUkxBWV9UWVBFfSBmcm9tICcuL2Jhc2UtbGF5ZXInO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGxheWVycyB0byBtYXBib3ggbGF5ZXJzXG4gKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGxheWVycyB0aGUgbGF5ZXJzIHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBsYXllckRhdGEgZXh0cmEgbGF5ZXIgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSB7QXJyYXk8TnVtYmVyPn0gbGF5ZXJPcmRlciB0aGUgb3JkZXIgYnkgd2hpY2ggd2Ugc2hvdWxkIGNvbnZlcnQgbGF5ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gbGF5ZXJzVG9SZW5kZXIge1tpZF06IHRydWUgfCBmYWxzZX0gb2JqZWN0IHdoZXRoZXIgZWFjaCBsYXllciBzaG91bGQgYmUgcmVuZGVyZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IHtbaWRdOiBsYXllcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFwYm94TGF5ZXJzKFxuICBsYXllcnMgPSBbXSxcbiAgbGF5ZXJEYXRhID0gW10sXG4gIGxheWVyT3JkZXIgPSBbXSxcbiAgbGF5ZXJzVG9SZW5kZXIgPSB7fVxuKSB7XG4gIGlmIChsYXllckRhdGEubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBsYXllck9yZGVyXG4gICAgICAuc2xpY2UoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgaWR4ID0+XG4gICAgICAgICAgbGF5ZXJzW2lkeF0ub3ZlcmxheVR5cGUgPT09IE9WRVJMQVlfVFlQRS5tYXBib3hnbCAmJlxuICAgICAgICAgIGxheWVyc1RvUmVuZGVyW2xheWVyc1tpZHhdLmlkXVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbGF5ZXIgPSBsYXllcnNbaW5kZXhdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmFjY3UsXG4gICAgICAgICAgW2xheWVyLmlkXToge1xuICAgICAgICAgICAgaWQ6IGxheWVyLmlkLFxuICAgICAgICAgICAgZGF0YTogbGF5ZXJEYXRhW2luZGV4XS5kYXRhLFxuICAgICAgICAgICAgaXNWaXNpYmxlOiBsYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgICAgICAgICAgY29uZmlnOiBsYXllckRhdGFbaW5kZXhdLmNvbmZpZyxcbiAgICAgICAgICAgIHNvdXJjZUlkOiBsYXllckRhdGFbaW5kZXhdLmNvbmZpZy5zb3VyY2VcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9LCB7fSk7XG4gIH1cblxuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogVXBkYXRlIG1hcGJveCBsYXllcnMgb24gdGhlIGdpdmVuIG1hcFxuICogQHBhcmFtIHtPYmplY3R9IG1hcFxuICogQHBhcmFtIHtPYmplY3R9IG5ld0xheWVycyBNYXAgb2YgbmV3IG1hcGJveCBsYXllcnMgdG8gYmUgZGlzcGxheWVkXG4gKiBAcGFyYW0ge09iamVjdH0gb2xkTGF5ZXJzIE1hcCBvZiB0aGUgb2xkIGxheWVycyB0byBiZSBjb21wYXJlIHdpdGggdGhlIGN1cnJlbnQgb25lcyB0byBkZXRlY3QgZGVsZXRlZCBsYXllcnNcbiAqICAgICAgICAgICAgICAgICAge2xheWVySWQ6IHNvdXJjZUlkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTWFwYm94TGF5ZXJzKG1hcCwgbmV3TGF5ZXJzID0ge30sIG9sZExheWVycyA9IG51bGwpIHtcbiAgLy8gZGVsZXRlIG5vIGxvbmdlciBleGlzdGVkIG9sZCBsYXllcnNcbiAgaWYgKG9sZExheWVycykge1xuICAgIGNoZWNrQW5kUmVtb3ZlT2xkTGF5ZXJzKG1hcCwgb2xkTGF5ZXJzLCBuZXdMYXllcnMpO1xuICB9XG5cbiAgLy8gaW5zZXJ0IG9yIHVwZGF0ZSBuZXcgbGF5ZXJcbiAgT2JqZWN0LnZhbHVlcyhuZXdMYXllcnMpLmZvckVhY2gob3ZlcmxheSA9PiB7XG4gICAgY29uc3Qge2lkOiBsYXllcklkLCBjb25maWcsIGRhdGEsIHNvdXJjZUlkLCBpc1Zpc2libGV9ID0gb3ZlcmxheTtcbiAgICBpZiAoIWRhdGEgJiYgIWNvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtkYXRhOiBvbGREYXRhLCBjb25maWc6IG9sZENvbmZpZ30gPVxuICAgICAgKG9sZExheWVycyAmJiBvbGRMYXllcnNbbGF5ZXJJZF0pIHx8IHt9O1xuXG4gICAgaWYgKGRhdGEgJiYgZGF0YSAhPT0gb2xkRGF0YSkge1xuICAgICAgdXBkYXRlU291cmNlRGF0YShtYXAsIHNvdXJjZUlkLCBkYXRhKTtcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHdpdGggcHJldmlvdXMgY29uZmlnc1xuICAgIGlmIChvbGRDb25maWcgIT09IGNvbmZpZykge1xuICAgICAgdXBkYXRlTGF5ZXJDb25maWcobWFwLCBsYXllcklkLCBjb25maWcsIGlzVmlzaWJsZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gY2hlY2tBbmRSZW1vdmVPbGRMYXllcnMobWFwLCBvbGRMYXllcnMsIG5ld0xheWVycykge1xuICBPYmplY3Qua2V5cyhvbGRMYXllcnMpLmZvckVhY2gobGF5ZXJJZCA9PiB7XG4gICAgaWYgKCFuZXdMYXllcnNbbGF5ZXJJZF0pIHtcbiAgICAgIG1hcC5yZW1vdmVMYXllcihsYXllcklkKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMYXllckNvbmZpZyhtYXAsIGxheWVySWQsIGNvbmZpZywgaXNWaXNpYmxlKSB7XG4gIGNvbnN0IG1hcGJveExheWVyID0gbWFwLmdldExheWVyKGxheWVySWQpO1xuXG4gIGlmIChtYXBib3hMYXllcikge1xuICAgIC8vIGNoZWNrIGlmIGxheWVyIGFscmVhZHkgaXMgc2V0XG4gICAgLy8gcmVtb3ZlIGl0IGlmIGV4aXN0c1xuICAgIG1hcC5yZW1vdmVMYXllcihsYXllcklkKTtcbiAgfVxuXG4gIG1hcC5hZGRMYXllcihjb25maWcpO1xuICBtYXAuc2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZCwgJ3Zpc2liaWxpdHknLCBpc1Zpc2libGUgPyAndmlzaWJsZScgOiAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTb3VyY2VEYXRhKG1hcCwgc291cmNlSWQsIGRhdGEpIHtcbiAgY29uc3Qgc291cmNlID0gbWFwLmdldFNvdXJjZShzb3VyY2VJZCk7XG5cbiAgaWYgKCFzb3VyY2UpIHtcbiAgICBtYXAuYWRkU291cmNlKHNvdXJjZUlkLCB7XG4gICAgICB0eXBlOiAnZ2VvanNvbicsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgc291cmNlLnNldERhdGEoZGF0YSk7XG4gIH1cbn1cbi8qKlxuICpcbiAqIEBwYXJhbSBwb2ludHNcbiAqIEBwYXJhbSBjb2x1bW5zIHtcbiAqIGxhdDoge2ZpZWxkSWR4fSxcbiAqIGxuZzoge2ZpZWxkSWR4fSxcbiAqIGFsdDoge2ZpZWxkSWR4fVxuICogfVxuICogQHBhcmFtIHByb3BlcnRpZXMgW3tsYWJlbDoge2ZpZWxkSWR4fV1cbiAqIEByZXR1cm5zIHt7dHlwZTogc3RyaW5nLCBwcm9wZXJ0aWVzOiB7fSwgZmVhdHVyZXM6IHt0eXBlOiBzdHJpbmcsIHByb3BlcnRpZXM6IHt9LCBnZW9tZXRyeToge3R5cGU6IHN0cmluZywgY29vcmRpbmF0ZXM6ICpbXX19W119fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VvanNvbkZyb21Qb2ludHMoXG4gIGFsbERhdGEgPSBbXSxcbiAgZmlsdGVyZWRJbmRleCA9IFtdLFxuICBjb2x1bW5zID0ge30sXG4gIHByb3BlcnRpZXMgPSBbXVxuKSB7XG4gIGNvbnN0IGdlb2pzb24gPSB7XG4gICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICBmZWF0dXJlczogW11cbiAgfTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcmVkSW5kZXgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwb2ludCA9IGFsbERhdGFbZmlsdGVyZWRJbmRleFtpXV07XG4gICAgZ2VvanNvbi5mZWF0dXJlcy5wdXNoKHtcbiAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXMucmVkdWNlKFxuICAgICAgICAoZmluYWwsIHByb3BlcnR5KSA9PiAoe1xuICAgICAgICAgIC4uLmZpbmFsLFxuICAgICAgICAgIFtwcm9wZXJ0eS5uYW1lXTogcG9pbnRbcHJvcGVydHkudGFibGVGaWVsZEluZGV4IC0gMV1cbiAgICAgICAgfSksXG4gICAgICAgIHt9XG4gICAgICApLFxuICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgdHlwZTogJ1BvaW50JyxcbiAgICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgICBjb2x1bW5zLmxuZyA/IHBvaW50W2NvbHVtbnMubG5nLmZpZWxkSWR4XSA6IG51bGwsIC8vIGxuZ1xuICAgICAgICAgIGNvbHVtbnMubGF0ID8gcG9pbnRbY29sdW1ucy5sYXQuZmllbGRJZHhdIDogbnVsbCAvLyBsYXRcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGdlb2pzb247XG59XG4iXX0=