kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
309 lines (307 loc) • 51 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = RangeSliderFactory;
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 _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react"));
var _reactLifecyclesCompat = require("react-lifecycles-compat");
var _reselect = require("reselect");
var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components"));
var _rangePlot = _interopRequireDefault(require("./range-plot"));
var _slider = _interopRequireDefault(require("./slider/slider"));
var _styledComponents2 = require("./styled-components");
var _rangeSliderTimelinePanel = _interopRequireDefault(require("../common/range-slider-timeline-panel"));
var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src");
var _templateObject, _templateObject2, _templateObject3; // 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 ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
var noop = function noop() {
return;
};
var SliderInput = (0, _styledComponents["default"])(_styledComponents2.Input)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: ", "px;\n margin-left: ", "px;\n font-size: ", "; // 10px // 12px;\n padding: ", "; // 4px 6px; // 6px 12px;\n"])), function (props) {
return props.theme.sliderInputWidth;
}, function (props) {
return props.$flush ? 0 : props.$inputSize === 'tiny' ? 12 : 18;
}, function (props) {
return props.theme.sliderInputFontSize;
}, function (props) {
return props.theme.sliderInputPadding;
});
var SliderWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n position: relative;\n align-items: ", ";\n"])), function (props) {
return !props.$isRanged && props.$showInput ? 'center' : 'flex-start';
});
var RangeInputWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 12px;\n display: flex;\n justify-content: space-between;\n"])));
var RANGE_SLIDER_TIMELINE_PANEL_STYLE = {
marginLeft: '-32px'
};
RangeSliderFactory.deps = [_rangePlot["default"], _rangeSliderTimelinePanel["default"]];
function RangeSliderFactory(RangePlot, RangeSliderSubAnimationPanel) {
var RangeSlider = /*#__PURE__*/function (_Component) {
function RangeSlider() {
var _this;
(0, _classCallCheck2["default"])(this, RangeSlider);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _callSuper(this, RangeSlider, [].concat(args));
(0, _defineProperty2["default"])(_this, "state", {
value0: 0,
value1: 1,
prevValue0: 0,
prevValue1: 1,
width: 288
});
(0, _defineProperty2["default"])(_this, "sliderContainer", null);
(0, _defineProperty2["default"])(_this, "setSliderContainer", function (element) {
_this.sliderContainer = element;
_this._resize();
});
(0, _defineProperty2["default"])(_this, "inputValue0", (0, _react.createRef)());
(0, _defineProperty2["default"])(_this, "inputValue1", (0, _react.createRef)());
(0, _defineProperty2["default"])(_this, "value0Selector", function (props) {
return props.value0;
});
(0, _defineProperty2["default"])(_this, "value1Selector", function (props) {
return props.value1;
});
(0, _defineProperty2["default"])(_this, "filterValueSelector", (0, _reselect.createSelector)(_this.value0Selector, _this.value1Selector, function (value0, value1) {
return [value0, value1];
}));
(0, _defineProperty2["default"])(_this, "_roundValToStep", function (val) {
var _this$props = _this.props,
range = _this$props.range,
step = _this$props.step;
if (!range || !step) return;
return (0, _src.roundValToStep)(range[0], step, val);
});
(0, _defineProperty2["default"])(_this, "_setRangeVal1", function (val) {
var _this$props2 = _this.props,
value0 = _this$props2.value0,
range = _this$props2.range,
_this$props2$onChange = _this$props2.onChange,
onChange = _this$props2$onChange === void 0 ? noop : _this$props2$onChange;
if (!range) return;
var val1 = Number(val);
onChange([value0, (0, _src.clamp)([value0, range[1]], _this._roundValToStep(val1))]);
return true;
});
(0, _defineProperty2["default"])(_this, "_setRangeVal0", function (val) {
var _this$props3 = _this.props,
value1 = _this$props3.value1,
range = _this$props3.range,
_this$props3$onChange = _this$props3.onChange,
onChange = _this$props3$onChange === void 0 ? noop : _this$props3$onChange;
if (!range) return;
var val0 = Number(val);
onChange([(0, _src.clamp)([range[0], value1], _this._roundValToStep(val0)), value1]);
return true;
});
(0, _defineProperty2["default"])(_this, "_resize", function () {
if (_this.sliderContainer) {
var width = _this.sliderContainer.offsetWidth;
if (width !== _this.state.width) {
_this.setState({
width: width
});
}
}
});
(0, _defineProperty2["default"])(_this, "_onChangeInput", function (key, e) {
_this.setState((0, _defineProperty2["default"])({}, key, e.target.value));
});
return _this;
}
(0, _inherits2["default"])(RangeSlider, _Component);
return (0, _createClass2["default"])(RangeSlider, [{
key: "componentDidMount",
value: function componentDidMount() {
if (this.sliderContainer instanceof Element) {
(0, _src.observeDimensions)(this.sliderContainer, this._resize, 100);
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
if (this.sliderContainer instanceof Element) {
(0, _src.unobserveDimensions)(this.sliderContainer);
}
}
}, {
key: "_renderInput",
value: function _renderInput(key) {
var _this2 = this;
var setRange = key === 'value0' ? this._setRangeVal0 : this._setRangeVal1;
var ref = key === 'value0' ? this.inputValue0 : this.inputValue1;
var update = function update(e) {
if (!setRange(e.target.value)) {
_this2.setState((0, _defineProperty2["default"])({}, key, _this2.state[key]));
}
};
var onChange = this._onChangeInput.bind(this, key);
return /*#__PURE__*/_react["default"].createElement(SliderInput, {
className: "kg-range-slider__input",
type: "number",
ref: ref,
id: "slider-input-".concat(key),
key: key,
value: this.state[key],
onChange: onChange,
onKeyPress: function onKeyPress(e) {
if (e.key === 'Enter') {
update(e);
ref.current.blur();
}
},
onBlur: update,
$flush: key === 'value0',
$inputSize: this.props.inputSize,
secondary: this.props.inputTheme === 'secondary'
});
}
// eslint-disable-next-line complexity
}, {
key: "render",
value: function render() {
var _this$props4 = this.props,
isRanged = _this$props4.isRanged,
showInput = _this$props4.showInput,
bins = _this$props4.bins,
lineChart = _this$props4.lineChart,
plotType = _this$props4.plotType,
invertTrendColor = _this$props4.invertTrendColor,
range = _this$props4.range,
_this$props4$onChange = _this$props4.onChange,
onChange = _this$props4$onChange === void 0 ? noop : _this$props4$onChange,
sliderHandleWidth = _this$props4.sliderHandleWidth,
step = _this$props4.step,
timezone = _this$props4.timezone,
timeFormat = _this$props4.timeFormat,
playbackControlWidth = _this$props4.playbackControlWidth,
setFilterPlot = _this$props4.setFilterPlot,
animationWindow = _this$props4.animationWindow,
subAnimations = _this$props4.subAnimations,
filter = _this$props4.filter,
datasets = _this$props4.datasets;
var width = this.state.width;
var plotWidth = Math.max(width - Number(sliderHandleWidth), 0);
var hasPlot = plotType === null || plotType === void 0 ? void 0 : plotType.type;
var value = this.props.plotValue || this.filterValueSelector(this.props);
var scaledValue = subAnimations !== null && subAnimations !== void 0 && subAnimations.length && range ? (0, _src.scaleSourceDomainToDestination)(value, range) : [0, 0];
var commonPadding = "".concat(Number(sliderHandleWidth) / 2, "px");
return /*#__PURE__*/_react["default"].createElement("div", {
className: "kg-range-slider",
style: {
width: '100%',
padding: "0 ".concat(commonPadding)
},
ref: this.setSliderContainer
}, Array.isArray(range) && range.every(Number.isFinite) && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, hasPlot ? /*#__PURE__*/_react["default"].createElement(RangePlot, {
bins: bins,
lineChart: lineChart,
plotType: plotType,
invertTrendColor: invertTrendColor,
isEnlarged: this.props.isEnlarged,
onBrush: function onBrush(val0, val1) {
return onChange([val0, val1]);
},
marks: this.props.marks,
animationWindow: animationWindow,
filter: filter,
datasets: datasets,
range: range,
value: value,
width: plotWidth,
isRanged: isRanged,
step: step,
timezone: timezone,
timeFormat: timeFormat,
playbackControlWidth: playbackControlWidth,
setFilterPlot: setFilterPlot,
style: {
paddingLeft: commonPadding
}
}) : null, subAnimations !== null && subAnimations !== void 0 && subAnimations.length ? /*#__PURE__*/_react["default"].createElement(RangeSliderSubAnimationPanel, {
subAnimations: subAnimations,
scaledValue: scaledValue,
style: RANGE_SLIDER_TIMELINE_PANEL_STYLE
}) : null, /*#__PURE__*/_react["default"].createElement(SliderWrapper, {
className: "kg-range-slider__slider",
$isRanged: isRanged,
$showInput: showInput
}, this.props.xAxis ? /*#__PURE__*/_react["default"].createElement("div", {
style: {
height: '30px'
}
}, /*#__PURE__*/_react["default"].createElement(this.props.xAxis, {
width: plotWidth,
timezone: timezone,
domain: range,
isEnlarged: this.props.isEnlarged
})) : null, /*#__PURE__*/_react["default"].createElement(_slider["default"], {
marks: this.props.marks,
isRanged: isRanged,
minValue: range[0],
maxValue: range[1],
value0: this.props.value0,
value1: this.props.value1,
step: step,
sliderHandleWidth: sliderHandleWidth,
onSlider0Change: this._setRangeVal0,
onSlider1Change: this._setRangeVal1,
onSliderBarChange: function onSliderBarChange(val0, val1) {
onChange([val0, val1]);
},
enableBarDrag: true
}), !isRanged && showInput ? this._renderInput('value1') : null), isRanged && showInput ? /*#__PURE__*/_react["default"].createElement(RangeInputWrapper, {
className: "range-slider__input-group"
}, this._renderInput('value0'), this._renderInput('value1')) : null));
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(props, state) {
var update = null;
var value0 = props.value0,
value1 = props.value1;
if (props.value0 !== state.prevValue0 && !isNaN(value0)) {
update = _objectSpread(_objectSpread({}, update || {}), {}, {
value0: value0,
prevValue0: value0
});
}
if (props.value1 !== state.prevValue1 && !isNaN(value1)) {
update = _objectSpread(_objectSpread({}, update || {}), {}, {
value1: value1,
prevValue1: value1
});
}
return update;
}
}]);
}(_react.Component);
(0, _defineProperty2["default"])(RangeSlider, "defaultProps", {
isEnlarged: false,
isRanged: true,
showInput: true,
sliderHandleWidth: 12,
inputTheme: '',
inputSize: 'small',
onChange: noop
});
(0, _reactLifecyclesCompat.polyfill)(RangeSlider);
return RangeSlider;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RMaWZlY3ljbGVzQ29tcGF0IiwiX3Jlc2VsZWN0IiwiX3N0eWxlZENvbXBvbmVudHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3JhbmdlUGxvdCIsIl9zbGlkZXIiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfcmFuZ2VTbGlkZXJUaW1lbGluZVBhbmVsIiwiX3NyYyIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJub29wIiwiU2xpZGVySW5wdXQiLCJzdHlsZWQiLCJJbnB1dCIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ0aGVtZSIsInNsaWRlcklucHV0V2lkdGgiLCIkZmx1c2giLCIkaW5wdXRTaXplIiwic2xpZGVySW5wdXRGb250U2l6ZSIsInNsaWRlcklucHV0UGFkZGluZyIsIlNsaWRlcldyYXBwZXIiLCJkaXYiLCIkaXNSYW5nZWQiLCIkc2hvd0lucHV0IiwiUmFuZ2VJbnB1dFdyYXBwZXIiLCJSQU5HRV9TTElERVJfVElNRUxJTkVfUEFORUxfU1RZTEUiLCJtYXJnaW5MZWZ0IiwiUmFuZ2VTbGlkZXJGYWN0b3J5IiwiZGVwcyIsIlJhbmdlUGxvdEZhY3RvcnkiLCJSYW5nZVNsaWRlclN1YkFuaW1hdGlvblBhbmVsRmFjdG9yeSIsIlJhbmdlUGxvdCIsIlJhbmdlU2xpZGVyU3ViQW5pbWF0aW9uUGFuZWwiLCJSYW5nZVNsaWRlciIsIl9Db21wb25lbnQiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNvbmNhdCIsInZhbHVlMCIsInZhbHVlMSIsInByZXZWYWx1ZTAiLCJwcmV2VmFsdWUxIiwid2lkdGgiLCJlbGVtZW50Iiwic2xpZGVyQ29udGFpbmVyIiwiX3Jlc2l6ZSIsImNyZWF0ZVJlZiIsImNyZWF0ZVNlbGVjdG9yIiwidmFsdWUwU2VsZWN0b3IiLCJ2YWx1ZTFTZWxlY3RvciIsInZhbCIsIl90aGlzJHByb3BzIiwicmFuZ2UiLCJzdGVwIiwicm91bmRWYWxUb1N0ZXAiLCJfdGhpcyRwcm9wczIiLCJfdGhpcyRwcm9wczIkb25DaGFuZ2UiLCJvbkNoYW5nZSIsInZhbDEiLCJOdW1iZXIiLCJjbGFtcCIsIl9yb3VuZFZhbFRvU3RlcCIsIl90aGlzJHByb3BzMyIsIl90aGlzJHByb3BzMyRvbkNoYW5nZSIsInZhbDAiLCJvZmZzZXRXaWR0aCIsInN0YXRlIiwic2V0U3RhdGUiLCJrZXkiLCJ0YXJnZXQiLCJ2YWx1ZSIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwiY29tcG9uZW50RGlkTW91bnQiLCJFbGVtZW50Iiwib2JzZXJ2ZURpbWVuc2lvbnMiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInVub2JzZXJ2ZURpbWVuc2lvbnMiLCJfcmVuZGVySW5wdXQiLCJfdGhpczIiLCJzZXRSYW5nZSIsIl9zZXRSYW5nZVZhbDAiLCJfc2V0UmFuZ2VWYWwxIiwicmVmIiwiaW5wdXRWYWx1ZTAiLCJpbnB1dFZhbHVlMSIsInVwZGF0ZSIsIl9vbkNoYW5nZUlucHV0IiwiYmluZCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJ0eXBlIiwiaWQiLCJvbktleVByZXNzIiwiY3VycmVudCIsImJsdXIiLCJvbkJsdXIiLCJpbnB1dFNpemUiLCJzZWNvbmRhcnkiLCJpbnB1dFRoZW1lIiwicmVuZGVyIiwiX3RoaXMkcHJvcHM0IiwiaXNSYW5nZWQiLCJzaG93SW5wdXQiLCJiaW5zIiwibGluZUNoYXJ0IiwicGxvdFR5cGUiLCJpbnZlcnRUcmVuZENvbG9yIiwiX3RoaXMkcHJvcHM0JG9uQ2hhbmdlIiwic2xpZGVySGFuZGxlV2lkdGgiLCJ0aW1lem9uZSIsInRpbWVGb3JtYXQiLCJwbGF5YmFja0NvbnRyb2xXaWR0aCIsInNldEZpbHRlclBsb3QiLCJhbmltYXRpb25XaW5kb3ciLCJzdWJBbmltYXRpb25zIiwiZGF0YXNldHMiLCJwbG90V2lkdGgiLCJNYXRoIiwibWF4IiwiaGFzUGxvdCIsInBsb3RWYWx1ZSIsImZpbHRlclZhbHVlU2VsZWN0b3IiLCJzY2FsZWRWYWx1ZSIsInNjYWxlU291cmNlRG9tYWluVG9EZXN0aW5hdGlvbiIsImNvbW1vblBhZGRpbmciLCJzdHlsZSIsInBhZGRpbmciLCJzZXRTbGlkZXJDb250YWluZXIiLCJpc0FycmF5IiwiZXZlcnkiLCJpc0Zpbml0ZSIsIkZyYWdtZW50IiwiaXNFbmxhcmdlZCIsIm9uQnJ1c2giLCJtYXJrcyIsInBhZGRpbmdMZWZ0IiwieEF4aXMiLCJoZWlnaHQiLCJkb21haW4iLCJtaW5WYWx1ZSIsIm1heFZhbHVlIiwib25TbGlkZXIwQ2hhbmdlIiwib25TbGlkZXIxQ2hhbmdlIiwib25TbGlkZXJCYXJDaGFuZ2UiLCJlbmFibGVCYXJEcmFnIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIiwiaXNOYU4iLCJDb21wb25lbnQiLCJwb2x5ZmlsbCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NyYy9jb21tb24vcmFuZ2Utc2xpZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIENvbXBvbmVudFR5cGUsIGNyZWF0ZVJlZiwgRWxlbWVudFR5cGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7cG9seWZpbGx9IGZyb20gJ3JlYWN0LWxpZmVjeWNsZXMtY29tcGF0JztcbmltcG9ydCB7Y3JlYXRlU2VsZWN0b3J9IGZyb20gJ3Jlc2VsZWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFJhbmdlUGxvdEZhY3RvcnkgZnJvbSAnLi9yYW5nZS1wbG90JztcbmltcG9ydCBTbGlkZXIgZnJvbSAnLi9zbGlkZXIvc2xpZGVyJztcbmltcG9ydCB7SW5wdXR9IGZyb20gJy4vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFJhbmdlU2xpZGVyU3ViQW5pbWF0aW9uUGFuZWxGYWN0b3J5IGZyb20gJy4uL2NvbW1vbi9yYW5nZS1zbGlkZXItdGltZWxpbmUtcGFuZWwnO1xuaW1wb3J0IHtcbiAgb2JzZXJ2ZURpbWVuc2lvbnMsXG4gIHVub2JzZXJ2ZURpbWVuc2lvbnMsXG4gIHJvdW5kVmFsVG9TdGVwLFxuICBjbGFtcCxcbiAgc2NhbGVTb3VyY2VEb21haW5Ub0Rlc3RpbmF0aW9uXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtMaW5lQ2hhcnQsIEZpbHRlciwgQmluc30gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0RhdGFzZXRzfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7QWN0aW9uSGFuZGxlciwgc2V0RmlsdGVyUGxvdH0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcblxuaW50ZXJmYWNlIFNsaWRlcklucHV0UHJvcHMge1xuICAkZmx1c2g/OiBib29sZWFuO1xuICAkaW5wdXRTaXplPzogc3RyaW5nO1xufVxuY29uc3Qgbm9vcCA9ICgpID0+IHtcbiAgcmV0dXJuO1xufTtcbmNvbnN0IFNsaWRlcklucHV0ID0gc3R5bGVkKElucHV0KTxTbGlkZXJJbnB1dFByb3BzPmBcbiAgd2lkdGg6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2xpZGVySW5wdXRXaWR0aH1weDtcbiAgbWFyZ2luLWxlZnQ6ICR7cHJvcHMgPT4gKHByb3BzLiRmbHVzaCA/IDAgOiBwcm9wcy4kaW5wdXRTaXplID09PSAndGlueScgPyAxMiA6IDE4KX1weDtcbiAgZm9udC1zaXplOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNsaWRlcklucHV0Rm9udFNpemV9OyAvLyAxMHB4IC8vIDEycHg7XG4gIHBhZGRpbmc6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2xpZGVySW5wdXRQYWRkaW5nfTsgLy8gNHB4IDZweDsgLy8gNnB4IDEycHg7XG5gO1xuXG5pbnRlcmZhY2UgU2xpZGVyV3JhcHBlclByb3BzIHtcbiAgJGlzUmFuZ2VkPzogYm9vbGVhbjtcbiAgJHNob3dJbnB1dD86IGJvb2xlYW47XG59XG5cbmNvbnN0IFNsaWRlcldyYXBwZXIgPSBzdHlsZWQuZGl2PFNsaWRlcldyYXBwZXJQcm9wcz5gXG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYWxpZ24taXRlbXM6ICR7cHJvcHMgPT4gKCFwcm9wcy4kaXNSYW5nZWQgJiYgcHJvcHMuJHNob3dJbnB1dCA/ICdjZW50ZXInIDogJ2ZsZXgtc3RhcnQnKX07XG5gO1xuXG5jb25zdCBSYW5nZUlucHV0V3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIG1hcmdpbi10b3A6IDEycHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbmA7XG5cbmludGVyZmFjZSBSYW5nZVNsaWRlclByb3BzIHtcbiAgcmFuZ2U/OiBudW1iZXJbXTtcbiAgdmFsdWUwOiBudW1iZXI7XG4gIHZhbHVlMTogbnVtYmVyO1xuICBvbkNoYW5nZT86ICh2YWw6IG51bWJlcltdLCBlPzogRXZlbnQgfCBudWxsKSA9PiB2b2lkOyAvLyBUT0RPXG4gIHNldEZpbHRlclBsb3Q/OiBBY3Rpb25IYW5kbGVyPHR5cGVvZiBzZXRGaWx0ZXJQbG90PjtcbiAgYmlucz86IEJpbnM7XG4gIGlzUmFuZ2VkPzogYm9vbGVhbjtcbiAgaXNFbmxhcmdlZD86IGJvb2xlYW47XG4gIHNob3dJbnB1dD86IGJvb2xlYW47XG4gIGlucHV0VGhlbWU/OiBzdHJpbmc7XG4gIGlucHV0U2l6ZT86IHN0cmluZztcbiAgc3RlcD86IG51bWJlcjtcbiAgc2xpZGVySGFuZGxlV2lkdGg/OiBudW1iZXI7XG4gIHhBeGlzPzogRWxlbWVudFR5cGU7XG4gIHN1YkFuaW1hdGlvbnM/OiBhbnlbXTtcbiAgdGltZWxpbmVMYWJlbD86IHN0cmluZztcblxuICB0aW1lem9uZT86IHN0cmluZyB8IG51bGw7XG4gIHRpbWVGb3JtYXQ/OiBzdHJpbmc7XG4gIHBsYXliYWNrQ29udHJvbFdpZHRoPzogbnVtYmVyO1xuICBsaW5lQ2hhcnQ/OiBMaW5lQ2hhcnQ7XG4gIG1hcmtzPzogbnVtYmVyW107XG4gIHBsb3RUeXBlPzoge1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgfTtcbiAgcGxvdFZhbHVlPzogbnVtYmVyW107XG5cbiAgYW5pbWF0aW9uV2luZG93Pzogc3RyaW5nO1xuICBmaWx0ZXI/OiBGaWx0ZXI7XG4gIGRhdGFzZXRzPzogRGF0YXNldHM7XG5cbiAgaW52ZXJ0VHJlbmRDb2xvcj86IGJvb2xlYW47XG59XG5cbmNvbnN0IFJBTkdFX1NMSURFUl9USU1FTElORV9QQU5FTF9TVFlMRSA9IHttYXJnaW5MZWZ0OiAnLTMycHgnfTtcblxuUmFuZ2VTbGlkZXJGYWN0b3J5LmRlcHMgPSBbUmFuZ2VQbG90RmFjdG9yeSwgUmFuZ2VTbGlkZXJTdWJBbmltYXRpb25QYW5lbEZhY3RvcnldO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBSYW5nZVNsaWRlckZhY3RvcnkoXG4gIFJhbmdlUGxvdDogUmV0dXJuVHlwZTx0eXBlb2YgUmFuZ2VQbG90RmFjdG9yeT4sXG4gIFJhbmdlU2xpZGVyU3ViQW5pbWF0aW9uUGFuZWw6IFJldHVyblR5cGU8dHlwZW9mIFJhbmdlU2xpZGVyU3ViQW5pbWF0aW9uUGFuZWxGYWN0b3J5PlxuKTogQ29tcG9uZW50VHlwZTxSYW5nZVNsaWRlclByb3BzPiB7XG4gIGNsYXNzIFJhbmdlU2xpZGVyIGV4dGVuZHMgQ29tcG9uZW50PFJhbmdlU2xpZGVyUHJvcHM+IHtcbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgaXNFbmxhcmdlZDogZmFsc2UsXG4gICAgICBpc1JhbmdlZDogdHJ1ZSxcbiAgICAgIHNob3dJbnB1dDogdHJ1ZSxcbiAgICAgIHNsaWRlckhhbmRsZVdpZHRoOiAxMixcbiAgICAgIGlucHV0VGhlbWU6ICcnLFxuICAgICAgaW5wdXRTaXplOiAnc21hbGwnLFxuICAgICAgb25DaGFuZ2U6IG5vb3BcbiAgICB9O1xuXG4gICAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgc3RhdGUpIHtcbiAgICAgIGxldCB1cGRhdGU6IHt2YWx1ZTE/OiBhbnk7IHByZXZWYWx1ZTE/OiBhbnk7IHZhbHVlMD86IGFueTsgcHJldlZhbHVlMD86IGFueX0gfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0IHt2YWx1ZTAsIHZhbHVlMX0gPSBwcm9wcztcbiAgICAgIGlmIChwcm9wcy52YWx1ZTAgIT09IHN0YXRlLnByZXZWYWx1ZTAgJiYgIWlzTmFOKHZhbHVlMCkpIHtcbiAgICAgICAgdXBkYXRlID0gey4uLih1cGRhdGUgfHwge30pLCB2YWx1ZTAsIHByZXZWYWx1ZTA6IHZhbHVlMH07XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMudmFsdWUxICE9PSBzdGF0ZS5wcmV2VmFsdWUxICYmICFpc05hTih2YWx1ZTEpKSB7XG4gICAgICAgIHVwZGF0ZSA9IHsuLi4odXBkYXRlIHx8IHt9KSwgdmFsdWUxLCBwcmV2VmFsdWUxOiB2YWx1ZTF9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICB9XG5cbiAgICBzdGF0ZSA9IHtcbiAgICAgIHZhbHVlMDogMCxcbiAgICAgIHZhbHVlMTogMSxcbiAgICAgIHByZXZWYWx1ZTA6IDAsXG4gICAgICBwcmV2VmFsdWUxOiAxLFxuICAgICAgd2lkdGg6IDI4OFxuICAgIH07XG5cbiAgICBzbGlkZXJDb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLnNsaWRlckNvbnRhaW5lciBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgb2JzZXJ2ZURpbWVuc2lvbnModGhpcy5zbGlkZXJDb250YWluZXIsIHRoaXMuX3Jlc2l6ZSwgMTAwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLnNsaWRlckNvbnRhaW5lciBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgdW5vYnNlcnZlRGltZW5zaW9ucyh0aGlzLnNsaWRlckNvbnRhaW5lcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0U2xpZGVyQ29udGFpbmVyOiBSZWFjdC5MZWdhY3lSZWY8SFRNTERpdkVsZW1lbnQ+ID0gZWxlbWVudCA9PiB7XG4gICAgICB0aGlzLnNsaWRlckNvbnRhaW5lciA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9yZXNpemUoKTtcbiAgICB9O1xuICAgIGlucHV0VmFsdWUwID0gY3JlYXRlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KCk7XG4gICAgaW5wdXRWYWx1ZTEgPSBjcmVhdGVSZWY8SFRNTElucHV0RWxlbWVudD4oKTtcbiAgICB2YWx1ZTBTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLnZhbHVlMDtcbiAgICB2YWx1ZTFTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLnZhbHVlMTtcbiAgICBmaWx0ZXJWYWx1ZVNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLnZhbHVlMFNlbGVjdG9yLFxuICAgICAgdGhpcy52YWx1ZTFTZWxlY3RvcixcbiAgICAgICh2YWx1ZTAsIHZhbHVlMSkgPT4gW3ZhbHVlMCwgdmFsdWUxXVxuICAgICk7XG5cbiAgICBfcm91bmRWYWxUb1N0ZXAgPSB2YWwgPT4ge1xuICAgICAgY29uc3Qge3JhbmdlLCBzdGVwfSA9IHRoaXMucHJvcHM7XG4gICAgICBpZiAoIXJhbmdlIHx8ICFzdGVwKSByZXR1cm47XG4gICAgICByZXR1cm4gcm91bmRWYWxUb1N0ZXAocmFuZ2VbMF0sIHN0ZXAsIHZhbCk7XG4gICAgfTtcblxuICAgIF9zZXRSYW5nZVZhbDEgPSB2YWwgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlMCwgcmFuZ2UsIG9uQ2hhbmdlID0gbm9vcH0gPSB0aGlzLnByb3BzO1xuICAgICAgaWYgKCFyYW5nZSkgcmV0dXJuO1xuICAgICAgY29uc3QgdmFsMSA9IE51bWJlcih2YWwpO1xuICAgICAgb25DaGFuZ2UoW3ZhbHVlMCwgY2xhbXAoW3ZhbHVlMCwgcmFuZ2VbMV1dLCB0aGlzLl9yb3VuZFZhbFRvU3RlcCh2YWwxKSldKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBfc2V0UmFuZ2VWYWwwID0gdmFsID0+IHtcbiAgICAgIGNvbnN0IHt2YWx1ZTEsIHJhbmdlLCBvbkNoYW5nZSA9IG5vb3B9ID0gdGhpcy5wcm9wcztcbiAgICAgIGlmICghcmFuZ2UpIHJldHVybjtcbiAgICAgIGNvbnN0IHZhbDAgPSBOdW1iZXIodmFsKTtcbiAgICAgIG9uQ2hhbmdlKFtjbGFtcChbcmFuZ2VbMF0sIHZhbHVlMV0sIHRoaXMuX3JvdW5kVmFsVG9TdGVwKHZhbDApKSwgdmFsdWUxXSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgX3Jlc2l6ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNsaWRlckNvbnRhaW5lcikge1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuc2xpZGVyQ29udGFpbmVyLm9mZnNldFdpZHRoO1xuICAgICAgICBpZiAod2lkdGggIT09IHRoaXMuc3RhdGUud2lkdGgpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHt3aWR0aH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9vbkNoYW5nZUlucHV0ID0gKGtleSwgZSkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7W2tleV06IGUudGFyZ2V0LnZhbHVlfSk7XG4gICAgfTtcblxuICAgIF9yZW5kZXJJbnB1dChrZXkpIHtcbiAgICAgIGNvbnN0IHNldFJhbmdlID0ga2V5ID09PSAndmFsdWUwJyA/IHRoaXMuX3NldFJhbmdlVmFsMCA6IHRoaXMuX3NldFJhbmdlVmFsMTtcbiAgICAgIGNvbnN0IHJlZiA9IGtleSA9PT0gJ3ZhbHVlMCcgPyB0aGlzLmlucHV0VmFsdWUwIDogdGhpcy5pbnB1dFZhbHVlMTtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IGUgPT4ge1xuICAgICAgICBpZiAoIXNldFJhbmdlKGUudGFyZ2V0LnZhbHVlKSkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1trZXldOiB0aGlzLnN0YXRlW2tleV19KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25DaGFuZ2UgPSB0aGlzLl9vbkNoYW5nZUlucHV0LmJpbmQodGhpcywga2V5KTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFNsaWRlcklucHV0XG4gICAgICAgICAgY2xhc3NOYW1lPVwia2ctcmFuZ2Utc2xpZGVyX19pbnB1dFwiXG4gICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgICAgaWQ9e2BzbGlkZXItaW5wdXQtJHtrZXl9YH1cbiAgICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZVtrZXldfVxuICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICBvbktleVByZXNzPXtlID0+IHtcbiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgICAgICB1cGRhdGUoZSk7XG4gICAgICAgICAgICAgIChyZWYuY3VycmVudCBhcyBhbnkpLmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQmx1cj17dXBkYXRlfVxuICAgICAgICAgICRmbHVzaD17a2V5ID09PSAndmFsdWUwJ31cbiAgICAgICAgICAkaW5wdXRTaXplPXt0aGlzLnByb3BzLmlucHV0U2l6ZX1cbiAgICAgICAgICBzZWNvbmRhcnk9e3RoaXMucHJvcHMuaW5wdXRUaGVtZSA9PT0gJ3NlY29uZGFyeSd9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBpc1JhbmdlZCxcbiAgICAgICAgc2hvd0lucHV0LFxuICAgICAgICBiaW5zLFxuICAgICAgICBsaW5lQ2hhcnQsXG4gICAgICAgIHBsb3RUeXBlLFxuICAgICAgICBpbnZlcnRUcmVuZENvbG9yLFxuICAgICAgICByYW5nZSxcbiAgICAgICAgb25DaGFuZ2UgPSBub29wLFxuICAgICAgICBzbGlkZXJIYW5kbGVXaWR0aCxcbiAgICAgICAgc3RlcCxcbiAgICAgICAgdGltZXpvbmUsXG4gICAgICAgIHRpbWVGb3JtYXQsXG4gICAgICAgIHBsYXliYWNrQ29udHJvbFdpZHRoLFxuICAgICAgICBzZXRGaWx0ZXJQbG90LFxuICAgICAgICBhbmltYXRpb25XaW5kb3csXG4gICAgICAgIHN1YkFuaW1hdGlvbnM6IHN1YkFuaW1hdGlvbnMsXG4gICAgICAgIGZpbHRlcixcbiAgICAgICAgZGF0YXNldHNcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICBjb25zdCB7d2lkdGh9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IHBsb3RXaWR0aCA9IE1hdGgubWF4KHdpZHRoIC0gTnVtYmVyKHNsaWRlckhhbmRsZVdpZHRoKSwgMCk7XG4gICAgICBjb25zdCBoYXNQbG90ID0gcGxvdFR5cGU/LnR5cGU7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wcm9wcy5wbG90VmFsdWUgfHwgdGhpcy5maWx0ZXJWYWx1ZVNlbGVjdG9yKHRoaXMucHJvcHMpO1xuICAgICAgY29uc3Qgc2NhbGVkVmFsdWUgPVxuICAgICAgICBzdWJBbmltYXRpb25zPy5sZW5ndGggJiYgcmFuZ2VcbiAgICAgICAgICA/IHNjYWxlU291cmNlRG9tYWluVG9EZXN0aW5hdGlvbih2YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdLCByYW5nZSBhcyBbbnVtYmVyLCBudW1iZXJdKVxuICAgICAgICAgIDogWzAsIDBdO1xuICAgICAgY29uc3QgY29tbW9uUGFkZGluZyA9IGAke051bWJlcihzbGlkZXJIYW5kbGVXaWR0aCkgLyAyfXB4YDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJrZy1yYW5nZS1zbGlkZXJcIlxuICAgICAgICAgIHN0eWxlPXt7d2lkdGg6ICcxMDAlJywgcGFkZGluZzogYDAgJHtjb21tb25QYWRkaW5nfWB9fVxuICAgICAgICAgIHJlZj17dGhpcy5zZXRTbGlkZXJDb250YWluZXJ9XG4gICAgICAgID5cbiAgICAgICAgICB7QXJyYXkuaXNBcnJheShyYW5nZSkgJiYgcmFuZ2UuZXZlcnkoTnVtYmVyLmlzRmluaXRlKSAmJiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICB7aGFzUGxvdCA/IChcbiAgICAgICAgICAgICAgICA8UmFuZ2VQbG90XG4gICAgICAgICAgICAgICAgICBiaW5zPXtiaW5zfVxuICAgICAgICAgICAgICAgICAgbGluZUNoYXJ0PXtsaW5lQ2hhcnR9XG4gICAgICAgICAgICAgICAgICBwbG90VHlwZT17cGxvdFR5cGV9XG4gICAgICAgICAgICAgICAgICBpbnZlcnRUcmVuZENvbG9yPXtpbnZlcnRUcmVuZENvbG9yfVxuICAgICAgICAgICAgICAgICAgaXNFbmxhcmdlZD17dGhpcy5wcm9wcy5pc0VubGFyZ2VkfVxuICAgICAgICAgICAgICAgICAgb25CcnVzaD17KHZhbDAsIHZhbDEpID0+IG9uQ2hhbmdlKFt2YWwwLCB2YWwxXSl9XG4gICAgICAgICAgICAgICAgICBtYXJrcz17dGhpcy5wcm9wcy5tYXJrc31cbiAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbldpbmRvdz17YW5pbWF0aW9uV2luZG93fVxuICAgICAgICAgICAgICAgICAgZmlsdGVyPXtmaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldHN9XG4gICAgICAgICAgICAgICAgICByYW5nZT17cmFuZ2V9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgICAgICAgICB3aWR0aD17cGxvdFdpZHRofVxuICAgICAgICAgICAgICAgICAgaXNSYW5nZWQ9e2lzUmFuZ2VkfVxuICAgICAgICAgICAgICAgICAgc3RlcD17c3RlcH1cbiAgICAgICAgICAgICAgICAgIHRpbWV6b25lPXt0aW1lem9uZX1cbiAgICAgICAgICAgICAgICAgIHRpbWVGb3JtYXQ9e3RpbWVGb3JtYXR9XG4gICAgICAgICAgICAgICAgICBwbGF5YmFja0NvbnRyb2xXaWR0aD17cGxheWJhY2tDb250cm9sV2lkdGh9XG4gICAgICAgICAgICAgICAgICBzZXRGaWx0ZXJQbG90PXtzZXRGaWx0ZXJQbG90fVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3twYWRkaW5nTGVmdDogY29tbW9uUGFkZGluZ319XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgIHtzdWJBbmltYXRpb25zPy5sZW5ndGggPyAoXG4gICAgICAgICAgICAgICAgPFJhbmdlU2xpZGVyU3ViQW5pbWF0aW9uUGFuZWxcbiAgICAgICAgICAgICAgICAgIHN1YkFuaW1hdGlvbnM9e3N1YkFuaW1hdGlvbnN9XG4gICAgICAgICAgICAgICAgICBzY2FsZWRWYWx1ZT17c2NhbGVkVmFsdWV9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17UkFOR0VfU0xJREVSX1RJTUVMSU5FX1BBTkVMX1NUWUxFfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICA8U2xpZGVyV3JhcHBlclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImtnLXJhbmdlLXNsaWRlcl9fc2xpZGVyXCJcbiAgICAgICAgICAgICAgICAkaXNSYW5nZWQ9e2lzUmFuZ2VkfVxuICAgICAgICAgICAgICAgICRzaG93SW5wdXQ9e3Nob3dJbnB1dH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnhBeGlzID8gKFxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e2hlaWdodDogJzMwcHgnfX0+XG4gICAgICAgICAgICAgICAgICAgIDx0aGlzLnByb3BzLnhBeGlzXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9e3Bsb3RXaWR0aH1cbiAgICAgICAgICAgICAgICAgICAgICB0aW1lem9uZT17dGltZXpvbmV9XG4gICAgICAgICAgICAgICAgICAgICAgZG9tYWluPXtyYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgICBpc0VubGFyZ2VkPXt0aGlzLnByb3BzLmlzRW5sYXJnZWR9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICA8U2xpZGVyXG4gICAgICAgICAgICAgICAgICBtYXJrcz17dGhpcy5wcm9wcy5tYXJrc31cbiAgICAgICAgICAgICAgICAgIGlzUmFuZ2VkPXtpc1JhbmdlZH1cbiAgICAgICAgICAgICAgICAgIG1pblZhbHVlPXtyYW5nZVswXX1cbiAgICAgICAgICAgICAgICAgIG1heFZhbHVlPXtyYW5nZVsxXX1cbiAgICAgICAgICAgICAgICAgIHZhbHVlMD17dGhpcy5wcm9wcy52YWx1ZTB9XG4gICAgICAgICAgICAgICAgICB2YWx1ZTE9e3RoaXMucHJvcHMudmFsdWUxfVxuICAgICAgICAgICAgICAgICAgc3RlcD17c3RlcH1cbiAgICAgICAgICAgICAgICAgIHNsaWRlckhhbmRsZVdpZHRoPXtzbGlkZXJIYW5kbGVXaWR0aH1cbiAgICAgICAgICAgICAgICAgIG9uU2xpZGVyMENoYW5nZT17dGhpcy5fc2V0UmFuZ2VWYWwwfVxuICAgICAgICAgICAgICAgICAgb25TbGlkZXIxQ2hhbmdlPXt0aGlzLl9zZXRSYW5nZVZhbDF9XG4gICAgICAgICAgICAgICAgICBvblNsaWRlckJhckNoYW5nZT17KHZhbDAsIHZhbDEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UoW3ZhbDAsIHZhbDFdKTtcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBlbmFibGVCYXJEcmFnXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7IWlzUmFuZ2VkICYmIHNob3dJbnB1dCA/IHRoaXMuX3JlbmRlcklucHV0KCd2YWx1ZTEnKSA6IG51bGx9XG4gICAgICAgICAgICAgIDwvU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgICAgICAge2lzUmFuZ2VkICYmIHNob3dJbnB1dCA/IChcbiAgICAgICAgICAgICAgICA8UmFuZ2VJbnB1dFdyYXBwZXIgY2xhc3NOYW1lPVwicmFuZ2Utc2xpZGVyX19pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAge3RoaXMuX3JlbmRlcklucHV0KCd2YWx1ZTAnKX1cbiAgICAgICAgICAgICAgICAgIHt0aGlzLl9yZW5kZXJJbnB1dCgndmFsdWUxJyl9XG4gICAgICAgICAgICAgICAgPC9SYW5nZUlucHV0V3JhcHBlcj5cbiAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcG9seWZpbGwoUmFuZ2VTbGlkZXIpO1xuXG4gIHJldHVybiBSYW5nZVNsaWRlcjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsc0JBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBSyxVQUFBLEdBQUFELHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBTSxPQUFBLEdBQUFGLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBTyxrQkFBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEseUJBQUEsR0FBQUosc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFTLElBQUEsR0FBQVQsT0FBQTtBQU0wQixJQUFBVSxlQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBakIxQjtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFmLHdCQUFBZSxDQUFBLEVBQUFFLENBQUEsU0FBQUEs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