UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

286 lines (239 loc) 28 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); 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 _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _d3Scale = require("d3-scale"); var _moment = _interopRequireDefault(require("moment")); var _d3Array = require("d3-array"); var _reselect = require("reselect"); var _reactVis = require("react-vis"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _rangeBrush = _interopRequireDefault(require("./range-brush")); var _filterUtils = require("../../utils/filter-utils"); var _base = require("../../styles/base"); function _templateObject2() { var data = (0, _taggedTemplateLiteral2["default"])(["\n background-color: #d3d8e0;\n border-radius: 2px;\n color: ", ";\n font-size: 9px;\n margin: 4px;\n padding: 3px 6px;\n pointer-events: none;\n user-select: none;\n"]); _templateObject2 = function _templateObject2() { return data; }; return data; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _templateObject() { var data = (0, _taggedTemplateLiteral2["default"])(["\n .rv-xy-plot__inner path {\n fill: none;\n stroke-width: 1.5;\n }\n"]); _templateObject = function _templateObject() { return data; }; return data; } var chartMargin = { top: 18, bottom: 0, left: 0, right: 0 }; var chartH = 52; var containerH = 78; var histogramStyle = { highlightW: 0.7, unHighlightedW: 0.4, highlightedColor: _base.theme.activeColor, unHighlightedColor: _base.theme.sliderBarColor }; var RangePlot = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(RangePlot, _Component); function RangePlot() { var _getPrototypeOf2; var _this; (0, _classCallCheck2["default"])(this, RangePlot); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(RangePlot)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", { hoveredDP: null }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "domainSelector", function (props) { return props.lineChart && props.lineChart.xDomain; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "hintFormatter", (0, _reselect.createSelector)(_this.domainSelector, function (domain) { return (0, _filterUtils.getTimeWidgetHintFormatter)(domain); })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onMouseMove", function (hoveredDP) { _this.setState({ hoveredDP: hoveredDP }); }); return _this; } (0, _createClass2["default"])(RangePlot, [{ key: "render", value: function render() { var _this$props = this.props, onBrush = _this$props.onBrush, range = _this$props.range, value = _this$props.value, width = _this$props.width, plotType = _this$props.plotType, lineChart = _this$props.lineChart, histogram = _this$props.histogram; var domain = [histogram[0].x0, histogram[histogram.length - 1].x1]; var brushComponent = _react["default"].createElement(_rangeBrush["default"], { domain: domain, onBrush: onBrush, range: range, value: value, width: width }); return _react["default"].createElement("div", { style: { height: "".concat(containerH, "px"), position: 'relative' } }, plotType === 'lineChart' ? _react["default"].createElement(LineChart, { hoveredDP: this.state.hoveredDP, width: width, height: containerH, margin: chartMargin, children: brushComponent, onMouseMove: this.onMouseMove, yDomain: lineChart.yDomain, hintFormat: this.hintFormatter(this.props), data: lineChart.series }) : _react["default"].createElement(Histogram, { width: width, height: chartH, value: value, margin: chartMargin, histogram: histogram, brushComponent: brushComponent })); } }]); return RangePlot; }(_react.Component); exports["default"] = RangePlot; (0, _defineProperty2["default"])(RangePlot, "propTypes", { value: _propTypes["default"].arrayOf(_propTypes["default"].number).isRequired, histogram: _propTypes["default"].arrayOf(_propTypes["default"].shape({ x0: _propTypes["default"].number, x1: _propTypes["default"].number })), lineChart: _propTypes["default"].object, plotType: _propTypes["default"].string, isEnlarged: _propTypes["default"].bool, onBlur: _propTypes["default"].func, width: _propTypes["default"].number.isRequired }); var Histogram = function Histogram(_ref) { var width = _ref.width, height = _ref.height, margin = _ref.margin, histogram = _ref.histogram, value = _ref.value, brushComponent = _ref.brushComponent; var domain = [histogram[0].x0, histogram[histogram.length - 1].x1]; var barWidth = width / histogram.length; var x = (0, _d3Scale.scaleLinear)().domain(domain).range([0, width]); var y = (0, _d3Scale.scaleLinear)().domain([0, (0, _d3Array.max)(histogram, function (d) { return d.count; })]).range([0, height]); return _react["default"].createElement("svg", { width: width, height: height, style: { marginTop: "".concat(margin.top, "px") } }, _react["default"].createElement("g", { className: "histogram-bars" }, histogram.map(function (bar) { var inRange = bar.x0 >= value[0] && bar.x1 <= value[1]; var fill = inRange ? histogramStyle.highlightedColor : histogramStyle.unHighlightedColor; var wRatio = inRange ? histogramStyle.highlightW : histogramStyle.unHighlightedW; return _react["default"].createElement("rect", { key: bar.x0, fill: fill, height: y(bar.count), width: barWidth * wRatio, x: x(bar.x0) + barWidth * (1 - wRatio) / 2, rx: 1, ry: 1, y: height - y(bar.count) }); })), brushComponent); }; var LineChartWrapper = _styledComponents["default"].div(_templateObject()); var LineChart = function LineChart(_ref2) { var width = _ref2.width, height = _ref2.height, yDomain = _ref2.yDomain, hintFormat = _ref2.hintFormat, hoveredDP = _ref2.hoveredDP, margin = _ref2.margin, color = _ref2.color, data = _ref2.data, onMouseMove = _ref2.onMouseMove, children = _ref2.children; var brushData = [{ x: data[0].x, y: yDomain[1], customComponent: function customComponent() { return children; } }]; return _react["default"].createElement(LineChartWrapper, null, _react["default"].createElement(_reactVis.XYPlot, { width: width, height: height, margin: _objectSpread({}, margin, { bottom: 12 }) }, _react["default"].createElement(_reactVis.LineSeries, { strokeWidth: 2, color: color, data: data, onNearestX: onMouseMove }), _react["default"].createElement(_reactVis.MarkSeries, { data: hoveredDP ? [hoveredDP] : [], color: color, size: 3 }), _react["default"].createElement(_reactVis.CustomSVGSeries, { data: brushData }), hoveredDP ? _react["default"].createElement(_reactVis.Hint, { value: hoveredDP }, _react["default"].createElement(HintContent, (0, _extends2["default"])({}, hoveredDP, { format: function format(val) { return _moment["default"].utc(val).format(hintFormat); } }))) : null)); }; var StyledHint = _styledComponents["default"].div(_templateObject2(), function (props) { return props.theme.textColorLT; }); var HintContent = function HintContent(_ref3) { var x = _ref3.x, y = _ref3.y, format = _ref3.format; return _react["default"].createElement(StyledHint, null, _react["default"].createElement("div", { className: "hint--x" }, format(x)), _react["default"].createElement("div", { className: "row" }, y)); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9yYW5nZS1wbG90LmpzIl0sIm5hbWVzIjpbImNoYXJ0TWFyZ2luIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiY2hhcnRIIiwiY29udGFpbmVySCIsImhpc3RvZ3JhbVN0eWxlIiwiaGlnaGxpZ2h0VyIsInVuSGlnaGxpZ2h0ZWRXIiwiaGlnaGxpZ2h0ZWRDb2xvciIsInRoZW1lIiwiYWN0aXZlQ29sb3IiLCJ1bkhpZ2hsaWdodGVkQ29sb3IiLCJzbGlkZXJCYXJDb2xvciIsIlJhbmdlUGxvdCIsImhvdmVyZWREUCIsInByb3BzIiwibGluZUNoYXJ0IiwieERvbWFpbiIsImRvbWFpblNlbGVjdG9yIiwiZG9tYWluIiwic2V0U3RhdGUiLCJvbkJydXNoIiwicmFuZ2UiLCJ2YWx1ZSIsIndpZHRoIiwicGxvdFR5cGUiLCJoaXN0b2dyYW0iLCJ4MCIsImxlbmd0aCIsIngxIiwiYnJ1c2hDb21wb25lbnQiLCJoZWlnaHQiLCJwb3NpdGlvbiIsInN0YXRlIiwib25Nb3VzZU1vdmUiLCJ5RG9tYWluIiwiaGludEZvcm1hdHRlciIsInNlcmllcyIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsImFycmF5T2YiLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwic2hhcGUiLCJvYmplY3QiLCJzdHJpbmciLCJpc0VubGFyZ2VkIiwiYm9vbCIsIm9uQmx1ciIsImZ1bmMiLCJIaXN0b2dyYW0iLCJtYXJnaW4iLCJiYXJXaWR0aCIsIngiLCJ5IiwiZCIsImNvdW50IiwibWFyZ2luVG9wIiwibWFwIiwiYmFyIiwiaW5SYW5nZSIsImZpbGwiLCJ3UmF0aW8iLCJMaW5lQ2hhcnRXcmFwcGVyIiwic3R5bGVkIiwiZGl2IiwiTGluZUNoYXJ0IiwiaGludEZvcm1hdCIsImNvbG9yIiwiZGF0YSIsImNoaWxkcmVuIiwiYnJ1c2hEYXRhIiwiY3VzdG9tQ29tcG9uZW50IiwidmFsIiwibW9tZW50IiwidXRjIiwiZm9ybWF0Iiwi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Qjs7QUFVQSxJQUFNQyxXQUFXLEdBQUcsU0FBZEEsV0FBYztBQUFBLE1BQUUxQixDQUFGLFNBQUVBLENBQUY7QUFBQSxNQUFLQyxDQUFMLFNBQUtBLENBQUw7QUFBQSxNQUFRc0IsTUFBUixTQUFRQSxNQUFSO0FBQUEsU0FDbEIsZ0NBQUMsVUFBRCxRQUNFO0FBQUssSUFBQSxTQUFTLEVBQUM7QUFBZixLQUEwQkEsTUFBTSxDQUFDdkIsQ0FBRCxDQUFoQyxDQURGLEVBRUU7QUFBSyxJQUFBLFNBQVMsRUFBQztBQUFmLEtBQXNCQyxDQUF0QixDQUZGLENBRGtCO0FBQUEsQ0FBcEIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge3NjYWxlTGluZWFyfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge21heH0gZnJvbSAnZDMtYXJyYXknO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuaW1wb3J0IHtMaW5lU2VyaWVzLCBYWVBsb3QsIEN1c3RvbVNWR1NlcmllcywgSGludCwgTWFya1Nlcmllc30gZnJvbSAncmVhY3QtdmlzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFJhbmdlQnJ1c2ggZnJvbSAnLi9yYW5nZS1icnVzaCc7XG5pbXBvcnQge2dldFRpbWVXaWRnZXRIaW50Rm9ybWF0dGVyfSBmcm9tICd1dGlscy9maWx0ZXItdXRpbHMnO1xuaW1wb3J0IHt0aGVtZX0gZnJvbSAnc3R5bGVzL2Jhc2UnO1xuXG5jb25zdCBjaGFydE1hcmdpbiA9IHt0b3A6IDE4LCBib3R0b206IDAsIGxlZnQ6IDAsIHJpZ2h0OiAwfTtcbmNvbnN0IGNoYXJ0SCA9IDUyO1xuY29uc3QgY29udGFpbmVySCA9IDc4O1xuY29uc3QgaGlzdG9ncmFtU3R5bGUgPSB7XG4gIGhpZ2hsaWdodFc6IDAuNyxcbiAgdW5IaWdobGlnaHRlZFc6IDAuNCxcbiAgaGlnaGxpZ2h0ZWRDb2xvcjogdGhlbWUuYWN0aXZlQ29sb3IsXG4gIHVuSGlnaGxpZ2h0ZWRDb2xvcjogdGhlbWUuc2xpZGVyQmFyQ29sb3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhbmdlUGxvdCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgdmFsdWU6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLmlzUmVxdWlyZWQsXG4gICAgaGlzdG9ncmFtOiBQcm9wVHlwZXMuYXJyYXlPZihcbiAgICAgIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIHgwOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgICB4MTogUHJvcFR5cGVzLm51bWJlclxuICAgICAgfSlcbiAgICApLFxuICAgIGxpbmVDaGFydDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBwbG90VHlwZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBpc0VubGFyZ2VkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWRcbiAgfTtcblxuICBzdGF0ZSA9IHtcbiAgICBob3ZlcmVkRFA6IG51bGxcbiAgfTtcblxuICBkb21haW5TZWxlY3RvciA9IHByb3BzID0+IHByb3BzLmxpbmVDaGFydCAmJiBwcm9wcy5saW5lQ2hhcnQueERvbWFpbjtcbiAgaGludEZvcm1hdHRlciA9IGNyZWF0ZVNlbGVjdG9yKHRoaXMuZG9tYWluU2VsZWN0b3IsIGRvbWFpbiA9PlxuICAgIGdldFRpbWVXaWRnZXRIaW50Rm9ybWF0dGVyKGRvbWFpbilcbiAgKTtcblxuICBvbk1vdXNlTW92ZSA9IGhvdmVyZWREUCA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7aG92ZXJlZERQfSk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG9uQnJ1c2gsXG4gICAgICByYW5nZSxcbiAgICAgIHZhbHVlLFxuICAgICAgd2lkdGgsXG4gICAgICBwbG90VHlwZSxcbiAgICAgIGxpbmVDaGFydCxcbiAgICAgIGhpc3RvZ3JhbVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGRvbWFpbiA9IFtoaXN0b2dyYW1bMF0ueDAsIGhpc3RvZ3JhbVtoaXN0b2dyYW0ubGVuZ3RoIC0gMV0ueDFdO1xuXG4gICAgY29uc3QgYnJ1c2hDb21wb25lbnQgPSAoXG4gICAgICA8UmFuZ2VCcnVzaFxuICAgICAgICBkb21haW49e2RvbWFpbn1cbiAgICAgICAgb25CcnVzaD17b25CcnVzaH1cbiAgICAgICAgcmFuZ2U9e3JhbmdlfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIHdpZHRoPXt3aWR0aH1cbiAgICAgIC8+XG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgaGVpZ2h0OiBgJHtjb250YWluZXJIfXB4YCxcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7cGxvdFR5cGUgPT09ICdsaW5lQ2hhcnQnID8gKFxuICAgICAgICAgIDxMaW5lQ2hhcnRcbiAgICAgICAgICAgIGhvdmVyZWREUD17dGhpcy5zdGF0ZS5ob3ZlcmVkRFB9XG4gICAgICAgICAgICB3aWR0aD17d2lkdGh9XG4gICAgICAgICAgICBoZWlnaHQ9e2NvbnRhaW5lckh9XG4gICAgICAgICAgICBtYXJnaW49e2NoYXJ0TWFyZ2lufVxuICAgICAgICAgICAgY2hpbGRyZW49e2JydXNoQ29tcG9uZW50fVxuICAgICAgICAgICAgb25Nb3VzZU1vdmU9e3RoaXMub25Nb3VzZU1vdmV9XG4gICAgICAgICAgICB5RG9tYWluPXtsaW5lQ2hhcnQueURvbWFpbn1cbiAgICAgICAgICAgIGhpbnRGb3JtYXQ9e3RoaXMuaGludEZvcm1hdHRlcih0aGlzLnByb3BzKX1cbiAgICAgICAgICAgIGRhdGE9e2xpbmVDaGFydC5zZXJpZXN9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8SGlzdG9ncmFtXG4gICAgICAgICAgICB3aWR0aD17d2lkdGh9XG4gICAgICAgICAgICBoZWlnaHQ9e2NoYXJ0SH1cbiAgICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgICAgIG1hcmdpbj17Y2hhcnRNYXJnaW59XG4gICAgICAgICAgICBoaXN0b2dyYW09e2hpc3RvZ3JhbX1cbiAgICAgICAgICAgIGJydXNoQ29tcG9uZW50PXticnVzaENvbXBvbmVudH1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBIaXN0b2dyYW0gPSAoe1xuICB3aWR0aCxcbiAgaGVpZ2h0LFxuICBtYXJnaW4sXG4gIGhpc3RvZ3JhbSxcbiAgdmFsdWUsXG4gIGJydXNoQ29tcG9uZW50XG59KSA9PiB7XG4gIGNvbnN0IGRvbWFpbiA9IFtoaXN0b2dyYW1bMF0ueDAsIGhpc3RvZ3JhbVtoaXN0b2dyYW0ubGVuZ3RoIC0gMV0ueDFdO1xuICBjb25zdCBiYXJXaWR0aCA9IHdpZHRoIC8gaGlzdG9ncmFtLmxlbmd0aDtcblxuICBjb25zdCB4ID0gc2NhbGVMaW5lYXIoKVxuICAgIC5kb21haW4oZG9tYWluKVxuICAgIC5yYW5nZShbMCwgd2lkdGhdKTtcblxuICBjb25zdCB5ID0gc2NhbGVMaW5lYXIoKVxuICAgIC5kb21haW4oWzAsIG1heChoaXN0b2dyYW0sIGQgPT4gZC5jb3VudCldKVxuICAgIC5yYW5nZShbMCwgaGVpZ2h0XSk7XG5cbiAgcmV0dXJuIChcbiAgICA8c3ZnIHdpZHRoPXt3aWR0aH0gaGVpZ2h0PXtoZWlnaHR9IHN0eWxlPXt7bWFyZ2luVG9wOiBgJHttYXJnaW4udG9wfXB4YH19PlxuICAgICAgPGcgY2xhc3NOYW1lPVwiaGlzdG9ncmFtLWJhcnNcIj5cbiAgICAgICAge2hpc3RvZ3JhbS5tYXAoYmFyID0+IHtcbiAgICAgICAgICBjb25zdCBpblJhbmdlID0gYmFyLngwID49IHZhbHVlWzBdICYmIGJhci54MSA8PSB2YWx1ZVsxXTtcbiAgICAgICAgICBjb25zdCBmaWxsID0gaW5SYW5nZSA/IGhpc3RvZ3JhbVN0eWxlLmhpZ2hsaWdodGVkQ29sb3IgOiBoaXN0b2dyYW1TdHlsZS51bkhpZ2hsaWdodGVkQ29sb3I7XG4gICAgICAgICAgY29uc3Qgd1JhdGlvID0gaW5SYW5nZSA/IGhpc3RvZ3JhbVN0eWxlLmhpZ2hsaWdodFcgOiBoaXN0b2dyYW1TdHlsZS51bkhpZ2hsaWdodGVkVztcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgICBrZXk9e2Jhci54MH1cbiAgICAgICAgICAgICAgZmlsbD17ZmlsbH1cbiAgICAgICAgICAgICAgaGVpZ2h0PXt5KGJhci5jb3VudCl9XG4gICAgICAgICAgICAgIHdpZHRoPXtiYXJXaWR0aCAqIHdSYXRpb31cbiAgICAgICAgICAgICAgeD17eChiYXIueDApICsgYmFyV2lkdGggKiAoMSAtIHdSYXRpbykgLyAyfVxuICAgICAgICAgICAgICByeD17MX1cbiAgICAgICAgICAgICAgcnk9ezF9XG4gICAgICAgICAgICAgIHk9e2hlaWdodCAtIHkoYmFyLmNvdW50KX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L2c+XG4gICAgICB7YnJ1c2hDb21wb25lbnR9XG4gICAgPC9zdmc+XG4gICk7XG59O1xuXG5jb25zdCBMaW5lQ2hhcnRXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgLnJ2LXh5LXBsb3RfX2lubmVyIHBhdGgge1xuICAgIGZpbGw6IG5vbmU7XG4gICAgc3Ryb2tlLXdpZHRoOiAxLjU7XG4gIH1cbmA7XG5cbmNvbnN0IExpbmVDaGFydCA9ICh7XG4gIHdpZHRoLFxuICBoZWlnaHQsXG4gIHlEb21haW4sXG4gIGhpbnRGb3JtYXQsXG4gIGhvdmVyZWREUCxcbiAgbWFyZ2luLFxuICBjb2xvcixcbiAgZGF0YSxcbiAgb25Nb3VzZU1vdmUsXG4gIGNoaWxkcmVuXG59KSA9PiB7XG4gIGNvbnN0IGJydXNoRGF0YSA9IFtcbiAgICB7eDogZGF0YVswXS54LCB5OiB5RG9tYWluWzFdLCBjdXN0b21Db21wb25lbnQ6ICgpID0+IGNoaWxkcmVufVxuICBdO1xuXG4gIHJldHVybiAoXG4gICAgPExpbmVDaGFydFdyYXBwZXI+XG4gICAgICA8WFlQbG90IHdpZHRoPXt3aWR0aH0gaGVpZ2h0PXtoZWlnaHR9IG1hcmdpbj17ey4uLm1hcmdpbiwgYm90dG9tOiAxMn19PlxuICAgICAgICA8TGluZVNlcmllc1xuICAgICAgICAgIHN0cm9rZVdpZHRoPXsyfVxuICAgICAgICAgIGNvbG9yPXtjb2xvcn1cbiAgICAgICAgICBkYXRhPXtkYXRhfVxuICAgICAgICAgIG9uTmVhcmVzdFg9e29uTW91c2VNb3ZlfVxuICAgICAgICAvPlxuICAgICAgICA8TWFya1Nlcmllc1xuICAgICAgICAgIGRhdGE9e2hvdmVyZWREUCA/IFtob3ZlcmVkRFBdIDogW119XG4gICAgICAgICAgY29sb3I9e2NvbG9yfVxuICAgICAgICAgIHNpemU9ezN9XG4gICAgICAgIC8+XG4gICAgICAgIDxDdXN0b21TVkdTZXJpZXMgZGF0YT17YnJ1c2hEYXRhfSAvPlxuICAgICAgICB7aG92ZXJlZERQID8gKFxuICAgICAgICAgIDxIaW50IHZhbHVlPXtob3ZlcmVkRFB9PlxuICAgICAgICAgICAgPEhpbnRDb250ZW50XG4gICAgICAgICAgICAgIHsuLi5ob3ZlcmVkRFB9XG4gICAgICAgICAgICAgIGZvcm1hdD17dmFsID0+IG1vbWVudC51dGModmFsKS5mb3JtYXQoaGludEZvcm1hdCl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvSGludD5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICA8L1hZUGxvdD5cbiAgICA8L0xpbmVDaGFydFdyYXBwZXI+XG4gICk7XG59O1xuXG5jb25zdCBTdHlsZWRIaW50ID0gc3R5bGVkLmRpdmBcbiAgYmFja2dyb3VuZC1jb2xvcjogI2QzZDhlMDtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JMVH07XG4gIGZvbnQtc2l6ZTogOXB4O1xuICBtYXJnaW46IDRweDtcbiAgcGFkZGluZzogM3B4IDZweDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xuYDtcbmNvbnN0IEhpbnRDb250ZW50ID0gKHt4LCB5LCBmb3JtYXR9KSA9PiAoXG4gIDxTdHlsZWRIaW50PlxuICAgIDxkaXYgY2xhc3NOYW1lPVwiaGludC0teFwiPntmb3JtYXQoeCl9PC9kaXY+XG4gICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj57eX08L2Rpdj5cbiAgPC9TdHlsZWRIaW50PlxuKTtcbiJdfQ==