kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
467 lines (465 loc) • 87 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"] = exports.TableSection = exports.Container = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
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 _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _reactVirtualized = require("react-virtualized");
var _styledComponents = _interopRequireWildcard(require("styled-components"));
var _classnames2 = _interopRequireDefault(require("classnames"));
var _reselect = require("reselect");
var _lodash = _interopRequireDefault(require("lodash.get"));
var _lodash2 = _interopRequireDefault(require("lodash.debounce"));
var _icons = require("../icons");
var _grid = _interopRequireDefault(require("./grid"));
var _headerCell = _interopRequireDefault(require("./header-cell"));
var _utils = require("@kepler.gl/utils");
var _cellSize = require("./cell-size");
var _constants = require("@kepler.gl/constants");
var _templateObject, _templateObject2; // 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 defaultHeaderRowHeight = 55;
var defaultHeaderStatsControlHeight = 40;
var defaultRowHeight = 32;
var overscanColumnCount = 10;
var overscanRowCount = 10;
// The default scrollbar width can range anywhere from 12px to 17px
var browserScrollBarWidth = 17;
var fieldToAlignRight = (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.ALL_FIELD_TYPES.integer, true), _constants.ALL_FIELD_TYPES.real, true);
var pinnedClassList = {
header: 'pinned-columns--header pinned-grid-container',
rows: 'pinned-columns--rows pinned-grid-container'
};
var unpinnedClassList = {
header: 'unpinned-columns--header unpinned-grid-container',
rows: 'unpinned-columns--rows unpinned-grid-container'
};
var Container = exports.Container = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n font-size: 11px;\n flex-grow: 1;\n color: ", ";\n width: 100%;\n position: relative;\n .ReactVirtualized__Grid:focus,\n .ReactVirtualized__Grid:active {\n outline: 0;\n }\n .body-grid {\n ", "\n }\n\n .cell {\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n *:focus {\n outline: 0;\n }\n\n .results-table-wrapper {\n position: relative;\n min-height: 100%;\n max-height: 100%;\n display: flex;\n flex-direction: row;\n flex-grow: 1;\n overflow: hidden;\n\n .scroll-in-ui-thread.pinned-columns--header {\n overflow: hidden;\n border-bottom: 1px solid ", ";\n padding-bottom: ", "px;\n }\n .scroll-in-ui-thread.unpinned-columns--header {\n width: 100vw;\n overflow: hidden;\n border-bottom: 1px solid ", ";\n // leave room for scrollbar\n padding-bottom: ", "px;\n }\n\n .scroll-in-ui-thread::after {\n content: '';\n height: 100%;\n left: 0;\n position: absolute;\n pointer-events: none;\n top: 0;\n width: 100%;\n }\n\n .grid-row {\n position: relative;\n display: flex;\n flex-direction: row;\n }\n .grid-column {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n }\n .pinned-grid-container {\n flex: 0 0 75px;\n z-index: 10;\n position: absolute;\n left: 0;\n top: 0;\n border-right: 2px solid ", ";\n }\n .even-row {\n background-color: ", ";\n }\n .odd-row {\n background-color: ", ";\n }\n .cell,\n .header-cell {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: flex-start;\n text-align: center;\n overflow: hidden;\n // header border is rendered by header container\n border-bottom: 0;\n .n-sort-idx {\n font-size: 9px;\n }\n }\n .cell {\n border-bottom: 1px solid ", ";\n border-right: 1px solid ", ";\n white-space: nowrap;\n overflow: auto;\n padding: 0 ", "px;\n font-size: ", "px;\n\n .result-link {\n text-decoration: none;\n }\n }\n .cell.end-cell,\n .header-cell.end-cell {\n border-right: none;\n padding-right: ", "px;\n }\n .cell.first-cell,\n .header-cell.first-cell {\n padding-left: ", "px;\n }\n .cell.bottom-cell {\n border-bottom: none;\n }\n .cell.align-right {\n align-items: flex-end;\n }\n }\n\n &:focus {\n outline: none;\n }\n"])), function (props) {
return props.theme.dataTableTextColor;
}, function (props) {
return props.hasCustomScrollBarStyle && props.theme.modalScrollBar;
}, function (props) {
return props.theme.cellBorderColor;
}, browserScrollBarWidth, function (props) {
return props.theme.cellBorderColor;
}, browserScrollBarWidth, function (props) {
return props.theme.pinnedGridBorderColor;
}, function (props) {
return props.theme.evenRowBackground;
}, function (props) {
return props.theme.oddRowBackground;
}, function (props) {
return props.theme.cellBorderColor;
}, function (props) {
return props.theme.cellBorderColor;
}, function (props) {
return props.theme.cellPaddingSide;
}, function (props) {
return props.theme.cellFontSize;
}, function (props) {
return props.theme.cellPaddingSide + props.theme.edgeCellPaddingSide;
}, function (props) {
return props.theme.cellPaddingSide + props.theme.edgeCellPaddingSide;
});
var defaultColumnWidth = 200;
var columnWidthFunction = function columnWidthFunction(columns, cellSizeCache, ghost) {
return function (_ref) {
var index = _ref.index;
return (columns[index] || {}).ghost ? ghost : cellSizeCache[columns[index]] || defaultColumnWidth;
};
};
/*
* This is an accessor method used to generalize getting a cell from a data row
*/
var defaultGetRowCell = function defaultGetRowCell(_ref2, formatter) {
var dataContainer = _ref2.dataContainer,
columns = _ref2.columns,
column = _ref2.column,
colMeta = _ref2.colMeta,
rowIndex = _ref2.rowIndex,
sortOrder = _ref2.sortOrder;
var rowIdx = sortOrder && sortOrder.length ? (0, _lodash["default"])(sortOrder, rowIndex) : rowIndex;
var type = colMeta[column].type;
var value = dataContainer === null || dataContainer === void 0 ? void 0 : dataContainer.valueAt(rowIdx, columns.indexOf(column));
return value === null || value === undefined || value === '' ? '' : formatter ? formatter(value) : (0, _utils.parseFieldValue)(value, type);
};
var StyledStatsControl = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n height: ", "px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: stretch;\n position: absolute;\n top: ", "px;\n font-family: ", "px;\n font-size: 12px;\n color: ", ";\n background-color: ", ";\n &:hover {\n cursor: pointer;\n }\n\n > div {\n padding: 0px 24px;\n display: flex;\n align-items: center;\n\n svg {\n margin-left: 12px;\n transition: transform 0.5s ease;\n transform: rotate(", "deg);\n }\n }\n"])), function (props) {
return props.theme.headerStatsControlHeight;
}, function (props) {
return props.top;
}, function (props) {
return props.theme.fontFamilyMedium;
}, function (props) {
return props.theme.activeColor;
}, function (props) {
return props.theme.headerCellStatsControlBackground;
}, function (props) {
return props.showStats ? 180 : 0;
});
var StatsControl = function StatsControl(_ref3) {
var top = _ref3.top,
showStats = _ref3.showStats,
toggleShowStats = _ref3.toggleShowStats;
return /*#__PURE__*/_react["default"].createElement(StyledStatsControl, {
top: top,
showStats: showStats
}, /*#__PURE__*/_react["default"].createElement("div", {
onClick: toggleShowStats
}, showStats ? 'Hide Column Stats' : 'Show Column Stats', /*#__PURE__*/_react["default"].createElement(_icons.ArrowDown, {
height: "18px"
})));
};
var TableSection = exports.TableSection = function TableSection(_ref4) {
var classList = _ref4.classList,
isPinned = _ref4.isPinned,
columns = _ref4.columns,
headerGridProps = _ref4.headerGridProps,
fixedWidth = _ref4.fixedWidth,
_ref4$fixedHeight = _ref4.fixedHeight,
fixedHeight = _ref4$fixedHeight === void 0 ? undefined : _ref4$fixedHeight,
onScroll = _ref4.onScroll,
scrollTop = _ref4.scrollTop,
dataGridProps = _ref4.dataGridProps,
columnWidth = _ref4.columnWidth,
_ref4$setGridRef = _ref4.setGridRef,
setGridRef = _ref4$setGridRef === void 0 ? undefined : _ref4$setGridRef,
headerCellRender = _ref4.headerCellRender,
dataCellRender = _ref4.dataCellRender,
_ref4$scrollLeft = _ref4.scrollLeft,
scrollLeft = _ref4$scrollLeft === void 0 ? 0 : _ref4$scrollLeft;
var headerHeight = headerGridProps.height;
var headerStyle = (0, _react.useMemo)(function () {
return {
height: "".concat(headerHeight, "px")
};
}, [headerHeight]);
var contentStyle = (0, _react.useMemo)(function () {
return {
top: "".concat(headerHeight, "px")
};
}, [headerHeight]);
return /*#__PURE__*/_react["default"].createElement(_reactVirtualized.AutoSizer, null, function (_ref5) {
var width = _ref5.width,
height = _ref5.height;
var gridDimension = {
columnCount: columns.length,
columnWidth: columnWidth,
width: fixedWidth || width
};
var headerGridWidth = fixedWidth || width;
var dataGridHeight = fixedHeight || height;
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
className: (0, _classnames2["default"])('scroll-in-ui-thread', classList === null || classList === void 0 ? void 0 : classList.header),
style: headerStyle
}, /*#__PURE__*/_react["default"].createElement(_grid["default"], (0, _extends2["default"])({
cellRenderer: headerCellRender
}, headerGridProps, gridDimension, {
height: headerGridProps.height + browserScrollBarWidth,
width: headerGridWidth,
scrollLeft: scrollLeft,
onScroll: onScroll
}))), /*#__PURE__*/_react["default"].createElement("div", {
className: (0, _classnames2["default"])('scroll-in-ui-thread', classList === null || classList === void 0 ? void 0 : classList.rows),
style: contentStyle
}, /*#__PURE__*/_react["default"].createElement(_grid["default"], (0, _extends2["default"])({
cellRenderer: dataCellRender
}, dataGridProps, gridDimension, {
className: isPinned ? 'pinned-grid' : 'body-grid',
height: dataGridHeight - headerGridProps.height,
onScroll: onScroll,
scrollLeft: scrollLeft,
scrollTop: scrollTop,
setGridRef: setGridRef
}))));
});
};
var DUMMY_STYLE = {};
DataTableFactory.deps = [_headerCell["default"]];
function DataTableFactory(HeaderCell) {
var DataTable = /*#__PURE__*/function (_Component) {
function DataTable() {
var _this;
(0, _classCallCheck2["default"])(this, DataTable);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _callSuper(this, DataTable, [].concat(args));
(0, _defineProperty2["default"])(_this, "pinnedGrid", null);
(0, _defineProperty2["default"])(_this, "unpinnedGrid", null);
(0, _defineProperty2["default"])(_this, "hasMounted", false);
(0, _defineProperty2["default"])(_this, "state", {
cellSizeCache: {},
moreOptionsColumn: null,
showStats: true
});
(0, _defineProperty2["default"])(_this, "root", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2["default"])(_this, "columns", function (props) {
return props.columns;
});
(0, _defineProperty2["default"])(_this, "pinnedColumns", function (props) {
return props.pinnedColumns;
});
(0, _defineProperty2["default"])(_this, "unpinnedColumns", (0, _reselect.createSelector)(_this.columns, _this.pinnedColumns, function (columns, pinnedColumns) {
return !Array.isArray(pinnedColumns) ? columns : columns.filter(function (c) {
return !pinnedColumns.includes(c);
});
}));
(0, _defineProperty2["default"])(_this, "toggleMoreOptions", function (moreOptionsColumn) {
if (_this.hasMounted) _this.setState({
moreOptionsColumn: _this.state.moreOptionsColumn === moreOptionsColumn ? null : moreOptionsColumn
});
});
(0, _defineProperty2["default"])(_this, "toggleShowStats", function () {
if (_this.hasMounted) _this.setState({
showStats: !_this.state.showStats
});
});
(0, _defineProperty2["default"])(_this, "getCellSizeCache", function () {
var _this$props = _this.props,
_this$props$cellSizeC = _this$props.cellSizeCache,
propsCache = _this$props$cellSizeC === void 0 ? {} : _this$props$cellSizeC,
fixedWidth = _this$props.fixedWidth,
_this$props$pinnedCol = _this$props.pinnedColumns,
pinnedColumns = _this$props$pinnedCol === void 0 ? [] : _this$props$pinnedCol;
var unpinnedColumns = _this.unpinnedColumns(_this.props);
var width = fixedWidth ? fixedWidth : _this.root.current ? _this.root.current.clientWidth : 0;
// pin column border is 2 pixel vs 1 pixel
var adjustWidth = pinnedColumns.length ? width - 1 : width;
var _ref6 = (0, _cellSize.adjustCellsToContainer)(adjustWidth, propsCache, pinnedColumns, unpinnedColumns),
cellSizeCache = _ref6.cellSizeCache,
ghost = _ref6.ghost;
return {
cellSizeCache: cellSizeCache,
ghost: ghost
};
});
(0, _defineProperty2["default"])(_this, "doScaleCellsToWidth", function () {
if (_this.hasMounted) _this.setState(_this.getCellSizeCache());
});
(0, _defineProperty2["default"])(_this, "scaleCellsToWidth", (0, _lodash2["default"])(_this.doScaleCellsToWidth, 300));
(0, _defineProperty2["default"])(_this, "renderDataCell", function (columns, isPinned, props) {
var _this$props$getRowCel;
var getRowCell = (_this$props$getRowCel = _this.props.getRowCell) !== null && _this$props$getRowCel !== void 0 ? _this$props$getRowCel : defaultGetRowCell;
var DataCellRenderer = function DataCellRenderer(cellInfo) {
var columnIndex = cellInfo.columnIndex,
key = cellInfo.key,
style = cellInfo.style,
rowIndex = cellInfo.rowIndex;
var dataContainer = props.dataContainer,
colMeta = props.colMeta;
var column = columns[columnIndex];
var isGhost = column.ghost;
var formatter = isGhost ? null : (0, _utils.getColumnFormatter)(colMeta[column]);
var rowCell = isGhost ? '' : getRowCell(_objectSpread(_objectSpread({}, props), {}, {
column: column,
rowIndex: rowIndex
}), formatter);
var type = isGhost ? null : colMeta[column].type;
var lastRowIndex = dataContainer ? dataContainer.numRows() - 1 : 0;
var endCell = columnIndex === columns.length - 1;
var firstCell = columnIndex === 0;
var bottomCell = rowIndex === lastRowIndex;
var alignRight = fieldToAlignRight[Number(type)];
var cell = /*#__PURE__*/_react["default"].createElement("div", {
className: (0, _classnames2["default"])('cell', (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, rowIndex % 2 === 0 ? 'even-row' : 'odd-row', true), "row-".concat(rowIndex), true), 'pinned-cell', isPinned), 'first-cell', firstCell), 'end-cell', endCell), 'bottom-cell', bottomCell), 'align-right', alignRight)),
key: key,
style: style,
title: isGhost ? undefined : rowCell
}, "".concat(rowCell).concat(endCell ? '\n' : '\t'));
return cell;
};
return DataCellRenderer;
});
return _this;
}
(0, _inherits2["default"])(DataTable, _Component);
return (0, _createClass2["default"])(DataTable, [{
key: "componentDidMount",
value: function componentDidMount() {
this.hasMounted = true;
window.addEventListener('resize', this.scaleCellsToWidth);
this.scaleCellsToWidth();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
if (this.props.cellSizeCache !== prevProps.cellSizeCache || this.props.pinnedColumns !== prevProps.pinnedColumns) {
this.scaleCellsToWidth();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.hasMounted = false;
window.removeEventListener('resize', this.scaleCellsToWidth);
}
}, {
key: "renderHeaderCell",
value: function renderHeaderCell(columns, isPinned, props, toggleMoreOptions, moreOptionsColumn) {
var _this2 = this;
var HeaderCellRenderer = function HeaderCellRenderer(cellInfo) {
return /*#__PURE__*/_react["default"].createElement(HeaderCell, {
cellInfo: cellInfo,
key: cellInfo.columnIndex,
columns: columns,
isPinned: isPinned,
showStats: _this2.state.showStats,
props: props,
toggleMoreOptions: toggleMoreOptions,
moreOptionsColumn: moreOptionsColumn
// pass dummy style to prevent warnings from react-virtualized Grid
,
style: DUMMY_STYLE
});
};
return HeaderCellRenderer;
}
}, {
key: "render",
value: function render() {
var _this3 = this;
var _this$props2 = this.props,
dataContainer = _this$props2.dataContainer,
_this$props2$pinnedCo = _this$props2.pinnedColumns,
pinnedColumns = _this$props2$pinnedCo === void 0 ? [] : _this$props2$pinnedCo,
_this$props2$theme = _this$props2.theme,
theme = _this$props2$theme === void 0 ? {} : _this$props2$theme,
fixedWidth = _this$props2.fixedWidth,
_this$props2$fixedHei = _this$props2.fixedHeight,
fixedHeight = _this$props2$fixedHei === void 0 ? 0 : _this$props2$fixedHei,
hasStats = _this$props2.hasStats,
hasCustomScrollBarStyle = _this$props2.hasCustomScrollBarStyle;
var unpinnedColumns = this.unpinnedColumns(this.props);
var _this$state = this.state,
_this$state$cellSizeC = _this$state.cellSizeCache,
cellSizeCache = _this$state$cellSizeC === void 0 ? {} : _this$state$cellSizeC,
moreOptionsColumn = _this$state.moreOptionsColumn,
ghost = _this$state.ghost,
showStats = _this$state.showStats;
var unpinnedColumnsGhost = ghost ? [].concat((0, _toConsumableArray2["default"])(unpinnedColumns), [{
ghost: true
}]) : unpinnedColumns;
var pinnedColumnsWidth = pinnedColumns.reduce(function (acc, val) {
return acc + (0, _lodash["default"])(cellSizeCache, val, 0);
}, 0);
var hasPinnedColumns = Boolean(pinnedColumns.length);
var _theme$headerRowHeigh = theme.headerRowHeight,
headerRowHeight = _theme$headerRowHeigh === void 0 ? defaultHeaderRowHeight : _theme$headerRowHeigh,
_theme$headerStatsCon = theme.headerStatsControlHeight,
headerStatsControlHeight = _theme$headerStatsCon === void 0 ? defaultHeaderStatsControlHeight : _theme$headerStatsCon,
_theme$headerRowWStat = theme.headerRowWStatsHeight,
headerRowWStatsHeight = _theme$headerRowWStat === void 0 ? defaultHeaderRowHeight : _theme$headerRowWStat,
_theme$rowHeight = theme.rowHeight,
rowHeight = _theme$rowHeight === void 0 ? defaultRowHeight : _theme$rowHeight;
var headerGridProps = {
cellSizeCache: cellSizeCache,
className: 'header-grid',
height: !hasStats ? headerRowHeight : showStats ? headerRowWStatsHeight : headerRowHeight + headerStatsControlHeight,
rowCount: 1,
rowHeight: !hasStats ? headerRowHeight : showStats ? headerRowWStatsHeight : headerRowHeight + headerStatsControlHeight
};
var dataGridProps = {
cellSizeCache: cellSizeCache,
overscanColumnCount: overscanColumnCount,
overscanRowCount: overscanRowCount,
rowCount: dataContainer ? dataContainer.numRows() : 0,
rowHeight: rowHeight
};
return /*#__PURE__*/_react["default"].createElement(Container, {
className: "data-table-container",
ref: this.root,
hasCustomScrollBarStyle: hasCustomScrollBarStyle
}, Object.keys(cellSizeCache).length ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_reactVirtualized.ScrollSync, null, function (_ref7) {
var _onScroll = _ref7.onScroll,
scrollLeft = _ref7.scrollLeft,
scrollTop = _ref7.scrollTop;
return /*#__PURE__*/_react["default"].createElement("div", {
className: "results-table-wrapper"
}, hasPinnedColumns && /*#__PURE__*/_react["default"].createElement("div", {
key: "pinned-columns",
className: "pinned-columns grid-row"
}, /*#__PURE__*/_react["default"].createElement(TableSection, {
classList: pinnedClassList,
isPinned: true,
columns: pinnedColumns,
headerGridProps: headerGridProps,
fixedWidth: pinnedColumnsWidth,
onScroll: function onScroll(args) {
return _onScroll(_objectSpread(_objectSpread({}, args), {}, {
scrollLeft: scrollLeft
}));
},
scrollTop: scrollTop,
scrollLeft: scrollLeft,
dataGridProps: dataGridProps,
setGridRef: function setGridRef(pinnedGrid) {
return _this3.pinnedGrid = pinnedGrid;
},
columnWidth: columnWidthFunction(pinnedColumns, cellSizeCache),
headerCellRender: _this3.renderHeaderCell(pinnedColumns, true, _this3.props, _this3.toggleMoreOptions, moreOptionsColumn),
dataCellRender: _this3.renderDataCell(pinnedColumns, true, _this3.props)
})), /*#__PURE__*/_react["default"].createElement("div", {
key: "unpinned-columns",
style: {
marginLeft: "".concat(hasPinnedColumns ? "".concat(pinnedColumnsWidth, "px") : '0')
},
className: "unpinned-columns grid-column"
}, /*#__PURE__*/_react["default"].createElement(TableSection, {
classList: unpinnedClassList,
isPinned: false,
columns: unpinnedColumnsGhost,
headerGridProps: headerGridProps,
fixedWidth: fixedWidth,
fixedHeight: fixedHeight,
onScroll: _onScroll,
scrollTop: scrollTop,
scrollLeft: scrollLeft,
dataGridProps: dataGridProps,
setGridRef: function setGridRef(unpinnedGrid) {
return _this3.unpinnedGrid = unpinnedGrid;
},
columnWidth: columnWidthFunction(unpinnedColumnsGhost, cellSizeCache, ghost),
headerCellRender: _this3.renderHeaderCell(unpinnedColumnsGhost, false, _this3.props, _this3.toggleMoreOptions, moreOptionsColumn),
dataCellRender: _this3.renderDataCell(unpinnedColumnsGhost, false, _this3.props)
})));
}), hasStats ? /*#__PURE__*/_react["default"].createElement(StatsControl, {
top: headerRowHeight,
showStats: showStats,
toggleShowStats: this.toggleShowStats
}) : null) : null);
}
}]);
}(_react.Component);
(0, _defineProperty2["default"])(DataTable, "defaultProps", {
dataContainer: null,
pinnedColumns: [],
colMeta: {},
cellSizeCache: {},
sortColumn: {},
fixedWidth: null,
fixedHeight: null,
theme: {},
hasStats: false,
hasCustomScrollBarStyle: true
});
return (0, _styledComponents.withTheme)(DataTable);
}
var _default = exports["default"] = DataTableFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RWaXJ0dWFsaXplZCIsIl9zdHlsZWRDb21wb25lbnRzIiwiX2NsYXNzbmFtZXMyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9yZXNlbGVjdCIsIl9sb2Rhc2giLCJfbG9kYXNoMiIsIl9pY29ucyIsIl9ncmlkIiwiX2hlYWRlckNlbGwiLCJfdXRpbHMiLCJfY2VsbFNpemUiLCJfY29uc3RhbnRzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiZGVmYXVsdEhlYWRlclJvd0hlaWdodCIsImRlZmF1bHRIZWFkZXJTdGF0c0NvbnRyb2xIZWlnaHQiLCJkZWZhdWx0Um93SGVpZ2h0Iiwib3ZlcnNjYW5Db2x1bW5Db3VudCIsIm92ZXJzY2FuUm93Q291bnQiLCJicm93c2VyU2Nyb2xsQmFyV2lkdGgiLCJmaWVsZFRvQWxpZ25SaWdodCIsIkFMTF9GSUVMRF9UWVBFUyIsImludGVnZXIiLCJyZWFsIiwicGlubmVkQ2xhc3NMaXN0IiwiaGVhZGVyIiwicm93cyIsInVucGlubmVkQ2xhc3NMaXN0IiwiQ29udGFpbmVyIiwiZXhwb3J0cyIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ0aGVtZSIsImRhdGFUYWJsZVRleHRDb2xvciIsImhhc0N1c3RvbVNjcm9sbEJhclN0eWxlIiwibW9kYWxTY3JvbGxCYXIiLCJjZWxsQm9yZGVyQ29sb3IiLCJwaW5uZWRHcmlkQm9yZGVyQ29sb3IiLCJldmVuUm93QmFja2dyb3VuZCIsIm9kZFJvd0JhY2tncm91bmQiLCJjZWxsUGFkZGluZ1NpZGUiLCJjZWxsRm9udFNpemUiLCJlZGdlQ2VsbFBhZGRpbmdTaWRlIiwiZGVmYXVsdENvbHVtbldpZHRoIiwiY29sdW1uV2lkdGhGdW5jdGlvbiIsImNvbHVtbnMiLCJjZWxsU2l6ZUNhY2hlIiwiZ2hvc3QiLCJfcmVmIiwiaW5kZXgiLCJkZWZhdWx0R2V0Um93Q2VsbCIsIl9yZWYyIiwiZm9ybWF0dGVyIiwiZGF0YUNvbnRhaW5lciIsImNvbHVtbiIsImNvbE1ldGEiLCJyb3dJbmRleCIsInNvcnRPcmRlciIsInJvd0lkeCIsInR5cGUiLCJ2YWx1ZSIsInZhbHVlQXQiLCJpbmRleE9mIiwidW5kZWZpbmVkIiwicGFyc2VGaWVsZFZhbHVlIiwiU3R5bGVkU3RhdHNDb250cm9sIiwiaGVhZGVyU3RhdHNDb250cm9sSGVpZ2h0IiwidG9wIiwiZm9udEZhbWlseU1lZGl1bSIsImFjdGl2ZUNvbG9yIiwiaGVhZGVyQ2VsbFN0YXRzQ29udHJvbEJhY2tncm91bmQiLCJzaG93U3RhdHMiLCJTdGF0c0NvbnRyb2wiLCJfcmVmMyIsInRvZ2dsZVNob3dTdGF0cyIsImNyZWF0ZUVsZW1lbnQiLCJvbkNsaWNrIiwiQXJyb3dEb3duIiwiaGVpZ2h0IiwiVGFibGVTZWN0aW9uIiwiX3JlZjQiLCJjbGFzc0xpc3QiLCJpc1Bpbm5lZCIsImhlYWRlckdyaWRQcm9wcyIsImZpeGVkV2lkdGgiLCJfcmVmNCRmaXhlZEhlaWdodCIsImZpeGVkSGVpZ2h0Iiwib25TY3JvbGwiLCJzY3JvbGxUb3AiLCJkYXRhR3JpZFByb3BzIiwiY29sdW1uV2lkdGgiLCJfcmVmNCRzZXRHcmlkUmVmIiwic2V0R3JpZFJlZiIsImhlYWRlckNlbGxSZW5kZXIiLCJkYXRhQ2VsbFJlbmRlciIsIl9yZWY0JHNjcm9sbExlZnQiLCJzY3JvbGxMZWZ0IiwiaGVhZGVySGVpZ2h0IiwiaGVhZGVyU3R5bGUiLCJ1c2VNZW1vIiwiY29uY2F0IiwiY29udGVudFN0eWxlIiwiQXV0b1NpemVyIiwiX3JlZjUiLCJ3aWR0aCIsImdyaWREaW1lbnNpb24iLCJjb2x1bW5Db3VudCIsImhlYWRlckdyaWRXaWR0aCIsImRhdGFHcmlkSGVpZ2h0IiwiRnJhZ21lbnQiLCJjbGFzc05hbWUiLCJjbGFzc25hbWVzIiwic3R5bGUiLCJfZXh0ZW5kczIiLCJjZWxsUmVuZGVyZXIiLCJEVU1NWV9TVFlMRSIsIkRhdGFUYWJsZUZhY3RvcnkiLCJkZXBzIiwiSGVhZGVyQ2VsbEZhY3RvcnkiLCJIZWFkZXJDZWxsIiwiRGF0YVRhYmxlIiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwibW9yZU9wdGlvbnNDb2x1bW4iLCJjcmVhdGVSZWYiLCJwaW5uZWRDb2x1bW5zIiwiY3JlYXRlU2VsZWN0b3IiLCJpc0FycmF5IiwiYyIsImluY2x1ZGVzIiwiaGFzTW91bnRlZCIsInNldFN0YXRlIiwic3RhdGUiLCJfdGhpcyRwcm9wcyIsIl90aGlzJHByb3BzJGNlbGxTaXplQyIsInByb3BzQ2FjaGUiLCJfdGhpcyRwcm9wcyRwaW5uZWRDb2wiLCJ1bnBpbm5lZENvbHVtbnMiLCJyb290IiwiY3VycmVudCIsImNsaWVudFdpZHRoIiwiYWRqdXN0V2lkdGgiLCJfcmVmNiIsImFkanVzdENlbGxzVG9Db250YWluZXIiLCJnZXRDZWxsU2l6ZUNhY2hlIiwiZGVib3VuY2UiLCJkb1NjYWxlQ2VsbHNUb1dpZHRoIiwiX3RoaXMkcHJvcHMkZ2V0Um93Q2VsIiwiZ2V0Um93Q2VsbCIsIkRhdGFDZWxsUmVuZGVyZXIiLCJjZWxsSW5mbyIsImNvbHVtbkluZGV4Iiwia2V5IiwiaXNHaG9zdCIsImdldENvbHVtbkZvcm1hdHRlciIsInJvd0NlbGwiLCJsYXN0Um93SW5kZXgiLCJudW1Sb3dzIiwiZW5kQ2VsbCIsImZpcnN0Q2VsbCIsImJvdHRvbUNlbGwiLCJhbGlnblJpZ2h0IiwiTnVtYmVyIiwiY2VsbCIsInRpdGxlIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJjb21wb25lbnREaWRNb3VudCIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJzY2FsZUNlbGxzVG9XaWR0aCIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInJlbmRlckhlYWRlckNlbGwiLCJ0b2dnbGVNb3JlT3B0aW9ucyIsIl90aGlzMiIsIkhlYWRlckNlbGxSZW5kZXJlciIsInJlbmRlciIsIl90aGlzMyIsIl90aGlzJHByb3BzMiIsIl90aGlzJHByb3BzMiRwaW5uZWRDbyIsIl90aGlzJHByb3BzMiR0aGVtZSIsIl90aGlzJHByb3BzMiRmaXhlZEhlaSIsImhhc1N0YXRzIiwiX3RoaXMkc3RhdGUiLCJfdGhpcyRzdGF0ZSRjZWxsU2l6ZUMiLCJ1bnBpbm5lZENvbHVtbnNHaG9zdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJwaW5uZWRDb2x1bW5zV2lkdGgiLCJyZWR1Y2UiLCJhY2MiLCJ2YWwiLCJoYXNQaW5uZWRDb2x1bW5zIiwiX3RoZW1lJGhlYWRlclJvd0hlaWdoIiwiaGVhZGVyUm93SGVpZ2h0IiwiX3RoZW1lJGhlYWRlclN0YXRzQ29uIiwiX3RoZW1lJGhlYWRlclJvd1dTdGF0IiwiaGVhZGVyUm93V1N0YXRzSGVpZ2h0IiwiX3RoZW1lJHJvd0hlaWdodCIsInJvd0hlaWdodCIsInJvd0NvdW50IiwicmVmIiwiU2Nyb2xsU3luYyIsIl9yZWY3IiwicGlubmVkR3JpZCIsInJlbmRlckRhdGFDZWxsIiwibWFyZ2luTGVmdCIsInVucGlubmVkR3JpZCIsIkNvbXBvbmVudCIsInNvcnRDb2x1bW4iLCJ3aXRoVGhlbWUiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tb24vZGF0YS10YWJsZS9pbmRleC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWYsIHVzZU1lbW99IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7U2Nyb2xsU3luYywgQXV0b1NpemVyLCBPblNjcm9sbFBhcmFtcywgR3JpZFByb3BzLCBJbmRleH0gZnJvbSAncmVhY3QtdmlydHVhbGl6ZWQnO1xuaW1wb3J0IHN0eWxlZCwge3dpdGhUaGVtZX0gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQge2NyZWF0ZVNlbGVjdG9yfSBmcm9tICdyZXNlbGVjdCc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC5nZXQnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC5kZWJvdW5jZSc7XG5pbXBvcnQge0Fycm93RG93bn0gZnJvbSAnLi4vaWNvbnMnO1xuXG5pbXBvcnQge0NlbGxTaXplQ2FjaGV9IGZyb20gJy4vY2VsbC1zaXplJztcblxuaW1wb3J0IEdyaWQgZnJvbSAnLi9ncmlkJztcbmltcG9ydCBIZWFkZXJDZWxsRmFjdG9yeSBmcm9tICcuL2hlYWRlci1jZWxsJztcblxuaW1wb3J0IHtDb2xNZXRhfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7cGFyc2VGaWVsZFZhbHVlLCBnZXRDb2x1bW5Gb3JtYXR0ZXIsIERhdGFDb250YWluZXJJbnRlcmZhY2V9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHthZGp1c3RDZWxsc1RvQ29udGFpbmVyfSBmcm9tICcuL2NlbGwtc2l6ZSc7XG5cbmltcG9ydCB7QUxMX0ZJRUxEX1RZUEVTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5cbmNvbnN0IGRlZmF1bHRIZWFkZXJSb3dIZWlnaHQgPSA1NTtcbmNvbnN0IGRlZmF1bHRIZWFkZXJTdGF0c0NvbnRyb2xIZWlnaHQgPSA0MDtcbmNvbnN0IGRlZmF1bHRSb3dIZWlnaHQgPSAzMjtcbmNvbnN0IG92ZXJzY2FuQ29sdW1uQ291bnQgPSAxMDtcbmNvbnN0IG92ZXJzY2FuUm93Q291bnQgPSAxMDtcbi8vIFRoZSBkZWZhdWx0IHNjcm9sbGJhciB3aWR0aCBjYW4gcmFuZ2UgYW55d2hlcmUgZnJvbSAxMnB4IHRvIDE3cHhcbmNvbnN0IGJyb3dzZXJTY3JvbGxCYXJXaWR0aCA9IDE3O1xuY29uc3QgZmllbGRUb0FsaWduUmlnaHQgPSB7XG4gIFtBTExfRklFTERfVFlQRVMuaW50ZWdlcl06IHRydWUsXG4gIFtBTExfRklFTERfVFlQRVMucmVhbF06IHRydWVcbn07XG5cbmNvbnN0IHBpbm5lZENsYXNzTGlzdCA9IHtcbiAgaGVhZGVyOiAncGlubmVkLWNvbHVtbnMtLWhlYWRlciBwaW5uZWQtZ3JpZC1jb250YWluZXInLFxuICByb3dzOiAncGlubmVkLWNvbHVtbnMtLXJvd3MgcGlubmVkLWdyaWQtY29udGFpbmVyJ1xufTtcblxuY29uc3QgdW5waW5uZWRDbGFzc0xpc3QgPSB7XG4gIGhlYWRlcjogJ3VucGlubmVkLWNvbHVtbnMtLWhlYWRlciB1bnBpbm5lZC1ncmlkLWNvbnRhaW5lcicsXG4gIHJvd3M6ICd1bnBpbm5lZC1jb2x1bW5zLS1yb3dzIHVucGlubmVkLWdyaWQtY29udGFpbmVyJ1xufTtcblxudHlwZSBDb250YWluZXJQcm9wcyA9IHtcbiAgaGFzQ3VzdG9tU2Nyb2xsQmFyU3R5bGU/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNvbnN0IENvbnRhaW5lciA9IHN0eWxlZC5kaXY8Q29udGFpbmVyUHJvcHM+YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmb250LXNpemU6IDExcHg7XG4gIGZsZXgtZ3JvdzogMTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZGF0YVRhYmxlVGV4dENvbG9yfTtcbiAgd2lkdGg6IDEwMCU7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLlJlYWN0VmlydHVhbGl6ZWRfX0dyaWQ6Zm9jdXMsXG4gIC5SZWFjdFZpcnR1YWxpemVkX19HcmlkOmFjdGl2ZSB7XG4gICAgb3V0bGluZTogMDtcbiAgfVxuICAuYm9keS1ncmlkIHtcbiAgICAke3Byb3BzID0+IHByb3BzLmhhc0N1c3RvbVNjcm9sbEJhclN0eWxlICYmIHByb3BzLnRoZW1lLm1vZGFsU2Nyb2xsQmFyfVxuICB9XG5cbiAgLmNlbGwge1xuICAgICY6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgKjpmb2N1cyB7XG4gICAgb3V0bGluZTogMDtcbiAgfVxuXG4gIC5yZXN1bHRzLXRhYmxlLXdyYXBwZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtaW4taGVpZ2h0OiAxMDAlO1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICAgLnNjcm9sbC1pbi11aS10aHJlYWQucGlubmVkLWNvbHVtbnMtLWhlYWRlciB7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuY2VsbEJvcmRlckNvbG9yfTtcbiAgICAgIHBhZGRpbmctYm90dG9tOiAke2Jyb3dzZXJTY3JvbGxCYXJXaWR0aH1weDtcbiAgICB9XG4gICAgLnNjcm9sbC1pbi11aS10aHJlYWQudW5waW5uZWQtY29sdW1ucy0taGVhZGVyIHtcbiAgICAgIHdpZHRoOiAxMDB2dztcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5jZWxsQm9yZGVyQ29sb3J9O1xuICAgICAgLy8gbGVhdmUgcm9vbSBmb3Igc2Nyb2xsYmFyXG4gICAgICBwYWRkaW5nLWJvdHRvbTogJHticm93c2VyU2Nyb2xsQmFyV2lkdGh9cHg7XG4gICAgfVxuXG4gICAgLnNjcm9sbC1pbi11aS10aHJlYWQ6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgdG9wOiAwO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmdyaWQtcm93IHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIH1cbiAgICAuZ3JpZC1jb2x1bW4ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICB9XG4gICAgLnBpbm5lZC1ncmlkLWNvbnRhaW5lciB7XG4gICAgICBmbGV4OiAwIDAgNzVweDtcbiAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHRvcDogMDtcbiAgICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGlubmVkR3JpZEJvcmRlckNvbG9yfTtcbiAgICB9XG4gICAgLmV2ZW4tcm93IHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZXZlblJvd0JhY2tncm91bmR9O1xuICAgIH1cbiAgICAub2RkLXJvdyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm9kZFJvd0JhY2tncm91bmR9O1xuICAgIH1cbiAgICAuY2VsbCxcbiAgICAuaGVhZGVyLWNlbGwge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgLy8gaGVhZGVyIGJvcmRlciBpcyByZW5kZXJlZCBieSBoZWFkZXIgY29udGFpbmVyXG4gICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgLm4tc29ydC1pZHgge1xuICAgICAgICBmb250LXNpemU6IDlweDtcbiAgICAgIH1cbiAgICB9XG4gICAgLmNlbGwge1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuY2VsbEJvcmRlckNvbG9yfTtcbiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuY2VsbEJvcmRlckNvbG9yfTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgIHBhZGRpbmc6IDAgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5jZWxsUGFkZGluZ1NpZGV9cHg7XG4gICAgICBmb250LXNpemU6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuY2VsbEZvbnRTaXplfXB4O1xuXG4gICAgICAucmVzdWx0LWxpbmsge1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICB9XG4gICAgfVxuICAgIC5jZWxsLmVuZC1jZWxsLFxuICAgIC5oZWFkZXItY2VsbC5lbmQtY2VsbCB7XG4gICAgICBib3JkZXItcmlnaHQ6IG5vbmU7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmNlbGxQYWRkaW5nU2lkZSArIHByb3BzLnRoZW1lLmVkZ2VDZWxsUGFkZGluZ1NpZGV9cHg7XG4gICAgfVxuICAgIC5jZWxsLmZpcnN0LWNlbGwsXG4gICAgLmhlYWRlci1jZWxsLmZpcnN0LWNlbGwge1xuICAgICAgcGFkZGluZy1sZWZ0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmNlbGxQYWRkaW5nU2lkZSArIHByb3BzLnRoZW1lLmVkZ2VDZWxsUGFkZGluZ1NpZGV9cHg7XG4gICAgfVxuICAgIC5jZWxsLmJvdHRvbS1jZWxsIHtcbiAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgfVxuICAgIC5jZWxsLmFsaWduLXJpZ2h0IHtcbiAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbiAgICB9XG4gIH1cblxuICAmOmZvY3VzIHtcbiAgICBvdXRsaW5lOiBub25lO1xuICB9XG5gO1xuXG5jb25zdCBkZWZhdWx0Q29sdW1uV2lkdGggPSAyMDA7XG5cbmV4cG9ydCB0eXBlIFNvcnRDb2x1bW4gPSB7XG4gIGNvbHVtbj86IHN0cmluZztcbiAgbW9kZT86IHN0cmluZztcbn07XG5cbmNvbnN0IGNvbHVtbldpZHRoRnVuY3Rpb24gPVxuICAoY29sdW1ucywgY2VsbFNpemVDYWNoZSwgZ2hvc3Q/KSA9PlxuICAoe2luZGV4fSkgPT4ge1xuICAgIHJldHVybiAoY29sdW1uc1tpbmRleF0gfHwge30pLmdob3N0XG4gICAgICA/IGdob3N0XG4gICAgICA6IGNlbGxTaXplQ2FjaGVbY29sdW1uc1tpbmRleF1dIHx8IGRlZmF1bHRDb2x1bW5XaWR0aDtcbiAgfTtcblxuaW50ZXJmYWNlIEdldFJvd0NlbGxQcm9wcyB7XG4gIGRhdGFDb250YWluZXI6IERhdGFDb250YWluZXJJbnRlcmZhY2UgfCBudWxsO1xuICBjb2x1bW5zOiAoc3RyaW5nICYge2dob3N0PzogYm9vbGVhbn0pW107XG4gIGNvbHVtbjogc3RyaW5nO1xuICBjb2xNZXRhO1xuICByb3dJbmRleDogbnVtYmVyO1xuICBzb3J0T3JkZXI/OiBudW1iZXJbXSB8IG51bGw7XG59XG5cbi8qXG4gKiBUaGlzIGlzIGFuIGFjY2Vzc29yIG1ldGhvZCB1c2VkIHRvIGdlbmVyYWxpemUgZ2V0dGluZyBhIGNlbGwgZnJvbSBhIGRhdGEgcm93XG4gKi9cbmNvbnN0IGRlZmF1bHRHZXRSb3dDZWxsID0gKFxuICB7ZGF0YUNvbnRhaW5lciwgY29sdW1ucywgY29sdW1uLCBjb2xNZXRhLCByb3dJbmRleCwgc29ydE9yZGVyfTogR2V0Um93Q2VsbFByb3BzLFxuICBmb3JtYXR0ZXJcbikgPT4ge1xuICBjb25zdCByb3dJZHggPSBzb3J0T3JkZXIgJiYgc29ydE9yZGVyLmxlbmd0aCA/IGdldChzb3J0T3JkZXIsIHJvd0luZGV4KSA6IHJvd0luZGV4O1xuICBjb25zdCB7dHlwZX0gPSBjb2xNZXRhW2NvbHVtbl07XG5cbiAgY29uc3QgdmFsdWUgPSBkYXRhQ29udGFpbmVyPy52YWx1ZUF0KHJvd0lkeCwgY29sdW1ucy5pbmRleE9mKGNvbHVtbikpO1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJydcbiAgICA/ICcnXG4gICAgOiBmb3JtYXR0ZXJcbiAgICA/IGZvcm1hdHRlcih2YWx1ZSlcbiAgICA6IHBhcnNlRmllbGRWYWx1ZSh2YWx1ZSwgdHlwZSk7XG59O1xuXG50eXBlIFN0YXRzQ29udHJvbFByb3BzID0ge1xuICB0b3A6IG51bWJlcjtcbiAgc2hvd1N0YXRzPzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IFN0eWxlZFN0YXRzQ29udHJvbCA9IHN0eWxlZC5kaXY8U3RhdHNDb250cm9sUHJvcHM+YFxuICBoZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuaGVhZGVyU3RhdHNDb250cm9sSGVpZ2h0fXB4O1xuICB3aWR0aDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogJHtwcm9wcyA9PiBwcm9wcy50b3B9cHg7XG4gIGZvbnQtZmFtaWx5OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmZvbnRGYW1pbHlNZWRpdW19cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYWN0aXZlQ29sb3J9O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmhlYWRlckNlbGxTdGF0c0NvbnRyb2xCYWNrZ3JvdW5kfTtcbiAgJjpob3ZlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG5cbiAgPiBkaXYge1xuICAgIHBhZGRpbmc6IDBweCAyNHB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIHN2ZyB7XG4gICAgICBtYXJnaW4tbGVmdDogMTJweDtcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjVzIGVhc2U7XG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgke3Byb3BzID0+IChwcm9wcy5zaG93U3RhdHMgPyAxODAgOiAwKX1kZWcpO1xuICAgIH1cbiAgfVxuYDtcblxuY29uc3QgU3RhdHNDb250cm9sID0gKHtcbiAgdG9wLFxuICBzaG93U3RhdHMsXG4gIHRvZ2dsZVNob3dTdGF0c1xufToge1xuICB0b3A6IG51bWJlcjtcbiAgc2hvd1N0YXRzPzogYm9vbGVhbjtcbiAgdG9nZ2xlU2hvd1N0YXRzOiAoKSA9PiB2b2lkO1xufSkgPT4gKFxuICA8U3R5bGVkU3RhdHNDb250cm9sIHRvcD17dG9wfSBzaG93U3RhdHM9e3Nob3dTdGF0c30+XG4gICAgPGRpdiBvbkNsaWNrPXt0b2dnbGVTaG93U3RhdHN9PlxuICAgICAge3Nob3dTdGF0cyA/ICdIaWRlIENvbHVtbiBTdGF0cycgOiAnU2hvdyBDb2x1bW4gU3RhdHMnfVxuICAgICAgPEFycm93RG93biBoZWlnaHQ9XCIxOHB4XCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9TdHlsZWRTdGF0c0NvbnRyb2w+XG4pO1xuXG5pbnRlcmZhY2UgVGFibGVTZWN0aW9uUHJvcHMge1xuICBjbGFzc0xpc3Q/OiB7XG4gICAgaGVhZGVyOiBzdHJpbmc7XG4gICAgcm93czogc3RyaW5nO1xuICB9O1xuICBpc1Bpbm5lZD86IGJvb2xlYW47XG4gIGNvbHVtbnM6IChzdHJpbmcgJiB7Z2hvc3Q/OiBib29sZWFufSlbXTtcbiAgaGVhZGVyR3JpZFByb3BzPztcbiAgZml4ZWRXaWR0aD86IG51bWJlciB8IG51bGw7XG4gIGZpeGVkSGVpZ2h0PzogbnVtYmVyIHwgbnVsbDtcbiAgb25TY3JvbGw/OiAocGFyYW1zOiBPblNjcm9sbFBhcmFtcykgPT4gdm9pZDtcbiAgc2Nyb2xsVG9wPzogbnVtYmVyO1xuICBkYXRhR3JpZFByb3BzOiB7XG4gICAgcm93SGVpZ2h0OiBudW1iZXIgfCAoKHBhcmFtczogSW5kZXgpID0+IG51bWJlcik7XG4gICAgcm93Q291bnQ6IG51bWJlcjtcbiAgfSAmIFBhcnRpYWw8R3JpZFByb3BzPjtcbiAgY29sdW1uV2lkdGg/O1xuICBzZXRHcmlkUmVmPzogKHJlZjogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiB2b2lkO1xuICBoZWFkZXJDZWxsUmVuZGVyPztcbiAgZGF0YUNlbGxSZW5kZXI/O1xuICBzY3JvbGxMZWZ0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgVGFibGVTZWN0aW9uID0gKHtcbiAgY2xhc3NMaXN0LFxuICBpc1Bpbm5lZCxcbiAgY29sdW1ucyxcbiAgaGVhZGVyR3JpZFByb3BzLFxuICBmaXhlZFdpZHRoLFxuICBmaXhlZEhlaWdodCA9IHVuZGVmaW5lZCxcbiAgb25TY3JvbGwsXG4gIHNjcm9sbFRvcCxcbiAgZGF0YUdyaWRQcm9wcyxcbiAgY29sdW1uV2lkdGgsXG4gIHNldEdyaWRSZWYgPSB1bmRlZmluZWQsXG4gIGhlYWRlckNlbGxSZW5kZXIsXG4gIGRhdGFDZWxsUmVuZGVyLFxuICBzY3JvbGxMZWZ0ID0gMFxufTogVGFibGVTZWN0aW9uUHJvcHMpID0+IHtcbiAgY29uc3QgaGVhZGVySGVpZ2h0ID0gaGVhZGVyR3JpZFByb3BzLmhlaWdodDtcblxuICBjb25zdCBoZWFkZXJTdHlsZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIGhlaWdodDogYCR7aGVhZGVySGVpZ2h0fXB4YFxuICAgIH0pLFxuICAgIFtoZWFkZXJIZWlnaHRdXG4gICk7XG4gIGNvbnN0IGNvbnRlbnRTdHlsZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIHRvcDogYCR7aGVhZGVySGVpZ2h0fXB4YFxuICAgIH0pLFxuICAgIFtoZWFkZXJIZWlnaHRdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b1NpemVyPlxuICAgICAgeyh7d2lkdGgsIGhlaWdodH0pID0+IHtcbiAgICAgICAgY29uc3QgZ3JpZERpbWVuc2lvbiA9IHtcbiAgICAgICAgICBjb2x1bW5Db3VudDogY29sdW1ucy5sZW5ndGgsXG4gICAgICAgICAgY29sdW1uV2lkdGgsXG4gICAgICAgICAgd2lkdGg6IGZpeGVkV2lkdGggfHwgd2lkdGhcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGVhZGVyR3JpZFdpZHRoID0gZml4ZWRXaWR0aCB8fCB3aWR0aDtcbiAgICAgICAgY29uc3QgZGF0YUdyaWRIZWlnaHQgPSBmaXhlZEhlaWdodCB8fCBoZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ3Njcm9sbC1pbi11aS10aHJlYWQnLCBjbGFzc0xpc3Q/LmhlYWRlcil9XG4gICAgICAgICAgICAgIHN0eWxlPXtoZWFkZXJTdHlsZX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEdyaWRcbiAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXI9e2hlYWRlckNlbGxSZW5kZXJ9XG4gICAgICAgICAgICAgICAgey4uLmhlYWRlckdyaWRQcm9wc31cbiAgICAgICAgICAgICAgICB7Li4uZ3JpZERpbWVuc2lvbn1cbiAgICAgICAgICAgICAgICBoZWlnaHQ9e2hlYWRlckdyaWRQcm9wcy5oZWlnaHQgKyBicm93c2VyU2Nyb2xsQmFyV2lkdGh9XG4gICAgICAgICAgICAgICAgd2lkdGg9e2hlYWRlckdyaWRXaWR0aH1cbiAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0PXtzY3JvbGxMZWZ0fVxuICAgICAgICAgICAgICAgIG9uU2Nyb2xsPXtvblNjcm9sbH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ3Njcm9sbC1pbi11aS10aHJlYWQnLCBjbGFzc0xpc3Q/LnJvd3MpfVxuICAgICAgICAgICAgICBzdHlsZT17Y29udGVudFN0eWxlfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8R3JpZFxuICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcj17ZGF0YUNlbGxSZW5kZXJ9XG4gICAgICAgICAgICAgICAgey4uLmRhdGFHcmlkUHJvcHN9XG4gICAgICAgICAgICAgICAgey4uLmdyaWREaW1lbnNpb259XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtpc1Bpbm5lZCA/ICdwaW5uZWQtZ3JpZCcgOiAnYm9keS1ncmlkJ31cbiAgICAgICAgICAgICAgICBoZWlnaHQ9e2RhdGFHcmlkSGVpZ2h0IC0gaGVhZGVyR3JpZFByb3BzLmhlaWdodH1cbiAgICAgICAgICAgICAgICBvblNjcm9sbD17b25TY3JvbGx9XG4gICAgICAgICAgICAgICAgc2Nyb2xsTGVmdD17c2Nyb2xsTGVmdH1cbiAgICAgICAgICAgICAgICBzY3JvbGxUb3A9e3Njcm9sbFRvcH1cbiAgICAgICAgICAgICAgICBzZXRHcmlkUmVmPXtzZXRHcmlkUmVmfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC8+XG4gICAgICAgICk7XG4gICAgICB9fVxuICAgIDwvQXV0b1NpemVyPlxuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVQcm9wcyB7XG4gIGRhdGFJZD86IHN0cmluZztcbiAgaGFzU3RhdHM/OiBib29sZWFuO1xuICBjZWxsU2l6ZUNhY2hlPzogQ2VsbFNpemVDYWNoZTtcbiAgcGlubmVkQ29sdW1ucz86IHN0cmluZ1tdO1xuICBjb2x1bW5zOiAoc3RyaW5nICYge2dob3N0PzogYm9vbGVhbn0pW107XG4gIGZpeGVkV2lkdGg/OiBudW1iZXIgfCBudWxsO1xuICB0aGVtZT86IGFueTtcbiAgZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSB8IG51bGw7XG4gIGZpeGVkSGVpZ2h0PzogbnVtYmVyIHwgbnVsbDtcbiAgY29sTWV0YTogQ29sTWV0YTtcbiAgc29ydENvbHVtbjogU29ydENvbHVtbjtcbiAgc29ydFRhYmxlQ29sdW1uOiAoY29sdW1uOiBzdHJpbmcsIG1vZGU/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHBpblRhYmxlQ29sdW1uOiAoY29sdW1uOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNldENvbHVtbkRpc3BsYXlGb3JtYXQ/OiAoZm9ybWF0czoge1trZXk6IHN0cmluZ106IHN0cmluZ30pID0+IHZvaWQ7XG4gIGNvcHlUYWJsZUNvbHVtbjogKGNvbHVtbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzb3J0T3JkZXI/OiBudW1iZXJbXSB8IG51bGw7XG4gIHNob3dTdGF0cz86IGJvb2xlYW47XG4gIGhhc0N1c3RvbVNjcm9sbEJhclN0eWxlPzogYm9vbGVhbjtcbiAgZ2V0Um93Q2VsbD86IChyZW5kZXJEYXRhQ2VsbFByb3BzOiBHZXRSb3dDZWxsUHJvcHMsIGZvcm1hdHRlcjogYW55KSA9PiBzdHJpbmcgfCBudW1iZXI7XG59XG5cbmludGVyZmFjZSBEYXRhVGFibGVTdGF0ZSB7XG4gIGNlbGxTaXplQ2FjaGU/OiBDZWxsU2l6ZUNhY2hlO1xuICBtb3JlT3B0aW9uc0NvbHVtbj87XG4gIGdob3N0PztcbiAgc2hvd1N0YXRzPzogYm9vbGVhbjtcbn1cblxuY29uc3QgRFVNTVlfU1RZTEUgPSB7fTtcblxuRGF0YVRhYmxlRmFjdG9yeS5kZXBzID0gW0hlYWRlckNlbGxGYWN0b3J5XTtcbmZ1bmN0aW9uIERhdGFUYWJsZUZhY3RvcnkoXG4gIEhlYWRlckNlbGw6IFJldHVyblR5cGU8dHlwZW9mIEhlYWRlckNlbGxGYWN0b3J5PlxuKTogUmVhY3QuQ29tcG9uZW50VHlwZTxEYXRhVGFibGVQcm9wcz4ge1xuICBjbGFzcyBEYXRhVGFibGUgZXh0ZW5kcyBDb21wb25lbnQ8RGF0YVRhYmxlUHJvcHMsIERhdGFUYWJsZVN0YXRlPiB7XG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIGRhdGFDb250YWluZXI6IG51bGwsXG4gICAgICBwaW5uZWRDb2x1bW5zOiBbXSxcbiAgICAgIGNvbE1ldGE6IHt9LFxuICAgICAgY2VsbFNpemVDYWNoZToge30sXG4gICAgICBzb3J0Q29sdW1uOiB7fSxcbiAgICAgIGZpeGVkV2lkdGg6IG51bGwsXG4gICAgICBmaXhlZEhlaWdodDogbnVsbCxcbiAgICAgIHRoZW1lOiB7fSxcbiAgICAgIGhhc1N0YXRzOiBmYWxzZSxcbiAgICAgIGhhc0N1c3RvbVNjcm9sbEJhclN0eWxlOiB0cnVlXG4gICAgfTtcblxuICAgIHBpbm5lZEdyaWQ6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgdW5waW5uZWRHcmlkOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGhhc01vdW50ZWQgPSBmYWxzZTtcblxuICAgIHN0YXRlOiBEYXRhVGFibGVTdGF0ZSA9IHtcbiAgICAgIGNlbGxTaXplQ2FjaGU6IHt9LFxuICAgICAgbW9yZU9wdGlvbnNDb2x1bW46IG51bGwsXG4gICAgICBzaG93U3RhdHM6IHRydWVcbiAgICB9O1xuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLmhhc01vdW50ZWQgPSB0cnVlO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuc2NhbGVDZWxsc1RvV2lkdGgpO1xuICAgICAgdGhpcy5zY2FsZUNlbGxzVG9XaWR0aCgpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5wcm9wcy5jZWxsU2l6ZUNhY2hlICE9PSBwcmV2UHJvcHMuY2VsbFNpemVDYWNoZSB8fFxuICAgICAgICB0aGlzLnByb3BzLnBpbm5lZENvbHVtbnMgIT09IHByZXZQcm9wcy5waW5uZWRDb2x1bW5zXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zY2FsZUNlbGxzVG9XaWR0aCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5oYXNNb3VudGVkID0gZmFsc2U7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5zY2FsZUNlbGxzVG9XaWR0aCk7XG4gICAgfVxuXG4gICAgcm9vdCA9IGNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcbiAgICBjb2x1bW5zID0gKHByb3BzOiBEYXRhVGFibGVQcm9wcykgPT4gcHJvcHMuY29sdW1ucztcbiAgICBwaW5uZWRDb2x1bW5zID0gKHByb3BzOiBEYXRhVGFibGVQcm9wcykgPT4gcHJvcHMucGlubmVkQ29sdW1ucztcbiAgICB1bnBpbm5lZENvbHVtbnMgPSBjcmVhdGVTZWxlY3Rvcih0aGlzLmNvbHVtbnMsIHRoaXMucGlubmVkQ29sdW1ucywgKGNvbHVtbnMsIHBpbm5lZENvbHVtbnMpID0+XG4gICAgICAhQXJyYXkuaXNBcnJheShwaW5uZWRDb2x1bW5zKSA/IGNvbHVtbnMgOiBjb2x1bW5zLmZpbHRlcihjID0+ICFwaW5uZWRDb2x1bW5zLmluY2x1ZGVzKGMpKVxuICAgICk7XG5cbiAgICB0b2dnbGVNb3JlT3B0aW9ucyA9IG1vcmVPcHRpb25zQ29sdW1uID0+IHtcbiAgICAgIGlmICh0aGlzLmhhc01vdW50ZWQpXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIG1vcmVPcHRpb25zQ29sdW1uOlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5tb3JlT3B0aW9uc0NvbHVtbiA9PT0gbW9yZU9wdGlvbnNDb2x1bW4gPyBudWxsIDogbW9yZU9wdGlvbnNDb2x1bW5cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB0b2dnbGVTaG93U3RhdHMgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNN