@pie-element/hotspot 9.1.0 → 9.2.0-mui-update.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/configure/CHANGELOG.md +66 -0
  3. package/configure/lib/DeleteWidget.js +31 -44
  4. package/configure/lib/DeleteWidget.js.map +1 -1
  5. package/configure/lib/__tests__/DeleteWidget.test.js +60 -0
  6. package/configure/lib/__tests__/hotspot-container.test.js +377 -0
  7. package/configure/lib/__tests__/hotspot-drawable.test.js +233 -0
  8. package/configure/lib/__tests__/index.test.js +211 -0
  9. package/configure/lib/__tests__/root.test.js +440 -0
  10. package/configure/lib/__tests__/utils.test.js +287 -0
  11. package/configure/lib/button.js +27 -46
  12. package/configure/lib/button.js.map +1 -1
  13. package/configure/lib/buttons/circle.js +21 -28
  14. package/configure/lib/buttons/circle.js.map +1 -1
  15. package/configure/lib/buttons/polygon.js +27 -34
  16. package/configure/lib/buttons/polygon.js.map +1 -1
  17. package/configure/lib/buttons/rectangle.js +27 -34
  18. package/configure/lib/buttons/rectangle.js.map +1 -1
  19. package/configure/lib/defaults.js +3 -4
  20. package/configure/lib/defaults.js.map +1 -1
  21. package/configure/lib/hotspot-circle.js +133 -199
  22. package/configure/lib/hotspot-circle.js.map +1 -1
  23. package/configure/lib/hotspot-container.js +251 -356
  24. package/configure/lib/hotspot-container.js.map +1 -1
  25. package/configure/lib/hotspot-drawable.js +361 -473
  26. package/configure/lib/hotspot-drawable.js.map +1 -1
  27. package/configure/lib/hotspot-palette.js +93 -140
  28. package/configure/lib/hotspot-palette.js.map +1 -1
  29. package/configure/lib/hotspot-polygon.js +213 -318
  30. package/configure/lib/hotspot-polygon.js.map +1 -1
  31. package/configure/lib/hotspot-rectangle.js +129 -193
  32. package/configure/lib/hotspot-rectangle.js.map +1 -1
  33. package/configure/lib/icons.js +1 -1
  34. package/configure/lib/icons.js.map +1 -1
  35. package/configure/lib/image-konva.js +47 -87
  36. package/configure/lib/image-konva.js.map +1 -1
  37. package/configure/lib/index.js +163 -223
  38. package/configure/lib/index.js.map +1 -1
  39. package/configure/lib/root.js +302 -394
  40. package/configure/lib/root.js.map +1 -1
  41. package/configure/lib/shapes/circle.js +70 -102
  42. package/configure/lib/shapes/circle.js.map +1 -1
  43. package/configure/lib/shapes/index.js +5 -13
  44. package/configure/lib/shapes/index.js.map +1 -1
  45. package/configure/lib/shapes/polygon.js +65 -97
  46. package/configure/lib/shapes/polygon.js.map +1 -1
  47. package/configure/lib/shapes/rectagle.js +70 -102
  48. package/configure/lib/shapes/rectagle.js.map +1 -1
  49. package/configure/lib/shapes/utils.js +3 -9
  50. package/configure/lib/shapes/utils.js.map +1 -1
  51. package/configure/lib/upload-control.js +26 -53
  52. package/configure/lib/upload-control.js.map +1 -1
  53. package/configure/lib/utils.js +85 -138
  54. package/configure/lib/utils.js.map +1 -1
  55. package/configure/package.json +11 -10
  56. package/configure/src/__tests__/index.test.js +11 -5
  57. package/configure/src/button.jsx +12 -20
  58. package/configure/src/hotspot-circle.jsx +5 -18
  59. package/configure/src/hotspot-container.jsx +82 -98
  60. package/configure/src/hotspot-drawable.jsx +43 -45
  61. package/configure/src/hotspot-palette.jsx +45 -37
  62. package/configure/src/hotspot-polygon.jsx +4 -20
  63. package/configure/src/hotspot-rectangle.jsx +4 -17
  64. package/configure/src/index.js +12 -2
  65. package/configure/src/root.jsx +85 -79
  66. package/configure/src/upload-control.jsx +6 -16
  67. package/controller/CHANGELOG.md +52 -0
  68. package/controller/lib/__tests__/index.test.js +586 -0
  69. package/controller/lib/__tests__/utils.test.js +8 -0
  70. package/controller/lib/defaults.js +3 -4
  71. package/controller/lib/defaults.js.map +1 -1
  72. package/controller/lib/index.js +152 -206
  73. package/controller/lib/index.js.map +1 -1
  74. package/controller/lib/utils.js +15 -35
  75. package/controller/lib/utils.js.map +1 -1
  76. package/controller/package.json +2 -2
  77. package/docs/demo/pie.manifest.json +11 -0
  78. package/lib/__tests__/container.test.js +221 -0
  79. package/lib/__tests__/index.test.js +113 -0
  80. package/lib/__tests__/polygon.test.js +245 -0
  81. package/lib/__tests__/rectangle.test.js +236 -0
  82. package/lib/__tests__/session-updater.test.js +69 -0
  83. package/lib/hotspot/circle.js +111 -170
  84. package/lib/hotspot/circle.js.map +1 -1
  85. package/lib/hotspot/container.js +175 -261
  86. package/lib/hotspot/container.js.map +1 -1
  87. package/lib/hotspot/icons.js +1 -1
  88. package/lib/hotspot/icons.js.map +1 -1
  89. package/lib/hotspot/image-konva-tooltip.js +66 -113
  90. package/lib/hotspot/image-konva-tooltip.js.map +1 -1
  91. package/lib/hotspot/index.js +136 -199
  92. package/lib/hotspot/index.js.map +1 -1
  93. package/lib/hotspot/polygon.js +151 -215
  94. package/lib/hotspot/polygon.js.map +1 -1
  95. package/lib/hotspot/rectangle.js +130 -186
  96. package/lib/hotspot/rectangle.js.map +1 -1
  97. package/lib/index.js +188 -257
  98. package/lib/index.js.map +1 -1
  99. package/lib/session-updater.js +13 -19
  100. package/lib/session-updater.js.map +1 -1
  101. package/package.json +14 -11
  102. package/src/hotspot/circle.jsx +2 -13
  103. package/src/hotspot/container.jsx +35 -50
  104. package/src/hotspot/index.jsx +16 -28
  105. package/src/hotspot/polygon.jsx +4 -13
  106. package/src/hotspot/rectangle.jsx +4 -13
  107. package/src/index.js +21 -12
  108. package/LICENSE.md +0 -5
  109. package/configure/node_modules/debug/CHANGELOG.md +0 -395
  110. package/configure/node_modules/debug/LICENSE +0 -19
  111. package/configure/node_modules/debug/README.md +0 -437
  112. package/configure/node_modules/debug/node.js +0 -1
  113. package/configure/node_modules/debug/package.json +0 -51
  114. package/configure/node_modules/debug/src/browser.js +0 -180
  115. package/configure/node_modules/debug/src/common.js +0 -249
  116. package/configure/node_modules/debug/src/index.js +0 -12
  117. package/configure/node_modules/debug/src/node.js +0 -177
@@ -1,99 +1,47 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports["default"] = void 0;
9
-
10
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
-
12
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
-
14
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
-
16
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
17
-
18
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
-
20
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
21
-
22
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
23
-
7
+ exports.default = void 0;
24
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
25
-
26
9
  var _react = _interopRequireDefault(require("react"));
27
-
28
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
29
-
30
11
  var _reactKonva = require("react-konva");
31
-
32
- var _index = require("@material-ui/core/styles/index");
33
-
34
12
  var _ReactKonvaCore = require("react-konva/lib/ReactKonvaCore");
35
-
36
13
  var _DeleteWidget = _interopRequireDefault(require("./DeleteWidget"));
37
-
38
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
39
-
40
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
41
-
42
- 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); }; }
43
-
44
- 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; } }
45
-
46
- var HOVERED_COLOR = '#00BFFF';
47
-
48
- var PolComponent = /*#__PURE__*/function (_React$Component) {
49
- (0, _inherits2["default"])(PolComponent, _React$Component);
50
-
51
- var _super = _createSuper(PolComponent);
52
-
53
- function PolComponent() {
54
- var _this;
55
-
56
- (0, _classCallCheck2["default"])(this, PolComponent);
57
-
58
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
59
- args[_key] = arguments[_key];
60
- }
61
-
62
- _this = _super.call.apply(_super, [this].concat(args));
63
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getOffset", function (points) {
64
- var xList = points.map(function (p) {
65
- return p.x;
66
- });
67
- var yList = points.map(function (p) {
68
- return p.y;
69
- });
14
+ const HOVERED_COLOR = '#00BFFF';
15
+ class PolComponent extends _react.default.Component {
16
+ constructor(...args) {
17
+ super(...args);
18
+ (0, _defineProperty2.default)(this, "getOffset", points => {
19
+ const xList = points.map(p => p.x);
20
+ const yList = points.map(p => p.y);
70
21
  return {
71
- x: Math.min.apply(Math, (0, _toConsumableArray2["default"])(xList)),
72
- y: Math.max.apply(Math, (0, _toConsumableArray2["default"])(yList))
22
+ x: Math.min(...xList),
23
+ y: Math.max(...yList)
73
24
  };
74
25
  });
75
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "serialize", function (points) {
76
- var _this$getOffset = _this.getOffset(points),
77
- xOffset = _this$getOffset.x,
78
- yOffset = _this$getOffset.y;
79
-
80
- return points.reduce(function (acc, point) {
81
- return [].concat((0, _toConsumableArray2["default"])(acc), [point.x - xOffset, point.y - yOffset]);
82
- }, []);
26
+ (0, _defineProperty2.default)(this, "serialize", points => {
27
+ const {
28
+ x: xOffset,
29
+ y: yOffset
30
+ } = this.getOffset(points);
31
+ return points.reduce((acc, point) => [...acc, point.x - xOffset, point.y - yOffset], []);
83
32
  });
84
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getInitialState", function (points) {
33
+ (0, _defineProperty2.default)(this, "getInitialState", points => {
85
34
  if (points.length) {
86
- var _this$getOffset2 = _this.getOffset(points),
87
- x = _this$getOffset2.x,
88
- y = _this$getOffset2.y;
89
-
35
+ const {
36
+ x,
37
+ y
38
+ } = this.getOffset(points);
90
39
  return {
91
- x: x,
92
- y: y,
93
- points: points
40
+ x,
41
+ y,
42
+ points
94
43
  };
95
44
  }
96
-
97
45
  return {
98
46
  id: '',
99
47
  x: 0,
@@ -101,299 +49,246 @@ var PolComponent = /*#__PURE__*/function (_React$Component) {
101
49
  points: []
102
50
  };
103
51
  });
104
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", _objectSpread({
52
+ (0, _defineProperty2.default)(this, "state", {
105
53
  hovered: false,
106
- isDragging: false
107
- }, _this.getInitialState(_this.props.points)));
108
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleClick", function (e) {
109
- var points = _this.props.points;
110
- var xList = points.map(function (p) {
111
- return p.x;
112
- });
113
- var yList = points.map(function (p) {
114
- return p.y;
115
- });
116
- var width = Math.max.apply(Math, (0, _toConsumableArray2["default"])(xList)) - Math.min.apply(Math, (0, _toConsumableArray2["default"])(xList));
117
- var height = Math.max.apply(Math, (0, _toConsumableArray2["default"])(yList)) - Math.min.apply(Math, (0, _toConsumableArray2["default"])(yList));
118
- var _this$props = _this.props,
119
- isDrawing = _this$props.isDrawing,
120
- onClick = _this$props.onClick,
121
- id = _this$props.id;
122
-
54
+ isDragging: false,
55
+ ...this.getInitialState(this.props.points)
56
+ });
57
+ (0, _defineProperty2.default)(this, "handleClick", e => {
58
+ const {
59
+ points
60
+ } = this.props;
61
+ const xList = points.map(p => p.x);
62
+ const yList = points.map(p => p.y);
63
+ const width = Math.max(...xList) - Math.min(...xList);
64
+ const height = Math.max(...yList) - Math.min(...yList);
65
+ const {
66
+ isDrawing,
67
+ onClick,
68
+ id
69
+ } = this.props;
123
70
  if (width < 0 && height < 0 && isDrawing) {
124
71
  return;
125
72
  }
126
-
127
73
  if (isDrawing && id === 'newPolygon') {
128
- _this.props.addPolygonPoint(e);
129
-
74
+ this.props.addPolygonPoint(e);
130
75
  return;
131
76
  }
132
-
133
77
  e.cancelBubble = true;
134
78
  onClick(id);
135
79
  });
136
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleMouseEnter", function () {
137
- _this.setState({
80
+ (0, _defineProperty2.default)(this, "handleMouseEnter", () => {
81
+ this.setState({
138
82
  hovered: true
139
83
  });
140
-
141
84
  document.body.style.cursor = 'pointer';
142
85
  });
143
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleMouseLeave", function () {
144
- _this.setState({
86
+ (0, _defineProperty2.default)(this, "handleMouseLeave", () => {
87
+ this.setState({
145
88
  hovered: false
146
89
  });
147
-
148
90
  document.body.style.cursor = 'default';
149
91
  });
150
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnDragEnd", function (e) {
151
- var updateModel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
152
- var _this$props2 = _this.props,
153
- onDragEnd = _this$props2.onDragEnd,
154
- id = _this$props2.id;
155
-
156
- var points = e.target.points() || _this.serialize(_this.state.points);
157
-
158
- var newPoints = points.reduce(function (acc, currentPointCoordinate, index) {
92
+ (0, _defineProperty2.default)(this, "handleOnDragEnd", (e, updateModel = false) => {
93
+ const {
94
+ onDragEnd,
95
+ id
96
+ } = this.props;
97
+ const points = e.target.points() || this.serialize(this.state.points);
98
+ const newPoints = points.reduce((acc, currentPointCoordinate, index) => {
159
99
  if (index % 2 === 0 && index + 1 < points.length) {
160
- return [].concat((0, _toConsumableArray2["default"])(acc), [{
100
+ return [...acc, {
161
101
  x: currentPointCoordinate + e.target.x(),
162
102
  y: points[index + 1] + e.target.y()
163
- }]);
103
+ }];
164
104
  }
165
-
166
105
  return acc;
167
106
  }, []);
168
-
169
- _this.setState(_objectSpread(_objectSpread({
170
- points: newPoints
171
- }, _this.getOffset(newPoints)), {}, {
172
- isDragging: updateModel ? false : _this.state.isDragging
173
- }));
174
-
107
+ this.setState({
108
+ points: newPoints,
109
+ ...this.getOffset(newPoints),
110
+ isDragging: updateModel ? false : this.state.isDragging
111
+ });
175
112
  if (updateModel) {
176
113
  onDragEnd(id, {
177
114
  points: newPoints
178
115
  });
179
116
  }
180
117
  });
181
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnDragVertex", function (e, changedIndex, updateModel) {
182
- var _this$props3 = _this.props,
183
- onDragEnd = _this$props3.onDragEnd,
184
- id = _this$props3.id;
185
- var points = _this.state.points;
186
- var newPoints = points.map(function (point, index) {
187
- return index === changedIndex ? {
188
- x: e.target.x(),
189
- y: e.target.y()
190
- } : point;
118
+ (0, _defineProperty2.default)(this, "handleOnDragVertex", (e, changedIndex, updateModel) => {
119
+ const {
120
+ onDragEnd,
121
+ id
122
+ } = this.props;
123
+ const {
124
+ points
125
+ } = this.state;
126
+ const newPoints = points.map((point, index) => index === changedIndex ? {
127
+ x: e.target.x(),
128
+ y: e.target.y()
129
+ } : point);
130
+ this.setState({
131
+ points: newPoints,
132
+ ...this.getOffset(newPoints),
133
+ isDragging: updateModel ? false : this.state.isDragging
191
134
  });
192
-
193
- _this.setState(_objectSpread(_objectSpread({
194
- points: newPoints
195
- }, _this.getOffset(newPoints)), {}, {
196
- isDragging: updateModel ? false : _this.state.isDragging
197
- }));
198
-
199
135
  if (updateModel) {
200
136
  onDragEnd(id, {
201
137
  points: newPoints
202
138
  });
203
139
  }
204
140
  });
205
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDragStart", function () {
206
- _this.setState({
141
+ (0, _defineProperty2.default)(this, "onDragStart", () => {
142
+ this.setState({
207
143
  isDragging: true
208
144
  });
209
145
  });
210
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleDelete", function (id) {
211
- var onDeleteShape = _this.props.onDeleteShape;
146
+ (0, _defineProperty2.default)(this, "handleDelete", id => {
147
+ const {
148
+ onDeleteShape
149
+ } = this.props;
212
150
  onDeleteShape(id);
213
151
  });
214
- return _this;
215
152
  }
216
-
217
- (0, _createClass2["default"])(PolComponent, [{
218
- key: "getBoundingBox",
219
- value: // serialize(points) {
220
- // return points.reduce((acc, point) => [...acc, point.x, point.y], []);
221
- // }
222
- function getBoundingBox(points) {
223
- var xValues = points.map(function (point) {
224
- return point.x;
225
- });
226
- var yValues = points.map(function (point) {
227
- return point.y;
228
- });
229
- var minX = Math.min.apply(Math, (0, _toConsumableArray2["default"])(xValues));
230
- var maxX = Math.max.apply(Math, (0, _toConsumableArray2["default"])(xValues));
231
- var minY = Math.min.apply(Math, (0, _toConsumableArray2["default"])(yValues));
232
- var maxY = Math.max.apply(Math, (0, _toConsumableArray2["default"])(yValues));
153
+ static getDerivedStateFromProps(nextProps, prevState) {
154
+ const {
155
+ id,
156
+ points,
157
+ imageHeight,
158
+ imageWidth
159
+ } = nextProps;
160
+ // we execute this code only if image dimensions changed or an hotspot was added/deleted
161
+ if (prevState.imageHeight !== imageHeight || prevState.imageWidth !== imageWidth || prevState.id !== nextProps.id || JSON.stringify(prevState.points) !== JSON.stringify(points)) {
162
+ const xList = points.map(p => p.x);
163
+ const yList = points.map(p => p.y);
164
+ const x = Math.min(...xList);
165
+ const y = Math.max(...yList);
233
166
  return {
234
- x: minX,
235
- y: minY,
236
- width: maxX - minX,
237
- height: maxY - minY
167
+ id,
168
+ x,
169
+ y,
170
+ points,
171
+ imageHeight,
172
+ imageWidth
238
173
  };
239
174
  }
240
- }, {
241
- key: "render",
242
- value: function render() {
243
- var _this2 = this;
244
-
245
- var _this$props4 = this.props,
246
- classes = _this$props4.classes,
247
- correct = _this$props4.correct,
248
- id = _this$props4.id,
249
- hotspotColor = _this$props4.hotspotColor,
250
- outlineColor = _this$props4.outlineColor,
251
- selectedHotspotColor = _this$props4.selectedHotspotColor,
252
- hoverOutlineColor = _this$props4.hoverOutlineColor,
253
- _this$props4$strokeWi = _this$props4.strokeWidth,
254
- strokeWidth = _this$props4$strokeWi === void 0 ? 5 : _this$props4$strokeWi;
255
- var _this$state = this.state,
256
- points = _this$state.points,
257
- x = _this$state.x,
258
- y = _this$state.y,
259
- hovered = _this$state.hovered;
260
- var isInProgress = id === 'newPolygon';
261
- var showPoints = hovered || id === 'newPolygon';
262
- var calculatedStrokeWidth = correct ? strokeWidth : hovered ? 1 : 0;
263
- var calculatedStroke = correct ? outlineColor : hovered ? HOVERED_COLOR : '';
264
- var boundingBox = this.getBoundingBox(points);
265
- var calculatedFill = correct && selectedHotspotColor ? selectedHotspotColor : hotspotColor;
266
- return /*#__PURE__*/_react["default"].createElement(_reactKonva.Group, {
267
- classes: classes.group,
268
- onMouseLeave: this.handleMouseLeave,
269
- onMouseEnter: this.handleMouseEnter
270
- }, hoverOutlineColor && hovered && /*#__PURE__*/_react["default"].createElement(_ReactKonvaCore.Rect, {
271
- x: boundingBox.x,
272
- y: boundingBox.y,
273
- width: boundingBox.width,
274
- height: boundingBox.height,
275
- stroke: hoverOutlineColor,
276
- strokeWidth: 2,
277
- listening: false
278
- }), /*#__PURE__*/_react["default"].createElement(_reactKonva.Line, {
279
- classes: classes.base,
280
- points: this.serialize(points),
281
- closed: !isInProgress,
282
- fill: isInProgress ? 'transparent' : calculatedFill,
283
- onClick: this.handleClick,
284
- onTap: this.handleClick,
285
- draggable: true,
286
- stroke: isInProgress ? outlineColor : calculatedStroke,
287
- strokeWidth: isInProgress ? 1 : calculatedStrokeWidth,
288
- onDragStart: this.onDragStart,
289
- onDragMove: this.handleOnDragEnd,
290
- onDragEnd: function onDragEnd(e) {
291
- return _this2.handleOnDragEnd(e, true);
292
- },
293
- x: x,
294
- y: y
295
- }), showPoints && points.map(function (point, index) {
296
- return /*#__PURE__*/_react["default"].createElement(_reactKonva.Circle, {
297
- key: index,
298
- className: classes.circle,
299
- x: point.x,
300
- y: point.y,
301
- radius: 5,
302
- fill: index === 0 && id === 'newPolygon' ? 'blue' : 'white',
303
- stroke: HOVERED_COLOR,
304
- strokeWidth: 1,
305
- onClick: _this2.handleClick,
306
- onDragStart: _this2.onDragStart,
307
- onDragMove: function onDragMove(e) {
308
- _this2.handleOnDragVertex(e, index);
309
- },
310
- onDragEnd: function onDragEnd(e) {
311
- _this2.handleOnDragVertex(e, index, true);
312
- },
313
- draggable: true
314
- });
315
- }), !this.state.isDragging && this.state.hovered && /*#__PURE__*/_react["default"].createElement(_DeleteWidget["default"], {
316
- x: x,
317
- y: y,
318
- id: id,
319
- handleWidgetClick: this.handleDelete,
320
- points: points
321
- }));
322
- }
323
- }], [{
324
- key: "getDerivedStateFromProps",
325
- value: function getDerivedStateFromProps(nextProps, prevState) {
326
- var id = nextProps.id,
327
- points = nextProps.points,
328
- imageHeight = nextProps.imageHeight,
329
- imageWidth = nextProps.imageWidth; // we execute this code only if image dimensions changed or an hotspot was added/deleted
330
-
331
- if (prevState.imageHeight !== imageHeight || prevState.imageWidth !== imageWidth || prevState.id !== nextProps.id || JSON.stringify(prevState.points) !== JSON.stringify(points)) {
332
- var xList = points.map(function (p) {
333
- return p.x;
334
- });
335
- var yList = points.map(function (p) {
336
- return p.y;
337
- });
338
- var x = Math.min.apply(Math, (0, _toConsumableArray2["default"])(xList));
339
- var y = Math.max.apply(Math, (0, _toConsumableArray2["default"])(yList));
340
- return {
341
- id: id,
342
- x: x,
343
- y: y,
344
- points: points,
345
- imageHeight: imageHeight,
346
- imageWidth: imageWidth
347
- };
348
- }
349
-
350
- return null;
351
- }
352
- }]);
353
- return PolComponent;
354
- }(_react["default"].Component);
355
-
356
- var styles = function styles() {
357
- return {
358
- base: {
359
- cursor: 'pointer',
175
+ return null;
176
+ }
177
+ // serialize(points) {
178
+ // return points.reduce((acc, point) => [...acc, point.x, point.y], []);
179
+ // }
180
+
181
+ getBoundingBox(points) {
182
+ const xValues = points.map(point => point.x);
183
+ const yValues = points.map(point => point.y);
184
+ const minX = Math.min(...xValues);
185
+ const maxX = Math.max(...xValues);
186
+ const minY = Math.min(...yValues);
187
+ const maxY = Math.max(...yValues);
188
+ return {
189
+ x: minX,
190
+ y: minY,
191
+ width: maxX - minX,
192
+ height: maxY - minY
193
+ };
194
+ }
195
+ render() {
196
+ const {
197
+ correct,
198
+ id,
199
+ hotspotColor,
200
+ outlineColor,
201
+ selectedHotspotColor,
202
+ hoverOutlineColor,
203
+ strokeWidth = 5
204
+ } = this.props;
205
+ const {
206
+ points,
207
+ x,
208
+ y,
209
+ hovered
210
+ } = this.state;
211
+ const isInProgress = id === 'newPolygon';
212
+ const showPoints = hovered || id === 'newPolygon';
213
+ const calculatedStrokeWidth = correct ? strokeWidth : hovered ? 1 : 0;
214
+ const calculatedStroke = correct ? outlineColor : hovered ? HOVERED_COLOR : '';
215
+ const boundingBox = this.getBoundingBox(points);
216
+ const calculatedFill = correct && selectedHotspotColor ? selectedHotspotColor : hotspotColor;
217
+ return /*#__PURE__*/_react.default.createElement(_reactKonva.Group, {
218
+ onMouseLeave: this.handleMouseLeave,
219
+ onMouseEnter: this.handleMouseEnter
220
+ }, hoverOutlineColor && hovered && /*#__PURE__*/_react.default.createElement(_ReactKonvaCore.Rect, {
221
+ x: boundingBox.x,
222
+ y: boundingBox.y,
223
+ width: boundingBox.width,
224
+ height: boundingBox.height,
225
+ stroke: hoverOutlineColor,
226
+ strokeWidth: 2,
227
+ listening: false
228
+ }), /*#__PURE__*/_react.default.createElement(_reactKonva.Line, {
229
+ points: this.serialize(points),
230
+ closed: !isInProgress,
231
+ fill: isInProgress ? 'transparent' : calculatedFill,
232
+ onClick: this.handleClick,
233
+ onTap: this.handleClick,
234
+ draggable: true,
235
+ stroke: isInProgress ? outlineColor : calculatedStroke,
236
+ strokeWidth: isInProgress ? 1 : calculatedStrokeWidth,
237
+ onDragStart: this.onDragStart,
238
+ onDragMove: this.handleOnDragEnd,
239
+ onDragEnd: e => this.handleOnDragEnd(e, true),
240
+ x: x,
241
+ y: y,
360
242
  opacity: 0.5
361
- },
362
- circle: {
243
+ }), showPoints && points.map((point, index) => /*#__PURE__*/_react.default.createElement(_reactKonva.Circle, {
244
+ key: index,
245
+ x: point.x,
246
+ y: point.y,
247
+ radius: 5,
248
+ fill: index === 0 && id === 'newPolygon' ? 'blue' : 'white',
249
+ stroke: HOVERED_COLOR,
250
+ strokeWidth: 1,
251
+ onClick: this.handleClick,
252
+ onDragStart: this.onDragStart,
253
+ onDragMove: e => {
254
+ this.handleOnDragVertex(e, index);
255
+ },
256
+ onDragEnd: e => {
257
+ this.handleOnDragVertex(e, index, true);
258
+ },
259
+ draggable: true,
363
260
  opacity: 4
364
- },
365
- group: {
366
- padding: '12px'
367
- }
368
- };
369
- };
370
-
261
+ })), !this.state.isDragging && this.state.hovered && /*#__PURE__*/_react.default.createElement(_DeleteWidget.default, {
262
+ x: x,
263
+ y: y,
264
+ id: id,
265
+ handleWidgetClick: this.handleDelete,
266
+ points: points
267
+ }));
268
+ }
269
+ }
371
270
  PolComponent.propTypes = {
372
- classes: _propTypes["default"].object.isRequired,
373
- correct: _propTypes["default"].bool,
374
- isDrawing: _propTypes["default"].bool.isRequired,
375
- id: _propTypes["default"].string.isRequired,
376
- imageHeight: _propTypes["default"].number,
377
- imageWidth: _propTypes["default"].number,
378
- hotspotColor: _propTypes["default"].string.isRequired,
379
- selectedHotspotColor: _propTypes["default"].string,
380
- hoverOutlineColor: _propTypes["default"].string,
381
- onClick: _propTypes["default"].func.isRequired,
382
- addPolygonPoint: _propTypes["default"].func.isRequired,
383
- onDeleteShape: _propTypes["default"].func.isRequired,
384
- onDragEnd: _propTypes["default"].func.isRequired,
385
- outlineColor: _propTypes["default"].string.isRequired,
386
- points: _propTypes["default"].arrayOf(_propTypes["default"].shape({
387
- x: _propTypes["default"].number,
388
- y: _propTypes["default"].number
271
+ correct: _propTypes.default.bool,
272
+ isDrawing: _propTypes.default.bool.isRequired,
273
+ id: _propTypes.default.string.isRequired,
274
+ imageHeight: _propTypes.default.number,
275
+ imageWidth: _propTypes.default.number,
276
+ hotspotColor: _propTypes.default.string.isRequired,
277
+ selectedHotspotColor: _propTypes.default.string,
278
+ hoverOutlineColor: _propTypes.default.string,
279
+ onClick: _propTypes.default.func.isRequired,
280
+ addPolygonPoint: _propTypes.default.func.isRequired,
281
+ onDeleteShape: _propTypes.default.func.isRequired,
282
+ onDragEnd: _propTypes.default.func.isRequired,
283
+ outlineColor: _propTypes.default.string.isRequired,
284
+ points: _propTypes.default.arrayOf(_propTypes.default.shape({
285
+ x: _propTypes.default.number,
286
+ y: _propTypes.default.number
389
287
  })).isRequired,
390
- strokeWidth: _propTypes["default"].number
288
+ strokeWidth: _propTypes.default.number
391
289
  };
392
290
  PolComponent.defaultProps = {
393
291
  correct: false
394
292
  };
395
-
396
- var _default = (0, _index.withStyles)(styles)(PolComponent);
397
-
398
- exports["default"] = _default;
399
- //# sourceMappingURL=hotspot-polygon.js.map
293
+ var _default = exports.default = PolComponent;
294
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfcmVhY3RLb252YSIsIl9SZWFjdEtvbnZhQ29yZSIsIl9EZWxldGVXaWRnZXQiLCJIT1ZFUkVEX0NPTE9SIiwiUG9sQ29tcG9uZW50IiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsInBvaW50cyIsInhMaXN0IiwibWFwIiwicCIsIngiLCJ5TGlzdCIsInkiLCJNYXRoIiwibWluIiwibWF4IiwieE9mZnNldCIsInlPZmZzZXQiLCJnZXRPZmZzZXQiLCJyZWR1Y2UiLCJhY2MiLCJwb2ludCIsImxlbmd0aCIsImlkIiwiaG92ZXJlZCIsImlzRHJhZ2dpbmciLCJnZXRJbml0aWFsU3RhdGUiLCJwcm9wcyIsImUiLCJ3aWR0aCIsImhlaWdodCIsImlzRHJhd2luZyIsIm9uQ2xpY2siLCJhZGRQb2x5Z29uUG9pbnQiLCJjYW5jZWxCdWJibGUiLCJzZXRTdGF0ZSIsImRvY3VtZW50IiwiYm9keSIsInN0eWxlIiwiY3Vyc29yIiwidXBkYXRlTW9kZWwiLCJvbkRyYWdFbmQiLCJ0YXJnZXQiLCJzZXJpYWxpemUiLCJzdGF0ZSIsIm5ld1BvaW50cyIsImN1cnJlbnRQb2ludENvb3JkaW5hdGUiLCJpbmRleCIsImNoYW5nZWRJbmRleCIsIm9uRGVsZXRlU2hhcGUiLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJuZXh0UHJvcHMiLCJwcmV2U3RhdGUiLCJpbWFnZUhlaWdodCIsImltYWdlV2lkdGgiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0Qm91bmRpbmdCb3giLCJ4VmFsdWVzIiwieVZhbHVlcyIsIm1pblgiLCJtYXhYIiwibWluWSIsIm1heFkiLCJyZW5kZXIiLCJjb3JyZWN0IiwiaG90c3BvdENvbG9yIiwib3V0bGluZUNvbG9yIiwic2VsZWN0ZWRIb3RzcG90Q29sb3IiLCJob3Zlck91dGxpbmVDb2xvciIsInN0cm9rZVdpZHRoIiwiaXNJblByb2dyZXNzIiwic2hvd1BvaW50cyIsImNhbGN1bGF0ZWRTdHJva2VXaWR0aCIsImNhbGN1bGF0ZWRTdHJva2UiLCJib3VuZGluZ0JveCIsImNhbGN1bGF0ZWRGaWxsIiwiY3JlYXRlRWxlbWVudCIsIkdyb3VwIiwib25Nb3VzZUxlYXZlIiwiaGFuZGxlTW91c2VMZWF2ZSIsIm9uTW91c2VFbnRlciIsImhhbmRsZU1vdXNlRW50ZXIiLCJSZWN0Iiwic3Ryb2tlIiwibGlzdGVuaW5nIiwiTGluZSIsImNsb3NlZCIsImZpbGwiLCJoYW5kbGVDbGljayIsIm9uVGFwIiwiZHJhZ2dhYmxlIiwib25EcmFnU3RhcnQiLCJvbkRyYWdNb3ZlIiwiaGFuZGxlT25EcmFnRW5kIiwib3BhY2l0eSIsIkNpcmNsZSIsImtleSIsInJhZGl1cyIsImhhbmRsZU9uRHJhZ1ZlcnRleCIsImhhbmRsZVdpZGdldENsaWNrIiwiaGFuZGxlRGVsZXRlIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiYm9vbCIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJudW1iZXIiLCJmdW5jIiwiYXJyYXlPZiIsInNoYXBlIiwiZGVmYXVsdFByb3BzIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2hvdHNwb3QtcG9seWdvbi5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBHcm91cCwgTGluZSwgQ2lyY2xlIH0gZnJvbSAncmVhY3Qta29udmEnO1xuaW1wb3J0IHsgUmVjdCB9IGZyb20gJ3JlYWN0LWtvbnZhL2xpYi9SZWFjdEtvbnZhQ29yZSc7XG5pbXBvcnQgRGVsZXRlV2lkZ2V0IGZyb20gJy4vRGVsZXRlV2lkZ2V0JztcblxuY29uc3QgSE9WRVJFRF9DT0xPUiA9ICcjMDBCRkZGJztcblxuY2xhc3MgUG9sQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIGNvbnN0IHsgaWQsIHBvaW50cywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGggfSA9IG5leHRQcm9wcztcbiAgICAvLyB3ZSBleGVjdXRlIHRoaXMgY29kZSBvbmx5IGlmIGltYWdlIGRpbWVuc2lvbnMgY2hhbmdlZCBvciBhbiBob3RzcG90IHdhcyBhZGRlZC9kZWxldGVkXG4gICAgaWYgKFxuICAgICAgcHJldlN0YXRlLmltYWdlSGVpZ2h0ICE9PSBpbWFnZUhlaWdodCB8fFxuICAgICAgcHJldlN0YXRlLmltYWdlV2lkdGggIT09IGltYWdlV2lkdGggfHxcbiAgICAgIHByZXZTdGF0ZS5pZCAhPT0gbmV4dFByb3BzLmlkIHx8XG4gICAgICBKU09OLnN0cmluZ2lmeShwcmV2U3RhdGUucG9pbnRzKSAhPT0gSlNPTi5zdHJpbmdpZnkocG9pbnRzKVxuICAgICkge1xuICAgICAgY29uc3QgeExpc3QgPSBwb2ludHMubWFwKChwKSA9PiBwLngpO1xuICAgICAgY29uc3QgeUxpc3QgPSBwb2ludHMubWFwKChwKSA9PiBwLnkpO1xuXG4gICAgICBjb25zdCB4ID0gTWF0aC5taW4oLi4ueExpc3QpO1xuICAgICAgY29uc3QgeSA9IE1hdGgubWF4KC4uLnlMaXN0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHBvaW50cyxcbiAgICAgICAgaW1hZ2VIZWlnaHQsXG4gICAgICAgIGltYWdlV2lkdGgsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0T2Zmc2V0ID0gKHBvaW50cykgPT4ge1xuICAgIGNvbnN0IHhMaXN0ID0gcG9pbnRzLm1hcCgocCkgPT4gcC54KTtcbiAgICBjb25zdCB5TGlzdCA9IHBvaW50cy5tYXAoKHApID0+IHAueSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogTWF0aC5taW4oLi4ueExpc3QpLFxuICAgICAgeTogTWF0aC5tYXgoLi4ueUxpc3QpLFxuICAgIH07XG4gIH07XG5cbiAgc2VyaWFsaXplID0gKHBvaW50cykgPT4ge1xuICAgIGNvbnN0IHsgeDogeE9mZnNldCwgeTogeU9mZnNldCB9ID0gdGhpcy5nZXRPZmZzZXQocG9pbnRzKTtcblxuICAgIHJldHVybiBwb2ludHMucmVkdWNlKChhY2MsIHBvaW50KSA9PiBbLi4uYWNjLCBwb2ludC54IC0geE9mZnNldCwgcG9pbnQueSAtIHlPZmZzZXRdLCBbXSk7XG4gIH07XG5cbiAgZ2V0SW5pdGlhbFN0YXRlID0gKHBvaW50cykgPT4ge1xuICAgIGlmIChwb2ludHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0T2Zmc2V0KHBvaW50cyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHBvaW50cyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiAnJyxcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgcG9pbnRzOiBbXSxcbiAgICB9O1xuICB9O1xuXG4gIHN0YXRlID0ge1xuICAgIGhvdmVyZWQ6IGZhbHNlLFxuICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgIC4uLnRoaXMuZ2V0SW5pdGlhbFN0YXRlKHRoaXMucHJvcHMucG9pbnRzKSxcbiAgfTtcblxuICBoYW5kbGVDbGljayA9IChlKSA9PiB7XG4gICAgY29uc3QgeyBwb2ludHMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeExpc3QgPSBwb2ludHMubWFwKChwKSA9PiBwLngpO1xuICAgIGNvbnN0IHlMaXN0ID0gcG9pbnRzLm1hcCgocCkgPT4gcC55KTtcblxuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoLi4ueExpc3QpIC0gTWF0aC5taW4oLi4ueExpc3QpO1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KC4uLnlMaXN0KSAtIE1hdGgubWluKC4uLnlMaXN0KTtcblxuICAgIGNvbnN0IHsgaXNEcmF3aW5nLCBvbkNsaWNrLCBpZCB9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmICh3aWR0aCA8IDAgJiYgaGVpZ2h0IDwgMCAmJiBpc0RyYXdpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNEcmF3aW5nICYmIGlkID09PSAnbmV3UG9seWdvbicpIHtcbiAgICAgIHRoaXMucHJvcHMuYWRkUG9seWdvblBvaW50KGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICBvbkNsaWNrKGlkKTtcbiAgfTtcblxuICBoYW5kbGVNb3VzZUVudGVyID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBob3ZlcmVkOiB0cnVlIH0pO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICB9O1xuXG4gIGhhbmRsZU1vdXNlTGVhdmUgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGhvdmVyZWQ6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xuICB9O1xuXG4gIGhhbmRsZU9uRHJhZ0VuZCA9IChlLCB1cGRhdGVNb2RlbCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgeyBvbkRyYWdFbmQsIGlkIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHBvaW50cyA9IGUudGFyZ2V0LnBvaW50cygpIHx8IHRoaXMuc2VyaWFsaXplKHRoaXMuc3RhdGUucG9pbnRzKTtcblxuICAgIGNvbnN0IG5ld1BvaW50cyA9IHBvaW50cy5yZWR1Y2UoKGFjYywgY3VycmVudFBvaW50Q29vcmRpbmF0ZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCAlIDIgPT09IDAgJiYgaW5kZXggKyAxIDwgcG9pbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB4OiBjdXJyZW50UG9pbnRDb29yZGluYXRlICsgZS50YXJnZXQueCgpLFxuICAgICAgICAgICAgeTogcG9pbnRzW2luZGV4ICsgMV0gKyBlLnRhcmdldC55KCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHBvaW50czogbmV3UG9pbnRzLFxuICAgICAgLi4udGhpcy5nZXRPZmZzZXQobmV3UG9pbnRzKSxcbiAgICAgIGlzRHJhZ2dpbmc6IHVwZGF0ZU1vZGVsID8gZmFsc2UgOiB0aGlzLnN0YXRlLmlzRHJhZ2dpbmcsXG4gICAgfSk7XG5cbiAgICBpZiAodXBkYXRlTW9kZWwpIHtcbiAgICAgIG9uRHJhZ0VuZChpZCwgeyBwb2ludHM6IG5ld1BvaW50cyB9KTtcbiAgICB9XG4gIH07XG5cbiAgaGFuZGxlT25EcmFnVmVydGV4ID0gKGUsIGNoYW5nZWRJbmRleCwgdXBkYXRlTW9kZWwpID0+IHtcbiAgICBjb25zdCB7IG9uRHJhZ0VuZCwgaWQgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBwb2ludHMgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBjb25zdCBuZXdQb2ludHMgPSBwb2ludHMubWFwKChwb2ludCwgaW5kZXgpID0+XG4gICAgICBpbmRleCA9PT0gY2hhbmdlZEluZGV4ID8geyB4OiBlLnRhcmdldC54KCksIHk6IGUudGFyZ2V0LnkoKSB9IDogcG9pbnQsXG4gICAgKTtcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgcG9pbnRzOiBuZXdQb2ludHMsXG4gICAgICAuLi50aGlzLmdldE9mZnNldChuZXdQb2ludHMpLFxuICAgICAgaXNEcmFnZ2luZzogdXBkYXRlTW9kZWwgPyBmYWxzZSA6IHRoaXMuc3RhdGUuaXNEcmFnZ2luZyxcbiAgICB9KTtcblxuICAgIGlmICh1cGRhdGVNb2RlbCkge1xuICAgICAgb25EcmFnRW5kKGlkLCB7IHBvaW50czogbmV3UG9pbnRzIH0pO1xuICAgIH1cbiAgfTtcblxuICBvbkRyYWdTdGFydCA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgaXNEcmFnZ2luZzogdHJ1ZSB9KTtcbiAgfTtcblxuICBoYW5kbGVEZWxldGUgPSAoaWQpID0+IHtcbiAgICBjb25zdCB7IG9uRGVsZXRlU2hhcGUgfSA9IHRoaXMucHJvcHM7XG4gICAgb25EZWxldGVTaGFwZShpZCk7XG4gIH07XG5cbiAgLy8gc2VyaWFsaXplKHBvaW50cykge1xuICAvLyAgIHJldHVybiBwb2ludHMucmVkdWNlKChhY2MsIHBvaW50KSA9PiBbLi4uYWNjLCBwb2ludC54LCBwb2ludC55XSwgW10pO1xuICAvLyB9XG5cbiAgZ2V0Qm91bmRpbmdCb3gocG9pbnRzKSB7XG4gICAgY29uc3QgeFZhbHVlcyA9IHBvaW50cy5tYXAoKHBvaW50KSA9PiBwb2ludC54KTtcbiAgICBjb25zdCB5VmFsdWVzID0gcG9pbnRzLm1hcCgocG9pbnQpID0+IHBvaW50LnkpO1xuICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbiguLi54VmFsdWVzKTtcbiAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoLi4ueFZhbHVlcyk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKC4uLnlWYWx1ZXMpO1xuICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heCguLi55VmFsdWVzKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogbWluWCxcbiAgICAgIHk6IG1pblksXG4gICAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgIH07XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29ycmVjdCxcbiAgICAgIGlkLFxuICAgICAgaG90c3BvdENvbG9yLFxuICAgICAgb3V0bGluZUNvbG9yLFxuICAgICAgc2VsZWN0ZWRIb3RzcG90Q29sb3IsXG4gICAgICBob3Zlck91dGxpbmVDb2xvcixcbiAgICAgIHN0cm9rZVdpZHRoID0gNSxcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IHsgcG9pbnRzLCB4LCB5LCBob3ZlcmVkIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGlzSW5Qcm9ncmVzcyA9IGlkID09PSAnbmV3UG9seWdvbic7XG4gICAgY29uc3Qgc2hvd1BvaW50cyA9IGhvdmVyZWQgfHwgaWQgPT09ICduZXdQb2x5Z29uJztcblxuICAgIGNvbnN0IGNhbGN1bGF0ZWRTdHJva2VXaWR0aCA9IGNvcnJlY3QgPyBzdHJva2VXaWR0aCA6IGhvdmVyZWQgPyAxIDogMDtcbiAgICBjb25zdCBjYWxjdWxhdGVkU3Ryb2tlID0gY29ycmVjdCA/IG91dGxpbmVDb2xvciA6IGhvdmVyZWQgPyBIT1ZFUkVEX0NPTE9SIDogJyc7XG4gICAgY29uc3QgYm91bmRpbmdCb3ggPSB0aGlzLmdldEJvdW5kaW5nQm94KHBvaW50cyk7XG4gICAgY29uc3QgY2FsY3VsYXRlZEZpbGwgPSBjb3JyZWN0ICYmIHNlbGVjdGVkSG90c3BvdENvbG9yID8gc2VsZWN0ZWRIb3RzcG90Q29sb3IgOiBob3RzcG90Q29sb3I7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPEdyb3VwIG9uTW91c2VMZWF2ZT17dGhpcy5oYW5kbGVNb3VzZUxlYXZlfSBvbk1vdXNlRW50ZXI9e3RoaXMuaGFuZGxlTW91c2VFbnRlcn0+XG4gICAgICAgIHtob3Zlck91dGxpbmVDb2xvciAmJiBob3ZlcmVkICYmIChcbiAgICAgICAgICA8UmVjdFxuICAgICAgICAgICAgeD17Ym91bmRpbmdCb3gueH1cbiAgICAgICAgICAgIHk9e2JvdW5kaW5nQm94Lnl9XG4gICAgICAgICAgICB3aWR0aD17Ym91bmRpbmdCb3gud2lkdGh9XG4gICAgICAgICAgICBoZWlnaHQ9e2JvdW5kaW5nQm94LmhlaWdodH1cbiAgICAgICAgICAgIHN0cm9rZT17aG92ZXJPdXRsaW5lQ29sb3J9XG4gICAgICAgICAgICBzdHJva2VXaWR0aD17Mn1cbiAgICAgICAgICAgIGxpc3RlbmluZz17ZmFsc2V9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAgPExpbmVcbiAgICAgICAgICBwb2ludHM9e3RoaXMuc2VyaWFsaXplKHBvaW50cyl9XG4gICAgICAgICAgY2xvc2VkPXshaXNJblByb2dyZXNzfVxuICAgICAgICAgIGZpbGw9e2lzSW5Qcm9ncmVzcyA/ICd0cmFuc3BhcmVudCcgOiBjYWxjdWxhdGVkRmlsbH1cbiAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZUNsaWNrfVxuICAgICAgICAgIG9uVGFwPXt0aGlzLmhhbmRsZUNsaWNrfVxuICAgICAgICAgIGRyYWdnYWJsZVxuICAgICAgICAgIHN0cm9rZT17aXNJblByb2dyZXNzID8gb3V0bGluZUNvbG9yIDogY2FsY3VsYXRlZFN0cm9rZX1cbiAgICAgICAgICBzdHJva2VXaWR0aD17aXNJblByb2dyZXNzID8gMSA6IGNhbGN1bGF0ZWRTdHJva2VXaWR0aH1cbiAgICAgICAgICBvbkRyYWdTdGFydD17dGhpcy5vbkRyYWdTdGFydH1cbiAgICAgICAgICBvbkRyYWdNb3ZlPXt0aGlzLmhhbmRsZU9uRHJhZ0VuZH1cbiAgICAgICAgICBvbkRyYWdFbmQ9eyhlKSA9PiB0aGlzLmhhbmRsZU9uRHJhZ0VuZChlLCB0cnVlKX1cbiAgICAgICAgICB4PXt4fVxuICAgICAgICAgIHk9e3l9XG4gICAgICAgICAgb3BhY2l0eT17MC41fVxuICAgICAgICAvPlxuXG4gICAgICAgIHtzaG93UG9pbnRzICYmXG4gICAgICAgICAgcG9pbnRzLm1hcCgocG9pbnQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICA8Q2lyY2xlXG4gICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgIHg9e3BvaW50Lnh9XG4gICAgICAgICAgICAgIHk9e3BvaW50Lnl9XG4gICAgICAgICAgICAgIHJhZGl1cz17NX1cbiAgICAgICAgICAgICAgZmlsbD17aW5kZXggPT09IDAgJiYgaWQgPT09ICduZXdQb2x5Z29uJyA/ICdibHVlJyA6ICd3aGl0ZSd9XG4gICAgICAgICAgICAgIHN0cm9rZT17SE9WRVJFRF9DT0xPUn1cbiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg9ezF9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2xpY2t9XG4gICAgICAgICAgICAgIG9uRHJhZ1N0YXJ0PXt0aGlzLm9uRHJhZ1N0YXJ0fVxuICAgICAgICAgICAgICBvbkRyYWdNb3ZlPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlT25EcmFnVmVydGV4KGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgb25EcmFnRW5kPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlT25EcmFnVmVydGV4KGUsIGluZGV4LCB0cnVlKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgZHJhZ2dhYmxlXG4gICAgICAgICAgICAgIG9wYWNpdHk9ezR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgICB7IXRoaXMuc3RhdGUuaXNEcmFnZ2luZyAmJiB0aGlzLnN0YXRlLmhvdmVyZWQgJiYgKFxuICAgICAgICAgIDxEZWxldGVXaWRnZXQgeD17eH0geT17eX0gaWQ9e2lkfSBoYW5kbGVXaWRnZXRDbGljaz17dGhpcy5oYW5kbGVEZWxldGV9IHBvaW50cz17cG9pbnRzfSAvPlxuICAgICAgICApfVxuICAgICAgPC9Hcm91cD5cbiAgICApO1xuICB9XG59XG5cblBvbENvbXBvbmVudC5wcm9wVHlwZXMgPSB7XG4gIGNvcnJlY3Q6IFByb3BUeXBlcy5ib29sLFxuICBpc0RyYXdpbmc6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIGltYWdlSGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBpbWFnZVdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICBob3RzcG90Q29sb3I6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgc2VsZWN0ZWRIb3RzcG90Q29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGhvdmVyT3V0bGluZUNvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBhZGRQb2x5Z29uUG9pbnQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uRGVsZXRlU2hhcGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uRHJhZ0VuZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb3V0bGluZUNvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHBvaW50czogUHJvcFR5cGVzLmFycmF5T2YoXG4gICAgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIHg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICB5OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIH0pLFxuICApLmlzUmVxdWlyZWQsXG4gIHN0cm9rZVdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxufTtcblxuUG9sQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9IHtcbiAgY29ycmVjdDogZmFsc2UsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBQb2xDb21wb25lbnQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsV0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsZUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksYUFBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsTUFBTUssYUFBYSxHQUFHLFNBQVM7QUFFL0IsTUFBTUMsWUFBWSxTQUFTQyxjQUFLLENBQUND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