UNPKG

react-planner-viewer

Version:

react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode

147 lines (107 loc) 16.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (state, action) { switch (action.type) { case _constants.BEGIN_DRAGGING_VERTEX: return beginDraggingVertex(state, action.layerID, action.vertexID, action.x, action.y); case _constants.UPDATE_DRAGGING_VERTEX: return updateDraggingVertex(state, action.x, action.y); case _constants.END_DRAGGING_VERTEX: return endDraggingVertex(state, action.x, action.y); default: return state; } }; var _constants = require('../constants'); var _immutable = require('immutable'); var _snapScene = require('../utils/snap-scene'); var _snap = require('../utils/snap'); var _layerOperations = require('../utils/layer-operations'); var _geometry = require('../utils/geometry'); function beginDraggingVertex(state, layerID, vertexID, x, y) { var snapElements = (0, _snapScene.sceneSnapElements)(state.scene, new _immutable.List(), state.snapMask); return state.merge({ mode: _constants.MODE_DRAGGING_VERTEX, snapElements: snapElements, draggingSupport: (0, _immutable.Map)({ layerID: layerID, vertexID: vertexID }) }); } function updateDraggingVertex(state, x, y) { var draggingSupport = state.draggingSupport, snapElements = state.snapElements, scene = state.scene; var snap = null; if (state.snapMask && !state.snapMask.isEmpty()) { snap = (0, _snap.nearestSnap)(snapElements, x, y, state.snapMask); if (snap) { ; var _snap$point = snap.point; x = _snap$point.x; y = _snap$point.y; } } var layerID = draggingSupport.get('layerID'); var vertexID = draggingSupport.get('vertexID'); return state.merge({ activeSnapElement: snap ? snap.snap : null, scene: scene.mergeIn(['layers', layerID, 'vertices', vertexID], { x: x, y: y }) }); } function endDraggingVertex(state, x, y) { var catalog = state.catalog; var draggingSupport = state.draggingSupport; var layerID = draggingSupport.get('layerID'); var vertexID = draggingSupport.get('vertexID'); var lineIDs = state.scene.layers.get(layerID).vertices.get(vertexID).lines; var scene = state.scene.updateIn(['layers', layerID], function (layer) { return layer.withMutations(function (layer) { lineIDs.forEach(function (lineID) { var line = layer.lines.get(lineID); if (line) { var oldVertexID = void 0; if (line.vertices.get(0) === vertexID) { // I need to invert vertices oldVertexID = line.vertices.get(1); } else { oldVertexID = line.vertices.get(0); } var oldVertex = layer.vertices.get(oldVertexID); var vertex = layer.vertices.get(vertexID); var oldHoles = []; var orderedVertices = (0, _geometry.orderVertices)([oldVertex, vertex]); line.holes.forEach(function (holeID) { var hole = layer.holes.get(holeID); var oldLineLength = (0, _geometry.pointsDistance)(oldVertex.x, oldVertex.y, vertex.x, vertex.y); var alpha = Math.atan2(orderedVertices[1].y - orderedVertices[0].y, orderedVertices[1].x - orderedVertices[0].x); var offset = hole.offset; if (orderedVertices[1].x === line.vertices.get(1).x && orderedVertices[1].y === line.vertices(1).y) { offset = 1 - offset; } var xp = oldLineLength * offset * Math.cos(alpha) + orderedVertices[0].x; var yp = oldLineLength * offset * Math.sin(alpha) + orderedVertices[0].y; oldHoles.push({ hole: hole, offsetPosition: { x: xp, y: yp } }); }); (0, _layerOperations.mergeEqualsVertices)(layer, vertexID); (0, _layerOperations.removeLine)(layer, lineID); if (!(0, _geometry.samePoints)(oldVertex, vertex)) { (0, _layerOperations.addLineAvoidingIntersections)(layer, line.type, oldVertex.x, oldVertex.y, vertex.x, vertex.y, catalog, line.properties, oldHoles); } } }); (0, _layerOperations.detectAndUpdateAreas)(layer, catalog); }); }); return state.merge({ mode: _constants.MODE_IDLE, draggingSupport: null, scene: scene, activeSnapElement: null, snapElements: new _immutable.List(), sceneHistory: state.sceneHistory.push(scene) }); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWR1Y2Vycy92ZXJ0aWNlcy1yZWR1Y2VyLmpzIl0sIm5hbWVzIjpbInN0YXRlIiwiYWN0aW9uIiwidHlwZSIsImJlZ2luRHJhZ2dpbmdWZXJ0ZXgiLCJsYXllcklEIiwidmVydGV4SUQiLCJ4IiwieSIsInVwZGF0ZURyYWdnaW5nVmVydGV4IiwiZW5kRHJhZ2dpbmdWZXJ0ZXgiLCJzbmFwRWxlbWVudHMiLCJzY2VuZSIsInNuYXBNYXNrIiwibWVyZ2UiLCJtb2RlIiwiZHJhZ2dpbmdTdXBwb3J0Iiwic25hcCIsImlzRW1wdHkiLCJwb2ludCIsImdldCIsImFjdGl2ZVNuYXBFbGVtZW50IiwibWVyZ2VJbiIsImNhdGFsb2ciLCJsaW5lSURzIiwibGF5ZXJzIiwidmVydGljZXMiLCJsaW5lcyIsInVwZGF0ZUluIiwibGF5ZXIiLCJ3aXRoTXV0YXRpb25zIiwiZm9yRWFjaCIsImxpbmUiLCJsaW5lSUQiLCJvbGRWZXJ0ZXhJRCIsIm9sZFZlcnRleCIsInZlcnRleCIsIm9sZEhvbGVzIiwib3JkZXJlZFZlcnRpY2VzIiwiaG9sZXMiLCJob2xlIiwiaG9sZUlEIiwib2xkTGluZUxlbmd0aCIsImFscGhhIiwiTWF0aCIsImF0YW4yIiwib2Zmc2V0IiwieHAiLCJjb3MiLCJ5cCIsInNpbiIsInB1c2giLCJvZmZzZXRQb3NpdGlvbiIsInByb3BlcnRpZXMiLCJzY2VuZUhpc3RvcnkiXSwibWFwcGluZ3MiOiI7Ozs7OztrQkFrQmUsVUFBVUEsS0FBVixFQUFpQkMsTUFBakIsRUFBeUI7QUFDdEMsVUFBUUEsT0FBT0MsSUFBZjtBQUNFO0FBQ0UsYUFBT0Msb0JBQW9CSCxLQUFwQixFQUEyQkMsT0FBT0csT0FBbEMsRUFBMkNILE9BQU9JLFFBQWxELEVBQTRESixPQUFPSyxDQUFuRSxFQUFzRUwsT0FBT00sQ0FBN0UsQ0FBUDs7QUFFRjtBQUNFLGFBQU9DLHFCQUFxQlIsS0FBckIsRUFBNEJDLE9BQU9LLENBQW5DLEVBQXNDTCxPQUFPTSxDQUE3QyxDQUFQOztBQUVGO0FBQ0UsYUFBT0Usa0JBQWtCVCxLQUFsQixFQUF5QkMsT0FBT0ssQ0FBaEMsRUFBbUNMLE9BQU9NLENBQTFDLENBQVA7O0FBRUY7QUFDRSxhQUFPUCxLQUFQO0FBWEo7QUFhRCxDOztBQWhDRDs7QUFPQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFNQTs7QUFrQkEsU0FBU0csbUJBQVQsQ0FBNkJILEtBQTdCLEVBQW9DSSxPQUFwQyxFQUE2Q0MsUUFBN0MsRUFBdURDLENBQXZELEVBQTBEQyxDQUExRCxFQUE2RDs7QUFFM0QsTUFBSUcsZUFBZSxrQ0FBa0JWLE1BQU1XLEtBQXhCLEVBQStCLHFCQUEvQixFQUEyQ1gsTUFBTVksUUFBakQsQ0FBbkI7O0FBRUEsU0FBT1osTUFBTWEsS0FBTixDQUFZO0FBQ2pCQyx5Q0FEaUI7QUFFakJKLDhCQUZpQjtBQUdqQksscUJBQWlCLG9CQUFJO0FBQ25CWCxzQkFEbUIsRUFDVkM7QUFEVSxLQUFKO0FBSEEsR0FBWixDQUFQO0FBT0Q7O0FBRUQsU0FBU0csb0JBQVQsQ0FBOEJSLEtBQTlCLEVBQXFDTSxDQUFyQyxFQUF3Q0MsQ0FBeEMsRUFBMkM7QUFBQSxNQUNwQ1EsZUFEb0MsR0FDSWYsS0FESixDQUNwQ2UsZUFEb0M7QUFBQSxNQUNuQkwsWUFEbUIsR0FDSVYsS0FESixDQUNuQlUsWUFEbUI7QUFBQSxNQUNMQyxLQURLLEdBQ0lYLEtBREosQ0FDTFcsS0FESzs7O0FBR3pDLE1BQUlLLE9BQU8sSUFBWDtBQUNBLE1BQUloQixNQUFNWSxRQUFOLElBQWtCLENBQUNaLE1BQU1ZLFFBQU4sQ0FBZUssT0FBZixFQUF2QixFQUFpRDtBQUMvQ0QsV0FBTyx1QkFBWU4sWUFBWixFQUEwQkosQ0FBMUIsRUFBNkJDLENBQTdCLEVBQWdDUCxNQUFNWSxRQUF0QyxDQUFQO0FBQ0EsUUFBSUksSUFBSjtBQUFVO0FBQVYsd0JBQW9CQSxLQUFLRSxLQUF6QjtBQUFZWixPQUFaLGVBQVlBLENBQVo7QUFBZUMsT0FBZixlQUFlQSxDQUFmO0FBQUE7QUFDRDs7QUFFRCxNQUFJSCxVQUFVVyxnQkFBZ0JJLEdBQWhCLENBQW9CLFNBQXBCLENBQWQ7QUFDQSxNQUFJZCxXQUFXVSxnQkFBZ0JJLEdBQWhCLENBQW9CLFVBQXBCLENBQWY7QUFDQSxTQUFPbkIsTUFBTWEsS0FBTixDQUFZO0FBQ2pCTyx1QkFBbUJKLE9BQU9BLEtBQUtBLElBQVosR0FBbUIsSUFEckI7QUFFakJMLFdBQU9BLE1BQU1VLE9BQU4sQ0FBYyxDQUFDLFFBQUQsRUFBV2pCLE9BQVgsRUFBb0IsVUFBcEIsRUFBZ0NDLFFBQWhDLENBQWQsRUFBeUQsRUFBQ0MsSUFBRCxFQUFJQyxJQUFKLEVBQXpEO0FBRlUsR0FBWixDQUFQO0FBSUQ7O0FBRUQsU0FBU0UsaUJBQVQsQ0FBMkJULEtBQTNCLEVBQWtDTSxDQUFsQyxFQUFxQ0MsQ0FBckMsRUFBd0M7QUFDdEMsTUFBSWUsVUFBVXRCLE1BQU1zQixPQUFwQjs7QUFEc0MsTUFHakNQLGVBSGlDLEdBR2RmLEtBSGMsQ0FHakNlLGVBSGlDOztBQUl0QyxNQUFJWCxVQUFVVyxnQkFBZ0JJLEdBQWhCLENBQW9CLFNBQXBCLENBQWQ7QUFDQSxNQUFJZCxXQUFXVSxnQkFBZ0JJLEdBQWhCLENBQW9CLFVBQXBCLENBQWY7QUFDQSxNQUFJSSxVQUFVdkIsTUFBTVcsS0FBTixDQUFZYSxNQUFaLENBQW1CTCxHQUFuQixDQUF1QmYsT0FBdkIsRUFBZ0NxQixRQUFoQyxDQUF5Q04sR0FBekMsQ0FBNkNkLFFBQTdDLEVBQXVEcUIsS0FBckU7O0FBRUEsTUFBSWYsUUFBUVgsTUFBTVcsS0FBTixDQUFZZ0IsUUFBWixDQUFxQixDQUFDLFFBQUQsRUFBV3ZCLE9BQVgsQ0FBckIsRUFBMEM7QUFBQSxXQUFTd0IsTUFBTUMsYUFBTixDQUFvQixpQkFBUzs7QUFFMUZOLGNBQVFPLE9BQVIsQ0FBZ0Isa0JBQVU7QUFDeEIsWUFBSUMsT0FBT0gsTUFBTUYsS0FBTixDQUFZUCxHQUFaLENBQWdCYSxNQUFoQixDQUFYOztBQUVBLFlBQUlELElBQUosRUFBVTs7QUFFUixjQUFJRSxvQkFBSjs7QUFFQSxjQUFJRixLQUFLTixRQUFMLENBQWNOLEdBQWQsQ0FBa0IsQ0FBbEIsTUFBeUJkLFFBQTdCLEVBQXVDO0FBQ3JDO0FBQ0E0QiwwQkFBY0YsS0FBS04sUUFBTCxDQUFjTixHQUFkLENBQWtCLENBQWxCLENBQWQ7QUFDRCxXQUhELE1BR087QUFDTGMsMEJBQWNGLEtBQUtOLFFBQUwsQ0FBY04sR0FBZCxDQUFrQixDQUFsQixDQUFkO0FBQ0Q7O0FBRUQsY0FBSWUsWUFBWU4sTUFBTUgsUUFBTixDQUFlTixHQUFmLENBQW1CYyxXQUFuQixDQUFoQjtBQUNBLGNBQUlFLFNBQVNQLE1BQU1ILFFBQU4sQ0FBZU4sR0FBZixDQUFtQmQsUUFBbkIsQ0FBYjs7QUFFQSxjQUFJK0IsV0FBVyxFQUFmOztBQUVBLGNBQUlDLGtCQUFrQiw2QkFBYyxDQUFDSCxTQUFELEVBQVlDLE1BQVosQ0FBZCxDQUF0Qjs7QUFFQUosZUFBS08sS0FBTCxDQUFXUixPQUFYLENBQW1CLGtCQUFVO0FBQzNCLGdCQUFJUyxPQUFPWCxNQUFNVSxLQUFOLENBQVluQixHQUFaLENBQWdCcUIsTUFBaEIsQ0FBWDtBQUNBLGdCQUFJQyxnQkFBZ0IsOEJBQWVQLFVBQVU1QixDQUF6QixFQUE0QjRCLFVBQVUzQixDQUF0QyxFQUF5QzRCLE9BQU83QixDQUFoRCxFQUFtRDZCLE9BQU81QixDQUExRCxDQUFwQjs7QUFFQSxnQkFBSW1DLFFBQVFDLEtBQUtDLEtBQUwsQ0FBV1AsZ0JBQWdCLENBQWhCLEVBQW1COUIsQ0FBbkIsR0FBdUI4QixnQkFBZ0IsQ0FBaEIsRUFBbUI5QixDQUFyRCxFQUNWOEIsZ0JBQWdCLENBQWhCLEVBQW1CL0IsQ0FBbkIsR0FBdUIrQixnQkFBZ0IsQ0FBaEIsRUFBbUIvQixDQURoQyxDQUFaOztBQUdBLGdCQUFJdUMsU0FBU04sS0FBS00sTUFBbEI7O0FBRUEsZ0JBQUlSLGdCQUFnQixDQUFoQixFQUFtQi9CLENBQW5CLEtBQXlCeUIsS0FBS04sUUFBTCxDQUFjTixHQUFkLENBQWtCLENBQWxCLEVBQXFCYixDQUE5QyxJQUNDK0IsZ0JBQWdCLENBQWhCLEVBQW1COUIsQ0FBbkIsS0FBeUJ3QixLQUFLTixRQUFMLENBQWMsQ0FBZCxFQUFpQmxCLENBRC9DLEVBQ2tEO0FBQ2hEc0MsdUJBQVMsSUFBSUEsTUFBYjtBQUNEOztBQUVELGdCQUFJQyxLQUFLTCxnQkFBZ0JJLE1BQWhCLEdBQXlCRixLQUFLSSxHQUFMLENBQVNMLEtBQVQsQ0FBekIsR0FBMkNMLGdCQUFnQixDQUFoQixFQUFtQi9CLENBQXZFO0FBQ0EsZ0JBQUkwQyxLQUFLUCxnQkFBZ0JJLE1BQWhCLEdBQXlCRixLQUFLTSxHQUFMLENBQVNQLEtBQVQsQ0FBekIsR0FBMkNMLGdCQUFnQixDQUFoQixFQUFtQjlCLENBQXZFOztBQUVBNkIscUJBQVNjLElBQVQsQ0FBYyxFQUFDWCxVQUFELEVBQU9ZLGdCQUFnQixFQUFDN0MsR0FBR3dDLEVBQUosRUFBUXZDLEdBQUd5QyxFQUFYLEVBQXZCLEVBQWQ7QUFDRCxXQWxCRDs7QUFvQkEsb0RBQW9CcEIsS0FBcEIsRUFBMkJ2QixRQUEzQjtBQUNBLDJDQUFXdUIsS0FBWCxFQUFrQkksTUFBbEI7O0FBRUEsY0FBSSxDQUFDLDBCQUFXRSxTQUFYLEVBQXNCQyxNQUF0QixDQUFMLEVBQW9DO0FBQ2xDLCtEQUE2QlAsS0FBN0IsRUFBb0NHLEtBQUs3QixJQUF6QyxFQUNFZ0MsVUFBVTVCLENBRFosRUFDZTRCLFVBQVUzQixDQUR6QixFQUVFNEIsT0FBTzdCLENBRlQsRUFFWTZCLE9BQU81QixDQUZuQixFQUdFZSxPQUhGLEVBSUVTLEtBQUtxQixVQUpQLEVBSW1CaEIsUUFKbkI7QUFLRDtBQUNGO0FBQ0YsT0FwREQ7O0FBc0RBLGlEQUFxQlIsS0FBckIsRUFBNEJOLE9BQTVCO0FBQ0QsS0F6RDhELENBQVQ7QUFBQSxHQUExQyxDQUFaOztBQTJEQSxTQUFPdEIsTUFBTWEsS0FBTixDQUFZO0FBQ2pCQyw4QkFEaUI7QUFFakJDLHFCQUFpQixJQUZBO0FBR2pCSixnQkFIaUI7O0FBS2pCUyx1QkFBbUIsSUFMRjtBQU1qQlYsa0JBQWMscUJBTkc7QUFPakIyQyxrQkFBY3JELE1BQU1xRCxZQUFOLENBQW1CSCxJQUFuQixDQUF3QnZDLEtBQXhCO0FBUEcsR0FBWixDQUFQO0FBU0QiLCJmaWxlIjoidmVydGljZXMtcmVkdWNlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJFR0lOX0RSQUdHSU5HX1ZFUlRFWCxcbiAgVVBEQVRFX0RSQUdHSU5HX1ZFUlRFWCxcbiAgRU5EX0RSQUdHSU5HX1ZFUlRFWCxcbiAgTU9ERV9EUkFHR0lOR19WRVJURVgsXG4gIE1PREVfSURMRVxufSBmcm9tICcuLi9jb25zdGFudHMnXG5pbXBvcnQge01hcCwgTGlzdH0gZnJvbSAnaW1tdXRhYmxlJztcbmltcG9ydCB7c2NlbmVTbmFwRWxlbWVudHN9IGZyb20gJy4uL3V0aWxzL3NuYXAtc2NlbmUnO1xuaW1wb3J0IHtuZWFyZXN0U25hcH0gZnJvbSAnLi4vdXRpbHMvc25hcCc7XG5pbXBvcnQge1xuICBkZXRlY3RBbmRVcGRhdGVBcmVhcyxcbiAgcmVtb3ZlTGluZSxcbiAgYWRkTGluZUF2b2lkaW5nSW50ZXJzZWN0aW9ucyxcbiAgbWVyZ2VFcXVhbHNWZXJ0aWNlc1xufSBmcm9tICcuLi91dGlscy9sYXllci1vcGVyYXRpb25zJztcbmltcG9ydCB7b3JkZXJWZXJ0aWNlcywgcG9pbnRzRGlzdGFuY2UsIHNhbWVQb2ludHN9IGZyb20gXCIuLi91dGlscy9nZW9tZXRyeVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBCRUdJTl9EUkFHR0lOR19WRVJURVg6XG4gICAgICByZXR1cm4gYmVnaW5EcmFnZ2luZ1ZlcnRleChzdGF0ZSwgYWN0aW9uLmxheWVySUQsIGFjdGlvbi52ZXJ0ZXhJRCwgYWN0aW9uLngsIGFjdGlvbi55KTtcblxuICAgIGNhc2UgVVBEQVRFX0RSQUdHSU5HX1ZFUlRFWDpcbiAgICAgIHJldHVybiB1cGRhdGVEcmFnZ2luZ1ZlcnRleChzdGF0ZSwgYWN0aW9uLngsIGFjdGlvbi55KTtcblxuICAgIGNhc2UgRU5EX0RSQUdHSU5HX1ZFUlRFWDpcbiAgICAgIHJldHVybiBlbmREcmFnZ2luZ1ZlcnRleChzdGF0ZSwgYWN0aW9uLngsIGFjdGlvbi55KTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmVnaW5EcmFnZ2luZ1ZlcnRleChzdGF0ZSwgbGF5ZXJJRCwgdmVydGV4SUQsIHgsIHkpIHtcblxuICBsZXQgc25hcEVsZW1lbnRzID0gc2NlbmVTbmFwRWxlbWVudHMoc3RhdGUuc2NlbmUsIG5ldyBMaXN0KCksIHN0YXRlLnNuYXBNYXNrKTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIG1vZGU6IE1PREVfRFJBR0dJTkdfVkVSVEVYLFxuICAgIHNuYXBFbGVtZW50cyxcbiAgICBkcmFnZ2luZ1N1cHBvcnQ6IE1hcCh7XG4gICAgICBsYXllcklELCB2ZXJ0ZXhJRFxuICAgIH0pXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEcmFnZ2luZ1ZlcnRleChzdGF0ZSwgeCwgeSkge1xuICBsZXQge2RyYWdnaW5nU3VwcG9ydCwgc25hcEVsZW1lbnRzLCBzY2VuZX0gPSBzdGF0ZTtcblxuICBsZXQgc25hcCA9IG51bGw7XG4gIGlmIChzdGF0ZS5zbmFwTWFzayAmJiAhc3RhdGUuc25hcE1hc2suaXNFbXB0eSgpKSB7XG4gICAgc25hcCA9IG5lYXJlc3RTbmFwKHNuYXBFbGVtZW50cywgeCwgeSwgc3RhdGUuc25hcE1hc2spO1xuICAgIGlmIChzbmFwKSAoe3gsIHl9ID0gc25hcC5wb2ludCk7XG4gIH1cblxuICBsZXQgbGF5ZXJJRCA9IGRyYWdnaW5nU3VwcG9ydC5nZXQoJ2xheWVySUQnKTtcbiAgbGV0IHZlcnRleElEID0gZHJhZ2dpbmdTdXBwb3J0LmdldCgndmVydGV4SUQnKTtcbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBhY3RpdmVTbmFwRWxlbWVudDogc25hcCA/IHNuYXAuc25hcCA6IG51bGwsXG4gICAgc2NlbmU6IHNjZW5lLm1lcmdlSW4oWydsYXllcnMnLCBsYXllcklELCAndmVydGljZXMnLCB2ZXJ0ZXhJRF0sIHt4LCB5fSlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuZERyYWdnaW5nVmVydGV4KHN0YXRlLCB4LCB5KSB7XG4gIGxldCBjYXRhbG9nID0gc3RhdGUuY2F0YWxvZztcblxuICBsZXQge2RyYWdnaW5nU3VwcG9ydH0gPSBzdGF0ZTtcbiAgbGV0IGxheWVySUQgPSBkcmFnZ2luZ1N1cHBvcnQuZ2V0KCdsYXllcklEJyk7XG4gIGxldCB2ZXJ0ZXhJRCA9IGRyYWdnaW5nU3VwcG9ydC5nZXQoJ3ZlcnRleElEJyk7XG4gIGxldCBsaW5lSURzID0gc3RhdGUuc2NlbmUubGF5ZXJzLmdldChsYXllcklEKS52ZXJ0aWNlcy5nZXQodmVydGV4SUQpLmxpbmVzO1xuXG4gIGxldCBzY2VuZSA9IHN0YXRlLnNjZW5lLnVwZGF0ZUluKFsnbGF5ZXJzJywgbGF5ZXJJRF0sIGxheWVyID0+IGxheWVyLndpdGhNdXRhdGlvbnMobGF5ZXIgPT4ge1xuXG4gICAgbGluZUlEcy5mb3JFYWNoKGxpbmVJRCA9PiB7XG4gICAgICBsZXQgbGluZSA9IGxheWVyLmxpbmVzLmdldChsaW5lSUQpO1xuXG4gICAgICBpZiAobGluZSkge1xuXG4gICAgICAgIGxldCBvbGRWZXJ0ZXhJRDtcblxuICAgICAgICBpZiAobGluZS52ZXJ0aWNlcy5nZXQoMCkgPT09IHZlcnRleElEKSB7XG4gICAgICAgICAgLy8gSSBuZWVkIHRvIGludmVydCB2ZXJ0aWNlc1xuICAgICAgICAgIG9sZFZlcnRleElEID0gbGluZS52ZXJ0aWNlcy5nZXQoMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xkVmVydGV4SUQgPSBsaW5lLnZlcnRpY2VzLmdldCgwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvbGRWZXJ0ZXggPSBsYXllci52ZXJ0aWNlcy5nZXQob2xkVmVydGV4SUQpO1xuICAgICAgICBsZXQgdmVydGV4ID0gbGF5ZXIudmVydGljZXMuZ2V0KHZlcnRleElEKTtcblxuICAgICAgICBsZXQgb2xkSG9sZXMgPSBbXTtcblxuICAgICAgICBsZXQgb3JkZXJlZFZlcnRpY2VzID0gb3JkZXJWZXJ0aWNlcyhbb2xkVmVydGV4LCB2ZXJ0ZXhdKTtcblxuICAgICAgICBsaW5lLmhvbGVzLmZvckVhY2goaG9sZUlEID0+IHtcbiAgICAgICAgICBsZXQgaG9sZSA9IGxheWVyLmhvbGVzLmdldChob2xlSUQpO1xuICAgICAgICAgIGxldCBvbGRMaW5lTGVuZ3RoID0gcG9pbnRzRGlzdGFuY2Uob2xkVmVydGV4LngsIG9sZFZlcnRleC55LCB2ZXJ0ZXgueCwgdmVydGV4LnkpO1xuXG4gICAgICAgICAgbGV0IGFscGhhID0gTWF0aC5hdGFuMihvcmRlcmVkVmVydGljZXNbMV0ueSAtIG9yZGVyZWRWZXJ0aWNlc1swXS55LFxuICAgICAgICAgICAgb3JkZXJlZFZlcnRpY2VzWzFdLnggLSBvcmRlcmVkVmVydGljZXNbMF0ueCk7XG5cbiAgICAgICAgICBsZXQgb2Zmc2V0ID0gaG9sZS5vZmZzZXQ7XG5cbiAgICAgICAgICBpZiAob3JkZXJlZFZlcnRpY2VzWzFdLnggPT09IGxpbmUudmVydGljZXMuZ2V0KDEpLnhcbiAgICAgICAgICAgICYmIG9yZGVyZWRWZXJ0aWNlc1sxXS55ID09PSBsaW5lLnZlcnRpY2VzKDEpLnkpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IDEgLSBvZmZzZXQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHhwID0gb2xkTGluZUxlbmd0aCAqIG9mZnNldCAqIE1hdGguY29zKGFscGhhKSArIG9yZGVyZWRWZXJ0aWNlc1swXS54O1xuICAgICAgICAgIGxldCB5cCA9IG9sZExpbmVMZW5ndGggKiBvZmZzZXQgKiBNYXRoLnNpbihhbHBoYSkgKyBvcmRlcmVkVmVydGljZXNbMF0ueTtcblxuICAgICAgICAgIG9sZEhvbGVzLnB1c2goe2hvbGUsIG9mZnNldFBvc2l0aW9uOiB7eDogeHAsIHk6IHlwfX0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBtZXJnZUVxdWFsc1ZlcnRpY2VzKGxheWVyLCB2ZXJ0ZXhJRCk7XG4gICAgICAgIHJlbW92ZUxpbmUobGF5ZXIsIGxpbmVJRCk7XG5cbiAgICAgICAgaWYgKCFzYW1lUG9pbnRzKG9sZFZlcnRleCwgdmVydGV4KSkge1xuICAgICAgICAgIGFkZExpbmVBdm9pZGluZ0ludGVyc2VjdGlvbnMobGF5ZXIsIGxpbmUudHlwZSxcbiAgICAgICAgICAgIG9sZFZlcnRleC54LCBvbGRWZXJ0ZXgueSxcbiAgICAgICAgICAgIHZlcnRleC54LCB2ZXJ0ZXgueSxcbiAgICAgICAgICAgIGNhdGFsb2csXG4gICAgICAgICAgICBsaW5lLnByb3BlcnRpZXMsIG9sZEhvbGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGV0ZWN0QW5kVXBkYXRlQXJlYXMobGF5ZXIsIGNhdGFsb2cpO1xuICB9KSk7XG5cbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBtb2RlOiBNT0RFX0lETEUsXG4gICAgZHJhZ2dpbmdTdXBwb3J0OiBudWxsLFxuICAgIHNjZW5lLFxuXG4gICAgYWN0aXZlU25hcEVsZW1lbnQ6IG51bGwsXG4gICAgc25hcEVsZW1lbnRzOiBuZXcgTGlzdCgpLFxuICAgIHNjZW5lSGlzdG9yeTogc3RhdGUuc2NlbmVIaXN0b3J5LnB1c2goc2NlbmUpXG4gIH0pO1xufVxuIl19