UNPKG

tmp-react-map-gl-draw

Version:

A lite version editing layer with react

649 lines (510 loc) 68.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireDefault(require("react")); var _constants = require("./constants"); var _modeHandler = _interopRequireDefault(require("./mode-handler")); var _utils = require("./edit-modes/utils"); var _style = require("./style"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } 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 _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = 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 _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } 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 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 _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 defaultProps = _objectSpread({}, _modeHandler["default"].defaultProps, { clickRadius: 0, featureShape: 'circle', editHandleShape: 'rect', editHandleStyle: _style.editHandleStyle, featureStyle: _style.featureStyle }); var Editor = /*#__PURE__*/ function (_ModeHandler) { _inherits(Editor, _ModeHandler); function Editor() { var _getPrototypeOf2; var _this; _classCallCheck(this, Editor); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(Editor)).call.apply(_getPrototypeOf2, [this].concat(args))); _defineProperty(_assertThisInitialized(_this), "_getEditHandleState", function (editHandle, renderState) { var _this$state = _this.state, pointerDownPicks = _this$state.pointerDownPicks, hovered = _this$state.hovered; if (renderState) { return renderState; } var editHandleIndex = editHandle.properties.positionIndexes[0]; var draggingEditHandleIndex = null; var pickedObject = pointerDownPicks && pointerDownPicks[0] && pointerDownPicks[0].object; if (pickedObject && pickedObject.guideType === _constants.GUIDE_TYPE.EDIT_HANDLE) { draggingEditHandleIndex = pickedObject.index; } if (editHandleIndex === draggingEditHandleIndex) { return _constants.RENDER_STATE.SELECTED; } if (hovered && hovered.type === _constants.ELEMENT_TYPE.EDIT_HANDLE) { if (hovered.index === editHandleIndex) { return _constants.RENDER_STATE.HOVERED; } // cursor hovered on first vertex when drawing polygon if (hovered.index === 0 && editHandle.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE) { return _constants.RENDER_STATE.CLOSING; } } return _constants.RENDER_STATE.INACTIVE; }); _defineProperty(_assertThisInitialized(_this), "_getFeatureRenderState", function (index, renderState) { var hovered = _this.state.hovered; var selectedFeatureIndex = _this._getSelectedFeatureIndex(); if (renderState) { return renderState; } if (index === selectedFeatureIndex) { return _constants.RENDER_STATE.SELECTED; } if (hovered && hovered.type === _constants.ELEMENT_TYPE.FEATURE && hovered.featureIndex === index) { return _constants.RENDER_STATE.HOVERED; } return _constants.RENDER_STATE.INACTIVE; }); _defineProperty(_assertThisInitialized(_this), "_getStyleProp", function (styleProp, params) { return typeof styleProp === 'function' ? styleProp(params) : styleProp; }); _defineProperty(_assertThisInitialized(_this), "_renderEditHandle", function (editHandle, feature) { /* eslint-enable max-params */ var coordinates = (0, _utils.getFeatureCoordinates)(editHandle); var p = _this.project(coordinates && coordinates[0]); if (!p) { return null; } var _editHandle$propertie = editHandle.properties, featureIndex = _editHandle$propertie.featureIndex, positionIndexes = _editHandle$propertie.positionIndexes; var _this$props = _this.props, clickRadius = _this$props.clickRadius, editHandleShape = _this$props.editHandleShape, editHandleStyle = _this$props.editHandleStyle; var index = positionIndexes[0]; var shape = _this._getStyleProp(editHandleShape, { feature: feature || editHandle, index: index, featureIndex: featureIndex, state: _this._getEditHandleState(editHandle) }); var style = _this._getStyleProp(editHandleStyle, { feature: feature || editHandle, index: index, featureIndex: featureIndex, shape: shape, state: _this._getEditHandleState(editHandle) }); // disable events for cursor editHandle if (editHandle.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE) { style = _objectSpread({}, style, { // disable pointer events for cursor pointerEvents: 'none' }); } var elemKey = "".concat(_constants.ELEMENT_TYPE.EDIT_HANDLE, ".").concat(featureIndex, ".").concat(index); // first <circle|rect> is to make path easily interacted with switch (shape) { case 'circle': return _react["default"].createElement("g", { key: elemKey, transform: "translate(".concat(p[0], ", ").concat(p[1], ")") }, _react["default"].createElement("circle", { "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE, "data-index": index, "data-feature-index": featureIndex, key: "".concat(elemKey, ".hidden"), style: _objectSpread({}, style, { stroke: 'none', fill: '#000', fillOpacity: 0 }), cx: 0, cy: 0, r: clickRadius }), _react["default"].createElement("circle", { "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE, "data-index": index, "data-feature-index": featureIndex, key: elemKey, style: style, cx: 0, cy: 0 })); case 'rect': return _react["default"].createElement("g", { key: elemKey, transform: "translate(".concat(p[0], ", ").concat(p[1], ")") }, _react["default"].createElement("rect", { "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE, "data-index": index, "data-feature-index": featureIndex, key: "".concat(elemKey, ".hidden"), style: _objectSpread({}, style, { height: clickRadius, width: clickRadius, fill: '#000', fillOpacity: 0 }), r: clickRadius }), _react["default"].createElement("rect", { "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE, "data-index": index, "data-feature-index": featureIndex, key: "".concat(elemKey), style: style })); default: return null; } }); _defineProperty(_assertThisInitialized(_this), "_renderSegment", function (featureIndex, index, coordinates, style) { var path = _this._getPathInScreenCoords(coordinates, _constants.GEOJSON_TYPE.LINE_STRING); var radius = style.radius, others = _objectWithoutProperties(style, ["radius"]); var clickRadius = _this.props.clickRadius; var elemKey = "".concat(_constants.ELEMENT_TYPE.SEGMENT, ".").concat(featureIndex, ".").concat(index); return _react["default"].createElement("g", { key: elemKey }, _react["default"].createElement("path", { key: "".concat(elemKey, ".hidden"), "data-type": _constants.ELEMENT_TYPE.SEGMENT, "data-index": index, "data-feature-index": featureIndex, style: _objectSpread({}, others, { strokeWidth: clickRadius || radius, opacity: 0 }), d: path }), _react["default"].createElement("path", { key: elemKey, "data-type": _constants.ELEMENT_TYPE.SEGMENT, "data-index": index, "data-feature-index": featureIndex, style: others, d: path })); }); _defineProperty(_assertThisInitialized(_this), "_renderSegments", function (featureIndex, coordinates, style) { var segments = []; for (var i = 0; i < coordinates.length - 1; i++) { segments.push(_this._renderSegment(featureIndex, i, [coordinates[i], coordinates[i + 1]], style)); } return segments; }); _defineProperty(_assertThisInitialized(_this), "_renderFill", function (featureIndex, coordinates, style) { var path = _this._getPathInScreenCoords(coordinates, _constants.GEOJSON_TYPE.POLYGON); return _react["default"].createElement("path", { key: "".concat(_constants.ELEMENT_TYPE.FILL, ".").concat(featureIndex), "data-type": _constants.ELEMENT_TYPE.FILL, "data-feature-index": featureIndex, style: _objectSpread({}, style, { stroke: 'none' }), d: path }); }); _defineProperty(_assertThisInitialized(_this), "_renderTentativeFeature", function (feature, cursorEditHandle) { var featureStyle = _this.props.featureStyle; var coordinates = feature.geometry.coordinates, renderType = feature.properties.renderType; if (!coordinates || coordinates.length < 2) { return null; } // >= 2 coordinates var firstCoords = coordinates[0]; var lastCoords = coordinates[coordinates.length - 1]; var uncommittedStyle = _this._getStyleProp(featureStyle, { feature: feature, index: null, state: _constants.RENDER_STATE.UNCOMMITTED }); var committedPath; var uncommittedPath; var closingPath; var fill = _this._renderFill('tentative', coordinates, uncommittedStyle); switch (renderType) { case _constants.RENDER_TYPE.LINE_STRING: case _constants.RENDER_TYPE.POLYGON: var committedStyle = _this._getStyleProp(featureStyle, { feature: feature, state: _constants.RENDER_STATE.SELECTED }); if (cursorEditHandle) { var cursorCoords = coordinates[coordinates.length - 2]; committedPath = _this._renderSegments('tentative', coordinates.slice(0, coordinates.length - 1), committedStyle); uncommittedPath = _this._renderSegment('tentative-uncommitted', coordinates.length - 2, [cursorCoords, lastCoords], uncommittedStyle); } else { committedPath = _this._renderSegments('tentative', coordinates, committedStyle); } if (renderType === _constants.RENDER_TYPE.POLYGON) { var closingStyle = _this._getStyleProp(featureStyle, { feature: feature, index: null, state: _constants.RENDER_STATE.CLOSING }); closingPath = _this._renderSegment('tentative-closing', coordinates.length - 1, [lastCoords, firstCoords], closingStyle); } break; case _constants.RENDER_TYPE.RECTANGLE: uncommittedPath = _this._renderSegments('tentative', [].concat(_toConsumableArray(coordinates), [firstCoords]), uncommittedStyle); break; default: } return [fill, committedPath, uncommittedPath, closingPath].filter(Boolean); }); _defineProperty(_assertThisInitialized(_this), "_renderGuides", function (_ref) { var tentativeFeature = _ref.tentativeFeature, editHandles = _ref.editHandles; var features = _this.getFeatures(); var cursorEditHandle = editHandles.find(function (f) { return f.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE; }); return _react["default"].createElement("g", { key: "feature-guides" }, tentativeFeature && _this._renderTentativeFeature(tentativeFeature, cursorEditHandle), editHandles && editHandles.map(function (editHandle) { var feature = features && features[editHandle.properties.featureIndex] || tentativeFeature; return _this._renderEditHandle(editHandle, feature); })); }); _defineProperty(_assertThisInitialized(_this), "_renderPoint", function (feature, index, path) { var renderState = _this._getFeatureRenderState(index); var _this$props2 = _this.props, featureStyle = _this$props2.featureStyle, featureShape = _this$props2.featureShape, clickRadius = _this$props2.clickRadius; var shape = _this._getStyleProp(featureShape, { feature: feature, index: index, state: renderState }); var style = _this._getStyleProp(featureStyle, { feature: feature, index: index, state: renderState }); var elemKey = "feature.".concat(index); if (shape === 'rect') { return _react["default"].createElement("g", { key: elemKey, transform: "translate(".concat(path[0][0], ", ").concat(path[0][1], ")") }, _react["default"].createElement("rect", { "data-type": _constants.ELEMENT_TYPE.FEATURE, "data-feature-index": index, key: "".concat(elemKey, ".hidden"), style: _objectSpread({}, style, { width: clickRadius, height: clickRadius, fill: '#000', fillOpacity: 0 }) }), _react["default"].createElement("rect", { "data-type": _constants.ELEMENT_TYPE.FEATURE, "data-feature-index": index, key: elemKey, style: style })); } return _react["default"].createElement("g", { key: "feature.".concat(index), transform: "translate(".concat(path[0][0], ", ").concat(path[0][1], ")") }, _react["default"].createElement("circle", { "data-type": _constants.ELEMENT_TYPE.FEATURE, "data-feature-index": index, key: "".concat(elemKey, ".hidden"), style: _objectSpread({}, style, { opacity: 0 }), cx: 0, cy: 0, r: clickRadius }), _react["default"].createElement("circle", { "data-type": _constants.ELEMENT_TYPE.FEATURE, "data-feature-index": index, key: elemKey, style: style, cx: 0, cy: 0 })); }); _defineProperty(_assertThisInitialized(_this), "_renderPath", function (feature, index, path) { var _this$props3 = _this.props, featureStyle = _this$props3.featureStyle, clickRadius = _this$props3.clickRadius; var selectedFeatureIndex = _this._getSelectedFeatureIndex(); var selected = index === selectedFeatureIndex; var renderState = _this._getFeatureRenderState(index); var style = _this._getStyleProp(featureStyle, { feature: feature, index: index, state: renderState }); var elemKey = "feature.".concat(index); if (selected) { return _react["default"].createElement("g", { key: elemKey }, _this._renderSegments(index, feature.geometry.coordinates, style)); } // first <path> is to make path easily interacted with return _react["default"].createElement("g", { key: elemKey }, _react["default"].createElement("path", { "data-type": _constants.ELEMENT_TYPE.FEATURE, "data-feature-index": index, key: "".concat(elemKey, ".hidden"), style: _objectSpread({}, style, { strokeWidth: clickRadius, opacity: 0 }), d: path }), _react["default"].createElement("path", { "data-type": _constants.ELEMENT_TYPE.FEATURE, "data-feature-index": index, key: elemKey, style: style, d: path })); }); _defineProperty(_assertThisInitialized(_this), "_renderPolygon", function (feature, index, path) { var featureStyle = _this.props.featureStyle; var selectedFeatureIndex = _this._getSelectedFeatureIndex(); var selected = index === selectedFeatureIndex; var renderState = _this._getFeatureRenderState(index); var style = _this._getStyleProp(featureStyle, { feature: feature, index: index, state: renderState }); var elemKey = "feature.".concat(index); if (selected) { var coordinates = (0, _utils.getFeatureCoordinates)(feature); if (!coordinates) { return null; } return _react["default"].createElement("g", { key: elemKey }, _this._renderFill(index, coordinates, style), _this._renderSegments(index, coordinates, style)); } return _react["default"].createElement("path", { "data-type": _constants.ELEMENT_TYPE.FEATURE, "data-feature-index": index, key: elemKey, style: style, d: path }); }); _defineProperty(_assertThisInitialized(_this), "_renderFeature", function (feature, index) { var coordinates = (0, _utils.getFeatureCoordinates)(feature); if (!coordinates || !coordinates.length) { return null; } var renderType = feature.properties.renderType, type = feature.geometry.type; var path = _this._getPathInScreenCoords(coordinates, type); if (!path) { return null; } switch (renderType) { case _constants.RENDER_TYPE.POINT: return _this._renderPoint(feature, index, path); case _constants.RENDER_TYPE.LINE_STRING: return _this._renderPath(feature, index, path); case _constants.RENDER_TYPE.POLYGON: case _constants.RENDER_TYPE.RECTANGLE: return _this._renderPolygon(feature, index, path); default: return null; } }); _defineProperty(_assertThisInitialized(_this), "_renderCanvas", function () { var features = _this.getFeatures(); var guides = _this._modeHandler && _this._modeHandler.getGuides(_this.getModeProps()); return _react["default"].createElement("svg", { key: "draw-canvas", width: "100%", height: "100%" }, features && features.length > 0 && _react["default"].createElement("g", { key: "feature-group" }, features.map(_this._renderFeature)), guides && _react["default"].createElement("g", { key: "feature-guides" }, _this._renderGuides(guides))); }); _defineProperty(_assertThisInitialized(_this), "_renderEditor", function () { if (!_this._context) return null; var viewport = _this._context && _this._context.viewport || {}; var style = _this.props.style; var width = viewport.width, height = viewport.height; return _react["default"].createElement("div", { id: "editor", style: _objectSpread({ width: width, height: height }, style), ref: function ref(_) { _this._containerRef = _; } }, _this._renderCanvas()); }); return _this; } _createClass(Editor, [{ key: "_getPathInScreenCoords", /* HELPERS */ value: function _getPathInScreenCoords(coordinates, type) { var _this2 = this; if (coordinates.length === 0) { return ''; } var screenCoords = coordinates.map(function (p) { return _this2.project(p); }); var pathString = ''; switch (type) { case _constants.GEOJSON_TYPE.POINT: return screenCoords; case _constants.GEOJSON_TYPE.LINE_STRING: pathString = screenCoords.map(function (p) { return "".concat(p[0], ",").concat(p[1]); }).join('L'); return "M ".concat(pathString); case _constants.GEOJSON_TYPE.POLYGON: pathString = screenCoords.map(function (p) { return "".concat(p[0], ",").concat(p[1]); }).join('L'); return "M ".concat(pathString, " z"); default: return null; } } }, { key: "render", value: function render() { return _get(_getPrototypeOf(Editor.prototype), "render", this).call(this, this._renderEditor()); } }]); return Editor; }(_modeHandler["default"]); exports["default"] = Editor; _defineProperty(Editor, "defaultProps", defaultProps); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lZGl0b3IuanMiXSwibmFtZXMiOlsiZGVmYXVsdFByb3BzIiwiTW9kZUhhbmRsZXIiLCJjbGlja1JhZGl1cyIsImZlYXR1cmVTaGFwZSIsImVkaXRIYW5kbGVTaGFwZSIsImVkaXRIYW5kbGVTdHlsZSIsImRlZmF1bHRFZGl0SGFuZGxlU3R5bGUiLCJmZWF0dXJlU3R5bGUiLCJkZWZhdWx0RmVhdHVyZVN0eWxlIiwiRWRpdG9yIiwiZWRpdEhhbmRsZSIsInJlbmRlclN0YXRlIiwic3RhdGUiLCJwb2ludGVyRG93blBpY2tzIiwiaG92ZXJlZCIsImVkaXRIYW5kbGVJbmRleCIsInByb3BlcnRpZXMiLCJwb3NpdGlvbkluZGV4ZXMiLCJkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCIsInBpY2tlZE9iamVjdCIsIm9iamVjdCIsImd1aWRlVHlwZSIsIkdVSURFX1RZUEUiLCJFRElUX0hBTkRMRSIsImluZGV4IiwiUkVOREVSX1NUQVRFIiwiU0VMRUNURUQiLCJ0eXBlIiwiRUxFTUVOVF9UWVBFIiwiSE9WRVJFRCIsIkNVUlNPUl9FRElUX0hBTkRMRSIsIkNMT1NJTkciLCJJTkFDVElWRSIsInNlbGVjdGVkRmVhdHVyZUluZGV4IiwiX2dldFNlbGVjdGVkRmVhdHVyZUluZGV4IiwiRkVBVFVSRSIsImZlYXR1cmVJbmRleCIsInN0eWxlUHJvcCIsInBhcmFtcyIsImZlYXR1cmUiLCJjb29yZGluYXRlcyIsInAiLCJwcm9qZWN0IiwicHJvcHMiLCJzaGFwZSIsIl9nZXRTdHlsZVByb3AiLCJfZ2V0RWRpdEhhbmRsZVN0YXRlIiwic3R5bGUiLCJwb2ludGVyRXZlbnRzIiwiZWxlbUtleSIsInN0cm9rZSIsImZpbGwiLCJmaWxsT3BhY2l0eSIsImhlaWdodCIsIndpZHRoIiwicGF0aCIsIl9nZXRQYXRoSW5TY3JlZW5Db29yZHMiLCJHRU9KU09OX1RZUEUiLCJMSU5FX1NUUklORyIsInJhZGl1cyIsIm90aGVycyIsIlNFR01FTlQiLCJzdHJva2VXaWR0aCIsIm9wYWNpdHkiLCJzZWdtZW50cyIsImkiLCJsZW5ndGgiLCJwdXNoIiwiX3JlbmRlclNlZ21lbnQiLCJQT0xZR09OIiwiRklMTCIsImN1cnNvckVkaXRIYW5kbGUiLCJnZW9tZXRyeSIsInJlbmRlclR5cGUiLCJmaXJzdENvb3JkcyIsImxhc3RDb29yZHMiLCJ1bmNvbW1pdHRlZFN0eWxlIiwiVU5DT01NSVRURUQiLCJjb21taXR0ZWRQYXRoIiwidW5jb21taXR0ZWRQYXRoIiwiY2xvc2luZ1BhdGgiLCJfcmVuZGVyRmlsbCIsIlJFTkRFUl9UWVBFIiwiY29tbWl0dGVkU3R5bGUiLCJjdXJzb3JDb29yZHMiLCJfcmVuZGVyU2VnbWVudHMiLCJzbGljZSIsImNsb3NpbmdTdHlsZSIsIlJFQ1RBTkdMRSIsImZpbHRlciIsIkJvb2xlYW4iLCJ0ZW50YXRpdmVGZWF0dXJlIiwiZWRpdEhhbmRsZXMiLCJmZWF0dXJlcyIsImdldEZlYXR1cmVzIiwiZmluZCIsImYiLCJfcmVuZGVyVGVudGF0aXZlRmVhdHVyZSIsIm1hcCIsIl9yZW5kZXJFZGl0SGFuZGxlIiwiX2dldEZlYXR1cmVSZW5kZXJTdGF0ZSIsInNlbGVjdGVkIiwiUE9JTlQiLCJfcmVuZGVyUG9pbnQiLCJfcmVuZGVyUGF0aCIsIl9yZW5kZXJQb2x5Z29uIiwiZ3VpZGVzIiwiX21vZGVIYW5kbGVyIiwiZ2V0R3VpZGVzIiwiZ2V0TW9kZVByb3BzIiwiX3JlbmRlckZlYXR1cmUiLCJfcmVuZGVyR3VpZGVzIiwiX2NvbnRleHQiLCJ2aWV3cG9ydCIsIl8iLCJfY29udGFpbmVyUmVmIiwiX3JlbmRlckNhbnZhcyIsInNjcmVlbkNvb3JkcyIsInBhdGhTdHJpbmciLCJqb2luIiwiX3JlbmRlckVkaXRvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUtBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBLElBQU1BLFlBQVkscUJBQ2JDLHdCQUFZRCxZQURDO0FBRWhCRSxFQUFB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QUEsT0FBakIsQ0FBckI7QUFFQSxVQUFJNkUsVUFBVSxHQUFHLEVBQWpCOztBQUNBLGNBQVEzRixJQUFSO0FBQ0UsYUFBSzhCLHdCQUFhNkMsS0FBbEI7QUFDRSxpQkFBT2UsWUFBUDs7QUFFRixhQUFLNUQsd0JBQWFDLFdBQWxCO0FBQ0U0RCxVQUFBQSxVQUFVLEdBQUdELFlBQVksQ0FBQ25CLEdBQWIsQ0FBaUIsVUFBQXpELENBQUM7QUFBQSw2QkFBT0EsQ0FBQyxDQUFDLENBQUQsQ0FBUixjQUFlQSxDQUFDLENBQUMsQ0FBRCxDQUFoQjtBQUFBLFdBQWxCLEVBQXlDOEUsSUFBekMsQ0FBOEMsR0FBOUMsQ0FBYjtBQUNBLDZCQUFZRCxVQUFaOztBQUVGLGFBQUs3RCx3QkFBYVksT0FBbEI7QUFDRWlELFVBQUFBLFVBQVUsR0FBR0QsWUFBWSxDQUFDbkIsR0FBYixDQUFpQixVQUFBekQsQ0FBQztBQUFBLDZCQUFPQSxDQUFDLENBQUMsQ0FBRCxDQUFSLGNBQWVBLENBQUMsQ0FBQyxDQUFELENBQWhCO0FBQUEsV0FBbEIsRUFBeUM4RSxJQUF6QyxDQUE4QyxHQUE5QyxDQUFiO0FBQ0EsNkJBQVlELFVBQVo7O0FBRUY7QUFDRSxpQkFBTyxJQUFQO0FBYko7QUFlRDs7OzZCQTZmUTtBQUNQLGdGQUFvQixLQUFLRSxhQUFMLEVBQXBCO0FBQ0Q7Ozs7RUExaEJpQ3ZILHVCOzs7O2dCQUFmUSxNLGtCQUNHVCxZIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHR5cGUgeyBGZWF0dXJlIH0gZnJvbSAnQG5lYnVsYS5nbC9lZGl0LW1vZGVzJztcbmltcG9ydCB0eXBlIHsgR2VvSnNvblR5cGUsIFJlbmRlclN0YXRlLCBJZCB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgeyBSRU5ERVJfU1RBVEUsIFJFTkRFUl9UWVBFLCBHRU9KU09OX1RZUEUsIEdVSURFX1RZUEUsIEVMRU1FTlRfVFlQRSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBNb2RlSGFuZGxlciBmcm9tICcuL21vZGUtaGFuZGxlcic7XG5pbXBvcnQgeyBnZXRGZWF0dXJlQ29vcmRpbmF0ZXMgfSBmcm9tICcuL2VkaXQtbW9kZXMvdXRpbHMnO1xuXG5pbXBvcnQge1xuICBlZGl0SGFuZGxlU3R5bGUgYXMgZGVmYXVsdEVkaXRIYW5kbGVTdHlsZSxcbiAgZmVhdHVyZVN0eWxlIGFzIGRlZmF1bHRGZWF0dXJlU3R5bGVcbn0gZnJvbSAnLi9zdHlsZSc7XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgLi4uTW9kZUhhbmRsZXIuZGVmYXVsdFByb3BzLFxuICBjbGlja1JhZGl1czogMCxcbiAgZmVhdHVyZVNoYXBlOiAnY2lyY2xlJyxcbiAgZWRpdEhhbmRsZVNoYXBlOiAncmVjdCcsXG4gIGVkaXRIYW5kbGVTdHlsZTogZGVmYXVsdEVkaXRIYW5kbGVTdHlsZSxcbiAgZmVhdHVyZVN0eWxlOiBkZWZhdWx0RmVhdHVyZVN0eWxlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0b3IgZXh0ZW5kcyBNb2RlSGFuZGxlciB7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbiAgLyogSEVMUEVSUyAqL1xuICBfZ2V0UGF0aEluU2NyZWVuQ29vcmRzKGNvb3JkaW5hdGVzOiBhbnksIHR5cGU6IEdlb0pzb25UeXBlKSB7XG4gICAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IHNjcmVlbkNvb3JkcyA9IGNvb3JkaW5hdGVzLm1hcChwID0+IHRoaXMucHJvamVjdChwKSk7XG5cbiAgICBsZXQgcGF0aFN0cmluZyA9ICcnO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBHRU9KU09OX1RZUEUuUE9JTlQ6XG4gICAgICAgIHJldHVybiBzY3JlZW5Db29yZHM7XG5cbiAgICAgIGNhc2UgR0VPSlNPTl9UWVBFLkxJTkVfU1RSSU5HOlxuICAgICAgICBwYXRoU3RyaW5nID0gc2NyZWVuQ29vcmRzLm1hcChwID0+IGAke3BbMF19LCR7cFsxXX1gKS5qb2luKCdMJyk7XG4gICAgICAgIHJldHVybiBgTSAke3BhdGhTdHJpbmd9YDtcblxuICAgICAgY2FzZSBHRU9KU09OX1RZUEUuUE9MWUdPTjpcbiAgICAgICAgcGF0aFN0cmluZyA9IHNjcmVlbkNvb3Jkcy5tYXAocCA9PiBgJHtwWzBdfSwke3BbMV19YCkuam9pbignTCcpO1xuICAgICAgICByZXR1cm4gYE0gJHtwYXRoU3RyaW5nfSB6YDtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2dldEVkaXRIYW5kbGVTdGF0ZSA9IChlZGl0SGFuZGxlOiBGZWF0dXJlLCByZW5kZXJTdGF0ZTogP3N0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcG9pbnRlckRvd25QaWNrcywgaG92ZXJlZCB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGlmIChyZW5kZXJTdGF0ZSkge1xuICAgICAgcmV0dXJuIHJlbmRlclN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IGVkaXRIYW5kbGVJbmRleCA9IGVkaXRIYW5kbGUucHJvcGVydGllcy5wb3NpdGlvbkluZGV4ZXNbMF07XG4gICAgbGV0IGRyYWdnaW5nRWRpdEhhbmRsZUluZGV4ID0gbnVsbDtcbiAgICBjb25zdCBwaWNrZWRPYmplY3QgPSBwb2ludGVyRG93blBpY2tzICYmIHBvaW50ZXJEb3duUGlja3NbMF0gJiYgcG9pbnRlckRvd25QaWNrc1swXS5vYmplY3Q7XG4gICAgaWYgKHBpY2tlZE9iamVjdCAmJiBwaWNrZWRPYmplY3QuZ3VpZGVUeXBlID09PSBHVUlERV9UWVBFLkVESVRfSEFORExFKSB7XG4gICAgICBkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCA9IHBpY2tlZE9iamVjdC5pbmRleDtcbiAgICB9XG5cbiAgICBpZiAoZWRpdEhhbmRsZUluZGV4ID09PSBkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCkge1xuICAgICAgcmV0dXJuIFJFTkRFUl9TVEFURS5TRUxFQ1RFRDtcbiAgICB9XG5cbiAgICBpZiAoaG92ZXJlZCAmJiBob3ZlcmVkLnR5cGUgPT09IEVMRU1FTlRfVFlQRS5FRElUX0hBTkRMRSkge1xuICAgICAgaWYgKGhvdmVyZWQuaW5kZXggPT09IGVkaXRIYW5kbGVJbmRleCkge1xuICAgICAgICByZXR1cm4gUkVOREVSX1NUQVRFLkhPVkVSRUQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGN1cnNvciBob3ZlcmVkIG9uIGZpcnN0IHZlcnRleCB3aGVuIGRyYXdpbmcgcG9seWdvblxuICAgICAgaWYgKFxuICAgICAgICBob3ZlcmVkLmluZGV4ID09PSAwICYmXG4gICAgICAgIGVkaXRIYW5kbGUucHJvcGVydGllcy5ndWlkZVR5cGUgPT09IEdVSURFX1RZUEUuQ1VSU09SX0VESVRfSEFORExFXG4gICAg