kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
572 lines (475 loc) • 66.6 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = ModalContainerFactory;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
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 _propTypes = _interopRequireDefault(require("prop-types"));
var _styledComponents = require("styled-components");
var _reactDom = require("react-dom");
var _reselect = require("reselect");
var _lodash = _interopRequireDefault(require("lodash.get"));
var _modalDialog = _interopRequireDefault(require("./modals/modal-dialog"));
var _schemas = _interopRequireDefault(require("../schemas"));
var _exportUtils = require("../utils/export-utils");
var _mapInfoUtils = require("../utils/map-info-utils");
var _deleteDataModal = _interopRequireDefault(require("./modals/delete-data-modal"));
var _overwriteMapModal = _interopRequireDefault(require("./modals/overwrite-map-modal"));
var _dataTableModal = _interopRequireDefault(require("./modals/data-table-modal"));
var _loadDataModal = _interopRequireDefault(require("./modals/load-data-modal"));
var _exportImageModal = _interopRequireDefault(require("./modals/export-image-modal"));
var _exportDataModal = _interopRequireDefault(require("./modals/export-data-modal"));
var _exportMapModal = _interopRequireDefault(require("./modals/export-map-modal/export-map-modal"));
var _addMapStyleModal = _interopRequireDefault(require("./modals/add-map-style-modal"));
var _saveMapModal = _interopRequireDefault(require("./modals/save-map-modal"));
var _shareMapModal = _interopRequireDefault(require("./modals/share-map-modal"));
var _mediaBreakpoints = require("../styles/media-breakpoints");
var _defaultSettings = require("../constants/default-settings");
function _templateObject8() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n width: ", "px;\n "]);
_templateObject8 = function _templateObject8() {
return data;
};
return data;
}
function _templateObject7() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n ", "\n "]);
_templateObject7 = function _templateObject7() {
return data;
};
return data;
}
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _templateObject6() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n max-width: 960px;\n"]);
_templateObject6 = function _templateObject6() {
return data;
};
return data;
}
function _templateObject5() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n top: 60px;\n"]);
_templateObject5 = function _templateObject5() {
return data;
};
return data;
}
function _templateObject4() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n width: 40%;\n padding: 40px 40px 32px 40px;\n"]);
_templateObject4 = function _templateObject4() {
return data;
};
return data;
}
function _templateObject3() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n padding: 0;\n margin: 0 auto;\n "]);
_templateObject3 = function _templateObject3() {
return data;
};
return data;
}
function _templateObject2() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n padding: 0;\n "]);
_templateObject2 = function _templateObject2() {
return data;
};
return data;
}
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n top: 80px;\n padding: 32px 0 0 0;\n width: 90vw;\n max-width: 90vw;\n\n ", "\n\n ", "\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var DataTableModalStyle = (0, _styledComponents.css)(_templateObject(), _mediaBreakpoints.media.portable(_templateObject2()), _mediaBreakpoints.media.palm(_templateObject3()));
var smallModalCss = (0, _styledComponents.css)(_templateObject4());
var LoadDataModalStyle = (0, _styledComponents.css)(_templateObject5());
var DefaultStyle = (0, _styledComponents.css)(_templateObject6());
ModalContainerFactory.deps = [_deleteDataModal["default"], _overwriteMapModal["default"], _dataTableModal["default"], _loadDataModal["default"], _exportImageModal["default"], _exportDataModal["default"], _exportMapModal["default"], _addMapStyleModal["default"], _modalDialog["default"], _saveMapModal["default"], _shareMapModal["default"]];
function ModalContainerFactory(DeleteDatasetModal, OverWriteMapModal, DataTableModal, LoadDataModal, ExportImageModal, ExportDataModal, ExportMapModal, AddMapStyleModal, ModalDialog, SaveMapModal, ShareMapModal) {
var ModalWrapper =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(ModalWrapper, _Component);
function ModalWrapper() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2["default"])(this, ModalWrapper);
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"])(ModalWrapper)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "cloudProviders", function (props) {
return props.cloudProviders;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "providerWithStorage", (0, _reselect.createSelector)(_this.cloudProviders, function (cloudProviders) {
return cloudProviders.filter(function (p) {
return p.hasPrivateStorage();
});
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "providerWithShare", (0, _reselect.createSelector)(_this.cloudProviders, function (cloudProviders) {
return cloudProviders.filter(function (p) {
return p.hasSharingUrl();
});
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_closeModal", function () {
_this.props.uiStateActions.toggleModal(null);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_deleteDataset", function (key) {
_this.props.visStateActions.removeDataset(key);
_this._closeModal();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onAddCustomMapStyle", function () {
_this.props.mapStyleActions.addCustomMapStyle();
_this._closeModal();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onFileUpload", function (blob) {
_this.props.visStateActions.loadFiles(blob);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onExportImage", function () {
if (!_this.props.uiState.exportImage.exporting) {
(0, _exportUtils.exportImage)(_this.props, _this.props.uiState.exportImage);
_this.props.uiStateActions.cleanupExportImage();
_this._closeModal();
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onExportData", function () {
(0, _exportUtils.exportData)(_this.props, _this.props.uiState.exportData);
_this._closeModal();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onExportMap", function () {
var uiState = _this.props.uiState;
var format = uiState.exportMap.format;
(format === _defaultSettings.EXPORT_MAP_FORMATS.HTML ? _exportUtils.exportHtml : _exportUtils.exportJson)(_this.props, _this.props.uiState.exportMap[format] || {});
_this._closeModal();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_exportFileToCloud", function (_ref) {
var provider = _ref.provider,
isPublic = _ref.isPublic,
overwrite = _ref.overwrite,
closeModal = _ref.closeModal;
var toSave = (0, _exportUtils.exportMap)(_this.props);
_this.props.providerActions.exportFileToCloud({
mapData: toSave,
provider: provider,
options: {
isPublic: isPublic,
overwrite: overwrite
},
closeModal: closeModal,
onSuccess: _this.props.onExportToCloudSuccess,
onError: _this.props.onExportToCloudError
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSaveMap", function () {
var overwrite = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var currentProvider = _this.props.providerState.currentProvider;
var provider = _this.props.cloudProviders.find(function (p) {
return p.name === currentProvider;
});
_this._exportFileToCloud({
provider: provider,
isPublic: false,
overwrite: overwrite,
closeModal: true
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onOverwriteMap", function () {
_this._onSaveMap(true);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onShareMapUrl", function (provider) {
_this._exportFileToCloud({
provider: provider,
isPublic: true,
overwrite: false,
closeModal: false
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onCloseSaveMap", function () {
_this.props.providerActions.resetProviderStatus();
_this._closeModal();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onLoadCloudMap", function (payload) {
_this.props.providerActions.loadCloudMap(_objectSpread({}, payload, {
onSuccess: _this.props.onLoadCloudMapSuccess,
onError: _this.props.onLoadCloudMapError
}));
});
return _this;
}
(0, _createClass2["default"])(ModalWrapper, [{
key: "render",
/* eslint-disable complexity */
value: function render() {
var _this2 = this;
var _this$props = this.props,
containerW = _this$props.containerW,
containerH = _this$props.containerH,
mapStyle = _this$props.mapStyle,
mapState = _this$props.mapState,
uiState = _this$props.uiState,
visState = _this$props.visState,
rootNode = _this$props.rootNode,
visStateActions = _this$props.visStateActions,
uiStateActions = _this$props.uiStateActions,
providerState = _this$props.providerState;
var currentModal = uiState.currentModal,
datasetKeyToRemove = uiState.datasetKeyToRemove;
var datasets = visState.datasets,
layers = visState.layers,
editingDataset = visState.editingDataset;
var template = null;
var modalProps = {};
if (currentModal && currentModal.id && currentModal.template) {
// if currentMdoal template is already provided
// TODO: need to check whether template is valid
template = _react["default"].createElement(currentModal.template, null);
modalProps = currentModal.modalProps;
} else {
switch (currentModal) {
case _defaultSettings.DATA_TABLE_ID:
var width = containerW * 0.9;
template = _react["default"].createElement(DataTableModal, {
width: containerW * 0.9,
height: containerH * 0.85,
datasets: datasets,
dataId: editingDataset,
showDatasetTable: visStateActions.showDatasetTable,
sortTableColumn: visStateActions.sortTableColumn,
pinTableColumn: visStateActions.pinTableColumn,
copyTableColumn: visStateActions.copyTableColumn
}); // TODO: we need to make this width consistent with the css rule defined modal.js:32 max-width: 70vw
modalProps.cssStyle = (0, _styledComponents.css)(_templateObject7(), DataTableModalStyle, _mediaBreakpoints.media.palm(_templateObject8(), width));
break;
case _defaultSettings.DELETE_DATA_ID:
// validate options
if (datasetKeyToRemove && datasets && datasets[datasetKeyToRemove]) {
template = _react["default"].createElement(DeleteDatasetModal, {
dataset: datasets[datasetKeyToRemove],
layers: layers
});
modalProps = {
title: 'modal.title.deleteDataset',
cssStyle: smallModalCss,
footer: true,
onConfirm: function onConfirm() {
return _this2._deleteDataset(datasetKeyToRemove);
},
onCancel: this._closeModal,
confirmButton: {
negative: true,
large: true,
children: 'modal.button.delete'
}
};
}
break;
// in case we add a new case after this one
case _defaultSettings.ADD_DATA_ID:
template = _react["default"].createElement(LoadDataModal, (0, _extends2["default"])({}, providerState, {
onClose: this._closeModal,
onFileUpload: this._onFileUpload,
onLoadCloudMap: this._onLoadCloudMap,
cloudProviders: this.providerWithStorage(this.props),
onSetCloudProvider: this.props.providerActions.setCloudProvider,
getSavedMaps: this.props.providerActions.getSavedMaps,
loadFiles: uiState.loadFiles
}, uiState.loadFiles));
modalProps = {
title: 'modal.title.addDataToMap',
cssStyle: LoadDataModalStyle,
footer: false,
onConfirm: this._closeModal
};
break;
case _defaultSettings.EXPORT_IMAGE_ID:
template = _react["default"].createElement(ExportImageModal, {
exportImage: uiState.exportImage,
mapW: containerW,
mapH: containerH,
onUpdateSetting: uiStateActions.setExportImageSetting
});
modalProps = {
title: 'modal.title.exportImage',
footer: true,
onCancel: this._closeModal,
onConfirm: this._onExportImage,
confirmButton: {
large: true,
disabled: uiState.exportImage.exporting,
children: 'modal.button.download'
}
};
break;
case _defaultSettings.EXPORT_DATA_ID:
template = _react["default"].createElement(ExportDataModal, (0, _extends2["default"])({}, uiState.exportData, {
datasets: datasets,
applyCPUFilter: this.props.visStateActions.applyCPUFilter,
onClose: this._closeModal,
onChangeExportDataType: uiStateActions.setExportDataType,
onChangeExportSelectedDataset: uiStateActions.setExportSelectedDataset,
onChangeExportFiltered: uiStateActions.setExportFiltered
}));
modalProps = {
title: 'modal.title.exportData',
footer: true,
onCancel: this._closeModal,
onConfirm: this._onExportData,
confirmButton: {
large: true,
children: 'modal.button.export'
}
};
break;
case _defaultSettings.EXPORT_MAP_ID:
var keplerGlConfig = _schemas["default"].getConfigToSave({
mapStyle: mapStyle,
visState: visState,
mapState: mapState,
uiState: uiState
});
template = _react["default"].createElement(ExportMapModal, {
config: keplerGlConfig,
options: uiState.exportMap,
onChangeExportMapFormat: uiStateActions.setExportMapFormat,
onEditUserMapboxAccessToken: uiStateActions.setUserMapboxAccessToken,
onChangeExportMapHTMLMode: uiStateActions.setExportHTMLMapMode
});
modalProps = {
title: 'modal.title.exportMap',
footer: true,
onCancel: this._closeModal,
onConfirm: this._onExportMap,
confirmButton: {
large: true,
children: 'modal.button.export'
}
};
break;
case _defaultSettings.ADD_MAP_STYLE_ID:
template = _react["default"].createElement(AddMapStyleModal, {
mapboxApiAccessToken: this.props.mapboxApiAccessToken,
mapboxApiUrl: this.props.mapboxApiUrl,
mapState: this.props.mapState,
inputStyle: mapStyle.inputStyle,
inputMapStyle: this.props.mapStyleActions.inputMapStyle,
loadCustomMapStyle: this.props.mapStyleActions.loadCustomMapStyle
});
modalProps = {
title: 'modal.title.addCustomMapboxStyle',
footer: true,
onCancel: this._closeModal,
onConfirm: this._onAddCustomMapStyle,
confirmButton: {
large: true,
disabled: !mapStyle.inputStyle.style,
children: 'modal.button.addStyle'
}
};
break;
case _defaultSettings.SAVE_MAP_ID:
template = _react["default"].createElement(SaveMapModal, (0, _extends2["default"])({}, providerState, {
exportImage: uiState.exportImage,
mapInfo: visState.mapInfo,
onSetMapInfo: visStateActions.setMapInfo,
onUpdateImageSetting: uiStateActions.setExportImageSetting,
cloudProviders: this.providerWithStorage(this.props),
onSetCloudProvider: this.props.providerActions.setCloudProvider
}));
modalProps = {
title: 'modal.title.saveMap',
footer: true,
onCancel: this._closeModal,
onConfirm: function onConfirm() {
return _this2._onSaveMap(false);
},
confirmButton: {
large: true,
disabled: uiState.exportImage.exporting || !(0, _mapInfoUtils.isValidMapInfo)(visState.mapInfo) || !providerState.currentProvider,
children: 'modal.button.save'
}
};
break;
case _defaultSettings.OVERWRITE_MAP_ID:
template = _react["default"].createElement(OverWriteMapModal, (0, _extends2["default"])({}, providerState, {
cloudProviders: this.props.cloudProviders,
title: (0, _lodash["default"])(visState, ['mapInfo', 'title']),
onSetCloudProvider: this.props.providerActions.setCloudProvider,
onUpdateImageSetting: uiStateActions.setExportImageSetting
}));
modalProps = {
title: 'Overwrite Existing File?',
cssStyle: smallModalCss,
footer: true,
onConfirm: this._onOverwriteMap,
onCancel: this._closeModal,
confirmButton: {
large: true,
children: 'Yes',
disabled: uiState.exportImage.exporting || !(0, _mapInfoUtils.isValidMapInfo)(visState.mapInfo) || !providerState.currentProvider
}
};
break;
case _defaultSettings.SHARE_MAP_ID:
template = _react["default"].createElement(ShareMapModal, (0, _extends2["default"])({}, providerState, {
isReady: !uiState.exportImage.exporting,
cloudProviders: this.providerWithShare(this.props),
onExport: this._onShareMapUrl,
onSetCloudProvider: this.props.providerActions.setCloudProvider,
onUpdateImageSetting: uiStateActions.setExportImageSetting
}));
modalProps = {
title: 'modal.title.shareURL',
onCancel: this._onCloseSaveMap
};
break;
default:
break;
}
}
return this.props.rootNode ? _react["default"].createElement(ModalDialog, (0, _extends2["default"])({
parentSelector: function parentSelector() {
return (0, _reactDom.findDOMNode)(rootNode);
},
isOpen: Boolean(currentModal),
onCancel: this._closeModal
}, modalProps, {
cssStyle: DefaultStyle.concat(modalProps.cssStyle || '')
}), template) : null;
}
/* eslint-enable complexity */
}]);
return ModalWrapper;
}(_react.Component);
(0, _defineProperty2["default"])(ModalWrapper, "propTypes", {
rootNode: _propTypes["default"].object,
containerW: _propTypes["default"].number,
containerH: _propTypes["default"].number,
mapboxApiAccessToken: _propTypes["default"].string.isRequired,
mapboxApiUrl: _propTypes["default"].string,
mapState: _propTypes["default"].object.isRequired,
mapStyle: _propTypes["default"].object.isRequired,
uiState: _propTypes["default"].object.isRequired,
visState: _propTypes["default"].object.isRequired,
visStateActions: _propTypes["default"].object.isRequired,
uiStateActions: _propTypes["default"].object.isRequired,
mapStyleActions: _propTypes["default"].object.isRequired,
onSaveToStorage: _propTypes["default"].func,
cloudProviders: _propTypes["default"].arrayOf(_propTypes["default"].object)
});
return ModalWrapper;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL21vZGFsLWNvbnRhaW5lci5qcyJdLCJuYW1lcyI6WyJEYXRhVGFibGVNb2RhbFN0eWxlIiwiY3NzIiwibWVkaWEiLCJwb3J0YWJsZSIsInBhbG0iLCJzbWFsbE1vZGFsQ3NzIiwiTG9hZERhdGFNb2RhbFN0eWxlIiwiRGVmYXVsdFN0eWxlIiwiTW9kYWxDb250YWluZXJGYWN0b3J5IiwiZGVwcyIsIkRlbGV0ZURhdGFzZXRNb2RhbEZhY3RvcnkiLCJPdmVyV3JpdGVNYXBNb2RhbEZhY3RvcnkiLCJEYXRhVGFibGVNb2RhbEZhY3RvcnkiLCJMb2FkRGF0YU1vZGFsRmFjdG9yeSIsIkV4cG9ydEltYWdlTW9kYWxGYWN0b3J5IiwiRXhwb3J0RGF0YU1vZGFsRmFjdG9yeSIsIkV4cG9ydE1hcE1vZGFsRmFjdG9yeSIsIkFkZE1hcFN0eWxlTW9kYWxGYWN0b3J5IiwiTW9kYWxEaWFsb2dGYWN0b3J5IiwiU2F2ZU1hcE1vZGFsRmFjdG9yeSIsIlNoYXJlTWFwTW9kYWxGYWN0b3J5IiwiRGVsZXRlRGF0YXNldE1vZGFsIiwiT3ZlcldyaXRlTWFwTW9kYWwiLCJEYXRhVGFibGVNb2RhbCIsIkxvYWREYXRhTW9kYWwiLCJFeHBvcnRJbWFnZU1vZGFsIiwiRXhwb3J0RGF0YU1vZGFsIiwiRXhwb3J0TWFwTW9kYWwiLCJBZGRNYXBTdHlsZU1vZGFsIiwiTW9kYWxEaWFsb2ciLCJTYXZlTWFwTW9kYWwiLCJTaGFyZU1hcE1vZGFsIiwiTW9kYWxXcmFwcGVyIiwicHJvcHMiLCJjbG91ZFByb3ZpZGVycyIsImZpbHRlciIsInAiLCJoYXNQcml2YXRlU3RvcmFnZSIsImhhc1NoYXJpbmdVcmwiLCJ1aVN0YXRlQWN0aW9ucyIsInRvZ2dsZU1vZGFsIiwia2V5IiwidmlzU3RhdGVBY3Rpb25zIiwicmVtb3ZlRGF0YXNldCIsIl9jbG9zZU1vZGFsIiwibWFwU3R5bGVBY3Rpb25zIiwiYWRkQ3VzdG9tTWFwU3R5bGUiLCJibG9iIiwibG9hZEZpbGVzIiwidWlTdGF0ZSIsImV4cG9ydEltYWdlIiwiZXhwb3J0aW5nIiwiY2xlYW51cEV4cG9ydEltYWdlIiwiZXhwb3J0RGF0YSIsImZvcm1hdCIsImV4cG9ydE1hcCIsIkVYUE9SVF9NQVBfRk9STUFUUyIsIkhUTUwiLCJleHBvcnRIdG1sIiwiZXhwb3J0SnNvbiIsInByb3ZpZGVyIiwiaXNQdWJsaWMiLCJvdmVyd3JpdGUiLCJjbG9zZU1vZGFsIiwidG9TYXZlIiwicHJvdmlkZXJBY3Rpb25zIiwiZXhwb3J0RmlsZVRvQ2xvdWQiLCJtYXBEYXRhIiwib3B0aW9ucyIsIm9uU3VjY2VzcyIsIm9uRXhwb3J0VG9DbG91ZFN1Y2Nlc3MiLCJvbkVycm9yIiwib25FeHBvcnRUb0Nsb3VkRXJyb3IiLCJjdXJyZW50UHJvdmlkZXIiLCJwcm92aWRlclN0YXRlIiwiZmluZCIsIm5hbWUiLCJfZXhwb3J0RmlsZVRvQ2xvdWQiLCJfb25TYXZlTWFwIiwicmVzZXRQcm92aWRlclN0YXR1cyIsInBheWxvYWQiLCJsb2FkQ2xvdWRNYXAiLCJvbkxvYWRDbG91ZE1hcFN1Y2Nlc3MiLCJvbkxvYWRDbG91ZE1hcEVycm9yIiwiY29udGFpbmVyVyIsImNvbnRhaW5lckgiLCJtYXBTdHlsZSIsIm1hcFN0YXRlIiwidmlzU3RhdGUiLCJyb290Tm9kZSIsImN1cnJlbnRNb2RhbCIsImRhdGFzZXRLZXlUb1JlbW92ZSIsImRhdGFzZXRzIiwibGF5ZXJzIiwiZWRpdGluZ0RhdGFzZXQiLCJ0ZW1wbGF0ZSIsIm1vZGFsUHJvcHMiLCJpZCIsIkRBVEFfVEFCTEVfSUQiLCJ3aWR0aCIsInNob3dEYXRhc2V0VGFibGUiLCJzb3J0VGFibGVDb2x1bW4iLCJwaW5UYWJsZUNvbHVtbiIsImNvcHlUYWJsZUNvbHVtbiIsImNzc1N0eWxlIiwiREVMRVRFX0RBVEFfSUQiLCJ0aXRsZSIsImZvb3RlciIsIm9uQ29uZmlybSIsIl9kZWxldGVEYXRhc2V0Iiwib25DYW5jZWwiLCJjb25maXJtQnV0dG9uIiwibmVnYXRpdmUiLCJsYXJnZSIsImNoaWxkcmVuIiwiQUREX0RBVEFfSUQiLCJfb25GaWxlVXBsb2FkIiwiX29uTG9hZENsb3VkTWFwIiwicHJvdmlkZXJXaXRoU3RvcmFnZSIsInNldENsb3VkUHJvdmlkZXIiLCJnZXRTYXZlZE1hcHMiLCJFWFBPUlRfSU1BR0VfSUQiLCJzZXRFeHBvcnRJbWFnZVNldHRpbmciLCJfb25FeHBvcnRJbWFnZSIsImRpc2FibGVkIiwiRVhQT1JUX0RBVEFfSUQiLCJhcHBseUNQVUZpbHRlciIsInNldEV4cG9ydERhdGFUeXBlIiwic2V0RXhwb3J0U2VsZWN0ZWREYXRhc2V0Iiwic2V0RXhwb3J0RmlsdGVyZWQiLCJfb25FeHBvcnREYXRhIiwiRVhQT1JUX01BUF9JRCIsImtlcGxlckdsQ29uZmlnIiwiS2VwbGVyR2xTY2hlbWEiLCJnZXRDb25maWdUb1NhdmUiLCJzZXRFeHBvcnRNYXBGb3JtYXQiLCJzZXRVc2VyTWFwYm94QWNjZXNzVG9rZW4iLCJzZXRFeHBvcnRIVE1MTWFwTW9kZSIsIl9vbkV4cG9ydE1hcCIsIkFERF9NQVBfU1RZTEVfSUQiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsIm1hcGJveEFwaVVybCIsImlucHV0U3R5bGUiLCJpbnB1dE1hcFN0eWxlIiwibG9hZEN1c3RvbU1hcFN0eWxlIiwiX29uQWRkQ3VzdG9tTWFwU3R5bGUiLCJzdHlsZSIsIlNBVkVfTUFQX0lEIiwibWFwSW5mbyIsInNldE1hcEluZm8iLCJPVkVSV1JJVEVfTUFQX0lEIiwiX29uT3ZlcndyaXRlTWFwIiwiU0hBUkVfTUFQX0lEIiwicHJvdmlkZXJXaXRoU2hhcmUiLCJfb25TaGFyZU1hcFVybCIsIl9vbkNsb3NlU2F2ZU1hcCIsIkJvb2xlYW4iLCJjb25jYXQiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJudW1iZXIiLCJzdHJpbmciLCJpc1JlcXVpcmVkIiwib25TYXZlVG9TdG9yYWdlIiwiZnVuYyIsImFycmF5T2YiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JB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QUFBLG1DQUNNOUgsWUFETixlQUVxQjtBQUNqQnlELElBQUFBLFFBQVEsRUFBRXNFLHNCQUFVQyxNQURIO0FBRWpCNUUsSUFBQUEsVUFBVSxFQUFFMkUsc0JBQVVFLE1BRkw7QUFHakI1RSxJQUFBQSxVQUFVLEVBQUUwRSxzQkFBVUUsTUFITDtBQUlqQnJCLElBQUFBLG9CQUFvQixFQUFFbUIsc0JBQVVHLE1BQVYsQ0FBaUJDLFVBSnRCO0FBS2pCdEIsSUFBQUEsWUFBWSxFQUFFa0Isc0JBQVVHLE1BTFA7QUFNakIzRSxJQUFBQSxRQUFRLEVBQUV3RSxzQkFBVUMsTUFBVixDQUFpQkcsVUFOVjtBQU9qQjdFLElBQUFBLFFBQVEsRUFBRXlFLHNCQUFVQyxNQUFWLENBQWlCRyxVQVBWO0FBUWpCbEgsSUFBQUEsT0FBTyxFQUFFOEcsc0JBQVVDLE1BQVYsQ0FBaUJHLFVBUlQ7QUFTakIzRSxJQUFBQSxRQUFRLEVBQUV1RSxzQkFBVUMsTUFBVixDQUFpQkcsVUFUVjtBQVVqQnpILElBQUFBLGVBQWUsRUFBRXFILHNCQUFVQyxNQUFWLENBQWlCRyxVQVZqQjtBQVdqQjVILElBQUFBLGNBQWMsRUFBRXdILHNCQUFVQyxNQUFWLENBQWlCRyxVQVhoQjtBQVlqQnRILElBQUFBLGVBQWUsRUFBRWtILHNCQUFVQyxNQUFWLENBQWlCRyxVQVpqQjtBQWFqQkMsSUFBQUEsZUFBZSxFQUFFTCxzQkFBVU0sSUFiVjtBQWNqQm5JLElBQUFBLGNBQWMsRUFBRTZILHNCQUFVTyxPQUFWLENBQWtCUCxzQkFBVUMsTUFBNUI7QUFkQyxHQUZyQjtBQXFZQSxTQUFPaEksWUFBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIwIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtjc3N9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7ZmluZERPTU5vZGV9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQge2NyZWF0ZVNlbGVjdG9yfSBmcm9tICdyZXNlbGVjdCc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC5nZXQnO1xuXG5pbXBvcnQgTW9kYWxEaWFsb2dGYWN0b3J5IGZyb20gJy4vbW9kYWxzL21vZGFsLWRpYWxvZyc7XG5pbXBvcnQgS2VwbGVyR2xTY2hlbWEgZnJvbSAnc2NoZW1hcyc7XG5pbXBvcnQge2V4cG9ydEpzb24sIGV4cG9ydEh0bWwsIGV4cG9ydERhdGEsIGV4cG9ydEltYWdlLCBleHBvcnRNYXB9IGZyb20gJ3V0aWxzL2V4cG9ydC11dGlscyc7XG5pbXBvcnQge2lzVmFsaWRNYXBJbmZvfSBmcm9tICd1dGlscy9tYXAtaW5mby11dGlscyc7XG5cbi8vIG1vZGFsc1xuaW1wb3J0IERlbGV0ZURhdGFzZXRNb2RhbEZhY3RvcnkgZnJvbSAnLi9tb2RhbHMvZGVsZXRlLWRhdGEtbW9kYWwnO1xuaW1wb3J0IE92ZXJXcml0ZU1hcE1vZGFsRmFjdG9yeSBmcm9tICcuL21vZGFscy9vdmVyd3JpdGUtbWFwLW1vZGFsJztcbmltcG9ydCBEYXRhVGFibGVNb2RhbEZhY3RvcnkgZnJvbSAnLi9tb2RhbHMvZGF0YS10YWJsZS1tb2RhbCc7XG5pbXBvcnQgTG9hZERhdGFNb2RhbEZhY3RvcnkgZnJvbSAnLi9tb2RhbHMvbG9hZC1kYXRhLW1vZGFsJztcbmltcG9ydCBFeHBvcnRJbWFnZU1vZGFsRmFjdG9yeSBmcm9tICcuL21vZGFscy9leHBvcnQtaW1hZ2UtbW9kYWwnO1xuaW1wb3J0IEV4cG9ydERhdGFNb2RhbEZhY3RvcnkgZnJvbSAnLi9tb2RhbHMvZXhwb3J0LWRhdGEtbW9kYWwnO1xuaW1wb3J0IEV4cG9ydE1hcE1vZGFsRmFjdG9yeSBmcm9tICcuL21vZGFscy9leHBvcnQtbWFwLW1vZGFsL2V4cG9ydC1tYXAtbW9kYWwnO1xuaW1wb3J0IEFkZE1hcFN0eWxlTW9kYWxGYWN0b3J5IGZyb20gJy4vbW9kYWxzL2FkZC1tYXAtc3R5bGUtbW9kYWwnO1xuaW1wb3J0IFNhdmVNYXBNb2RhbEZhY3RvcnkgZnJvbSAnLi9tb2RhbHMvc2F2ZS1tYXAtbW9kYWwnO1xuaW1wb3J0IFNoYXJlTWFwTW9kYWxGYWN0b3J5IGZyb20gJy4vbW9kYWxzL3NoYXJlLW1hcC1tb2RhbCc7XG5cbi8vIEJyZWFrcG9pbnRzXG5pbXBvcnQge21lZGlhfSBmcm9tICdzdHlsZXMvbWVkaWEtYnJlYWtwb2ludHMnO1xuXG4vLyBUZW1wbGF0ZVxuaW1wb3J0IHtcbiAgQUREX0RBVEFfSUQsXG4gIERBVEFfVEFCTEVfSUQsXG4gIERFTEVURV9EQVRBX0lELFxuICBFWFBPUlRfREFUQV9JRCxcbiAgRVhQT1JUX0lNQUdFX0lELFxuICBFWFBPUlRfTUFQX0lELFxuICBBRERfTUFQX1NUWUxFX0lELFxuICBTQVZFX01BUF9JRCxcbiAgU0hBUkVfTUFQX0lELFxuICBPVkVSV1JJVEVfTUFQX0lEXG59IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcbmltcG9ydCB7RVhQT1JUX01BUF9GT1JNQVRTfSBmcm9tICcuLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmNvbnN0IERhdGFUYWJsZU1vZGFsU3R5bGUgPSBjc3NgXG4gIHRvcDogODBweDtcbiAgcGFkZGluZzogMzJweCAwIDAgMDtcbiAgd2lkdGg6IDkwdnc7XG4gIG1heC13aWR0aDogOTB2dztcblxuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIHBhZGRpbmc6IDA7XG4gIGB9XG5cbiAgJHttZWRpYS5wYWxtYFxuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gIGB9XG5gO1xuY29uc3Qgc21hbGxNb2RhbENzcyA9IGNzc2BcbiAgd2lkdGg6IDQwJTtcbiAgcGFkZGluZzogNDBweCA0MHB4IDMycHggNDBweDtcbmA7XG5cbmNvbnN0IExvYWREYXRhTW9kYWxTdHlsZSA9IGNzc2BcbiAgdG9wOiA2MHB4O1xuYDtcblxuY29uc3QgRGVmYXVsdFN0eWxlID0gY3NzYFxuICBtYXgtd2lkdGg6IDk2MHB4O1xuYDtcblxuTW9kYWxDb250YWluZXJGYWN0b3J5LmRlcHMgPSBbXG4gIERlbGV0ZURhdGFzZXRNb2RhbEZhY3RvcnksXG4gIE92ZXJXcml0ZU1hcE1vZGFsRmFjdG9yeSxcbiAgRGF0YVRhYmxlTW9kYWxGYWN0b3J5LFxuICBMb2FkRGF0YU1vZGFsRmFjdG9yeSxcbiAgRXhwb3J0SW1hZ2VNb2RhbEZhY3RvcnksXG4gIEV4cG9ydERhdGFNb2RhbEZhY3RvcnksXG4gIEV4cG9ydE1hcE1vZGFsRmFjdG9yeSxcbiAgQWRkTWFwU3R5bGVNb2RhbEZhY3RvcnksXG4gIE1vZGFsRGlhbG9nRmFjdG9yeSxcbiAgU2F2ZU1hcE1vZGFsRmFjdG9yeSxcbiAgU2hhcmVNYXBNb2RhbEZhY3Rvcnlcbl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1vZGFsQ29udGFpbmVyRmFjdG9yeShcbiAgRGVsZXRlRGF0YXNldE1vZGFsLFxuICBPdmVyV3JpdGVNYXBNb2RhbCxcbiAgRGF0YVRhYmxlTW9kYWwsXG4gIExvYWREYXRhTW9kYWwsXG4gIEV4cG9ydEltYWdlTW9kYWwsXG4gIEV4cG9ydERhdGFNb2RhbCxcbiAgRXhwb3J0TWFwTW9kYWwsXG4gIEFkZE1hcFN0eWxlTW9kYWwsXG4gIE1vZGFsRGlhbG9nLFxuICBTYXZlTWFwTW9kYWwsXG4gIFNoYXJlTWFwTW9kYWxcbikge1xuICBjbGFzcyBNb2RhbFdyYXBwZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICByb290Tm9kZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIGNvbnRhaW5lclc6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBjb250YWluZXJIOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgbWFwYm94QXBpQWNjZXNzVG9rZW46IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgIG1hcGJveEFwaVVybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIG1hcFN0YXRlOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgICBtYXBTdHlsZTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgdWlTdGF0ZTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgdmlzU3RhdGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIHZpc1N0YXRlQWN0aW9uczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgdWlTdGF0ZUFjdGlvbnM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIG1hcFN0eWxlQWN0aW9uczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgb25TYXZlVG9TdG9yYWdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIGNsb3VkUHJvdmlkZXJzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KVxuICAgIH07XG4gICAgY2xvdWRQcm92aWRlcnMgPSBwcm9wcyA9PiBwcm9wcy5jbG91ZFByb3ZpZGVycztcbiAgICBwcm92aWRlcldpdGhTdG9yYWdlID0gY3JlYXRlU2VsZWN0b3IodGhpcy5jbG91ZFByb3ZpZGVycywgY2xvdWRQcm92aWRlcnMgPT5cbiAgICAgIGNsb3VkUHJvdmlkZXJzLmZpbHRlcihwID0+IHAuaGFzUHJpdmF0ZVN0b3JhZ2UoKSlcbiAgICApO1xuICAgIHByb3ZpZGVyV2l0aFNoYXJlID0gY3JlYXRlU2VsZWN0b3IodGhpcy5jbG91ZFByb3ZpZGVycywgY2xvdWRQcm92aWRlcnMgPT5cbiAgICAgIGNsb3VkUHJvdmlkZXJzLmZpbHRlcihwID0+IHAuaGFzU2hhcmluZ1VybCgpKVxuICAgICk7XG4gICAgX2Nsb3NlTW9kYWwgPSAoKSA9PiB7XG4gICAgICB0aGlzLnByb3BzLnVpU3RhdGVBY3Rpb25zLnRvZ2dsZU1vZGFsKG51bGwpO1xuICAgIH07XG5cbiAgICBfZGVsZXRlRGF0YXNldCA9IGtleSA9PiB7XG4gICAgICB0aGlzLnByb3BzLnZpc1N0YXRlQWN0aW9ucy5yZW1vdmVEYXRhc2V0KGtleSk7XG4gICAgICB0aGlzLl9jbG9zZU1vZGFsKCk7XG4gICAgfTtcblxuICAgIF9vbkFkZEN1c3RvbU1hcFN0eWxlID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5tYXBTdHlsZUFjdGlvbnMuYWRkQ3VzdG9tTWFwU3R5bGUoKTtcbiAgIC