kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
136 lines (133 loc) • 18.1 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
exports.observeDimensions = observeDimensions;
exports.unobserveDimensions = unobserveDimensions;
exports.useDimensions = useDimensions;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _throttle = _interopRequireDefault(require("lodash/throttle"));
var _react = require("react");
var _resizeObserverPolyfill = _interopRequireDefault(require("resize-observer-polyfill"));
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
var DEFAULT_THROTTLE_DELAY = 100;
// Using a single ResizeObserver for all elements can be 10x
// more performant than using a separate ResizeObserver per element
// https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/z6ienONUb5A/F5-VcUZtBAAJ
var _observerRegistry;
function getObserverRegistry() {
if (_observerRegistry === undefined) {
var callbacks = new Map();
var resizeObserver = new _resizeObserverPolyfill["default"](function (entries, observer) {
var _iterator = _createForOfIteratorHelper(entries),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var _callbacks$get;
var entry = _step.value;
(_callbacks$get = callbacks.get(entry.target)) === null || _callbacks$get === void 0 || _callbacks$get(entry, observer);
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
});
_observerRegistry = {
subscribe: function subscribe(target, callback) {
if (target instanceof Element) {
resizeObserver.observe(target);
callbacks.set(target, callback);
}
},
unsubscribe: function unsubscribe(target) {
if (target instanceof Element) {
resizeObserver.unobserve(target);
callbacks["delete"](target);
}
}
};
}
return _observerRegistry;
}
function observeDimensions(target, handleResize) {
var throttleDelay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_THROTTLE_DELAY;
var registry = getObserverRegistry();
var handler = throttleDelay > 0 ? (0, _throttle["default"])(handleResize, throttleDelay) : handleResize;
registry.subscribe(target, function (entry) {
return handler(getSize(target, entry));
});
}
function unobserveDimensions(target) {
var registry = getObserverRegistry();
registry.unsubscribe(target);
}
function getSize(node, entry) {
if (entry.contentRect) {
var _entry$contentRect = entry.contentRect,
width = _entry$contentRect.width,
height = _entry$contentRect.height;
return {
width: width,
height: height
};
}
if (node.getBoundingClientRect) {
var _node$getBoundingClie = node.getBoundingClientRect(),
_width = _node$getBoundingClie.width,
_height = _node$getBoundingClie.height;
return {
width: _width,
height: _height
};
}
return null;
}
/**
* Usage example:
* const [ref, dimensions] = useDimensions<HTMLDivElement>();
*
* @param throttleDelay
* @returns
*/
function useDimensions(nodeRef) {
var _ref2;
var throttleDelay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THROTTLE_DELAY;
var ref = (0, _react.useRef)(null);
if (nodeRef) {
ref = nodeRef;
}
var _useState = (0, _react.useState)(null),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
size = _useState2[0],
setSize = _useState2[1];
(0, _react.useEffect)(function () {
var _ref = ref || {},
current = _ref.current;
if (!current) {
return;
}
var didUnobserve = false;
observeDimensions(current, function (entry) {
if (didUnobserve) return;
var newSize = getSize(current, entry);
if (newSize) {
// @ts-ignore
setSize(newSize);
}
}, throttleDelay);
return function () {
didUnobserve = true;
unobserveDimensions(current);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [throttleDelay, (_ref2 = ref) === null || _ref2 === void 0 ? void 0 : _ref2.current]);
return [ref, size];
}
var _default = exports["default"] = useDimensions;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGhyb3R0bGUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdCIsIl9yZXNpemVPYnNlcnZlclBvbHlmaWxsIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJERUZBVUxUX1RIUk9UVExFX0RFTEFZIiwiX29ic2VydmVyUmVnaXN0cnkiLCJnZXRPYnNlcnZlclJlZ2lzdHJ5IiwidW5kZWZpbmVkIiwiY2FsbGJhY2tzIiwiTWFwIiwicmVzaXplT2JzZXJ2ZXIiLCJSZXNpemVPYnNlcnZlciIsImVudHJpZXMiLCJvYnNlcnZlciIsIl9pdGVyYXRvciIsIl9zdGVwIiwiX2NhbGxiYWNrcyRnZXQiLCJlbnRyeSIsImdldCIsInRhcmdldCIsImVyciIsInN1YnNjcmliZSIsImNhbGxiYWNrIiwiRWxlbWVudCIsIm9ic2VydmUiLCJzZXQiLCJ1bnN1YnNjcmliZSIsInVub2JzZXJ2ZSIsIm9ic2VydmVEaW1lbnNpb25zIiwiaGFuZGxlUmVzaXplIiwidGhyb3R0bGVEZWxheSIsImFyZ3VtZW50cyIsInJlZ2lzdHJ5IiwiaGFuZGxlciIsInRocm90dGxlIiwiZ2V0U2l6ZSIsInVub2JzZXJ2ZURpbWVuc2lvbnMiLCJub2RlIiwiY29udGVudFJlY3QiLCJfZW50cnkkY29udGVudFJlY3QiLCJ3aWR0aCIsImhlaWdodCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIl9ub2RlJGdldEJvdW5kaW5nQ2xpZSIsInVzZURpbWVuc2lvbnMiLCJub2RlUmVmIiwiX3JlZjIiLCJyZWYiLCJ1c2VSZWYiLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJzaXplIiwic2V0U2l6ZSIsInVzZUVmZmVjdCIsIl9yZWYiLCJjdXJyZW50IiwiZGlkVW5vYnNlcnZlIiwibmV3U2l6ZSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9vYnNlcnZlLWRpbWVuc2lvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHRocm90dGxlIGZyb20gJ2xvZGFzaC90aHJvdHRsZSc7XG5pbXBvcnQge3VzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSwgUmVmT2JqZWN0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSAncmVzaXplLW9ic2VydmVyLXBvbHlmaWxsJztcblxuZXhwb3J0IGludGVyZmFjZSBEaW1lbnNpb25zIHtcbiAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXI7XG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG59XG5cbmNvbnN0IERFRkFVTFRfVEhST1RUTEVfREVMQVkgPSAxMDA7XG5cbi8vIFVzaW5nIGEgc2luZ2xlIFJlc2l6ZU9ic2VydmVyIGZvciBhbGwgZWxlbWVudHMgY2FuIGJlIDEweFxuLy8gbW9yZSBwZXJmb3JtYW50IHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSBSZXNpemVPYnNlcnZlciBwZXIgZWxlbWVudFxuLy8gaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9hL2Nocm9taXVtLm9yZy9mb3J1bS8jIW1zZy9ibGluay1kZXYvejZpZW5PTlViNUEvRjUtVmNVWnRCQUFKXG5sZXQgX29ic2VydmVyUmVnaXN0cnk7XG5cbmZ1bmN0aW9uIGdldE9ic2VydmVyUmVnaXN0cnkoKSB7XG4gIGlmIChfb2JzZXJ2ZXJSZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzLCBvYnNlcnZlcikgPT4ge1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNhbGxiYWNrcy5nZXQoZW50cnkudGFyZ2V0KT8uKGVudHJ5LCBvYnNlcnZlcik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX29ic2VydmVyUmVnaXN0cnkgPSB7XG4gICAgICBzdWJzY3JpYmUodGFyZ2V0LCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGFyZ2V0KTtcbiAgICAgICAgICBjYWxsYmFja3Muc2V0KHRhcmdldCwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdW5zdWJzY3JpYmUodGFyZ2V0KSB7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgICAgcmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKHRhcmdldCk7XG4gICAgICAgICAgY2FsbGJhY2tzLmRlbGV0ZSh0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICByZXR1cm4gX29ic2VydmVyUmVnaXN0cnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZlRGltZW5zaW9ucyhcbiAgdGFyZ2V0OiBFbGVtZW50LFxuICBoYW5kbGVSZXNpemU6IChzaXplOiBEaW1lbnNpb25zIHwgbnVsbCkgPT4gdm9pZCxcbiAgdGhyb3R0bGVEZWxheSA9IERFRkFVTFRfVEhST1RUTEVfREVMQVlcbikge1xuICBjb25zdCByZWdpc3RyeSA9IGdldE9ic2VydmVyUmVnaXN0cnkoKTtcbiAgY29uc3QgaGFuZGxlciA9IHRocm90dGxlRGVsYXkgPiAwID8gdGhyb3R0bGUoaGFuZGxlUmVzaXplLCB0aHJvdHRsZURlbGF5KSA6IGhhbmRsZVJlc2l6ZTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlKHRhcmdldCwgZW50cnkgPT4gaGFuZGxlcihnZXRTaXplKHRhcmdldCwgZW50cnkpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bm9ic2VydmVEaW1lbnNpb25zKHRhcmdldDogRWxlbWVudCkge1xuICBjb25zdCByZWdpc3RyeSA9IGdldE9ic2VydmVyUmVnaXN0cnkoKTtcbiAgcmVnaXN0cnkudW5zdWJzY3JpYmUodGFyZ2V0KTtcbn1cblxuZnVuY3Rpb24gZ2V0U2l6ZShub2RlLCBlbnRyeSk6IERpbWVuc2lvbnMgfCBudWxsIHtcbiAgaWYgKGVudHJ5LmNvbnRlbnRSZWN0KSB7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gZW50cnkuY29udGVudFJlY3Q7XG4gICAgcmV0dXJuIHt3aWR0aCwgaGVpZ2h0fTtcbiAgfVxuICBpZiAobm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHtcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogVXNhZ2UgZXhhbXBsZTpcbiAqIGNvbnN0IFtyZWYsIGRpbWVuc2lvbnNdID0gdXNlRGltZW5zaW9uczxIVE1MRGl2RWxlbWVudD4oKTtcbiAqXG4gKiBAcGFyYW0gdGhyb3R0bGVEZWxheVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURpbWVuc2lvbnM8VCBleHRlbmRzIEVsZW1lbnQ+KFxuICBub2RlUmVmPzogUmVmT2JqZWN0PFQ+LFxuICB0aHJvdHRsZURlbGF5ID0gREVGQVVMVF9USFJPVFRMRV9ERUxBWVxuKTogW1JlZk9iamVjdDxUPiwgRGltZW5zaW9ucyB8IG51bGxdIHtcbiAgbGV0IHJlZiA9IHVzZVJlZjxUPihudWxsKTtcbiAgaWYgKG5vZGVSZWYpIHtcbiAgICByZWYgPSBub2RlUmVmO1xuICB9XG4gIGNvbnN0IFtzaXplLCBzZXRTaXplXSA9IHVzZVN0YXRlKG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qge2N1cnJlbnR9ID0gcmVmIHx8IHt9O1xuICAgIGlmICghY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBkaWRVbm9ic2VydmUgPSBmYWxzZTtcbiAgICBvYnNlcnZlRGltZW5zaW9ucyhcbiAgICAgIGN1cnJlbnQsXG4gICAgICBlbnRyeSA9PiB7XG4gICAgICAgIGlmIChkaWRVbm9ic2VydmUpIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV3U2l6ZSA9IGdldFNpemUoY3VycmVudCwgZW50cnkpO1xuICAgICAgICBpZiAobmV3U2l6ZSkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBzZXRTaXplKG5ld1NpemUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdGhyb3R0bGVEZWxheVxuICAgICk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRpZFVub2JzZXJ2ZSA9IHRydWU7XG4gICAgICB1bm9ic2VydmVEaW1lbnNpb25zKGN1cnJlbnQpO1xuICAgIH07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbdGhyb3R0bGVEZWxheSwgcmVmPy5jdXJyZW50XSk7XG5cbiAgcmV0dXJuIFtyZWYgYXMgUmVmT2JqZWN0PFQ+LCBzaXplXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlRGltZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxTQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSx1QkFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQXNELFNBQUFHLDJCQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxDQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTixDQUFBLE1BQUFFLENBQUEsR0FBQUssMkJBQUEsQ0FBQVAsQ0FBQSxNQUFBQyxDQUFBLElBQUFELENBQUEsdUJBQUFBLENBQUEsQ0FBQVEsTUFBQSxJQUFBTixDQUFBLEtBQUFGLENBQUEsR0FBQUUsQ0FBQSxPQUFBTyxFQUFBLE1BQUFDLENBQUEsWUFBQUEsRUFBQSxlQUFBQyxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQSxFQUFBLFdBQUFILEVBQUEsSUFBQVQsQ0FBQSxDQUFBUSxNQUFBLEtBQUFLLElBQUEsV0FBQUEsSUFBQSxNQUFBQyxLQUFBLEVBQUFkLENBQUEsQ0FBQVMsRUFBQSxVQUFBUixDQUFBLFdBQUFBLEVBQUFELENBQUEsVUFBQUEsQ0FBQSxLQUFBZSxDQUFBLEVBQUFMLENBQUEsZ0JBQUFNLFNBQUEsaUpBQUFDLENBQUEsRUFBQUMsQ0FBQSxPQUFBQyxDQUFBLGdCQUFBUixDQUFBLFdBQUFBLEVBQUEsSUFBQVQsQ0FBQSxHQUFBQSxDQUFBLENBQUFrQixJQUFBLENBQUFwQixDQUFBLE1BQUFZLENBQUEsV0FBQUEsRUFBQSxRQUFBWixDQUFBLEdBQUFFLENBQUEsQ0FBQW1CLElBQUEsV0FBQUgsQ0FBQSxHQUFBbEIsQ0FBQSxDQUFBYSxJQUFBLEVBQUFiLENBQUEsS0FBQUMsQ0FBQSxXQUFBQSxFQUFBRCxDQUFBLElBQUFtQixDQUFBLE9BQUFGLENBQUEsR0FBQWpCLENBQUEsS0FBQWUsQ0FBQSxXQUFBQSxFQUFBLFVBQUFHLENBQUEsWUFBQWhCLENBQUEsY0FBQUEsQ0FBQSw4QkFBQWlCLENBQUEsUUFBQUYsQ0FBQTtBQUFBLFNBQUFWLDRCQUFBUCxDQUFBLEVBQUFrQixDQUFBLFFBQUFsQixDQUFBLDJCQUFBQSxDQUFBLFNBQUFzQixpQkFBQSxDQUFBdEIsQ0FBQSxFQUFBa0IsQ0FBQSxPQUFBaEIsQ0FBQSxNQUFBcUIsUUFBQSxDQUFBSCxJQUFBLENBQUFwQixDQUFBLEVBQUF3QixLQUFBLDZCQUFBdEIsQ0FBQSxJQUFBRixDQUFBLENBQUF5QixXQUFBLEtBQUF2QixDQUFBLEdBQUFGLENBQUEsQ0FBQXlCLFdBQUEsQ0FBQUMsSUFBQSxhQUFBeEIsQ0FBQSxjQUFBQSxDQUFBLEdBQUFHLEtBQUEsQ0FBQXNCLElBQUEsQ0FBQTNCLENBQUEsb0JBQUFFLENBQUEsK0NBQUEwQixJQUFBLENBQUExQixDQUFBLElBQUFvQixpQkFBQSxDQUFBdEIsQ0FBQSxFQUFBa0IsQ0FBQTtBQUFBLFNBQUFJLGtCQUFBdEIsQ0FBQSxFQUFBa0IsQ0FBQSxhQUFBQSxDQUFBLElBQUFBLENBQUEsR0FBQWxCLENBQUEsQ0FBQVEsTUFBQSxNQUFBVSxDQUFBLEdBQUFsQixDQUFBLENBQUFRLE1BQUEsWUFBQVAsQ0FBQSxNQUFBVyxDQUFBLEdBQUFQLEtBQUEsQ0FBQWEsQ0FBQSxHQUFBakIsQ0FBQSxHQUFBaUIsQ0FBQSxFQUFBakIsQ0FBQSxJQUFBVyxDQUFBLENBQUFYLENBQUEsSUFBQUQsQ0FBQSxDQUFBQyxDQUFBLFVBQUFXLENBQUEsSUFMdEQ7QUFDQTtBQVdBLElBQU1pQixzQkFBc0IsR0FBRyxHQUFHOztBQUVsQztBQUNBO0FBQ0E7QUFDQSxJQUFJQyxpQkFBaUI7QUFFckIsU0FBU0MsbUJBQW1CQSxDQUFBLEVBQUc7RUFDN0IsSUFBSUQsaUJBQWlCLEtBQUtFLFNBQVMsRUFBRTtJQUNuQyxJQUFNQyxTQUFTLEdBQUcsSUFBSUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsSUFBTUMsY0FBYyxHQUFHLElBQUlDLGtDQUFjLENBQUMsVUFBQ0MsT0FBTyxFQUFFQyxRQUFRLEVBQUs7TUFBQSxJQUFBQyxTQUFBLEdBQUF4QywwQkFBQSxDQUMzQ3NDLE9BQU87UUFBQUcsS0FBQTtNQUFBO1FBQTNCLEtBQUFELFNBQUEsQ0FBQTVCLENBQUEsTUFBQTZCLEtBQUEsR0FBQUQsU0FBQSxDQUFBM0IsQ0FBQSxJQUFBQyxJQUFBLEdBQTZCO1VBQUEsSUFBQTRCLGNBQUE7VUFBQSxJQUFsQkMsS0FBSyxHQUFBRixLQUFBLENBQUExQixLQUFBO1VBQ2QsQ0FBQTJCLGNBQUEsR0FBQVIsU0FBUyxDQUFDVSxHQUFHLENBQUNELEtBQUssQ0FBQ0UsTUFBTSxDQUFDLGNBQUFILGNBQUEsZUFBM0JBLGNBQUEsQ0FBOEJDLEtBQUssRUFBRUosUUFBUSxDQUFDO1FBQ2hEO01BQUMsU0FBQU8sR0FBQTtRQUFBTixTQUFBLENBQUF0QyxDQUFBLENBQUE0QyxHQUFBO01BQUE7UUFBQU4sU0FBQSxDQUFBeEIsQ0FBQTtNQUFBO0lBQ0gsQ0FBQyxDQUFDO0lBQ0ZlLGlCQUFpQixHQUFHO01BQ2xCZ0IsU0FBUyxXQUFUQSxTQUFTQSxDQUFDRixNQUFNLEVBQUVHLFFBQVEsRUFBRTtRQUMxQixJQUFJSCxNQUFNLFlBQVlJLE9BQU8sRUFBRTtVQUM3QmIsY0FBYyxDQUFDYyxPQUFPLENBQUNMLE1BQU0sQ0FBQztVQUM5QlgsU0FBUyxDQUFDaUIsR0FBRyxDQUFDTixNQUFNLEVBQUVHLFFBQVEsQ0FBQztRQUNqQztNQUNGLENBQUM7TUFDREksV0FBVyxXQUFYQSxXQUFXQSxDQUFDUCxNQUFNLEVBQUU7UUFDbEIsSUFBSUEsTUFBTSxZQUFZSSxPQUFPLEVBQUU7VUFDN0JiLGNBQWMsQ0FBQ2lCLFNBQVMsQ0FBQ1IsTUFBTSxDQUFDO1VBQ2hDWCxTQUFTLFVBQU8sQ0FBQ1csTUFBTSxDQUFDO1FBQzFCO01BQ0Y7SUFDRixDQUFDO0VBQ0g7RUFDQSxPQUFPZCxpQkFBaUI7QUFDMUI7QUFFTyxTQUFTdUIsaUJBQWlCQSxDQUMvQlQsTUFBZSxFQUNmVSxZQUErQyxFQUUvQztFQUFBLElBREFDLGFBQWEsR0FBQUMsU0FBQSxDQUFBaEQsTUFBQSxRQUFBZ0QsU0FBQSxRQUFBeEIsU0FBQSxHQUFBd0IsU0FBQSxNQUFHM0Isc0JBQXNCO0VBRXRDLElBQU00QixRQUFRLEdBQUcxQixtQkFBbUIsQ0FBQyxDQUFDO0VBQ3RDLElBQU0yQixPQUFPLEdBQUdILGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBQUksb0JBQVEsRUFBQ0wsWUFBWSxFQUFFQyxhQUFhLENBQUMsR0FBR0QsWUFBWTtFQUN4RkcsUUFBUSxDQUFDWCxTQUFTLENBQUNGLE1BQU0sRUFBRSxVQUFBRixLQUFLO0lBQUEsT0FBSWdCLE9BQU8sQ0FBQ0UsT0FBTyxDQUFDaEIsTUFBTSxFQUFFRixLQUFLLENBQUMsQ0FBQztFQUFBLEVBQUM7QUFDdEU7QUFFTyxTQUFTbUIsbUJBQW1CQSxDQUFDakIsTUFBZSxFQUFFO0VBQ25ELElBQU1hLFFBQVEsR0FBRzFCLG1CQUFtQixDQUFDLENBQUM7RUFDdEMwQixRQUFRLENBQUNOLFdBQVcsQ0FBQ1AsTUFBTSxDQUFDO0FBQzlCO0FBRUEsU0FBU2dCLE9BQU9BLENBQUNFLElBQUksRUFBRXBCLEtBQUssRUFBcUI7RUFDL0MsSUFBSUEsS0FBSyxDQUFDcUIsV0FBVyxFQUFFO0lBQ3JCLElBQUFDLGtCQUFBLEdBQXdCdEIsS0FBSyxDQUFDcUIsV0FBVztNQUFsQ0UsS0FBSyxHQUFBRCxrQkFBQSxDQUFMQyxLQUFLO01BQUVDLE1BQU0sR0FBQUYsa0JBQUEsQ0FBTkUsTUFBTTtJQUNwQixPQUFPO01BQUNELEtBQUssRUFBTEEsS0FBSztNQUFFQyxNQUFNLEVBQU5BO0lBQU0sQ0FBQztFQUN4QjtFQUNBLElBQUlKLElBQUksQ0FBQ0sscUJBQXFCLEVBQUU7SUFDOUIsSUFBQUMscUJBQUEsR0FBd0JOLElBQUksQ0FBQ0sscUJBQXFCLENBQUMsQ0FBQztNQUE3Q0YsTUFBSyxHQUFBRyxxQkFBQSxDQUFMSCxLQUFLO01BQUVDLE9BQU0sR0FBQUUscUJBQUEsQ0FBTkYsTUFBTTtJQUNwQixPQUFPO01BQUNELEtBQUssRUFBTEEsTUFBSztNQUFFQyxNQUFNLEVBQU5BO0lBQU0sQ0FBQztFQUN4QjtFQUNBLE9BQU8sSUFBSTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csYUFBYUEsQ0FDM0JDLE9BQXNCLEVBRWE7RUFBQSxJQUFBQyxLQUFBO0VBQUEsSUFEbkNoQixhQUFhLEdBQUFDLFNBQUEsQ0FBQWhELE1BQUEsUUFBQWdELFNBQUEsUUFBQXhCLFNBQUEsR0FBQXdCLFNBQUEsTUFBRzNCLHNCQUFzQjtFQUV0QyxJQUFJMkMsR0FBRyxHQUFHLElBQUFDLGFBQU0sRUFBSSxJQUFJLENBQUM7RUFDekIsSUFBSUgsT0FBTyxFQUFFO0lBQ1hFLEdBQUcsR0FBR0YsT0FBTztFQUNmO0VBQ0EsSUFBQUksU0FBQSxHQUF3QixJQUFBQyxlQUFRLEVBQUMsSUFBSSxDQUFDO0lBQUFDLFVBQUEsT0FBQUMsZUFBQSxhQUFBSCxTQUFBO0lBQS9CSSxJQUFJLEdBQUFGLFVBQUE7SUFBRUcsT0FBTyxHQUFBSCxVQUFBO0VBRXBCLElBQUFJLGdCQUFTLEVBQUMsWUFBTTtJQUNkLElBQUFDLElBQUEsR0FBa0JULEdBQUcsSUFBSSxDQUFDLENBQUM7TUFBcEJVLE9BQU8sR0FBQUQsSUFBQSxDQUFQQyxPQUFPO0lBQ2QsSUFBSSxDQUFDQSxPQUFPLEVBQUU7TUFDWjtJQUNGO0lBRUEsSUFBSUMsWUFBWSxHQUFHLEtBQUs7SUFDeEI5QixpQkFBaUIsQ0FDZjZCLE9BQU8sRUFDUCxVQUFBeEMsS0FBSyxFQUFJO01BQ1AsSUFBSXlDLFlBQVksRUFBRTtNQUNsQixJQUFNQyxPQUFPLEdBQUd4QixPQUFPLENBQUNzQixPQUFPLEVBQUV4QyxLQUFLLENBQUM7TUFDdkMsSUFBSTBDLE9BQU8sRUFBRTtRQUNYO1FBQ0FMLE9BQU8sQ0FBQ0ssT0FBTyxDQUFDO01BQ2xCO0lBQ0YsQ0FBQyxFQUNEN0IsYUFDRixDQUFDO0lBQ0QsT0FBTyxZQUFNO01BQ1g0QixZQUFZLEdBQUcsSUFBSTtNQUNuQnRCLG1CQUFtQixDQUFDcUIsT0FBTyxDQUFDO0lBQzlCLENBQUM7SUFDRDtFQUNGLENBQUMsRUFBRSxDQUFDM0IsYUFBYSxHQUFBZ0IsS0FBQSxHQUFFQyxHQUFHLGNBQUFELEtBQUEsdUJBQUhBLEtBQUEsQ0FBS1csT0FBTyxDQUFDLENBQUM7RUFFakMsT0FBTyxDQUFDVixHQUFHLEVBQWtCTSxJQUFJLENBQUM7QUFDcEM7QUFBQyxJQUFBTyxRQUFBLEdBQUFDLE9BQUEsY0FFY2pCLGFBQWEiLCJpZ25vcmVMaXN0IjpbXX0=
;