kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
524 lines (467 loc) • 55.2 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.EXPORT_DATA_TYPE_OPTIONS = exports.EXPORT_DATA_TYPE = exports.DEFAULT_EXPORT_IMAGE_NAME = exports.RESOLUTION_OPTIONS = exports.RATIO_OPTIONS = exports.RATIOS = exports.RESOLUTIONS = exports.MAX_DEFAULT_TOOLTIPS = exports.LAYER_BLENDINGS = exports.NO_VALUE_COLOR = exports.DEFAULT_LIGHT_SETTINGS = exports.DEFAULT_TOOLTIP_FIELDS = exports.DEFAULT_LAYER_COLOR = exports.LAYER_TYPES = exports.CHANNEL_SCALE_SUPPORTED_FIELDS = exports.FIELD_OPTS = exports.DEFAULT_AGGREGATION = exports.notSupportAggrOpts = exports.notSupportedScaleOpts = exports.ordinalFieldAggrScaleFunctions = exports.ordinalFieldScaleFunctions = exports.linearFieldAggrScaleFunctions = exports.linearFieldScaleFunctions = exports.AGGREGATION_TYPES = exports.CHANNEL_SCALES = exports.FIELD_DISPLAY_FORMAT = exports.defaultFormat = exports.FILED_TYPE_DISPLAY = exports.FIELD_COLORS = exports.ALL_FIELD_TYPES = exports.SCALE_FUNC = exports.SCALE_TYPES = exports.TRIP_ARC_FIELDS = exports.TRIP_POINT_FIELDS = exports.ICON_FIELDS = exports.GEOJSON_FIELDS = exports.DEFAULT_MAP_STYLES = exports.DEFAULT_LAYER_GROUPS = exports.PANELS_FOOTER = exports.PANELS = exports.DIMENSIONS = exports.KEPLER_GL_VERSION = exports.KEPLER_GL_NAME = exports.ADD_MAP_STYLE_ID = exports.EXPORT_CONFIG_ID = exports.EXPORT_DATA_ID = exports.EXPORT_IMAGE_ID = exports.ADD_DATA_ID = exports.DELETE_DATA_ID = exports.DATA_TABLE_ID = exports.LAYER_CONFIG_ID = exports.ICON_PREFIX = exports.STYLE_PREFIX = exports.CLOUDFRONT = exports.ACTION_PREFIX = undefined;
var _extends3 = require('babel-runtime/helpers/extends');
var _extends4 = _interopRequireDefault(_extends3);
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _FILED_TYPE_DISPLAY, _FIELD_DISPLAY_FORMAT, _linearFieldScaleFunc, _CHANNEL_SCALES$color, _CHANNEL_SCALES$sizeA, _linearFieldAggrScale, _ordinalFieldScaleFun, _CHANNEL_SCALES$color2, _ordinalFieldAggrScal, _notSupportedScaleOpt, _notSupportAggrOpts, _DEFAULT_AGGREGATION; // Copyright (c) 2018 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
var _keymirror = require('keymirror');
var _keymirror2 = _interopRequireDefault(_keymirror);
var _icons = require('../components/common/icons');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var ACTION_PREFIX = exports.ACTION_PREFIX = '@@kepler.gl/';
var CLOUDFRONT = exports.CLOUDFRONT = 'https://d1a3f4spazzrp4.cloudfront.net/kepler.gl';
var STYLE_PREFIX = exports.STYLE_PREFIX = CLOUDFRONT + '/map-styles';
var ICON_PREFIX = exports.ICON_PREFIX = CLOUDFRONT + '/geodude';
// Modal Ids
var LAYER_CONFIG_ID = exports.LAYER_CONFIG_ID = 'copyConfig';
var DATA_TABLE_ID = exports.DATA_TABLE_ID = 'dataTable';
var DELETE_DATA_ID = exports.DELETE_DATA_ID = 'deleteData';
var ADD_DATA_ID = exports.ADD_DATA_ID = 'addData';
var EXPORT_IMAGE_ID = exports.EXPORT_IMAGE_ID = 'exportImage';
var EXPORT_DATA_ID = exports.EXPORT_DATA_ID = 'exportData';
var EXPORT_CONFIG_ID = exports.EXPORT_CONFIG_ID = 'exportConfig';
var ADD_MAP_STYLE_ID = exports.ADD_MAP_STYLE_ID = 'addMapStyle';
var KEPLER_GL_NAME = exports.KEPLER_GL_NAME = 'kepler.gl';
var KEPLER_GL_VERSION = exports.KEPLER_GL_VERSION = 'v1.0';
var DIMENSIONS = exports.DIMENSIONS = {
sidePanel: {
width: 300,
margin: { top: 20, left: 20, bottom: 30, right: 20 },
headerHeight: 96
},
mapControl: {
width: 204,
padding: 12
}
};
var PANELS = exports.PANELS = [{
id: 'layer',
label: 'Layers',
iconComponent: _icons.Layers
}, {
id: 'filter',
label: 'Filters',
iconComponent: _icons.FilterFunnel
}, {
id: 'interaction',
label: 'Interactions',
iconComponent: _icons.CursorClick
}, {
id: 'map',
label: 'Base map',
iconComponent: _icons.Settings
}];
var PANELS_FOOTER = exports.PANELS_FOOTER = [{
id: LAYER_CONFIG_ID,
label: 'Copy Config',
icon: 'clipboard'
}];
// MAP STYLES
var DEFAULT_LAYER_GROUPS = exports.DEFAULT_LAYER_GROUPS = [{
slug: 'label',
filter: function filter(_ref) {
var id = _ref.id;
return id.match(/(?=(label|place-|poi-))/);
},
defaultVisibility: true
}, {
slug: 'road',
filter: function filter(_ref2) {
var id = _ref2.id;
return id.match(/(?=(road|railway|tunnel|street|bridge))(?!.*label)/);
},
defaultVisibility: true
}, {
slug: 'border',
filter: function filter(_ref3) {
var id = _ref3.id;
return id.match(/border|boundaries/);
},
defaultVisibility: false
}, {
slug: 'building',
filter: function filter(_ref4) {
var id = _ref4.id;
return id.match(/building/);
},
defaultVisibility: true
}, {
slug: 'water',
filter: function filter(_ref5) {
var id = _ref5.id;
return id.match(/(?=(water|stream|ferry))/);
},
defaultVisibility: true
}, {
slug: 'land',
filter: function filter(_ref6) {
var id = _ref6.id;
return id.match(/(?=(parks|landcover|industrial|sand|hillshade))/);
},
defaultVisibility: true
}];
var DEFAULT_MAP_STYLES = exports.DEFAULT_MAP_STYLES = [{
id: 'dark',
label: 'Dark',
url: STYLE_PREFIX + '/dark',
icon: ICON_PREFIX + '/UBER_DARK_V2.png',
layerGroups: DEFAULT_LAYER_GROUPS
}, {
id: 'light',
label: 'Light',
url: STYLE_PREFIX + '/light',
icon: ICON_PREFIX + '/UBER_LIGHT_V2.png',
layerGroups: DEFAULT_LAYER_GROUPS
}, {
id: 'muted',
label: 'Muted Light',
url: STYLE_PREFIX + '/muted-light',
icon: ICON_PREFIX + '/UBER_MUTED_LIGHT.png',
layerGroups: DEFAULT_LAYER_GROUPS
}, {
id: 'muted_night',
label: 'Muted Night',
url: STYLE_PREFIX + '/muted-night',
icon: ICON_PREFIX + '/UBER_MUTED_NIGHT.png',
layerGroups: DEFAULT_LAYER_GROUPS
}];
var GEOJSON_FIELDS = exports.GEOJSON_FIELDS = {
geojson: ['_geojson', 'all_points', 'geojson']
};
var ICON_FIELDS = exports.ICON_FIELDS = {
icon: ['icon']
};
var TRIP_POINT_FIELDS = exports.TRIP_POINT_FIELDS = [['lat', 'lng'], ['lat', 'lon'], ['latitude', 'longitude']];
var TRIP_ARC_FIELDS = exports.TRIP_ARC_FIELDS = {
lat0: 'begintrip',
lng0: 'begintrip',
lat1: 'dropoff',
lng1: 'dropoff'
};
var SCALE_TYPES = exports.SCALE_TYPES = (0, _keymirror2.default)({
ordinal: null,
quantile: null,
quantize: null,
linear: null,
// for radius
sqrt: null,
// ordinal domain to linear range
point: null
});
var SCALE_FUNC = exports.SCALE_FUNC = {
linear: require('d3-scale').scaleLinear,
quantize: require('d3-scale').scaleQuantize,
quantile: require('d3-scale').scaleQuantile,
ordinal: require('d3-scale').scaleOrdinal,
sqrt: require('d3-scale').scaleSqrt,
point: require('d3-scale').scalePoint
};
var ALL_FIELD_TYPES = exports.ALL_FIELD_TYPES = (0, _keymirror2.default)({
boolean: null,
date: null,
geojson: null,
integer: null,
real: null,
string: null,
timestamp: null,
point: null
});
var ORANGE = '248, 194, 28';
var PINK = '231, 189, 194';
var PURPLE = '160, 106, 206';
var BLUE = '140, 210, 205';
var BLUE2 = '106, 160, 206';
var BLUE3 = '0, 172, 237';
var GREEN = '106, 160, 56';
var RED = '237, 88, 106';
var FIELD_COLORS = exports.FIELD_COLORS = {
default: RED
};
var FILED_TYPE_DISPLAY = exports.FILED_TYPE_DISPLAY = (_FILED_TYPE_DISPLAY = {}, (0, _defineProperty3.default)(_FILED_TYPE_DISPLAY, ALL_FIELD_TYPES.boolean, {
label: 'bool',
color: PINK
}), (0, _defineProperty3.default)(_FILED_TYPE_DISPLAY, ALL_FIELD_TYPES.date, {
label: 'date',
color: PURPLE
}), (0, _defineProperty3.default)(_FILED_TYPE_DISPLAY, ALL_FIELD_TYPES.geojson, {
label: 'geo',
color: BLUE2
}), (0, _defineProperty3.default)(_FILED_TYPE_DISPLAY, ALL_FIELD_TYPES.integer, {
label: 'int',
color: ORANGE
}), (0, _defineProperty3.default)(_FILED_TYPE_DISPLAY, ALL_FIELD_TYPES.real, {
label: 'float',
color: ORANGE
}), (0, _defineProperty3.default)(_FILED_TYPE_DISPLAY, ALL_FIELD_TYPES.string, {
label: 'string',
color: BLUE
}), (0, _defineProperty3.default)(_FILED_TYPE_DISPLAY, ALL_FIELD_TYPES.timestamp, {
label: 'time',
color: GREEN
}), (0, _defineProperty3.default)(_FILED_TYPE_DISPLAY, ALL_FIELD_TYPES.point, {
label: 'point',
color: BLUE3
}), _FILED_TYPE_DISPLAY);
var defaultFormat = exports.defaultFormat = function defaultFormat(d) {
return d;
};
var FIELD_DISPLAY_FORMAT = exports.FIELD_DISPLAY_FORMAT = (_FIELD_DISPLAY_FORMAT = {}, (0, _defineProperty3.default)(_FIELD_DISPLAY_FORMAT, ALL_FIELD_TYPES.string, defaultFormat), (0, _defineProperty3.default)(_FIELD_DISPLAY_FORMAT, ALL_FIELD_TYPES.timestamp, defaultFormat), (0, _defineProperty3.default)(_FIELD_DISPLAY_FORMAT, ALL_FIELD_TYPES.integer, defaultFormat), (0, _defineProperty3.default)(_FIELD_DISPLAY_FORMAT, ALL_FIELD_TYPES.boolean, function (d) {
return String(d);
}), (0, _defineProperty3.default)(_FIELD_DISPLAY_FORMAT, ALL_FIELD_TYPES.date, defaultFormat), (0, _defineProperty3.default)(_FIELD_DISPLAY_FORMAT, ALL_FIELD_TYPES.geojson, defaultFormat), _FIELD_DISPLAY_FORMAT);
var CHANNEL_SCALES = exports.CHANNEL_SCALES = (0, _keymirror2.default)({
color: null,
radius: null,
size: null,
colorAggr: null,
sizeAggr: null
});
var AGGREGATION_TYPES = exports.AGGREGATION_TYPES = {
// default
count: 'count',
// linear
average: 'average',
maximum: 'maximum',
minimum: 'minimum',
median: 'median',
sum: 'sum',
// ordinal
mode: 'mode',
countUnique: 'count unique'
};
var linearFieldScaleFunctions = exports.linearFieldScaleFunctions = (_linearFieldScaleFunc = {}, (0, _defineProperty3.default)(_linearFieldScaleFunc, CHANNEL_SCALES.color, [SCALE_TYPES.quantize, SCALE_TYPES.quantile]), (0, _defineProperty3.default)(_linearFieldScaleFunc, CHANNEL_SCALES.radius, [SCALE_TYPES.sqrt]), (0, _defineProperty3.default)(_linearFieldScaleFunc, CHANNEL_SCALES.size, [SCALE_TYPES.linear]), _linearFieldScaleFunc);
var linearFieldAggrScaleFunctions = exports.linearFieldAggrScaleFunctions = (_linearFieldAggrScale = {}, (0, _defineProperty3.default)(_linearFieldAggrScale, CHANNEL_SCALES.colorAggr, (_CHANNEL_SCALES$color = {}, (0, _defineProperty3.default)(_CHANNEL_SCALES$color, AGGREGATION_TYPES.average, [SCALE_TYPES.quantize, SCALE_TYPES.quantile]), (0, _defineProperty3.default)(_CHANNEL_SCALES$color, AGGREGATION_TYPES.maximum, [SCALE_TYPES.quantize, SCALE_TYPES.quantile]), (0, _defineProperty3.default)(_CHANNEL_SCALES$color, AGGREGATION_TYPES.minimum, [SCALE_TYPES.quantize, SCALE_TYPES.quantile]), (0, _defineProperty3.default)(_CHANNEL_SCALES$color, AGGREGATION_TYPES.median, [SCALE_TYPES.quantize, SCALE_TYPES.quantile]), (0, _defineProperty3.default)(_CHANNEL_SCALES$color, AGGREGATION_TYPES.sum, [SCALE_TYPES.quantize, SCALE_TYPES.quantile]), _CHANNEL_SCALES$color)), (0, _defineProperty3.default)(_linearFieldAggrScale, CHANNEL_SCALES.sizeAggr, (_CHANNEL_SCALES$sizeA = {}, (0, _defineProperty3.default)(_CHANNEL_SCALES$sizeA, AGGREGATION_TYPES.average, [SCALE_TYPES.linear]), (0, _defineProperty3.default)(_CHANNEL_SCALES$sizeA, AGGREGATION_TYPES.maximum, [SCALE_TYPES.linear]), (0, _defineProperty3.default)(_CHANNEL_SCALES$sizeA, AGGREGATION_TYPES.minimum, [SCALE_TYPES.linear]), (0, _defineProperty3.default)(_CHANNEL_SCALES$sizeA, AGGREGATION_TYPES.median, [SCALE_TYPES.linear]), (0, _defineProperty3.default)(_CHANNEL_SCALES$sizeA, AGGREGATION_TYPES.sum, [SCALE_TYPES.linear]), _CHANNEL_SCALES$sizeA)), _linearFieldAggrScale);
var ordinalFieldScaleFunctions = exports.ordinalFieldScaleFunctions = (_ordinalFieldScaleFun = {}, (0, _defineProperty3.default)(_ordinalFieldScaleFun, CHANNEL_SCALES.color, [SCALE_TYPES.ordinal]), (0, _defineProperty3.default)(_ordinalFieldScaleFun, CHANNEL_SCALES.radius, [SCALE_TYPES.point]), (0, _defineProperty3.default)(_ordinalFieldScaleFun, CHANNEL_SCALES.size, [SCALE_TYPES.point]), _ordinalFieldScaleFun);
var ordinalFieldAggrScaleFunctions = exports.ordinalFieldAggrScaleFunctions = (_ordinalFieldAggrScal = {}, (0, _defineProperty3.default)(_ordinalFieldAggrScal, CHANNEL_SCALES.colorAggr, (_CHANNEL_SCALES$color2 = {}, (0, _defineProperty3.default)(_CHANNEL_SCALES$color2, AGGREGATION_TYPES.mode, [SCALE_TYPES.ordinal]), (0, _defineProperty3.default)(_CHANNEL_SCALES$color2, AGGREGATION_TYPES.countUnique, [SCALE_TYPES.quantize, SCALE_TYPES.quantile]), _CHANNEL_SCALES$color2)), (0, _defineProperty3.default)(_ordinalFieldAggrScal, CHANNEL_SCALES.sizeAggr, {}), _ordinalFieldAggrScal);
var notSupportedScaleOpts = exports.notSupportedScaleOpts = (_notSupportedScaleOpt = {}, (0, _defineProperty3.default)(_notSupportedScaleOpt, CHANNEL_SCALES.color, []), (0, _defineProperty3.default)(_notSupportedScaleOpt, CHANNEL_SCALES.radius, []), (0, _defineProperty3.default)(_notSupportedScaleOpt, CHANNEL_SCALES.size, []), _notSupportedScaleOpt);
var notSupportAggrOpts = exports.notSupportAggrOpts = (_notSupportAggrOpts = {}, (0, _defineProperty3.default)(_notSupportAggrOpts, CHANNEL_SCALES.colorAggr, {}), (0, _defineProperty3.default)(_notSupportAggrOpts, CHANNEL_SCALES.sizeAggr, {}), _notSupportAggrOpts);
/**
* Default aggregation are based on ocunt
*/
var DEFAULT_AGGREGATION = exports.DEFAULT_AGGREGATION = (_DEFAULT_AGGREGATION = {}, (0, _defineProperty3.default)(_DEFAULT_AGGREGATION, CHANNEL_SCALES.colorAggr, (0, _defineProperty3.default)({}, AGGREGATION_TYPES.count, [SCALE_TYPES.quantize, SCALE_TYPES.quantile])), (0, _defineProperty3.default)(_DEFAULT_AGGREGATION, CHANNEL_SCALES.sizeAggr, (0, _defineProperty3.default)({}, AGGREGATION_TYPES.count, [SCALE_TYPES.linear])), _DEFAULT_AGGREGATION);
/**
* Define what type of scale operation is allowed on each type of fields
*/
var FIELD_OPTS = exports.FIELD_OPTS = {
string: {
type: 'categorical',
scale: (0, _extends4.default)({}, ordinalFieldScaleFunctions, ordinalFieldAggrScaleFunctions),
format: {
legend: function legend(d) {
return d;
}
}
},
real: {
type: 'numerical',
scale: (0, _extends4.default)({}, linearFieldScaleFunctions, linearFieldAggrScaleFunctions),
format: {
legend: function legend(d) {
return d;
}
}
},
timestamp: {
type: 'time',
scale: (0, _extends4.default)({}, linearFieldScaleFunctions, notSupportAggrOpts),
format: {
legend: function legend(d) {
return d;
}
}
},
integer: {
type: 'numerical',
scale: (0, _extends4.default)({}, linearFieldScaleFunctions, linearFieldAggrScaleFunctions),
format: {
legend: function legend(d) {
return d;
}
}
},
boolean: {
type: 'boolean',
scale: (0, _extends4.default)({}, ordinalFieldScaleFunctions, ordinalFieldAggrScaleFunctions),
format: {
legend: function legend(d) {
return d;
}
}
},
date: {
scale: (0, _extends4.default)({}, ordinalFieldScaleFunctions, ordinalFieldAggrScaleFunctions),
format: {
legend: function legend(d) {
return d;
}
}
},
geojson: {
type: 'geometry',
scale: (0, _extends4.default)({}, notSupportedScaleOpts, notSupportAggrOpts),
format: {
legend: function legend(d) {
return '...';
}
}
}
};
var CHANNEL_SCALE_SUPPORTED_FIELDS = exports.CHANNEL_SCALE_SUPPORTED_FIELDS = Object.keys(CHANNEL_SCALES).reduce(function (accu, key) {
return (0, _extends4.default)({}, accu, (0, _defineProperty3.default)({}, key, Object.keys(FIELD_OPTS).filter(function (ft) {
return Object.keys(FIELD_OPTS[ft].scale[key]).length;
})));
}, {});
// TODO: shan delete use of LAYER_TYPES
var LAYER_TYPES = exports.LAYER_TYPES = (0, _keymirror2.default)({
point: null,
arc: null,
cluster: null,
line: null,
grid: null,
geojson: null,
icon: null,
heatmap: null,
hexagon: null
});
var DEFAULT_LAYER_COLOR = exports.DEFAULT_LAYER_COLOR = {
tripArc: '#9226C6',
begintrip_lat: '#1E96BE',
dropoff_lat: '#FF991F',
request_lat: '#52A353'
};
// let user pass in default tooltip fields
var DEFAULT_TOOLTIP_FIELDS = exports.DEFAULT_TOOLTIP_FIELDS = [];
var DEFAULT_LIGHT_SETTINGS = exports.DEFAULT_LIGHT_SETTINGS = {
lightsPosition: [-122.45, 37.66, 8000, -122.0, 38.0, 8000],
ambientRatio: 0.4,
diffuseRatio: 0.6,
specularRatio: 0.3,
lightsStrength: [0.9, 0.0, 0.8, 0.0],
numberOfLights: 2
};
var NO_VALUE_COLOR = exports.NO_VALUE_COLOR = [147, 147, 147];
var LAYER_BLENDINGS = exports.LAYER_BLENDINGS = {
additive: {
blendFunc: ['SRC_ALPHA', 'DST_ALPHA'],
blendEquation: 'FUNC_ADD'
},
normal: {
// reference to
// https://limnu.com/webgl-blending-youre-probably-wrong/
blendFunc: ['SRC_ALPHA', 'ONE_MINUS_SRC_ALPHA', 'ONE', 'ONE_MINUS_SRC_ALPHA'],
blendEquation: ['FUNC_ADD', 'FUNC_ADD']
},
subtractive: {
blendFunc: ['ONE', 'ONE_MINUS_DST_COLOR', 'SRC_ALPHA', 'DST_ALPHA'],
blendEquation: ['FUNC_SUBTRACT', 'FUNC_ADD']
}
};
var MAX_DEFAULT_TOOLTIPS = exports.MAX_DEFAULT_TOOLTIPS = 5;
var RESOLUTIONS = exports.RESOLUTIONS = (0, _keymirror2.default)({
ONE_X: null,
TWO_X: null
});
var RATIOS = exports.RATIOS = (0, _keymirror2.default)({
SCREEN: null,
FOUR_BY_THREE: null,
SIXTEEN_BY_NINE: null
});
var RATIO_OPTIONS = exports.RATIO_OPTIONS = [{
id: RATIOS.SCREEN,
label: 'Original Screen',
getSize: function getSize(screenW, screenH) {
return { width: screenW, height: screenH };
}
}, {
id: RATIOS.FOUR_BY_THREE,
label: '4:3',
getSize: function getSize(screenW, screenH) {
return { width: screenW, height: Math.round(screenW * 0.75) };
}
}, {
id: RATIOS.SIXTEEN_BY_NINE,
label: '16:9',
getSize: function getSize(screenW, screenH) {
return { width: screenW, height: Math.round(screenW * 0.5625) };
}
}];
var RESOLUTION_OPTIONS = exports.RESOLUTION_OPTIONS = [{
id: RESOLUTIONS.ONE_X,
label: '1x',
available: true,
scale: 1,
zoomOffset: Math.log2(1),
getSize: function getSize(screenW, screenH) {
return {
width: screenW,
height: screenH
};
}
}, {
id: RESOLUTIONS.TWO_X,
label: '2x',
available: true,
scale: 2,
zoomOffset: Math.log2(2),
getSize: function getSize(screenW, screenH) {
return {
width: screenW * 2,
height: screenH * 2
};
}
}];
var DEFAULT_EXPORT_IMAGE_NAME = exports.DEFAULT_EXPORT_IMAGE_NAME = 'kepler-gl.png';
var EXPORT_DATA_TYPE = exports.EXPORT_DATA_TYPE = (0, _keymirror2.default)({
CSV: null
// SHAPEFILE: null,
// JSON: null,
// GEOJSON: null,
// TOPOJSON: null
});
var EXPORT_DATA_TYPE_OPTIONS = exports.EXPORT_DATA_TYPE_OPTIONS = [{
id: EXPORT_DATA_TYPE.CSV,
label: 'csv',
available: true
// {
// id: EXPORT_DATA_TYPE.SHAPEFILE,
// label: 'shapefile',
// available: false
// },
// {
// id: EXPORT_DATA_TYPE.JSON,
// label: 'json',
// available: false
// },
// {
// id: EXPORT_DATA_TYPE.GEOJSON,
// label: 'geojson',
// available: false
// },
// {
// id: EXPORT_DATA_TYPE.TOPOJSON,
// label: 'topojson',
// available: false
// }
}];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5qcyJdLCJuYW1lcyI6WyJBQ1RJT05fUFJFRklYIiwiQ0xPVURGUk9OVCIsIlNUWUxFX1BSRUZJWCIsIklDT05fUFJFRklYIiwiTEFZRVJfQ09ORklHX0lEIiwiREFUQV9UQUJMRV9JRCIsIkRFTEVURV9EQVRBX0lEIiwiQUREX0RBVEFfSUQiLCJFWFBPUlRfSU1BR0VfSUQiLCJFWFBPUlRfREFUQV9JRCIsIkVYUE9SVF9DT05GSUdfSUQiLCJBRERfTUFQX1NUWUxFX0lEIiwiS0VQTEVSX0dMX05BTUUiLCJLRVBMRVJfR0xfVkVSU0lPTiIsIkRJTUVOU0lPTlMiLCJzaWRlUGFuZWwiLCJ3aWR0aCIsIm1hcmdpbiIsInRvcCIsImxlZnQiLCJib3R0b20iLCJyaWdodCIsImhlYWRlckhlaWdodCIsIm1hcENvbnRyb2wiLCJwYWRkaW5nIiwiUEFORUxTIiwiaWQiLCJsYWJlbCIsImljb25Db21wb25lbnQiLCJMYXllcnMiLCJGaWx0ZXJGdW5uZWwiLCJDdXJzb3JDbGljayIsIlNldHRpbmdzIiwiUEFORUxTX0ZPT1RFUiIsImljb24iLCJERUZBVUxUX0xBWUVSX0dST1VQUyIsInNsdWciLCJmaWx0ZXIiLCJtYXRjaCIsImRlZmF1bHRWaXNpYmlsaXR5IiwiREVGQVVMVF9NQVBfU1RZTEVTIiwidXJsIiwibGF5ZXJHcm91cHMiLCJHRU9KU09OX0ZJRUxEUyIsImdlb2pzb24iLCJJQ09OX0ZJRUxEUyIsIlRSSVBfUE9JTlRfRklFTERTIiwiVFJJUF9BUkNfRklFTERTIiwibGF0MCIsImxuZzAiLCJsYXQxIiwibG5nMSIsIlNDQUxFX1RZUEVTIiwib3JkaW5hbCIsInF1YW50aWxlIiwicXVhbnRpemUiLCJsaW5lYXIiLCJzcXJ0IiwicG9pbnQiLCJTQ0FMRV9GVU5DIiwicmVxdWlyZSIsInNjYWxlTGluZWFyIiwic2NhbGVRdWFudGl6ZSIsInNjYWxlUXVhbnRpbGUiLCJzY2FsZU9yZGluYWwiLCJzY2FsZVNxcnQiLCJzY2FsZVBvaW50IiwiQUxMX0ZJRUxEX1RZUEVTIiwiYm9vbGVhbiIsImRhdGUiLCJpbnRlZ2VyIiwicmVhbCIsInN0cmluZyIsInRpbWVzdGFtcCIsIk9SQU5HRSIsIlBJTksiLCJQVVJQTEUiLCJCTFVFIiwiQkxVRTIiLCJCTFVFMyIsIkdSRUVOIiwiUkVEIiwiRklFTERfQ09MT1JTIiwiZGVmYXVsdCIsIkZJTEVEX1RZUEVfRElTUExBWSIsImNvbG9yIiwiZGVmYXVsdEZvcm1hdCIsImQiLCJGSUVMRF9ESVNQTEFZX0ZPUk1BVCIsIlN0cmluZyIsIkNIQU5ORUxfU0NBTEVTIiwicmFkaXVzIiwic2l6ZSIsImNvbG9yQWdnciIsInNpemVBZ2dyIiwiQUdHUkVHQVRJT05fVFlQRVMiLCJjb3VudCIsImF2ZXJhZ2UiLCJtYXhpbXVtIiwibWluaW11bSIsIm1lZGlhbiIsInN1bSIsIm1vZGUiLCJjb3VudFVuaXF1ZSIsImxpbmVhckZpZWxkU2NhbGVGdW5jdGlvbnMiLCJsaW5lYXJGaWVsZEFnZ3JTY2FsZUZ1bmN0aW9ucyIsIm9yZGluYWxGaWVsZFNjYWxlRnVuY3Rpb25zIiwib3JkaW5hbEZpZWxkQWdnclNjYWxlRnVuY3Rpb25zIiwibm90U3VwcG9ydGVkU2NhbGVPcHRzIiwibm90U3VwcG9ydEFnZ3JPcHRzIiwiREVGQVVMVF9BR0dSRUdBVElPTiIsIkZJRUxEX09QVFMiLCJ0eXBlIiwic2NhbGUiLCJmb3JtYXQiLCJsZWdlbmQiLCJDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFMiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwiYWNjdSIsImtleSIsImZ0IiwibGVuZ3RoIiwiTEFZRVJfVFlQRVMiLCJhcmMiLCJjbHVzdGVyIiwibGluZSIsImdyaWQiLCJoZWF0bWFwIiwiaGV4YWdvbiIsIkRFRkFVTFRfTEFZRVJfQ09MT1IiLCJ0cmlwQXJjIiwiYmVnaW50cmlwX2xhdCIsImRyb3BvZmZfbGF0IiwicmVxdWVzdF9sYXQiLCJERUZBVUxUX1RPT0xUSVBfRklFTERTIiwiREVGQVVMVF9MSUdIVF9TRVRUSU5HUyIsImxpZ2h0c1Bvc2l0aW9uIiwiYW1iaWVudFJhdGlvIiwiZGlmZnVzZVJhdGlvIiwic3BlY3VsYXJSYXRpbyIsImxpZ2h0c1N0cmVuZ3RoIiwibnVtYmVyT2ZMaWdodHMiLCJOT19WQUxVRV9DT0xPUiIsIkxBWUVSX0JMRU5ESU5HUyIsImFkZGl0aXZlIiwiYmxlbmRGdW5jIiwiYmxlbmRFcXVhdGlvbiIsIm5vcm1hbCIsInN1YnRyYWN0aXZlIiwiTUFYX0RFRkFVTFRfVE9PTFRJUFMiLCJSRVNPTFVUSU9OUyIsIk9ORV9YIiwiVFdPX1giLCJSQVRJT1MiLCJTQ1JFRU4iLCJGT1VSX0JZX1RIUkVFIiwiU0lYVEVFTl9CWV9OSU5FIiwiUkFUSU9fT1BUSU9OUyIsImdldFNpemUiLCJzY3JlZW5XIiwic2NyZWVuSCIsImhlaWdodCIsIk1hdGgiLCJyb3VuZCIsIlJFU09MVVRJT05fT1BUSU9OUyIsImF2YWlsYWJsZSIsInpvb21PZmZzZXQiLCJsb2cyIiwiREVGQVVMVF9FWFBPUlRfSU1BR0VfTkFNRSIsIkVYUE9SVF9EQVRBX1RZUEUiLCJDU1YiLCJFWFBPUlRfREFUQV9UWVBFX09QVElPTlMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztvUkFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7OztBQWlCQTs7OztBQWZPLElBQU1BLHdDQUFnQixjQUF0QjtBQUNBLElBQU1DLGtDQUFhLGlEQUFuQjtBQUNBLElBQU1DLHNDQUFrQkQsVUFBbEIsZ0JBQU47QUFDQSxJQUFNRSxvQ0FBaUJGLFVBQWpCLGFBQU47O0FBRVA7QUFDTyxJQUFNRyw0Q0FBa0IsWUFBeEI7QUFDQSxJQUFNQyx3Q0FBZ0IsV0FBdEI7QUFDQSxJQUFNQywwQ0FBaUIsWUFBdkI7QUFDQSxJQUFNQyxvQ0FBYyxTQUFwQjtBQUNBLElBQU1DLDRDQUFrQixhQUF4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V0FBdUI7QUFDOUJsSixhQUFPaUosT0FEdUI7QUFFOUJFLGNBQVFEO0FBRnNCLEtBQXZCO0FBQUE7QUFOd0IsQ0FBRCxFQVUvQjtBQUNEeEksTUFBSThILFlBQVlFLEtBRGY7QUFFRC9ILFNBQU8sSUFGTjtBQUdENEksYUFBVyxJQUhWO0FBSUR0RCxTQUFPLENBSk47QUFLRHVELGNBQVlKLEtBQUtLLElBQUwsQ0FBVSxDQUFWLENBTFg7QUFNRFQsV0FBUyxpQkFBQ0MsT0FBRCxFQUFVQyxPQUFWO0FBQUEsV0FBdUI7QUFDOUJsSixhQUFPaUosVUFBVSxDQURhO0FBRTlCRSxjQUFRRCxVQUFVO0FBRlksS0FBdkI7QUFBQTtBQU5SLENBVitCLENBQTNCOztBQXNCQSxJQUFNUSxnRUFBNEIsZUFBbEM7O0FBRUEsSUFBTUMsOENBQW1CLHlCQUFVO0FBQ3hDQyxPQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFMd0MsQ0FBVixDQUF6Qjs7QUFRQSxJQUFNQyw4REFBMkIsQ0FDdEM7QUFDRW5KLE1BQUlpSixpQkFBaUJDLEdBRHZCO0FBRUVqSixTQUFPLEtBRlQ7QUFHRTRJLGFBQVc7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEJBLENBRHNDLENBQWpDIiwiZmlsZSI6ImRlZmF1bHQtc2V0dGluZ3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTggVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQga2V5TWlycm9yIGZyb20gJ2tleW1pcnJvcic7XG5cbmV4cG9ydCBjb25zdCBBQ1RJT05fUFJFRklYID0gJ0BAa2VwbGVyLmdsLyc7XG5leHBvcnQgY29uc3QgQ0xPVURGUk9OVCA9ICdodHRwczovL2QxYTNmNHNwYXp6cnA0LmNsb3VkZnJvbnQubmV0L2tlcGxlci5nbCc7XG5leHBvcnQgY29uc3QgU1RZTEVfUFJFRklYID0gYCR7Q0xPVURGUk9OVH0vbWFwLXN0eWxlc2A7XG5leHBvcnQgY29uc3QgSUNPTl9QUkVGSVggPSBgJHtDTE9VREZST05UfS9nZW9kdWRlYDtcblxuLy8gTW9kYWwgSWRzXG5leHBvcnQgY29uc3QgTEFZRVJfQ09ORklHX0lEID0gJ2NvcHlDb25maWcnO1xuZXhwb3J0IGNvbnN0IERBVEFfVEFCTEVfSUQgPSAnZGF0YVRhYmxlJztcbmV4cG9ydCBjb25zdCBERUxFVEVfREFUQV9JRCA9ICdkZWxldGVEYXRhJztcbmV4cG9ydCBjb25zdCBBRERfREFUQV9JRCA9ICdhZGREYXRhJztcbmV4cG9ydCBjb25zdCBFWFBPUlRfSU1BR0VfSUQgPSAnZXhwb3J0SW1hZ2UnO1xuZXhwb3J0IGNvbnN0IEVYUE9SVF9EQVRBX0lEID0gJ2V4cG9ydERhdGEnO1xuZXhwb3J0IGNvbnN0IEVYUE9SVF9DT05GSUdfSUQgPSAnZXhwb3J0Q29uZmlnJztcbmV4cG9ydCBjb25zdCBBRERfTUFQX1NUWUxFX0lEID0gJ2FkZE1hcFN0eWxlJztcblxuaW1wb3J0IHtcbiAgTGF5ZXJzLFxuICBGaWx0ZXJGdW5uZWwsXG4gIFNldHRpbmdzLFxuICBDdXJzb3JDbGlja1xufSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9pY29ucyc7XG5cbmV4cG9ydCBjb25zdCBLRVBMRVJfR0xfTkFNRSA9ICdrZXBsZXIuZ2wnO1xuZXhwb3J0IGNvbnN0IEtFUExFUl9HTF9WRVJTSU9OID0gJ3YxLjAnO1xuXG5leHBvcnQgY29uc3QgRElNRU5TSU9OUyA9IHtcbiAgc2lkZVBhbmVsOiB7XG4gICAgd2lkdGg6IDMwMCxcbiAgICBtYXJnaW46IHt0b3A6IDIwLCBsZWZ0OiAyMCwgYm90dG9tOiAzMCwgcmlnaHQ6IDIwfSxcbiAgICBoZWFkZXJIZWlnaHQ6IDk2XG4gIH0sXG4gIG1hcENvbnRyb2w6IHtcbiAgICB3aWR0aDogMjA0LFxuICAgIHBhZGRpbmc6IDEyXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBQQU5FTFMgPSBbXG4gIHtcbiAgICBpZDogJ2xheWVyJyxcbiAgICBsYWJlbDogJ0xheWVycycsXG4gICAgaWNvbkNvbXBvbmVudDogTGF5ZXJzXG4gIH0sXG4gIHtcbiAgICBpZDogJ2ZpbHRlcicsXG4gICAgbGFiZWw6ICdGaWx0ZXJzJyxcbiAgICBpY29uQ29tcG9uZW50OiBGaWx0ZXJGdW5uZWxcbiAgfSxcbiAge1xuICAgIGlkOiAnaW50ZXJhY3Rpb24nLFxuICAgIGxhYmVsOiAnSW50ZXJhY3Rpb25zJyxcbiAgICBpY29uQ29tcG9uZW50OiBDdXJzb3JDbGlja1xuICB9LFxuICB7XG4gICAgaWQ6ICdtYXAnLFxuICAgIGxhYmVsOiAnQmFzZSBtYXAnLFxuICAgIGljb25Db21wb25lbnQ6IFNldHRpbmdzXG4gIH1cbl07XG5cbmV4cG9ydCBjb25zdCBQQU5FTFNfRk9PVEVSID0gW1xuICB7XG4gICAgaWQ6IExBWUVSX0NPTkZJR19JRCxcbiAgICBsYWJlbDogJ0NvcHkgQ29uZmlnJyxcbiAgICBpY29uOiAnY2xpcGJvYXJkJ1xuICB9XG5dO1xuXG4vLyBNQVAgU1RZTEVTXG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xBWUVSX0dST1VQUyA9IFtcbiAge1xuICAgIHNsdWc6ICdsYWJlbCcsXG4gICAgZmlsdGVyOiAoe2lkfSkgPT4gaWQubWF0Y2goLyg/PShsYWJlbHxwbGFjZS18cG9pLSkpLyksXG4gICAgZGVmYXVsdFZpc2liaWxpdHk6IHRydWVcbiAgfSxcbiAge1xuICAgIHNsdWc6ICdyb2FkJyxcbiAgICBmaWx0ZXI6ICh7aWR9KSA9PiBpZC5tYXRjaCgvKD89KHJvYWR8cmFpbHdheXx0dW5uZWx8c3RyZWV0fGJyaWRnZSkpKD8hLipsYWJlbCkvKSxcbiAgICBkZWZhdWx0VmlzaWJpbGl0eTogdHJ1ZVxuICB9LFxuICB7XG4gICAgc2x1ZzogJ2JvcmRlcicsXG4gICAgZmlsdGVyOiAoe2lkfSkgPT4gaWQubWF0Y2goL2JvcmRlcnxib3VuZGFyaWVzLyksXG4gICAgZGVmYXVsdFZpc2liaWxpdHk6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBzbHVnOiAnYnVpbGRpbmcnLFxuICAgIGZpbHRlcjogKHtpZH0pID0+IGlkLm1hdGNoKC9idWlsZGluZy8pLFxuICAgIGRlZmF1bHRWaXNpYmlsaXR5OiB0cnVlXG4gIH0sXG4gIHtcbiAgICBzbHVnOiAnd2F0ZXInLFxuICAgIGZpbHRlcjogKHtpZH0pID0+IGlkLm1hdGNoKC8oPz0od2F0ZXJ8c3RyZWFtfGZlcnJ5KSkvKSxcbiAgICBkZWZhdWx0VmlzaWJpbGl0eTogdHJ1ZVxuICB9LFxuICB7XG4gICAgc2x1ZzogJ2xhbmQnLFxuICAgIGZpbHRlcjogKHtpZH0pID0+IGlkLm1hdGNoKC8oPz0ocGFya3N8bGFuZGNvdmVyfGluZHVzdHJpYWx8c2FuZHxoaWxsc2hhZGUpKS8pLFxuICAgIGRlZmF1bHRWaXNpYmlsaXR5OiB0cnVlXG4gIH1cbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BUF9TVFlMRVMgPSBbXG4gIHtcbiAgICBpZDogJ2RhcmsnLFxuICAgIGxhYmVsOiAnRGFyaycsXG4gICAgdXJsOiBgJHtTVFlMRV9QUkVGSVh9L2RhcmtgLFxuICAgIGljb246IGAke0lDT05fUFJFRklYfS9VQkVSX0RBUktfVjIucG5nYCxcbiAgICBsYXllckdyb3VwczogREVGQVVMVF9MQVlFUl9HUk9VUFNcbiAgfSxcbiAge1xuICAgIGlkOiAnbGlnaHQnLFxuICAgIGxhYmVsOiAnTGlnaHQnLFxuICAgIHVybDogYCR7U1RZTEVfUFJFRklYfS9saWdodGAsXG4gICAgaWNvbjogYCR7SUNPTl9QUkVGSVh9L1VCRVJfTElHSFRfVjIucG5nYCxcbiAgICBsYXllckdyb3VwczogREVGQVVMVF9MQVlFUl9HUk9VUFNcbiAgfSxcbiAge1xuICAgIGlkOiAnbXV0ZWQnLFxuICAgIGxhYmVsOiAnTXV0ZWQgTGlnaHQnLFxuICAgIHVybDogYCR7U1RZTEVfUFJFRklYfS9tdXRlZC1saWdodGAsXG4gICAgaWNvbjogYCR7SUNPTl9QUkVGSVh9L1VCRVJfTVVURURfTElHSFQucG5nYCxcbiAgICBsYXllckdyb3VwczogREVGQVVMVF9MQVlFUl9HUk9VUFNcbiAgfSxcbiAge1xuICAgIGlkOiAnbXV0ZWRfbmlnaHQnLFxuICAgIGxhYmVsOiAnTXV0ZWQgTmlnaHQnLFxuICAgIHVybDogYCR7U1RZTEVfUFJFRklYfS9tdXRlZC1uaWdodGAsXG4gICAgaWNvbjogYCR7SUNPTl9QUkVGSVh9L1VCRVJfTVVURURfTklHSFQucG5nYCxcbiAgICBsYXllckdyb3VwczogREVGQVVMVF9MQVlFUl9HUk9VUFNcbiAgfVxuXTtcblxuZXhwb3J0IGNvbnN0IEdFT0pTT05fRklFTERTID0ge1xuICBnZW9qc29uOiBbJ19nZW9qc29uJywgJ2FsbF9wb2ludHMnLCAnZ2VvanNvbiddXG59O1xuXG5leHBvcnQgY29uc3QgSUNPTl9GSUVMRFMgPSB7XG4gIGljb246IFsnaWNvbiddXG59O1xuXG5leHBvcnQgY29uc3QgVFJJUF9QT0lOVF9GSUVMRFMgPSBbXG4gIFsnbGF0JywgJ2xuZyddLFxuICBbJ2xhdCcsICdsb24nXSxcbiAgWydsYXRpdHVkZScsICdsb25naXR1ZGUnXVxuXTtcblxuZXhwb3J0IGNvbnN0IFRSSVBfQVJDX0ZJRUxEUyA9IHtcbiAgbGF0MDogJ2JlZ2ludHJpcCcsXG4gIGxuZzA6ICdiZWdpbnRyaXAnLFxuICBsYXQxOiAnZHJvcG9mZicsXG4gIGxuZzE6ICdkcm9wb2ZmJ1xufTtcblxuZXhwb3J0IGNvbnN0IFNDQUxFX1RZUEVTID0ga2V5TWlycm9yKHtcbiAgb3JkaW5hbDogbnVsbCxcbiAgcXVhbnRpbGU6IG51bGwsXG4gIHF1YW50aXplOiBudWxsLFxuICBsaW5lYXI6IG51bGwsXG5cbiAgLy8gZm9yIHJhZGl1c1xuICBzcXJ0OiBudWxsLFxuICAvLyBvcmRpbmFsIGRvbWFpbiB0byBsaW5lYXIgcmFuZ2VcbiAgcG9pbnQ6IG51bGxcbn0pO1xuXG5leHBvcnQgY29uc3QgU0NBTEVfRlVOQyA9IHtcbiAgbGluZWFyOiByZXF1aXJlKCdkMy1zY2FsZScpLnNjYWxlTGluZWFyLFxuICBxdWFudGl6ZTogcmVxdWlyZSgnZDMtc2NhbGUnKS5zY2FsZVF1YW50aXplLFxuICBxdWFudGlsZTogcmVxdWlyZSgnZDMtc2NhbGUnKS5zY2FsZVF1YW50aWxlLFxuICBvcmRpbmFsOiByZXF1aXJlKCdkMy1zY2FsZScpLnNjYWxlT3JkaW5hbCxcbiAgc3FydDogcmVxdWlyZSgnZDMtc2NhbGUnKS5zY2FsZVNxcnQsXG4gIHBvaW50OiByZXF1aXJlKCdkMy1zY2FsZScpLnNjYWxlUG9pbnRcbn07XG5cbmV4cG9ydCBjb25zdCBBTExfRklFTERfVFlQRVMgPSBrZXlNaXJyb3Ioe1xuICBib29sZWFuOiBudWxsLFxuICBkYXRlOiBudWxsLFxuICBnZW9qc29uOiBudWxsLFxuICBpbnRlZ2VyOiBudWxsLFxuICByZWFsOiBudWxsLFxuICBzdHJpbmc6IG51bGwsXG4gIHRpbWVzdGFtcDogbnVsbCxcbiAgcG9pbnQ6IG51bGxcbn0pO1xuXG5jb25zdCBPUkFOR0UgPSAnMjQ4LCAxOTQsIDI4JztcbmNvbnN0IFBJTksgPSAnMjMxLCAxODksIDE5NCc7XG5jb25zdCBQVVJQTEUgPSAnMTYwLCAxMDYsIDIwNic7XG5jb25zdCBCTFVFID0gJzE0MCwgMjEwLCAyMDUnO1xuY29uc3QgQkxVRTIgPSAnMTA2LCAxNjAsIDIwNic7XG5jb25zdCBCTFVFMyA9ICcwLCAxNzIsIDIzNyc7XG5jb25zdCBHUkVFTiA9ICcxMDYsIDE2MCwgNTYnO1xuY29uc3QgUkVEID0gJzIzNywgODgsIDEwNic7XG5cbmV4cG9ydCBjb25zdCBGSUVMRF9DT0xPUlMgPSB7XG4gIGRlZmF1bHQ6IFJFRFxufTtcblxuZXhwb3J0IGNvbnN0IEZJTEVEX1RZUEVfRElTUExBWSA9IHtcbiAgW0FMTF9GSUVMRF9UWVBFUy5ib29sZWFuXToge1xuICAgIGxhYmVsOiAnYm9vbCcsXG4gICAgY29sb3I6IFBJTktcbiAgfSxcbiAgW0FMTF9GSUVMRF9UWVBFUy5kYXRlXToge1xuICAgIGxhYmVsOiAnZGF0ZScsXG4gICAgY29sb3I6IFBVUlBMRVxuICB9LFxuICBbQUxMX0ZJRUxEX1RZUEVTLmdlb2pzb25dOiB7XG4gICAgbGFiZWw6ICdnZW8nLFxuICAgIGNvbG9yOiBCTFVFMlxuICB9LFxuICBbQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJdOiB7XG4gICAgbGFiZWw6ICdpbnQnLFxuICAgIGNvbG9yOiBPUkFOR0VcbiAgfSxcbiAgW0FMTF9GSUVMRF9UWVBFUy5yZWFsXToge1xuICAgIGxhYmVsOiAnZmxvYXQnLFxuICAgIGNvbG9yOiBPUkFOR0VcbiAgfSxcbiAgW0FMTF9GSUVMRF9UWVBFUy5zdHJpbmddOiB7XG4gICAgbGFiZWw6ICdzdHJpbmcnLFxuICAgIGNvbG9yOiBCTFVFXG4gIH0sXG4gIFtBTExfRklFTERfVFlQRVMudGltZXN0YW1wXToge1xuICAgIGxhYmVsOiAndGltZScsXG4gICAgY29sb3I6IEdSRUVOXG4gIH0sXG4gIC8vIGZpZWxkIHBhaXJzXG4gIFtBTExfRklFTERfVFlQRVMucG9pbnRdOiB7XG4gICAgbGFiZWw6ICdwb2ludCcsXG4gICAgY29sb3I6IEJMVUUzXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Rm9ybWF0ID0gZCA9PiBkO1xuXG5leHBvcnQgY29uc3QgRklFTERfRElTUExBWV9GT1JNQVQgPSB7XG4gIFtBTExfRklFTERfVFlQRVMuc3RyaW5nXTogZGVmYXVsdEZvcm1hdCxcbiAgW0FMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXBdOiBkZWZhdWx0Rm9ybWF0LFxuICBbQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJdOiBkZWZhdWx0Rm9ybWF0LFxuICBbQUxMX0ZJRUxEX1RZUEVTLmJvb2xlYW5dOiBkID0+IFN0cmluZyhkKSxcbiAgW0FMTF9GSUVMRF9UWVBFUy5kYXRlXTogZGVmYXVsdEZvcm1hdCxcbiAgW0FMTF9GSUVMRF9UWVBFUy5nZW9qc29uXTogZGVmYXVsdEZvcm1hdFxufTtcblxuZXhwb3J0IGNvbnN0IENIQU5ORUxfU0NBTEVTID0ga2V5TWlycm9yKHtcbiAgY29sb3I6IG51bGwsXG4gIHJhZGl1czogbnVsbCxcbiAgc2l6ZTogbnVsbCxcbiAgY29sb3JBZ2dyOiBudWxsLFxuICBzaXplQWdncjogbnVsbFxufSk7XG5cbmV4cG9ydCBjb25zdCBBR0dSRUdBVElPTl9UWVBFUyA9IHtcbiAgLy8gZGVmYXVsdFxuICBjb3VudDogJ2NvdW50JyxcbiAgLy8gbGluZWFyXG4gIGF2ZXJhZ2U6ICdhdmVyYWdlJyxcbiAgbWF4aW11bTogJ21heGltdW0nLFxuICBtaW5pbXVtOiAnbWluaW11bScsXG4gIG1lZGlhbjogJ21lZGlhbicsXG4gIHN1bTogJ3N1bScsXG4gIC8vIG9yZGluYWxcbiAgbW9kZTogJ21vZGUnLFxuICBjb3VudFVuaXF1ZTogJ2NvdW50IHVuaXF1ZSdcbn07XG5cbmV4cG9ydCBjb25zdCBsaW5lYXJGaWVsZFNjYWxlRnVuY3Rpb25zID0ge1xuICBbQ0hBTk5FTF9TQ0FMRVMuY29sb3JdOiBbU0NBTEVfVFlQRVMucXVhbnRpemUsIFNDQUxFX1RZUEVTLnF1YW50aWxlXSxcbiAgW0NIQU5ORUxfU0NBTEVTLnJhZGl1c106IFtTQ0FMRV9UWVBFUy5zcXJ0XSxcbiAgW0NIQU5ORUxfU0NBTEVTLnNpemVdOiBbU0NBTEVfVFlQRVMubGluZWFyXVxufTtcblxuZXhwb3J0IGNvbnN0IGxpbmVhckZpZWxkQWdnclNjYWxlRnVuY3Rpb25zID0ge1xuICBbQ0hBTk5FTF9TQ0FMRVMuY29sb3JBZ2dyXToge1xuICAgIFtBR0dSRUdBVElPTl9UWVBFUy5hdmVyYWdlXTogW1NDQUxFX1RZUEVTLnF1YW50aXplLCBTQ0FMRV9UWVBFUy5xdWFudGlsZV0sXG4gICAgW0FHR1JFR0FUSU9OX1RZUEVTLm1heGltdW1dOiBbU0NBTEVfVFlQRVMucXVhbnRpemUsIFNDQUxFX1RZUEVTLnF1YW50aWxlXSxcbiAgICBbQUdHUkVHQVRJT05fVFlQRVMubWluaW11bV06IFtTQ0FMRV9UWVBFUy5xdWFudGl6ZSwgU0NBTEVfVFlQRVMucXVhbnRpbGVdLFxuICAgIFtBR0dSRUdBVElPTl9UWVBFUy5tZWRpYW5dOiBbU0NBTEVfVFlQRVMucXVhbnRpemUsIFNDQUxFX1RZUEVTLnF1YW50aWxlXSxcbiAgICBbQUdHUkVHQVRJT05fVFlQRVMuc3VtXTogW1NDQUxFX1RZUEVTLnF1YW50aXplLCBTQ0FMRV9UWVBFUy5xdWFudGlsZV1cbiAgfSxcblxuICBbQ0hBTk5FTF9TQ0FMRVMuc2l6ZUFnZ3JdOiB7XG4gICAgW0FHR1JFR0FUSU9OX1RZUEVTLmF2ZXJhZ2VdOiBbU0NBTEVfVFlQRVMubGluZWFyXSxcbiAgICBbQUdHUkVHQVRJT05fVFlQRVMubWF4aW11bV06IFtTQ0FMRV9UWVBFUy5saW5lYXJdLFxuICAgIFtBR0dSRUdBVElPTl9UWVBFUy5taW5pbXVtXTogW1NDQUxFX1RZUEVTLmxpbmVhcl0sXG4gICAgW0FHR1JFR0FUSU9OX1RZUEVTLm1lZGlhbl06IFtTQ0FMRV9UWVBFUy5saW5lYXJdLFxuICAgIFtBR0dSRUdBVElPTl9UWVBFUy5zdW1dOiBbU0NBTEVfVFlQRVMubGluZWFyXVxuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgb3JkaW5hbEZpZWxkU2NhbGVGdW5jdGlvbnMgPSB7XG4gIFtDSEFOTkVMX1NDQUxFUy5jb2xvcl06IFtTQ0FMRV9UWVBFUy5vcmRpbmFsXSxcbiAgW0NIQU5ORUxfU0NBTEVTLnJhZGl1c106IFtTQ0FMRV9UWVBFUy5wb2ludF0sXG4gIFtDSEFOTkVMX1NDQUxFUy5zaXplXTogW1NDQUxFX1RZUEVTLnBvaW50XVxufTtcblxuZXhwb3J0IGNvbnN0IG9yZGluYWxGaWVsZEFnZ3JTY2FsZUZ1bmN0aW9ucyA9IHtcbiAgLy8gW0NIQU5ORUxfU0NBTEVTLmNvbG9yQWdncl06IFtTQ0FMRV9UWVBFUy5vcmRpbmFsLCBTQ0FMRV9UWVBFUy5saW5lYXJdLFxuICBbQ0hBTk5FTF9TQ0FMRVMuY29sb3JBZ2dyXToge1xuICAgIFtBR0dSRUdBVElPTl9UWVBFUy5tb2RlXTogW1NDQUxFX1RZUEVTLm9yZGluYWxdLFxuICAgIFtBR0dSRUdBVElPTl9UWVBFUy5jb3VudFVuaXF1ZV06IFtTQ0FMRV9UWVBFUy5xdWFudGl6ZSwgU0NBTEVfVFlQRVMucXVhbnRpbGVdXG4gIH0sXG5cbiAgLy8gQ3VycmVudGx5IGRvZXNuJ3Qgc3VwcG9ydCB5ZXRcbiAgW0NIQU5ORUxfU0NBTEVTLnNpemVBZ2dyXToge31cbn07XG5cbmV4cG9ydCBjb25zdCBub3RTdXBwb3J0ZWRTY2FsZU9wdHMgPSB7XG4gIFtDSEFOTkVMX1NDQUxFUy5jb2xvcl06IFtdLFxuICBbQ0hBTk5FTF9TQ0FMRVMucmFkaXVzXTogW10sXG4gIFtDSEFOTkVMX1NDQUxFUy5zaXplXTogW11cbn07XG5cbmV4cG9ydCBjb25zdCAgbm90U3VwcG9ydEFnZ3JPcHRzID0ge1xuICBbQ0hBTk5FTF9TQ0FMRVMuY29sb3JBZ2dyXToge30sXG4gIFtDSEFOTkVMX1NDQUxFUy5zaXplQWdncl06IHt9XG59O1xuXG4vKipcbiAqIERlZmF1bHQgYWdncmVnYXRpb24gYXJlIGJhc2VkIG9uIG9jdW50XG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FHR1JFR0FUSU9OID0ge1xuICBbQ0hBTk5FTF9TQ0FMRVMuY29sb3JBZ2dyXToge1xuICAgIFtBR0dSRUdBVElPTl9UWVBFUy5jb3VudF06IFtTQ0FMRV9UWVBFUy5xdWFudGl6ZSwgU0NBTEVfVFlQRVMucXVhbnRpbGVdXG4gIH0sXG4gIFtDSEFOTkVMX1NDQUxFUy5zaXplQWdncl06IHtcbiAgICBbQUdHUkVHQVRJT05fVFlQRVMuY291bnRdOiBbU0NBTEVfVFlQRVMubGluZWFyXVxuICB9XG59O1xuXG4vKipcbiAqIERlZmluZSB3aGF0IHR5cGUgb2Ygc2NhbGUgb3BlcmF0aW9uIGlzIGFsbG93ZWQgb24gZWFjaCB0eXBlIG9mIGZpZWxkc1xuICovXG5leHBvcnQgY29uc3QgRklFTERfT1BUUyA9IHtcbiAgc3RyaW5nOiB7XG4gICAgdHlwZTogJ2NhdGVnb3JpY2FsJyxcbiAgICBzY2FsZToge1xuICAgICAgLi4ub3JkaW5hbEZpZWxkU2NhbGVGdW5jdGlvbnMsXG4gICAgICAuLi5vcmRpbmFsRmllbGRBZ2dyU2NhbGVGdW5jdGlvbnNcbiAgICB9LFxuICAgIGZvcm1hdDoge1xuICAgICAgbGVnZW5kOiBkID0+IGRcbiAgICB9XG4gIH0sXG4gIHJlYWw6IHtcbiAgICB0eXBlOiAnbnVtZXJpY2FsJyxcbiAgICBzY2FsZToge1xuICAgICAgLi4ubGluZWFyRmllbGRTY2FsZUZ1bmN0aW9ucyxcbiAgICAgIC4uLmxpbmVhckZpZWxkQWdnclNjYWxlRnVuY3Rpb25zXG4gICAgfSxcbiAgICBmb3JtYXQ6IHtcbiAgICAgIGxlZ2VuZDogZCA9PiBkXG4gICAgfVxuICB9LFxuICB0aW1lc3RhbXA6IHtcbiAgICB0eXBlOiAndGltZScsXG4gICAgc2NhbGU6IHtcbiAgICAgIC4uLmxpbmVhckZpZWxkU2NhbGVGdW5jdGlvbnMsXG4gICAgICAuLi5ub3RTdXBwb3J0QWdnck9wdHNcbiAgICB9LFxuICAgIGZvcm1hdDoge1xuICAgICAgbGVnZW5kOiBkID0+IGRcbiAgICB9XG4gIH0sXG4gIGludGVnZXI6IHtcbiAgICB0eXBlOiAnbnVtZXJpY2FsJyxcbiAgICBzY2FsZToge1xuICAgICAgLi4ubGluZWFyRmllbGRTY2FsZUZ1bmN0aW9ucyxcbiAgICAgIC4uLmxpbmVhckZpZWxkQWdnclNjYWxlRnVuY3Rpb25zXG4gICAgfSxcbiAgICBmb3JtYXQ6IHtcbiAgICAgIGxlZ2VuZDogZCA9PiBkXG4gICAgfVxuICB9LFxuICBib29sZWFuOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIHNjYWxlOiB7XG4gICAgICAuLi5vcmRpbmF