kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
691 lines (683 loc) • 102 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.geojsonVisConfigs = exports.geoJsonRequiredColumns = exports.featureAccessor = exports.defaultRadius = exports.defaultLineWidth = exports.defaultElevation = exports["default"] = exports.COLUMN_MODE_TABLE = void 0;
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _helpers = require("@turf/helpers");
var _booleanWithin = _interopRequireDefault(require("@turf/boolean-within"));
var _uniq = _interopRequireDefault(require("lodash/uniq"));
var _typeAnalyzer = require("type-analyzer");
var _baseLayer = _interopRequireWildcard(require("../base-layer"));
var _layers = require("@deck.gl/layers");
var _geojsonUtils = require("./geojson-utils");
var _layerUtils = require("../layer-utils");
var _geojsonLayerIcon = _interopRequireDefault(require("./geojson-layer-icon"));
var _constants = require("@kepler.gl/constants");
var _utils = require("@kepler.gl/utils");
var _deckglLayers = require("@kepler.gl/deckgl-layers");
var _geojsonInfoModal = _interopRequireDefault(require("./geojson-info-modal"));
var _excluded = ["data"];
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 _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & o ? t.prototype : t), e, r); return 2 & o ? function (t) { return p.apply(r, t); } : p; }
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
var SUPPORTED_ANALYZER_TYPES = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _typeAnalyzer.DATA_TYPES.GEOMETRY, true), _typeAnalyzer.DATA_TYPES.GEOMETRY_FROM_STRING, true), _typeAnalyzer.DATA_TYPES.PAIR_GEOMETRY_FROM_STRING, true);
var geojsonVisConfigs = exports.geojsonVisConfigs = {
opacity: 'opacity',
strokeOpacity: _objectSpread(_objectSpread({}, _constants.LAYER_VIS_CONFIGS.opacity), {}, {
property: 'strokeOpacity'
}),
thickness: _objectSpread(_objectSpread({}, _constants.LAYER_VIS_CONFIGS.thickness), {}, {
defaultValue: 0.5
}),
strokeColor: 'strokeColor',
colorRange: 'colorRange',
strokeColorRange: 'strokeColorRange',
radius: 'radius',
sizeRange: 'strokeWidthRange',
radiusRange: 'radiusRange',
heightRange: 'elevationRange',
elevationScale: 'elevationScale',
stroked: 'stroked',
filled: 'filled',
enable3d: 'enable3d',
wireframe: 'wireframe',
fixedHeight: 'fixedHeight'
};
var geoJsonRequiredColumns = exports.geoJsonRequiredColumns = ['geojson'];
var featureAccessor = exports.featureAccessor = function featureAccessor(_ref) {
var geojson = _ref.geojson;
return function (dc) {
return function (d) {
return dc.valueAt(d.index, geojson.fieldIdx);
};
};
};
var geoColumnAccessor = function geoColumnAccessor(_ref2) {
var geojson = _ref2.geojson;
return function (dc) {
var _dc$getColumn;
return (_dc$getColumn = dc.getColumn) === null || _dc$getColumn === void 0 ? void 0 : _dc$getColumn.call(dc, geojson.fieldIdx);
};
};
var getTableModeValueAccessor = function getTableModeValueAccessor(feature) {
// Called from gpu-filter-utils.getFilterValueAccessor()
return function (field) {
return feature.properties.values.map(function (v) {
return field.valueAccessor(v);
});
};
};
var getTableModeFieldValue = function getTableModeFieldValue(field, data) {
var rv;
if (typeof data === 'function') {
rv = data(field);
} else {
rv = (0, _baseLayer.defaultGetFieldValue)(field, data);
}
return rv;
};
var geoFieldAccessor = function geoFieldAccessor(_ref3) {
var geojson = _ref3.geojson;
return function (dc) {
return dc.getField ? dc.getField(geojson.fieldIdx) : null;
};
};
// access feature properties from geojson sub layer
var defaultElevation = exports.defaultElevation = 500;
var defaultLineWidth = exports.defaultLineWidth = 1;
var defaultRadius = exports.defaultRadius = 1;
// don't use strokes by default for datasets with large number of polygons
var DEFAULT_POLYGON_STROKE_LIMIT = 100000;
var COLUMN_MODE_TABLE = exports.COLUMN_MODE_TABLE = 'table';
var SUPPORTED_COLUMN_MODES = [{
key: _geojsonUtils.COLUMN_MODE_GEOJSON,
label: 'GeoJSON',
requiredColumns: ['geojson']
}, {
key: COLUMN_MODE_TABLE,
label: 'Table columns',
requiredColumns: ['id', 'lat', 'lng'],
optionalColumns: ['altitude', 'sortBy']
}];
var DEFAULT_COLUMN_MODE = _geojsonUtils.COLUMN_MODE_GEOJSON;
var GeoJsonLayer = exports["default"] = /*#__PURE__*/function (_Layer) {
function GeoJsonLayer(props) {
var _this;
(0, _classCallCheck2["default"])(this, GeoJsonLayer);
_this = _callSuper(this, GeoJsonLayer, [props]);
(0, _defineProperty2["default"])(_this, "dataToFeature", []);
(0, _defineProperty2["default"])(_this, "dataContainer", null);
(0, _defineProperty2["default"])(_this, "filteredIndex", null);
(0, _defineProperty2["default"])(_this, "filteredIndexTrigger", null);
(0, _defineProperty2["default"])(_this, "centroids", []);
(0, _defineProperty2["default"])(_this, "_layerInfoModal", void 0);
_this.registerVisConfig(geojsonVisConfigs);
_this.getPositionAccessor = function (dataContainer) {
return featureAccessor(_this.config.columns)(dataContainer);
};
_this._layerInfoModal = (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, COLUMN_MODE_TABLE, (0, _geojsonInfoModal["default"])(COLUMN_MODE_TABLE)), _geojsonUtils.COLUMN_MODE_GEOJSON, (0, _geojsonInfoModal["default"])(_geojsonUtils.COLUMN_MODE_GEOJSON));
return _this;
}
(0, _inherits2["default"])(GeoJsonLayer, _Layer);
return (0, _createClass2["default"])(GeoJsonLayer, [{
key: "type",
get: function get() {
return GeoJsonLayer.type;
}
}, {
key: "name",
get: function get() {
return 'Polygon';
}
}, {
key: "layerIcon",
get: function get() {
return _geojsonLayerIcon["default"];
}
}, {
key: "columnPairs",
get: function get() {
return this.defaultPointColumnPairs;
}
}, {
key: "supportedColumnModes",
get: function get() {
return SUPPORTED_COLUMN_MODES;
}
}, {
key: "layerInfoModal",
get: function get() {
return (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _geojsonUtils.COLUMN_MODE_GEOJSON, {
id: 'iconInfo',
template: this._layerInfoModal[_geojsonUtils.COLUMN_MODE_GEOJSON],
modalProps: {
title: 'modal.polygonInfo.title'
}
}), COLUMN_MODE_TABLE, {
id: 'iconInfo',
template: this._layerInfoModal[COLUMN_MODE_TABLE],
modalProps: {
title: 'modal.polygonInfo.titleTable'
}
});
}
}, {
key: "accessVSFieldValue",
value: function accessVSFieldValue() {
if (this.config.columnMode === _geojsonUtils.COLUMN_MODE_GEOJSON) {
return _baseLayer.defaultGetFieldValue;
}
return getTableModeFieldValue;
}
}, {
key: "visualChannels",
get: function get() {
var visualChannels = _superPropGet(GeoJsonLayer, "visualChannels", this, 1);
return {
color: _objectSpread(_objectSpread({}, visualChannels.color), {}, {
accessor: 'getFillColor',
condition: function condition(config) {
return config.visConfig.filled;
},
nullValue: visualChannels.color.nullValue,
getAttributeValue: function getAttributeValue(config) {
return function (d) {
return d.properties.fillColor || config.color;
};
},
// used this to get updateTriggers
defaultValue: function defaultValue(config) {
return config.color;
}
}),
strokeColor: {
property: 'strokeColor',
field: 'strokeColorField',
scale: 'strokeColorScale',
domain: 'strokeColorDomain',
range: 'strokeColorRange',
key: 'strokeColor',
channelScaleType: _constants.CHANNEL_SCALES.color,
accessor: 'getLineColor',
condition: function condition(config) {
return config.visConfig.stroked;
},
nullValue: visualChannels.color.nullValue,
getAttributeValue: function getAttributeValue(config) {
return function (d) {
return d.properties.lineColor || config.visConfig.strokeColor || config.color;
};
},
// used this to get updateTriggers
defaultValue: function defaultValue(config) {
return config.visConfig.strokeColor || config.color;
}
},
size: _objectSpread(_objectSpread({}, visualChannels.size), {}, {
property: 'stroke',
accessor: 'getLineWidth',
condition: function condition(config) {
return config.visConfig.stroked;
},
nullValue: 0,
getAttributeValue: function getAttributeValue() {
return function (d) {
return d.properties.lineWidth || defaultLineWidth;
};
}
}),
height: {
property: 'height',
field: 'heightField',
scale: 'heightScale',
domain: 'heightDomain',
range: 'heightRange',
key: 'height',
fixed: 'fixedHeight',
channelScaleType: _constants.CHANNEL_SCALES.size,
accessor: 'getElevation',
condition: function condition(config) {
return config.visConfig.enable3d;
},
nullValue: 0,
getAttributeValue: function getAttributeValue() {
return function (d) {
return d.properties.elevation || defaultElevation;
};
}
},
radius: {
property: 'radius',
field: 'radiusField',
scale: 'radiusScale',
domain: 'radiusDomain',
range: 'radiusRange',
key: 'radius',
channelScaleType: _constants.CHANNEL_SCALES.radius,
accessor: 'getPointRadius',
nullValue: 0,
getAttributeValue: function getAttributeValue() {
return function (d) {
return d.properties.radius || defaultRadius;
};
}
}
};
}
}, {
key: "getDefaultLayerConfig",
value: function getDefaultLayerConfig(props) {
var _props$columnMode;
var defaultLayerConfig = _superPropGet(GeoJsonLayer, "getDefaultLayerConfig", this, 3)([props !== null && props !== void 0 ? props : {}]);
return _objectSpread(_objectSpread({}, defaultLayerConfig), {}, {
columnMode: (_props$columnMode = props === null || props === void 0 ? void 0 : props.columnMode) !== null && _props$columnMode !== void 0 ? _props$columnMode : DEFAULT_COLUMN_MODE,
// add height visual channel
heightField: null,
heightDomain: [0, 1],
heightScale: 'linear',
// add radius visual channel
radiusField: null,
radiusDomain: [0, 1],
radiusScale: 'linear',
// add stroke color visual channel
strokeColorField: null,
strokeColorDomain: [0, 1],
strokeColorScale: 'quantile',
colorUI: _objectSpread(_objectSpread({}, defaultLayerConfig.colorUI), {}, {
strokeColorRange: _constants.DEFAULT_COLOR_UI
})
});
}
}, {
key: "getHoverData",
value: function getHoverData(object, dataContainer) {
var _object$properties;
// index of dataContainer is saved to feature.properties
// for arrow format, `object` is the index of the row returned from deck
var index = this.geoArrowMode ? object : object === null || object === void 0 || (_object$properties = object.properties) === null || _object$properties === void 0 ? void 0 : _object$properties.index;
if (index >= 0) {
return dataContainer.row(index);
}
return null;
}
}, {
key: "getFilteredItemCount",
value: function getFilteredItemCount() {
// return -polygons-fill or -polygons-stroke
// + -linestrings
// + -points-circle
if (Object.keys(this.filteredItemCount).length) {
var polygonCount = this.filteredItemCount["".concat(this.id, "-polygons-fill")] || this.filteredItemCount["".concat(this.id, "-polygons-stroke")] || 0;
var linestringCount = this.filteredItemCount["".concat(this.id, "-linestrings")] || 0;
var pointCount = this.filteredItemCount["".concat(this.id, "-points-circle")] || 0;
return polygonCount + linestringCount + pointCount;
}
return null;
}
}, {
key: "calculateDataAttribute",
value: function calculateDataAttribute(dataset) {
var _this2 = this;
this.geoArrowMode = (0, _geojsonUtils.fieldIsGeoArrow)(geoFieldAccessor(this.config.columns)(dataset.dataContainer));
var dataContainer = dataset.dataContainer,
filteredIndex = dataset.filteredIndex;
if (this.geoArrowMode) {
// TODO add columnMode logic here for ArrowDataContainer?
// filter geojson/arrow table by values and make a partial copy of the raw table are expensive
// so we will use filteredIndex to create an attribute e.g. filteredIndex [0|1] for GPU filtering
// in deck.gl layer, see: FilterArrowExtension in @kepler.gl/deckgl-layers
if (!this.filteredIndex || this.filteredIndex.length !== dataContainer.numRows()) {
// for incremental data loading, we need to update filteredIndex
this.filteredIndex = new Uint8ClampedArray(dataContainer.numRows());
this.filteredIndex.fill(1);
}
// check if filteredIndex is a range from 0 to numRows if it is, we don't need to update it
var isRange = filteredIndex && filteredIndex.length === dataContainer.numRows();
if (!isRange || this.filteredIndexTrigger !== null) {
this.filteredIndex.fill(0);
for (var i = 0; i < filteredIndex.length; ++i) {
this.filteredIndex[filteredIndex[i]] = 1;
}
this.filteredIndexTrigger = filteredIndex;
}
// for arrow, always return full dataToFeature instead of a filtered one, so there is no need to update attributes in GPU
return this.dataToFeature;
}
// for geojson, this should work as well and more efficient. But we need to update some test cases e.g. #GeojsonLayer -> formatLayerData
switch (this.config.columnMode) {
case _geojsonUtils.COLUMN_MODE_GEOJSON:
{
return filteredIndex.map(function (i) {
return _this2.dataToFeature[i];
}).filter(function (d) {
return d;
});
}
case COLUMN_MODE_TABLE:
return (0, _geojsonUtils.applyFiltersToTableColumns)(dataset, this.dataToFeature);
default:
return [];
}
}
}, {
key: "formatLayerData",
value: function formatLayerData(datasets, oldLayerData) {
var _this3 = this;
if (this.config.dataId === null) {
return {};
}
var _datasets$this$config = datasets[this.config.dataId],
gpuFilter = _datasets$this$config.gpuFilter,
dataContainer = _datasets$this$config.dataContainer;
var _this$updateData = this.updateData(datasets, oldLayerData),
data = _this$updateData.data;
var filterValueAccessor;
var dataAccessor;
if (this.config.columnMode === _geojsonUtils.COLUMN_MODE_GEOJSON) {
filterValueAccessor = function filterValueAccessor(dc, d, fieldIndex) {
return dc.valueAt(d.properties.index, fieldIndex);
};
dataAccessor = function dataAccessor() {
return function (d) {
return {
index: d.properties.index
};
};
};
} else {
filterValueAccessor = getTableModeValueAccessor;
dataAccessor = function dataAccessor() {
return function (d) {
return {
index: d.properties.index
};
};
};
}
var indexAccessor = function indexAccessor(f) {
return f.properties.index;
};
var accessors = this.getAttributeAccessors({
dataAccessor: dataAccessor,
dataContainer: dataContainer
});
var isFilteredAccessor = function isFilteredAccessor(d) {
return _this3.filteredIndex ? _this3.filteredIndex[d.properties.index] : 1;
};
return _objectSpread({
data: data,
getFilterValue: gpuFilter.filterValueAccessor(dataContainer)(indexAccessor, filterValueAccessor),
getFiltered: isFilteredAccessor
}, accessors);
}
}, {
key: "isInPolygon",
value: function isInPolygon(data, index, polygon) {
var _polygon$properties, _polygon$properties2;
if (this.centroids.length === 0 || !this.centroids[index]) {
return false;
}
var isReactangleSearchBox = ((_polygon$properties = polygon.properties) === null || _polygon$properties === void 0 ? void 0 : _polygon$properties.shape) === 'Rectangle';
var point = this.centroids[index];
// if no valid centroid, return false
if (!point) return false;
// quick check if centroid is within the query rectangle
if (isReactangleSearchBox && (_polygon$properties2 = polygon.properties) !== null && _polygon$properties2 !== void 0 && _polygon$properties2.bbox) {
var _polygon$properties3;
var _ref5 = (polygon === null || polygon === void 0 || (_polygon$properties3 = polygon.properties) === null || _polygon$properties3 === void 0 ? void 0 : _polygon$properties3.bbox) || [],
_ref6 = (0, _slicedToArray2["default"])(_ref5, 4),
minX = _ref6[0],
minY = _ref6[1],
maxX = _ref6[2],
maxY = _ref6[3];
return point[0] >= minX && point[0] <= maxX && point[1] >= minY && point[1] <= maxY;
}
// use turf.js to check if centroid is within query polygon
return (0, _booleanWithin["default"])((0, _helpers.point)(point), polygon);
}
}, {
key: "updateLayerMeta",
value: function updateLayerMeta(dataset) {
var dataContainer = dataset.dataContainer;
this.dataContainer = dataContainer;
this.geoArrowMode = (0, _geojsonUtils.fieldIsGeoArrow)(geoFieldAccessor(this.config.columns)(dataset.dataContainer));
if (this.geoArrowMode && dataContainer instanceof _utils.ArrowDataContainer) {
var geoColumn = geoColumnAccessor(this.config.columns)(dataContainer);
var geoField = geoFieldAccessor(this.config.columns)(dataContainer);
// update the latest batch/chunk of geoarrow data when loading data incrementally
if (geoColumn && geoField && this.dataToFeature.length < dataContainer.numChunks()) {
// for incrementally loading data, we only load and render the latest batch; otherwise, we will load and render all batches
var isIncrementalLoad = dataContainer.numChunks() - this.dataToFeature.length === 1;
// TODO: add support for COLUMN_MODE_TABLE in getGeojsonLayerMetaFromArrow
var _getGeojsonLayerMetaF = (0, _layerUtils.getGeojsonLayerMetaFromArrow)(_objectSpread({
dataContainer: dataContainer,
geoColumn: geoColumn,
geoField: geoField
}, isIncrementalLoad ? {
chunkIndex: this.dataToFeature.length
} : null)),
dataToFeature = _getGeojsonLayerMetaF.dataToFeature,
bounds = _getGeojsonLayerMetaF.bounds,
fixedRadius = _getGeojsonLayerMetaF.fixedRadius,
featureTypes = _getGeojsonLayerMetaF.featureTypes,
centroids = _getGeojsonLayerMetaF.centroids;
if (centroids) this.centroids = this.centroids.concat(centroids);
this.updateMeta({
bounds: bounds,
fixedRadius: fixedRadius,
featureTypes: featureTypes
});
this.dataToFeature = [].concat((0, _toConsumableArray2["default"])(this.dataToFeature), (0, _toConsumableArray2["default"])(dataToFeature));
}
} else if (this.dataToFeature.length === 0 || this.config.columnMode === COLUMN_MODE_TABLE) {
var getFeature = this.getPositionAccessor(dataContainer);
var _getGeojsonLayerMeta = (0, _geojsonUtils.getGeojsonLayerMeta)({
dataContainer: dataContainer,
getFeature: getFeature,
config: this.config
}),
_dataToFeature = _getGeojsonLayerMeta.dataToFeature,
_bounds = _getGeojsonLayerMeta.bounds,
_fixedRadius = _getGeojsonLayerMeta.fixedRadius,
_featureTypes = _getGeojsonLayerMeta.featureTypes,
_centroids = _getGeojsonLayerMeta.centroids;
if (_centroids) this.centroids = _centroids;
this.dataToFeature = _dataToFeature;
this.updateMeta({
bounds: _bounds,
fixedRadius: _fixedRadius,
featureTypes: _featureTypes
});
}
}
}, {
key: "setInitialLayerConfig",
value: function setInitialLayerConfig(dataset) {
var dataContainer = dataset.dataContainer;
if (!dataContainer.numRows()) {
return this;
}
// defefaultLayerProps will automatically find geojson column
// if not found, we try to set it to id / lat /lng /ts
if (!this.config.columns.geojson.value) {
// find columns from lat, lng, id, and ts
var columnConfig = (0, _geojsonUtils.detectTableColumns)(dataset, this.config.columns, 'sortBy');
if (columnConfig) {
this.updateLayerConfig(_objectSpread(_objectSpread({}, columnConfig), {}, {
columnMode: COLUMN_MODE_TABLE
}));
} else {
return this;
}
}
this.updateLayerMeta(dataset);
var featureTypes = this.meta.featureTypes;
// default settings is stroke: true, filled: false
if (featureTypes && featureTypes.polygon) {
// set both fill and stroke to true
return this.updateLayerVisConfig({
filled: true,
stroked: dataContainer.numRows() < DEFAULT_POLYGON_STROKE_LIMIT,
strokeColor: _baseLayer.colorMaker.next().value
});
} else if (featureTypes && featureTypes.point) {
// set fill to true if detect point
return this.updateLayerVisConfig({
filled: true,
stroked: false
});
}
return this;
}
}, {
key: "isLayerHovered",
value: function isLayerHovered(objectInfo) {
return this.geoArrowMode ? (0, _layerUtils.isLayerHoveredFromArrow)(objectInfo, this.id) : _superPropGet(GeoJsonLayer, "isLayerHovered", this, 3)([objectInfo]);
}
}, {
key: "hasHoveredObject",
value: function hasHoveredObject(objectInfo) {
return this.geoArrowMode ? (0, _layerUtils.getHoveredObjectFromArrow)(objectInfo, this.dataContainer, this.id, geoColumnAccessor(this.config.columns), geoFieldAccessor(this.config.columns)) : _superPropGet(GeoJsonLayer, "hasHoveredObject", this, 3)([objectInfo]);
}
}, {
key: "getElevationZoomFactor",
value: function getElevationZoomFactor(_ref7) {
var zoom = _ref7.zoom,
_ref7$zoomOffset = _ref7.zoomOffset,
zoomOffset = _ref7$zoomOffset === void 0 ? 0 : _ref7$zoomOffset;
return this.config.visConfig.fixedHeight ? 1 : Math.pow(2, Math.max(8 - zoom + zoomOffset, 0));
}
}, {
key: "renderLayer",
value: function renderLayer(opts) {
var _this4 = this;
var dataProps = opts.data,
gpuFilter = opts.gpuFilter,
objectHovered = opts.objectHovered,
mapState = opts.mapState,
interactionConfig = opts.interactionConfig;
var _this$meta = this.meta,
fixedRadius = _this$meta.fixedRadius,
featureTypes = _this$meta.featureTypes;
var radiusScale = this.getRadiusScaleByZoom(mapState, fixedRadius);
var zoomFactor = this.getZoomFactor(mapState);
var eleZoomFactor = this.getElevationZoomFactor(mapState);
var visConfig = this.config.visConfig;
var layerProps = {
lineWidthScale: visConfig.thickness * zoomFactor * 8,
elevationScale: visConfig.elevationScale * eleZoomFactor,
pointRadiusScale: radiusScale,
lineMiterLimit: 4
};
var updateTriggers = _objectSpread(_objectSpread({}, this.getVisualChannelUpdateTriggers()), {}, {
getFilterValue: gpuFilter.filterValueUpdateTriggers,
getFiltered: this.filteredIndexTrigger
});
var defaultLayerProps = this.getDefaultDeckLayerProps(opts);
var opaOverwrite = {
opacity: visConfig.strokeOpacity
};
var pickable = interactionConfig.tooltip.enabled;
var hoveredObject = this.hasHoveredObject(objectHovered);
var data = dataProps.data,
props = (0, _objectWithoutProperties2["default"])(dataProps, _excluded);
// arrow table can have multiple chunks, a deck.gl layer is created for each chunk
var deckLayerData = this.geoArrowMode ? data : [data];
var deckLayers = deckLayerData.map(function (d, i) {
return new _layers.GeoJsonLayer(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, defaultLayerProps), layerProps), props), {}, {
data: d,
id: deckLayerData.length > 1 ? "".concat(_this4.id, "-").concat(i) : _this4.id,
pickable: pickable,
highlightColor: _constants.HIGHLIGH_COLOR_3D,
autoHighlight: visConfig.enable3d && pickable,
stroked: visConfig.stroked,
filled: visConfig.filled,
extruded: visConfig.enable3d,
wireframe: visConfig.wireframe,
wrapLongitude: false,
lineMiterLimit: 2,
capRounded: true,
jointRounded: true,
updateTriggers: updateTriggers,
extensions: [].concat((0, _toConsumableArray2["default"])(defaultLayerProps.extensions), [new _deckglLayers.FilterArrowExtension()]),
_subLayerProps: _objectSpread(_objectSpread(_objectSpread({}, featureTypes !== null && featureTypes !== void 0 && featureTypes.polygon ? {
'polygons-stroke': opaOverwrite
} : {}), featureTypes !== null && featureTypes !== void 0 && featureTypes.line ? {
linestrings: opaOverwrite
} : {}), featureTypes !== null && featureTypes !== void 0 && featureTypes.point ? {
points: {
lineOpacity: visConfig.strokeOpacity
}
} : {})
}));
});
return [].concat((0, _toConsumableArray2["default"])(deckLayers), (0, _toConsumableArray2["default"])(hoveredObject && !visConfig.enable3d ? [new _layers.GeoJsonLayer(_objectSpread(_objectSpread(_objectSpread({}, this.getDefaultHoverLayerProps()), layerProps), {}, {
visible: defaultLayerProps.visible,
wrapLongitude: false,
data: [hoveredObject],
getLineWidth: props.getLineWidth,
getPointRadius: props.getPointRadius,
getElevation: props.getElevation,
getLineColor: this.config.highlightColor,
getFillColor: this.config.highlightColor,
// always draw outline
stroked: true,
filled: false
}))] : []));
}
}], [{
key: "type",
get: function get() {
return 'geojson';
}
}, {
key: "findDefaultLayerProps",
value: function findDefaultLayerProps(_ref8) {
var _this5 = this;
var label = _ref8.label,
_ref8$fields = _ref8.fields,
fields = _ref8$fields === void 0 ? [] : _ref8$fields;
var geojsonColumns = fields.filter(function (f) {
return (f.type === 'geojson' || f.type === 'geoarrow') && f.analyzerType && SUPPORTED_ANALYZER_TYPES[f.analyzerType];
}).map(function (f) {
return f.name;
});
var defaultColumns = {
geojson: (0, _uniq["default"])([].concat((0, _toConsumableArray2["default"])(_constants.GEOJSON_FIELDS.geojson), (0, _toConsumableArray2["default"])(geojsonColumns)))
};
var foundColumns = this.findDefaultColumnField(defaultColumns, fields);
if (!foundColumns || !foundColumns.length) {
return {
props: []
};
}
return {
props: foundColumns.map(function (columns) {
return {
label: typeof label === 'string' && label.replace(/\.[^/.]+$/, '') || _this5.type,
columns: columns,
isVisible: true
};
})
};
}
}]);
}(_baseLayer["default"]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaGVscGVycyIsInJlcXVpcmUiLCJfYm9vbGVhbldpdGhpbiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdW5pcSIsIl90eXBlQW5hbHl6ZXIiLCJfYmFzZUxheWVyIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfbGF5ZXJzIiwiX2dlb2pzb25VdGlscyIsIl9sYXllclV0aWxzIiwiX2dlb2pzb25MYXllckljb24iLCJfY29uc3RhbnRzIiwiX3V0aWxzIiwiX2RlY2tnbExheWVycyIsIl9nZW9qc29uSW5mb01vZGFsIiwiX2V4Y2x1ZGVkIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NhbGxTdXBlciIsIm8iLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJfc3VwZXJQcm9wR2V0IiwicCIsIl9nZXQyIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiU1VQUE9SVEVEX0FOQUxZWkVSX1RZUEVTIiwiREFUQV9UWVBFUyIsIkdFT01FVFJZIiwiR0VPTUVUUllfRlJPTV9TVFJJTkciLCJQQUlSX0dFT01FVFJZX0ZST01fU1RSSU5HIiwiZ2VvanNvblZpc0NvbmZpZ3MiLCJleHBvcnRzIiwib3BhY2l0eSIsInN0cm9rZU9wYWNpdHkiLCJMQVlFUl9WSVNfQ09ORklHUyIsInByb3BlcnR5IiwidGhpY2tuZXNzIiwiZGVmYXVsdFZhbHVlIiwic3Ryb2tlQ29sb3IiLCJjb2xvclJhbmdlIiwic3Ryb2tlQ29sb3JSYW5nZSIsInJhZGl1cyIsInNpemVSYW5nZSIsInJhZGl1c1JhbmdlIiwiaGVpZ2h0UmFuZ2UiLCJlbGV2YXRpb25TY2FsZSIsInN0cm9rZWQiLCJmaWxsZWQiLCJlbmFibGUzZCIsIndpcmVmcmFtZSIsImZpeGVkSGVpZ2h0IiwiZ2VvSnNvblJlcXVpcmVkQ29sdW1ucyIsImZlYXR1cmVBY2Nlc3NvciIsIl9yZWYiLCJnZW9qc29uIiwiZGMiLCJkIiwidmFsdWVBdCIsImluZGV4IiwiZmllbGRJZHgiLCJnZW9Db2x1bW5BY2Nlc3NvciIsIl9yZWYyIiwiX2RjJGdldENvbHVtbiIsImdldENvbHVtbiIsImdldFRhYmxlTW9kZVZhbHVlQWNjZXNzb3IiLCJmZWF0dXJlIiwiZmllbGQiLCJwcm9wZXJ0aWVzIiwidmFsdWVzIiwibWFwIiwidiIsInZhbHVlQWNjZXNzb3IiLCJnZXRUYWJsZU1vZGVGaWVsZFZhbHVlIiwiZGF0YSIsInJ2IiwiZGVmYXVsdEdldEZpZWxkVmFsdWUiLCJnZW9GaWVsZEFjY2Vzc29yIiwiX3JlZjMiLCJnZXRGaWVsZCIsImRlZmF1bHRFbGV2YXRpb24iLCJkZWZhdWx0TGluZVdpZHRoIiwiZGVmYXVsdFJhZGl1cyIsIkRFRkFVTFRfUE9MWUdPTl9TVFJPS0VfTElNSVQiLCJDT0xVTU5fTU9ERV9UQUJMRSIsIlNVUFBPUlRFRF9DT0xVTU5fTU9ERVMiLCJrZXkiLCJDT0xVTU5fTU9ERV9HRU9KU09OIiwibGFiZWwiLCJyZXF1aXJlZENvbHVtbnMiLCJvcHRpb25hbENvbHVtbnMiLCJERUZBVUxUX0NPTFVNTl9NT0RFIiwiR2VvSnNvbkxheWVyIiwiX0xheWVyIiwicHJvcHMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJyZWdpc3RlclZpc0NvbmZpZyIsImdldFBvc2l0aW9uQWNjZXNzb3IiLCJkYXRhQ29udGFpbmVyIiwiY29uZmlnIiwiY29sdW1ucyIsIl9sYXllckluZm9Nb2RhbCIsIkdlb2pzb25JbmZvTW9kYWxGYWN0b3J5IiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJ0eXBlIiwiR2VvanNvbkxheWVySWNvbiIsImRlZmF1bHRQb2ludENvbHVtblBhaXJzIiwiaWQiLCJ0ZW1wbGF0ZSIsIm1vZGFsUHJvcHMiLCJ0aXRsZSIsInZhbHVlIiwiYWNjZXNzVlNGaWVsZFZhbHVlIiwiY29sdW1uTW9kZSIsInZpc3VhbENoYW5uZWxzIiwiY29sb3IiLCJhY2Nlc3NvciIsImNvbmRpdGlvbiIsInZpc0NvbmZpZyIsIm51bGxWYWx1ZSIsImdldEF0dHJpYnV0ZVZhbHVlIiwiZmlsbENvbG9yIiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsImxpbmVDb2xvciIsInNpemUiLCJsaW5lV2lkdGgiLCJoZWlnaHQiLCJmaXhlZCIsImVsZXZhdGlvbiIsImdldERlZmF1bHRMYXllckNvbmZpZyIsIl9wcm9wcyRjb2x1bW5Nb2RlIiwiZGVmYXVsdExheWVyQ29uZmlnIiwiaGVpZ2h0RmllbGQiLCJoZWlnaHREb21haW4iLCJoZWlnaHRTY2FsZSIsInJhZGl1c0ZpZWxkIiwicmFkaXVzRG9tYWluIiwicmFkaXVzU2NhbGUiLCJzdHJva2VDb2xvckZpZWxkIiwic3Ryb2tlQ29sb3JEb21haW4iLCJzdHJva2VDb2xvclNjYWxlIiwiY29sb3JVSSIsIkRFRkFVTFRfQ09MT1JfVUkiLCJnZXRIb3ZlckRhdGEiLCJvYmplY3QiLCJfb2JqZWN0JHByb3BlcnRpZXMiLCJnZW9BcnJvd01vZGUiLCJyb3ciLCJnZXRGaWx0ZXJlZEl0ZW1Db3VudCIsImZpbHRlcmVkSXRlbUNvdW50IiwicG9seWdvbkNvdW50IiwiY29uY2F0IiwibGluZXN0cmluZ0NvdW50IiwicG9pbnRDb3VudCIsImNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUiLCJkYXRhc2V0IiwiX3RoaXMyIiwiZmllbGRJc0dlb0Fycm93IiwiZmlsdGVyZWRJbmRleCIsIm51bVJvd3MiLCJVaW50OENsYW1wZWRBcnJheSIsImZpbGwiLCJpc1JhbmdlIiwiZmlsdGVyZWRJbmRleFRyaWdnZXIiLCJkYXRhVG9GZWF0dXJlIiwiYXBwbHlGaWx0ZXJzVG9UYWJsZUNvbHVtbnMiLCJmb3JtYXRMYXllckRhdGEiLCJkYXRhc2V0cyIsIm9sZExheWVyRGF0YSIsIl90aGlzMyIsImRhdGFJZCIsIl9kYXRhc2V0cyR0aGlzJGNvbmZpZyIsImdwdUZpbHRlciIsIl90aGlzJHVwZGF0ZURhdGEiLCJ1cGRhdGVEYXRhIiwiZmlsdGVyVmFsdWVBY2Nlc3NvciIsImRhdGFBY2Nlc3NvciIsImZpZWxkSW5kZXgiLCJpbmRleEFjY2Vzc29yIiwiZiIsImFjY2Vzc29ycyIsImdldEF0dHJpYnV0ZUFjY2Vzc29ycyIsImlzRmlsdGVyZWRBY2Nlc3NvciIsImdldEZpbHRlclZhbHVlIiwiZ2V0RmlsdGVyZWQiLCJpc0luUG9seWdvbiIsInBvbHlnb24iLCJfcG9seWdvbiRwcm9wZXJ0aWVzIiwiX3BvbHlnb24kcHJvcGVydGllczIiLCJjZW50cm9pZHMiLCJpc1JlYWN0YW5nbGVTZWFyY2hCb3giLCJzaGFwZSIsInBvaW50IiwiYmJveCIsIl9wb2x5Z29uJHByb3BlcnRpZXMzIiwiX3JlZjUiLCJfcmVmNiIsIl9zbGljZWRUb0FycmF5MiIsIm1pblgiLCJtaW5ZIiwibWF4WCIsIm1heFkiLCJib29sZWFuV2l0aGluIiwidHVyZlBvaW50IiwidXBkYXRlTGF5ZXJNZXRhIiwiQXJyb3dEYXRhQ29udGFpbmVyIiwiZ2VvQ29sdW1uIiwiZ2VvRmllbGQiLCJudW1DaHVua3MiLCJpc0luY3JlbWVudGFsTG9hZCIsIl9nZXRHZW9qc29uTGF5ZXJNZXRhRiIsImdldEdlb2pzb25MYXllck1ldGFGcm9tQXJyb3ciLCJjaHVua0luZGV4IiwiYm91bmRzIiwiZml4ZWRSYWRpdXMiLCJmZWF0dXJlVHlwZXMiLCJ1cGRhdGVNZXRhIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImdldEZlYXR1cmUiLCJfZ2V0R2VvanNvbkxheWVyTWV0YSIsImdldEdlb2pzb25MYXllck1ldGEiLCJzZXRJbml0aWFsTGF5ZXJDb25maWciLCJjb2x1bW5Db25maWciLCJkZXRlY3RUYWJsZUNvbHVtbnMiLCJ1cGRhdGVMYXllckNvbmZpZyIsIm1ldGEiLCJ1cGRhdGVMYXllclZpc0NvbmZpZyIsImNvbG9yTWFrZXIiLCJuZXh0IiwiaXNMYXllckhvdmVyZWQiLCJvYmplY3RJbmZvIiwiaXNMYXllckhvdmVyZWRGcm9tQXJyb3ciLCJoYXNIb3ZlcmVkT2JqZWN0IiwiZ2V0SG92ZXJlZE9iamVjdEZyb21BcnJvdyIsImdldEVsZXZhdGlvblpvb21GYWN0b3IiLCJfcmVmNyIsInpvb20iLCJfcmVmNyR6b29tT2Zmc2V0Iiwiem9vbU9mZnNldCIsIk1hdGgiLCJwb3ciLCJtYXgiLCJyZW5kZXJMYXllciIsIm9wdHMiLCJfdGhpczQiLCJkYXRhUHJvcHMiLCJvYmplY3RIb3ZlcmVkIiwibWFwU3RhdGUiLCJpbnRlcmFjdGlvbkNvbmZpZyIsIl90aGlzJG1ldGEiLCJnZXRSYWRpdXNTY2FsZUJ5Wm9vbSIsInpvb21GYWN0b3IiLCJnZXRab29tRmFjdG9yIiwiZWxlWm9vbUZhY3RvciIsImxheWVyUHJvcHMiLCJsaW5lV2lkdGhTY2FsZSIsInBvaW50UmFkaXVzU2NhbGUiLCJsaW5lTWl0ZXJMaW1pdCIsInVwZGF0ZVRyaWdnZXJzIiwiZ2V0VmlzdWFsQ2hhbm5lbFVwZGF0ZVRyaWdnZXJzIiwiZmlsdGVyVmFsdWVVcGRhdGVUcmlnZ2VycyIsImRlZmF1bHRMYXllclByb3BzIiwiZ2V0RGVmYXVsdERlY2tMYXllclByb3BzIiwib3BhT3ZlcndyaXRlIiwicGlja2FibGUiLCJ0b29sdGlwIiwiZW5hYmxlZCIsImhvdmVyZWRPYmplY3QiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwiZGVja0xheWVyRGF0YSIsImRlY2tMYXllcnMiLCJEZWNrR0xHZW9Kc29uTGF5ZXIiLCJoaWdobGlnaHRDb2xvciIsIkhJR0hMSUdIX0NPTE9SXzNEIiwiYXV0b0hpZ2hsaWdodCIsImV4dHJ1ZGVkIiwid3JhcExvbmdpdHVkZSIsImNhcFJvdW5kZWQiLCJqb2ludFJvdW5kZWQiLCJleHRlbnNpb25zIiwiRmlsdGVyQXJyb3dFeHRlbnNpb24iLCJfc3ViTGF5ZXJQcm9wcyIsImxpbmUiLCJsaW5lc3RyaW5ncyIsInBvaW50cyIsImxpbmVPcGFjaXR5IiwiZ2V0RGVmYXVsdEhvdmVyTGF5ZXJQcm9wcyIsInZpc2libGUiLCJnZXRMaW5lV2lkdGgiLCJnZXRQb2ludFJhZGl1cyIsImdldEVsZXZhdGlvbiIsImdldExpbmVDb2xvciIsImdldEZpbGxDb2xvciIsImZpbmREZWZhdWx0TGF5ZXJQcm9wcyIsIl9yZWY4IiwiX3RoaXM1IiwiX3JlZjgkZmllbGRzIiwiZmllbGRzIiwiZ2VvanNvbkNvbHVtbnMiLCJhbmFseXplclR5cGUiLCJuYW1lIiwiZGVmYXVsdENvbHVtbnMiLCJ1bmlxIiwiR0VPSlNPTl9GSUVMRFMiLCJmb3VuZENvbHVtbnMiLCJmaW5kRGVmYXVsdENvbHVtbkZpZWxkIiwicmVwbGFjZSIsImlzVmlzaWJsZSIsIkxheWVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dlb2pzb24tbGF5ZXIvZ2VvanNvbi1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgKiBhcyBhcnJvdyBmcm9tICdhcGFjaGUtYXJyb3cnO1xuaW1wb3J0IHtwb2ludCBhcyB0dXJmUG9pbnR9IGZyb20gJ0B0dXJmL2hlbHBlcnMnO1xuaW1wb3J0IGJvb2xlYW5XaXRoaW4gZnJvbSAnQHR1cmYvYm9vbGVhbi13aXRoaW4nO1xuaW1wb3J0IHtGZWF0dXJlLCBQb2x5Z29ufSBmcm9tICdnZW9qc29uJztcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC91bmlxJztcbmltcG9ydCB7REFUQV9UWVBFU30gZnJvbSAndHlwZS1hbmFseXplcic7XG5pbXBvcnQgTGF5ZXIsIHtcbiAgY29sb3JNYWtlcixcbiAgZGVmYXVsdEdldEZpZWxkVmFsdWUsXG4gIExheWVyQmFzZUNvbmZpZyxcbiAgTGF5ZXJCYXNlQ29uZmlnUGFydGlhbCxcbiAgTGF5ZXJDb2xvckNvbmZpZyxcbiAgTGF5ZXJIZWlnaHRDb25maWcsXG4gIExheWVyUmFkaXVzQ29uZmlnLFxuICBMYXllclNpemVDb25maWcsXG4gIExheWVyU3Ryb2tlQ29sb3JDb25maWdcbn0gZnJvbSAnLi4vYmFzZS1sYXllcic7XG5pbXBvcnQge0dlb0pzb25MYXllciBhcyBEZWNrR0xHZW9Kc29uTGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2xheWVycyc7XG5pbXBvcnQge1xuICBnZXRHZW9qc29uTGF5ZXJNZXRhLFxuICBHZW9qc29uRGF0YU1hcHMsXG4gIERlY2tHbEdlb1R5cGVzLFxuICBkZXRlY3RUYWJsZUNvbHVtbnMsXG4gIENPTFVNTl9NT0RFX0dFT0pTT04sXG4gIGFwcGx5RmlsdGVyc1RvVGFibGVDb2x1bW5zLFxuICBmaWVsZElzR2VvQXJyb3dcbn0gZnJvbSAnLi9nZW9qc29uLXV0aWxzJztcbmltcG9ydCB7XG4gIGdldEdlb2pzb25MYXllck1ldGFGcm9tQXJyb3csXG4gIGlzTGF5ZXJIb3ZlcmVkRnJvbUFycm93LFxuICBnZXRIb3ZlcmVkT2JqZWN0RnJvbUFycm93XG59IGZyb20gJy4uL2xheWVyLXV0aWxzJztcbmltcG9ydCBHZW9qc29uTGF5ZXJJY29uIGZyb20gJy4vZ2VvanNvbi1sYXllci1pY29uJztcbmltcG9ydCB7XG4gIEdFT0pTT05fRklFTERTLFxuICBISUdITElHSF9DT0xPUl8zRCxcbiAgQ0hBTk5FTF9TQ0FMRVMsXG4gIExBWUVSX1ZJU19DT05GSUdTLFxuICBERUZBVUxUX0NPTE9SX1VJXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIENvbG9yUmFuZ2UsXG4gIFZpc0NvbmZpZ051bWJlcixcbiAgVmlzQ29uZmlnQ29sb3JTZWxlY3QsXG4gIFZpc0NvbmZpZ0NvbG9yUmFuZ2UsXG4gIFZpc0NvbmZpZ1JhbmdlLFxuICBWaXNDb25maWdCb29sZWFuLFxuICBNZXJnZSxcbiAgUkdCQ29sb3IsXG4gIFByb3RvRGF0YXNldEZpZWxkLFxuICBMYXllckNvbHVtblxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7S2VwbGVyVGFibGV9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtEYXRhQ29udGFpbmVySW50ZXJmYWNlLCBBcnJvd0RhdGFDb250YWluZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtGaWx0ZXJBcnJvd0V4dGVuc2lvbn0gZnJvbSAnQGtlcGxlci5nbC9kZWNrZ2wtbGF5ZXJzJztcbmltcG9ydCBHZW9qc29uSW5mb01vZGFsRmFjdG9yeSBmcm9tICcuL2dlb2pzb24taW5mby1tb2RhbCc7XG5cbmNvbnN0IFNVUFBPUlRFRF9BTkFMWVpFUl9UWVBFUyA9IHtcbiAgW0RBVEFfVFlQRVMuR0VPTUVUUlldOiB0cnVlLFxuICBbREFUQV9UWVBFUy5HRU9NRVRSWV9GUk9NX1NUUklOR106IHRydWUsXG4gIFtEQVRBX1RZUEVTLlBBSVJfR0VPTUVUUllfRlJPTV9TVFJJTkddOiB0cnVlXG59O1xuXG5leHBvcnQgY29uc3QgZ2VvanNvblZpc0NvbmZpZ3M6IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknO1xuICBzdHJva2VPcGFjaXR5OiBWaXNDb25maWdOdW1iZXI7XG4gIHRoaWNrbmVzczogVmlzQ29uZmlnTnVtYmVyO1xuICBzdHJva2VDb2xvcjogJ3N0cm9rZUNvbG9yJztcbiAgY29sb3JSYW5nZTogJ2NvbG9yUmFuZ2UnO1xuICBzdHJva2VDb2xvclJhbmdlOiAnc3Ryb2tlQ29sb3JSYW5nZSc7XG4gIHJhZGl1czogJ3JhZGl1cyc7XG5cbiAgc2l6ZVJhbmdlOiAnc3Ryb2tlV2lkdGhSYW5nZSc7XG4gIHJhZGl1c1JhbmdlOiAncmFkaXVzUmFuZ2UnO1xuICBoZWlnaHRSYW5nZTogJ2VsZXZhdGlvblJhbmdlJztcbiAgZWxldmF0aW9uU2NhbGU6ICdlbGV2YXRpb25TY2FsZSc7XG4gIHN0cm9rZWQ6ICdzdHJva2VkJztcbiAgZmlsbGVkOiAnZmlsbGVkJztcbiAgZW5hYmxlM2Q6ICdlbmFibGUzZCc7XG4gIHdpcmVmcmFtZTogJ3dpcmVmcmFtZSc7XG4gIGZpeGVkSGVpZ2h0OiAnZml4ZWRIZWlnaHQnO1xufSA9IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICBzdHJva2VPcGFjaXR5OiB7XG4gICAgLi4uTEFZRVJfVklTX0NPTkZJR1Mub3BhY2l0eSxcbiAgICBwcm9wZXJ0eTogJ3N0cm9rZU9wYWNpdHknXG4gIH0sXG4gIHRoaWNrbmVzczoge1xuICAgIC4uLkxBWUVSX1ZJU19DT05GSUdTLnRoaWNrbmVzcyxcbiAgICBkZWZhdWx0VmFsdWU6IDAuNVxuICB9LFxuICBzdHJva2VDb2xvcjogJ3N0cm9rZUNvbG9yJyxcbiAgY29sb3JSYW5nZTogJ2NvbG9yUmFuZ2UnLFxuICBzdHJva2VDb2xvclJhbmdlOiAnc3Ryb2tlQ29sb3JSYW5nZScsXG4gIHJhZGl1czogJ3JhZGl1cycsXG5cbiAgc2l6ZVJhbmdlOiAnc3Ryb2tlV2lkdGhSYW5nZScsXG4gIHJhZGl1c1JhbmdlOiAncmFkaXVzUmFuZ2UnLFxuICBoZWlnaHRSYW5nZTogJ2VsZXZhdGlvblJhbmdlJyxcbiAgZWxldmF0aW9uU2NhbGU6ICdlbGV2YXRpb25TY2FsZScsXG4gIHN0cm9rZWQ6ICdzdHJva2VkJyxcbiAgZmlsbGVkOiAnZmlsbGVkJyxcbiAgZW5hYmxlM2Q6ICdlbmFibGUzZCcsXG4gIHdpcmVmcmFtZTogJ3dpcmVmcmFtZScsXG4gIGZpeGVkSGVpZ2h0OiAnZml4ZWRIZWlnaHQnXG59O1xuXG5leHBvcnQgdHlwZSBHZW9Kc29uVmlzQ29uZmlnU2V0dGluZ3MgPSB7XG4gIG9wYWNpdHk6IFZpc0NvbmZpZ051bWJlcjtcbiAgc3Ryb2tlT3BhY2l0eTogVmlzQ29uZmlnTnVtYmVyO1xuICB0aGlja25lc3M6IFZpc0NvbmZpZ051bWJlcjtcbiAgc3Ryb2tlQ29sb3I6IFZpc0NvbmZpZ0NvbG9yU2VsZWN0O1xuICBjb2xvclJhbmdlOiBWaXNDb25maWdDb2xvclJhbmdlO1xuICBzdHJva2VDb2xvclJhbmdlOiBWaXNDb25maWdDb2xvclJhbmdlO1xuICByYWRpdXM6IFZpc0NvbmZpZ051bWJlcjtcblxuICBzaXplUmFuZ2U6IFZpc0NvbmZpZ1JhbmdlO1xuICByYWRpdXNSYW5nZTogVmlzQ29uZmlnUmFuZ2U7XG4gIGhlaWdodFJhbmdlOiBWaXNDb25maWdSYW5nZTtcbiAgZWxldmF0aW9uU2NhbGU6IFZpc0NvbmZpZ051bWJlcjtcbiAgZml4ZWRIZWlnaHQ6IFZpc0NvbmZpZ0Jvb2xlYW47XG4gIHN0cm9rZWQ6IFZpc0NvbmZpZ0Jvb2xlYW47XG4gIGZpbGxlZDogVmlzQ29uZmlnQm9vbGVhbjtcbiAgZW5hYmxlM2Q6IFZpc0NvbmZpZ0Jvb2xlYW47XG4gIHdpcmVmcmFtZTogVmlzQ29uZmlnQm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEdlb0pzb25MYXllckNvbHVtbnNDb25maWcgPSB7XG4gIGdlb2pzb246IExheWVyQ29sdW1uO1xufTtcblxuZXhwb3J0IHR5cGUgR2VvSnNvbkxheWVyVmlzQ29uZmlnID0ge1xuICBvcGFjaXR5OiBudW1iZXI7XG4gIHN0cm9rZU9wYWNpdHk6IG51bWJlcjtcbiAgdGhpY2tuZXNzOiBudW1iZXI7XG4gIHN0cm9rZUNvbG9yOiBSR0JDb2xvcjtcbiAgY29sb3JSYW5nZTogQ29sb3JSYW5nZTtcbiAgc3Ryb2tlQ29sb3JSYW5nZTogQ29sb3JSYW5nZTtcbiAgcmFkaXVzOiBudW1iZXI7XG5cbiAgc2l6ZVJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICByYWRpdXNSYW5nZTogW251bWJlciwgbnVtYmVyXTtcbiAgaGVpZ2h0UmFuZ2U6IFtudW1iZXIsIG51bWJlcl07XG4gIGVsZXZhdGlvblNjYWxlOiBudW1iZXI7XG4gIHN0cm9rZWQ6IGJvb2xlYW47XG4gIGZpbGxlZDogYm9vbGVhbjtcbiAgZW5hYmxlM2Q6IGJvb2xlYW47XG4gIHdpcmVmcmFtZTogYm9vbGVhbjtcbiAgZml4ZWRIZWlnaHQ6IGJvb2xlYW47XG59O1xuXG50eXBlIEdlb0pzb25MYXllclZpc3VhbENoYW5uZWxDb25maWcgPSBMYXllckNvbG9yQ29uZmlnICZcbiAgTGF5ZXJTdHJva2VDb2xvckNvbmZpZyAmXG4gIExheWVyU2l6ZUNvbmZpZyAmXG4gIExheWVySGVpZ2h0Q29uZmlnICZcbiAgTGF5ZXJSYWRpdXNDb25maWc7XG5leHBvcnQgdHlwZSBHZW9Kc29uTGF5ZXJDb25maWcgPSBNZXJnZTxcbiAgTGF5ZXJCYXNlQ29uZmlnLFxuICB7Y29sdW1uczogR2VvSnNvbkxheWVyQ29sdW1uc0NvbmZpZzsgdmlzQ29uZmlnOiBHZW9Kc29uTGF5ZXJWaXNDb25maWd9XG4+ICZcbiAgR2VvSnNvbkxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZztcblxuZXhwb3J0IHR5cGUgR2VvSnNvbkxheWVyTWV0YSA9IHtcbiAgZmVhdHVyZVR5cGVzPzogRGVja0dsR2VvVHlwZXM7XG4gIGZpeGVkUmFkaXVzPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW9Kc29uUmVxdWlyZWRDb2x1bW5zOiBbJ2dlb2pzb24nXSA9IFsnZ2VvanNvbiddO1xuXG50eXBlIE9iamVjdEluZm8gPSB7XG4gIGluZGV4OiBudW1iZXI7XG4gIG9iamVjdD86IEZlYXR1cmUgfCB1bmRlZmluZWQ7XG4gIHBpY2tlZDogYm9vbGVhbjtcbiAgbGF5ZXI6IExheWVyO1xuICByYWRpdXM/OiBudW1iZXI7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IGZlYXR1cmVBY2Nlc3NvciA9XG4gICh7Z2VvanNvbn06IEdlb0pzb25MYXllckNvbHVtbnNDb25maWcpID0+XG4gIChkYzogRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT5cbiAgZCA9PlxuICAgIGRjLnZhbHVlQXQoZC5pbmRleCwgZ2VvanNvbi5maWVsZElkeCk7XG5cbmNvbnN0IGdlb0NvbHVtbkFjY2Vzc29yID1cbiAgKHtnZW9qc29ufTogR2VvSnNvbkxheWVyQ29sdW1uc0NvbmZpZykgPT5cbiAgKGRjOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKTogYXJyb3cuVmVjdG9yIHwgbnVsbCA9PlxuICAgIGRjLmdldENvbHVtbj8uKGdlb2pzb24uZmllbGRJZHgpIGFzIGFycm93LlZlY3RvcjtcblxuY29uc3QgZ2V0VGFibGVNb2RlVmFsdWVBY2Nlc3NvciA9IGZlYXR1cmUgPT4ge1xuICAvLyBDYWxsZWQgZnJvbSBncHUtZmlsdGVyLXV0aWxzLmdldEZpbHRlclZhbHVlQWNjZXNzb3IoKVxuICByZXR1cm4gZmllbGQgPT4gZmVhdHVyZS5wcm9wZXJ0aWVzLnZhbHVlcy5tYXAodiA9PiBmaWVsZC52YWx1ZUFjY2Vzc29yKHYpKTtcbn07XG5cbmNvbnN0IGdldFRhYmxlTW9kZUZpZWxkVmFsdWUgPSAoZmllbGQsIGRhdGEpID0+IHtcbiAgbGV0IHJ2O1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICBydiA9IGRhdGEoZmllbGQpO1xuICB9IGVsc2Uge1xuICAgIHJ2ID0gZGVmYXVsdEdldEZpZWxkVmFsdWUoZmllbGQsIGRhdGEpO1xuICB9XG4gIHJldHVybiBydjtcbn07XG5cbmNvbnN0IGdlb0ZpZWxkQWNjZXNzb3IgPVxuICAoe2dlb2pzb259OiBHZW9Kc29uTGF5ZXJDb2x1bW5zQ29uZmlnKSA9PlxuICAoZGM6IERhdGFDb250YWluZXJJbnRlcmZhY2UpOiBQcm90b0RhdGFzZXRGaWVsZCB8IG51bGwgPT5cbiAgICBkYy5nZXRGaWVsZCA/IGRjLmdldEZpZWxkKGdlb2pzb24uZmllbGRJZHgpIDogbnVsbDtcblxuLy8gYWNjZXNzIGZlYXR1cmUgcHJvcGVydGllcyBmcm9tIGdlb2pzb24gc3ViIGxheWVyXG5leHBvcnQgY29uc3QgZGVmYXVsdEVsZXZhdGlvbiA9IDUwMDtcbmV4cG9ydCBjb25zdCBkZWZhdWx0TGluZVdpZHRoID0gMTtcbmV4cG9ydCBjb25zdCBkZWZhdWx0UmFkaXVzID0gMTtcblxuLy8gZG9uJ3QgdXNlIHN0cm9rZXMgYnkgZGVmYXVsdCBmb3IgZGF0YXNldHMgd2l0aCBsYXJnZSBudW1iZXIgb2YgcG9seWdvbnNcbmNvbnN0IERFRkFVTFRfUE9MWUdPTl9TVFJPS0VfTElNSVQgPSAxMDAwMDA7XG5cbmV4cG9ydCBjb25zdCBDT0xVTU5fTU9ERV9UQUJMRSA9ICd0YWJsZSc7XG5jb25zdCBTVVBQT1JURURfQ09MVU1OX01PREVTID0gW1xuICB7XG4gICAga2V5OiBDT0xVTU5fTU9ERV9HRU9KU09OLFxuICAgIGxhYmVsOiAnR2VvSlNPTicsXG4gICAgcmVxdWlyZWRDb2x1bW5zOiBbJ2dlb2pzb24nXVxuICB9LFxuICB7XG4gICAga2V5OiBDT0xVTU5fTU9ERV9UQUJMRSxcbiAgICBsYWJlbDogJ1RhYmxlIGNvbHVtbnMnLFxuICAgIHJlcXVpcmVkQ29sdW1uczogWydpZCcsICdsYXQnLCAnbG5nJ10sXG4gICAgb3B0aW9uYWxDb2x1bW5zOiBbJ2FsdGl0dWRlJywgJ3NvcnRCeSddXG4gIH1cbl07XG5jb25zdCBERUZBVUxUX0NPTFVNTl9NT0RFID0gQ09MVU1OX01PREVfR0VPSlNPTjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2VvSnNvbkxheWVyIGV4dGVuZHMgTGF5ZXIge1xuICBkZWNsYXJlIGNvbmZpZzogR2VvSnNvbkxheWVyQ29uZmlnO1xuICBkZWNsYXJlIHZpc0NvbmZpZ1NldHRpbmdzOiBHZW9Kc29uVmlzQ29uZmlnU2V0dGluZ3M7XG4gIGRlY2xhcmUgbWV0YTogR2VvSnNvbkxheWVyTWV0YTtcbiAgZGVjbGFyZSBnZW9BcnJvd01vZGU6IGJvb2xlYW47XG5cbiAgZGF0YVRvRmVhdHVyZTogR2VvanNvbkRhdGFNYXBzID0gW107XG4gIGRhdGFDb250YWluZXI6IERhdGFDb250YWluZXJJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcbiAgZmlsdGVyZWRJbmRleDogVWludDhDbGFtcGVkQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgZmlsdGVyZWRJbmRleFRyaWdnZXI6IG51bWJlcltdIHwgbnVsbCA9IG51bGw7XG4gIGNlbnRyb2lkczogQXJyYXk8bnVtYmVyW10gfCBudWxsPiA9IFtdO1xuXG4gIF9sYXllckluZm9Nb2RhbDoge1xuICAgIFtDT0xVTU5fTU9ERV9UQUJMRV06ICgpID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuICAgIFtDT0xVTU5fTU9ERV9HRU9KU09OXTogKCkgPT4gUmVhY3QuSlNYLkVsZW1lbnQ7XG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyVmlzQ29uZmlnKGdlb2pzb25WaXNDb25maWdzKTtcbiAgICB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IgPSAoZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT5cbiAgICAgIGZlYXR1cmVBY2Nlc3Nvcih0aGlzLmNvbmZpZy5jb2x1bW5zKShkYXRhQ29udGFpbmVyKTtcbiAgICB0aGlzLl9sYXllckluZm9Nb2RhbCA9IHtcbiAgICAgIFtDT0xVTU5fTU9ERV9UQUJMRV06IEdlb2pzb25JbmZvTW9kYWxGYWN0b3J5KENPTFVNTl9NT0RFX1RBQkxFKSxcbiAgICAgIFtDT0xVTU5fTU9ERV9HRU9KU09OXTogR2VvanNvbkluZm9Nb2RhbEZhY3RvcnkoQ09MVU1OX01PREVfR0VPSlNPTilcbiAgICB9O1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIEdlb0pzb25MYXllci50eXBlO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpOiAnZ2VvanNvbicge1xuICAgIHJldHVybiAnZ2VvanNvbic7XG4gIH1cblxuICBnZXQgbmFtZSgpOiAnUG9seWdvbicge1xuICAgIHJldHVybiAnUG9seWdvbic7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBHZW9qc29uTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRQb2ludENvbHVtblBhaXJzO1xuICB9XG5cbiAgZ2V0IHN1cHBvcnRlZENvbHVtbk1vZGVzKCkge1xuICAgIHJldHVybiBTVVBQT1JURURfQ09MVU1OX01PREVTO1xuICB9XG5cbiAgZ2V0IGxheWVySW5mb01vZGFsKCkge1xuICAgIHJldHVybiB7XG4gICAgICBbQ09MVU1OX01PREVfR0VPSlNPTl06IHtcbiAgICAgICAgaWQ6ICdpY29uSW5mbycsXG4gICAgICAgIHRlbXBsYXRlOiB0aGlzLl9sYXllckluZm9Nb2RhbFtDT0xVTU5fTU9ERV9HRU9KU09OXSxcbiAgICAgICAgbW9kYWxQcm9wczoge1xuICAgICAgICAgIHRpdGxlOiAnbW9kYWwucG9seWdvbkluZm8udGl0bGUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbQ09MVU1OX01PREVfVEFCTEVdOiB7XG4gICAgICAgIGlkOiAnaWNvbkluZm8nLFxuICAgICAgICB0ZW1wbGF0ZTogdGhpcy5fbGF5ZXJJbmZvTW9kYWxbQ09MVU1OX01PREVfVEFCTEVdLFxuICAgICAgICBtb2RhbFByb3BzOiB7XG4gICAgICAgICAgdGl0bGU6ICdtb2RhbC5wb2x5Z29uSW5mby50aXRsZVRhYmxlJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFjY2Vzc1ZTRmllbGRWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5jb25maWcuY29sdW1uTW9kZSA9PT0gQ09MVU1OX01PREVfR0VPSlNPTikge1xuICAgICAgcmV0dXJuIGRlZmF1bHRHZXRGaWVsZFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0VGFibGVNb2RlRmllbGRWYWx1ZTtcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVscyA9IHN1cGVyLnZpc3VhbENoYW5uZWxzO1xuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjoge1xuICAgICAgICAuLi52aXN1YWxDaGFubmVscy5jb2xvcixcbiAgICAgICAgYWNjZXNzb3I6ICdnZX