@pie-lib/graphing 3.2.0-next.0 → 3.2.0-next.2

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 (113) hide show
  1. package/lib/__tests__/bg.test.js +282 -0
  2. package/lib/__tests__/coordinates-label.test.js +276 -0
  3. package/lib/__tests__/graph-with-controls.test.js +275 -0
  4. package/lib/__tests__/graph.test.js +927 -0
  5. package/lib/__tests__/grid-setup.test.js +729 -0
  6. package/lib/__tests__/grid.test.js +29 -0
  7. package/lib/__tests__/key-legend.test.js +321 -0
  8. package/lib/__tests__/label-svg-icon.test.js +373 -0
  9. package/lib/__tests__/labels.test.js +61 -0
  10. package/lib/__tests__/mark-label.test.js +133 -0
  11. package/lib/__tests__/toggle-bar.test.js +197 -0
  12. package/lib/__tests__/tool-menu.test.js +151 -0
  13. package/lib/__tests__/undo-redo.test.js +31 -0
  14. package/lib/__tests__/use-debounce.test.js +24 -0
  15. package/lib/__tests__/utils.js +70 -0
  16. package/lib/__tests__/utils.test.js +123 -0
  17. package/lib/axis/__tests__/arrow.test.js +60 -0
  18. package/lib/axis/__tests__/axes.test.js +195 -0
  19. package/lib/axis/arrow.js +1 -1
  20. package/lib/axis/axes.js +1 -1
  21. package/lib/axis/index.js +1 -1
  22. package/lib/bg.js +1 -1
  23. package/lib/container/__tests__/actions.test.js +108 -0
  24. package/lib/container/__tests__/index.test.js +503 -0
  25. package/lib/container/__tests__/marks.test.js +259 -0
  26. package/lib/container/__tests__/middleware.test.js +244 -0
  27. package/lib/container/__tests__/reducer.test.js +450 -0
  28. package/lib/container/actions.js +1 -1
  29. package/lib/container/index.js +1 -1
  30. package/lib/container/marks.js +1 -1
  31. package/lib/container/middleware.js +1 -1
  32. package/lib/container/reducer.js +1 -1
  33. package/lib/coordinates-label.js +1 -1
  34. package/lib/graph-with-controls.js +1 -1
  35. package/lib/graph.js +1 -1
  36. package/lib/grid-setup.js +1 -1
  37. package/lib/grid.js +1 -1
  38. package/lib/index.js +1 -1
  39. package/lib/key-legend.js +1 -1
  40. package/lib/label-svg-icon.js +1 -1
  41. package/lib/labels.js +1 -1
  42. package/lib/mark-label.js +1 -1
  43. package/lib/toggle-bar.js +1 -1
  44. package/lib/tool-menu.js +1 -1
  45. package/lib/tools/absolute/__tests__/component.test.js +65 -0
  46. package/lib/tools/absolute/component.js +1 -1
  47. package/lib/tools/absolute/index.js +1 -1
  48. package/lib/tools/circle/__tests__/bg-circle.test.js +33 -0
  49. package/lib/tools/circle/__tests__/component.test.js +615 -0
  50. package/lib/tools/circle/__tests__/index.test.js +576 -0
  51. package/lib/tools/circle/bg-circle.js +1 -1
  52. package/lib/tools/circle/component.js +1 -1
  53. package/lib/tools/circle/index.js +1 -1
  54. package/lib/tools/exponential/__tests__/component.test.js +64 -0
  55. package/lib/tools/exponential/__tests__/index.test.js +828 -0
  56. package/lib/tools/exponential/component.js +1 -1
  57. package/lib/tools/exponential/index.js +1 -1
  58. package/lib/tools/index.js +1 -1
  59. package/lib/tools/line/__tests__/component.test.js +45 -0
  60. package/lib/tools/line/component.js +1 -1
  61. package/lib/tools/line/index.js +1 -1
  62. package/lib/tools/parabola/__tests__/component.test.js +64 -0
  63. package/lib/tools/parabola/__tests__/index.test.js +564 -0
  64. package/lib/tools/parabola/component.js +1 -1
  65. package/lib/tools/parabola/index.js +1 -1
  66. package/lib/tools/point/__tests__/component.test.js +434 -0
  67. package/lib/tools/point/__tests__/index.test.js +262 -0
  68. package/lib/tools/point/component.js +1 -1
  69. package/lib/tools/point/index.js +1 -1
  70. package/lib/tools/polygon/__tests__/component.test.js +485 -0
  71. package/lib/tools/polygon/__tests__/index.test.js +303 -0
  72. package/lib/tools/polygon/__tests__/line.test.js +50 -0
  73. package/lib/tools/polygon/__tests__/polygon.test.js +85 -0
  74. package/lib/tools/polygon/component.js +1 -1
  75. package/lib/tools/polygon/index.js +1 -1
  76. package/lib/tools/polygon/line.js +1 -1
  77. package/lib/tools/polygon/polygon.js +1 -1
  78. package/lib/tools/ray/__tests__/component.test.js +35 -0
  79. package/lib/tools/ray/component.js +1 -1
  80. package/lib/tools/ray/index.js +1 -1
  81. package/lib/tools/segment/__tests__/component.test.js +35 -0
  82. package/lib/tools/segment/component.js +1 -1
  83. package/lib/tools/segment/index.js +1 -1
  84. package/lib/tools/shared/__tests__/arrow-head.test.js +45 -0
  85. package/lib/tools/shared/arrow-head.js +1 -1
  86. package/lib/tools/shared/icons/CorrectSVG.js +1 -1
  87. package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
  88. package/lib/tools/shared/icons/MissingSVG.js +1 -1
  89. package/lib/tools/shared/line/__tests__/index.test.js +124 -0
  90. package/lib/tools/shared/line/__tests__/line-path.test.js +62 -0
  91. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +90 -0
  92. package/lib/tools/shared/line/index.js +1 -1
  93. package/lib/tools/shared/line/line-path.js +1 -1
  94. package/lib/tools/shared/line/with-root-edge.js +1 -1
  95. package/lib/tools/shared/point/__tests__/arrow-point.test.js +127 -0
  96. package/lib/tools/shared/point/__tests__/base-point.test.js +122 -0
  97. package/lib/tools/shared/point/arrow-point.js +1 -1
  98. package/lib/tools/shared/point/arrow.js +1 -1
  99. package/lib/tools/shared/point/base-point.js +1 -1
  100. package/lib/tools/shared/point/index.js +1 -1
  101. package/lib/tools/shared/styles.js +1 -1
  102. package/lib/tools/shared/types.js +1 -1
  103. package/lib/tools/sine/__tests__/component.test.js +72 -0
  104. package/lib/tools/sine/component.js +1 -1
  105. package/lib/tools/sine/index.js +1 -1
  106. package/lib/tools/vector/__tests__/component.test.js +32 -0
  107. package/lib/tools/vector/component.js +1 -1
  108. package/lib/tools/vector/index.js +1 -1
  109. package/lib/undo-redo.js +1 -1
  110. package/lib/use-debounce.js +1 -1
  111. package/lib/utils.js +1 -1
  112. package/package.json +9 -12
  113. package/LICENSE.md +0 -5
@@ -0,0 +1,615 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _testUtils = require("@pie-lib/test-utils");
6
+ var _react = _interopRequireDefault(require("react"));
7
+ var _utils = require("../../../__tests__/utils");
8
+ var _component = require("../component");
9
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
+ describe('Component', function () {
12
+ var onChange = jest.fn();
13
+ var changeMarkProps = jest.fn();
14
+ var renderComponent = function renderComponent(extras) {
15
+ var defaults = {
16
+ classes: {},
17
+ className: 'className',
18
+ onChange: onChange,
19
+ changeMarkProps: changeMarkProps,
20
+ graphProps: (0, _utils.graphProps)(),
21
+ from: (0, _utils.xy)(0, 0),
22
+ to: (0, _utils.xy)(1, 1)
23
+ };
24
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
25
+ return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_component.RawBaseCircle, props));
26
+ };
27
+
28
+ // used to test items that have labels attached to points
29
+ var labelNode = document.createElement('foreignObject');
30
+ var fromWithLabel = {
31
+ x: 0,
32
+ y: 0,
33
+ label: 'A'
34
+ };
35
+ var toWithLabel = {
36
+ x: 1,
37
+ y: 1,
38
+ label: 'B'
39
+ };
40
+ var renderWithLabels = function renderWithLabels() {
41
+ var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
42
+ return renderComponent(_objectSpread(_objectSpread({}, extras), {}, {
43
+ labelNode: labelNode,
44
+ from: fromWithLabel,
45
+ to: toWithLabel
46
+ }));
47
+ };
48
+ describe('rendering', function () {
49
+ it('renders without crashing', function () {
50
+ var _renderComponent = renderComponent(),
51
+ container = _renderComponent.container;
52
+ expect(container.firstChild).toBeInTheDocument();
53
+ });
54
+ it('renders with labels', function () {
55
+ var _renderWithLabels = renderWithLabels(),
56
+ container = _renderWithLabels.container;
57
+ expect(container.firstChild).toBeInTheDocument();
58
+ });
59
+ it('renders a g element', function () {
60
+ var _renderComponent2 = renderComponent(),
61
+ container = _renderComponent2.container;
62
+ var g = container.querySelector('g');
63
+ expect(g).toBeInTheDocument();
64
+ });
65
+ it('renders BgCircle component', function () {
66
+ var _renderComponent3 = renderComponent(),
67
+ container = _renderComponent3.container;
68
+ // BgCircle is rendered as a styled component
69
+ expect(container.querySelector('g')).toBeInTheDocument();
70
+ });
71
+ it('renders two BasePoint components', function () {
72
+ var _renderComponent4 = renderComponent(),
73
+ container = _renderComponent4.container;
74
+ // Two points: from and to
75
+ var points = container.querySelectorAll('g');
76
+ expect(points.length).toBeGreaterThanOrEqual(2);
77
+ });
78
+ it('renders with building prop', function () {
79
+ var _renderComponent5 = renderComponent({
80
+ building: true
81
+ }),
82
+ container = _renderComponent5.container;
83
+ expect(container.firstChild).toBeInTheDocument();
84
+ });
85
+ it('renders with disabled prop', function () {
86
+ var _renderComponent6 = renderComponent({
87
+ disabled: true
88
+ }),
89
+ container = _renderComponent6.container;
90
+ expect(container.firstChild).toBeInTheDocument();
91
+ });
92
+ it('renders with correctness prop', function () {
93
+ var _renderComponent7 = renderComponent({
94
+ correctness: 'correct'
95
+ }),
96
+ container = _renderComponent7.container;
97
+ expect(container.firstChild).toBeInTheDocument();
98
+ });
99
+ it('renders with coordinatesOnHover enabled', function () {
100
+ var _renderComponent8 = renderComponent({
101
+ coordinatesOnHover: true
102
+ }),
103
+ container = _renderComponent8.container;
104
+ expect(container.firstChild).toBeInTheDocument();
105
+ });
106
+ it('renders with labelModeEnabled', function () {
107
+ var _renderComponent9 = renderComponent({
108
+ labelModeEnabled: true
109
+ }),
110
+ container = _renderComponent9.container;
111
+ expect(container.firstChild).toBeInTheDocument();
112
+ });
113
+ it('renders with middle point', function () {
114
+ var middle = {
115
+ x: 0.5,
116
+ y: 0.5,
117
+ label: 'M'
118
+ };
119
+ var _renderComponent0 = renderComponent({
120
+ middle: middle,
121
+ labelNode: labelNode,
122
+ labelModeEnabled: true
123
+ }),
124
+ container = _renderComponent0.container;
125
+ expect(container.firstChild).toBeInTheDocument();
126
+ });
127
+ it('handles undefined to point (uses from)', function () {
128
+ var _renderComponent1 = renderComponent({
129
+ to: undefined
130
+ }),
131
+ container = _renderComponent1.container;
132
+ expect(container.firstChild).toBeInTheDocument();
133
+ });
134
+ it('handles null to point (uses from)', function () {
135
+ var _renderComponent10 = renderComponent({
136
+ to: null
137
+ }),
138
+ container = _renderComponent10.container;
139
+ expect(container.firstChild).toBeInTheDocument();
140
+ });
141
+ });
142
+ describe('props', function () {
143
+ it('passes onChange callback', function () {
144
+ var customOnChange = jest.fn();
145
+ var _renderComponent11 = renderComponent({
146
+ onChange: customOnChange
147
+ }),
148
+ container = _renderComponent11.container;
149
+ expect(container.firstChild).toBeInTheDocument();
150
+ });
151
+ it('passes changeMarkProps callback', function () {
152
+ var customChangeMarkProps = jest.fn();
153
+ var _renderComponent12 = renderComponent({
154
+ changeMarkProps: customChangeMarkProps
155
+ }),
156
+ container = _renderComponent12.container;
157
+ expect(container.firstChild).toBeInTheDocument();
158
+ });
159
+ it('passes onClick callback', function () {
160
+ var onClick = jest.fn();
161
+ var _renderComponent13 = renderComponent({
162
+ onClick: onClick
163
+ }),
164
+ container = _renderComponent13.container;
165
+ expect(container.firstChild).toBeInTheDocument();
166
+ });
167
+ it('passes onDragStart callback', function () {
168
+ var onDragStart = jest.fn();
169
+ var _renderComponent14 = renderComponent({
170
+ onDragStart: onDragStart
171
+ }),
172
+ container = _renderComponent14.container;
173
+ expect(container.firstChild).toBeInTheDocument();
174
+ });
175
+ it('passes onDragStop callback', function () {
176
+ var onDragStop = jest.fn();
177
+ var _renderComponent15 = renderComponent({
178
+ onDragStop: onDragStop
179
+ }),
180
+ container = _renderComponent15.container;
181
+ expect(container.firstChild).toBeInTheDocument();
182
+ });
183
+ it('uses default onClick when not provided', function () {
184
+ var _renderComponent16 = renderComponent({
185
+ onClick: undefined
186
+ }),
187
+ container = _renderComponent16.container;
188
+ expect(container.firstChild).toBeInTheDocument();
189
+ });
190
+ it('passes graphProps', function () {
191
+ var customGraphProps = (0, _utils.graphProps)();
192
+ customGraphProps.size = {
193
+ width: 800,
194
+ height: 600
195
+ };
196
+ var _renderComponent17 = renderComponent({
197
+ graphProps: customGraphProps
198
+ }),
199
+ container = _renderComponent17.container;
200
+ expect(container.firstChild).toBeInTheDocument();
201
+ });
202
+ it('passes className', function () {
203
+ var _renderComponent18 = renderComponent({
204
+ className: 'custom-circle'
205
+ }),
206
+ container = _renderComponent18.container;
207
+ expect(container.firstChild).toBeInTheDocument();
208
+ });
209
+ });
210
+ describe('labels', function () {
211
+ it('renders from label when provided', function () {
212
+ var _renderWithLabels2 = renderWithLabels(),
213
+ container = _renderWithLabels2.container;
214
+ expect(container.firstChild).toBeInTheDocument();
215
+ });
216
+ it('renders to label when provided', function () {
217
+ var _renderWithLabels3 = renderWithLabels(),
218
+ container = _renderWithLabels3.container;
219
+ expect(container.firstChild).toBeInTheDocument();
220
+ });
221
+ it('renders middle label when provided', function () {
222
+ var middle = {
223
+ x: 0.5,
224
+ y: 0.5,
225
+ label: 'M'
226
+ };
227
+ var _renderComponent19 = renderComponent({
228
+ labelNode: labelNode,
229
+ middle: middle,
230
+ from: fromWithLabel,
231
+ to: toWithLabel
232
+ }),
233
+ container = _renderComponent19.container;
234
+ expect(container.firstChild).toBeInTheDocument();
235
+ });
236
+ it('does not render labels when labelNode is not provided', function () {
237
+ var _renderComponent20 = renderComponent({
238
+ from: fromWithLabel,
239
+ to: toWithLabel,
240
+ labelNode: null
241
+ }),
242
+ container = _renderComponent20.container;
243
+ expect(container.firstChild).toBeInTheDocument();
244
+ });
245
+ it('handles empty label', function () {
246
+ var from = {
247
+ x: 0,
248
+ y: 0,
249
+ label: ''
250
+ };
251
+ var to = {
252
+ x: 1,
253
+ y: 1,
254
+ label: ''
255
+ };
256
+ var _renderComponent21 = renderComponent({
257
+ labelNode: labelNode,
258
+ from: from,
259
+ to: to
260
+ }),
261
+ container = _renderComponent21.container;
262
+ expect(container.firstChild).toBeInTheDocument();
263
+ });
264
+ it('renders with label mode enabled', function () {
265
+ var _renderComponent22 = renderComponent({
266
+ labelNode: labelNode,
267
+ labelModeEnabled: true,
268
+ from: fromWithLabel,
269
+ to: toWithLabel
270
+ }),
271
+ container = _renderComponent22.container;
272
+ expect(container.firstChild).toBeInTheDocument();
273
+ });
274
+ it('renders with label mode disabled', function () {
275
+ var _renderComponent23 = renderComponent({
276
+ labelNode: labelNode,
277
+ labelModeEnabled: false,
278
+ from: fromWithLabel,
279
+ to: toWithLabel
280
+ }),
281
+ container = _renderComponent23.container;
282
+ expect(container.firstChild).toBeInTheDocument();
283
+ });
284
+ it('renders with limitLabeling enabled', function () {
285
+ var _renderComponent24 = renderComponent({
286
+ labelNode: labelNode,
287
+ limitLabeling: true,
288
+ from: fromWithLabel,
289
+ to: toWithLabel
290
+ }),
291
+ container = _renderComponent24.container;
292
+ expect(container.firstChild).toBeInTheDocument();
293
+ });
294
+ it('handles from label undefined', function () {
295
+ var from = {
296
+ x: 0,
297
+ y: 0
298
+ };
299
+ var to = {
300
+ x: 1,
301
+ y: 1,
302
+ label: 'B'
303
+ };
304
+ var _renderComponent25 = renderComponent({
305
+ labelNode: labelNode,
306
+ from: from,
307
+ to: to
308
+ }),
309
+ container = _renderComponent25.container;
310
+ expect(container.firstChild).toBeInTheDocument();
311
+ });
312
+ it('handles to label undefined', function () {
313
+ var from = {
314
+ x: 0,
315
+ y: 0,
316
+ label: 'A'
317
+ };
318
+ var to = {
319
+ x: 1,
320
+ y: 1
321
+ };
322
+ var _renderComponent26 = renderComponent({
323
+ labelNode: labelNode,
324
+ from: from,
325
+ to: to
326
+ }),
327
+ container = _renderComponent26.container;
328
+ expect(container.firstChild).toBeInTheDocument();
329
+ });
330
+ });
331
+ describe('coordinates', function () {
332
+ it('renders with positive coordinates', function () {
333
+ var _renderComponent27 = renderComponent({
334
+ from: (0, _utils.xy)(5, 10),
335
+ to: (0, _utils.xy)(15, 20)
336
+ }),
337
+ container = _renderComponent27.container;
338
+ expect(container.firstChild).toBeInTheDocument();
339
+ });
340
+ it('renders with negative coordinates', function () {
341
+ var _renderComponent28 = renderComponent({
342
+ from: (0, _utils.xy)(-5, -10),
343
+ to: (0, _utils.xy)(-15, -20)
344
+ }),
345
+ container = _renderComponent28.container;
346
+ expect(container.firstChild).toBeInTheDocument();
347
+ });
348
+ it('renders with zero coordinates', function () {
349
+ var _renderComponent29 = renderComponent({
350
+ from: (0, _utils.xy)(0, 0),
351
+ to: (0, _utils.xy)(0, 0)
352
+ }),
353
+ container = _renderComponent29.container;
354
+ expect(container.firstChild).toBeInTheDocument();
355
+ });
356
+ it('renders with decimal coordinates', function () {
357
+ var _renderComponent30 = renderComponent({
358
+ from: {
359
+ x: 1.5,
360
+ y: 2.7
361
+ },
362
+ to: {
363
+ x: 3.2,
364
+ y: 4.9
365
+ }
366
+ }),
367
+ container = _renderComponent30.container;
368
+ expect(container.firstChild).toBeInTheDocument();
369
+ });
370
+ it('renders with large coordinates', function () {
371
+ var _renderComponent31 = renderComponent({
372
+ from: (0, _utils.xy)(1000, 1000),
373
+ to: (0, _utils.xy)(2000, 2000)
374
+ }),
375
+ container = _renderComponent31.container;
376
+ expect(container.firstChild).toBeInTheDocument();
377
+ });
378
+ it('renders with mixed coordinate signs', function () {
379
+ var _renderComponent32 = renderComponent({
380
+ from: (0, _utils.xy)(-5, 10),
381
+ to: (0, _utils.xy)(15, -20)
382
+ }),
383
+ container = _renderComponent32.container;
384
+ expect(container.firstChild).toBeInTheDocument();
385
+ });
386
+ it('renders with very close points', function () {
387
+ var _renderComponent33 = renderComponent({
388
+ from: {
389
+ x: 5,
390
+ y: 5
391
+ },
392
+ to: {
393
+ x: 5.01,
394
+ y: 5.01
395
+ }
396
+ }),
397
+ container = _renderComponent33.container;
398
+ expect(container.firstChild).toBeInTheDocument();
399
+ });
400
+ it('renders with very far points', function () {
401
+ var _renderComponent34 = renderComponent({
402
+ from: (0, _utils.xy)(0, 0),
403
+ to: (0, _utils.xy)(10000, 10000)
404
+ }),
405
+ container = _renderComponent34.container;
406
+ expect(container.firstChild).toBeInTheDocument();
407
+ });
408
+ });
409
+ describe('states', function () {
410
+ it('renders in building state', function () {
411
+ var _renderComponent35 = renderComponent({
412
+ building: true
413
+ }),
414
+ container = _renderComponent35.container;
415
+ expect(container.firstChild).toBeInTheDocument();
416
+ });
417
+ it('renders in completed state', function () {
418
+ var _renderComponent36 = renderComponent({
419
+ building: false
420
+ }),
421
+ container = _renderComponent36.container;
422
+ expect(container.firstChild).toBeInTheDocument();
423
+ });
424
+ it('renders in disabled state', function () {
425
+ var _renderComponent37 = renderComponent({
426
+ disabled: true
427
+ }),
428
+ container = _renderComponent37.container;
429
+ expect(container.firstChild).toBeInTheDocument();
430
+ });
431
+ it('renders in enabled state', function () {
432
+ var _renderComponent38 = renderComponent({
433
+ disabled: false
434
+ }),
435
+ container = _renderComponent38.container;
436
+ expect(container.firstChild).toBeInTheDocument();
437
+ });
438
+ it('renders with building and disabled', function () {
439
+ var _renderComponent39 = renderComponent({
440
+ building: true,
441
+ disabled: true
442
+ }),
443
+ container = _renderComponent39.container;
444
+ expect(container.firstChild).toBeInTheDocument();
445
+ });
446
+ it('renders with correctness correct', function () {
447
+ var _renderComponent40 = renderComponent({
448
+ correctness: 'correct'
449
+ }),
450
+ container = _renderComponent40.container;
451
+ expect(container.firstChild).toBeInTheDocument();
452
+ });
453
+ it('renders with correctness incorrect', function () {
454
+ var _renderComponent41 = renderComponent({
455
+ correctness: 'incorrect'
456
+ }),
457
+ container = _renderComponent41.container;
458
+ expect(container.firstChild).toBeInTheDocument();
459
+ });
460
+ it('renders with correctness partial', function () {
461
+ var _renderComponent42 = renderComponent({
462
+ correctness: 'partial'
463
+ }),
464
+ container = _renderComponent42.container;
465
+ expect(container.firstChild).toBeInTheDocument();
466
+ });
467
+ it('renders without correctness', function () {
468
+ var _renderComponent43 = renderComponent({
469
+ correctness: undefined
470
+ }),
471
+ container = _renderComponent43.container;
472
+ expect(container.firstChild).toBeInTheDocument();
473
+ });
474
+ });
475
+ describe('edge cases', function () {
476
+ it('handles null labelNode', function () {
477
+ var _renderComponent44 = renderComponent({
478
+ labelNode: null,
479
+ from: fromWithLabel,
480
+ to: toWithLabel
481
+ }),
482
+ container = _renderComponent44.container;
483
+ expect(container.firstChild).toBeInTheDocument();
484
+ });
485
+ it('handles undefined labelNode', function () {
486
+ var _renderComponent45 = renderComponent({
487
+ labelNode: undefined,
488
+ from: fromWithLabel,
489
+ to: toWithLabel
490
+ }),
491
+ container = _renderComponent45.container;
492
+ expect(container.firstChild).toBeInTheDocument();
493
+ });
494
+ it('handles missing from coordinates', function () {
495
+ var _renderComponent46 = renderComponent({
496
+ from: {},
497
+ to: (0, _utils.xy)(1, 1)
498
+ }),
499
+ container = _renderComponent46.container;
500
+ expect(container.firstChild).toBeInTheDocument();
501
+ });
502
+ it('handles all props undefined except required', function () {
503
+ var _renderComponent47 = renderComponent({
504
+ building: undefined,
505
+ disabled: undefined,
506
+ correctness: undefined,
507
+ coordinatesOnHover: undefined,
508
+ labelModeEnabled: undefined,
509
+ limitLabeling: undefined
510
+ }),
511
+ container = _renderComponent47.container;
512
+ expect(container.firstChild).toBeInTheDocument();
513
+ });
514
+ it('renders with custom classes', function () {
515
+ var _renderComponent48 = renderComponent({
516
+ classes: {
517
+ root: 'custom-root'
518
+ }
519
+ }),
520
+ container = _renderComponent48.container;
521
+ expect(container.firstChild).toBeInTheDocument();
522
+ });
523
+ it('renders with empty classes', function () {
524
+ var _renderComponent49 = renderComponent({
525
+ classes: {}
526
+ }),
527
+ container = _renderComponent49.container;
528
+ expect(container.firstChild).toBeInTheDocument();
529
+ });
530
+ it('handles middle point without label', function () {
531
+ var middle = {
532
+ x: 0.5,
533
+ y: 0.5
534
+ };
535
+ var _renderComponent50 = renderComponent({
536
+ labelNode: labelNode,
537
+ middle: middle
538
+ }),
539
+ container = _renderComponent50.container;
540
+ expect(container.firstChild).toBeInTheDocument();
541
+ });
542
+ it('renders with all label types simultaneously', function () {
543
+ var middle = {
544
+ x: 0.5,
545
+ y: 0.5,
546
+ label: 'M'
547
+ };
548
+ var _renderComponent51 = renderComponent({
549
+ labelNode: labelNode,
550
+ from: fromWithLabel,
551
+ to: toWithLabel,
552
+ middle: middle,
553
+ labelModeEnabled: true
554
+ }),
555
+ container = _renderComponent51.container;
556
+ expect(container.firstChild).toBeInTheDocument();
557
+ });
558
+ });
559
+ describe('integration', function () {
560
+ it('renders complete circle with all features', function () {
561
+ var middle = {
562
+ x: 0.5,
563
+ y: 0.5,
564
+ label: 'Middle'
565
+ };
566
+ var _renderComponent52 = renderComponent({
567
+ from: fromWithLabel,
568
+ to: toWithLabel,
569
+ middle: middle,
570
+ labelNode: labelNode,
571
+ labelModeEnabled: true,
572
+ coordinatesOnHover: true,
573
+ correctness: 'correct',
574
+ building: false,
575
+ disabled: false,
576
+ onClick: jest.fn(),
577
+ onChange: jest.fn(),
578
+ changeMarkProps: jest.fn(),
579
+ onDragStart: jest.fn(),
580
+ onDragStop: jest.fn()
581
+ }),
582
+ container = _renderComponent52.container;
583
+ expect(container.firstChild).toBeInTheDocument();
584
+ });
585
+ it('renders building circle without labels', function () {
586
+ var _renderComponent53 = renderComponent({
587
+ from: (0, _utils.xy)(0, 0),
588
+ to: (0, _utils.xy)(1, 1),
589
+ building: true,
590
+ disabled: false
591
+ }),
592
+ container = _renderComponent53.container;
593
+ expect(container.firstChild).toBeInTheDocument();
594
+ });
595
+ it('renders disabled circle with labels', function () {
596
+ var _renderComponent54 = renderComponent({
597
+ from: fromWithLabel,
598
+ to: toWithLabel,
599
+ labelNode: labelNode,
600
+ disabled: true,
601
+ building: false
602
+ }),
603
+ container = _renderComponent54.container;
604
+ expect(container.firstChild).toBeInTheDocument();
605
+ });
606
+ });
607
+
608
+ // Note: Instance method tests (dragFrom, dragTo, dragCircle, labelChange, clickPoint)
609
+ // have been removed as they test internal implementation details.
610
+ // These behaviors should be tested through:
611
+ // 1. User interaction tests (drag-and-drop, clicks) - requires complex setup with @dnd-kit
612
+ // 2. Integration/E2E tests
613
+ // The component's public API (onChange, changeMarkProps callbacks) is what matters for RTL testing.
614
+ });
615
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdXRpbHMiLCJfY29tcG9uZW50Iiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZXNjcmliZSIsIm9uQ2hhbmdlIiwiamVzdCIsImZuIiwiY2hhbmdlTWFya1Byb3BzIiwicmVuZGVyQ29tcG9uZW50IiwiZXh0cmFzIiwiZGVmYXVsdHMiLCJjbGFzc2VzIiwiY2xhc3NOYW1lIiwiZ3JhcGhQcm9wcyIsImZyb20iLCJ4eSIsInRvIiwicHJvcHMiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiUmF3QmFzZUNpcmNsZSIsImxhYmVsTm9kZSIsImRvY3VtZW50IiwiZnJvbVdpdGhMYWJlbCIsIngiLCJ5IiwibGFiZWwiLCJ0b1dpdGhMYWJlbCIsInJlbmRlcldpdGhMYWJlbHMiLCJ1bmRlZmluZWQiLCJpdCIsIl9yZW5kZXJDb21wb25lbnQiLCJjb250YWluZXIiLCJleHBlY3QiLCJmaXJzdENoaWxkIiwidG9CZUluVGhlRG9jdW1lbnQiLCJfcmVuZGVyV2l0aExhYmVscyIsIl9yZW5kZXJDb21wb25lbnQyIiwiZyIsInF1ZXJ5U2VsZWN0b3IiLCJfcmVuZGVyQ29tcG9uZW50MyIsIl9yZW5kZXJDb21wb25lbnQ0IiwicG9pbnRzIiwicXVlcnlTZWxlY3RvckFsbCIsInRvQmVHcmVhdGVyVGhhbk9yRXF1YWwiLCJfcmVuZGVyQ29tcG9uZW50NSIsImJ1aWxkaW5nIiwiX3JlbmRlckNvbXBvbmVudDYiLCJkaXNhYmxlZCIsIl9yZW5kZXJDb21wb25lbnQ3IiwiY29ycmVjdG5lc3MiLCJfcmVuZGVyQ29tcG9uZW50OCIsImNvb3JkaW5hdGVzT25Ib3ZlciIsIl9yZW5kZXJDb21wb25lbnQ5IiwibGFiZWxNb2RlRW5hYmxlZCIsIm1pZGRsZSIsIl9yZW5kZXJDb21wb25lbnQwIiwiX3JlbmRlckNvbXBvbmVudDEiLCJfcmVuZGVyQ29tcG9uZW50MTAiLCJjdXN0b21PbkNoYW5nZSIsIl9yZW5kZXJDb21wb25lbnQxMSIsImN1c3RvbUNoYW5nZU1hcmtQcm9wcyIsIl9yZW5kZXJDb21wb25lbnQxMiIsIm9uQ2xpY2siLCJfcmVuZGVyQ29tcG9uZW50MTMiLCJvbkRyYWdTdGFydCIsIl9yZW5kZXJDb21wb25lbnQxNCIsIm9uRHJhZ1N0b3AiLCJfcmVuZGVyQ29tcG9uZW50MTUiLCJfcmVuZGVyQ29tcG9uZW50MTYiLCJjdXN0b21HcmFwaFByb3BzIiwic2l6ZSIsIndpZHRoIiwiaGVpZ2h0IiwiX3JlbmRlckNvbXBvbmVudDE3IiwiX3JlbmRlckNvbXBvbmVudDE4IiwiX3JlbmRlcldpdGhMYWJlbHMyIiwiX3JlbmRlcldpdGhMYWJlbHMzIiwiX3JlbmRlckNvbXBvbmVudDE5IiwiX3JlbmRlckNvbXBvbmVudDIwIiwiX3JlbmRlckNvbXBvbmVudDIxIiwiX3JlbmRlckNvbXBvbmVudDIyIiwiX3JlbmRlckNvbXBvbmVudDIzIiwiX3JlbmRlckNvbXBvbmVudDI0IiwibGltaXRMYWJlbGluZyIsIl9yZW5kZXJDb21wb25lbnQyNSIsIl9yZW5kZXJDb21wb25lbnQyNiIsIl9yZW5kZXJDb21wb25lbnQyNyIsIl9yZW5kZXJDb21wb25lbnQyOCIsIl9yZW5kZXJDb21wb25lbnQyOSIsIl9yZW5kZXJDb21wb25lbnQzMCIsIl9yZW5kZXJDb21wb25lbnQzMSIsIl9yZW5kZXJDb21wb25lbnQzMiIsIl9yZW5kZXJDb21wb25lbnQzMyIsIl9yZW5kZXJDb21wb25lbnQzNCIsIl9yZW5kZXJDb21wb25lbnQzNSIsIl9yZW5kZXJDb21wb25lbnQzNiIsIl9yZW5kZXJDb21wb25lbnQzNyIsIl9yZW5kZXJDb21wb25lbnQzOCIsIl9yZW5kZXJDb21wb25lbnQzOSIsIl9yZW5kZXJDb21wb25lbnQ0MCIsIl9yZW5kZXJDb21wb25lbnQ0MSIsIl9yZW5kZXJDb21wb25lbnQ0MiIsIl9yZW5kZXJDb21wb25lbnQ0MyIsIl9yZW5kZXJDb21wb25lbnQ0NCIsIl9yZW5kZXJDb21wb25lbnQ0NSIsIl9yZW5kZXJDb21wb25lbnQ0NiIsIl9yZW5kZXJDb21wb25lbnQ0NyIsIl9yZW5kZXJDb21wb25lbnQ0OCIsInJvb3QiLCJfcmVuZGVyQ29tcG9uZW50NDkiLCJfcmVuZGVyQ29tcG9uZW50NTAiLCJfcmVuZGVyQ29tcG9uZW50NTEiLCJfcmVuZGVyQ29tcG9uZW50NTIiLCJfcmVuZGVyQ29tcG9uZW50NTMiLCJfcmVuZGVyQ29tcG9uZW50NTQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbHMvY2lyY2xlL19fdGVzdHNfXy9jb21wb25lbnQudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHBpZS1saWIvdGVzdC11dGlscyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ3JhcGhQcm9wcywgeHkgfSBmcm9tICcuLi8uLi8uLi9fX3Rlc3RzX18vdXRpbHMnO1xuXG5pbXBvcnQgeyBSYXdCYXNlQ2lyY2xlIH0gZnJvbSAnLi4vY29tcG9uZW50JztcblxuZGVzY3JpYmUoJ0NvbXBvbmVudCcsICgpID0+IHtcbiAgbGV0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICBsZXQgY2hhbmdlTWFya1Byb3BzID0gamVzdC5mbigpO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJyxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgY2hhbmdlTWFya1Byb3BzLFxuICAgICAgZ3JhcGhQcm9wczogZ3JhcGhQcm9wcygpLFxuICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICB0bzogeHkoMSwgMSksXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuXG4gICAgcmV0dXJuIHJlbmRlcig8UmF3QmFzZUNpcmNsZSB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcblxuICAvLyB1c2VkIHRvIHRlc3QgaXRlbXMgdGhhdCBoYXZlIGxhYmVscyBhdHRhY2hlZCB0byBwb2ludHNcbiAgY29uc3QgbGFiZWxOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9yZWlnbk9iamVjdCcpO1xuICBjb25zdCBmcm9tV2l0aExhYmVsID0geyB4OiAwLCB5OiAwLCBsYWJlbDogJ0EnIH07XG4gIGNvbnN0IHRvV2l0aExhYmVsID0geyB4OiAxLCB5OiAxLCBsYWJlbDogJ0InIH07XG4gIGNvbnN0IHJlbmRlcldpdGhMYWJlbHMgPSAoZXh0cmFzID0ge30pID0+XG4gICAgcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgIC4uLmV4dHJhcyxcbiAgICAgIGxhYmVsTm9kZTogbGFiZWxOb2RlLFxuICAgICAgZnJvbTogZnJvbVdpdGhMYWJlbCxcbiAgICAgIHRvOiB0b1dpdGhMYWJlbCxcbiAgICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoTGFiZWxzKCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBhIGcgZWxlbWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IGcgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGcpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBCZ0NpcmNsZSBjb21wb25lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICAvLyBCZ0NpcmNsZSBpcyByZW5kZXJlZCBhcyBhIHN0eWxlZCBjb21wb25lbnRcbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgdHdvIEJhc2VQb2ludCBjb21wb25lbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgLy8gVHdvIHBvaW50czogZnJvbSBhbmQgdG9cbiAgICAgIGNvbnN0IHBvaW50cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdnJyk7XG4gICAgICBleHBlY3QocG9pbnRzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggYnVpbGRpbmcgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBidWlsZGluZzogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggZGlzYWJsZWQgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdG5lc3MgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBjb3JyZWN0bmVzczogJ2NvcnJlY3QnIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBjb29yZGluYXRlc09uSG92ZXIgZW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBjb29yZGluYXRlc09uSG92ZXI6IHRydWUgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVsTW9kZUVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbGFiZWxNb2RlRW5hYmxlZDogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbWlkZGxlIHBvaW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWlkZGxlID0geyB4OiAwLjUsIHk6IDAuNSwgbGFiZWw6ICdNJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIG1pZGRsZSxcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBsYWJlbE1vZGVFbmFibGVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyB1bmRlZmluZWQgdG8gcG9pbnQgKHVzZXMgZnJvbSknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgdG86IHVuZGVmaW5lZCB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG51bGwgdG8gcG9pbnQgKHVzZXMgZnJvbSknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgdG86IG51bGwgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcm9wcycsICgpID0+IHtcbiAgICBpdCgncGFzc2VzIG9uQ2hhbmdlIGNhbGxiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tT25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBjaGFuZ2VNYXJrUHJvcHMgY2FsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21DaGFuZ2VNYXJrUHJvcHMgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2hhbmdlTWFya1Byb3BzOiBjdXN0b21DaGFuZ2VNYXJrUHJvcHMgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIG9uQ2xpY2sgY2FsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IG9uQ2xpY2sgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIG9uRHJhZ1N0YXJ0IGNhbGxiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25EcmFnU3RhcnQgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25EcmFnU3RhcnQgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIG9uRHJhZ1N0b3AgY2FsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkRyYWdTdG9wID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IG9uRHJhZ1N0b3AgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBkZWZhdWx0IG9uQ2xpY2sgd2hlbiBub3QgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25DbGljazogdW5kZWZpbmVkIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBncmFwaFByb3BzJywgKCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tR3JhcGhQcm9wcyA9IGdyYXBoUHJvcHMoKTtcbiAgICAgIGN1c3RvbUdyYXBoUHJvcHMuc2l6ZSA9IHsgd2lkdGg6IDgwMCwgaGVpZ2h0OiA2MDAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBncmFwaFByb3BzOiBjdXN0b21HcmFwaFByb3BzIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBjbGFzc05hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2xhc3NOYW1lOiAnY3VzdG9tLWNpcmNsZScgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsYWJlbHMnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgZnJvbSBsYWJlbCB3aGVuIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhMYWJlbHMoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHRvIGxhYmVsIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aExhYmVscygpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgbWlkZGxlIGxhYmVsIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGUgPSB7IHg6IDAuNSwgeTogMC41LCBsYWJlbDogJ00nIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBtaWRkbGUsXG4gICAgICAgIGZyb206IGZyb21XaXRoTGFiZWwsXG4gICAgICAgIHRvOiB0b1dpdGhMYWJlbCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBsYWJlbHMgd2hlbiBsYWJlbE5vZGUgaXMgbm90IHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IGZyb21XaXRoTGFiZWwsXG4gICAgICAgIHRvOiB0b1dpdGhMYWJlbCxcbiAgICAgICAgbGFiZWxOb2RlOiBudWxsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGZyb20gPSB7IHg6IDAsIHk6IDAsIGxhYmVsOiAnJyB9O1xuICAgICAgY29uc3QgdG8gPSB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgZnJvbSxcbiAgICAgICAgdG8sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbGFiZWwgbW9kZSBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgbGFiZWxNb2RlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZnJvbTogZnJvbVdpdGhMYWJlbCxcbiAgICAgICAgdG86IHRvV2l0aExhYmVsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVsIG1vZGUgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBsYWJlbE1vZGVFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgZnJvbTogZnJvbVdpdGhMYWJlbCxcbiAgICAgICAgdG86IHRvV2l0aExhYmVsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxpbWl0TGFiZWxpbmcgZW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIGxpbWl0TGFiZWxpbmc6IHRydWUsXG4gICAgICAgIGZyb206IGZyb21XaXRoTGFiZWwsXG4gICAgICAgIHRvOiB0b1dpdGhMYWJlbCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgZnJvbSBsYWJlbCB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmcm9tID0geyB4OiAwLCB5OiAwIH07XG4gICAgICBjb25zdCB0byA9IHsgeDogMSwgeTogMSwgbGFiZWw6ICdCJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgZnJvbSxcbiAgICAgICAgdG8sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHRvIGxhYmVsIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGZyb20gPSB7IHg6IDAsIHk6IDAsIGxhYmVsOiAnQScgfTtcbiAgICAgIGNvbnN0IHRvID0geyB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBmcm9tLFxuICAgICAgICB0byxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBwb3NpdGl2ZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmcm9tOiB4eSg1LCAxMCksXG4gICAgICAgIHRvOiB4eSgxNSwgMjApLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG5lZ2F0aXZlIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IHh5KC01LCAtMTApLFxuICAgICAgICB0bzogeHkoLTE1LCAtMjApLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIHplcm8gY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICAgIHRvOiB4eSgwLCAwKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBkZWNpbWFsIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IHsgeDogMS41LCB5OiAyLjcgfSxcbiAgICAgICAgdG86IHsgeDogMy4yLCB5OiA0LjkgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBsYXJnZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmcm9tOiB4eSgxMDAwLCAxMDAwKSxcbiAgICAgICAgdG86IHh5KDIwMDAsIDIwMDApLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1peGVkIGNvb3JkaW5hdGUgc2lnbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoLTUsIDEwKSxcbiAgICAgICAgdG86IHh5KDE1LCAtMjApLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIHZlcnkgY2xvc2UgcG9pbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IHsgeDogNSwgeTogNSB9LFxuICAgICAgICB0bzogeyB4OiA1LjAxLCB5OiA1LjAxIH0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggdmVyeSBmYXIgcG9pbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IHh5KDAsIDApLFxuICAgICAgICB0bzogeHkoMTAwMDAsIDEwMDAwKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3RhdGVzJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGluIGJ1aWxkaW5nIHN0YXRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGJ1aWxkaW5nOiB0cnVlIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgaW4gY29tcGxldGVkIHN0YXRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGJ1aWxkaW5nOiBmYWxzZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGluIGRpc2FibGVkIHN0YXRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgaW4gZW5hYmxlZCBzdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogZmFsc2UgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGJ1aWxkaW5nIGFuZCBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBidWlsZGluZzogdHJ1ZSwgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGNvcnJlY3RuZXNzIGNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY29ycmVjdG5lc3M6ICdjb3JyZWN0JyB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdG5lc3MgaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvcnJlY3RuZXNzOiAnaW5jb3JyZWN0JyB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdG5lc3MgcGFydGlhbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBjb3JyZWN0bmVzczogJ3BhcnRpYWwnIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBjb3JyZWN0bmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBjb3JyZWN0bmVzczogdW5kZWZpbmVkIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZWRnZSBjYXNlcycsICgpID0+IHtcbiAgICBpdCgnaGFuZGxlcyBudWxsIGxhYmVsTm9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGU6IG51bGwsXG4gICAgICAgIGZyb206IGZyb21XaXRoTGFiZWwsXG4gICAgICAgIHRvOiB0b1dpdGhMYWJlbCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgdW5kZWZpbmVkIGxhYmVsTm9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgZnJvbTogZnJvbVdpdGhMYWJlbCxcbiAgICAgICAgdG86IHRvV2l0aExhYmVsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBtaXNzaW5nIGZyb20gY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbToge30sXG4gICAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgYWxsIHByb3BzIHVuZGVmaW5lZCBleGNlcHQgcmVxdWlyZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgYnVpbGRpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgZGlzYWJsZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgY29ycmVjdG5lc3M6IHVuZGVmaW5lZCxcbiAgICAgICAgY29vcmRpbmF0ZXNPbkhvdmVyOiB1bmRlZmluZWQsXG4gICAgICAgIGxhYmVsTW9kZUVuYWJsZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgbGltaXRMYWJlbGluZzogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGN1c3RvbSBjbGFzc2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNsYXNzZXM6IHsgcm9vdDogJ2N1c3RvbS1yb290JyB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGVtcHR5IGNsYXNzZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2xhc3Nlczoge30gfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBtaWRkbGUgcG9pbnQgd2l0aG91dCBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1pZGRsZSA9IHsgeDogMC41LCB5OiAwLjUgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIG1pZGRsZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBhbGwgbGFiZWwgdHlwZXMgc2ltdWx0YW5lb3VzbHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGUgPSB7IHg6IDAuNSwgeTogMC41LCBsYWJlbDogJ00nIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBmcm9tOiBmcm9tV2l0aExhYmVsLFxuICAgICAgICB0bzogdG9XaXRoTGFiZWwsXG4gICAgICAgIG1pZGRsZSxcbiAgICAgICAgbGFiZWxNb2RlRW5hYmxlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaW50ZWdyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgY29tcGxldGUgY2lyY2xlIHdpdGggYWxsIGZlYXR1cmVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWlkZGxlID0geyB4OiAwLjUsIHk6IDAuNSwgbGFiZWw6ICdNaWRkbGUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogZnJvbVdpdGhMYWJlbCxcbiAgICAgICAgdG86IHRvV2l0aExhYmVsLFxuICAgICAgICBtaWRkbGUsXG4gICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgbGFiZWxNb2RlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgY29vcmRpbmF0ZXNPbkhvdmVyOiB0cnVlLFxuICAgICAgICBjb3JyZWN0bmVzczogJ2NvcnJlY3QnLFxuICAgICAgICBidWlsZGluZzogZmFsc2UsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgb25DbGljazogamVzdC5mbigpLFxuICAgICAgICBvbkNoYW5nZTogamVzdC5mbigpLFxuICAgICAgICBjaGFuZ2VNYXJrUHJvcHM6IGplc3QuZm4oKSxcbiAgICAgICAgb25EcmFnU3RhcnQ6IGplc3QuZm4oKSxcbiAgICAgICAgb25EcmFnU3RvcDogamVzdC5mbigpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBidWlsZGluZyBjaXJjbGUgd2l0aG91dCBsYWJlbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgZGlzYWJsZWQgY2lyY2xlIHdpdGggbGFiZWxzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IGZyb21XaXRoTGFiZWwsXG4gICAgICAgIHRvOiB0b1dpdGhMYWJlbCxcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgYnVpbGRpbmc6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIE5vdGU6IEluc3RhbmNlIG1ldGhvZCB0ZXN0cyAoZHJhZ0Zyb20sIGRyYWdUbywgZHJhZ0NpcmNsZSwgbGFiZWxDaGFuZ2UsIGNsaWNrUG9pbnQpXG4gIC8vIGhhdmUgYmVlbiByZW1vdmVkIGFzIHRoZXkgdGVzdCBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAvLyBUaGVzZSBiZWhhdmlvcnMgc2hvdWxkIGJlIHRlc3RlZCB0aHJvdWdoOlxuICAvLyAxLiBVc2VyIGludGVyYWN0aW9uIHRlc3RzIChkcmFnLWFuZC1kcm9wLCBjbGlja3MpIC0gcmVxdWlyZXMgY29tcGxleCBzZXR1cCB3aXRoIEBkbmQta2l0XG4gIC8vIDIuIEludGVncmF0aW9uL0UyRSB0ZXN0c1xuICAvLyBUaGUgY29tcG9uZW50J3MgcHVibGljIEFQSSAob25DaGFuZ2UsIGNoYW5nZU1hcmtQcm9wcyBjYWxsYmFja3MpIGlzIHdoYXQgbWF0dGVycyBmb3IgUlRMIHRlc3RpbmcuXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLFVBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUVBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUE2QyxTQUFBSyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFBLFNBQUFFLE1BQUEsQ0FBQWMseUJBQUEsR0FBQWQsTUFBQSxDQUFBZSxn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