kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
131 lines (129 loc) • 19.6 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
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 _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 _core = require("@deck.gl/core");
var _typed = require("@deck.gl/layers/typed");
var _constants = _interopRequireDefault(require("@luma.gl/constants"));
var _ = require("../");
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 _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; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function addInstanceCoverage(vs) {
var addDecl = (0, _.editShader)(vs, 'hexagon cell vs add instance 1', 'in vec3 instancePickingColors;', "in vec3 instancePickingColors;\n in float instanceCoverage;");
return (0, _.editShader)(addDecl, 'hexagon cell vs add instance 2', 'float dotRadius = radius * coverage * shouldRender;', 'float dotRadius = radius * coverage * instanceCoverage * shouldRender;');
}
// TODO: export all deck.gl layers from kepler.gl
var EnhancedColumnLayer = /*#__PURE__*/function (_ColumnLayer) {
function EnhancedColumnLayer() {
(0, _classCallCheck2["default"])(this, EnhancedColumnLayer);
return _callSuper(this, EnhancedColumnLayer, arguments);
}
(0, _inherits2["default"])(EnhancedColumnLayer, _ColumnLayer);
return (0, _createClass2["default"])(EnhancedColumnLayer, [{
key: "getShaders",
value: function getShaders() {
var shaders = _superPropGet(EnhancedColumnLayer, "getShaders", this, 3)([]);
return _objectSpread(_objectSpread({}, shaders), {}, {
vs: addInstanceCoverage(shaders.vs)
});
}
}, {
key: "initializeState",
value: function initializeState() {
var _this$getAttributeMan;
_superPropGet(EnhancedColumnLayer, "initializeState", this, 3)([]);
(_this$getAttributeMan = this.getAttributeManager()) === null || _this$getAttributeMan === void 0 || _this$getAttributeMan.addInstanced({
instanceCoverage: {
size: 1,
accessor: 'getCoverage'
}
});
}
}, {
key: "draw",
value: function draw(_ref) {
var uniforms = _ref.uniforms;
var _this$props = this.props,
lineWidthUnits = _this$props.lineWidthUnits,
lineWidthScale = _this$props.lineWidthScale,
lineWidthMinPixels = _this$props.lineWidthMinPixels,
lineWidthMaxPixels = _this$props.lineWidthMaxPixels,
radiusUnits = _this$props.radiusUnits,
elevationScale = _this$props.elevationScale,
extruded = _this$props.extruded,
filled = _this$props.filled,
stroked = _this$props.stroked,
strokeOpacity = _this$props.strokeOpacity,
wireframe = _this$props.wireframe,
offset = _this$props.offset,
coverage = _this$props.coverage,
radius = _this$props.radius,
angle = _this$props.angle;
var _this$state = this.state,
model = _this$state.model,
fillVertexCount = _this$state.fillVertexCount,
wireframeVertexCount = _this$state.wireframeVertexCount,
edgeDistance = _this$state.edgeDistance;
model.setUniforms(uniforms).setUniforms({
radius: radius,
angle: angle / 180 * Math.PI,
offset: offset,
extruded: extruded,
stroked: stroked,
coverage: coverage,
elevationScale: elevationScale,
edgeDistance: edgeDistance,
radiusUnits: _core.UNIT[radiusUnits],
widthUnits: _core.UNIT[lineWidthUnits],
widthScale: lineWidthScale,
widthMinPixels: lineWidthMinPixels,
widthMaxPixels: lineWidthMaxPixels
});
// When drawing 3d: draw wireframe first so it doesn't get occluded by depth test
if (extruded && wireframe) {
model.setProps({
isIndexed: true
});
model.setVertexCount(wireframeVertexCount).setDrawMode(_constants["default"].LINES).setUniforms({
isStroke: true
}).draw();
}
if (filled) {
model.setProps({
isIndexed: false
});
model.setVertexCount(fillVertexCount).setDrawMode(_constants["default"].TRIANGLE_STRIP).setUniforms({
isStroke: false
}).draw();
}
// When drawing 2d: draw fill before stroke so that the outline is always on top
if (!extruded && stroked) {
model.setProps({
isIndexed: false
});
// The width of the stroke is achieved by flattening the side of the cylinder.
// Skip the last 1/3 of the vertices which is the top.
model.setVertexCount(fillVertexCount * 2 / 3).setDrawMode(_constants["default"].TRIANGLE_STRIP).setUniforms({
isStroke: true,
opacity: strokeOpacity
}).draw();
}
}
}]);
}(_typed.ColumnLayer);
EnhancedColumnLayer.layerName = 'EnhancedColumnLayer';
var _default = exports["default"] = EnhancedColumnLayer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfdHlwZWQiLCJfY29uc3RhbnRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl8iLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiY2FsbCIsIl9zdXBlclByb3BHZXQiLCJwIiwiX2dldDIiLCJhZGRJbnN0YW5jZUNvdmVyYWdlIiwidnMiLCJhZGREZWNsIiwiZWRpdFNoYWRlciIsIkVuaGFuY2VkQ29sdW1uTGF5ZXIiLCJfQ29sdW1uTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImdldFNoYWRlcnMiLCJzaGFkZXJzIiwiaW5pdGlhbGl6ZVN0YXRlIiwiX3RoaXMkZ2V0QXR0cmlidXRlTWFuIiwiZ2V0QXR0cmlidXRlTWFuYWdlciIsImFkZEluc3RhbmNlZCIsImluc3RhbmNlQ292ZXJhZ2UiLCJzaXplIiwiYWNjZXNzb3IiLCJkcmF3IiwiX3JlZiIsInVuaWZvcm1zIiwiX3RoaXMkcHJvcHMiLCJwcm9wcyIsImxpbmVXaWR0aFVuaXRzIiwibGluZVdpZHRoU2NhbGUiLCJsaW5lV2lkdGhNaW5QaXhlbHMiLCJsaW5lV2lkdGhNYXhQaXhlbHMiLCJyYWRpdXNVbml0cyIsImVsZXZhdGlvblNjYWxlIiwiZXh0cnVkZWQiLCJmaWxsZWQiLCJzdHJva2VkIiwic3Ryb2tlT3BhY2l0eSIsIndpcmVmcmFtZSIsIm9mZnNldCIsImNvdmVyYWdlIiwicmFkaXVzIiwiYW5nbGUiLCJfdGhpcyRzdGF0ZSIsInN0YXRlIiwibW9kZWwiLCJmaWxsVmVydGV4Q291bnQiLCJ3aXJlZnJhbWVWZXJ0ZXhDb3VudCIsImVkZ2VEaXN0YW5jZSIsInNldFVuaWZvcm1zIiwiTWF0aCIsIlBJIiwiVU5JVCIsIndpZHRoVW5pdHMiLCJ3aWR0aFNjYWxlIiwid2lkdGhNaW5QaXhlbHMiLCJ3aWR0aE1heFBpeGVscyIsInNldFByb3BzIiwiaXNJbmRleGVkIiwic2V0VmVydGV4Q291bnQiLCJzZXREcmF3TW9kZSIsIkdMIiwiTElORVMiLCJpc1N0cm9rZSIsIlRSSUFOR0xFX1NUUklQIiwib3BhY2l0eSIsIkNvbHVtbkxheWVyIiwibGF5ZXJOYW1lIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbHVtbi1sYXllci9lbmhhbmNlZC1jb2x1bW4tbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtVTklUfSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7Q29sdW1uTGF5ZXIsIENvbHVtbkxheWVyUHJvcHN9IGZyb20gJ0BkZWNrLmdsL2xheWVycy90eXBlZCc7XG5pbXBvcnQgR0wgZnJvbSAnQGx1bWEuZ2wvY29uc3RhbnRzJztcblxuaW1wb3J0IHtlZGl0U2hhZGVyfSBmcm9tICcuLi8nO1xuXG5mdW5jdGlvbiBhZGRJbnN0YW5jZUNvdmVyYWdlKHZzKSB7XG4gIGNvbnN0IGFkZERlY2wgPSBlZGl0U2hhZGVyKFxuICAgIHZzLFxuICAgICdoZXhhZ29uIGNlbGwgdnMgYWRkIGluc3RhbmNlIDEnLFxuICAgICdpbiB2ZWMzIGluc3RhbmNlUGlja2luZ0NvbG9yczsnLFxuICAgIGBpbiB2ZWMzIGluc3RhbmNlUGlja2luZ0NvbG9ycztcbiAgICAgaW4gZmxvYXQgaW5zdGFuY2VDb3ZlcmFnZTtgXG4gICk7XG5cbiAgcmV0dXJuIGVkaXRTaGFkZXIoXG4gICAgYWRkRGVjbCxcbiAgICAnaGV4YWdvbiBjZWxsIHZzIGFkZCBpbnN0YW5jZSAyJyxcbiAgICAnZmxvYXQgZG90UmFkaXVzID0gcmFkaXVzICogY292ZXJhZ2UgKiBzaG91bGRSZW5kZXI7JyxcbiAgICAnZmxvYXQgZG90UmFkaXVzID0gcmFkaXVzICogY292ZXJhZ2UgKiBpbnN0YW5jZUNvdmVyYWdlICogc2hvdWxkUmVuZGVyOydcbiAgKTtcbn1cblxudHlwZSBFbmhhbmNlZENvbHVtbkxheWVyUHJvcHMgPSBDb2x1bW5MYXllclByb3BzPGFueT4gJiB7XG4gIHN0cm9rZU9wYWNpdHk6IGFueTtcbn07XG5cbi8vIFRPRE86IGV4cG9ydCBhbGwgZGVjay5nbCBsYXllcnMgZnJvbSBrZXBsZXIuZ2xcbmNsYXNzIEVuaGFuY2VkQ29sdW1uTGF5ZXIgZXh0ZW5kcyBDb2x1bW5MYXllcjxhbnksIEVuaGFuY2VkQ29sdW1uTGF5ZXJQcm9wcz4ge1xuICBnZXRTaGFkZXJzKCkge1xuICAgIGNvbnN0IHNoYWRlcnMgPSBzdXBlci5nZXRTaGFkZXJzKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc2hhZGVycyxcbiAgICAgIHZzOiBhZGRJbnN0YW5jZUNvdmVyYWdlKHNoYWRlcnMudnMpXG4gICAgfTtcbiAgfVxuXG4gIGluaXRpYWxpemVTdGF0ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplU3RhdGUoKTtcblxuICAgIHRoaXMuZ2V0QXR0cmlidXRlTWFuYWdlcigpPy5hZGRJbnN0YW5jZWQoe1xuICAgICAgaW5zdGFuY2VDb3ZlcmFnZToge3NpemU6IDEsIGFjY2Vzc29yOiAnZ2V0Q292ZXJhZ2UnfVxuICAgIH0pO1xuICB9XG5cbiAgZHJhdyh7dW5pZm9ybXN9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbGluZVdpZHRoVW5pdHMsXG4gICAgICBsaW5lV2lkdGhTY2FsZSxcbiAgICAgIGxpbmVXaWR0aE1pblBpeGVscyxcbiAgICAgIGxpbmVXaWR0aE1heFBpeGVscyxcbiAgICAgIHJhZGl1c1VuaXRzLFxuICAgICAgZWxldmF0aW9uU2NhbGUsXG4gICAgICBleHRydWRlZCxcbiAgICAgIGZpbGxlZCxcbiAgICAgIHN0cm9rZWQsXG4gICAgICBzdHJva2VPcGFjaXR5LFxuICAgICAgd2lyZWZyYW1lLFxuICAgICAgb2Zmc2V0LFxuICAgICAgY292ZXJhZ2UsXG4gICAgICByYWRpdXMsXG4gICAgICBhbmdsZVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHttb2RlbCwgZmlsbFZlcnRleENvdW50LCB3aXJlZnJhbWVWZXJ0ZXhDb3VudCwgZWRnZURpc3RhbmNlfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBtb2RlbC5zZXRVbmlmb3Jtcyh1bmlmb3Jtcykuc2V0VW5pZm9ybXMoe1xuICAgICAgcmFkaXVzLFxuICAgICAgYW5nbGU6IChhbmdsZSAvIDE4MCkgKiBNYXRoLlBJLFxuICAgICAgb2Zmc2V0LFxuICAgICAgZXh0cnVkZWQsXG4gICAgICBzdHJva2VkLFxuICAgICAgY292ZXJhZ2UsXG4gICAgICBlbGV2YXRpb25TY2FsZSxcbiAgICAgIGVkZ2VEaXN0YW5jZSxcbiAgICAgIHJhZGl1c1VuaXRzOiBVTklUW3JhZGl1c1VuaXRzXSxcbiAgICAgIHdpZHRoVW5pdHM6IFVOSVRbbGluZVdpZHRoVW5pdHNdLFxuICAgICAgd2lkdGhTY2FsZTogbGluZVdpZHRoU2NhbGUsXG4gICAgICB3aWR0aE1pblBpeGVsczogbGluZVdpZHRoTWluUGl4ZWxzLFxuICAgICAgd2lkdGhNYXhQaXhlbHM6IGxpbmVXaWR0aE1heFBpeGVsc1xuICAgIH0pO1xuXG4gICAgLy8gV2hlbiBkcmF3aW5nIDNkOiBkcmF3IHdpcmVmcmFtZSBmaXJzdCBzbyBpdCBkb2Vzbid0IGdldCBvY2NsdWRlZCBieSBkZXB0aCB0ZXN0XG4gICAgaWYgKGV4dHJ1ZGVkICYmIHdpcmVmcmFtZSkge1xuICAgICAgbW9kZWwuc2V0UHJvcHMoe2lzSW5kZXhlZDogdHJ1ZX0pO1xuICAgICAgbW9kZWxcbiAgICAgICAgLnNldFZlcnRleENvdW50KHdpcmVmcmFtZVZlcnRleENvdW50KVxuICAgICAgICAuc2V0RHJhd01vZGUoR0wuTElORVMpXG4gICAgICAgIC5zZXRVbmlmb3Jtcyh7aXNTdHJva2U6IHRydWV9KVxuICAgICAgICAuZHJhdygpO1xuICAgIH1cbiAgICBpZiAoZmlsbGVkKSB7XG4gICAgICBtb2RlbC5zZXRQcm9wcyh7aXNJbmRleGVkOiBmYWxzZX0pO1xuICAgICAgbW9kZWxcbiAgICAgICAgLnNldFZlcnRleENvdW50KGZpbGxWZXJ0ZXhDb3VudClcbiAgICAgICAgLnNldERyYXdNb2RlKEdMLlRSSUFOR0xFX1NUUklQKVxuICAgICAgICAuc2V0VW5pZm9ybXMoe2lzU3Ryb2tlOiBmYWxzZX0pXG4gICAgICAgIC5kcmF3KCk7XG4gICAgfVxuICAgIC8vIFdoZW4gZHJhd2luZyAyZDogZHJhdyBmaWxsIGJlZm9yZSBzdHJva2Ugc28gdGhhdCB0aGUgb3V0bGluZSBpcyBhbHdheXMgb24gdG9wXG4gICAgaWYgKCFleHRydWRlZCAmJiBzdHJva2VkKSB7XG4gICAgICBtb2RlbC5zZXRQcm9wcyh7aXNJbmRleGVkOiBmYWxzZX0pO1xuICAgICAgLy8gVGhlIHdpZHRoIG9mIHRoZSBzdHJva2UgaXMgYWNoaWV2ZWQgYnkgZmxhdHRlbmluZyB0aGUgc2lkZSBvZiB0aGUgY3lsaW5kZXIuXG4gICAgICAvLyBTa2lwIHRoZSBsYXN0IDEvMyBvZiB0aGUgdmVydGljZXMgd2hpY2ggaXMgdGhlIHRvcC5cbiAgICAgIG1vZGVsXG4gICAgICAgIC5zZXRWZXJ0ZXhDb3VudCgoZmlsbFZlcnRleENvdW50ICogMikgLyAzKVxuICAgICAgICAuc2V0RHJhd01vZGUoR0wuVFJJQU5HTEVfU1RSSVApXG4gICAgICAgIC5zZXRVbmlmb3Jtcyh7aXNTdHJva2U6IHRydWUsIG9wYWNpdHk6IHN0cm9rZU9wYWNpdHl9KVxuICAgICAgICAuZHJhdygpO1xuICAgIH1cbiAgfVxufVxuXG5FbmhhbmNlZENvbHVtbkxheWVyLmxheWVyTmFtZSA9ICdFbmhhbmNlZENvbHVtbkxheWVyJztcblxuZXhwb3J0IGRlZmF1bHQgRW5oYW5jZWRDb2x1bW5MYXllcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxLQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFFQSxJQUFBSSxDQUFBLEdBQUFKLE9BQUE7QUFBK0IsU0FBQUssUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENBQUFjLHlCQUFBLEdBQUFkLE1BQUEsQ0FBQWUsZ0JBQUEsQ0FBQWxCLENBQUEsRUFBQUcsTUFBQSxDQUFBYyx5QkFBQSxDQUFBZixDQUFBLEtBQUFILE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLEdBQUFhLE9BQUEsV0FBQWQsQ0FBQSxJQUFBRSxNQUFBLENBQUFnQixjQUFBLENBQUFuQixDQUFBLEVBQUFDLENBQUEsRUFBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBTixDQUFBLEVBQUFELENBQUEsaUJBQUFELENBQUE7QUFBQSxTQUFBb0IsV0FBQWxCLENBQUEsRUFBQUksQ0FBQSxFQUFBTixDQUFBLFdBQUFNLENBQUEsT0FBQWUsZ0JBQUEsYUFBQWYsQ0FBQSxPQUFBZ0IsMkJBQUEsYUFBQXBCLENBQUEsRUFBQXFCLHlCQUFBLEtBQUFDLE9BQUEsQ0FBQUMsU0FBQSxDQUFBbkIsQ0FBQSxFQUFBTixDQUFBLFlBQUFxQixnQkFBQSxhQUFBbkIsQ0FBQSxFQUFBd0IsV0FBQSxJQUFBcEIsQ0FBQSxDQUFBSyxLQUFBLENBQUFULENBQUEsRUFBQUYsQ0FBQTtBQUFBLFNBQUF1QiwwQkFBQSxjQUFBckIsQ0FBQSxJQUFBeUIsT0FBQSxDQUFBQyxTQUFBLENBQUFDLE9BQUEsQ0FBQUMsSUFBQSxDQUFBTixPQUFBLENBQUFDLFNBQUEsQ0FBQUUsT0FBQSxpQ0FBQXpCLENBQUEsYUFBQXFCLHlCQUFBLFlBQUFBLDBCQUFBLGFBQUFyQixDQUFBO0FBQUEsU0FBQTZCLGNBQUE3QixDQUFBLEVBQUFGLENBQUEsRUFBQUMsQ0FBQSxFQUFBSyxDQUFBLFFBQUEwQixDQUFBLE9BQUFDLEtBQUEsaUJBQUFaLGdCQUFBLGlCQUFBZixDQUFBLEdBQUFKLENBQUEsQ0FBQTBCLFNBQUEsR0FBQTFCLENBQUEsR0FBQUYsQ0FBQSxFQUFBQyxDQUFBLGNBQUFLLENBQUEsYUFBQUosQ0FBQSxXQUFBOEIsQ0FBQSxDQUFBckIsS0FBQSxDQUFBVixDQUFBLEVBQUFDLENBQUEsT0FBQThCLENBQUEsSUFQL0I7QUFDQTtBQVFBLFNBQVNFLG1CQUFtQkEsQ0FBQ0MsRUFBRSxFQUFFO0VBQy9CLElBQU1DLE9BQU8sR0FBRyxJQUFBQyxZQUFVLEVBQ3hCRixFQUFFLEVBQ0YsZ0NBQWdDLEVBQ2hDLGdDQUFnQyxtRUFHbEMsQ0FBQztFQUVELE9BQU8sSUFBQUUsWUFBVSxFQUNmRCxPQUFPLEVBQ1AsZ0NBQWdDLEVBQ2hDLHFEQUFxRCxFQUNyRCx3RUFDRixDQUFDO0FBQ0g7QUFNQTtBQUFBLElBQ01FLG1CQUFtQiwwQkFBQUMsWUFBQTtFQUFBLFNBQUFELG9CQUFBO0lBQUEsSUFBQUUsZ0JBQUEsbUJBQUFGLG1CQUFBO0lBQUEsT0FBQWxCLFVBQUEsT0FBQWtCLG1CQUFBLEVBQUF6QixTQUFBO0VBQUE7RUFBQSxJQUFBNEIsVUFBQSxhQUFBSCxtQkFBQSxFQUFBQyxZQUFBO0VBQUEsV0FBQUcsYUFBQSxhQUFBSixtQkFBQTtJQUFBSyxHQUFBO0lBQUFDLEtBQUEsRUFDdkIsU0FBQUMsVUFBVUEsQ0FBQSxFQUFHO01BQ1gsSUFBTUMsT0FBTyxHQUFBZixhQUFBLENBQUFPLG1CQUFBLDRCQUFxQjtNQUVsQyxPQUFBMUIsYUFBQSxDQUFBQSxhQUFBLEtBQ0trQyxPQUFPO1FBQ1ZYLEVBQUUsRUFBRUQsbUJBQW1CLENBQUNZLE9BQU8sQ0FBQ1gsRUFBRTtNQUFDO0lBRXZDO0VBQUM7SUFBQVEsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQUcsZUFBZUEsQ0FBQSxFQUFHO01BQUEsSUFBQUMscUJBQUE7TUFDaEJqQixhQUFBLENBQUFPLG1CQUFBO01BRUEsQ0FBQVUscUJBQUEsT0FBSSxDQUFDQyxtQkFBbUIsQ0FBQyxDQUFDLGNBQUFELHFCQUFBLGVBQTFCQSxxQkFBQSxDQUE0QkUsWUFBWSxDQUFDO1FBQ3ZDQyxnQkFBZ0IsRUFBRTtVQUFDQyxJQUFJLEVBQUUsQ0FBQztVQUFFQyxRQUFRLEVBQUU7UUFBYTtNQUNyRCxDQUFDLENBQUM7SUFDSjtFQUFDO0lBQUFWLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFVLElBQUlBLENBQUFDLElBQUEsRUFBYTtNQUFBLElBQVhDLFFBQVEsR0FBQUQsSUFBQSxDQUFSQyxRQUFRO01BQ1osSUFBQUMsV0FBQSxHQWdCSSxJQUFJLENBQUNDLEtBQUs7UUFmWkMsY0FBYyxHQUFBRixXQUFBLENBQWRFLGNBQWM7UUFDZEMsY0FBYyxHQUFBSCxXQUFBLENBQWRHLGNBQWM7UUFDZEMsa0JBQWtCLEdBQUFKLFdBQUEsQ0FBbEJJLGtCQUFrQjtRQUNsQkMsa0JBQWtCLEdBQUFMLFdBQUEsQ0FBbEJLLGtCQUFrQjtRQUNsQkMsV0FBVyxHQUFBTixXQUFBLENBQVhNLFdBQVc7UUFDWEMsY0FBYyxHQUFBUCxXQUFBLENBQWRPLGNBQWM7UUFDZEMsUUFBUSxHQUFBUixXQUFBLENBQVJRLFFBQVE7UUFDUkMsTUFBTSxHQUFBVCxXQUFBLENBQU5TLE1BQU07UUFDTkMsT0FBTyxHQUFBVixXQUFBLENBQVBVLE9BQU87UUFDUEMsYUFBYSxHQUFBWCxXQUFBLENBQWJXLGFBQWE7UUFDYkMsU0FBUyxHQUFBWixXQUFBLENBQVRZLFNBQVM7UUFDVEMsTUFBTSxHQUFBYixXQUFBLENBQU5hLE1BQU07UUFDTkMsUUFBUSxHQUFBZCxXQUFBLENBQVJjLFFBQVE7UUFDUkMsTUFBTSxHQUFBZixXQUFBLENBQU5lLE1BQU07UUFDTkMsS0FBSyxHQUFBaEIsV0FBQSxDQUFMZ0IsS0FBSztNQUVQLElBQUFDLFdBQUEsR0FBcUUsSUFBSSxDQUFDQyxLQUFLO1FBQXhFQyxLQUFLLEdBQUFGLFdBQUEsQ0FBTEUsS0FBSztRQUFFQyxlQUFlLEdBQUFILFdBQUEsQ0FBZkcsZUFBZTtRQUFFQyxvQkFBb0IsR0FBQUosV0FBQSxDQUFwQkksb0JBQW9CO1FBQUVDLFlBQVksR0FBQUwsV0FBQSxDQUFaSyxZQUFZO01BRWpFSCxLQUFLLENBQUNJLFdBQVcsQ0FBQ3hCLFFBQVEsQ0FBQyxDQUFDd0IsV0FBVyxDQUFDO1FBQ3RDUixNQUFNLEVBQU5BLE1BQU07UUFDTkMsS0FBSyxFQUFHQSxLQUFLLEdBQUcsR0FBRyxHQUFJUSxJQUFJLENBQUNDLEVBQUU7UUFDOUJaLE1BQU0sRUFBTkEsTUFBTTtRQUNOTCxRQUFRLEVBQVJBLFFBQVE7UUFDUkUsT0FBTyxFQUFQQSxPQUFPO1FBQ1BJLFFBQVEsRUFBUkEsUUFBUTtRQUNSUCxjQUFjLEVBQWRBLGNBQWM7UUFDZGUsWUFBWSxFQUFaQSxZQUFZO1FBQ1poQixXQUFXLEVBQUVvQixVQUFJLENBQUNwQixXQUFXLENBQUM7UUFDOUJxQixVQUFVLEVBQUVELFVBQUksQ0FBQ3hCLGNBQWMsQ0FBQztRQUNoQzBCLFVBQVUsRUFBRXpCLGNBQWM7UUFDMUIwQixjQUFjLEVBQUV6QixrQkFBa0I7UUFDbEMwQixjQUFjLEVBQUV6QjtNQUNsQixDQUFDLENBQUM7O01BRUY7TUFDQSxJQUFJRyxRQUFRLElBQUlJLFNBQVMsRUFBRTtRQUN6Qk8sS0FBSyxDQUFDWSxRQUFRLENBQUM7VUFBQ0MsU0FBUyxFQUFFO1FBQUksQ0FBQyxDQUFDO1FBQ2pDYixLQUFLLENBQ0ZjLGNBQWMsQ0FBQ1osb0JBQW9CLENBQUMsQ0FDcENhLFdBQVcsQ0FBQ0MscUJBQUUsQ0FBQ0MsS0FBSyxDQUFDLENBQ3JCYixXQUFXLENBQUM7VUFBQ2MsUUFBUSxFQUFFO1FBQUksQ0FBQyxDQUFDLENBQzdCeEMsSUFBSSxDQUFDLENBQUM7TUFDWDtNQUNBLElBQUlZLE1BQU0sRUFBRTtRQUNWVSxLQUFLLENBQUNZLFFBQVEsQ0FBQztVQUFDQyxTQUFTLEVBQUU7UUFBSyxDQUFDLENBQUM7UUFDbENiLEtBQUssQ0FDRmMsY0FBYyxDQUFDYixlQUFlLENBQUMsQ0FDL0JjLFdBQVcsQ0FBQ0MscUJBQUUsQ0FBQ0csY0FBYyxDQUFDLENBQzlCZixXQUFXLENBQUM7VUFBQ2MsUUFBUSxFQUFFO1FBQUssQ0FBQyxDQUFDLENBQzlCeEMsSUFBSSxDQUFDLENBQUM7TUFDWDtNQUNBO01BQ0EsSUFBSSxDQUFDVyxRQUFRLElBQUlFLE9BQU8sRUFBRTtRQUN4QlMsS0FBSyxDQUFDWSxRQUFRLENBQUM7VUFBQ0MsU0FBUyxFQUFFO1FBQUssQ0FBQyxDQUFDO1FBQ2xDO1FBQ0E7UUFDQWIsS0FBSyxDQUNGYyxjQUFjLENBQUViLGVBQWUsR0FBRyxDQUFDLEdBQUksQ0FBQyxDQUFDLENBQ3pDYyxXQUFXLENBQUNDLHFCQUFFLENBQUNHLGNBQWMsQ0FBQyxDQUM5QmYsV0FBVyxDQUFDO1VBQUNjLFFBQVEsRUFBRSxJQUFJO1VBQUVFLE9BQU8sRUFBRTVCO1FBQWEsQ0FBQyxDQUFDLENBQ3JEZCxJQUFJLENBQUMsQ0FBQztNQUNYO0lBQ0Y7RUFBQztBQUFBLEVBbEYrQjJDLGtCQUFXO0FBcUY3QzNELG1CQUFtQixDQUFDNEQsU0FBUyxHQUFHLHFCQUFxQjtBQUFDLElBQUFDLFFBQUEsR0FBQUMsT0FBQSxjQUV2QzlELG1CQUFtQiIsImlnbm9yZUxpc3QiOltdfQ==
;