kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
116 lines (113 loc) • 20.1 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
exports.getTickFormat = getTickFormat;
exports.getXAxis = getXAxis;
exports.updateAxis = updateAxis;
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react"));
var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
var _d3Scale = require("d3-scale");
var _d3Selection = require("d3-selection");
var _d3Axis = require("d3-axis");
var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components"));
var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src");
var _templateObject; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
var MIN_TICK_WIDTH_LARGE = 80;
var MIN_TICK_WIDTH_SMALL = 50;
var HEIGHT = 30;
var TimeSliderContainer = _styledComponents["default"].svg(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n pointer-events: none;\n position: absolute;\n top: 0;\n overflow: visible;\n margin-top: 6px;\n\n .axis text {\n font-size: ", ";\n fill: ", ";\n }\n\n .axis line {\n stroke: ", ";\n shape-rendering: crispEdges;\n stroke-width: 1;\n }\n\n .axis path {\n fill: none;\n stroke: ", ";\n shape-rendering: crispEdges;\n stroke-width: 2;\n }\n\n .axis .domain {\n display: none;\n }\n\n .value {\n fill: ", ";\n font-size: ", ";\n\n &.start {\n text-anchor: start;\n }\n\n &.end {\n text-anchor: end;\n }\n }\n"])), function (props) {
return props.theme.axisFontSize;
}, function (props) {
return props.theme.axisFontColor;
}, function (props) {
return props.theme.axisFontColor;
}, function (props) {
return props.theme.sliderBarBgd;
}, function (props) {
return props.theme.axisFontColor;
}, function (props) {
return props.theme.axisFontSize;
});
var TICK_FORMATS = {
millisecond: '.SSS',
second: ':ss',
minute: 'HH:mm',
hour: 'HH A',
day: 'ddd DD',
week: 'MMM DD',
month: 'MMM',
year: 'YYYY'
};
// timezone sensitive tick formatter based on moment
// adapted based on d3 time scale tick format https://github.com/d3/d3-scale/blob/master/src/time.js#L59
function getTickFormat(timezone) {
// date is js date object
var toMoment = timezone ? function (date) {
return (0, _momentTimezone["default"])(date).tz(timezone);
} : _momentTimezone["default"];
var formatter = (0, _src.datetimeFormatter)(timezone);
return function (date) {
return (toMoment(date).startOf('second') < date ? formatter(TICK_FORMATS.millisecond) : toMoment(date).startOf('minute') < date ? formatter(TICK_FORMATS.second) : toMoment(date).startOf('hour') < date ? formatter(TICK_FORMATS.minute) : toMoment(date).startOf('day') < date ? formatter(TICK_FORMATS.hour) : toMoment(date).startOf('month') < date ? toMoment(date).startOf('isoWeek') < date ? formatter(TICK_FORMATS.day) : formatter(TICK_FORMATS.week) : toMoment(date).startOf('year') < date ? formatter(TICK_FORMATS.month) : formatter(TICK_FORMATS.year))(date);
};
}
// create a helper function so we can test it
function getXAxis(domain, width, isEnlarged, timezone) {
if (!Array.isArray(domain) || !domain.every(Number.isFinite)) {
return null;
}
var scale = (0, _d3Scale.scaleUtc)().domain(domain).range([0, width]);
if (!scale) {
return null;
}
var ticks = Math.floor(width / (isEnlarged ? MIN_TICK_WIDTH_LARGE : MIN_TICK_WIDTH_SMALL));
var tickFormat = timezone ? getTickFormat(timezone) : null;
var xAxis = (0, _d3Axis.axisBottom)(scale).ticks(ticks).tickSize(4).tickPadding(4);
if (tickFormat) {
xAxis.tickFormat(tickFormat);
}
return xAxis;
}
function updateAxis(xAxisRef, xAxis) {
if (!xAxis) {
return;
}
(0, _d3Selection.select)(xAxisRef.current).call(xAxis);
}
function TimeSliderMarkerFactory() {
var TimeSliderMarker = function TimeSliderMarker(_ref) {
var width = _ref.width,
domain = _ref.domain,
_ref$isEnlarged = _ref.isEnlarged,
isEnlarged = _ref$isEnlarged === void 0 ? true : _ref$isEnlarged,
_ref$height = _ref.height,
height = _ref$height === void 0 ? HEIGHT : _ref$height,
timezone = _ref.timezone;
var xAxisRef = (0, _react.useRef)(null);
var xAxis = (0, _react.useMemo)(function () {
return getXAxis(domain, width, isEnlarged, timezone);
}, [domain, width, isEnlarged, timezone]);
(0, _react.useEffect)(function () {
updateAxis(xAxisRef, xAxis);
}, [xAxisRef, xAxis]);
return /*#__PURE__*/_react["default"].createElement(TimeSliderContainer, {
className: "time-slider-marker",
width: width,
height: height
}, /*#__PURE__*/_react["default"].createElement("g", {
className: "x axis",
ref: xAxisRef,
transform: "translate(0, 0)"
}));
};
return _react["default"].memo(TimeSliderMarker);
}
var _default = exports["default"] = TimeSliderMarkerFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbW9tZW50VGltZXpvbmUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2QzU2NhbGUiLCJfZDNTZWxlY3Rpb24iLCJfZDNBeGlzIiwiX3N0eWxlZENvbXBvbmVudHMiLCJfc3JjIiwiX3RlbXBsYXRlT2JqZWN0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiTUlOX1RJQ0tfV0lEVEhfTEFSR0UiLCJNSU5fVElDS19XSURUSF9TTUFMTCIsIkhFSUdIVCIsIlRpbWVTbGlkZXJDb250YWluZXIiLCJzdHlsZWQiLCJzdmciLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwidGhlbWUiLCJheGlzRm9udFNpemUiLCJheGlzRm9udENvbG9yIiwic2xpZGVyQmFyQmdkIiwiVElDS19GT1JNQVRTIiwibWlsbGlzZWNvbmQiLCJzZWNvbmQiLCJtaW51dGUiLCJob3VyIiwiZGF5Iiwid2VlayIsIm1vbnRoIiwieWVhciIsImdldFRpY2tGb3JtYXQiLCJ0aW1lem9uZSIsInRvTW9tZW50IiwiZGF0ZSIsIm1vbWVudCIsInR6IiwiZm9ybWF0dGVyIiwiZGF0ZXRpbWVGb3JtYXR0ZXIiLCJzdGFydE9mIiwiZ2V0WEF4aXMiLCJkb21haW4iLCJ3aWR0aCIsImlzRW5sYXJnZWQiLCJBcnJheSIsImlzQXJyYXkiLCJldmVyeSIsIk51bWJlciIsImlzRmluaXRlIiwic2NhbGUiLCJzY2FsZVV0YyIsInJhbmdlIiwidGlja3MiLCJNYXRoIiwiZmxvb3IiLCJ0aWNrRm9ybWF0IiwieEF4aXMiLCJheGlzQm90dG9tIiwidGlja1NpemUiLCJ0aWNrUGFkZGluZyIsInVwZGF0ZUF4aXMiLCJ4QXhpc1JlZiIsInNlbGVjdCIsImN1cnJlbnQiLCJUaW1lU2xpZGVyTWFya2VyRmFjdG9yeSIsIlRpbWVTbGlkZXJNYXJrZXIiLCJfcmVmIiwiX3JlZiRpc0VubGFyZ2VkIiwiX3JlZiRoZWlnaHQiLCJoZWlnaHQiLCJ1c2VSZWYiLCJ1c2VNZW1vIiwidXNlRWZmZWN0IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsInJlZiIsInRyYW5zZm9ybSIsIlJlYWN0IiwibWVtbyIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NyYy9jb21tb24vdGltZS1zbGlkZXItbWFya2VyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VSZWYsIHVzZUVmZmVjdCwgdXNlTWVtb30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQtdGltZXpvbmUnO1xuaW1wb3J0IHtOdW1iZXJWYWx1ZSwgc2NhbGVVdGN9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7c2VsZWN0fSBmcm9tICdkMy1zZWxlY3Rpb24nO1xuaW1wb3J0IHtheGlzQm90dG9tfSBmcm9tICdkMy1heGlzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtkYXRldGltZUZvcm1hdHRlcn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmNvbnN0IE1JTl9USUNLX1dJRFRIX0xBUkdFID0gODA7XG5jb25zdCBNSU5fVElDS19XSURUSF9TTUFMTCA9IDUwO1xuY29uc3QgSEVJR0hUID0gMzA7XG5cbmNvbnN0IFRpbWVTbGlkZXJDb250YWluZXIgPSBzdHlsZWQuc3ZnYFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICBtYXJnaW4tdG9wOiA2cHg7XG5cbiAgLmF4aXMgdGV4dCB7XG4gICAgZm9udC1zaXplOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmF4aXNGb250U2l6ZX07XG4gICAgZmlsbDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5heGlzRm9udENvbG9yfTtcbiAgfVxuXG4gIC5heGlzIGxpbmUge1xuICAgIHN0cm9rZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5heGlzRm9udENvbG9yfTtcbiAgICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7XG4gICAgc3Ryb2tlLXdpZHRoOiAxO1xuICB9XG5cbiAgLmF4aXMgcGF0aCB7XG4gICAgZmlsbDogbm9uZTtcbiAgICBzdHJva2U6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2xpZGVyQmFyQmdkfTtcbiAgICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7XG4gICAgc3Ryb2tlLXdpZHRoOiAyO1xuICB9XG5cbiAgLmF4aXMgLmRvbWFpbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC52YWx1ZSB7XG4gICAgZmlsbDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5heGlzRm9udENvbG9yfTtcbiAgICBmb250LXNpemU6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYXhpc0ZvbnRTaXplfTtcblxuICAgICYuc3RhcnQge1xuICAgICAgdGV4dC1hbmNob3I6IHN0YXJ0O1xuICAgIH1cblxuICAgICYuZW5kIHtcbiAgICAgIHRleHQtYW5jaG9yOiBlbmQ7XG4gICAgfVxuICB9XG5gO1xuXG5jb25zdCBUSUNLX0ZPUk1BVFMgPSB7XG4gIG1pbGxpc2Vjb25kOiAnLlNTUycsXG4gIHNlY29uZDogJzpzcycsXG4gIG1pbnV0ZTogJ0hIOm1tJyxcbiAgaG91cjogJ0hIIEEnLFxuICBkYXk6ICdkZGQgREQnLFxuICB3ZWVrOiAnTU1NIEREJyxcbiAgbW9udGg6ICdNTU0nLFxuICB5ZWFyOiAnWVlZWSdcbn07XG5cbi8vIHRpbWV6b25lIHNlbnNpdGl2ZSB0aWNrIGZvcm1hdHRlciBiYXNlZCBvbiBtb21lbnRcbi8vIGFkYXB0ZWQgYmFzZWQgb24gZDMgdGltZSBzY2FsZSB0aWNrIGZvcm1hdCBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtc2NhbGUvYmxvYi9tYXN0ZXIvc3JjL3RpbWUuanMjTDU5XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGlja0Zvcm1hdCh0aW1lem9uZTogc3RyaW5nKSB7XG4gIC8vIGRhdGUgaXMganMgZGF0ZSBvYmplY3RcbiAgY29uc3QgdG9Nb21lbnQgPSB0aW1lem9uZSA/IGRhdGUgPT4gbW9tZW50KGRhdGUpLnR6KHRpbWV6b25lKSA6IG1vbWVudDtcbiAgY29uc3QgZm9ybWF0dGVyID0gZGF0ZXRpbWVGb3JtYXR0ZXIodGltZXpvbmUpO1xuXG4gIHJldHVybiBkYXRlID0+XG4gICAgKHRvTW9tZW50KGRhdGUpLnN0YXJ0T2YoJ3NlY29uZCcpIDwgZGF0ZVxuICAgICAgPyBmb3JtYXR0ZXIoVElDS19GT1JNQVRTLm1pbGxpc2Vjb25kKVxuICAgICAgOiB0b01vbWVudChkYXRlKS5zdGFydE9mKCdtaW51dGUnKSA8IGRhdGVcbiAgICAgID8gZm9ybWF0dGVyKFRJQ0tfRk9STUFUUy5zZWNvbmQpXG4gICAgICA6IHRvTW9tZW50KGRhdGUpLnN0YXJ0T2YoJ2hvdXInKSA8IGRhdGVcbiAgICAgID8gZm9ybWF0dGVyKFRJQ0tfRk9STUFUUy5taW51dGUpXG4gICAgICA6IHRvTW9tZW50KGRhdGUpLnN0YXJ0T2YoJ2RheScpIDwgZGF0ZVxuICAgICAgPyBmb3JtYXR0ZXIoVElDS19GT1JNQVRTLmhvdXIpXG4gICAgICA6IHRvTW9tZW50KGRhdGUpLnN0YXJ0T2YoJ21vbnRoJykgPCBkYXRlXG4gICAgICA/IHRvTW9tZW50KGRhdGUpLnN0YXJ0T2YoJ2lzb1dlZWsnKSA8IGRhdGVcbiAgICAgICAgPyBmb3JtYXR0ZXIoVElDS19GT1JNQVRTLmRheSlcbiAgICAgICAgOiBmb3JtYXR0ZXIoVElDS19GT1JNQVRTLndlZWspXG4gICAgICA6IHRvTW9tZW50KGRhdGUpLnN0YXJ0T2YoJ3llYXInKSA8IGRhdGVcbiAgICAgID8gZm9ybWF0dGVyKFRJQ0tfRk9STUFUUy5tb250aClcbiAgICAgIDogZm9ybWF0dGVyKFRJQ0tfRk9STUFUUy55ZWFyKSkoZGF0ZSk7XG59XG5cbi8vIGNyZWF0ZSBhIGhlbHBlciBmdW5jdGlvbiBzbyB3ZSBjYW4gdGVzdCBpdFxuZXhwb3J0IGZ1bmN0aW9uIGdldFhBeGlzKFxuICBkb21haW46IERhdGVbXSB8IE51bWJlclZhbHVlW10sXG4gIHdpZHRoOiBudW1iZXIsXG4gIGlzRW5sYXJnZWQ6IGJvb2xlYW4sXG4gIHRpbWV6b25lOiBzdHJpbmdcbikge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZG9tYWluKSB8fCAhZG9tYWluLmV2ZXJ5KE51bWJlci5pc0Zpbml0ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBzY2FsZSA9IHNjYWxlVXRjKCkuZG9tYWluKGRvbWFpbikucmFuZ2UoWzAsIHdpZHRoXSk7XG4gIGlmICghc2NhbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHRpY2tzID0gTWF0aC5mbG9vcih3aWR0aCAvIChpc0VubGFyZ2VkID8gTUlOX1RJQ0tfV0lEVEhfTEFSR0UgOiBNSU5fVElDS19XSURUSF9TTUFMTCkpO1xuICBjb25zdCB0aWNrRm9ybWF0ID0gdGltZXpvbmUgPyBnZXRUaWNrRm9ybWF0KHRpbWV6b25lKSA6IG51bGw7XG4gIGNvbnN0IHhBeGlzID0gYXhpc0JvdHRvbShzY2FsZSkudGlja3ModGlja3MpLnRpY2tTaXplKDQpLnRpY2tQYWRkaW5nKDQpO1xuICBpZiAodGlja0Zvcm1hdCkge1xuICAgIHhBeGlzLnRpY2tGb3JtYXQodGlja0Zvcm1hdCk7XG4gIH1cblxuICByZXR1cm4geEF4aXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBeGlzKHhBeGlzUmVmLCB4QXhpcykge1xuICBpZiAoIXhBeGlzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2VsZWN0KHhBeGlzUmVmLmN1cnJlbnQpLmNhbGwoeEF4aXMpO1xufVxuXG5pbnRlcmZhY2UgVGltZVNsaWRlck1hcmtlclByb3BzIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgZG9tYWluOiBEYXRlW10gfCBOdW1iZXJWYWx1ZVtdO1xuICBpc0VubGFyZ2VkPzogYm9vbGVhbjtcbiAgaGVpZ2h0PzogbnVtYmVyO1xuICB0aW1lem9uZTogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBUaW1lU2xpZGVyTWFya2VyRmFjdG9yeSgpIHtcbiAgY29uc3QgVGltZVNsaWRlck1hcmtlciA9ICh7XG4gICAgd2lkdGgsXG4gICAgZG9tYWluLFxuICAgIGlzRW5sYXJnZWQgPSB0cnVlLFxuICAgIGhlaWdodCA9IEhFSUdIVCxcbiAgICB0aW1lem9uZVxuICB9OiBUaW1lU2xpZGVyTWFya2VyUHJvcHMpID0+IHtcbiAgICBjb25zdCB4QXhpc1JlZiA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCB4QXhpcyA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiBnZXRYQXhpcyhkb21haW4sIHdpZHRoLCBpc0VubGFyZ2VkLCB0aW1lem9uZSksXG4gICAgICBbZG9tYWluLCB3aWR0aCwgaXNFbmxhcmdlZCwgdGltZXpvbmVdXG4gICAgKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgdXBkYXRlQXhpcyh4QXhpc1JlZiwgeEF4aXMpO1xuICAgIH0sIFt4QXhpc1JlZiwgeEF4aXNdKTtcbiAgICByZXR1cm4gKFxuICAgICAgPFRpbWVTbGlkZXJDb250YWluZXIgY2xhc3NOYW1lPVwidGltZS1zbGlkZXItbWFya2VyXCIgd2lkdGg9e3dpZHRofSBoZWlnaHQ9e2hlaWdodH0+XG4gICAgICAgIDxnIGNsYXNzTmFtZT1cInggYXhpc1wiIHJlZj17eEF4aXNSZWZ9IHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwLCAwKVwiIC8+XG4gICAgICA8L1RpbWVTbGlkZXJDb250YWluZXI+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUmVhY3QubWVtbyhUaW1lU2xpZGVyTWFya2VyKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVGltZVNsaWRlck1hcmtlckZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGVBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFFBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLGlCQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxJQUFBLEdBQUFQLE9BQUE7QUFBbUQsSUFBQVEsZUFBQSxFQVRuRDtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFYLHdCQUFBVyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFB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
;