kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
215 lines (185 loc) • 33.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.FilterAnimationControllerFactory = FilterAnimationControllerFactory;
exports.LayerAnimationControllerFactory = LayerAnimationControllerFactory;
exports["default"] = BottomWidgetFactory;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _timeWidget = _interopRequireDefault(require("./filters/time-widget"));
var _animationControl = _interopRequireDefault(require("./common/animation-control/animation-control"));
var _animationController = _interopRequireDefault(require("./common/animation-control/animation-controller"));
var _defaultSettings = require("../constants/default-settings");
var _filterUtils = require("../utils/filter-utils");
var _mediaBreakpoints = require("../styles/media-breakpoints");
var _templateObject, _templateObject2;
var maxWidth = 1080;
var BottomWidgetContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n padding-top: ", "px;\n padding-right: ", "px;\n padding-bottom: ", "px;\n padding-left: ", "px;\n pointer-events: none !important; /* prevent padding from blocking input */\n & > * {\n /* all children should allow input */\n pointer-events: all;\n }\n width: ", "px;\n z-index: 1;\n ", "\n"])), function (props) {
return props.hasPadding ? props.theme.bottomWidgetPaddingTop : 0;
}, function (props) {
return props.hasPadding ? props.theme.bottomWidgetPaddingRight : 0;
}, function (props) {
return props.hasPadding ? props.theme.bottomWidgetPaddingBottom : 0;
}, function (props) {
return props.hasPadding ? props.theme.bottomWidgetPaddingLeft : 0;
}, function (props) {
return props.width;
}, _mediaBreakpoints.media.portable(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["padding: 0;"]))));
FilterAnimationControllerFactory.deps = [_animationController["default"]];
function FilterAnimationControllerFactory(AnimationController) {
var FilterAnimationController = function FilterAnimationController(_ref) {
var filter = _ref.filter,
filterIdx = _ref.filterIdx,
setFilterAnimationTime = _ref.setFilterAnimationTime,
children = _ref.children;
var intervalBins = (0, _react.useMemo)(function () {
return (0, _filterUtils.getIntervalBins)(filter);
}, [filter]);
var steps = (0, _react.useMemo)(function () {
return intervalBins ? intervalBins.map(function (x) {
return x.x0;
}) : null;
}, [intervalBins]);
var updateAnimation = (0, _react.useCallback)(function (value) {
switch (filter.animationWindow) {
case _defaultSettings.ANIMATION_WINDOW.interval:
var idx = value[1];
setFilterAnimationTime(filterIdx, 'value', [intervalBins[idx].x0, intervalBins[idx].x1 - 1]);
break;
default:
setFilterAnimationTime(filterIdx, 'value', value);
break;
}
}, [filterIdx, intervalBins, filter.animationWindow, setFilterAnimationTime]);
return /*#__PURE__*/_react["default"].createElement(AnimationController, {
key: "filter-control",
value: filter.value,
domain: filter.domain,
speed: filter.speed,
isAnimating: filter.isAnimating,
animationWindow: filter.animationWindow,
steps: steps,
updateAnimation: updateAnimation,
children: children
});
};
return FilterAnimationController;
}
LayerAnimationControllerFactory.deps = [_animationController["default"]];
function LayerAnimationControllerFactory(AnimationController) {
var LayerAnimationController = function LayerAnimationController(_ref2) {
var animationConfig = _ref2.animationConfig,
setLayerAnimationTime = _ref2.setLayerAnimationTime,
children = _ref2.children;
return /*#__PURE__*/_react["default"].createElement(AnimationController, {
key: "layer-control",
value: animationConfig.currentTime,
domain: animationConfig.domain,
speed: animationConfig.speed,
isAnimating: animationConfig.isAnimating,
updateAnimation: setLayerAnimationTime,
steps: animationConfig.timeSteps,
animationWindow: animationConfig.timeSteps ? _defaultSettings.ANIMATION_WINDOW.interval : _defaultSettings.ANIMATION_WINDOW.point,
children: children
});
};
return LayerAnimationController;
}
BottomWidgetFactory.deps = [_timeWidget["default"], _animationControl["default"], FilterAnimationControllerFactory, LayerAnimationControllerFactory];
/* eslint-disable complexity */
function BottomWidgetFactory(TimeWidget, AnimationControl, FilterAnimationController, LayerAnimationController) {
var BottomWidget = function BottomWidget(props) {
var datasets = props.datasets,
filters = props.filters,
animationConfig = props.animationConfig,
visStateActions = props.visStateActions,
containerW = props.containerW,
uiState = props.uiState,
sidePanelWidth = props.sidePanelWidth,
layers = props.layers;
var activeSidePanel = uiState.activeSidePanel,
readOnly = uiState.readOnly;
var isOpen = Boolean(activeSidePanel);
var enlargedFilterIdx = (0, _react.useMemo)(function () {
return filters.findIndex(function (f) {
return f.enlarged && f.type === _defaultSettings.FILTER_TYPES.timeRange;
});
}, [filters]);
var animatedFilterIdx = (0, _react.useMemo)(function () {
return filters.findIndex(function (f) {
return f.isAnimating;
});
}, [filters]);
var animatedFilter = animatedFilterIdx > -1 ? filters[animatedFilterIdx] : null;
var enlargedFilterWidth = isOpen ? containerW - sidePanelWidth : containerW; // show playback control if layers contain trip layer & at least one trip layer is visible
var animatableLayer = (0, _react.useMemo)(function () {
return layers.filter(function (l) {
return l.config.animation && l.config.animation.enabled && l.config.isVisible;
});
}, [layers]);
var readyToAnimation = Array.isArray(animationConfig.domain) && Number.isFinite(animationConfig.currentTime); // if animation control is showing, hide time display in time slider
var showFloatingTimeDisplay = !animatableLayer.length;
var showAnimationControl = animatableLayer.length && readyToAnimation && !animationConfig.hideControl;
var showTimeWidget = enlargedFilterIdx > -1 && Object.keys(datasets).length > 0; // if filter is not animating, pass in enlarged filter here because
// animation controller needs to call reset on it
var filter = animatedFilter || filters[enlargedFilterIdx];
return /*#__PURE__*/_react["default"].createElement(BottomWidgetContainer, {
width: Math.min(maxWidth, enlargedFilterWidth),
className: "bottom-widget--container",
hasPadding: showAnimationControl || showTimeWidget
}, /*#__PURE__*/_react["default"].createElement(LayerAnimationController, {
animationConfig: animationConfig,
setLayerAnimationTime: visStateActions.setLayerAnimationTime
}, function (isAnimating, start, pause, reset) {
return showAnimationControl ? /*#__PURE__*/_react["default"].createElement(AnimationControl, {
animationConfig: animationConfig,
setLayerAnimationTime: visStateActions.setLayerAnimationTime,
updateAnimationSpeed: visStateActions.updateLayerAnimationSpeed,
toggleAnimation: visStateActions.toggleLayerAnimation,
isAnimatable: !animatedFilter,
isAnimating: isAnimating,
resetAnimation: reset
}) : null;
}), filter && /*#__PURE__*/_react["default"].createElement(FilterAnimationController, {
filter: filter,
filterIdx: animatedFilterIdx > -1 ? animatedFilterIdx : enlargedFilterIdx,
setFilterAnimationTime: visStateActions.setFilterAnimationTime
}, function (isAnimating, start, pause, resetAnimation) {
return showTimeWidget ? /*#__PURE__*/_react["default"].createElement(TimeWidget // TimeWidget uses React.memo, here we pass width
// even though it doesnt use it, to force rerender
, {
width: enlargedFilterWidth,
filter: filters[enlargedFilterIdx],
index: enlargedFilterIdx,
isAnyFilterAnimating: Boolean(animatedFilter),
datasets: datasets,
readOnly: readOnly,
showTimeDisplay: showFloatingTimeDisplay,
setFilterPlot: visStateActions.setFilterPlot,
setFilter: visStateActions.setFilter,
setFilterAnimationTime: visStateActions.setFilterAnimationTime,
setFilterAnimationWindow: visStateActions.setFilterAnimationWindow,
toggleAnimation: visStateActions.toggleFilterAnimation,
updateAnimationSpeed: visStateActions.updateFilterAnimationSpeed,
enlargeFilter: visStateActions.enlargeFilter,
resetAnimation: resetAnimation,
isAnimatable: !animationConfig || !animationConfig.isAnimating
}) : null;
}));
};
/* eslint-disable react/display-name */
// @ts-ignore
return /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
return /*#__PURE__*/_react["default"].createElement(BottomWidget, (0, _extends2["default"])({}, props, {
rootRef: ref
}));
});
/* eslint-enable react/display-name */
}
/* eslint-enable complexity */
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2JvdHRvbS13aWRnZXQuanMiXSwibmFtZXMiOlsibWF4V2lkdGgiLCJCb3R0b21XaWRnZXRDb250YWluZXIiLCJzdHlsZWQiLCJkaXYiLCJwcm9wcyIsImhhc1BhZGRpbmciLCJ0aGVtZSIsImJvdHRvbVdpZGdldFBhZGRpbmdUb3AiLCJib3R0b21XaWRnZXRQYWRkaW5nUmlnaHQiLCJib3R0b21XaWRnZXRQYWRkaW5nQm90dG9tIiwiYm90dG9tV2lkZ2V0UGFkZGluZ0xlZnQiLCJ3aWR0aCIsIm1lZGlhIiwicG9ydGFibGUiLCJGaWx0ZXJBbmltYXRpb25Db250cm9sbGVyRmFjdG9yeSIsImRlcHMiLCJBbmltYXRpb25Db250cm9sbGVyRmFjdG9yeSIsIkFuaW1hdGlvbkNvbnRyb2xsZXIiLCJGaWx0ZXJBbmltYXRpb25Db250cm9sbGVyIiwiZmlsdGVyIiwiZmlsdGVySWR4Iiwic2V0RmlsdGVyQW5pbWF0aW9uVGltZSIsImNoaWxkcmVuIiwiaW50ZXJ2YWxCaW5zIiwic3RlcHMiLCJtYXAiLCJ4IiwieDAiLCJ1cGRhdGVBbmltYXRpb24iLCJ2YWx1ZSIsImFuaW1hdGlvbldpbmRvdyIsIkFOSU1BVElPTl9XSU5ET1ciLCJpbnRlcnZhbCIsImlkeCIsIngxIiwiZG9tYWluIiwic3BlZWQiLCJpc0FuaW1hdGluZyIsIkxheWVyQW5pbWF0aW9uQ29udHJvbGxlckZhY3RvcnkiLCJMYXllckFuaW1hdGlvbkNvbnRyb2xsZXIiLCJhbmltYXRpb25Db25maWciLCJzZXRMYXllckFuaW1hdGlvblRpbWUiLCJjdXJyZW50VGltZSIsInRpbWVTdGVwcyIsInBvaW50IiwiQm90dG9tV2lkZ2V0RmFjdG9yeSIsIlRpbWVXaWRnZXRGYWN0b3J5IiwiQW5pbWF0aW9uQ29udHJvbEZhY3RvcnkiLCJUaW1lV2lkZ2V0IiwiQW5pbWF0aW9uQ29udHJvbCIsIkJvdHRvbVdpZGdldCIsImRhdGFzZXRzIiwiZmlsdGVycyIsInZpc1N0YXRlQWN0aW9ucyIsImNvbnRhaW5lclciLCJ1aVN0YXRlIiwic2lkZVBhbmVsV2lkdGgiLCJsYXllcnMiLCJhY3RpdmVTaWRlUGFuZWwiLCJyZWFkT25seSIsImlzT3BlbiIsIkJvb2xlYW4iLCJlbmxhcmdlZEZpbHRlcklkeCIsImZpbmRJbmRleCIsImYiLCJlbmxhcmdlZCIsInR5cGUiLCJGSUxURVJfVFlQRVMiLCJ0aW1lUmFuZ2UiLCJhbmltYXRlZEZpbHRlcklkeCIsImFuaW1hdGVkRmlsdGVyIiwiZW5sYXJnZWRGaWx0ZXJXaWR0aCIsImFuaW1hdGFibGVMYXllciIsImwiLCJjb25maWciLCJhbmltYXRpb24iLCJlbmFibGVkIiwiaXNWaXNpYmxlIiwicmVhZHlUb0FuaW1hdGlvbiIsIkFycmF5IiwiaXNBcnJheSIsIk51bWJlciIsImlzRmluaXRlIiwic2hvd0Zsb2F0aW5nVGltZURpc3BsYXkiLCJsZW5ndGgiLCJzaG93QW5pbWF0aW9uQ29udHJvbCIsImhpZGVDb250cm9sIiwic2hvd1RpbWVXaWRnZXQiLCJPYmplY3QiLCJrZXlzIiwiTWF0aCIsIm1pbiIsInN0YXJ0IiwicGF1c2UiLCJyZXNldCIsInVwZGF0ZUxheWVyQW5pbWF0aW9uU3BlZWQiLCJ0b2dnbGVMYXllckFuaW1hdGlvbiIsInJlc2V0QW5pbWF0aW9uIiwic2V0RmlsdGVyUGxvdCIsInNldEZpbHRlciIsInNldEZpbHRlckFuaW1hdGlvbldpbmRvdyIsInRvZ2dsZUZpbHRlckFuaW1hdGlvbiIsInVwZGF0ZUZpbHRlckFuaW1hdGlvblNwZWVkIiwiZW5sYXJnZUZpbHRlciIsInJlZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxJQUFNQSxRQUFRLEdBQUcsSUFBakI7O0FBRUEsSUFBTUMscUJBQXFCLEdBQUdDLDZCQUFPQyxHQUFWLHdiQUdWLFVBQUFDLEtBQUs7QUFBQSxTQUFLQSxLQUFLLENBQUNDLFVBQU4sR0FB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QUFELENBTi9CO0FBT0UsUUFBQSxRQUFRLEVBQUVuQixRQVBaO0FBUUUsUUFBQSxRQUFRLEVBQUVRLFFBUlo7QUFTRSxRQUFBLGVBQWUsRUFBRXdCLHVCQVRuQjtBQVVFLFFBQUEsYUFBYSxFQUFFOUIsZUFBZSxDQUFDNkMsYUFWakM7QUFXRSxRQUFBLFNBQVMsRUFBRTdDLGVBQWUsQ0FBQzhDLFNBWDdCO0FBWUUsUUFBQSxzQkFBc0IsRUFBRTlDLGVBQWUsQ0FBQ2hDLHNCQVoxQztBQWFFLFFBQUEsd0JBQXdCLEVBQUVnQyxlQUFlLENBQUMrQyx3QkFiNUM7QUFjRSxRQUFBLGVBQWUsRUFBRS9DLGVBQWUsQ0FBQ2dELHFCQWRuQztBQWVFLFFBQUEsb0JBQW9CLEVBQUVoRCxlQUFlLENBQUNpRCwwQkFmeEM7QUFnQkUsUUFBQSxhQUFhLEVBQUVqRCxlQUFlLENBQUNrRCxhQWhCakM7QUFpQkUsUUFBQSxjQUFjLEVBQUVOLGNBakJsQjtBQWtCRSxRQUFBLFlBQVksRUFBRSxDQUFDekQsZUFBRCxJQUFvQixDQUFDQSxlQUFlLENBQUNIO0FBbEJyRCxRQURZLEdBcUJWLElBdEJMO0FBQUEsS0FMSCxDQXhCSixDQURGO0FBMERELEdBckdEO0FBdUdBO0FBQ0E7OztBQUNBLHNCQUFPLHVCQUFXLFVBQUNqQyxLQUFELEVBQVFvRyxHQUFSO0FBQUEsd0JBQWdCLGdDQUFDLFlBQUQsZ0NBQWtCcEcsS0FBbEI7QUFBeUIsTUFBQSxPQUFPLEVBQUVvRztBQUFsQyxPQUFoQjtBQUFBLEdBQVgsQ0FBUDtBQUNBO0FBQ0Q7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCBmb3J3YXJkUmVmLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBUaW1lV2lkZ2V0RmFjdG9yeSBmcm9tICcuL2ZpbHRlcnMvdGltZS13aWRnZXQnO1xuaW1wb3J0IEFuaW1hdGlvbkNvbnRyb2xGYWN0b3J5IGZyb20gJy4vY29tbW9uL2FuaW1hdGlvbi1jb250cm9sL2FuaW1hdGlvbi1jb250cm9sJztcbmltcG9ydCBBbmltYXRpb25Db250cm9sbGVyRmFjdG9yeSBmcm9tICcuL2NvbW1vbi9hbmltYXRpb24tY29udHJvbC9hbmltYXRpb24tY29udHJvbGxlcic7XG5pbXBvcnQge0FOSU1BVElPTl9XSU5ET1csIEZJTFRFUl9UWVBFU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtnZXRJbnRlcnZhbEJpbnN9IGZyb20gJ3V0aWxzL2ZpbHRlci11dGlscyc7XG5pbXBvcnQge21lZGlhfSBmcm9tICdzdHlsZXMvbWVkaWEtYnJlYWtwb2ludHMnO1xuXG5jb25zdCBtYXhXaWR0aCA9IDEwODA7XG5cbmNvbnN0IEJvdHRvbVdpZGdldENvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHBhZGRpbmctdG9wOiAke3Byb3BzID0+IChwcm9wcy5oYXNQYWRkaW5nID8gcHJvcHMudGhlbWUuYm90dG9tV2lkZ2V0UGFkZGluZ1RvcCA6IDApfXB4O1xuICBwYWRkaW5nLXJpZ2h0OiAke3Byb3BzID0+IChwcm9wcy5oYXNQYWRkaW5nID8gcHJvcHMudGhlbWUuYm90dG9tV2lkZ2V0UGFkZGluZ1JpZ2h0IDogMCl9cHg7XG4gIHBhZGRpbmctYm90dG9tOiAke3Byb3BzID0+IChwcm9wcy5oYXNQYWRkaW5nID8gcHJvcHMudGhlbWUuYm90dG9tV2lkZ2V0UGFkZGluZ0JvdHRvbSA6IDApfXB4O1xuICBwYWRkaW5nLWxlZnQ6ICR7cHJvcHMgPT4gKHByb3BzLmhhc1BhZGRpbmcgPyBwcm9wcy50aGVtZS5ib3R0b21XaWRnZXRQYWRkaW5nTGVmdCA6IDApfXB4O1xuICBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50OyAvKiBwcmV2ZW50IHBhZGRpbmcgZnJvbSBibG9ja2luZyBpbnB1dCAqL1xuICAmID4gKiB7XG4gICAgLyogYWxsIGNoaWxkcmVuIHNob3VsZCBhbGxvdyBpbnB1dCAqL1xuICAgIHBvaW50ZXItZXZlbnRzOiBhbGw7XG4gIH1cbiAgd2lkdGg6ICR7cHJvcHMgPT4gcHJvcHMud2lkdGh9cHg7XG4gIHotaW5kZXg6IDE7XG4gICR7bWVkaWEucG9ydGFibGVgcGFkZGluZzogMDtgfVxuYDtcblxuRmlsdGVyQW5pbWF0aW9uQ29udHJvbGxlckZhY3RvcnkuZGVwcyA9IFtBbmltYXRpb25Db250cm9sbGVyRmFjdG9yeV07XG5leHBvcnQgZnVuY3Rpb24gRmlsdGVyQW5pbWF0aW9uQ29udHJvbGxlckZhY3RvcnkoQW5pbWF0aW9uQ29udHJvbGxlcikge1xuICBjb25zdCBGaWx0ZXJBbmltYXRpb25Db250cm9sbGVyID0gKHtmaWx0ZXIsIGZpbHRlcklkeCwgc2V0RmlsdGVyQW5pbWF0aW9uVGltZSwgY2hpbGRyZW59KSA9PiB7XG4gICAgY29uc3QgaW50ZXJ2YWxCaW5zID0gdXNlTWVtbygoKSA9PiBnZXRJbnRlcnZhbEJpbnMoZmlsdGVyKSwgW2ZpbHRlcl0pO1xuXG4gICAgY29uc3Qgc3RlcHMgPSB1c2VNZW1vKCgpID0+IChpbnRlcnZhbEJpbnMgPyBpbnRlcnZhbEJpbnMubWFwKHggPT4geC54MCkgOiBudWxsKSwgW1xuICAgICAgaW50ZXJ2YWxCaW5zXG4gICAgXSk7XG5cbiAgICBjb25zdCB1cGRhdGVBbmltYXRpb24gPSB1c2VDYWxsYmFjayhcbiAgICAgIHZhbHVlID0+IHtcbiAgICAgICAgc3dpdGNoIChmaWx0ZXIuYW5pbWF0aW9uV2luZG93KSB7XG4gICAgICAgICAgY2FzZSBBTklNQVRJT05fV0lORE9XLmludGVydmFsOlxuICAgICAgICAgICAgY29uc3QgaWR4ID0gdmFsdWVbMV07XG4gICAgICAgICAgICBzZXRGaWx0ZXJBbmltYXRpb25UaW1lKGZpbHRlcklkeCwgJ3ZhbHVlJywgW1xuICAgICAgICAgICAgICBpbnRlcnZhbEJpbnNbaWR4XS54MCxcbiAgICAgICAgICAgICAgaW50ZXJ2YWxCaW5zW2lkeF0ueDEgLSAxXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzZXRGaWx0ZXJBbmltYXRpb25UaW1lKGZpbHRlcklkeCwgJ3ZhbHVlJywgdmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbZmlsdGVySWR4LCBpbnRlcnZhbEJpbnMsIGZpbHRlci5hbmltYXRpb25XaW5kb3csIHNldEZpbHRlckFuaW1hdGlvblRpbWVdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8QW5pbWF0aW9uQ29udHJvbGxlclxuICAgICAgICBrZXk9XCJmaWx0ZXItY29udHJvbFwiXG4gICAgICAgIHZhbHVlPXtmaWx0ZXIudmFsdWV9XG4gICAgICAgIGRvbWFpbj17ZmlsdGVyLmRvbWFpbn1cbiAgICAgICAgc3BlZWQ9e2ZpbHRlci5zcGVlZH1cbiAgICAgICAgaXNBbmltYXRpbmc9e2ZpbHRlci5pc0FuaW1hdGluZ31cbiAgICAgICAgYW5pbWF0aW9uV2luZG93PXtmaWx0ZXIuYW5pbWF0aW9uV2luZG93fVxuICAgICAgICBzdGVwcz17c3RlcHN9XG4gICAgICAgIHVwZGF0ZUFuaW1hdGlvbj17dXBkYXRlQW5pbWF0aW9ufVxuICAgICAgICBjaGlsZHJlbj17Y2hpbGRyZW59XG4gICAgICAvPlxuICAgICk7XG4gIH07XG4gIHJldHVybiBGaWx0ZXJBbmltYXRpb25Db250cm9sbGVyO1xufVxuXG5MYXllckFuaW1hdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmRlcHMgPSBbQW5pbWF0aW9uQ29udHJvbGxlckZhY3RvcnldO1xuZXhwb3J0IGZ1bmN0aW9uIExheWVyQW5pbWF0aW9uQ29udHJvbGxlckZhY3RvcnkoQW5pbWF0aW9uQ29udHJvbGxlcikge1xuICBjb25zdCBMYXllckFuaW1hdGlvbkNvbnRyb2xsZXIgPSAoe2FuaW1hdGlvbkNvbmZpZywgc2V0TGF5ZXJBbmltYXRpb25UaW1lLCBjaGlsZHJlbn0pID0+IChcbiAgICA8QW5pbWF0aW9uQ29udHJvbGxlclxuICAgICAga2V5PVwibGF5ZXItY29udHJvbFwiXG4gICAgICB2YWx1ZT17YW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lfVxuICAgICAgZG9tYWluPXthbmltYXRpb25Db25maWcuZG9tYWlufVxuICAgICAgc3BlZWQ9e2FuaW1hdGlvbkNvbmZpZy5zcGVlZH1cbiAgICAgIGlzQW5pbWF0aW5nPXthbmltYXRpb25Db25maWcuaXNBbmltYXRpbmd9XG4gICAgICB1cGRhdGVBbmltYXRpb249e3NldExheWVyQW5pbWF0aW9uVGltZX1cbiAgICAgIHN0ZXBzPXthbmltYXRpb25Db25maWcudGltZVN0ZXBzfVxuICAgICAgYW5pbWF0aW9uV2luZG93PXtcbiAgICAgICAgYW5pbWF0aW9uQ29uZmlnLnRpbWVTdGVwcyA/IEFOSU1BVElPTl9XSU5ET1cuaW50ZXJ2YWwgOiBBTklNQVRJT05fV0lORE9XLnBvaW50XG4gICAgICB9XG4gICAgICBjaGlsZHJlbj17Y2hpbGRyZW59XG4gICAgLz5cbiAgKTtcbiAgcmV0dXJuIExheWVyQW5pbWF0aW9uQ29udHJvbGxlcjtcbn1cblxuQm90dG9tV2lkZ2V0RmFjdG9yeS5kZXBzID0gW1xuICBUaW1lV2lkZ2V0RmFjdG9yeSxcbiAgQW5pbWF0aW9uQ29udHJvbEZhY3RvcnksXG4gIEZpbHRlckFuaW1hdGlvbkNvbnRyb2xsZXJGYWN0b3J5LFxuICBMYXllckFuaW1hdGlvbkNvbnRyb2xsZXJGYWN0b3J5XG5dO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBCb3R0b21XaWRnZXRGYWN0b3J5KFxuICBUaW1lV2lkZ2V0LFxuICBBbmltYXRpb25Db250cm9sLFxuICBGaWx0ZXJBbmltYXRpb25Db250cm9sbGVyLFxuICBMYXllckFuaW1hdGlvbkNvbnRyb2xsZXJcbikge1xuICBjb25zdCBCb3R0b21XaWRnZXQgPSBwcm9wcyA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBmaWx0ZXJzLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgdmlzU3RhdGVBY3Rpb25zLFxuICAgICAgY29udGFpbmVyVyxcbiAgICAgIHVpU3RhdGUsXG4gICAgICBzaWRlUGFuZWxXaWR0aCxcbiAgICAgIGxheWVyc1xuICAgIH0gPSBwcm9wcztcblxuICAgIGNvbnN0IHthY3RpdmVTaWRlUGFuZWwsIHJlYWRPbmx5fSA9IHVpU3RhdGU7XG4gICAgY29uc3QgaXNPcGVuID0gQm9vbGVhbihhY3RpdmVTaWRlUGFuZWwpO1xuXG4gICAgY29uc3QgZW5sYXJnZWRGaWx0ZXJJZHggPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gZmlsdGVycy5maW5kSW5kZXgoZiA9PiBmLmVubGFyZ2VkICYmIGYudHlwZSA9PT0gRklMVEVSX1RZUEVTLnRpbWVSYW5nZSksXG4gICAgICBbZmlsdGVyc11cbiAgICApO1xuICAgIGNvbnN0IGFuaW1hdGVkRmlsdGVySWR4ID0gdXNlTWVtbygoKSA9PiBmaWx0ZXJzLmZpbmRJbmRleChmID0+IGYuaXNBbmltYXRpbmcpLCBbZmlsdGVyc10pO1xuICAgIGNvbnN0IGFuaW1hdGVkRmlsdGVyID0gYW5pbWF0ZWRGaWx0ZXJJZHggPiAtMSA/IGZpbHRlcnNbYW5pbWF0ZWRGaWx0ZXJJZHhdIDogbnVsbDtcblxuICAgIGNvbnN0IGVubGFyZ2VkRmlsdGVyV2lkdGggPSBpc09wZW4gPyBjb250YWluZXJXIC0gc2lkZVBhbmVsV2lkdGggOiBjb250YWluZXJXO1xuXG4gICAgLy8gc2hvdyBwbGF5YmFjayBjb250cm9sIGlmIGxheWVycyBjb250YWluIHRyaXAgbGF5ZXIgJiBhdCBsZWFzdCBvbmUgdHJpcCBsYXllciBpcyB2aXNpYmxlXG4gICAgY29uc3QgYW5pbWF0YWJsZUxheWVyID0gdXNlTWVtbyhcbiAgICAgICgpID0+XG4gICAgICAgIGxheWVycy5maWx0ZXIobCA9PiBsLmNvbmZpZy5hbmltYXRpb24gJiYgbC5jb25maWcuYW5pbWF0aW9uLmVuYWJsZWQgJiYgbC5jb25maWcuaXNWaXNpYmxlKSxcbiAgICAgIFtsYXllcnNdXG4gICAgKTtcblxuICAgIGNvbnN0IHJlYWR5VG9BbmltYXRpb24gPVxuICAgICAgQXJyYXkuaXNBcnJheShhbmltYXRpb25Db25maWcuZG9tYWluKSAmJiBOdW1iZXIuaXNGaW5pdGUoYW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lKTtcbiAgICAvLyBpZiBhbmltYXRpb24gY29udHJvbCBpcyBzaG93aW5nLCBoaWRlIHRpbWUgZGlzcGxheSBpbiB0aW1lIHNsaWRlclxuICAgIGNvbnN0IHNob3dGbG9hdGluZ1RpbWVEaXNwbGF5ID0gIWFuaW1hdGFibGVMYXllci5sZW5ndGg7XG4gICAgY29uc3Qgc2hvd0FuaW1hdGlvbkNvbnRyb2wgPVxuICAgICAgYW5pbWF0YWJsZUxheWVyLmxlbmd0aCAmJiByZWFkeVRvQW5pbWF0aW9uICYmICFhbmltYXRpb25Db25maWcuaGlkZUNvbnRyb2w7XG4gICAgY29uc3Qgc2hvd1RpbWVXaWRnZXQgPSBlbmxhcmdlZEZpbHRlcklkeCA+IC0xICYmIE9iamVjdC5rZXlzKGRhdGFzZXRzKS5sZW5ndGggPiAwO1xuXG4gICAgLy8gaWYgZmlsdGVyIGlzIG5vdCBhbmltYXRpbmcsIHBhc3MgaW4gZW5sYXJnZWQgZmlsdGVyIGhlcmUgYmVjYXVzZVxuICAgIC8vIGFuaW1hdGlvbiBjb250cm9sbGVyIG5lZWRzIHRvIGNhbGwgcmVzZXQgb24gaXRcbiAgICBjb25zdCBmaWx0ZXIgPSBhbmltYXRlZEZpbHRlciB8fCBmaWx0ZXJzW2VubGFyZ2VkRmlsdGVySWR4XTtcblxuICAgIHJldHVybiAoXG4gICAgICA8Qm90dG9tV2lkZ2V0Q29udGFpbmVyXG4gICAgICAgIHdpZHRoPXtNYXRoLm1pbihtYXhXaWR0aCwgZW5sYXJnZWRGaWx0ZXJXaWR0aCl9XG4gICAgICAgIGNsYXNzTmFtZT1cImJvdHRvbS13aWRnZXQtLWNvbnRhaW5lclwiXG4gICAgICAgIGhhc1BhZGRpbmc9e3Nob3dBbmltYXRpb25Db250cm9sIHx8IHNob3dUaW1lV2lkZ2V0fVxuICAgICAgPlxuICAgICAgICA8TGF5ZXJBbmltYXRpb25Db250cm9sbGVyXG4gICAgICAgICAgYW5pbWF0aW9uQ29uZmlnPXthbmltYXRpb25Db25maWd9XG4gICAgICAgICAgc2V0TGF5ZXJBbmltYXRpb25UaW1lPXt2aXNTdGF0ZUFjdGlvbnMuc2V0TGF5ZXJBbmltYXRpb25UaW1lfVxuICAgICAgICA+XG4gICAgICAgICAgeyhpc0FuaW1hdGluZywgc3RhcnQsIHBhdXNlLCByZXNldCkgPT5cbiAgICAgICAgICAgIHNob3dBbmltYXRpb25Db250cm9sID8gKFxuICAgICAgICAgICAgICA8QW5pbWF0aW9uQ29udHJvbFxuICAgICAgICAgICAgICAgIGFuaW1hdGlvbkNvbmZpZz17YW5pbWF0aW9uQ29uZmlnfVxuICAgICAgICAgICAgICAgIHNldExheWVyQW5pbWF0aW9uVGltZT17dmlzU3RhdGVBY3Rpb25zLnNldExheWVyQW5pbWF0aW9uVGltZX1cbiAgICAgICAgICAgICAgICB1cGRhdGVBbmltYXRpb25TcGVlZD17dmlzU3RhdGVBY3Rpb25zLnVwZGF0ZUxheWVyQW5pbWF0aW9uU3BlZWR9XG4gICAgICAgICAgICAgICAgdG9nZ2xlQW5pbWF0aW9uPXt2aXNTdGF0ZUFjdGlvbnMudG9nZ2xlTGF5ZXJBbmltYXRpb259XG4gICAgICAgICAgICAgICAgaXNBbmltYXRhYmxlPXshYW5pbWF0ZWRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgaXNBbmltYXRpbmc9e2lzQW5pbWF0aW5nfVxuICAgICAgICAgICAgICAgIHJlc2V0QW5pbWF0aW9uPXtyZXNldH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICA8L0xheWVyQW5pbWF0aW9uQ29udHJvbGxlcj5cbiAgICAgICAge2ZpbHRlciAmJiAoXG4gICAgICAgICAgPEZpbHRlckFuaW1hdGlvbkNvbnRyb2xsZXJcbiAgICAgICAgICAgIGZpbHRlcj17ZmlsdGVyfVxuICAgICAgICAgICAgZmlsdGVySWR4PXthbmltYXRlZEZpbHRlcklkeCA+IC0xID8gYW5pbWF0ZWRGaWx0ZXJJZHggOiBlbmxhcmdlZEZpbHRlcklkeH1cbiAgICAgICAgICAgIHNldEZpbHRlckFuaW1hdGlvblRpbWU9e3Zpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXJBbmltYXRpb25UaW1lfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsoaXNBbmltYXRpbmcsIHN0YXJ0LCBwYXVzZSwgcmVzZXRBbmltYXRpb24pID0+XG4gICAgICAgICAgICAgIHNob3dUaW1lV2lkZ2V0ID8gKFxuICAgICAgICAgICAgICAgIDxUaW1lV2lkZ2V0XG4gICAgICAgICAgICAgICAgICAvLyBUaW1lV2lkZ2V0IHVzZXMgUmVhY3QubWVtbywgaGVyZSB3ZSBwYXNzIHdpZHRoXG4gICAgICAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCBpdCBkb2VzbnQgdXNlIGl0LCB0byBmb3JjZSByZXJlbmRlclxuICAgICAgICAgICAgICAgICAgd2lkdGg9e2VubGFyZ2VkRmlsdGVyV2lkdGh9XG4gICAgICAgICAgICAgICAgICBmaWx0ZXI9e2ZpbHRlcnNbZW5sYXJnZWRGaWx0ZXJJZHhdfVxuICAgICAgICAgICAgICAgICAgaW5kZXg9e2VubGFyZ2VkRmlsdGVySWR4fVxuICAgICAgICAgICAgICAgICAgaXNBbnlGaWx0ZXJBbmltYXRpbmc9e0Jvb2xlYW4oYW5pbWF0ZWRGaWx0ZXIpfVxuICAgICAgICAgICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAgICAgICAgICAgICAgICAgcmVhZE9ubHk9e3JlYWRPbmx5fVxuICAgICAgICAgICAgICAgICAgc2hvd1RpbWVEaXNwbGF5PXtzaG93RmxvYXRpbmdUaW1lRGlzcGxheX1cbiAgICAgICAgICAgICAgICAgIHNldEZpbHRlclBsb3Q9e3Zpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXJQbG90fVxuICAgICAgICAgICAgICAgICAgc2V0RmlsdGVyPXt2aXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyfVxuICAgICAgICAgICAgICAgICAgc2V0RmlsdGVyQW5pbWF0aW9uVGltZT17dmlzU3RhdGVBY3Rpb25zLnNldEZpbHRlckFuaW1hdGlvblRpbWV9XG4gICAgICAgICAgICAgICAgICBzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3c9e3Zpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXJBbmltYXRpb25XaW5kb3d9XG4gICAgICAgICAgICAgICAgICB0b2dnbGVBbmltYXRpb249e3Zpc1N0YXRlQWN0aW9ucy50b2dnbGVGaWx0ZXJBbmltYXRpb259XG4gICAgICAgICAgICAgICAgICB1cGRhdGVBbmltYXRpb25TcGVlZD17dmlzU3RhdGVBY3Rpb25zLnVwZGF0ZUZpbHRlckFuaW1hdGlvblNwZWVkfVxuICAgICAgICAgICAgICAgICAgZW5sYXJnZUZpbHRlcj17dmlzU3RhdGVBY3Rpb25zLmVubGFyZ2VGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICByZXNldEFuaW1hdGlvbj17cmVzZXRBbmltYXRpb259XG4gICAgICAgICAgICAgICAgICBpc0FuaW1hdGFibGU9eyFhbmltYXRpb25Db25maWcgfHwgIWFuaW1hdGlvbkNvbmZpZy5pc0FuaW1hdGluZ31cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApIDogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvRmlsdGVyQW5pbWF0aW9uQ29udHJvbGxlcj5cbiAgICAgICAgKX1cbiAgICAgIDwvQm90dG9tV2lkZ2V0Q29udGFpbmVyPlxuICAgICk7XG4gIH07XG5cbiAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QvZGlzcGxheS1uYW1lICovXG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIGZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IDxCb3R0b21XaWRnZXQgey4uLnByb3BzfSByb290UmVmPXtyZWZ9IC8+KTtcbiAgLyogZXNsaW50LWVuYWJsZSByZWFjdC9kaXNwbGF5LW5hbWUgKi9cbn1cbi8qIGVzbGludC1lbmFibGUgY29tcGxleGl0eSAqL1xuIl19