tmp-react-map-gl-draw
Version:
A lite version editing layer with react
600 lines (466 loc) • 60.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _reactMapGl = require("react-map-gl");
var _react = _interopRequireWildcard(require("react"));
var _editModes = require("@nebula.gl/edit-modes");
var _memoize = _interopRequireDefault(require("./memoize"));
var _constants = require("./constants");
var _utils = require("./edit-modes/utils");
var _editModes2 = require("./edit-modes");
var _Object$freeze;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (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 _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
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(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var MODE_TO_HANDLER = Object.freeze((_Object$freeze = {}, _defineProperty(_Object$freeze, _constants.MODES.READ_ONLY, null), _defineProperty(_Object$freeze, _constants.MODES.SELECT, _editModes2.SelectMode), _defineProperty(_Object$freeze, _constants.MODES.EDITING, _editModes2.EditingMode), _defineProperty(_Object$freeze, _constants.MODES.DRAW_POINT, _editModes2.DrawPointMode), _defineProperty(_Object$freeze, _constants.MODES.DRAW_PATH, _editModes2.DrawLineStringMode), _defineProperty(_Object$freeze, _constants.MODES.DRAW_RECTANGLE, _editModes2.DrawRectangleMode), _defineProperty(_Object$freeze, _constants.MODES.DRAW_POLYGON, _editModes2.DrawPolygonMode), _Object$freeze));
var defaultProps = {
mode: _constants.MODES.READ_ONLY,
features: null,
onSelect: null,
onUpdate: null
};
var defaultState = {
featureCollection: new _editModes.ImmutableFeatureCollection({
type: 'FeatureCollection',
features: []
}),
selectedFeatureIndex: null,
// index, isGuide, mapCoords, screenCoords
hovered: null,
isDragging: false,
didDrag: false,
lastPointerMoveEvent: null,
pointerDownPicks: null,
pointerDownScreenCoords: null,
pointerDownMapCoords: null
};
var ModeHandler =
/*#__PURE__*/
function (_PureComponent) {
_inherits(ModeHandler, _PureComponent);
function ModeHandler() {
var _this;
_classCallCheck(this, ModeHandler);
_this = _possibleConstructorReturn(this, _getPrototypeOf(ModeHandler).call(this));
_defineProperty(_assertThisInitialized(_this), "_events", void 0);
_defineProperty(_assertThisInitialized(_this), "_eventsRegistered", void 0);
_defineProperty(_assertThisInitialized(_this), "_modeHandler", void 0);
_defineProperty(_assertThisInitialized(_this), "_context", void 0);
_defineProperty(_assertThisInitialized(_this), "_containerRef", void 0);
_defineProperty(_assertThisInitialized(_this), "getFeatures", function () {
var featureCollection = _this._getFeatureCollection();
featureCollection = featureCollection && featureCollection.getObject();
return featureCollection && featureCollection.features;
});
_defineProperty(_assertThisInitialized(_this), "addFeatures", function (features) {
var featureCollection = _this._getFeatureCollection();
if (featureCollection) {
if (!Array.isArray(features)) {
features = [features];
}
featureCollection = featureCollection.addFeatures(features);
_this.setState({
featureCollection: featureCollection
});
}
});
_defineProperty(_assertThisInitialized(_this), "deleteFeatures", function (featureIndexes) {
var featureCollection = _this._getFeatureCollection();
var selectedFeatureIndex = _this._getSelectedFeatureIndex();
if (featureCollection) {
if (!Array.isArray(featureIndexes)) {
featureIndexes = [featureIndexes];
}
featureCollection = featureCollection.deleteFeatures(featureIndexes);
var newState = {
featureCollection: featureCollection
};
if (featureIndexes.findIndex(function (index) {
return selectedFeatureIndex === index;
}) >= 0) {
newState.selectedFeatureIndex = null;
}
_this.setState(newState);
}
});
_defineProperty(_assertThisInitialized(_this), "_getMemorizedFeatureCollection", (0, _memoize["default"])(function (_ref) {
var propsFeatures = _ref.propsFeatures,
stateFeatures = _ref.stateFeatures;
var features = propsFeatures || stateFeatures; // Any changes in ImmutableFeatureCollection will create a new object
if (features instanceof _editModes.ImmutableFeatureCollection) {
return features;
}
if (features && features.type === 'FeatureCollection') {
return new _editModes.ImmutableFeatureCollection({
type: 'FeatureCollection',
features: features.features
});
}
return new _editModes.ImmutableFeatureCollection({
type: 'FeatureCollection',
features: features || []
});
}));
_defineProperty(_assertThisInitialized(_this), "_getFeatureCollection", function () {
return _this._getMemorizedFeatureCollection({
propsFeatures: _this.props.features,
stateFeatures: _this.state.featureCollection
});
});
_defineProperty(_assertThisInitialized(_this), "_setupModeHandler", function () {
var mode = _this.props.mode;
if (!mode || mode === _constants.MODES.READ_ONLY) {
_this._degregisterEvents();
_this._modeHandler = null;
return;
}
_this._registerEvents();
var HandlerClass = MODE_TO_HANDLER[mode];
_this._modeHandler = HandlerClass ? new HandlerClass() : null;
});
_defineProperty(_assertThisInitialized(_this), "_clearEditingState", function () {
_this.setState({
selectedFeatureIndex: null,
hovered: null,
pointerDownPicks: null,
pointerDownScreenCoords: null,
pointerDownMapCoords: null,
isDragging: false,
didDrag: false
});
});
_defineProperty(_assertThisInitialized(_this), "_getSelectedFeatureIndex", function () {
if ('selectedFeatureIndex' in _this.props) {
return _this.props.selectedFeatureIndex;
}
return _this.state.selectedFeatureIndex;
});
_defineProperty(_assertThisInitialized(_this), "_getSelectedFeature", function (featureIndex) {
var features = _this.getFeatures();
featureIndex = (0, _utils.isNumeric)(featureIndex) ? featureIndex : _this._getSelectedFeatureIndex();
return features[featureIndex];
});
_defineProperty(_assertThisInitialized(_this), "_onSelect", function (selected) {
_this.setState({
selectedFeatureIndex: selected && selected.selectedFeatureIndex
});
if (_this.props.onSelect) {
_this.props.onSelect(selected);
}
});
_defineProperty(_assertThisInitialized(_this), "_onUpdate", function (editAction, isInternal) {
var editType = editAction.editType,
updatedData = editAction.updatedData,
editContext = editAction.editContext;
_this.setState({
featureCollection: new _editModes.ImmutableFeatureCollection(updatedData)
});
if (_this.props.onUpdate && !isInternal) {
_this.props.onUpdate({
data: updatedData && updatedData.features,
editType: editType,
editContext: editContext
});
}
});
_defineProperty(_assertThisInitialized(_this), "_onEdit", function (editAction) {
var mode = _this.props.mode;
var editType = editAction.editType,
updatedData = editAction.updatedData;
switch (editType) {
case _constants.EDIT_TYPE.MOVE_POSITION:
// intermediate feature, do not need forward to application
// only need update editor internal state
_this._onUpdate(editAction, !Boolean(_this.props.features));
break;
case _constants.EDIT_TYPE.ADD_FEATURE:
_this._onUpdate(editAction);
if (mode === _constants.MODES.DRAW_PATH) {
var context = editAction.editContext && editAction.editContext[0] || {};
var screenCoords = context.screenCoords,
mapCoords = context.mapCoords;
var featureIndex = updatedData.features.length - 1;
var selectedFeature = _this._getSelectedFeature(featureIndex);
_this._onSelect({
selectedFeature: selectedFeature,
selectedFeatureIndex: featureIndex,
selectedEditHandleIndex: null,
screenCoords: screenCoords,
mapCoords: mapCoords
});
}
break;
case _constants.EDIT_TYPE.ADD_POSITION:
case _constants.EDIT_TYPE.REMOVE_POSITION:
case _constants.EDIT_TYPE.FINISH_MOVE_POSITION:
_this._onUpdate(editAction);
break;
default:
}
});
_defineProperty(_assertThisInitialized(_this), "_degregisterEvents", function () {
var eventManager = _this._context && _this._context.eventManager;
if (!_this._events || !eventManager) {
return;
}
if (_this._eventsRegistered) {
eventManager.off(_this._events);
_this._eventsRegistered = false;
}
});
_defineProperty(_assertThisInitialized(_this), "_registerEvents", function () {
var ref = _this._containerRef;
var eventManager = _this._context && _this._context.eventManager;
if (!_this._events || !ref || !eventManager) {
return;
}
if (_this._eventsRegistered) {
return;
}
eventManager.on(_this._events, ref);
_this._eventsRegistered = true;
});
_defineProperty(_assertThisInitialized(_this), "_onEvent", function (handler, evt, stopPropagation) {
var event = _this._getEvent(evt);
handler(event);
if (stopPropagation) {
evt.stopImmediatePropagation();
}
});
_defineProperty(_assertThisInitialized(_this), "_onClick", function (event) {
var mode = _this.props.mode;
if (mode === _constants.MODES.SELECT || mode === _constants.MODES.EDITING) {
var mapCoords = event.mapCoords,
screenCoords = event.screenCoords;
var pickedObject = event.picks && event.picks[0] && event.picks[0].object;
if (pickedObject && (0, _utils.isNumeric)(pickedObject.featureIndex)) {
var selectedFeatureIndex = pickedObject.featureIndex;
var selectedFeature = _this._getSelectedFeature(selectedFeatureIndex);
_this._onSelect({
selectedFeature: selectedFeature,
selectedFeatureIndex: selectedFeatureIndex,
selectedEditHandleIndex: pickedObject.type === _constants.ELEMENT_TYPE.EDIT_HANDLE ? pickedObject.index : null,
mapCoords: mapCoords,
screenCoords: screenCoords
});
} else {
_this._onSelect({
selectedFeature: null,
selectedFeatureIndex: null,
selectedEditHandleIndex: null,
mapCoords: mapCoords,
screenCoords: screenCoords
});
}
}
var modeProps = _this.getModeProps();
if (_this._modeHandler) _this._modeHandler.handleClick(event, modeProps);
});
_defineProperty(_assertThisInitialized(_this), "_onPointerMove", function (event) {
// hovering
var hovered = _this._getHoverState(event);
var _this$state = _this.state,
isDragging = _this$state.isDragging,
didDrag = _this$state.didDrag,
pointerDownPicks = _this$state.pointerDownPicks,
pointerDownScreenCoords = _this$state.pointerDownScreenCoords,
pointerDownMapCoords = _this$state.pointerDownMapCoords;
if (isDragging && !didDrag && pointerDownScreenCoords) {
var dx = event.screenCoords[0] - pointerDownScreenCoords[0];
var dy = event.screenCoords[1] - pointerDownScreenCoords[1];
if (dx * dx + dy * dy > 5) {
_this.setState({
didDrag: true
});
}
}
var pointerMoveEvent = _objectSpread({}, event, {
isDragging: isDragging,
pointerDownPicks: pointerDownPicks,
pointerDownScreenCoords: pointerDownScreenCoords,
pointerDownMapCoords: pointerDownMapCoords
});
if (_this.state.didDrag) {
var modeProps = _this.getModeProps();
_this._modeHandler.handlePointerMove(pointerMoveEvent, modeProps);
}
_this.setState({
hovered: hovered,
lastPointerMoveEvent: pointerMoveEvent
});
});
_defineProperty(_assertThisInitialized(_this), "_onPointerDown", function (event) {
var pickedObject = event.picks && event.picks[0] && event.picks[0].object;
var startDraggingEvent = _objectSpread({}, event, {
pointerDownScreenCoords: event.screenCoords,
pointerDownMapCoords: event.mapCoords
});
var newState = {
isDragging: pickedObject && (0, _utils.isNumeric)(pickedObject.featureIndex),
pointerDownPicks: event.picks,
pointerDownScreenCoords: event.screenCoords,
pointerDownMapCoords: event.mapCoords
};
_this.setState(newState);
var modeProps = _this.getModeProps();
_this._modeHandler.handleStartDragging(startDraggingEvent, modeProps);
});
_defineProperty(_assertThisInitialized(_this), "_onPointerUp", function (event) {
var stopDraggingEvent = _objectSpread({}, event, {
pointerDownScreenCoords: _this.state.pointerDownScreenCoords,
pointerDownMapCoords: _this.state.pointerDownMapCoords
});
var newState = {
isDragging: false,
didDrag: false,
pointerDownPicks: null,
pointerDownScreenCoords: null,
pointerDownMapCoords: null
};
_this.setState(newState);
var modeProps = _this.getModeProps();
_this._modeHandler.handleStopDragging(stopDraggingEvent, modeProps);
});
_defineProperty(_assertThisInitialized(_this), "_onPan", function (event) {
var isDragging = _this.state.isDragging;
if (isDragging) {
event.sourceEvent.stopImmediatePropagation();
}
});
_defineProperty(_assertThisInitialized(_this), "project", function (pt) {
var viewport = _this._context && _this._context.viewport;
return viewport && viewport.project(pt);
});
_defineProperty(_assertThisInitialized(_this), "unproject", function (pt) {
var viewport = _this._context && _this._context.viewport;
return viewport && viewport.unproject(pt);
});
_defineProperty(_assertThisInitialized(_this), "_getHoverState", function (event) {
var object = event.picks && event.picks[0] && event.picks[0].object;
if (!object) {
return null;
}
return _objectSpread({
screenCoords: event.screenCoords,
mapCoords: event.mapCoords
}, object);
});
_this.state = defaultState;
_this._eventsRegistered = false;
_this._events = {
anyclick: function anyclick(evt) {
return _this._onEvent(_this._onClick, evt, true);
},
click: function click(evt) {
return evt.stopImmediatePropagation();
},
pointermove: function pointermove(evt) {
return _this._onEvent(_this._onPointerMove, evt, true);
},
pointerdown: function pointerdown(evt) {
return _this._onEvent(_this._onPointerDown, evt, true);
},
pointerup: function pointerup(evt) {
return _this._onEvent(_this._onPointerUp, evt, true);
},
panmove: function panmove(evt) {
return _this._onEvent(_this._onPan, evt, false);
},
panstart: function panstart(evt) {
return _this._onEvent(_this._onPan, evt, false);
},
panend: function panend(evt) {
return _this._onEvent(_this._onPan, evt, false);
}
};
return _this;
}
_createClass(ModeHandler, [{
key: "componentDidMount",
value: function componentDidMount() {
this._setupModeHandler();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
if (prevProps.mode !== this.props.mode) {
this._clearEditingState();
this._setupModeHandler();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this._degregisterEvents();
}
}, {
key: "getModeProps",
value: function getModeProps() {
var featureCollection = this._getFeatureCollection();
var lastPointerMoveEvent = this.state.lastPointerMoveEvent;
var selectedFeatureIndex = this._getSelectedFeatureIndex();
var viewport = this._context && this._context.viewport;
return {
data: featureCollection,
selectedIndexes: [selectedFeatureIndex],
lastPointerMoveEvent: lastPointerMoveEvent,
viewport: viewport,
onEdit: this._onEdit
};
}
/* MEMORIZERS */
}, {
key: "_getEvent",
value: function _getEvent(evt) {
var picked = (0, _utils.parseEventElement)(evt);
var screenCoords = (0, _utils.getScreenCoords)(evt);
var mapCoords = this.unproject(screenCoords);
return {
picks: picked ? [picked] : null,
screenCoords: screenCoords,
mapCoords: mapCoords,
sourceEvent: evt
};
}
}, {
key: "_isDrawing",
value: function _isDrawing() {
var mode = this.props.mode;
return _constants.DRAWING_MODE.findIndex(function (m) {
return m === mode;
}) >= 0;
}
}, {
key: "render",
value: function render(child) {
var _this2 = this;
return _react["default"].createElement(_reactMapGl._MapContext.Consumer, null, function (context) {
_this2._context = context;
var viewport = context && context.viewport;
if (!viewport || viewport.height <= 0 || viewport.width <= 0) {
return null;
}
return child;
});
}
}]);
return ModeHandler;
}(_react.PureComponent);
exports["default"] = ModeHandler;
_defineProperty(ModeHandler, "defaultProps", defaultProps);
ModeHandler.displayName = 'ModeHandler';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2RlLWhhbmRsZXIuanMiXSwibmFtZXMiOlsiTU9ERV9UT19IQU5ETEVSIiwiT2JqZWN0IiwiZnJlZXplIiwiTU9ERVMiLCJSRUFEX09OTFkiLCJTRUxFQ1QiLCJTZWxlY3RNb2RlIiwiRURJVElORyIsIkVkaXRpbmdNb2RlIiwiRFJBV19QT0lOVCIsIkRyYXdQb2ludE1vZGUiLCJEUkFXX1BBVEgiLCJEcmF3TGluZVN0cmluZ01vZGUiLCJEUkFXX1JFQ1RBTkdMRSIsIkRyYXdSZWN0YW5nbGVNb2RlIiwiRFJBV19QT0xZR09OIiwiRHJhd1BvbHlnb25Nb2RlIiwiZGVmYXVsdFByb3BzIiwibW9kZSIsImZlYXR1cmVzIiwib25TZWxlY3QiLCJvblVwZGF0ZSIsImRlZmF1bHRTdGF0ZSIsImZlYXR1cmVDb2xsZWN0aW9uIiwiSW1tdXRhYmxlRmVhdHVyZUNvbGxlY3Rpb24iLCJ0eXBlIiwic2VsZWN0ZWRGZWF0dXJlSW5kZXgiLCJob3ZlcmVkIiwiaXNEcmFnZ2luZyIsImRpZERyYWciLCJsYXN0UG9pbnRlck1vdmVFdmVudCIsInBvaW50ZXJEb3duUGlja3MiLCJwb2ludGVyRG93blNjcmVlbkNvb3JkcyIsInBvaW50ZXJEb3duTWFwQ29vcmRzIiwiTW9kZUhhbmRsZXIiLCJfZ2V0RmVhdHVyZUNvbGxlY3Rpb24iLCJnZXRPYmplY3QiLCJBcnJheSIsImlzQXJyYXkiLCJhZGRGZWF0dXJlcyIsInNldFN0YXRlIiwiZmVhdHVyZUluZGV4ZXMiLCJfZ2V0U2VsZWN0ZWRGZWF0dXJlSW5kZXgiLCJkZWxldGVGZWF0dXJlcyIsIm5ld1N0YXRlIiwiZmluZEluZGV4IiwiaW5kZXgiLCJwcm9wc0ZlYXR1cmVzIiwic3RhdGVGZWF0dXJlcyIsIl9nZXRNZW1vcml6ZWRGZWF0dXJlQ29sbGVjdGlvbiIsInByb3BzIiwic3RhdGUiLCJfZGVncmVnaXN0ZXJFdmVudHMiLCJfbW9kZUhhbmRsZXIiLCJfcmVnaXN0ZXJFdmVudHMiLCJIYW5kbGVyQ2xhc3MiLCJmZWF0dXJlSW5kZXgiLCJnZXRGZWF0dXJlcyIsInNlbGVjdGVkIiwiZWRpdEFjdGlvbiIsImlzSW50ZXJuYWwiLCJlZGl0VHlwZSIsInVwZGF0ZWREYXRhIiwiZWRpdENvbnRleHQiLCJkYXRhIiwiRURJVF9UWVBFIiwiTU9WRV9QT1NJVElPTiIsIl9vblVwZGF0ZSIsIkJvb2xlYW4iLCJBRERfRkVBVFVSRSIsImNvbnRleHQiLCJzY3JlZW5Db29yZHMiLCJtYXBDb29yZHMiLCJsZW5ndGgiLCJzZWxlY3RlZEZlYXR1cmUiLCJfZ2V0U2VsZWN0ZWRGZWF0dXJlIiwiX29uU2VsZWN0Iiwic2VsZWN0ZWRFZGl0SGFuZGxlSW5kZXgiLCJBRERfUE9TSVRJT04iLCJSRU1PVkVfUE9TSVRJT04iLCJGSU5JU0hfTU9WRV9QT1NJVElPTiIsImV2ZW50TWFuYWdlciIsIl9jb250ZXh0IiwiX2V2ZW50cyIsIl9ldmVudHNSZWdpc3RlcmVkIiwib2ZmIiwicmVmIiwiX2NvbnRhaW5lclJlZiIsIm9uIiwiaGFuZGxlciIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsImV2ZW50IiwiX2dldEV2ZW50Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwicGlja2VkT2JqZWN0IiwicGlja3MiLCJvYmplY3QiLCJFTEVNRU5UX1RZUEUiLCJFRElUX0hBTkRMRSIsIm1vZGVQcm9wcyIsImdldE1vZGVQcm9wcyIsImhhbmRsZUNsaWNrIiwiX2dldEhvdmVyU3RhdGUiLCJkeCIsImR5IiwicG9pbnRlck1vdmVFdmVudCIsImhhbmRsZVBvaW50ZXJNb3ZlIiwic3RhcnREcmFnZ2luZ0V2ZW50IiwiaGFuZGxlU3RhcnREcmFnZ2luZyIsInN0b3BEcmFnZ2luZ0V2ZW50IiwiaGFuZGxlU3RvcERyYWdnaW5nIiwic291cmNlRXZlbnQiLCJwdCIsInZpZXdwb3J0IiwicHJvamVjdCIsInVucHJvamVjdCIsImFueWNsaWNrIiwiX29uRXZlbnQiLCJfb25DbGljayIsImNsaWNrIiwicG9pbnRlcm1vdmUiLCJfb25Qb2ludGVyTW92ZSIsInBvaW50ZXJkb3duIiwiX29uUG9pbnRlckRvd24iLCJwb2ludGVydXAiLCJfb25Qb2ludGVyVXAiLCJwYW5tb3ZlIiwiX29uUGFuIiwicGFuc3RhcnQiLCJwYW5lbmQiLCJfc2V0dXBNb2RlSGFuZGxlciIsInByZXZQcm9wcyIsIl9jbGVhckVkaXRpbmdTdGF0ZSIsInNlbGVjdGVkSW5kZXhlcyIsIm9uRWRpdCIsIl9vbkVkaXQiLCJwaWNrZWQiLCJEUkFXSU5HX01PREUiLCJtIiwiY2hpbGQiLCJoZWlnaHQiLCJ3aWR0aCIsIlB1cmVDb21wb25lbnQiLCJkaXNwbGF5TmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUtBOztBQUVBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU0EsSUFBTUEsZUFBZSxHQUFHQyxNQUFNLENBQUNDLE1BQVAsdURBQ3JCQyxpQkFBTUMsU0FEZSxFQUNILElBREcsbUNBRXJCRCxpQkFBTUUsTUFGZSxFQUVOQyxzQkFGTSxtQ0FHckJILGlCQUFNSSxPQUhlLEVBR0xDLHVCQUhLLG1DQUlyQkwsaUJBQU1NLFVBSmUsRUFJRkMseUJBSkUsbUNBS3JCUCxpQkFBTVEsU0FMZSxFQUtIQyw4QkFMRyxtQ0FNckJULGlCQUFNVSxjQU5lLEVBTUVDLDZCQU5GLG1DQU9yQlgsaUJBQU1ZLFlBUGUsRUFPQUMsMkJBUEEsbUJBQXhCO0FBVUEsSUFBTUMsWUFBWSxHQUFHO0FBQ25CQyxFQUFBQSxJQUFJLEVBQUVmLGlCQUFNQyxTQURPO0FBRW5CZSxFQUFBQSxRQUFRLEVBQUUsSUFGUztBQUduQkMsRUFBQUEsUUFBUSxFQUFFLElBSFM7QUFJbkJDLEVBQUFBLFFBQVEsRUFBRTtBQUpTLENBQXJCO0FBT0EsSUFBTUMsWUFBWSxHQUFHO0FBQ25CQyxFQUFBQSxpQkFBaUIsRUFBRSxJQUFJQyxxQ0FBSixDQUErQjtBQUNoREMsSUFBQUEsSUFBSSxFQUFFLG1CQUQwQztBQUVoRE4sSUFBQUEsUUFBUSxFQUFFO0FB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QUFELENBQVksUUFBWixRQUNHLFVBQUF0RSxPQUFPLEVBQUk7QUFDVixRQUFBLE1BQUksQ0FBQ1ksUUFBTCxHQUFnQlosT0FBaEI7QUFDQSxZQUFNNEMsUUFBUSxHQUFHNUMsT0FBTyxJQUFJQSxPQUFPLENBQUM0QyxRQUFwQzs7QUFFQSxZQUFJLENBQUNBLFFBQUQsSUFBYUEsUUFBUSxDQUFDMkIsTUFBVCxJQUFtQixDQUFoQyxJQUFxQzNCLFFBQVEsQ0FBQzRCLEtBQVQsSUFBa0IsQ0FBM0QsRUFBOEQ7QUFDNUQsaUJBQU8sSUFBUDtBQUNEOztBQUVELGVBQU9GLEtBQVA7QUFDRCxPQVZILENBREY7QUFjRDs7OztFQTlhc0NHLG9COzs7O2dCQUFwQjdHLFcsa0JBQ0dqQixZOztBQWdieEJpQixXQUFXLENBQUM4RyxXQUFaLEdBQTBCLGFBQTFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcbmltcG9ydCB7IF9NYXBDb250ZXh0IGFzIE1hcENvbnRleHQgfSBmcm9tICdyZWFjdC1tYXAtZ2wnO1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBJbW11dGFibGVGZWF0dXJlQ29sbGVjdGlvbiB9IGZyb20gJ0BuZWJ1bGEuZ2wvZWRpdC1tb2Rlcyc7XG5cbmltcG9ydCB0eXBlIHsgRmVhdHVyZSwgUG9zaXRpb24sIEVkaXRBY3Rpb24gfSBmcm9tICdAbmVidWxhLmdsL2VkaXQtbW9kZXMnO1xuaW1wb3J0IHR5cGUgeyBNam9sbmlyRXZlbnQgfSBmcm9tICdtam9sbmlyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZUV2ZW50LCBFZGl0b3JQcm9wcywgRWRpdG9yU3RhdGUsIFNlbGVjdEFjdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAnLi9tZW1vaXplJztcblxuaW1wb3J0IHsgRFJBV0lOR19NT0RFLCBFRElUX1RZUEUsIEVMRU1FTlRfVFlQRSwgTU9ERVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRTY3JlZW5Db29yZHMsIGlzTnVtZXJpYywgcGFyc2VFdmVudEVsZW1lbnQgfSBmcm9tICcuL2VkaXQtbW9kZXMvdXRpbHMnO1xuaW1wb3J0IHtcbiAgU2VsZWN0TW9kZSxcbiAgRWRpdGluZ01vZGUsXG4gIERyYXdQb2ludE1vZGUsXG4gIERyYXdMaW5lU3RyaW5nTW9kZSxcbiAgRHJhd1JlY3RhbmdsZU1vZGUsXG4gIERyYXdQb2x5Z29uTW9kZVxufSBmcm9tICcuL2VkaXQtbW9kZXMnO1xuXG5jb25zdCBNT0RFX1RPX0hBTkRMRVIgPSBPYmplY3QuZnJlZXplKHtcbiAgW01PREVTLlJFQURfT05MWV06IG51bGwsXG4gIFtNT0RFUy5TRUxFQ1RdOiBTZWxlY3RNb2RlLFxuICBbTU9ERVMuRURJVElOR106IEVkaXRpbmdNb2RlLFxuICBbTU9ERVMuRFJBV19QT0lOVF06IERyYXdQb2ludE1vZGUsXG4gIFtNT0RFUy5EUkFXX1BBVEhdOiBEcmF3TGluZVN0cmluZ01vZGUsXG4gIFtNT0RFUy5EUkFXX1JFQ1RBTkdMRV06IERyYXdSZWN0YW5nbGVNb2RlLFxuICBbTU9ERVMuRFJBV19QT0xZR09OXTogRHJhd1BvbHlnb25Nb2RlXG59KTtcblxuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBtb2RlOiBNT0RFUy5SRUFEX09OTFksXG4gIGZlYXR1cmVzOiBudWxsLFxuICBvblNlbGVjdDogbnVsbCxcbiAgb25VcGRhdGU6IG51bGxcbn07XG5cbmNvbnN0IGRlZmF1bHRTdGF0ZSA9IHtcbiAgZmVhdHVyZUNvbGxlY3Rpb246IG5ldyBJbW11dGFibGVGZWF0dXJlQ29sbGVjdGlvbih7XG4gICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICBmZWF0dXJlczogW11cbiAgfSksXG5cbiAgc2VsZWN0ZWRGZWF0dXJlSW5kZXg6IG51bGwsXG5cbiAgLy8gaW5kZXgsIGlzR3VpZGUsIG1hcENvb3Jkcywgc2NyZWVuQ29vcmRzXG4gIGhvdmVyZWQ6IG51bGwsXG5cbiAgaXNEcmFnZ2luZzogZmFsc2UsXG4gIGRpZERyYWc6IGZhbHNlLFxuXG4gIGxhc3RQb2ludGVyTW92ZUV2ZW50OiBudWxsLFxuXG4gIHBvaW50ZXJEb3duUGlja3M6IG51bGwsXG4gIHBvaW50ZXJEb3duU2NyZWVuQ29vcmRzOiBudWxsLFxuICBwb2ludGVyRG93bk1hcENvb3JkczogbnVsbFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kZUhhbmRsZXIgZXh0ZW5kcyBQdXJlQ29tcG9uZW50PEVkaXRvclByb3BzLCBFZGl0b3JTdGF0ZT4ge1xuICBzdGF0aWMgZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zdGF0ZSA9IGRlZmF1bHRTdGF0ZTtcbiAgICB0aGlzLl9ldmVudHNSZWdpc3RlcmVkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9ldmVudHMgPSB7XG4gICAgICBhbnljbGljazogZXZ0ID0+IHRoaXMuX29uRXZlbnQodGhpcy5fb25DbGljaywgZXZ0LCB0cnVlKSxcbiAgICAgIGNsaWNrOiBldnQgPT4gZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLFxuICAgICAgcG9pbnRlcm1vdmU6IGV2dCA9PiB0aGlzLl9vbkV2ZW50KHRoaXMuX29uUG9pbnRlck1vdmUsIGV2dCwgdHJ1ZSksXG4gICAgICBwb2ludGVyZG93bjogZXZ0ID0+IHRoaXMuX29uRXZlbnQodGhpcy5fb25Qb2ludGVyRG93biwgZXZ0LCB0cnVlKSxcbiAgICAgIHBvaW50ZXJ1cDogZXZ0ID0+IHRoaXMuX29uRXZlbnQodGhpcy5fb25Qb2ludGVyVXAsIGV2dCwgdHJ1ZSksXG4gICAgICBwYW5tb3ZlOiBldnQgPT4gdGhpcy5fb25FdmVudCh0aGlzLl9vblBhbiwgZXZ0LCBmYWxzZSksXG4gICAgICBwYW5zdGFydDogZXZ0ID0+IHRoaXMuX29uRXZlbnQodGhpcy5fb25QYW4sIGV2dCwgZmFsc2UpLFxuICAgICAgcGFuZW5kOiBldnQgPT4gdGhpcy5fb25FdmVudCh0aGlzLl9vblBhbiwgZXZ0LCBmYWxzZSlcbiAgICB9O1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5fc2V0dXBNb2RlSGFuZGxlcigpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogRWRpdG9yUHJvcHMpIHtcbiAgICBpZiAocHJldlByb3BzLm1vZGUgIT09IHRoaXMucHJvcHMubW9kZSkge1xuICAgICAgdGhpcy5fY2xlYXJFZGl0aW5nU3RhdGUoKTtcbiAgICAgIHRoaXMuX3NldHVwTW9kZUhhbmRsZXIoKTtcbiAgICB9XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLl9kZWdyZWdpc3RlckV2ZW50cygpO1xuICB9XG5cbiAgX2V2ZW50czogYW55O1xuICBfZXZlbnRzUmVnaXN0ZXJlZDogYm9vbGVhbjtcbiAgX21vZGVIYW5kbGVyOiBhbnk7XG4gIF9jb250ZXh0OiA/TWFwQ29udGV4dDtcbiAgX2NvbnRhaW5lclJlZjogP0hUTUxFbGVtZW50O1xuXG4gIGdldEZlYXR1cmVzID0gKCkgPT4ge1xuICAgIGxldCBmZWF0dXJlQ29sbGVjdGlvbiA9IHRoaXMuX2dldEZlYXR1cmVDb2xsZWN0aW9uKCk7XG4gICAgZmVhdHVyZUNvbGxlY3Rpb24gPSBmZWF0dXJlQ29sbGVjdGlvbiAmJiBmZWF0dXJlQ29sbGVjdGlvbi5nZXRPYmplY3QoKTtcbiAgICByZXR1cm4gZmVhdHVyZUNvbGxlY3Rpb24gJiYgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXM7XG4gIH07XG5cbiAgYWRkRmVhdHVyZXMgPSAoZmVhdHVyZXM6IEZlYXR1cmUgfCBGZWF0dXJlW10pID0+IHtcbiAgICBsZXQgZmVhdHVyZUNvbGxlY3Rpb24gPSB0aGlzLl9nZXRGZWF0dXJlQ29sbGVjdGlvbigpO1xuICAgIGlmIChmZWF0dXJlQ29sbGVjdGlvbikge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZlYXR1cmVzKSkge1xuICAgICAgICBmZWF0dXJlcyA9IFtmZWF0dXJlc107XG4gICAgICB9XG5cbiAgICAgIGZlYXR1cmVDb2xsZWN0aW9uID0gZmVhdHVyZUNvbGxlY3Rpb24uYWRkRmVhdHVyZXMoZmVhdHVyZXMpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGZlYXR1cmVDb2xsZWN0aW9uIH0pO1xuICAgIH1cbiAgfTtcblxuICBkZWxldGVGZWF0dXJlcyA9IChmZWF0dXJlSW5kZXhlczogbnVtYmVyIHwgbnVtYmVyW10pID0+IHtcbiAgICBsZXQgZmVhdHVyZUNvbGxlY3Rpb24gPSB0aGlzLl9nZXRGZWF0dXJlQ29sbGVjdGlvbigpO1xuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZUluZGV4ID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlSW5kZXgoKTtcbiAgICBpZiAoZmVhdHVyZUNvbGxlY3Rpb24pIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShmZWF0dXJlSW5kZXhlcykpIHtcbiAgICAgICAgZmVhdHVyZUluZGV4ZXMgPSBbZmVhdHVyZUluZGV4ZXNdO1xuICAgICAgfVxuICAgICAgZmVhdHVyZUNvbGxlY3Rpb24gPSBmZWF0dXJlQ29sbGVjdGlvbi5kZWxldGVGZWF0dXJlcyhmZWF0dXJlSW5kZXhlcyk7XG4gICAgICBjb25zdCBuZXdTdGF0ZTogYW55ID0geyBmZWF0dXJlQ29sbGVjdGlvbiB9O1xuICAgICAgaWYgKGZlYXR1cmVJbmRleGVzLmZpbmRJbmRleChpbmRleCA9PiBzZWxlY3RlZEZlYXR1cmVJbmRleCA9PT0gaW5kZXgpID49IDApIHtcbiAgICAgICAgbmV3U3RhdGUuc2VsZWN0ZWRGZWF0dXJlSW5kZXggPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIGdldE1vZGVQcm9wcygpIHtcbiAgICBjb25zdCBmZWF0dXJlQ29sbGVjdGlvbiA9IHRoaXMuX2dldEZlYXR1cmVDb2xsZWN0aW9uKCk7XG5cbiAgICBjb25zdCB7IGxhc3RQb2ludGVyTW92ZUV2ZW50IH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZUluZGV4ID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlSW5kZXgoKTtcbiAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuX2NvbnRleHQgJiYgdGhpcy5fY29udGV4dC52aWV3cG9ydDtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBmZWF0dXJlQ29sbGVjdGlvbixcbiAgICAgIHNlbGVjdGVkSW5kZXhlczogW3NlbGVjdGVkRmVhdHVyZUluZGV4XSxcbiAgICAgIGxhc3RQb2ludGVyTW92ZUV2ZW50LFxuICAgICAgdmlld3BvcnQsXG4gICAgICBvbkVkaXQ6IHRoaXMuX29uRWRpdFxuICAgIH07XG4gIH1cblxuICAvKiBNRU1PUklaRVJTICovXG4gIF9nZXRNZW1vcml6ZWRGZWF0dXJlQ29sbGVjdGlvbiA9IG1lbW9pemUoKHsgcHJvcHNGZWF0dXJlcywgc3RhdGVGZWF0dXJlcyB9OiBhbnkpID0+IHtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHByb3BzRmVhdHVyZXMgfHwgc3RhdGVGZWF0dXJlcztcbiAgICAvLyBBbnkgY2hhbmdlcyBpbiBJbW11dGFibGVGZWF0dXJlQ29sbGVjdGlvbiB3aWxsIGNyZWF0ZSBhIG5ldyBvYmplY3RcbiAgICBpZiAoZmVhdHVyZXMgaW5zdGFuY2VvZiBJbW11dGFibGVGZWF0dXJlQ29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIGZlYXR1cmVzO1xuICAgIH1cblxuICAgIGlmIChmZWF0dXJlcyAmJiBmZWF0dXJlcy50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbmV3IEltbXV0YWJsZUZlYXR1cmVDb2xsZWN0aW9uKHtcbiAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgZmVhdHVyZXM6IGZlYXR1cmVzLmZlYXR1cmVzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltbXV0YWJsZUZlYXR1cmVDb2xsZWN0aW9uKHtcbiAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICBmZWF0dXJlczogZmVhdHVyZXMgfHwgW11cbiAgICB9KTtcbiAgfSk7XG5cbiAgX2dldEZlYXR1cmVDb2xsZWN0aW9uID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLl9nZXRNZW1vcml6ZWRGZWF0dXJlQ29sbGVjdGlvbih7XG4gICAgICBwcm9wc0ZlYXR1cmVzOiB0aGlzLnByb3BzLmZlYXR1cmVzLFxuICAgICAgc3RhdGVGZWF0dXJlczogdGhpcy5zdGF0ZS5mZWF0dXJlQ29sbGVjdGlvblxuICAgIH0pO1xuICB9O1xuXG4gIF9zZXR1cE1vZGVIYW5kbGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IG1vZGUgPSB0aGlzLnByb3BzLm1vZGU7XG5cbiAgICBpZiAoIW1vZGUgfHwgbW9kZSA9PT0gTU9ERVMuUkVBRF9PTkxZKSB7XG4gICAgICB0aGlzLl9kZWdyZWdpc3RlckV2ZW50cygpO1xuICAgICAgdGhpcy5fbW9kZUhhbmRsZXIgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlZ2lzdGVyRXZlbnRzKCk7XG5cbiAgICBjb25zdCBIYW5kbGVyQ2xhc3MgPSBNT0RFX1RPX0hBTkRMRVJbbW9kZV07XG4gICAgdGhpcy5fbW9kZUhhbmRsZXIgPSBIYW5kbGVyQ2xhc3MgPyBuZXcgSGFuZGxlckNsYXNzKCkgOiBudWxsO1xuICB9O1xuXG4gIC8qIEVESVRJTkcgT1BFUkFUSU9OUyAqL1xuICBfY2xlYXJFZGl0aW5nU3RhdGUgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEZlYXR1cmVJbmRleDogbnVsbCxcblxuICAgICAgaG92ZXJlZDogbnVsbCxcblxuICAgICAgcG9pbnRlckRvd25QaWNrczogbnVsbCxcbiAgICAgIHBvaW50ZXJEb3duU2NyZWVuQ29vcmRzOiBudWxsLFxuICAgICAgcG9pbnRlckRvd25NYXBDb29yZHM6IG51bGwsXG5cbiAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgZGlkRHJhZzogZmFsc2VcbiAgICB9KTtcbiAgfTtcblxuICBfZ2V0U2VsZWN0ZWRGZWF0dXJlSW5kZXggPSAoKSA9PiB7XG4gICAgaWYgKCdzZWxlY3RlZEZlYXR1cm