kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
192 lines (158 loc) • 21.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.hexagonToPolygonGeo = hexagonToPolygonGeo;
exports.getGeojsonDataMaps = getGeojsonDataMaps;
exports.parseGeometryFromString = parseGeometryFromString;
exports.getGeojsonBounds = getGeojsonBounds;
exports.featureToDeckGlGeoType = featureToDeckGlGeoType;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _deck = require("deck.gl");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function hexagonToPolygonGeo(_ref, properties, radius, mapState) {
var object = _ref.object;
var viewport = new _deck.WebMercatorViewport(mapState);
var screenCenter = viewport.projectFlat(object.centroid);
var _viewport$getDistance = viewport.getDistanceScales(),
pixelsPerMeter = _viewport$getDistance.pixelsPerMeter;
var pixRadius = radius * pixelsPerMeter[0];
var coordinates = [];
for (var i = 0; i < 6; i++) {
var vertex = hex_corner(screenCenter, pixRadius, i);
coordinates.push(viewport.unprojectFlat(vertex));
}
coordinates.push(coordinates[0]);
return {
geometry: {
type: 'Polygon',
coordinates: [[[77.420654296875, 13.07412756381517], [77.4041748046875, 13.012586029874111], [77.38632202148438, 12.938983710096016], [77.46322631835938, 12.906859517826117], [77.50579833984375, 12.837242952998404], [77.56759643554688, 12.791713999000201], [77.67471313476562, 12.843937692841445], [77.706298828125, 12.86134318154514], [77.73651123046875, 12.920245100143122], [77.75848388671875, 12.981809528732812], [77.7557373046875, 13.047372256948787], [77.61566162109375, 13.169085434871482], [77.53463745117188, 13.099542418228534], [77.420654296875, 13.07412756381517]]]
},
properties: {
fieldIdx: 1
}
}; // return {
// geometry: {
// coordinates,
// type: 'LineString'
// },
// properties
// };
}
function hex_corner(center, radius, i) {
var angle_deg = 60 * i + 30;
var angle_rad = Math.PI / 180 * angle_deg;
return [center[0] + radius * Math.cos(angle_rad), center[1] + radius * Math.sin(angle_rad)];
}
/**
* Parse raw data to geojson feature
* @param allData
* @param getFeature
* @returns {{}}
*/
function getGeojsonDataMaps(allData, getFeature) {
var acceptableTypes = ['Point', 'MultiPoint', 'LineString', 'MultiLineString', 'Polygon', 'MultiPolygon', 'GeometryCollection'];
var dataToFeature = {};
allData.forEach(function (d, index) {
dataToFeature[index] = null;
var rawFeature = getFeature(d);
var feature = null; // parse feature from field
if (Array.isArray(rawFeature)) {
// Support geojson as an array of points
feature = {
type: 'Feature',
geometry: {
// why do we need to flip it...
coordinates: rawFeature.map(function (pts) {
return [pts[1], pts[0]];
}),
type: 'LineString'
}
};
} else if (typeof rawFeature === 'string') {
feature = parseGeometryFromString(rawFeature);
} else if ((0, _typeof2["default"])(rawFeature) === 'object') {
// Support geojson feature as object
// probably need to normalize it as well
var normalized = normalize(rawFeature);
if (!normalized || !Array.isArray(normalized.features)) {
// fail to normalize geojson
return null;
}
feature = normalized.features[0];
}
if (feature && feature.geometry && acceptableTypes.includes(feature.geometry.type)) {
// store index of the data in feature properties
feature.properties = _objectSpread({}, feature.properties || {}, {
index: index
});
dataToFeature[index] = feature;
}
});
return dataToFeature;
}
/**
* Parse geojson from string
* @param {String} geoString
* @returns {null | Object} geojson object or null if failed
*/
function parseGeometryFromString(geoString) {
var parsedGeo; // try parse as geojson string
// {"type":"Polygon","coordinates":[[[-74.158491,40.83594]]]}
try {
parsedGeo = JSON.parse(geoString);
} catch (e) {} // keep trying to parse
// try parse as wkt
if (!parsedGeo) {
try {
parsedGeo = wktParser(geoString);
} catch (e) {
return null;
}
}
if (!parsedGeo) {
return null;
}
var normalized = normalize(parsedGeo);
if (!normalized || !Array.isArray(normalized.features)) {
// fail to normalize geojson
return null;
}
return normalized.features[0];
}
function getGeojsonBounds() {
var features = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
// calculate feature bounds is computation heavy
// here we only pick couple
var samples = features.length > 500 ? getSampleData(features, 500) : features;
var nonEmpty = samples.filter(function (d) {
return d && d.geometry && d.geometry.coordinates && d.geometry.coordinates.length;
});
try {
return geojsonExtent({
type: 'FeatureCollection',
features: nonEmpty
});
} catch (e) {
return null;
}
}
function featureToDeckGlGeoType(type) {
switch (type) {
case 'Point':
case 'MultiPoint':
return 'point';
case 'LineString':
case 'MultiLineString':
return 'line';
case 'Polygon':
case 'MultiPolygon':
return 'polygon';
default:
return null;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvcGluY29kZS1sYXllci9waW5jb2RlLXV0aWxzLmpzIl0sIm5hbWVzIjpbImhleGFnb25Ub1BvbHlnb25HZW8iLCJwcm9wZXJ0aWVzIiwicmFkaXVzIiwibWFwU3RhdGUiLCJvYmplY3QiLCJ2aWV3cG9ydCIsIldlYk1lcmNhdG9yVmlld3BvcnQiLCJzY3JlZW5DZW50ZXIiLCJwcm9qZWN0RmxhdCIsImNlbnRyb2lkIiwiZ2V0RGlzdGFuY2VTY2FsZXMiLCJwaXhlbHNQZXJNZXRlciIsInBpeFJhZGl1cyIsImNvb3JkaW5hdGVzIiwiaSIsInZlcnRleCIsImhleF9jb3JuZXIiLCJwdXNoIiwidW5wcm9qZWN0RmxhdCIsImdlb21ldHJ5IiwidHlwZSIsImZpZWxkSWR4IiwiY2VudGVyIiwiYW5nbGVfZGVnIiwiYW5nbGVfcmFkIiwiTWF0aCIsIlBJIiwiY29zIiwic2luIiwiZ2V0R2VvanNvbkRhdGFNYXBzIiwiYWxsRGF0YSIsImdldEZlYXR1cmUiLCJhY2NlcHRhYmxlVHlwZXMiLCJkYXRhVG9GZWF0dXJlIiwiZm9yRWFjaCIsImQiLCJpbmRleCIsInJhd0ZlYXR1cmUiLCJmZWF0dXJlIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwicHRzIiwicGFyc2VHZW9tZXRyeUZyb21TdHJpbmciLCJub3JtYWxpemVkIiwibm9ybWFsaXplIiwiZmVhdHVyZXMiLCJpbmNsdWRlcyIsImdlb1N0cmluZyIsInBhcnNlZEdlbyIsIkpTT04iLCJwYXJzZSIsImUiLCJ3a3RQYXJzZXIiLCJnZXRHZW9qc29uQm91bmRzIiwic2FtcGxlcyIsImxlbmd0aCIsImdldFNhbXBsZURhdGEiLCJub25FbXB0eSIsImZpbHRlciIsImdlb2pzb25FeHRlbnQiLCJmZWF0dXJlVG9EZWNrR2xHZW9UeXBlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7Ozs7O0FBRU8sU0FBU0EsbUJBQVQsT0FBdUNDLFVBQXZDLEVBQW1EQyxNQUFu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RU0sU0FBU1EsZ0JBQVQsR0FBeUM7QUFBQSxNQUFmUixRQUFlLHVFQUFKLEVBQUk7QUFDOUM7QUFDQTtBQUNBLE1BQU1TLE9BQU8sR0FDWFQsUUFBUSxDQUFDVSxNQUFULEdBQWtCLEdBQWxCLEdBQXdCQyxhQUFhLENBQUNYLFFBQUQsRUFBVyxHQUFYLENBQXJDLEdBQXVEQSxRQUR6RDtBQUdBLE1BQU1ZLFFBQVEsR0FBR0gsT0FBTyxDQUFDSSxNQUFSLENBQ2YsVUFBQXhCLENBQUM7QUFBQSxXQUNDQSxDQUFDLElBQUlBLENBQUMsQ0FBQ2hCLFFBQVAsSUFBbUJnQixDQUFDLENBQUNoQixRQUFGLENBQVdOLFdBQTlCLElBQTZDc0IsQ0FBQyxDQUFDaEIsUUFBRixDQUFXTixXQUFYLENBQXVCMkMsTUFEckU7QUFBQSxHQURjLENBQWpCOztBQUtBLE1BQUk7QUFDRixXQUFPSSxhQUFhLENBQUM7QUFDbkJ4QyxNQUFBQSxJQUFJLEVBQUUsbUJBRGE7QUFFbkIwQixNQUFBQSxRQUFRLEVBQUVZO0FBRlMsS0FBRCxDQUFwQjtBQUlELEdBTEQsQ0FLRSxPQUFPTixDQUFQLEVBQVU7QUFDVixXQUFPLElBQVA7QUFDRDtBQUNGOztBQUVNLFNBQVNTLHNCQUFULENBQWdDekMsSUFBaEMsRUFBc0M7QUFDM0MsVUFBUUEsSUFBUjtBQUNFLFNBQUssT0FBTDtBQUNBLFNBQUssWUFBTDtBQUNFLGFBQU8sT0FBUDs7QUFFRixTQUFLLFlBQUw7QUFDQSxTQUFLLGlCQUFMO0FBQ0UsYUFBTyxNQUFQOztBQUVGLFNBQUssU0FBTDtBQUNBLFNBQUssY0FBTDtBQUNFLGFBQU8sU0FBUDs7QUFFRjtBQUNFLGFBQU8sSUFBUDtBQWRKO0FBZ0JEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtXZWJNZXJjYXRvclZpZXdwb3J0fSBmcm9tICdkZWNrLmdsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhleGFnb25Ub1BvbHlnb25HZW8oe29iamVjdH0sIHByb3BlcnRpZXMsIHJhZGl1cywgbWFwU3RhdGUpIHtcbiAgY29uc3Qgdmlld3BvcnQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydChtYXBTdGF0ZSk7XG5cbiAgY29uc3Qgc2NyZWVuQ2VudGVyID0gdmlld3BvcnQucHJvamVjdEZsYXQob2JqZWN0LmNlbnRyb2lkKTtcbiAgY29uc3Qge3BpeGVsc1Blck1ldGVyfSA9IHZpZXdwb3J0LmdldERpc3RhbmNlU2NhbGVzKCk7XG4gIGNvbnN0IHBpeFJhZGl1cyA9IHJhZGl1cyAqIHBpeGVsc1Blck1ldGVyWzBdO1xuXG4gIGNvbnN0IGNvb3JkaW5hdGVzID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICBjb25zdCB2ZXJ0ZXggPSBoZXhfY29ybmVyKHNjcmVlbkNlbnRlciwgcGl4UmFkaXVzLCBpKTtcbiAgICBjb29yZGluYXRlcy5wdXNoKHZpZXdwb3J0LnVucHJvamVjdEZsYXQodmVydGV4KSk7XG4gIH1cblxuICBjb29yZGluYXRlcy5wdXNoKGNvb3JkaW5hdGVzWzBdKTtcbiAgcmV0dXJuIHtcbiAgICBnZW9tZXRyeToge1xuICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgW1xuICAgICAgICAgIFs3Ny40MjA2NTQyOTY4NzUsIDEzLjA3NDEyNzU2MzgxNTE3XSxcbiAgICAgICAgICBbNzcuNDA0MTc0ODA0Njg3NSwgMTMuMDEyNTg2MDI5ODc0MTExXSxcbiAgICAgICAgICBbNzcuMzg2MzIyMDIxNDg0MzgsIDEyLjkzODk4MzcxMDA5NjAxNl0sXG4gICAgICAgICAgWzc3LjQ2MzIyNjMxODM1OTM4LCAxMi45MDY4NTk1MTc4MjYxMTddLFxuICAgICAgICAgIFs3Ny41MDU3OTgzMzk4NDM3NSwgMTIuODM3MjQyOTUyOTk4NDA0XSxcbiAgICAgICAgICBbNzcuNTY3NTk2NDM1NTQ2ODgsIDEyLjc5MTcxMzk5OTAwMDIwMV0sXG4gICAgICAgICAgWzc3LjY3NDcxMzEzNDc2NTYyLCAxMi44NDM5Mzc2OTI4NDE0NDVdLFxuICAgICAgICAgIFs3Ny43MDYyOTg4MjgxMjUsIDEyLjg2MTM0MzE4MTU0NTE0XSxcbiAgICAgICAgICBbNzcuNzM2NTExMjMwNDY4NzUsIDEyLjkyMDI0NTEwMDE0MzEyMl0sXG4gICAgICAgICAgWzc3Ljc1ODQ4Mzg4NjcxODc1LCAxMi45ODE4MDk1Mjg3MzI4MTJdLFxuICAgICAgICAgIFs3Ny43NTU3MzczMDQ2ODc1LCAxMy4wNDczNzIyNTY5NDg3ODddLFxuICAgICAgICAgIFs3Ny42MTU2NjE2MjEwOTM3NSwgMTMuMTY5MDg1NDM0ODcxNDgyXSxcbiAgICAgICAgICBbNzcuNTM0NjM3NDUxMTcxODgsIDEzLjA5OTU0MjQxODIyODUzNF0sXG4gICAgICAgICAgWzc3LjQyMDY1NDI5Njg3NSwgMTMuMDc0MTI3NTYzODE1MTddXG4gICAgICAgIF1cbiAgICAgIF1cbiAgICB9LFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIGZpZWxkSWR4OiAxXG4gICAgfVxuICB9O1xuICAvLyByZXR1cm4ge1xuICAvLyAgIGdlb21ldHJ5OiB7XG4gIC8vICAgICBjb29yZGluYXRlcyxcbiAgLy8gICAgIHR5cGU6ICdMaW5lU3RyaW5nJ1xuICAvLyAgIH0sXG4gIC8vICAgcHJvcGVydGllc1xuICAvLyB9O1xufVxuXG5mdW5jdGlvbiBoZXhfY29ybmVyKGNlbnRlciwgcmFkaXVzLCBpKSB7XG4gIGNvbnN0IGFuZ2xlX2RlZyA9IDYwICogaSArIDMwO1xuICBjb25zdCBhbmdsZV9yYWQgPSAoTWF0aC5QSSAvIDE4MCkgKiBhbmdsZV9kZWc7XG5cbiAgcmV0dXJuIFtcbiAgICBjZW50ZXJbMF0gKyByYWRpdXMgKiBNYXRoLmNvcyhhbmdsZV9yYWQpLFxuICAgIGNlbnRlclsxXSArIHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlX3JhZClcbiAgXTtcbn1cblxuLyoqXG4gKiBQYXJzZSByYXcgZGF0YSB0byBnZW9qc29uIGZlYXR1cmVcbiAqIEBwYXJhbSBhbGxEYXRhXG4gKiBAcGFyYW0gZ2V0RmVhdHVyZVxuICogQHJldHVybnMge3t9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VvanNvbkRhdGFNYXBzKGFsbERhdGEsIGdldEZlYXR1cmUpIHtcbiAgY29uc3QgYWNjZXB0YWJsZVR5cGVzID0gW1xuICAgICdQb2ludCcsXG4gICAgJ011bHRpUG9pbnQnLFxuICAgICdMaW5lU3RyaW5nJyxcbiAgICAnTXVsdGlMaW5lU3RyaW5nJyxcbiAgICAnUG9seWdvbicsXG4gICAgJ011bHRpUG9seWdvbicsXG4gICAgJ0dlb21ldHJ5Q29sbGVjdGlvbidcbiAgXTtcblxuICBjb25zdCBkYXRhVG9GZWF0dXJlID0ge307XG5cbiAgYWxsRGF0YS5mb3JFYWNoKChkLCBpbmRleCkgPT4ge1xuICAgIGRhdGFUb0ZlYXR1cmVbaW5kZXhdID0gbnVsbDtcbiAgICBjb25zdCByYXdGZWF0dXJlID0gZ2V0RmVhdHVyZShkKTtcblxuICAgIGxldCBmZWF0dXJlID0gbnVsbDtcblxuICAgIC8vIHBhcnNlIGZlYXR1cmUgZnJvbSBmaWVsZFxuICAgIGlmIChBcnJheS5pc0FycmF5KHJhd0ZlYXR1cmUpKSB7XG4gICAgICAvLyBTdXBwb3J0IGdlb2pzb24gYXMgYW4gYXJyYXkgb2YgcG9pbnRzXG4gICAgICBmZWF0dXJlID0ge1xuICAgICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgLy8gd2h5IGRvIHdlIG5lZWQgdG8gZmxpcCBpdC4uLlxuICAgICAgICAgIGNvb3JkaW5hdGVzOiByYXdGZWF0dXJlLm1hcChwdHMgPT4gW3B0c1sxXSwgcHRzWzBdXSksXG4gICAgICAgICAgdHlwZTogJ0xpbmVTdHJpbmcnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmF3RmVhdHVyZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZlYXR1cmUgPSBwYXJzZUdlb21ldHJ5RnJvbVN0cmluZyhyYXdGZWF0dXJlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByYXdGZWF0dXJlID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gU3VwcG9ydCBnZW9qc29uIGZlYXR1cmUgYXMgb2JqZWN0XG4gICAgICAvLyBwcm9iYWJseSBuZWVkIHRvIG5vcm1hbGl6ZSBpdCBhcyB3ZWxsXG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplKHJhd0ZlYXR1cmUpO1xuICAgICAgaWYgKCFub3JtYWxpemVkIHx8ICFBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWQuZmVhdHVyZXMpKSB7XG4gICAgICAgIC8vIGZhaWwgdG8gbm9ybWFsaXplIGdlb2pzb25cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGZlYXR1cmUgPSBub3JtYWxpemVkLmZlYXR1cmVzWzBdO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGZlYXR1cmUgJiZcbiAgICAgIGZlYXR1cmUuZ2VvbWV0cnkgJiZcbiAgICAgIGFjY2VwdGFibGVUeXBlcy5pbmNsdWRlcyhmZWF0dXJlLmdlb21ldHJ5LnR5cGUpXG4gICAgKSB7XG4gICAgICAvLyBzdG9yZSBpbmRleCBvZiB0aGUgZGF0YSBpbiBmZWF0dXJlIHByb3BlcnRpZXNcbiAgICAgIGZlYXR1cmUucHJvcGVydGllcyA9IHtcbiAgICAgICAgLi4uKGZlYXR1cmUucHJvcGVydGllcyB8fCB7fSksXG4gICAgICAgIGluZGV4XG4gICAgICB9O1xuXG4gICAgICBkYXRhVG9GZWF0dXJlW2luZGV4XSA9IGZlYXR1cmU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZGF0YVRvRmVhdHVyZTtcbn1cblxuLyoqXG4gKiBQYXJzZSBnZW9qc29uIGZyb20gc3RyaW5nXG4gKiBAcGFyYW0ge1N0cmluZ30gZ2VvU3RyaW5nXG4gKiBAcmV0dXJucyB7bnVsbCB8IE9iamVjdH0gZ2VvanNvbiBvYmplY3Qgb3IgbnVsbCBpZiBmYWlsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlR2VvbWV0cnlGcm9tU3RyaW5nKGdlb1N0cmluZykge1xuICBsZXQgcGFyc2VkR2VvO1xuXG4gIC8vIHRyeSBwYXJzZSBhcyBnZW9qc29uIHN0cmluZ1xuICAvLyB7XCJ0eXBlXCI6XCJQb2x5Z29uXCIsXCJjb29yZGluYXRlc1wiOltbWy03NC4xNTg0OTEsNDAuODM1OTRdXV19XG4gIHRyeSB7XG4gICAgcGFyc2VkR2VvID0gSlNPTi5wYXJzZShnZW9TdHJpbmcpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gcGFyc2VcbiAgfVxuXG4gIC8vIHRyeSBwYXJzZSBhcyB3a3RcbiAgaWYgKCFwYXJzZWRHZW8pIHtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkR2VvID0gd2t0UGFyc2VyKGdlb1N0cmluZyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFwYXJzZWRHZW8pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemUocGFyc2VkR2VvKTtcblxuICBpZiAoIW5vcm1hbGl6ZWQgfHwgIUFycmF5LmlzQXJyYXkobm9ybWFsaXplZC5mZWF0dXJlcykpIHtcbiAgICAvLyBmYWlsIHRvIG5vcm1hbGl6ZSBnZW9qc29uXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZC5mZWF0dXJlc1swXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlb2pzb25Cb3VuZHMoZmVhdHVyZXMgPSBbXSkge1xuICAvLyBjYWxjdWxhdGUgZmVhdHVyZSBib3VuZHMgaXMgY29tcHV0YXRpb24gaGVhdnlcbiAgLy8gaGVyZSB3ZSBvbmx5IHBpY2sgY291cGxlXG4gIGNvbnN0IHNhbXBsZXMgPVxuICAgIGZlYXR1cmVzLmxlbmd0aCA+IDUwMCA/IGdldFNhbXBsZURhdGEoZmVhdHVyZXMsIDUwMCkgOiBmZWF0dXJlcztcblxuICBjb25zdCBub25FbXB0eSA9IHNhbXBsZXMuZmlsdGVyKFxuICAgIGQgPT5cbiAgICAgIGQgJiYgZC5nZW9tZXRyeSAmJiBkLmdlb21ldHJ5LmNvb3JkaW5hdGVzICYmIGQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoXG4gICk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2VvanNvbkV4dGVudCh7XG4gICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgZmVhdHVyZXM6IG5vbkVtcHR5XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZVRvRGVja0dsR2VvVHlwZSh0eXBlKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ1BvaW50JzpcbiAgICBjYXNlICdNdWx0aVBvaW50JzpcbiAgICAgIHJldHVybiAncG9pbnQnO1xuXG4gICAgY2FzZSAnTGluZVN0cmluZyc6XG4gICAgY2FzZSAnTXVsdGlMaW5lU3RyaW5nJzpcbiAgICAgIHJldHVybiAnbGluZSc7XG5cbiAgICBjYXNlICdQb2x5Z29uJzpcbiAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgcmV0dXJuICdwb2x5Z29uJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19