kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
364 lines (304 loc) • 37.7 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.ExternalDatasetsUpload = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _reactRedux = require("react-redux");
var _datasetActions = require("../../../store/actions/datasetActions");
var _styles = require("@material-ui/core/styles");
var _Grid = _interopRequireDefault(require("@material-ui/core/Grid"));
var _Paper = _interopRequireDefault(require("@material-ui/core/Paper"));
var _Button = _interopRequireDefault(require("@material-ui/core/Button"));
var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
var _materialUiFlatPagination = _interopRequireDefault(require("material-ui-flat-pagination"));
var _loadingSpinner = _interopRequireDefault(require("../loading-spinner"));
var _Radio = _interopRequireDefault(require("@material-ui/core/Radio"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var styles = function styles(theme) {
return {
root: {
flexGrow: 1,
height: '320px'
},
button: {
margin: theme.spacing.unit,
maxHeight: '30px'
}
};
};
/*
Inspired by https://github.com/okonet/react-dropzone/blob/master/src/index.js
*/
var ExternalDatasetsUpload = exports.ExternalDatasetsUpload = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(ExternalDatasetsUpload, _Component);
var _super = _createSuper(ExternalDatasetsUpload);
function ExternalDatasetsUpload() {
var _this;
(0, _classCallCheck2["default"])(this, ExternalDatasetsUpload);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
currentPage: 1,
datasetsPerPage: 4,
offset: 0,
datasetFilter: '',
filteredDatasets: [],
selectedValue: ''
});
// static propTypes = {
// onUpload: PropTypes.func.isRequired
// };
// _setState = s => {
// this.setState({ [s]: true });
// };
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handlePageChange", function (offset, page) {
// console.log("active page is" + page);
// console.log(offset, page);
_this.setState({
offset: offset,
currentPage: page
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onMount", function (datasets) {
return datasets.map(function (dataset) {
return _this.setState((0, _defineProperty2["default"])({}, dataset.id, false));
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_downloadDataset", function (dataset) {
_this.props.dispatch((0, _datasetActions.externalDatasetDownload)(dataset));
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_files", function () {
var files = [];
var datasetId = _this.state;
var _loop = function _loop() {
var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
key = _Object$entries$_i[0],
value = _Object$entries$_i[1];
if (value === true) {
var datasets = _this.props.dataset.externalDatasets;
datasets.map(function (dataset) {
if (dataset.id === key) {
// console.log("reached")
return _this._downloadDataset(dataset); // console.log(dataset);
}
return dataset;
});
}
};
for (var _i = 0, _Object$entries = Object.entries(datasetId); _i < _Object$entries.length; _i++) {
_loop();
}
return files;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onClick", function () {
// return this._files();
var dataset = _this.props.dataset.externalDatasets.map(function (dataset) {
if (dataset.id === _this.state.selectedValue) {
return _this._downloadDataset(dataset);
}
});
return dataset;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onChange", function (_ref) {
var files = _ref.target.files;
files = _this.props.dataset.listDatasets;
if (!files) {
return;
}
_this.props.onUpload(files);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleChange", function (name) {
return function (event) {
_this.setState((0, _defineProperty2["default"])({}, name, event.target.checked));
};
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleRadioChange", function (event) {
_this.setState({
selectedValue: event.target.value
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_filterDatasets", function (datasetFilter) {
// console.log(datasetFilter);
var externalDatasets = _this.props.dataset.externalDatasets;
var filteredDatasets = externalDatasets.filter(function (dataset) {
var datasetName = dataset.name.toLowerCase();
return datasetName.indexOf(datasetFilter.toLowerCase()) !== -1;
});
_this.setState({
filteredDatasets: filteredDatasets
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleFilterChange", function (e) {
_this.setState({
datasetFilter: e.target.value
});
_this._filterDatasets(e.target.value);
});
return _this;
}
(0, _createClass2["default"])(ExternalDatasetsUpload, [{
key: "componentDidMount",
value: function componentDidMount() {
// console.log(this.state);
// this.setState({datasets: this.props.dataset.datasets})
var datasets = this.props.dataset.externalDatasets;
if (datasets) {
this._onMount(datasets);
}
}
}, {
key: "_loadData",
value: function _loadData(response, file) {
return file;
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var classes = this.props.classes;
var externalDatasets = this.props.dataset.externalDatasets;
var _this$state = this.state,
currentPage = _this$state.currentPage,
datasetsPerPage = _this$state.datasetsPerPage,
filteredDatasets = _this$state.filteredDatasets,
datasetFilter = _this$state.datasetFilter; // const filtercurrentExternalDatasets = [{ name: "shishir" }];
var indexOfLastDataset = currentPage * datasetsPerPage;
var indexOfFirstDataset = indexOfLastDataset - datasetsPerPage; // console.log("filtered datasets", filteredDatasets);
// console.log(filtercurrentExternalDatasets);
var currentExternalDatasets = []; // console.log(datasetFilter.length);
if (datasetFilter.length === 0) {
currentExternalDatasets = externalDatasets.slice(indexOfFirstDataset, indexOfLastDataset);
} else {
currentExternalDatasets = filteredDatasets.slice(indexOfFirstDataset, indexOfLastDataset);
externalDatasets = filteredDatasets;
} // console.log(currentExternalDatasets);
var renderExternalDatasets = currentExternalDatasets.map(function (dataset) {
var ID = dataset.id.toString(); // console.log(ID);
return (/*#__PURE__*/_react["default"].createElement(_Grid["default"], {
key: dataset.id,
item: true,
xs: 12,
style: {
paddingBottom: '0px',
width: '100%'
}
}, /*#__PURE__*/_react["default"].createElement(_Paper["default"], {
className: classes.paper
}, /*#__PURE__*/_react["default"].createElement(_Grid["default"], {
container: true,
wrap: "nowrap",
spacing: 16,
style: {
margin: 'auto'
}
}, /*#__PURE__*/_react["default"].createElement(_Grid["default"], {
item: true,
style: {
padding: '0px'
}
}, /*#__PURE__*/_react["default"].createElement(_Radio["default"], {
checked: _this2.state.selectedValue === ID,
onChange: _this2.handleRadioChange,
value: dataset.id,
name: "radio-button-demo",
"aria-label": "A"
})), /*#__PURE__*/_react["default"].createElement(_Grid["default"], {
item: true,
xs: true,
style: {
margin: 'auto'
}
}, /*#__PURE__*/_react["default"].createElement(_Typography["default"], null, dataset.name)))))
);
});
var _renderButton = function _renderButton() {
if (_this2.props.ui.progressAddDataStatus === 'OPEN') {
return (/*#__PURE__*/_react["default"].createElement("div", {
style: {
margin: 'auto'
}
}, /*#__PURE__*/_react["default"].createElement(_loadingSpinner["default"], null))
);
}
return (/*#__PURE__*/_react["default"].createElement(_Button["default"], {
className: classes.button,
onClick: _this2._onClick
}, "Add Data")
);
};
return (/*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
className: classes.root,
style: {
display: 'grid'
}
}, /*#__PURE__*/_react["default"].createElement("div", {
style: {
marginLeft: '12px'
}
}, /*#__PURE__*/_react["default"].createElement("label", {
htmlFor: "filter"
}, "Search: "), /*#__PURE__*/_react["default"].createElement("input", {
style: {
borderTopStyle: 'hidden',
borderLeftStyle: 'hidden',
borderRightStyle: 'hidden',
borderBottomStyle: 'solid',
borderBottomWidth: 'thin',
borderBottomColor: 'lightgray'
},
type: "text",
id: "filter",
value: this.state.datasetFilter,
onChange: this._handleFilterChange
})), /*#__PURE__*/_react["default"].createElement(_Grid["default"], {
container: true,
spacing: 24,
style: {
display: 'inline-block',
margin: 'auto',
width: '100%',
minHeight: '240px'
}
}, renderExternalDatasets), /*#__PURE__*/_react["default"].createElement(_materialUiFlatPagination["default"], {
style: {
margin: 'auto'
},
otherPageColor: "black",
activePage: this.state.currentPage,
limit: this.state.datasetsPerPage,
offset: this.state.offset,
total: externalDatasets.length,
onClick: function onClick(e, offset, page) {
return _this2._handlePageChange(offset, page);
}
}), _renderButton()))
);
}
}]);
return ExternalDatasetsUpload;
}(_react.Component);
ExternalDatasetsUpload.propTypes = {
classes: _propTypes["default"].object.isRequired
};
var mapStateToProps = function mapStateToProps(state) {
return state;
};
var _default = exports["default"] = (0, _reactRedux.connect)(mapStateToProps, null)((0, _styles.withStyles)(styles)(ExternalDatasetsUpload));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9maWxlLXVwbG9hZGVyL2V4dGVybmFsLWRhdGFzZXQtdXBsb2FkLmpzIl0sIm5hbWVzIjpbInN0eWxlcyIsInRoZW1lIiwicm9vdCIsImZsZXhHcm93IiwiaGVpZ2h0IiwiYnV0dG9uIiwibWFyZ2luIiwic3BhY2luZyIsInVuaXQiLCJtYXhIZWlnaHQiLCJFeHRlcm5hbERhdGFzZXRzVXBsb2FkIiwiY3VycmVudFBhZ2UiLCJkYXRhc2V0c1BlclBhZ2UiLCJvZmZzZXQiLCJkYXRhc2V0RmlsdGVyIiwiZmlsdGVyZWREYXRhc2V0cyIsInNlbGVjdGVkVmFsdWUiLCJwYWdlIiwic2V0U3RhdGUiLCJkYXRhc2V0cyIsIm1hcCIsImRhdGFzZXQiLCJpZCIsInByb3BzIiwiZGlzcGF0Y2giLCJmaWxlcyIsImRhdGFzZXRJZCIsInN0YXRlIiwia2V5IiwidmFsdWUiLCJleHRlcm5hbERhdGFzZXRzIiwiX2Rvd25sb2FkRGF0YXNldCIsIk9iamVjdCIsImVudHJpZXMiLCJ0YXJnZXQiLCJsaXN0RGF0YXNldHMiLCJvblVwbG9hZCIsIm5hbWUiLCJldmVudCIsImNoZWNrZWQiLCJmaWx0ZXIiLCJkYXRhc2V0TmFtZSIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsImUiLCJfZmlsdGVyRGF0YXNldHMiLCJfb25Nb3VudCIsInJlc3BvbnNlIiwiZmlsZSIsImNsYXNzZXMiLCJpbmRleE9mTGFzdERhdGFzZXQiLCJpbmRleE9mRmlyc3REYXRhc2V0IiwiY3VycmVudEV4dGVybmFsRGF0YXNldHMiLCJsZW5ndGgiLCJzbGljZSIsInJlbmRlckV4dGVybmFsRGF0YXNldHMiLCJJRCIsInRvU3RyaW5nIiwicGFkZGluZ0JvdHRvbSIsIndpZHRoIiwicGFwZXIiLCJwYWRkaW5nIiwiaGFuZGxlUmFkaW9DaGFuZ2UiLCJfcmVuZGVyQnV0dG9uIiwidWkiLCJwcm9ncmVzc0FkZERhdGFTdGF0dXMiLCJfb25DbGljayIsImRpc3BsYXkiLCJtYXJnaW5MZWZ0IiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJMZWZ0U3R5bGUiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiX2hhbmRsZUZpbHRlckNoYW5nZSIsIm1pbkhlaWdodCIsIl9oYW5kbGVQYWdlQ2hhbmdlIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiaXNSZXF1aXJlZCIsIm1hcFN0YXRlVG9Qcm9wcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUVBOztBQUNBOztBQUNBOzs7Ozs7Ozs7O0FBRUEsSUFBTUEsTUFBTSxHQUFHLFNBQVRBLE1BQVMsQ0FBQUMsS0FBSztBQUFBLFNBQUs7QUFDdkJDLElBQUFBLElBQUksRUFBRTtBQUNKQyxNQUFBQSxRQUFRLEVBQUUsQ0FETjtBQUVKQyxNQUFBQSxNQUFNLEVBQUU7QUFGSixLQURpQjtBQUt2QkMsSUFBQUEsTUFBTSxFQUFFO0FBQ05DLE1BQUFBLE1BQU0sRUFBRUwsS0FBSyxDQUFDTSxPQUFOLENBQWNDLElBRGhCO0FBRU5DLE1BQUFBLFNBQVMsRUFBRTtBQUZMO0FBTGUsR0FBTDtBQUFBLENBQXBCO0FBVUE7Ozs7O0lBR2FDLHNCOzs7Ozs7Ozs7Ozs7Ozs7OEZBQ0g7QUFDTkMsTUFBQUEsV0FBVyxFQUFFLENBRFA7QUFFTkMsTUFBQUEsZUFBZSxFQUFFLENBRlg7QUFHTkMsTUFBQUEsTUFBTSxFQUFFLENBSEY7QUFJTkMsTUFBQUEsYUFBYSxFQUFFLEVBSlQ7QUFLTkMsTUFBQUEsZ0JBQWdCLEVBQUUsRUFMWjtBQU1OQyxNQUFBQSxhQUFhLEVBQUU7QUFOVCxLO0FBUVI7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzBHQUVvQixVQUFDSCxNQUFELEVB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RUFBRSxpQkFBQ1QsQ0FBRCxFQUFJL0IsTUFBSixFQUFZSSxJQUFaO0FBQUEsbUJBQXFCLE1BQUksQ0FBQzRELGlCQUFMLENBQXVCaEUsTUFBdkIsRUFBK0JJLElBQS9CLENBQXJCO0FBQUE7QUFQWCxVQXZDRixFQWdERzhDLGFBQWEsRUFoRGhCLENBREY7QUFERjtBQXNERDs7O0VBcFB5Q2UsZ0I7O0FBdVA1Q3BFLHNCQUFzQixDQUFDcUUsU0FBdkIsR0FBbUM7QUFDakM5QixFQUFBQSxPQUFPLEVBQUUrQixzQkFBVUMsTUFBVixDQUFpQkM7QUFETyxDQUFuQzs7QUFJQSxJQUFNQyxlQUFlLEdBQUcsU0FBbEJBLGVBQWtCLENBQUF4RCxLQUFLO0FBQUEsU0FBSUEsS0FBSjtBQUFBLENBQTdCOztvQ0FFZSx5QkFDYndELGVBRGEsRUFFYixJQUZhLEVBR2Isd0JBQVduRixNQUFYLEVBQW1CVSxzQkFBbkIsQ0FIYSxDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuLy8gaW1wb3J0IHN0eWxlZCBmcm9tIFwic3R5bGVkLWNvbXBvbmVudHNcIjtcbmltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtleHRlcm5hbERhdGFzZXREb3dubG9hZH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvYWN0aW9ucy9kYXRhc2V0QWN0aW9ucyc7XG5pbXBvcnQge3dpdGhTdHlsZXN9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL3N0eWxlcyc7XG5pbXBvcnQgR3JpZCBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9HcmlkJztcbmltcG9ydCBQYXBlciBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9QYXBlcic7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0J1dHRvbic7XG4vLyBpbXBvcnQgQXZhdGFyIGZyb20gXCJAbWF0ZXJpYWwtdWkvY29yZS9BdmF0YXJcIjtcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL1R5cG9ncmFwaHknO1xuLy8gaW1wb3J0IFJlYWN0UGFnaW5hdGUgZnJvbSBcInJlYWN0LXBhZ2luYXRlXCI7XG5pbXBvcnQgUGFnaW5hdGlvbiBmcm9tICdtYXRlcmlhbC11aS1mbGF0LXBhZ2luYXRpb24nO1xuaW1wb3J0IExvYWRpbmdTcGlubmVyIGZyb20gJy4uL2xvYWRpbmctc3Bpbm5lcic7XG5pbXBvcnQgUmFkaW8gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvUmFkaW8nO1xuXG5jb25zdCBzdHlsZXMgPSB0aGVtZSA9PiAoe1xuICByb290OiB7XG4gICAgZmxleEdyb3c6IDEsXG4gICAgaGVpZ2h0OiAnMzIwcHgnXG4gIH0sXG4gIGJ1dHRvbjoge1xuICAgIG1hcmdpbjogdGhlbWUuc3BhY2luZy51bml0LFxuICAgIG1heEhlaWdodDogJzMwcHgnXG4gIH1cbn0pO1xuLypcbkluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9va29uZXQvcmVhY3QtZHJvcHpvbmUvYmxvYi9tYXN0ZXIvc3JjL2luZGV4LmpzXG4qL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsRGF0YXNldHNVcGxvYWQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0ZSA9IHtcbiAgICBjdXJyZW50UGFnZTogMSxcbiAgICBkYXRhc2V0c1BlclBhZ2U6IDQsXG4gICAgb2Zmc2V0OiAwLFxuICAgIGRhdGFzZXRGaWx0ZXI6ICcnLFxuICAgIGZpbHRlcmVkRGF0YXNldHM6IFtdLFxuICAgIHNlbGVjdGVkVmFsdWU6ICcnXG4gIH07XG4gIC8vIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gIC8vICAgb25VcGxvYWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgLy8gfTtcblxuICAvLyAgIF9zZXRTdGF0ZSA9IHMgPT4ge1xuICAvLyAgICAgdGhpcy5zZXRTdGF0ZSh7IFtzXTogdHJ1ZSB9KTtcbiAgLy8gICB9O1xuXG4gIF9oYW5kbGVQYWdlQ2hhbmdlID0gKG9mZnNldCwgcGFnZSkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYWN0aXZlIHBhZ2UgaXNcIiArIHBhZ2UpO1xuICAgIC8vIGNvbnNvbGUubG9nKG9mZnNldCwgcGFnZSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7b2Zmc2V0LCBjdXJyZW50UGFnZTogcGFnZX0pO1xuICB9O1xuXG4gIF9vbk1vdW50ID0gZGF0YXNldHMgPT4ge1xuICAgIHJldHVybiBkYXRhc2V0cy5tYXAoZGF0YXNldCA9PiB0aGlzLnNldFN0YXRlKHtbZGF0YXNldC5pZF06IGZhbHNlfSkpO1xuICB9O1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc3RhdGUpO1xuICAgIC8vICAgdGhpcy5zZXRTdGF0ZSh7ZGF0YXNldHM6IHRoaXMucHJvcHMuZGF0YXNldC5kYXRhc2V0c30pXG4gICAgY29uc3QgZGF0YXNldHMgPSB0aGlzLnByb3BzLmRhdGFzZXQuZXh0ZXJuYWxEYXRhc2V0cztcbiAgICBpZiAoZGF0YXNldHMpIHtcbiAgICAgIHRoaXMuX29uTW91bnQoZGF0YXNldHMpO1xuICAgIH1cbiAgfVxuXG4gIF9sb2FkRGF0YShyZXNwb25zZSwgZmlsZSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgX2Rvd25sb2FkRGF0YXNldCA9IGRhdGFzZXQgPT4ge1xuICAgIHRoaXMucHJvcHMuZGlzcGF0Y2goZXh0ZXJuYWxEYXRhc2V0RG93bmxvYWQoZGF0YXNldCkpO1xuICB9O1xuXG4gIF9maWxlcyA9ICgpID0+IHtcbiAgICB2YXIgZmlsZXMgPSBbXTtcbiAgICBjb25zdCBkYXRhc2V0SWQgPSB0aGlzLnN0YXRlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGFzZXRJZCkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBkYXRhc2V0cyA9IHRoaXMucHJvcHMuZGF0YXNldC5leHRlcm5hbERhdGFzZXRzO1xuICAgICAgICBkYXRhc2V0cy5tYXAoZGF0YXNldCA9PiB7XG4gICAgICAgICAgaWYgKGRhdGFzZXQuaWQgPT09IGtleSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZWFjaGVkXCIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhc2V0KGRhdGFzZXQpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZGF0YXNldCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkYXRhc2V0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbGVzO1xuICB9O1xuXG4gIF9vbkNsaWNrID0gKCkgPT4ge1xuICAgIC8vIHJldHVybiB0aGlzLl9maWxlcygpO1xuXG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMucHJvcHMuZGF0YXNldC5leHRlcm5hbERhdGFzZXRzLm1hcChkYXRhc2V0ID0+IHtcbiAgICAgIGlmIChkYXRhc2V0LmlkID09PSB0aGlzLnN0YXRlLnNlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YXNldChkYXRhc2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfTtcblxuICBfb25DaGFuZ2UgPSAoe3RhcmdldDoge2ZpbGVzfX0pID0+IHtcbiAgICBmaWxlcyA9IHRoaXMucHJvcHMuZGF0YXNldC5saXN0RGF0YXNldHM7XG4gICAgaWYgKCFmaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJvcHMub25VcGxvYWQoZmlsZXMpO1xuICB9O1xuXG4gIF9oYW5kbGVDaGFuZ2UgPSBuYW1lID0+IGV2ZW50ID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtbbmFtZV06IGV2ZW50LnRhcmdldC5jaGVja2VkfSk7XG4gIH07XG5cbiAgaGFuZGxlUmFkaW9DaGFuZ2UgPSBldmVudCA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7c2VsZWN0ZWRWYWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlfSk7XG4gIH07XG5cbiAgX2ZpbHRlckRhdGFzZXRzID0gZGF0YXNldEZpbHRlciA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coZGF0YXNldEZpbHRlcik7XG4gICAgY29uc3Qge2V4dGVybmFsRGF0YXNldHN9ID0gdGhpcy5wcm9wcy5kYXRhc2V0O1xuICAgIGNvbnN0IGZpbHRlcmVkRGF0YXNldHMgPSBleHRlcm5hbERhdGFzZXRzLmZpbHRlcihkYXRhc2V0ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gZGF0YXNldC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gZGF0YXNldE5hbWUuaW5kZXhPZihkYXRhc2V0RmlsdGVyLnRvTG93ZXJDYXNlKCkpICE9PSAtMTtcbiAgICB9KTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGZpbHRlcmVkRGF0YXNldHNcbiAgICB9KTtcbiAgfTtcblxuICBfaGFuZGxlRmlsdGVyQ2hhbmdlID0gZSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkYXRhc2V0RmlsdGVyOiBlLnRhcmdldC52YWx1ZVxuICAgIH0pO1xuICAgIHRoaXMuX2ZpbHRlckRhdGFzZXRzKGUudGFyZ2V0LnZhbHVlKTtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge2NsYXNzZXN9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQge2V4dGVybmFsRGF0YXNldHN9ID0gdGhpcy5wcm9wcy5kYXRhc2V0O1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRQYWdlLFxuICAgICAgZGF0YXNldHNQZXJQYWdlLFxuICAgICAgZmlsdGVyZWREYXRhc2V0cyxcbiAgICAgIGRhdGFzZXRGaWx0ZXJcbiAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICAvLyBjb25zdCBmaWx0ZXJjdXJyZW50RXh0ZXJuYWxEYXRhc2V0cyA9IFt7IG5hbWU6IFwic2hpc2hpclwiIH1dO1xuXG4gICAgY29uc3QgaW5kZXhPZkxhc3REYXRhc2V0ID0gY3VycmVudFBhZ2UgKiBkYXRhc2V0c1BlclBhZ2U7XG4gICAgY29uc3QgaW5kZXhPZkZpcnN0RGF0YXNldCA9IGluZGV4T2ZMYXN0RGF0YXNldCAtIGRhdGFzZXRzUGVyUGFnZTtcbiAgICAvLyBjb25zb2xlLmxvZyhcImZpbHRlcmVkIGRhdGFzZXRzXCIsIGZpbHRlcmVkRGF0YXNldHMpO1xuICAgIC8vIGNvbnNvbGUubG9nKGZpbHRlcmN1cnJlbnRFeHRlcm5hbERhdGFzZXRzKTtcbiAgICBsZXQgY3VycmVudEV4dGVybmFsRGF0YXNldHMgPSBbXTtcbiAgICAvLyBjb25zb2xlLmxvZyhkYXRhc2V0RmlsdGVyLmxlbmd0aCk7XG4gICAgaWYgKGRhdGFzZXRGaWx0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICBjdXJyZW50RXh0ZXJuYWxEYXRhc2V0cyA9IGV4dGVybmFsRGF0YXNldHMuc2xpY2UoXG4gICAgICAgIGluZGV4T2ZGaXJzdERhdGFzZXQsXG4gICAgICAgIGluZGV4T2ZMYXN0RGF0YXNldFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudEV4dGVybmFsRGF0YXNldHMgPSBmaWx0ZXJlZERhdGFzZXRzLnNsaWNlKFxuICAgICAgICBpbmRleE9mRmlyc3REYXRhc2V0LFxuICAgICAgICBpbmRleE9mTGFzdERhdGFzZXRcbiAgICAgICk7XG4gICAgICBleHRlcm5hbERhdGFzZXRzID0gZmlsdGVyZWREYXRhc2V0cztcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coY3VycmVudEV4dGVybmFsRGF0YXNldHMpO1xuICAgIGNvbnN0IHJlbmRlckV4dGVybmFsRGF0YXNldHMgPSBjdXJyZW50RXh0ZXJuYWxEYXRhc2V0cy5tYXAoZGF0YXNldCA9PiB7XG4gICAgICBjb25zdCBJRCA9IGRhdGFzZXQuaWQudG9TdHJpbmcoKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKElEKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxHcmlkXG4gICAgICAgICAga2V5PXtkYXRhc2V0LmlkfVxuICAgICAgICAgIGl0ZW1cbiAgICAgICAgICB4cz17MTJ9XG4gICAgICAgICAgc3R5bGU9e3twYWRkaW5nQm90dG9tOiAnMHB4Jywgd2lkdGg6ICcxMDAlJ319XG4gICAgICAgID5cbiAgICAgICAgICA8UGFwZXIgY2xhc3NOYW1lPXtjbGFzc2VzLnBhcGVyfT5cbiAgICAgICAgICAgIDxHcmlkIGNvbnRhaW5lciB3cmFwPVwibm93cmFwXCIgc3BhY2luZz17MTZ9IHN0eWxlPXt7bWFyZ2luOiAnYXV0byd9fT5cbiAgICAgICAgICAgICAgPEdyaWQgaXRlbSBzdHlsZT17e3BhZGRpbmc6ICcwcHgnfX0+XG4gICAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXt0aGlzLnN0YXRlLnNlbGVjdGVkVmFsdWUgPT09IElEfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlUmFkaW9DaGFuZ2V9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17ZGF0YXNldC5pZH1cbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJyYWRpby1idXR0b24tZGVtb1wiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7LyogPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAvLyBjaGVja2VkPXtkYXRhc2V0LmlkfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuX2hhbmRsZUNoYW5nZShJRCl9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17ZGF0YXNldC5uYW1lfVxuICAgICAgICAgICAgICAgIC8+ICovfVxuICAgICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgICAgIDxHcmlkIGl0ZW0geHMgc3R5bGU9e3ttYXJnaW46ICdhdXRvJ319PlxuICAgICAgICAgICAgICAgIDxUeXBvZ3JhcGh5PntkYXRhc2V0Lm5hbWV9PC9UeXBvZ3JhcGh5PlxuICAgICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgPC9QYXBlcj5cbiAgICAgICAgPC9HcmlkPlxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IF9yZW5kZXJCdXR0b24gPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9wcy51aS5wcm9ncmVzc0FkZERhdGFTdGF0dXMgPT09ICdPUEVOJykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxkaXYgc3R5bGU9e3ttYXJnaW46ICdhdXRvJ319PlxuICAgICAgICAgICAgPExvYWRpbmdTcGlubmVyIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgICB9IFxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPXtjbGFzc2VzLmJ1dHRvbn0gb25DbGljaz17dGhpcy5fb25DbGlja30+XG4gICAgICAgICAgICBBZGQgRGF0YVxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICApO1xuICAgICAgXG4gICAgfTtcbiAgICByZXR1cm4gKFxuICAgICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3Nlcy5yb290fSBzdHlsZT17e2Rpc3BsYXk6ICdncmlkJ319PlxuICAgICAgICAgIHsvKiA8Q3VzdG9tSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvcj1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbFRleHQ9XCJTZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZT17dGhpcy5faGFuZGxlRmlsdGVyQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sUHJvcHM9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxXaWR0aDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+ICovfVxuICAgICAgICAgIDxkaXYgc3R5bGU9e3ttYXJnaW5MZWZ0OiAnMTJweCd9fT5cbiAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPVwiZmlsdGVyXCI+U2VhcmNoOiA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgYm9yZGVyVG9wU3R5bGU6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIGJvcmRlckxlZnRTdHlsZTogJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmlnaHRTdHlsZTogJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tU3R5bGU6ICdzb2xpZCcsXG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tV2lkdGg6ICd0aGluJyxcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b21Db2xvcjogJ2xpZ2h0Z3JheSdcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBpZD1cImZpbHRlclwiXG4gICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmRhdGFzZXRGaWx0ZXJ9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLl9oYW5kbGVGaWx0ZXJDaGFuZ2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxHcmlkXG4gICAgICAgICAgICBjb250YWluZXJcbiAgICAgICAgICAgIHNwYWNpbmc9ezI0fVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgICAgIG1hcmdpbjogJ2F1dG8nLFxuICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICBtaW5IZWlnaHQ6ICcyNDBweCdcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3JlbmRlckV4dGVybmFsRGF0YXNldHN9XG4gICAgICAgICAgPC9HcmlkPlxuICAgICAgICAgIDxQYWdpbmF0aW9uXG4gICAgICAgICAgICBzdHlsZT17e21hcmdpbjogJ2F1dG8nfX1cbiAgICAgICAgICAgIG90aGVyUGFnZUNvbG9yPVwiYmxhY2tcIlxuICAgICAgICAgICAgYWN0aXZlUGFnZT17dGhpcy5zdGF0ZS5jdXJyZW50UGFnZX1cbiAgICAgICAgICAgIGxpbWl0PXt0aGlzLnN0YXRlLmRhdGFzZXRzUGVyUGFnZX1cbiAgICAgICAgICAgIG9mZnNldD17dGhpcy5zdGF0ZS5vZmZzZXR9XG4gICAgICAgICAgICB0b3RhbD17ZXh0ZXJuYWxEYXRhc2V0cy5sZW5ndGh9XG4gICAgICAgICAgICBvbkNsaWNrPXsoZSwgb2Zmc2V0LCBwYWdlKSA9PiB0aGlzLl9oYW5kbGVQYWdlQ2hhbmdlKG9mZnNldCwgcGFnZSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7X3JlbmRlckJ1dHRvbigpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgKTtcbiAgfVxufVxuXG5FeHRlcm5hbERhdGFzZXRzVXBsb2FkLnByb3BUeXBlcyA9IHtcbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG59O1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSBzdGF0ZSA9PiBzdGF0ZTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChcbiAgbWFwU3RhdGVUb1Byb3BzLFxuICBudWxsXG4pKHdpdGhTdHlsZXMoc3R5bGVzKShFeHRlcm5hbERhdGFzZXRzVXBsb2FkKSk7XG4iXX0=