UNPKG

kepler.gl.geoiq

Version:

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

338 lines (281 loc) 38.6 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 _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); 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 _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reactAnythingSortable = require("react-anything-sortable"); var _lodash = _interopRequireDefault(require("lodash")); var _widgetConfigurator = _interopRequireDefault(require("./widget-configurator")); var _widgetPanelHeader = _interopRequireDefault(require("./widget-panel-header")); var _loadingSpinner = _interopRequireDefault(require("../../common/loading-spinner")); var _sliderBarHandle = _interopRequireDefault(require("../../common/slider/slider-bar-handle")); 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 _templateObject4() { var data = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n text-align: center;\n font-size: 30px;\n"]); _templateObject4 = function _templateObject4() { return data; }; return data; } function _templateObject3() { var data = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n color: #6a7485;\n text-align: center;\n font-size: 14px;\n"]); _templateObject3 = function _templateObject3() { return data; }; return data; } function _templateObject2() { var data = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n padding: 12px;\n"]); _templateObject2 = function _templateObject2() { return data; }; return data; } function _templateObject() { var data = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 12px;\n border-radius: 1px;\n margin-bottom: 8px;\n\n &.dragging {\n cursor: move;\n }\n"]); _templateObject = function _templateObject() { return data; }; return data; } // import layers from '../../../../dist/components/common/icons/layers'; var PanelWrapper = _styledComponents["default"].div(_templateObject()); var StyledWidgetContent = _styledComponents["default"].div(_templateObject2(), function (props) { return props.theme.panelBackground; }); var StyledWidgetContentHeader = _styledComponents["default"].div(_templateObject3(), function (props) { return props.theme.panelBackground; }); var StyledWidgetContentValue = _styledComponents["default"].div(_templateObject4(), function (props) { return props.theme.panelBackground; }); function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase(); } function WidgetPanelFactory() { var _class, _class2, _temp; var WidgetPanel = (0, _reactAnythingSortable.sortable)(_class = (_temp = _class2 = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(WidgetPanel, _Component); function WidgetPanel() { var _getPrototypeOf2; var _this; (0, _classCallCheck2["default"])(this, WidgetPanel); 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"])(WidgetPanel)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", { aggregatedData: null }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "inDebounce", 0); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateState", function (func) { _this.setState({ aggregatedData: func }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateWidgetConfig", function (newProp) { newProp = _objectSpread({}, newProp, { mapState: _this.props.mapState }); _this.props.widgetConfigChange(_this.props.widget, newProp); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateWidgetType", function (newType) { _this.props.widgetTypeChange(_this.props.widget, newType); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateWidgetVisConfig", function (newVisConfig) { _this.props.widgetVisConfigChange(_this.props.widget, newVisConfig); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateWidgetVisualChannelConfig", function (newConfig, channel, scaleKey) { _this.props.widgetVisualChannelConfigChange(_this.props.widget, newConfig, channel, scaleKey); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_updateWidgetLabel", function (_ref) { var value = _ref.target.value; _this.updateWidgetConfig({ label: value }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_toggleVisibility", function (e) { e.stopPropagation(); var isVisible = !_this.props.widget.config.isVisible; _this.updateWidgetConfig({ isVisible: isVisible }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_toggleEnableConfig", function (e) { e.stopPropagation(); var isConfigActive = _this.props.widget.config.isConfigActive; _this.updateWidgetConfig({ isConfigActive: !isConfigActive }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_removeWidget", function (e) { e.stopPropagation(); _this.props.removeWidget(_this.props.idx); }); return _this; } (0, _createClass2["default"])(WidgetPanel, [{ key: "componentDidMount", value: function componentDidMount() { this.props.widgetConfigChange(this.props.widget, { mapState: this.props.mapState }); } }, { key: "componentWillReceiveProps", value: function componentWillReceiveProps(nextProps) { var _this2 = this; if (!_lodash["default"].isEqual(this.props.mapState, nextProps.mapState) && nextProps.layers && nextProps.widget.config.bounds) { this.props.widgetConfigChange(this.props.widget, { isCalculating: true }); clearTimeout(this.inDebounce); this.inDebounce = setTimeout(function () { _this2.props.widgetConfigChange(_this2.props.widget, { mapState: nextProps.mapState }); clearTimeout(_this2.inDebounce); _this2.inDebounce = 0; }, 300); } } }, { key: "_renderLayerName", value: function _renderLayerName(id) { var placeholder = this.props.layers.map(function (l) { if (l.id === id) { return l.config.label; } }); return placeholder; } }, { key: "render", value: function render() { var _this$props = this.props, widget = _this$props.widget, layers = _this$props.layers, idx = _this$props.idx, datasets = _this$props.datasets, widgetTypeOptions = _this$props.widgetTypeOptions; var config = widget.config; var isConfigActive = config.isConfigActive; return _react["default"].createElement(PanelWrapper, { active: isConfigActive, className: "layer-panel ".concat(this.props.className), style: this.props.style, onMouseDown: this.props.onMouseDown, onTouchStart: this.props.onTouchStart }, _react["default"].createElement(_widgetPanelHeader["default"], { isConfigActive: isConfigActive, id: widget.id, idx: idx, isVisible: config.isVisible, label: config.label, labelRCGColorValues: datasets[config.dataId].color, widgetType: widget.name, onToggleEnableConfig: this._toggleEnableConfig, onToggleVisibility: this._toggleVisibility, onUpdateWidgetLabel: this._updateWidgetLabel, onRemoveWidget: this._removeWidget }), isConfigActive && _react["default"].createElement(_widgetConfigurator["default"], { widget: widget, layers: layers, datasets: datasets, widgetTypeOptions: widgetTypeOptions, openModal: this.props.openModal, updateLayerConfig: this.updateWidgetConfig, updateLayerVisualChannelConfig: this.updateWidgetVisualChannelConfig, updateLayerType: this.updateWidgetType, updateLayerVisConfig: this.updateWidgetVisConfig }), widget.type === 'Function' && config.isVisible && config.aggregatedData && config.aggregationType && (0, _typeof2["default"])(config.aggregatedData) !== 'object' || config.aggregatedData === 0 ? _react["default"].createElement(StyledWidgetContent, null, _react["default"].createElement(StyledWidgetContentHeader, null, capitalizeFirstLetter(config.aggregationType), " :", ' ', this._renderLayerName(config.selectedLayer.id), " :", ' ', config.fieldName), _react["default"].createElement(StyledWidgetContentValue, null, config.isCalculating ? _react["default"].createElement("div", { style: { display: 'inline-block', marginTop: '5px' } }, _react["default"].createElement(_loadingSpinner["default"], null)) : _react["default"].createElement("div", { style: { color: '#6a7485' } }, config.aggregatedData))) : null, widget.type === 'Category' && config.isVisible && config.aggregatedData && config.aggregatedData.length && config.aggregationType ? _react["default"].createElement(StyledWidgetContent, null, config.aggregatedData.map(function (ad) { return _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement(StyledWidgetContentHeader, { style: { textAlign: 'inherit' } }, _react["default"].createElement("div", { style: { display: 'flex', color: '#6a7485' } }, ad['y'], ' ', _react["default"].createElement("div", { style: { marginLeft: 'auto' } }, ad['x']))), _react["default"].createElement(_sliderBarHandle["default"], { type: 'category', width: ad['x'] / config.aggregatedData[0]['x'] * 100, sliderBarListener: null }), _react["default"].createElement(StyledWidgetContentValue, null)); })) : null); } }]); return WidgetPanel; }(_react.Component), (0, _defineProperty2["default"])(_class2, "propTypes", { widget: _propTypes["default"].object.isRequired, datasets: _propTypes["default"].object.isRequired, idx: _propTypes["default"].number.isRequired, widgetConfigChange: _propTypes["default"].func.isRequired, widgetTypeChange: _propTypes["default"].func.isRequired, // layers: propTypes.arrayOf(propTypes.any), openModal: _propTypes["default"].func.isRequired, removeWidget: _propTypes["default"].func.isRequired, onCloseConfig: _propTypes["default"].func, widgetTypeOptions: _propTypes["default"].arrayOf(_propTypes["default"].any), widgetVisConfigChange: _propTypes["default"].func, widgetVisualChannelConfigChange: _propTypes["default"].func, mapState: _propTypes["default"].object.isRequired }), _temp)) || _class; return WidgetPanel; } var _default = WidgetPanelFactory; exports["default"] = _default; { /* <StyledWidgetContent> {config.aggregatedData.map(ad => { return ( <React.Fragment> <StyledWidgetContentHeader style={{textAlign: 'inherit'}}> {ad[0]}-{ad[1]} </StyledWidgetContentHeader> <StyledWidgetContentValue /> </React.Fragment> ); })} </StyledWidgetContent> */ } { /* <WidgetBarChart data={config.aggregatedData} height={96.9} width={191.6} margin={0} /> */ } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvd2lkZ2V0LXBhbmVsL3dpZGdldC1wYW5lbC5qcyJdLCJuYW1lcyI6WyJQYW5lbFdyYXBwZXIiLCJzdHlsZWQiLCJkaXYiLCJTdHlsZWRXaWRnZXRDb250ZW50IiwicHJvcHMiLCJ0aGVtZSIsInBhbmVsQmFja2dyb3VuZCIsIlN0eWxlZFdpZGdldENvbnRlbnRIZWFkZXIiLCJTdHlsZWRXaWRnZXRDb250ZW50VmFsdWUiLCJjYXBpdGFsaXplRmlyc3RMZXR0ZXIiLCJzdHJpbmciLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJXaWRnZXRQYW5lbEZhY3RvcnkiLCJXaWRnZXRQYW5lbCIsInNvcnRhYmxlIiwiYWdncmVnYXRlZERhdGEiLCJmdW5jIiwic2V0U3RhdGUiLCJuZXdQcm9wIiwibWFwU3RhdGUiLCJ3aWRnZXRDb25maWdDaGFuZ2UiLCJ3aWRnZXQiLCJuZXdUeXBlIiwid2lkZ2V0VHlwZUNoYW5nZSIsIm5ld1Zpc0NvbmZpZyIsIndpZGdldFZpc0NvbmZpZ0NoYW5nZSIsIm5ld0NvbmZpZyIsImNoYW5uZWwiLCJzY2FsZUtleSIsIndpZGdldFZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UiLCJ2YWx1ZSIsInRhcmdldCIsInVwZGF0ZVdpZGdldENvbmZpZyIsImxhYmVsIiwiZSIsInN0b3BQcm9wYWdhdGlvbiIsImlzVmlzaWJsZSIsImNvbmZpZyIsImlzQ29uZmlnQWN0aXZlIiwicmVtb3ZlV2lkZ2V0IiwiaWR4IiwibmV4dFByb3BzIiwiXyIsImlzRXF1YWwiLCJsYXllcnMiLCJib3VuZHMiLCJpc0NhbGN1bGF0aW5nIiwiY2xlYXJUaW1lb3V0IiwiaW5EZWJvdW5jZSIsInNldFRpbWVvdXQiLCJpZCIsInBsYWNlaG9sZGVyIiwibWFwIiwibCIsImRhdGFzZXRzIiwid2lkZ2V0VHlwZU9wdGlvbnMiLCJjbGFzc05hbWUiLCJzdHlsZSIsIm9uTW91c2VEb3duIiwib25Ub3VjaFN0YXJ0IiwiZGF0YUlkIiwiY29sb3IiLCJuYW1lIiwiX3RvZ2dsZUVuYWJsZUNvbmZpZyIsIl90b2dnbGVWaXNpYmlsaXR5IiwiX3VwZGF0ZVdpZGdldExhYmVsIiwiX3JlbW92ZVdpZGdldCIsIm9wZW5Nb2RhbCIsInVwZGF0ZVdpZGdldFZpc3VhbENoYW5uZWxDb25maWciLCJ1cGRhdGVXaWRnZXRUeXBlIiwidXBkYXRlV2lkZ2V0VmlzQ29uZmlnIiwidHlwZSIsImFnZ3JlZ2F0aW9uVHlwZSIsIl9yZW5kZXJMYXllck5hbWUiLCJzZWxlY3RlZExheWVyIiwiZmllbGROYW1lIiwiZGlzcGxheSIsIm1hcmdpblRvcCIsImxlbmd0aCIsImFkIiwidGV4dEFsaWduIiwibWFyZ2luTGVmdCIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJudW1iZXIiLCJvbkNsb3NlQ29uZmlnIiwiYXJyYXlPZiIsImFueSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTtBQUVBLElBQU1BLFlBQVksR0FBR0MsNkJBQU9DLEdBQVYsbUJBQWxCOztBQVNBLElBQU1DLG1CQUFtQixHQUFHRiw2QkFBT0MsR0FBVixxQkFDSCxVQUFBRSxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLGVBQWhCO0FBQUEsQ0FERixDQUF6Qjs7QUFJQSxJQUFNQyx5QkFBeUIsR0FBR04sNkJBQU9DLEdBQVYscUJBQ1QsVUFBQUUsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZQyxlQUFoQjtBQUFBLENBREksQ0FBL0I7O0FBT0EsSUFBTUUsd0JBQXdCLEdBQUdQLDZCQUFPQyxHQUFWLHFCQUNSLFVBQUFFLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUMsZUFBaEI7QUFBQSxDQURHLENBQTlCOztBQU1BLFNBQVNHLHFCQUFULENBQStCQyxNQUEvQixFQUF1QztBQUNyQyxTQUFPQSxNQUFNLENBQUNDLE1BQVAsQ0FBYyxDQUFkLEVBQWlCQyxXQUFqQixLQUFpQ0YsTUFBTSxDQUFDRyxLQUFQLENBQWEsQ0FBYixFQUFnQkMsV0FBaEIsRUFBeEM7QUFDRDs7QUFFRCxTQUFTQyxrQkFBVCxHQUE4QjtBQUFBOztBQUFBLE1BRXRCQyxXQUZzQixPQUMzQkMsK0JBRDJCO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsZ0dBcUJsQjtBQUNOQyxRQUFBQSxjQUFjLEVBQUU7QUFEVixPQXJCa0I7QUFBQSxxR0F5QmIsQ0F6QmE7QUFBQSxzR0FxRFosVUFBQUMsSUFBSSxFQUFJO0FBQ3BCLGNBQUtDLFFBQUwsQ0FBYztBQUFDRixVQUFBQSxjQUFjLEVBQUVDO0FBQWpCLFNBQWQ7QUFDRCxPQXZEeUI7QUFBQSw2R0F5REwsVUFBQUUsT0FBTyxFQUFJO0FBQzlCQSxRQUFBQSxPQUFPLHFCQUNGQSxPQURFO0FBRUxDLFVBQUFBLFFBQVEsRUFBRSxNQUFLbEIsS0FBTCxDQUFXa0I7QUFGaEIsVUFBUDs7QUFJQSxjQUFLbEIsS0FBTCxDQUFXbUIsa0JBQVgsQ0FBOEIsTUFBS25CLEtBQUwsQ0FBV29CLE1BQXpDLEVBQWlESCxPQUFqRDtBQUNELE9BL0R5QjtBQUFBLDJHQWlFUCxVQUFBSSxPQUFPLEVBQUk7QUFDNUIsY0FBS3JCLEtBQUwsQ0FBV3NCLGdCQUFYLENBQTRCLE1BQUt0QixLQUFMLENBQVdvQixNQUF2QyxFQUErQ0MsT0FBL0M7QUFDRCxPQW5FeUI7QUFBQSxnSEFxRUYsVUFBQUUsWUFBWSxFQUFJO0FBQ3RDLGNBQUt2QixLQUFMLENBQVd3QixxQkFBWCxDQUFpQyxNQUFLeEIsS0FBTCxDQUFXb0IsTUFBNUMsRUFBb0RHLFlBQXBEO0FBQ0QsT0F2RXlCO0FBQUEsMEhBeUVRLFVBQUNFLFNBQUQsRUFBWUMsT0FBWixFQUFxQkMsUUFBckIsRUFBa0M7QUFDbEUsY0FBSzNCLEtBQUwsQ0FBVzRCLCtCQUFYLENBQ0UsTUFBSzVCLEtBQUwsQ0FBV29CLE1BRGIsRUFFRUssU0FGRixFQUdFQyxPQUhGLEVBSUVDLFFBSkY7QUFNRCxPQWhGeUI7QUFBQSw2R0FrRkwsZ0JBQXVCO0FBQUEsWUFBWkUsS0FBWSxRQUFyQkMsTUFBcUIsQ0FBWkQsS0FBWTs7QUFDMUMsY0FBS0Usa0JBQUwsQ0FBd0I7QUFBQ0MsVUFBQUEsS0FBSyxFQUFFSDtBQUFSLFNBQXhCO0FBQ0QsT0FwRnlCO0FBQUEsNEdBc0ZOLFVBQUFJLENBQUMsRUFBSTtBQUN2QkEsUUFBQUEsQ0FBQyxDQUFDQyxlQUFGO0FBQ0EsWUFBTUMsU0FBUyxHQUFHLENBQUMsTUFBS25DLEtBQUwsQ0FBV29CLE1BQVgsQ0FBa0JnQixNQUFsQixDQUF5QkQsU0FBNUM7O0FBQ0EsY0FBS0osa0JBQUwsQ0FBd0I7QUFBQ0ksVUFBQUEsU0FBUyxFQUFUQTtBQUFELFNBQXhCO0FBQ0QsT0ExRnlCO0FBQUEsOEdBNEZKLFVBQUFGLENBQUMsRUFBSTtBQUN6QkEsUUFBQUEsQ0FBQyxDQUFDQyxlQUFGO0FBRHlCLFlBSVpHLGNBSlksR0FNckIsTUFBS3JDLEtBTmdCLENBR3ZCb0IsTUFIdUIsQ0FJckJnQixNQUpxQixDQUlaQyxjQUpZOztBQU96QixjQUFLTixrQkFBTCxDQUF3QjtBQUFDTSxVQUFBQSxjQUFjLEVBQUUsQ0FBQ0E7QUFBbEIsU0FBeEI7QUFDRCxPQXBHeUI7QUFBQSx3R0FzR1YsVUFBQUosQ0FBQyxFQUFJO0FBQ25CQSxRQUFBQSxDQUFDLENBQUNDLGVBQUY7O0FBQ0EsY0FBS2xDLEtBQUwsQ0FBV3NDLFlBQVgsQ0FBd0IsTUFBS3RDLEtBQUwsQ0FBV3VDLEdBQW5DO0FBQ0QsT0F6R3lCO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUEsMENBMkJOO0FBQ2xCLGFBQUt2QyxLQUFMLENBQVdtQixrQkFBWCxDQUE4QixLQUFLbkIsS0FBTCxDQUFXb0IsTUFBekMsRUFBaUQ7QUFDL0NGLFVBQUFBLFFBQVEsRUFBRSxLQUFLbEIsS0FBTCxDQUFXa0I7QUFEMEIsU0FBakQ7QUFHRDtBQS9CeUI7QUFBQTtBQUFBLGdEQWlDQXNCLFNBakNBLEVBaUNXO0FBQUE7O0FBQ25DLFlBQ0UsQ0FBQ0MsbUJBQUVDLE9BQUYsQ0FBVSxLQUFLMUMsS0FBTCxDQUFXa0IsUUFBckIsRUFBK0JzQixTQUFTLENBQUN0QixRQUF6QyxDQUFELElBQ0FzQixTQUFTLENBQUNHLE1BRFYsSUFFQUgsU0FBUyxDQUFDcEIsTUFBVixDQUFpQmdCLE1BQWpCLENBQXdCUSxNQUgxQixFQUlFO0FBQ0EsZUFBSzVDLEtBQUwsQ0FBV21CLGtCQUFYLENBQThCLEtBQUtuQixLQUFMLENBQVdvQixNQUF6QyxFQUFpRDtBQUMvQ3lCLFlBQUFBLGFBQWEsRUFBRTtBQURnQyxXQUFqRDtBQUdBQyxVQUFBQSxZQUFZLENBQUMsS0FBS0MsVUFBTixDQUFaO0FBQ0EsZUFBS0EsVUFBTCxHQUFrQkMsVUFBVSxDQUFDLFlBQU07QUFDakMsWUFBQSxNQUFJLENBQUNoRCxLQUFMLENBQVdtQixrQkFBWCxDQUE4QixNQUFJLENBQUNuQixLQUFMLENBQVdvQixNQUF6QyxFQUFpRDtBQUMvQ0YsY0FBQUEsUUFBUSxFQUFFc0IsU0FBUyxDQUFDdEI7QUFEMkIsYUFBakQ7O0FBR0E0QixZQUFBQSxZQUFZLENBQUMsTUFBSSxDQUFDQyxVQUFOLENBQVo7QUFDQSxZQUFBLE1BQUksQ0FBQ0EsVUFBTCxHQUFrQixDQUFsQjtBQUNELFdBTjJCLEVBTXpCLEdBTnlCLENBQTVCO0FBT0Q7QUFDRjtBQW5EeUI7QUFBQTtBQUFBLHVDQTJHVEUsRUEzR1MsRUEyR0w7QUFDbkIsWUFBSUMsV0FBVyxHQUFHLEtBQUtsRCxLQUFMLENBQVcyQyxNQUFYLENBQWtCUSxHQUFsQixDQUFzQixVQUFBQyxDQUFDLEVBQUk7QUFDM0MsY0FBSUEsQ0FBQyxDQUFDSCxFQUFGLEtBQVNBLEVBQWIsRUFBaUI7QUFDZixtQkFBT0csQ0FBQyxDQUFDaEIsTUFBRixDQUFTSixLQUFoQjtBQUNEO0FBQ0YsU0FKaUIsQ0FBbEI7QUFLQSxlQUFPa0IsV0FBUDtBQUNEO0FBbEh5QjtBQUFBO0FBQUEsK0JBb0hqQjtBQUFBLDBCQUNvRCxLQUFLbEQsS0FEekQ7QUFBQSxZQUNBb0IsTUFEQSxlQUNBQSxNQURBO0FBQUEsWUFDUXVCLE1BRFIsZUFDUUEsTUFEUjtBQUFBLFlBQ2dCSixHQURoQixlQUNnQkEsR0FEaEI7QUFBQSxZQUNxQmMsUUFEckIsZUFDcUJBLFFBRHJCO0FBQUEsWUFDK0JDLGlCQUQvQixlQUMrQkEsaUJBRC9CO0FBQUEsWUFFQWxCLE1BRkEsR0FFVWhCLE1BRlYsQ0FFQWdCLE1BRkE7QUFBQSxZQUdBQyxjQUhBLEdBR2tCRCxNQUhsQixDQUdBQyxjQUhBO0FBSVAsZUFDRSxnQ0FBQyxZQUFEO0FBQ0UsVUFBQSxNQUFNLEVBQUVBLGNBRFY7QUFFRSxVQUFBLFNBQVMsd0JBQWlCLEtBQUtyQyxLQUFMLENBQVd1RCxTQUE1QixDQUZYO0FBR0UsVUFBQSxLQUFLLEVBQUUsS0FBS3ZELEtBQUwsQ0FBV3dELEtBSHBCO0FBSUUsVUFBQSxXQUFXLEVBQUUsS0FBS3hELEtBQUwsQ0FBV3lELFdBSjFCO0FBS0UsVUFBQSxZQUFZLEVBQUUsS0FBS3pELEtBQUwsQ0FBVzBEO0FBTDNCLFdBT0UsZ0NBQUMsNkJBQUQ7QUFDRSxVQUFBLGNBQWMsRUFBRXJCLGNBRGxCO0FBRUUsVUFBQSxFQUFFLEVBQUVqQixNQUFNLENBQUM2QixFQUZiO0FBR0UsVUFBQSxHQUFHLEVBQUVWLEdBSFA7QUFJRSxVQUFBLFNBQVMsRUFBRUgsTUFBTSxDQUFDRCxTQUpwQjtBQUtFLFVBQUEsS0FBSyxFQUFFQyxNQUFNLENBQUNKLEtBTGhCO0FBTUUsVUFBQSxtQkFBbUIsRUFBRXFCLFFBQVEsQ0FBQ2pCLE1BQU0sQ0FBQ3VCLE1BQVIsQ0FBUixDQUF3QkMsS0FOL0M7QUFPRSxVQUFBLFVBQVUsRUFBRXhDLE1BQU0sQ0FBQ3lDLElBUHJCO0FBUUUsVUFBQSxvQkFBb0IsRUFBRSxLQUFLQyxtQkFSN0I7QUFTRSxVQUFBLGtCQUFrQixFQUFFLEtBQUtDLGlCQVQzQjtBQVVFLFVBQUEsbUJBQW1CLEVBQUUsS0FBS0Msa0JBVjVCO0FBV0UsVUFBQSxjQUFjLEVBQUUsS0FBS0M7QUFYdkIsVUFQRixFQW9CRzVCLGNBQWMsSUFDYixnQ0FBQyw4QkFBRDtBQUNFLFVBQUEsTUFBTSxFQUFFakIsTUFEVjtBQUVFLFVBQUEsTUFBTSxFQUFFdUIsTUFGVjtBQUdFLFVBQUEsUUFBUSxFQUFFVSxRQUhaO0FBSUUsVUFBQSxpQkFBaUIsRUFBRUMsaUJBSnJCO0FBS0UsVUFBQSxTQUFTLEVBQUUsS0FBS3RELEtBQUwsQ0FBV2tFLFNBTHhCO0FBTUUsVUFBQSxpQkFBaUIsRUFBRSxLQUFLbkMsa0JBTjFCO0FBT0UsVUFBQSw4QkFBOEIsRUFDNUIsS0FBS29DLCtCQVJUO0FBVUUsVUFBQSxlQUFlLEVBQUUsS0FBS0MsZ0JBVnhCO0FBV0UsVUFBQSxvQkFBb0IsRUFBRSxLQUFLQztBQVg3QixVQXJCSixFQW1DSWpELE1BQU0sQ0FBQ2tELElBQVAsS0FBZ0IsVUFBaEIsSUFDQWxDLE1BQU0sQ0FBQ0QsU0FEUCxJQUVBQyxNQUFNLENBQUN0QixjQUZQLElBR0FzQixNQUFNLENBQUNtQyxlQUhQLElBSUEseUJBQU9uQyxNQUFNLENBQUN0QixjQUFkLE1BQWlDLFFBSmxDLElBS0RzQixNQUFNLENBQUN0QixjQUFQLEtBQTBCLENBTHpCLEdBTUMsZ0NBQUMsbUJBQUQsUUFDRSxnQ0FBQyx5QkFBRCxRQUNHVCxxQkFBcUIsQ0FBQytCLE1BQU0sQ0FBQ21DLGVBQVIsQ0FEeEIsUUFDb0QsR0FEcEQsRUFFRyxLQUFLQyxnQkFBTCxDQUFzQnBDLE1BQU0sQ0FBQ3FDLGFBQVAsQ0FBcUJ4QixFQUEzQyxDQUZILFFBRXFELEdBRnJELEVBR0diLE1BQU0sQ0FBQ3NDLFNBSFYsQ0FERixFQU1FLGdDQUFDLHdCQUFELFFBQ0d0QyxNQUFNLENBQUNTLGFBQVAsR0FDQztBQUFLLFVBQUEsS0FBSyxFQUFFO0FBQUM4QixZQUFBQSxPQUFPLEVBQUUsY0FBVjtBQUEwQkMsWUFBQUEsU0FBUyxFQUFFO0FBQXJDO0FBQVosV0FDRSxnQ0FBQywwQkFBRCxPQURGLENBREQsR0FLQztBQUFLLFVBQUEsS0FBSyxFQUFFO0FBQUNoQixZQUFBQSxLQUFLLEVBQUU7QUFBUjtBQUFaLFdBQWlDeEIsTUFBTSxDQUFDdEIsY0FBeEMsQ0FOSixDQU5GLENBTkQsR0FzQkcsSUF6RE4sRUEwREdNLE1BQU0sQ0FBQ2tELElBQVAsS0FBZ0IsVUFBaEIsSUFDRGxDLE1BQU0sQ0FBQ0QsU0FETixJQUVEQyxNQUFNLENBQUN0QixjQUZOLElBR0RzQixNQUFNLENBQUN0QixjQUFQLENBQXNCK0QsTUFIckIsSUFJRHpDLE1BQU0sQ0FBQ21DLGVBSk4sR0FLQyxnQ0FBQyxtQkFBRCxRQUNHbkMsTUFBTSxDQUFDdEIsY0FBUCxDQUFzQnFDLEdBQXRCLENBQTBCLFVBQUEyQixFQUFFLEVBQUk7QUFDL0IsaUJBQ0UsZ0NBQUMsaUJBQUQsQ0FBTyxRQUFQLFFBQ0UsZ0NBQUMseUJBQUQ7QUFBMkIsWUFBQSxLQUFLLEVBQUU7QUFBQ0MsY0FBQUEsU0FBUyxFQUFFO0FBQVo7QUFBbEMsYUFDRTtBQUFLLFlBQUEsS0FBSyxFQUFFO0FBQUNKLGNBQUFBLE9BQU8sRUFBRSxNQUFWO0FBQWtCZixjQUFBQSxLQUFLLEVBQUU7QUFBekI7QUFBWixhQUNHa0IsRUFBRSxDQUFDLEdBQUQsQ0FETCxFQUNZLEdBRFosRUFFRTtBQUFLLFlBQUEsS0FBSyxFQUFFO0FBQUNFLGNBQUFBLFVBQVUsRUFBRTtBQUFiO0FBQVosYUFBbUNGLEVBQUUsQ0FBQyxHQUFELENBQXJDLENBRkYsQ0FERixDQURGLEVBT0UsZ0NBQUMsMkJBQUQ7QUFDRSxZQUFBLElBQUksRUFBRSxVQURSO0FBRUUsWUFBQSxLQUFLLEVBQUdBLEVBQUUsQ0FBQyxHQUFELENBQUYsR0FBVTFDLE1BQU0sQ0FBQ3RCLGNBQVAsQ0FBc0IsQ0FBdEIsRUFBeUIsR0FBekIsQ0FBWCxHQUE0QyxHQUZyRDtBQUdFLFlBQUEsaUJBQWlCLEVBQUU7QUFIckIsWUFQRixFQVlFLGdDQUFDLHdCQUFELE9BWkYsQ0FERjtBQWdCRCxTQWpCQSxDQURILENBTEQsR0F5QkcsSUFuRk4sQ0FERjtBQXVGRDtBQS9NeUI7QUFBQTtBQUFBLElBRUZtRSxnQkFGRSwwREFHUDtBQUNqQjdELElBQUFBLE1BQU0sRUFBRThELHNCQUFVQyxNQUFWLENBQWlCQyxVQURSO0FBRWpCL0IsSUFBQUEsUUFBUSxFQUFFNkIsc0JBQVVDLE1BQVYsQ0FBaUJDLFVBRlY7QUFHakI3QyxJQUFBQSxHQUFHLEVBQUUyQyxzQkFBVUcsTUFBVixDQUFpQkQsVUFITDtBQUlqQmpFLElBQUFBLGtCQUFrQixFQUFFK0Qsc0JBQVVuRSxJQUFWLENBQWVxRSxVQUpsQjtBQUtqQjlELElBQUFBLGdCQUFnQixFQUFFNEQsc0JBQVVuRSxJQUFWLENBQWVxRSxVQUxoQjtBQU1qQjtBQUNBbEIsSUFBQUEsU0FBUyxFQUFFZ0Isc0JBQVVuRSxJQUFWLENBQWVxRSxVQVBUO0FBUWpCOUMsSUFBQUEsWUFBWSxFQUFFNEMsc0JBQVVuRSxJQUFWLENBQWVxRSxVQVJaO0FBU2pCRSxJQUFBQSxhQUFhLEVBQUVKLHNCQUFVbkUsSUFUUjtBQVdqQnVDLElBQUFBLGlCQUFpQixFQUFFNEIsc0JBQVVLLE9BQVYsQ0FBa0JMLHNCQUFVTSxHQUE1QixDQVhGO0FBWWpCaEUsSUFBQUEscUJBQXFCLEVBQUUwRCxzQkFBVW5FLElBWmhCO0FBYWpCYSxJQUFBQSwrQkFBK0IsRUFBRXNELHNCQUFVbkUsSUFiMUI7QUFlakJHLElBQUFBLFFBQVEsRUFBRWdFLHNCQUFVQyxNQUFWLENBQWlCQztBQWZWLEdBSE87O0FBa041QixTQUFPeEUsV0FBUDtBQUNEOztlQUVjRCxrQjs7QUFFZjtBQUNFOzs7Ozs7Ozs7Ozs7QUFZRDtBQUVEO0FBQ0U7Ozs7OztBQU1EIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge3NvcnRhYmxlfSBmcm9tICdyZWFjdC1hbnl0aGluZy1zb3J0YWJsZSc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFdpZGdldENvbmZpZ3VyYXRvciBmcm9tICcuL3dpZGdldC1jb25maWd1cmF0b3InO1xuaW1wb3J0IFdpZGdldFBhbmVsSGVhZGVyIGZyb20gJy4vd2lkZ2V0LXBhbmVsLWhlYWRlcic7XG5pbXBvcnQgTG9hZGluZ1NwaW5uZXIgZnJvbSAnY29tcG9uZW50cy9jb21tb24vbG9hZGluZy1zcGlubmVyJztcbmltcG9ydCBTbGlkZXJIYW5kbGUgZnJvbSAnY29tcG9uZW50cy9jb21tb24vc2xpZGVyL3NsaWRlci1iYXItaGFuZGxlJztcbi8vIGltcG9ydCBsYXllcnMgZnJvbSAnLi4vLi4vLi4vLi4vZGlzdC9jb21wb25lbnRzL2NvbW1vbi9pY29ucy9sYXllcnMnO1xuXG5jb25zdCBQYW5lbFdyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBmb250LXNpemU6IDEycHg7XG4gIGJvcmRlci1yYWRpdXM6IDFweDtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xuXG4gICYuZHJhZ2dpbmcge1xuICAgIGN1cnNvcjogbW92ZTtcbiAgfVxuYDtcbmNvbnN0IFN0eWxlZFdpZGdldENvbnRlbnQgPSBzdHlsZWQuZGl2YFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZH07XG4gIHBhZGRpbmc6IDEycHg7XG5gO1xuY29uc3QgU3R5bGVkV2lkZ2V0Q29udGVudEhlYWRlciA9IHN0eWxlZC5kaXZgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kfTtcbiAgY29sb3I6ICM2YTc0ODU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiAxNHB4O1xuYDtcblxuY29uc3QgU3R5bGVkV2lkZ2V0Q29udGVudFZhbHVlID0gc3R5bGVkLmRpdmBcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmR9O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMzBweDtcbmA7XG5cbmZ1bmN0aW9uIGNhcGl0YWxpemVGaXJzdExldHRlcihzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBXaWRnZXRQYW5lbEZhY3RvcnkoKSB7XG4gIEBzb3J0YWJsZVxuICBjbGFzcyBXaWRnZXRQYW5lbCBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgIHdpZGdldDogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgZGF0YXNldHM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGlkeDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAgICAgd2lkZ2V0Q29uZmlnQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgd2lkZ2V0VHlwZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIC8vIGxheWVyczogcHJvcFR5cGVzLmFycmF5T2YocHJvcFR5cGVzLmFueSksXG4gICAgICBvcGVuTW9kYWw6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICByZW1vdmVXaWRnZXQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBvbkNsb3NlQ29uZmlnOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgd2lkZ2V0VHlwZU9wdGlvbnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLFxuICAgICAgd2lkZ2V0VmlzQ29uZmlnQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIHdpZGdldFZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICBtYXBTdGF0ZTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG4gICAgfTtcblxuICAgIHN0YXRlID0ge1xuICAgICAgYWdncmVnYXRlZERhdGE6IG51bGxcbiAgICB9O1xuXG4gICAgaW5EZWJvdW5jZSA9IDA7XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMucHJvcHMud2lkZ2V0Q29uZmlnQ2hhbmdlKHRoaXMucHJvcHMud2lkZ2V0LCB7XG4gICAgICAgIG1hcFN0YXRlOiB0aGlzLnByb3BzLm1hcFN0YXRlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgaWYgKFxuICAgICAgICAhXy5pc0VxdWFsKHRoaXMucHJvcHMubWFwU3RhdGUsIG5leHRQcm9wcy5tYXBTdGF0ZSkgJiZcbiAgICAgICAgbmV4dFByb3BzLmxheWVycyAmJlxuICAgICAgICBuZXh0UHJvcHMud2lkZ2V0LmNvbmZpZy5ib3VuZHNcbiAgICAgICkge1xuICAgICAgICB0aGlzLnByb3BzLndpZGdldENvbmZpZ0NoYW5nZSh0aGlzLnByb3BzLndpZGdldCwge1xuICAgICAgICAgIGlzQ2FsY3VsYXRpbmc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmluRGVib3VuY2UpO1xuICAgICAgICB0aGlzLmluRGVib3VuY2UgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnByb3BzLndpZGdldENvbmZpZ0NoYW5nZSh0aGlzLnByb3BzLndpZGdldCwge1xuICAgICAgICAgICAgbWFwU3RhdGU6IG5leHRQcm9wcy5tYXBTdGF0ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmluRGVib3VuY2UpO1xuICAgICAgICAgIHRoaXMuaW5EZWJvdW5jZSA9IDA7XG4gICAgICAgIH0sIDMwMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlU3RhdGUgPSBmdW5jID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2FnZ3JlZ2F0ZWREYXRhOiBmdW5jfSk7XG4gICAgfTtcblxuICAgIHVwZGF0ZVdpZGdldENvbmZpZyA9IG5ld1Byb3AgPT4ge1xuICAgICAgbmV3UHJvcCA9IHtcbiAgICAgICAgLi4ubmV3UHJvcCxcbiAgICAgICAgbWFwU3RhdGU6IHRoaXMucHJvcHMubWFwU3RhdGVcbiAgICAgIH07XG4gICAgICB0aGlzLnByb3BzLndpZGdldENvbmZpZ0NoYW5nZSh0aGlzLnByb3BzLndpZGdldCwgbmV3UHJvcCk7XG4gICAgfTtcblxuICAgIHVwZGF0ZVdpZGdldFR5cGUgPSBuZXdUeXBlID0+IHtcbiAgICAgIHRoaXMucHJvcHMud2lkZ2V0VHlwZUNoYW5nZSh0aGlzLnByb3BzLndpZGdldCwgbmV3VHlwZSk7XG4gICAgfTtcblxuICAgIHVwZGF0ZVdpZGdldFZpc0NvbmZpZyA9IG5ld1Zpc0NvbmZpZyA9PiB7XG4gICAgICB0aGlzLnByb3BzLndpZGdldFZpc0NvbmZpZ0NoYW5nZSh0aGlzLnByb3BzLndpZGdldCwgbmV3VmlzQ29uZmlnKTtcbiAgICB9O1xuXG4gICAgdXBkYXRlV2lkZ2V0VmlzdWFsQ2hhbm5lbENvbmZpZyA9IChuZXdDb25maWcsIGNoYW5uZWwsIHNjYWxlS2V5KSA9PiB7XG4gICAgICB0aGlzLnByb3BzLndpZGdldFZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UoXG4gICAgICAgIHRoaXMucHJvcHMud2lkZ2V0LFxuICAgICAgICBuZXdDb25maWcsXG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHNjYWxlS2V5XG4gICAgICApO1xuICAgIH07XG5cbiAgICBfdXBkYXRlV2lkZ2V0TGFiZWwgPSAoe3RhcmdldDoge3ZhbHVlfX0pID0+IHtcbiAgICAgIHRoaXMudXBkYXRlV2lkZ2V0Q29uZmlnKHtsYWJlbDogdmFsdWV9KTtcbiAgICB9O1xuXG4gICAgX3RvZ2dsZVZpc2liaWxpdHkgPSBlID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBpc1Zpc2libGUgPSAhdGhpcy5wcm9wcy53aWRnZXQuY29uZmlnLmlzVmlzaWJsZTtcbiAgICAgIHRoaXMudXBkYXRlV2lkZ2V0Q29uZmlnKHtpc1Zpc2libGV9KTtcbiAgICB9O1xuXG4gICAgX3RvZ2dsZUVuYWJsZUNvbmZpZyA9IGUgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkZ2V0OiB7XG4gICAgICAgICAgY29uZmlnOiB7aXNDb25maWdBY3RpdmV9XG4gICAgICAgIH1cbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgdGhpcy51cGRhdGVXaWRnZXRDb25maWcoe2lzQ29uZmlnQWN0aXZlOiAhaXNDb25maWdBY3RpdmV9KTtcbiAgICB9O1xuXG4gICAgX3JlbW92ZVdpZGdldCA9IGUgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMucHJvcHMucmVtb3ZlV2lkZ2V0KHRoaXMucHJvcHMuaWR4KTtcbiAgICB9O1xuXG4gICAgX3JlbmRlckxheWVyTmFtZShpZCkge1xuICAgICAgdmFyIHBsYWNlaG9sZGVyID0gdGhpcy5wcm9wcy5sYXllcnMubWFwKGwgPT4ge1xuICAgICAgICBpZiAobC5pZCA9PT0gaWQpIHtcbiAgICAgICAgICByZXR1cm4gbC5jb25maWcubGFiZWw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHt3aWRnZXQsIGxheWVycywgaWR4LCBkYXRhc2V0cywgd2lkZ2V0VHlwZU9wdGlvbnN9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHtjb25maWd9ID0gd2lkZ2V0O1xuICAgICAgY29uc3Qge2lzQ29uZmlnQWN0aXZlfSA9IGNvbmZpZztcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxQYW5lbFdyYXBwZXJcbiAgICAgICAgICBhY3RpdmU9e2lzQ29uZmlnQWN0aXZlfVxuICAgICAgICAgIGNsYXNzTmFtZT17YGxheWVyLXBhbmVsICR7dGhpcy5wcm9wcy5jbGFzc05hbWV9YH1cbiAgICAgICAgICBzdHlsZT17dGhpcy5wcm9wcy5zdHlsZX1cbiAgICAgICAgICBvbk1vdXNlRG93bj17dGhpcy5wcm9wcy5vbk1vdXNlRG93bn1cbiAgICAgICAgICBvblRvdWNoU3RhcnQ9e3RoaXMucHJvcHMub25Ub3VjaFN0YXJ0fVxuICAgICAgICA+XG4gICAgICAgICAgPFdpZGdldFBhbmVsSGVhZGVyXG4gICAgICAgICAgICBpc0NvbmZpZ0FjdGl2ZT17aXNDb25maWdBY3RpdmV9XG4gICAgICAgICAgICBpZD17d2lkZ2V0LmlkfVxuICAgICAgICAgICAgaWR4PXtpZHh9XG4gICAgICAgICAgICBpc1Zpc2libGU9e2NvbmZpZy5pc1Zpc2libGV9XG4gICAgICAgICAgICBsYWJlbD17Y29uZmlnLmxhYmVsfVxuICAgICAgICAgICAgbGFiZWxSQ0dDb2xvclZhbHVlcz17ZGF0YXNldHNbY29uZmlnLmRhdGFJZF0uY29sb3J9XG4gICAgICAgICAgICB3aWRnZXRUeXBlPXt3aWRnZXQubmFtZX1cbiAgICAgICAgICAgIG9uVG9nZ2xlRW5hYmxlQ29uZmlnPXt0aGlzLl90b2dnbGVFbmFibGVDb25maWd9XG4gICAgICAgICAgICBvblRvZ2dsZVZpc2liaWxpdHk9e3RoaXMuX3RvZ2dsZVZpc2liaWxpdHl9XG4gICAgICAgICAgICBvblVwZGF0ZVdpZGdldExhYmVsPXt0aGlzLl91cGRhdGVXaWRnZXRMYWJlbH1cbiAgICAgICAgICAgIG9uUmVtb3ZlV2lkZ2V0PXt0aGlzLl9yZW1vdmVXaWRnZXR9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7aXNDb25maWdBY3RpdmUgJiYgKFxuICAgICAgICAgICAgPFdpZGdldENvbmZpZ3VyYXRvclxuICAgICAgICAgICAgICB3aWRnZXQ9e3dpZGdldH1cbiAgICAgICAgICAgICAgbGF5ZXJzPXtsYXllcnN9XG4gICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgd2lkZ2V0VHlwZU9wdGlvbnM9e3dpZGdldFR5cGVPcHRpb25zfVxuICAgICAgICAgICAgICBvcGVuTW9kYWw9e3RoaXMucHJvcHMub3Blbk1vZGFsfVxuICAgICAgICAgICAgICB1cGRhdGVMYXllckNvbmZpZz17dGhpcy51cGRhdGVXaWRnZXRDb25maWd9XG4gICAgICAgICAgICAgIHVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZz17XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRWaXN1YWxDaGFubmVsQ29uZmlnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdXBkYXRlTGF5ZXJUeXBlPXt0aGlzLnVwZGF0ZVdpZGdldFR5cGV9XG4gICAgICAgICAgICAgIHVwZGF0ZUxheWVyVmlzQ29uZmlnPXt0aGlzLnVwZGF0ZVdpZGdldFZpc0NvbmZpZ31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7KHdpZGdldC50eXBlID09PSAnRnVuY3Rpb24nICYmXG4gICAgICAgICAgICBjb25maWcuaXNWaXNpYmxlICYmXG4gICAgICAgICAgICBjb25maWcuYWdncmVnYXRlZERhdGEgJiZcbiAgICAgICAgICAgIGNvbmZpZy5hZ2dyZWdhdGlvblR5cGUgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25maWcuYWdncmVnYXRlZERhdGEgIT09ICdvYmplY3QnKSB8fFxuICAgICAgICAgIGNvbmZpZy5hZ2dyZWdhdGVkRGF0YSA9PT0gMCA/IChcbiAgICAgICAgICAgIDxTdHlsZWRXaWRnZXRDb250ZW50PlxuICAgICAgICAgICAgICA8U3R5bGVkV2lkZ2V0Q29udGVudEhlYWRlcj5cbiAgICAgICAgICAgICAgICB7Y2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGNvbmZpZy5hZ2dyZWdhdGlvblR5cGUpfSA6eycgJ31cbiAgICAgICAgICAgICAgICB7dGhpcy5fcmVuZGVyTGF5ZXJOYW1lKGNvbmZpZy5zZWxlY3RlZExheWVyLmlkKX0gOnsnICd9XG4gICAgICAgICAgICAgICAge2NvbmZpZy5maWVsZE5hbWV9XG4gICAgICAgICAgICAgIDwvU3R5bGVkV2lkZ2V0Q29udGVudEhlYWRlcj5cbiAgICAgICAgICAgICAgPFN0eWxlZFdpZGdldENvbnRlbnRWYWx1ZT5cbiAgICAgICAgICAgICAgICB7Y29uZmlnLmlzQ2FsY3VsYXRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7ZGlzcGxheTogJ2lubGluZS1ibG9jaycsIG1hcmdpblRvcDogJzVweCd9fT5cbiAgICAgICAgICAgICAgICAgICAgPExvYWRpbmdTcGlubmVyIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e2NvbG9yOiAnIzZhNzQ4NSd9fT57Y29uZmlnLmFnZ3JlZ2F0ZWREYXRhfTwvZGl2PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvU3R5bGVkV2lkZ2V0Q29udGVudFZhbHVlPlxuICAgICAgICAgICAgPC9TdHlsZWRXaWRnZXRDb250ZW50PlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIHt3aWRnZXQudHlwZSA9PT0gJ0NhdGVnb3J5JyAmJlxuICAgICAgICAgIGNvbmZpZy5pc1Zpc2libGUgJiZcbiAgICAgICAgICBjb25maWcuYWdncmVnYXRlZERhdGEgJiZcbiAgICAgICAgICBjb25maWcuYWdncmVnYXRlZERhdGEubGVuZ3RoICYmXG4gICAgICAgICAgY29uZmlnLmFnZ3JlZ2F0aW9uVHlwZSA/IChcbiAgICAgICAgICAgIDxTdHlsZWRXaWRnZXRDb250ZW50PlxuICAgICAgICAgICAgICB7Y29uZmlnLmFnZ3JlZ2F0ZWREYXRhLm1hcChhZCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFdpZGdldENvbnRlbnRIZWFkZXIgc3R5bGU9e3t0ZXh0QWxpZ246ICdpbmhlcml0J319PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tkaXNwbGF5OiAnZmxleCcsIGNvbG9yOiAnIzZhNzQ4NSd9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHthZFsneSddfXsnICd9XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7bWFyZ2luTGVmdDogJ2F1dG8nfX0+e2FkWyd4J119PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkV2lkZ2V0Q29udGVudEhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPFNsaWRlckhhbmRsZVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9eydjYXRlZ29yeSd9XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9eyhhZFsneCddIC8gY29uZmlnLmFnZ3JlZ2F0ZWREYXRhWzBdWyd4J10pICogMTAwfVxuICAgICAgICAgICAgICAgICAgICAgIHNsaWRlckJhckxpc3RlbmVyPXtudWxsfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkV2lkZ2V0Q29udGVudFZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9TdHlsZWRXaWRnZXRDb250ZW50PlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L1BhbmVsV3JhcHBlcj5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFdpZGdldFBhbmVsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBXaWRnZXRQYW5lbEZhY3Rvcnk7XG5cbntcbiAgLyogPFN0eWxlZFdpZGdldENvbnRlbnQ+XG4gICAgICAgICAgICAgIHtjb25maWcuYWdncmVnYXRlZERhdGEubWFwKGFkID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkV2lkZ2V0Q29udGVudEhlYWRlciBzdHlsZT17e3RleHRBbGlnbjogJ2luaGVyaXQnfX0+XG4gICAgICAgICAgICAgICAgICAgICAge2FkWzBdfS17YWRbMV19XG4gICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkV2lkZ2V0Q29udGVudEhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFdpZGdldENvbnRlbnRWYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvU3R5bGVkV2lkZ2V0Q29udGVudD4gKi9cbn1cblxue1xuICAvKiA8V2lkZ2V0QmFyQ2hhcnRcbiAgICAgICAgICAgICAgZGF0YT17Y29uZmlnLmFnZ3JlZ2F0ZWREYXRhfVxuICAgICAgICAgICAgICBoZWlnaHQ9ezk2Ljl9XG4gICAgICAgICAgICAgIHdpZHRoPXsxOTEuNn1cbiAgICAgICAgICAgICAgbWFyZ2luPXswfVxuICAgICAgICAgICAgLz4gKi9cbn1cbiJdfQ==