@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,400 +1,365 @@
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"] = exports.Drawable = void 0;
9
-
7
+ exports.default = exports.Drawable = void 0;
10
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
-
12
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
-
14
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
-
16
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
-
18
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
19
-
20
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
21
-
22
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
23
-
24
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
25
-
26
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
27
-
28
10
  var _react = _interopRequireDefault(require("react"));
29
-
30
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
31
-
32
12
  var _reactKonva = require("react-konva");
33
-
34
13
  var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
35
-
36
- var _index = require("@material-ui/core/styles/index");
37
-
14
+ var _styles = require("@mui/material/styles");
38
15
  var _hotspotRectangle = _interopRequireDefault(require("./hotspot-rectangle"));
39
-
40
16
  var _hotspotPolygon = _interopRequireDefault(require("./hotspot-polygon"));
41
-
42
17
  var _hotspotCircle = _interopRequireDefault(require("./hotspot-circle"));
43
-
44
18
  var _utils = require("./utils");
45
-
46
- var _shapes2 = require("./shapes");
47
-
48
- 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; }
49
-
50
- 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; }
51
-
52
- 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); }; }
53
-
54
- 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; } }
55
-
56
- var IMAGE_MAX_WIDTH = 800;
57
-
58
- var Drawable = /*#__PURE__*/function (_React$Component) {
59
- (0, _inherits2["default"])(Drawable, _React$Component);
60
-
61
- var _super = _createSuper(Drawable);
62
-
63
- function Drawable(props) {
64
- var _this;
65
-
66
- (0, _classCallCheck2["default"])(this, Drawable);
67
- _this = _super.call(this, props);
68
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnMouseDown", function (e) {
69
- var _this$props = _this.props,
70
- shapeType = _this$props.shapeType,
71
- onUpdateShapes = _this$props.onUpdateShapes,
72
- shapes = _this$props.shapes;
73
- var newState, newShapeId; // Ensure that the click originated from the expected element
74
-
19
+ var _shapes = require("./shapes");
20
+ const BaseContainer = (0, _styles.styled)('div')({
21
+ position: 'relative'
22
+ });
23
+ const ImageContainer = (0, _styles.styled)('div')({
24
+ position: 'relative',
25
+ width: 'fit-content'
26
+ });
27
+ const Image = (0, _styles.styled)('img')({
28
+ alignItems: 'center',
29
+ display: 'flex',
30
+ justifyContent: 'center'
31
+ });
32
+ const ResizeHandle = (0, _styles.styled)('div')({
33
+ borderBottom: '1px solid #727272',
34
+ borderRight: '1px solid #727272',
35
+ bottom: '-10px',
36
+ cursor: 'se-resize',
37
+ height: '10px',
38
+ position: 'absolute',
39
+ right: '-10px',
40
+ width: '10px'
41
+ });
42
+ const StyledStage = (0, _styles.styled)(_reactKonva.Stage)({
43
+ left: 0,
44
+ top: 0,
45
+ position: 'absolute'
46
+ });
47
+ const IMAGE_MAX_WIDTH = 800;
48
+ class Drawable extends _react.default.Component {
49
+ static getDerivedStateFromProps(nextProps, prevState) {
50
+ // Update the state only if the props have changed
51
+ if (nextProps.shapes !== prevState.shapes) {
52
+ return {
53
+ shapes: nextProps.shapes
54
+ };
55
+ }
56
+ return null;
57
+ }
58
+ constructor(props) {
59
+ super(props);
60
+ (0, _defineProperty2.default)(this, "handleOnMouseDown", e => {
61
+ const {
62
+ shapeType,
63
+ onUpdateShapes,
64
+ shapes
65
+ } = this.props;
66
+ let newState, newShapeId;
67
+
68
+ // Ensure that the click originated from the expected element
75
69
  if (e.target !== e.currentTarget) {
76
70
  return;
77
71
  }
78
-
79
- if (!Object.values(_shapes2.SUPPORTED_SHAPES).includes(shapeType)) {
72
+ if (!Object.values(_shapes.SUPPORTED_SHAPES).includes(shapeType)) {
80
73
  return;
81
74
  }
82
-
83
75
  switch (shapeType) {
84
- case _shapes2.SUPPORTED_SHAPES.RECTANGLE:
85
- newState = _shapes2.RectangleShape.create(shapes, e);
76
+ case _shapes.SUPPORTED_SHAPES.RECTANGLE:
77
+ newState = _shapes.RectangleShape.create(shapes, e);
86
78
  break;
87
-
88
- case _shapes2.SUPPORTED_SHAPES.CIRCLE:
89
- newState = _shapes2.CircleShape.create(shapes, e);
79
+ case _shapes.SUPPORTED_SHAPES.CIRCLE:
80
+ newState = _shapes.CircleShape.create(shapes, e);
90
81
  break;
91
-
92
- case _shapes2.SUPPORTED_SHAPES.POLYGON:
93
- newShapeId = _this.state.isDrawingShapeId;
94
-
82
+ case _shapes.SUPPORTED_SHAPES.POLYGON:
83
+ newShapeId = this.state.isDrawingShapeId;
95
84
  if (newShapeId) {
96
85
  // If a polygon is in progress, add a new point
97
- var _shapes = _this.addPolygonPoint(e);
98
-
86
+ const shapes = this.addPolygonPoint(e);
99
87
  newState = {
100
88
  isDrawing: true,
101
89
  isDrawingShapeId: newShapeId,
102
- shapes: _shapes
90
+ shapes: shapes
103
91
  };
104
92
  } else {
105
93
  // Else start a new one
106
- newState = _shapes2.PolygonShape.create(shapes, e);
94
+ newState = _shapes.PolygonShape.create(shapes, e);
107
95
  }
108
-
109
96
  break;
110
-
111
97
  default:
112
98
  return;
113
99
  }
114
-
115
- _this.setState(_objectSpread({}, newState));
116
-
100
+ this.setState({
101
+ ...newState
102
+ });
117
103
  onUpdateShapes(newState.shapes);
118
104
  });
119
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnMouseUp", function () {
120
- var _this$props2 = _this.props,
121
- shapeType = _this$props2.shapeType,
122
- onUpdateShapes = _this$props2.onUpdateShapes;
123
- var newState;
124
-
125
- if (shapeType === _shapes2.SUPPORTED_SHAPES.POLYGON) {
105
+ (0, _defineProperty2.default)(this, "handleOnMouseUp", () => {
106
+ const {
107
+ shapeType,
108
+ onUpdateShapes
109
+ } = this.props;
110
+ let newState;
111
+ if (shapeType === _shapes.SUPPORTED_SHAPES.POLYGON) {
126
112
  return;
127
113
  }
128
-
129
114
  switch (shapeType) {
130
- case _shapes2.SUPPORTED_SHAPES.RECTANGLE:
131
- newState = _shapes2.RectangleShape.finalizeCreation(_this.state, _this.props);
115
+ case _shapes.SUPPORTED_SHAPES.RECTANGLE:
116
+ newState = _shapes.RectangleShape.finalizeCreation(this.state, this.props);
132
117
  break;
133
-
134
- case _shapes2.SUPPORTED_SHAPES.CIRCLE:
135
- newState = _shapes2.CircleShape.finalizeCreation(_this.state, _this.props);
118
+ case _shapes.SUPPORTED_SHAPES.CIRCLE:
119
+ newState = _shapes.CircleShape.finalizeCreation(this.state, this.props);
136
120
  break;
137
-
138
121
  default:
139
122
  return;
140
123
  }
141
-
142
- _this.setState(_objectSpread(_objectSpread({}, newState), {}, {
124
+ this.setState({
125
+ ...newState,
143
126
  isDrawing: false
144
- }));
145
-
127
+ });
146
128
  onUpdateShapes(newState.shapes);
147
129
  });
148
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleMouseMove", function (e) {
149
- var _this$props3 = _this.props,
150
- shapeType = _this$props3.shapeType,
151
- onUpdateShapes = _this$props3.onUpdateShapes;
152
- var newState;
153
-
154
- if (!_this.state.isDrawing || !Object.values(_shapes2.SUPPORTED_SHAPES).includes(shapeType)) {
130
+ (0, _defineProperty2.default)(this, "handleMouseMove", e => {
131
+ const {
132
+ shapeType,
133
+ onUpdateShapes
134
+ } = this.props;
135
+ let newState;
136
+ if (!this.state.isDrawing || !Object.values(_shapes.SUPPORTED_SHAPES).includes(shapeType)) {
155
137
  return;
156
138
  }
157
-
158
139
  switch (shapeType) {
159
- case _shapes2.SUPPORTED_SHAPES.RECTANGLE:
160
- newState = _shapes2.RectangleShape.handleMouseMove(_this.state, e);
140
+ case _shapes.SUPPORTED_SHAPES.RECTANGLE:
141
+ newState = _shapes.RectangleShape.handleMouseMove(this.state, e);
161
142
  break;
162
-
163
- case _shapes2.SUPPORTED_SHAPES.CIRCLE:
164
- newState = _shapes2.CircleShape.handleMouseMove(_this.state, e);
143
+ case _shapes.SUPPORTED_SHAPES.CIRCLE:
144
+ newState = _shapes.CircleShape.handleMouseMove(this.state, e);
165
145
  break;
166
-
167
- case _shapes2.SUPPORTED_SHAPES.POLYGON:
168
- newState = _shapes2.PolygonShape.handleMouseMove(_this.state, e);
146
+ case _shapes.SUPPORTED_SHAPES.POLYGON:
147
+ newState = _shapes.PolygonShape.handleMouseMove(this.state, e);
169
148
  break;
170
-
171
149
  default:
172
150
  return;
173
151
  }
174
-
175
- _this.setState(newState);
176
-
152
+ this.setState(newState);
177
153
  onUpdateShapes(newState.shapes);
178
154
  });
179
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnMouseOutOrLeave", function (e) {
180
- if (_this.state.isDrawing) {
181
- _this.handleOnMouseUp(e);
155
+ (0, _defineProperty2.default)(this, "handleOnMouseOutOrLeave", e => {
156
+ if (this.state.isDrawing) {
157
+ this.handleOnMouseUp(e);
182
158
  }
183
159
  });
184
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnDragEnd", function (id, updatedProps) {
185
- var _this$props4 = _this.props,
186
- shapes = _this$props4.shapes,
187
- onUpdateShapes = _this$props4.onUpdateShapes,
188
- dimensions = _this$props4.dimensions;
189
- var canvasWidth = dimensions.width,
190
- canvasHeight = dimensions.height; // when a shape is moved completely outside the canvas
160
+ (0, _defineProperty2.default)(this, "handleOnDragEnd", (id, updatedProps) => {
161
+ const {
162
+ shapes,
163
+ onUpdateShapes,
164
+ dimensions
165
+ } = this.props;
166
+ const {
167
+ width: canvasWidth,
168
+ height: canvasHeight
169
+ } = dimensions;
170
+
171
+ // when a shape is moved completely outside the canvas
191
172
  // remove that shape
192
-
193
- var newShapes = shapes.map(function (shape) {
173
+ const newShapes = shapes.map(shape => {
194
174
  if (shape.id !== id) {
195
175
  return shape;
196
176
  }
197
-
198
- var newX = updatedProps.x;
199
- var newY = updatedProps.y;
200
-
177
+ let newX = updatedProps.x;
178
+ let newY = updatedProps.y;
201
179
  if (shape.group === 'rectangles') {
202
180
  if (newX + shape.width < 0 || newX > canvasWidth || newY + shape.height < 0 || newY > canvasHeight) {
203
181
  return null;
204
182
  }
205
-
206
- return _objectSpread(_objectSpread({}, shape), updatedProps);
183
+ return {
184
+ ...shape,
185
+ ...updatedProps
186
+ };
207
187
  }
208
-
209
188
  if (shape.group === 'circles') {
210
- var radius = shape.radius;
211
-
189
+ const radius = shape.radius;
212
190
  if (newX + radius < 0 || newX - radius > canvasWidth || newY + radius < 0 || newY - radius > canvasHeight) {
213
191
  return null;
214
192
  }
215
-
216
- return _objectSpread(_objectSpread({}, shape), updatedProps);
193
+ return {
194
+ ...shape,
195
+ ...updatedProps
196
+ };
217
197
  }
218
-
219
198
  if (shape.group === 'polygons') {
220
- var points = shape.points;
221
- var xValues = points.map(function (point) {
222
- return point.x;
223
- });
224
- var yValues = points.map(function (point) {
225
- return point.y;
226
- });
227
- var minX = Math.min.apply(Math, (0, _toConsumableArray2["default"])(xValues));
228
- var minY = Math.min.apply(Math, (0, _toConsumableArray2["default"])(yValues));
229
- var maxX = Math.max.apply(Math, (0, _toConsumableArray2["default"])(xValues));
230
- var maxY = Math.max.apply(Math, (0, _toConsumableArray2["default"])(yValues)); // Calculate deltas based on the first point as a reference
231
-
232
- var deltaX = updatedProps['points'][0].x - points[0].x;
233
- var deltaY = updatedProps['points'][0].y - points[0].y;
199
+ const points = shape.points;
200
+ const xValues = points.map(point => point.x);
201
+ const yValues = points.map(point => point.y);
202
+ let minX = Math.min(...xValues);
203
+ let minY = Math.min(...yValues);
204
+ let maxX = Math.max(...xValues);
205
+ let maxY = Math.max(...yValues);
206
+
207
+ // Calculate deltas based on the first point as a reference
208
+ const deltaX = updatedProps['points'][0].x - points[0].x;
209
+ const deltaY = updatedProps['points'][0].y - points[0].y;
234
210
  minX = minX + deltaX;
235
211
  maxX = maxX + deltaX;
236
212
  minY = minY + deltaY;
237
213
  maxY = maxY + deltaY;
238
-
239
214
  if (maxX < 0 || minX > canvasWidth || maxY < 0 || minY > canvasHeight) {
240
215
  return null;
241
216
  }
242
-
243
- return _objectSpread(_objectSpread({}, shape), updatedProps);
217
+ return {
218
+ ...shape,
219
+ ...updatedProps
220
+ };
244
221
  }
245
-
246
222
  return shape;
247
- }).filter(function (shape) {
248
- return shape !== null;
249
- });
250
- onUpdateShapes((0, _cloneDeep["default"])(newShapes));
223
+ }).filter(shape => shape !== null);
224
+ onUpdateShapes((0, _cloneDeep.default)(newShapes));
251
225
  });
252
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "closeInProgressPolygons", function (id) {
253
- var _this$props5 = _this.props,
254
- shapes = _this$props5.shapes,
255
- onUpdateShapes = _this$props5.onUpdateShapes;
256
- var inProgressPolygon = (shapes || []).find(function (shape) {
257
- return shape.id === 'newPolygon';
258
- });
259
-
260
- if (id === 'newPolygon' || inProgressPolygon && _this.state.isDrawing) {
261
- _shapes2.PolygonShape.finalizeCreation(_this.state, function (newShapes) {
262
- _this.setState({
226
+ (0, _defineProperty2.default)(this, "closeInProgressPolygons", id => {
227
+ const {
228
+ shapes,
229
+ onUpdateShapes
230
+ } = this.props;
231
+ const inProgressPolygon = (shapes || []).find(shape => shape.id === 'newPolygon');
232
+ if (id === 'newPolygon' || inProgressPolygon && this.state.isDrawing) {
233
+ _shapes.PolygonShape.finalizeCreation(this.state, newShapes => {
234
+ this.setState({
263
235
  isDrawing: false,
264
236
  shapes: newShapes,
265
237
  isDrawingShapeId: undefined
266
238
  });
267
-
268
- onUpdateShapes((0, _cloneDeep["default"])(newShapes));
239
+ onUpdateShapes((0, _cloneDeep.default)(newShapes));
269
240
  });
270
241
  }
271
242
  });
272
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnSetAsCorrect", function (shape) {
273
- var id = shape.id;
274
- var _this$props6 = _this.props,
275
- multipleCorrect = _this$props6.multipleCorrect,
276
- shapes = _this$props6.shapes,
277
- onUpdateShapes = _this$props6.onUpdateShapes;
278
- var newShapes;
279
-
243
+ (0, _defineProperty2.default)(this, "handleOnSetAsCorrect", shape => {
244
+ const {
245
+ id
246
+ } = shape;
247
+ const {
248
+ multipleCorrect,
249
+ shapes,
250
+ onUpdateShapes
251
+ } = this.props;
252
+ let newShapes;
280
253
  if (multipleCorrect) {
281
- newShapes = shapes.map(function (shape) {
254
+ newShapes = shapes.map(shape => {
282
255
  if (shape.id === id) {
283
256
  shape.correct = !shape.correct;
284
257
  }
285
-
286
258
  return shape;
287
259
  });
288
260
  } else {
289
- newShapes = shapes.map(function (shape) {
261
+ newShapes = shapes.map(shape => {
290
262
  shape.correct = shape.id === id;
291
263
  return shape;
292
264
  });
293
265
  }
294
-
295
- onUpdateShapes((0, _cloneDeep["default"])(newShapes));
296
-
297
- _this.closeInProgressPolygons(id);
266
+ onUpdateShapes((0, _cloneDeep.default)(newShapes));
267
+ this.closeInProgressPolygons(id);
298
268
  });
299
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnImageLoad", function (_ref) {
300
- var target = _ref.target;
301
- var onUpdateImageDimension = _this.props.onUpdateImageDimension;
302
- var resizeHandle = _this.resize;
303
- var elementStyle = getComputedStyle(target);
304
- var newHeight = parseFloat(elementStyle.height);
305
- var newWidth = parseFloat(elementStyle.width);
306
- var aspectWidth = newWidth / IMAGE_MAX_WIDTH;
307
- var dimensions = newWidth > IMAGE_MAX_WIDTH ? {
269
+ /// end of handling HotSpots section
270
+ /// start of handling Image section
271
+ (0, _defineProperty2.default)(this, "handleOnImageLoad", ({
272
+ target
273
+ }) => {
274
+ const {
275
+ onUpdateImageDimension
276
+ } = this.props;
277
+ const resizeHandle = this.resize;
278
+ const elementStyle = getComputedStyle(target);
279
+ const newHeight = parseFloat(elementStyle.height);
280
+ const newWidth = parseFloat(elementStyle.width);
281
+ const aspectWidth = newWidth / IMAGE_MAX_WIDTH;
282
+ const dimensions = newWidth > IMAGE_MAX_WIDTH ? {
308
283
  height: newHeight / aspectWidth,
309
284
  width: IMAGE_MAX_WIDTH
310
285
  } : {
311
286
  height: newHeight,
312
287
  width: newWidth
313
288
  };
314
-
315
- _this.setState({
316
- dimensions: dimensions
317
- }, function () {
318
- return onUpdateImageDimension(dimensions);
319
- });
320
-
321
- resizeHandle.addEventListener('mousedown', _this.initialiseResize, false);
289
+ this.setState({
290
+ dimensions
291
+ }, () => onUpdateImageDimension(dimensions));
292
+ resizeHandle.addEventListener('mousedown', this.initialiseResize, false);
322
293
  });
323
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "initialiseResize", function () {
324
- window.addEventListener('mousemove', _this.startResizing, false);
325
- window.addEventListener('mouseup', _this.stopResizing, false);
294
+ (0, _defineProperty2.default)(this, "initialiseResize", () => {
295
+ window.addEventListener('mousemove', this.startResizing, false);
296
+ window.addEventListener('mouseup', this.stopResizing, false);
326
297
  });
327
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "startResizing", function (e) {
328
- var bounds = e.target.getBoundingClientRect();
329
- var box = _this.image;
330
- var _this$props7 = _this.props,
331
- disableDrag = _this$props7.disableDrag,
332
- preserveAspectRatioEnabled = _this$props7.preserveAspectRatioEnabled,
333
- dimensions = _this$props7.dimensions,
334
- shapes = _this$props7.shapes;
335
-
336
- var _updateImageDimension = (0, _utils.updateImageDimensions)(dimensions, {
298
+ (0, _defineProperty2.default)(this, "startResizing", e => {
299
+ const bounds = e.target.getBoundingClientRect();
300
+ const box = this.image;
301
+ const {
302
+ disableDrag,
303
+ preserveAspectRatioEnabled,
304
+ dimensions,
305
+ shapes
306
+ } = this.props;
307
+ const {
308
+ width,
309
+ height
310
+ } = (0, _utils.updateImageDimensions)(dimensions, {
337
311
  width: e.clientX - bounds.left,
338
312
  height: e.clientY - bounds.top
339
- }, preserveAspectRatioEnabled),
340
- width = _updateImageDimension.width,
341
- height = _updateImageDimension.height;
342
-
343
- var resizeValid = _this.checkIfResizeValid(width, height);
344
-
345
- var hasMinimumWidth = width > 150 && height > 150;
346
-
313
+ }, preserveAspectRatioEnabled);
314
+ const resizeValid = this.checkIfResizeValid(width, height);
315
+ const hasMinimumWidth = width > 150 && height > 150;
347
316
  if (resizeValid && hasMinimumWidth && box) {
348
- box.style.width = "".concat(width, "px");
349
- box.style.height = "".concat(height, "px");
350
-
351
- _this.setState({
317
+ box.style.width = `${width}px`;
318
+ box.style.height = `${height}px`;
319
+ this.setState({
352
320
  resizing: true,
353
321
  dimensions: {
354
322
  height: height,
355
323
  width: width
356
324
  },
357
325
  stateShapes: (0, _utils.getUpdatedShapes)(dimensions, {
358
- width: width,
359
- height: height
326
+ width,
327
+ height
360
328
  }, shapes)
361
329
  });
362
330
  }
363
-
364
331
  disableDrag();
365
332
  });
366
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "stopResizing", function () {
367
- var _this$props8 = _this.props,
368
- enableDrag = _this$props8.enableDrag,
369
- onUpdateImageDimension = _this$props8.onUpdateImageDimension,
370
- onUpdateShapes = _this$props8.onUpdateShapes;
371
- var _this$state = _this.state,
372
- dimensions = _this$state.dimensions,
373
- stateShapes = _this$state.stateShapes;
333
+ (0, _defineProperty2.default)(this, "stopResizing", () => {
334
+ const {
335
+ enableDrag,
336
+ onUpdateImageDimension,
337
+ onUpdateShapes
338
+ } = this.props;
339
+ const {
340
+ dimensions,
341
+ stateShapes
342
+ } = this.state;
374
343
  enableDrag();
375
-
376
344
  if (stateShapes) {
377
- onUpdateShapes((0, _cloneDeep["default"])(stateShapes));
345
+ onUpdateShapes((0, _cloneDeep.default)(stateShapes));
378
346
  }
379
-
380
347
  onUpdateImageDimension(dimensions);
381
- window.removeEventListener('mousemove', _this.startResizing, false);
382
- window.removeEventListener('mouseup', _this.stopResizing, false);
383
-
384
- _this.setState({
348
+ window.removeEventListener('mousemove', this.startResizing, false);
349
+ window.removeEventListener('mouseup', this.stopResizing, false);
350
+ this.setState({
385
351
  resizing: false,
386
352
  stateShapes: false
387
353
  });
388
354
  });
389
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "deleteShape", function (id) {
390
- _this.setState({
355
+ (0, _defineProperty2.default)(this, "deleteShape", id => {
356
+ this.setState({
391
357
  isDrawing: false,
392
358
  isDrawingShapeId: undefined
393
359
  });
394
-
395
- _this.props.onDeleteShape(id);
360
+ this.props.onDeleteShape(id);
396
361
  });
397
- _this.state = {
362
+ this.state = {
398
363
  isDrawing: false,
399
364
  stateShapes: false,
400
365
  resizing: false,
@@ -405,227 +370,150 @@ var Drawable = /*#__PURE__*/function (_React$Component) {
405
370
  width: 0
406
371
  }
407
372
  };
408
- return _this;
409
373
  }
410
-
411
- (0, _createClass2["default"])(Drawable, [{
412
- key: "addPolygonPoint",
413
- value: function addPolygonPoint(e) {
414
- var _this2 = this;
415
-
416
- var _PolygonShape$addPoin = _shapes2.PolygonShape.addPoint(this.state, e, function (newShapes) {
417
- _this2.setState({
418
- isDrawing: false,
419
- shapes: newShapes,
420
- isDrawingShapeId: undefined
421
- });
422
-
423
- _this2.props.onUpdateShapes(newShapes);
424
- }),
425
- shapes = _PolygonShape$addPoin.shapes;
426
-
427
- return shapes;
428
- }
429
- }, {
430
- key: "checkIfResizeValid",
431
- value: function checkIfResizeValid(x, y) {
432
- var shapes = this.state.shapes;
433
- var drawable = true; // Do not allow resizing over the hotspots
434
-
435
- shapes && shapes.forEach(function (shape) {
436
- var right = shape.x + shape.width + 5;
437
- var bottom = shape.y + shape.height + 5;
438
-
439
- if (x <= right || y <= bottom) {
440
- drawable = false;
441
- }
374
+ addPolygonPoint(e) {
375
+ const {
376
+ shapes
377
+ } = _shapes.PolygonShape.addPoint(this.state, e, newShapes => {
378
+ this.setState({
379
+ isDrawing: false,
380
+ shapes: newShapes,
381
+ isDrawingShapeId: undefined
442
382
  });
443
- return drawable;
444
- }
445
- }, {
446
- key: "render",
447
- value: /// end of handling Image section
448
- function render() {
449
- var _this3 = this;
450
-
451
- var _this$props9 = this.props,
452
- classes = _this$props9.classes,
453
- imageUrl = _this$props9.imageUrl,
454
- _this$props9$dimensio = _this$props9.dimensions,
455
- height = _this$props9$dimensio.height,
456
- width = _this$props9$dimensio.width,
457
- hotspotColor = _this$props9.hotspotColor,
458
- outlineColor = _this$props9.outlineColor,
459
- shapes = _this$props9.shapes,
460
- strokeWidth = _this$props9.strokeWidth,
461
- hoverOutlineColor = _this$props9.hoverOutlineColor,
462
- selectedHotspotColor = _this$props9.selectedHotspotColor;
463
- var _this$state2 = this.state,
464
- stateShapes = _this$state2.stateShapes,
465
- isDrawing = _this$state2.isDrawing,
466
- _this$state2$dimensio = _this$state2.dimensions,
467
- heightFromState = _this$state2$dimensio.height,
468
- widthFromState = _this$state2$dimensio.width;
469
- var shapesToUse = stateShapes || shapes;
470
- return /*#__PURE__*/_react["default"].createElement("div", {
471
- className: classes.base
472
- }, imageUrl && /*#__PURE__*/_react["default"].createElement("div", {
473
- className: classes.imageContainer
474
- }, /*#__PURE__*/_react["default"].createElement("img", (0, _extends2["default"])({
475
- className: classes.image,
476
- onLoad: this.handleOnImageLoad,
477
- ref: function ref(_ref2) {
478
- _this3.image = _ref2;
479
- },
480
- src: imageUrl
481
- }, height && width ? {
482
- style: {
483
- height: height,
484
- width: width
485
- }
486
- } : {})), /*#__PURE__*/_react["default"].createElement("div", {
487
- ref: function ref(_ref3) {
488
- _this3.resize = _ref3;
489
- },
490
- className: classes.resize
491
- })), /*#__PURE__*/_react["default"].createElement(_reactKonva.Stage, {
492
- className: classes.stage,
493
- height: heightFromState || height,
494
- width: widthFromState || width,
495
- onMouseDown: this.handleOnMouseDown,
496
- onMouseUp: this.handleOnMouseUp,
497
- onMouseMove: this.handleMouseMove,
498
- onContentMouseOut: this.handleOnMouseOutOrLeave,
499
- onContentMouseLeave: this.handleOnMouseOutOrLeave
500
- }, /*#__PURE__*/_react["default"].createElement(_reactKonva.Layer, null, shapesToUse.map(function (shape, i) {
501
- var Tag;
502
-
503
- switch (shape.group) {
504
- case _shapes2.SHAPE_GROUPS.RECTANGLES:
505
- Tag = _hotspotRectangle["default"];
506
- break;
507
-
508
- case _shapes2.SHAPE_GROUPS.CIRCLES:
509
- Tag = _hotspotCircle["default"];
510
- break;
511
-
512
- case _shapes2.SHAPE_GROUPS.POLYGONS:
513
- Tag = _hotspotPolygon["default"];
514
- break;
515
-
516
- default:
517
- return null;
518
- }
519
-
520
- return /*#__PURE__*/_react["default"].createElement(Tag, (0, _extends2["default"])({}, shape.group === _shapes2.SHAPE_GROUPS.CIRCLES ? {
521
- radius: shape.radius
522
- } : {}, shape.group === _shapes2.SHAPE_GROUPS.RECTANGLES ? {
523
- height: shape.height,
524
- width: shape.width
525
- } : {}, shape.group === _shapes2.SHAPE_GROUPS.POLYGONS ? {
526
- points: shape.points,
527
- addPolygonPoint: function addPolygonPoint(e) {
528
- return _this3.addPolygonPoint(e);
529
- }
530
- } : {}, {
531
- correct: shape.correct,
532
- isDrawing: isDrawing,
533
- hotspotColor: hotspotColor,
534
- hoverOutlineColor: hoverOutlineColor,
535
- selectedHotspotColor: selectedHotspotColor,
536
- id: shape.id,
537
- key: i,
538
- onClick: function onClick() {
539
- return _this3.handleOnSetAsCorrect(shape);
540
- },
541
- onDragEnd: _this3.handleOnDragEnd,
542
- onDeleteShape: _this3.deleteShape,
543
- outlineColor: outlineColor,
544
- width: shape.width,
545
- x: shape.x,
546
- y: shape.y,
547
- strokeWidth: strokeWidth,
548
- imageHeight: heightFromState || height,
549
- imageWidth: widthFromState || width
550
- }, shape.group === 'polygons' ? {
551
- addPolygonPoint: function addPolygonPoint(e) {
552
- return _this3.addPolygonPoint(e);
553
- }
554
- } : {}));
555
- }))));
556
- }
557
- }], [{
558
- key: "getDerivedStateFromProps",
559
- value: function getDerivedStateFromProps(nextProps, prevState) {
560
- // Update the state only if the props have changed
561
- if (nextProps.shapes !== prevState.shapes) {
562
- return {
563
- shapes: nextProps.shapes
564
- };
383
+ this.props.onUpdateShapes(newShapes);
384
+ });
385
+ return shapes;
386
+ }
387
+ checkIfResizeValid(x, y) {
388
+ const {
389
+ shapes
390
+ } = this.state;
391
+ let drawable = true;
392
+
393
+ // Do not allow resizing over the hotspots
394
+ shapes && shapes.forEach(shape => {
395
+ const right = shape.x + shape.width + 5;
396
+ const bottom = shape.y + shape.height + 5;
397
+ if (x <= right || y <= bottom) {
398
+ drawable = false;
565
399
  }
400
+ });
401
+ return drawable;
402
+ }
403
+ /// end of handling Image section
566
404
 
567
- return null;
568
- }
569
- }]);
570
- return Drawable;
571
- }(_react["default"].Component);
572
-
405
+ render() {
406
+ const {
407
+ imageUrl,
408
+ dimensions: {
409
+ height,
410
+ width
411
+ },
412
+ hotspotColor,
413
+ outlineColor,
414
+ shapes,
415
+ strokeWidth,
416
+ hoverOutlineColor,
417
+ selectedHotspotColor
418
+ } = this.props;
419
+ const {
420
+ stateShapes,
421
+ isDrawing,
422
+ dimensions: {
423
+ height: heightFromState,
424
+ width: widthFromState
425
+ }
426
+ } = this.state;
427
+ const shapesToUse = stateShapes || shapes;
428
+ return /*#__PURE__*/_react.default.createElement(BaseContainer, null, imageUrl && /*#__PURE__*/_react.default.createElement(ImageContainer, null, /*#__PURE__*/_react.default.createElement(Image, (0, _extends2.default)({
429
+ onLoad: this.handleOnImageLoad,
430
+ ref: ref => {
431
+ this.image = ref;
432
+ },
433
+ src: imageUrl
434
+ }, height && width ? {
435
+ style: {
436
+ height,
437
+ width
438
+ }
439
+ } : {})), /*#__PURE__*/_react.default.createElement(ResizeHandle, {
440
+ ref: ref => {
441
+ this.resize = ref;
442
+ }
443
+ })), /*#__PURE__*/_react.default.createElement(StyledStage, {
444
+ height: heightFromState || height,
445
+ width: widthFromState || width,
446
+ onMouseDown: this.handleOnMouseDown,
447
+ onMouseUp: this.handleOnMouseUp,
448
+ onMouseMove: this.handleMouseMove,
449
+ onContentMouseOut: this.handleOnMouseOutOrLeave,
450
+ onContentMouseLeave: this.handleOnMouseOutOrLeave
451
+ }, /*#__PURE__*/_react.default.createElement(_reactKonva.Layer, null, shapesToUse.map((shape, i) => {
452
+ let Tag;
453
+ switch (shape.group) {
454
+ case _shapes.SHAPE_GROUPS.RECTANGLES:
455
+ Tag = _hotspotRectangle.default;
456
+ break;
457
+ case _shapes.SHAPE_GROUPS.CIRCLES:
458
+ Tag = _hotspotCircle.default;
459
+ break;
460
+ case _shapes.SHAPE_GROUPS.POLYGONS:
461
+ Tag = _hotspotPolygon.default;
462
+ break;
463
+ default:
464
+ return null;
465
+ }
466
+ return /*#__PURE__*/_react.default.createElement(Tag, (0, _extends2.default)({}, shape.group === _shapes.SHAPE_GROUPS.CIRCLES ? {
467
+ radius: shape.radius
468
+ } : {}, shape.group === _shapes.SHAPE_GROUPS.RECTANGLES ? {
469
+ height: shape.height,
470
+ width: shape.width
471
+ } : {}, shape.group === _shapes.SHAPE_GROUPS.POLYGONS ? {
472
+ points: shape.points,
473
+ addPolygonPoint: e => this.addPolygonPoint(e)
474
+ } : {}, {
475
+ correct: shape.correct,
476
+ isDrawing: isDrawing,
477
+ hotspotColor: hotspotColor,
478
+ hoverOutlineColor: hoverOutlineColor,
479
+ selectedHotspotColor: selectedHotspotColor,
480
+ id: shape.id,
481
+ key: i,
482
+ onClick: () => this.handleOnSetAsCorrect(shape),
483
+ onDragEnd: this.handleOnDragEnd,
484
+ onDeleteShape: this.deleteShape,
485
+ outlineColor: outlineColor,
486
+ width: shape.width,
487
+ x: shape.x,
488
+ y: shape.y,
489
+ strokeWidth: strokeWidth,
490
+ imageHeight: heightFromState || height,
491
+ imageWidth: widthFromState || width
492
+ }, shape.group === 'polygons' ? {
493
+ addPolygonPoint: e => this.addPolygonPoint(e)
494
+ } : {}));
495
+ }))));
496
+ }
497
+ }
573
498
  exports.Drawable = Drawable;
574
-
575
- var styles = function styles() {
576
- return {
577
- base: {
578
- position: 'relative'
579
- },
580
- image: {
581
- alignItems: 'center',
582
- display: 'flex',
583
- justifyContent: 'center'
584
- },
585
- imageContainer: {
586
- position: 'relative',
587
- width: 'fit-content'
588
- },
589
- resize: {
590
- borderBottom: '1px solid #727272',
591
- borderRight: '1px solid #727272',
592
- bottom: '-10px',
593
- cursor: 'se-resize',
594
- height: '10px',
595
- position: 'absolute',
596
- right: '-10px',
597
- width: '10px'
598
- },
599
- stage: {
600
- left: 0,
601
- top: 0,
602
- position: 'absolute'
603
- }
604
- };
605
- };
606
-
607
499
  Drawable.propTypes = {
608
- classes: _propTypes["default"].object.isRequired,
609
- disableDrag: _propTypes["default"].func.isRequired,
610
- dimensions: _propTypes["default"].object.isRequired,
611
- enableDrag: _propTypes["default"].func.isRequired,
612
- shapeType: _propTypes["default"].oneOf(Object.values(_shapes2.SUPPORTED_SHAPES)),
613
- imageUrl: _propTypes["default"].string.isRequired,
614
- handleFinishDrawing: _propTypes["default"].func.isRequired,
615
- hotspotColor: _propTypes["default"].string.isRequired,
616
- selectedHotspotColor: _propTypes["default"].string,
617
- hoverOutlineColor: _propTypes["default"].string,
618
- multipleCorrect: _propTypes["default"].bool.isRequired,
619
- onUpdateImageDimension: _propTypes["default"].func.isRequired,
620
- onUpdateShapes: _propTypes["default"].func.isRequired,
621
- onDeleteShape: _propTypes["default"].func.isRequired,
622
- outlineColor: _propTypes["default"].string.isRequired,
623
- shapes: _propTypes["default"].array.isRequired,
624
- strokeWidth: _propTypes["default"].number,
625
- preserveAspectRatioEnabled: _propTypes["default"].bool
500
+ disableDrag: _propTypes.default.func.isRequired,
501
+ dimensions: _propTypes.default.object.isRequired,
502
+ enableDrag: _propTypes.default.func.isRequired,
503
+ shapeType: _propTypes.default.oneOf(Object.values(_shapes.SUPPORTED_SHAPES)),
504
+ imageUrl: _propTypes.default.string.isRequired,
505
+ handleFinishDrawing: _propTypes.default.func.isRequired,
506
+ hotspotColor: _propTypes.default.string.isRequired,
507
+ selectedHotspotColor: _propTypes.default.string,
508
+ hoverOutlineColor: _propTypes.default.string,
509
+ multipleCorrect: _propTypes.default.bool.isRequired,
510
+ onUpdateImageDimension: _propTypes.default.func.isRequired,
511
+ onUpdateShapes: _propTypes.default.func.isRequired,
512
+ onDeleteShape: _propTypes.default.func.isRequired,
513
+ outlineColor: _propTypes.default.string.isRequired,
514
+ shapes: _propTypes.default.array.isRequired,
515
+ strokeWidth: _propTypes.default.number,
516
+ preserveAspectRatioEnabled: _propTypes.default.bool
626
517
  };
627
-
628
- var _default = (0, _index.withStyles)(styles)(Drawable);
629
-
630
- exports["default"] = _default;
631
- //# sourceMappingURL=hotspot-drawable.js.map
518
+ var _default = exports.default = Drawable;
519
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfcmVhY3RLb252YSIsIl9jbG9uZURlZXAiLCJfc3R5bGVzIiwiX2hvdHNwb3RSZWN0YW5nbGUiLCJfaG90c3BvdFBvbHlnb24iLCJfaG90c3BvdENpcmNsZSIsIl91dGlscyIsIl9zaGFwZXMiLCJCYXNlQ29udGFpbmVyIiwic3R5bGVkIiwicG9zaXRpb24iLCJJbWFnZUNvbnRhaW5lciIsIndpZHRoIiwiSW1hZ2UiLCJhbGlnbkl0ZW1zIiwiZGlzcGxheSIsImp1c3RpZnlDb250ZW50IiwiUmVzaXplSGFuZGxlIiwiYm9yZGVyQm90dG9tIiwiYm9yZGVyUmlnaHQiLCJib3R0b20iLCJjdXJzb3IiLCJoZWlnaHQiLCJyaWdodCIsIlN0eWxlZFN0YWdlIiwiU3RhZ2UiLCJsZWZ0IiwidG9wIiwiSU1BR0VfTUFYX1dJRFRIIiwiRHJhd2FibGUiLCJSZWFjdCIsIkNvbXBvbmVudCIsImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyIsIm5leHRQcm9wcyIsInByZXZTdGF0ZSIsInNoYXBlcyIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImUiLCJzaGFwZVR5cGUiLCJvblVwZGF0ZVNoYXBlcyIsIm5ld1N0YXRlIiwibmV3U2hhcGVJZCIsInRhcmdldCIsImN1cnJlbnRUYXJnZXQiLCJPYmplY3QiLCJ2YWx1ZXMiLCJTVVBQT1JURURfU0hBUEVTIiwiaW5jbHVkZXMiLCJSRUNUQU5HTEUiLCJSZWN0YW5nbGVTaGFwZSIsImNyZWF0ZSIsIkNJUkNMRSIsIkNpcmNsZVNoYXBlIiwiUE9MWUdPTiIsInN0YXRlIiwiaXNEcmF3aW5nU2hhcGVJZCIsImFkZFBvbHlnb25Qb2ludCIsImlzRHJhd2luZyIsIlBvbHlnb25TaGFwZSIsInNldFN0YXRlIiwiZmluYWxpemVDcmVhdGlvbiIsImhhbmRsZU1vdXNlTW92ZSIsImhhbmRsZU9uTW91c2VVcCIsImlkIiwidXBkYXRlZFByb3BzIiwiZGltZW5zaW9ucyIsImNhbnZhc1dpZHRoIiwiY2FudmFzSGVpZ2h0IiwibmV3U2hhcGVzIiwibWFwIiwic2hhcGUiLCJuZXdYIiwieCIsIm5ld1kiLCJ5IiwiZ3JvdXAiLCJyYWRpdXMiLCJwb2ludHMiLCJ4VmFsdWVzIiwicG9pbnQiLCJ5VmFsdWVzIiwibWluWCIsIk1hdGgiLCJtaW4iLCJtaW5ZIiwibWF4WCIsIm1heCIsIm1heFkiLCJkZWx0YVgiLCJkZWx0YVkiLCJmaWx0ZXIiLCJjbG9uZURlZXAiLCJpblByb2dyZXNzUG9seWdvbiIsImZpbmQiLCJ1bmRlZmluZWQiLCJtdWx0aXBsZUNvcnJlY3QiLCJjb3JyZWN0IiwiY2xvc2VJblByb2dyZXNzUG9seWdvbnMiLCJvblVwZGF0ZUltYWdlRGltZW5zaW9uIiwicmVzaXplSGFuZGxlIiwicmVzaXplIiwiZWxlbWVudFN0eWxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm5ld0hlaWdodCIsInBhcnNlRmxvYXQiLCJuZXdXaWR0aCIsImFzcGVjdFdpZHRoIiwiYWRkRXZlbnRMaXN0ZW5lciIsImluaXRpYWxpc2VSZXNpemUiLCJ3aW5kb3ciLCJzdGFydFJlc2l6aW5nIiwic3RvcFJlc2l6aW5nIiwiYm91bmRzIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiYm94IiwiaW1hZ2UiLCJkaXNhYmxlRHJhZyIsInByZXNlcnZlQXNwZWN0UmF0aW9FbmFibGVkIiwidXBkYXRlSW1hZ2VEaW1lbnNpb25zIiwiY2xpZW50WCIsImNsaWVudFkiLCJyZXNpemVWYWxpZCIsImNoZWNrSWZSZXNpemVWYWxpZCIsImhhc01pbmltdW1XaWR0aCIsInN0eWxlIiwicmVzaXppbmciLCJzdGF0ZVNoYXBlcyIsImdldFVwZGF0ZWRTaGFwZXMiLCJlbmFibGVEcmFnIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uRGVsZXRlU2hhcGUiLCJ0ZW1wb3JhcnlQb2x5Z29uIiwiYWRkUG9pbnQiLCJkcmF3YWJsZSIsImZvckVhY2giLCJyZW5kZXIiLCJpbWFnZVVybCIsImhvdHNwb3RDb2xvciIsIm91dGxpbmVDb2xvciIsInN0cm9rZVdpZHRoIiwiaG92ZXJPdXRsaW5lQ29sb3IiLCJzZWxlY3RlZEhvdHNwb3RDb2xvciIsImhlaWdodEZyb21TdGF0ZSIsIndpZHRoRnJvbVN0YXRlIiwic2hhcGVzVG9Vc2UiLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwib25Mb2FkIiwiaGFuZGxlT25JbWFnZUxvYWQiLCJyZWYiLCJzcmMiLCJvbk1vdXNlRG93biIsImhhbmRsZU9uTW91c2VEb3duIiwib25Nb3VzZVVwIiwib25Nb3VzZU1vdmUiLCJvbkNvbnRlbnRNb3VzZU91dCIsImhhbmRsZU9uTW91c2VPdXRPckxlYXZlIiwib25Db250ZW50TW91c2VMZWF2ZSIsIkxheWVyIiwiaSIsIlRhZyIsIlNIQVBFX0dST1VQUyIsIlJFQ1RBTkdMRVMiLCJSZWN0YW5nbGUiLCJDSVJDTEVTIiwiQ2lyY2xlIiwiUE9MWUdPTlMiLCJQb2x5Z29uIiwia2V5Iiwib25DbGljayIsImhhbmRsZU9uU2V0QXNDb3JyZWN0Iiwib25EcmFnRW5kIiwiaGFuZGxlT25EcmFnRW5kIiwiZGVsZXRlU2hhcGUiLCJpbWFnZUhlaWdodCIsImltYWdlV2lkdGgiLCJleHBvcnRzIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiZnVuYyIsImlzUmVxdWlyZWQiLCJvYmplY3QiLCJvbmVPZiIsInN0cmluZyIsImhhbmRsZUZpbmlzaERyYXdpbmciLCJib29sIiwiYXJyYXkiLCJudW1iZXIiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9ob3RzcG90LWRyYXdhYmxlLmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IExheWVyLCBTdGFnZSB9IGZyb20gJ3JlYWN0LWtvbnZhJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbXVpL21hdGVyaWFsL3N0eWxlcyc7XG5cbmltcG9ydCBSZWN0YW5nbGUgZnJvbSAnLi9ob3RzcG90LXJlY3RhbmdsZSc7XG5pbXBvcnQgUG9seWdvbiBmcm9tICcuL2hvdHNwb3QtcG9seWdvbic7XG5pbXBvcnQgQ2lyY2xlIGZyb20gJy4vaG90c3BvdC1jaXJjbGUnO1xuaW1wb3J0IHsgZ2V0VXBkYXRlZFNoYXBlcywgdXBkYXRlSW1hZ2VEaW1lbnNpb25zIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBSZWN0YW5nbGVTaGFwZSwgQ2lyY2xlU2hhcGUsIFBvbHlnb25TaGFwZSwgU1VQUE9SVEVEX1NIQVBFUywgU0hBUEVfR1JPVVBTIH0gZnJvbSAnLi9zaGFwZXMnO1xuXG5jb25zdCBCYXNlQ29udGFpbmVyID0gc3R5bGVkKCdkaXYnKSh7XG4gIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxufSk7XG5cbmNvbnN0IEltYWdlQ29udGFpbmVyID0gc3R5bGVkKCdkaXYnKSh7XG4gIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICB3aWR0aDogJ2ZpdC1jb250ZW50Jyxcbn0pO1xuXG5jb25zdCBJbWFnZSA9IHN0eWxlZCgnaW1nJykoe1xuICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG59KTtcblxuY29uc3QgUmVzaXplSGFuZGxlID0gc3R5bGVkKCdkaXYnKSh7XG4gIGJvcmRlckJvdHRvbTogJzFweCBzb2xpZCAjNzI3MjcyJyxcbiAgYm9yZGVyUmlnaHQ6ICcxcHggc29saWQgIzcyNzI3MicsXG4gIGJvdHRvbTogJy0xMHB4JyxcbiAgY3Vyc29yOiAnc2UtcmVzaXplJyxcbiAgaGVpZ2h0OiAnMTBweCcsXG4gIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICByaWdodDogJy0xMHB4JyxcbiAgd2lkdGg6ICcxMHB4Jyxcbn0pO1xuXG5jb25zdCBTdHlsZWRTdGFnZSA9IHN0eWxlZChTdGFnZSkoe1xuICBsZWZ0OiAwLFxuICB0b3A6IDAsXG4gIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxufSk7XG5cbmNvbnN0IElNQUdFX01BWF9XSURUSCA9IDgwMDtcblxuZXhwb3J0IGNsYXNzIERyYXdhYmxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIC8vIFVwZGF0ZSB0aGUgc3RhdGUgb25seSBpZiB0aGUgcHJvcHMgaGF2ZSBjaGFuZ2VkXG4gICAgaWYgKG5leHRQcm9wcy5zaGFwZXMgIT09IHByZXZTdGF0ZS5zaGFwZXMpIHtcbiAgICAgIHJldHVybiB7IHNoYXBlczogbmV4dFByb3BzLnNoYXBlcyB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNEcmF3aW5nOiBmYWxzZSxcbiAgICAgIHN0YXRlU2hhcGVzOiBmYWxzZSxcbiAgICAgIHJlc2l6aW5nOiBmYWxzZSxcbiAgICAgIHRlbXBvcmFyeVBvbHlnb246IG51bGwsXG4gICAgICBzaGFwZXM6IFtdLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaGFuZGxlT25Nb3VzZURvd24gPSAoZSkgPT4ge1xuICAgIGNvbnN0IHsgc2hhcGVUeXBlLCBvblVwZGF0ZVNoYXBlcywgc2hhcGVzIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCBuZXdTdGF0ZSwgbmV3U2hhcGVJZDtcblxuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBjbGljayBvcmlnaW5hdGVkIGZyb20gdGhlIGV4cGVjdGVkIGVsZW1lbnRcbiAgICBpZiAoZS50YXJnZXQgIT09IGUuY3VycmVudFRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghT2JqZWN0LnZhbHVlcyhTVVBQT1JURURfU0hBUEVTKS5pbmNsdWRlcyhzaGFwZVR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChzaGFwZVR5cGUpIHtcbiAgICAgIGNhc2UgU1VQUE9SVEVEX1NIQVBFUy5SRUNUQU5HTEU6XG4gICAgICAgIG5ld1N0YXRlID0gUmVjdGFuZ2xlU2hhcGUuY3JlYXRlKHNoYXBlcywgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTVVBQT1JURURfU0hBUEVTLkNJUkNMRTpcbiAgICAgICAgbmV3U3RhdGUgPSBDaXJjbGVTaGFwZS5jcmVhdGUoc2hhcGVzLCBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNVUFBPUlRFRF9TSEFQRVMuUE9MWUdPTjpcbiAgICAgICAgbmV3U2hhcGVJZCA9IHRoaXMuc3RhdGUuaXNEcmF3aW5nU2hhcGVJZDtcblxuICAgICAgICBpZiAobmV3U2hhcGVJZCkge1xuICAgICAgICAgIC8vIElmIGEgcG9seWdvbiBpcyBpbiBwcm9ncmVzcywgYWRkIGEgbmV3IHBvaW50XG4gICAgICAgICAgY29uc3Qgc2hhcGVzID0gdGhpcy5hZGRQb2x5Z29uUG9pbnQoZSk7XG5cbiAgICAgICAgICBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgIGlzRHJhd2luZzogdHJ1ZSxcbiAgICAgICAgICAgIGlzRHJhd2luZ1NoYXBlSWQ6IG5ld1NoYXBlSWQsXG4gICAgICAgICAgICBzaGFwZXM6IHNoYXBlcyxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEVsc2Ugc3RhcnQgYSBuZXcgb25lXG4gICAgICAgICAgbmV3U3RhdGUgPSBQb2x5Z29uU2hhcGUuY3JlYXRlKHNoYXBlcywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAuLi5uZXdTdGF0ZSxcbiAgICB9KTtcblxuICAgIG9uVXBkYXRlU2hhcGVzKG5ld1N0YXRlLnNoYXBlcyk7XG4gIH07XG5cbiAgYWRkUG9seWdvblBvaW50KGUpIHtcbiAgICBjb25zdCB7IHNoYXBlcyB9ID0gUG9seWdvblNoYXBlLmFkZFBvaW50KHRoaXMuc3RhdGUsIGUsIChuZXdTaGFwZXMpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0RyYXdpbmc6IGZhbHNlLFxuICAgICAgICBzaGFwZXM6IG5ld1NoYXBlcyxcbiAgICAgICAgaXNEcmF3aW5nU2hhcGVJZDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucHJvcHMub25VcGRhdGVTaGFwZXMobmV3U2hhcGVzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaGFwZXM7XG4gIH1cblxuICBoYW5kbGVPbk1vdXNlVXAgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzaGFwZVR5cGUsIG9uVXBkYXRlU2hhcGVzIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCBuZXdTdGF0ZTtcblxuICAgIGlmIChzaGFwZVR5cGUgPT09IFNVUFBPUlRFRF9TSEFQRVMuUE9MWUdPTikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc2hhcGVUeXBlKSB7XG4gICAgICBjYXNlIFNVUFBPUlRFRF9TSEFQRVMuUkVDVEFOR0xFOlxuICAgICAgICBuZXdTdGF0ZSA9IFJlY3RhbmdsZVNoYXBlLmZpbmFsaXplQ3JlYXRpb24odGhpcy5zdGF0ZSwgdGhpcy5wcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTVVBQT1JURURfU0hBUEVTLkNJUkNMRTpcbiAgICAgICAgbmV3U3RhdGUgPSBDaXJjbGVTaGFwZS5maW5hbGl6ZUNyZWF0aW9uKHRoaXMuc3RhdGUsIHRoaXMucHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgaXNEcmF3aW5nOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIG9uVXBkYXRlU2hhcGVzKG5ld1N0YXRlLnNoYXBlcyk7XG4gIH07XG5cbiAgaGFuZGxlTW91c2VNb3ZlID0gKGUpID0+IHtcbiAgICBjb25zdCB7IHNoYXBlVHlwZSwgb25VcGRhdGVTaGFwZXMgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IG5ld1N0YXRlO1xuXG4gICAgaWYgKCF0aGlzLnN0YXRlLmlzRHJhd2luZyB8fCAhT2JqZWN0LnZhbHVlcyhTVVBQT1JURURfU0hBUEVTKS5pbmNsdWRlcyhzaGFwZVR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChzaGFwZVR5cGUpIHtcbiAgICAgIGNhc2UgU1VQUE9SVEVEX1NIQVBFUy5SRUNUQU5HTEU6XG4gICAgICAgIG5ld1N0YXRlID0gUmVjdGFuZ2xlU2hhcGUuaGFuZGxlTW91c2VNb3ZlKHRoaXMuc3RhdGUsIGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU1VQUE9SVEVEX1NIQVBFUy5DSVJDTEU6XG4gICAgICAgIG5ld1N0YXRlID0gQ2lyY2xlU2hhcGUuaGFuZGxlTW91c2VNb3ZlKHRoaXMuc3RhdGUsIGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU1VQUE9SVEVEX1NIQVBFUy5QT0xZR09OOlxuICAgICAgICBuZXdTdGF0ZSA9IFBvbHlnb25TaGFwZS5oYW5kbGVNb3VzZU1vdmUodGhpcy5zdGF0ZSwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIG9uVXBkYXRlU2hhcGVzKG5ld1N0YXRlLnNoYXBlcyk7XG4gIH07XG5cbiAgaGFuZGxlT25Nb3VzZU91dE9yTGVhdmUgPSAoZSkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmlzRHJhd2luZykge1xuICAgICAgdGhpcy5oYW5kbGVPbk1vdXNlVXAoZSk7XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZU9uRHJhZ0VuZCA9IChpZCwgdXBkYXRlZFByb3BzKSA9PiB7XG4gICAgY29uc3QgeyBzaGFwZXMsIG9uVXBkYXRlU2hhcGVzLCBkaW1lbnNpb25zIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgd2lkdGg6IGNhbnZhc1dpZHRoLCBoZWlnaHQ6IGNhbnZhc0hlaWdodCB9ID0gZGltZW5zaW9ucztcblxuICAgIC8vIHdoZW4gYSBzaGFwZSBpcyBtb3ZlZCBjb21wbGV0ZWx5IG91dHNpZGUgdGhlIGNhbnZhc1xuICAgIC8vIHJlbW92ZSB0aGF0IHNoYXBlXG4gICAgY29uc3QgbmV3U2hhcGVzID0gc2hhcGVzXG4gICAgICAubWFwKChzaGFwZSkgPT4ge1xuICAgICAgICBpZiAoc2hhcGUuaWQgIT09IGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5ld1ggPSB1cGRhdGVkUHJvcHMueDtcbiAgICAgICAgbGV0IG5ld1kgPSB1cGRhdGVkUHJvcHMueTtcblxuICAgICAgICBpZiAoc2hhcGUuZ3JvdXAgPT09ICdyZWN0YW5nbGVzJykge1xuICAgICAgICAgIGlmIChuZXdYICsgc2hhcGUud2lkdGggPCAwIHx8IG5ld1ggPiBjYW52YXNXaWR0aCB8fCBuZXdZICsgc2hhcGUuaGVpZ2h0IDwgMCB8fCBuZXdZID4gY2FudmFzSGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4geyAuLi5zaGFwZSwgLi4udXBkYXRlZFByb3BzIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hhcGUuZ3JvdXAgPT09ICdjaXJjbGVzJykge1xuICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IHNoYXBlLnJhZGl1cztcbiAgICAgICAgICBpZiAobmV3WCArIHJhZGl1cyA8IDAgfHwgbmV3WCAtIHJhZGl1cyA+IGNhbnZhc1dpZHRoIHx8IG5ld1kgKyByYWRpdXMgPCAwIHx8IG5ld1kgLSByYWRpdXMgPiBjYW52YXNIZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7IC4uLnNoYXBlLCAuLi51cGRhdGVkUHJvcHMgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaGFwZS5ncm91cCA9PT0gJ3BvbHlnb25zJykge1xuICAgICAgICAgIGNvbnN0IHBvaW50cyA9IHNoYXBlLnBvaW50cztcbiAgICAgICAgICBjb25zdCB4VmFsdWVzID0gcG9pbnRzLm1hcCgocG9pbnQpID0+IHBvaW50LngpO1xuICAgICAgICAgIGNvbnN0IHlWYWx1ZXMgPSBwb2ludHMubWFwKChwb2ludCkgPT4gcG9pbnQueSk7XG5cbiAgICAgICAgICBsZXQgbWluWCA9IE1hdGgubWluKC4uLnhWYWx1ZXMpO1xuICAgICAgICAgIGxldCBtaW5ZID0gTWF0aC5taW4oLi4ueVZhbHVlcyk7XG4gICAgICAgICAgbGV0IG1heFggPSBNYXRoLm1heCguLi54VmFsdWVzKTtcbiAgICAgICAgICBsZXQgbWF4WSA9IE1hdGgubWF4KC4uLnlWYWx1ZXMpO1xuXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIGRlbHRhcyBiYXNlZCBvbiB0aGUgZmlyc3QgcG9pbnQgYXMgYSByZWZlcmVuY2VcbiAgICAgICAgICBjb25zdCBkZWx0YVggPSB1cGRhdGVkUHJvcHNbJ3BvaW50cyddWzBdLnggLSBwb2ludHNbMF0ueDtcbiAgICAgICAgICBjb25zdCBkZWx0YVkgPSB1cGRhdGVkUHJvcHNbJ3BvaW50cyddWzBdLnkgLSBwb2ludHNbMF0ueTtcblxuICAgICAgICAgIG1pblggPSBtaW5YICsgZGVsdGFYO1xuICAgICAgICAgIG1heFggPSBtYXhYICsgZGVsdGFYO1xuICAgICAgICAgIG1pblkgPSBtaW5ZICsgZGVsdGFZO1xuICAgICAgICAgIG1heFkgPSBtYXhZICsgZGVsdGFZO1xuXG4gICAgICAgICAgaWYgKG1heFggPCAwIHx8IG1pblggPiBjYW52YXNXaWR0aCB8fCBtYXhZIDwgMCB8fCBtaW5ZID4gY2FudmFzSGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4geyAuLi5zaGFwZSwgLi4udXBkYXRlZFByb3BzIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2hhcGU7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoc2hhcGUpID0+IHNoYXBlICE9PSBudWxsKTtcblxuICAgIG9uVXBkYXRlU2hhcGVzKGNsb25lRGVlcChuZXdTaGFwZXMpKTtcbiAgfTtcblxuICBjbG9zZUluUHJvZ3Jlc3NQb2x5Z29ucyA9IChpZCkgPT4ge1xuICAgIGNvbnN0IHsgc2hhcGVzLCBvblVwZGF0ZVNoYXBlcyB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IGluUHJvZ3Jlc3NQb2x5Z29uID0gKHNoYXBlcyB8fCBbXSkuZmluZCgoc2hhcGUpID0+IHNoYXBlLmlkID09PSAnbmV3UG9seWdvbicpO1xuICAgIGlmIChpZCA9PT0gJ25ld1BvbHlnb24nIHx8IChpblByb2dyZXNzUG9seWdvbiAmJiB0aGlzLnN0YXRlLmlzRHJhd2luZykpIHtcbiAgICAgIFBvbHlnb25TaGFwZS5maW5hbGl6ZUNyZWF0aW9uKHRoaXMuc3RhdGUsIChuZXdTaGFwZXMpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNEcmF3aW5nOiBmYWxzZSxcbiAgICAgICAgICBzaGFwZXM6IG5ld1NoYXBlcyxcbiAgICAgICAgICBpc0RyYXdpbmdTaGFwZUlkOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uVXBkYXRlU2hhcGVzKGNsb25lRGVlcChuZXdTaGFwZXMpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU9uU2V0QXNDb3JyZWN0ID0gKHNoYXBlKSA9PiB7XG4gICAgY29uc3QgeyBpZCB9ID0gc2hhcGU7XG4gICAgY29uc3QgeyBtdWx0aXBsZUNvcnJlY3QsIHNoYXBlcywgb25VcGRhdGVTaGFwZXMgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBsZXQgbmV3U2hhcGVzO1xuXG4gICAgaWYgKG11bHRpcGxlQ29ycmVjdCkge1xuICAgICAgbmV3U2hhcGVzID0gc2hhcGVzLm1hcCgoc2hhcGUpID0+IHtcbiAgICAgICAgaWYgKHNoYXBlLmlkID09PSBpZCkge1xuICAgICAgICAgIHNoYXBlLmNvcnJlY3QgPSAhc2hhcGUuY29ycmVjdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2hhcGU7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3U2hhcGVzID0gc2hhcGVzLm1hcCgoc2hhcGUpID0+IHtcbiAgICAgICAgc2hhcGUuY29ycmVjdCA9IHNoYXBlLmlkID09PSBpZDtcbiAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25VcGRhdGVTaGFwZXMoY2xvbmVEZWVwKG5ld1NoYXBlcykpO1xuXG4gICAgdGhpcy5jbG9zZUluUHJvZ3Jlc3NQb2x5Z29ucyhpZCk7XG4gIH07XG4gIC8vLyBlbmQgb2YgaGFuZGxpbmcgSG90U3BvdHMgc2VjdGlvblxuXG4gIC8vLyBzdGFydCBvZiBoYW5kbGluZyBJbWFnZSBzZWN0aW9uXG4gIGhhbmRsZU9uSW1hZ2VMb2FkID0gKHsgdGFyZ2V0IH0pID0+IHtcbiAgICBjb25zdCB7IG9uVXBkYXRlSW1hZ2VEaW1lbnNpb24gfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgcmVzaXplSGFuZGxlID0gdGhpcy5yZXNpemU7XG4gICAgY29uc3QgZWxlbWVudFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xuICAgIGNvbnN0IG5ld0hlaWdodCA9IHBhcnNlRmxvYXQoZWxlbWVudFN0eWxlLmhlaWdodCk7XG4gICAgY29uc3QgbmV3V2lkdGggPSBwYXJzZUZsb2F0KGVsZW1lbnRTdHlsZS53aWR0aCk7XG4gICAgY29uc3QgYXNwZWN0V2lkdGggPSBuZXdXaWR0aCAvIElNQUdFX01BWF9XSURUSDtcblxuICAgIGNvbnN0IGRpbWVuc2lvbnMgPVxuICAgICAgbmV3V2lkdGggPiBJTUFHRV9NQVhfV0lEVEhcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBoZWlnaHQ6IG5ld0hlaWdodCAvIGFzcGVjdFdpZHRoLFxuICAgICAgICAgICAgd2lkdGg6IElNQUdFX01BWF9XSURUSCxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgaGVpZ2h0OiBuZXdIZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogbmV3V2lkdGgsXG4gICAgICAgICAgfTtcblxuICAgIHRoaXMuc2V0U3RhdGUoeyBkaW1lbnNpb25zIH0sICgpID0+IG9uVXBkYXRlSW1hZ2VEaW1lbnNpb24oZGltZW5zaW9ucykpO1xuXG4gICAgcmVzaXplSGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaW5pdGlhbGlzZVJlc2l6ZSwgZmFsc2UpO1xuICB9O1xuXG4gIGluaXRpYWxpc2VSZXNpemUgPSAoKSA9PiB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuc3RhcnRSZXNpemluZywgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5zdG9wUmVzaXppbmcsIGZhbHNlKTtcbiAgfTtcblxuICBjaGVja0lmUmVzaXplVmFsaWQoeCwgeSkge1xuICAgIGNvbnN0IHsgc2hhcGVzIH0gPSB0aGlzLnN0YXRlO1xuICAgIGxldCBkcmF3YWJsZSA9IHRydWU7XG5cbiAgICAvLyBEbyBub3QgYWxsb3cgcmVzaXppbmcgb3ZlciB0aGUgaG90c3BvdHNcbiAgICBzaGFwZXMgJiZcbiAgICAgIHNoYXBlcy5mb3JFYWNoKChzaGFwZSkgPT4ge1xuICAgICAgICBjb25zdCByaWdodCA9IHNoYXBlLnggKyBzaGFwZS53aWR0aCArIDU7XG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHNoYXBlLnkgKyBzaGFwZS5oZWlnaHQgKyA1O1xuICAgICAgICBpZiAoeCA8PSByaWdodCB8fCB5IDw9IGJvdHRvbSkge1xuICAgICAgICAgIGRyYXdhYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiBkcmF3YWJsZTtcbiAgfVxuXG4gIHN0YXJ0UmVzaXppbmcgPSAoZSkgPT4ge1xuICAgIGNvbnN0IGJvdW5kcyA9IGUudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGJveCA9IHRoaXMuaW1hZ2U7XG4gICAgY29uc3QgeyBkaXNhYmxlRHJhZywgcHJlc2VydmVBc3BlY3RSYXRpb0VuYWJsZWQsIGRpbWVuc2lvbnMsIHNoYXBlcyB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdXBkYXRlSW1hZ2VEaW1lbnNpb25zKFxuICAgICAgZGltZW5zaW9ucyxcbiAgICAgIHtcbiAgICAgICAgd2lkdGg6IGUuY2xpZW50WCAtIGJvdW5kcy5sZWZ0LFxuICAgICAgICBoZWlnaHQ6IGUuY2xpZW50WSAtIGJvdW5kcy50b3AsXG4gICAgICB9LFxuICAgICAgcHJlc2VydmVBc3BlY3RSYXRpb0VuYWJsZWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc2l6ZVZhbGlkID0gdGhpcy5jaGVja0lmUmVzaXplVmFsaWQod2lkdGgsIGhlaWdodCk7XG4gICAgY29uc3QgaGFzTWluaW11bVdpZHRoID0gd2lkdGggPiAxNTAgJiYgaGVpZ2h0ID4gMTUwO1xuXG4gICAgaWYgKHJlc2l6ZVZhbGlkICYmIGhhc01pbmltdW1XaWR0aCAmJiBib3gpIHtcbiAgICAgIGJveC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgIGJveC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgcmVzaXppbmc6IHRydWUsXG4gICAgICAgIGRpbWVuc2lvbnM6IHsgaGVpZ2h0OiBoZWlnaHQsIHdpZHRoOiB3aWR0aCB9LFxuICAgICAgICBzdGF0ZVNoYXBlczogZ2V0VXBkYXRlZFNoYXBlcyhkaW1lbnNpb25zLCB7IHdpZHRoLCBoZWlnaHQgfSwgc2hhcGVzKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGRpc2FibGVEcmFnKCk7XG4gIH07XG5cbiAgc3RvcFJlc2l6aW5nID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgZW5hYmxlRHJhZywgb25VcGRhdGVJbWFnZURpbWVuc2lvbiwgb25VcGRhdGVTaGFwZXMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBkaW1lbnNpb25zLCBzdGF0ZVNoYXBlcyB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGVuYWJsZURyYWcoKTtcblxuICAgIGlmIChzdGF0ZVNoYXBlcykge1xuICAgICAgb25VcGRhdGVTaGFwZXMoY2xvbmVEZWVwKHN0YXRlU2hhcGVzKSk7XG4gICAgfVxuXG4gICAgb25VcGRhdGVJbWFnZURpbWVuc2lvbihkaW1lbnNpb25zKTtcblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLnN0YXJ0UmVzaXppbmcsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuc3RvcFJlc2l6aW5nLCBmYWxzZSk7XG5cbiAgICB0aGlzLnNldFN0YXRlKHsgcmVzaXppbmc6IGZhbHNlLCBzdGF0ZVNoYXBlczogZmFsc2UgfSk7XG4gIH07XG5cbiAgZGVsZXRlU2hhcGUgPSAoaWQpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzRHJhd2luZzogZmFsc2UsXG4gICAgICBpc0RyYXdpbmdTaGFwZUlkOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9wcy5vbkRlbGV0ZVNoYXBlKGlkKTtcbiAgfTtcblxuICAvLy8gZW5kIG9mIGhhbmRsaW5nIEltYWdlIHNlY3Rpb25cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW1hZ2VVcmwsXG4gICAgICBkaW1lbnNpb25zOiB7IGhlaWdodCwgd2lkdGggfSxcbiAgICAgIGhvdHNwb3RDb2xvcixcbiAgICAgIG91dGxpbmVDb2xvcixcbiAgICAgIHNoYXBlcyxcbiAgICAgIHN0cm9rZVdpZHRoLFxuICAgICAgaG92ZXJPdXRsaW5lQ29sb3IsXG4gICAgICBzZWxlY3RlZEhvdHNwb3RDb2xvcixcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IHtcbiAgICAgIHN0YXRlU2hhcGVzLFxuICAgICAgaXNEcmF3aW5nLFxuICAgICAgZGltZW5zaW9uczogeyBoZWlnaHQ6IGhlaWdodEZyb21TdGF0ZSwgd2lkdGg6IHdpZHRoRnJvbVN0YXRlIH0sXG4gICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3Qgc2hhcGVzVG9Vc2UgPSBzdGF0ZVNoYXBlcyB8fCBzaGFwZXM7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPEJhc2VDb250YWluZXI+XG4gICAgICAgIHtpbWFnZVVybCAmJiAoXG4gICAgICAgICAgPEltYWdlQ29udGFpbmVyPlxuICAgICAgICAgICAgPEltYWdlXG4gICAgICAgICAgICAgIG9uTG9hZD17dGhpcy5oYW5kbGVPbkltYWdlTG9hZH1cbiAgICAgICAgICAgICAgcmVmPXsocmVmKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWFnZSA9IHJlZjtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgc3JjPXtpbWFnZVVybH1cbiAgICAgICAgICAgICAgey4uLihoZWlnaHQgJiYgd2lkdGggPyB7IHN0eWxlOiB7IGhlaWdodCwgd2lkdGggfSB9IDoge30pfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxSZXNpemVIYW5kbGVcbiAgICAgICAgICAgICAgcmVmPXsocmVmKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemUgPSByZWY7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvSW1hZ2VDb250YWluZXI+XG4gICAgICAgICl9XG5cbiAgICAgICAgPFN0eWxlZFN0YWdlXG4gICAgICAgICAgaGVpZ2h0PXtoZWlnaHRGcm9tU3RhdGUgfHwgaGVpZ2h0fVxuICAgICAgICAgIHdpZHRoPXt3aWR0aEZyb21TdGF0ZSB8fCB3aWR0aH1cbiAgICAgICAgICBvbk1vdXNlRG93bj17dGhpcy5oYW5kbGVPbk1vdXNlRG93bn1cbiAgICAgICAgICBvbk1vdXNlVXA9e3RoaXMuaGFuZGxlT25Nb3VzZVVwfVxuICAgICAgICAgIG9uTW91c2VNb3ZlPXt0aGlzLmhhbmRsZU1vdXNlTW92ZX1cbiAgICAgICAgICBvbkNvbnRlbnRNb3VzZU91dD17dGhpcy5oYW5kbGVPbk1vdXNlT3V0T3JMZWF2ZX1cbiAgICAgICAgICBvbkNvbnRlbnRNb3VzZUxlYXZlPXt0aGlzLmhhbmRsZU9uTW91c2VPdXRPckxlYXZlfVxuICAgICAgICA+XG4gICAgICAgICAgPExheWVyPlxuICAgICAgICAgICAge3NoYXBlc1RvVXNlLm1hcCgoc2hhcGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgbGV0IFRhZztcbiAgICAgICAgICAgICAgc3dpdGNoIChzaGFwZS5ncm91cCkge1xuICAgICAgICAgICAgICAgIGNhc2UgU0hBUEVfR1JPVVBTLlJFQ1RBTkdMRVM6XG4gICAgICAgICAgICAgICAgICBUYWcgPSBSZWN0YW5nbGU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFNIQVBFX0dST1VQUy5DSVJDTEVTOlxuICAgICAgICAgICAgICAgICAgVGFnID0gQ2lyY2xlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBTSEFQRV9HUk9VUFMuUE9MWUdPTlM6XG4gICAgICAgICAgICAgICAgICBUYWcgPSBQb2x5Z29uO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8VGFnXG4gICAgICAgICAgICAgICAgICB7Li4uKHNoYXBlLmdyb3VwID09PSBTSEFQRV9HUk9VUFMuQ0lSQ0xFUyA/IHsgcmFkaXVzOiBzaGFwZS5yYWRpdXMgfSA6IHt9KX1cbiAgICAgICAgICAgICAgICAgIHsuLi4oc2hhcGUuZ3JvdXAgPT09IFNIQVBFX0dST1VQUy5SRUNUQU5HTEVTID8geyBoZWlnaHQ6IHNoYXBlLmhlaWdodCwgd2lkdGg6IHNoYXBlLndpZHRoIH0gOiB7fSl9XG4gICAgICAgICAgICAgICAgICB7Li4uKHNoYXBlLmdyb3VwID09PSBTSEFQRV9HUk9VUFMuUE9MWUdPTlNcbiAgICAgICAgICAgICAgICAgICAgPyB7IHBvaW50czogc2hhcGUucG9pbnRzLCBhZGRQb2x5Z29uUG9pbnQ6IChlKSA9PiB0aGlzLmFkZFBvbHlnb25Qb2ludChlKSB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pfVxuICAgICAgICAgICAgICAgICAgY29ycmVjdD17c2hhcGUuY29ycmVjdH1cbiAgICAgICAgICAgICAgICAgIGlzRHJhd2luZz17aXNEcmF3aW5nfVxuICAgICAgICAgICAgICAgICAgaG90c3BvdENvbG9yPXtob3RzcG90Q29sb3J9XG4gICAgICAgICAgICAgICAgICBob3Zlck91dGxpbmVDb2xvcj17aG92ZXJPdXRsaW5lQ29sb3J9XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEhvdHNwb3RDb2xvcj17c2VsZWN0ZWRIb3RzcG90Q29sb3J9XG4gICAgICAgICAgICAgICAgICBpZD17c2hhcGUuaWR9XG4gICAgICAgICAgICAgICAgICBrZXk9e2l9XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLmhhbmRsZU9uU2V0QXNDb3JyZWN0KHNoYXBlKX1cbiAgICAgICAgICAgICAgICAgIG9uRHJhZ0VuZD17dGhpcy5oYW5kbGVPbkRyYWdFbmR9XG4gICAgICAgICAgICAgICAgICBvbkRlbGV0ZVNoYXBlPXt0aGlzLmRlbGV0ZVNoYXBlfVxuICAgICAgICAgICAgICAgICAgb3V0bGluZUNvbG9yPXtvdXRsaW5lQ29sb3J9XG4gICAgICAgICAgICAgICAgICB3aWR0aD17c2hhcGUud2lkdGh9XG4gICAgICAgICAgICAgICAgICB4PXtzaGFwZS54fVxuICAgICAgICAgICAgICAgICAgeT17c2hhcGUueX1cbiAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoPXtzdHJva2VXaWR0aH1cbiAgICAgICAgICAgICAgICAgIGltYWdlSGVpZ2h0PXtoZWlnaHRGcm9tU3RhdGUgfHwgaGVpZ2h0fVxuICAgICAgICAgICAgICAgICAgaW1hZ2VXaWR0aD17d2lkdGhGcm9tU3RhdGUgfHwgd2lkdGh9XG4gICAgICAgICAgICAgICAgICB7Li4uKHNoYXBlLmdyb3VwID09PSAncG9seWdvbnMnID8geyBhZGRQb2x5Z29uUG9pbnQ6IChlKSA9PiB0aGlzLmFkZFBvbHlnb25Qb2ludChlKSB9IDoge30pfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L0xheWVyPlxuICAgICAgICA8L1N0eWxlZFN0YWdlPlxuICAgICAgPC9CYXNlQ29udGFpbmVyPlxuICAgICk7XG4gIH1cbn1cblxuRHJhd2FibGUucHJvcFR5cGVzID0ge1xuICBkaXNhYmxlRHJhZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgZGltZW5zaW9uczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICBlbmFibGVEcmFnOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBzaGFwZVR5cGU6IFByb3BUeXBlcy5vbmVPZihPYmplY3QudmFsdWVzKFNVUFBPUlRFRF9TSEFQRVMpKSxcbiAgaW1hZ2VVcmw6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgaGFuZGxlRmluaXNoRHJhd2luZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaG90c3BvdENvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHNlbGVjdGVkSG90c3BvdENvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBob3Zlck91dGxpbmVDb2xvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgbXVsdGlwbGVDb3JyZWN0OiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBvblVwZGF0ZUltYWdlRGltZW5zaW9uOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBvblVwZGF0ZVNoYXBlczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25EZWxldGVTaGFwZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb3V0bGluZUNvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHNoYXBlczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIHN0cm9rZVdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICBwcmVzZXJ2ZUFzcGVjdFJhdGlvRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBEcmF3YWJsZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsV0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsVUFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBSixPQUFBO0FBRUEsSUFBQUssaUJBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElB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