kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
132 lines (131 loc) • 25.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;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _throttle = _interopRequireDefault(require("lodash/throttle"));
var _classnames = _interopRequireDefault(require("classnames"));
var _utils = require("@kepler.gl/utils");
var _styles = require("@kepler.gl/styles");
var _constants = require("@kepler.gl/constants");
var _slider = _interopRequireDefault(require("./slider/slider"));
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5; // 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; }
function noop() {
return;
}
var SLIDER_MARGIN_PALM = 6;
var AnimationControlSlider = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n"])));
var SliderWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n position: relative;\n flex-grow: 1;\n margin: 0 24px;\n\n ", "\n"])), _styles.media.palm(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin: 0 ", "px;\n "])), SLIDER_MARGIN_PALM));
var StyledSlider = (0, _styledComponents["default"])(_slider["default"])(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n .kg-range-slider__bar {\n // change colors\n }\n"])));
var StyledDomain = _styledComponents["default"].div.attrs(function (props) {
return {
className: (0, _classnames["default"])('animation-control__time-domain', props.className)
};
})(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-weight: 400;\n font-size: 10px;\n"])), function (props) {
return props.theme.titleTextColor;
});
var PROGRESS_BAR_HEIGHT = 8;
function TimelineSliderFactory() {
var TimelineSlider = function TimelineSlider(_ref) {
var timeline = _ref.timeline,
setTimelineValue = _ref.setTimelineValue,
_ref$enableBarDrag = _ref.enableBarDrag,
enableBarDrag = _ref$enableBarDrag === void 0 ? true : _ref$enableBarDrag,
_ref$showDomainTimes = _ref.showDomainTimes,
showDomainTimes = _ref$showDomainTimes === void 0 ? true : _ref$showDomainTimes,
_ref$height = _ref.height,
height = _ref$height === void 0 ? PROGRESS_BAR_HEIGHT : _ref$height,
_ref$className = _ref.className,
className = _ref$className === void 0 ? null : _ref$className,
style = _ref.style;
var onThrottleUpdate = (0, _react.useMemo)(function () {
return (0, _throttle["default"])(setTimelineValue, 20);
}, [setTimelineValue]);
var step = timeline.step,
domain = timeline.domain,
value = timeline.value,
timeFormat = timeline.timeFormat,
defaultTimeFormat = timeline.defaultTimeFormat,
timezone = timeline.timezone,
animationWindow = timeline.animationWindow,
marks = timeline.marks;
var isRanged = (0, _react.useMemo)(function () {
return Array.isArray(value) && value.length === 2 && animationWindow !== _constants.ANIMATION_WINDOW.interval;
}, [animationWindow, value]);
var _useMemo = (0, _react.useMemo)(function () {
return [isRanged ? value[0] : null, isRanged ? value[1] : value[0]];
}, [isRanged, value]),
_useMemo2 = (0, _slicedToArray2["default"])(_useMemo, 2),
value0 = _useMemo2[0],
value1 = _useMemo2[1];
var _useMemo3 = (0, _react.useMemo)(function () {
if (!domain) return [noop, noop];
return [isRanged ? function (newValue) {
return onThrottleUpdate([(0, _utils.clamp)(domain, newValue), value1]);
} : noop, isRanged ? function (newValue) {
return onThrottleUpdate([value0, (0, _utils.clamp)(domain, newValue)]);
} : function (newValue) {
return onThrottleUpdate(animationWindow === _constants.ANIMATION_WINDOW.interval ?
// filter requires an array with 2 values
[(0, _utils.clamp)(domain, newValue), (0, _utils.clamp)(domain, newValue)] :
// animationConfig only requires one value
[(0, _utils.clamp)(domain, newValue)]);
}];
}, [animationWindow, domain, isRanged, value0, value1, onThrottleUpdate]),
_useMemo4 = (0, _slicedToArray2["default"])(_useMemo3, 2),
onSlider0Change = _useMemo4[0],
onSlider1Change = _useMemo4[1];
var timelineSliderStyle = (0, _react.useMemo)(function () {
return {
height: "".concat(height, "px")
};
}, [height]);
var _useMemo5 = (0, _react.useMemo)(function () {
if (!showDomainTimes) {
return [null, null];
}
var hasUserFormat = typeof timeFormat === 'string';
var currentFormat = (hasUserFormat ? timeFormat : defaultTimeFormat) || _constants.DEFAULT_TIME_FORMAT;
var dateFunc = (0, _utils.datetimeFormatter)(timezone)(currentFormat);
return [domain ? dateFunc(domain[0]) : '', domain ? dateFunc(domain[1]) : ''];
}, [domain, timezone, timeFormat, defaultTimeFormat, showDomainTimes]),
_useMemo6 = (0, _slicedToArray2["default"])(_useMemo5, 2),
timeStart = _useMemo6[0],
timeEnd = _useMemo6[1];
var requiresRangeSlider = isRanged && animationWindow !== _constants.ANIMATION_WINDOW.interval;
return /*#__PURE__*/_react["default"].createElement(AnimationControlSlider, {
style: style,
className: (0, _classnames["default"])('animation-control__time-slider', className)
}, timeStart ? /*#__PURE__*/_react["default"].createElement(StyledDomain, {
className: "domain-start"
}, /*#__PURE__*/_react["default"].createElement("span", null, timeStart)) : null, /*#__PURE__*/_react["default"].createElement(SliderWrapper, {
className: "animation-control__slider"
}, /*#__PURE__*/_react["default"].createElement(StyledSlider, {
isRanged: requiresRangeSlider,
step: step || undefined,
minValue: domain ? domain[0] : 0,
maxValue: domain ? domain[1] : 1,
enableBarDrag: enableBarDrag,
style: timelineSliderStyle,
onSlider0Change: onSlider0Change,
onSlider1Change: onSlider1Change,
value0: value0,
value1: value1,
marks: marks
})), timeEnd ? /*#__PURE__*/_react["default"].createElement(StyledDomain, {
className: "domain-end"
}, /*#__PURE__*/_react["default"].createElement("span", null, timeEnd)) : null);
};
return TimelineSlider;
}
var _default = exports["default"] = TimelineSliderFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdGhyb3R0bGUiLCJfY2xhc3NuYW1lcyIsIl91dGlscyIsIl9zdHlsZXMiLCJfY29uc3RhbnRzIiwiX3NsaWRlciIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX3RlbXBsYXRlT2JqZWN0NCIsIl90ZW1wbGF0ZU9iamVjdDUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJub29wIiwiU0xJREVSX01BUkdJTl9QQUxNIiwiQW5pbWF0aW9uQ29udHJvbFNsaWRlciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiU2xpZGVyV3JhcHBlciIsIm1lZGlhIiwicGFsbSIsIlN0eWxlZFNsaWRlciIsIlNsaWRlciIsIlN0eWxlZERvbWFpbiIsImF0dHJzIiwicHJvcHMiLCJjbGFzc05hbWUiLCJjbGFzc25hbWVzIiwidGhlbWUiLCJ0aXRsZVRleHRDb2xvciIsIlBST0dSRVNTX0JBUl9IRUlHSFQiLCJUaW1lbGluZVNsaWRlckZhY3RvcnkiLCJUaW1lbGluZVNsaWRlciIsIl9yZWYiLCJ0aW1lbGluZSIsInNldFRpbWVsaW5lVmFsdWUiLCJfcmVmJGVuYWJsZUJhckRyYWciLCJlbmFibGVCYXJEcmFnIiwiX3JlZiRzaG93RG9tYWluVGltZXMiLCJzaG93RG9tYWluVGltZXMiLCJfcmVmJGhlaWdodCIsImhlaWdodCIsIl9yZWYkY2xhc3NOYW1lIiwic3R5bGUiLCJvblRocm90dGxlVXBkYXRlIiwidXNlTWVtbyIsInRocm90dGxlIiwic3RlcCIsImRvbWFpbiIsInZhbHVlIiwidGltZUZvcm1hdCIsImRlZmF1bHRUaW1lRm9ybWF0IiwidGltZXpvbmUiLCJhbmltYXRpb25XaW5kb3ciLCJtYXJrcyIsImlzUmFuZ2VkIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiQU5JTUFUSU9OX1dJTkRPVyIsImludGVydmFsIiwiX3VzZU1lbW8iLCJfdXNlTWVtbzIiLCJfc2xpY2VkVG9BcnJheTIiLCJ2YWx1ZTAiLCJ2YWx1ZTEiLCJfdXNlTWVtbzMiLCJuZXdWYWx1ZSIsImNsYW1wIiwiX3VzZU1lbW80Iiwib25TbGlkZXIwQ2hhbmdlIiwib25TbGlkZXIxQ2hhbmdlIiwidGltZWxpbmVTbGlkZXJTdHlsZSIsImNvbmNhdCIsIl91c2VNZW1vNSIsImhhc1VzZXJGb3JtYXQiLCJjdXJyZW50Rm9ybWF0IiwiREVGQVVMVF9USU1FX0ZPUk1BVCIsImRhdGVGdW5jIiwiZGF0ZXRpbWVGb3JtYXR0ZXIiLCJfdXNlTWVtbzYiLCJ0aW1lU3RhcnQiLCJ0aW1lRW5kIiwicmVxdWlyZXNSYW5nZVNsaWRlciIsImNyZWF0ZUVsZW1lbnQiLCJ1bmRlZmluZWQiLCJtaW5WYWx1ZSIsIm1heFZhbHVlIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1vbi90aW1lbGluZS1zbGlkZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZU1lbW99IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQsIHtJU3R5bGVkQ29tcG9uZW50fSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSAnbG9kYXNoL3Rocm90dGxlJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHtjbGFtcCwgZGF0ZXRpbWVGb3JtYXR0ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHttZWRpYX0gZnJvbSAnQGtlcGxlci5nbC9zdHlsZXMnO1xuaW1wb3J0IHtERUZBVUxUX1RJTUVfRk9STUFULCBBTklNQVRJT05fV0lORE9XfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge1RpbWVsaW5lfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCBTbGlkZXIgZnJvbSAnLi9zbGlkZXIvc2xpZGVyJztcbmltcG9ydCB7QmFzZUNvbXBvbmVudFByb3BzfSBmcm9tICcuLi90eXBlcyc7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7XG4gIHJldHVybjtcbn1cblxuY29uc3QgU0xJREVSX01BUkdJTl9QQUxNID0gNjtcblxuZXhwb3J0IHR5cGUgQW5pbWF0aW9uQ29udHJvbFNsaWRlclByb3BzID0gQmFzZUNvbXBvbmVudFByb3BzO1xuXG5jb25zdCBBbmltYXRpb25Db250cm9sU2xpZGVyOiBJU3R5bGVkQ29tcG9uZW50PCd3ZWInLCBBbmltYXRpb25Db250cm9sU2xpZGVyUHJvcHM+ID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbmA7XG5cbmNvbnN0IFNsaWRlcldyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsZXgtZ3JvdzogMTtcbiAgbWFyZ2luOiAwIDI0cHg7XG5cbiAgJHttZWRpYS5wYWxtYFxuICAgIG1hcmdpbjogMCAke1NMSURFUl9NQVJHSU5fUEFMTX1weDtcbiAgYH1cbmA7XG5cbmNvbnN0IFN0eWxlZFNsaWRlciA9IHN0eWxlZChTbGlkZXIpYFxuICAua2ctcmFuZ2Utc2xpZGVyX19iYXIge1xuICAgIC8vIGNoYW5nZSBjb2xvcnNcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkRG9tYWluID0gc3R5bGVkLmRpdi5hdHRycyhwcm9wcyA9PiAoe1xuICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2FuaW1hdGlvbi1jb250cm9sX190aW1lLWRvbWFpbicsIHByb3BzLmNsYXNzTmFtZSlcbn0pKWBcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGl0bGVUZXh0Q29sb3J9O1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXNpemU6IDEwcHg7XG5gO1xuXG5jb25zdCBQUk9HUkVTU19CQVJfSEVJR0hUID0gODtcblxuaW50ZXJmYWNlIFRpbWVsaW5lU2xpZGVyUHJvcHMge1xuICB0aW1lbGluZTogVGltZWxpbmU7XG4gIHNldFRpbWVsaW5lVmFsdWU6ICh2YWx1ZTogW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkO1xuICBlbmFibGVCYXJEcmFnPzogYm9vbGVhbjtcbiAgc2hvd0RvbWFpblRpbWVzPzogYm9vbGVhbjtcbiAgaGVpZ2h0PzogbnVtYmVyO1xuICBjbGFzc05hbWU/OiBzdHJpbmcgfCBudWxsO1xuICBzdHlsZT86IG9iamVjdDtcbn1cblxuZnVuY3Rpb24gVGltZWxpbmVTbGlkZXJGYWN0b3J5KCkge1xuICBjb25zdCBUaW1lbGluZVNsaWRlcjogUmVhY3QuRkM8VGltZWxpbmVTbGlkZXJQcm9wcz4gPSAoe1xuICAgIHRpbWVsaW5lLCAvLyB0aW1lbGluZSBjYW4gYmUgYSB1bmlvbiBvZiBmaWx0ZXIgYW5kIGFuaW1hdGlvbkNvbmZpZ1xuICAgIC8vIHdlIGNhbiBwYXNzIHRpbWVsaW5lIHRvIGEgaG9vayBhbmQgZ2V0IGJhY2sgdmFsdWVzIGFuZCBjb250cm9sbGVyc1xuICAgIHNldFRpbWVsaW5lVmFsdWUsXG4gICAgZW5hYmxlQmFyRHJhZyA9IHRydWUsXG4gICAgc2hvd0RvbWFpblRpbWVzID0gdHJ1ZSxcbiAgICBoZWlnaHQgPSBQUk9HUkVTU19CQVJfSEVJR0hULFxuICAgIGNsYXNzTmFtZSA9IG51bGwsXG4gICAgc3R5bGVcbiAgfSkgPT4ge1xuICAgIGNvbnN0IG9uVGhyb3R0bGVVcGRhdGUgPSB1c2VNZW1vKCgpID0+IHRocm90dGxlKHNldFRpbWVsaW5lVmFsdWUsIDIwKSwgW3NldFRpbWVsaW5lVmFsdWVdKTtcblxuICAgIGNvbnN0IHtzdGVwLCBkb21haW4sIHZhbHVlLCB0aW1lRm9ybWF0LCBkZWZhdWx0VGltZUZvcm1hdCwgdGltZXpvbmUsIGFuaW1hdGlvbldpbmRvdywgbWFya3N9ID1cbiAgICAgIHRpbWVsaW5lO1xuXG4gICAgY29uc3QgaXNSYW5nZWQgPSB1c2VNZW1vKFxuICAgICAgKCkgPT5cbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAyICYmIGFuaW1hdGlvbldpbmRvdyAhPT0gQU5JTUFUSU9OX1dJTkRPVy5pbnRlcnZhbCxcbiAgICAgIFthbmltYXRpb25XaW5kb3csIHZhbHVlXVxuICAgICk7XG5cbiAgICBjb25zdCBbdmFsdWUwLCB2YWx1ZTFdOiBbbnVtYmVyLCBudW1iZXJdID0gdXNlTWVtbyhcbiAgICAgICgpID0+IFtpc1JhbmdlZCA/IHZhbHVlWzBdIDogbnVsbCwgaXNSYW5nZWQgPyB2YWx1ZVsxXSA6IHZhbHVlWzBdXSxcbiAgICAgIFtpc1JhbmdlZCwgdmFsdWVdXG4gICAgKTtcblxuICAgIGNvbnN0IFtvblNsaWRlcjBDaGFuZ2UsIG9uU2xpZGVyMUNoYW5nZV0gPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIGlmICghZG9tYWluKSByZXR1cm4gW25vb3AsIG5vb3BdO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgaXNSYW5nZWQgPyAobmV3VmFsdWU6IG51bWJlcikgPT4gb25UaHJvdHRsZVVwZGF0ZShbY2xhbXAoZG9tYWluLCBuZXdWYWx1ZSksIHZhbHVlMV0pIDogbm9vcCxcbiAgICAgICAgaXNSYW5nZWRcbiAgICAgICAgICA/IChuZXdWYWx1ZTogbnVtYmVyKSA9PiBvblRocm90dGxlVXBkYXRlKFt2YWx1ZTAsIGNsYW1wKGRvbWFpbiwgbmV3VmFsdWUpXSlcbiAgICAgICAgICA6IChuZXdWYWx1ZTogbnVtYmVyKSA9PlxuICAgICAgICAgICAgICBvblRocm90dGxlVXBkYXRlKFxuICAgICAgICAgICAgICAgIGFuaW1hdGlvbldpbmRvdyA9PT0gQU5JTUFUSU9OX1dJTkRPVy5pbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgPyAvLyBmaWx0ZXIgcmVxdWlyZXMgYW4gYXJyYXkgd2l0aCAyIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICBbY2xhbXAoZG9tYWluLCBuZXdWYWx1ZSksIGNsYW1wKGRvbWFpbiwgbmV3VmFsdWUpXVxuICAgICAgICAgICAgICAgICAgOiAvLyBhbmltYXRpb25Db25maWcgb25seSByZXF1aXJlcyBvbmUgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgW2NsYW1wKGRvbWFpbiwgbmV3VmFsdWUpXVxuICAgICAgICAgICAgICApXG4gICAgICBdO1xuICAgIH0sIFthbmltYXRpb25XaW5kb3csIGRvbWFpbiwgaXNSYW5nZWQsIHZhbHVlMCwgdmFsdWUxLCBvblRocm90dGxlVXBkYXRlXSk7XG5cbiAgICBjb25zdCB0aW1lbGluZVNsaWRlclN0eWxlID0gdXNlTWVtbygoKSA9PiAoe2hlaWdodDogYCR7aGVpZ2h0fXB4YH0pLCBbaGVpZ2h0XSk7XG5cbiAgICBjb25zdCBbdGltZVN0YXJ0LCB0aW1lRW5kXSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgaWYgKCFzaG93RG9tYWluVGltZXMpIHtcbiAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzVXNlckZvcm1hdCA9IHR5cGVvZiB0aW1lRm9ybWF0ID09PSAnc3RyaW5nJztcbiAgICAgIGNvbnN0IGN1cnJlbnRGb3JtYXQgPSAoaGFzVXNlckZvcm1hdCA/IHRpbWVGb3JtYXQgOiBkZWZhdWx0VGltZUZvcm1hdCkgfHwgREVGQVVMVF9USU1FX0ZPUk1BVDtcbiAgICAgIGNvbnN0IGRhdGVGdW5jID0gZGF0ZXRpbWVGb3JtYXR0ZXIodGltZXpvbmUpKGN1cnJlbnRGb3JtYXQpO1xuXG4gICAgICByZXR1cm4gW2RvbWFpbiA/IGRhdGVGdW5jKGRvbWFpblswXSkgOiAnJywgZG9tYWluID8gZGF0ZUZ1bmMoZG9tYWluWzFdKSA6ICcnXTtcbiAgICB9LCBbZG9tYWluLCB0aW1lem9uZSwgdGltZUZvcm1hdCwgZGVmYXVsdFRpbWVGb3JtYXQsIHNob3dEb21haW5UaW1lc10pO1xuXG4gICAgY29uc3QgcmVxdWlyZXNSYW5nZVNsaWRlciA9IGlzUmFuZ2VkICYmIGFuaW1hdGlvbldpbmRvdyAhPT0gQU5JTUFUSU9OX1dJTkRPVy5pbnRlcnZhbDtcblxuICAgIHJldHVybiAoXG4gICAgICA8QW5pbWF0aW9uQ29udHJvbFNsaWRlclxuICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnYW5pbWF0aW9uLWNvbnRyb2xfX3RpbWUtc2xpZGVyJywgY2xhc3NOYW1lKX1cbiAgICAgID5cbiAgICAgICAge3RpbWVTdGFydCA/IChcbiAgICAgICAgICA8U3R5bGVkRG9tYWluIGNsYXNzTmFtZT1cImRvbWFpbi1zdGFydFwiPlxuICAgICAgICAgICAgPHNwYW4+e3RpbWVTdGFydH08L3NwYW4+XG4gICAgICAgICAgPC9TdHlsZWREb21haW4+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgICA8U2xpZGVyV3JhcHBlciBjbGFzc05hbWU9XCJhbmltYXRpb24tY29udHJvbF9fc2xpZGVyXCI+XG4gICAgICAgICAgPFN0eWxlZFNsaWRlclxuICAgICAgICAgICAgaXNSYW5nZWQ9e3JlcXVpcmVzUmFuZ2VTbGlkZXJ9XG4gICAgICAgICAgICBzdGVwPXtzdGVwIHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICAgIG1pblZhbHVlPXtkb21haW4gPyBkb21haW5bMF0gOiAwfVxuICAgICAgICAgICAgbWF4VmFsdWU9e2RvbWFpbiA/IGRvbWFpblsxXSA6IDF9XG4gICAgICAgICAgICBlbmFibGVCYXJEcmFnPXtlbmFibGVCYXJEcmFnfVxuICAgICAgICAgICAgc3R5bGU9e3RpbWVsaW5lU2xpZGVyU3R5bGV9XG4gICAgICAgICAgICBvblNsaWRlcjBDaGFuZ2U9e29uU2xpZGVyMENoYW5nZX1cbiAgICAgICAgICAgIG9uU2xpZGVyMUNoYW5nZT17b25TbGlkZXIxQ2hhbmdlfVxuICAgICAgICAgICAgdmFsdWUwPXt2YWx1ZTB9XG4gICAgICAgICAgICB2YWx1ZTE9e3ZhbHVlMX1cbiAgICAgICAgICAgIG1hcmtzPXttYXJrc31cbiAgICAgICAgICAvPlxuICAgICAgICA8L1NsaWRlcldyYXBwZXI+XG4gICAgICAgIHt0aW1lRW5kID8gKFxuICAgICAgICAgIDxTdHlsZWREb21haW4gY2xhc3NOYW1lPVwiZG9tYWluLWVuZFwiPlxuICAgICAgICAgICAgPHNwYW4+e3RpbWVFbmR9PC9zcGFuPlxuICAgICAgICAgIDwvU3R5bGVkRG9tYWluPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgIDwvQW5pbWF0aW9uQ29udHJvbFNsaWRlcj5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBUaW1lbGluZVNsaWRlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVGltZWxpbmVTbGlkZXJGYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUYsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFVBQUEsR0FBQVAsT0FBQTtBQUVBLElBQUFRLE9BQUEsR0FBQU4sc0JBQUEsQ0FBQUYsT0FBQTtBQUFx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RUFBRUMsaUJBQWlCLEVBQUVaLGVBQWUsQ0FBQyxDQUFDO01BQUF5QyxTQUFBLE9BQUFqQixlQUFBLGFBQUFXLFNBQUE7TUFWL0RPLFNBQVMsR0FBQUQsU0FBQTtNQUFFRSxPQUFPLEdBQUFGLFNBQUE7SUFZekIsSUFBTUcsbUJBQW1CLEdBQUc1QixRQUFRLElBQUlGLGVBQWUsS0FBS00sMkJBQWdCLENBQUNDLFFBQVE7SUFFckYsb0JBQ0VwRixNQUFBLFlBQUE0RyxhQUFBLENBQUN0RSxzQkFBc0I7TUFDckI2QixLQUFLLEVBQUVBLEtBQU07TUFDYmpCLFNBQVMsRUFBRSxJQUFBQyxzQkFBVSxFQUFDLGdDQUFnQyxFQUFFRCxTQUFTO0lBQUUsR0FFbEV1RCxTQUFTLGdCQUNSekcsTUFBQSxZQUFBNEcsYUFBQSxDQUFDN0QsWUFBWTtNQUFDRyxTQUFTLEVBQUM7SUFBYyxnQkFDcENsRCxNQUFBLFlBQUE0RyxhQUFBLGVBQU9ILFNBQWdCLENBQ1gsQ0FBQyxHQUNiLElBQUksZUFDUnpHLE1BQUEsWUFBQTRHLGFBQUEsQ0FBQ2xFLGFBQWE7TUFBQ1EsU0FBUyxFQUFDO0lBQTJCLGdCQUNsRGxELE1BQUEsWUFBQTRHLGFBQUEsQ0FBQy9ELFlBQVk7TUFDWGtDLFFBQVEsRUFBRTRCLG1CQUFvQjtNQUM5QnBDLElBQUksRUFBRUEsSUFBSSxJQUFJc0MsU0FBVTtNQUN4QkMsUUFBUSxFQUFFdEMsTUFBTSxHQUFHQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBRTtNQUNqQ3VDLFFBQVEsRUFBRXZDLE1BQU0sR0FBR0EsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUU7TUFDakNYLGFBQWEsRUFBRUEsYUFBYztNQUM3Qk0sS0FBSyxFQUFFNkIsbUJBQW9CO01BQzNCRixlQUFlLEVBQUVBLGVBQWdCO01BQ2pDQyxlQUFlLEVBQUVBLGVBQWdCO01BQ2pDUCxNQUFNLEVBQUVBLE1BQU87TUFDZkMsTUFBTSxFQUFFQSxNQUFPO01BQ2ZYLEtBQUssRUFBRUE7SUFBTSxDQUNkLENBQ1ksQ0FBQyxFQUNmNEIsT0FBTyxnQkFDTjFHLE1BQUEsWUFBQTRHLGFBQUEsQ0FBQzdELFlBQVk7TUFBQ0csU0FBUyxFQUFDO0lBQVksZ0JBQ2xDbEQsTUFBQSxZQUFBNEcsYUFBQSxlQUFPRixPQUFjLENBQ1QsQ0FBQyxHQUNiLElBQ2tCLENBQUM7RUFFN0IsQ0FBQztFQUVELE9BQU9sRCxjQUFjO0FBQ3ZCO0FBQUMsSUFBQXdELFFBQUEsR0FBQUMsT0FBQSxjQUVjMUQscUJBQXFCIiwiaWdub3JlTGlzdCI6W119
;