kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
300 lines (243 loc) • 34.2 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
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 _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _reactMapGlDraw = require("react-map-gl-draw");
var _window = _interopRequireDefault(require("global/window"));
var _classnames = _interopRequireDefault(require("classnames"));
var _lodash = _interopRequireDefault(require("lodash.get"));
var _defaultSettings = require("../../constants/default-settings");
var _featureActionPanel = _interopRequireDefault(require("./feature-action-panel"));
var _featureStyles = require("./feature-styles");
var _handleStyle = require("./handle-style");
var _constants = require("../../constants");
var _reselect = require("reselect");
var _http = require("http");
var _templateObject;
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 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 _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 DELETE_KEY_EVENT_CODE = 46;
var BACKSPACE_KEY_EVENT_CODE = 8;
var ESCAPE_KEY_EVENT_CODE = 27;
var StyledWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n cursor: ", ";\n position: relative;\n"])), function (props) {
return props.editor.mode === _constants.EDITOR_MODES.EDIT ? 'pointer' : 'crosshair';
});
var editorLayerFilter = function editorLayerFilter(layer) {
return _defaultSettings.EDITOR_AVAILABLE_LAYERS.includes(layer.type);
};
var Editor = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(Editor, _Component);
var _super = _createSuper(Editor);
function Editor() {
var _this;
(0, _classCallCheck2["default"])(this, Editor);
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", {
showActions: false,
lastPosition: null
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layerSelector", function (props) {
return props.layers;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layersToRenderSelector", function (props) {
return props.layersToRender;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filterSelector", function (props) {
return props.filters;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "selectedFeatureIdSelector", function (props) {
return (0, _lodash["default"])(props, ['editor', 'selectedFeature', 'id']);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "editorFeatureSelector", function (props) {
return (0, _lodash["default"])(props, ['editor', 'features']);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "currentFilterSelector", (0, _reselect.createSelector)(_this.filterSelector, _this.selectedFeatureIdSelector, function (filters, selectedFeatureId) {
return filters.find(function (f) {
return f.value && f.value.id === selectedFeatureId;
});
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "availableLayersSeletor", (0, _reselect.createSelector)(_this.layerSelector, _this.layersToRenderSelector, function (layers, layersToRender) {
return layers.filter(editorLayerFilter).filter(function (layer) {
return layersToRender[layer.id];
});
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "allFeaturesSelector", (0, _reselect.createSelector)(_this.filterSelector, _this.editorFeatureSelector, function (filters, editorFeatures) {
return filters.filter(function (f) {
return f.type === _defaultSettings.FILTER_TYPES.polygon;
}).map(function (f) {
return f.value;
}).concat(editorFeatures);
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onKeyPressed", function (event) {
var isEnabled = _this.props.isEnabled;
if (!isEnabled) {
return;
}
switch (event.which) {
case DELETE_KEY_EVENT_CODE:
case BACKSPACE_KEY_EVENT_CODE:
_this._onDeleteSelectedFeature();
break;
case ESCAPE_KEY_EVENT_CODE:
_this.props.onSelect(null);
break;
default:
break;
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSelect", function (_ref) {
var selectedFeatureId = _ref.selectedFeatureId,
sourceEvent = _ref.sourceEvent;
var allFeatures = _this.allFeaturesSelector(_this.props);
_this.setState(_objectSpread({}, sourceEvent.rightButton ? {
showActions: true,
lastPosition: {
x: sourceEvent.changedPointers[0].offsetX,
y: sourceEvent.changedPointers[0].offsetY
}
} : null), function () {
_this.props.onSelect(allFeatures.find(function (f) {
return f.id === selectedFeatureId;
}));
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onDeleteSelectedFeature", function () {
if (_this.state.showActions) {
_this.setState({
showActions: false
});
}
var editor = _this.props.editor;
var _editor$selectedFeatu = editor.selectedFeature,
selectedFeature = _editor$selectedFeatu === void 0 ? {} : _editor$selectedFeatu;
_this.props.onDeleteFeature(selectedFeature);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_closeFeatureAction", function () {
_this.setState({
showActions: false
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onToggleLayer", function (layer) {
var selectedFeature = _this.props.editor.selectedFeature;
var _this$props = _this.props,
auth = _this$props.auth,
project = _this$props.project,
mapState = _this$props.mapState;
if (!selectedFeature) {
return;
}
_this.props.onTogglePolygonFilter(layer, selectedFeature, auth, project, mapState);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onUpdateFeature", function (feature, auth, project, mapState) {
return _this.props.onUpdate(feature, auth, project, mapState);
});
return _this;
}
(0, _createClass2["default"])(Editor, [{
key: "componentDidMount",
value: function componentDidMount() {
_window["default"].addEventListener('keydown', this._onKeyPressed);
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
_window["default"].removeEventListener('keydown', this._onKeyPressed);
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var _this$props2 = this.props,
className = _this$props2.className,
clickRadius = _this$props2.clickRadius,
datasets = _this$props2.datasets,
editor = _this$props2.editor,
onUpdate = _this$props2.onUpdate,
style = _this$props2.style,
auth = _this$props2.auth,
project = _this$props2.project,
mapState = _this$props2.mapState;
var _this$state = this.state,
lastPosition = _this$state.lastPosition,
showActions = _this$state.showActions;
var selectedFeatureId = (0, _lodash["default"])(editor, ['selectedFeature', 'id']);
var currentFilter = this.currentFilterSelector(this.props);
var availableLayers = this.availableLayersSeletor(this.props);
var allFeatures = this.allFeaturesSelector(this.props);
return (/*#__PURE__*/_react["default"].createElement(StyledWrapper, {
editor: editor,
className: (0, _classnames["default"])('editor', className),
style: style
}, /*#__PURE__*/_react["default"].createElement(_reactMapGlDraw.Editor, {
clickRadius: clickRadius,
mode: editor.mode,
features: allFeatures,
selectedFeatureId: selectedFeatureId,
onSelect: this._onSelect,
onUpdate: function onUpdate(feature) {
return _this2._onUpdateFeature(feature, auth, project, mapState);
},
getEditHandleShape: _handleStyle.getEditHandleShape,
getFeatureStyle: _featureStyles.getStyle,
getEditHandleStyle: _handleStyle.getStyle
}), showActions && Boolean(selectedFeatureId) ? /*#__PURE__*/_react["default"].createElement(_featureActionPanel["default"], {
datasets: datasets,
layers: availableLayers,
currentFilter: currentFilter,
onClose: this._closeFeatureAction,
onDeleteFeature: this._onDeleteSelectedFeature,
onToggleLayer: this._onToggleLayer,
position: lastPosition,
auth: auth,
project: project,
mapState: mapState
}) : null)
);
}
}]);
return Editor;
}(_react.Component);
(0, _defineProperty2["default"])(Editor, "propTypes", {
filters: _propTypes["default"].arrayOf(_propTypes["default"].object).isRequired,
layers: _propTypes["default"].arrayOf(_propTypes["default"].object).isRequired,
datasets: _propTypes["default"].object.isRequired,
editor: _propTypes["default"].object.isRequired,
layersToRender: _propTypes["default"].object.isRequired,
onSelect: _propTypes["default"].func.isRequired,
onUpdate: _propTypes["default"].func.isRequired,
onDeleteFeature: _propTypes["default"].func.isRequired,
onTogglePolygonFilter: _propTypes["default"].func.isRequired,
index: _propTypes["default"].number,
classnames: _propTypes["default"].string,
clickRadius: _propTypes["default"].number,
isEnabled: _propTypes["default"].bool,
auth: _propTypes["default"].string,
project: _propTypes["default"].project,
mapState: _propTypes["default"].object
});
(0, _defineProperty2["default"])(Editor, "defaultProps", {
clickRadius: _featureStyles.DEFAULT_RADIUS
});
var _default = exports["default"] = Editor;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2VkaXRvci9lZGl0b3IuanMiXSwibmFtZXMiOlsiREVMRVRFX0tFWV9FVkVOVF9DT0RFIiwiQkFDS1NQQUNFX0tFWV9FVkVOVF9DT0RFIiwiRVNDQVBFX0tFWV9FVkVOVF9DT0RFIiwiU3R5bGVkV3JhcHBlciIsInN0eWxlZCIsImRpdiIsInByb3BzIiwiZWRpdG9yIiwibW9kZSIsIkVESVRPUl9NT0RFUyIsIkVESVQiLCJlZGl0b3JMYXllckZpbHRlciIsImxheWVyIiwiRURJVE9SX0FWQUlMQUJMRV9MQVlFUlMiLCJpbmNsdWRlcyIsInR5cGUiLCJFZGl0b3IiLCJzaG93QWN0aW9ucyIsImxhc3RQb3NpdGlvbiIsImxheWVycyIsImxheWVyc1RvUmVuZGVyIiwiZmlsdGVycyIsImZpbHRlclNlbGVjdG9yIiwic2VsZWN0ZWRGZWF0dXJlSWRTZWxlY3RvciIsInNlbGVjdGVkRmVhdHVyZUlkIiwiZmluZCIsImYiLCJ2YWx1ZSIsImlkIiwibGF5ZXJTZWxlY3RvciIsImxheWVyc1RvUmVuZGVyU2VsZWN0b3IiLCJmaWx0ZXIiLCJlZGl0b3JGZWF0dXJlU2VsZWN0b3IiLCJlZGl0b3JGZWF0dXJlcyIsIkZJTFRFUl9UWVBFUyIsInBvbHlnb24iLCJtYXAiLCJjb25jYXQiLCJldmVudCIsImlzRW5hYmxlZCIsIndoaWNoIiwiX29uRGVsZXRlU2VsZWN0ZWRGZWF0dXJlIiwib25TZWxlY3QiLCJzb3VyY2VFdmVudCIsImFsbEZlYXR1cmVzIiwiYWxsRmVhdHVyZXNTZWxlY3RvciIsInNldFN0YXRlIiwicmlnaHRCdXR0b24iLCJ4IiwiY2hhbmdlZFBvaW50ZXJzIiwib2Zmc2V0WCIsInkiLCJvZmZzZXRZIiwic3RhdGUiLCJzZWxlY3RlZEZlYXR1cmUiLCJvbkRlbGV0ZUZlYXR1cmUiLCJhdXRoIiwicHJvamVjdCIsIm1hcFN0YXRlIiwib25Ub2dnbGVQb2x5Z29uRmlsdGVyIiwiZmVhdHVyZSIsIm9uVXBkYXRlIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9vbktleVByZXNzZWQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY2xhc3NOYW1lIiwiY2xpY2tSYWRpdXMiLCJkYXRhc2V0cyIsInN0eWxlIiwiY3VycmVudEZpbHRlciIsImN1cnJlbnRGaWx0ZXJTZWxlY3RvciIsImF2YWlsYWJsZUxheWVycyIsImF2YWlsYWJsZUxheWVyc1NlbGV0b3IiLCJfb25TZWxlY3QiLCJfb25VcGRhdGVGZWF0dXJlIiwiZ2V0RWRpdEhhbmRsZVNoYXBlIiwiZ2V0RmVhdHVyZVN0eWxlIiwiZ2V0RWRpdEhhbmRsZVN0eWxlIiwiQm9vbGVhbiIsIl9jbG9zZUZlYXR1cmVBY3Rpb24iLCJfb25Ub2dnbGVMYXllciIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsImFycmF5T2YiLCJvYmplY3QiLCJpc1JlcXVpcmVkIiwiZnVuYyIsImluZGV4IiwibnVtYmVyIiwiY2xhc3NuYW1lcyIsInN0cmluZyIsImJvb2wiLCJERUZBVUxUX1JBRElVUyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUdBOztBQUNBOztBQUlBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEscUJBQXFCLEdBQUcsRUFBOUI7QUFDQSxJQUFNQyx3QkFBd0IsR0FBRyxDQUFqQztBQUNBLElBQU1DLHFCQUFxQixHQUFHLEVBQTlCOztBQUVBLElBQU1DLGFBQWEsR0FBR0MsNkJBQU9DLEdBQVYsaUlBQ1AsVUFBQUMsS0FBSztBQUFBLFNBQ2JBLEtBQUssQ0FBQ0MsTUFBTixDQUFhQyxJQUFiLEtBQXNCQyx3QkFBYUMsSUFBbkMsR0FBMEMsU0FBMUMsR0FBc0QsV0FEekM7QUFBQSxDQURFLENBQW5COztBQU1BLElBQU1DLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsQ0FBQUMsS0FBSztBQUFBLFNBQUlDLHlDQUF3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VWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7RWRpdG9yIGFzIERyYXd9IGZyb20gJ3JlYWN0LW1hcC1nbC1kcmF3JztcbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoLmdldCc7XG5cbmltcG9ydCB7RURJVE9SX0FWQUlMQUJMRV9MQVlFUlN9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcbmltcG9ydCBGZWF0dXJlQWN0aW9uUGFuZWwgZnJvbSAnLi9mZWF0dXJlLWFjdGlvbi1wYW5lbCc7XG5pbXBvcnQge0ZJTFRFUl9UWVBFU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5pbXBvcnQge0RFRkFVTFRfUkFESVVTLCBnZXRTdHlsZSBhcyBnZXRGZWF0dXJlU3R5bGV9IGZyb20gJy4vZmVhdHVyZS1zdHlsZXMnO1xuaW1wb3J0IHtcbiAgZ2V0U3R5bGUgYXMgZ2V0RWRpdEhhbmRsZVN0eWxlLFxuICBnZXRFZGl0SGFuZGxlU2hhcGVcbn0gZnJvbSAnLi9oYW5kbGUtc3R5bGUnO1xuaW1wb3J0IHtFRElUT1JfTU9ERVN9IGZyb20gJ2NvbnN0YW50cyc7XG5pbXBvcnQge2NyZWF0ZVNlbGVjdG9yfSBmcm9tICdyZXNlbGVjdCc7XG5pbXBvcnQge0luY29taW5nTWVzc2FnZX0gZnJvbSAnaHR0cCc7XG5cbmNvbnN0IERFTEVURV9LRVlfRVZFTlRfQ09ERSA9IDQ2O1xuY29uc3QgQkFDS1NQQUNFX0tFWV9FVkVOVF9DT0RFID0gODtcbmNvbnN0IEVTQ0FQRV9LRVlfRVZFTlRfQ09ERSA9IDI3O1xuXG5jb25zdCBTdHlsZWRXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgY3Vyc29yOiAke3Byb3BzID0+XG4gICAgcHJvcHMuZWRpdG9yLm1vZGUgPT09IEVESVRPUl9NT0RFUy5FRElUID8gJ3BvaW50ZXInIDogJ2Nyb3NzaGFpcid9O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xuXG5jb25zdCBlZGl0b3JMYXllckZpbHRlciA9IGxheWVyID0+IEVESVRPUl9BVkFJTEFCTEVfTEFZRVJTLmluY2x1ZGVzKGxheWVyLnR5cGUpO1xuXG5jbGFzcyBFZGl0b3IgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGZpbHRlcnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLmlzUmVxdWlyZWQsXG4gICAgbGF5ZXJzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KS5pc1JlcXVpcmVkLFxuICAgIGRhdGFzZXRzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgZWRpdG9yOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgbGF5ZXJzVG9SZW5kZXI6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBvblNlbGVjdDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvblVwZGF0ZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvbkRlbGV0ZUZlYXR1cmU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25Ub2dnbGVQb2x5Z29uRmlsdGVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuXG4gICAgaW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgY2xhc3NuYW1lczogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjbGlja1JhZGl1czogUHJvcFR5cGVzLm51bWJlcixcbiAgICBpc0VuYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgYXV0aDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBwcm9qZWN0OiBQcm9wVHlwZXMucHJvamVjdCxcbiAgICBtYXBTdGF0ZTogUHJvcFR5cGVzLm9iamVjdFxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgY2xpY2tSYWRpdXM6IERFRkFVTFRfUkFESVVTXG4gIH07XG5cbiAgc3RhdGUgPSB7XG4gICAgc2hvd0FjdGlvbnM6IGZhbHNlLFxuICAgIGxhc3RQb3NpdGlvbjogbnVsbFxuICB9O1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlQcmVzc2VkKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlQcmVzc2VkKTtcbiAgfVxuXG4gIGxheWVyU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5sYXllcnM7XG4gIGxheWVyc1RvUmVuZGVyU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5sYXllcnNUb1JlbmRlcjtcbiAgZmlsdGVyU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5maWx0ZXJzO1xuICBzZWxlY3RlZEZlYXR1cmVJZFNlbGVjdG9yID0gcHJvcHMgPT5cbiAgICBnZXQocHJvcHMsIFsnZWRpdG9yJywgJ3NlbGVjdGVkRmVhdHVyZScsICdpZCddKTtcbiAgZWRpdG9yRmVhdHVyZVNlbGVjdG9yID0gcHJvcHMgPT4gZ2V0KHByb3BzLCBbJ2VkaXRvcicsICdmZWF0dXJlcyddKTtcblxuICBjdXJyZW50RmlsdGVyU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmZpbHRlclNlbGVjdG9yLFxuICAgIHRoaXMuc2VsZWN0ZWRGZWF0dXJlSWRTZWxlY3RvcixcbiAgICAoZmlsdGVycywgc2VsZWN0ZWRGZWF0dXJlSWQpID0+XG4gICAgICBmaWx0ZXJzLmZpbmQoZiA9PiBmLnZhbHVlICYmIGYudmFsdWUuaWQgPT09IHNlbGVjdGVkRmVhdHVyZUlkKVxuICApO1xuXG4gIGF2YWlsYWJsZUxheWVyc1NlbGV0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmxheWVyU2VsZWN0b3IsXG4gICAgdGhpcy5sYXllcnNUb1JlbmRlclNlbGVjdG9yLFxuICAgIChsYXllcnMsIGxheWVyc1RvUmVuZGVyKSA9PlxuICAgICAgbGF5ZXJzLmZpbHRlcihlZGl0b3JMYXllckZpbHRlcikuZmlsdGVyKGxheWVyID0+IHtcbiAgICAgICAgcmV0dXJuIGxheWVyc1RvUmVuZGVyW2xheWVyLmlkXTtcbiAgICAgIH0pXG4gICk7XG5cbiAgYWxsRmVhdHVyZXNTZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuZmlsdGVyU2VsZWN0b3IsXG4gICAgdGhpcy5lZGl0b3JGZWF0dXJlU2VsZWN0b3IsXG4gICAgKGZpbHRlcnMsIGVkaXRvckZlYXR1cmVzKSA9PlxuICAgICAgZmlsdGVyc1xuICAgICAgICAuZmlsdGVyKGYgPT4gZi50eXBlID09PSBGSUxURVJfVFlQRVMucG9seWdvbilcbiAgICAgICAgLm1hcChmID0+IGYudmFsdWUpXG4gICAgICAgIC5jb25jYXQoZWRpdG9yRmVhdHVyZXMpXG4gICk7XG5cbiAgX29uS2V5UHJlc3NlZCA9IGV2ZW50ID0+IHtcbiAgICBjb25zdCB7aXNFbmFibGVkfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgIGNhc2UgREVMRVRFX0tFWV9FVkVOVF9DT0RFOlxuICAgICAgY2FzZSBCQUNLU1BBQ0VfS0VZX0VWRU5UX0NPREU6XG4gICAgICAgIHRoaXMuX29uRGVsZXRlU2VsZWN0ZWRGZWF0dXJlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFU0NBUEVfS0VZX0VWRU5UX0NPREU6XG4gICAgICAgIHRoaXMucHJvcHMub25TZWxlY3QobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gIF9vblNlbGVjdCA9ICh7c2VsZWN0ZWRGZWF0dXJlSWQsIHNvdXJjZUV2ZW50fSkgPT4ge1xuICAgIGNvbnN0IGFsbEZlYXR1cmVzID0gdGhpcy5hbGxGZWF0dXJlc1NlbGVjdG9yKHRoaXMucHJvcHMpO1xuICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICB7XG4gICAgICAgIC4uLihzb3VyY2VFdmVudC5yaWdodEJ1dHRvblxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzaG93QWN0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFzdFBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogc291cmNlRXZlbnQuY2hhbmdlZFBvaW50ZXJzWzBdLm9mZnNldFgsXG4gICAgICAgICAgICAgICAgeTogc291cmNlRXZlbnQuY2hhbmdlZFBvaW50ZXJzWzBdLm9mZnNldFlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogbnVsbClcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25TZWxlY3QoYWxsRmVhdHVyZXMuZmluZChmID0+IGYuaWQgPT09IHNlbGVjdGVkRmVhdHVyZUlkKSk7XG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICBfb25EZWxldGVTZWxlY3RlZEZlYXR1cmUgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuc2hvd0FjdGlvbnMpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe3Nob3dBY3Rpb25zOiBmYWxzZX0pO1xuICAgIH1cblxuICAgIGNvbnN0IHtlZGl0b3J9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7c2VsZWN0ZWRGZWF0dXJlID0ge319ID0gZWRpdG9yO1xuICAgIHRoaXMucHJvcHMub25EZWxldGVGZWF0dXJlKHNlbGVjdGVkRmVhdHVyZSk7XG4gIH07XG5cbiAgX2Nsb3NlRmVhdHVyZUFjdGlvbiA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtzaG93QWN0aW9uczogZmFsc2V9KTtcbiAgfTtcblxuICBfb25Ub2dnbGVMYXllciA9IGxheWVyID0+IHtcbiAgICBjb25zdCB7c2VsZWN0ZWRGZWF0dXJlfSA9IHRoaXMucHJvcHMuZWRpdG9yO1xuICAgIGNvbnN0IHthdXRoLCBwcm9qZWN0LCBtYXBTdGF0ZX0gPSB0aGlzLnByb3BzO1xuICAgIGlmICghc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5vblRvZ2dsZVBvbHlnb25GaWx0ZXIoXG4gICAgICBsYXllcixcbiAgICAgIHNlbGVjdGVkRmVhdHVyZSxcbiAgICAgIGF1dGgsXG4gICAgICBwcm9qZWN0LFxuICAgICAgbWFwU3RhdGVcbiAgICApO1xuICB9O1xuXG4gIF9vblVwZGF0ZUZlYXR1cmUgPSAoZmVhdHVyZSwgYXV0aCwgcHJvamVjdCwgbWFwU3RhdGUpID0+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5vblVwZGF0ZShmZWF0dXJlLCBhdXRoLCBwcm9qZWN0LCBtYXBTdGF0ZSk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGNsaWNrUmFkaXVzLFxuICAgICAgZGF0YXNldHMsXG4gICAgICBlZGl0b3IsXG4gICAgICBvblVwZGF0ZSxcbiAgICAgIHN0eWxlLFxuICAgICAgYXV0aCxcbiAgICAgIHByb2plY3QsXG4gICAgICBtYXBTdGF0ZVxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3Qge2xhc3RQb3NpdGlvbiwgc2hvd0FjdGlvbnN9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmVJZCA9IGdldChlZGl0b3IsIFsnc2VsZWN0ZWRGZWF0dXJlJywgJ2lkJ10pO1xuICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXIgPSB0aGlzLmN1cnJlbnRGaWx0ZXJTZWxlY3Rvcih0aGlzLnByb3BzKTtcbiAgICBjb25zdCBhdmFpbGFibGVMYXllcnMgPSB0aGlzLmF2YWlsYWJsZUxheWVyc1NlbGV0b3IodGhpcy5wcm9wcyk7XG4gICAgY29uc3QgYWxsRmVhdHVyZXMgPSB0aGlzLmFsbEZlYXR1cmVzU2VsZWN0b3IodGhpcy5wcm9wcyk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZFdyYXBwZXJcbiAgICAgICAgZWRpdG9yPXtlZGl0b3J9XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnZWRpdG9yJywgY2xhc3NOYW1lKX1cbiAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgPlxuICAgICAgICA8RHJhd1xuICAgICAgICAgIGNsaWNrUmFkaXVzPXtjbGlja1JhZGl1c31cbiAgICAgICAgICBtb2RlPXtlZGl0b3IubW9kZX1cbiAgICAgICAgICBmZWF0dXJlcz17YWxsRmVhdHVyZXN9XG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlSWQ9e3NlbGVjdGVkRmVhdHVyZUlkfVxuICAgICAgICAgIG9uU2VsZWN0PXt0aGlzLl9vblNlbGVjdH1cbiAgICAgICAgICBvblVwZGF0ZT17ZmVhdHVyZSA9PlxuICAgICAgICAgICAgdGhpcy5fb25VcGRhdGVGZWF0dXJlKGZlYXR1cmUsIGF1dGgsIHByb2plY3QsIG1hcFN0YXRlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBnZXRFZGl0SGFuZGxlU2hhcGU9e2dldEVkaXRIYW5kbGVTaGFwZX1cbiAgICAgICAgICBnZXRGZWF0dXJlU3R5bGU9e2dldEZlYXR1cmVTdHlsZX1cbiAgICAgICAgICBnZXRFZGl0SGFuZGxlU3R5bGU9e2dldEVkaXRIYW5kbGVTdHlsZX1cbiAgICAgICAgLz5cbiAgICAgICAge3Nob3dBY3Rpb25zICYmIEJvb2xlYW4oc2VsZWN0ZWRGZWF0dXJlSWQpID8gKFxuICAgICAgICAgIDxGZWF0dXJlQWN0aW9uUGFuZWxcbiAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgIGxheWVycz17YXZhaWxhYmxlTGF5ZXJzfVxuICAgICAgICAgICAgY3VycmVudEZpbHRlcj17Y3VycmVudEZpbHRlcn1cbiAgICAgICAgICAgIG9uQ2xvc2U9e3RoaXMuX2Nsb3NlRmVhdHVyZUFjdGlvbn1cbiAgICAgICAgICAgIG9uRGVsZXRlRmVhdHVyZT17dGhpcy5fb25EZWxldGVTZWxlY3RlZEZlYXR1cmV9XG4gICAgICAgICAgICBvblRvZ2dsZUxheWVyPXt0aGlzLl9vblRvZ2dsZUxheWVyfVxuICAgICAgICAgICAgcG9zaXRpb249e2xhc3RQb3NpdGlvbn1cbiAgICAgICAgICAgIGF1dGg9e2F1dGh9XG4gICAgICAgICAgICBwcm9qZWN0PXtwcm9qZWN0fVxuICAgICAgICAgICAgbWFwU3RhdGU9e21hcFN0YXRlfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9TdHlsZWRXcmFwcGVyPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdG9yO1xuIl19