UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

677 lines (603 loc) 75.3 kB
"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.featureResolver = exports.featureAccessor = exports["default"] = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _lodash = _interopRequireDefault(require("lodash.memoize")); var _lodash2 = _interopRequireDefault(require("lodash.uniq")); var _baseLayer = _interopRequireWildcard(require("../base-layer")); var _deck = require("deck.gl"); var _colorUtils = require("../../utils/color-utils"); var _geojsonLayerIcon = _interopRequireDefault(require("./geojson-layer-icon")); var _defaultSettings = require("../../constants/default-settings"); var _axios = _interopRequireDefault(require("axios")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } 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; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } // import {featureCollection} from '@turf/helpers'; // import {saveText} from '../boundary-layer/boundary-layer'; var geojsonVisConfigs = exports.geojsonVisConfigs = { opacity: 'opacity', thickness: { type: 'number', defaultValue: 0.5, label: 'Stroke Width', isRanged: false, range: [0, 100], step: 0.1, group: 'stroke', property: 'thickness' }, strokeColor: 'strokeColor', colorRange: 'colorRange', strokeColorRange: 'strokeColorRange', radius: 'radius', sizeRange: 'strokeWidthRange', radiusRange: 'radiusRange', heightRange: 'elevationRange', elevationScale: 'elevationScale', stroked: 'stroked', filled: 'filled', enable3d: 'enable3d', wireframe: 'wireframe' }; var geoJsonRequiredColumns = exports.geoJsonRequiredColumns = ['geojson']; var featureAccessor = exports.featureAccessor = function featureAccessor(_ref) { var geojson = _ref.geojson; return function (d) { return d[geojson.fieldIdx]; }; }; var featureResolver = exports.featureResolver = function featureResolver(_ref2) { var geojson = _ref2.geojson; return geojson.fieldIdx; }; var GeoJsonLayer = exports["default"] = /*#__PURE__*/function (_Layer) { (0, _inherits2["default"])(GeoJsonLayer, _Layer); var _super = _createSuper(GeoJsonLayer); function GeoJsonLayer(props) { var _this; (0, _classCallCheck2["default"])(this, GeoJsonLayer); _this = _super.call(this, props); _this.dataToFeature = []; _this.registerVisConfig(geojsonVisConfigs); _this.getFeature = (0, _lodash["default"])(featureAccessor, featureResolver); return _this; } (0, _createClass2["default"])(GeoJsonLayer, [{ key: "type", get: function get() { return 'backendGeojson'; } }, { key: "name", get: function get() { return 'Polygon'; } }, { key: "showLoader", get: function get() { return true; } }, { key: "layerIcon", get: function get() { return _geojsonLayerIcon["default"]; } }, { key: "requiredLayerColumns", get: function get() { return geoJsonRequiredColumns; } }, { key: "visualChannels", get: function get() { return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(GeoJsonLayer.prototype), "visualChannels", this)), {}, { // strokeColor: { // property: 'strokeColor', // field: 'strokeColorField', // scale: 'strokeColorScale', // domain: 'strokeColorDomain', // range: 'strokeColorRange', // key: 'strokeColor', // channelScaleType: CHANNEL_SCALES.color, // condition: config => config.visConfig.stroked // }, size: _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(GeoJsonLayer.prototype), "visualChannels", this).size), {}, { property: 'stroke', condition: function condition(config) { return config.visConfig.stroked; } }), height: { property: 'height', field: 'heightField', scale: 'heightScale', domain: 'heightDomain', range: 'heightRange', key: 'height', channelScaleType: 'size', condition: function condition(config) { return config.visConfig.enable3d; } }, radius: { property: 'radius', field: 'radiusField', scale: 'radiusScale', domain: 'radiusDomain', range: 'radiusRange', key: 'radius', channelScaleType: 'radius' } }); } }, { key: "shouldRenderColumnConfig", value: function shouldRenderColumnConfig() { return false; } }, { key: "updateLayerConfig", value: function updateLayerConfig(newConfig) { if (Object.keys(newConfig).includes('colorField') || Object.keys(newConfig).includes('colorUI') || Object.keys(newConfig).includes('colorScale')) { newConfig = _objectSpread(_objectSpread({}, newConfig), { legendApiCallRequest: true }); if (!newConfig.colorField && this.config.colorField) { newConfig = _objectSpread(_objectSpread({}, newConfig), { apiCallRequest: true }); } } this.config = _objectSpread(_objectSpread({}, this.config), newConfig); return this; } }, { key: "axiosLegendAPICall", value: function axiosLegendAPICall(datasets, filters, auth, project) { var _this$config = this.config, dataId = _this$config.dataId, colorField = _this$config.colorField, colorScale = _this$config.colorScale, visConfig = _this$config.visConfig; var colorRange = visConfig.colorRange; var indexName = datasets[dataId].indexName; var uid = auth.uid; var isEdit = project.isEdit; var noOfBreaks = colorRange.colors.length; filters = filters.filter(function (f) { return f.dataId.includes(dataId); }); // const colorScale = 'quantile'; var legendAPIData = { colorField: colorField.name, userId: uid, colorFieldType: colorField.type, colorScale: colorScale, permissionType: isEdit, noOfBreaks: noOfBreaks, indexName: indexName, filters: filters }; var legendConfig = { headers: { 'Content-type': 'application/json' } }; var response = _axios["default"].post("".concat(_defaultSettings.ON_PREMESIS_URL, "/geoiqutilities/legend/v1.0/fetch"), legendAPIData, legendConfig).then(function (result) { var breakPoints = result.data.data.Breakpoints; breakPoints = breakPoints.reduce(function (accu, breakpoint, index) { if (accu.length < noOfBreaks) { accu.push({ x1: breakpoint, x2: breakPoints[index + 1] }); } return accu; }, []); return breakPoints; // this.updateLayerConfig({ // legend: breakPoints, // apiCallRequest: true, // legendApiCallRequest: false // }); }); // this.updateLayerConfig({ // apiCallRequest: true, // legendApiCallRequest: false // }); return response; } }, { key: "axiosApiCall", value: function axiosApiCall(datasets, viewport, zoom, filters, auth, project) { var _this$config2 = this.config, colorField = _this$config2.colorField, dataId = _this$config2.dataId, visConfig = _this$config2.visConfig; var colorAggregation = visConfig.colorAggregation; var indexName = datasets[dataId].indexName; var isEdit = project.isEdit; var uid = auth.uid; filters = filters.filter(function (f) { return f.dataId.includes(dataId); }); var config = { headers: { 'Content-Type': 'application/json' } }; // aggregation type // filters // viewport // zoom var data = { colorField: colorField ? colorField.name : null, colorAggregation: colorField ? colorAggregation : 'count', colorFieldType: colorField ? colorField.type : null, filters: JSON.stringify(filters), indexName: indexName, // indexName, userId: uid, viewport: JSON.stringify(viewport), zoom: zoom, permissionType: isEdit }; // const url = 'https://app.geoiq.io/boundary/v1.0/boundary_query'; var response = _axios["default"].post("".concat(_defaultSettings.ON_PREMESIS_URL, "/geoiqlayers/polygonlayer/v1.0/fetch"), data, config).then(function (response) { return response.data.data; })["catch"](); // const response = geoHashData; // var response = new Promise((resolve, reject) => { // let name = 'Dave' // if (name === 'Dave') { // resolve(testGeojsonData); // } // else { // reject(Error("Promise rejected")); // } // }); return response; } }, { key: "getPositionAccessor", value: function getPositionAccessor() { return this.getFeature(this.config.columns); } // static findDefaultLayerProps({label, fields = []}) { // const geojsonColumns = fields // .filter(f => f.type === 'geojson') // .map(f => f.name); // const defaultColumns = { // geojson: uniq([...GEOJSON_FIELDS.geojson, ...geojsonColumns]) // }; // const foundColumns = this.findDefaultColumnField(defaultColumns, fields); // if (!foundColumns || !foundColumns.length) { // return {props: []}; // } // return { // props: foundColumns.map(columns => ({ // label: // (typeof label === 'string' && label.replace(/\.[^/.]+$/, '')) || // this.type, // columns, // isVisible: true // })) // }; // } }, { key: "getDefaultLayerConfig", value: function getDefaultLayerConfig() { var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(GeoJsonLayer.prototype), "getDefaultLayerConfig", this).call(this, props)), {}, { apiCallRequest: true, // 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' }); } }, { key: "getHoverData", value: function getHoverData(object) { // index of allData is saved to feature.properties return object; } }, { key: "getEncodedChannelValue", value: function getEncodedChannelValue(scale, data, field) { var defaultValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _defaultSettings.NO_VALUE_COLOR; var type = field.type; var value = data; var attributeValue; if (type === _defaultSettings.ALL_FIELD_TYPES.timestamp) { // shouldn't need to convert here // scale Function should take care of it attributeValue = scale(new Date(value)); } else { attributeValue = scale(value); } if (!attributeValue) { attributeValue = defaultValue; } return attributeValue; } }, { key: "getGeoJsonEncodedChannelValue", value: function getGeoJsonEncodedChannelValue(legend, colorRange, colorField, data) { var defaultValue = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _defaultSettings.NO_VALUE_COLOR; var type = colorField.type; var value = data; var attributeValue; if (type === _defaultSettings.ALL_FIELD_TYPES.string) { attributeValue = defaultValue; } else { attributeValue = colorRange[legend.reduce(function (acc, breakpoint, index) { if (value >= breakpoint.x1 && value <= breakpoint.x2) { acc = index; } return acc; }, null)]; } return attributeValue; } // TODO: fix complexity /* eslint-disable complexity */ }, { key: "formatLayerData", value: function formatLayerData(_, allData, filteredIndex, oldLayerData, response) { var _this2 = this; var opt = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; var _this$config3 = this.config, colorScale = _this$config3.colorScale, colorField = _this$config3.colorField, strokeColorField = _this$config3.strokeColorField, strokeColorScale = _this$config3.strokeColorScale, strokeColorDomain = _this$config3.strokeColorDomain, color = _this$config3.color, sizeScale = _this$config3.sizeScale, sizeDomain = _this$config3.sizeDomain, sizeField = _this$config3.sizeField, heightField = _this$config3.heightField, heightScale = _this$config3.heightScale, radiusField = _this$config3.radiusField, radiusDomain = _this$config3.radiusDomain, radiusScale = _this$config3.radiusScale, visConfig = _this$config3.visConfig, legend = _this$config3.legend; var _this$config4 = this.config, heightDomain = _this$config4.heightDomain, colorDomain = _this$config4.colorDomain; var enable3d = visConfig.enable3d, stroked = visConfig.stroked, colorRange = visConfig.colorRange, heightRange = visConfig.heightRange, sizeRange = visConfig.sizeRange, radiusRange = visConfig.radiusRange, strokeColorRange = visConfig.strokeColorRange, strokeColor = visConfig.strokeColor; if (!oldLayerData) { this.updateLayerMeta(); } if (oldLayerData && oldLayerData.collected) { var collected = oldLayerData.collected; } colorDomain = []; if (response.polygons) { collected = response.polygons; // if (collected) { // saveText(JSON.stringify(featureCollection(collected)), 'filename.json'); // } } // if ( // oldLayerData && // oldLayerData.data && // opt.sameData && // oldLayerData.getFeature === getFeature // ) { // // no need to create a new array of data // // use updateTriggers to selectively re-calculate attributes // geojsonData = oldLayerData.data; // } else { // // filteredIndex is a reference of index in allData which can map to feature // geojsonData = filteredIndex // .map(i => this.dataToFeature[i]) // .filter(d => d); // } Object.values(this.visualChannels).forEach(function (channel) { var scale = channel.scale, domain = channel.domain; // ordinal dommain is based on allData, if only filter changed // no need to update ordinal domain if (collected) { var updateDomain = _this2.calculateLayerDomain({}, { collected: collected }, channel); _this2.updateLayerConfig((0, _defineProperty2["default"])({}, domain, updateDomain)); } }); // fill color var cScale = colorField && this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(_colorUtils.hexToRgb)); // stroke color var scScale = strokeColorField && this.getVisChannelScale(strokeColorScale, strokeColorDomain, strokeColorRange.colors.map(_colorUtils.hexToRgb)); // calculate stroke scale - if stroked = true var sScale = sizeField && stroked && this.getVisChannelScale(sizeScale, sizeDomain, sizeRange); // calculate elevation scale - if extruded = true var eScale = heightField && enable3d && this.getVisChannelScale(heightScale, heightDomain, heightRange); // point radius var rScale = radiusField && this.getVisChannelScale(radiusScale, radiusDomain, radiusRange); return { collected: collected, // getFeature, getFillColor: function getFillColor(d) { return cScale && legend ? _this2.getGeoJsonEncodedChannelValue(legend, colorRange.colors.map(_colorUtils.hexToRgb), colorField, d.properties[colorField.name]) : d.properties.fillColor || color; }, getLineColor: function getLineColor(d) { return cScale && legend ? _this2.getGeoJsonEncodedChannelValue(legend, colorRange.colors.map(_colorUtils.hexToRgb), colorField, d.properties[colorField.name]) : d.properties.fillColor || color; }, getLineWidth: function getLineWidth(d) { return sScale ? _this2.getEncodedChannelValue(sScale, allData[d.properties.index], sizeField, 0) : d.properties.lineWidth || 1; }, getElevation: function getElevation(d) { return eScale ? _this2.getEncodedChannelValue(eScale, allData[d.properties.index], heightField, 0) : d.properties.elevation || 500; }, getRadius: function getRadius(d) { return rScale ? _this2.getEncodedChannelValue(rScale, allData[d.properties.index], radiusField, 0) : d.properties.radius || 1; } }; } /* eslint-enable complexity */ }, { key: "updateLayerMeta", value: function updateLayerMeta(allData) { // const getFeature = this.getPositionAccessor(); // this.dataToFeature = getGeojsonDataMaps(allData, getFeature); // get bounds from features // const bounds = getGeojsonBounds(this.dataToFeature); // if any of the feature has properties.radius set to be true // const fixedRadius = Boolean( // this.dataToFeature.find(d => d && d.properties && d.properties.radius) // ); // keep a record of what type of geometry the collection has // const featureTypes = getGeojsonFeatureTypes(this.dataToFeature); var bounds = {}; var fixedRadius = {}; var featureTypes = { polygon: true }; this.updateMeta({ bounds: bounds, fixedRadius: fixedRadius, featureTypes: featureTypes }); } }, { key: "setInitialLayerConfig", value: function setInitialLayerConfig(allData) { this.updateLayerMeta(allData); 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: true, 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: "renderLayer", value: function renderLayer(_ref3) { var data = _ref3.data, idx = _ref3.idx, objectHovered = _ref3.objectHovered, mapState = _ref3.mapState, interactionConfig = _ref3.interactionConfig; var fixedRadius = this.meta.fixedRadius; var radiusScale = this.getRadiusScaleByZoom(mapState, fixedRadius); var zoomFactor = this.getZoomFactor(mapState); var visConfig = this.config.visConfig; var layerProps = { // multiplier applied just so it being consistent with previously saved maps lineWidthScale: visConfig.thickness * zoomFactor * 8, elevationScale: visConfig.elevationScale, pointRadiusScale: radiusScale, lineMiterLimit: 4 }; var updateTriggers = { getElevation: { heightField: this.config.heightField, heightScale: this.config.heightScale, heightRange: visConfig.heightRange }, getFillColor: { color: this.config.color, // colorField: this.config.colorField, colorRange: visConfig.colorRange // colorScale: this.config.colorScale }, getLineColor: { color: this.config.color, // colorField: this.config.strokeColorField, colorRange: visConfig.colorRange // colorScale: this.config.strokeColorScale, // legend: this.config.legend }, getLineWidth: { sizeField: this.config.sizeField, sizeRange: visConfig.sizeRange }, getRadius: { radiusField: this.config.radiusField, radiusRange: visConfig.radiusRange } }; return [new _deck.GeoJsonLayer(_objectSpread(_objectSpread({}, layerProps), {}, { id: this.id, idx: idx, data: data.collected, getFillColor: data.getFillColor, getLineColor: data.getLineColor, getLineWidth: data.getLineWidth, getRadius: data.getRadius, getElevation: data.getElevation, // highlight pickable: true, highlightColor: _defaultSettings.HIGHLIGH_COLOR_3D, autoHighlight: visConfig.enable3d, // parameters parameters: { depthTest: Boolean(visConfig.enable3d || mapState.dragRotate) }, opacity: visConfig.opacity, stroked: visConfig.stroked, filled: visConfig.filled, extruded: visConfig.enable3d, wireframe: visConfig.wireframe, lineMiterLimit: 2, rounded: true, updateTriggers: updateTriggers }))].concat((0, _toConsumableArray2["default"])(this.isLayerHovered(objectHovered) && !visConfig.enable3d ? [new _deck.GeoJsonLayer(_objectSpread(_objectSpread({}, layerProps), {}, { id: "".concat(this.id, "-hovered"), data: [objectHovered.object], getLineWidth: data.getLineWidth, getRadius: data.getRadius, getElevation: data.getElevation, getLineColor: this.config.highlightColor, getFillColor: this.config.highlightColor, updateTriggers: updateTriggers, stroked: true, pickable: false, filled: false }))] : [])); } }]); return GeoJsonLayer; }(_baseLayer["default"]); // legend API // { // colorField:colorField(fieldName) // userId:UserID // colorScale:'quantile', // isEdit:true, // noOfBreaks:6, // } // filter API // { // fieldName:'', // userId:'', // isEdit:'', // fieldType:'', // tableName:'string' // } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvYmFja2VuZC1nZW9qc29uLWxheWVyL2dlb2pzb24tbGF5ZXIuanMiXSwibmFtZXMiOlsiZ2VvanNvblZpc0NvbmZpZ3MiLCJvcGFjaXR5IiwidGhpY2tuZXNzIiwidHlwZSIsImRlZmF1bHRWYWx1ZSIsImxhYmVsIiwiaXNSYW5nZWQiLCJyYW5nZSIsInN0ZXAiLCJncm91cCIsInByb3BlcnR5Iiwic3Ryb2tlQ29sb3IiLCJjb2xvclJhbmdlIiwic3Ryb2tlQ29sb3JSYW5nZSIsInJhZGl1cyIsInNpemVSYW5nZSIsInJhZGl1c1JhbmdlIiwiaGVpZ2h0UmFuZ2UiLCJlbGV2YXRpb25TY2FsZSIsInN0cm9rZWQiLCJmaWxsZWQiLCJlbmFibGUzZCIsIndpcmVmcmFtZSIsImdlb0pzb25SZXF1aXJlZENvbHVtbnMiLCJmZWF0dXJlQWNjZXNzb3IiLCJnZW9qc29uIiwiZCIsImZpZWxkSWR4IiwiZmVhdHVyZVJlc29sdmVyIiwiR2VvSnNvbkxheWVyIiwicHJvcHMiLCJkYXRhVG9GZWF0dXJlIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRGZWF0dXJlIiwiR2VvanNvbkxheWVySWNvbiIsInNpemUiLCJjb25kaXRpb24iLCJjb25maWciLCJ2aXNDb25maWciLCJoZWlnaHQiLCJmaWVsZCIsInNjYWxlIiwiZG9tYWluIiwia2V5IiwiY2hhbm5lbFNjYWxlVHlwZSIsIm5ld0NvbmZpZyIsIk9iamVjdCIsImtleXMiLCJpbmNsdWRlcyIsImxlZ2VuZEFwaUNhbGxSZXF1ZXN0IiwiY29sb3JGaWVsZCIsImFwaUNhbGxSZXF1ZXN0IiwiZGF0YXNldHMiLCJmaWx0ZXJzIiwiYXV0aCIsInByb2plY3QiLCJkYXRhSWQiLCJjb2xvclNjYWxlIiwiaW5kZXhOYW1lIiwidWlkIiwiaXNFZGl0Iiwibm9PZkJyZWFrcyIsImNvbG9ycyIsImxlbmd0aCIsImZpbHRlciIsImYiLCJsZWdlbmRBUElEYXRhIiwibmFtZSIsInVzZXJJZCIsImNvbG9yRmllbGRUeXBlIiwicGVybWlzc2lvblR5cGUiLCJsZWdlbmRDb25maWciLCJoZWFkZXJzIiwicmVzcG9uc2UiLCJheGlvcyIsInBvc3QiLCJPTl9QUkVNRVNJU19VUkwiLCJ0aGVuIiwicmVzdWx0IiwiYnJlYWtQb2ludHMiLCJkYXRhIiwiQnJlYWtwb2ludHMiLCJyZWR1Y2UiLCJhY2N1IiwiYnJlYWtwb2ludCIsImluZGV4IiwicHVzaCIsIngxIiwieDIiLCJ2aWV3cG9ydCIsInpvb20iLCJjb2xvckFnZ3JlZ2F0aW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsImNvbHVtbnMiLCJoZWlnaHRGaWVsZCIsImhlaWdodERvbWFpbiIsImhlaWdodFNjYWxlIiwicmFkaXVzRmllbGQiLCJyYWRpdXNEb21haW4iLCJyYWRpdXNTY2FsZSIsInN0cm9rZUNvbG9yRmllbGQiLCJzdHJva2VDb2xvckRvbWFpbiIsInN0cm9rZUNvbG9yU2NhbGUiLCJvYmplY3QiLCJOT19WQUxVRV9DT0xPUiIsInZhbHVlIiwiYXR0cmlidXRlVmFsdWUiLCJBTExfRklFTERfVFlQRVMiLCJ0aW1lc3RhbXAiLCJEYXRlIiwibGVnZW5kIiwic3RyaW5nIiwiYWNjIiwiXyIsImFsbERhdGEiLCJmaWx0ZXJlZEluZGV4Iiwib2xkTGF5ZXJEYXRhIiwib3B0IiwiY29sb3IiLCJzaXplU2NhbGUiLCJzaXplRG9tYWluIiwic2l6ZUZpZWxkIiwiY29sb3JEb21haW4iLCJ1cGRhdGVMYXllck1ldGEiLCJjb2xsZWN0ZWQiLCJwb2x5Z29ucyIsInZhbHVlcyIsInZpc3VhbENoYW5uZWxzIiwiZm9yRWFjaCIsImNoYW5uZWwiLCJ1cGRhdGVEb21haW4iLCJjYWxjdWxhdGVMYXllckRvbWFpbiIsInVwZGF0ZUxheWVyQ29uZmlnIiwiY1NjYWxlIiwiZ2V0VmlzQ2hhbm5lbFNjYWxlIiwibWFwIiwiaGV4VG9SZ2IiLCJzY1NjYWxlIiwic1NjYWxlIiwiZVNjYWxlIiwiclNjYWxlIiwiZ2V0RmlsbENvbG9yIiwiZ2V0R2VvSnNvbkVuY29kZWRDaGFubmVsVmFsdWUiLCJwcm9wZXJ0aWVzIiwiZmlsbENvbG9yIiwiZ2V0TGluZUNvbG9yIiwiZ2V0TGluZVdpZHRoIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsImxpbmVXaWR0aCIsImdldEVsZXZhdGlvbiIsImVsZXZhdGlvbiIsImdldFJhZGl1cyIsImJvdW5kcyIsImZpeGVkUmFkaXVzIiwiZmVhdHVyZVR5cGVzIiwicG9seWdvbiIsInVwZGF0ZU1ldGEiLCJtZXRhIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJjb2xvck1ha2VyIiwibmV4dCIsInBvaW50IiwiaWR4Iiwib2JqZWN0SG92ZXJlZCIsIm1hcFN0YXRlIiwiaW50ZXJhY3Rpb25Db25maWciLCJnZXRSYWRpdXNTY2FsZUJ5Wm9vbSIsInpvb21GYWN0b3IiLCJnZXRab29tRmFjdG9yIiwibGF5ZXJQcm9wcyIsImxpbmVXaWR0aFNjYWxlIiwicG9pbnRSYWRpdXNTY2FsZSIsImxpbmVNaXRlckxpbWl0IiwidXBkYXRlVHJpZ2dlcnMiLCJEZWNrR0xHZW9Kc29uTGF5ZXIiLCJpZCIsInBpY2thYmxlIiwiaGlnaGxpZ2h0Q29sb3IiLCJISUdITElHSF9DT0xPUl8zRCIsImF1dG9IaWdobGlnaHQiLCJwYXJhbWV0ZXJzIiwiZGVwdGhUZXN0IiwiQm9vbGVhbiIsImRyYWdSb3RhdGUiLCJleHRydWRlZCIsInJvdW5kZWQiLCJpc0xheWVySG92ZXJlZCIsIkxheWVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBT0E7Ozs7Ozs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUVPLElBQU1BLGlCQUFpQiwrQkFBRztBQUMvQkMsRUFBQUEsT0FBTyxFQUFFLFNBRHNCO0FBRS9CQyxFQUFBQSxTQUFTLEVBQUU7QUFDVEMsSUFBQUEsSUFBSSxFQUFFLFFBREc7QUFFVEMsSUFBQUEsWUFBWSxFQUFFLEdBRkw7QUFHVEMsSUFBQUEsS0FBSyxFQUFFLGNB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RUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBN